diff --git a/mods/ENTITIES/mcl_item_entity/README.txt b/mods/ENTITIES/mcl_item_entity/README.txt deleted file mode 100644 index 41e9e6e575..0000000000 --- a/mods/ENTITIES/mcl_item_entity/README.txt +++ /dev/null @@ -1,28 +0,0 @@ -===ITEM_DROP MOD for MINETEST-C55=== -by PilzAdam - -Introduction: -This mod adds Minecraft like drop/pick up of items to Minetest. - -This mod has been forked from item_drop in the VoxBox game. - -License: -Sourcecode: WTFPL (see below) -Sound: WTFPL (see below) - -See also: -http://minetest.net/ - - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - Version 2, December 2004 - - Copyright (C) 2004 Sam Hocevar - - Everyone is permitted to copy and distribute verbatim or modified - copies of this license document, and changing it is allowed as long - as the name is changed. - - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua deleted file mode 100644 index c0fbf4b150..0000000000 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ /dev/null @@ -1,833 +0,0 @@ ---these are lua locals, used for higher performance -local minetest, math, vector, ipairs, pairs = minetest, math, vector, ipairs, pairs - ---this is used for the player pool in the sound buffer -local pool = {} - -local tick = false - -minetest.register_on_joinplayer(function(player) - local name - name = player:get_player_name() - pool[name] = 0 -end) - -minetest.register_on_leaveplayer(function(player) - local name - name = player:get_player_name() - pool[name] = nil -end) - - -local has_awards = minetest.get_modpath("awards") - -local mcl_item_entity = {} - ---basic settings -local item_drop_settings = {} --settings table -item_drop_settings.dug_buffer = 0.65 -- the warm up period before a dug item can be collected -item_drop_settings.age = 1.0 --how old a dropped item (_insta_collect==false) has to be before collecting -item_drop_settings.radius_magnet = 2.0 --radius of item magnet. MUST BE LARGER THAN radius_collect! -item_drop_settings.xp_radius_magnet = 7.25 --radius of xp magnet. MUST BE LARGER THAN radius_collect! -item_drop_settings.radius_collect = 0.2 --radius of collection -item_drop_settings.player_collect_height = 0.8 --added to their pos y value -item_drop_settings.collection_safety = false --do this to prevent items from flying away on laggy servers -item_drop_settings.random_item_velocity = true --this sets random item velocity if velocity is 0 -item_drop_settings.drop_single_item = false --if true, the drop control drops 1 item instead of the entire stack, and sneak+drop drops the stack --- drop_single_item is disabled by default because it is annoying to throw away items from the intentory screen - -item_drop_settings.magnet_time = 0.75 -- how many seconds an item follows the player before giving up - -local function get_gravity() - return tonumber(minetest.settings:get("movement_gravity")) or 9.81 -end - -local registered_pickup_achievement = {} - ---TODO: remove limitation of 1 award per itemname -function mcl_item_entity.register_pickup_achievement(itemname, award) - if not has_awards then - minetest.log("warning", "[mcl_item_entity] Trying to register pickup achievement ["..award.."] for ["..itemname.."] while awards missing") - elseif registered_pickup_achievement[itemname] then - minetest.log("error", "[mcl_item_entity] Trying to register already existing pickup achievement ["..award.."] for ["..itemname.."]") - else - registered_pickup_achievement[itemname] = award - end -end - -mcl_item_entity.register_pickup_achievement("tree", "mcl:mineWood") -mcl_item_entity.register_pickup_achievement("mcl_mobitems:blaze_rod", "mcl:blazeRod") -mcl_item_entity.register_pickup_achievement("mcl_mobitems:leather", "mcl:killCow") -mcl_item_entity.register_pickup_achievement("mcl_core:diamond", "mcl:diamonds") - -local function check_pickup_achievements(object, player) - if has_awards then - local itemname = ItemStack(object:get_luaentity().itemstring):get_name() - local playername = player:get_player_name() - for name,award in pairs(registered_pickup_achievement) do - if itemname == name or minetest.get_item_group(itemname, name) ~= 0 then - awards.unlock(playername, award) - end - end - end -end - -local function enable_physics(object, luaentity, ignore_check) - if luaentity.physical_state == false or ignore_check == true then - luaentity.physical_state = true - object:set_properties({ - physical = true - }) - object:set_acceleration({x=0,y=-get_gravity(),z=0}) - end -end - -local function disable_physics(object, luaentity, ignore_check, reset_movement) - if luaentity.physical_state == true or ignore_check == true then - luaentity.physical_state = false - object:set_properties({ - physical = false - }) - if reset_movement ~= false then - object:set_velocity({x=0,y=0,z=0}) - object:set_acceleration({x=0,y=0,z=0}) - end - end -end - - -minetest.register_globalstep(function(dtime) - tick = not tick - - for _,player in pairs(minetest.get_connected_players()) do - if player:get_hp() > 0 or not minetest.settings:get_bool("enable_damage") then - - local name = player:get_player_name() - - local pos = player:get_pos() - - if tick == true and pool[name] > 0 then - minetest.sound_play("item_drop_pickup", { - pos = pos, - gain = 0.3, - max_hear_distance = 16, - pitch = math.random(70,110)/100 - }) - if pool[name] > 6 then - pool[name] = 6 - else - pool[name] = pool[name] - 1 - end - end - - - - local inv = player:get_inventory() - local checkpos = {x=pos.x,y=pos.y + item_drop_settings.player_collect_height,z=pos.z} - - --magnet and collection - for _,object in pairs(minetest.get_objects_inside_radius(checkpos, item_drop_settings.xp_radius_magnet)) do - if not object:is_player() and vector.distance(checkpos, object:get_pos()) < item_drop_settings.radius_magnet and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" and object:get_luaentity()._magnet_timer and (object:get_luaentity()._insta_collect or (object:get_luaentity().age > item_drop_settings.age)) then - - if object:get_luaentity()._magnet_timer >= 0 and object:get_luaentity()._magnet_timer < item_drop_settings.magnet_time and inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then - - -- Collection - if not object:get_luaentity()._removed then - -- Ignore if itemstring is not set yet - if object:get_luaentity().itemstring ~= "" then - inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) - - check_pickup_achievements(object, player) - - -- Destroy entity - -- This just prevents this section to be run again because object:remove() doesn't remove the item immediately. - object:get_luaentity().target = checkpos - object:get_luaentity()._removed = true - - object:set_velocity({x=0,y=0,z=0}) - object:set_acceleration({x=0,y=0,z=0}) - - object:move_to(checkpos) - - pool[name] = pool[name] + 1 - - minetest.after(0.25, function() - --safety check - if object and object:get_luaentity() then - object:remove() - end - end) - end - end - end - - elseif not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "mcl_experience:orb" then - local entity = object:get_luaentity() - entity.collector = player:get_player_name() - entity.collected = true - - end - end - - end - end -end) - --- Stupid workaround to get drops from a drop table: --- Create a temporary table in minetest.registered_nodes that contains the proper drops, --- because unfortunately minetest.get_node_drops needs the drop table to be inside a registered node definition --- (very ugly) - -local tmp_id = 0 - -local function get_drops(drop, toolname, param2, paramtype2) - tmp_id = tmp_id + 1 - local tmp_node_name = "mcl_item_entity:" .. tmp_id - minetest.registered_nodes[tmp_node_name] = { - name = tmp_node_name, - drop = drop, - paramtype2 = paramtype2 - } - local drops = minetest.get_node_drops({name = tmp_node_name, param2 = param2}, toolname) - minetest.registered_nodes[tmp_node_name] = nil - return drops -end - -local function discrete_uniform_distribution(drops, min_count, max_count, cap) - local new_drops = table.copy(drops) - for i, item in ipairs(drops) do - local new_item = ItemStack(item) - local multiplier = math.random(min_count, max_count) - if cap then - multiplier = math.min(cap, multiplier) - end - new_item:set_count(multiplier * new_item:get_count()) - new_drops[i] = new_item - end - return new_drops -end - -local function get_fortune_drops(fortune_drops, fortune_level) - local drop - local i = fortune_level - repeat - drop = fortune_drops[i] - i = i - 1 - until drop or i < 1 - return drop or {} -end - -local doTileDrops = minetest.settings:get_bool("mcl_doTileDrops", true) - -function minetest.handle_node_drops(pos, drops, digger) - -- NOTE: This function override allows digger to be nil. - -- This means there is no digger. This is a special case which allows this function to be called - -- by hand. Creative Mode is intentionally ignored in this case. - - if (digger and digger:is_player() and minetest.is_creative_enabled(digger:get_player_name())) or doTileDrops == false then - return - end - - -- Check if node will yield its useful drop by the digger's tool - local dug_node = minetest.get_node(pos) - local tooldef - local tool - if digger then - tool = digger:get_wielded_item() - tooldef = minetest.registered_tools[tool:get_name()] - - if not mcl_autogroup.can_harvest(dug_node.name, tool:get_name()) then - return - end - end - - local diggroups = tooldef and tooldef._mcl_diggroups - local shearsy_level = diggroups and diggroups.shearsy and diggroups.shearsy.level - - --[[ Special node drops when dug by shears by reading _mcl_shears_drop or with a silk touch tool reading _mcl_silk_touch_drop - from the node definition. - Definition of _mcl_shears_drop / _mcl_silk_touch_drop: - * true: Drop itself when dug by shears / silk touch tool - * table: Drop every itemstring in this table when dug by shears _mcl_silk_touch_drop - ]] - - local enchantments = tool and mcl_enchanting.get_enchantments(tool, "silk_touch") - - local silk_touch_drop = false - local nodedef = minetest.registered_nodes[dug_node.name] - if not nodedef then return end - - if shearsy_level and shearsy_level > 0 and nodedef._mcl_shears_drop then - if nodedef._mcl_shears_drop == true then - drops = { dug_node.name } - else - drops = nodedef._mcl_shears_drop - end - elseif tool and enchantments.silk_touch and nodedef._mcl_silk_touch_drop then - silk_touch_drop = true - if nodedef._mcl_silk_touch_drop == true then - drops = { dug_node.name } - else - drops = nodedef._mcl_silk_touch_drop - end - end - - if tool and nodedef._mcl_fortune_drop and enchantments.fortune then - local fortune_level = enchantments.fortune - local fortune_drop = nodedef._mcl_fortune_drop - if fortune_drop.discrete_uniform_distribution then - local min_count = fortune_drop.min_count - local max_count = fortune_drop.max_count + fortune_level * (fortune_drop.factor or 1) - local chance = fortune_drop.chance or fortune_drop.get_chance and fortune_drop.get_chance(fortune_level) - if not chance or math.random() < chance then - drops = discrete_uniform_distribution(fortune_drop.multiply and drops or fortune_drop.items, min_count, max_count, fortune_drop.cap) - elseif fortune_drop.override then - drops = {} - end - else - -- Fixed Behavior - local drop = get_fortune_drops(fortune_drop, fortune_level) - drops = get_drops(drop, tool:get_name(), dug_node.param2, nodedef.paramtype2) - end - end - - if digger and mcl_experience.throw_xp and not silk_touch_drop then - local experience_amount = minetest.get_item_group(dug_node.name,"xp") - if experience_amount > 0 then - mcl_experience.throw_xp(pos, experience_amount) - end - end - - for _,item in ipairs(drops) do - local count - if type(item) == "string" then - count = ItemStack(item):get_count() - else - count = item:get_count() - end - local drop_item = ItemStack(item) - drop_item:set_count(1) - for i=1,count do - local dpos = table.copy(pos) - -- Apply offset for plantlike_rooted nodes because of their special shape - if nodedef and nodedef.drawtype == "plantlike_rooted" and nodedef.walkable then - dpos.y = dpos.y + 1 - end - -- Spawn item and apply random speed - local obj = minetest.add_item(dpos, drop_item) - if obj then - local x = math.random(1, 5) - if math.random(1,2) == 1 then - x = -x - end - local z = math.random(1, 5) - if math.random(1,2) == 1 then - z = -z - end - obj:set_velocity({x=1/x, y=obj:get_velocity().y, z=1/z}) - - obj:get_luaentity().age = item_drop_settings.dug_buffer - - obj:get_luaentity()._insta_collect = false - end - end - end -end - --- Drop single items by default -function minetest.item_drop(itemstack, dropper, pos) - if dropper and dropper:is_player() then - local v = dropper:get_look_dir() - local p = {x=pos.x, y=pos.y+1.2, z=pos.z} - local cs = itemstack:get_count() - if dropper:get_player_control().sneak then - cs = 1 - end - local item = itemstack:take_item(cs) - local obj = minetest.add_item(p, item) - if obj then - v.x = v.x*4 - v.y = v.y*4 + 2 - v.z = v.z*4 - obj:set_velocity(v) - -- Force collection delay - obj:get_luaentity()._insta_collect = false - return itemstack - end - end -end - ---modify builtin:item - -local time_to_live = tonumber(minetest.settings:get("item_entity_ttl")) -if not time_to_live then - time_to_live = 300 -end - -local function cxcz(o, cw, one, zero) - if cw < 0 then - table.insert(o, { [one]=1, y=0, [zero]=0 }) - table.insert(o, { [one]=-1, y=0, [zero]=0 }) - else - table.insert(o, { [one]=-1, y=0, [zero]=0 }) - table.insert(o, { [one]=1, y=0, [zero]=0 }) - end - return o -end - -minetest.register_entity(":__builtin:item", { - initial_properties = { - hp_max = 1, - physical = true, - collide_with_objects = false, - collisionbox = {-0.3, -0.3, -0.3, 0.3, 0.3, 0.3}, - pointable = false, - visual = "wielditem", - visual_size = {x = 0.4, y = 0.4}, - textures = {""}, - spritediv = {x = 1, y = 1}, - initial_sprite_basepos = {x = 0, y = 0}, - is_visible = false, - infotext = "", - }, - - -- Itemstring of dropped item. The empty string is used when the item is not yet initialized yet. - -- The itemstring MUST be set immediately to a non-empty string after creating the entity. - -- The hand is NOT permitted as dropped item. ;-) - -- Item entities will be deleted if they still have an empty itemstring on their first on_step tick. - itemstring = "", - - -- If true, item will fall - physical_state = true, - - -- If item entity is currently flowing in water - _flowing = false, - - -- Number of seconds this item entity has existed so far - age = 0, - - -- How old it has become in the collection animation - collection_age = 0, - - set_item = function(self, itemstring) - self.itemstring = itemstring - if self.itemstring == "" then - -- item not yet known - return - end - local stack = ItemStack(itemstring) - if minetest.get_item_group(stack:get_name(), "compass") > 0 then - if string.find(stack:get_name(), "_lodestone") then - stack:set_name("mcl_compass:18_lodestone") - else - stack:set_name("mcl_compass:18") - end - itemstring = stack:to_string() - self.itemstring = itemstring - end - if minetest.get_item_group(stack:get_name(), "clock") > 0 then - self.is_clock = true - end - local count = stack:get_count() - local max_count = stack:get_stack_max() - if count > max_count then - count = max_count - self.itemstring = stack:get_name().." "..max_count - end - local itemtable = stack:to_table() - local itemname = nil - local description = "" - if itemtable then - itemname = stack:to_table().name - end - local glow - local def = minetest.registered_items[itemname] - if def then - description = def.description - glow = def.light_source - end - local s = 0.2 + 0.1 * (count / max_count) - local wield_scale = (def and def.wield_scale and def.wield_scale.x) or 1 - local c = s - s = s / wield_scale - local prop = { - is_visible = true, - visual = "wielditem", - textures = {itemname}, - visual_size = {x = s, y = s}, - collisionbox = {-c, -c, -c, c, c, c}, - automatic_rotate = math.pi * 0.5, - infotext = description, - glow = glow, - } - self.object:set_properties(prop) - if item_drop_settings.random_item_velocity == true then - minetest.after(0, function(self) - if not self or not self.object or not self.object:get_luaentity() then - return - end - local vel = self.object:get_velocity() - if vel and vel.x == 0 and vel.z == 0 then - local x = math.random(1, 5) - if math.random(1,2) == 1 then - x = -x - end - local z = math.random(1, 5) - if math.random(1,2) == 1 then - z = -z - end - local y = math.random(2,4) - self.object:set_velocity({x=1/x, y=y, z=1/z}) - end - end, self) - end - - end, - - get_staticdata = function(self) - local data = minetest.serialize({ - itemstring = self.itemstring, - always_collect = self.always_collect, - age = self.age, - _insta_collect = self._insta_collect, - _flowing = self._flowing, - _removed = self._removed, - }) - -- sfan5 guessed that the biggest serializable item - -- entity would have a size of 65530 bytes. This has - -- been experimentally verified to be still too large. - -- - -- anon5 has calculated that the biggest serializable - -- item entity has a size of exactly 65487 bytes: - -- - -- 1. serializeString16 can handle max. 65535 bytes. - -- 2. The following engine metadata is always saved: - -- • 1 byte (version) - -- • 2 byte (length prefix) - -- • 14 byte “__builtin:item” - -- • 4 byte (length prefix) - -- • 2 byte (health) - -- • 3 × 4 byte = 12 byte (position) - -- • 4 byte (yaw) - -- • 1 byte (version 2) - -- • 2 × 4 byte = 8 byte (pitch and roll) - -- 3. This leaves 65487 bytes for the serialization. - if #data > 65487 then -- would crash the engine - local stack = ItemStack(self.itemstring) - stack:get_meta():from_table(nil) - self.itemstring = stack:to_string() - minetest.log( - "warning", - "Overlong item entity metadata removed: “" .. - self.itemstring .. - "” had serialized length of " .. - #data - ) - return self:get_staticdata() - end - return data - end, - - on_activate = function(self, staticdata, dtime_s) - if string.sub(staticdata, 1, string.len("return")) == "return" then - local data = minetest.deserialize(staticdata) - if data and type(data) == "table" then - self.itemstring = data.itemstring - self.always_collect = data.always_collect - if data.age then - self.age = data.age + dtime_s - else - self.age = dtime_s - end - --remember collection data - -- If true, can collect item without delay - self._insta_collect = data._insta_collect - self._flowing = data._flowing - self._removed = data._removed - end - else - self.itemstring = staticdata - end - if self._removed then - self._removed = true - self.object:remove() - return - end - if self._insta_collect == nil then - -- Intentionally default, since delayed collection is rare - self._insta_collect = true - end - if self._flowing == nil then - self._flowing = false - end - self._magnet_timer = 0 - self._magnet_active = false - -- How long ago the last possible collector was detected. nil = none in this session - self._collector_timer = nil - -- Used to apply additional force - self._force = nil - self._forcestart = nil - self._forcetimer = 0 - - self.object:set_armor_groups({immortal = 1}) - self.object:set_velocity({x = 0, y = 2, z = 0}) - self.object:set_acceleration({x = 0, y = -get_gravity(), z = 0}) - self:set_item(self.itemstring) - end, - - try_merge_with = function(self, own_stack, object, entity) - if self.age == entity.age or entity._removed then - -- Can not merge with itself and remove entity - return false - end - - local stack = ItemStack(entity.itemstring) - local name = stack:get_name() - if own_stack:get_name() ~= name or - own_stack:get_meta() ~= stack:get_meta() or - own_stack:get_wear() ~= stack:get_wear() or - own_stack:get_free_space() == 0 then - -- Can not merge different or full stack - return false - end - - local count = own_stack:get_count() - local total_count = stack:get_count() + count - local max_count = stack:get_stack_max() - - if total_count > max_count then - return false - end - -- Merge the remote stack into this one - - local pos = object:get_pos() - pos.y = pos.y + ((total_count - count) / max_count) * 0.15 - self.object:move_to(pos) - - self.age = 0 -- Handle as new entity - own_stack:set_count(total_count) - self:set_item(own_stack:to_string()) - - entity._removed = true - object:remove() - return true - end, - - on_step = function(self, dtime, moveresult) - if self._removed then - self.object:set_properties({ - physical = false - }) - self.object:set_velocity({x=0,y=0,z=0}) - self.object:set_acceleration({x=0,y=0,z=0}) - return - end - self.age = self.age + dtime - if self._collector_timer then - self._collector_timer = self._collector_timer + dtime - end - if time_to_live > 0 and self.age > time_to_live then - self._removed = true - self.object:remove() - return - end - -- Delete corrupted item entities. The itemstring MUST be non-empty on its first step, - -- otherwise there might have some data corruption. - if self.itemstring == "" then - minetest.log("warning", "Item entity with empty itemstring found at "..minetest.pos_to_string(self.object:get_pos()).. "! Deleting it now.") - self._removed = true - self.object:remove() - return - end - - local p = self.object:get_pos() - local node = minetest.get_node_or_nil(p) - local in_unloaded = (node == nil) - - if self.is_clock then - self.object:set_properties({ - textures = {"mcl_clock:clock_" .. (mcl_worlds.clock_works(p) and mcl_clock.old_time or mcl_clock.random_frame)} - }) - end - - -- If no collector was found for a long enough time, declare the magnet as disabled - if self._magnet_active and (self._collector_timer == nil or (self._collector_timer > item_drop_settings.magnet_time)) then - self._magnet_active = false - enable_physics(self.object, self) - return - end - if in_unloaded then - -- Don't infinetly fall into unloaded map - disable_physics(self.object, self) - return - end - - -- Destroy item in lava, fire or special nodes - local nn = node.name - local def = minetest.registered_nodes[nn] - local lg = minetest.get_item_group(nn, "lava") - local fg = minetest.get_item_group(nn, "fire") - local dg = minetest.get_item_group(nn, "destroys_items") - if (def and (lg ~= 0 or fg ~= 0 or dg == 1)) then - --Wait 2 seconds to allow mob drops to be cooked, & picked up instead of instantly destroyed. - if self.age > 2 then - if dg ~= 2 then - minetest.sound_play("builtin_item_lava", {pos = self.object:get_pos(), gain = 0.5}) - end - self._removed = true - self.object:remove() - return - end - end - - -- Destroy item when it collides with a cactus - if moveresult and moveresult.collides then - for _, collision in pairs(moveresult.collisions) do - local pos = collision.node_pos - if collision.type == "node" and minetest.get_node(pos).name == "mcl_core:cactus" then - self._removed = true - self.object:remove() - return - end - end - end - - -- Push item out when stuck inside solid opaque node - if def and def.walkable and def.groups and def.groups.opaque == 1 then - local shootdir - local cx = (p.x % 1) - 0.5 - local cz = (p.z % 1) - 0.5 - local order = {} - - -- First prepare the order in which the 4 sides are to be checked. - -- 1st: closest - -- 2nd: other direction - -- 3rd and 4th: other axis - if math.abs(cx) < math.abs(cz) then - order = cxcz(order, cx, "x", "z") - order = cxcz(order, cz, "z", "x") - else - order = cxcz(order, cz, "z", "x") - order = cxcz(order, cx, "x", "z") - end - - -- Check which one of the 4 sides is free - for o=1, #order do - local nn = minetest.get_node(vector.add(p, order[o])).name - local def = minetest.registered_nodes[nn] - if def and def.walkable == false and nn ~= "ignore" then - shootdir = order[o] - break - end - end - -- If none of the 4 sides is free, shoot upwards - if shootdir == nil then - shootdir = { x=0, y=1, z=0 } - local nn = minetest.get_node(vector.add(p, shootdir)).name - if nn == "ignore" then - -- Do not push into ignore - return - end - end - - -- Set new item moving speed accordingly - local newv = vector.multiply(shootdir, 3) - self.object:set_acceleration({x = 0, y = 0, z = 0}) - self.object:set_velocity(newv) - - disable_physics(self.object, self, false, false) - - if shootdir.y == 0 then - self._force = newv - p.x = math.floor(p.x) - p.y = math.floor(p.y) - p.z = math.floor(p.z) - self._forcestart = p - self._forcetimer = 1 - end - return - end - - -- This code is run after the entity got a push from above “push away” code. - -- It is responsible for making sure the entity is entirely outside the solid node - -- (with its full collision box), not just its center. - if self._forcetimer > 0 then - local cbox = self.object:get_properties().collisionbox - local ok = false - if self._force.x > 0 and (p.x > (self._forcestart.x + 0.5 + (cbox[4] - cbox[1])/2)) then ok = true - elseif self._force.x < 0 and (p.x < (self._forcestart.x + 0.5 - (cbox[4] - cbox[1])/2)) then ok = true - elseif self._force.z > 0 and (p.z > (self._forcestart.z + 0.5 + (cbox[6] - cbox[3])/2)) then ok = true - elseif self._force.z < 0 and (p.z < (self._forcestart.z + 0.5 - (cbox[6] - cbox[3])/2)) then ok = true end - -- Item was successfully forced out. No more pushing - if ok then - self._forcetimer = -1 - self._force = nil - enable_physics(self.object, self) - else - self._forcetimer = self._forcetimer - dtime - end - return - elseif self._force then - self._force = nil - enable_physics(self.object, self) - return - end - - -- Move item around on flowing liquids; add 'source' check to allow items to continue flowing a bit in the source block of flowing water. - if def and def.liquidtype == "flowing" or def.liquidtype == "source" then - - --[[ Get flowing direction (function call from flowlib), if there's a liquid. - NOTE: According to Qwertymine, flowlib.quickflow is only reliable for liquids with a flowing distance of 7. - Luckily, this is exactly what we need if we only care about water, which has this flowing distance. ]] - local vec = flowlib.quick_flow(p, node) - -- Just to make sure we don't manipulate the speed for no reason - if vec.x ~= 0 or vec.y ~= 0 or vec.z ~= 0 then - -- Minecraft Wiki: Flowing speed is "about 1.39 meters per second" - local f = 1.2 - -- Set new item moving speed into the direciton of the liquid - local newv = vector.multiply(vec, f) - -- Swap to acceleration instead of a static speed to better mimic MC mechanics. - self.object:set_acceleration({x = newv.x, y = -0.22, z = newv.z}) - - self.physical_state = true - self._flowing = true - self.object:set_properties({ - physical = true - }) - return - end - elseif self._flowing == true then - -- Disable flowing physics if not on/in flowing liquid - self._flowing = false - enable_physics(self.object, self, true) - return - end - - -- If node is not registered or node is walkably solid and resting on nodebox - local nn = minetest.get_node({x=p.x, y=p.y-0.5, z=p.z}).name - local v = self.object:get_velocity() - - if not minetest.registered_nodes[nn] or minetest.registered_nodes[nn].walkable and not minetest.registered_nodes[nn].groups.slippery and v.y == 0 then - if self.physical_state then - local own_stack = ItemStack(self.object:get_luaentity().itemstring) - -- Merge with close entities of the same item - for _, object in pairs(minetest.get_objects_inside_radius(p, 0.8)) do - local obj = object:get_luaentity() - if obj and obj.name == "__builtin:item" - and obj.physical_state == false then - if self:try_merge_with(own_stack, object, obj) then - return - end - end - end - disable_physics(self.object, self) - end - else - if self._magnet_active == false then - enable_physics(self.object, self) - end - end - end, - - -- Note: on_punch intentionally left out. The player should *not* be able to collect items by punching -}) diff --git a/mods/ENTITIES/mcl_item_entity/mod.conf b/mods/ENTITIES/mcl_item_entity/mod.conf deleted file mode 100644 index acd9f00f33..0000000000 --- a/mods/ENTITIES/mcl_item_entity/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = mcl_item_entity -author = PilzAdam -description = Dropped items will be attracted to the player like a magnet. -depends = flowlib, mcl_enchanting diff --git a/mods/ENTITIES/mcl_item_entity/sounds/Attributes.txt b/mods/ENTITIES/mcl_item_entity/sounds/Attributes.txt deleted file mode 100644 index 7817593524..0000000000 --- a/mods/ENTITIES/mcl_item_entity/sounds/Attributes.txt +++ /dev/null @@ -1 +0,0 @@ - Item_Drop_Pickup - https://freesound.org/people/benniknop/sounds/317848/ (License: CC0) diff --git a/mods/ENTITIES/mcl_item_entity/sounds/builtin_item_lava.ogg b/mods/ENTITIES/mcl_item_entity/sounds/builtin_item_lava.ogg deleted file mode 100644 index 5c293fe9b4..0000000000 Binary files a/mods/ENTITIES/mcl_item_entity/sounds/builtin_item_lava.ogg and /dev/null differ diff --git a/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.ogg b/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.ogg deleted file mode 100644 index e7f5df0949..0000000000 Binary files a/mods/ENTITIES/mcl_item_entity/sounds/item_drop_pickup.ogg and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/README.txt b/mods/ENTITIES/mcl_minecarts/README.txt deleted file mode 100644 index 112cbd3085..0000000000 --- a/mods/ENTITIES/mcl_minecarts/README.txt +++ /dev/null @@ -1,21 +0,0 @@ -mcl_minecarts -============= -Based on the mod "boost_carts" by Krock. -Target: Run smoothly and do not use too much CPU. - -License of source code: ------------------------ -MIT License - -Copyright (C) 2012-2016 PilzAdam -Copyright (C) 2014-2016 SmallJoker -Copyright (C) 2012-2016 Various Minetest developers and contributors - -Authors/licenses of media files: ------------------------ - -Minecart model: - 22i (GPLv3) - -Texture files (CC BY-SA 3.0): - XSSheep diff --git a/mods/ENTITIES/mcl_minecarts/functions.lua b/mods/ENTITIES/mcl_minecarts/functions.lua deleted file mode 100644 index 2f0dfe0aeb..0000000000 --- a/mods/ENTITIES/mcl_minecarts/functions.lua +++ /dev/null @@ -1,137 +0,0 @@ -local vector = vector - -function mcl_minecarts:get_sign(z) - if z == 0 then - return 0 - else - return z / math.abs(z) - end -end - -function mcl_minecarts:velocity_to_dir(v) - if math.abs(v.x) > math.abs(v.z) then - return {x=mcl_minecarts:get_sign(v.x), y=mcl_minecarts:get_sign(v.y), z=0} - else - return {x=0, y=mcl_minecarts:get_sign(v.y), z=mcl_minecarts:get_sign(v.z)} - end -end - -function mcl_minecarts:is_rail(pos, railtype) - local node = minetest.get_node(pos).name - if node == "ignore" then - local vm = minetest.get_voxel_manip() - local emin, emax = vm:read_from_map(pos, pos) - local area = VoxelArea:new{ - MinEdge = emin, - MaxEdge = emax, - } - local data = vm:get_data() - local vi = area:indexp(pos) - node = minetest.get_name_from_content_id(data[vi]) - end - if minetest.get_item_group(node, "rail") == 0 then - return false - end - if not railtype then - return true - end - return minetest.get_item_group(node, "connect_to_raillike") == railtype -end - -function mcl_minecarts:check_front_up_down(pos, dir_, check_down, railtype) - local dir = vector.new(dir_) - -- Front - dir.y = 0 - local cur = vector.add(pos, dir) - if mcl_minecarts:is_rail(cur, railtype) then - return dir - end - -- Up - if check_down then - dir.y = 1 - cur = vector.add(pos, dir) - if mcl_minecarts:is_rail(cur, railtype) then - return dir - end - end - -- Down - dir.y = -1 - cur = vector.add(pos, dir) - if mcl_minecarts:is_rail(cur, railtype) then - return dir - end - return nil -end - -function mcl_minecarts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) - local pos = vector.round(pos_) - local cur - local left_check, right_check = true, true - - -- Check left and right - local left = {x=0, y=0, z=0} - local right = {x=0, y=0, z=0} - if dir.z ~= 0 and dir.x == 0 then - left.x = -dir.z - right.x = dir.z - elseif dir.x ~= 0 and dir.z == 0 then - left.z = dir.x - right.z = -dir.x - end - - if ctrl then - if old_switch == 1 then - left_check = false - elseif old_switch == 2 then - right_check = false - end - if ctrl.left and left_check then - cur = mcl_minecarts:check_front_up_down(pos, left, false, railtype) - if cur then - return cur, 1 - end - left_check = false - end - if ctrl.right and right_check then - cur = mcl_minecarts:check_front_up_down(pos, right, false, railtype) - if cur then - return cur, 2 - end - right_check = true - end - end - - -- Normal - cur = mcl_minecarts:check_front_up_down(pos, dir, true, railtype) - if cur then - return cur - end - - -- Left, if not already checked - if left_check then - cur = mcl_minecarts:check_front_up_down(pos, left, false, railtype) - if cur then - return cur - end - end - - -- Right, if not already checked - if right_check then - cur = mcl_minecarts:check_front_up_down(pos, right, false, railtype) - if cur then - return cur - end - end - -- Backwards - if not old_switch then - cur = mcl_minecarts:check_front_up_down(pos, { - x = -dir.x, - y = dir.y, - z = -dir.z - }, true, railtype) - if cur then - return cur - end - end - return {x=0, y=0, z=0} -end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua deleted file mode 100644 index d894f97226..0000000000 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ /dev/null @@ -1,864 +0,0 @@ -local modname = minetest.get_current_modname() -local S = minetest.get_translator(modname) - -local has_mcl_wip = minetest.get_modpath("mcl_wip") - -mcl_minecarts = {} -mcl_minecarts.modpath = minetest.get_modpath(modname) -mcl_minecarts.speed_max = 10 -mcl_minecarts.check_float_time = 15 - -dofile(mcl_minecarts.modpath.."/functions.lua") -dofile(mcl_minecarts.modpath.."/rails.lua") - -local function detach_driver(self) - if not self._driver then - return - end - mcl_player.player_attached[self._driver] = nil - local player = minetest.get_player_by_name(self._driver) - self._driver = nil - self._start_pos = nil - if player then - player:set_detach() - player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) - mcl_player.player_set_animation(player, "stand" , 30) - end -end - -local function activate_tnt_minecart(self, timer) - if self._boomtimer then - return - end - self.object:set_armor_groups({immortal=1}) - if timer then - self._boomtimer = timer - else - self._boomtimer = tnt.BOOMTIMER - end - self.object:set_properties({textures = { - "mcl_tnt_blink.png", - "mcl_tnt_blink.png", - "mcl_tnt_blink.png", - "mcl_tnt_blink.png", - "mcl_tnt_blink.png", - "mcl_tnt_blink.png", - "mcl_minecarts_minecart.png", - }}) - self._blinktimer = tnt.BLINKTIMER - minetest.sound_play("tnt_ignite", {pos = self.object:get_pos(), gain = 1.0, max_hear_distance = 15}, true) -end - -local activate_normal_minecart = detach_driver - --- Table for item-to-entity mapping. Keys: itemstring, Values: Corresponding entity ID -local entity_mapping = {} - -local function register_entity(entity_id, mesh, textures, drop, on_rightclick, on_activate_by_rail) - local cart = { - physical = false, - collisionbox = {-10/16., -0.5, -10/16, 10/16, 0.25, 10/16}, - visual = "mesh", - mesh = mesh, - visual_size = {x=1, y=1}, - textures = textures, - - on_rightclick = on_rightclick, - - _driver = nil, -- player who sits in and controls the minecart (only for minecart!) - _punched = false, -- used to re-send _velocity and position - _velocity = {x=0, y=0, z=0}, -- only used on punch - _start_pos = nil, -- Used to calculate distance for “On A Rail” achievement - _last_float_check = nil, -- timestamp of last time the cart was checked to be still on a rail - _fueltime = nil, -- how many seconds worth of fuel is left. Only used by minecart with furnace - _boomtimer = nil, -- how many seconds are left before exploding - _blinktimer = nil, -- how many seconds are left before TNT blinking - _blink = false, -- is TNT blink texture active? - _old_dir = {x=0, y=0, z=0}, - _old_pos = nil, - _old_vel = {x=0, y=0, z=0}, - _old_switch = 0, - _railtype = nil, - } - - function cart:on_activate(staticdata, dtime_s) - -- Initialize - local data = minetest.deserialize(staticdata) - if type(data) == "table" then - self._railtype = data._railtype - end - self.object:set_armor_groups({immortal=1}) - - -- Activate cart if on activator rail - if self.on_activate_by_rail then - local pos = self.object:get_pos() - local node = minetest.get_node(vector.floor(pos)) - if node.name == "mcl_minecarts:activator_rail_on" then - self:on_activate_by_rail() - end - end - end - - function cart:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) - local pos = self.object:get_pos() - if not self._railtype then - local node = minetest.get_node(vector.floor(pos)).name - self._railtype = minetest.get_item_group(node, "connect_to_raillike") - end - - if not puncher or not puncher:is_player() then - local cart_dir = mcl_minecarts:get_rail_direction(pos, {x=1, y=0, z=0}, nil, nil, self._railtype) - if vector.equals(cart_dir, {x=0, y=0, z=0}) then - return - end - self._velocity = vector.multiply(cart_dir, 3) - self._old_pos = nil - self._punched = true - return - end - - -- Punch+sneak: Pick up minecart (unless TNT was ignited) - if puncher:get_player_control().sneak and not self._boomtimer then - if self._driver then - if self._old_pos then - self.object:set_pos(self._old_pos) - end - detach_driver(self) - end - - -- Disable detector rail - local rou_pos = vector.round(pos) - local node = minetest.get_node(rou_pos) - if node.name == "mcl_minecarts:detector_rail_on" then - local newnode = {name="mcl_minecarts:detector_rail", param2 = node.param2} - minetest.swap_node(rou_pos, newnode) - mesecon.receptor_off(rou_pos) - end - - -- Drop items and remove cart entity - if not minetest.is_creative_enabled(puncher:get_player_name()) then - for d=1, #drop do - minetest.add_item(self.object:get_pos(), drop[d]) - end - elseif puncher and puncher:is_player() then - local inv = puncher:get_inventory() - for d=1, #drop do - if not inv:contains_item("main", drop[d]) then - inv:add_item("main", drop[d]) - end - end - end - - self.object:remove() - return - end - - local vel = self.object:get_velocity() - if puncher:get_player_name() == self._driver then - if math.abs(vel.x + vel.z) > 7 then - return - end - end - - local punch_dir = mcl_minecarts:velocity_to_dir(puncher:get_look_dir()) - punch_dir.y = 0 - local cart_dir = mcl_minecarts:get_rail_direction(pos, punch_dir, nil, nil, self._railtype) - if vector.equals(cart_dir, {x=0, y=0, z=0}) then - return - end - - time_from_last_punch = math.min(time_from_last_punch, tool_capabilities.full_punch_interval) - local f = 3 * (time_from_last_punch / tool_capabilities.full_punch_interval) - - self._velocity = vector.multiply(cart_dir, f) - self._old_pos = nil - self._punched = true - end - - cart.on_activate_by_rail = on_activate_by_rail - - function cart:on_step(dtime) - local ctrl, player = nil, nil - if self._driver then - player = minetest.get_player_by_name(self._driver) - if player then - ctrl = player:get_player_control() - -- player detach - if ctrl.sneak then - detach_driver(self) - return - end - end - end - - local vel = self.object:get_velocity() - local update = {} - if self._last_float_check == nil then - self._last_float_check = 0 - else - self._last_float_check = self._last_float_check + dtime - end - - local pos, rou_pos, node = self.object:get_pos() - local r = 0.6 - for _, node_pos in pairs({{r, 0}, {0, r}, {-r, 0}, {0, -r}}) do - if minetest.get_node(vector.offset(pos, node_pos[1], 0, node_pos[2])).name == "mcl_core:cactus" then - detach_driver(self) - for d = 1, #drop do - minetest.add_item(pos, drop[d]) - end - self.object:remove() - return - end - end - - -- Drop minecart if it isn't on a rail anymore - if self._last_float_check >= mcl_minecarts.check_float_time then - pos = self.object:get_pos() - rou_pos = vector.round(pos) - node = minetest.get_node(rou_pos) - local g = minetest.get_item_group(node.name, "connect_to_raillike") - if g ~= self._railtype and self._railtype then - -- Detach driver - if player then - if self._old_pos then - self.object:set_pos(self._old_pos) - end - mcl_player.player_attached[self._driver] = nil - player:set_detach() - player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) - end - - -- Explode if already ignited - if self._boomtimer then - self.object:remove() - mcl_explosions.explode(pos, 4, { drop_chance = 1.0 }) - return - end - - -- Drop items and remove cart entity - local pname = "" - if player then - pname = player:get_player_name() - end - if not minetest.is_creative_enabled(pname) then - for d=1, #drop do - minetest.add_item(self.object:get_pos(), drop[d]) - end - end - - self.object:remove() - return - end - self._last_float_check = 0 - end - - -- Update furnace stuff - if self._fueltime and self._fueltime > 0 then - self._fueltime = self._fueltime - dtime - if self._fueltime <= 0 then - self.object:set_properties({textures = - { - "default_furnace_top.png", - "default_furnace_top.png", - "default_furnace_front.png", - "default_furnace_side.png", - "default_furnace_side.png", - "default_furnace_side.png", - "mcl_minecarts_minecart.png", - }}) - self._fueltime = 0 - end - end - local has_fuel = self._fueltime and self._fueltime > 0 - - -- Update TNT stuff - if self._boomtimer then - -- Explode - self._boomtimer = self._boomtimer - dtime - local pos = self.object:get_pos() - if self._boomtimer <= 0 then - self.object:remove() - mcl_explosions.explode(pos, 4, { drop_chance = 1.0 }) - return - else - tnt.smoke_step(pos) - end - end - if self._blinktimer then - self._blinktimer = self._blinktimer - dtime - if self._blinktimer <= 0 then - self._blink = not self._blink - if self._blink then - self.object:set_properties({textures = - { - "default_tnt_top.png", - "default_tnt_bottom.png", - "default_tnt_side.png", - "default_tnt_side.png", - "default_tnt_side.png", - "default_tnt_side.png", - "mcl_minecarts_minecart.png", - }}) - else - self.object:set_properties({textures = - { - "mcl_tnt_blink.png", - "mcl_tnt_blink.png", - "mcl_tnt_blink.png", - "mcl_tnt_blink.png", - "mcl_tnt_blink.png", - "mcl_tnt_blink.png", - "mcl_minecarts_minecart.png", - }}) - end - self._blinktimer = tnt.BLINKTIMER - end - end - - if self._punched then - vel = vector.add(vel, self._velocity) - self.object:set_velocity(vel) - self._old_dir.y = 0 - elseif vector.equals(vel, {x=0, y=0, z=0}) and (not has_fuel) then - return - end - - local dir, last_switch = nil, nil - if not pos then - pos = self.object:get_pos() - end - if self._old_pos and not self._punched then - local flo_pos = vector.floor(pos) - local flo_old = vector.floor(self._old_pos) - if vector.equals(flo_pos, flo_old) and (not has_fuel) then - return - -- Prevent querying the same node over and over again - end - - if not rou_pos then - rou_pos = vector.round(pos) - end - local rou_old = vector.round(self._old_pos) - if not node then - node = minetest.get_node(rou_pos) - end - local node_old = minetest.get_node(rou_old) - - -- Update detector rails - if node.name == "mcl_minecarts:detector_rail" then - local newnode = {name="mcl_minecarts:detector_rail_on", param2 = node.param2} - minetest.swap_node(rou_pos, newnode) - mesecon.receptor_on(rou_pos) - end - if node_old.name == "mcl_minecarts:detector_rail_on" then - local newnode = {name="mcl_minecarts:detector_rail", param2 = node_old.param2} - minetest.swap_node(rou_old, newnode) - mesecon.receptor_off(rou_old) - end - -- Activate minecart if on activator rail - if node_old.name == "mcl_minecarts:activator_rail_on" and self.on_activate_by_rail then - self:on_activate_by_rail() - end - end - - -- Stop cart if velocity vector flips - if self._old_vel and self._old_vel.y == 0 and - (self._old_vel.x * vel.x < 0 or self._old_vel.z * vel.z < 0) then - self._old_vel = {x = 0, y = 0, z = 0} - self._old_pos = pos - self.object:set_velocity(vector.new()) - self.object:set_acceleration(vector.new()) - return - end - self._old_vel = vector.new(vel) - - if self._old_pos then - local diff = vector.subtract(self._old_pos, pos) - for _,v in ipairs({"x","y","z"}) do - if math.abs(diff[v]) > 1.1 then - local expected_pos = vector.add(self._old_pos, self._old_dir) - dir, last_switch = mcl_minecarts:get_rail_direction(pos, self._old_dir, ctrl, self._old_switch, self._railtype) - if vector.equals(dir, {x=0, y=0, z=0}) then - dir = false - pos = vector.new(expected_pos) - update.pos = true - end - break - end - end - end - - if vel.y == 0 then - for _,v in ipairs({"x", "z"}) do - if vel[v] ~= 0 and math.abs(vel[v]) < 0.9 then - vel[v] = 0 - update.vel = true - end - end - end - - local cart_dir = mcl_minecarts:velocity_to_dir(vel) - local max_vel = mcl_minecarts.speed_max - if not dir then - dir, last_switch = mcl_minecarts:get_rail_direction(pos, cart_dir, ctrl, self._old_switch, self._railtype) - end - - local new_acc = {x=0, y=0, z=0} - if vector.equals(dir, {x=0, y=0, z=0}) and not has_fuel then - vel = {x=0, y=0, z=0} - update.vel = true - else - -- If the direction changed - if dir.x ~= 0 and self._old_dir.z ~= 0 then - vel.x = dir.x * math.abs(vel.z) - vel.z = 0 - pos.z = math.floor(pos.z + 0.5) - update.pos = true - end - if dir.z ~= 0 and self._old_dir.x ~= 0 then - vel.z = dir.z * math.abs(vel.x) - vel.x = 0 - pos.x = math.floor(pos.x + 0.5) - update.pos = true - end - -- Up, down? - if dir.y ~= self._old_dir.y then - vel.y = dir.y * math.abs(vel.x + vel.z) - pos = vector.round(pos) - update.pos = true - end - - -- Slow down or speed up - local acc = dir.y * -1.8 - local friction = 0.4 - local ndef = minetest.registered_nodes[minetest.get_node(pos).name] - local speed_mod = ndef and ndef._rail_acceleration - - acc = acc - friction - - if has_fuel then - acc = acc + 0.6 - end - - if speed_mod and speed_mod ~= 0 then - acc = acc + speed_mod + friction - end - - new_acc = vector.multiply(dir, acc) - end - - self.object:set_acceleration(new_acc) - self._old_pos = vector.new(pos) - self._old_dir = vector.new(dir) - self._old_switch = last_switch - - -- Limits - for _,v in ipairs({"x","y","z"}) do - if math.abs(vel[v]) > max_vel then - vel[v] = mcl_minecarts:get_sign(vel[v]) * max_vel - new_acc[v] = 0 - update.vel = true - end - end - - -- Give achievement when player reached a distance of 1000 nodes from the start position - if self._driver and (vector.distance(self._start_pos, pos) >= 1000) then - awards.unlock(self._driver, "mcl:onARail") - end - - - if update.pos or self._punched then - local yaw = 0 - if dir.x < 0 then - yaw = 0.5 - elseif dir.x > 0 then - yaw = 1.5 - elseif dir.z < 0 then - yaw = 1 - end - self.object:set_yaw(yaw * math.pi) - end - - if self._punched then - self._punched = false - end - - if not (update.vel or update.pos) then - return - end - - - local anim = {x=0, y=0} - if dir.y == -1 then - anim = {x=1, y=1} - elseif dir.y == 1 then - anim = {x=2, y=2} - end - self.object:set_animation(anim, 1, 0) - - self.object:set_velocity(vel) - if update.pos then - self.object:set_pos(pos) - end - end - - function cart:get_staticdata() - return minetest.serialize({_railtype = self._railtype}) - end - - minetest.register_entity(entity_id, cart) -end - --- Place a minecart at pointed_thing -function mcl_minecarts.place_minecart(itemstack, pointed_thing, placer) - if not pointed_thing.type == "node" then - return - end - - local railpos, node - if mcl_minecarts:is_rail(pointed_thing.under) then - railpos = pointed_thing.under - node = minetest.get_node(pointed_thing.under) - elseif mcl_minecarts:is_rail(pointed_thing.above) then - railpos = pointed_thing.above - node = minetest.get_node(pointed_thing.above) - else - return - end - - -- Activate detector rail - if node.name == "mcl_minecarts:detector_rail" then - local newnode = {name="mcl_minecarts:detector_rail_on", param2 = node.param2} - minetest.swap_node(railpos, newnode) - mesecon.receptor_on(railpos) - end - - local entity_id = entity_mapping[itemstack:get_name()] - local cart = minetest.add_entity(railpos, entity_id) - local railtype = minetest.get_item_group(node.name, "connect_to_raillike") - local le = cart:get_luaentity() - if le then - le._railtype = railtype - end - local cart_dir = mcl_minecarts:get_rail_direction(railpos, {x=1, y=0, z=0}, nil, nil, railtype) - cart:set_yaw(minetest.dir_to_yaw(cart_dir)) - - local pname = "" - if placer then - pname = placer:get_player_name() - end - if not minetest.is_creative_enabled(pname) then - itemstack:take_item() - end - return itemstack -end - - -local function register_craftitem(itemstring, entity_id, description, tt_help, longdesc, usagehelp, icon, creative) - entity_mapping[itemstring] = entity_id - - local groups = { minecart = 1, transport = 1 } - if creative == false then - groups.not_in_creative_inventory = 1 - end - local def = { - stack_max = 1, - on_place = function(itemstack, placer, pointed_thing) - if not pointed_thing.type == "node" then - return - end - - -- Call on_rightclick if the pointed node defines it - local node = minetest.get_node(pointed_thing.under) - if placer and not placer:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack - end - end - - return mcl_minecarts.place_minecart(itemstack, pointed_thing, placer) - end, - _on_dispense = function(stack, pos, droppos, dropnode, dropdir) - -- Place minecart as entity on rail. If there's no rail, just drop it. - local placed - if minetest.get_item_group(dropnode.name, "rail") ~= 0 then - -- FIXME: This places minecarts even if the spot is already occupied - local pointed_thing = { under = droppos, above = { x=droppos.x, y=droppos.y+1, z=droppos.z } } - placed = mcl_minecarts.place_minecart(stack, pointed_thing) - end - if placed == nil then - -- Drop item - minetest.add_item(droppos, stack) - end - end, - groups = groups, - } - def.description = description - def._tt_help = tt_help - def._doc_items_longdesc = longdesc - def._doc_items_usagehelp = usagehelp - def.inventory_image = icon - def.wield_image = icon - minetest.register_craftitem(itemstring, def) -end - ---[[ -Register a minecart -* itemstring: Itemstring of minecart item -* entity_id: ID of minecart entity -* description: Item name / description -* longdesc: Long help text -* usagehelp: Usage help text -* mesh: Minecart mesh -* textures: Minecart textures table -* icon: Item icon -* drop: Dropped items after destroying minecart -* on_rightclick: Called after rightclick -* on_activate_by_rail: Called when above activator rail -* creative: If false, don't show in Creative Inventory -]] -local function register_minecart(itemstring, entity_id, description, tt_help, longdesc, usagehelp, mesh, textures, icon, drop, on_rightclick, on_activate_by_rail, creative) - register_entity(entity_id, mesh, textures, drop, on_rightclick, on_activate_by_rail) - register_craftitem(itemstring, entity_id, description, tt_help, longdesc, usagehelp, icon, creative) - if minetest.get_modpath("doc_identifier") then - doc.sub.identifier.register_object(entity_id, "craftitems", itemstring) - end -end - --- Minecart -register_minecart( - "mcl_minecarts:minecart", - "mcl_minecarts:minecart", - S("Minecart"), - S("Vehicle for fast travel on rails"), - S("Minecarts can be used for a quick transportion on rails.") .. "\n" .. - S("Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type."), - S("You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.") .. "\n" .. - S("To obtain the minecart, punch it while holding down the sneak key.") .. "\n" .. - S("If it moves over a powered activator rail, you'll get ejected."), - "mcl_minecarts_minecart.b3d", - {"mcl_minecarts_minecart.png"}, - "mcl_minecarts_minecart_normal.png", - {"mcl_minecarts:minecart"}, - function(self, clicker) - local name = clicker:get_player_name() - if not clicker or not clicker:is_player() then - return - end - local player_name = clicker:get_player_name() - if self._driver and player_name == self._driver then - detach_driver(self) - elseif not self._driver then - self._driver = player_name - self._start_pos = self.object:get_pos() - mcl_player.player_attached[player_name] = true - clicker:set_attach(self.object, "", {x=0, y=-1.75, z=-2}, {x=0, y=0, z=0}) - mcl_player.player_attached[name] = true - minetest.after(0.2, function(name) - local player = minetest.get_player_by_name(name) - if player then - mcl_player.player_set_animation(player, "sit" , 30) - player:set_eye_offset({x=0, y=-5.5, z=0},{x=0, y=-4, z=0}) - mcl_title.set(clicker, "actionbar", {text=S("Sneak to dismount"), color="white", stay=60}) - end - end, name) - end - end, activate_normal_minecart -) - --- Minecart with Chest -register_minecart( - "mcl_minecarts:chest_minecart", - "mcl_minecarts:chest_minecart", - S("Minecart with Chest"), - nil, nil, nil, - "mcl_minecarts_minecart_chest.b3d", - { "mcl_chests_normal.png", "mcl_minecarts_minecart.png" }, - "mcl_minecarts_minecart_chest.png", - {"mcl_minecarts:minecart", "mcl_chests:chest"}, - nil, nil, false) - --- Minecart with Furnace -register_minecart( - "mcl_minecarts:furnace_minecart", - "mcl_minecarts:furnace_minecart", - S("Minecart with Furnace"), - nil, - S("A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel."), - S("Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.") .. "\n" .. - S("To obtain the minecart and furnace, punch them while holding down the sneak key."), - - "mcl_minecarts_minecart_block.b3d", - { - "default_furnace_top.png", - "default_furnace_top.png", - "default_furnace_front.png", - "default_furnace_side.png", - "default_furnace_side.png", - "default_furnace_side.png", - "mcl_minecarts_minecart.png", - }, - "mcl_minecarts_minecart_furnace.png", - {"mcl_minecarts:minecart", "mcl_furnaces:furnace"}, - -- Feed furnace with coal - function(self, clicker) - if not clicker or not clicker:is_player() then - return - end - if not self._fueltime then - self._fueltime = 0 - end - local held = clicker:get_wielded_item() - if minetest.get_item_group(held:get_name(), "coal") == 1 then - self._fueltime = self._fueltime + 180 - - if not minetest.is_creative_enabled(clicker:get_player_name()) then - held:take_item() - local index = clicker:get_wield_index() - local inv = clicker:get_inventory() - inv:set_stack("main", index, held) - end - self.object:set_properties({textures = - { - "default_furnace_top.png", - "default_furnace_top.png", - "default_furnace_front_active.png", - "default_furnace_side.png", - "default_furnace_side.png", - "default_furnace_side.png", - "mcl_minecarts_minecart.png", - }}) - end - end, nil, false -) - --- Minecart with Command Block -register_minecart( - "mcl_minecarts:command_block_minecart", - "mcl_minecarts:command_block_minecart", - S("Minecart with Command Block"), - nil, nil, nil, - "mcl_minecarts_minecart_block.b3d", - { - "jeija_commandblock_off.png^[verticalframe:2:0", - "jeija_commandblock_off.png^[verticalframe:2:0", - "jeija_commandblock_off.png^[verticalframe:2:0", - "jeija_commandblock_off.png^[verticalframe:2:0", - "jeija_commandblock_off.png^[verticalframe:2:0", - "jeija_commandblock_off.png^[verticalframe:2:0", - "mcl_minecarts_minecart.png", - }, - "mcl_minecarts_minecart_command_block.png", - {"mcl_minecarts:minecart"}, - nil, nil, false -) - --- Minecart with Hopper -register_minecart( - "mcl_minecarts:hopper_minecart", - "mcl_minecarts:hopper_minecart", - S("Minecart with Hopper"), - nil, nil, nil, - "mcl_minecarts_minecart_hopper.b3d", - { - "mcl_hoppers_hopper_inside.png", - "mcl_minecarts_minecart.png", - "mcl_hoppers_hopper_outside.png", - "mcl_hoppers_hopper_top.png", - }, - "mcl_minecarts_minecart_hopper.png", - {"mcl_minecarts:minecart", "mcl_hoppers:hopper"}, - nil, nil, false -) - --- Minecart with TNT -register_minecart( - "mcl_minecarts:tnt_minecart", - "mcl_minecarts:tnt_minecart", - S("Minecart with TNT"), - S("Vehicle for fast travel on rails").."\n"..S("Can be ignited by tools or powered activator rail"), - S("A minecart with TNT is an explosive vehicle that travels on rail."), - S("Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.") .. "\n" .. - S("To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited."), - "mcl_minecarts_minecart_block.b3d", - { - "default_tnt_top.png", - "default_tnt_bottom.png", - "default_tnt_side.png", - "default_tnt_side.png", - "default_tnt_side.png", - "default_tnt_side.png", - "mcl_minecarts_minecart.png", - }, - "mcl_minecarts_minecart_tnt.png", - {"mcl_minecarts:minecart", "mcl_tnt:tnt"}, - -- Ingite - function(self, clicker) - if not clicker or not clicker:is_player() then - return - end - if self._boomtimer then - return - end - local held = clicker:get_wielded_item() - if held:get_name() == "mcl_fire:flint_and_steel" then - if not minetest.is_creative_enabled(clicker:get_player_name()) then - held:add_wear(65535/65) -- 65 uses - local index = clicker:get_wield_index() - local inv = clicker:get_inventory() - inv:set_stack("main", index, held) - end - activate_tnt_minecart(self) - end - end, activate_tnt_minecart) - - -minetest.register_craft({ - output = "mcl_minecarts:minecart", - recipe = { - {"mcl_core:iron_ingot", "", "mcl_core:iron_ingot"}, - {"mcl_core:iron_ingot", "mcl_core:iron_ingot", "mcl_core:iron_ingot"}, - }, -}) - -minetest.register_craft({ - output = "mcl_minecarts:tnt_minecart", - recipe = { - {"mcl_tnt:tnt"}, - {"mcl_minecarts:minecart"}, - }, -}) - --- TODO: Re-enable crafting of special minecarts when they have been implemented ---[[minetest.register_craft({ - output = "mcl_minecarts:furnace_minecart", - recipe = { - {"mcl_furnaces:furnace"}, - {"mcl_minecarts:minecart"}, - }, -}) - -minetest.register_craft({ - output = "mcl_minecarts:hopper_minecart", - recipe = { - {"mcl_hoppers:hopper"}, - {"mcl_minecarts:minecart"}, - }, -}) - -minetest.register_craft({ - output = "mcl_minecarts:chest_minecart", - recipe = { - {"mcl_chests:chest"}, - {"mcl_minecarts:minecart"}, - }, -})]] - - -if has_mcl_wip then - mcl_wip.register_wip_item("mcl_minecarts:chest_minecart") - mcl_wip.register_wip_item("mcl_minecarts:furnace_minecart") - mcl_wip.register_wip_item("mcl_minecarts:command_block_minecart") - mcl_wip.register_wip_item("mcl_minecarts:hopper_minecart") -end diff --git a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr deleted file mode 100644 index 1d270ee6ce..0000000000 --- a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr +++ /dev/null @@ -1,36 +0,0 @@ -# textdomain: mcl_minecarts -Minecart=Lore -Minecarts can be used for a quick transportion on rails.=Loren können für eine schnelle Fahrt auf Schienen benutzt werden. -Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.=Loren fahren nur auf Schienen und bleiben immer auf der Strecke. An einer Einmündung ohne einem Weg nach vorne fahren sie nach links. Die Geschwindigkeit hängt vom Schienentyp ab. -You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.=Sie können die Lore auf Schienen platzieren. Rechtsklicken, um einzusteigen. -To obtain the minecart, punch it while holding down the sneak key.=Um die Lore aufzusammeln, schlagen Sie sie, während Sie die Schleichen-Taste gedrückt halten. -A minecart with TNT is an explosive vehicle that travels on rail.=Eine Lore mit TNT ist ein explosives Fahrzeug, das auf Schienen fährt. -Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.=Auf Schienen platzieren. Zuschlagen zum Bewegen. Das TNT wird mit einem Feuerzeug angezündet, oder, wenn die Lore sich auf einer bestromten Aktivierungsschiene befindet. -To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited.=Um die Lore und das TNT zu erhalten, schlagen Sie sie, während Sie die Schleichtaste drücken. Das ist nicht möglich, wenn das TNT bereits gezündet wurde. -A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel.=Eine Lore mit Ofen ist ein Fahrzeug, das auf Rädern fährt. Sie kann mit Brennstoff angetrieben werden. -Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.=Auf Schienen platzieren. Wird Kohle eingefügt, wird der Ofen für eine lange Zeit brennen und die Lore wird fähig sein, sich selbst anzutreiben. Zuschlagen, um die Bewegung einzuläuten. -To obtain the minecart and furnace, punch them while holding down the sneak key.=Um die Lore und den Ofen zu erhalten, schlagen Sie zu, während Sie die Schleichtaste drücken. -Minecart with Chest=Lore mit Truhe -Minecart with Furnace=Lore mit Ofen -Minecart with Command Block=Lore mit Befehlsblock -Minecart with Hopper=Lore mit Trichter -Minecart with TNT=Lore mit TNT -Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.=Bauen Sie sie auf den Boden, um Ihr Schienennetzwerk zu errichten, die Schienen werden sich automatisch verbinden und sich nach Bedarf in Kurven, Einmündungen, Kreuzungen und Steigungen verwandeln. -Rail=Schiene -Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.=Schienen können benutzt werden, um Strecken für Loren zu bauen. Normale Schienen werden Loren aufgrund von Reibung leicht verlangsamen. -Powered Rail=Antriebsschiene -Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Schienen können benutzt werden, um Strecken für Loren zu bauen. Antriebsschienen können Loren beschleunigen und abbremsen. -Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=Ohne Redstone-Energie wird die Schiene Loren abbremsen. Mit Redstone-Energie wird sie sie beschleunigen. -Activator Rail=Aktivierungsschiene -Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Schienen können benutzt werden, um Strecken für Loren zu bauen. Aktivierungsschienen werden benutzt, um besondere Loren zu aktivieren. -To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=Wenn diese Schiene mit Redstone-Energie versorgt wird, werden alle Loren, die sie passieren, aktiviert. -Detector Rail=Sensorschiene -Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.=Schienen können benutzt werden, um Strecken für Loren zu bauen. Eine Sensorschiene kann eine Lore erkennen und versorgt Redstone-Mechanismen. -To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=Um eine Lore zu erkennen und die Redstone-Energie zu aktivieren, verbinden Sie die Schiene mit Redstonestaub oder Redstone-Mechanismen und schicken Sie eine beliebige Lore über die Schiene. -Track for minecarts=Strecke für Loren -Speed up when powered, slow down when not powered=Beschleunigt, wenn bestromt, sonst verlangsamt es -Activates minecarts when powered=Aktiviert Loren, wenn bestromt -Emits redstone power when a minecart is detected=Gibt ein Redstonesignal aus, wenn eine Lore erfasst wird -Vehicle for fast travel on rails=Fahrzeug zum schnellen Transport auf Schienen -Can be ignited by tools or powered activator rail=Kann mit Werkzeugen oder bestromten Aktivierungsschienen angezündet werden -Sneak to dismount=Zum Aussteigen schleichen diff --git a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.es.tr b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.es.tr deleted file mode 100644 index 06ee2ca6a2..0000000000 --- a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.es.tr +++ /dev/null @@ -1,23 +0,0 @@ -# textdomain: mcl_minecarts -Minecart=Vagoneta -Minecarts can be used for a quick transportion on rails.=Las vagonetas se pueden usar para transportarse rápido en los rieles. -Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.=Las vagonetas solo viajan en rieles y siempre siguen las pistas. En un cruce en T sin camino recto, giran a la izquierda. La velocidad se ve afectada por el tipo de riel. -You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.=Puedes colocar el vagoneta en los rieles. Haga clic derecho para insertarlo. Golpea para que se mueva. -To obtain the minecart, punch it while holding down the sneak key.=Para obtener el vagoneta, golpéalo mientras mantienes presionada la tecla. -Minecart with Chest=Vagoneta con cofre -Minecart with Furnace=Vagoneta con horno -Minecart with Command Block=Vagoneta con bloque de comandos -Minecart with Hopper=Vagoneta con tolva -Minecart with TNT=Vagoneta con dinamita -Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.=Colóquelos en el suelo para construir su ferrocarril, los rieles se conectarán automáticamente entre sí y se convertirán en curvas, uniones en T, cruces y pendientes según sea necesario. -Rail=Raíl -Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.=Los rieles se pueden usar para construir vías de transporte para vagonetas. Los rieles normales ralentizan ligeramente las vagonetas debido a la fricción. -Powered Rail=Raíl propulsor -Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Los rieles se pueden usar para construir vías de transporte para vagonetas. Los railes propulsores pueden acelerar y frenar las vagonetas. -Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=Sin energía de redstone, el riel frenará las vagonetas. Para hacer que este riel acelere las vagonetas, aliméntalo con redstone. -Activator Rail=Raíl activador -Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Los rieles se pueden usar para construir vías de transporte para vagonetas. Los railes activador se utilizan para activar una vagoneta especial. -To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=Para hacer que este riel active las vagonetas, enciéndelo con energía de redstone y envía una vagoneta sobre este pedazo de riel. -Detector Rail=Raíl detector -Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.=Los rieles se pueden usar para construir vías de transporte para vagonetas. Un raíl detector puede detectar una vagoneta sobre él y alimenta los mecanismos de redstone. -To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=Para detectar una vagoneta y proporcionar energía de redstone, conéctelo a los senderos de redstone o mecanismos de redstone y envíe cualquier vagoneta sobre el riel. diff --git a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr deleted file mode 100644 index 67ed5eb1b0..0000000000 --- a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr +++ /dev/null @@ -1,36 +0,0 @@ -# textdomain: mcl_minecarts -Minecart=Wagonnet -Minecarts can be used for a quick transportion on rails.=Les wagonnets peuvent être utilisés pour un transport rapide sur rails. -Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.=Les wagonnets roulent uniquement sur des rails et suivent toujours les pistes. À un carrefour en T sans voie directe, ils tournent à gauche. La vitesse dépend du type de rail. -You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.=Vous pouvez placer le wagonnet sur des rails. Faites un clic droit dessus pour entrer dedans. Frappez-le pour le faire bouger. -To obtain the minecart, punch it while holding down the sneak key.=Pour obtenir la wagonnet, frappez-le tout en maintenant la touche furtive enfoncée. -A minecart with TNT is an explosive vehicle that travels on rail.=Un wagonnet avec de la TNT est un véhicule explosif qui se déplace sur rail. -Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.=Placez-le sur des rails. Frappez-le pour le déplacer. Le TNT est allumé avec un briquet ou lorsque le minecart est sur un rail d'activation alimenté. -To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited.=Pour obtenir la wagonnet et la TNT, frappez-les tout en maintenant la touche furtive enfoncée. Vous ne pouvez pas faire cela si le TNT a été allumé. -A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel.=Une wagonnet avec un four est un véhicule qui se déplace sur rails. Il peut se propulser avec du carburant. -Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.=Placez-le sur des rails. Si vous lui donnez du charbon, le four commencera à brûler pendant longtemps et le wagonnet pourra se déplacer. Frappez-le pour le faire bouger. -To obtain the minecart and furnace, punch them while holding down the sneak key.=Pour obtenir le wagonnet et le four, frappez-les tout en maintenant la touche furtive enfoncée. -Minecart with Chest=Wagonnet avec Coffre -Minecart with Furnace=Wagonnet avec Four -Minecart with Command Block=Wagonnet avec Bloc de Commande -Minecart with Hopper=Wagonnet avec Entonoir -Minecart with TNT=Wagonnet avec TNT -Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.=Placez-les sur le sol pour construire votre chemin de fer, les rails se connecteront automatiquement les uns aux autres et se transformeront en courbes, en jonctions en T, en traversées et en pentes au besoin. -Rail=Rail -Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.=Les rails peuvent être utilisés pour construire des voies de transport pour les wagonnets. Les rails ralentissent légèrement les wagonnets en raison de la friction. -Powered Rail=Rail allimenté -Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Les rails peuvent être utilisés pour construire des voies de transport pour les wagonnets. Les rails motorisés sont capables d'accélérer et de freiner les wagonnets. -Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=Sans énergie de redstone, le rail freinera les wagonnets. Pour que ce rail accélère les minecarts, alimentez-le avec une source d'énergie redstone. -Activator Rail=Rail d'activation -Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Les rails peuvent être utilisés pour construire des voies de transport pour les wagonnets. Des rails activateurs sont utilisés pour activer des wagonnets spéciaux. -To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=Pour activer ce rail, activez les wagonnets, alimentez-le avec de l'énergie redstone et envoyez un wagonnet sur ce morceau de rail. -Detector Rail=Rail de détection -Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.=Les rails peuvent être utilisés pour construire des voies de transport pour les wagonnets. Un rail de détection est capable de détecter un wagonnet au-dessus et alimente les mécanismes de redstone. -To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=Pour détecter un wagonnet et fournir une alimentation redstone, connectez-le aux câble redstone ou aux mécanismes redstone et envoyez n'importe quel wagonnet sur le rail. -Track for minecarts=Piste pour wagonnets -Speed up when powered, slow down when not powered=Accélérez lorsqu'il est alimenté, ralentissez lorsqu'il n'est pas alimenté -Activates minecarts when powered=Active les wagonnets lorsqu'il est alimenté -Emits redstone power when a minecart is detected=Émet de l'énergie redstone lorsqu'un wagonnet est détecté -Vehicle for fast travel on rails=Véhicule pour voyager rapidement sur rails -Can be ignited by tools or powered activator rail=Peut être allumé par des outils ou un rail d'activation motorisé -Sneak to dismount= \ No newline at end of file diff --git a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.pl.tr b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.pl.tr deleted file mode 100644 index b36ec5eb16..0000000000 --- a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.pl.tr +++ /dev/null @@ -1,36 +0,0 @@ -# textdomain: mcl_minecarts -Minecart=Wagonik -Minecarts can be used for a quick transportion on rails.=Wagoniki mogą być użyte do szybkiego transportu po torach. -Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.=Wagoniki mogą jeździć tylko po torach i zawsze podążają za wytyczoną ścieżką. W przypadku skrzyżowań typu T, gdzie nie ma prostej ścieżki, skręcają w lew. Ich szybkość zależy od typu torów. -You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.=Możesz postawić wagonik na torach. Kliknij prawym przyciskiem myszy aby do niego wejść. Uderz go by zaczął się poruszać. -To obtain the minecart, punch it while holding down the sneak key.=Aby odzyskać wagonik uderz go podczas skradania. -A minecart with TNT is an explosive vehicle that travels on rail.=Wagonik z TNT jest wybuchowym pojazdem podróżującym po torach. -Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.=Postaw go na torach. Uderz by zaczął się poruszać. TNT zapala się krzesiwem lub gdy wagonik jest na zasilonych torach aktywacyjnych. -To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited.=Aby odzyskać wagonik z TNT uderz go podczas skradania. Nie możesz tego zrobić gdy TNT jest zapalone. -A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel.=Wagonik z piecem jest pojazdem podróżującym na torach. Napędza on samego siebie za pomocą paliwa. -Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.=Postaw go na torach. Jeśli dasz mu nieco węgla piec zacznie palić przez długi czas, a wagonik będzie się sam poruszał. Uderz go by zaczął się poruszać. -To obtain the minecart and furnace, punch them while holding down the sneak key.=Aby odzyskać wagonik z piecem uderz go podczas skradania. -Minecart with Chest=Wagonik ze skrzynią -Minecart with Furnace=Wagonik z piecem -Minecart with Command Block=Wagonik z blokiem poleceń -Minecart with Hopper=Wagonik z lejem -Minecart with TNT=Wagonik z TNT -Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.=Postaw je na ziemi by zbudować ścieżkę z torów. Tory automatycznie połączą się ze sobą i zamienią się w zakręty, skrzyżowania typu T, skrzyżowania i równie w zależności od potrzeb. -Rail=Tor -Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.=Tory mogą być wykorzystane do zbudowania torów dla wagoników. Zwyczajne tory nieco spowalniają wagoniki ze względu na tarcie. -Powered Rail=Zasilane tory -Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Tory mogą być wykorzystane do zbudowania torów dla wagoników. Zasilane tory mogą przyspieszać lub spowalniać wagoniki. -Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=Bez zasilania czerwienitem tory będą spowalniać wagoniki. Aby sprawić by je przyspieszały zasil je czerwienitem. -Activator Rail=Tory aktywacyjne -Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Tory mogą być wykorzystane do zbudowania torów dla wagoników. Tory aktywacyjne są wykorzystywane do aktywacji specjalnych wagoników. -To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=Aby ten tor aktywował wagonik, zasil go czerwienitem i spraw by wagonik po nim przejechał. -Detector Rail=Tory z czujnikiem -Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.=Tory mogą być wykorzystane do zbudowania torów dla wagoników. Tory z czujnikiem są w stanie wykryć kiedy wagonik po nich przejeżdża i wysłać sygnał do czerwienitowych mechanizmów. -To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=Aby wykryć wagonik i dostarczyć zasilanie czerwienitem podłącz go czerwienitem to mechanizmu i spraw by wagonik po nim przejechał. -Track for minecarts=Tor dla wagoników -Speed up when powered, slow down when not powered=Przyspiesza gdy zasilane, spowalnia gdy nie -Activates minecarts when powered=Aktywuje wagoniki gdy zasilane -Emits redstone power when a minecart is detected=Emituje zasilanie czerwienitem gdy wagonik jest wykryty -Vehicle for fast travel on rails=Pojazd do szybkiej podróży na torach -Can be ignited by tools or powered activator rail=Może być zapalony przez narzędzia, lub zasilane tor aktywacyjne -Sneak to dismount=Zacznij się skradać by zejść diff --git a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.ru.tr b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.ru.tr deleted file mode 100644 index 6189bac843..0000000000 --- a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.ru.tr +++ /dev/null @@ -1,36 +0,0 @@ -# textdomain: mcl_minecarts -Minecart=Вагонетка -Minecarts can be used for a quick transportion on rails.=Вагонетки нужны, чтобы быстро перемещаться по рельсам. -Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.=Вагонетки едут строго по проложенному железнодорожному пути. На Т-образной развилке они поворачивают налево. Скорость зависит от типа рельсов. -You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.=Вы ставите вагонетку на рельсы. Правым кликом садитесь в неё. Стукаете, чтобы начать движение. -To obtain the minecart, punch it while holding down the sneak key.=Чтобы взять вагонетку, стукните её, удерживая клавишу [Красться]. -A minecart with TNT is an explosive vehicle that travels on rail.=Вагон тротила это подрывной железнодорожный транспорт. -Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.=Поместите его на рельсы. Стукните, чтобы он поехал. Тротил воспламеняется, если его поджечь огнивом, либо при попадании на подключенный рельсовый активатор. -To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited.=Чтобы взять вагон тротила, стукните его, удерживая клавишу [Красться]. Если тротил воспламенён, сделать это нельзя. -A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel.=Вагон с печью - это железнодорожный транспорт. Он может двигаться за счёт топлива. -Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.=Поставьте его на рельсы. Если добавить немного угля, то печь зажжётся на продолжительное время и вагон сможет ехать. Стукните вагон для начала движения. -To obtain the minecart and furnace, punch them while holding down the sneak key.=Чтобы взять вагон с печью, стукните его, удерживая клавишу [Красться]. -Minecart with Chest=Вагон с сундуком -Minecart with Furnace=Вагон с печью -Minecart with Command Block=Вагон с командным блоком -Minecart with Hopper=Вагон с бункером -Minecart with TNT=Вагон тротила -Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.=Поместите на землю, чтобы сделать железную дорогу, рельсы автоматически соединятся между собой и будут превращаться в плавный повороты, T-образные развилки, перекрёстки и уклоны там, где это потребуется. -Rail=Рельсы -Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.=Рельсы используются для строительства железной дороги. Обычные рельсы немного замедляют движение вагонеток из-за трения. -Powered Rail=Подключаемые рельсы -Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Рельсы используются для строительства железной дороги. Подключённые рельсы могут разгонять и тормозить вагонетки. -Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=Без энергии редстоуна рельсы будут тормозить вагонетки. -Activator Rail=Рельсовый активатор -Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Рельсы используются для строительства железной дороги. Рельсовый активатор активирует особые вагонетки. -To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=Чтобы этот блок рельсов активировал вагонетку, подключите его к энергии редстоуна и направьте вагонетку через него. -Detector Rail=Рельсовый детектор -Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.=Рельсы используются для строительства железной дороги. Рельсовый детектор может обнаруживать вагонетку у себя наверху и подключать механизмы редстоуна. -To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=Чтобы обнаруживать вагонетку и подавать энергию редстоуна, подключите его к дорожке редстоуна или механизму редстоуна, после чего направьте любую вагонетку через него. -Track for minecarts=Железная дорога -Speed up when powered, slow down when not powered=Разгоняет, если подключён, тормозит, если не подключён -Activates minecarts when powered=Активирует особые вагонетки, если подключён -Emits redstone power when a minecart is detected=Испускает энергию редстоуна при обнаружении вагонетки -Vehicle for fast travel on rails=Быстрый железнодорожный транспорт -Can be ignited by tools or powered activator rail=Можно воспламенить с помощью инструмента или подключенного рельсового активатора -Sneak to dismount=Нажмите [Красться] для высадки diff --git a/mods/ENTITIES/mcl_minecarts/locale/template.txt b/mods/ENTITIES/mcl_minecarts/locale/template.txt deleted file mode 100644 index dff98587c7..0000000000 --- a/mods/ENTITIES/mcl_minecarts/locale/template.txt +++ /dev/null @@ -1,36 +0,0 @@ -# textdomain: mcl_minecarts -Minecart= -Minecarts can be used for a quick transportion on rails.= -Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.= -You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.= -To obtain the minecart, punch it while holding down the sneak key.= -A minecart with TNT is an explosive vehicle that travels on rail.= -Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.= -To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited.= -A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel.= -Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.= -To obtain the minecart and furnace, punch them while holding down the sneak key.= -Minecart with Chest= -Minecart with Furnace= -Minecart with Command Block= -Minecart with Hopper= -Minecart with TNT= -Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.= -Rail= -Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.= -Powered Rail= -Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.= -Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.= -Activator Rail= -Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.= -To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.= -Detector Rail= -Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.= -To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.= -Track for minecarts= -Speed up when powered, slow down when not powered= -Activates minecarts when powered= -Emits redstone power when a minecart is detected= -Vehicle for fast travel on rails= -Can be ignited by tools or powered activator rail= -Sneak to dismount= diff --git a/mods/ENTITIES/mcl_minecarts/mod.conf b/mods/ENTITIES/mcl_minecarts/mod.conf deleted file mode 100644 index 3b8ae55514..0000000000 --- a/mods/ENTITIES/mcl_minecarts/mod.conf +++ /dev/null @@ -1,6 +0,0 @@ -name = mcl_minecarts -author = Krock -description = Minecarts are vehicles to move players quickly on rails. -depends = mcl_title, mcl_explosions, mcl_core, mcl_sounds, mcl_player, mcl_achievements, mcl_chests, mcl_furnaces, mesecons_commandblock, mcl_hoppers, mcl_tnt, mesecons -optional_depends = doc_identifier, mcl_wip - diff --git a/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart.b3d b/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart.b3d deleted file mode 100644 index 692e606d29..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart.b3d and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart_block.b3d b/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart_block.b3d deleted file mode 100644 index 211446bd4d..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart_block.b3d and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart_chest.b3d b/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart_chest.b3d deleted file mode 100644 index 5ede1c6486..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart_chest.b3d and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart_hopper.b3d b/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart_hopper.b3d deleted file mode 100644 index b6441f0615..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/models/mcl_minecarts_minecart_hopper.b3d and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/rails.lua b/mods/ENTITIES/mcl_minecarts/rails.lua deleted file mode 100644 index 91282f253b..0000000000 --- a/mods/ENTITIES/mcl_minecarts/rails.lua +++ /dev/null @@ -1,249 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - --- Template rail function -local function register_rail(itemstring, tiles, def_extras, creative) - local groups = {handy=1,pickaxey=1, attached_node=1,rail=1,connect_to_raillike=minetest.raillike_group("rail"),dig_by_water=1,destroy_by_lava_flow=1, transport=1} - if creative == false then - groups.not_in_creative_inventory = 1 - end - local ndef = { - drawtype = "raillike", - tiles = tiles, - is_ground_content = false, - inventory_image = tiles[1], - wield_image = tiles[1], - paramtype = "light", - walkable = false, - selection_box = { - type = "fixed", - fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, - }, - stack_max = 64, - groups = groups, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 3.5, - _mcl_hardness = 0.7, - after_destruct = function(pos) - -- Scan for minecarts in this pos and force them to execute their "floating" check. - -- Normally, this will make them drop. - local objs = minetest.get_objects_inside_radius(pos, 1) - for o=1, #objs do - local le = objs[o]:get_luaentity() - if le then - -- All entities in this mod are minecarts, so this works - if string.sub(le.name, 1, 14) == "mcl_minecarts:" then - le._last_float_check = mcl_minecarts.check_float_time - end - end - end - end, - } - if def_extras then - for k,v in pairs(def_extras) do - ndef[k] = v - end - end - minetest.register_node(itemstring, ndef) -end - --- Redstone rules -local rail_rules_long = -{{x=-1, y= 0, z= 0, spread=true}, - {x= 1, y= 0, z= 0, spread=true}, - {x= 0, y=-1, z= 0, spread=true}, - {x= 0, y= 1, z= 0, spread=true}, - {x= 0, y= 0, z=-1, spread=true}, - {x= 0, y= 0, z= 1, spread=true}, - - {x= 1, y= 1, z= 0}, - {x= 1, y=-1, z= 0}, - {x=-1, y= 1, z= 0}, - {x=-1, y=-1, z= 0}, - {x= 0, y= 1, z= 1}, - {x= 0, y=-1, z= 1}, - {x= 0, y= 1, z=-1}, - {x= 0, y=-1, z=-1}} - -local rail_rules_short = mesecon.rules.pplate - -local railuse = S("Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.") - --- Normal rail -register_rail("mcl_minecarts:rail", - {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"}, - { - description = S("Rail"), - _tt_help = S("Track for minecarts"), - _doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction."), - _doc_items_usagehelp = railuse, - } -) - --- Powered rail (off = brake mode) -register_rail("mcl_minecarts:golden_rail", - {"mcl_minecarts_rail_golden.png", "mcl_minecarts_rail_golden_curved.png", "mcl_minecarts_rail_golden_t_junction.png", "mcl_minecarts_rail_golden_crossing.png"}, - { - description = S("Powered Rail"), - _tt_help = S("Track for minecarts").."\n"..S("Speed up when powered, slow down when not powered"), - _doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts."), - _doc_items_usagehelp = railuse .. "\n" .. S("Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power."), - _rail_acceleration = -3, - mesecons = { - conductor = { - state = mesecon.state.off, - offstate = "mcl_minecarts:golden_rail", - onstate = "mcl_minecarts:golden_rail_on", - rules = rail_rules_long, - }, - }, - } -) - --- Powered rail (on = acceleration mode) -register_rail("mcl_minecarts:golden_rail_on", - {"mcl_minecarts_rail_golden_powered.png", "mcl_minecarts_rail_golden_curved_powered.png", "mcl_minecarts_rail_golden_t_junction_powered.png", "mcl_minecarts_rail_golden_crossing_powered.png"}, - { - _doc_items_create_entry = false, - _rail_acceleration = 4, - mesecons = { - conductor = { - state = mesecon.state.on, - offstate = "mcl_minecarts:golden_rail", - onstate = "mcl_minecarts:golden_rail_on", - rules = rail_rules_long, - }, - }, - drop = "mcl_minecarts:golden_rail", - }, - false -) - --- Activator rail (off) -register_rail("mcl_minecarts:activator_rail", - {"mcl_minecarts_rail_activator.png", "mcl_minecarts_rail_activator_curved.png", "mcl_minecarts_rail_activator_t_junction.png", "mcl_minecarts_rail_activator_crossing.png"}, - { - description = S("Activator Rail"), - _tt_help = S("Track for minecarts").."\n"..S("Activates minecarts when powered"), - _doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts."), - _doc_items_usagehelp = railuse .. "\n" .. S("To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail."), - mesecons = { - conductor = { - state = mesecon.state.off, - offstate = "mcl_minecarts:activator_rail", - onstate = "mcl_minecarts:activator_rail_on", - rules = rail_rules_long, - - }, - }, - } -) - --- Activator rail (on) -register_rail("mcl_minecarts:activator_rail_on", - {"mcl_minecarts_rail_activator_powered.png", "mcl_minecarts_rail_activator_curved_powered.png", "mcl_minecarts_rail_activator_t_junction_powered.png", "mcl_minecarts_rail_activator_crossing_powered.png"}, - { - _doc_items_create_entry = false, - mesecons = { - conductor = { - state = mesecon.state.on, - offstate = "mcl_minecarts:activator_rail", - onstate = "mcl_minecarts:activator_rail_on", - rules = rail_rules_long, - }, - effector = { - -- Activate minecarts - action_on = function(pos, node) - local pos2 = { x = pos.x, y =pos.y + 1, z = pos.z } - local objs = minetest.get_objects_inside_radius(pos2, 1) - for _, o in pairs(objs) do - local l = o:get_luaentity() - if l and string.sub(l.name, 1, 14) == "mcl_minecarts:" and l.on_activate_by_rail then - l:on_activate_by_rail() - end - end - end, - }, - - }, - drop = "mcl_minecarts:activator_rail", - }, - false -) - --- Detector rail (off) -register_rail("mcl_minecarts:detector_rail", - {"mcl_minecarts_rail_detector.png", "mcl_minecarts_rail_detector_curved.png", "mcl_minecarts_rail_detector_t_junction.png", "mcl_minecarts_rail_detector_crossing.png"}, - { - description = S("Detector Rail"), - _tt_help = S("Track for minecarts").."\n"..S("Emits redstone power when a minecart is detected"), - _doc_items_longdesc = S("Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms."), - _doc_items_usagehelp = railuse .. "\n" .. S("To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail."), - mesecons = { - receptor = { - state = mesecon.state.off, - rules = rail_rules_short, - }, - }, - } -) - --- Detector rail (on) -register_rail("mcl_minecarts:detector_rail_on", - {"mcl_minecarts_rail_detector_powered.png", "mcl_minecarts_rail_detector_curved_powered.png", "mcl_minecarts_rail_detector_t_junction_powered.png", "mcl_minecarts_rail_detector_crossing_powered.png"}, - { - _doc_items_create_entry = false, - mesecons = { - receptor = { - state = mesecon.state.on, - rules = rail_rules_short, - }, - }, - drop = "mcl_minecarts:detector_rail", - }, - false -) - - --- Crafting -minetest.register_craft({ - output = "mcl_minecarts:rail 16", - recipe = { - {"mcl_core:iron_ingot", "", "mcl_core:iron_ingot"}, - {"mcl_core:iron_ingot", "mcl_core:stick", "mcl_core:iron_ingot"}, - {"mcl_core:iron_ingot", "", "mcl_core:iron_ingot"}, - } -}) - -minetest.register_craft({ - output = "mcl_minecarts:golden_rail 6", - recipe = { - {"mcl_core:gold_ingot", "", "mcl_core:gold_ingot"}, - {"mcl_core:gold_ingot", "mcl_core:stick", "mcl_core:gold_ingot"}, - {"mcl_core:gold_ingot", "mesecons:redstone", "mcl_core:gold_ingot"}, - } -}) - -minetest.register_craft({ - output = "mcl_minecarts:activator_rail 6", - recipe = { - {"mcl_core:iron_ingot", "mcl_core:stick", "mcl_core:iron_ingot"}, - {"mcl_core:iron_ingot", "mesecons_torch:mesecon_torch_on", "mcl_core:iron_ingot"}, - {"mcl_core:iron_ingot", "mcl_core:stick", "mcl_core:iron_ingot"}, - } -}) - -minetest.register_craft({ - output = "mcl_minecarts:detector_rail 6", - recipe = { - {"mcl_core:iron_ingot", "", "mcl_core:iron_ingot"}, - {"mcl_core:iron_ingot", "mesecons_pressureplates:pressure_plate_stone_off", "mcl_core:iron_ingot"}, - {"mcl_core:iron_ingot", "mesecons:redstone", "mcl_core:iron_ingot"}, - } -}) - - --- Aliases -if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_minecarts:golden_rail", "nodes", "mcl_minecarts:golden_rail_on") -end - diff --git a/mods/ENTITIES/mcl_minecarts/textures/default_rail.png b/mods/ENTITIES/mcl_minecarts/textures/default_rail.png deleted file mode 100644 index 4f25f6b499..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/default_rail.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/default_rail_crossing.png b/mods/ENTITIES/mcl_minecarts/textures/default_rail_crossing.png deleted file mode 100644 index 409f14b823..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/default_rail_crossing.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/default_rail_curved.png b/mods/ENTITIES/mcl_minecarts/textures/default_rail_curved.png deleted file mode 100644 index 1633230723..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/default_rail_curved.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/default_rail_t_junction.png b/mods/ENTITIES/mcl_minecarts/textures/default_rail_t_junction.png deleted file mode 100644 index f25c510f53..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/default_rail_t_junction.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart.png deleted file mode 100644 index 9750048b37..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_chest.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_chest.png deleted file mode 100644 index 451d809209..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_chest.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_command_block.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_command_block.png deleted file mode 100644 index 3b8d3d5624..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_command_block.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_furnace.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_furnace.png deleted file mode 100644 index 7beaaa1c71..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_furnace.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_hopper.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_hopper.png deleted file mode 100644 index f16a007f7b..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_hopper.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_normal.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_normal.png deleted file mode 100644 index c9a4c356ae..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_normal.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_tnt.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_tnt.png deleted file mode 100644 index 246d36328c..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_minecart_tnt.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator.png deleted file mode 100644 index 15f2cdba6b..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_crossing.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_crossing.png deleted file mode 100644 index 9e3f67088b..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_crossing.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_crossing_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_crossing_powered.png deleted file mode 100644 index 4643380114..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_crossing_powered.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_curved.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_curved.png deleted file mode 100644 index d734c31ec4..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_curved.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_curved_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_curved_powered.png deleted file mode 100644 index 3988b928be..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_curved_powered.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_powered.png deleted file mode 100644 index ad072f425d..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_powered.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_t_junction.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_t_junction.png deleted file mode 100644 index fd07b42048..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_t_junction.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_t_junction_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_t_junction_powered.png deleted file mode 100644 index 370364817d..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_activator_t_junction_powered.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector.png deleted file mode 100644 index 4595df3a40..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_crossing.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_crossing.png deleted file mode 100644 index 52674486d8..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_crossing.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_crossing_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_crossing_powered.png deleted file mode 100644 index 08b20a814b..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_crossing_powered.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_curved.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_curved.png deleted file mode 100644 index b5dabcc017..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_curved.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_curved_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_curved_powered.png deleted file mode 100644 index 2a9cc60297..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_curved_powered.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_powered.png deleted file mode 100644 index 289064f6db..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_powered.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_t_junction.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_t_junction.png deleted file mode 100644 index 5b9da2502b..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_t_junction.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_t_junction_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_t_junction_powered.png deleted file mode 100644 index 7638413cad..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_detector_t_junction_powered.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden.png deleted file mode 100644 index 87a0b7bd56..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_crossing.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_crossing.png deleted file mode 100644 index df8f6bfbe1..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_crossing.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_crossing_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_crossing_powered.png deleted file mode 100644 index 81526029d4..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_crossing_powered.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_curved.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_curved.png deleted file mode 100644 index d557a358ae..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_curved.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_curved_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_curved_powered.png deleted file mode 100644 index ff1b917e25..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_curved_powered.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_powered.png deleted file mode 100644 index c118032ef4..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_powered.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_t_junction.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_t_junction.png deleted file mode 100644 index 042f3d1be0..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_t_junction.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_t_junction_powered.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_t_junction_powered.png deleted file mode 100644 index 6a4af02094..0000000000 Binary files a/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_t_junction_powered.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua deleted file mode 100644 index 933634ccee..0000000000 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ /dev/null @@ -1,4496 +0,0 @@ - --- API for Mobs Redo: MineClone 2 Edition (MRM) - -mcl_mobs = {} - -local MAX_MOB_NAME_LENGTH = 30 -local HORNY_TIME = 30 -local HORNY_AGAIN_TIME = 300 -local CHILD_GROW_TIME = 60*20 -local DEATH_DELAY = 0.5 -local DEFAULT_FALL_SPEED = -10 -local FLOP_HEIGHT = 5.0 -local FLOP_HOR_SPEED = 1.5 -local ENTITY_CRAMMING_MAX = 24 -local CRAMMING_DAMAGE = 3 - -local MOB_CAP = {} -MOB_CAP.hostile = 70 -MOB_CAP.passive = 10 -MOB_CAP.ambient = 15 -MOB_CAP.water = 15 - --- Localize -local S = minetest.get_translator("mcl_mobs") - --- Invisibility mod check -mcl_mobs.invis = {} - --- localize math functions -local pi = math.pi -local sin = math.sin -local cos = math.cos -local abs = math.abs -local min = math.min -local max = math.max -local atann = math.atan -local random = math.random -local floor = math.floor - -local atan = function(x) - if not x or x ~= x then - return 0 - else - return atann(x) - end -end - - --- Load settings -local damage_enabled = minetest.settings:get_bool("enable_damage") -local disable_blood = minetest.settings:get_bool("mobs_disable_blood") -local mobs_drop_items = minetest.settings:get_bool("mobs_drop_items") ~= false -local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false -local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false -local remove_far = true -local difficulty = tonumber(minetest.settings:get("mob_difficulty")) or 1.0 -local show_health = false -local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 64) -local mobs_spawn_chance = tonumber(minetest.settings:get("mobs_spawn_chance") or 2.5) - --- Shows helpful debug info above each mob -local mobs_debug = minetest.settings:get_bool("mobs_debug", false) - --- Peaceful mode message so players will know there are no monsters -if minetest.settings:get_bool("only_peaceful_mobs", false) then - minetest.register_on_joinplayer(function(player) - minetest.chat_send_player(player:get_player_name(), - S("Peaceful mode active! No monsters will spawn.")) - end) -end - --- pathfinding settings -local enable_pathfinding = true -local stuck_timeout = 3 -- how long before mob gets stuck in place and starts searching -local stuck_path_timeout = 10 -- how long will mob follow path before giving up - --- default nodes -local node_ice = "mcl_core:ice" -local node_snowblock = "mcl_core:snowblock" -local node_snow = "mcl_core:snow" -mcl_mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "mcl_core:dirt" - -minetest.register_chatcommand("clearmobs",{ - privs={maphack=true}, - params = "||", - description=S("Removes all spawned mobs except nametagged and tamed ones. all removes all mobs, nametagged only nametagged ones and with the range paramter all mobs in a distance of the current player are removed."), - func=function(n,param) - local p = minetest.get_player_by_name(n) - local num=tonumber(param) - for _,o in pairs(minetest.luaentities) do - if o.is_mob then - if param == "all" or - ( param == "nametagged" and o.nametag ) or - ( param == "" and not o.nametag and not o.tamed ) or - ( num and num > 0 and vector.distance(p:get_pos(),o.object:get_pos()) <= num ) then - o.object:remove() - end - end - end -end}) - -----For Water Flowing: -local enable_physics = function(object, luaentity, ignore_check) - if luaentity.physical_state == false or ignore_check == true then - luaentity.physical_state = true - object:set_properties({ - physical = true - }) - object:set_velocity({x=0,y=0,z=0}) - object:set_acceleration({x=0,y=-9.81,z=0}) - end -end - -local disable_physics = function(object, luaentity, ignore_check, reset_movement) - if luaentity.physical_state == true or ignore_check == true then - luaentity.physical_state = false - object:set_properties({ - physical = false - }) - if reset_movement ~= false then - object:set_velocity({x=0,y=0,z=0}) - object:set_acceleration({x=0,y=0,z=0}) - end - end -end - - --- play sound -local mob_sound = function(self, soundname, is_opinion, fixed_pitch) - - local soundinfo - if self.sounds_child and self.child then - soundinfo = self.sounds_child - elseif self.sounds then - soundinfo = self.sounds - end - if not soundinfo then - return - end - local sound = soundinfo[soundname] - if sound then - if is_opinion and self.opinion_sound_cooloff > 0 then - return - end - local pitch - if not fixed_pitch then - local base_pitch = soundinfo.base_pitch - if not base_pitch then - base_pitch = 1 - end - if self.child and (not self.sounds_child) then - -- Children have higher pitch - pitch = base_pitch * 1.5 - else - pitch = base_pitch - end - -- randomize the pitch a bit - pitch = pitch + math.random(-10, 10) * 0.005 - end - minetest.sound_play(sound, { - object = self.object, - gain = 1.0, - max_hear_distance = self.sounds.distance, - pitch = pitch, - }, true) - self.opinion_sound_cooloff = 1 - end -end - --- Return true if object is in view_range -local function object_in_range(self, object) - if not object then - return false - end - local factor - -- Apply view range reduction for special player armor - if object:is_player() then - local factors = mcl_armor.player_view_range_factors[object] - factor = factors and factors[self.name] - end - -- Distance check - local dist - if factor and factor == 0 then - return false - elseif factor then - dist = self.view_range * factor - else - dist = self.view_range - end - - local p1, p2 = self.object:get_pos(), object:get_pos() - return p1 and p2 and (vector.distance(p1, p2) <= dist) -end - --- attack player/mob -local do_attack = function(self, player) - - if self.state == "attack" or self.state == "die" then - return - end - - self.attack = player - self.state = "attack" - - -- TODO: Implement war_cry sound without being annoying - --if random(0, 100) < 90 then - --mob_sound(self, "war_cry", true) - --end -end - - --- collision function borrowed amended from jordan4ibanez open_ai mod -local collision = function(self) - - local pos = self.object:get_pos() - local vel = self.object:get_velocity() - local x = 0 - local z = 0 - local width = -self.collisionbox[1] + self.collisionbox[4] + 0.5 - - for _,object in pairs(minetest.get_objects_inside_radius(pos, width)) do - - local ent = object:get_luaentity() - if object:is_player() or (ent and ent.is_mob and object ~= self.object) then - - local pos2 = object:get_pos() - local vec = {x = pos.x - pos2.x, z = pos.z - pos2.z} - local force = (width + 0.5) - vector.distance( - {x = pos.x, y = 0, z = pos.z}, - {x = pos2.x, y = 0, z = pos2.z}) - - x = x + (vec.x * force) - z = z + (vec.z * force) - end - end - - return({x,z}) -end - --- move mob in facing direction -local set_velocity = function(self, v) - - local c_x, c_y = 0, 0 - - -- can mob be pushed, if so calculate direction - if self.pushable then - c_x, c_y = unpack(collision(self)) - end - - -- halt mob if it has been ordered to stay - if self.order == "stand" then - self.object:set_velocity({x = 0, y = 0, z = 0}) - return - end - - local yaw = (self.object:get_yaw() or 0) + self.rotate - - self.object:set_velocity({ - x = (sin(yaw) * -v) + c_x, - y = self.object:get_velocity().y, - z = (cos(yaw) * v) + c_y, - }) -end - - - --- calculate mob velocity -local get_velocity = function(self) - - local v = self.object:get_velocity() - if v then - return (v.x * v.x + v.z * v.z) ^ 0.5 - end - - return 0 -end - -local function update_roll(self) - local is_Fleckenstein = self.nametag == "Fleckenstein" - local was_Fleckenstein = false - - local rot = self.object:get_rotation() - rot.z = is_Fleckenstein and pi or 0 - self.object:set_rotation(rot) - - local cbox = table.copy(self.collisionbox) - local acbox = self.object:get_properties().collisionbox - - if math.abs(cbox[2] - acbox[2]) > 0.1 then - was_Fleckenstein = true - end - - if is_Fleckenstein ~= was_Fleckenstein then - local pos = self.object:get_pos() - pos.y = pos.y + (acbox[2] + acbox[5]) - self.object:set_pos(pos) - end - - if is_Fleckenstein then - cbox[2], cbox[5] = -cbox[5], -cbox[2] - end - - self.object:set_properties({collisionbox = cbox}) -end - --- set and return valid yaw -local set_yaw = function(self, yaw, delay, dtime) - - if not yaw or yaw ~= yaw then - yaw = 0 - end - - delay = delay or 0 - - if delay == 0 then - if self.shaking and dtime then - yaw = yaw + (math.random() * 2 - 1) * 5 * dtime - end - self.object:set_yaw(yaw) - update_roll(self) - return yaw - end - - self.target_yaw = yaw - self.delay = delay - - return self.target_yaw -end - --- global function to set mob yaw -function mcl_mobs:yaw(self, yaw, delay, dtime) - set_yaw(self, yaw, delay, dtime) -end - -local add_texture_mod = function(self, mod) - local full_mod = "" - local already_added = false - for i=1, #self.texture_mods do - if mod == self.texture_mods[i] then - already_added = true - end - full_mod = full_mod .. self.texture_mods[i] - end - if not already_added then - full_mod = full_mod .. mod - table.insert(self.texture_mods, mod) - end - self.object:set_texture_mod(full_mod) -end -local remove_texture_mod = function(self, mod) - local full_mod = "" - local remove = {} - for i=1, #self.texture_mods do - if self.texture_mods[i] ~= mod then - full_mod = full_mod .. self.texture_mods[i] - else - table.insert(remove, i) - end - end - for i=#remove, 1 do - table.remove(self.texture_mods, remove[i]) - end - self.object:set_texture_mod(full_mod) -end - --- are we flying in what we are suppose to? (taikedz) -local flight_check = function(self) - - local nod = self.standing_in - local def = minetest.registered_nodes[nod] - - if not def then return false end -- nil check - - local fly_in - if type(self.fly_in) == "string" then - fly_in = { self.fly_in } - elseif type(self.fly_in) == "table" then - fly_in = self.fly_in - else - return false - end - - for _,checknode in pairs(fly_in) do - if nod == checknode then - return true - elseif checknode == "__airlike" or def.walkable == false and - (def.liquidtype == "none" or minetest.get_item_group(nod, "fake_liquid") == 1) then - return true - end - end - - return false -end - --- set defined animation -local set_animation = function(self, anim, fixed_frame) - if not self.animation or not anim then - return - end - if self.state == "die" and anim ~= "die" and anim ~= "stand" then - return - end - - if flight_check(self) and self.fly and anim == "walk" then anim = "fly" end - - self.animation.current = self.animation.current or "" - - if (anim == self.animation.current - or not self.animation[anim .. "_start"] - or not self.animation[anim .. "_end"]) and self.state ~= "die" then - return - end - - self.animation.current = anim - - local a_start = self.animation[anim .. "_start"] - local a_end - if fixed_frame then - a_end = a_start - else - a_end = self.animation[anim .. "_end"] - end - - self.object:set_animation({ - x = a_start, - y = a_end}, - self.animation[anim .. "_speed"] or self.animation.speed_normal or 15, - 0, self.animation[anim .. "_loop"] ~= false) -end - - --- above function exported for mount.lua -function mcl_mobs:set_animation(self, anim) - set_animation(self, anim) -end - --- Returns true is node can deal damage to self -local is_node_dangerous = function(self, nodename) - local nn = nodename - if self.lava_damage > 0 then - if minetest.get_item_group(nn, "lava") ~= 0 then - return true - end - end - if self.fire_damage > 0 then - if minetest.get_item_group(nn, "fire") ~= 0 then - return true - end - end - if minetest.registered_nodes[nn] and minetest.registered_nodes[nn].damage_per_second and minetest.registered_nodes[nn].damage_per_second > 0 then - return true - end - return false -end - - --- Returns true if node is a water hazard -local is_node_waterhazard = function(self, nodename) - local nn = nodename - if self.water_damage > 0 then - if minetest.get_item_group(nn, "water") ~= 0 then - return true - end - end - if minetest.registered_nodes[nn] and minetest.registered_nodes[nn].drowning and minetest.registered_nodes[nn].drowning > 0 then - if self.breath_max ~= -1 then - -- check if the mob is water-breathing _and_ the block is water; only return true if neither is the case - -- this will prevent water-breathing mobs to classify water or e.g. sand below them as dangerous - if not self.breathes_in_water and minetest.get_item_group(nn, "water") ~= 0 then - return true - end - end - end - return false -end - - --- check line of sight (BrunoMine) -local line_of_sight = function(self, pos1, pos2, stepsize) - - stepsize = stepsize or 1 - - local s, pos = minetest.line_of_sight(pos1, pos2, stepsize) - - -- normal walking and flying mobs can see you through air - if s == true then - return true - end - - -- New pos1 to be analyzed - local npos1 = {x = pos1.x, y = pos1.y, z = pos1.z} - - local r, pos = minetest.line_of_sight(npos1, pos2, stepsize) - - -- Checks the return - if r == true then return true end - - -- Nodename found - local nn = minetest.get_node(pos).name - - -- Target Distance (td) to travel - local td = vector.distance(pos1, pos2) - - -- Actual Distance (ad) traveled - local ad = 0 - - -- It continues to advance in the line of sight in search of a real - -- obstruction which counts as 'normal' nodebox. - while minetest.registered_nodes[nn] - and minetest.registered_nodes[nn].walkable == false do - - -- Check if you can still move forward - if td < ad + stepsize then - return true -- Reached the target - end - - -- Moves the analyzed pos - local d = vector.distance(pos1, pos2) - - npos1.x = ((pos2.x - pos1.x) / d * stepsize) + pos1.x - npos1.y = ((pos2.y - pos1.y) / d * stepsize) + pos1.y - npos1.z = ((pos2.z - pos1.z) / d * stepsize) + pos1.z - - -- NaN checks - if d == 0 - or npos1.x ~= npos1.x - or npos1.y ~= npos1.y - or npos1.z ~= npos1.z then - return false - end - - ad = ad + stepsize - - -- scan again - r, pos = minetest.line_of_sight(npos1, pos2, stepsize) - - if r == true then return true end - - -- New Nodename found - nn = minetest.get_node(pos).name - - end - - return false -end - --- custom particle effects -local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow, go_down) - - radius = radius or 2 - min_size = min_size or 0.5 - max_size = max_size or 1 - gravity = gravity or -10 - glow = glow or 0 - go_down = go_down or false - - local ym - if go_down then - ym = 0 - else - ym = -radius - end - - minetest.add_particlespawner({ - amount = amount, - time = 0.25, - minpos = pos, - maxpos = pos, - minvel = {x = -radius, y = ym, z = -radius}, - maxvel = {x = radius, y = radius, z = radius}, - minacc = {x = 0, y = gravity, z = 0}, - maxacc = {x = 0, y = gravity, z = 0}, - minexptime = 0.1, - maxexptime = 1, - minsize = min_size, - maxsize = max_size, - texture = texture, - glow = glow, - }) -end - -local damage_effect = function(self, damage) - -- damage particles - if (not disable_blood) and damage > 0 then - - local amount_large = math.floor(damage / 2) - local amount_small = damage % 2 - - local pos = self.object:get_pos() - - pos.y = pos.y + (self.collisionbox[5] - self.collisionbox[2]) * .5 - - local texture = "mobs_blood.png" - -- full heart damage (one particle for each 2 HP damage) - if amount_large > 0 then - effect(pos, amount_large, texture, 2, 2, 1.75, 0, nil, true) - end - -- half heart damage (one additional particle if damage is an odd number) - if amount_small > 0 then - -- TODO: Use "half heart" - effect(pos, amount_small, texture, 1, 1, 1.75, 0, nil, true) - end - end -end - -mcl_mobs.death_effect = function(pos, yaw, collisionbox, rotate) - local min, max - if collisionbox then - min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} - max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} - else - min = { x = -0.5, y = 0, z = -0.5 } - max = { x = 0.5, y = 0.5, z = 0.5 } - end - if rotate then - min = vector.rotate(min, {x=0, y=yaw, z=pi/2}) - max = vector.rotate(max, {x=0, y=yaw, z=pi/2}) - min, max = vector.sort(min, max) - min = vector.multiply(min, 0.5) - max = vector.multiply(max, 0.5) - end - - minetest.add_particlespawner({ - amount = 50, - time = 0.001, - minpos = vector.add(pos, min), - maxpos = vector.add(pos, max), - minvel = vector.new(-5,-5,-5), - maxvel = vector.new(5,5,5), - minexptime = 1.1, - maxexptime = 1.5, - minsize = 1, - maxsize = 2, - collisiondetection = false, - vertical = false, - texture = "mcl_particles_mob_death.png^[colorize:#000000:255", - }) - - minetest.sound_play("mcl_mobs_mob_poof", { - pos = pos, - gain = 1.0, - max_hear_distance = 8, - }, true) -end - -local update_tag = function(self) - local tag - if mobs_debug then - tag = "nametag = '"..tostring(self.nametag).."'\n".. - "state = '"..tostring(self.state).."'\n".. - "order = '"..tostring(self.order).."'\n".. - "attack = "..tostring(self.attack).."\n".. - "health = "..tostring(self.health).."\n".. - "breath = "..tostring(self.breath).."\n".. - "gotten = "..tostring(self.gotten).."\n".. - "tamed = "..tostring(self.tamed).."\n".. - "horny = "..tostring(self.horny).."\n".. - "hornytimer = "..tostring(self.hornytimer).."\n".. - "runaway_timer = "..tostring(self.runaway_timer).."\n".. - "following = "..tostring(self.following) - else - tag = self.nametag - end - self.object:set_properties({ - nametag = tag, - }) - - update_roll(self) -end - --- drop items -local item_drop = function(self, cooked, looting_level) - - -- no drops if disabled by setting - if not mobs_drop_items then return end - - looting_level = looting_level or 0 - - -- no drops for child mobs (except monster) - if (self.child and self.type ~= "monster") then - return - end - - local obj, item, num - local pos = self.object:get_pos() - - self.drops = self.drops or {} -- nil check - - for n = 1, #self.drops do - local dropdef = self.drops[n] - local chance = 1 / dropdef.chance - local looting_type = dropdef.looting - - if looting_level > 0 then - local chance_function = dropdef.looting_chance_function - if chance_function then - chance = chance_function(looting_level) - elseif looting_type == "rare" then - chance = chance + (dropdef.looting_factor or 0.01) * looting_level - end - end - - local num = 0 - local do_common_looting = (looting_level > 0 and looting_type == "common") - if random() < chance then - num = random(dropdef.min or 1, dropdef.max or 1) - elseif not dropdef.looting_ignore_chance then - do_common_looting = false - end - - if do_common_looting then - num = num + math.floor(math.random(0, looting_level) + 0.5) - end - - if num > 0 then - item = dropdef.name - - -- cook items when true - if cooked then - - local output = minetest.get_craft_result({ - method = "cooking", width = 1, items = {item}}) - - if output and output.item and not output.item:is_empty() then - item = output.item:get_name() - end - end - - -- add item if it exists - for x = 1, num do - obj = minetest.add_item(pos, ItemStack(item .. " " .. 1)) - end - - if obj and obj:get_luaentity() then - - obj:set_velocity({ - x = random(-10, 10) / 9, - y = 6, - z = random(-10, 10) / 9, - }) - elseif obj then - obj:remove() -- item does not exist - end - end - end - - self.drops = {} -end - - --- check if mob is dead or only hurt -local check_for_death = function(self, cause, cmi_cause) - - if self.state == "die" then - return true - end - - -- has health actually changed? - if self.health == self.old_health and self.health > 0 then - return false - end - - local damaged = self.health < self.old_health - self.old_health = self.health - - -- still got some health? - if self.health > 0 then - - -- make sure health isn't higher than max - if self.health > self.hp_max then - self.health = self.hp_max - end - - -- play damage sound if health was reduced and make mob flash red. - if damaged then - add_texture_mod(self, "^[colorize:red:130") - minetest.after(.2, function(self) - if self and self.object then - remove_texture_mod(self, "^[colorize:red:130") - end - end, self) - mob_sound(self, "damage") - end - - -- backup nametag so we can show health stats - if not self.nametag2 then - self.nametag2 = self.nametag or "" - end - - if show_health - and (cmi_cause and cmi_cause.type == "punch") then - - self.htimer = 2 - self.nametag = "♥ " .. self.health .. " / " .. self.hp_max - - update_tag(self) - end - - return false - end - - mob_sound(self, "death") - - local function death_handle(self) - -- dropped cooked item if mob died in fire or lava - if cause == "lava" or cause == "fire" then - item_drop(self, true, 0) - else - local wielditem = ItemStack() - if cause == "hit" then - local puncher = cmi_cause.puncher - if puncher then - wielditem = puncher:get_wielded_item() - end - end - local cooked = mcl_burning.is_burning(self.object) or mcl_enchanting.has_enchantment(wielditem, "fire_aspect") - local looting = mcl_enchanting.get_enchantment(wielditem, "looting") - item_drop(self, cooked, looting) - - if ((not self.child) or self.type ~= "animal") and (minetest.get_us_time() - self.xp_timestamp <= 5000000) then - mcl_experience.throw_xp(self.object:get_pos(), math.random(self.xp_min, self.xp_max)) - end - end - end - - -- execute custom death function - if self.on_die then - - local pos = self.object:get_pos() - local on_die_exit = self.on_die(self, pos, cmi_cause) - if on_die_exit ~= true then - death_handle(self) - end - - if on_die_exit == true then - self.state = "die" - mcl_burning.extinguish(self.object) - self.object:remove() - return true - end - end - - local collisionbox - if self.collisionbox then - collisionbox = table.copy(self.collisionbox) - end - - self.state = "die" - self.attack = nil - self.v_start = false - self.fall_speed = DEFAULT_FALL_SPEED - self.timer = 0 - self.blinktimer = 0 - remove_texture_mod(self, "^[colorize:#FF000040") - remove_texture_mod(self, "^[brighten") - self.passive = true - - self.object:set_properties({ - pointable = false, - collide_with_objects = false, - }) - - set_velocity(self, 0) - local acc = self.object:get_acceleration() - acc.x, acc.y, acc.z = 0, DEFAULT_FALL_SPEED, 0 - self.object:set_acceleration(acc) - - local length - -- default death function and die animation (if defined) - if self.instant_death then - length = 0 - elseif self.animation - and self.animation.die_start - and self.animation.die_end then - - local frames = self.animation.die_end - self.animation.die_start - local speed = self.animation.die_speed or 15 - length = max(frames / speed, 0) + DEATH_DELAY - set_animation(self, "die") - else - local rot = self.object:get_rotation() - rot.z = pi/2 - self.object:set_rotation(rot) - length = 1 + DEATH_DELAY - set_animation(self, "stand", true) - end - - - -- Remove body after a few seconds and drop stuff - local kill = function(self) - if not self.object:get_luaentity() then - return - end - - death_handle(self) - local dpos = self.object:get_pos() - local cbox = self.collisionbox - local yaw = self.object:get_rotation().y - mcl_burning.extinguish(self.object) - self.object:remove() - mcl_mobs.death_effect(dpos, yaw, cbox, not self.instant_death) - end - if length <= 0 then - kill(self) - else - minetest.after(length, kill, self) - end - - return true -end - - --- check if within physical map limits (-30911 to 30927) -local within_limits, wmin, wmax = nil, -30913, 30928 -within_limits = function(pos, radius) - if mcl_vars then - if mcl_vars.mapgen_edge_min and mcl_vars.mapgen_edge_max then - wmin, wmax = mcl_vars.mapgen_edge_min, mcl_vars.mapgen_edge_max - within_limits = function(pos, radius) - return pos - and (pos.x - radius) > wmin and (pos.x + radius) < wmax - and (pos.y - radius) > wmin and (pos.y + radius) < wmax - and (pos.z - radius) > wmin and (pos.z + radius) < wmax - end - end - end - return pos - and (pos.x - radius) > wmin and (pos.x + radius) < wmax - and (pos.y - radius) > wmin and (pos.y + radius) < wmax - and (pos.z - radius) > wmin and (pos.z + radius) < wmax -end - - --- is mob facing a cliff or danger -local is_at_cliff_or_danger = function(self) - - if self.fear_height == 0 then -- 0 for no falling protection! - return false - end - - if not self.object:get_luaentity() then - return false - end - local yaw = self.object:get_yaw() - local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) - local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) - local pos = self.object:get_pos() - local ypos = pos.y + self.collisionbox[2] -- just above floor - - local free_fall, blocker = minetest.line_of_sight( - {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, - {x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z}) - if free_fall then - return true - else - local bnode = minetest.get_node(blocker) - local danger = is_node_dangerous(self, bnode.name) - if danger then - return true - else - local def = minetest.registered_nodes[bnode.name] - if def and def.walkable then - return false - end - end - end - - return false -end - - --- copy the 'mob facing cliff_or_danger check' from above, and rework to avoid water -local is_at_water_danger = function(self) - - - if not self.object:get_luaentity() then - return false - end - local yaw = self.object:get_yaw() - local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) - local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) - local pos = self.object:get_pos() - local ypos = pos.y + self.collisionbox[2] -- just above floor - - local free_fall, blocker = minetest.line_of_sight( - {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, - {x = pos.x + dir_x, y = ypos - 3, z = pos.z + dir_z}) - if free_fall then - return true - else - local bnode = minetest.get_node(blocker) - local waterdanger = is_node_waterhazard(self, bnode.name) - if - waterdanger and (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) then - return false - elseif waterdanger and (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) == false then - return true - else - local def = minetest.registered_nodes[bnode.name] - if def and def.walkable then - return false - end - end - end - - return false -end - - --- get node but use fallback for nil or unknown -local node_ok = function(pos, fallback) - - fallback = fallback or mcl_mobs.fallback_node - - local node = minetest.get_node_or_nil(pos) - - if node and minetest.registered_nodes[node.name] then - return node - end - - return minetest.registered_nodes[fallback] -end - -local function get_light(pos, tod) - if minetest.get_node_or_nil(pos) then - local lightfunc = minetest.get_natural_light or minetest.get_node_light - return lightfunc(pos, tod) - else - return 0 - end -end - --- environmental damage (water, lava, fire, light etc.) -local do_env_damage = function(self) - - -- feed/tame text timer (so mob 'full' messages dont spam chat) - if self.htimer > 0 then - self.htimer = self.htimer - 1 - end - - -- reset nametag after showing health stats - if self.htimer < 1 and self.nametag2 then - - self.nametag = self.nametag2 - self.nametag2 = nil - - update_tag(self) - end - - local pos = self.object:get_pos() - - self.time_of_day = minetest.get_timeofday() - - -- remove mob if beyond map limits - if not within_limits(pos, 0) then - mcl_burning.extinguish(self.object) - self.object:remove() - return true - end - - - -- Deal light damage to mob, returns true if mob died - local deal_light_damage = function(self, pos, damage) - if not ((mcl_weather.rain.raining or mcl_weather.state == "snow") and mcl_weather.is_outdoor(pos)) then - self.health = self.health - damage - - effect(pos, 5, "mcl_particles_smoke.png") - - if check_for_death(self, "light", {type = "light"}) then - return true - end - end - end - - -- Use get_node_light for Minetest version 5.3 where get_natural_light - -- does not exist yet. - local sunlight = get_light(pos, self.time_of_day) - - -- bright light harms mob - if self.light_damage ~= 0 and (sunlight or 0) > 12 then - if deal_light_damage(self, pos, self.light_damage) then - return true - end - end - local _, dim = mcl_worlds.y_to_layer(pos.y) - if (self.sunlight_damage ~= 0 or self.ignited_by_sunlight) and (sunlight or 0) >= minetest.LIGHT_MAX and dim == "overworld" then - if self.ignited_by_sunlight then - mcl_burning.set_on_fire(self.object, 10) - else - deal_light_damage(self, pos, self.sunlight_damage) - return true - end - end - - local y_level = self.collisionbox[2] - - if self.child then - y_level = self.collisionbox[2] * 0.5 - end - - -- what is mob standing in? - pos.y = pos.y + y_level + 0.25 -- foot level - local pos2 = {x=pos.x, y=pos.y-1, z=pos.z} - self.standing_in = node_ok(pos, "air").name - self.standing_on = node_ok(pos2, "air").name - - -- don't fall when on ignore, just stand still - if self.standing_in == "ignore" then - self.object:set_velocity({x = 0, y = 0, z = 0}) - end - - local nodef = minetest.registered_nodes[self.standing_in] - - -- rain - if self.rain_damage > 0 then - if mcl_weather.rain.raining and mcl_weather.is_outdoor(pos) then - - self.health = self.health - self.rain_damage - - if check_for_death(self, "rain", {type = "environment", - pos = pos, node = self.standing_in}) then - return true - end - end - end - - pos.y = pos.y + 1 -- for particle effect position - - -- water damage - if self.water_damage > 0 - and nodef.groups.water then - - if self.water_damage ~= 0 then - - self.health = self.health - self.water_damage - - effect(pos, 5, "mcl_particles_smoke.png", nil, nil, 1, nil) - - if check_for_death(self, "water", {type = "environment", - pos = pos, node = self.standing_in}) then - return true - end - end - - -- lava damage - elseif self.lava_damage > 0 - and (nodef.groups.lava) then - - if self.lava_damage ~= 0 then - - self.health = self.health - self.lava_damage - - effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) - - if check_for_death(self, "lava", {type = "environment", - pos = pos, node = self.standing_in}) then - return true - end - end - - -- fire damage - elseif self.fire_damage > 0 - and (nodef.groups.fire) then - - if self.fire_damage ~= 0 then - - self.health = self.health - self.fire_damage - - effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) - - if check_for_death(self, "fire", {type = "environment", - pos = pos, node = self.standing_in}) then - return true - end - end - - -- damage_per_second node check - elseif nodef.damage_per_second ~= 0 and not nodef.groups.lava and not nodef.groups.fire then - - self.health = self.health - nodef.damage_per_second - - effect(pos, 5, "mcl_particles_smoke.png") - - if check_for_death(self, "dps", {type = "environment", - pos = pos, node = self.standing_in}) then - return true - end - end - - -- Drowning damage - if self.breath_max ~= -1 then - local drowning = false - if self.breathes_in_water then - if minetest.get_item_group(self.standing_in, "water") == 0 then - drowning = true - end - elseif nodef.drowning > 0 then - drowning = true - end - if drowning then - - self.breath = math.max(0, self.breath - 1) - - effect(pos, 2, "bubble.png", nil, nil, 1, nil) - if self.breath <= 0 then - local dmg - if nodef.drowning > 0 then - dmg = nodef.drowning - else - dmg = 4 - end - damage_effect(self, dmg) - self.health = self.health - dmg - end - if check_for_death(self, "drowning", {type = "environment", - pos = pos, node = self.standing_in}) then - return true - end - else - self.breath = math.min(self.breath_max, self.breath + 1) - end - end - - --- suffocation inside solid node - -- FIXME: Redundant with mcl_playerplus - if (self.suffocation == true) - and (nodef.walkable == nil or nodef.walkable == true) - and (nodef.collision_box == nil or nodef.collision_box.type == "regular") - and (nodef.node_box == nil or nodef.node_box.type == "regular") - and (nodef.groups.disable_suffocation ~= 1) - and (nodef.groups.opaque == 1) then - - -- Short grace period before starting to take suffocation damage. - -- This is different from players, who take damage instantly. - -- This has been done because mobs might briefly be inside solid nodes - -- when e.g. climbing up stairs. - -- This is a bit hacky because it assumes that do_env_damage - -- is called roughly every second only. - self.suffocation_timer = self.suffocation_timer + 1 - if self.suffocation_timer >= 3 then - -- 2 damage per second - -- TODO: Deal this damage once every 1/2 second - self.health = self.health - 2 - - if check_for_death(self, "suffocation", {type = "environment", - pos = pos, node = self.standing_in}) then - return true - end - end - else - self.suffocation_timer = 0 - end - - return check_for_death(self, "", {type = "unknown"}) -end - - --- jump if facing a solid node (not fences or gates) -local do_jump = function(self) - - if not self.jump - or self.jump_height == 0 - or self.fly - or (self.child and self.type ~= "monster") - or self.order == "stand" then - return false - end - - self.facing_fence = false - - -- something stopping us while moving? - if self.state ~= "stand" - and get_velocity(self) > 0.5 - and self.object:get_velocity().y ~= 0 then - return false - end - - local pos = self.object:get_pos() - local yaw = self.object:get_yaw() - - -- what is mob standing on? - pos.y = pos.y + self.collisionbox[2] - 0.2 - - local nod = node_ok(pos) - - if minetest.registered_nodes[nod.name].walkable == false then - return false - end - - -- where is front - local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) - local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) - - -- what is in front of mob? - nod = node_ok({ - x = pos.x + dir_x, - y = pos.y + 0.5, - z = pos.z + dir_z - }) - - -- this is used to detect if there's a block on top of the block in front of the mob. - -- If there is, there is no point in jumping as we won't manage. - local nodTop = node_ok({ - x = pos.x + dir_x, - y = pos.y + 1.5, - z = pos.z + dir_z - }, "air") - - -- we don't attempt to jump if there's a stack of blocks blocking - if minetest.registered_nodes[nodTop.name].walkable == true then - return false - end - - -- thin blocks that do not need to be jumped - if nod.name == node_snow then - return false - end - - local ndef = minetest.registered_nodes[nod.name] - if self.walk_chance == 0 or ndef and ndef.walkable then - - if minetest.get_item_group(nod.name, "fence") == 0 - and minetest.get_item_group(nod.name, "fence_gate") == 0 - and minetest.get_item_group(nod.name, "wall") == 0 then - - local v = self.object:get_velocity() - - v.y = self.jump_height - - set_animation(self, "jump") -- only when defined - - self.object:set_velocity(v) - - -- when in air move forward - minetest.after(0.3, function(self, v) - if (not self.object) or (not self.object:get_luaentity()) or (self.state == "die") then - return - end - self.object:set_acceleration({ - x = v.x * 2, - y = -10, - z = v.z * 2, - }) - end, self, v) - - if self.jump_sound_cooloff <= 0 then - mob_sound(self, "jump") - self.jump_sound_cooloff = 0.5 - end - else - self.facing_fence = true - end - - -- if we jumped against a block/wall 4 times then turn - if self.object:get_velocity().x ~= 0 - and self.object:get_velocity().z ~= 0 then - - self.jump_count = (self.jump_count or 0) + 1 - - if self.jump_count == 4 then - - local yaw = self.object:get_yaw() or 0 - - yaw = set_yaw(self, yaw + 1.35, 8) - - self.jump_count = 0 - end - end - - return true - end - - return false -end - - --- blast damage to entities nearby -local entity_physics = function(pos, radius) - - radius = radius * 2 - - local objs = minetest.get_objects_inside_radius(pos, radius) - local obj_pos, dist - - for n = 1, #objs do - - obj_pos = objs[n]:get_pos() - - dist = vector.distance(pos, obj_pos) - if dist < 1 then dist = 1 end - - local damage = floor((4 / dist) * radius) - local ent = objs[n]:get_luaentity() - - -- punches work on entities AND players - objs[n]:punch(objs[n], 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = damage}, - }, pos) - end -end - - --- should mob follow what I'm holding ? -local follow_holding = function(self, clicker) - if self.nofollow then return false end - - if mcl_mobs.invis[clicker:get_player_name()] then - return false - end - - local item = clicker:get_wielded_item() - local t = type(self.follow) - - -- single item - if t == "string" - and item:get_name() == self.follow then - return true - - -- multiple items - elseif t == "table" then - - for no = 1, #self.follow do - - if self.follow[no] == item:get_name() then - return true - end - end - end - - return false -end - - --- find two animals of same type and breed if nearby and horny -local breed = function(self) - - -- child takes a long time before growing into adult - if self.child == true then - - -- When a child, hornytimer is used to count age until adulthood - self.hornytimer = self.hornytimer + 1 - - if self.hornytimer >= CHILD_GROW_TIME then - - self.child = false - self.hornytimer = 0 - - self.object:set_properties({ - textures = self.base_texture, - mesh = self.base_mesh, - visual_size = self.base_size, - collisionbox = self.base_colbox, - selectionbox = self.base_selbox, - }) - - -- custom function when child grows up - if self.on_grown then - self.on_grown(self) - else - -- jump when fully grown so as not to fall into ground - self.object:set_velocity({ - x = 0, - y = self.jump_height, - z = 0 - }) - end - end - - return - end - - -- horny animal can mate for HORNY_TIME seconds, - -- afterwards horny animal cannot mate again for HORNY_AGAIN_TIME seconds - if self.horny == true - and self.hornytimer < HORNY_TIME + HORNY_AGAIN_TIME then - - self.hornytimer = self.hornytimer + 1 - - if self.hornytimer >= HORNY_TIME + HORNY_AGAIN_TIME then - self.hornytimer = 0 - self.horny = false - end - end - - -- find another same animal who is also horny and mate if nearby - if self.horny == true - and self.hornytimer <= HORNY_TIME then - - local pos = self.object:get_pos() - - effect({x = pos.x, y = pos.y + 1, z = pos.z}, 8, "heart.png", 3, 4, 1, 0.1) - - local objs = minetest.get_objects_inside_radius(pos, 3) - local num = 0 - local ent = nil - - for n = 1, #objs do - - ent = objs[n]:get_luaentity() - - -- check for same animal with different colour - local canmate = false - - if ent then - - if ent.name == self.name then - canmate = true - else - local entname = string.split(ent.name,":") - local selfname = string.split(self.name,":") - - if entname[1] == selfname[1] then - entname = string.split(entname[2],"_") - selfname = string.split(selfname[2],"_") - - if entname[1] == selfname[1] then - canmate = true - end - end - end - end - - if ent - and canmate == true - and ent.horny == true - and ent.hornytimer <= HORNY_TIME then - num = num + 1 - end - - -- found your mate? then have a baby - if num > 1 then - - self.hornytimer = HORNY_TIME + 1 - ent.hornytimer = HORNY_TIME + 1 - - -- spawn baby - minetest.after(5, function(parent1, parent2, pos) - if not parent1.object:get_luaentity() then - return - end - if not parent2.object:get_luaentity() then - return - end - - mcl_experience.throw_xp(pos, math.random(1, 7)) - - -- custom breed function - if parent1.on_breed then - -- when false, skip going any further - if parent1.on_breed(parent1, parent2) == false then - return - end - end - - local child = mcl_mobs:spawn_child(pos, parent1.name) - - local ent_c = child:get_luaentity() - - - -- Use texture of one of the parents - local p = math.random(1, 2) - if p == 1 then - ent_c.base_texture = parent1.base_texture - else - ent_c.base_texture = parent2.base_texture - end - child:set_properties({ - textures = ent_c.base_texture - }) - - -- tamed and owned by parents' owner - ent_c.tamed = true - ent_c.owner = parent1.owner - end, self, ent, pos) - - num = 0 - - break - end - end - end -end - - --- find and replace what mob is looking for (grass, wheat etc.) -local replace = function(self, pos) - - if not self.replace_rate - or not self.replace_what - or self.child == true - or self.object:get_velocity().y ~= 0 - or random(1, self.replace_rate) > 1 then - return - end - - local what, with, y_offset - - if type(self.replace_what[1]) == "table" then - - local num = random(#self.replace_what) - - what = self.replace_what[num][1] or "" - with = self.replace_what[num][2] or "" - y_offset = self.replace_what[num][3] or 0 - else - what = self.replace_what - with = self.replace_with or "" - y_offset = self.replace_offset or 0 - end - - pos.y = pos.y + y_offset - - local node = minetest.get_node(pos) - if node.name == what then - - local oldnode = {name = what, param2 = node.param2} - local newnode = {name = with, param2 = node.param2} - local on_replace_return - - if self.on_replace then - on_replace_return = self.on_replace(self, pos, oldnode, newnode) - end - - if on_replace_return ~= false then - - if mobs_griefing then - minetest.set_node(pos, newnode) - end - - end - end -end - - --- check if daytime and also if mob is docile during daylight hours -local day_docile = function(self) - - if self.docile_by_day == false then - - return false - - elseif self.docile_by_day == true - and self.time_of_day > 0.2 - and self.time_of_day < 0.8 then - - return true - end -end - - -local los_switcher = false -local height_switcher = false - --- path finding and smart mob routine by rnd, line_of_sight and other edits by Elkien3 -local smart_mobs = function(self, s, p, dist, dtime) - - local s1 = self.path.lastpos - - local target_pos = self.attack:get_pos() - - -- is it becoming stuck? - if abs(s1.x - s.x) + abs(s1.z - s.z) < .5 then - self.path.stuck_timer = self.path.stuck_timer + dtime - else - self.path.stuck_timer = 0 - end - - self.path.lastpos = {x = s.x, y = s.y, z = s.z} - - local use_pathfind = false - local has_lineofsight = minetest.line_of_sight( - {x = s.x, y = (s.y) + .5, z = s.z}, - {x = target_pos.x, y = (target_pos.y) + 1.5, z = target_pos.z}, .2) - - -- im stuck, search for path - if not has_lineofsight then - - if los_switcher == true then - use_pathfind = true - los_switcher = false - end -- cannot see target! - else - if los_switcher == false then - - los_switcher = true - use_pathfind = false - - minetest.after(1, function(self) - if not self.object:get_luaentity() then - return - end - if has_lineofsight then self.path.following = false end - end, self) - end -- can see target! - end - - if (self.path.stuck_timer > stuck_timeout and not self.path.following) then - - use_pathfind = true - self.path.stuck_timer = 0 - - minetest.after(1, function(self) - if not self.object:get_luaentity() then - return - end - if has_lineofsight then self.path.following = false end - end, self) - end - - if (self.path.stuck_timer > stuck_path_timeout and self.path.following) then - - use_pathfind = true - self.path.stuck_timer = 0 - - minetest.after(1, function(self) - if not self.object:get_luaentity() then - return - end - if has_lineofsight then self.path.following = false end - end, self) - end - - if math.abs(vector.subtract(s,target_pos).y) > self.stepheight then - - if height_switcher then - use_pathfind = true - height_switcher = false - end - else - if not height_switcher then - use_pathfind = false - height_switcher = true - end - end - - if use_pathfind then - -- lets try find a path, first take care of positions - -- since pathfinder is very sensitive - local sheight = self.collisionbox[5] - self.collisionbox[2] - - -- round position to center of node to avoid stuck in walls - -- also adjust height for player models! - s.x = floor(s.x + 0.5) - s.z = floor(s.z + 0.5) - - local ssight, sground = minetest.line_of_sight(s, { - x = s.x, y = s.y - 4, z = s.z}, 1) - - -- determine node above ground - if not ssight then - s.y = sground.y + 1 - end - - local p1 = self.attack:get_pos() - - p1.x = floor(p1.x + 0.5) - p1.y = floor(p1.y + 0.5) - p1.z = floor(p1.z + 0.5) - - local dropheight = 12 - if self.fear_height ~= 0 then dropheight = self.fear_height end - local jumpheight = 0 - if self.jump and self.jump_height >= 4 then - jumpheight = math.min(math.ceil(self.jump_height / 4), 4) - elseif self.stepheight > 0.5 then - jumpheight = 1 - end - self.path.way = minetest.find_path(s, p1, 16, jumpheight, dropheight, "A*_noprefetch") - - self.state = "" - do_attack(self, self.attack) - - -- no path found, try something else - if not self.path.way then - - self.path.following = false - - -- lets make way by digging/building if not accessible - if self.pathfinding == 2 and mobs_griefing then - - -- is player higher than mob? - if s.y < p1.y then - - -- build upwards - if not minetest.is_protected(s, "") then - - local ndef1 = minetest.registered_nodes[self.standing_in] - - if ndef1 and (ndef1.buildable_to or ndef1.groups.liquid) then - - minetest.set_node(s, {name = mcl_mobs.fallback_node}) - end - end - - local sheight = math.ceil(self.collisionbox[5]) + 1 - - -- assume mob is 2 blocks high so it digs above its head - s.y = s.y + sheight - - -- remove one block above to make room to jump - if not minetest.is_protected(s, "") then - - local node1 = node_ok(s, "air").name - local ndef1 = minetest.registered_nodes[node1] - - if node1 ~= "air" - and node1 ~= "ignore" - and ndef1 - and not ndef1.groups.level - and not ndef1.groups.unbreakable - and not ndef1.groups.liquid then - - minetest.set_node(s, {name = "air"}) - minetest.add_item(s, ItemStack(node1)) - - end - end - - s.y = s.y - sheight - self.object:set_pos({x = s.x, y = s.y + 2, z = s.z}) - - else -- dig 2 blocks to make door toward player direction - - local yaw1 = self.object:get_yaw() + pi / 2 - local p1 = { - x = s.x + cos(yaw1), - y = s.y, - z = s.z + sin(yaw1) - } - - if not minetest.is_protected(p1, "") then - - local node1 = node_ok(p1, "air").name - local ndef1 = minetest.registered_nodes[node1] - - if node1 ~= "air" - and node1 ~= "ignore" - and ndef1 - and not ndef1.groups.level - and not ndef1.groups.unbreakable - and not ndef1.groups.liquid then - - minetest.add_item(p1, ItemStack(node1)) - minetest.set_node(p1, {name = "air"}) - end - - p1.y = p1.y + 1 - node1 = node_ok(p1, "air").name - ndef1 = minetest.registered_nodes[node1] - - if node1 ~= "air" - and node1 ~= "ignore" - and ndef1 - and not ndef1.groups.level - and not ndef1.groups.unbreakable - and not ndef1.groups.liquid then - - minetest.add_item(p1, ItemStack(node1)) - minetest.set_node(p1, {name = "air"}) - end - - end - end - end - - -- will try again in 2 seconds - self.path.stuck_timer = stuck_timeout - 2 - elseif s.y < p1.y and (not self.fly) then - do_jump(self) --add jump to pathfinding - self.path.following = true - -- Yay, I found path! - -- TODO: Implement war_cry sound without being annoying - --mob_sound(self, "war_cry", true) - else - set_velocity(self, self.walk_velocity) - - -- follow path now that it has it - self.path.following = true - end - end -end - - --- specific attacks -local specific_attack = function(list, what) - - -- no list so attack default (player, animals etc.) - if list == nil then - return true - end - - -- found entity on list to attack? - for no = 1, #list do - - if list[no] == what then - return true - end - end - - return false -end - --- monster find someone to attack -local monster_attack = function(self) - - if self.type ~= "monster" - or not damage_enabled - or minetest.is_creative_enabled("") - or self.passive - or self.state == "attack" - or day_docile(self) then - return - end - - local s = self.object:get_pos() - local p, sp, dist - local player, obj, min_player - local type, name = "", "" - local min_dist = self.view_range + 1 - local objs = minetest.get_objects_inside_radius(s, self.view_range) - - for n = 1, #objs do - - if objs[n]:is_player() then - - if mcl_mobs.invis[ objs[n]:get_player_name() ] or (not object_in_range(self, objs[n])) then - type = "" - else - player = objs[n] - type = "player" - name = "player" - end - else - obj = objs[n]:get_luaentity() - - if obj then - player = obj.object - type = obj.type - name = obj.name or "" - end - end - - -- find specific mob to attack, failing that attack player/npc/animal - if specific_attack(self.specific_attack, name) - and (type == "player" or type == "npc" - or (type == "animal" and self.attack_animals == true)) then - - p = player:get_pos() - sp = s - - dist = vector.distance(p, s) - - -- aim higher to make looking up hills more realistic - p.y = p.y + 1 - sp.y = sp.y + 1 - - - -- choose closest player to attack - if dist < min_dist - and line_of_sight(self, sp, p, 2) == true then - min_dist = dist - min_player = player - end - end - end - - -- attack player - if min_player then - do_attack(self, min_player) - end -end - - --- npc, find closest monster to attack -local npc_attack = function(self) - - if self.type ~= "npc" - or not self.attacks_monsters - or self.state == "attack" then - return - end - - local p, sp, obj, min_player - local s = self.object:get_pos() - local min_dist = self.view_range + 1 - local objs = minetest.get_objects_inside_radius(s, self.view_range) - - for n = 1, #objs do - - obj = objs[n]:get_luaentity() - - if obj and obj.type == "monster" then - - p = obj.object:get_pos() - sp = s - - local dist = vector.distance(p, s) - - -- aim higher to make looking up hills more realistic - p.y = p.y + 1 - sp.y = sp.y + 1 - - if dist < min_dist - and line_of_sight(self, sp, p, 2) == true then - min_dist = dist - min_player = obj.object - end - end - end - - if min_player then - do_attack(self, min_player) - end -end - - --- specific runaway -local specific_runaway = function(list, what) - - -- no list so do not run - if list == nil then - return false - end - - -- found entity on list to attack? - for no = 1, #list do - - if list[no] == what then - return true - end - end - - return false -end - - --- find someone to runaway from -local runaway_from = function(self) - - if not self.runaway_from and self.state ~= "flop" then - return - end - - local s = self.object:get_pos() - local p, sp, dist - local player, obj, min_player - local type, name = "", "" - local min_dist = self.view_range + 1 - local objs = minetest.get_objects_inside_radius(s, self.view_range) - - for n = 1, #objs do - - if objs[n]:is_player() then - - if mcl_mobs.invis[ objs[n]:get_player_name() ] - or self.owner == objs[n]:get_player_name() - or (not object_in_range(self, objs[n])) then - type = "" - else - player = objs[n] - type = "player" - name = "player" - end - else - obj = objs[n]:get_luaentity() - - if obj then - player = obj.object - type = obj.type - name = obj.name or "" - end - end - - -- find specific mob to runaway from - if name ~= "" and name ~= self.name - and specific_runaway(self.runaway_from, name) then - - p = player:get_pos() - sp = s - - -- aim higher to make looking up hills more realistic - p.y = p.y + 1 - sp.y = sp.y + 1 - - dist = vector.distance(p, s) - - - -- choose closest player/mpb to runaway from - if dist < min_dist - and line_of_sight(self, sp, p, 2) == true then - min_dist = dist - min_player = player - end - end - end - - if min_player then - - local lp = player:get_pos() - local vec = { - x = lp.x - s.x, - y = lp.y - s.y, - z = lp.z - s.z - } - - local yaw = (atan(vec.z / vec.x) + 3 * pi / 2) - self.rotate - - if lp.x > s.x then - yaw = yaw + pi - end - - yaw = set_yaw(self, yaw, 4) - self.state = "runaway" - self.runaway_timer = 3 - self.following = nil - end -end - - --- follow player if owner or holding item, if fish outta water then flop -local follow_flop = function(self) - - -- find player to follow - if (self.follow ~= "" - or self.order == "follow") - and not self.following - and self.state ~= "attack" - and self.order ~= "sit" - and self.state ~= "runaway" then - - local s = self.object:get_pos() - local players = minetest.get_connected_players() - - for n = 1, #players do - - if (object_in_range(self, players[n])) - and not mcl_mobs.invis[ players[n]:get_player_name() ] then - - self.following = players[n] - - break - end - end - end - - if self.type == "npc" - and self.order == "follow" - and self.state ~= "attack" - and self.order ~= "sit" - and self.owner ~= "" then - - -- npc stop following player if not owner - if self.following - and self.owner - and self.owner ~= self.following:get_player_name() then - self.following = nil - end - else - -- stop following player if not holding specific item, - -- mob is horny, fleeing or attacking - if self.following - and self.following:is_player() - and (follow_holding(self, self.following) == false or - self.horny or self.state == "runaway") then - self.following = nil - end - - end - - -- follow that thing - if self.following then - - local s = self.object:get_pos() - local p - - if self.following:is_player() then - - p = self.following:get_pos() - - elseif self.following.object then - - p = self.following.object:get_pos() - end - - if p then - - local dist = vector.distance(p, s) - - -- dont follow if out of range - if (not object_in_range(self, self.following)) then - self.following = nil - else - local vec = { - x = p.x - s.x, - z = p.z - s.z - } - - local yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate - - if p.x > s.x then yaw = yaw + pi end - - set_yaw(self, yaw, 2.35) - - -- anyone but standing npc's can move along - if dist > 3 - and self.order ~= "stand" then - - set_velocity(self, self.follow_velocity) - - if self.walk_chance ~= 0 then - set_animation(self, "run") - end - else - set_velocity(self, 0) - set_animation(self, "stand") - end - - return - end - end - end - - -- swimmers flop when out of their element, and swim again when back in - if self.fly then - local s = self.object:get_pos() - if not flight_check(self, s) then - - self.state = "flop" - self.object:set_acceleration({x = 0, y = DEFAULT_FALL_SPEED, z = 0}) - - local sdef = minetest.registered_nodes[self.standing_on] - -- Flop on ground - if sdef and sdef.walkable then - mob_sound(self, "flop") - self.object:set_velocity({ - x = math.random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), - y = FLOP_HEIGHT, - z = math.random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), - }) - end - - set_animation(self, "stand", true) - - return - elseif self.state == "flop" then - self.state = "stand" - self.object:set_acceleration({x = 0, y = 0, z = 0}) - set_velocity(self, 0) - end - end -end - - --- dogshoot attack switch and counter function -local dogswitch = function(self, dtime) - - -- switch mode not activated - if not self.dogshoot_switch - or not dtime then - return 0 - end - - self.dogshoot_count = self.dogshoot_count + dtime - - if (self.dogshoot_switch == 1 - and self.dogshoot_count > self.dogshoot_count_max) - or (self.dogshoot_switch == 2 - and self.dogshoot_count > self.dogshoot_count2_max) then - - self.dogshoot_count = 0 - - if self.dogshoot_switch == 1 then - self.dogshoot_switch = 2 - else - self.dogshoot_switch = 1 - end - end - - return self.dogshoot_switch -end - -local function go_to_pos(entity,b) - if not entity then return end - local s=entity.object:get_pos() - if vector.distance(b,s) < 1 then - --set_velocity(entity,0) - return true - end - local v = { x = b.x - s.x, z = b.z - s.z } - local yaw = (math.atan(v.z / v.x) + math.pi / 2) - entity.rotate - if b.x > s.x then yaw = yaw + math.pi end - entity.object:set_yaw(yaw) - set_velocity(entity,entity.follow_velocity) - mcl_mobs:set_animation(entity, "walk") -end - -local function check_doors(self) - local p = self.object:get_pos() - local t = minetest.get_timeofday() - local dd = minetest.find_nodes_in_area(vector.offset(p,-1,-1,-1),vector.offset(p,1,1,1),{"group:door"}) - for _,d in pairs(dd) do - local n = minetest.get_node(d) - if n.name:find("_b_") then - local def = minetest.registered_nodes[n.name] - local closed = n.name:find("_b_1") - if t < 0.3 or t > 0.8 then - if not closed then def.on_rightclick(d,n,self) end - else - if closed then def.on_rightclick(d,n,self) end - end - - end - end -end - --- execute current state (stand, walk, run, attacks) --- returns true if mob has died -local do_states = function(self, dtime) - if self.can_open_doors then check_doors(self) end - - local yaw = self.object:get_yaw() or 0 - - if self.state == "stand" then - if random(1, 4) == 1 then - - local s = self.object:get_pos() - local objs = minetest.get_objects_inside_radius(s, 3) - - for n = 1, #objs do - - if objs[n]:is_player() then - lp = objs[n]:get_pos() - break - end - end - - -- look at any players nearby, otherwise turn randomly - if self.look_at_players then - - local vec = { - x = lp.x - s.x, - z = lp.z - s.z - } - - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate - - if lp.x > s.x then yaw = yaw + pi end - else - yaw = yaw + random(-0.5, 0.5) - end - - yaw = set_yaw(self, yaw, 8) - end - - set_velocity(self, 0) - set_animation(self, "stand") - - -- npc's ordered to stand stay standing - if self.type ~= "npc" - or self.order ~= "stand" then - - if self.walk_chance ~= 0 - and self.facing_fence ~= true - and random(1, 100) <= self.walk_chance - and is_at_cliff_or_danger(self) == false then - - set_velocity(self, self.walk_velocity) - self.state = "walk" - set_animation(self, "walk") - end - end - - elseif self.state == "gowp" then - local p = self.object:get_pos() - if not p or not self._target then return end - if vector.distance(p,self._target) < 2 or ( self.waypoints and #self.waypoints == 0 ) then - self.waypoints = nil - self._target = nil - self.current_target = nil - self.state = "walk" - if self.callback_arrived then return self.callback_arrived(self) end - return true - end - if self.waypoints and ( not self.current_target or vector.distance(p,self.current_target) < 1.5 ) then - self.current_target = table.remove(self.waypoints, 1) - --minetest.log("nextwp:".. tostring(self.current_target) ) - elseif self.current_target then - go_to_pos(self,self.current_target) - end - - if self.current_target and not minetest.line_of_sight(self.object:get_pos(),self.current_target) then - self.waypoints=minetest.find_path(p,self._target,150,1,4) - self.current_target = nil - return - end - if not self.current_target then - --minetest.log("no path") - self.state = "walk" - end - - elseif self.state == "walk" then - local s = self.object:get_pos() - local lp = nil - - -- is there something I need to avoid? - if (self.water_damage > 0 - and self.lava_damage > 0) - or self.breath_max ~= -1 then - - lp = minetest.find_node_near(s, 1, {"group:water", "group:lava"}) - - elseif self.water_damage > 0 then - - lp = minetest.find_node_near(s, 1, {"group:water"}) - - elseif self.lava_damage > 0 then - - lp = minetest.find_node_near(s, 1, {"group:lava"}) - - elseif self.fire_damage > 0 then - - lp = minetest.find_node_near(s, 1, {"group:fire"}) - - end - - local is_in_danger = false - if lp then - -- If mob in or on dangerous block, look for land - if (is_node_dangerous(self, self.standing_in) or - is_node_dangerous(self, self.standing_on)) or (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) and (not self.fly) then - is_in_danger = true - - -- If mob in or on dangerous block, look for land - if is_in_danger then - -- Better way to find shore - copied from upstream - lp = minetest.find_nodes_in_area_under_air( - {x = s.x - 5, y = s.y - 0.5, z = s.z - 5}, - {x = s.x + 5, y = s.y + 1, z = s.z + 5}, - {"group:solid"}) - - lp = #lp > 0 and lp[random(#lp)] - - -- did we find land? - if lp then - - local vec = { - x = lp.x - s.x, - z = lp.z - s.z - } - - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate - - - if lp.x > s.x then yaw = yaw + pi end - - -- look towards land and move in that direction - yaw = set_yaw(self, yaw, 6) - set_velocity(self, self.walk_velocity) - - end - end - - -- A danger is near but mob is not inside - else - - -- Randomly turn - if random(1, 100) <= 30 then - yaw = yaw + random(-0.5, 0.5) - yaw = set_yaw(self, yaw, 8) - end - end - - yaw = set_yaw(self, yaw, 8) - - -- otherwise randomly turn - elseif random(1, 100) <= 30 then - - yaw = yaw + random(-0.5, 0.5) - yaw = set_yaw(self, yaw, 8) - end - - -- stand for great fall or danger or fence in front - local cliff_or_danger = false - if is_in_danger then - cliff_or_danger = is_at_cliff_or_danger(self) - end - if self.facing_fence == true - or cliff_or_danger - or random(1, 100) <= 30 then - - set_velocity(self, 0) - self.state = "stand" - set_animation(self, "stand") - local yaw = self.object:get_yaw() or 0 - yaw = set_yaw(self, yaw + 0.78, 8) - else - - set_velocity(self, self.walk_velocity) - - if flight_check(self) - and self.animation - and self.animation.fly_start - and self.animation.fly_end then - set_animation(self, "fly") - else - set_animation(self, "walk") - end - end - - -- runaway when punched - elseif self.state == "runaway" then - - self.runaway_timer = self.runaway_timer + 1 - - -- stop after 5 seconds or when at cliff - if self.runaway_timer > 5 - or is_at_cliff_or_danger(self) then - self.runaway_timer = 0 - set_velocity(self, 0) - self.state = "stand" - set_animation(self, "stand") - local yaw = self.object:get_yaw() or 0 - yaw = set_yaw(self, yaw + 0.78, 8) - else - set_velocity(self, self.run_velocity) - set_animation(self, "run") - end - - -- attack routines (explode, dogfight, shoot, dogshoot) - elseif self.state == "attack" then - - local s = self.object:get_pos() - local p = self.attack:get_pos() or s - - -- stop attacking if player invisible or out of range - if not self.attack - or not self.attack:get_pos() - or not object_in_range(self, self.attack) - or self.attack:get_hp() <= 0 - or (self.attack:is_player() and mcl_mobs.invis[ self.attack:get_player_name() ]) then - - self.state = "stand" - set_velocity(self, 0) - set_animation(self, "stand") - self.attack = nil - self.v_start = false - self.timer = 0 - self.blinktimer = 0 - self.path.way = nil - - return - end - - -- calculate distance from mob and enemy - local dist = vector.distance(p, s) - - if self.attack_type == "explode" then - - local vec = { - x = p.x - s.x, - z = p.z - s.z - } - - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate - - if p.x > s.x then yaw = yaw + pi end - - yaw = set_yaw(self, yaw, 0, dtime) - - local node_break_radius = self.explosion_radius or 1 - local entity_damage_radius = self.explosion_damage_radius - or (node_break_radius * 2) - - -- start timer when in reach and line of sight - if not self.v_start - and dist <= self.reach - and line_of_sight(self, s, p, 2) then - - self.v_start = true - self.timer = 0 - self.blinktimer = 0 - mob_sound(self, "fuse", nil, false) - - -- stop timer if out of reach or direct line of sight - elseif self.allow_fuse_reset - and self.v_start - and (dist >= self.explosiontimer_reset_radius - or not line_of_sight(self, s, p, 2)) then - self.v_start = false - self.timer = 0 - self.blinktimer = 0 - self.blinkstatus = false - remove_texture_mod(self, "^[brighten") - end - - -- walk right up to player unless the timer is active - if self.v_start and (self.stop_to_explode or dist < self.reach) then - set_velocity(self, 0) - else - set_velocity(self, self.run_velocity) - end - - if self.animation and self.animation.run_start then - set_animation(self, "run") - else - set_animation(self, "walk") - end - - if self.v_start then - - self.timer = self.timer + dtime - self.blinktimer = (self.blinktimer or 0) + dtime - - if self.blinktimer > 0.2 then - - self.blinktimer = 0 - - if self.blinkstatus then - remove_texture_mod(self, "^[brighten") - else - add_texture_mod(self, "^[brighten") - end - - self.blinkstatus = not self.blinkstatus - end - - if self.timer > self.explosion_timer then - - local pos = self.object:get_pos() - - if mobs_griefing and not minetest.is_protected(pos, "") then - mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { drop_chance = 1.0 }, self.object) - else - minetest.sound_play(self.sounds.explode, { - pos = pos, - gain = 1.0, - max_hear_distance = self.sounds.distance or 32 - }, true) - - entity_physics(pos, entity_damage_radius) - effect(pos, 32, "mcl_particles_smoke.png", nil, nil, node_break_radius, 1, 0) - end - mcl_burning.extinguish(self.object) - self.object:remove() - - return true - end - end - - elseif self.attack_type == "dogfight" - or (self.attack_type == "dogshoot" and dogswitch(self, dtime) == 2) - or (self.attack_type == "dogshoot" and dist <= self.reach and dogswitch(self) == 0) then - - if self.fly - and dist > self.reach then - - local p1 = s - local me_y = floor(p1.y) - local p2 = p - local p_y = floor(p2.y + 1) - local v = self.object:get_velocity() - - if flight_check(self, s) then - - if me_y < p_y then - - self.object:set_velocity({ - x = v.x, - y = 1 * self.walk_velocity, - z = v.z - }) - - elseif me_y > p_y then - - self.object:set_velocity({ - x = v.x, - y = -1 * self.walk_velocity, - z = v.z - }) - end - else - if me_y < p_y then - - self.object:set_velocity({ - x = v.x, - y = 0.01, - z = v.z - }) - - elseif me_y > p_y then - - self.object:set_velocity({ - x = v.x, - y = -0.01, - z = v.z - }) - end - end - - end - - -- rnd: new movement direction - if self.path.following - and self.path.way - and self.attack_type ~= "dogshoot" then - - -- no paths longer than 50 - if #self.path.way > 50 - or dist < self.reach then - self.path.following = false - return - end - - local p1 = self.path.way[1] - - if not p1 then - self.path.following = false - return - end - - if abs(p1.x-s.x) + abs(p1.z - s.z) < 0.6 then - -- reached waypoint, remove it from queue - table.remove(self.path.way, 1) - end - - -- set new temporary target - p = {x = p1.x, y = p1.y, z = p1.z} - end - - local vec = { - x = p.x - s.x, - z = p.z - s.z - } - - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate - - if p.x > s.x then yaw = yaw + pi end - - yaw = set_yaw(self, yaw, 0, dtime) - - -- move towards enemy if beyond mob reach - if dist > self.reach then - - -- path finding by rnd - if self.pathfinding -- only if mob has pathfinding enabled - and enable_pathfinding then - - smart_mobs(self, s, p, dist, dtime) - end - - if is_at_cliff_or_danger(self) then - - set_velocity(self, 0) - set_animation(self, "stand") - local yaw = self.object:get_yaw() or 0 - yaw = set_yaw(self, yaw + 0.78, 8) - else - - if self.path.stuck then - set_velocity(self, self.walk_velocity) - else - set_velocity(self, self.run_velocity) - end - - if self.animation and self.animation.run_start then - set_animation(self, "run") - else - set_animation(self, "walk") - end - end - - else -- rnd: if inside reach range - - self.path.stuck = false - self.path.stuck_timer = 0 - self.path.following = false -- not stuck anymore - - set_velocity(self, 0) - - if not self.custom_attack then - - if self.timer > 1 then - - self.timer = 0 - - if self.double_melee_attack - and random(1, 2) == 1 then - set_animation(self, "punch2") - else - set_animation(self, "punch") - end - - local p2 = p - local s2 = s - - p2.y = p2.y + .5 - s2.y = s2.y + .5 - - if line_of_sight(self, p2, s2) == true then - - -- play attack sound - mob_sound(self, "attack") - - -- punch player (or what player is attached to) - local attached = self.attack:get_attach() - if attached then - self.attack = attached - end - self.attack:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = self.damage} - }, nil) - end - end - else -- call custom attack every second - if self.custom_attack - and self.timer > 1 then - - self.timer = 0 - - self.custom_attack(self, p) - end - end - end - - elseif self.attack_type == "shoot" - or (self.attack_type == "dogshoot" and dogswitch(self, dtime) == 1) - or (self.attack_type == "dogshoot" and dist > self.reach and dogswitch(self) == 0) then - - p.y = p.y - .5 - s.y = s.y + .5 - - local dist = vector.distance(p, s) - local vec = { - x = p.x - s.x, - y = p.y - s.y, - z = p.z - s.z - } - - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate - - if p.x > s.x then yaw = yaw + pi end - - yaw = set_yaw(self, yaw, 0, dtime) - - set_velocity(self, 0) - - local p = self.object:get_pos() - p.y = p.y + (self.collisionbox[2] + self.collisionbox[5]) / 2 - - if self.shoot_interval - and self.timer > self.shoot_interval - and not minetest.raycast(p, self.attack:get_pos(), false, false):next() - and random(1, 100) <= 60 then - - self.timer = 0 - set_animation(self, "shoot") - - -- play shoot attack sound - mob_sound(self, "shoot_attack") - - -- Shoot arrow - if minetest.registered_entities[self.arrow] then - - local arrow, ent - local v = 1 - if not self.shoot_arrow then - self.firing = true - minetest.after(1, function() - self.firing = false - end) - arrow = minetest.add_entity(p, self.arrow) - ent = arrow:get_luaentity() - if ent.velocity then - v = ent.velocity - end - ent.switch = 1 - ent.owner_id = tostring(self.object) -- add unique owner id to arrow - - -- important for mcl_shields - ent._shooter = self.object - ent._saved_shooter_pos = self.object:get_pos() - end - - local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5 - -- offset makes shoot aim accurate - vec.y = vec.y + self.shoot_offset - vec.x = vec.x * (v / amount) - vec.y = vec.y * (v / amount) - vec.z = vec.z * (v / amount) - if self.shoot_arrow then - vec = vector.normalize(vec) - self:shoot_arrow(p, vec) - else - arrow:set_velocity(vec) - end - end - end - end - end -end - -local plane_adjacents = { - vector.new(1,0,0), - vector.new(-1,0,0), - vector.new(0,0,1), - vector.new(0,0,-1), -} - -function mcl_mobs:gopath(self,target,callback_arrived) - local p = self.object:get_pos() - local t = vector.offset(target,0,1,0) - local wp = minetest.find_path(p,t,150,1,4) - if not wp then - local d = minetest.find_node_near(target,16,{"group:door"}) - if d then - for _,v in pairs(plane_adjacents) do - local pos = vector.add(d,v) - local n = minetest.get_node(pos) - if n.name == "air" then - wp = minetest.find_path(p,pos,150,1,4) - if wp then break end - end - end - end - end - if wp and #wp > 0 then - self._target = t - self.callback_arrived = callback_arrived - self.waypoints = wp - self.state = "gowp" - return true - else - --minetest.log("no path found") - end -end - -local function player_near(pos) - for _,o in pairs(minetest.get_objects_inside_radius(pos,2)) do - if o:is_player() then return true end - end -end - -local function check_item_pickup(self) - if self.pick_up and #self.pick_up > 0 then - local p = self.object:get_pos() - for _,o in pairs(minetest.get_objects_inside_radius(p,2)) do - local l=o:get_luaentity() - if l and l.name == "__builtin:item" then - for k,v in pairs(self.pick_up) do - if not player_near(p) and self.on_pick_up and l.itemstring:find(v) then - if self.on_pick_up(self,l) == nil then o:remove() end - end - end - end - end - end -end - -local function damage_mob(self,reason,damage) - if not self.health then return end - damage = floor(damage) - if damage > 0 then - self.health = self.health - damage - - effect(pos, 5, "mcl_particles_smoke.png", 1, 2, 2, nil) - - if check_for_death(self, reason, {type = reason}) then - return true - end - end -end - -local function check_entity_cramming(self) - local p = self.object:get_pos() - local oo = minetest.get_objects_inside_radius(p,1) - local mobs = {} - for _,o in pairs(oo) do - local l = o:get_luaentity() - if l and l.is_mob and l.health > 0 then table.insert(mobs,l) end - end - local clear = #mobs < ENTITY_CRAMMING_MAX - local ncram = {} - for _,l in pairs(mobs) do - if l then - if clear then - l.cram = nil - elseif l.cram == nil and not self.child then - table.insert(ncram,l) - elseif l.cram then - damage_mob(l,"cramming",CRAMMING_DAMAGE) - end - end - end - for i,l in pairs(ncram) do - if i > ENTITY_CRAMMING_MAX then - l.cram = true - else - l.cram = nil - end - end -end - --- falling and fall damage --- returns true if mob died -local falling = function(self, pos) - - if self.fly and self.state ~= "die" then - return - end - - if mcl_portals ~= nil then - if mcl_portals.nether_portal_cooloff(self.object) then - return false -- mob has teleported through Nether portal - it's 99% not falling - end - end - - -- floating in water (or falling) - local v = self.object:get_velocity() - - if v.y > 0 then - - -- apply gravity when moving up - self.object:set_acceleration({ - x = 0, - y = -10, - z = 0 - }) - - elseif v.y <= 0 and v.y > self.fall_speed then - - -- fall downwards at set speed - self.object:set_acceleration({ - x = 0, - y = self.fall_speed, - z = 0 - }) - else - -- stop accelerating once max fall speed hit - self.object:set_acceleration({x = 0, y = 0, z = 0}) - end - - if minetest.registered_nodes[node_ok(pos).name].groups.lava then - - if self.floats_on_lava == 1 then - - self.object:set_acceleration({ - x = 0, - y = -self.fall_speed / (max(1, v.y) ^ 2), - z = 0 - }) - end - end - - -- in water then float up - if minetest.registered_nodes[node_ok(pos).name].groups.water then - - if self.floats == 1 then - - self.object:set_acceleration({ - x = 0, - y = -self.fall_speed / (max(1, v.y) ^ 2), - z = 0 - }) - end - else - - -- fall damage onto solid ground - if self.fall_damage == 1 - and self.object:get_velocity().y == 0 then - - local d = (self.old_y or 0) - self.object:get_pos().y - - if d > 5 then - - local add = minetest.get_item_group(self.standing_on, "fall_damage_add_percent") - local damage = d - 5 - if add ~= 0 then - damage = damage + damage * (add/100) - end - damage_mob(self,"fall",damage) - end - - self.old_y = self.object:get_pos().y - end - end -end - -local teleport = function(self, target) - if self.do_teleport then - if self.do_teleport(self, target) == false then - return - end - end -end - - --- deal damage and effects when mob punched -local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) - - -- custom punch function - if self.do_punch then - - -- when false skip going any further - if self.do_punch(self, hitter, tflp, tool_capabilities, dir) == false then - return - end - end - - -- error checking when mod profiling is enabled - if not tool_capabilities then - minetest.log("warning", "[mobs] Mod profiling enabled, damage not enabled") - return - end - - local is_player = hitter:is_player() - - if is_player then - -- is mob protected? - if self.protected and minetest.is_protected(self.object:get_pos(), hitter:get_player_name()) then - return - end - - -- set/update 'drop xp' timestamp if hitted by player - self.xp_timestamp = minetest.get_us_time() - end - - - -- punch interval - local weapon = hitter:get_wielded_item() - local punch_interval = 1.4 - - -- exhaust attacker - if is_player then - mcl_hunger.exhaust(hitter:get_player_name(), mcl_hunger.EXHAUST_ATTACK) - end - - -- calculate mob damage - local damage = 0 - local armor = self.object:get_armor_groups() or {} - local tmp - - -- quick error check incase it ends up 0 (serialize.h check test) - if tflp == 0 then - tflp = 0.2 - end - - - for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do - - tmp = tflp / (tool_capabilities.full_punch_interval or 1.4) - - if tmp < 0 then - tmp = 0.0 - elseif tmp > 1 then - tmp = 1.0 - end - - damage = damage + (tool_capabilities.damage_groups[group] or 0) - * tmp * ((armor[group] or 0) / 100.0) - end - - if weapon then - local fire_aspect_level = mcl_enchanting.get_enchantment(weapon, "fire_aspect") - if fire_aspect_level > 0 then - mcl_burning.set_on_fire(self.object, fire_aspect_level * 4) - end - end - - -- check for tool immunity or special damage - for n = 1, #self.immune_to do - - if self.immune_to[n][1] == weapon:get_name() then - - damage = self.immune_to[n][2] or 0 - break - end - end - - -- healing - if damage <= -1 then - self.health = self.health - floor(damage) - return - end - - if tool_capabilities then - punch_interval = tool_capabilities.full_punch_interval or 1.4 - end - - -- add weapon wear manually - -- Required because we have custom health handling ("health" property) - if minetest.is_creative_enabled("") ~= true - and tool_capabilities then - if tool_capabilities.punch_attack_uses then - -- Without this delay, the wear does not work. Quite hacky ... - minetest.after(0, function(name) - local player = minetest.get_player_by_name(name) - if not player then return end - local weapon = hitter:get_wielded_item(player) - local def = weapon:get_definition() - if def.tool_capabilities and def.tool_capabilities.punch_attack_uses then - local wear = floor(65535/tool_capabilities.punch_attack_uses) - weapon:add_wear(wear) - hitter:set_wielded_item(weapon) - end - end, hitter:get_player_name()) - end - end - - local die = false - - -- only play hit sound and show blood effects if damage is 1 or over; lower to 0.1 to ensure armor works appropriately. - if damage >= 0.1 then - - -- weapon sounds - if weapon:get_definition().sounds ~= nil then - - local s = random(0, #weapon:get_definition().sounds) - - minetest.sound_play(weapon:get_definition().sounds[s], { - object = self.object, --hitter, - max_hear_distance = 8 - }, true) - else - minetest.sound_play("default_punch", { - object = self.object, - max_hear_distance = 5 - }, true) - end - - damage_effect(self, damage) - - -- do damage - self.health = self.health - damage - - -- skip future functions if dead, except alerting others - if check_for_death(self, "hit", {type = "punch", puncher = hitter}) then - die = true - end - - -- knock back effect (only on full punch) - if not die - and self.knock_back - and tflp >= punch_interval then - - local v = self.object:get_velocity() - local r = 1.4 - min(punch_interval, 1.4) - local kb = r * 2.0 - local up = 2 - - -- if already in air then dont go up anymore when hit - if v.y ~= 0 - or self.fly then - up = 0 - end - - -- direction error check - dir = dir or {x = 0, y = 0, z = 0} - - -- check if tool already has specific knockback value - if tool_capabilities.damage_groups["knockback"] then - kb = tool_capabilities.damage_groups["knockback"] - else - kb = kb * 1.5 - end - - - local luaentity - if hitter then - luaentity = hitter:get_luaentity() - end - if hitter and is_player then - local wielditem = hitter:get_wielded_item() - kb = kb + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") - elseif luaentity and luaentity._knockback then - kb = kb + luaentity._knockback - end - - self.object:set_velocity({ - x = dir.x * kb, - y = dir.y * kb + up * 2, - z = dir.z * kb - }) - - self.pause_timer = 0.25 - end - end -- END if damage - - -- if skittish then run away - if not die and self.runaway == true and self.state ~= "flop" then - - local lp = hitter:get_pos() - local s = self.object:get_pos() - local vec = { - x = lp.x - s.x, - y = lp.y - s.y, - z = lp.z - s.z - } - - local yaw = (atan(vec.z / vec.x) + 3 * pi / 2) - self.rotate - - if lp.x > s.x then - yaw = yaw + pi - end - - yaw = set_yaw(self, yaw, 6) - self.state = "runaway" - self.runaway_timer = 0 - self.following = nil - end - - local name = hitter:get_player_name() or "" - - -- attack puncher and call other mobs for help - if self.passive == false - and self.state ~= "flop" - and (self.child == false or self.type == "monster") - and hitter:get_player_name() ~= self.owner - and not mcl_mobs.invis[ name ] then - - if not die then - -- attack whoever punched mob - self.state = "" - do_attack(self, hitter) - end - - -- alert others to the attack - local objs = minetest.get_objects_inside_radius(hitter:get_pos(), self.view_range) - local obj = nil - - for n = 1, #objs do - - obj = objs[n]:get_luaentity() - - if obj then - - -- only alert members of same mob or friends - if obj.group_attack - and obj.state ~= "attack" - and obj.owner ~= name then - if obj.name == self.name then - do_attack(obj, hitter) - elseif type(obj.group_attack) == "table" then - for i=1, #obj.group_attack do - if obj.name == obj.group_attack[i] then - do_attack(obj, hitter) - break - end - end - end - end - - -- have owned mobs attack player threat - if obj.owner == name and obj.owner_loyal then - do_attack(obj, self.object) - end - end - end - end -end - -local mob_detach_child = function(self, child) - - if self.driver == child then - self.driver = nil - end - -end - --- get entity staticdata -local mob_staticdata = function(self) - ---[[ - -- remove mob when out of range unless tamed - if remove_far - and self.can_despawn - and self.remove_ok - and ((not self.nametag) or (self.nametag == "")) - and self.lifetimer <= 20 then - - minetest.log("action", "Mob "..name.." despawns in mob_staticdata at "..minetest.pos_to_string(self.object.get_pos(), 1)) - mcl_burning.extinguish(self.object) - self.object:remove() - - return ""-- nil - end ---]] - self.remove_ok = true - self.attack = nil - self.following = nil - self.state = "stand" - - local tmp = {} - - for _,stat in pairs(self) do - - local t = type(stat) - - if t ~= "function" - and t ~= "nil" - and t ~= "userdata" - and _ ~= "_cmi_components" then - tmp[_] = self[_] - end - end - - return minetest.serialize(tmp) -end - - --- activate mob and reload settings -local mob_activate = function(self, staticdata, def, dtime) - - -- remove monsters in peaceful mode - if self.type == "monster" - and minetest.settings:get_bool("only_peaceful_mobs", false) then - mcl_burning.extinguish(self.object) - self.object:remove() - - return - end - - -- load entity variables - local tmp = minetest.deserialize(staticdata) - - if tmp then - for _,stat in pairs(tmp) do - self[_] = stat - end - end - - -- select random texture, set model and size - if not self.base_texture then - - -- compatiblity with old simple mobs textures - if type(def.textures[1]) == "string" then - def.textures = {def.textures} - end - - self.base_texture = def.textures[random(1, #def.textures)] - self.base_mesh = def.mesh - self.base_size = self.visual_size - self.base_colbox = self.collisionbox - self.base_selbox = self.selectionbox - end - - -- for current mobs that dont have this set - if not self.base_selbox then - self.base_selbox = self.selectionbox or self.base_colbox - end - - -- set texture, model and size - local textures = self.base_texture - local mesh = self.base_mesh - local vis_size = self.base_size - local colbox = self.base_colbox - local selbox = self.base_selbox - - -- specific texture if gotten - if self.gotten == true - and def.gotten_texture then - textures = def.gotten_texture - end - - -- specific mesh if gotten - if self.gotten == true - and def.gotten_mesh then - mesh = def.gotten_mesh - end - - -- set child objects to half size - if self.child == true then - - vis_size = { - x = self.base_size.x * .5, - y = self.base_size.y * .5, - } - - if def.child_texture then - textures = def.child_texture[1] - end - - colbox = { - self.base_colbox[1] * .5, - self.base_colbox[2] * .5, - self.base_colbox[3] * .5, - self.base_colbox[4] * .5, - self.base_colbox[5] * .5, - self.base_colbox[6] * .5 - } - selbox = { - self.base_selbox[1] * .5, - self.base_selbox[2] * .5, - self.base_selbox[3] * .5, - self.base_selbox[4] * .5, - self.base_selbox[5] * .5, - self.base_selbox[6] * .5 - } - end - - if self.health == 0 then - self.health = random (self.hp_min, self.hp_max) - end - if self.breath == nil then - self.breath = self.breath_max - end - - -- pathfinding init - self.path = {} - self.path.way = {} -- path to follow, table of positions - self.path.lastpos = {x = 0, y = 0, z = 0} - self.path.stuck = false - self.path.following = false -- currently following path? - self.path.stuck_timer = 0 -- if stuck for too long search for path - - -- Armor groups - -- immortal=1 because we use custom health - -- handling (using "health" property) - local armor - if type(self.armor) == "table" then - armor = table.copy(self.armor) - armor.immortal = 1 - else - armor = {immortal=1, fleshy = self.armor} - end - self.object:set_armor_groups(armor) - self.old_y = self.object:get_pos().y - self.old_health = self.health - self.sounds.distance = self.sounds.distance or 10 - self.textures = textures - self.mesh = mesh - self.collisionbox = colbox - self.selectionbox = selbox - self.visual_size = vis_size - self.standing_in = "ignore" - self.standing_on = "ignore" - self.jump_sound_cooloff = 0 -- used to prevent jump sound from being played too often in short time - self.opinion_sound_cooloff = 0 -- used to prevent sound spam of particular sound types - - self.texture_mods = {} - self.object:set_texture_mod("") - - self.v_start = false - self.timer = 0 - self.blinktimer = 0 - self.blinkstatus = false - - -- check existing nametag - if not self.nametag then - self.nametag = def.nametag - end - - -- set anything changed above - self.object:set_properties(self) - set_yaw(self, (random(0, 360) - 180) / 180 * pi, 6) - update_tag(self) - set_animation(self, "stand") - - -- run on_spawn function if found - if self.on_spawn and not self.on_spawn_run then - if self.on_spawn(self) then - self.on_spawn_run = true -- if true, set flag to run once only - end - end - - -- run after_activate - if def.after_activate then - def.after_activate(self, staticdata, def, dtime) - end -end - - --- main mob function -local mob_step = function(self, dtime) - check_item_pickup(self) - if not self.fire_resistant then - mcl_burning.tick(self.object, dtime, self) - end - - local pos = self.object:get_pos() - local yaw = 0 - - if mobs_debug then - update_tag(self) - end - - if self.state == "die" then - return - end - - if self.jump_sound_cooloff > 0 then - self.jump_sound_cooloff = self.jump_sound_cooloff - dtime - end - if self.opinion_sound_cooloff > 0 then - self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime - end - if falling(self, pos) then - -- Return if mob died after falling - return - end - - -- smooth rotation by ThomasMonroe314 - - if self.delay and self.delay > 0 then - - local yaw = self.object:get_yaw() or 0 - - if self.delay == 1 then - yaw = self.target_yaw - else - local dif = abs(yaw - self.target_yaw) - - if yaw > self.target_yaw then - - if dif > pi then - dif = 2 * pi - dif -- need to add - yaw = yaw + dif / self.delay - else - yaw = yaw - dif / self.delay -- need to subtract - end - - elseif yaw < self.target_yaw then - - if dif > pi then - dif = 2 * pi - dif - yaw = yaw - dif / self.delay -- need to subtract - else - yaw = yaw + dif / self.delay -- need to add - end - end - - if yaw > (pi * 2) then yaw = yaw - (pi * 2) end - if yaw < 0 then yaw = yaw + (pi * 2) end - end - - self.delay = self.delay - 1 - if self.shaking then - yaw = yaw + (math.random() * 2 - 1) * 5 * dtime - end - self.object:set_yaw(yaw) - update_roll(self) - end - - -- end rotation - - -- run custom function (defined in mob lua file) - if self.do_custom then - - -- when false skip going any further - if self.do_custom(self, dtime) == false then - return - end - end - - -- knockback timer - if self.pause_timer > 0 then - - self.pause_timer = self.pause_timer - dtime - - return - end - - -- attack timer - self.timer = self.timer + dtime - - if self.state ~= "attack" and self.state ~= "gowp" then - if self.timer < 1 then - return - end - - self.timer = 0 - end - - -- never go over 100 - if self.timer > 100 then - self.timer = 1 - end - - -- mob plays random sound at times - if random(1, 70) == 1 then - mob_sound(self, "random", true) - end - - -- environmental damage timer (every 1 second) - self.env_damage_timer = self.env_damage_timer + dtime - - if (self.state == "attack" and self.env_damage_timer > 1) - or self.state ~= "attack" then - check_entity_cramming(self) - self.env_damage_timer = 0 - - -- check for environmental damage (water, fire, lava etc.) - if do_env_damage(self) then - return - end - - -- node replace check (cow eats grass etc.) - replace(self, pos) - end - - monster_attack(self) - - npc_attack(self) - - breed(self) - - if do_states(self, dtime) then - return - end - - if not self.object:get_luaentity() then - return false - end - - do_jump(self) - - runaway_from(self) - - if is_at_water_danger(self) and self.state ~= "attack" then - if random(1, 10) <= 6 then - set_velocity(self, 0) - self.state = "stand" - set_animation(self, "stand") - yaw = yaw + random(-0.5, 0.5) - yaw = set_yaw(self, yaw, 8) - end - end - - -- Add water flowing for mobs from mcl_item_entity - local p, node, nn, def - p = self.object:get_pos() - node = minetest.get_node_or_nil(p) - if node then - nn = node.name - def = minetest.registered_nodes[nn] - end - - -- Move item around on flowing liquids - if def and def.liquidtype == "flowing" then - - --[[ Get flowing direction (function call from flowlib), if there's a liquid. - NOTE: According to Qwertymine, flowlib.quickflow is only reliable for liquids with a flowing distance of 7. - Luckily, this is exactly what we need if we only care about water, which has this flowing distance. ]] - local vec = flowlib.quick_flow(p, node) - -- Just to make sure we don't manipulate the speed for no reason - if vec.x ~= 0 or vec.y ~= 0 or vec.z ~= 0 then - -- Minecraft Wiki: Flowing speed is "about 1.39 meters per second" - local f = 1.39 - -- Set new item moving speed into the direciton of the liquid - local newv = vector.multiply(vec, f) - self.object:set_acceleration({x = 0, y = 0, z = 0}) - self.object:set_velocity({x = newv.x, y = -0.22, z = newv.z}) - - self.physical_state = true - self._flowing = true - self.object:set_properties({ - physical = true - }) - return - end - elseif self._flowing == true then - -- Disable flowing physics if not on/in flowing liquid - self._flowing = false - enable_physics(self.object, self, true) - return - end - - --Mob following code. - follow_flop(self) - - if is_at_cliff_or_danger(self) then - set_velocity(self, 0) - self.state = "stand" - set_animation(self, "stand") - local yaw = self.object:get_yaw() or 0 - yaw = set_yaw(self, yaw + 0.78, 8) - end - - -- Despawning: when lifetimer expires, remove mob - if remove_far - and self.can_despawn == true - and ((not self.nametag) or (self.nametag == "")) - and self.state ~= "attack" - and self.following == nil then - - self.lifetimer = self.lifetimer - dtime - if self.despawn_immediately or self.lifetimer <= 0 then - minetest.log("action", "Mob "..self.name.." despawns in mob_step at "..minetest.pos_to_string(pos, 1)) - mcl_burning.extinguish(self.object) - self.object:remove() - elseif self.lifetimer <= 10 then - if math.random(10) < 4 then - self.despawn_immediately = true - else - self.lifetimer = 20 - end - end - end -end - - --- default function when mobs are blown up with TNT -local do_tnt = function(obj, damage) - - obj.object:punch(obj.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = damage}, - }, nil) - - return false, true, {} -end - - -mcl_mobs.spawning_mobs = {} - --- Code to execute before custom on_rightclick handling -local on_rightclick_prefix = function(self, clicker) - local item = clicker:get_wielded_item() - - -- Name mob with nametag - if not self.ignores_nametag and item:get_name() == "mcl_mobs:nametag" then - - local tag = item:get_meta():get_string("name") - if tag ~= "" then - if string.len(tag) > MAX_MOB_NAME_LENGTH then - tag = string.sub(tag, 1, MAX_MOB_NAME_LENGTH) - end - self.nametag = tag - - update_tag(self) - - if not minetest.is_creative_enabled(clicker:get_player_name()) then - item:take_item() - clicker:set_wielded_item(item) - end - return true - end - - end - return false -end - -local create_mob_on_rightclick = function(on_rightclick) - return function(self, clicker) - local stop = on_rightclick_prefix(self, clicker) - if (not stop) and (on_rightclick) then - on_rightclick(self, clicker) - end - end -end - --- register mob entity -function mcl_mobs:register_mob(name, def) - - mcl_mobs.spawning_mobs[name] = true - -local can_despawn -if def.can_despawn ~= nil then - can_despawn = def.can_despawn -elseif def.spawn_class == "passive" then - can_despawn = false -else - can_despawn = true -end - -local function scale_difficulty(value, default, min, special) - if (not value) or (value == default) or (value == special) then - return default - else - return max(min, value * difficulty) - end -end - -local collisionbox = def.collisionbox or {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25} --- Workaround for : --- Increase upper Y limit to avoid mobs glitching through solid nodes. --- FIXME: Remove workaround if it's no longer needed. -if collisionbox[5] < 0.79 then - collisionbox[5] = 0.79 -end - -minetest.register_entity(name, { - - use_texture_alpha = def.use_texture_alpha, - stepheight = def.stepheight or 0.6, - name = name, - description = def.description, - type = def.type, - attack_type = def.attack_type, - fly = def.fly, - fly_in = def.fly_in or {"air", "__airlike"}, - owner = def.owner or "", - order = def.order or "", - on_die = def.on_die, - spawn_small_alternative = def.spawn_small_alternative, - do_custom = def.do_custom, - jump_height = def.jump_height or 4, -- was 6 - rotate = math.rad(def.rotate or 0), -- 0=front, 90=side, 180=back, 270=side2 - lifetimer = def.lifetimer or 57.73, - hp_min = scale_difficulty(def.hp_min, 5, 1), - hp_max = scale_difficulty(def.hp_max, 10, 1), - xp_min = def.xp_min or 0, - xp_max = def.xp_max or 0, - xp_timestamp = 0, - breath_max = def.breath_max or 15, - breathes_in_water = def.breathes_in_water or false, - physical = true, - collisionbox = collisionbox, - selectionbox = def.selectionbox or def.collisionbox, - visual = def.visual, - visual_size = def.visual_size or {x = 1, y = 1}, - mesh = def.mesh, - makes_footstep_sound = def.makes_footstep_sound or false, - view_range = def.view_range or 16, - walk_velocity = def.walk_velocity or 1, - run_velocity = def.run_velocity or 2, - damage = scale_difficulty(def.damage, 0, 0), - light_damage = def.light_damage or 0, - sunlight_damage = def.sunlight_damage or 0, - water_damage = def.water_damage or 0, - lava_damage = def.lava_damage or 8, - fire_damage = def.fire_damage or 1, - suffocation = def.suffocation or true, - fall_damage = def.fall_damage or 1, - fall_speed = def.fall_speed or DEFAULT_FALL_SPEED, -- must be lower than -2 - drops = def.drops or {}, - armor = def.armor or 100, - on_rightclick = create_mob_on_rightclick(def.on_rightclick), - arrow = def.arrow, - shoot_interval = def.shoot_interval, - sounds = def.sounds or {}, - animation = def.animation, - follow = def.follow, - nofollow = def.nofollow, - can_open_doors = def.can_open_doors, - jump = def.jump ~= false, - walk_chance = def.walk_chance or 50, - attacks_monsters = def.attacks_monsters or false, - group_attack = def.group_attack or false, - passive = def.passive or false, - knock_back = def.knock_back ~= false, - shoot_offset = def.shoot_offset or 0, - floats = def.floats or 1, -- floats in water by default - floats_on_lava = def.floats_on_lava or 0, - replace_rate = def.replace_rate, - replace_what = def.replace_what, - replace_with = def.replace_with, - replace_offset = def.replace_offset or 0, - on_replace = def.on_replace, - timer = 0, - env_damage_timer = 0, - tamed = false, - pause_timer = 0, - horny = false, - hornytimer = 0, - gotten = false, - health = 0, - reach = def.reach or 3, - htimer = 0, - texture_list = def.textures, - child_texture = def.child_texture, - docile_by_day = def.docile_by_day or false, - time_of_day = 0.5, - fear_height = def.fear_height or 0, - runaway = def.runaway, - runaway_timer = 0, - pathfinding = def.pathfinding, - immune_to = def.immune_to or {}, - explosion_radius = def.explosion_radius, -- LEGACY - explosion_damage_radius = def.explosion_damage_radius, -- LEGACY - explosiontimer_reset_radius = def.explosiontimer_reset_radius, - explosion_timer = def.explosion_timer or 3, - allow_fuse_reset = def.allow_fuse_reset ~= false, - stop_to_explode = def.stop_to_explode ~= false, - custom_attack = def.custom_attack, - double_melee_attack = def.double_melee_attack, - dogshoot_switch = def.dogshoot_switch, - dogshoot_count = 0, - dogshoot_count_max = def.dogshoot_count_max or 5, - dogshoot_count2_max = def.dogshoot_count2_max or (def.dogshoot_count_max or 5), - attack_animals = def.attack_animals or false, - specific_attack = def.specific_attack, - runaway_from = def.runaway_from, - owner_loyal = def.owner_loyal, - facing_fence = false, - is_mob = true, - pushable = def.pushable or true, - - - -- MCL2 extensions - teleport = teleport, - do_teleport = def.do_teleport, - spawn_class = def.spawn_class, - ignores_nametag = def.ignores_nametag or false, - rain_damage = def.rain_damage or 0, - glow = def.glow, - can_despawn = can_despawn, - child = def.child or false, - texture_mods = {}, - shoot_arrow = def.shoot_arrow, - sounds_child = def.sounds_child, - pick_up = def.pick_up, - explosion_strength = def.explosion_strength, - suffocation_timer = 0, - follow_velocity = def.follow_velocity or 2.4, - instant_death = def.instant_death or false, - fire_resistant = def.fire_resistant or false, - fire_damage_resistant = def.fire_damage_resistant or false, - ignited_by_sunlight = def.ignited_by_sunlight or false, - -- End of MCL2 extensions - - on_spawn = def.on_spawn, - - on_blast = def.on_blast or do_tnt, - - on_step = mob_step, - - do_punch = def.do_punch, - - on_punch = mob_punch, - - on_breed = def.on_breed, - - on_grown = def.on_grown, - - on_pick_up = def.on_pick_up, - - on_detach_child = mob_detach_child, - - on_activate = function(self, staticdata, dtime) - --this is a temporary hack so mobs stop - --glitching and acting really weird with the - --default built in engine collision detection - self.is_mob = true - self.object:set_properties({ - collide_with_objects = false, - }) - return mob_activate(self, staticdata, def, dtime) - end, - - get_staticdata = function(self) - return mob_staticdata(self) - end, - - harmed_by_heal = def.harmed_by_heal, - -}) - -if minetest.get_modpath("doc_identifier") ~= nil then - doc.sub.identifier.register_object(name, "basics", "mobs") -end - -end -- END mcl_mobs:register_mob function - - --- register arrow for shoot attack -function mcl_mobs:register_arrow(name, def) - - if not name or not def then return end -- errorcheck - - minetest.register_entity(name, { - - physical = false, - visual = def.visual, - visual_size = def.visual_size, - textures = def.textures, - velocity = def.velocity, - hit_player = def.hit_player, - hit_node = def.hit_node, - hit_mob = def.hit_mob, - hit_object = def.hit_object, - drop = def.drop or false, -- drops arrow as registered item when true - collisionbox = {0, 0, 0, 0, 0, 0}, -- remove box around arrows - timer = 0, - switch = 0, - owner_id = def.owner_id, - rotate = def.rotate, - on_punch = function(self) - local vel = self.object:get_velocity() - self.object:set_velocity({x=vel.x * -1, y=vel.y * -1, z=vel.z * -1}) - end, - collisionbox = def.collisionbox or {0, 0, 0, 0, 0, 0}, - automatic_face_movement_dir = def.rotate - and (def.rotate - (pi / 180)) or false, - - on_activate = def.on_activate, - - on_step = def.on_step or function(self, dtime) - - self.timer = self.timer + 1 - - local pos = self.object:get_pos() - - if self.switch == 0 - or self.timer > 150 - or not within_limits(pos, 0) then - mcl_burning.extinguish(self.object) - self.object:remove(); - - return - end - - -- does arrow have a tail (fireball) - if def.tail - and def.tail == 1 - and def.tail_texture then - - minetest.add_particle({ - pos = pos, - velocity = {x = 0, y = 0, z = 0}, - acceleration = {x = 0, y = 0, z = 0}, - expirationtime = def.expire or 0.25, - collisiondetection = false, - texture = def.tail_texture, - size = def.tail_size or 5, - glow = def.glow or 0, - }) - end - - if self.hit_node then - - local node = node_ok(pos).name - - if minetest.registered_nodes[node].walkable then - - self.hit_node(self, pos, node) - - if self.drop == true then - - pos.y = pos.y + 1 - - self.lastpos = (self.lastpos or pos) - - minetest.add_item(self.lastpos, self.object:get_luaentity().name) - end - - self.object:remove(); - - return - end - end - - if self.hit_player or self.hit_mob or self.hit_object then - - for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do - - if self.hit_player - and player:is_player() then - - self.hit_player(self, player) - self.object:remove(); - return - end - - local entity = player:get_luaentity() - - if entity - and self.hit_mob - and entity.is_mob == true - and tostring(player) ~= self.owner_id - and entity.name ~= self.object:get_luaentity().name then - self.hit_mob(self, player) - self.object:remove(); - return - end - - if entity - and self.hit_object - and (not entity.is_mob) - and tostring(player) ~= self.owner_id - and entity.name ~= self.object:get_luaentity().name then - self.hit_object(self, player) - self.object:remove(); - return - end - end - end - - self.lastpos = pos - end - }) -end - - --- no damage to nodes explosion -function mcl_mobs:safe_boom(self, pos, strength) - minetest.sound_play(self.sounds and self.sounds.explode or "tnt_explode", { - pos = pos, - gain = 1.0, - max_hear_distance = self.sounds and self.sounds.distance or 32 - }, true) - local radius = strength - entity_physics(pos, radius) - effect(pos, 32, "mcl_particles_smoke.png", radius * 3, radius * 5, radius, 1, 0) -end - - --- make explosion with protection and tnt mod check -function mcl_mobs:boom(self, pos, strength, fire) - if mobs_griefing and not minetest.is_protected(pos, "") then - mcl_explosions.explode(pos, strength, { drop_chance = 1.0, fire = fire }, self.object) - else - mcl_mobs:safe_boom(self, pos, strength) - end - - -- delete the object after it punched the player to avoid nil entities in e.g. mcl_shields!! - self.object:remove() -end - - --- Register spawn eggs - --- Note: This also introduces the “spawn_egg” group: --- * spawn_egg=1: Spawn egg (generic mob, no metadata) --- * spawn_egg=2: Spawn egg (captured/tamed mob, metadata) -function mcl_mobs:register_egg(mob, desc, background, addegg, no_creative) - - local grp = {spawn_egg = 1} - - -- do NOT add this egg to creative inventory (e.g. dungeon master) - if no_creative == true then - grp.not_in_creative_inventory = 1 - end - - local invimg = background - - if addegg == 1 then - invimg = "mobs_chicken_egg.png^(" .. invimg .. - "^[mask:mobs_chicken_egg_overlay.png)" - end - - -- register old stackable mob egg - minetest.register_craftitem(mob, { - - description = desc, - inventory_image = invimg, - groups = grp, - - _doc_items_longdesc = S("This allows you to place a single mob."), - _doc_items_usagehelp = S("Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns."), - - on_place = function(itemstack, placer, pointed_thing) - - local pos = pointed_thing.above - - -- am I clicking on something with existing on_rightclick function? - local under = minetest.get_node(pointed_thing.under) - local def = minetest.registered_nodes[under.name] - if def and def.on_rightclick then - return def.on_rightclick(pointed_thing.under, under, placer, itemstack) - end - - if pos - and within_limits(pos, 0) - and not minetest.is_protected(pos, placer:get_player_name()) then - - local name = placer:get_player_name() - local privs = minetest.get_player_privs(name) - if under.name == "mcl_mobspawners:spawner" then - if minetest.is_protected(pointed_thing.under, name) then - minetest.record_protection_violation(pointed_thing.under, name) - return itemstack - end - if not privs.maphack then - minetest.chat_send_player(name, S("You need the “maphack” privilege to change the mob spawner.")) - return itemstack - end - mcl_mobspawners.setup_spawner(pointed_thing.under, itemstack:get_name()) - if not minetest.is_creative_enabled(name) then - itemstack:take_item() - end - return itemstack - end - - if not minetest.registered_entities[mob] then - return itemstack - end - - if minetest.settings:get_bool("only_peaceful_mobs", false) - and minetest.registered_entities[mob].type == "monster" then - minetest.chat_send_player(name, S("Only peaceful mobs allowed!")) - return itemstack - end - - pos.y = pos.y - 0.5 - - local mob = minetest.add_entity(pos, mob) - minetest.log("action", "Mob spawned: "..name.." at "..minetest.pos_to_string(pos)) - local ent = mob:get_luaentity() - - -- don't set owner if monster or sneak pressed - if ent.type ~= "monster" - and not placer:get_player_control().sneak then - ent.owner = placer:get_player_name() - ent.tamed = true - end - - -- set nametag - local nametag = itemstack:get_meta():get_string("name") - if nametag ~= "" then - if string.len(nametag) > MAX_MOB_NAME_LENGTH then - nametag = string.sub(nametag, 1, MAX_MOB_NAME_LENGTH) - end - ent.nametag = nametag - update_tag(ent) - end - - -- if not in creative then take item - if not minetest.is_creative_enabled(placer:get_player_name()) then - itemstack:take_item() - end - end - - return itemstack - end, - }) - -end - - --- No-op in MCL2 (capturing mobs is not possible). --- Provided for compability with Mobs Redo -function mcl_mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, force_take, replacewith) - return false -end - - --- No-op in MCL2 (protecting mobs is not possible). -function mcl_mobs:protect(self, clicker) - return false -end - - --- feeding, taming and breeding (thanks blert2112) -function mcl_mobs:feed_tame(self, clicker, feed_count, breed, tame) - if not self.follow then - return false - end - - -- can eat/tame with item in hand - if self.nofollow or follow_holding(self, clicker) then - - -- if not in creative then take item - if not minetest.is_creative_enabled(clicker:get_player_name()) then - - local item = clicker:get_wielded_item() - - item:take_item() - - clicker:set_wielded_item(item) - end - - mob_sound(self, "eat", nil, true) - - -- increase health - self.health = self.health + 4 - - if self.health >= self.hp_max then - - self.health = self.hp_max - - if self.htimer < 1 then - self.htimer = 5 - end - end - - self.object:set_hp(self.health) - - update_tag(self) - - -- make children grow quicker - if self.child == true then - - -- deduct 10% of the time to adulthood - self.hornytimer = self.hornytimer + ((CHILD_GROW_TIME - self.hornytimer) * 0.1) - - return true - end - - -- feed and tame - self.food = (self.food or 0) + 1 - if self.food >= feed_count then - - self.food = 0 - - if breed and self.hornytimer == 0 then - self.horny = true - end - - if tame then - - self.tamed = true - - if not self.owner or self.owner == "" then - self.owner = clicker:get_player_name() - end - end - - -- make sound when fed so many times - mob_sound(self, "random", true) - end - - return true - end - - return false -end - --- Spawn a child -function mcl_mobs:spawn_child(pos, mob_type) - local child = minetest.add_entity(pos, mob_type) - if not child then - return - end - - local ent = child:get_luaentity() - effect(pos, 15, "mcl_particles_smoke.png", 1, 2, 2, 15, 5) - - ent.child = true - - local textures - -- using specific child texture (if found) - if ent.child_texture then - textures = ent.child_texture[1] - end - - -- and resize to half height - child:set_properties({ - textures = textures, - visual_size = { - x = ent.base_size.x * .5, - y = ent.base_size.y * .5, - }, - collisionbox = { - ent.base_colbox[1] * .5, - ent.base_colbox[2] * .5, - ent.base_colbox[3] * .5, - ent.base_colbox[4] * .5, - ent.base_colbox[5] * .5, - ent.base_colbox[6] * .5, - }, - selectionbox = { - ent.base_selbox[1] * .5, - ent.base_selbox[2] * .5, - ent.base_selbox[3] * .5, - ent.base_selbox[4] * .5, - ent.base_selbox[5] * .5, - ent.base_selbox[6] * .5, - }, - }) - - return child -end - - --- compatibility function for old entities to new modpack entities -function mcl_mobs:alias_mob(old_name, new_name) - - -- spawn egg - minetest.register_alias(old_name, new_name) - - -- entity - minetest.register_entity(":" .. old_name, { - - physical = false, - - on_step = function(self) - - if minetest.registered_entities[new_name] then - minetest.add_entity(self.object:get_pos(), new_name) - end - - self.object:remove() - end - }) - -end - - -local timer = 0 -minetest.register_globalstep(function(dtime) - timer = timer + dtime - if timer < 1 then return end - for _, player in pairs(minetest.get_connected_players()) do - local pos = player:get_pos() - for _, obj in pairs(minetest.get_objects_inside_radius(pos, 47)) do - local lua = obj:get_luaentity() - if lua and lua.is_mob then - lua.lifetimer = math.max(20, lua.lifetimer) - lua.despawn_immediately = false - end - end - end - timer = 0 -end) diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt deleted file mode 100644 index b9b6613b6a..0000000000 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ /dev/null @@ -1,796 +0,0 @@ - -Mobs Redo: MineClone 2 Edition -API documentation -============================== - -Welcome to the world of mobs in Minetest and hopefully an easy guide to defining -your own mobs and having them appear in your worlds. - - -Registering Mobs ----------------- - -To register a mob and have it ready for use requires the following function: - - mobs:register_mob(name, definition) - -The 'name' of a mob usually starts with the mod name it's running from followed -by it's own name e.g. - - "mobs_monster:sand_monster" or "mymod:totally_awesome_beast" - -... and the 'definition' is a table which holds all of the settings and -functions needed for the mob to work properly which contains the following: - - 'nametag' contains the name which is shown above mob. - 'type' holds the type of mob that inhabits your world e.g. - "animal" usually docile and walking around. - "monster" attacks player or npc on sight. - "npc" walk around and will defend themselves if hit first, they - kill monsters. - 'hp_min' the minimum health value the mob can spawn with. - 'hp_max' the maximum health value the mob can spawn with. - 'breath_max' The maximum breath value the mob can spawn with and can have. - If -1 (default), mob does not take drowning damage. - 'breathes_in_water' If true, mob loses breath when not in water. Otherwise, - mob loses breath when inside a node with `drowning` attribute - set (default: false). - 'armor' entity armor groups (see lua_api.txt). If table, a list of - armor groups like for entities. If number, set value of - 'fleshy' armor group only. - Note: The 'immortal=1' armor group will automatically be added - since this mod handles health and damage manually. - Default: 100 (mob will take full dmg from 'fleshy' hits) - 'passive' when true allows animals to defend themselves when hit, - otherwise they amble onwards. - 'walk_velocity' is the speed that your mob can walk around. - 'run_velocity'is the speed your mob can run with, usually when attacking. - 'walk_chance' has a 0-100 chance value your mob will walk from standing, - set to 0 for jumping mobs only. - 'jump' when true allows your mob to jump updwards. - 'jump_height' holds the height your mob can jump, 0 to disable jumping. - 'stepheight' height of a block that your mob can easily walk up onto, - defaults to 0.6. - 'fly' when true allows your mob to fly around instead of walking. - 'fly_in' holds the node name or a table of node names in which the - mob flies (or swims) around in. The special name - '__airlike' stands for all nodes with 'walkable=false' - that are not liquids - 'runaway' if true causes animals to turn and run away when hit. - 'view_range' how many nodes in distance the mob can see a player. - 'damage' how many health points the mob does to a player or another - mob when melee attacking. - 'knock_back' when true has mobs falling backwards when hit, the greater - the damage the more they move back. - 'fear_height' is how high a cliff or edge has to be before the mob stops - walking, 0 to turn off height fear. - 'fall_speed' has the maximum speed the mob can fall at, default is -10. - 'fall_damage' when true causes falling to inflict damage. - 'water_damage'holds the damage per second infliced to mobs when standing in - water (default: 0). - 'lava_damage' holds the damage per second inflicted to mobs when standing - in lava (default: 8). - 'fire_damage' holds the damage per second inflicted to mobs when standing - in fire (default: 1). - 'light_damage'holds the damage per second inflicted to mobs when it's too - bright (above 13 light). - 'suffocation' when true causes mobs to suffocate inside solid blocks (2 damage per second). - 'floats' when set to 1 mob will float in water, 0 has them sink. - 'follow' mobs follow player when holding any of the items which appear - on this table, the same items can be fed to a mob to tame or - breed e.g. {"farming:wheat", "default:apple"} - - 'reach' is how far the mob can attack player when standing - nearby, default is 3 nodes. - 'docile_by_day' when true has mobs wandering around during daylight - hours and only attacking player at night or when - provoked. - 'attacks_monsters' when true has npc's attacking monsters or not. - 'attack_animals' when true will have monsters attacking animals. - 'owner_loyal' when true will have tamed mobs attack anything player - punches when nearby. - 'group_attack' when true has same mob type grouping together to attack - offender. - [MCL2 extension:] When a table, this is a list of - mob types that will get alerted as well (besides same mob type) - 'attack_type' tells the api what a mob does when attacking the player - or another mob: - 'dogfight' is a melee attack when player is within mob reach. - 'shoot' has mob shoot pre-defined arrows at player when inside - view_range. - 'dogshoot' has melee attack when inside reach and shoot attack - when inside view_range. - 'explode' causes mob to stop and explode when inside reach. - 'explosion_radius' the radius of explosion node destruction, - defaults to 1 - 'explosion_damage_radius' the radius of explosion entity & player damage, - defaults to explosion_radius * 2 - 'explosion_timer' number of seconds before mob explodes while its target - is still inside reach or explosion_damage_radius, - defaults to 3. - 'explosiontimer_reset_radius' The distance you must travel before the timer will be reset. - 'allow_fuse_reset' Allow 'explode' attack_type to reset fuse and resume - chasing if target leaves the blast radius or line of - sight. Defaults to true. - 'stop_to_explode' When set to true (default), mob must stop and wait for - explosion_timer in order to explode. If false, mob will - continue chasing. - 'arrow' holds the pre-defined arrow object to shoot when - attacking. - 'dogshoot_switch' allows switching between attack types by using timers - (1 for shoot, 2 for dogfight) - 'dogshoot_count_max'contains how many seconds before switching from - dogfight to shoot. - 'dogshoot_count2_max' contains how many seconds before switching from shoot - to dogfight. - 'shoot_interval' has the number of seconds between shots. - 'shoot_offset' holds the y position added as to where the - arrow/fireball appears on mob. - 'specific_attack' has a table of entity names that mob can also attack - e.g. {"player", "mobs_animal:chicken"}. - 'runaway_from' contains a table with mob names to run away from, add - "player" to list to runaway from player also. - 'pathfinding' set to 1 for mobs to use pathfinder feature to locate - player, set to 2 so they can build/break also (only - works with dogfight attack and when 'mobs_griefing' - in minetest.conf is not false). - 'immune_to' is a table that holds specific damage when being hit by - certain items e.g. - {"default:sword_wood",0} -- causes no damage. - {"default:gold_lump", -10} -- heals by 10 health points. - {"default:coal_block", 20} -- 20 damage when hit on head with coal blocks. - - 'makes_footstep_sound' when true you can hear mobs walking. - 'sounds' this is a table with sounds of the mob - 'distance' maximum distance sounds can be heard, default is 10. - 'base_pitch' base pitch to use adult mobs, default is 1.0 (MCL2 extension) - 'random' played randomly from time to time. - also played for overfeeding animal. - 'eat' played when mob eats something - 'war_cry' what you hear when mob starts to attack player. (currently disabled) - 'attack' what you hear when being attacked. - 'shoot_attack' sound played when mob shoots. - 'damage' sound heard when mob is hurt. - 'death' played when mob is killed. - 'jump' played when mob jumps. There's a built-in cooloff timer to avoid sound spam - 'flop' played when mob flops (like a stranded fish) - 'fuse' sound played when mob explode timer starts. - 'explode' sound played when mob explodes. - - Note: For all sounds except fuse and explode, the pitch is slightly randomized from the base pitch - The pitch of children is 50% higher. - - 'drops' table of items that are dropped when mob is killed, fields are: - 'name' name of item to drop. - 'chance' chance of drop, 1 for always, 2 for 1-in-2 chance etc. - 'min' minimum number of items dropped. - 'max' maximum number of items dropped. - - 'visual' holds the look of the mob you wish to create: - 'cube' looks like a normal node - 'sprite' sprite which looks same from all angles. - 'upright_sprite' flat model standing upright. - 'wielditem' how it looks when player holds it in hand. - 'mesh' uses separate object file to define mob. - 'visual_size' has the size of the mob, defaults to {x = 1, y = 1} - 'collisionbox' has the box in which mob can be interacted with the - world e.g. {-0.5, -0.5, -0.5, 0.5, 0.8, 0.5}. - NOTE: Due to a workaround, the upper Y coordinate will be forced - to a minimum value of 0.79. - 'selectionbox' has the box in which player can interact with mob - 'textures' holds a table list of textures to be used for mob, or you - could use multiple lists inside another table for random - selection e.g. { {"texture1.png"}, {"texture2.png"} } - 'child_texture' holds the texture table for when baby mobs are used. - 'gotten_texture' holds the texture table for when self.gotten value is - true, used for milking cows or shearing sheep. - 'mesh' holds the name of the external object used for mob model - e.g. "mobs_cow.b3d" - 'gotten_mesh" holds the name of the external object used for when - self.gotten is true for mobs. - 'rotate' custom model rotation, 0 = front, 90 = side, 180 = back, - 270 = other side. - 'double_melee_attack' when true has the api choose between 'punch' and - 'punch2' animations. - - 'animation' holds a table containing animation names and settings for use with mesh models: - { - 'stand_start'start frame for when mob stands still. - 'stand_end' end frame of stand animation. - 'stand_speed'speed of animation in frames per second. - 'walk_start' when mob is walking around. - 'walk_end' - 'walk_speed' - 'run_start' when a mob runs or attacks. - 'run_end' - 'run_speed' - 'fly_start' when a mob is flying. - 'fly_end' - 'fly_speed' - 'punch_start'when a mob melee attacks. - 'punch_end' - 'punch_speed' - 'punch2_start' alternative melee attack animation. - 'punch2_end' - 'punch2_speed' - 'shoot_start'shooting animation. - 'shoot_end' - 'shoot_speed' - 'die_start' death animation - 'die_end' - 'die_speed' - 'die_loop' when set to false stops the animation looping. - } - - Using '_loop = false' setting will stop any of the above animations from - looping. - - 'speed_normal' is used for animation speed for compatibility with some - older mobs. - 'pushable' Allows players, & other mobs to push the mob. - - - - MineClone 2 extensions: - - 'spawn_class' Classification of mod for the spawning algorithm: - "hostile", "passive", "ambient" or "water" - 'ignores_nametag' if true, mob cannot be named by nametag - 'rain_damage' damage per second if mob is standing in rain (default: 0) - 'sunlight_damage' holds the damage per second inflicted to mobs when they - are in direct sunlight - 'spawn_small_alternative' name of a smaller mob to use as replacement if - spawning fails due to space requirements - 'glow' same as in entity definition - 'child' if true, spawn mob as child - 'shoot_arrow(self, pos, dir)' function that is called when mob wants to shoot an arrow. - You can spawn your own arrow here. pos is mob position, - dir is mob's aiming direction - 'sounds_child' same as sounds, but for childs. If not defined, childs will use same - sound as adults but with higher pitch - 'follow_velocity' The speed at which a mob moves toward the player when they're holding the appropriate follow item. - 'instant_death' If true, mob dies instantly (no death animation or delay) (default: false) - 'xp_min' the minimum XP it drops on death (default: 0) - 'xp_max' the maximum XP it drops on death (default: 0) - 'fire_resistant' If true, the mob can't burn - 'fire_damage_resistant' If true the mob will not take damage when burning - 'ignited_by_sunlight' If true the mod will burn at daytime. (Takes sunlight_damage per second) - 'nofollow' Do not follow players when they wield the "follow" item. For mobs (like villagers) - that are bred in a different way. - 'pick_up' table of itemstrings the mob will pick up (e.g. for breeding) - 'on_pick_up' function that will be called on item pickup - return true to not pickup the item - - mobs:gopath(self,target,callback_arrived) pathfind a way to target and run callback on arrival - - - -Node Replacement ----------------- - -Mobs can look around for specific nodes as they walk and replace them to mimic -eating. - - 'replace_what' group of items to replace e.g. - {"farming:wheat_8", "farming:carrot_8"} - or you can use the specific options of what, with and - y offset by using this instead: - { - {"group:grass", "air", 0}, - {"default:dirt_with_grass", "default:dirt", -1} - } - 'replace_with' replace with what e.g. "air" or in chickens case "mobs:egg" - 'replace_rate' how random should the replace rate be (typically 10) - 'replace_offset' +/- value to check specific node to replace - - 'on_replace(self, pos, oldnode, newnode)' - is called when mob is about to replace a node. Also called - when not actually replacing due to mobs_griefing setting being false. - 'self' ObjectRef of mob - 'pos' Position of node to replace - 'oldnode' Current node - 'newnode' What the node will become after replacing - - If false is returned, the mob will not replace the node. - - By default, replacing sets self.gotten to true and resets the object - properties. - - -Custom Definition Functions ---------------------------- - -Along with the above mob registry settings we can also use custom functions to -enhance mob functionality and have them do many interesting things: - - 'on_die' a function that is called when the mob is killed; the - parameters are (self, pos). Return true to skip the builtin - death animation and death effects - 'on_rightclick'its same as in minetest.register_entity() - 'on_blast' is called when an explosion happens near mob when using TNT - functions, parameters are (object, damage) and returns - (do_damage, do_knockback, drops) - 'on_spawn' is a custom function that runs on mob spawn with 'self' as - variable, return true at end of function to run only once. - 'after_activate' is a custom function that runs once mob has been activated - with these paramaters (self, staticdata, def, dtime) - 'on_breed' called when two similar mobs breed, paramaters are - (parent1, parent2) objects, return false to stop child from - being resized and owner/tamed flags and child textures being - applied.Function itself must spawn new child mob. - 'on_grown' is called when a child mob has grown up, only paramater is - (self). - 'do_punch' called when mob is punched with paramaters (self, hitter, - time_from_last_punch, tool_capabilities, direction), return - false to stop punch damage and knockback from taking place. - 'custom_attack'when set this function is called instead of the normal mob - melee attack, parameters are (self, to_attack). - 'on_die' a function that is called when mob is killed (self, pos) - 'do_custom' a custom function that is called every tick while mob is - active and which has access to all of the self.* variables - e.g. (self.health for health or self.standing_in for node - status), return with 'false' to skip remainder of mob API. - - -Internal Variables ------------------- - -The mob api also has some preset variables and functions that it will remember -for each mob. - - 'self.health' contains current health of mob (cannot exceed - self.hp_max) - 'self.breath' contains current breath of mob, if mob takes drowning - damage at all (cannot exceed self.breath_max). Breath - decreases by 1 each second while in a node with drowning - damage and increases by 1 each second otherwise. - 'self.texture_list'contains list of all mob textures - 'self.child_texture' contains mob child texture when growing up - 'self.base_texture'contains current skin texture which was randomly - selected from textures list - 'self.gotten' this is used to track whether some special item has been - gotten from the mob, for example, wool from sheep. - Initialized as false, and the mob must set this value - manually. - 'self.horny' when animal fed enough it is set to true and animal can - breed with same animal - 'self.hornytimer' background timer that controls breeding functions and - mob childhood timings - 'self.child' used for when breeding animals have child, will use - child_texture and be half size - 'self.owner' string used to set owner of npc mobs, typically used for - dogs - 'self.order' set to "follow" or "stand" so that npc will follow owner - or stand it's ground - 'self.state' Current mob state. - "stand": no movement (except turning around) - "walk": walk or move around aimlessly - "attack": chase and attack enemy - "runaway": flee from target - "flop": bounce around aimlessly - (for swimming mobs that have stranded) - "die": during death - 'self.nametag' contains the name of the mob which it can show above - - -Spawning Mobs in World ----------------------- - -mobs:register_spawn(name, nodes, max_light, min_light, chance, - active_object_count, max_height, day_toggle) - -mobs:spawn_specfic(name, nodes, neighbors, min_light, max_light, interval, - chance, active_object_count, min_height, max_height, day_toggle, on_spawn) - -These functions register a spawn algorithm for the mob. Without this function -the call the mobs won't spawn. - - 'name' is the name of the animal/monster - 'nodes' is a list of nodenames on that the animal/monster can - spawn on top of - 'neighbors' is a list of nodenames on that the animal/monster will - spawn beside (default is {"air"} for - mobs:register_spawn) - 'max_light' is the maximum of light - 'min_light' is the minimum of light - 'interval' is same as in register_abm() (default is 30 for - mobs:register_spawn) - 'chance' is same as in register_abm() - 'active_object_count' number of this type of mob to spawn at one time inside - map area - 'min_height' is the minimum height the mob can spawn - 'max_height' is the maximum height the mob can spawn - 'day_toggle' true for day spawning, false for night or nil for - anytime - 'on_spawn' is a custom function which runs after mob has spawned - and gives self and pos values. - -A simpler way to handle mob spawns has been added with the mobs:spawn(def) -command which uses above names to make settings clearer: - - mobs:spawn({name = "mobs_monster:tree_monster", - nodes = {"group:leaves"}, - max_light = 7, - }) - - -For each mob that spawns with this function is a field in mobs.spawning_mobs. -It tells if the mob should spawn or not.Default is true.So other mods can -only use the API of this mod by disabling the spawning of the default mobs in -this mod. - - -mobs:spawn_abm_check(pos, node, name) - -This global function can be changed to contain additional checks for mobs to -spawn e.g. mobs that spawn only in specific areas and the like.By returning -true the mob will not spawn. - - 'pos' holds the position of the spawning mob - 'node' contains the node the mob is spawning on top of - 'name' is the name of the animal/monster - - -MineClone 2 extensions ----------------------- - -mobs:spawn_child(pos, mob_type) - -This function spawns a mob as a child. The parameter mob_type is the -entitystring of the new mob. -This function returns the mob on success and nil otherwise. - -mobs:death_effect(pos, collisionbox) - -Create death particles at pos with the given collisionbox. - - -Making Arrows -------------- - -mobs:register_arrow(name, definition) - -This function registers a arrow for mobs with the attack type shoot. - - 'name' is the name of the arrow - 'definition' is a table with the following values: - 'visual' same is in minetest.register_entity() - 'visual_size'same is in minetest.register_entity() - 'textures' same is in minetest.register_entity() - 'velocity' the velocity of the arrow - 'drop' if set to true any arrows hitting a node will drop as item - 'hit_player' a function that is called when the arrow hits a player; - this function should hurt the player, the parameters are - (self, player) - 'hit_mob' a function that is called when the arrow hits a mob; - this function should hurt the mob, the parameters are - (self, mob) - 'hit_object' a function that is called when the arrow hits an object - that is neither a player nor a mob. this function should - hurt the object, the parameters are (self, object) - 'hit_node' a function that is called when the arrow hits a node, the - parameters are (self, pos, node) - 'tail' when set to 1 adds a trail or tail to mob arrows - 'tail_texture' texture string used for above effect - 'tail_size' has size for above texture (defaults to between 5 and 10) - 'expire' contains float value for how long tail appears for - (defaults to 0.25) - 'glow' has value for how brightly tail glows 1 to 10 (default is - 0 for no glow) - 'rotate' integer value in degrees to rotate arrow - 'on_step' is a custom function when arrow is active, nil for - default. - - -Spawn Eggs ----------- - -mobs:register_egg(name, description, background, addegg, no_creative) - -This function registers a spawn egg which can be used by admin to properly spawn in a mob. - - 'name' this is the name of your new mob to spawn e.g. "mob:sheep" - 'description' the name of the new egg you are creating e.g. "Spawn Sheep" - 'background'the texture displayed for the egg in inventory - 'addegg' would you like an egg image in front of your texture (1 = yes, - 0 = no) - 'no_creative' when set to true this stops spawn egg appearing in creative - mode for destructive mobs like Dungeon Masters. - - -Explosion Function ------------------- - -mobs:boom(self, pos, radius) - 'self' mob entity - 'pos' centre position of explosion - 'radius' radius of explosion (typically set to 3) - -This function generates an explosion which removes nodes in a specific radius -and damages any entity caught inside the blast radius.Protection will limit -node destruction but not entity damage. - - -mobs:capture_mob ----------------- - -mobs:capture_mob(...) - -Does nothing and returns false. - -This function is provided for compability with Mobs Redo for an attempt to -capture a mob. -Mobs cannot be captured in MineClone 2. - -In Mobs Redo, this is generally called inside the on_rightclick section of the mob -api code, it provides a chance of capturing the mob. See Mobs Redo documentation -of parameters. - -Feeding and Taming/Breeding ---------------------------- - -mobs:feed_tame(self, clicker, feed_count, breed, tame) - -This function allows the mob to be fed the item inside self.follow be it apple, -wheat or whatever a set number of times and be tamed or bred as a result. -Will return true when mob is fed with item it likes. - - 'self' mob information - 'clicker' player information - 'feed_count' number of times mob must be fed to tame or breed - 'breed' true or false stating if mob can be bred and a child created - afterwards - 'tame' true or false stating if mob can be tamed so player can pick - them up - - -Protecting Mobs ---------------- - -mobs:protect(self, clicker) - -This function can be used to right-click any tamed mob with mobs:protector item, -this will protect the mob from harm inside of a protected area from other -players.Will return true when mob right-clicked with mobs:protector item. - - 'self' mob information - 'clicker' player information - - -Riding Mobs ------------ - -Mobs can now be ridden by players and the following shows its functions and -usage: - - -mobs:attach(self, player) - -This function attaches a player to the mob so it can be ridden. - - 'self' mob information - 'player' player information - - -mobs:detach(player, offset) - -This function will detach the player currently riding a mob to an offset -position. - - 'player' player information - 'offset' position table containing offset values - - -mobs:drive(self, move_animation, stand_animation, can_fly, dtime) - -This function allows an attached player to move the mob around and animate it at -same time. - - 'self' mob information - 'move_animation'string containing movement animation e.g. "walk" - 'stand_animation' string containing standing animation e.g. "stand" - 'can_fly' if true then jump and sneak controls will allow mob to fly - up and down - 'dtime' tick time used inside drive function - - -mobs:fly(self, dtime, speed, can_shoot, arrow_entity, move_animation, stand_animation) - -This function allows an attached player to fly the mob around using directional -controls. - - 'self' mob information - 'dtime' tick time used inside fly function - 'speed' speed of flight - 'can_shoot' true if mob can fire arrow (sneak and left mouse button - fires) - 'arrow_entity' name of arrow entity used for firing - 'move_animation'string containing name of pre-defined animation e.g. "walk" - or "fly" etc. - 'stand_animation' string containing name of pre-defined animation e.g. - "stand" or "blink" etc. - -Note: animation names above are from the pre-defined animation lists inside mob -registry without extensions. - - -mobs:set_animation(self, name) - -This function sets the current animation for mob, defaulting to "stand" if not -found. - - 'self' mob information - 'name' name of animation - - -Certain variables need to be set before using the above functions: - - 'self.v2' toggle switch used to define below values for the - first time - 'self.max_speed_forward' max speed mob can move forward - 'self.max_speed_reverse' max speed mob can move backwards - 'self.accel' acceleration speed - 'self.terrain_type' integer containing terrain mob can walk on - (1 = water, 2 or 3 = land) - 'self.driver_attach_at'position offset for attaching player to mob - 'self.driver_eye_offset' position offset for attached player view - 'self.driver_scale' sets driver scale for mobs larger than {x=1, y=1} - - -External Settings for "minetest.conf" ------------------------------------- - - 'enable_damage' if true monsters will attack players (default is true) - 'only_peaceful_mobs' if true only animals will spawn in game (default is - false) - 'mobs_disable_blood' if false, damage effects appear when mob is hit (default - is false) - 'mobs_spawn_protected' if set to false then mobs will not spawn in protected - areas (default is true) - 'mob_difficulty' sets difficulty level (health and hit damage - multiplied by this number), defaults to 1.0. - 'mob_spawn_chance' multiplies chance of all mobs spawning and can be set - to 0.5 to have mobs spawn more or 2.0 to spawn less. - e.g.1 in 7000 * 0.5 = 1 in 3500 so better odds of - spawning. - 'mobs_spawn' if false then mobs no longer spawn without spawner or - spawn egg. - 'mobs_drop_items' when false mobs no longer drop items when they die. - 'mobs_griefing' when false mobs cannot break blocks when using either - pathfinding level 2, replace functions or mobs:boom - function. - -Players can override the spawn chance for each mob registered by adding a line -to their minetest.conf file with a new value, the lower the value the more each -mob will spawn e.g. - -mobs_animal:sheep_chance 11000 -mobs_monster:sand_monster_chance 100 - - -Rideable Horse Example Mob --------------------------- - -mobs:register_mob("mob_horse:horse", { - type = "animal", - visual = "mesh", - visual_size = {x = 1.20, y = 1.20}, - mesh = "mobs_horse.x", - collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.25, 0.4}, - animation = { - speed_normal = 15, - speed_run = 30, - stand_start = 25, - stand_end = 75, - walk_start = 75, - walk_end = 100, - run_start = 75, - run_end = 100, - }, - textures = { - {"mobs_horse.png"}, - {"mobs_horsepeg.png"}, - {"mobs_horseara.png"} - }, - fear_height = 3, - runaway = true, - fly = false, - walk_chance = 60, - view_range = 5, - follow = {"farming:wheat"}, - passive = true, - hp_min = 12, - hp_max = 16, - armor = 200, - lava_damage = 5, - fall_damage = 5, - water_damage = 1, - makes_footstep_sound = true, - drops = { - {name = "mobs:meat_raw", chance = 1, min = 2, max = 3} - }, - sounds = { - random = "horse_neigh.ogg", - damage = "horse_whinney.ogg", - }, - - 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 = 20, z = -2} - self.driver_eye_offset = {x = 0, y = 3, z = 0} - self.driver_scale = {x = 1, y = 1} - 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}) - 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 - - -- make sure tamed horse is being clicked by owner only - if self.tamed and self.owner == clicker:get_player_name() then - - local inv = clicker:get_inventory() - - -- 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 - - -- attach player to horse - elseif not self.driver - and clicker:get_wielded_item():get_name() == "mobs:saddle" then - - self.object:set_properties({stepheight = 1.1}) - mobs.attach(self, clicker) - - -- take saddle from inventory - inv:remove_item("main", "mobs:saddle") - end - end - - -- used to capture horse with magic lasso - mobs:capture_mob(self, clicker, 0, 0, 80, false, nil) - end -}) diff --git a/mods/ENTITIES/mcl_mobs/crafts.lua b/mods/ENTITIES/mcl_mobs/crafts.lua deleted file mode 100644 index e8a5b60fc2..0000000000 --- a/mods/ENTITIES/mcl_mobs/crafts.lua +++ /dev/null @@ -1,16 +0,0 @@ - -local S = minetest.get_translator("mcl_mobs") - --- name tag -minetest.register_craftitem("mcl_mobs:nametag", { - description = S("Name Tag"), - _tt_help = S("Give names to mobs").."\n"..S("Set name at anvil"), - _doc_items_longdesc = S("A name tag is an item to name a mob."), - _doc_items_usagehelp = S("Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag."), - inventory_image = "mobs_nametag.png", - wield_image = "mobs_nametag.png", - stack_max = 64, - groups = { tool=1 }, -}) - -minetest.register_alias("mobs:nametag", "mcl_mobs:nametag") diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua deleted file mode 100644 index 69246b4706..0000000000 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ /dev/null @@ -1,14 +0,0 @@ - -local path = minetest.get_modpath(minetest.get_current_modname()) - --- Mob API -dofile(path .. "/api.lua") - --- Spawning Algorithm -dofile(path .. "/spawning.lua") - --- Rideable Mobs -dofile(path .. "/mount.lua") - --- Mob Items -dofile(path .. "/crafts.lua") \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/license.txt b/mods/ENTITIES/mcl_mobs/license.txt deleted file mode 100644 index fec6f6aa51..0000000000 --- a/mods/ENTITIES/mcl_mobs/license.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 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. diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr deleted file mode 100644 index 3b1a310bf1..0000000000 --- a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.de.tr +++ /dev/null @@ -1,11 +0,0 @@ -# textdomain: mcl_mobs -Peaceful mode active! No monsters will spawn.=Friedlicher Modus aktiv! Es werden keine Monster auftauchen. -This allows you to place a single mob.=Damit kann man einen Mob platzieren. -Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Platzieren Sie dies einfach dort, wo der Mob auftauchen soll. Tiere werden zahm erscheinen, außer, wenn Sie beim Platzieren die Schlichtaste drücken. Platzieren Sie dies auf einem Mobspawner, um den Mob im Mobspawner zu wechseln. -You need the “maphack” privilege to change the mob spawner.=Sie brauchen das „maphack“-Privileg, um den Mobspawner ändern zu können. -Name Tag=Namensschild -A name tag is an item to name a mob.=Ein Namensschild ist ein Gegenstand, um einen Mob zu benennen. -Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Bevor Sie ein Namensschild benutzen können, müssen Sie ihn an einem Amboss benennen. Dann können können Sie das Namensschild benutztn, um einen Mob zu benennen. Das wird das Namensschild verbrauchen. -Only peaceful mobs allowed!=Nur friedliche Mobs erlaubt! -Give names to mobs=Benennt Mobs -Set name at anvil=Namen am Amboss setzen diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.es.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.es.tr deleted file mode 100644 index ef067141f1..0000000000 --- a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.es.tr +++ /dev/null @@ -1,9 +0,0 @@ -# textdomain: mcl_mobs -Peaceful mode active! No monsters will spawn.=¡Modo pacífico activo! No aparecerán monstruos. -This allows you to place a single mob.=Esto le permite colocar un solo animal. -Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Simplemente colóquelo donde desea que aparezcan los animales. Los animales aparecerán domesticados, a menos que mantenga presionada la tecla de sigilo mientras coloca. Si coloca esto en un engendrador de animales, cambia el animal que genera. -You need the “maphack” privilege to change the mob spawner.=Necesita el privilegio "maphack" para cambiar el generador de animales. -Name Tag=Etiqueta -A name tag is an item to name a mob.=Una etiqueta es un elemento para nombrar una animal. -Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Antes de usar la etiqueta, debe establecer un nombre en un yunque. Luego puede usar la etiqueta para nombrar un animal. Esto usa la etiqueta. -Only peaceful mobs allowed!=¡Solo se permiten animales pacíficos! diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr deleted file mode 100644 index 96ac6a8172..0000000000 --- a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.fr.tr +++ /dev/null @@ -1,11 +0,0 @@ -# textdomain: mcl_mobs -Peaceful mode active! No monsters will spawn.=Mode paisible actif! Aucun monstre n'apparaîtra. -This allows you to place a single mob.=Cela vous permet de placer un seul mob. -Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Placez-le là où vous voulez que le mob apparaisse. Les animaux apparaîtront apprivoisés, sauf si vous maintenez la touche furtive enfoncée pendant le placement. Si vous le placez sur un générateur de mob, vous changez le mob qu'il génère. -You need the “maphack” privilege to change the mob spawner.=Vous avez besoin du privilège "maphack" pour changer le générateur de mob. -Name Tag=Étiquette de nom -A name tag is an item to name a mob.=Une étiquette de nom est un élément pour nommer un mob. -Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Avant d'utiliser l'étiquette de nom, vous devez définir un nom sur une enclume. Ensuite, vous pouvez utiliser l'étiquette de nom pour nommer un mob. Cela utilise l'étiquette de nom. -Only peaceful mobs allowed!=Seuls les mobs pacifiques sont autorisées! -Give names to mobs=Donne des noms aux mobs -Set name at anvil=Définir le nom sur l'enclume diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr deleted file mode 100644 index 3fb2eb2f1c..0000000000 --- a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr +++ /dev/null @@ -1,11 +0,0 @@ -# textdomain: mcl_mobs -Peaceful mode active! No monsters will spawn.=Мирный режим включён! Монстры не будут появляться. -This allows you to place a single mob.=Позволяет вам разместить одного моба. -Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Просто поместите это туда, где хотите, чтобы появился моб. Животные будут появляться уже прирученные, если это не нужно, удерживайте клавишу [Красться] при размещении. Если поместить это на спаунер, появляющийся из него моб будет изменён. -You need the “maphack” privilege to change the mob spawner.=Вам нужно обладать привилегией “maphack”, чтобы изменить спаунер моба. -Name Tag=Именная бирка -A name tag is an item to name a mob.=Именная бирка это предмет, чтобы дать мобу имя. -Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Прежде чем использовать именную бирку, нужно задать имя на наковальне. Тогда вы сможете использовать бирку, чтобы дать имя мобу. -Only peaceful mobs allowed!=Разрешены только мирные мобы! -Give names to mobs=Даёт имена мобам -Set name at anvil=Задайте имя при помощи наковальни diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.zh_TW.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.zh_TW.tr deleted file mode 100644 index 90d24fd21f..0000000000 --- a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.zh_TW.tr +++ /dev/null @@ -1,11 +0,0 @@ -# textdomain: mcl_mobs -Peaceful mode active! No monsters will spawn.=和平模式已啓用!不會生成怪物。 -This allows you to place a single mob.=允許你放置一個生物。 -Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=把它放在你希望生物出現的地方。除非你在放置的時候按住潛行鍵,否則動物會被馴服地產生。如果你把它放在一個生怪磚上,你就會改變它所產的生物。 -You need the “maphack” privilege to change the mob spawner.=你要「maphack」權限來修改生怪磚。 -Name Tag=命名牌 -A name tag is an item to name a mob.=命名牌是一個用於命名生物的物品 -Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=在使用名字標籤之前,你需要在一個鐵砧上設置一個名字。然後你就可以用名字標籤來給生物命名。這會消耗命名牌。 -Only peaceful mobs allowed!=只允許和平生物! -Give names to mobs=替生物命名 -Set name at anvil=在鐵砧上設置名字 diff --git a/mods/ENTITIES/mcl_mobs/locale/template.txt b/mods/ENTITIES/mcl_mobs/locale/template.txt deleted file mode 100644 index e24974a412..0000000000 --- a/mods/ENTITIES/mcl_mobs/locale/template.txt +++ /dev/null @@ -1,11 +0,0 @@ -# textdomain: mcl_mobs -Peaceful mode active! No monsters will spawn.= -This allows you to place a single mob.= -Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.= -You need the “maphack” privilege to change the mob spawner.= -Name Tag= -A name tag is an item to name a mob.= -Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.= -Only peaceful mobs allowed!= -Give names to mobs= -Set name at anvil= diff --git a/mods/ENTITIES/mcl_mobs/lucky_block.lua b/mods/ENTITIES/mcl_mobs/lucky_block.lua deleted file mode 100644 index ea90de74ac..0000000000 --- a/mods/ENTITIES/mcl_mobs/lucky_block.lua +++ /dev/null @@ -1,8 +0,0 @@ - -if minetest.get_modpath("lucky_block") then - - lucky_block:add_blocks({ - {"dro", {"mcl_mobs:nametag"}, 1}, - {"lig"}, - }) -end diff --git a/mods/ENTITIES/mcl_mobs/mod.conf b/mods/ENTITIES/mcl_mobs/mod.conf deleted file mode 100644 index 0d622f6a9a..0000000000 --- a/mods/ENTITIES/mcl_mobs/mod.conf +++ /dev/null @@ -1,5 +0,0 @@ -name = mcl_mobs -author = PilzAdam -description = Adds a mob API for mods to add animals or monsters, etc. -depends = mcl_particles -optional_depends = mcl_weather, mcl_explosions, mcl_hunger, mcl_worlds, invisibility, lucky_block, cmi, doc_identifier, mcl_armor, mcl_portals, mcl_experience diff --git a/mods/ENTITIES/mcl_mobs/mount.lua b/mods/ENTITIES/mcl_mobs/mount.lua deleted file mode 100644 index 3944613a59..0000000000 --- a/mods/ENTITIES/mcl_mobs/mount.lua +++ /dev/null @@ -1,448 +0,0 @@ - --- lib_mount by Blert2112 (edited by TenPlus1) - -local enable_crash = false -local crash_threshold = 6.5 -- ignored if enable_crash=false - ------------------------------------------------------------------------------- - --- --- Helper functions --- - -local node_ok = function(pos, fallback) - - fallback = fallback or mcl_mobs.fallback_node - - local node = minetest.get_node_or_nil(pos) - - if node and minetest.registered_nodes[node.name] then - return node - end - - return {name = fallback} -end - - -local function node_is(pos) - - local node = node_ok(pos) - - if node.name == "air" then - return "air" - end - - if minetest.get_item_group(node.name, "lava") ~= 0 then - return "lava" - end - - if minetest.get_item_group(node.name, "liquid") ~= 0 then - return "liquid" - end - - if minetest.registered_nodes[node.name].walkable == true then - return "walkable" - end - - return "other" -end - - -local function get_sign(i) - - i = i or 0 - - if i == 0 then - return 0 - else - return i / math.abs(i) - end -end - - -local function get_velocity(v, yaw, y) - - local x = -math.sin(yaw) * v - local z = math.cos(yaw) * v - - return {x = x, y = y, z = z} -end - - -local function get_v(v) - return math.sqrt(v.x * v.x + v.z * v.z) -end - - -local function force_detach(player) - - local attached_to = player:get_attach() - - if not attached_to then - return - end - - local entity = attached_to:get_luaentity() - - if entity.driver - and entity.driver == player then - - entity.driver = nil - end - - player:set_detach() - mcl_player.player_attached[player:get_player_name()] = false - player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) - mcl_player.player_set_animation(player, "stand" , 30) - player:set_properties({visual_size = {x = 1, y = 1} }) - -end - -------------------------------------------------------------------------------- - - -minetest.register_on_leaveplayer(function(player) - force_detach(player) -end) - -minetest.register_on_shutdown(function() - local players = minetest.get_connected_players() - for i = 1, #players do - force_detach(players[i]) - end -end) - -minetest.register_on_dieplayer(function(player) - force_detach(player) - return true -end) - -------------------------------------------------------------------------------- - -function mcl_mobs.attach(entity, player) - - local attach_at, eye_offset - - entity.player_rotation = entity.player_rotation or {x = 0, y = 0, z = 0} - entity.driver_attach_at = entity.driver_attach_at or {x = 0, y = 0, z = 0} - entity.driver_eye_offset = entity.driver_eye_offset or {x = 0, y = 0, z = 0} - entity.driver_scale = entity.driver_scale or {x = 1, y = 1} - - local rot_view = 0 - - if entity.player_rotation.y == 90 then - rot_view = math.pi/2 - end - - attach_at = entity.driver_attach_at - eye_offset = entity.driver_eye_offset - entity.driver = player - - force_detach(player) - - player:set_attach(entity.object, "", attach_at, entity.player_rotation) - mcl_player.player_attached[player:get_player_name()] = true - player:set_eye_offset(eye_offset, {x = 0, y = 0, z = 0}) - - player:set_properties({ - visual_size = { - x = entity.driver_scale.x, - y = entity.driver_scale.y - } - }) - - minetest.after(0.2, function(name) - local player = minetest.get_player_by_name(name) - if player then - mcl_player.player_set_animation(player, "sit_mount" , 30) - end - end, player:get_player_name()) - - player:set_look_horizontal(entity.object:get_yaw() - rot_view) -end - - -function mcl_mobs.detach(player, offset) - - force_detach(player) - - mcl_player.player_set_animation(player, "stand" , 30) - - --local pos = player:get_pos() - - --pos = {x = pos.x + offset.x, y = pos.y + 0.2 + offset.y, z = pos.z + offset.z} - - player:add_velocity(vector.new(math.random(-6,6),math.random(5,8),math.random(-6,6))) --throw the rider off - - --[[ - minetest.after(0.1, function(name, pos) - local player = minetest.get_player_by_name(name) - if player then - player:set_pos(pos) - end - end, player:get_player_name(), pos) - ]]-- -end - - -function mcl_mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) - - local rot_view = 0 - - if entity.player_rotation.y == 90 then - rot_view = math.pi/2 - end - - local acce_y = 0 - local velo = entity.object:get_velocity() - - entity.v = get_v(velo) * get_sign(entity.v) - - -- process controls - if entity.driver then - - local ctrl = entity.driver:get_player_control() - - -- move forwards - if ctrl.up then - - entity.v = entity.v + entity.accel / 10 - - -- move backwards - elseif ctrl.down then - - if entity.max_speed_reverse == 0 and entity.v == 0 then - return - end - - entity.v = entity.v - entity.accel / 10 - end - - -- fix mob rotation - entity.object:set_yaw(entity.driver:get_look_horizontal() - entity.rotate) - - if can_fly then - - -- fly up - if ctrl.jump then - velo.y = velo.y + 1 - if velo.y > entity.accel then velo.y = entity.accel end - - elseif velo.y > 0 then - velo.y = velo.y - 0.1 - if velo.y < 0 then velo.y = 0 end - end - - -- fly down - if ctrl.sneak then - velo.y = velo.y - 1 - if velo.y < -entity.accel then velo.y = -entity.accel end - - elseif velo.y < 0 then - velo.y = velo.y + 0.1 - if velo.y > 0 then velo.y = 0 end - end - - else - - -- jump - if ctrl.jump then - - if velo.y == 0 then - velo.y = velo.y + entity.jump_height - acce_y = acce_y + (acce_y * 3) + 1 - end - end - - end - end - - -- if not moving then set animation and return - if entity.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then - - if stand_anim then - mcl_mobs:set_animation(entity, stand_anim) - end - - return - end - - -- set moving animation - if moving_anim then - mcl_mobs:set_animation(entity, moving_anim) - end - - -- Stop! - local s = get_sign(entity.v) - - entity.v = entity.v - 0.02 * s - - if s ~= get_sign(entity.v) then - - entity.object:set_velocity({x = 0, y = 0, z = 0}) - entity.v = 0 - return - end - - -- enforce speed limit forward and reverse - local max_spd = entity.max_speed_reverse - - if get_sign(entity.v) >= 0 then - max_spd = entity.max_speed_forward - end - - if math.abs(entity.v) > max_spd then - entity.v = entity.v - get_sign(entity.v) - end - - -- Set position, velocity and acceleration - local p = entity.object:get_pos() - local new_velo - local new_acce = {x = 0, y = -9.8, z = 0} - - p.y = p.y - 0.5 - - local ni = node_is(p) - local v = entity.v - - if ni == "air" then - - if can_fly == true then - new_acce.y = 0 - end - - elseif ni == "liquid" or ni == "lava" then - - if ni == "lava" and entity.lava_damage ~= 0 then - - entity.lava_counter = (entity.lava_counter or 0) + dtime - - if entity.lava_counter > 1 then - - minetest.sound_play("default_punch", { - object = entity.object, - max_hear_distance = 5 - }, true) - - entity.object:punch(entity.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = entity.lava_damage} - }, nil) - - entity.lava_counter = 0 - end - end - - if entity.terrain_type == 2 - or entity.terrain_type == 3 then - - new_acce.y = 0 - p.y = p.y + 1 - - if node_is(p) == "liquid" then - - if velo.y >= 5 then - velo.y = 5 - elseif velo.y < 0 then - new_acce.y = 20 - else - new_acce.y = 5 - end - else - if math.abs(velo.y) < 1 then - local pos = entity.object:get_pos() - pos.y = math.floor(pos.y) + 0.5 - entity.object:set_pos(pos) - velo.y = 0 - end - end - else - v = v * 0.25 - end - end - - new_velo = get_velocity(v, entity.object:get_yaw() - rot_view, velo.y) - new_acce.y = new_acce.y + acce_y - - entity.object:set_velocity(new_velo) - entity.object:set_acceleration(new_acce) - - -- CRASH! - if enable_crash then - - local intensity = entity.v2 - v - - if intensity >= crash_threshold then - - entity.object:punch(entity.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = intensity} - }, nil) - - end - end - - entity.v2 = v -end - - --- directional flying routine by D00Med (edited by TenPlus1) - -function mcl_mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) - - local ctrl = entity.driver:get_player_control() - local velo = entity.object:get_velocity() - local dir = entity.driver:get_look_dir() - local yaw = entity.driver:get_look_horizontal() + 1.57 -- offset fix between old and new commands - - if ctrl.up then - entity.object:set_velocity({ - x = dir.x * speed, - y = dir.y * speed + 2, - z = dir.z * speed - }) - - elseif ctrl.down then - entity.object:set_velocity({ - x = -dir.x * speed, - y = dir.y * speed + 2, - z = -dir.z * speed - }) - - elseif not ctrl.down or ctrl.up or ctrl.jump then - entity.object:set_velocity({x = 0, y = -2, z = 0}) - end - - entity.object:set_yaw(yaw + math.pi + math.pi / 2 - entity.rotate) - - -- firing arrows - if ctrl.LMB and ctrl.sneak and shoots then - - local pos = entity.object:get_pos() - local obj = minetest.add_entity({ - x = pos.x + 0 + dir.x * 2.5, - y = pos.y + 1.5 + dir.y, - z = pos.z + 0 + dir.z * 2.5}, arrow) - - local ent = obj:get_luaentity() - if ent then - ent.switch = 1 -- for mob specific arrows - ent.owner_id = tostring(entity.object) -- so arrows dont hurt entity you are riding - local vec = {x = dir.x * 6, y = dir.y * 6, z = dir.z * 6} - local yaw = entity.driver:get_look_horizontal() - obj:set_yaw(yaw + math.pi / 2) - obj:set_velocity(vec) - else - obj:remove() - end - end - - -- change animation if stopped - if velo.x == 0 and velo.y == 0 and velo.z == 0 then - - mcl_mobs:set_animation(entity, stand_anim) - else - -- moving animation - mcl_mobs:set_animation(entity, moving_anim) - end -end diff --git a/mods/ENTITIES/mcl_mobs/readme.MD b/mods/ENTITIES/mcl_mobs/readme.MD deleted file mode 100644 index aa79d909cb..0000000000 --- a/mods/ENTITIES/mcl_mobs/readme.MD +++ /dev/null @@ -1,74 +0,0 @@ - -Mobs Redo: MineClone 2 Edition - -Based on Mobs Redo from TenPlus1 -Built from PilzAdam's original Simple Mobs with additional mobs by KrupnoPavel, Zeg9, ExeterDad and AspireMint. - - -This mod contains the API only for adding your own mobs into the world, so please use the additional modpacks to add animals, monsters etc. - - -https://forum.minetest.net/viewtopic.php?f=11&t=9917 - ------------- -Credits: - -mcl_mobs_mob_poof.ogg: -- by Planman (license: Creative Commons Zero) -- Source: - ------------- - -Changelog from original Mobs Redo mod: -- 1.41- Mob pathfinding has been updated thanks to Elkien3 -- 1.40- Updated to use newer functions, requires Minetest 0.4.16+ to work. -- 1.39- Added 'on_breed', 'on_grown' and 'do_punch' custom functions per mob -- 1.38- Better entity checking, nametag setting and on_spawn function added to mob registry, tweaked light damage -- 1.37- Added support for Raymoo's CMI (common mob interface) mod: https://forum.minetest.net/viewtopic.php?f=9&t=15448 -- 1.36- Death check added, if mob dies in fire/lava/with lava pick then drops are cooked -- 1.35- Added owner_loyal flag for owned mobs to attack player enemies, also fixed group_attack -- 1.34- Added function to fly mob using directional movement (thanks D00Med for flying code) -- 1.33- Added functions to mount ride mobs (mobs.attach, mobs.detach, mobs.drive) many thanks to Blert2112 -- 1.32- Added new spawn check to count specific mobs AND new minetest.conf setting to chance spawn chance and numbers, added ability to protect tamed mobs -- 1.31- Added 'attack_animals' and 'specific_attack' flags for custom monster attacks, also 'mob_difficulty' .conf setting to make mobs harder. -- 1.30- Added support for invisibility mod (mobs cant attack what they cant see), tweaked and tidied code -- 1.29- Split original Mobs Redo into a modpack to make it easier to disable mob sets (animal, monster, npc) or simply use the Api itself for your own mod -- 1.28- New damage system added with ability for mob to be immune to weapons or healed by them :) -- 1.27- Added new sheep, lava flan and spawn egg textures. New Lava Pick tool smelts what you dig. New atan checking function. -- 1.26- Pathfinding feature added thanks to rnd, when monsters attack they become scary smart in finding you :) also, beehive produces honey now :) -- 1.25- Mobs no longer spawn within 12 blocks of player or despawn within same range, spawners now have player detection, Code tidy and tweak. -- 1.24- Added feature where certain animals run away when punched (runaway = true in mob definition) -- 1.23- Added mob spawner block for admin to setup spawners in-game (place and right click to enter settings) -- 1.22- Added ability to name tamed animals and npc using nametags, also npc will attack anyone who punches them apart from owner -- 1.21- Added some more error checking to reduce serialize.h error and added height checks for falling off cliffs (thanks cmdskp) -- 1.20- Error checking added to remove bad mobs, out of map limit mobs and stop serialize.h error -- 1.19- Chickens now drop egg items instead of placing the egg, also throwing eggs result in 1/8 chance of spawning chick -- 1.18- Added docile_by_day flag so that monsters will not attack automatically during daylight hours unless hit first -- 1.17- Added 'dogshoot' attack type, shoots when out of reach, melee attack when in reach, also api tweaks and self.reach added -- 1.16- Mobs follow multiple items now, Npc's can breed -- 1.15- Added Feeding/Taming/Breeding function, right-click to pick up any sheep with X mark on them and replace with new one to fix compatibility. -- 1.14- All .self variables saved in staticdata, Fixed self.health bug -- 1.13- Added capture function (thanks blert2112) chance of picking up mob with hand; net; magic lasso, replaced some .x models with newer .b3d one's -- 1.12- Added animal ownership so that players cannot steal your tamed animals -- 1.11- Added flying mobs (and swimming), fly=true and fly_in="air" or "deafult:water_source" for fishy -- 1,10- Footstep removed (use replace), explosion routine added for exploding mobs. -- 1.09- reworked breeding routine, added mob rotation value, added footstep feature, added jumping mobs with sounds feature, added magic lasso for picking up animals -- 1.08- Mob throwing attack has been rehauled so that they can damage one another, also drops and on_die function added -- 1.07- Npc's can now be set to follow player or stand by using self.order and self.owner variables -- beta- Npc mob added, kills monsters, attacks player when punched, right click with food to heal or gold lump for drop -- 1.06- Changed recovery times after breeding, and time taken to grow up (can be sped up by feeding baby animal) -- 1.05- Added ExeterDad's bunny's which can be picked up and tamed with 4 carrots from farming redo or farming_plus, also shears added to get wool from sheep and lastly Jordach/BSD's kitten -- 1.04- Added mating for sheep, cows and hogs... feed animals to make horny and hope for a baby which is half size, will grow up quick though :) -- 1.03- Added mob drop/replace feature so that chickens can drop eggs, cow/sheep can eat grass/wheat etc. -- 1.02- Sheared sheep are remembered and spawn shaven, Warthogs will attack when threatened, Api additions -- 1.01- Mobs that suffer fall damage or die in water/lava/sunlight will now drop items -- 1.0 - more work on Api so that certain mobs can float in water while some sink like a brick :) -- 0.9 - Spawn eggs added for all mobs (admin only, cannot be placed in protected areas)... Api tweaked -- 0.8 - Added sounds to monster mobs (thanks Cyberpangolin for the sfx) and also chicken sound -- 0.7 - mobs.protected switch added to api.lua, when set to 1 mobs no longer spawn in protected areas, also bug fixes -- 0.6 - Api now supports multi-textured mobs, e.g oerkki, dungeon master, rats and chickens have random skins when spawning (sheep fix TODO), also new Honey block -- 0.5 - Mobs now float in water, die from falling, and some code improvements -- 0.4 - Dungeon Masters and Mese Monsters have much better aim due to shoot_offset, also they can both shoot through nodes that aren't walkable (flowers, grass etc) plus new sheep sound :) -- 0.3 - Added LOTT's Spider mob, made Cobwebs, added KPavel's Bee with Honey and Beehives (made texture), Warthogs now have sound and can be tamed, taming of shaved sheep or milked cow with 8 wheat so it will not despawn, many bug fixes :) -- 0.2 - Cooking bucket of milk into cheese now returns empty bucket -- 0.1 - Initial Release diff --git a/mods/ENTITIES/mcl_mobs/sounds/default_punch.ogg b/mods/ENTITIES/mcl_mobs/sounds/default_punch.ogg deleted file mode 100644 index 28a500bf57..0000000000 Binary files a/mods/ENTITIES/mcl_mobs/sounds/default_punch.ogg and /dev/null differ diff --git a/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_mob_poof.ogg b/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_mob_poof.ogg deleted file mode 100644 index 9f683c0cfa..0000000000 Binary files a/mods/ENTITIES/mcl_mobs/sounds/mcl_mobs_mob_poof.ogg and /dev/null differ diff --git a/mods/ENTITIES/mcl_mobs/spawning.lua b/mods/ENTITIES/mcl_mobs/spawning.lua deleted file mode 100644 index 74fcc32559..0000000000 --- a/mods/ENTITIES/mcl_mobs/spawning.lua +++ /dev/null @@ -1,484 +0,0 @@ ---lua locals -local get_node = minetest.get_node -local get_item_group = minetest.get_item_group -local get_node_light = minetest.get_node_light -local find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air -local get_biome_name = minetest.get_biome_name -local get_objects_inside_radius = minetest.get_objects_inside_radius -local get_connected_players = minetest.get_connected_players -local minetest_get_perlin = minetest.get_perlin - -local math_random = math.random -local math_floor = math.floor -local math_ceil = math.ceil -local math_cos = math.cos -local math_sin = math.sin -local math_round = function(x) return (x > 0) and math_floor(x + 0.5) or math_ceil(x - 0.5) end - ---local vector_distance = vector.distance -local vector_new = vector.new -local vector_floor = vector.floor - -local table_copy = table.copy -local table_remove = table.remove - -local pairs = pairs - --- range for mob count -local aoc_range = 32 - ---do mobs spawn? -local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false - - -local noise_params = { - offset = 0, - scale = 3, - spread = { - x = 301, - y = 50, - z = 304, - }, - seed = 100, - octaves = 3, - persistence = 0.5, -} - --- THIS IS THE BIG LIST OF ALL BIOMES - used for programming/updating mobs --- Also used for missing parameter --- Please update the list when adding new biomes! - -local list_of_all_biomes = { - - -- underground: - - "FlowerForest_underground", - "JungleEdge_underground", - "ColdTaiga_underground", - "IcePlains_underground", - "IcePlainsSpikes_underground", - "MegaTaiga_underground", - "Taiga_underground", - "ExtremeHills+_underground", - "JungleM_underground", - "ExtremeHillsM_underground", - "JungleEdgeM_underground", - - -- ocean: - - "RoofedForest_ocean", - "JungleEdgeM_ocean", - "BirchForestM_ocean", - "BirchForest_ocean", - "IcePlains_deep_ocean", - "Jungle_deep_ocean", - "Savanna_ocean", - "MesaPlateauF_ocean", - "ExtremeHillsM_deep_ocean", - "Savanna_deep_ocean", - "SunflowerPlains_ocean", - "Swampland_deep_ocean", - "Swampland_ocean", - "MegaSpruceTaiga_deep_ocean", - "ExtremeHillsM_ocean", - "JungleEdgeM_deep_ocean", - "SunflowerPlains_deep_ocean", - "BirchForest_deep_ocean", - "IcePlainsSpikes_ocean", - "Mesa_ocean", - "StoneBeach_ocean", - "Plains_deep_ocean", - "JungleEdge_deep_ocean", - "SavannaM_deep_ocean", - "Desert_deep_ocean", - "Mesa_deep_ocean", - "ColdTaiga_deep_ocean", - "Plains_ocean", - "MesaPlateauFM_ocean", - "Forest_deep_ocean", - "JungleM_deep_ocean", - "FlowerForest_deep_ocean", - "MushroomIsland_ocean", - "MegaTaiga_ocean", - "StoneBeach_deep_ocean", - "IcePlainsSpikes_deep_ocean", - "ColdTaiga_ocean", - "SavannaM_ocean", - "MesaPlateauF_deep_ocean", - "MesaBryce_deep_ocean", - "ExtremeHills+_deep_ocean", - "ExtremeHills_ocean", - "MushroomIsland_deep_ocean", - "Forest_ocean", - "MegaTaiga_deep_ocean", - "JungleEdge_ocean", - "MesaBryce_ocean", - "MegaSpruceTaiga_ocean", - "ExtremeHills+_ocean", - "Jungle_ocean", - "RoofedForest_deep_ocean", - "IcePlains_ocean", - "FlowerForest_ocean", - "ExtremeHills_deep_ocean", - "MesaPlateauFM_deep_ocean", - "Desert_ocean", - "Taiga_ocean", - "BirchForestM_deep_ocean", - "Taiga_deep_ocean", - "JungleM_ocean", - - -- water or beach? - - "MesaPlateauFM_sandlevel", - "MesaPlateauF_sandlevel", - "MesaBryce_sandlevel", - "Mesa_sandlevel", - - -- beach: - - "FlowerForest_beach", - "Forest_beach", - "StoneBeach", - "ColdTaiga_beach_water", - "Taiga_beach", - "Savanna_beach", - "Plains_beach", - "ExtremeHills_beach", - "ColdTaiga_beach", - "Swampland_shore", - "MushroomIslandShore", - "JungleM_shore", - "Jungle_shore", - - -- dimension biome: - - "Nether", - "End", - - -- Overworld regular: - - "Mesa", - "FlowerForest", - "Swampland", - "Taiga", - "ExtremeHills", - "Jungle", - "Savanna", - "BirchForest", - "MegaSpruceTaiga", - "MegaTaiga", - "ExtremeHills+", - "Forest", - "Plains", - "Desert", - "ColdTaiga", - "MushroomIsland", - "IcePlainsSpikes", - "SunflowerPlains", - "IcePlains", - "RoofedForest", - "ExtremeHills+_snowtop", - "MesaPlateauFM_grasstop", - "JungleEdgeM", - "ExtremeHillsM", - "JungleM", - "BirchForestM", - "MesaPlateauF", - "MesaPlateauFM", - "MesaPlateauF_grasstop", - "MesaBryce", - "JungleEdge", - "SavannaM", -} - --- count how many mobs are in an area -local function count_mobs(pos) - local num = 0 - for _,object in pairs(get_objects_inside_radius(pos, aoc_range)) do - if object and object:get_luaentity() and object:get_luaentity().is_mob then - num = num + 1 - end - end - return num -end - - --- global functions - -function mcl_mobs:spawn_abm_check(pos, node, name) - -- global function to add additional spawn checks - -- return true to stop spawning mob -end - - ---[[ - Custom elements changed: - -name: -the mobs name - -dimension: -"overworld" -"nether" -"end" - -types of spawning: -"water" -"ground" -"lava" - -biomes: tells the spawner to allow certain mobs to spawn in certain biomes -{"this", "that", "grasslands", "whatever"} - - -what is aoc??? objects in area - -WARNING: BIOME INTEGRATION NEEDED -> How to get biome through lua?? -]]-- - - ---this is where all of the spawning information is kept -local spawn_dictionary = {} -local summary_chance = 0 - -function mcl_mobs:spawn_setup(def) - if not mobs_spawn then return end - - if not def then - minetest.log("warning", "Empty mob spawn setup definition") - return - end - - local name = def.name - if not name then - minetest.log("warning", "Missing mob name") - return - end - - local dimension = def.dimension or "overworld" - local type_of_spawning = def.type_of_spawning or "ground" - local biomes = def.biomes or list_of_all_biomes - local min_light = def.min_light or 0 - local max_light = def.max_light or (minetest.LIGHT_MAX + 1) - local chance = def.chance or 1000 - local aoc = def.aoc or aoc_range - local min_height = def.min_height or mcl_mapgen.overworld.min - local max_height = def.max_height or mcl_mapgen.overworld.max - local day_toggle = def.day_toggle - local on_spawn = def.on_spawn - local check_position = def.check_position - - -- chance/spawn number override in minetest.conf for registered mob - local numbers = minetest.settings:get(name) - if numbers then - numbers = numbers:split(",") - chance = tonumber(numbers[1]) or chance - aoc = tonumber(numbers[2]) or aoc - if chance == 0 then - minetest.log("warning", string.format("[mcl_mobs] %s has spawning disabled", name)) - return - end - minetest.log("action", string.format("[mcl_mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc)) - end - - if chance < 1 then - chance = 1 - minetest.log("warning", "Chance shouldn't be less than 1 (mob name: " .. name ..")") - end - - spawn_dictionary[#spawn_dictionary + 1] = { - name = name, - dimension = dimension, - type_of_spawning = type_of_spawning, - biomes = biomes, - min_light = min_light, - max_light = max_light, - chance = chance, - aoc = aoc, - min_height = min_height, - max_height = max_height, - day_toggle = day_toggle, - check_position = check_position, - on_spawn = on_spawn, - } - summary_chance = summary_chance + chance -end - -function mcl_mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_light, max_light, interval, chance, aoc, min_height, max_height, day_toggle, on_spawn) - - -- Do mobs spawn at all? - if not mobs_spawn then - return - end - - -- chance/spawn number override in minetest.conf for registered mob - local numbers = minetest.settings:get(name) - - if numbers then - numbers = numbers:split(",") - chance = tonumber(numbers[1]) or chance - aoc = tonumber(numbers[2]) or aoc - - if chance == 0 then - minetest.log("warning", string.format("[mcl_mobs] %s has spawning disabled", name)) - return - end - - minetest.log("action", string.format("[mcl_mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc)) - end - - --load information into the spawn dictionary - local key = #spawn_dictionary + 1 - spawn_dictionary[key] = {} - spawn_dictionary[key]["name"] = name - spawn_dictionary[key]["dimension"] = dimension - spawn_dictionary[key]["type_of_spawning"] = type_of_spawning - spawn_dictionary[key]["biomes"] = biomes - spawn_dictionary[key]["min_light"] = min_light - spawn_dictionary[key]["max_light"] = max_light - spawn_dictionary[key]["chance"] = chance - spawn_dictionary[key]["aoc"] = aoc - spawn_dictionary[key]["min_height"] = min_height - spawn_dictionary[key]["max_height"] = max_height - spawn_dictionary[key]["day_toggle"] = day_toggle - - summary_chance = summary_chance + chance -end - -local two_pi = 2 * math.pi -local function get_next_mob_spawn_pos(pos) - local distance = math_random(25, 32) - local angle = math_random() * two_pi - return { - x = math_round(pos.x + distance * math_cos(angle)), - y = pos.y, - z = math_round(pos.z + distance * math_sin(angle)) - } -end - -local function decypher_limits(posy) - posy = math_floor(posy) - return posy - 32, posy + 32 -end - ---a simple helper function for mob_spawn -local function biome_check(biome_list, biome_goal) - for _, data in pairs(biome_list) do - if data == biome_goal then - return true - end - end - - return false -end - -local function is_farm_animal(n) - return n == "mobs_mc:pig" or n == "mobs_mc:cow" or n == "mobs_mc:sheep" or n == "mobs_mc:chicken" or n == "mobs_mc:horse" or n == "mobs_mc:donkey" -end - -if mobs_spawn then - - local perlin_noise - - local function spawn_a_mob(pos, dimension, y_min, y_max) - local dimension = dimension or mcl_worlds.pos_to_dimension(pos) - local goal_pos = get_next_mob_spawn_pos(pos) - local spawning_position_list = find_nodes_in_area_under_air( - {x = goal_pos.x, y = y_min, z = goal_pos.z}, - {x = goal_pos.x, y = y_max, z = goal_pos.z}, - {"group:solid", "group:water", "group:lava"} - ) - if #spawning_position_list <= 0 then return end - local spawning_position = spawning_position_list[math_random(1, #spawning_position_list)] - - --hard code mob limit in area to 5 for now - if count_mobs(spawning_position) >= 5 then return end - - local gotten_node = get_node(spawning_position).name - local gotten_biome = minetest.get_biome_data(spawning_position) - if not gotten_node or not gotten_biome then return end - gotten_biome = get_biome_name(gotten_biome.biome) --makes it easier to work with - - --add this so mobs don't spawn inside nodes - spawning_position.y = spawning_position.y + 1 - - --only need to poll for node light if everything else worked - local gotten_light = get_node_light(spawning_position) - - local is_water = get_item_group(gotten_node, "water") ~= 0 - local is_lava = get_item_group(gotten_node, "lava") ~= 0 - local is_ground = not (is_water or is_lava) - local is_grass = minetest.get_item_group(gotten_node,"grass_block") ~= 0 - local has_bed = minetest.find_node_near(pos,25,{"group:bed"}) - - if not is_ground then - spawning_position.y = spawning_position.y - 1 - end - - local mob_def - - --create a disconnected clone of the spawn dictionary - --prevents memory leak - local mob_library_worker_table = table_copy(spawn_dictionary) - - --grab mob that fits into the spawning location - --randomly grab a mob, don't exclude any possibilities - perlin_noise = perlin_noise or minetest_get_perlin(noise_params) - local noise = perlin_noise:get_3d(spawning_position) - local current_summary_chance = summary_chance - while #mob_library_worker_table > 0 do - local mob_chance_offset = (math_round(noise * current_summary_chance + 12345) % current_summary_chance) + 1 - local mob_index = 1 - local mob_chance = mob_library_worker_table[mob_index].chance - local step_chance = mob_chance - while step_chance < mob_chance_offset do - mob_index = mob_index + 1 - mob_chance = mob_library_worker_table[mob_index].chance - step_chance = step_chance + mob_chance - end - local mob_def = mob_library_worker_table[mob_index] - local mob_type = minetest.registered_entities[mob_def.name].type - if mob_def - and spawning_position.y >= mob_def.min_height - and spawning_position.y <= mob_def.max_height - and mob_def.dimension == dimension - and biome_check(mob_def.biomes, gotten_biome) - and gotten_light >= mob_def.min_light - and gotten_light <= mob_def.max_light - and (is_ground or mob_def.type_of_spawning ~= "ground") - and (mob_def.check_position and mob_def.check_position(spawning_position) or true) - and (not is_farm_animal(mob_def.name) or is_grass) - and (mob_type ~= "npc" or has_bed) - then - --everything is correct, spawn mob - local object = minetest.add_entity(spawning_position, mob_def.name) - if object then - return mob_def.on_spawn and mob_def.on_spawn(object, pos) - end - end - current_summary_chance = current_summary_chance - mob_chance - table_remove(mob_library_worker_table, mob_index) - end - end - - - --MAIN LOOP - - local timer = 0 - minetest.register_globalstep(function(dtime) - timer = timer + dtime - if timer < 10 then return end - timer = 0 - for _, player in pairs(get_connected_players()) do - local pos = player:get_pos() - local dimension = mcl_worlds.pos_to_dimension(pos) - -- ignore void and unloaded area - if dimension ~= "void" and dimension ~= "default" then - local y_min, y_max = decypher_limits(pos.y) - for i = 1, math_random(1, 4) do - spawn_a_mob(pos, dimension, y_min, y_max) - end - end - end - end) -end diff --git a/mods/ENTITIES/mcl_mobs/textures/mobs_blood.png b/mods/ENTITIES/mcl_mobs/textures/mobs_blood.png deleted file mode 100644 index aa4a6123ca..0000000000 Binary files a/mods/ENTITIES/mcl_mobs/textures/mobs_blood.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_mobs/textures/mobs_nametag.png b/mods/ENTITIES/mcl_mobs/textures/mobs_nametag.png deleted file mode 100644 index 0326e71aaf..0000000000 Binary files a/mods/ENTITIES/mcl_mobs/textures/mobs_nametag.png and /dev/null differ diff --git a/mods/ENTITIES/mcl_wither_spawning/init.lua b/mods/ENTITIES/mcl_wither_spawning/init.lua deleted file mode 100644 index 2f1d744d8c..0000000000 --- a/mods/ENTITIES/mcl_wither_spawning/init.lua +++ /dev/null @@ -1,51 +0,0 @@ -local dim = {"x", "z"} - -local modpath = minetest.get_modpath(minetest.get_current_modname()) - -local function load_schem(filename) - local file = io.open(modpath .. "/schems/" .. filename, "r") - local data = minetest.deserialize(file:read()) - file:close() - return data -end - -local wither_spawn_schems = {} - -for _, d in pairs(dim) do - wither_spawn_schems[d] = load_schem("wither_spawn_" .. d .. ".we") -end - -local function check_schem(pos, schem) - for _, n in pairs(schem) do - if minetest.get_node(vector.add(pos, n)).name ~= n.name then - return false - end - end - return true -end - -local function remove_schem(pos, schem) - for _, n in pairs(schem) do - minetest.remove_node(vector.add(pos, n)) - end -end - -local function wither_spawn(pos) - for _, d in pairs(dim) do - for i = 0, 2 do - local p = vector.add(pos, {x = 0, y = -2, z = 0, [d] = -i}) - local schem = wither_spawn_schems[d] - if check_schem(p, schem) then - remove_schem(p, schem) - minetest.add_entity(vector.add(p, {x = 0, y = 1, z = 0, [d] = 1}), "mobs_mc:wither") - end - end - end -end - -local wither_head = minetest.registered_nodes["mcl_heads:wither_skeleton"] -local old_on_place = wither_head.on_place -function wither_head.on_place(itemstack, placer, pointed) - minetest.after(0, wither_spawn, pointed.above) - old_on_place(itemstack, placer, pointed) -end diff --git a/mods/ENTITIES/mcl_wither_spawning/mod.conf b/mods/ENTITIES/mcl_wither_spawning/mod.conf deleted file mode 100644 index d144bb1eaa..0000000000 --- a/mods/ENTITIES/mcl_wither_spawning/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = mcl_wither_spawning -description = Wither Spawning for MineClone2 -author = Fleckenstein -depends = mobs_mc, mcl_heads diff --git a/mods/ENTITIES/mcl_wither_spawning/schems/wither_spawn_x.we b/mods/ENTITIES/mcl_wither_spawning/schems/wither_spawn_x.we deleted file mode 100644 index 6394bdc3f5..0000000000 --- a/mods/ENTITIES/mcl_wither_spawning/schems/wither_spawn_x.we +++ /dev/null @@ -1 +0,0 @@ -return {{["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 2, ["param1"] = 15}, {["y"] = 0, ["x"] = 1, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 1, ["x"] = 1, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 2, ["x"] = 1, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 2, ["param1"] = 15}, {["y"] = 1, ["x"] = 2, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 2, ["x"] = 2, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 2, ["param1"] = 15}} diff --git a/mods/ENTITIES/mcl_wither_spawning/schems/wither_spawn_z.we b/mods/ENTITIES/mcl_wither_spawning/schems/wither_spawn_z.we deleted file mode 100644 index 6b17757734..0000000000 --- a/mods/ENTITIES/mcl_wither_spawning/schems/wither_spawn_z.we +++ /dev/null @@ -1 +0,0 @@ -return {{["y"] = 0, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 1}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 0}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 1}, {["y"] = 1, ["x"] = 0, ["name"] = "mcl_nether:soul_sand", ["z"] = 2}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 0, ["param2"] = 1, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 1, ["param2"] = 1, ["param1"] = 15}, {["y"] = 2, ["x"] = 0, ["name"] = "mcl_heads:wither_skeleton", ["z"] = 2, ["param2"] = 1, ["param1"] = 15}} diff --git a/mods/ENTITIES/mobs_mc/LICENSE b/mods/ENTITIES/mobs_mc/LICENSE deleted file mode 100644 index 9cecc1d466..0000000000 --- a/mods/ENTITIES/mobs_mc/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU 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. - - 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. - - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} - - 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: - - {project} Copyright (C) {year} {fullname} - 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/ENTITIES/mobs_mc/LICENSE-media.md b/mods/ENTITIES/mobs_mc/LICENSE-media.md deleted file mode 100644 index 4e3de49f10..0000000000 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ /dev/null @@ -1,310 +0,0 @@ -# Credits licensing for media files in `mobs_mc` - -## Licenses used - -The following media licenses are used: - -* [CC0](https://creativecommons.org/choose/zero/) -* [CC BY 3.0](https://creativecommons.org/licenses/by/3.0/) -* [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) -* [GPL v3](https://www.gnu.org/licenses/gpl-3.0.html]) -* [MIT License](https://opensource.org/licenses/MIT) -* [LGPL v2.1](https://www.gnu.org/licenses/lgpl-2.1.html) - -Note: A “`*`” in a file name below is a placeholder which can stand for any text. - -## Models -All models were done by [22i](https://github.com/22i) and are licensed under GPLv3. - -Origin of those models: - -* [Mod “amc”](https://github.com/22i/amc/) -* [Repository with Blender source files for models](https://github.com/22i/minecraft-voxel-blender-models) - -## Textures - -* Mob and item textures are heavily based on [Pixel Perfection](https://www.planetminecraft.com/texture_pack/131pixel-perfection/), a texture pack for Minecraft. - * Original author: [XSSheep](https://www.planetminecraft.com/member/xssheep/) - * License (if not mentioned otherwise): CC BY-SA 4.0 - * Some textures have been modified or added - * Modifications and additions by MysticTempest: - * `mobs_mc_cave_spider.png` - * `mobs_mc_enderman_eyes.png` - * `mobs_mc_enderman.png` - * `mobs_mc_ghast.png` - * `mobs_mc_skeleton.png` - * `mobs_mc_slime.png` - * `mobs_mc_spider_eyes.png` - * `mobs_mc_spider.png` - * `mobs_mc_squid.png` - * `mobs_mc_zombie.png` - * `mobs_mc_villager_butcher.png` - * `mobs_mc_villager_farmer.png` - * `mobs_mc_villager_librarian.png` - * `mobs_mc_villager.png` - * `mobs_mc_villager_priest.png` - * `mobs_mc_villager_smith.png` - * `mobs_mc_parrot_blue.png` - * `mobs_mc_parrot_green.png` - * `mobs_mc_parrot_grey.png` - * `mobs_mc_parrot_red_blue.png` - * `mobs_mc_parrot_yellow_blue.png` - * `mobs_mc_evoker_base.png` (modified by kingoscargames) - * `mobs_mc_illusionist_bow.png` - * `mobs_mc_illusionist.png` - * `mobs_mc_vindicator_axe.png` - * `mobs_mc_vindicator_base.png` - * `mobs_mc_horse_skeleton.png` - * Additions by kingoscargames: - * `mobs_mc_vex.png` - * `mobs_mc_vex_charging.png` - * `mobs_mc_llama.png` - * `mobs_mc_llama_creamy.png` - * `mobs_mc_llama_brown.png` - * `mobs_mc_llama_white.png` - * `mobs_mc_llama_gray.png` - * `mobs_mc_llama_chest.png` - * `mobs_mc_endermite.png` - * `mobs_mc_magmacube.png` - * `mobs_mc_chicken.png` - * `mobs_mc_wither.png` - * `mobs_mc_wither_skeleton.png` - * `mobs_mc_TEMP_wither_projectile.png` - * Gerold55 - * `mobs_mc_mooshroom_brown.png` (CC0) - * `mobs_mc_mushroom_brown.png` (CC0) - -* “Spawn egg” textures (`mobs_mc_spawn_icon_*`) by 22i -* Llama decor (carpet) textures (`mobs_mc_llama_decor_*`) by erlehmann and rudzik8 -* Any other texture not mentioned here are licensed under the MIT License - -## Sounds - -* PilzAdam and Wuzzy (CC0) - * `mobs_mc_chicken_lay_egg.ogg` -* [AGFX](http://www.freesound.org/people/DrMinky/sounds/) (CC0) - * `mobs_mc_chicken_child.ogg` - * Source: -* [evsecrets](https://freesound.org/people/evsecrets/sounds/) (CC0) - * `mobs_mc_chicken_*.ogg` - * Source: -* [contramundum](https://freesound.org/people/contramundum/sounds/) - * `mobs_mc_parrot_*.ogg` - * Source: -* Randomation (CC0) - * `green_slime_damage.ogg` - * `green_slime_attack.ogg` - * Source: -* [Dr. Minky](http://www.freesound.org/people/DrMinky/sounds/) (CC BY 3.0) - * `green_slime_jump.ogg` - * `green_slime_land.ogg` - * `green_slime_death.ogg` -* Zozzy from Freesound.org (CC0) - * `mobs_mc_cow.ogg` - * Source: -* [Bird\_man](https://freesound.org/people/Bird_man/packs/16972/) - * `mobs_mc_cow_hurt.ogg` (CC0) - * Heavily modified - * Source: -* [Klaraschick](https://freesound.org/people/Klaraschick/) - * `mobs_mc_cow_milk.ogg` (CC0) - * shortened - * Source: -* [Hitrison](https://freesound.org/people/Hitrison/) - * `mobs_mc_cow_mushroom_stew.ogg` (CC BY 3.0) - * sound was modified - * Source: -* [NPXcoot](https://github.com/NPXcoot1) (CC BY-SA 4.0) - * `mobs_mc_ender_dragon_*` -* [bevibeldesign](https://freesound.org/people/bevibeldesign/) - * `mobs_mc_wither_spawn.ogg` (CC0) - * Source: -* [rubberduck](https://opengameart.org/users/rubberduck) - * `mobs_mc_endermite_*.ogg` (CC0) - * `mobs_mc_zombiepig_*.ogg` (CC0) - * `mobs_mc_enderman_teleport_*.ogg` (CC0) - * Source 1: - * Source 2: -* [Soundscapes55](https://freesound.org/people/Soundscapes55/) - * `mobs_mc_enderman_random.1.ogg` (CC0) - * Source: -* [griffinjennings](https://freesound.org/people/griffinjennings/) - * `mobs_mc_enderman_death.*.ogg` (CC BY 3.0) - * `mobs_mc_enderman_hurt.*.ogg` (CC BY 3.0) - * Sounds were heavily modified - * Source: -* [pointparkcinema](https://freesound.org/people/pointparkcinema/) - * `mobs_mc_guardian_random.1.ogg` (CC0) - * Source: -* [nornalbion](https://freesound.org/people/nornalbion/) - * `mobs_mc_guardian_random.2.ogg` (CC BY 3.0) - * `mobs_mc_guardian_random.3.ogg` (CC BY 3.0) - * `mobs_mc_guardian_hurt.*.ogg` (CC BY 3.0) - * Sounds were modified - * Source: -* [TheBuilder15](https://freesound.org/people/TheBuilder15/) - * `mobs_mc_guardian_death.ogg` (CC0) - * Source: -* Blender Foundation (CC BY 3.0) - * `mobs_sheep.ogg`, -* daufinsyd (MIT License) - * `mobs_mc_blaze_breath.ogg` - * `mobs_mc_blaze_died.ogg` -* [qubodup](https://opengameart.org/content/slime-monster) - * `mobs_mc_squid_hurt.*.ogg` (CC BY 3.0) - * `mobs_mc_squid_death.*.ogg` (CC BY 3.0) - * Changes were made - * Source: -* [kyles](https://freesound.org/people/kyles/) - * `mobs_mc_squid_flop.*.ogg` (CC0) - * Source: - * `mobs_mc_snowman_hurt.1.ogg` (CC0) - * Source: -* [thefilmbakery](https://freesound.org/people/thefilmbakery/) (CC0) - * `mobs_mc_blaze_hurt.ogg` - * Source: -* TenPlus1, from `mobs_monster` or `mobs_animal` mod (MIT License) - * `mobs_fireball.ogg` - * `mobs_mc_cat_idle.1.ogg` - * `mobs_mc_llama.ogg` - * `mobs_pig.ogg` - * `mobs_pig_angry.ogg` - * `mobs_sandmonster.ogg` -* [Daysycho](https://freesound.org/people/Darsycho/) - * `mobs_mc_spider_hurt.*.ogg` (CC0) - * Source: -* [columbia23](https://freesound.org/people/columbia23/) - * `mobs_mc_spider_death.ogg` (CC BY 3.0) - * `mobs_mc_spider_random.*.ogg` (CC BY 3.0) - * `mobs_mc_spider_attack.*.ogg` (CC BY 3.0) - * Source: -* BrandonReese (LGPL v2.1) - * `mobs_eerie.ogg` -* [Under7dude](https://freesound.org/people/Under7dude/) (CC0) - * `mobs_mc_zombie_growl.ogg` - * Source: -* [haratman](https://freesound.org/people/haratman/) (CC0) - * `mobs_mc_zombie_death.ogg` - * Source: - * `mobs_mc_zombie_hurt.ogg` - * Source: -* [Spennnyyy](https://freesound.org/people/Spennnyyy/) (CC0) - * `mcl_totems_totem.ogg` - * Source: -* [Baŝto](https://opengameart.org/users/ba%C5%9Dto) - * `mobs_mc_skeleton_random.*.ogg` (CC BY 3.0) - * Source: -* [spookymodem](https://freesound.org/people/spookymodem/) - * `mobs_mc_skeleton_death.ogg` (CC0) - * -* [Cribbler](https://freesound.org/people/Cribbler/) - * `mobs_mc_skeleton_hurt.ogg` (CC0) - * Source: -* [GoodListener](https://freesound.org/people/GoodListener/) - * `mobs_mc_horse_random.1.ogg` (CC BY 3.0) - * Source: - * `mobs_mc_horse_death.ogg` (CC BY 3.0) - * Source: -* [Garuda1982](https://freesound.org/people/Garuda1982/) - * `mobs_mc_donkey_random.1.ogg` (CC BY 3.0) - * `mobs_mc_donkey_hurt.ogg` (CC BY 3.0) - * `mobs_mc_donkey_death.ogg` (CC BY 3.0) - * Source: -* [JarredGibb](https://freesound.org/people/JarredGibb/sounds/233131/) - * `mobs_mc_donkey_random.2.ogg` (CC0) -* [ERH](https://freesound.org/people/ERH/) - * `mobs_mc_horse_random.2.ogg` (CC BY 3.0) - * Source: -* [j1987](https://freesound.org/people/j1987/) - * `mobs_mc_creeper_death.ogg` (CC0) - * Source: -* [themightyglider](https://opengameart.org/users/themightyglider) - * `mobs_mc_creeper_hurt.ogg` (CC0) - * Source: -* [pauliw](https://opengameart.org/users/pauliw) - * `mobs_mc_vex_hurt.ogg` (CC0) - * Source: - * `mobs_mc_vex_death.ogg` (CC0) - * Source: -* [suonho](https://freesound.org/people/suonho/) - * `mobs_mc_bat_idle.ogg` (CC BY 3.0) - * Source: -* [toefur](https://freesound.org/people/toefur/) - * `mobs_mc_bat_hurt.*.ogg` (CC0) - * `mobs_mc_bat_death.ogg` (CC0) - * Source: -* [cmusounddesign](https://freesound.org/people/cmusounddesign/) - * `mobs_mc_cat_hiss.ogg` (CC BY 3.0) - * Source: -* [SelsRoyalNavy](https://freesound.org/people/SelsRoyalNavy/) - * `mobs_mc_cat_idle.2.ogg` (CC0) - * Source: -* [ebcrosby](https://freesound.org/people/ebcrosby/) - * `mobs_mc_ocelot_hurt.ogg` (CC BY 3.0) - * Source: -* Hybrid Dog (forum.minetest.net) - * `mobs_mc_wolf_hurt.*.ogg` (CC0) - * `mobs_mc_wolf_bark.*.ogg` (CC0) - * `mobs_mc_wolf_death.*.ogg` (CC0) - * `mobs_mc_wolf_growl.*.ogg` (CC0) - * Sounds modified and simplified - * Source: "dogblocks" mod by Hybrid Dog -* [cliftoncarlson](https://freesound.org/people/cliftonmcarlson/) - * `mobs_mc_wolf_take_bone.ogg` (CC0) - * Source: -* [Inocodum](https://forum.minetest.net/memberlist.php?mode=viewprofile&u=3115) - * `mobs_mc_silverfish_hurt.ogg` (CC BY-SA 4.0) - * `mobs_mc_silverfish_death.ogg` (CC BY-SA 4.0) - * `mobs_mc_silverfish_idle.ogg` (CC BY-SA 4.0) - * Source: -* [LukeIRL](https://freesound.org/people/LukeIRL/) - * `mobs_mc_magma_cube_small.ogg` (CC BY 4.0) - * Derived from: - * `mobs_mc_magma_cube_big.ogg` (CC BY 4.0) - * Derived from: -* [kbnevel](https://freesound.org/people/kbnevel/) - * `mobs_mc_magma_cube_attack.ogg` (CC0) - * Derived from: -* [InspectorJ](https://freesound.org/people/InspectorJ/sounds/429591/) - * `mobs_mc_animal_eat_generic.ogg` (CC BY 3.0) - * Source: -* [tbsounddesigns](https://freesound.org/people/tbsounddesigns/) - * `mobs_mc_bear_random.*.ogg` (CC BY 3.0) - * Source 1: - * Source 2: - * Source 3: - * `mobs_mc_bear_growl.*.ogg` (CC BY 3.0) - * Source 1: - * Source 2: - * Source 3: -* [YleArkisto](https://freesound.org/people/YleArkisto/) - * `mobs_mc_bear_attack.*.ogg` (CC BY 3.0) - * `mobs_mc_bear_death.*.ogg` (CC BY 3.0) - * `mobs_mc_bear_hurt.1.ogg` (CC BY 3.0) - * Changes were made - * Source: -* [alexo400](https://freesound.org/people/alexo400/) - * `mobs_mc_snowman_death.*.ogg` (CC0) - * Source: -* [cabled\_mess](https://freesound.org/people/cabled_mess/) - * `mobs_mc_snowman_hurt.2.ogg` (CC0) - * Source: - * `mobs_mc_snowman_hurt.3.ogg` (CC0) - * Source: -* [kessir](https://freesound.org/people/kessir/sounds/) - * `mobs_mc_rabbit_hurt.*.ogg` (CC0) - * `mobs_mc_rabbit_death.2.ogg` (CC0) - * `mobs_mc_rabbit_death.3.ogg` (CC0) - * Source: - * `mobs_mc_rabbit_attack.*.ogg` (CC0) - * Source: - * `mobs_mc_rabbit_death.1.ogg` (CC0) - * Source: -* [Alshred](https://freesound.org/people/Alshred/sounds/403773/) - * `mobs_mc_rabbit_random.*.ogg` (CC0) - * Changes were made. - * Source: - -Note: Many of these sounds have been more or less modified to fit the game. - -Sounds not mentioned hre are licensed under CC0. diff --git a/mods/ENTITIES/mobs_mc/README.md b/mods/ENTITIES/mobs_mc/README.md deleted file mode 100644 index 4ee435d726..0000000000 --- a/mods/ENTITIES/mobs_mc/README.md +++ /dev/null @@ -1,84 +0,0 @@ -# MC-like mobs [`mobs_mc`] - -This mod adds mobs which closely resemble the mobs from the game Minecraft, version 1.12. - -## Credits - -* [maikerumine](https://github.com/maikerumine): Coding behaviour, spawning, drops, and misc. -* [Wuzzy2](https://github.com/Wuzzy2): Zombies, husks, item textures, and code -* [toby109tt](https://github.com/tobyplowy): Mapping fixes - better 2D planes -* [22i](https://github.com/22i): Models (done in Blender) and mob icons for spawn eggs -* [XSSheep](https://www.planetminecraft.com/member/xssheep/): Mob and item textures (from [Pixel Perfection](https://www.planetminecraft.com/texture_pack/131pixel-perfection/)) -* MysticTempest: More mob textures -* See `LICENSE_media.md` for detailed credits about each file - -## Licensing - -* Code: GNU General Public License, version 3 (see `LICENSE`) -* Media: MIT, CC0, CC BY 3.0 CC BY-SA 4.0, LGPLv2.1, GPLv3. See `LICENSE_media.md` for details - -### Links - -* [`mobs_mc`](https://github.com/maikerumine/mobs_mc) -* [Blender models](https://github.com/22i/minecraft-voxel-blender-models) -* [How to recreate mobs from textures with Blender and Gimp](http://imgur.com/a/Iqg88) - -## List of mobs - -**Note**: Many of these are incomplete. - -### Monsters - -* Zombie -* Husk -* Skeleton -* Stray -* Creeper -* Slime -* Spider -* Cave Spider -* Enderman -* Zombie Villager -* Zombie Pigman -* Wither Skeleton -* Magma Cube -* Blaze -* Ghast -* Evoker -* Vex -* Vindicator -* Witch -* Guardian -* Silverfish -* Endermite -* Shulker -* Ender Dragon -* Wither -* Elder Guardian - -### Peaceful mobs - -* Chicken -* Cow -* Pig -* Rabbit -* Sheep -* Squid -* Polar Bear -* Bat -* Mooshroom -* Horse -* Donkey -* Llama -* Mule -* Skeleton Horse -* Zombie Horse - -### Helpful mobs - -* Wolf -* Villager -* Iron golem -* Snow golem -* Ocelot/Cat -* Parrot diff --git a/mods/ENTITIES/mobs_mc/bat.lua b/mods/ENTITIES/mobs_mc/bat.lua deleted file mode 100644 index b41dabcba2..0000000000 --- a/mods/ENTITIES/mobs_mc/bat.lua +++ /dev/null @@ -1,146 +0,0 @@ ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - -mcl_mobs:register_mob("mobs_mc:bat", { - description = S("Bat"), - type = "animal", - spawn_class = "ambient", - can_despawn = true, - passive = true, - hp_min = 6, - hp_max = 6, - collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.89, 0.25}, - visual = "mesh", - mesh = "mobs_mc_bat.b3d", - textures = { - {"mobs_mc_bat.png"}, - }, - visual_size = {x=1, y=1}, - sounds = { - random = "mobs_mc_bat_idle", - damage = "mobs_mc_bat_hurt", - death = "mobs_mc_bat_death", - distance = 16, - }, - walk_velocity = 4.5, - run_velocity = 6.0, - -- TODO: Hang upside down - animation = { - stand_speed = 80, - stand_start = 0, - stand_end = 40, - walk_speed = 80, - walk_start = 0, - walk_end = 40, - run_speed = 80, - run_start = 0, - run_end = 40, - die_speed = 60, - die_start = 40, - die_end = 80, - die_loop = false, - }, - walk_chance = 100, - fall_damage = 0, - view_range = 16, - fear_height = 0, - - jump = false, - fly = true, - makes_footstep_sound = false, -}) - - --- Spawning - ---[[ If the game has been launched between the 20th of October and the 3rd of November system time, --- the maximum spawn light level is increased. ]] -local date = os.date("*t") -local maxlight -if (date.month == 10 and date.day >= 20) or (date.month == 11 and date.day <= 3) then - maxlight = 6 -else - maxlight = 3 -end - --- Spawn on solid blocks at or below Sea level and the selected light level -mcl_mobs:spawn_specific( -"mobs_mc:bat", -"overworld", -"ground", -{ -"FlowerForest_underground", -"JungleEdge_underground", -"StoneBeach_underground", -"MesaBryce_underground", -"Mesa_underground", -"RoofedForest_underground", -"Jungle_underground", -"Swampland_underground", -"MushroomIsland_underground", -"BirchForest_underground", -"Plains_underground", -"MesaPlateauF_underground", -"ExtremeHills_underground", -"MegaSpruceTaiga_underground", -"BirchForestM_underground", -"SavannaM_underground", -"MesaPlateauFM_underground", -"Desert_underground", -"Savanna_underground", -"Forest_underground", -"SunflowerPlains_underground", -"ColdTaiga_underground", -"IcePlains_underground", -"IcePlainsSpikes_underground", -"MegaTaiga_underground", -"Taiga_underground", -"ExtremeHills+_underground", -"JungleM_underground", -"ExtremeHillsM_underground", -"JungleEdgeM_underground", -"Mesa", -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"Jungle", -"Savanna", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"Desert", -"ColdTaiga", -"MushroomIsland", -"IcePlainsSpikes", -"SunflowerPlains", -"IcePlains", -"RoofedForest", -"ExtremeHills+_snowtop", -"MesaPlateauFM_grasstop", -"JungleEdgeM", -"ExtremeHillsM", -"JungleM", -"BirchForestM", -"MesaPlateauF", -"MesaPlateauFM", -"MesaPlateauF_grasstop", -"MesaBryce", -"JungleEdge", -"SavannaM", -}, -0, -maxlight, -20, -5000, -2, -mcl_vars.mg_overworld_min, -mobs_mc.water_level-1) - - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:bat", S("Bat"), "mobs_mc_spawn_icon_bat.png", 0) diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua deleted file mode 100644 index e0ff50909e..0000000000 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ /dev/null @@ -1,203 +0,0 @@ --- daufinsyd --- My work is under the LGPL terms --- Model and mobs_blaze.png see https://github.com/22i/minecraft-voxel-blender-models -hi 22i ~jordan4ibanez --- blaze.lua partial copy of mobs_mc/ghast.lua - -local S = minetest.get_translator("mobs_mc") - -local mod_target = minetest.get_modpath("mcl_target") - ---################### ---################### BLAZE ---################### - - -mcl_mobs:register_mob("mobs_mc:blaze", { - description = S("Blaze"), - type = "monster", - spawn_class = "hostile", - hp_min = 20, - hp_max = 20, - xp_min = 10, - xp_max = 10, - collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.79, 0.3}, - rotate = -180, - visual = "mesh", - mesh = "mobs_mc_blaze.b3d", - textures = { - {"mobs_mc_blaze.png"}, - }, - armor = { fleshy = 100, snowball_vulnerable = 100, water_vulnerable = 100 }, - visual_size = {x=3, y=3}, - sounds = { - random = "mobs_mc_blaze_breath", - death = "mobs_mc_blaze_died", - damage = "mobs_mc_blaze_hurt", - distance = 16, - }, - walk_velocity = .8, - run_velocity = 1.6, - damage = 6, - reach = 2, - pathfinding = 1, - drops = { - {name = "mcl_mobitems:blaze_rod", - chance = 1, - min = 0, - max = 1, - looting = "common",}, - }, - animation = { - stand_speed = 25, - stand_start = 0, - stand_end = 100, - walk_speed = 25, - walk_start = 0, - walk_end = 100, - run_speed = 50, - run_start = 0, - run_end = 100, - }, - -- MC Wiki: takes 1 damage every half second while in water - water_damage = 2, - lava_damage = 0, - fire_damage = 0, - fall_damage = 0, - fall_speed = -2.25, - light_damage = 0, - view_range = 16, - attack_type = "dogshoot", - arrow = "mobs_mc:blaze_fireball", - shoot_interval = 3.5, - shoot_offset = 1.0, - passive = false, - jump = true, - jump_height = 4, - fly = true, - makes_footstep_sound = false, - fear_height = 0, - glow = 14, - fire_resistant = true, - do_custom = function(self) - if self.state == "attack" and self.attack:get_pos() and vector.distance(self.object:get_pos(), self.attack:get_pos()) < 1.2 then - mcl_burning.set_on_fire(self.attack, 5) - end - local pos = self.object:get_pos() - minetest.add_particle({ - pos = {x=pos.x+math.random(-0.7,0.7)*math.random()/2,y=pos.y+math.random(0.7,1.2),z=pos.z+math.random(-0.7,0.7)*math.random()/2}, - velocity = {x=0, y=math.random(1,1), z=0}, - expirationtime = math.random(), - size = math.random(1, 4), - collisiondetection = true, - vertical = false, - texture = "mcl_particles_smoke_anim.png^[colorize:#2c2c2c:255", - animation = { - type = "vertical_frames", - aspect_w = 8, - aspect_h = 8, - length = 2.05, - }, - }) - minetest.add_particle({ - pos = {x=pos.x+math.random(-0.7,0.7)*math.random()/2,y=pos.y+math.random(0.7,1.2),z=pos.z+math.random(-0.7,0.7)*math.random()/2}, - velocity = {x=0, y=math.random(1,1), z=0}, - expirationtime = math.random(), - size = math.random(1, 4), - collisiondetection = true, - vertical = false, - texture = "mcl_particles_smoke_anim.png^[colorize:#424242:255", - animation = { - type = "vertical_frames", - aspect_w = 8, - aspect_h = 8, - length = 2.05, - }, - }) - minetest.add_particle({ - pos = {x=pos.x+math.random(-0.7,0.7)*math.random()/2,y=pos.y+math.random(0.7,1.2),z=pos.z+math.random(-0.7,0.7)*math.random()/2}, - velocity = {x=0, y=math.random(1,1), z=0}, - expirationtime = math.random(), - size = math.random(1, 4), - collisiondetection = true, - vertical = false, - texture = "mcl_particles_smoke_anim.png^[colorize:#0f0f0f:255", - animation = { - type = "vertical_frames", - aspect_w = 8, - aspect_h = 8, - length = 2.05, - }, - }) - end, -}) - -mcl_mobs:spawn_specific( -"mobs_mc:blaze", -"nether", -"ground", -{"Nether"}, -0, -minetest.LIGHT_MAX+1, -30, -5000, -3, -mcl_vars.mg_nether_min, -mcl_vars.mg_nether_max) - --- Blaze fireball -mcl_mobs:register_arrow("mobs_mc:blaze_fireball", { - visual = "sprite", - visual_size = {x = 0.3, y = 0.3}, - textures = {"mcl_fire_fire_charge.png"}, - velocity = 15, - _is_fireball = true, - - -- Direct hit, no fire... just plenty of pain - hit_player = function(self, player) - mcl_burning.set_on_fire(player, 5) - player:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = 5}, - }, nil) - end, - - hit_mob = function(self, mob) - mcl_burning.set_on_fire(mob, 5) - mob:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = 5}, - }, nil) - end, - - hit_object = function(self, object) - local lua = object:get_luaentity() - if lua then - if lua.name == "mcl_minecarts:tnt_minecart" then - lua:on_activate_by_rail(2) - end - end - end, - - -- Node hit, make fire - hit_node = function(self, pos, node) - if node == "air" then - minetest.set_node(pos, {name = "mcl_fire:fire"}) - else - if self._shot_from_dispenser and mod_target and node == "mcl_target:target_off" then - mcl_target.hit(vector.round(pos), 0.4) --4 redstone ticks - end - local v = vector.normalize(self.object:get_velocity()) - local crashpos = vector.subtract(pos, v) - local crashnode = minetest.get_node(crashpos) - local cndef = minetest.registered_nodes[crashnode.name] - -- Set fire if node is air, or a replacable flammable node (e.g. a plant) - if crashnode.name == "air" or - (cndef and cndef.buildable_to and minetest.get_item_group(crashnode.name, "flammable") >= 1) then - minetest.set_node(crashpos, {name = "mcl_fire:fire"}) - end - end - end -}) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:blaze", S("Blaze"), "mobs_mc_spawn_icon_blaze.png", 0) diff --git a/mods/ENTITIES/mobs_mc/chicken.lua b/mods/ENTITIES/mobs_mc/chicken.lua deleted file mode 100644 index a36b585024..0000000000 --- a/mods/ENTITIES/mobs_mc/chicken.lua +++ /dev/null @@ -1,159 +0,0 @@ ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### CHICKEN ---################### - - - -mcl_mobs:register_mob("mobs_mc:chicken", { - description = S("Chicken"), - type = "animal", - spawn_class = "passive", - - hp_min = 4, - hp_max = 4, - xp_min = 1, - xp_max = 3, - collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.69, 0.2}, - runaway = true, - floats = 1, - visual = "mesh", - mesh = "mobs_mc_chicken.b3d", - textures = { - {"mobs_mc_chicken.png"}, - }, - visual_size = {x=2.2, y=2.2}, - - makes_footstep_sound = true, - walk_velocity = 1, - drops = { - {name = "mcl_mobitems:chicken", - chance = 1, - min = 1, - max = 1, - looting = "common",}, - {name = "mcl_mobitems:feather", - chance = 1, - min = 0, - max = 2, - looting = "common",}, - }, - fall_damage = 0, - fall_speed = -2.25, - sounds = { - random = "mobs_mc_chicken_buck", - damage = "mobs_mc_chicken_hurt", - death = "mobs_mc_chicken_hurt", - eat = "mobs_mc_animal_eat_generic", - distance = 16, - }, - sounds_child = { - random = "mobs_mc_chicken_child", - damage = "mobs_mc_chicken_child", - death = "mobs_mc_chicken_child", - eat = "mobs_mc_animal_eat_generic", - distance = 16, - }, - animation = { - stand_speed = 25, walk_speed = 25, run_speed = 50, - stand_start = 0, stand_end = 0, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, - }, - - follow = { - "mcl_farming:wheat_seeds", - "mcl_farming:melon_seeds", - "mcl_farming:pumpkin_seeds", - "mcl_farming:beetroot_seeds", - }, - view_range = 16, - fear_height = 4, - - on_rightclick = function(self, clicker) - if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end - if mcl_mobs:protect(self, clicker) then return end - if mcl_mobs:capture_mob(self, clicker, 0, 60, 5, 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, "mcl_throwing:egg") - - minetest.sound_play("mobs_mc_chicken_lay_egg", { - pos = pos, - gain = 1.0, - max_hear_distance = 16, - }, true) - end, - -}) - ---spawn -mcl_mobs:spawn_specific( -"mobs_mc:chicken", -"overworld", -"ground", -{ - "flat", - "IcePlainsSpikes", - "ColdTaiga", - "ColdTaiga_beach", - "ColdTaiga_beach_water", - "MegaTaiga", - "MegaSpruceTaiga", - "ExtremeHills", - "ExtremeHills_beach", - "ExtremeHillsM", - "ExtremeHills+", - "ExtremeHills+_snowtop", - "StoneBeach", - "Plains", - "Plains_beach", - "SunflowerPlains", - "Taiga", - "Taiga_beach", - "Forest", - "Forest_beach", - "FlowerForest", - "FlowerForest_beach", - "BirchForest", - "BirchForestM", - "RoofedForest", - "Savanna", - "Savanna_beach", - "SavannaM", - "Jungle", - "Jungle_shore", - "JungleM", - "JungleM_shore", - "JungleEdge", - "JungleEdgeM", - "Swampland", - "Swampland_shore" -}, -9, -minetest.LIGHT_MAX+1, -30, 17000, -3, -mobs_mc.water_level, -mcl_vars.mg_overworld_max) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:chicken", S("Chicken"), "mobs_mc_spawn_icon_chicken.png", 0) diff --git a/mods/ENTITIES/mobs_mc/common.lua b/mods/ENTITIES/mobs_mc/common.lua deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua deleted file mode 100644 index b2d6158bc9..0000000000 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ /dev/null @@ -1,218 +0,0 @@ ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - -local cow_def = { - description = S("Cow"), - type = "animal", - spawn_class = "passive", - hp_min = 10, - hp_max = 10, - xp_min = 1, - xp_max = 3, - collisionbox = {-0.45, -0.01, -0.45, 0.45, 1.39, 0.45}, - visual = "mesh", - mesh = "mobs_mc_cow.b3d", - textures = { { - "mobs_mc_cow.png", - "blank.png", - }, }, - visual_size = {x=2.8, y=2.8}, - makes_footstep_sound = true, - walk_velocity = 1, - drops = { - {name = "mcl_mobitems:beef", - chance = 1, - min = 1, - max = 3, - looting = "common",}, - {name = "mcl_mobitems:leather", - chance = 1, - min = 0, - max = 2, - looting = "common",}, - }, - runaway = true, - sounds = { - random = "mobs_mc_cow", - damage = "mobs_mc_cow_hurt", - death = "mobs_mc_cow_hurt", - eat = "mobs_mc_animal_eat_generic", - distance = 16, - }, - animation = { - stand_speed = 25, walk_speed = 40, - run_speed = 60, stand_start = 0, - stand_end = 0, walk_start = 0, - walk_end = 40, run_start = 0, - run_end = 40, - }, - on_rightclick = function(self, clicker) - if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end - if mcl_mobs:protect(self, clicker) then return end - - if self.child then - return - end - - local item = clicker:get_wielded_item() - if item:get_name() == "mcl_buckets:bucket_empty" and clicker:get_inventory() then - local inv = clicker:get_inventory() - inv:remove_item("main", "mcl_buckets:bucket_empty") - minetest.sound_play("mobs_mc_cow_milk", {pos=self.object:get_pos(), gain=0.6}) - -- if room add bucket of milk to inventory, otherwise drop as item - if inv:room_for_item("main", {name = "mcl_mobitems:milk_bucket"}) then - clicker:get_inventory():add_item("main", "mcl_mobitems:milk_bucket") - else - local pos = self.object:get_pos() - pos.y = pos.y + 0.5 - minetest.add_item(pos, {name = "mcl_mobitems:milk_bucket"}) - end - return - end - mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) - end, - follow = "mcl_farming:wheat_item", - view_range = 10, - fear_height = 4, -} - -mcl_mobs:register_mob("mobs_mc:cow", cow_def) - --- Mooshroom -local mooshroom_def = table.copy(cow_def) -mooshroom_def.description = S("Mooshroom") -mooshroom_def.mesh = "mobs_mc_cow.b3d" -mooshroom_def.textures = { {"mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png"}, {"mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } } -mooshroom_def.on_rightclick = function(self, clicker) - if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end - if mcl_mobs:protect(self, clicker) then return end - - if self.child then - return - end - local item = clicker:get_wielded_item() - -- Use shears to get mushrooms and turn mooshroom into cow - if item:get_name() == "mcl_tools:shears" then - local pos = self.object:get_pos() - minetest.sound_play("mcl_tools_shears_cut", {pos = pos}, true) - - if self.base_texture[1] == "mobs_mc_mooshroom_brown.png" then - minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, "mcl_mushrooms:mushroom_brown 5") - else - minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, "mcl_mushrooms:mushroom_red 5") - end - - local oldyaw = self.object:get_yaw() - self.object:remove() - local cow = minetest.add_entity(pos, "mobs_mc:cow") - cow:set_yaw(oldyaw) - - if not minetest.is_creative_enabled(clicker:get_player_name()) then - item:add_wear(mobs_mc.shears_wear) - clicker:get_inventory():set_stack("main", clicker:get_wield_index(), item) - end - -- Use bucket to milk - elseif item:get_name() == "mcl_buckets:bucket_empty" and clicker:get_inventory() then - local inv = clicker:get_inventory() - inv:remove_item("main", "mcl_buckets:bucket_empty") - minetest.sound_play("mobs_mc_cow_milk", {pos=self.object:get_pos(), gain=0.6}) - -- If room, add milk to inventory, otherwise drop as item - if inv:room_for_item("main", {name="mcl_mobitems:milk_bucket"}) then - clicker:get_inventory():add_item("main", "mcl_mobitems:milk_bucket") - else - local pos = self.object:get_pos() - pos.y = pos.y + 0.5 - minetest.add_item(pos, {name = "mcl_mobitems:milk_bucket"}) - end - -- Use bowl to get mushroom stew - elseif item:get_name() == "mcl_core:bowl" and clicker:get_inventory() then - local inv = clicker:get_inventory() - inv:remove_item("main", "mcl_core:bowl") - minetest.sound_play("mobs_mc_cow_mushroom_stew", {pos=self.object:get_pos(), gain=0.6}) - -- If room, add mushroom stew to inventory, otherwise drop as item - if inv:room_for_item("main", {name="mcl_mushrooms:mushroom_stew"}) then - clicker:get_inventory():add_item("main", "mcl_mushrooms:mushroom_stew") - else - local pos = self.object:get_pos() - pos.y = pos.y + 0.5 - minetest.add_item(pos, {name = "mcl_mushrooms:mushroom_stew"}) - end - end - mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) -end -mcl_mobs:register_mob("mobs_mc:mooshroom", mooshroom_def) - - --- Spawning -mcl_mobs:spawn_specific( -"mobs_mc:cow", -"overworld", -"ground", -{ - "flat", - "IcePlainsSpikes", - "ColdTaiga", - "ColdTaiga_beach", - "ColdTaiga_beach_water", - "MegaTaiga", - "MegaSpruceTaiga", - "ExtremeHills", - "ExtremeHills_beach", - "ExtremeHillsM", - "ExtremeHills+", - "ExtremeHills+_snowtop", - "StoneBeach", - "Plains", - "Plains_beach", - "SunflowerPlains", - "Taiga", - "Taiga_beach", - "Forest", - "Forest_beach", - "FlowerForest", - "FlowerForest_beach", - "BirchForest", - "BirchForestM", - "RoofedForest", - "Savanna", - "Savanna_beach", - "SavannaM", - "Jungle", - "Jungle_shore", - "JungleM", - "JungleM_shore", - "JungleEdge", - "JungleEdgeM", - "Swampland", - "Swampland_shore" -}, -9, -minetest.LIGHT_MAX+1, -30, -17000, -10, -mobs_mc.water_level, -mcl_vars.mg_overworld_max) - - - -mcl_mobs:spawn_specific( -"mobs_mc:mooshroom", -"overworld", -"ground", -{ -"MushroomIslandShore", -"MushroomIsland" -}, -9, -minetest.LIGHT_MAX+1, -30, -17000, -5, -mcl_vars.mg_overworld_min, -mcl_vars.mg_overworld_max) - --- spawn egg -mcl_mobs:register_egg("mobs_mc:cow", S("Cow"), "mobs_mc_spawn_icon_cow.png", 0) -mcl_mobs:register_egg("mobs_mc:mooshroom", S("Mooshroom"), "mobs_mc_spawn_icon_mooshroom.png", 0) diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua deleted file mode 100644 index 8d50c67552..0000000000 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ /dev/null @@ -1,411 +0,0 @@ ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### CREEPER ---################### - - - - -mcl_mobs:register_mob("mobs_mc:creeper", { - type = "monster", - spawn_class = "hostile", - hp_min = 20, - hp_max = 20, - xp_min = 5, - xp_max = 5, - collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.69, 0.3}, - pathfinding = 1, - visual = "mesh", - mesh = "mobs_mc_creeper.b3d", - textures = { - {"mobs_mc_creeper.png", - "mobs_mc_empty.png"}, - }, - visual_size = {x=3, y=3}, - sounds = { - attack = "tnt_ignite", - death = "mobs_mc_creeper_death", - damage = "mobs_mc_creeper_hurt", - fuse = "tnt_ignite", - explode = "tnt_explode", - distance = 16, - }, - makes_footstep_sound = true, - walk_velocity = 1.05, - run_velocity = 2.1, - runaway_from = { "mobs_mc:ocelot", "mobs_mc:cat" }, - attack_type = "explode", - - --hssssssssssss - - explosion_strength = 3, - explosion_radius = 3.5, - explosion_damage_radius = 3.5, - explosiontimer_reset_radius = 6, - reach = 3, - explosion_timer = 1.5, - allow_fuse_reset = true, - stop_to_explode = true, - - -- Force-ignite creeper with flint and steel and explode after 1.5 seconds. - -- TODO: Make creeper flash after doing this as well. - -- TODO: Test and debug this code. - on_rightclick = function(self, clicker) - if self._forced_explosion_countdown_timer ~= nil then - return - end - local item = clicker:get_wielded_item() - if item:get_name() == "mcl_fire:flint_and_steel" then - if not minetest.is_creative_enabled(clicker:get_player_name()) then - -- Wear tool - local wdef = item:get_definition() - item:add_wear(1000) - -- Tool break sound - if item:get_count() == 0 and wdef.sound and wdef.sound.breaks then - minetest.sound_play(wdef.sound.breaks, {pos = clicker:get_pos(), gain = 0.5}, true) - end - clicker:set_wielded_item(item) - end - self._forced_explosion_countdown_timer = self.explosion_timer - minetest.sound_play(self.sounds.attack, {pos = self.object:get_pos(), gain = 1, max_hear_distance = 16}, true) - end - end, - do_custom = function(self, dtime) - if self._forced_explosion_countdown_timer ~= nil then - self._forced_explosion_countdown_timer = self._forced_explosion_countdown_timer - dtime - if self._forced_explosion_countdown_timer <= 0 then - mcl_mobs:boom(self, mcl_util.get_object_center(self.object), self.explosion_strength) - end - end - end, - on_die = function(self, pos, cmi_cause) - -- Drop a random music disc when killed by skeleton or stray - if cmi_cause and cmi_cause.type == "punch" then - local luaentity = cmi_cause.puncher and cmi_cause.puncher:get_luaentity() - if luaentity and luaentity.name:find("arrow") then - local shooter_luaentity = luaentity._shooter and luaentity._shooter:get_luaentity() - if shooter_luaentity and (shooter_luaentity.name == "mobs_mc:skeleton" or shooter_luaentity.name == "mobs_mc:stray") then - minetest.add_item({x=pos.x, y=pos.y+1, z=pos.z}, "mcl_jukebox:record_" .. math.random(9)) - end - end - end - end, - maxdrops = 2, - drops = { - {name = "mcl_mobitems:gunpowder", - chance = 1, - min = 0, - max = 2, - looting = "common",}, - - -- Head - -- TODO: Only drop if killed by charged creeper - {name = "mcl_heads:creeper", - chance = 200, -- 0.5% - min = 1, - max = 1,}, - }, - animation = { - speed_normal = 24, - speed_run = 48, - stand_start = 0, - stand_end = 23, - walk_start = 24, - walk_end = 49, - run_start = 24, - run_end = 49, - hurt_start = 110, - hurt_end = 139, - death_start = 140, - death_end = 189, - look_start = 50, - look_end = 108, - }, - floats = 1, - fear_height = 4, - view_range = 16, -}) - -mcl_mobs:register_mob("mobs_mc:creeper_charged", { - description = S("Creeper"), - type = "monster", - spawn_class = "hostile", - hp_min = 20, - hp_max = 20, - xp_min = 5, - xp_max = 5, - collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.69, 0.3}, - pathfinding = 1, - visual = "mesh", - mesh = "mobs_mc_creeper.b3d", - - --BOOM - - textures = { - {"mobs_mc_creeper.png", - "mobs_mc_creeper_charge.png"}, - }, - visual_size = {x=3, y=3}, - sounds = { - attack = "tnt_ignite", - death = "mobs_mc_creeper_death", - damage = "mobs_mc_creeper_hurt", - fuse = "tnt_ignite", - explode = "tnt_explode", - distance = 16, - }, - makes_footstep_sound = true, - walk_velocity = 1.05, - run_velocity = 2.1, - runaway_from = { "mobs_mc:ocelot", "mobs_mc:cat" }, - attack_type = "explode", - - explosion_strength = 6, - explosion_radius = 8, - explosion_damage_radius = 8, - explosiontimer_reset_radius = 6, - reach = 3, - explosion_timer = 1.5, - allow_fuse_reset = true, - stop_to_explode = true, - - -- Force-ignite creeper with flint and steel and explode after 1.5 seconds. - -- TODO: Make creeper flash after doing this as well. - -- TODO: Test and debug this code. - on_rightclick = function(self, clicker) - if self._forced_explosion_countdown_timer ~= nil then - return - end - local item = clicker:get_wielded_item() - if item:get_name() == "mcl_fire:flint_and_steel" then - if not minetest.is_creative_enabled(clicker:get_player_name()) then - -- Wear tool - local wdef = item:get_definition() - item:add_wear(1000) - -- Tool break sound - if item:get_count() == 0 and wdef.sound and wdef.sound.breaks then - minetest.sound_play(wdef.sound.breaks, {pos = clicker:get_pos(), gain = 0.5}, true) - end - clicker:set_wielded_item(item) - end - self._forced_explosion_countdown_timer = self.explosion_timer - minetest.sound_play(self.sounds.attack, {pos = self.object:get_pos(), gain = 1, max_hear_distance = 16}, true) - end - end, - do_custom = function(self, dtime) - if self._forced_explosion_countdown_timer ~= nil then - self._forced_explosion_countdown_timer = self._forced_explosion_countdown_timer - dtime - if self._forced_explosion_countdown_timer <= 0 then - mcl_mobs:boom(self, mcl_util.get_object_center(self.object), self.explosion_strength) - end - end - end, - on_die = function(self, pos, cmi_cause) - -- Drop a random music disc when killed by skeleton or stray - if cmi_cause and cmi_cause.type == "punch" then - local luaentity = cmi_cause.puncher and cmi_cause.puncher:get_luaentity() - if luaentity and luaentity.name:find("arrow") then - local shooter_luaentity = luaentity._shooter and luaentity._shooter:get_luaentity() - if shooter_luaentity and (shooter_luaentity.name == "mobs_mc:skeleton" or shooter_luaentity.name == "mobs_mc:stray") then - minetest.add_item({x=pos.x, y=pos.y+1, z=pos.z}, "mcl_jukebox:record_" .. math.random(9)) - end - end - end - end, - maxdrops = 2, - drops = { - {name = "mcl_mobitems:gunpowder", - chance = 1, - min = 0, - max = 2, - looting = "common",}, - - -- Head - -- TODO: Only drop if killed by charged creeper - {name = "mcl_heads:creeper", - chance = 200, -- 0.5% - min = 1, - max = 1,}, - }, - animation = { - speed_normal = 24, - speed_run = 48, - stand_start = 0, - stand_end = 23, - walk_start = 24, - walk_end = 49, - run_start = 24, - run_end = 49, - hurt_start = 110, - hurt_end = 139, - death_start = 140, - death_end = 189, - look_start = 50, - look_end = 108, - }, - floats = 1, - fear_height = 4, - view_range = 16, - --Having trouble when fire is placed with lightning - fire_resistant = true, - glow = 3, -}) - -mcl_mobs:spawn_specific( -"mobs_mc:creeper", -"overworld", -"ground", -{ -"Mesa", -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"Jungle", -"Savanna", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"Desert", -"ColdTaiga", -"MushroomIsland", -"IcePlainsSpikes", -"SunflowerPlains", -"IcePlains", -"RoofedForest", -"ExtremeHills+_snowtop", -"MesaPlateauFM_grasstop", -"JungleEdgeM", -"ExtremeHillsM", -"JungleM", -"BirchForestM", -"MesaPlateauF", -"MesaPlateauFM", -"MesaPlateauF_grasstop", -"MesaBryce", -"JungleEdge", -"SavannaM", -"FlowerForest_beach", -"Forest_beach", -"StoneBeach", -"ColdTaiga_beach_water", -"Taiga_beach", -"Savanna_beach", -"Plains_beach", -"ExtremeHills_beach", -"ColdTaiga_beach", -"Swampland_shore", -"MushroomIslandShore", -"JungleM_shore", -"Jungle_shore", -"MesaPlateauFM_sandlevel", -"MesaPlateauF_sandlevel", -"MesaBryce_sandlevel", -"Mesa_sandlevel", -"RoofedForest_ocean", -"JungleEdgeM_ocean", -"BirchForestM_ocean", -"BirchForest_ocean", -"IcePlains_deep_ocean", -"Jungle_deep_ocean", -"Savanna_ocean", -"MesaPlateauF_ocean", -"ExtremeHillsM_deep_ocean", -"Savanna_deep_ocean", -"SunflowerPlains_ocean", -"Swampland_deep_ocean", -"Swampland_ocean", -"MegaSpruceTaiga_deep_ocean", -"ExtremeHillsM_ocean", -"JungleEdgeM_deep_ocean", -"SunflowerPlains_deep_ocean", -"BirchForest_deep_ocean", -"IcePlainsSpikes_ocean", -"Mesa_ocean", -"StoneBeach_ocean", -"Plains_deep_ocean", -"JungleEdge_deep_ocean", -"SavannaM_deep_ocean", -"Desert_deep_ocean", -"Mesa_deep_ocean", -"ColdTaiga_deep_ocean", -"Plains_ocean", -"MesaPlateauFM_ocean", -"Forest_deep_ocean", -"JungleM_deep_ocean", -"FlowerForest_deep_ocean", -"MushroomIsland_ocean", -"MegaTaiga_ocean", -"StoneBeach_deep_ocean", -"IcePlainsSpikes_deep_ocean", -"ColdTaiga_ocean", -"SavannaM_ocean", -"MesaPlateauF_deep_ocean", -"MesaBryce_deep_ocean", -"ExtremeHills+_deep_ocean", -"ExtremeHills_ocean", -"MushroomIsland_deep_ocean", -"Forest_ocean", -"MegaTaiga_deep_ocean", -"JungleEdge_ocean", -"MesaBryce_ocean", -"MegaSpruceTaiga_ocean", -"ExtremeHills+_ocean", -"Jungle_ocean", -"RoofedForest_deep_ocean", -"IcePlains_ocean", -"FlowerForest_ocean", -"ExtremeHills_deep_ocean", -"MesaPlateauFM_deep_ocean", -"Desert_ocean", -"Taiga_ocean", -"BirchForestM_deep_ocean", -"Taiga_deep_ocean", -"JungleM_ocean", -"FlowerForest_underground", -"JungleEdge_underground", -"StoneBeach_underground", -"MesaBryce_underground", -"Mesa_underground", -"RoofedForest_underground", -"Jungle_underground", -"Swampland_underground", -"MushroomIsland_underground", -"BirchForest_underground", -"Plains_underground", -"MesaPlateauF_underground", -"ExtremeHills_underground", -"MegaSpruceTaiga_underground", -"BirchForestM_underground", -"SavannaM_underground", -"MesaPlateauFM_underground", -"Desert_underground", -"Savanna_underground", -"Forest_underground", -"SunflowerPlains_underground", -"ColdTaiga_underground", -"IcePlains_underground", -"IcePlainsSpikes_underground", -"MegaTaiga_underground", -"Taiga_underground", -"ExtremeHills+_underground", -"JungleM_underground", -"ExtremeHillsM_underground", -"JungleEdgeM_underground", -}, -0, -7, -20, -16500, -2, -mcl_vars.mg_overworld_min, -mcl_vars.mg_overworld_max) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:creeper", S("Creeper"), "mobs_mc_spawn_icon_creeper.png", 0) diff --git a/mods/ENTITIES/mobs_mc/depends.txt b/mods/ENTITIES/mobs_mc/depends.txt deleted file mode 100644 index 674eb80940..0000000000 --- a/mods/ENTITIES/mobs_mc/depends.txt +++ /dev/null @@ -1 +0,0 @@ -mcl_mobs \ No newline at end of file diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua deleted file mode 100644 index d2f971f79c..0000000000 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ /dev/null @@ -1,142 +0,0 @@ ---################### ---################### ENDERDRAGON ---################### - -local S = minetest.get_translator("mobs_mc") - -mcl_mobs:register_mob("mobs_mc:enderdragon", { - description = S("Ender Dragon"), - type = "monster", - spawn_class = "hostile", - pathfinding = 1, - attacks_animals = true, - walk_chance = 100, - hp_max = 200, - hp_min = 200, - xp_min = 500, - xp_max = 500, - collisionbox = {-2, 3, -2, 2, 5, 2}, - physical = false, - visual = "mesh", - mesh = "mobs_mc_dragon.b3d", - textures = { - {"mobs_mc_dragon.png"}, - }, - visual_size = {x=3, y=3}, - view_range = 35, - walk_velocity = 6, - run_velocity = 6, - can_despawn = false, - sounds = { - -- TODO: more sounds - shoot_attack = "mobs_mc_ender_dragon_shoot", - attack = "mobs_mc_ender_dragon_attack", - distance = 60, - }, - physical = true, - damage = 10, - jump = true, - jump_height = 14, - fly = true, - makes_footstep_sound = false, - dogshoot_switch = 1, - dogshoot_count_max =5, - dogshoot_count2_max = 5, - passive = false, - attack_animals = true, - lava_damage = 0, - fire_damage = 0, - on_rightclick = nil, - attack_type = "dogshoot", - arrow = "mobs_mc:dragon_fireball", - shoot_interval = 0.5, - shoot_offset = -1.0, - xp_min = 500, - xp_max = 500, - animation = { - fly_speed = 8, stand_speed = 8, - stand_start = 0, stand_end = 20, - walk_start = 0, walk_end = 20, - run_start = 0, run_end = 20, - }, - ignores_nametag = true, - do_custom = function(self) - mcl_bossbars.update_boss(self.object, "Ender Dragon", "light_purple") - for _, obj in ipairs(minetest.get_objects_inside_radius(self.object:get_pos(), 80)) do - local luaentity = obj:get_luaentity() - if luaentity and luaentity.name == "mcl_end:crystal" then - if luaentity.beam then - if luaentity.beam == self.beam then - break - end - else - if self.beam then - self.beam:remove() - end - minetest.add_entity(self.object:get_pos(), "mcl_end:crystal_beam"):get_luaentity():init(self.object, obj) - break - end - end - end - if self._portal_pos then - -- migrate old format - if type(self._portal_pos) == "string" then - self._portal_pos = minetest.string_to_pos(self._portal_pos) - end - local portal_center = vector.add(self._portal_pos, vector.new(3, 11, 3)) - local pos = self.object:get_pos() - if vector.distance(pos, portal_center) > 50 then - self.object:set_pos(self._last_good_pos or portal_center) - else - self._last_good_pos = pos - end - end - end, - on_die = function(self, pos) - if self._portal_pos then - mcl_portals.spawn_gateway_portal() - mcl_structures.call_struct(self._portal_pos, "end_exit_portal_open") - if self._initial then - mcl_experience.throw_xp(pos, 11500) -- 500 + 11500 = 12000 - minetest.set_node(vector.add(self._portal_pos, vector.new(3, 5, 3)), {name = "mcl_end:dragon_egg"}) - end - end - end, - fire_resistant = true, -}) - - -local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false - --- dragon fireball (projectile) -mcl_mobs:register_arrow("mobs_mc:dragon_fireball", { - visual = "sprite", - visual_size = {x = 1.25, y = 1.25}, - textures = {"mobs_mc_dragon_fireball.png"}, - velocity = 6, - - -- direct hit, no fire... just plenty of pain - hit_player = function(self, player) - player:punch(self.object, 1.0, { - full_punch_interval = 0.5, - damage_groups = {fleshy = 12}, - }, nil) - end, - - hit_mob = function(self, mob) - minetest.sound_play("tnt_explode", {pos = mob:get_pos(), gain = 1.5, max_hear_distance = 2*64}, true) - mob:punch(self.object, 1.0, { - full_punch_interval = 0.5, - damage_groups = {fleshy = 12}, - }, nil) - end, - - -- node hit, explode - hit_node = function(self, pos, node) - mcl_mobs:boom(self, pos, 2) - end -}) - -mcl_mobs:register_egg("mobs_mc:enderdragon", S("Ender Dragon"), "mobs_mc_spawn_icon_dragon.png", 0, true) - -mcl_wip.register_wip_item("mobs_mc:enderdragon") diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua deleted file mode 100644 index 9ed59bb1fb..0000000000 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ /dev/null @@ -1,780 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - --- ENDERMAN BEHAVIOUR (OLD): --- In this game, endermen attack the player on sight, like other monsters do. --- However, they have a reduced viewing range to make them less dangerous. --- This differs from MC, in which endermen only become hostile when provoked, --- and they are provoked by looking directly at them. - --- Rootyjr ------------------------------ --- implemented ability to detect when seen / break eye contact and aggressive response --- implemented teleport to avoid arrows. --- implemented teleport to avoid rain. --- implemented teleport to chase. --- added enderman particles. --- drew mcl_portal_particle1.png --- drew mcl_portal_particle2.png --- drew mcl_portal_particle3.png --- drew mcl_portal_particle4.png --- drew mcl_portal_particle5.png --- added rain damage. --- fixed the grass_with_dirt issue. - -local S = minetest.get_translator("mobs_mc") - -local telesound = function(pos, is_source) - local snd - if is_source then - snd = "mobs_mc_enderman_teleport_src" - else - snd = "mobs_mc_enderman_teleport_dst" - end - minetest.sound_play(snd, {pos=pos, max_hear_distance=16}, true) -end - ---################### ---################### ENDERMAN ---################### - -local pr = PseudoRandom(os.time()*(-334)) - --- How freqeuntly to take and place blocks, in seconds -local take_frequency_min = 235 -local take_frequency_max = 245 -local place_frequency_min = 235 -local place_frequency_max = 245 - - --- Texuture overrides for enderman block. Required for cactus because it's original is a nodebox --- and the textures have tranparent pixels. -local block_texture_overrides -do - local cbackground = "mobs_mc_enderman_cactus_background.png" - local ctiles = minetest.registered_nodes["mcl_core:cactus"].tiles - - local ctable = {} - local last - for i=1, 6 do - if ctiles[i] then - last = ctiles[i] - end - table.insert(ctable, cbackground .. "^" .. last) - end - - block_texture_overrides = { - ["mcl_core:cactus"] = ctable, - -- FIXME: replace colorize colors with colors from palette - ["mcl_core:dirt_with_grass"] = - { - "mcl_core_grass_block_top.png^[colorize:green:90", - "default_dirt.png", - "default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)", - "default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)", - "default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)", - "default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)"} - } -end - --- Create the textures table for the enderman, depending on which kind of block --- the enderman holds (if any). -local create_enderman_textures = function(block_type, itemstring) - local base = "mobs_mc_enderman.png^mobs_mc_enderman_eyes.png" - - --[[ Order of the textures in the texture table: - Flower, 90 degrees - Flower, 45 degrees - Held block, backside - Held block, bottom - Held block, front - Held block, left - Held block, right - Held block, top - Enderman texture (base) - ]] - -- Regular cube - if block_type == "cube" then - local tiles = minetest.registered_nodes[itemstring].tiles - local textures = {} - local last - if block_texture_overrides[itemstring] then - -- Texture override available? Use these instead! - textures = block_texture_overrides[itemstring] - else - -- Extract the texture names - for i = 1, 6 do - if type(tiles[i]) == "string" then - last = tiles[i] - elseif type(tiles[i]) == "table" then - if tiles[i].name then - last = tiles[i].name - end - end - table.insert(textures, last) - end - end - return { - "blank.png", - "blank.png", - textures[5], - textures[2], - textures[6], - textures[3], - textures[4], - textures[1], - base, -- Enderman texture - } - -- Node of plantlike drawtype, 45° (recommended) - elseif block_type == "plantlike45" then - local textures = minetest.registered_nodes[itemstring].tiles - return { - "blank.png", - textures[1], - "blank.png", - "blank.png", - "blank.png", - "blank.png", - "blank.png", - "blank.png", - base, - } - -- Node of plantlike drawtype, 90° - elseif block_type == "plantlike90" then - local textures = minetest.registered_nodes[itemstring].tiles - return { - textures[1], - "blank.png", - "blank.png", - "blank.png", - "blank.png", - "blank.png", - "blank.png", - "blank.png", - base, - } - elseif block_type == "unknown" then - return { - "blank.png", - "blank.png", - "unknown_node.png", - "unknown_node.png", - "unknown_node.png", - "unknown_node.png", - "unknown_node.png", - "unknown_node.png", - base, -- Enderman texture - } - -- No block held (for initial texture) - elseif block_type == "nothing" or block_type == nil then - return { - "blank.png", - "blank.png", - "blank.png", - "blank.png", - "blank.png", - "blank.png", - "blank.png", - "blank.png", - base, -- Enderman texture - } - end -end - --- Select a new animation definition. -local select_enderman_animation = function(animation_type) - -- Enderman holds a block - if animation_type == "block" then - return { - walk_speed = 25, - run_speed = 50, - stand_speed = 25, - stand_start = 200, - stand_end = 200, - walk_start = 161, - walk_end = 200, - run_start = 161, - run_end = 200, - punch_start = 121, - punch_end = 160, - } - -- Enderman doesn't hold a block - elseif animation_type == "normal" or animation_type == nil then - return { - walk_speed = 25, - run_speed = 50, - stand_speed = 25, - stand_start = 40, - stand_end = 80, - walk_start = 0, - walk_end = 40, - run_start = 0, - run_end = 40, - punch_start = 81, - punch_end = 120, - } - end -end - -local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false - -mcl_mobs:register_mob("mobs_mc:enderman", { - description = S("Enderman"), - type = "monster", - spawn_class = "passive", - passive = true, - pathfinding = 1, - hp_min = 40, - hp_max = 40, - xp_min = 5, - xp_max = 5, - collisionbox = {-0.3, -0.01, -0.3, 0.3, 2.89, 0.3}, - visual = "mesh", - mesh = "mobs_mc_enderman.b3d", - textures = create_enderman_textures(), - visual_size = {x=3, y=3}, - makes_footstep_sound = true, - sounds = { - -- TODO: Custom war cry sound - war_cry = "mobs_sandmonster", - death = {name="mobs_mc_enderman_death", gain=0.7}, - damage = {name="mobs_mc_enderman_hurt", gain=0.5}, - random = {name="mobs_mc_enderman_random", gain=0.5}, - distance = 16, - }, - walk_velocity = 0.2, - run_velocity = 3.4, - damage = 7, - reach = 2, - drops = { - {name = "mcl_throwing:ender_pearl", - chance = 1, - min = 0, - max = 1, - looting = "common"}, - }, - animation = select_enderman_animation("normal"), - _taken_node = "", - do_custom = function(self, dtime) - -- PARTICLE BEHAVIOUR HERE. - local enderpos = self.object:get_pos() - local chanceOfParticle = math.random(0, 1) - if chanceOfParticle == 1 then - minetest.add_particle({ - pos = {x=enderpos.x+math.random(-1,1)*math.random()/2,y=enderpos.y+math.random(0,3),z=enderpos.z+math.random(-1,1)*math.random()/2}, - velocity = {x=math.random(-.25,.25), y=math.random(-.25,.25), z=math.random(-.25,.25)}, - acceleration = {x=math.random(-.5,.5), y=math.random(-.5,.5), z=math.random(-.5,.5)}, - expirationtime = math.random(), - size = math.random(), - collisiondetection = true, - vertical = false, - texture = "mcl_portals_particle"..math.random(1, 5)..".png", - }) - end - -- RAIN DAMAGE / EVASIVE WARP BEHAVIOUR HERE. - local dim = mcl_worlds.pos_to_dimension(enderpos) - if dim == "overworld" then - if mcl_weather.state == "rain" or mcl_weather.state == "lightning" then - local damage = true - local enderpos = self.object:get_pos() - enderpos.y = enderpos.y+2.89 - local height = {x=enderpos.x, y=enderpos.y+512,z=enderpos.z} - local ray = minetest.raycast(enderpos, height, true) - -- Check for blocks above enderman. - for pointed_thing in ray do - if pointed_thing.type == "node" then - local nn = minetest.get_node(minetest.get_pointed_thing_position(pointed_thing)).name - local def = minetest.registered_nodes[nn] - if (not def) or def.walkable then - -- There's a node in the way. Delete arrow without damage - damage = false - break - end - end - end - - if damage == true then - self.state = "" - --rain hurts enderman - self.object:punch(self.object, 1.0, { - full_punch_interval=1.0, - damage_groups={fleshy=self._damage}, - }, nil) - --randomly teleport hopefully under something. - self:teleport(nil) - end - end - else return end - -- AGRESSIVELY WARP/CHASE PLAYER BEHAVIOUR HERE. - if self.state == "attack" then - --if (minetest.get_timeofday() * 24000) > 5001 and (minetest.get_timeofday() * 24000) < 19000 then - --self:teleport(nil) - --self.state = "" - --else - if self.attack then - local target = self.attack - local pos = target:get_pos() - if pos ~= nil then - if vector.distance(self.object:get_pos(), target:get_pos()) > 10 then - self:teleport(target) - end - end - end - --end - end - -- ARROW / DAYTIME PEOPLE AVOIDANCE BEHAVIOUR HERE. - -- Check for arrows and people nearby. - local enderpos = self.object:get_pos() - enderpos.y = enderpos.y + 1.5 - local objs = minetest.get_objects_inside_radius(enderpos, 2) - for n = 1, #objs do - local obj = objs[n] - if obj then - if minetest.is_player(obj) then - -- Warp from players during day. - --if (minetest.get_timeofday() * 24000) > 5001 and (minetest.get_timeofday() * 24000) < 19000 then - -- self:teleport(nil) - --end - else - local lua = obj:get_luaentity() - if lua then - if lua.name == "mcl_bows:arrow_entity" or lua.name == "mcl_throwing:snowball_entity" then - self:teleport(nil) - end - end - end - end - end - -- PROVOKED BEHAVIOUR HERE. - local enderpos = self.object:get_pos() - if self.provoked == "broke_contact" then - self.provoked = "false" - --if (minetest.get_timeofday() * 24000) > 5001 and (minetest.get_timeofday() * 24000) < 19000 then - -- self:teleport(nil) - -- self.state = "" - --else - if self.attack ~= nil and not minetest.settings:get_bool("creative_mode") then - self.state = 'attack' - end - --end - end - -- Check to see if people are near by enough to look at us. - for _,obj in pairs(minetest.get_connected_players()) do - - --check if they are within radius - local player_pos = obj:get_pos() - if player_pos then -- prevent crashing in 1 in a million scenario - - local ender_distance = vector.distance(enderpos, player_pos) - if ender_distance <= 64 then - - -- Check if they are looking at us. - local look_dir_not_normalized = obj:get_look_dir() - local look_dir = vector.normalize(look_dir_not_normalized) - local player_eye_height = obj:get_properties().eye_height - - --skip player if they have no data - log it - if not player_eye_height then - minetest.log("error", "Enderman at location: ".. dump(enderpos).." has indexed a null player!") - else - - --calculate very quickly the exact location the player is looking - --within the distance between the two "heads" (player and enderman) - local look_pos = vector.new(player_pos.x, player_pos.y + player_eye_height, player_pos.z) - local look_pos_base = look_pos - local ender_eye_pos = vector.new(enderpos.x, enderpos.y + 2.75, enderpos.z) - local eye_distance_from_player = vector.distance(ender_eye_pos, look_pos) - look_pos = vector.add(look_pos, vector.multiply(look_dir, eye_distance_from_player)) - - --if looking in general head position, turn hostile - if minetest.line_of_sight(ender_eye_pos, look_pos_base) and vector.distance(look_pos, ender_eye_pos) <= 0.4 then - self.provoked = "staring" - self.attack = minetest.get_player_by_name(obj:get_player_name()) - break - else -- I'm not sure what this part does, but I don't want to break anything - jordan4ibanez - if self.provoked == "staring" then - self.provoked = "broke_contact" - end - end - - end - end - end - end - -- TAKE AND PLACE STUFF BEHAVIOUR BELOW. - if not mobs_griefing then - return - end - -- Take and put nodes - if not self._take_place_timer or not self._next_take_place_time then - self._take_place_timer = 0 - self._next_take_place_time = math.random(take_frequency_min, take_frequency_max) - return - end - self._take_place_timer = self._take_place_timer + dtime - if (self._taken_node == nil or self._taken_node == "") and self._take_place_timer >= self._next_take_place_time then - -- Take random node - self._take_place_timer = 0 - self._next_take_place_time = math.random(place_frequency_min, place_frequency_max) - local pos = self.object:get_pos() - local takable_nodes = minetest.find_nodes_in_area_under_air({x=pos.x-2, y=pos.y-1, z=pos.z-2}, {x=pos.x+2, y=pos.y+1, z=pos.z+2}, "group:enderman_takable") - if #takable_nodes >= 1 then - local r = pr:next(1, #takable_nodes) - local take_pos = takable_nodes[r] - local node = minetest.get_node(take_pos) - -- Don't destroy protected stuff. - if not minetest.is_protected(take_pos, "") then - minetest.remove_node(take_pos) - local dug = minetest.get_node_or_nil(take_pos) - if dug and dug.name == "air" then - self._taken_node = node.name - local def = minetest.registered_nodes[self._taken_node] - -- Update animation and texture accordingly (adds visibly carried block) - local block_type - -- Cube-shaped - if def.drawtype == "normal" or - def.drawtype == "nodebox" or - def.drawtype == "liquid" or - def.drawtype == "flowingliquid" or - def.drawtype == "glasslike" or - def.drawtype == "glasslike_framed" or - def.drawtype == "glasslike_framed_optional" or - def.drawtype == "allfaces" or - def.drawtype == "allfaces_optional" or - def.drawtype == nil then - block_type = "cube" - elseif def.drawtype == "plantlike" then - -- Flowers and stuff - block_type = "plantlike45" - elseif def.drawtype == "airlike" then - -- Just air - block_type = nil - else - -- Fallback for complex drawtypes - block_type = "unknown" - end - self.base_texture = create_enderman_textures(block_type, self._taken_node) - self.object:set_properties({ textures = self.base_texture }) - self.animation = select_enderman_animation("block") - mcl_mobs:set_animation(self, self.animation.current) - if def.sounds and def.sounds.dug then - minetest.sound_play(def.sounds.dug, {pos = take_pos, max_hear_distance = 16}, true) - end - end - end - end - elseif self._taken_node ~= nil and self._taken_node ~= "" and self._take_place_timer >= self._next_take_place_time then - -- Place taken node - self._take_place_timer = 0 - self._next_take_place_time = math.random(take_frequency_min, take_frequency_max) - local pos = self.object:get_pos() - local yaw = self.object:get_yaw() - -- Place node at looking direction - local place_pos = vector.subtract(pos, minetest.facedir_to_dir(minetest.dir_to_facedir(minetest.yaw_to_dir(yaw)))) - -- Also check to see if protected. - if minetest.get_node(place_pos).name == "air" and not minetest.is_protected(place_pos, "") then - -- ... but only if there's a free space - local success = minetest.place_node(place_pos, {name = self._taken_node}) - if success then - local def = minetest.registered_nodes[self._taken_node] - -- Update animation accordingly (removes visible block) - self.animation = select_enderman_animation("normal") - mcl_mobs:set_animation(self, self.animation.current) - if def.sounds and def.sounds.place then - minetest.sound_play(def.sounds.place, {pos = place_pos, max_hear_distance = 16}, true) - end - self._taken_node = "" - end - end - end - end, - do_teleport = function(self, target) - if target ~= nil then - local target_pos = target:get_pos() - -- Find all solid nodes below air in a 10×10×10 cuboid centered on the target - local nodes = minetest.find_nodes_in_area_under_air(vector.subtract(target_pos, 5), vector.add(target_pos, 5), {"group:solid", "group:cracky", "group:crumbly"}) - local telepos - if nodes ~= nil then - if #nodes > 0 then - -- Up to 64 attempts to teleport - for n=1, math.min(64, #nodes) do - local r = pr:next(1, #nodes) - local nodepos = nodes[r] - local node_ok = true - -- Selected node needs to have 3 nodes of free space above - for u=1, 3 do - local node = minetest.get_node({x=nodepos.x, y=nodepos.y+u, z=nodepos.z}) - local ndef = minetest.registered_nodes[node.name] - if ndef and ndef.walkable then - node_ok = false - break - end - end - if node_ok then - telepos = {x=nodepos.x, y=nodepos.y+1, z=nodepos.z} - end - end - if telepos then - telesound(self.object:get_pos(), false) - self.object:set_pos(telepos) - telesound(telepos, true) - end - end - end - else - -- Attempt to randomly teleport enderman - local pos = self.object:get_pos() - -- Up to 8 top-level attempts to teleport - for n=1, 8 do - local node_ok = false - -- We need to add (or subtract) different random numbers to each vector component, so it couldn't be done with a nice single vector.add() or .subtract(): - local randomCube = vector.new( pos.x + 8*(pr:next(0,16)-8), pos.y + 8*(pr:next(0,16)-8), pos.z + 8*(pr:next(0,16)-8) ) - local nodes = minetest.find_nodes_in_area_under_air(vector.subtract(randomCube, 4), vector.add(randomCube, 4), {"group:solid", "group:cracky", "group:crumbly"}) - if nodes ~= nil then - if #nodes > 0 then - -- Up to 8 low-level (in total up to 8*8 = 64) attempts to teleport - for n=1, math.min(8, #nodes) do - local r = pr:next(1, #nodes) - local nodepos = nodes[r] - node_ok = true - for u=1, 3 do - local node = minetest.get_node({x=nodepos.x, y=nodepos.y+u, z=nodepos.z}) - local ndef = minetest.registered_nodes[node.name] - if ndef and ndef.walkable then - node_ok = false - break - end - end - if node_ok then - telesound(self.object:get_pos(), false) - local telepos = {x=nodepos.x, y=nodepos.y+1, z=nodepos.z} - self.object:set_pos(telepos) - telesound(telepos, true) - break - end - end - end - end - if node_ok then - break - end - end - end - end, - on_die = function(self, pos) - -- Drop carried node on death - if self._taken_node ~= nil and self._taken_node ~= "" then - minetest.add_item(pos, self._taken_node) - end - end, - do_punch = function(self, hitter, tflp, tool_caps, dir) - -- damage from rain caused by itself so we don't want it to attack itself. - if hitter ~= self.object and hitter ~= nil then - --if (minetest.get_timeofday() * 24000) > 5001 and (minetest.get_timeofday() * 24000) < 19000 then - -- self:teleport(nil) - --else - if pr:next(1, 8) == 8 then --FIXME: real mc rate - self:teleport(hitter) - end - self.attack=hitter - self.state="attack" - --end - end - end, - armor = { fleshy = 100, water_vulnerable = 100 }, - water_damage = 8, - view_range = 64, - fear_height = 4, - attack_type = "dogfight", -}) - - --- End spawn -mcl_mobs:spawn_specific( -"mobs_mc:enderman", -"end", -"ground", -{ -"End" -}, -0, -minetest.LIGHT_MAX+1, -30, -3000, -12, -mcl_vars.mg_end_min, -mcl_vars.mg_end_max) --- Overworld spawn -mcl_mobs:spawn_specific( -"mobs_mc:enderman", -"overworld", -"ground", -{ -"Mesa", -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"Jungle", -"Savanna", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"Desert", -"ColdTaiga", -"MushroomIsland", -"IcePlainsSpikes", -"SunflowerPlains", -"IcePlains", -"RoofedForest", -"ExtremeHills+_snowtop", -"MesaPlateauFM_grasstop", -"JungleEdgeM", -"ExtremeHillsM", -"JungleM", -"BirchForestM", -"MesaPlateauF", -"MesaPlateauFM", -"MesaPlateauF_grasstop", -"MesaBryce", -"JungleEdge", -"SavannaM", -"FlowerForest_beach", -"Forest_beach", -"StoneBeach", -"ColdTaiga_beach_water", -"Taiga_beach", -"Savanna_beach", -"Plains_beach", -"ExtremeHills_beach", -"ColdTaiga_beach", -"Swampland_shore", -"MushroomIslandShore", -"JungleM_shore", -"Jungle_shore", -"MesaPlateauFM_sandlevel", -"MesaPlateauF_sandlevel", -"MesaBryce_sandlevel", -"Mesa_sandlevel", -"RoofedForest_ocean", -"JungleEdgeM_ocean", -"BirchForestM_ocean", -"BirchForest_ocean", -"IcePlains_deep_ocean", -"Jungle_deep_ocean", -"Savanna_ocean", -"MesaPlateauF_ocean", -"ExtremeHillsM_deep_ocean", -"Savanna_deep_ocean", -"SunflowerPlains_ocean", -"Swampland_deep_ocean", -"Swampland_ocean", -"MegaSpruceTaiga_deep_ocean", -"ExtremeHillsM_ocean", -"JungleEdgeM_deep_ocean", -"SunflowerPlains_deep_ocean", -"BirchForest_deep_ocean", -"IcePlainsSpikes_ocean", -"Mesa_ocean", -"StoneBeach_ocean", -"Plains_deep_ocean", -"JungleEdge_deep_ocean", -"SavannaM_deep_ocean", -"Desert_deep_ocean", -"Mesa_deep_ocean", -"ColdTaiga_deep_ocean", -"Plains_ocean", -"MesaPlateauFM_ocean", -"Forest_deep_ocean", -"JungleM_deep_ocean", -"FlowerForest_deep_ocean", -"MushroomIsland_ocean", -"MegaTaiga_ocean", -"StoneBeach_deep_ocean", -"IcePlainsSpikes_deep_ocean", -"ColdTaiga_ocean", -"SavannaM_ocean", -"MesaPlateauF_deep_ocean", -"MesaBryce_deep_ocean", -"ExtremeHills+_deep_ocean", -"ExtremeHills_ocean", -"MushroomIsland_deep_ocean", -"Forest_ocean", -"MegaTaiga_deep_ocean", -"JungleEdge_ocean", -"MesaBryce_ocean", -"MegaSpruceTaiga_ocean", -"ExtremeHills+_ocean", -"Jungle_ocean", -"RoofedForest_deep_ocean", -"IcePlains_ocean", -"FlowerForest_ocean", -"ExtremeHills_deep_ocean", -"MesaPlateauFM_deep_ocean", -"Desert_ocean", -"Taiga_ocean", -"BirchForestM_deep_ocean", -"Taiga_deep_ocean", -"JungleM_ocean", -"FlowerForest_underground", -"JungleEdge_underground", -"StoneBeach_underground", -"MesaBryce_underground", -"Mesa_underground", -"RoofedForest_underground", -"Jungle_underground", -"Swampland_underground", -"MushroomIsland_underground", -"BirchForest_underground", -"Plains_underground", -"MesaPlateauF_underground", -"ExtremeHills_underground", -"MegaSpruceTaiga_underground", -"BirchForestM_underground", -"SavannaM_underground", -"MesaPlateauFM_underground", -"Desert_underground", -"Savanna_underground", -"Forest_underground", -"SunflowerPlains_underground", -"ColdTaiga_underground", -"IcePlains_underground", -"IcePlainsSpikes_underground", -"MegaTaiga_underground", -"Taiga_underground", -"ExtremeHills+_underground", -"JungleM_underground", -"ExtremeHillsM_underground", -"JungleEdgeM_underground", -}, -0, -7, -30, -19000, -2, -mcl_vars.mg_overworld_min, -mcl_vars.mg_overworld_max) - --- Nether spawn (rare) -mcl_mobs:spawn_specific( -"mobs_mc:enderman", -"nether", -"ground", -{ -"Nether" -}, -0, -7, -30, -27500, -4, -mcl_vars.mg_nether_min, -mcl_vars.mg_nether_max) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:enderman", S("Enderman"), "mobs_mc_spawn_icon_enderman.png", 0) diff --git a/mods/ENTITIES/mobs_mc/endermite.lua b/mods/ENTITIES/mobs_mc/endermite.lua deleted file mode 100644 index 53200da709..0000000000 --- a/mods/ENTITIES/mobs_mc/endermite.lua +++ /dev/null @@ -1,41 +0,0 @@ ---################### ---################### ENDERMITE ---################### - -local S = minetest.get_translator("mobs_mc") - -mcl_mobs:register_mob("mobs_mc:endermite", { - description = S("Endermite"), - type = "monster", - spawn_class = "hostile", - passive = false, - hp_min = 8, - hp_max = 8, - xp_min = 3, - xp_max = 3, - armor = {fleshy = 100, arthropod = 100}, - group_attack = true, - collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.29, 0.2}, - visual = "mesh", - mesh = "mobs_mc_endermite.b3d", - textures = { - {"mobs_mc_endermite.png"}, - }, - visual_size = {x=3, y=3}, - makes_footstep_sound = false, - sounds = { - random = "mobs_mc_endermite_random", - damage = "mobs_mc_endermite_hurt", - death = "mobs_mc_endermite_death", - distance = 16, - }, - walk_velocity = 1, - run_velocity = 2, - jump = true, - fear_height = 4, - view_range = 16, - damage = 2, - reach = 1, -}) - -mcl_mobs:register_egg("mobs_mc:endermite", S("Endermite"), "mobs_mc_spawn_icon_endermite.png", 0) diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua deleted file mode 100644 index fd77b9ed8a..0000000000 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ /dev/null @@ -1,128 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### GHAST ---################### - - -mcl_mobs:register_mob("mobs_mc:ghast", { - description = S("Ghast"), - type = "monster", - spawn_class = "hostile", - pathfinding = 1, - group_attack = true, - hp_min = 10, - hp_max = 10, - xp_min = 5, - xp_max = 5, - collisionbox = {-2, 5, -2, 2, 9, 2}, - visual = "mesh", - mesh = "mobs_mc_ghast.b3d", - textures = { - {"mobs_mc_ghast.png"}, - }, - visual_size = {x=12, y=12}, - sounds = { - shoot_attack = "mobs_fireball", - death = "mobs_mc_zombie_death", - attack = "mobs_fireball", - random = "mobs_eerie", - distance = 16, - -- TODO: damage - -- TODO: better death - }, - walk_velocity = 1.6, - run_velocity = 3.2, - drops = { - {name = "mcl_mobitems:gunpowder", chance = 1, min = 0, max = 2, looting = "common"}, - {name = "mcl_mobitems:ghast_tear", chance = 10/6, min = 0, max = 1, looting = "common", looting_ignore_chance = true}, - }, - animation = { - stand_speed = 50, walk_speed = 50, run_speed = 50, - stand_start = 0, stand_end = 40, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, - }, - fall_damage = 0, - view_range = 100, - attack_type = "dogshoot", - arrow = "mobs_mc:fireball", - shoot_interval = 3.5, - shoot_offset = -5, - dogshoot_switch = 1, - dogshoot_count_max =1, - passive = false, - jump = true, - jump_height = 4, - floats=1, - fly = true, - makes_footstep_sound = false, - instant_death = true, - fire_resistant = true, - do_custom = function(self) - if self.firing == true then - self.base_texture = {"mobs_mc_ghast_firing.png"} - self.object:set_properties({textures=self.base_texture}) - else - self.base_texture = {"mobs_mc_ghast.png"} - self.object:set_properties({textures=self.base_texture}) - end - end, -}) - - -mcl_mobs:spawn_specific( -"mobs_mc:ghast", -"nether", -"ground", -{ -"Nether" -}, -0, -minetest.LIGHT_MAX+1, -30, -18000, -2, -mcl_vars.mg_nether_min, -mcl_vars.mg_nether_max) - --- fireball (projectile) -mcl_mobs:register_arrow("mobs_mc:fireball", { - visual = "sprite", - visual_size = {x = 1, y = 1}, - textures = {"mcl_fire_fire_charge.png"}, - velocity = 15, - collisionbox = {-.5, -.5, -.5, .5, .5, .5}, - _is_fireball = true, - - hit_player = function(self, player) - player:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = 6}, - }, nil) - mcl_mobs:boom(self, self.object:get_pos(), 1, true) - end, - - hit_mob = function(self, mob) - mob:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = 6}, - }, nil) - mcl_mobs:boom(self, self.object:get_pos(), 1, true) - end, - - hit_node = function(self, pos, node) - mcl_mobs:boom(self, pos, 1, true) - end -}) - - - - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:ghast", S("Ghast"), "mobs_mc_spawn_icon_ghast.png", 0) diff --git a/mods/ENTITIES/mobs_mc/guardian.lua b/mods/ENTITIES/mobs_mc/guardian.lua deleted file mode 100644 index 53e93f4726..0000000000 --- a/mods/ENTITIES/mobs_mc/guardian.lua +++ /dev/null @@ -1,105 +0,0 @@ ---################### ---################### GUARDIAN ---################### - -local S = minetest.get_translator("mobs_mc") - -mcl_mobs:register_mob("mobs_mc:guardian", { - description = S("Guardian"), - type = "monster", - spawn_class = "hostile", - hp_min = 30, - hp_max = 30, - xp_min = 10, - xp_max = 10, - breath_max = -1, - passive = false, - attack_type = "dogfight", - pathfinding = 1, - view_range = 16, - walk_velocity = 2, - run_velocity = 4, - damage = 6, - reach = 3, - collisionbox = {-0.425, 0.25, -0.425, 0.425, 1.1, 0.425}, - visual = "mesh", - mesh = "mobs_mc_guardian.b3d", - textures = { - {"mobs_mc_guardian.png"}, - }, - visual_size = {x=3, y=3}, - sounds = { - random = "mobs_mc_guardian_random", - war_cry = "mobs_mc_guardian_random", - damage = {name="mobs_mc_guardian_hurt", gain=0.3}, - death = "mobs_mc_guardian_death", - flop = "mobs_mc_squid_flop", - distance = 16, - }, - animation = { - stand_speed = 25, walk_speed = 25, run_speed = 50, - stand_start = 0, stand_end = 20, - walk_start = 0, walk_end = 20, - run_start = 0, run_end = 20, - }, - drops = { - -- Greatly increased amounts of prismarine - {name = "mcl_ocean:prismarine_shard", - chance = 1, - min = 0, - max = 32, - looting = "common",}, - -- TODO: Reduce of drops when ocean monument is ready. - - -- The following drops are approximations - -- Fish / prismarine crystal - {name = "mcl_fishing:fish_raw", - chance = 4, - min = 1, - max = 1, - looting = "common",}, - {name = "mcl_ocean:prismarine_crystals", - chance = 4, - min = 1, - max = 2, - looting = "common",}, - - -- Rare drop: fish - {name = "mcl_fishing:fish_raw", - chance = 160, -- 2.5% / 4 - min = 1, - max = 1, - looting = "rare", - looting_factor = 0.0025,}, - {name = "mcl_fishing:salmon_raw", - chance = 160, - min = 1, - max = 1, - looting = "rare", - looting_factor = 0.0025,}, - {name = "mcl_fishing:clownfish_raw", - chance = 160, - min = 1, - max = 1, - looting = "rare", - looting_factor = 0.0025,}, - {name = "mcl_fishing:pufferfish_raw", - chance = 160, - min = 1, - max = 1, - looting = "rare", - looting_factor = 0.0025,}, - }, - fly = true, - makes_footstep_sound = false, - fly_in = { "mcl_core:water_source", "mclx_core:river_water_source" }, - jump = false, - view_range = 16, -}) - --- Spawning disabled due to size issues --- TODO: Re-enable spawning ---mcl_mobs:spawn_specific("mobs_mc:guardian", { "mcl_core:water_source", "mclx_core:river_water_source" }, { "mcl_core:water_source", "mclx_core:river_water_source" }, 0, minetest.LIGHT_MAX+1, 30, 25000, 2, mcl_vars.mg_overworld_min, mobs_mc.water_level - 10) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:guardian", S("Guardian"), "mobs_mc_spawn_icon_guardian.png", 0) diff --git a/mods/ENTITIES/mobs_mc/guardian_elder.lua b/mods/ENTITIES/mobs_mc/guardian_elder.lua deleted file mode 100644 index f33576fb95..0000000000 --- a/mods/ENTITIES/mobs_mc/guardian_elder.lua +++ /dev/null @@ -1,116 +0,0 @@ --- v1.4 - ---################### ---################### GUARDIAN ---################### - -local S = minetest.get_translator("mobs_mc") - -mcl_mobs:register_mob("mobs_mc:guardian_elder", { - description = S("Elder Guardian"), - type = "monster", - spawn_class = "hostile", - hp_min = 80, - hp_max = 80, - xp_min = 10, - xp_max = 10, - breath_max = -1, - passive = false, - attack_type = "dogfight", - pathfinding = 1, - view_range = 16, - walk_velocity = 2, - run_velocity = 4, - damage = 8, - reach = 3, - collisionbox = {-0.99875, 0.5, -0.99875, 0.99875, 2.4975, 0.99875}, - visual = "mesh", - mesh = "mobs_mc_guardian.b3d", - textures = { - {"mobs_mc_guardian_elder.png"}, - }, - visual_size = {x=7, y=7}, - sounds = { - random = "mobs_mc_guardian_random", - war_cry = "mobs_mc_guardian_random", - damage = {name="mobs_mc_guardian_hurt", gain=0.3}, - death = "mobs_mc_guardian_death", - flop = "mobs_mc_squid_flop", - base_pitch = 0.6, - distance = 16, - }, - animation = { - stand_speed = 25, walk_speed = 25, run_speed = 50, - stand_start = 0, stand_end = 20, - walk_start = 0, walk_end = 20, - run_start = 0, run_end = 20, - }, - drops = { - -- TODO: Reduce # of drops when ocean monument is ready. - - -- Greatly increased amounts of prismarine - {name = "mcl_ocean:prismarine_shard", - chance = 1, - min = 1, - max = 64, - looting = "common",}, - - -- TODO: Only drop if killed by player - {name = "mcl_sponges:sponge_wet", - chance = 1, - min = 1, - max = 1,}, - - -- The following drops are approximations - -- Fish / prismarine crystal - {name = "mcl_fishing:fish_raw", - chance = 4, - min = 1, - max = 1, - looting = "common",}, - {name = "mcl_ocean:prismarine_crystals", - chance = 1, - min = 1, - max = 10, - looting = "common",}, - - -- Rare drop: fish - {name = "mcl_fishing:fish_raw", - chance = 160, -- 2.5% / 4 - min = 1, - max = 1, - looting = "rare", - looting_factor = 0.01 / 4,}, - {name = "mcl_fishing:salmon_raw", - chance = 160, - min = 1, - max = 1, - looting = "rare", - looting_factor = 0.01 / 4,}, - {name = "mcl_fishing:clownfish_raw", - chance = 160, - min = 1, - max = 1, - looting = "rare", - looting_factor = 0.01 / 4,}, - {name = "mcl_fishing:pufferfish_raw", - chance = 160, - min = 1, - max = 1, - looting = "rare", - looting_factor = 0.01 / 4,}, - }, - fly = true, - makes_footstep_sound = false, - fly_in = { "mcl_core:water_source", "mclx_core:river_water_source" }, - jump = false, - view_range = 16, -}) - --- Spawning disabled due to size issues <- what do you mean? -j4i --- TODO: Re-enable spawning --- mcl_mobs:spawn_specific("mobs_mc:guardian_elder", { "mcl_core:water_source", "mclx_core:river_water_source" }, { "mcl_core:water_source", "mclx_core:river_water_source" }, 0, minetest.LIGHT_MAX+1, 30, 40000, 2, mcl_vars.mg_overworld_min, mobs_mc.water_level-18) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:guardian_elder", S("Elder Guardian"), "mobs_mc_spawn_icon_guardian_elder.png", 0) - diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua deleted file mode 100644 index d423c124c1..0000000000 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ /dev/null @@ -1,615 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### HORSE ---################### - --- Return overlay texture for horse/donkey/mule, e.g. chest, saddle or horse armor -local horse_extra_texture = function(horse) - local base = horse._naked_texture - local saddle = horse._saddle - local chest = horse._chest - local armor = horse._horse_armor - local textures = {} - if armor and minetest.get_item_group(armor, "horse_armor") > 0 then - textures[2] = base .. "^" .. minetest.registered_items[armor]._horse_overlay_image - else - textures[2] = base - end - if saddle then - textures[3] = base - else - textures[3] = "blank.png" - end - if chest then - textures[1] = base - else - textures[1] = "blank.png" - end - return textures -end - --- Helper functions to determine equipment rules -local can_equip_horse_armor = function(entity_id) - return entity_id == "mobs_mc:horse" or entity_id == "mobs_mc:skeleton_horse" or entity_id == "mobs_mc:zombie_horse" -end -local can_equip_chest = function(entity_id) - return entity_id == "mobs_mc:mule" or entity_id == "mobs_mc:donkey" -end -local can_breed = function(entity_id) - return entity_id == "mobs_mc:horse" or "mobs_mc:mule" or entity_id == "mobs_mc:donkey" -end - ---[[ Generate all possible horse textures. -Horse textures are a combination of a base texture and an optional marking overlay. ]] --- The base horse textures (fur) (fur) -local horse_base = { - "mobs_mc_horse_brown.png", - "mobs_mc_horse_darkbrown.png", - "mobs_mc_horse_white.png", - "mobs_mc_horse_gray.png", - "mobs_mc_horse_black.png", - "mobs_mc_horse_chestnut.png", - "mobs_mc_horse_creamy.png", -} --- Horse marking texture overlay, to be appended to the base texture string -local horse_markings = { - "", -- no markings - "mobs_mc_horse_markings_whitedots.png", -- snowflake appaloosa - "mobs_mc_horse_markings_blackdots.png", -- sooty - "mobs_mc_horse_markings_whitefield.png", -- paint - "mobs_mc_horse_markings_white.png", -- stockings and blaze -} - -local horse_textures = {} -for b=1, #horse_base do - for m=1, #horse_markings do - local fur = horse_base[b] - if horse_markings[m] ~= "" then - fur = fur .. "^" .. horse_markings[m] - end - table.insert(horse_textures, { - "blank.png", -- chest - fur, -- base texture + markings and optional armor - "blank.png", -- saddle - }) - end -end - --- in e7898352d890c2414af653eba624939df9c0b8b4 (0.76-dev) all items from mobs_mc were moved to mcl_mobitems --- this results in existing horses wearing armor would still have the old texture filename in their --- properties this function updates them. It should be removed some time in the future when we can be --- reasonably sure all horses that want it get the new nexture. -local function update_textures(self) - local old = "mobs_mc_horse_armor_" - local txt = self.object:get_properties().textures - if txt[2]:find(old) then - txt[2] = txt[2]:gsub(old,"mcl_mobitems_horse_armor_") - self.object:set_properties({textures=txt}) - return - end -end - --- Horse -local horse = { - description = S("Horse"), - type = "animal", - spawn_class = "passive", - visual = "mesh", - mesh = "mobs_mc_horse.b3d", - visual_size = {x=3.0, y=3.0}, - collisionbox = {-0.69825, -0.01, -0.69825, 0.69825, 1.59, 0.69825}, - animation = { - stand_speed = 25, - stand_start = 0, - stand_end = 0, - walk_speed = 25, - walk_start = 0, - walk_end = 40, - run_speed = 60, - run_start = 0, - run_end = 40, - }, - textures = horse_textures, - sounds = { - random = "mobs_mc_horse_random", - -- TODO: Separate damage sound - damage = "mobs_mc_horse_death", - death = "mobs_mc_horse_death", - eat = "mobs_mc_animal_eat_generic", - distance = 16, - }, - fear_height = 4, - fly = false, - walk_chance = 60, - view_range = 16, - follow = { - "mcl_core:apple", - "mcl_core:sugar", - "mcl_farming:wheat_item", - "mcl_farming:hay_block", - "mcl_core:apple_gold", - "mcl_farming:carrot_item_gold", - }, - passive = true, - hp_min = 15, - hp_max = 30, - xp_min = 1, - xp_max = 3, - floats = 1, - makes_footstep_sound = true, - jump = true, - jump_height = 5.75, -- can clear 2.5 blocks - drops = { - {name = "mcl_mobitems:leather", - chance = 1, - min = 0, - max = 2, - looting = "common",}, - }, - on_spawn = update_textures, - do_custom = function(self, dtime) - - -- set needed values if not already present - if not self._regentimer then - self._regentimer = 0 - end - 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 = 4.17, z = -1.75} - self.driver_eye_offset = {x = 0, y = 3, z = 0} - self.driver_scale = {x = 1/self.visual_size.x, y = 1/self.visual_size.y} - end - - -- Slowly regenerate health - self._regentimer = self._regentimer + dtime - if self._regentimer >= 4 then - if self.health < self.hp_max then - self.health = self.health + 1 - end - self._regentimer = 0 - end - - -- Some weird human is riding. Buck them off? - if self.driver and not self.tamed and self.buck_off_time <= 0 then - if math.random() < 0.2 then - mcl_mobs.detach(self.driver, {x = 1, y = 0, z = 1}) - -- TODO bucking animation - else - -- Nah, can't be bothered. Think about it again in one second - self.buck_off_time = 20 - end - end - - -- Tick the timer for trying to buck the player off - if self.buck_off_time then - if self.driver then - self.buck_off_time = self.buck_off_time - 1 - else - -- Player isn't riding anymore so no need to count - self.buck_off_time = nil - end - end - - -- if driver present and horse has a saddle allow control of horse - if self.driver and self._saddle then - - mcl_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 - if self._saddle then - minetest.add_item(pos, "mcl_mobitems:saddle") - end - -- also detach from horse properly - if self.driver then - mcl_mobs.detach(self.driver, {x = 1, y = 0, z = 1}) - end - - end, - - on_rightclick = function(self, clicker) - - -- make sure player is clicking - if not clicker or not clicker:is_player() then - return - end - - local item = clicker:get_wielded_item() - local iname = item:get_name() - local heal = 0 - - -- Taming - self.temper = self.temper or (math.random(1,100)) - - if not self.tamed then - local temper_increase = 0 - - -- Feeding, intentionally not using mobs:feed_tame because horse taming is - -- different and more complicated - if (iname == "mcl_core:sugar") then - temper_increase = 3 - elseif (iname == "mcl_farming:wheat_item") then - temper_increase = 3 - elseif (iname == "mcl_core:apple") then - temper_increase = 3 - elseif (iname == "mcl_farming:carrot_item_gold") then - temper_increase = 5 - elseif (iname == "mcl_core:apple_gold") then - temper_increase = 10 - -- Trying to ride - elseif not self.driver then - self.object:set_properties({stepheight = 1.1}) - mcl_mobs.attach(self, clicker) - self.buck_off_time = 40 -- TODO how long does it take in minecraft? - if self.temper > 100 then - self.tamed = true -- NOTE taming can only be finished by riding the horse - if not self.owner or self.owner == "" then - self.owner = clicker:get_player_name() - end - end - temper_increase = 5 - - -- Clicking on the horse while riding ==> unmount - elseif self.driver and self.driver == clicker then - mcl_mobs.detach(clicker, {x = 1, y = 0, z = 1}) - end - - -- If nothing happened temper_increase = 0 and addition does nothing - self.temper = self.temper + temper_increase - - return - end - - if can_breed(self.name) then - -- Breed horse with golden apple or golden carrot - if (iname == "mcl_core:apple_gold") then - heal = 10 - elseif (iname == "mcl_farming:carrot_item_gold") then - heal = 4 - end - if heal > 0 and mcl_mobs:feed_tame(self, clicker, heal, true, false) then - return - end - end - -- Feed with anything else - -- TODO heal amounts don't work - if (iname == "mcl_core:sugar") then - heal = 1 - elseif (iname == "mcl_farming:wheat_item") then - heal = 2 - elseif (iname == "mcl_core:apple") then - heal = 3 - elseif (iname == "mcl_farming:hay_block") then - heal = 20 - end - if heal > 0 and mcl_mobs:feed_tame(self, clicker, heal, false, false) then - return - end - - if mcl_mobs:protect(self, clicker) then - return - end - - -- Make sure tamed horse is mature and being clicked by owner only - if self.tamed and not self.child and self.owner == clicker:get_player_name() then - - local inv = clicker:get_inventory() - - -- detatch player already riding horse - if self.driver and clicker == self.driver then - - mcl_mobs.detach(clicker, {x = 1, y = 0, z = 1}) - - -- Put on saddle if tamed - elseif not self.driver and not self._saddle - and iname == "mcl_mobitems:saddle" then - - -- Put on saddle and take saddle from player's inventory - local w = clicker:get_wielded_item() - self._saddle = true - if not minetest.is_creative_enabled(clicker:get_player_name()) then - w:take_item() - clicker:set_wielded_item(w) - end - - -- Update texture - if not self._naked_texture then - -- Base horse texture without chest or saddle - self._naked_texture = self.base_texture[2] - end - local tex = horse_extra_texture(self) - self.base_texture = tex - self.object:set_properties({textures = self.base_texture}) - minetest.sound_play({name = "mcl_armor_equip_leather"}, {gain=0.5, max_hear_distance=12, pos=self.object:get_pos()}, true) - - -- Put on horse armor if tamed - elseif can_equip_horse_armor(self.name) and not self.driver and not self._horse_armor - and minetest.get_item_group(iname, "horse_armor") > 0 then - - - -- Put on armor and take armor from player's inventory - local armor = minetest.get_item_group(iname, "horse_armor") - self._horse_armor = iname - local w = clicker:get_wielded_item() - if not minetest.is_creative_enabled(clicker:get_player_name()) then - w:take_item() - clicker:set_wielded_item(w) - end - - -- Set horse armor strength - self.armor = armor - local agroups = self.object:get_armor_groups() - agroups.fleshy = self.armor - self.object:set_armor_groups(agroups) - - -- Update texture - if not self._naked_texture then - -- Base horse texture without chest or saddle - self._naked_texture = self.base_texture[2] - end - local tex = horse_extra_texture(self) - self.base_texture = tex - self.object:set_properties({textures = self.base_texture}) - local def = w:get_definition() - if def.sounds and def.sounds._mcl_armor_equip then - minetest.sound_play({name = def.sounds._mcl_armor_equip}, {gain=0.5, max_hear_distance=12, pos=self.object:get_pos()}, true) - end - - -- Mount horse - elseif not self.driver and self._saddle then - - self.object:set_properties({stepheight = 1.1}) - mcl_mobs.attach(self, clicker) - - -- Used to capture horse - elseif not self.driver and iname ~= "" then - mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) - end - end - end, - - on_breed = function(parent1, parent2) - local pos = parent1.object:get_pos() - local child = mcl_mobs:spawn_child(pos, parent1.name) - if child then - local ent_c = child:get_luaentity() - local p = math.random(1, 2) - local child_texture - -- Randomly pick one of the parents for the child texture - if p == 1 then - if parent1._naked_texture then - child_texture = parent1._naked_texture - else - child_texture = parent1.base_texture[2] - end - else - if parent2._naked_texture then - child_texture = parent2._naked_texture - else - child_texture = parent2.base_texture[2] - end - end - local splt = string.split(child_texture, "^") - if #splt >= 2 then - -- Randomly mutate base texture (fur) and markings - -- with chance of 1/9 each - local base = splt[1] - local markings = splt[2] - local mutate_base = math.random(1, 9) - local mutate_markings = math.random(1, 9) - if mutate_base == 1 then - local b = math.random(1, #horse_base) - base = horse_base[b] - end - if mutate_markings == 1 then - local m = math.random(1, #horse_markings) - markings = horse_markings[m] - end - child_texture = base - if markings ~= "" then - child_texture = child_texture .. "^" .. markings - end - end - ent_c.base_texture = { "blank.png", child_texture, "blank.png" } - ent_c._naked_texture = child_texture - - child:set_properties({textures = ent_c.base_texture}) - return false - end - end, -} - -mcl_mobs:register_mob("mobs_mc:horse", horse) - --- Skeleton horse -local skeleton_horse = table.copy(horse) -skeleton_horse.description = S("Skeleton Horse") -skeleton_horse.breath_max = -1 -skeleton_horse.armor = {undead = 100, fleshy = 100} -skeleton_horse.textures = {{"blank.png", "mobs_mc_horse_skeleton.png", "blank.png"}} -skeleton_horse.drops = { - {name = "mcl_mobitems:bone", - chance = 1, - min = 0, - max = 2,}, -} -skeleton_horse.sounds = { - random = "mobs_mc_skeleton_random", - death = "mobs_mc_skeleton_death", - damage = "mobs_mc_skeleton_hurt", - eat = "mobs_mc_animal_eat_generic", - base_pitch = 0.95, - distance = 16, -} -skeleton_horse.harmed_by_heal = true -mcl_mobs:register_mob("mobs_mc:skeleton_horse", skeleton_horse) - --- Zombie horse -local zombie_horse = table.copy(horse) -zombie_horse.description = S("Zombie Horse") -zombie_horse.breath_max = -1 -zombie_horse.armor = {undead = 100, fleshy = 100} -zombie_horse.textures = {{"blank.png", "mobs_mc_horse_zombie.png", "blank.png"}} -zombie_horse.drops = { - {name = "mcl_mobitems:rotten_flesh", - chance = 1, - min = 0, - max = 2,}, -} -zombie_horse.sounds = { - random = "mobs_mc_horse_random", - -- TODO: Separate damage sound - damage = "mobs_mc_horse_death", - death = "mobs_mc_horse_death", - eat = "mobs_mc_animal_eat_generic", - base_pitch = 0.5, - distance = 16, -} -zombie_horse.harmed_by_heal = true -mcl_mobs:register_mob("mobs_mc:zombie_horse", zombie_horse) - --- Donkey -local d = 0.86 -- donkey scale -local donkey = table.copy(horse) -donkey.description = S("Donkey") -donkey.textures = {{"blank.png", "mobs_mc_donkey.png", "blank.png"}} -donkey.animation = { - speed_normal = 25, - stand_start = 0, stand_end = 0, - walk_start = 0, walk_end = 40, -} -donkey.sounds = { - random = "mobs_mc_donkey_random", - damage = "mobs_mc_donkey_hurt", - death = "mobs_mc_donkey_death", - eat = "mobs_mc_animal_eat_generic", - distance = 16, -} -donkey.visual_size = { x=horse.visual_size.x*d, y=horse.visual_size.y*d } -donkey.collisionbox = { - horse.collisionbox[1] * d, - horse.collisionbox[2] * d, - horse.collisionbox[3] * d, - horse.collisionbox[4] * d, - horse.collisionbox[5] * d, - horse.collisionbox[6] * d, -} -donkey.jump = true -donkey.jump_height = 3.75 -- can clear 1 block height - -mcl_mobs:register_mob("mobs_mc:donkey", donkey) - --- Mule -local m = 0.94 -local mule = table.copy(donkey) -mule.description = S("Mule") -mule.textures = {{"blank.png", "mobs_mc_mule.png", "blank.png"}} -mule.visual_size = { x=horse.visual_size.x*m, y=horse.visual_size.y*m } -mule.sounds = table.copy(donkey.sounds) -mule.sounds.base_pitch = 1.15 -mule.collisionbox = { - horse.collisionbox[1] * m, - horse.collisionbox[2] * m, - horse.collisionbox[3] * m, - horse.collisionbox[4] * m, - horse.collisionbox[5] * m, - horse.collisionbox[6] * m, -} -mcl_mobs:register_mob("mobs_mc:mule", mule) - ---=========================== ---Spawn Function -mcl_mobs:spawn_specific( -"mobs_mc:horse", -"overworld", -"ground", -{ - "flat", - "IcePlainsSpikes", - "ColdTaiga", - "ColdTaiga_beach", - "ColdTaiga_beach_water", - "MegaTaiga", - "MegaSpruceTaiga", - "ExtremeHills", - "ExtremeHills_beach", - "ExtremeHillsM", - "ExtremeHills+", - "ExtremeHills+_snowtop", - "StoneBeach", - "Plains", - "Plains_beach", - "SunflowerPlains", - "Taiga", - "Taiga_beach", - "Forest", - "Forest_beach", - "FlowerForest", - "FlowerForest_beach", - "BirchForest", - "BirchForestM", - "RoofedForest", - "Savanna", - "Savanna_beach", - "SavannaM", - "Jungle", - "Jungle_shore", - "JungleM", - "JungleM_shore", - "JungleEdge", - "JungleEdgeM", - "Swampland", - "Swampland_shore" -}, -0, -minetest.LIGHT_MAX+1, -30, -15000, -4, -mobs_mc.water_level+3, -mcl_vars.mg_overworld_max) - - -mcl_mobs:spawn_specific( -"mobs_mc:donkey", -"overworld", -"ground", -{ -"Mesa", -"MesaPlateauFM_grasstop", -"MesaPlateauF", -"MesaPlateauFM", -"MesaPlateauF_grasstop", -"MesaBryce", -}, -0, -minetest.LIGHT_MAX+1, -30, -15000, -4, -mobs_mc.water_level+3, -mcl_vars.mg_overworld_max) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:horse", S("Horse"), "mobs_mc_spawn_icon_horse.png", 0) -mcl_mobs:register_egg("mobs_mc:skeleton_horse", S("Skeleton Horse"), "mobs_mc_spawn_icon_horse_skeleton.png", 0) ---mobs:register_egg("mobs_mc:zombie_horse", S("Zombie Horse"), "mobs_mc_spawn_icon_horse_zombie.png", 0) -mcl_mobs:register_egg("mobs_mc:donkey", S("Donkey"), "mobs_mc_spawn_icon_donkey.png", 0) -mcl_mobs:register_egg("mobs_mc:mule", S("Mule"), "mobs_mc_spawn_icon_mule.png", 0) diff --git a/mods/ENTITIES/mobs_mc/init.lua b/mods/ENTITIES/mobs_mc/init.lua deleted file mode 100644 index 02f5023a58..0000000000 --- a/mods/ENTITIES/mobs_mc/init.lua +++ /dev/null @@ -1,144 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes -mobs_mc = {} - -local pr = PseudoRandom(os.time()*5) - -local offsets = {} -for x=-2, 2 do - for z=-2, 2 do - table.insert(offsets, {x=x, y=0, z=z}) - end -end - ---[[ Periodically check and teleport mob to owner if not sitting (order ~= "sit") and -the owner is too far away. To be used with do_custom. Note: Optimized for mobs smaller than 1×1×1. -Larger mobs might have space problems after teleportation. - -* dist: Minimum required distance from owner to teleport. Default: 12 -* teleport_check_interval: Optional. Interval in seconds to check the mob teleportation. Default: 4 ]] -mobs_mc.make_owner_teleport_function = function(dist, teleport_check_interval) - return function(self, dtime) - -- No teleportation if no owner or if sitting - if not self.owner or self.order == "sit" then - return - end - if not teleport_check_interval then - teleport_check_interval = 4 - end - if not dist then - dist = 12 - end - if self._teleport_timer == nil then - self._teleport_timer = teleport_check_interval - return - end - self._teleport_timer = self._teleport_timer - dtime - if self._teleport_timer <= 0 then - self._teleport_timer = teleport_check_interval - local mob_pos = self.object:get_pos() - local owner = minetest.get_player_by_name(self.owner) - if not owner then - -- No owner found, no teleportation - return - end - local owner_pos = owner:get_pos() - local dist_from_owner = vector.distance(owner_pos, mob_pos) - if dist_from_owner > dist then - -- Check for nodes below air in a 5×1×5 area around the owner position - local check_offsets = table.copy(offsets) - -- Attempt to place mob near player. Must be placed on walkable node below a non-walkable one. Place inside that air node. - while #check_offsets > 0 do - local r = pr:next(1, #check_offsets) - local telepos = vector.add(owner_pos, check_offsets[r]) - local telepos_below = {x=telepos.x, y=telepos.y-1, z=telepos.z} - table.remove(check_offsets, r) - -- Long story short, spawn on a platform - local trynode = minetest.registered_nodes[minetest.get_node(telepos).name] - local trybelownode = minetest.registered_nodes[minetest.get_node(telepos_below).name] - if trynode and not trynode.walkable and - trybelownode and trybelownode.walkable then - -- Correct position found! Let's teleport. - self.object:set_pos(telepos) - return - end - end - end - end - end -end - -local function is_forbidden_node(pos, node) - node = node or minetest.get_node(pos) - return minetest.get_item_group(node.name, "stair") > 0 or minetest.get_item_group(node.name, "slab") > 0 or minetest.get_item_group(node.name, "carpet") > 0 -end - -function mcl_mobs:spawn_abm_check(pos, node, name) - -- Don't spawn monsters on mycelium - if (node.name == "mcl_core:mycelium" or node.name == "mcl_core:mycelium_snow") and minetest.registered_entities[name].type == "monster" then - return true - --Don't Spawn mobs on stairs, slabs, or carpets - elseif is_forbidden_node(pos, node) or is_forbidden_node(vector.add(pos, vector.new(0, 1, 0))) then - return true - -- Spawn on opaque or liquid nodes - elseif minetest.get_item_group(node.name, "opaque") ~= 0 or minetest.registered_nodes[node.name].liquidtype ~= "none" or node.name == "mcl_core:grass_path" then - return false - end - - -- Reject everything else - return true -end - -mobs_mc.shears_wear = 276 -mobs_mc.water_level = tonumber(minetest.settings:get("water_level")) or 0 - --- Animals -local path = minetest.get_modpath("mobs_mc") -dofile(path .. "/bat.lua") -- Mesh and animation by toby109tt / https://github.com/22i -dofile(path .. "/rabbit.lua") -- Mesh and animation byExeterDad -dofile(path .. "/chicken.lua") -- Mesh and animation by Pavel_S -dofile(path .. "/cow+mooshroom.lua") -- Mesh by Morn76 Animation by Pavel_S -dofile(path .. "/horse.lua") -- KrupnoPavel; Mesh and animation by toby109tt / https://github.com/22i -dofile(path .. "/llama.lua") -- Mesh and animation by toby109tt / https://github.com/22i -dofile(path .. "/ocelot.lua") -- Mesh and animation by toby109tt / https://github.com/22i -dofile(path .. "/parrot.lua") -- Mesh and animation by toby109tt / https://github.com/22i -dofile(path .. "/pig.lua") -- Mesh and animation by Pavel_S -dofile(path .. "/polar_bear.lua") -- Mesh and animation by toby109tt / https://github.com/22i -dofile(path .. "/sheep.lua") -- Mesh and animation by Pavel_S -dofile(path .. "/wolf.lua") -- KrupnoPavel -dofile(path .. "/squid.lua") -- Animation, sound and egg texture by daufinsyd - --- NPCs -dofile(path .. "/villager.lua") -- KrupnoPavel Mesh and animation by toby109tt / https://github.com/22i - --- Illagers and witch -dofile(path .. "/villager_evoker.lua") -- Mesh and animation by toby109tt / https://github.com/22i -dofile(path .. "/villager_vindicator.lua") -- Mesh and animation by toby109tt / https://github.com/22i -dofile(path .. "/villager_zombie.lua") -- Mesh and animation by toby109tt / https://github.com/22i - -dofile(path .. "/witch.lua") -- Mesh and animation by toby109tt / https://github.com/22i - ---Monsters -dofile(path .. "/blaze.lua") -- Animation by daufinsyd -dofile(path .. "/creeper.lua") -- Mesh by Morn76 Animation by Pavel_S -dofile(path .. "/ender_dragon.lua") -- Mesh and animation by toby109tt / https://github.com/22i -dofile(path .. "/enderman.lua") -- Mesh and animation by toby109tt / https://github.com/22i -dofile(path .. "/endermite.lua") -- Mesh and animation by toby109tt / https://github.com/22i -dofile(path .. "/villager_illusioner.lua") -- Mesh and animation by toby109tt / https://github.com/22i -dofile(path .. "/ghast.lua") -- maikerumine -dofile(path .. "/guardian.lua") -- maikerumine Mesh and animation by toby109tt / https://github.com/22i -dofile(path .. "/guardian_elder.lua") -- maikerumine Mesh and animation by toby109tt / https://github.com/22i -dofile(path .. "/snowman.lua") -dofile(path .. "/iron_golem.lua") -- maikerumine Mesh and animation by toby109tt / https://github.com/22i -dofile(path .. "/shulker.lua") -- maikerumine Mesh and animation by toby109tt / https://github.com/22i -dofile(path .. "/silverfish.lua") -- maikerumine Mesh and animation by toby109tt / https://github.com/22i -dofile(path .. "/skeleton+stray.lua") -- Mesh by Morn76 Animation by Pavel_S -dofile(path .. "/skeleton_wither.lua") -- Mesh by Morn76 Animation by Pavel_S -dofile(path .. "/zombie.lua") -- Mesh by Morn76 Animation by Pavel_S -dofile(path .. "/zombiepig.lua") -- Mesh by Morn76 Animation by Pavel_S -dofile(path .. "/slime+magma_cube.lua") -- Wuzzy -dofile(path .. "/spider.lua") -- Spider by AspireMint (fishyWET (CC-BY-SA 3.0 license for texture) -dofile(path .. "/vex.lua") -- KrupnoPavel -dofile(path .. "/wither.lua") -- Mesh and animation by toby109tt / https://github.com/22i diff --git a/mods/ENTITIES/mobs_mc/iron_golem.lua b/mods/ENTITIES/mobs_mc/iron_golem.lua deleted file mode 100644 index 7f1e667146..0000000000 --- a/mods/ENTITIES/mobs_mc/iron_golem.lua +++ /dev/null @@ -1,204 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### IRON GOLEM ---################### - -local etime = 0 - -mcl_mobs:register_mob("mobs_mc:iron_golem", { - description = S("Iron Golem"), - type = "npc", - spawn_class = "passive", - passive = true, - hp_min = 100, - hp_max = 100, - breath_max = -1, - collisionbox = {-0.7, -0.01, -0.7, 0.7, 2.69, 0.7}, - visual = "mesh", - mesh = "mobs_mc_iron_golem.b3d", - textures = { - {"mobs_mc_iron_golem.png"}, - }, - visual_size = {x=3, y=3}, - makes_footstep_sound = true, - -- TODO: sounds - view_range = 16, - stepheight = 1.1, - owner = "", - order = "follow", - floats = 0, - walk_velocity = 0.6, - run_velocity = 1.2, - -- Approximation - damage = 14, - reach = 3, - group_attack = true, - attacks_monsters = true, - attack_type = "dogfight", - _got_poppy = false, - pick_up = {"mcl_flowers:poppy"}, - on_pick_up = function(self,n) - if n.itemstring:find("mcl_flowers:poppy") then - if not self._got_poppy then - self._got_poppy=true - return - end - return true - end - end, - replace_what = {"mcl_flowers:poppy"}, - replace_with = {"air"}, - on_replace = function(self, pos, oldnode, newnode) - if not self.got_poppy and oldnode.name == "mcl_flowers:poppy" then - self._got_poppy=true - return - end - return false - end, - drops = { - {name = "mcl_core:iron_ingot", - chance = 1, - min = 3, - max = 5,}, - {name = "mcl_flowers:poppy", - chance = 1, - min = 0, - max = 2,}, - }, - fall_damage = 0, - animation = { - stand_speed = 15, walk_speed = 15, run_speed = 25, punch_speed = 15, - stand_start = 0, stand_end = 0, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, - punch_start = 40, punch_end = 50, - }, - jump = true, - on_step = function(self,dtime) - etime = etime + dtime - if etime > 10 then - if self._home and vector.distance(self._home,self.object:get_pos()) > 50 then - mcl_mobs:gopath(self,self._home) - end - end - end, -}) - - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:iron_golem", S("Iron Golem"), "mobs_mc_spawn_icon_iron_golem.png", 0) - - ---[[ This is to be called when a pumpkin or jack'o lantern has been placed. Recommended: In the on_construct function of the node. -This summons an iron golen if placing the pumpkin created an iron golem summon pattern: - -.P. -III -.I. - -P = Pumpkin or jack'o lantern -I = Iron block -. = Air -]] - -function mobs_mc.check_iron_golem_summon(pos) - local checks = { - -- These are the possible placement patterns, with offset from the pumpkin block. - -- These tables include the positions of the iron blocks (1-4) and air blocks (5-8) - -- 4th element is used to determine spawn position. - -- If a 9th element is present, that one is used for the spawn position instead. - -- Standing (x axis) - { - {x=-1, y=-1, z=0}, {x=1, y=-1, z=0}, {x=0, y=-1, z=0}, {x=0, y=-2, z=0}, -- iron blocks - {x=-1, y=0, z=0}, {x=1, y=0, z=0}, {x=-1, y=-2, z=0}, {x=1, y=-2, z=0}, -- air - }, - -- Upside down standing (x axis) - { - {x=-1, y=1, z=0}, {x=1, y=1, z=0}, {x=0, y=1, z=0}, {x=0, y=2, z=0}, - {x=-1, y=0, z=0}, {x=1, y=0, z=0}, {x=-1, y=2, z=0}, {x=1, y=2, z=0}, - {x=0, y=0, z=0}, -- Different offset for upside down pattern - }, - - -- Standing (z axis) - { - {x=0, y=-1, z=-1}, {x=0, y=-1, z=1}, {x=0, y=-1, z=0}, {x=0, y=-2, z=0}, - {x=0, y=0, z=-1}, {x=0, y=0, z=1}, {x=0, y=-2, z=-1}, {x=0, y=-2, z=1}, - }, - -- Upside down standing (z axis) - { - {x=0, y=1, z=-1}, {x=0, y=1, z=1}, {x=0, y=1, z=0}, {x=0, y=2, z=0}, - {x=0, y=0, z=-1}, {x=0, y=0, z=1}, {x=0, y=2, z=-1}, {x=0, y=2, z=1}, - {x=0, y=0, z=0}, - }, - - -- Lying - { - {x=-1, y=0, z=-1}, {x=0, y=0, z=-1}, {x=1, y=0, z=-1}, {x=0, y=0, z=-2}, - {x=-1, y=0, z=0}, {x=1, y=0, z=0}, {x=-1, y=0, z=-2}, {x=1, y=0, z=-2}, - }, - { - {x=-1, y=0, z=1}, {x=0, y=0, z=1}, {x=1, y=0, z=1}, {x=0, y=0, z=2}, - {x=-1, y=0, z=0}, {x=1, y=0, z=0}, {x=-1, y=0, z=2}, {x=1, y=0, z=2}, - }, - { - {x=-1, y=0, z=-1}, {x=-1, y=0, z=0}, {x=-1, y=0, z=1}, {x=-2, y=0, z=0}, - {x=0, y=0, z=-1}, {x=0, y=0, z=1}, {x=-2, y=0, z=-1}, {x=-2, y=0, z=1}, - }, - { - {x=1, y=0, z=-1}, {x=1, y=0, z=0}, {x=1, y=0, z=1}, {x=2, y=0, z=0}, - {x=0, y=0, z=-1}, {x=0, y=0, z=1}, {x=2, y=0, z=-1}, {x=2, y=0, z=1}, - }, - - - } - - for c=1, #checks do - -- Check all possible patterns - local ok = true - -- Check iron block nodes - for i=1, 4 do - local cpos = vector.add(pos, checks[c][i]) - local node = minetest.get_node(cpos) - if node.name ~= "mcl_core:ironblock" then - ok = false - break - end - end - -- Check air nodes - for a=5, 8 do - local cpos = vector.add(pos, checks[c][a]) - local node = minetest.get_node(cpos) - if node.name ~= "air" then - ok = false - break - end - end - -- Pattern found! - if ok then - -- Remove the nodes - minetest.remove_node(pos) - core.check_for_falling(pos) - for i=1, 4 do - local cpos = vector.add(pos, checks[c][i]) - minetest.remove_node(cpos) - core.check_for_falling(cpos) - end - -- Summon iron golem - local place - if checks[c][9] then - place = vector.add(pos, checks[c][9]) - else - place = vector.add(pos, checks[c][4]) - end - place.y = place.y - 0.5 - minetest.add_entity(place, "mobs_mc:iron_golem") - break - end - end -end diff --git a/mods/ENTITIES/mobs_mc/llama.lua b/mods/ENTITIES/mobs_mc/llama.lua deleted file mode 100644 index a211b117a1..0000000000 --- a/mods/ENTITIES/mobs_mc/llama.lua +++ /dev/null @@ -1,242 +0,0 @@ -local S = minetest.get_translator("mobs_mc") - ---################### ---################### LLAMA ---################### - -local carpets = { - -- group = { carpet , short_texture_name } - unicolor_white = { "mcl_wool:white_carpet", "white" }, - unicolor_dark_orange = { "mcl_wool:brown_carpet", "brown" }, - unicolor_grey = { "mcl_wool:silver_carpet", "light_gray" }, - unicolor_darkgrey = { "mcl_wool:grey_carpet", "gray" }, - unicolor_blue = { "mcl_wool:blue_carpet", "blue" }, - unicolor_dark_green = { "mcl_wool:green_carpet", "green" }, - unicolor_green = { "mcl_wool:lime_carpet", "lime" }, - unicolor_violet = { "mcl_wool:purple_carpet", "purple" }, - unicolor_light_red = { "mcl_wool:pink_carpet", "pink" }, - unicolor_yellow = { "mcl_wool:yellow_carpet", "yellow" }, - unicolor_orange = { "mcl_wool:orange_carpet", "orange" }, - unicolor_red = { "mcl_wool:red_carpet", "red" }, - unicolor_cyan = { "mcl_wool:cyan_carpet", "cyan" }, - unicolor_red_violet = { "mcl_wool:magenta_carpet", "magenta" }, - unicolor_black = { "mcl_wool:black_carpet", "black" }, - unicolor_light_blue = { "mcl_wool:light_blue_carpet", "light_blue" }, -} - -mcl_mobs:register_mob("mobs_mc:llama", { - description = S("Llama"), - type = "animal", - spawn_class = "passive", - hp_min = 15, - hp_max = 30, - xp_min = 1, - xp_max = 3, - passive = false, - collisionbox = {-0.45, -0.01, -0.45, 0.45, 1.86, 0.45}, - visual = "mesh", - mesh = "mobs_mc_llama.b3d", - textures = { -- 1: chest -- 2: decor (carpet) -- 3: llama base texture - {"blank.png", "blank.png", "mobs_mc_llama_brown.png"}, - {"blank.png", "blank.png", "mobs_mc_llama_creamy.png"}, - {"blank.png", "blank.png", "mobs_mc_llama_gray.png"}, - {"blank.png", "blank.png", "mobs_mc_llama_white.png"}, - {"blank.png", "blank.png", "mobs_mc_llama.png"}, - }, - visual_size = {x=3, y=3}, - makes_footstep_sound = true, - runaway = true, - walk_velocity = 1, - run_velocity = 4.4, - follow_velocity = 4.4, - floats = 1, - drops = { - {name = "mcl_mobitems:leather", - chance = 1, - min = 0, - max = 2, - looting = "common",}, - }, - fear_height = 4, - sounds = { - random = "mobs_mc_llama", - eat = "mobs_mc_animal_eat_generic", - -- TODO: Death and damage sounds - distance = 16, - }, - animation = { - speed_normal = 24, - run_speed = 60, - run_start = 0, - run_end = 40, - stand_start = 0, - stand_end = 0, - walk_start = 0, - walk_end = 40, - hurt_start = 118, - hurt_end = 154, - death_start = 154, - death_end = 179, - eat_start = 49, - eat_end = 78, - look_start = 78, - look_end = 108, - }, - follow = { "mcl_farming:wheat_item", "mcl_farming:hay_block" }, - view_range = 16, - 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 = 4 - self.terrain_type = 3 - self.driver_attach_at = {x = 0, y = 4.17, z = -1.5} - self.driver_eye_offset = {x = 0, y = 3, z = 0} - self.driver_scale = {x = 1/self.visual_size.x, y = 1/self.visual_size.y} - end - - -- if driver present allow control of llama - if self.driver then - - mcl_mobs.drive(self, "walk", "stand", false, dtime) - - return false -- skip rest of mob functions - end - - return true - end, - - on_die = function(self, pos) - - -- detach from llama properly - if self.driver then - mcl_mobs.detach(self.driver, {x = 1, y = 0, z = 1}) - end - - end, - - on_rightclick = function(self, clicker) - - -- Make sure player is clicking - if not clicker or not clicker:is_player() then - return - end - - local item = clicker:get_wielded_item() - if item:get_name() == "mcl_farming:hay_block" then - -- Breed with hay bale - if mcl_mobs:feed_tame(self, clicker, 1, true, false) then return end - else - -- Feed with anything else - if mcl_mobs:feed_tame(self, clicker, 1, false, true) then return end - end - if mcl_mobs:protect(self, clicker) then return end - - -- Make sure tamed llama is mature and being clicked by owner only - if self.tamed and not self.child and self.owner == clicker:get_player_name() then - - -- Place carpet - if minetest.get_item_group(item:get_name(), "carpet") == 1 and not self.carpet then - for group, carpetdata in pairs(carpets) do - if minetest.get_item_group(item:get_name(), group) == 1 then - if not minetest.is_creative_enabled(clicker:get_player_name()) then - item:take_item() - clicker:set_wielded_item(item) - end - local substr = carpetdata[2] - local tex_carpet = "mobs_mc_llama_decor_"..substr..".png" - self.base_texture = table.copy(self.base_texture) - self.base_texture[2] = tex_carpet - self.object:set_properties({ - textures = self.base_texture, - }) - self.carpet = item:get_name() - self.drops = { - {name = "mcl_mobitems:leather", - chance = 1, - min = 0, - max = 2,}, - {name = item:get_name(), - chance = 1, - min = 1, - max = 1,}, - } - return - end - end - end - - -- detatch player already riding llama - if self.driver and clicker == self.driver then - - mcl_mobs.detach(clicker, {x = 1, y = 0, z = 1}) - - -- attach player to llama - elseif not self.driver then - - self.object:set_properties({stepheight = 1.1}) - mcl_mobs.attach(self, clicker) - end - - -- Used to capture llama - elseif not self.driver and clicker:get_wielded_item():get_name() ~= "" then - mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) - end - end, - - on_breed = function(parent1, parent2) - -- When breeding, make sure the child has no carpet - local pos = parent1.object:get_pos() - local child, parent - if math.random(1,2) == 1 then - parent = parent1 - else - parent = parent2 - end - child = mcl_mobs:spawn_child(pos, parent.name) - if child then - local ent_c = child:get_luaentity() - ent_c.base_texture = table.copy(ent_c.base_texture) - ent_c.base_texture[2] = "blank.png" - child:set_properties({textures = ent_c.base_texture}) - ent_c.tamed = true - ent_c.carpet = nil - ent_c.owner = parent.owner - return false - end - end, - -}) - ---spawn -mcl_mobs:spawn_specific( -"mobs_mc:llama", -"overworld", -"ground", -{ - "Mesa", - "MesaPlateauFM_grasstop", - "MesaPlateauF", - "MesaPlateauFM", - "MesaPlateauF_grasstop", - "MesaBryce", - "Jungle", - "Jungle_shore", - "JungleM", - "JungleM_shore", - "JungleEdge", - "JungleEdgeM", -}, -0, -minetest.LIGHT_MAX+1, -30, -15000, -5, -mobs_mc.water_level+15, -mcl_vars.mg_overworld_max) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:llama", S("Llama"), "mobs_mc_spawn_icon_llama.png", 0) diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr deleted file mode 100644 index 676415d69b..0000000000 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.de.tr +++ /dev/null @@ -1,64 +0,0 @@ -# textdomain: mobs_mc -Agent=Akteur -Bat=Fledermaus -Blaze=Lohe -Chicken=Huhn -Cow=Kuh -Mooshroom=Pilzkuh -Creeper=Creeper -Ender Dragon=Enderdrache -Enderman=Enderman -Endermite=Endermilbe -Ghast=Ghast -Elder Guardian=Großer Wächter -Guardian=Wächter -Horse=Pferd -Skeleton Horse=Skelettpferd -Zombie Horse=Zombiepferd -Donkey=Esel -Mule=Maultier -Iron Golem=Eisengolem -Llama=Lama -Ocelot=Ozelot -Parrot=Papagei -Pig=Schwein -Polar Bear=Eisbär -Rabbit=Kaninchen -Killer Bunny=Killerkaninchen -Sheep=Schaf -Shulker=Shulker -Silverfish=Silberfischchen -Skeleton=Skelett -Stray=Eiswanderer -Wither Skeleton=Witherskelett -Magma Cube=Magmakubus -Slime=Schleim -Snow Golem=Schneegolem -Spider=Spinne -Cave Spider=Höhlenspinne -Squid=Tintenfisch -Vex=Plagegeist -Evoker=Magier -Illusioner=Illusionist -Villager=Dorfbewohner -Vindicator=Diener -Zombie Villager=Dorfbewohnerzombie -Witch=Hexe -Wither=Wither -Wolf=Wolf -Husk=Wüstenzombie -Zombie=Zombie -Zombie Pigman=Schweinezombie -Farmer=Bauer -Fisherman=Fischer -Fletcher=Pfeilmacher -Shepherd=Schäfer -Librarian=Bibliothekar -Cartographer=Kartograph -Armorer=Rüstungsschmied -Leatherworker=Lederarbeiter -Butcher=Metzger -Weapon Smith=Waffenschmied -Tool Smith=Werkzeugschmied -Cleric=Priester -Nitwit=Dorftrottel diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.es.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.es.tr deleted file mode 100644 index 7f89bb664d..0000000000 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.es.tr +++ /dev/null @@ -1,64 +0,0 @@ -# textdomain: mobs_mc -Agent=Agente -Bat=Murciélago -Blaze=Blaze -Chicken=Pollo -Cow=Vaca -Mooshroom=Champiñaca -Creeper=Creeper -Ender Dragon=Enderdragón -Enderman=Enderman -Endermite=Endermite -Ghast=Ghast -Elder Guardian=Gran guardián -Guardian=Guardián -Horse=Caballo -Skeleton Horse=Caballo esquelético -Zombie Horse=Caballo zombie -Donkey=Burro -Mule=Mula -Iron Golem=Golem de hierro -Llama=Llama -Ocelot=Ocelote -Parrot=Loro -Pig=Cerdo -Polar Bear=Oso polar -Rabbit=Conejo -Killer Bunny=Conejo asesino -Sheep=Oveja -Shulker=Shulker -Silverfish=Lepisma -Skeleton=Esqueleto -Stray=Esqueleto -Wither Skeleton=Esqueleto wither -Magma Cube=Cubo de Magma -Slime=Slime -Snow Golem=Golem de nieve -Spider=Araña -Cave Spider=Araña de las cuevas -Squid=Calamar -Vex=Ánima -Evoker=Invocador -Illusioner=Illusionista -Villager=Aldeano -Vindicator=Vindicador -Zombie Villager=Aldeano zombie -Witch=Bruja -Wither=Wither -Wolf=Lobo -Husk=Husk -Zombie=Zombie -Zombie Pigman=Cerdo Zombie -Farmer=Granjero -Fisherman=Pescador -Fletcher=Flechador -Shepherd=Sacerdote -Librarian=Bibliotecario -Cartographer=Cartógrafo -Armorer=Armero -Leatherworker=Peletero -Butcher=Carnicero -Weapon Smith=Herrero de Armas -Tool Smith=Herrero de Herramientas -Cleric=Sacerdote -Nitwit=Simple diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr deleted file mode 100644 index 3354dd49a1..0000000000 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr +++ /dev/null @@ -1,64 +0,0 @@ -# textdomain: mobs_mc -Agent=Agent -Bat=Chauve-souris -Blaze=Blaze -Chicken=Poulet -Cow=Vache -Mooshroom=Champimeuh -Creeper=Creeper -Ender Dragon=Ender Dragon -Enderman=Enderman -Endermite=Endermite -Ghast=Ghast -Elder Guardian=Gardien de l'Elder -Guardian=Gardien -Horse=Cheval -Skeleton Horse=Cheval-squelette -Zombie Horse=Cheval-zombie -Donkey=Âne -Mule=Mule -Iron Golem=Golem de fer -Llama=Lama -Ocelot=Ocelot -Parrot=Perroquet -Pig=Cochon -Polar Bear=Ours blanc -Rabbit=Lapin -Killer Bunny=Lapin tueur -Sheep=Mouton -Shulker=Shulker -Silverfish=Poisson d'argent -Skeleton=Squelette -Stray=Vagabond -Wither Skeleton=Wither squelette -Magma Cube=Cube de magma -Slime=Slime -Snow Golem=Golem de neige -Spider=Araignée -Cave Spider=Araignée venimeuse -Squid=Poulpe -Vex=Vex -Evoker=Invocateur -Illusioner=Illusionniste -Villager=Villageois -Vindicator=Vindicateur -Zombie Villager=Zombie Villageois -Witch=Sorcière -Wither=Wither -Wolf=Loup -Husk=Zombie Momifié -Zombie=Zombie -Zombie Pigman=Zombie Cochon -Farmer=Fermier -Fisherman=Pêcheur -Fletcher=Archer -Shepherd=Berger -Librarian=Bibliothécaire -Cartographer=Cartographe -Armorer=Armurier -Leatherworker=Tanneur -Butcher=Boucher -Weapon Smith=Fabriquant d'arme -Tool Smith=Fabriquant d'outil -Cleric=Clerc -Nitwit=Crétin diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.ru.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.ru.tr deleted file mode 100644 index 62fe69a97e..0000000000 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.ru.tr +++ /dev/null @@ -1,64 +0,0 @@ -# textdomain: mobs_mc -Agent=Агент -Bat=Летучая мышь -Blaze=Ифрит -Chicken=Курица -Cow=Корова -Mooshroom=Гриб -Creeper=Крипер -Ender Dragon=Дракон Предела -Enderman=Эндермен -Endermite=Эндермит -Ghast=Гаст -Elder Guardian=Древний страж -Guardian=Страж -Horse=Лошадь -Skeleton Horse=Скелет лошади -Zombie Horse=Зомби-лошадь -Donkey=Ослик -Mule=Мул -Iron Golem=Железный голем -Llama=Лама -Ocelot=Оцелот -Parrot=Попугай -Pig=Свинья -Polar Bear=Полярный медведь -Rabbit=Кролик -Killer Bunny=Кролик-убийца -Sheep=Овца -Shulker=Шалкер -Silverfish=Чешуйница -Skeleton=Скелет -Stray=Странник -Wither Skeleton=Скелет-иссушитель -Magma Cube=Лавовый куб -Slime=Слизняк -Snow Golem=Снежный голем -Spider=Паук -Cave Spider=Пещерный паук -Squid=Кальмар -Vex=Досаждатель -Evoker=Маг -Illusioner=Иллюзор -Villager=Житель -Vindicator=Поборник -Zombie Villager=Зомби-житель -Witch=Ведьма -Wither=Иссушитель -Wolf=Волк -Husk=Кадавр -Zombie=Зомби -Zombie Pigman=Зомби-свиночеловек -Farmer=Фермер -Fisherman=Рыбак -Fletcher=Лучник -Shepherd=Пастух -Librarian=Библиотекарь -Cartographer=Картограф -Armorer=Бронник -Leatherworker=Кожевник -Butcher=Мясник -Weapon Smith=Оружейник -Tool Smith=Инструментальщик -Cleric=Церковник -Nitwit=Нищий diff --git a/mods/ENTITIES/mobs_mc/locale/template.txt b/mods/ENTITIES/mobs_mc/locale/template.txt deleted file mode 100644 index aedd8754cd..0000000000 --- a/mods/ENTITIES/mobs_mc/locale/template.txt +++ /dev/null @@ -1,64 +0,0 @@ -# textdomain: mobs_mc -Agent= -Bat= -Blaze= -Chicken= -Cow= -Mooshroom= -Creeper= -Ender Dragon= -Enderman= -Endermite= -Ghast= -Elder Guardian= -Guardian= -Horse= -Skeleton Horse= -Zombie Horse= -Donkey= -Mule= -Iron Golem= -Llama= -Ocelot= -Parrot= -Pig= -Polar Bear= -Rabbit= -Killer Bunny= -Sheep= -Shulker= -Silverfish= -Skeleton= -Stray= -Wither Skeleton= -Magma Cube= -Slime= -Snow Golem= -Spider= -Cave Spider= -Squid= -Vex= -Evoker= -Illusioner= -Villager= -Vindicator= -Zombie Villager= -Witch= -Wither= -Wolf= -Husk= -Zombie= -Zombie Pigman= -Farmer= -Fisherman= -Fletcher= -Shepherd= -Librarian= -Cartographer= -Armorer= -Leatherworker= -Butcher= -Weapon Smith= -Tool Smith= -Cleric= -Nitwit= diff --git a/mods/ENTITIES/mobs_mc/mod.conf b/mods/ENTITIES/mobs_mc/mod.conf deleted file mode 100644 index 3d6a6928d2..0000000000 --- a/mods/ENTITIES/mobs_mc/mod.conf +++ /dev/null @@ -1,6 +0,0 @@ -name = mobs_mc -author = maikerumine -description = Adds Minecraft-like monsters and animals. -depends = mcl_init, mcl_particles, mcl_mobs, mcl_wip, mcl_core -optional_depends = default, mcl_tnt, mcl_bows, mcl_throwing, mcl_fishing, bones, mesecons_materials, mobs_mc_gameconfig, doc_items - diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_agent.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_agent.b3d deleted file mode 100644 index 3e79c009b9..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_agent.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_bat.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_bat.b3d deleted file mode 100644 index 522e611ab8..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_bat.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_blaze.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_blaze.b3d deleted file mode 100644 index 2328c8a644..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_blaze.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_cat.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_cat.b3d deleted file mode 100644 index 1a6ecbbe82..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_cat.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_chicken.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_chicken.b3d deleted file mode 100644 index 6d839a459a..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_chicken.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_cow.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_cow.b3d deleted file mode 100644 index c009839191..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_cow.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_creeper.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_creeper.b3d deleted file mode 100644 index e04ffc7b07..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_creeper.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_dragon.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_dragon.b3d deleted file mode 100644 index fb71951922..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_dragon.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_enderman.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_enderman.b3d deleted file mode 100644 index 30f42632b6..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_enderman.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_endermite.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_endermite.b3d deleted file mode 100644 index 633925e905..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_endermite.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_evoker.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_evoker.b3d deleted file mode 100644 index 6e1017e0c7..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_evoker.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_ghast.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_ghast.b3d deleted file mode 100644 index cebc037c05..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_ghast.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_guardian.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_guardian.b3d deleted file mode 100644 index d1fed68ba4..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_guardian.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_horse.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_horse.b3d deleted file mode 100644 index 613cb5eddc..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_horse.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_illusioner.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_illusioner.b3d deleted file mode 100644 index 7bb719ffbf..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_illusioner.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_iron_golem.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_iron_golem.b3d deleted file mode 100644 index a7fbd352b3..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_iron_golem.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_llama.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_llama.b3d deleted file mode 100644 index 5d6dd6b37a..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_llama.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_magmacube.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_magmacube.b3d deleted file mode 100644 index 52bf62a6dd..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_magmacube.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_mooshroom.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_mooshroom.b3d deleted file mode 100644 index c009839191..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_mooshroom.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_parrot.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_parrot.b3d deleted file mode 100644 index 7cb326d3d4..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_parrot.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_pig.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_pig.b3d deleted file mode 100644 index 8ba5b6a842..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_pig.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_polarbear.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_polarbear.b3d deleted file mode 100644 index bb64b2b792..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_polarbear.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_rabbit.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_rabbit.b3d deleted file mode 100644 index ad2067d7b5..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_rabbit.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_sheepfur.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_sheepfur.b3d deleted file mode 100644 index 1db15ddba3..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_sheepfur.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_shulker.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_shulker.b3d deleted file mode 100644 index e370bc8400..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_shulker.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_silverfish.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_silverfish.b3d deleted file mode 100644 index b550d563bb..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_silverfish.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_skeleton.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_skeleton.b3d deleted file mode 100644 index aa1681dbee..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_skeleton.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_slime.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_slime.b3d deleted file mode 100644 index b426ee23da..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_slime.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_snowman.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_snowman.b3d deleted file mode 100644 index d399ff7220..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_snowman.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_spider.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_spider.b3d deleted file mode 100644 index aec461a6b6..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_spider.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_squid.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_squid.b3d deleted file mode 100644 index 887576b28a..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_squid.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_stray.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_stray.b3d deleted file mode 100644 index c8eefe0332..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_stray.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_vex.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_vex.b3d deleted file mode 100644 index f52772dd6d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_vex.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_villager.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_villager.b3d deleted file mode 100644 index a941ca8eff..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_villager.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_villager_zombie.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_villager_zombie.b3d deleted file mode 100644 index b7dd9d7ee1..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_villager_zombie.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_vindicator.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_vindicator.b3d deleted file mode 100644 index ae14e8edbe..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_vindicator.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_witch.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_witch.b3d deleted file mode 100644 index 86c2988305..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_witch.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_wither.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_wither.b3d deleted file mode 100644 index 4669f3eb54..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_wither.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_witherskeleton.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_witherskeleton.b3d deleted file mode 100644 index c1b808307c..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_witherskeleton.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_wolf.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_wolf.b3d deleted file mode 100644 index 63db5e0970..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_wolf.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_zombie.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_zombie.b3d deleted file mode 100644 index deacf31b6b..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_zombie.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_zombie_pigman.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_zombie_pigman.b3d deleted file mode 100644 index 0b9f4f7c91..0000000000 Binary files a/mods/ENTITIES/mobs_mc/models/mobs_mc_zombie_pigman.b3d and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/ocelot.lua b/mods/ENTITIES/mobs_mc/ocelot.lua deleted file mode 100644 index 9831997627..0000000000 --- a/mods/ENTITIES/mobs_mc/ocelot.lua +++ /dev/null @@ -1,234 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### OCELOT AND CAT ---################### - -local pr = PseudoRandom(os.time()*12) - -local default_walk_chance = 70 - -local follow = { - "mcl_fishing:fish_raw", - "mcl_fishing:salmon_raw", - "mcl_fishing:clownfish_raw", - "mcl_fishing:pufferfish_raw", -} - -local function is_food(itemstring) - return table.indexof(follow, itemstring) ~= -1 -end - --- Ocelot -local ocelot = { - description = S("Ocelot"), - type = "animal", - spawn_class = "passive", - can_despawn = true, - hp_min = 10, - hp_max = 10, - xp_min = 1, - xp_max = 3, - collisionbox = {-0.3, -0.01, -0.3, 0.3, 0.69, 0.3}, - visual = "mesh", - mesh = "mobs_mc_cat.b3d", - textures = {"mobs_mc_cat_ocelot.png"}, - visual_size = {x=2.0, y=2.0}, - makes_footstep_sound = true, - walk_chance = default_walk_chance, - walk_velocity = 1, - run_velocity = 3, - follow_velocity = 1, - floats = 1, - runaway = true, - fall_damage = 0, - fear_height = 4, - sounds = { - damage = "mobs_mc_ocelot_hurt", - death = "mobs_mc_ocelot_hurt", - eat = "mobs_mc_animal_eat_generic", - distance = 16, - }, - animation = { - speed_normal = 25, - run_speed = 50, - stand_start = 0, - stand_end = 0, - walk_start = 0, - walk_end = 40, - run_start = 0, - run_end = 40, - }, - follow = follow, - view_range = 12, - passive = true, - attack_type = "dogfight", - pathfinding = 1, - damage = 2, - reach = 1, - attack_animals = true, - specific_attack = { "mobs_mc:chicken" }, - on_rightclick = function(self, clicker) - if self.child then return end - -- Try to tame ocelot (mobs:feed_tame is intentionally NOT used) - local item = clicker:get_wielded_item() - if is_food(item:get_name()) then - if not minetest.is_creative_enabled(clicker:get_player_name()) then - item:take_item() - clicker:set_wielded_item(item) - end - -- 1/3 chance of getting tamed - if pr:next(1, 3) == 1 then - local yaw = self.object:get_yaw() - local cat = minetest.add_entity(self.object:get_pos(), "mobs_mc:cat") - cat:set_yaw(yaw) - local ent = cat:get_luaentity() - ent.owner = clicker:get_player_name() - ent.tamed = true - self.object:remove() - return - end - end - - end, -} - -mcl_mobs:register_mob("mobs_mc:ocelot", ocelot) - --- Cat -local cat = table.copy(ocelot) -cat.description = S("Cat") -cat.textures = {{"mobs_mc_cat_black.png"}, {"mobs_mc_cat_red.png"}, {"mobs_mc_cat_siamese.png"}} -cat.can_despawn = false -cat.owner = "" -cat.order = "roam" -- "sit" or "roam" -cat.owner_loyal = true -cat.tamed = true -cat.runaway = false -cat.follow_velocity = 2.4 --- Automatically teleport cat to owner -cat.do_custom = mobs_mc.make_owner_teleport_function(12) -cat.sounds = { - random = "mobs_mc_cat_idle", - damage = "mobs_mc_cat_hiss", - death = "mobs_mc_ocelot_hurt", - eat = "mobs_mc_animal_eat_generic", - distance = 16, -} -cat.on_rightclick = function(self, clicker) - if mcl_mobs:feed_tame(self, clicker, 1, true, false) then return end - if mcl_mobs:capture_mob(self, clicker, 0, 60, 5, false, nil) then return end - if mcl_mobs:protect(self, clicker) then return end - - if self.child then return end - - -- Toggle sitting order - - if not self.owner or self.owner == "" then - -- Huh? This cat has no owner? Let's fix this! This should never happen. - self.owner = clicker:get_player_name() - end - - if not self.order or self.order == "" or self.order == "sit" then - self.order = "roam" - self.walk_chance = default_walk_chance - self.jump = true - else - -- “Sit!” - -- TODO: Add sitting model - self.order = "sit" - self.walk_chance = 0 - self.jump = false - end - -end - -mcl_mobs:register_mob("mobs_mc:cat", cat) - -local base_spawn_chance = 5000 - --- Spawn ocelot ---they get the same as the llama because I'm trying to rework so much of this code right now -j4i -mcl_mobs:spawn_specific( -"mobs_mc:ocelot", -"overworld", -"ground", -{ -"Jungle", -"JungleEdgeM", -"JungleM", -"JungleEdge", -}, -0, -minetest.LIGHT_MAX+1, -30, -15000, -5, -mobs_mc.water_level+15, -mcl_vars.mg_overworld_max) ---[[ -mobs:spawn({ - name = "mobs_mc:ocelot", - nodes = { "mcl_core:jungletree", "mcl_core:jungleleaves", "mcl_flowers:fern", "mcl_core:vine" }, - neighbors = {"air"}, - light_max = minetest.LIGHT_MAX+1, - light_min = 0, - chance = math.ceil(base_spawn_chance * 1.5), -- emulates 1/3 spawn failure rate - active_object_count = 12, - min_height = mobs_mc.water_level+1, -- Right above ocean level - max_height = mcl_vars.mg_overworld_max, - on_spawn = function(self, pos) - Note: Minecraft has a 1/3 spawn failure rate. - In this mod it is emulated by reducing the spawn rate accordingly (see above). - - -- 1/7 chance to spawn 2 ocelot kittens - if pr:next(1,7) == 1 then - -- Turn object into a child - local make_child = function(object) - local ent = object:get_luaentity() - object:set_properties({ - visual_size = { x = ent.base_size.x/2, y = ent.base_size.y/2 }, - collisionbox = { - ent.base_colbox[1]/2, - ent.base_colbox[2]/2, - ent.base_colbox[3]/2, - ent.base_colbox[4]/2, - ent.base_colbox[5]/2, - ent.base_colbox[6]/2, - } - }) - ent.child = true - end - - -- Possible spawn offsets, two of these will get selected - local k = 0.7 - local offsets = { - { x=k, y=0, z=0 }, - { x=-k, y=0, z=0 }, - { x=0, y=0, z=k }, - { x=0, y=0, z=-k }, - { x=k, y=0, z=k }, - { x=k, y=0, z=-k }, - { x=-k, y=0, z=k }, - { x=-k, y=0, z=-k }, - } - for i=1, 2 do - local o = pr:next(1, #offsets) - local offset = offsets[o] - local child_pos = vector.add(pos, offsets[o]) - table.remove(offsets, o) - make_child(minetest.add_entity(child_pos, "mobs_mc:ocelot")) - end - end - end, -}) -]]-- - --- spawn eggs --- FIXME: The spawn icon shows a cat texture, not an ocelot texture -mcl_mobs:register_egg("mobs_mc:ocelot", S("Ocelot"), "mobs_mc_spawn_icon_cat.png", 0) diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mobs_mc/parrot.lua deleted file mode 100644 index 84b3aaead7..0000000000 --- a/mods/ENTITIES/mobs_mc/parrot.lua +++ /dev/null @@ -1,190 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### PARROT ---################### -local shoulders = { - left = vector.new(-3.75,10.5,0), - right = vector.new(3.75,10.5,0) -} - ---find a free shoulder or return nil -local function get_shoulder(player) - local sh = "left" - for _,o in pairs(player:get_children()) do - local l = o:get_luaentity() - if l and l.name == "mobs_mc:parrot" then - local _,_,a = l.object:get_attach() - for _,s in pairs(shoulders) do - if a and vector.equals(a,s) then - if sh == "left" then - sh = "right" - else - return - end - - end - end - end - end - return shoulders[sh] -end - -local function perch(self,player) - if self.tamed and player:get_player_name() == self.owner and not self.object:get_attach() then - local shoulder = get_shoulder(player) - if not shoulder then return true end - self.object:set_attach(player,"",shoulder,vector.new(0,0,0),true) - mcl_mobs:set_animation(self, "stand") - end -end - -local function check_perch(self,dtime) - if self.object:get_attach() then - for _,p in pairs(minetest.get_connected_players()) do - for _,o in pairs(p:get_children()) do - local l = o:get_luaentity() - if l and l.name == "mobs_mc:parrot" then - local n1 = minetest.get_node(vector.offset(p:get_pos(),0,-0.6,0)).name - local n2 = minetest.get_node(vector.offset(p:get_pos(),0,0,0)).name - local n3 = minetest.get_node(vector.offset(p:get_pos(),0,1,0)).name - if n1 == "air" or minetest.get_item_group(n2,"water") > 0 or minetest.get_item_group(n2,"lava") > 0 then - o:set_detach() - self.detach_timer = 0 - return - end - end - end - end - elseif not self.detach_timer then - for _,p in pairs(minetest.get_connected_players()) do - if vector.distance(self.object:get_pos(),p:get_pos()) < 0.5 then - perch(self,p) - return - end - end - elseif self.detach_timer then - if self.detach_timer > 1 then - self.detach_timer = nil - else - self.detach_timer = self.detach_timer + dtime - end - end -end - -mcl_mobs:register_mob("mobs_mc:parrot", { - description = S("Parrot"), - type = "npc", - spawn_class = "passive", - pathfinding = 1, - hp_min = 6, - hp_max = 6, - xp_min = 1, - xp_max = 3, - collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.89, 0.25}, - visual = "mesh", - mesh = "mobs_mc_parrot.b3d", - textures = {{"mobs_mc_parrot_blue.png"},{"mobs_mc_parrot_green.png"},{"mobs_mc_parrot_grey.png"},{"mobs_mc_parrot_red_blue.png"},{"mobs_mc_parrot_yellow_blue.png"}}, - visual_size = {x=3, y=3}, - walk_velocity = 3, - run_velocity = 5, - sounds = { - random = "mobs_mc_parrot_random", - damage = {name="mobs_mc_parrot_hurt", gain=0.3}, - death = {name="mobs_mc_parrot_death", gain=0.6}, - eat = "mobs_mc_animal_eat_generic", - distance = 16, - }, - drops = { - {name = "mcl_mobitems:feather", - chance = 1, - min = 1, - max = 2, - looting = "common",}, - }, - animation = { - stand_speed = 50, - walk_speed = 50, - fly_speed = 50, - stand_start = 0, - stand_end = 0, - fly_start = 30, - fly_end = 45, - walk_start = 0, - walk_end = 20, - -- TODO: actual walk animation - --walk_start = 0, - --walk_end = 20, - - -- TODO: more unused animations between 45 and 130 - }, - fall_damage = 0, - fall_speed = -2.25, - attack_type = "dogfight", - floats = 1, - physical = true, - fly = true, - makes_footstep_sound = false, - fear_height = 0, - view_range = 16, - follow = { - "mcl_farming:wheat_seeds", - "mcl_farming:melon_seeds", - "mcl_farming:pumpkin_seeds", - "mcl_farming:beetroot_seeds", - }, - on_rightclick = function(self, clicker) - if self._doomed then return end - local item = clicker:get_wielded_item() - -- Kill parrot if fed with cookie - if item:get_name() == "mcl_farming:cookie" then - minetest.sound_play("mobs_mc_animal_eat_generic", {object = self.object, max_hear_distance=16}, true) - self.health = 0 - -- Doomed to die - self._doomed = true - if not minetest.is_creative_enabled(clicker:get_player_name()) then - item:take_item() - clicker:set_wielded_item(item) - end - return - end - -- Feed to tame, but not breed - if mcl_mobs:feed_tame(self, clicker, 1, false, true) then return end - perch(self,clicker) - end, - do_custom = function(self,dtime) - check_perch(self,dtime) - end, - do_punch = function(self,puncher) --do_punch is the mcl_mobs_redo variant - it gets called by on_punch later.... - if self.object:get_attach() == puncher then - return false --return false explicitly here. mcl_mobs checks for that - end - end, -}) - --- Parrots spawn rarely in jungles. TODO: Also check for jungle *biome* <- I'll get to this eventually -j4i -mcl_mobs:spawn_specific( -"mobs_mc:parrot", -"overworld", -"ground", -{ -"Jungle", -"JungleEdgeM", -"JungleM", -"JungleEdge", -}, -0, -minetest.LIGHT_MAX+1, -7, -30000, -1, -mobs_mc.water_level+7, -mcl_vars.mg_overworld_max) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:parrot", S("Parrot"), "mobs_mc_spawn_icon_parrot.png", 0) diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua deleted file mode 100644 index 3cf88b9158..0000000000 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ /dev/null @@ -1,242 +0,0 @@ ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - -mcl_mobs:register_mob("mobs_mc:pig", { - description = S("Pig"), - type = "animal", - spawn_class = "passive", - runaway = true, - hp_min = 10, - hp_max = 10, - xp_min = 1, - xp_max = 3, - collisionbox = {-0.45, -0.01, -0.45, 0.45, 0.865, 0.45}, - visual = "mesh", - mesh = "mobs_mc_pig.b3d", - textures = {{ - "blank.png", -- baby - "mobs_mc_pig.png", -- base - "blank.png", -- saddle - }}, - visual_size = {x=2.5, y=2.5}, - makes_footstep_sound = true, - walk_velocity = 1, - run_velocity = 3, - follow_velocity = 3.4, - drops = { - {name = "mcl_mobitems:porkchop", - chance = 1, - min = 1, - max = 3, - looting = "common",}, - }, - fear_height = 4, - sounds = { - random = "mobs_pig", - death = "mobs_pig_angry", - damage = "mobs_pig", - eat = "mobs_mc_animal_eat_generic", - distance = 16, - }, - animation = { - stand_speed = 40, - walk_speed = 40, - run_speed = 90, - stand_start = 0, - stand_end = 0, - walk_start = 0, - walk_end = 40, - run_start = 0, - run_end = 40, - }, - follow = { - "mcl_farming:potato_item", - "mcl_farming:carrot_item", - "mcl_farming:beetroot_item", - "mcl_mobitems:carrot_on_a_stick" - }, - view_range = 8, - 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 = 4 - self.terrain_type = 3 - self.driver_attach_at = {x = 0.0, y = 2.75, z = -1.5} - self.driver_eye_offset = {x = 0, y = 3, z = 0} - self.driver_scale = {x = 1/self.visual_size.x, y = 1/self.visual_size.y} - end - - -- if driver present allow control of horse - if self.driver then - - mcl_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 - mcl_mobs.detach(self.driver, {x = 1, y = 0, z = 1}) - end - end, - - on_rightclick = function(self, clicker) - if not clicker or not clicker:is_player() then - return - end - - local wielditem = clicker:get_wielded_item() - -- Feed pig - if wielditem:get_name() ~= "mcl_mobitems:carrot_on_a_stick" then - if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end - end - if mcl_mobs:protect(self, clicker) then return end - - if self.child then - return - end - - -- Put saddle on pig - local item = clicker:get_wielded_item() - if item:get_name() == "mcl_mobitems:saddle" and self.saddle ~= "yes" then - self.base_texture = { - "blank.png", -- baby - "mobs_mc_pig.png", -- base - "mobs_mc_pig_saddle.png", -- saddle - } - self.object:set_properties({ - textures = self.base_texture - }) - self.saddle = "yes" - self.tamed = true - self.drops = { - {name = "mcl_mobitems:porkchop", - chance = 1, - min = 1, - max = 3,}, - {name = "mcl_mobitems:saddle", - chance = 1, - min = 1, - max = 1,}, - } - if not minetest.is_creative_enabled(clicker:get_player_name()) then - local inv = clicker:get_inventory() - local stack = inv:get_stack("main", clicker:get_wield_index()) - stack:take_item() - inv:set_stack("main", clicker:get_wield_index(), stack) - end - minetest.sound_play({name = "mcl_armor_equip_leather"}, {gain=0.5, max_hear_distance=8, pos=self.object:get_pos()}, true) - return - end - - -- Mount or detach player - local name = clicker:get_player_name() - if self.driver and clicker == self.driver then - -- Detach if already attached - mcl_mobs.detach(clicker, {x=1, y=0, z=0}) - return - - elseif not self.driver and self.saddle == "yes" and wielditem:get_name() == "mcl_mobitems:carrot_on_a_stick" then - -- Ride pig if it has a saddle and player uses a carrot on a stick - - mcl_mobs.attach(self, clicker) - - if not minetest.is_creative_enabled(clicker:get_player_name()) then - - local inv = self.driver:get_inventory() - -- 26 uses - if wielditem:get_wear() > 63000 then - -- Break carrot on a stick - local def = wielditem:get_definition() - if def.sounds and def.sounds.breaks then - minetest.sound_play(def.sounds.breaks, {pos = clicker:get_pos(), max_hear_distance = 8, gain = 0.5}, true) - end - wielditem = {name = "mcl_fishing:fishing_rod", count = 1} - else - wielditem:add_wear(2521) - end - inv:set_stack("main",self.driver:get_wield_index(), wielditem) - end - return - - -- Capture pig - elseif not self.driver and clicker:get_wielded_item():get_name() ~= "" then - mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) - end - end, - - on_breed = function(parent1, parent2) - local pos = parent1.object:get_pos() - local child = mcl_mobs:spawn_child(pos, parent1.name) - if child then - local ent_c = child:get_luaentity() - ent_c.tamed = true - ent_c.owner = parent1.owner - return false - end - end, -}) - -mcl_mobs:spawn_specific( -"mobs_mc:pig", -"overworld", -"ground", -{ - "flat", - "IcePlainsSpikes", - "ColdTaiga", - "ColdTaiga_beach", - "ColdTaiga_beach_water", - "MegaTaiga", - "MegaSpruceTaiga", - "ExtremeHills", - "ExtremeHills_beach", - "ExtremeHillsM", - "ExtremeHills+", - "ExtremeHills+_snowtop", - "StoneBeach", - "Plains", - "Plains_beach", - "SunflowerPlains", - "Taiga", - "Taiga_beach", - "Forest", - "Forest_beach", - "FlowerForest", - "FlowerForest_beach", - "BirchForest", - "BirchForestM", - "RoofedForest", - "Savanna", - "Savanna_beach", - "SavannaM", - "Jungle", - "Jungle_shore", - "JungleM", - "JungleM_shore", - "JungleEdge", - "JungleEdgeM", - "Swampland", - "Swampland_shore" -}, -9, -minetest.LIGHT_MAX+1, -30, -15000, -8, -mcl_vars.mg_overworld_min, -mcl_vars.mg_overworld_max) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:pig", S("Pig"), "mobs_mc_spawn_icon_pig.png", 0) diff --git a/mods/ENTITIES/mobs_mc/polar_bear.lua b/mods/ENTITIES/mobs_mc/polar_bear.lua deleted file mode 100644 index 3fd2d0a0cd..0000000000 --- a/mods/ENTITIES/mobs_mc/polar_bear.lua +++ /dev/null @@ -1,90 +0,0 @@ ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### POLARBEAR ---################### - - -mcl_mobs:register_mob("mobs_mc:polar_bear", { - description = S("Polar Bear"), - type = "animal", - spawn_class = "passive", - runaway = false, - passive = false, - hp_min = 30, - hp_max = 30, - xp_min = 1, - xp_max = 3, - breath_max = -1, - collisionbox = {-0.7, -0.01, -0.7, 0.7, 1.39, 0.7}, - visual = "mesh", - mesh = "mobs_mc_polarbear.b3d", - textures = { - {"mobs_mc_polarbear.png"}, - }, - visual_size = {x=3.0, y=3.0}, - makes_footstep_sound = true, - damage = 6, - reach = 2, - walk_velocity = 1.2, - run_velocity = 2.4, - group_attack = true, - attack_type = "dogfight", - drops = { - -- 3/4 chance to drop raw fish (poor approximation) - {name = "mcl_fishing:fish_raw", - chance = 2, - min = 0, - max = 2, - looting = "common",}, - -- 1/4 to drop raw salmon - {name = "mcl_fishing:salmon_raw", - chance = 4, - min = 0, - max = 2, - looting = "common",}, - - }, - floats = 1, - fear_height = 4, - sounds = { - random = "mobs_mc_bear_random", - attack = "mobs_mc_bear_attack", - damage = "mobs_mc_bear_hurt", - death = "mobs_mc_bear_death", - war_cry = "mobs_mc_bear_growl", - distance = 16, - }, - animation = { - speed_normal = 25, speed_run = 50, - stand_start = 0, stand_end = 0, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, - }, - - view_range = 16, -}) - - -mcl_mobs:spawn_specific( -"mobs_mc:polar_bear", -"overworld", -"ground", -{ -"ColdTaiga", -"IcePlainsSpikes", -"IcePlains", -"ExtremeHills+_snowtop", -}, -0, -minetest.LIGHT_MAX+1, -30, -7000, -3, -mcl_vars.mg_overworld_min, -mcl_vars.mg_overworld_max) - --- spawn egg -mcl_mobs:register_egg("mobs_mc:polar_bear", S("Polar Bear"), "mobs_mc_spawn_icon_polarbear.png", 0) diff --git a/mods/ENTITIES/mobs_mc/rabbit.lua b/mods/ENTITIES/mobs_mc/rabbit.lua deleted file mode 100644 index 524000a714..0000000000 --- a/mods/ENTITIES/mobs_mc/rabbit.lua +++ /dev/null @@ -1,219 +0,0 @@ ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - -local rabbit = { - description = S("Rabbit"), - type = "animal", - spawn_class = "passive", - passive = true, - reach = 1, - - hp_min = 3, - hp_max = 3, - xp_min = 1, - xp_max = 3, - collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.49, 0.2}, - - visual = "mesh", - mesh = "mobs_mc_rabbit.b3d", - textures = { - {"mobs_mc_rabbit_brown.png"}, - {"mobs_mc_rabbit_gold.png"}, - {"mobs_mc_rabbit_white.png"}, - {"mobs_mc_rabbit_white_splotched.png"}, - {"mobs_mc_rabbit_salt.png"}, - {"mobs_mc_rabbit_black.png"}, - }, - visual_size = {x=1.5, y=1.5}, - sounds = { - random = "mobs_mc_rabbit_random", - damage = "mobs_mc_rabbit_hurt", - death = "mobs_mc_rabbit_death", - attack = "mobs_mc_rabbit_attack", - eat = "mobs_mc_animal_eat_generic", - distance = 16, - }, - makes_footstep_sound = false, - walk_velocity = 1, - run_velocity = 3.7, - follow_velocity = 1.1, - floats = 1, - runaway = true, - jump = true, - drops = { - {name = "mcl_mobitems:rabbit", chance = 1, min = 0, max = 1, looting = "common",}, - {name = "mcl_mobitems:rabbit_hide", chance = 1, min = 0, max = 1, looting = "common",}, - {name = "mcl_mobitems:rabbit_foot", chance = 10, min = 0, max = 1, looting = "rare", looting_factor = 0.03,}, - }, - fear_height = 4, - animation = { - speed_normal = 25, speed_run = 50, - stand_start = 0, stand_end = 0, - walk_start = 0, walk_end = 20, - run_start = 0, run_end = 20, - }, - -- Follow (yellow) dangelions, carrots and golden carrots - follow = { - "mcl_flowers:dandelion", - "mcl_farming:carrot_item", - "mcl_farming:carrot_item_gold", - }, - view_range = 8, - -- Eat carrots and reduce their growth stage by 1 - replace_rate = 10, - replace_what = { - {"mcl_farming:carrot", "mcl_farming:carrot_7", 0}, - {"mcl_farming:carrot_7", "mcl_farming:carrot_6", 0}, - {"mcl_farming:carrot_6", "mcl_farming:carrot_5", 0}, - {"mcl_farming:carrot_5", "mcl_farming:carrot_4", 0}, - {"mcl_farming:carrot_4", "mcl_farming:carrot_3", 0}, - {"mcl_farming:carrot_3", "mcl_farming:carrot_2", 0}, - {"mcl_farming:carrot_2", "mcl_farming:carrot_1", 0}, - {"mcl_farming:carrot_1", "air", 0}, - }, - on_rightclick = function(self, clicker) - -- Feed, tame protect or capture - if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end - if mcl_mobs:protect(self, clicker) then return end - if mcl_mobs:capture_mob(self, clicker, 0, 50, 80, false, nil) then return end - end, - do_custom = function(self) - -- Easter egg: Change texture if rabbit is named “Toast” - if self.nametag == "Toast" and not self._has_toast_texture then - self._original_rabbit_texture = self.base_texture - self.base_texture = { "mobs_mc_rabbit_toast.png" } - self.object:set_properties({ textures = self.base_texture }) - self._has_toast_texture = true - elseif self.nametag ~= "Toast" and self._has_toast_texture then - self.base_texture = self._original_rabbit_texture - self.object:set_properties({ textures = self.base_texture }) - self._has_toast_texture = false - end - end, -} - -mcl_mobs:register_mob("mobs_mc:rabbit", rabbit) - --- The killer bunny (Only with spawn egg) -local killer_bunny = table.copy(rabbit) -killer_bunny.description = S("Killer Bunny") -killer_bunny.type = "monster" -killer_bunny.spawn_class = "hostile" -killer_bunny.attack_type = "dogfight" -killer_bunny.specific_attack = { "player", "mobs_mc:wolf", "mobs_mc:dog" } -killer_bunny.damage = 8 -killer_bunny.passive = false --- 8 armor points -killer_bunny.armor = 50 -killer_bunny.textures = { "mobs_mc_rabbit_caerbannog.png" } -killer_bunny.view_range = 16 -killer_bunny.replace_rate = nil -killer_bunny.replace_what = nil -killer_bunny.on_rightclick = nil -killer_bunny.run_velocity = 6 -killer_bunny.do_custom = function(self) - if not self._killer_bunny_nametag_set then - self.nametag = "The Killer Bunny" - self._killer_bunny_nametag_set = true - end -end - -mcl_mobs:register_mob("mobs_mc:killer_bunny", killer_bunny) - --- Mob spawning rules. --- Different skins depending on spawn location <- we'll get to this when the spawning algorithm is fleshed out - -mcl_mobs:spawn_specific( -"mobs_mc:rabbit", -"overworld", -"ground", -{ -"Desert", -"FlowerForest", -"Taiga", -"ExtremeHills", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Plains", -"ColdTaiga", -"SunflowerPlains", -"RoofedForest", -"MesaPlateauFM_grasstop", -"ExtremeHillsM", -"BirchForestM", -}, -9, -minetest.LIGHT_MAX+1, -30, -15000, -8, -mcl_vars.mg_overworld_min, -mcl_vars.mg_overworld_max) - ---[[ -local spawn = { - name = "mobs_mc:rabbit", - neighbors = {"air"}, - chance = 15000, - active_object_count = 10, - min_light = 0, - max_light = minetest.LIGHT_MAX+1, - min_height = mcl_vars.mg_overworld_min, - max_height = mcl_vars.mg_overworld_max, -} - -local spawn_desert = table.copy(spawn) -spawn_desert.nodes = { "mcl_core:sand", "mcl_core:sandstone" } -spawn_desert.on_spawn = function(self, pos) - local texture = "mobs_mc_rabbit_gold.png" - self.base_texture = { "mobs_mc_rabbit_gold.png" } - self.object:set_properties({textures = self.base_texture}) -end -mcl_mobs:spawn(spawn_desert) - -local spawn_snow = table.copy(spawn) -spawn_snow.nodes = { "mcl_core:snow", "mcl_core:snowblock", "mcl_core:dirt_with_grass_snow" } -spawn_snow.on_spawn = function(self, pos) - local texture - local r = math.random(1, 100) - -- 80% white fur - if r <= 80 then - texture = "mobs_mc_rabbit_white.png" - -- 20% black and white fur - else - texture = "mobs_mc_rabbit_white_splotched.png" - end - self.base_texture = { texture } - self.object:set_properties({textures = self.base_texture}) -end -mcl_mobs:spawn(spawn_snow) - -local spawn_grass = table.copy(spawn) -spawn_grass.nodes = { "mcl_core:dirt_with_grass" } -spawn_grass.on_spawn = function(self, pos) - local texture - local r = math.random(1, 100) - -- 50% brown fur - if r <= 50 then - texture = "mobs_mc_rabbit_brown.png" - -- 40% salt fur - elseif r <= 90 then - texture = "mobs_mc_rabbit_salt.png" - -- 10% black fur - else - texture = "mobs_mc_rabbit_black.png" - end - self.base_texture = { texture } - self.object:set_properties({textures = self.base_texture}) -end -mcl_mobs:spawn(spawn_grass) -]]-- - --- Spawn egg -mcl_mobs:register_egg("mobs_mc:rabbit", S("Rabbit"), "mobs_mc_spawn_icon_rabbit.png", 0) - --- Note: This spawn egg does not exist in Minecraft -mcl_mobs:register_egg("mobs_mc:killer_bunny", S("Killer Bunny"), "mobs_mc_spawn_icon_rabbit.png^[colorize:#FF0000:192", 0) -- TODO: Update inventory image diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua deleted file mode 100644 index d2d09be50d..0000000000 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ /dev/null @@ -1,358 +0,0 @@ ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### SHEEP ---################### - -local colors = { - -- group = { wool, textures } - unicolor_white = { "mcl_wool:white", "#FFFFFF00" }, - unicolor_dark_orange = { "mcl_wool:brown", "#502A00D0" }, - unicolor_grey = { "mcl_wool:silver", "#5B5B5BD0" }, - unicolor_darkgrey = { "mcl_wool:grey", "#303030D0" }, - unicolor_blue = { "mcl_wool:blue", "#0000CCD0" }, - unicolor_dark_green = { "mcl_wool:green", "#005000D0" }, - unicolor_green = { "mcl_wool:lime", "#50CC00D0" }, - unicolor_violet = { "mcl_wool:purple" , "#5000CCD0" }, - unicolor_light_red = { "mcl_wool:pink", "#FF5050D0" }, - unicolor_yellow = { "mcl_wool:yellow", "#CCCC00D0" }, - unicolor_orange = { "mcl_wool:orange", "#CC5000D0" }, - unicolor_red = { "mcl_wool:red", "#CC0000D0" }, - unicolor_cyan = { "mcl_wool:cyan", "#00CCCCD0" }, - unicolor_red_violet = { "mcl_wool:magenta", "#CC0050D0" }, - unicolor_black = { "mcl_wool:black", "#000000D0" }, - unicolor_light_blue = { "mcl_wool:light_blue", "#5050FFD0" }, -} - -local rainbow_colors = { - "unicolor_light_red", - "unicolor_red", - "unicolor_orange", - "unicolor_yellow", - "unicolor_green", - "unicolor_dark_green", - "unicolor_light_blue", - "unicolor_blue", - "unicolor_violet", - "unicolor_red_violet" -} - -local sheep_texture = function(color_group) - if not color_group then - color_group = "unicolor_white" - end - return { - "mobs_mc_sheep_fur.png^[colorize:"..colors[color_group][2], - "mobs_mc_sheep.png", - } -end - -local gotten_texture = { "blank.png", "mobs_mc_sheep.png" } - ---mcsheep -mcl_mobs:register_mob("mobs_mc:sheep", { - description = S("Sheep"), - type = "animal", - spawn_class = "passive", - hp_min = 8, - hp_max = 8, - xp_min = 1, - xp_max = 3, - collisionbox = {-0.45, -0.01, -0.45, 0.45, 1.29, 0.45}, - - visual = "mesh", - visual_size = {x=3, y=3}, - mesh = "mobs_mc_sheepfur.b3d", - textures = { sheep_texture("unicolor_white") }, - gotten_texture = gotten_texture, - color = "unicolor_white", - makes_footstep_sound = true, - walk_velocity = 1, - drops = { - {name = "mcl_mobitems:mutton", - chance = 1, - min = 1, - max = 2, - looting = "common",}, - {name = colors["unicolor_white"][1], - chance = 1, - min = 1, - max = 1, - looting = "common",}, - }, - fear_height = 4, - sounds = { - random = "mobs_sheep", - death = "mobs_sheep", - damage = "mobs_sheep", - sounds = "mobs_mc_animal_eat_generic", - distance = 16, - }, - animation = { - speed_normal = 25, run_speed = 65, - stand_start = 40, stand_end = 80, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, - }, - follow = { "mcl_farming:wheat_item" }, - view_range = 12, - - -- Eat grass - replace_rate = 20, - replace_what = { - { "mcl_core:dirt_with_grass", "mcl_core:dirt", -1 }, - { "mcl_flowers:tallgrass", "air", 0 }, - }, - -- Properly regrow wool after eating grass - on_replace = function(self, pos, oldnode, newnode) - if not self.color or not colors[self.color] then - self.color = "unicolor_white" - end - self.gotten = false - self.base_texture = sheep_texture(self.color) - self.object:set_properties({ textures = self.base_texture }) - self.drops = { - {name = "mcl_mobitems:mutton", - chance = 1, - min = 1, - max = 2,}, - {name = colors[self.color][1], - chance = 1, - min = 1, - max = 1,}, - } - end, - - -- Set random color on spawn - do_custom = function(self, dtime) - if not self.initial_color_set then - local r = math.random(0,100000) - local textures - if r <= 81836 then - -- 81.836% - self.color = "unicolor_white" - elseif r <= 81836 + 5000 then - -- 5% - self.color = "unicolor_grey" - elseif r <= 81836 + 5000 + 5000 then - -- 5% - self.color = "unicolor_darkgrey" - elseif r <= 81836 + 5000 + 5000 + 5000 then - -- 5% - self.color = "unicolor_black" - elseif r <= 81836 + 5000 + 5000 + 5000 + 3000 then - -- 3% - self.color = "unicolor_dark_orange" - else - -- 0.164% - self.color = "unicolor_light_red" - end - self.base_texture = sheep_texture(self.color) - self.object:set_properties({ textures = self.base_texture }) - self.drops = { - {name = "mcl_mobitems:mutton", - chance = 1, - min = 1, - max = 2,}, - {name = colors[self.color][1], - chance = 1, - min = 1, - max = 1,}, - } - self.initial_color_set = true - end - - local is_kay27 = self.nametag == "kay27" - - if self.color_change_timer then - local old_color = self.color - if is_kay27 then - self.color_change_timer = self.color_change_timer - dtime - if self.color_change_timer < 0 then - self.color_change_timer = 0.5 - self.color_index = (self.color_index + 1) % #rainbow_colors - self.color = rainbow_colors[self.color_index + 1] - end - else - self.color_change_timer = nil - self.color_index = nil - self.color = self.initial_color - end - - if old_color ~= self.color then - self.base_texture = sheep_texture(self.color) - self.object:set_properties({textures = self.base_texture}) - end - elseif is_kay27 then - self.initial_color = self.color - self.color_change_timer = 0 - self.color_index = -1 - end - end, - - on_rightclick = function(self, clicker) - local item = clicker:get_wielded_item() - - if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end - if mcl_mobs:protect(self, clicker) then return end - - if item:get_name() == "mcl_tools:shears" and not self.gotten and not self.child then - self.gotten = true - local pos = self.object:get_pos() - minetest.sound_play("mcl_tools_shears_cut", {pos = pos}, true) - pos.y = pos.y + 0.5 - if not self.color then - self.color = "unicolor_white" - end - minetest.add_item(pos, ItemStack(colors[self.color][1].." "..math.random(1,3))) - self.base_texture = gotten_texture - self.object:set_properties({ - textures = self.base_texture, - }) - if not minetest.is_creative_enabled(clicker:get_player_name()) then - item:add_wear(mobs_mc.shears_wear) - clicker:get_inventory():set_stack("main", clicker:get_wield_index(), item) - end - self.drops = { - {name = "mcl_mobitems:mutton", - chance = 1, - min = 1, - max = 2,}, - } - return - end - -- Dye sheep - if minetest.get_item_group(item:get_name(), "dye") == 1 and not self.gotten then - minetest.log("verbose", "[mobs_mc] " ..item:get_name() .. " " .. minetest.get_item_group(item:get_name(), "dye")) - for group, colordata in pairs(colors) do - if minetest.get_item_group(item:get_name(), group) == 1 then - if not minetest.is_creative_enabled(clicker:get_player_name()) then - item:take_item() - clicker:set_wielded_item(item) - end - self.base_texture = sheep_texture(group) - self.object:set_properties({ - textures = self.base_texture, - }) - self.color = group - self.drops = { - {name = "mcl_mobitems:mutton", - chance = 1, - min = 1, - max = 2,}, - {name = colordata[1], - chance = 1, - min = 1, - max = 1,}, - } - break - end - end - return - end - if mcl_mobs:capture_mob(self, clicker, 0, 5, 70, false, nil) then return end - end, - on_breed = function(parent1, parent2) - -- Breed sheep and choose a fur color for the child. - local pos = parent1.object:get_pos() - local child = mcl_mobs:spawn_child(pos, parent1.name) - if child then - local ent_c = child:get_luaentity() - local color1 = parent1.color - local color2 = parent2.color - - local dye1 = mcl_dye.unicolor_to_dye(color1) - local dye2 = mcl_dye.unicolor_to_dye(color2) - local output - -- Check if parent colors could be mixed as dyes - if dye1 and dye2 then - output = minetest.get_craft_result({items = {dye1, dye2}, method="normal"}) - end - local mixed = false - if output and not output.item:is_empty() then - -- Try to mix dyes and use that as new fur color - local new_dye = output.item:get_name() - local groups = minetest.registered_items[new_dye].groups - for k, v in pairs(groups) do - if string.sub(k, 1, 9) == "unicolor_" then - ent_c.color = k - ent_c.base_texture = sheep_texture(k) - mixed = true - break - end - end - end - - -- Colors not mixable - if not mixed then - -- Choose color randomly from one of the parents - local p = math.random(1, 2) - if p == 1 and color1 then - ent_c.color = color1 - else - ent_c.color = color2 - end - ent_c.base_texture = sheep_texture(ent_c.color) - end - child:set_properties({textures = ent_c.base_texture}) - ent_c.initial_color_set = true - ent_c.tamed = true - ent_c.owner = parent1.owner - return false - end - end, -}) -mcl_mobs:spawn_specific( -"mobs_mc:sheep", -"overworld", -"ground", -{ - "flat", - "IcePlainsSpikes", - "ColdTaiga", - "ColdTaiga_beach", - "ColdTaiga_beach_water", - "MegaTaiga", - "MegaSpruceTaiga", - "ExtremeHills", - "ExtremeHills_beach", - "ExtremeHillsM", - "ExtremeHills+", - "ExtremeHills+_snowtop", - "StoneBeach", - "Plains", - "Plains_beach", - "SunflowerPlains", - "Taiga", - "Taiga_beach", - "Forest", - "Forest_beach", - "FlowerForest", - "FlowerForest_beach", - "BirchForest", - "BirchForestM", - "RoofedForest", - "Savanna", - "Savanna_beach", - "SavannaM", - "Jungle", - "Jungle_shore", - "JungleM", - "JungleM_shore", - "JungleEdge", - "JungleEdgeM", - "Swampland", - "Swampland_shore" -}, -0, -minetest.LIGHT_MAX+1, -30, -15000, -3, -mcl_vars.mg_overworld_min, -mcl_vars.mg_overworld_max) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:sheep", S("Sheep"), "mobs_mc_spawn_icon_sheep.png", 0) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua deleted file mode 100644 index 5b3c4d2820..0000000000 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ /dev/null @@ -1,98 +0,0 @@ ---MCmobs v0.2 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### SHULKER ---################### - --- animation 45-80 is transition between passive and attack stance - -mcl_mobs:register_mob("mobs_mc:shulker", { - description = S("Shulker"), - type = "monster", - spawn_class = "hostile", - attack_type = "shoot", - shoot_interval = 0.5, - arrow = "mobs_mc:shulkerbullet", - shoot_offset = 0.5, - passive = false, - hp_min = 30, - hp_max = 30, - xp_min = 5, - xp_max = 5, - armor = 150, - collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.99, 0.5}, - visual = "mesh", - mesh = "mobs_mc_shulker.b3d", - textures = { "mobs_mc_endergolem.png", }, - -- TODO: sounds - -- TODO: Make shulker dye-able - visual_size = {x=3, y=3}, - walk_chance = 0, - jump = false, - drops = { - {name = "mcl_mobitems:shulker_shell", - chance = 2, - min = 1, - max = 1, - looting = "rare", - looting_factor = 0.0625}, - }, - animation = { - stand_speed = 25, walk_speed = 25, run_speed = 50, punch_speed = 25, - speed_normal = 25, speed_run = 50, - stand_start = 0, stand_end = 45, - walk_start = 0, walk_end = 45, - run_start = 0, run_end = 45, - punch_start = 80, punch_end = 100, - }, - view_range = 16, - fear_height = 4, -}) - --- bullet arrow (weapon) -mcl_mobs:register_arrow("mobs_mc:shulkerbullet", { - visual = "sprite", - visual_size = {x = 0.25, y = 0.25}, - textures = {"mobs_mc_shulkerbullet.png"}, - velocity = 6, - - hit_player = function(self, player) - player:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = 4}, - }, nil) - end, - - hit_mob = function(self, mob) - mob:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = 4}, - }, nil) - end, - - hit_node = function(self, pos, node) - end -}) - - -mcl_mobs:register_egg("mobs_mc:shulker", S("Shulker"), "mobs_mc_spawn_icon_shulker.png", 0) - -mcl_mobs:spawn_specific( -"mobs_mc:shulker", -"end", -"ground", -{ -"End" -}, -0, -minetest.LIGHT_MAX+1, -30, -5000, -2, -mcl_vars.mg_end_min, -mcl_vars.mg_end_max) diff --git a/mods/ENTITIES/mobs_mc/silverfish.lua b/mods/ENTITIES/mobs_mc/silverfish.lua deleted file mode 100644 index 857c9326e0..0000000000 --- a/mods/ENTITIES/mobs_mc/silverfish.lua +++ /dev/null @@ -1,140 +0,0 @@ ---################### ---################### SILVERFISH ---################### - -local S = minetest.get_translator("mobs_mc") - -mcl_mobs:register_mob("mobs_mc:silverfish", { - description = S("Silverfish"), - type = "monster", - spawn_class = "hostile", - passive = false, - group_attack = true, - reach = 1, - hp_min = 8, - hp_max = 8, - xp_min = 5, - xp_max = 5, - armor = {fleshy = 100, arthropod = 100}, - collisionbox = {-0.4, -0.01, -0.4, 0.4, 0.44, 0.4}, - visual = "mesh", - mesh = "mobs_mc_silverfish.b3d", - textures = { - {"mobs_mc_silverfish.png"}, - }, - pathfinding = 1, - visual_size = {x=3, y=3}, - sounds = { - random = "mobs_mc_silverfish_idle", - death = "mobs_mc_silverfish_death", - damage = "mobs_mc_silverfish_hurt", - distance = 16, - }, - makes_footstep_sound = false, - walk_velocity = 0.6, - run_velocity = 2, - jump = true, - fear_height = 4, - replace_what = { - {"mcl_core:stone", "mcl_monster_eggs:monster_egg_stone", -1}, - {"mcl_core:cobble", "mcl_monster_eggs:monster_egg_cobble", -1}, - {"mcl_core:stonebrick", "mcl_monster_eggs:monster_egg_stonebrick", -1}, - {"mcl_core:stonebrickmossy", "mcl_monster_eggs:monster_egg_stonebrickmossy", -1}, - {"mcl_core:stonebrickcracked", "mcl_monster_eggs:monster_egg_stonebrickcracked", -1}, - {"mcl_core:stonebrickcarved", "mcl_monster_eggs:monster_egg_stonebrickcarved", -1}, - }, - replace_rate = 2, - animation = { - speed_normal = 25, speed_run = 50, - stand_start = 0, stand_end = 20, - walk_start = 0, walk_end = 20, - run_start = 0, run_end = 20, - }, - view_range = 16, - attack_type = "dogfight", - damage = 1, - reach = 1, -}) - -mcl_mobs:register_egg("mobs_mc:silverfish", S("Silverfish"), "mobs_mc_spawn_icon_silverfish.png", 0) - --- Monster egg blocks (Minetest Game) -if minetest.get_modpath("default") and mobs_mc.create_monster_egg_nodes then - local spawn_silverfish = function(pos, oldnode, oldmetadata, digger) - if not minetest.is_creative_enabled(digger:get_player_name()) then - minetest.add_entity(pos, "mobs_mc:silverfish") - end - end - minetest.register_node("mobs_mc:monster_egg_stone", { - description = "Stone Monster Egg", - tiles = {"default_stone.png"}, - groups = {oddly_breakable_by_hand = 2, spawns_silverfish = 1}, - drop = '', - is_ground_content = true, - sounds = default.node_sound_stone_defaults(), - after_dig_node = spawn_silverfish, - }) - - minetest.register_node("mobs_mc:monster_egg_cobble", { - description = "Cobblestone Monster Egg", - tiles = {"default_cobble.png"}, - is_ground_content = false, - groups = {oddly_breakable_by_hand = 2, spawns_silverfish = 1}, - drop = '', - sounds = default.node_sound_stone_defaults(), - after_dig_node = spawn_silverfish, - }) - - minetest.register_node("mobs_mc:monster_egg_mossycobble", { - description = "Mossy Cobblestone Monster Egg", - tiles = {"default_mossycobble.png"}, - is_ground_content = false, - groups = {oddly_breakable_by_hand = 2, spawns_silverfish = 1}, - drop = '', - sounds = default.node_sound_stone_defaults(), - after_dig_node = spawn_silverfish, - }) - - minetest.register_node("mobs_mc:monster_egg_stonebrick", { - description = "Stone Brick Monster Egg", - paramtype2 = "facedir", - place_param2 = 0, - tiles = {"default_stone_brick.png"}, - is_ground_content = false, - groups = {oddly_breakable_by_hand = 2, spawns_silverfish = 1}, - drop = '', - sounds = default.node_sound_stone_defaults(), - after_dig_node = spawn_silverfish, - }) - - minetest.register_node("mobs_mc:monster_egg_stone_block", { - description = "Stone Block Monster Egg", - tiles = {"default_stone_block.png"}, - is_ground_content = false, - groups = {oddly_breakable_by_hand = 2, spawns_silverfish = 1}, - drop = '', - sounds = default.node_sound_stone_defaults(), - after_dig_node = spawn_silverfish, - }) - - -- Randomly spawn stone monster eggs in the world - local mg_name = minetest.get_mapgen_setting("mg_name") - local scarcity - if mg_name == "v6" then - scarcity = 28 * 28 * 28 - else - scarcity = 22 * 22 * 22 - end - minetest.register_ore({ - ore_type = "scatter", - ore = "mobs_mc:monster_egg_stone", - wherein = "default:stone", - clust_scarcity = scarcity, - clust_num_ores = 3, - clust_size = 2, - y_min = -31000, - y_max = 31000, - biomes = { "grassland" }, - }) - -end diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua deleted file mode 100644 index aab719b1cc..0000000000 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ /dev/null @@ -1,338 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") -local mod_bows = minetest.get_modpath("mcl_bows") ~= nil - ---################### ---################### SKELETON ---################### - - - -local skeleton = { - description = S("Skeleton"), - type = "monster", - spawn_class = "hostile", - hp_min = 20, - hp_max = 20, - xp_min = 6, - xp_max = 6, - breath_max = -1, - armor = {undead = 100, fleshy = 100}, - collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.98, 0.3}, - pathfinding = 1, - group_attack = true, - visual = "mesh", - mesh = "mobs_mc_skeleton.b3d", - textures = { { - "mcl_bows_bow_0.png", -- bow - "mobs_mc_skeleton.png", -- skeleton - } }, - visual_size = {x=1, y=1}, - makes_footstep_sound = true, - textures = { - { - "mobs_mc_empty.png", -- armor - "mobs_mc_skeleton.png", -- texture - "mcl_bows_bow_0.png", -- wielded_item - } - }, - walk_velocity = 1.2, - run_velocity = 2.4, - damage = 2, - reach = 2, - drops = { - {name = "mcl_bows:arrow", - chance = 1, - min = 0, - max = 2, - looting = "common",}, - {name = "mcl_bows:bow", - chance = 100 / 8.5, - min = 1, - max = 1, - looting = "rare",}, - {name = "mcl_mobitems:bone", - chance = 1, - min = 0, - max = 2, - looting = "common",}, - - -- Head - -- TODO: Only drop if killed by charged creeper - {name = "mcl_heads:skeleton", - chance = 200, -- 0.5% chance - min = 1, - max = 1,}, - }, - animation = { - stand_speed = 15, - stand_start = 0, - stand_end = 40, - walk_speed = 15, - walk_start = 40, - walk_end = 60, - run_speed = 30, - shoot_start = 70, - shoot_end = 90, - die_start = 160, - die_end = 170, - die_speed = 15, - die_loop = false, - }, - ignited_by_sunlight = true, - view_range = 16, - fear_height = 4, - attack_type = "dogshoot", - arrow = "mcl_bows:arrow_entity", - shoot_arrow = function(self, pos, dir) - if mod_bows then - -- 2-4 damage per arrow - local dmg = math.max(4, math.random(2, 8)) - mcl_bows.shoot_arrow("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object, nil, dmg) - end - end, - shoot_interval = 2, - shoot_offset = 1.5, - dogshoot_switch = 1, - dogshoot_count_max =1.8, - harmed_by_heal = true, -} - -mcl_mobs:register_mob("mobs_mc:skeleton", skeleton) - - ---################### ---################### STRAY ---################### - -local stray = table.copy(skeleton) -stray.description = S("Stray") -stray.mesh = "mobs_mc_skeleton.b3d" -stray.textures = { - { - "mobs_mc_stray_overlay.png", - "mobs_mc_stray.png", - "mcl_bows_bow_0.png", - }, -} --- TODO: different sound (w/ echo) --- TODO: stray's arrow inflicts slowness status -table.insert(stray.drops, { - name = "mcl_potions:slowness_arrow", - chance = 2, - min = 1, - max = 1, - looting = "rare", - looting_chance_function = function(lvl) - local chance = 0.5 - for i = 1, lvl do - if chance > 1 then - return 1 - end - chance = chance + (1 - chance) / 2 - end - return chance - end, -}) - -mcl_mobs:register_mob("mobs_mc:stray", stray) - --- Overworld spawn -mcl_mobs:spawn_specific( -"mobs_mc:skeleton", -"overworld", -"ground", -{ -"Mesa", -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"Jungle", -"Savanna", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"Desert", -"ColdTaiga", -"MushroomIsland", -"IcePlainsSpikes", -"SunflowerPlains", -"IcePlains", -"RoofedForest", -"ExtremeHills+_snowtop", -"MesaPlateauFM_grasstop", -"JungleEdgeM", -"ExtremeHillsM", -"JungleM", -"BirchForestM", -"MesaPlateauF", -"MesaPlateauFM", -"MesaPlateauF_grasstop", -"MesaBryce", -"JungleEdge", -"SavannaM", -"FlowerForest_beach", -"Forest_beach", -"StoneBeach", -"ColdTaiga_beach_water", -"Taiga_beach", -"Savanna_beach", -"Plains_beach", -"ExtremeHills_beach", -"ColdTaiga_beach", -"Swampland_shore", -"MushroomIslandShore", -"JungleM_shore", -"Jungle_shore", -"MesaPlateauFM_sandlevel", -"MesaPlateauF_sandlevel", -"MesaBryce_sandlevel", -"Mesa_sandlevel", -"RoofedForest_ocean", -"JungleEdgeM_ocean", -"BirchForestM_ocean", -"BirchForest_ocean", -"IcePlains_deep_ocean", -"Jungle_deep_ocean", -"Savanna_ocean", -"MesaPlateauF_ocean", -"ExtremeHillsM_deep_ocean", -"Savanna_deep_ocean", -"SunflowerPlains_ocean", -"Swampland_deep_ocean", -"Swampland_ocean", -"MegaSpruceTaiga_deep_ocean", -"ExtremeHillsM_ocean", -"JungleEdgeM_deep_ocean", -"SunflowerPlains_deep_ocean", -"BirchForest_deep_ocean", -"IcePlainsSpikes_ocean", -"Mesa_ocean", -"StoneBeach_ocean", -"Plains_deep_ocean", -"JungleEdge_deep_ocean", -"SavannaM_deep_ocean", -"Desert_deep_ocean", -"Mesa_deep_ocean", -"ColdTaiga_deep_ocean", -"Plains_ocean", -"MesaPlateauFM_ocean", -"Forest_deep_ocean", -"JungleM_deep_ocean", -"FlowerForest_deep_ocean", -"MushroomIsland_ocean", -"MegaTaiga_ocean", -"StoneBeach_deep_ocean", -"IcePlainsSpikes_deep_ocean", -"ColdTaiga_ocean", -"SavannaM_ocean", -"MesaPlateauF_deep_ocean", -"MesaBryce_deep_ocean", -"ExtremeHills+_deep_ocean", -"ExtremeHills_ocean", -"MushroomIsland_deep_ocean", -"Forest_ocean", -"MegaTaiga_deep_ocean", -"JungleEdge_ocean", -"MesaBryce_ocean", -"MegaSpruceTaiga_ocean", -"ExtremeHills+_ocean", -"Jungle_ocean", -"RoofedForest_deep_ocean", -"IcePlains_ocean", -"FlowerForest_ocean", -"ExtremeHills_deep_ocean", -"MesaPlateauFM_deep_ocean", -"Desert_ocean", -"Taiga_ocean", -"BirchForestM_deep_ocean", -"Taiga_deep_ocean", -"JungleM_ocean", -"FlowerForest_underground", -"JungleEdge_underground", -"StoneBeach_underground", -"MesaBryce_underground", -"Mesa_underground", -"RoofedForest_underground", -"Jungle_underground", -"Swampland_underground", -"MushroomIsland_underground", -"BirchForest_underground", -"Plains_underground", -"MesaPlateauF_underground", -"ExtremeHills_underground", -"MegaSpruceTaiga_underground", -"BirchForestM_underground", -"SavannaM_underground", -"MesaPlateauFM_underground", -"Desert_underground", -"Savanna_underground", -"Forest_underground", -"SunflowerPlains_underground", -"ColdTaiga_underground", -"IcePlains_underground", -"IcePlainsSpikes_underground", -"MegaTaiga_underground", -"Taiga_underground", -"ExtremeHills+_underground", -"JungleM_underground", -"ExtremeHillsM_underground", -"JungleEdgeM_underground", -}, -0, -7, -20, -17000, -2, -mcl_vars.mg_overworld_min, -mcl_vars.mg_overworld_max) - - --- Nether spawn -mcl_mobs:spawn_specific( -"mobs_mc:skeleton", -"nether", -"ground", -{ -"Nether" -}, -0, -7, -30, -10000, -3, -mcl_vars.mg_nether_min, -mcl_vars.mg_nether_max) - --- Stray spawn --- TODO: Spawn directly under the sky -mcl_mobs:spawn_specific( -"mobs_mc:stray", -"overworld", -"ground", -{ -"ColdTaiga", -"IcePlainsSpikes", -"IcePlains", -"ExtremeHills+_snowtop", -}, -0, -7, -20, -19000, -2, -mobs_mc.water_level, -mcl_vars.mg_overworld_max) - - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:skeleton", S("Skeleton"), "mobs_mc_spawn_icon_skeleton.png", 0) -mcl_mobs:register_egg("mobs_mc:stray", S("Stray"), "mobs_mc_spawn_icon_stray.png", 0) diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mobs_mc/skeleton_wither.lua deleted file mode 100644 index 5e31453fa8..0000000000 --- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua +++ /dev/null @@ -1,115 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### WITHER SKELETON ---################### - -mcl_mobs:register_mob("mobs_mc:witherskeleton", { - description = S("Wither Skeleton"), - type = "monster", - spawn_class = "hostile", - hp_min = 20, - hp_max = 20, - xp_min = 6, - xp_max = 6, - breath_max = -1, - armor = {undead = 100, fleshy = 100}, - pathfinding = 1, - group_attack = true, - collisionbox = {-0.35, -0.01, -0.35, 0.35, 2.39, 0.35}, - visual = "mesh", - mesh = "mobs_mc_witherskeleton.b3d", - textures = { - { - "mobs_mc_empty.png", -- armor - "mobs_mc_wither_skeleton.png", -- wither skeleton - "default_tool_stonesword.png", -- sword - } - }, - visual_size = {x=1.2, y=1.2}, - makes_footstep_sound = true, - sounds = { - random = "mobs_mc_skeleton_random", - death = "mobs_mc_skeleton_death", - damage = "mobs_mc_skeleton_hurt", - distance = 16, - }, - walk_velocity = 1.2, - run_velocity = 2.4, - damage = 7, - reach = 2, - drops = { - {name = "mcl_core:coal_lump", - chance = 1, - min = 0, - max = 1, - looting = "common",}, - {name = "mcl_mobitems:bone", - chance = 1, - min = 0, - max = 2, - looting = "common",}, - - -- Head - {name = "mcl_heads:wither_skeleton", - chance = 40, -- 2.5% chance - min = 1, - max = 1, - looting = "rare",}, - }, - animation = { - stand_start = 0, - stand_end = 40, - stand_speed = 15, - walk_start = 40, - walk_end = 60, - walk_speed = 15, - run_start = 40, - run_end = 60, - run_speed = 30, - shoot_start = 70, - shoot_end = 90, - punch_start = 110, - punch_end = 130, - punch_speed = 25, - die_start = 160, - die_end = 170, - die_speed = 15, - die_loop = false, - }, - water_damage = 0, - lava_damage = 0, - fire_damage = 0, - light_damage = 0, - view_range = 16, - attack_type = "dogfight", - dogshoot_switch = 1, - dogshoot_count_max =0.5, - fear_height = 4, - harmed_by_heal = true, - fire_resistant = true, -}) - ---spawn -mcl_mobs:spawn_specific( -"mobs_mc:witherskeleton", -"nether", -"ground", -{ -"Nether" -}, -0, -7, -30, -5000, -5, -mcl_vars.mg_nether_min, -mcl_vars.mg_nether_max) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:witherskeleton", S("Wither Skeleton"), "mobs_mc_spawn_icon_witherskeleton.png", 0) diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua deleted file mode 100644 index 0c6c1ee1e1..0000000000 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ /dev/null @@ -1,453 +0,0 @@ ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - --- Returns a function that spawns children in a circle around pos. --- To be used as on_die callback. --- self: mob reference --- pos: position of "mother" mob --- child_mod: Mob to spawn --- children_count: Number of children to spawn --- spawn_distance: Spawn distance from "mother" mob --- eject_speed: Initial speed of child mob away from "mother" mob -local spawn_children_on_die = function(child_mob, children_count, spawn_distance, eject_speed) - return function(self, pos) - local angle, posadd, newpos, dir - if not eject_speed then - eject_speed = 1 - end - local mndef = minetest.registered_nodes[minetest.get_node(pos).name] - local mother_stuck = mndef and mndef.walkable - angle = math.random(0, math.pi*2) - local children = {} - for i=1,children_count do - dir = {x=math.cos(angle),y=0,z=math.sin(angle)} - posadd = vector.multiply(vector.normalize(dir), spawn_distance) - newpos = vector.add(pos, posadd) - -- If child would end up in a wall, use position of the "mother", unless - -- the "mother" was stuck as well - local speed_penalty = 1 - local cndef = minetest.registered_nodes[minetest.get_node(newpos).name] - if (not mother_stuck) and cndef and cndef.walkable then - newpos = pos - speed_penalty = 0.5 - end - local mob = minetest.add_entity(newpos, child_mob) - if (not mother_stuck) then - mob:set_velocity(vector.multiply(dir, eject_speed * speed_penalty)) - end - mob:set_yaw(angle - math.pi/2) - table.insert(children, mob) - angle = angle + (math.pi*2)/children_count - end - -- If mother was murdered, children attack the killer after 1 second - if self.state == "attack" then - minetest.after(1.0, function(children, enemy) - for c=1, #children do - local child = children[c] - local le = child:get_luaentity() - if le ~= nil then - le.state = "attack" - le.attack = enemy - end - end - end, children, self.attack) - end - end -end - --- Slime -local slime_big = { - description = S("Slime"), - type = "monster", - spawn_class = "hostile", - group_attack = { "mobs_mc:slime_big", "mobs_mc:slime_small", "mobs_mc:slime_tiny" }, - hp_min = 16, - hp_max = 16, - xp_min = 4, - xp_max = 4, - collisionbox = {-1.02, -0.01, -1.02, 1.02, 2.03, 1.02}, - visual_size = {x=12.5, y=12.5}, - textures = {{"mobs_mc_slime.png", "mobs_mc_slime.png"}}, - visual = "mesh", - mesh = "mobs_mc_slime.b3d", - makes_footstep_sound = true, - sounds = { - jump = "green_slime_jump", - death = "green_slime_death", - damage = "green_slime_damage", - attack = "green_slime_attack", - distance = 16, - }, - damage = 4, - reach = 3, - armor = 100, - drops = {}, - -- TODO: Fix animations - animation = { - jump_speed = 17, - stand_speed = 17, - walk_speed = 17, - jump_start = 1, - jump_end = 20, - stand_start = 1, - stand_end = 20, - walk_start = 1, - walk_end = 20, - }, - fall_damage = 0, - view_range = 16, - attack_type = "dogfight", - passive = false, - jump = true, - walk_velocity = 2.5, - run_velocity = 2.5, - walk_chance = 0, - jump_height = 5.2, - fear_height = 0, - spawn_small_alternative = "mobs_mc:slime_small", - on_die = spawn_children_on_die("mobs_mc:slime_small", 4, 1.0, 1.5), - use_texture_alpha = true, -} -mcl_mobs:register_mob("mobs_mc:slime_big", slime_big) - -local slime_small = table.copy(slime_big) -slime_small.sounds.base_pitch = 1.15 -slime_small.hp_min = 4 -slime_small.hp_max = 4 -slime_small.xp_min = 2 -slime_small.xp_max = 2 -slime_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51} -slime_small.visual_size = {x=6.25, y=6.25} -slime_small.damage = 3 -slime_small.reach = 2.75 -slime_small.walk_velocity = 1.3 -slime_small.run_velocity = 1.3 -slime_small.jump_height = 4.3 -slime_small.spawn_small_alternative = "mobs_mc:slime_tiny" -slime_small.on_die = spawn_children_on_die("mobs_mc:slime_tiny", 4, 0.6, 1.0) -mcl_mobs:register_mob("mobs_mc:slime_small", slime_small) - -local slime_tiny = table.copy(slime_big) -slime_tiny.sounds.base_pitch = 1.3 -slime_tiny.hp_min = 1 -slime_tiny.hp_max = 1 -slime_tiny.xp_min = 1 -slime_tiny.xp_max = 1 -slime_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505} -slime_tiny.visual_size = {x=3.125, y=3.125} -slime_tiny.damage = 0 -slime_tiny.reach = 2.5 -slime_tiny.drops = { - -- slimeball - {name = "mcl_mobitems:slimeball", - chance = 1, - min = 0, - max = 2,}, -} -slime_tiny.walk_velocity = 0.7 -slime_tiny.run_velocity = 0.7 -slime_tiny.jump_height = 3 -slime_tiny.spawn_small_alternative = nil -slime_tiny.on_die = nil - -mcl_mobs:register_mob("mobs_mc:slime_tiny", slime_tiny) - -local smin = mcl_vars.mg_overworld_min -local smax = mobs_mc.water_level - 23 - -mcl_mobs:spawn_specific( -"mobs_mc:slime_tiny", -"overworld", -"ground", -{ -"FlowerForest_underground", -"JungleEdge_underground", -"StoneBeach_underground", -"MesaBryce_underground", -"Mesa_underground", -"RoofedForest_underground", -"Jungle_underground", -"Swampland_underground", -"MushroomIsland_underground", -"BirchForest_underground", -"Plains_underground", -"MesaPlateauF_underground", -"ExtremeHills_underground", -"MegaSpruceTaiga_underground", -"BirchForestM_underground", -"SavannaM_underground", -"MesaPlateauFM_underground", -"Desert_underground", -"Savanna_underground", -"Forest_underground", -"SunflowerPlains_underground", -"ColdTaiga_underground", -"IcePlains_underground", -"IcePlainsSpikes_underground", -"MegaTaiga_underground", -"Taiga_underground", -"ExtremeHills+_underground", -"JungleM_underground", -"ExtremeHillsM_underground", -"JungleEdgeM_underground", -}, -0, -minetest.LIGHT_MAX+1, -30, -12000, -4, -smin, -smax) - -mcl_mobs:spawn_specific( -"mobs_mc:slime_small", -"overworld", -"ground", -{ -"FlowerForest_underground", -"JungleEdge_underground", -"StoneBeach_underground", -"MesaBryce_underground", -"Mesa_underground", -"RoofedForest_underground", -"Jungle_underground", -"Swampland_underground", -"MushroomIsland_underground", -"BirchForest_underground", -"Plains_underground", -"MesaPlateauF_underground", -"ExtremeHills_underground", -"MegaSpruceTaiga_underground", -"BirchForestM_underground", -"SavannaM_underground", -"MesaPlateauFM_underground", -"Desert_underground", -"Savanna_underground", -"Forest_underground", -"SunflowerPlains_underground", -"ColdTaiga_underground", -"IcePlains_underground", -"IcePlainsSpikes_underground", -"MegaTaiga_underground", -"Taiga_underground", -"ExtremeHills+_underground", -"JungleM_underground", -"ExtremeHillsM_underground", -"JungleEdgeM_underground", -}, -0, -minetest.LIGHT_MAX+1, -30, -8500, -4, -smin, -smax) - -mcl_mobs:spawn_specific( -"mobs_mc:slime_big", -"overworld", -"ground", -{ -"FlowerForest_underground", -"JungleEdge_underground", -"StoneBeach_underground", -"MesaBryce_underground", -"Mesa_underground", -"RoofedForest_underground", -"Jungle_underground", -"Swampland_underground", -"MushroomIsland_underground", -"BirchForest_underground", -"Plains_underground", -"MesaPlateauF_underground", -"ExtremeHills_underground", -"MegaSpruceTaiga_underground", -"BirchForestM_underground", -"SavannaM_underground", -"MesaPlateauFM_underground", -"Desert_underground", -"Savanna_underground", -"Forest_underground", -"SunflowerPlains_underground", -"ColdTaiga_underground", -"IcePlains_underground", -"IcePlainsSpikes_underground", -"MegaTaiga_underground", -"Taiga_underground", -"ExtremeHills+_underground", -"JungleM_underground", -"ExtremeHillsM_underground", -"JungleEdgeM_underground", -}, -0, -minetest.LIGHT_MAX+1, -30, -10000, -4, -smin, -smax) - --- Magma cube -local magma_cube_big = { - description = S("Magma Cube"), - type = "monster", - spawn_class = "hostile", - hp_min = 16, - hp_max = 16, - xp_min = 4, - xp_max = 4, - collisionbox = {-1.02, -0.01, -1.02, 1.02, 2.03, 1.02}, - visual_size = {x=12.5, y=12.5}, - textures = {{ "mobs_mc_magmacube.png", "mobs_mc_magmacube.png" }}, - visual = "mesh", - mesh = "mobs_mc_magmacube.b3d", - makes_footstep_sound = true, - sounds = { - jump = "mobs_mc_magma_cube_big", - death = "mobs_mc_magma_cube_big", - attack = "mobs_mc_magma_cube_attack", - distance = 16, - }, - walk_velocity = 4, - run_velocity = 4, - damage = 6, - reach = 3, - armor = 53, - drops = { - {name = "mcl_mobitems:magma_cream", - chance = 4, - min = 1, - max = 1,}, - }, - -- TODO: Fix animations - animation = { - jump_speed = 20, - stand_speed = 20, - walk_speed = 20, - jump_start = 1, - jump_end = 40, - stand_start = 1, - stand_end = 1, - walk_start = 1, - walk_end = 40, - }, - water_damage = 0, - lava_damage = 0, - fire_damage = 0, - light_damage = 0, - fall_damage = 0, - view_range = 16, - attack_type = "dogfight", - passive = false, - jump = true, - jump_height = 8, - walk_chance = 0, - fear_height = 0, - spawn_small_alternative = "mobs_mc:magma_cube_small", - on_die = spawn_children_on_die("mobs_mc:magma_cube_small", 3, 0.8, 1.5), - fire_resistant = true, -} -mcl_mobs:register_mob("mobs_mc:magma_cube_big", magma_cube_big) - -local magma_cube_small = table.copy(magma_cube_big) -magma_cube_small.sounds.jump = "mobs_mc_magma_cube_small" -magma_cube_small.sounds.death = "mobs_mc_magma_cube_small" -magma_cube_small.hp_min = 4 -magma_cube_small.hp_max = 4 -magma_cube_small.xp_min = 2 -magma_cube_small.xp_max = 2 -magma_cube_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51} -magma_cube_small.visual_size = {x=6.25, y=6.25} -magma_cube_small.damage = 3 -magma_cube_small.reach = 2.75 -magma_cube_small.walk_velocity = .8 -magma_cube_small.run_velocity = 2.6 -magma_cube_small.jump_height = 6 -magma_cube_small.damage = 4 -magma_cube_small.reach = 2.75 -magma_cube_small.armor = 66 -magma_cube_small.spawn_small_alternative = "mobs_mc:magma_cube_tiny" -magma_cube_small.on_die = spawn_children_on_die("mobs_mc:magma_cube_tiny", 4, 0.6, 1.0) -mcl_mobs:register_mob("mobs_mc:magma_cube_small", magma_cube_small) - -local magma_cube_tiny = table.copy(magma_cube_big) -magma_cube_tiny.sounds.jump = "mobs_mc_magma_cube_small" -magma_cube_tiny.sounds.death = "mobs_mc_magma_cube_small" -magma_cube_tiny.sounds.base_pitch = 1.25 -magma_cube_tiny.hp_min = 1 -magma_cube_tiny.hp_max = 1 -magma_cube_tiny.xp_min = 1 -magma_cube_tiny.xp_max = 1 -magma_cube_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505} -magma_cube_tiny.visual_size = {x=3.125, y=3.125} -magma_cube_tiny.walk_velocity = 1.02 -magma_cube_tiny.run_velocity = 1.02 -magma_cube_tiny.jump_height = 4 -magma_cube_tiny.damage = 3 -magma_cube_tiny.reach = 2.5 -magma_cube_tiny.armor = 50 -magma_cube_tiny.drops = {} -magma_cube_tiny.spawn_small_alternative = nil -magma_cube_tiny.on_die = nil - -mcl_mobs:register_mob("mobs_mc:magma_cube_tiny", magma_cube_tiny) - - -local mmin = mcl_vars.mg_nether_min -local mmax = mcl_vars.mg_nether_max - -mcl_mobs:spawn_specific( -"mobs_mc:magma_cube_tiny", -"nether", -"ground", -{ -"Nether" -}, -0, -minetest.LIGHT_MAX+1, -30, -15000, -4, -mmin, -mmax) - - -mcl_mobs:spawn_specific( -"mobs_mc:magma_cube_small", -"nether", -"ground", -{ -"Nether" -}, -0, -minetest.LIGHT_MAX+1, -30, -15500, -4, -mmin, -mmax) - -mcl_mobs:spawn_specific( -"mobs_mc:magma_cube_big", -"nether", -"ground", -{ -"Nether" -}, -0, -minetest.LIGHT_MAX+1, -30, -16000, -4, -mmin, -mmax) - ---mcl_mobs:spawn_specific("mobs_mc:magma_cube_tiny", { "mcl_nether:nether_brick", "mcl_nether:netherrack" }, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11000, 4, mmin, mmax) ---mcl_mobs:spawn_specific("mobs_mc:magma_cube_small", { "mcl_nether:nether_brick", "mcl_nether:netherrack" }, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11100, 4, mmin, mmax) ---mcl_mobs:spawn_specific("mobs_mc:magma_cube_big", { "mcl_nether:nether_brick", "mcl_nether:netherrack" }, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11200, 4, mmin, mmax) - - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:magma_cube_big", S("Magma Cube"), "mobs_mc_spawn_icon_magmacube.png") -mcl_mobs:register_egg("mobs_mc:slime_big", S("Slime"), "mobs_mc_spawn_icon_slime.png") diff --git a/mods/ENTITIES/mobs_mc/snowman.lua b/mods/ENTITIES/mobs_mc/snowman.lua deleted file mode 100644 index 816c969477..0000000000 --- a/mods/ENTITIES/mobs_mc/snowman.lua +++ /dev/null @@ -1,199 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - -local snow_trail_frequency = 0.5 -- Time in seconds for checking to add a new snow trail - -local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false -local mod_throwing = minetest.get_modpath("mcl_throwing") ~= nil - -local gotten_texture = { - "mobs_mc_snowman.png", - "blank.png", - "blank.png", - "blank.png", - "blank.png", - "blank.png", - "blank.png", -} - -mcl_mobs:register_mob("mobs_mc:snowman", { - description = S("Snow Golem"), - type = "npc", - spawn_class = "passive", - passive = true, - hp_min = 4, - hp_max = 4, - pathfinding = 1, - view_range = 10, - fall_damage = 0, - water_damage = 4, - rain_damage = 4, - armor = { fleshy = 100, water_vulnerable = 100 }, - attacks_monsters = true, - collisionbox = {-0.35, -0.01, -0.35, 0.35, 1.89, 0.35}, - visual = "mesh", - mesh = "mobs_mc_snowman.b3d", - sounds = { - damage = { name = "mobs_mc_snowman_hurt", gain = 0.2 }, - death = { name = "mobs_mc_snowman_death", gain = 0.25 }, - distance = 16, - }, - textures = { - "mobs_mc_snowman.png", --snowman texture - "farming_pumpkin_side.png", --top - "farming_pumpkin_top.png", --down - "farming_pumpkin_face.png", --front - "farming_pumpkin_side.png", --left - "farming_pumpkin_side.png", --right - "farming_pumpkin_top.png", --left - }, - gotten_texture = gotten_texture, - drops = {{ name = "mcl_throwing:snowball", chance = 1, min = 0, max = 15 }}, - visual_size = {x=3, y=3}, - walk_velocity = 0.6, - run_velocity = 2, - jump = true, - makes_footstep_sound = true, - attack_type = "shoot", - arrow = "mcl_throwing:snowball_entity", - shoot_arrow = function(self, pos, dir) - if mod_throwing then - mcl_throwing.throw("mcl_throwing:snowball", pos, dir, nil, self.object) - end - end, - shoot_interval = 1, - shoot_offset = 1, - animation = { - stand_speed = 25, - walk_speed = 25, - run_speed = 50, - stand_start = 20, - stand_end = 40, - walk_start = 0, - walk_end = 20, - run_start = 0, - run_end = 20, - die_start = 40, - die_end = 50, - die_speed = 15, - die_loop = false, - }, - do_custom = function(self, dtime) - if not mobs_griefing then - return - end - -- Leave a trail of top snow behind. - -- This is done in do_custom instead of just using replace_what because with replace_what, - -- the top snop may end up floating in the air. - if not self._snowtimer then - self._snowtimer = 0 - return - end - self._snowtimer = self._snowtimer + dtime - if self.health > 0 and self._snowtimer > snow_trail_frequency then - self._snowtimer = 0 - local pos = self.object:get_pos() - local below = {x=pos.x, y=pos.y-1, z=pos.z} - local def = minetest.registered_nodes[minetest.get_node(pos).name] - -- Node at snow golem's position must be replacable - if def and def.buildable_to then - -- Node below must be walkable - -- and a full cube (this prevents oddities like top snow on top snow, lower slabs, etc.) - local belowdef = minetest.registered_nodes[minetest.get_node(below).name] - if belowdef and belowdef.walkable and (belowdef.node_box == nil or belowdef.node_box.type == "regular") then - -- Place top snow - minetest.set_node(pos, {name = "mcl_core:snow"}) - end - end - end - end, - -- Remove pumpkin if using shears - on_rightclick = function(self, clicker) - local item = clicker:get_wielded_item() - if self.gotten ~= true and item:get_name() == "mcl_tools:shears" then - -- Remove pumpkin - self.gotten = true - self.object:set_properties({ - textures = gotten_texture, - }) - - local pos = self.object:get_pos() - minetest.sound_play("mcl_tools_shears_cut", {pos = pos}, true) - - if minetest.registered_items["mcl_farming:pumpkin_face"] then - minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, "mcl_farming:pumpkin_face") - end - - -- Wear out - if not minetest.is_creative_enabled(clicker:get_player_name()) then - item:add_wear(mobs_mc.shears_wear) - clicker:get_inventory():set_stack("main", clicker:get_wield_index(), item) - end - end - end, -}) - -local summon_particles = function(obj) - local lua = obj:get_luaentity() - local min = {x=lua.collisionbox[1], y=lua.collisionbox[2], z=lua.collisionbox[3]} - local max = {x=lua.collisionbox[4], y=lua.collisionbox[5], z=lua.collisionbox[6]} - local pos = obj:get_pos() - minetest.add_particlespawner({ - amount = 60, - time = 0.1, - minpos = vector.add(pos, min), - maxpos = vector.add(pos, max), - minvel = {x = -0.1, y = -0.1, z = -0.1}, - maxvel = {x = 0.1, y = 0.1, z = 0.1}, - minexptime = 1.0, - maxexptime = 2.0, - minsize = 2.0, - maxsize = 3.0, - texture = "mcl_particles_smoke.png", - }) -end - --- This is to be called when a pumpkin or jack'o lantern has been placed. Recommended: In the on_construct function --- of the node. --- This summons a snow golen when pos is next to a row of two snow blocks. -function mobs_mc.check_snow_golem_summon(pos) - local checks = { - -- These are the possible placement patterns - -- { snow block pos. 1, snow block pos. 2, snow golem spawn position } - { {x=pos.x, y=pos.y-1, z=pos.z}, {x=pos.x, y=pos.y-2, z=pos.z}, {x=pos.x, y=pos.y-2.5, z=pos.z} }, - { {x=pos.x, y=pos.y+1, z=pos.z}, {x=pos.x, y=pos.y+2, z=pos.z}, {x=pos.x, y=pos.y-0.5, z=pos.z} }, - { {x=pos.x-1, y=pos.y, z=pos.z}, {x=pos.x-2, y=pos.y, z=pos.z}, {x=pos.x-2, y=pos.y-0.5, z=pos.z} }, - { {x=pos.x+1, y=pos.y, z=pos.z}, {x=pos.x+2, y=pos.y, z=pos.z}, {x=pos.x+2, y=pos.y-0.5, z=pos.z} }, - { {x=pos.x, y=pos.y, z=pos.z-1}, {x=pos.x, y=pos.y, z=pos.z-2}, {x=pos.x, y=pos.y-0.5, z=pos.z-2} }, - { {x=pos.x, y=pos.y, z=pos.z+1}, {x=pos.x, y=pos.y, z=pos.z+2}, {x=pos.x, y=pos.y-0.5, z=pos.z+2} }, - } - - for c=1, #checks do - local b1 = checks[c][1] - local b2 = checks[c][2] - local place = checks[c][3] - local b1n = minetest.get_node(b1) - local b2n = minetest.get_node(b2) - if b1n.name == "mcl_core:snowblock" and b2n.name == "mcl_core:snowblock" then - -- Remove the pumpkin and both snow blocks and summon the snow golem - minetest.remove_node(pos) - minetest.remove_node(b1) - minetest.remove_node(b2) - core.check_for_falling(pos) - core.check_for_falling(b1) - core.check_for_falling(b2) - local obj = minetest.add_entity(place, "mobs_mc:snowman") - if obj then - summon_particles(obj) - end - break - end - end -end - --- Spawn egg -mcl_mobs:register_egg("mobs_mc:snowman", S("Snow Golem"), "mobs_mc_spawn_icon_snowman.png", 0) diff --git a/mods/ENTITIES/mobs_mc/sounds/green_slime_attack.ogg b/mods/ENTITIES/mobs_mc/sounds/green_slime_attack.ogg deleted file mode 100644 index a8ca493913..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/green_slime_attack.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/green_slime_damage.ogg b/mods/ENTITIES/mobs_mc/sounds/green_slime_damage.ogg deleted file mode 100644 index 966ff77ed8..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/green_slime_damage.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/green_slime_death.ogg b/mods/ENTITIES/mobs_mc/sounds/green_slime_death.ogg deleted file mode 100644 index 7eef1f4cef..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/green_slime_death.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/green_slime_jump.ogg b/mods/ENTITIES/mobs_mc/sounds/green_slime_jump.ogg deleted file mode 100644 index 2c836e4155..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/green_slime_jump.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/green_slime_land.ogg b/mods/ENTITIES/mobs_mc/sounds/green_slime_land.ogg deleted file mode 100644 index 449031712a..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/green_slime_land.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mcl_totems_totem.ogg b/mods/ENTITIES/mobs_mc/sounds/mcl_totems_totem.ogg deleted file mode 100644 index f7669b2a69..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mcl_totems_totem.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_eerie.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_eerie.ogg deleted file mode 100644 index 988509bd49..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_eerie.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_fireball.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_fireball.ogg deleted file mode 100644 index 119818f14b..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_fireball.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_animal_eat_generic.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_animal_eat_generic.ogg deleted file mode 100644 index cdf6969bb0..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_animal_eat_generic.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_death.ogg deleted file mode 100644 index f9e7798b86..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_death.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_hurt.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_hurt.1.ogg deleted file mode 100644 index 0aa1723b1b..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_hurt.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_hurt.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_hurt.2.ogg deleted file mode 100644 index 2e09e3e93d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_hurt.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_hurt.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_hurt.3.ogg deleted file mode 100644 index 156e6ba184..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_hurt.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_idle.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_idle.ogg deleted file mode 100644 index e56b90802a..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_idle.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_attack.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_attack.1.ogg deleted file mode 100644 index 35901a46e3..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_attack.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_attack.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_attack.2.ogg deleted file mode 100644 index bd6c14b470..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_attack.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_death.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_death.1.ogg deleted file mode 100644 index fcfcffa881..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_death.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_growl.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_growl.1.ogg deleted file mode 100644 index 863e15baa2..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_growl.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_growl.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_growl.2.ogg deleted file mode 100644 index 72ff579029..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_growl.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_growl.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_growl.3.ogg deleted file mode 100644 index 710d3f6320..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_growl.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_hurt.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_hurt.1.ogg deleted file mode 100644 index 630f099877..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_hurt.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_random.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_random.1.ogg deleted file mode 100644 index 8b3498baf4..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_random.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_random.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_random.2.ogg deleted file mode 100644 index b8d1a67d01..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_random.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_random.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_random.3.ogg deleted file mode 100644 index 3d83696f91..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bear_random.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_breath.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_breath.ogg deleted file mode 100644 index d756a79f88..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_breath.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_died.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_died.ogg deleted file mode 100644 index 591bffe787..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_died.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_hurt.ogg deleted file mode 100644 index 0ee4ec53a5..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_blaze_hurt.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_hiss.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_hiss.ogg deleted file mode 100644 index a51db0fe9d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_hiss.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_idle.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_idle.1.ogg deleted file mode 100644 index 48e9977ed8..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_idle.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_idle.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_idle.2.ogg deleted file mode 100644 index 7e73248334..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_idle.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_buck.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_buck.1.ogg deleted file mode 100644 index 506d040a4d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_buck.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_buck.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_buck.2.ogg deleted file mode 100644 index 858362b929..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_buck.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_buck.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_buck.3.ogg deleted file mode 100644 index ca090123fb..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_buck.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_child.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_child.ogg deleted file mode 100644 index 5ea33fc078..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_child.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_hurt.ogg deleted file mode 100644 index 32c4337ba8..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_hurt.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_lay_egg.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_lay_egg.ogg deleted file mode 100644 index 6a7781aae2..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_lay_egg.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow.ogg deleted file mode 100644 index 87e57e44e2..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_hurt.ogg deleted file mode 100644 index b07a782814..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_hurt.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_milk.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_milk.ogg deleted file mode 100644 index a9163e1b3c..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_milk.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_mushroom_stew.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_mushroom_stew.ogg deleted file mode 100644 index d120e860f0..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_mushroom_stew.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_death.ogg deleted file mode 100644 index ba43206ad3..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_death.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_hurt.ogg deleted file mode 100644 index 9aed7a2e76..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_hurt.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_death.ogg deleted file mode 100644 index 908a82b9e7..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_death.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_hurt.ogg deleted file mode 100644 index 9d1001fd3b..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_hurt.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_random.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_random.1.ogg deleted file mode 100644 index 26e1e9a56c..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_random.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_random.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_random.2.ogg deleted file mode 100644 index 293a2b9983..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_donkey_random.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_ender_dragon_attack.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_ender_dragon_attack.ogg deleted file mode 100644 index 5591609c76..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_ender_dragon_attack.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_ender_dragon_shoot.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_ender_dragon_shoot.ogg deleted file mode 100644 index 4030ba671d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_ender_dragon_shoot.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_death.ogg deleted file mode 100644 index 6f92ffdc39..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_death.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_hurt.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_hurt.1.ogg deleted file mode 100644 index 6b125fa4fc..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_hurt.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_hurt.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_hurt.2.ogg deleted file mode 100644 index 427069c855..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_hurt.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_hurt.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_hurt.3.ogg deleted file mode 100644 index 104bdd7ecb..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_hurt.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_random.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_random.1.ogg deleted file mode 100644 index 1dc588d4d9..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_random.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_teleport_dst.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_teleport_dst.ogg deleted file mode 100644 index 1896d7d4df..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_teleport_dst.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_teleport_src.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_teleport_src.ogg deleted file mode 100644 index 7b08a4884c..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_enderman_teleport_src.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_death.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_death.1.ogg deleted file mode 100644 index 74b3336bed..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_death.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_death.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_death.2.ogg deleted file mode 100644 index 02aec38c65..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_death.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_hurt.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_hurt.1.ogg deleted file mode 100644 index 68a7fee533..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_hurt.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_hurt.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_hurt.2.ogg deleted file mode 100644 index 578732d919..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_hurt.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_hurt.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_hurt.3.ogg deleted file mode 100644 index 5d8cda08d5..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_hurt.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_random.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_random.1.ogg deleted file mode 100644 index 07650e3bb6..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_endermite_random.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_death.ogg deleted file mode 100644 index 93c093d058..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_death.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_hurt.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_hurt.1.ogg deleted file mode 100644 index 7d7cad3f82..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_hurt.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_hurt.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_hurt.2.ogg deleted file mode 100644 index 9d870486b9..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_hurt.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_random.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_random.1.ogg deleted file mode 100644 index d33157c14a..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_random.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_random.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_random.2.ogg deleted file mode 100644 index 5853e16c52..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_random.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_random.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_random.3.ogg deleted file mode 100644 index 9fc4df09df..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_guardian_random.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_death.ogg deleted file mode 100644 index b4fd749c01..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_death.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_hurt.ogg deleted file mode 100644 index b6d7efd98d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_hurt.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_random.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_random.1.ogg deleted file mode 100644 index b5569a7e03..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_random.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_random.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_random.2.ogg deleted file mode 100644 index 784d699304..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_random.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_llama.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_llama.ogg deleted file mode 100644 index 54f62cd6d7..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_llama.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_attack.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_attack.ogg deleted file mode 100644 index 380ea612af..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_attack.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_big.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_big.ogg deleted file mode 100644 index cd166daf70..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_big.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_small.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_small.ogg deleted file mode 100644 index 1dec6141f1..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_small.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_ocelot_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_ocelot_hurt.ogg deleted file mode 100644 index d2c6d97aaa..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_ocelot_hurt.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_death.ogg deleted file mode 100644 index b4d181e0ef..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_death.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_hurt.ogg deleted file mode 100644 index 96315f2101..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_hurt.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_random.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_random.1.ogg deleted file mode 100644 index ecfc30ef60..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_random.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_random.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_random.2.ogg deleted file mode 100644 index e9ad247eb5..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_parrot_random.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_attack.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_attack.1.ogg deleted file mode 100644 index 70b404651a..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_attack.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_attack.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_attack.2.ogg deleted file mode 100644 index b1f6ef7705..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_attack.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_death.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_death.1.ogg deleted file mode 100644 index afd18ff23e..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_death.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_death.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_death.2.ogg deleted file mode 100644 index c628437f25..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_death.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_death.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_death.3.ogg deleted file mode 100644 index c7133e0848..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_death.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_hurt.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_hurt.1.ogg deleted file mode 100644 index 10bdea141d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_hurt.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_hurt.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_hurt.2.ogg deleted file mode 100644 index 7578bea254..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_hurt.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_hurt.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_hurt.3.ogg deleted file mode 100644 index f000ff1a47..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_hurt.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.1.ogg deleted file mode 100644 index 7ccf450911..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.2.ogg deleted file mode 100644 index 3e37b8c286..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.3.ogg deleted file mode 100644 index 21bcb42707..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.4.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.4.ogg deleted file mode 100644 index d446f400ac..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_rabbit_random.4.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_death.ogg deleted file mode 100644 index 1930b4e423..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_death.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_hurt.ogg deleted file mode 100644 index bc6279a6cb..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_hurt.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_idle.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_idle.ogg deleted file mode 100644 index dbfc41b4da..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_idle.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_death.ogg deleted file mode 100644 index c11402b14b..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_death.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_hurt.ogg deleted file mode 100644 index 2289183d2b..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_hurt.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_random.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_random.1.ogg deleted file mode 100644 index e81c45a41e..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_random.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_random.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_random.2.ogg deleted file mode 100644 index 1d495b8782..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_random.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_death.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_death.1.ogg deleted file mode 100644 index 4794d7e0b6..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_death.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_death.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_death.2.ogg deleted file mode 100644 index aa1fb3f961..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_death.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_death.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_death.3.ogg deleted file mode 100644 index 5de0b0dd24..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_death.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_hurt.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_hurt.1.ogg deleted file mode 100644 index b7ac7d7a65..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_hurt.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_hurt.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_hurt.2.ogg deleted file mode 100644 index e2765e6201..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_hurt.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_hurt.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_hurt.3.ogg deleted file mode 100644 index 5abb1b190d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_snowman_hurt.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_attack.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_attack.1.ogg deleted file mode 100644 index 9dac01d1a5..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_attack.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_attack.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_attack.2.ogg deleted file mode 100644 index 76a66c4837..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_attack.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_death.ogg deleted file mode 100644 index cf2c7dc264..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_death.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_hurt.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_hurt.1.ogg deleted file mode 100644 index bb750f4300..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_hurt.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_hurt.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_hurt.2.ogg deleted file mode 100644 index de76a688a6..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_hurt.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_hurt.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_hurt.3.ogg deleted file mode 100644 index 4796176819..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_hurt.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_random.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_random.ogg deleted file mode 100644 index 32b7746155..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_spider_random.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_death.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_death.1.ogg deleted file mode 100644 index 869c3ae103..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_death.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.1.ogg deleted file mode 100644 index 0fde5dc809..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.2.ogg deleted file mode 100644 index 0a2efd469f..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.3.ogg deleted file mode 100644 index d371fc7aed..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.4.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.4.ogg deleted file mode 100644 index 956db6ac4d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_flop.4.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_hurt.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_hurt.1.ogg deleted file mode 100644 index 2b68ba9f38..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_hurt.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_hurt.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_hurt.2.ogg deleted file mode 100644 index fc47997e82..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_squid_hurt.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_death.ogg deleted file mode 100644 index 561893726f..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_death.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_hurt.ogg deleted file mode 100644 index 26ecfad432..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_hurt.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.1.ogg deleted file mode 100644 index 9c56b0f65b..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.2.ogg deleted file mode 100644 index bafc77b7ea..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.3.ogg deleted file mode 100644 index 9e5c79b6d0..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.4.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.4.ogg deleted file mode 100644 index 5c9ee492ba..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.4.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.5.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.5.ogg deleted file mode 100644 index acb236445e..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.5.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.6.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.6.ogg deleted file mode 100644 index 1ef7a52274..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.6.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.7.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.7.ogg deleted file mode 100644 index c2743fbcc6..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.7.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_accept.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_accept.1.ogg deleted file mode 100644 index b72b8b83f3..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_accept.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_accept.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_accept.2.ogg deleted file mode 100644 index 6de7085b0c..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_accept.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_hurt.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_hurt.1.ogg deleted file mode 100644 index 6c96f57b89..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_hurt.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_hurt.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_hurt.2.ogg deleted file mode 100644 index a7568a3d68..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_hurt.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.1.ogg deleted file mode 100644 index f177713674..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.2.ogg deleted file mode 100644 index 763bf91329..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.3.ogg deleted file mode 100644 index e012ed349d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.4.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.4.ogg deleted file mode 100644 index 51d808f52e..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_trade.4.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wither_spawn.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wither_spawn.ogg deleted file mode 100644 index 8f00611448..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wither_spawn.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_bark.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_bark.1.ogg deleted file mode 100644 index 4434015f8a..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_bark.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_bark.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_bark.2.ogg deleted file mode 100644 index f721eb2212..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_bark.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_bark.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_bark.3.ogg deleted file mode 100644 index 4352e36dd9..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_bark.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_death.ogg deleted file mode 100644 index c5b39bcbc0..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_death.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_growl.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_growl.ogg deleted file mode 100644 index aa3286e47f..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_growl.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_hurt.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_hurt.1.ogg deleted file mode 100644 index 203dd9b577..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_hurt.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_hurt.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_hurt.2.ogg deleted file mode 100644 index cf57285a11..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_hurt.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_hurt.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_hurt.3.ogg deleted file mode 100644 index c603e07ac7..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_hurt.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_take_bone.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_take_bone.ogg deleted file mode 100644 index 3c1b6913ee..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_wolf_take_bone.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_death.ogg deleted file mode 100644 index 62405cb400..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_death.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_growl.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_growl.ogg deleted file mode 100644 index 82b1416fd6..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_growl.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_hurt.ogg deleted file mode 100644 index 1ebfa37ac4..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombie_hurt.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_death.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_death.1.ogg deleted file mode 100644 index 1c05e70686..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_death.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_death.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_death.2.ogg deleted file mode 100644 index 6c0bc48994..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_death.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_hurt.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_hurt.1.ogg deleted file mode 100644 index b20b636fcd..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_hurt.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_hurt.2.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_hurt.2.ogg deleted file mode 100644 index 8a65437161..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_hurt.2.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_hurt.3.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_hurt.3.ogg deleted file mode 100644 index 79776601e5..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_hurt.3.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_random.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_random.1.ogg deleted file mode 100644 index f266a5c36d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_random.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_war_cry.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_war_cry.1.ogg deleted file mode 100644 index efa398c32d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_zombiepig_war_cry.1.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_pig.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_pig.ogg deleted file mode 100644 index e7c7591e35..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_pig.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_pig_angry.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_pig_angry.ogg deleted file mode 100644 index 2a4f47b4f7..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_pig_angry.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_sandmonster.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_sandmonster.ogg deleted file mode 100644 index 2feae6ae0b..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_sandmonster.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_sheep.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_sheep.ogg deleted file mode 100644 index 87296b6183..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_sheep.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_spider.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_spider.ogg deleted file mode 100644 index 41050067a0..0000000000 Binary files a/mods/ENTITIES/mobs_mc/sounds/mobs_spider.ogg and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/spider.lua b/mods/ENTITIES/mobs_mc/spider.lua deleted file mode 100644 index 0fc16928ef..0000000000 --- a/mods/ENTITIES/mobs_mc/spider.lua +++ /dev/null @@ -1,247 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### SPIDER ---################### - - --- Spider by AspireMint (fishyWET (CC-BY-SA 3.0 license for texture) - -local spider = { - description = S("Spider"), - type = "monster", - spawn_class = "hostile", - passive = false, - docile_by_day = true, - attack_type = "dogfight", - pathfinding = 1, - damage = 2, - reach = 2, - hp_min = 16, - hp_max = 16, - xp_min = 5, - xp_max = 5, - armor = {fleshy = 100, arthropod = 100}, - collisionbox = {-0.7, -0.01, -0.7, 0.7, 0.89, 0.7}, - visual = "mesh", - mesh = "mobs_mc_spider.b3d", - textures = { - {"mobs_mc_spider.png^(mobs_mc_spider_eyes.png^[makealpha:0,0,0)"}, - }, - visual_size = {x=3, y=3}, - makes_footstep_sound = false, - sounds = { - random = "mobs_mc_spider_random", - attack = "mobs_mc_spider_attack", - damage = "mobs_mc_spider_hurt", - death = "mobs_mc_spider_death", - -- TODO: sounds: walk - distance = 16, - }, - walk_velocity = 1.3, - run_velocity = 2.8, - jump = true, - jump_height = 4, - view_range = 16, - floats = 1, - drops = { - {name = "mcl_mobitems:string", chance = 1, min = 0, max = 2, looting = "common"}, - {name = "mcl_mobitems:spider_eye", chance = 3, min = 1, max = 1, looting = "common", looting_chance_function = function(lvl) - return 1 - 2 / (lvl + 3) - end}, - }, - specific_attack = { "player", "mobs_mc:iron_golem" }, - fear_height = 4, - animation = { - stand_speed = 10, - walk_speed = 25, - run_speed = 50, - stand_start = 20, - stand_end = 40, - walk_start = 0, - walk_end = 20, - run_start = 0, - run_end = 20, - }, -} -mcl_mobs:register_mob("mobs_mc:spider", spider) - --- Cave spider -local cave_spider = table.copy(spider) -cave_spider.description = S("Cave Spider") -cave_spider.textures = { {"mobs_mc_cave_spider.png^(mobs_mc_spider_eyes.png^[makealpha:0,0,0)"} } --- TODO: Poison damage --- TODO: Revert damage to 2 -cave_spider.damage = 3 -- damage increased to undo non-existing poison -cave_spider.hp_min = 1 -cave_spider.hp_max = 12 -cave_spider.collisionbox = {-0.35, -0.01, -0.35, 0.35, 0.49, 0.35} -cave_spider.visual_size = {x=1.66666, y=1.5} -cave_spider.walk_velocity = 1.3 -cave_spider.run_velocity = 3.2 -cave_spider.sounds = table.copy(spider.sounds) -cave_spider.sounds.base_pitch = 1.25 -mcl_mobs:register_mob("mobs_mc:cave_spider", cave_spider) - - -mcl_mobs:spawn_specific( -"mobs_mc:spider", -"overworld", -"ground", -{ -"Mesa", -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"Jungle", -"Savanna", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"Desert", -"ColdTaiga", -"MushroomIsland", -"IcePlainsSpikes", -"SunflowerPlains", -"IcePlains", -"RoofedForest", -"ExtremeHills+_snowtop", -"MesaPlateauFM_grasstop", -"JungleEdgeM", -"ExtremeHillsM", -"JungleM", -"BirchForestM", -"MesaPlateauF", -"MesaPlateauFM", -"MesaPlateauF_grasstop", -"MesaBryce", -"JungleEdge", -"SavannaM", -"FlowerForest_beach", -"Forest_beach", -"StoneBeach", -"ColdTaiga_beach_water", -"Taiga_beach", -"Savanna_beach", -"Plains_beach", -"ExtremeHills_beach", -"ColdTaiga_beach", -"Swampland_shore", -"MushroomIslandShore", -"JungleM_shore", -"Jungle_shore", -"MesaPlateauFM_sandlevel", -"MesaPlateauF_sandlevel", -"MesaBryce_sandlevel", -"Mesa_sandlevel", -"RoofedForest_ocean", -"JungleEdgeM_ocean", -"BirchForestM_ocean", -"BirchForest_ocean", -"IcePlains_deep_ocean", -"Jungle_deep_ocean", -"Savanna_ocean", -"MesaPlateauF_ocean", -"ExtremeHillsM_deep_ocean", -"Savanna_deep_ocean", -"SunflowerPlains_ocean", -"Swampland_deep_ocean", -"Swampland_ocean", -"MegaSpruceTaiga_deep_ocean", -"ExtremeHillsM_ocean", -"JungleEdgeM_deep_ocean", -"SunflowerPlains_deep_ocean", -"BirchForest_deep_ocean", -"IcePlainsSpikes_ocean", -"Mesa_ocean", -"StoneBeach_ocean", -"Plains_deep_ocean", -"JungleEdge_deep_ocean", -"SavannaM_deep_ocean", -"Desert_deep_ocean", -"Mesa_deep_ocean", -"ColdTaiga_deep_ocean", -"Plains_ocean", -"MesaPlateauFM_ocean", -"Forest_deep_ocean", -"JungleM_deep_ocean", -"FlowerForest_deep_ocean", -"MushroomIsland_ocean", -"MegaTaiga_ocean", -"StoneBeach_deep_ocean", -"IcePlainsSpikes_deep_ocean", -"ColdTaiga_ocean", -"SavannaM_ocean", -"MesaPlateauF_deep_ocean", -"MesaBryce_deep_ocean", -"ExtremeHills+_deep_ocean", -"ExtremeHills_ocean", -"MushroomIsland_deep_ocean", -"Forest_ocean", -"MegaTaiga_deep_ocean", -"JungleEdge_ocean", -"MesaBryce_ocean", -"MegaSpruceTaiga_ocean", -"ExtremeHills+_ocean", -"Jungle_ocean", -"RoofedForest_deep_ocean", -"IcePlains_ocean", -"FlowerForest_ocean", -"ExtremeHills_deep_ocean", -"MesaPlateauFM_deep_ocean", -"Desert_ocean", -"Taiga_ocean", -"BirchForestM_deep_ocean", -"Taiga_deep_ocean", -"JungleM_ocean", -"FlowerForest_underground", -"JungleEdge_underground", -"StoneBeach_underground", -"MesaBryce_underground", -"Mesa_underground", -"RoofedForest_underground", -"Jungle_underground", -"Swampland_underground", -"MushroomIsland_underground", -"BirchForest_underground", -"Plains_underground", -"MesaPlateauF_underground", -"ExtremeHills_underground", -"MegaSpruceTaiga_underground", -"BirchForestM_underground", -"SavannaM_underground", -"MesaPlateauFM_underground", -"Desert_underground", -"Savanna_underground", -"Forest_underground", -"SunflowerPlains_underground", -"ColdTaiga_underground", -"IcePlains_underground", -"IcePlainsSpikes_underground", -"MegaTaiga_underground", -"Taiga_underground", -"ExtremeHills+_underground", -"JungleM_underground", -"ExtremeHillsM_underground", -"JungleEdgeM_underground", -}, -0, -7, -30, -17000, -2, -mcl_vars.mg_overworld_min, -mcl_vars.mg_overworld_max) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:spider", S("Spider"), "mobs_mc_spawn_icon_spider.png", 0) -mcl_mobs:register_egg("mobs_mc:cave_spider", S("Cave Spider"), "mobs_mc_spawn_icon_cave_spider.png", 0) diff --git a/mods/ENTITIES/mobs_mc/squid.lua b/mods/ENTITIES/mobs_mc/squid.lua deleted file mode 100644 index 86b80976ea..0000000000 --- a/mods/ENTITIES/mobs_mc/squid.lua +++ /dev/null @@ -1,220 +0,0 @@ --- v1.1 - ---################### ---################### SQUID ---################### - -local S = minetest.get_translator("mobs_mc") - -mcl_mobs:register_mob("mobs_mc:squid", { - description = S("Squid"), - type = "animal", - spawn_class = "water", - can_despawn = true, - passive = true, - hp_min = 10, - hp_max = 10, - xp_min = 1, - xp_max = 3, - armor = 100, - -- FIXME: If the squid is near the floor, it turns black - collisionbox = {-0.4, 0.0, -0.4, 0.4, 0.9, 0.4}, - visual = "mesh", - mesh = "mobs_mc_squid.b3d", - textures = { - {"mobs_mc_squid.png"} - }, - sounds = { - damage = {name="mobs_mc_squid_hurt", gain=0.3}, - death = {name="mobs_mc_squid_death", gain=0.4}, - flop = "mobs_mc_squid_flop", - -- TODO: sounds: random - distance = 16, - }, - animation = { - stand_start = 1, - stand_end = 60, - walk_start = 1, - walk_end = 60, - run_start = 1, - run_end = 60, - }, - drops = { - {name = "mcl_dye:black", - chance = 1, - min = 1, - max = 3, - looting = "common",}, - }, - visual_size = {x=3, y=3}, - makes_footstep_sound = false, - fly = true, - fly_in = { "mcl_core:water_source", "mclx_core:river_water_source" }, - breathes_in_water = true, - jump = false, - view_range = 16, - runaway = true, - fear_height = 4, -}) - --- TODO: Behaviour: squirt - --- Spawn near the water surface - -local water = mobs_mc.water_level ---name, nodes, neighbours, minlight, maxlight, interval, chance, active_object_count, min_height, max_height -mcl_mobs:spawn_specific( -"mobs_mc:squid", -"overworld", -"water", -{ -"Mesa", -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"Jungle", -"Savanna", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"Desert", -"ColdTaiga", -"MushroomIsland", -"IcePlainsSpikes", -"SunflowerPlains", -"IcePlains", -"RoofedForest", -"ExtremeHills+_snowtop", -"MesaPlateauFM_grasstop", -"JungleEdgeM", -"ExtremeHillsM", -"JungleM", -"BirchForestM", -"MesaPlateauF", -"MesaPlateauFM", -"MesaPlateauF_grasstop", -"MesaBryce", -"JungleEdge", -"SavannaM", -"FlowerForest_beach", -"Forest_beach", -"StoneBeach", -"ColdTaiga_beach_water", -"Taiga_beach", -"Savanna_beach", -"Plains_beach", -"ExtremeHills_beach", -"ColdTaiga_beach", -"Swampland_shore", -"MushroomIslandShore", -"JungleM_shore", -"Jungle_shore", -"MesaPlateauFM_sandlevel", -"MesaPlateauF_sandlevel", -"MesaBryce_sandlevel", -"Mesa_sandlevel", -"RoofedForest_ocean", -"JungleEdgeM_ocean", -"BirchForestM_ocean", -"BirchForest_ocean", -"IcePlains_deep_ocean", -"Jungle_deep_ocean", -"Savanna_ocean", -"MesaPlateauF_ocean", -"ExtremeHillsM_deep_ocean", -"Savanna_deep_ocean", -"SunflowerPlains_ocean", -"Swampland_deep_ocean", -"Swampland_ocean", -"MegaSpruceTaiga_deep_ocean", -"ExtremeHillsM_ocean", -"JungleEdgeM_deep_ocean", -"SunflowerPlains_deep_ocean", -"BirchForest_deep_ocean", -"IcePlainsSpikes_ocean", -"Mesa_ocean", -"StoneBeach_ocean", -"Plains_deep_ocean", -"JungleEdge_deep_ocean", -"SavannaM_deep_ocean", -"Desert_deep_ocean", -"Mesa_deep_ocean", -"ColdTaiga_deep_ocean", -"Plains_ocean", -"MesaPlateauFM_ocean", -"Forest_deep_ocean", -"JungleM_deep_ocean", -"FlowerForest_deep_ocean", -"MushroomIsland_ocean", -"MegaTaiga_ocean", -"StoneBeach_deep_ocean", -"IcePlainsSpikes_deep_ocean", -"ColdTaiga_ocean", -"SavannaM_ocean", -"MesaPlateauF_deep_ocean", -"MesaBryce_deep_ocean", -"ExtremeHills+_deep_ocean", -"ExtremeHills_ocean", -"MushroomIsland_deep_ocean", -"Forest_ocean", -"MegaTaiga_deep_ocean", -"JungleEdge_ocean", -"MesaBryce_ocean", -"MegaSpruceTaiga_ocean", -"ExtremeHills+_ocean", -"Jungle_ocean", -"RoofedForest_deep_ocean", -"IcePlains_ocean", -"FlowerForest_ocean", -"ExtremeHills_deep_ocean", -"MesaPlateauFM_deep_ocean", -"Desert_ocean", -"Taiga_ocean", -"BirchForestM_deep_ocean", -"Taiga_deep_ocean", -"JungleM_ocean", -"FlowerForest_underground", -"JungleEdge_underground", -"StoneBeach_underground", -"MesaBryce_underground", -"Mesa_underground", -"RoofedForest_underground", -"Jungle_underground", -"Swampland_underground", -"MushroomIsland_underground", -"BirchForest_underground", -"Plains_underground", -"MesaPlateauF_underground", -"ExtremeHills_underground", -"MegaSpruceTaiga_underground", -"BirchForestM_underground", -"SavannaM_underground", -"MesaPlateauFM_underground", -"Desert_underground", -"Savanna_underground", -"Forest_underground", -"SunflowerPlains_underground", -"ColdTaiga_underground", -"IcePlains_underground", -"IcePlainsSpikes_underground", -"MegaTaiga_underground", -"Taiga_underground", -"ExtremeHills+_underground", -"JungleM_underground", -"ExtremeHillsM_underground", -"JungleEdgeM_underground", -}, -0, -minetest.LIGHT_MAX+1, -30, -5500, -3, -water-16, -water+1) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:squid", S("Squid"), "mobs_mc_spawn_icon_squid.png", 0) diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_chicken_egg.png b/mods/ENTITIES/mobs_mc/textures/mobs_chicken_egg.png deleted file mode 100644 index 9c65454521..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_chicken_egg.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_TEMP_wither_projectile.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_TEMP_wither_projectile.png deleted file mode 100644 index df8b24c126..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_TEMP_wither_projectile.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_arrow_particle.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_arrow_particle.png deleted file mode 100644 index 1d0cd9b1c9..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_arrow_particle.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_bat.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_bat.png deleted file mode 100644 index 578f8e7433..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_bat.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_blaze.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_blaze.png deleted file mode 100644 index 1d92c9f6c2..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_blaze.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_black.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_black.png deleted file mode 100644 index 8d1322565a..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_black.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_ocelot.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_ocelot.png deleted file mode 100644 index 0792527247..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_ocelot.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_red.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_red.png deleted file mode 100644 index e90a1175d2..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_red.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_siamese.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_siamese.png deleted file mode 100644 index c6efc84c7c..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cat_siamese.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cave_spider.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_cave_spider.png deleted file mode 100644 index 9fb9d35e59..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cave_spider.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_chicken.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_chicken.png deleted file mode 100644 index b9d69278e4..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_chicken.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cow.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_cow.png deleted file mode 100644 index 62696c734d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_cow.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_creeper.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_creeper.png deleted file mode 100644 index 99b432ac67..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_creeper.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_creeper_charge.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_creeper_charge.png deleted file mode 100644 index a5e8ab4437..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_creeper_charge.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_diamond_horse_armor.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_diamond_horse_armor.png deleted file mode 100644 index 121be08de6..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_diamond_horse_armor.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_donkey.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_donkey.png deleted file mode 100644 index e3f04ffd33..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_donkey.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_dragon.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_dragon.png deleted file mode 100644 index 251778ce47..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_dragon.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_dragon_fireball.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_dragon_fireball.png deleted file mode 100644 index 69e643b137..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_dragon_fireball.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_empty.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_empty.png deleted file mode 100644 index 809f22b69e..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_empty.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_endergolem.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_endergolem.png deleted file mode 100644 index 7012926585..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_endergolem.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman.png deleted file mode 100644 index e9475a222a..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman_block.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman_block.png deleted file mode 100644 index 97d949d8a3..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman_block.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman_cactus_background.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman_cactus_background.png deleted file mode 100644 index e2f7ad9a2d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman_cactus_background.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman_eyes.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman_eyes.png deleted file mode 100644 index ee3ab74e8f..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman_eyes.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_endermite.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_endermite.png deleted file mode 100644 index 40f9b47c74..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_endermite.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_evoker.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_evoker.png deleted file mode 100644 index eec707c5cb..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_evoker.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_ghast.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_ghast.png deleted file mode 100644 index dc2addc1db..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_ghast.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_ghast_firing.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_ghast_firing.png deleted file mode 100644 index 3e5b41c327..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_ghast_firing.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_gold_horse_armor.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_gold_horse_armor.png deleted file mode 100644 index f6b4fdfb93..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_gold_horse_armor.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_guardian.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_guardian.png deleted file mode 100644 index c0121954c8..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_guardian.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_guardian_elder.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_guardian_elder.png deleted file mode 100644 index 8b085e8ccb..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_guardian_elder.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_black.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_black.png deleted file mode 100644 index 91159c9d8e..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_black.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_brown.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_brown.png deleted file mode 100644 index 2d1733af9a..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_brown.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_chestnut.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_chestnut.png deleted file mode 100644 index ef051a0097..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_chestnut.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_creamy.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_creamy.png deleted file mode 100644 index a4e6ce8f0d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_creamy.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_darkbrown.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_darkbrown.png deleted file mode 100644 index 5fa6dd45ad..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_darkbrown.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_gray.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_gray.png deleted file mode 100644 index fb6c1c6b65..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_gray.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_blackdots.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_blackdots.png deleted file mode 100644 index b0dc0fc62e..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_blackdots.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_white.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_white.png deleted file mode 100644 index 8dadffef6d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_white.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_whitedots.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_whitedots.png deleted file mode 100644 index 89fdc7c322..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_whitedots.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_whitefield.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_whitefield.png deleted file mode 100644 index b5a4b5ddf2..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_markings_whitefield.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_skeleton.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_skeleton.png deleted file mode 100644 index 615eb67a8d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_skeleton.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_white.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_white.png deleted file mode 100644 index 264fffd26f..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_white.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_husk.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_husk.png deleted file mode 100644 index 4c93cde042..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_husk.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_illusionist.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_illusionist.png deleted file mode 100644 index e6a0f86a62..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_illusionist.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_iron_golem.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_iron_golem.png deleted file mode 100644 index 99d2c56564..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_iron_golem.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_iron_horse_armor.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_iron_horse_armor.png deleted file mode 100644 index 4f078a92bd..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_iron_horse_armor.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama.png deleted file mode 100644 index 4a08544cfc..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_brown.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_brown.png deleted file mode 100644 index 6cf366deb7..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_brown.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_creamy.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_creamy.png deleted file mode 100644 index e1df4612f9..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_creamy.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_black.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_black.png deleted file mode 100644 index 9a06b58718..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_black.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_blue.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_blue.png deleted file mode 100644 index 74db6eb32f..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_blue.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_brown.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_brown.png deleted file mode 100644 index 3ed90ca0d2..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_brown.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_cyan.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_cyan.png deleted file mode 100644 index b66df45715..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_cyan.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_gray.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_gray.png deleted file mode 100644 index b74dd86af8..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_gray.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_green.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_green.png deleted file mode 100644 index e956a30238..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_green.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_blue.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_blue.png deleted file mode 100644 index 6c3b2a7953..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_blue.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_gray.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_gray.png deleted file mode 100644 index 33b9376dd3..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_gray.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_lime.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_lime.png deleted file mode 100644 index f201bc4fab..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_lime.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_magenta.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_magenta.png deleted file mode 100644 index d05057fbb5..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_magenta.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_orange.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_orange.png deleted file mode 100644 index a261eada23..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_orange.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_pink.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_pink.png deleted file mode 100644 index 108aab1553..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_pink.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_purple.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_purple.png deleted file mode 100644 index 3b3e472ce9..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_purple.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_red.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_red.png deleted file mode 100644 index 18b9fbcff9..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_red.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_white.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_white.png deleted file mode 100644 index b70b554190..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_white.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_yellow.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_yellow.png deleted file mode 100644 index 50962e99d7..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_yellow.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_gray.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_gray.png deleted file mode 100644 index 9e43edfe25..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_gray.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_white.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_white.png deleted file mode 100644 index 6306f32527..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_white.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_magmacube.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_magmacube.png deleted file mode 100644 index ec562ec0b7..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_magmacube.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom.png deleted file mode 100644 index 4ee2bd9432..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom_brown.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom_brown.png deleted file mode 100644 index 115416a53c..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom_brown.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mule.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_mule.png deleted file mode 100644 index 328018f5d4..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mule.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_brown.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_brown.png deleted file mode 100644 index fac0f56ef0..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_brown.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_red.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_red.png deleted file mode 100644 index 8c22bd62a4..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_red.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_blue.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_blue.png deleted file mode 100644 index 9181de2605..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_blue.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_green.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_green.png deleted file mode 100644 index 152acb8f41..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_green.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_grey.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_grey.png deleted file mode 100644 index ce723561c4..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_grey.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_red_blue.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_red_blue.png deleted file mode 100644 index 2f14ef1a59..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_red_blue.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_yellow_blue.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_yellow_blue.png deleted file mode 100644 index f35adfd029..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_parrot_yellow_blue.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_pig.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_pig.png deleted file mode 100644 index 715134b423..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_pig.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_pig_saddle.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_pig_saddle.png deleted file mode 100644 index 8126f31ebe..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_pig_saddle.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_polarbear.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_polarbear.png deleted file mode 100644 index 2d4795cccf..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_polarbear.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_black.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_black.png deleted file mode 100644 index bce60d12bd..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_black.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_brown.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_brown.png deleted file mode 100644 index 7a8dc898af..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_brown.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_caerbannog.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_caerbannog.png deleted file mode 100644 index a64e6fdb39..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_caerbannog.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_gold.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_gold.png deleted file mode 100644 index bbcd41f179..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_gold.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_salt.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_salt.png deleted file mode 100644 index efaee4d9d4..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_salt.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_toast.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_toast.png deleted file mode 100644 index 445a6de28a..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_toast.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_white.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_white.png deleted file mode 100644 index b8ab758762..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_white.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_white_splotched.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_white_splotched.png deleted file mode 100644 index a6b707ffbf..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_rabbit_white_splotched.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep.png deleted file mode 100644 index 13496a3c51..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep_fur.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep_fur.png deleted file mode 100644 index fa447031d0..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep_fur.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_black.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_black.png deleted file mode 100644 index 09ac723253..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_black.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_blue.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_blue.png deleted file mode 100644 index 3417417f12..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_blue.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_brown.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_brown.png deleted file mode 100644 index 8b3bceaeb3..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_brown.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_cyan.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_cyan.png deleted file mode 100644 index 9e25c87719..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_cyan.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_gray.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_gray.png deleted file mode 100644 index ce3f0ffd3b..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_gray.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_green.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_green.png deleted file mode 100644 index 7a7e411b9d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_green.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_light_blue.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_light_blue.png deleted file mode 100644 index 90464d0e43..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_light_blue.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_lime.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_lime.png deleted file mode 100644 index b290167c53..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_lime.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_magenta.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_magenta.png deleted file mode 100644 index 80060721ed..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_magenta.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_orange.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_orange.png deleted file mode 100644 index 4daaa29e2b..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_orange.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_pink.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_pink.png deleted file mode 100644 index b6608a42fb..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_pink.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_purple.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_purple.png deleted file mode 100644 index 7012926585..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_purple.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_red.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_red.png deleted file mode 100644 index a0560e57c5..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_red.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_silver.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_silver.png deleted file mode 100644 index 176ee045b6..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_silver.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_white.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_white.png deleted file mode 100644 index 6fa5a5c9ae..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_white.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_yellow.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_yellow.png deleted file mode 100644 index c2d94ac748..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulker_yellow.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulkerbullet.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulkerbullet.png deleted file mode 100644 index 5244918931..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_shulkerbullet.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_silverfish.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_silverfish.png deleted file mode 100644 index 956af9ce7a..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_silverfish.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_skeleton.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_skeleton.png deleted file mode 100644 index 0af86cd6a5..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_skeleton.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_slime.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_slime.png deleted file mode 100644 index 5a30e16fd9..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_slime.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_snowman.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_snowman.png deleted file mode 100644 index dc161eb6d7..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_snowman.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_bat.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_bat.png deleted file mode 100644 index 9720b76791..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_bat.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_blaze.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_blaze.png deleted file mode 100644 index aaa8de0ae8..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_blaze.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cat.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cat.png deleted file mode 100644 index 3f975c19d3..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cat.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cave_spider.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cave_spider.png deleted file mode 100644 index dea6dc92b2..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cave_spider.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_chicken.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_chicken.png deleted file mode 100644 index 58fc641360..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_chicken.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cow.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cow.png deleted file mode 100644 index ac3e7a2d13..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_cow.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_creeper.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_creeper.png deleted file mode 100644 index 99b7668812..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_creeper.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_donkey.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_donkey.png deleted file mode 100644 index 10bd751fbf..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_donkey.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_dragon.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_dragon.png deleted file mode 100644 index 5519d4de7a..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_dragon.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_enderman.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_enderman.png deleted file mode 100644 index 36983ce33c..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_enderman.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_endermite.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_endermite.png deleted file mode 100644 index f2d3b40657..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_endermite.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_evoker.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_evoker.png deleted file mode 100644 index c6aec4f437..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_evoker.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_ghast.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_ghast.png deleted file mode 100644 index 3c0422caea..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_ghast.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_guardian.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_guardian.png deleted file mode 100644 index 10bcbcffb0..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_guardian.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_guardian_elder.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_guardian_elder.png deleted file mode 100644 index fac4ac819a..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_guardian_elder.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse.png deleted file mode 100644 index 38d88e8b66..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse_skeleton.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse_skeleton.png deleted file mode 100644 index bea0c518d0..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse_skeleton.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse_zombie.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse_zombie.png deleted file mode 100644 index ab981289b6..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_horse_zombie.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_husk.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_husk.png deleted file mode 100644 index 48945d89e5..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_husk.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_illusioner.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_illusioner.png deleted file mode 100644 index 7b9dc99e39..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_illusioner.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_iron_golem.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_iron_golem.png deleted file mode 100644 index 6de2cccb94..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_iron_golem.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_llama.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_llama.png deleted file mode 100644 index f3daba2000..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_llama.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_magmacube.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_magmacube.png deleted file mode 100644 index 9c38e1b383..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_magmacube.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_mooshroom.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_mooshroom.png deleted file mode 100644 index 552b703895..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_mooshroom.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_mule.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_mule.png deleted file mode 100644 index 741df99f3c..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_mule.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_parrot.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_parrot.png deleted file mode 100644 index b52c390f78..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_parrot.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_pig.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_pig.png deleted file mode 100644 index 692d1714d6..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_pig.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_polarbear.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_polarbear.png deleted file mode 100644 index 7570cacc8b..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_polarbear.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_rabbit.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_rabbit.png deleted file mode 100644 index 1c77e4199b..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_rabbit.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_sheep.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_sheep.png deleted file mode 100644 index 72ddb17027..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_sheep.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_shulker.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_shulker.png deleted file mode 100644 index 491f840d6f..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_shulker.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_silverfish.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_silverfish.png deleted file mode 100644 index d0bca56648..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_silverfish.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_skeleton.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_skeleton.png deleted file mode 100644 index d0225da214..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_skeleton.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_slime.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_slime.png deleted file mode 100644 index 0366bd267e..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_slime.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_snowman.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_snowman.png deleted file mode 100644 index f518f0cfe2..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_snowman.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_spider.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_spider.png deleted file mode 100644 index 7877d0bb01..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_spider.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_squid.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_squid.png deleted file mode 100644 index 40fa44080a..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_squid.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_stray.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_stray.png deleted file mode 100644 index 67e5bbe3c9..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_stray.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_vex.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_vex.png deleted file mode 100644 index 93bfa7b92c..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_vex.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_villager.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_villager.png deleted file mode 100644 index cf8ce28ccb..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_villager.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_vindicator.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_vindicator.png deleted file mode 100644 index 24316e0f94..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_vindicator.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_witch.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_witch.png deleted file mode 100644 index cd1db520f5..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_witch.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_wither.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_wither.png deleted file mode 100644 index 5ce5c44bf5..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_wither.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_witherskeleton.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_witherskeleton.png deleted file mode 100644 index 9055548bb2..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_witherskeleton.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_wolf.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_wolf.png deleted file mode 100644 index 7098285b60..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_wolf.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie.png deleted file mode 100644 index 0b4da41632..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie_pigman.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie_pigman.png deleted file mode 100644 index ba27c85d37..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie_pigman.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie_villager.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie_villager.png deleted file mode 100644 index 9430af7efd..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_zombie_villager.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spider.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spider.png deleted file mode 100644 index 155544c195..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spider.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spider_eyes.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spider_eyes.png deleted file mode 100644 index 6a134bb5cf..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spider_eyes.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_squid.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_squid.png deleted file mode 100644 index 463b392946..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_squid.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray.png deleted file mode 100644 index 21f15614db..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray_overlay.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray_overlay.png deleted file mode 100644 index b4b47a9fb9..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray_overlay.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_trading_formspec_bg.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_trading_formspec_bg.png deleted file mode 100644 index e271ddb24a..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_trading_formspec_bg.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_trading_formspec_disabled.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_trading_formspec_disabled.png deleted file mode 100644 index 3516b8bd21..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_trading_formspec_disabled.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_vex.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_vex.png deleted file mode 100644 index 980a1e3a35..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_vex.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_vex_charging.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_vex_charging.png deleted file mode 100644 index 97cf859067..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_vex_charging.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager.png deleted file mode 100644 index 7220aa15b7..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_armorer.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_armorer.png deleted file mode 100644 index 6d0eb39b16..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_armorer.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_butcher.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_butcher.png deleted file mode 100644 index 025600ff2f..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_butcher.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_cartographer.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_cartographer.png deleted file mode 100644 index 7ab66072eb..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_cartographer.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_farmer.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_farmer.png deleted file mode 100644 index 851f3a59d1..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_farmer.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_fisherman.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_fisherman.png deleted file mode 100644 index c394f2e6e4..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_fisherman.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_fletcher.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_fletcher.png deleted file mode 100644 index d9875ec10c..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_fletcher.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_leatherworker.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_leatherworker.png deleted file mode 100644 index ea491713eb..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_leatherworker.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_librarian.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_librarian.png deleted file mode 100644 index f4a90d6fbe..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_librarian.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_nitwit.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_nitwit.png deleted file mode 100644 index 8009f03261..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_nitwit.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_priest.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_priest.png deleted file mode 100644 index 38318d4a93..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_priest.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_sheperd.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_sheperd.png deleted file mode 100644 index db32269697..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_sheperd.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_smith.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_smith.png deleted file mode 100644 index 8afdc6b29f..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_smith.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_toolsmith.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_toolsmith.png deleted file mode 100644 index 538a64b992..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_toolsmith.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_weaponsmith.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_weaponsmith.png deleted file mode 100644 index 07157a553f..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager_weaponsmith.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_vindicator.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_vindicator.png deleted file mode 100644 index 512eae60a1..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_vindicator.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_witch.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_witch.png deleted file mode 100644 index acdf2ff930..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_witch.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither.png deleted file mode 100644 index d0b299ee9a..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_half_health.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_half_health.png deleted file mode 100644 index f6353400cd..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_half_health.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_skeleton.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_skeleton.png deleted file mode 100644 index d0d6afe77d..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_skeleton.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf.png deleted file mode 100644 index ea1358984b..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_angry.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_angry.png deleted file mode 100644 index b0c4eb55bc..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_angry.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_collar.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_collar.png deleted file mode 100644 index e0440f77b7..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_collar.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_icon_roam.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_icon_roam.png deleted file mode 100644 index fc09566a53..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_icon_roam.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_icon_sit.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_icon_sit.png deleted file mode 100644 index 7dde7e5a86..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_icon_sit.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_tame.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_tame.png deleted file mode 100644 index ad32cad158..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wolf_tame.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie.png deleted file mode 100644 index ef85701e8f..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_butcher.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_butcher.png deleted file mode 100644 index 8efc88cbad..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_butcher.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_farmer.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_farmer.png deleted file mode 100644 index 07a42bc32b..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_farmer.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_librarian.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_librarian.png deleted file mode 100644 index b2d37fb185..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_librarian.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_pigman.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_pigman.png deleted file mode 100644 index d1c58b41f1..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_pigman.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_priest.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_priest.png deleted file mode 100644 index 7d04f85291..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_priest.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_smith.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_smith.png deleted file mode 100644 index 02fe1ae7f9..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_smith.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_villager.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_villager.png deleted file mode 100644 index 2fc85021bd..0000000000 Binary files a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_villager.png and /dev/null differ diff --git a/mods/ENTITIES/mobs_mc/vex.lua b/mods/ENTITIES/mobs_mc/vex.lua deleted file mode 100644 index 9a5455425f..0000000000 --- a/mods/ENTITIES/mobs_mc/vex.lua +++ /dev/null @@ -1,97 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### VEX ---################### - -mcl_mobs:register_mob("mobs_mc:vex", { - description = S("Vex"), - type = "monster", - spawn_class = "hostile", - pathfinding = 1, - passive = false, - attack_type = "dogfight", - physical = false, - hp_min = 14, - hp_max = 14, - xp_min = 6, - xp_max = 6, - collisionbox = {-0.2, 0.2, -0.2, 0.2, 1.0, 0.2}, --bat - visual = "mesh", - mesh = "mobs_mc_vex.b3d", - textures = { - { - "default_tool_steelsword.png", - "mobs_mc_vex.png", - }, - }, - visual_size = {x=1.25, y=1.25}, - damage = 9, - reach = 2, - view_range = 16, - walk_velocity = 3.2, - run_velocity = 5.9, - attack_type = "dogfight", - sounds = { - -- TODO: random - death = "mobs_mc_vex_death", - damage = "mobs_mc_vex_hurt", - distance = 16, - }, - animation = { - stand_speed = 25, - walk_speed = 25, - run_speed = 50, - stand_start = 40, - stand_end = 80, - walk_start = 0, - walk_end = 40, - run_start = 0, - run_end = 40, - }, - do_custom = function(self, dtime) - -- Glow red while attacking - -- TODO: Charge sound - if self.state == "attack" then - if self.base_texture[2] ~= "mobs_mc_vex_charging.png" then - self.base_texture[2] = "mobs_mc_vex_charging.png" - self.object:set_properties({textures=self.base_texture}) - end - else - if self.base_texture[1] ~= "default_tool_steelsword.png" then - self.base_texture[1] = "default_tool_steelsword.png" - self.object:set_properties({textures=self.base_texture}) - end - end - - -- Take constant damage if the vex' life clock ran out - -- (only for vexes summoned by evokers) - if self._summoned then - if not self._lifetimer then - self._lifetimer = 33 - end - self._lifetimer = self._lifetimer - dtime - if self._lifetimer <= 0 then - if self._damagetimer then - self._damagetimer = self._damagetimer - 1 - end - self.object:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = 2}, - }, nil) - self._damagetimer = 1 - end - end - end, - fly = true, - makes_footstep_sound = false, -}) - - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:vex", S("Vex"), "mobs_mc_spawn_icon_vex.png", 0) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua deleted file mode 100644 index d623e7ca98..0000000000 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ /dev/null @@ -1,1417 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - ---################### ---################### VILLAGER ---################### --- Summary: Villagers are complex NPCs, their main feature allows players to trade with them. - --- TODO: Particles --- TODO: 4s Regeneration I after trade unlock --- TODO: Behaviour: --- TODO: Run into house on rain or danger, open doors --- TODO: Internal inventory, trade with other villagers --- TODO: Schedule stuff (work,sleep,father) - -local S = minetest.get_translator("mobs_mc") -local N = function(s) return s end -local F = minetest.formspec_escape - --- playername-indexed table containing the previously used tradenum -local player_tradenum = {} --- playername-indexed table containing the objectref of trader, if trading formspec is open -local player_trading_with = {} - -local DEFAULT_WALK_CHANCE = 33 -- chance to walk in percent, if no player nearby -local PLAYER_SCAN_INTERVAL = 5 -- every X seconds, villager looks for players nearby -local PLAYER_SCAN_RADIUS = 4 -- scan radius for looking for nearby players - ---[=======[ TRADING ]=======] - --- LIST OF VILLAGER PROFESSIONS AND TRADES - --- TECHNICAL RESTRICTIONS (FIXME): --- * You can't use a clock as requested item --- * You can't use a compass as requested item if its stack size > 1 --- * You can't use a compass in the second requested slot --- This is a problem in the mcl_compass and mcl_clock mods, --- these items should be implemented as single items, then everything --- will be much easier. - -local COMPASS = "mcl_compass:compass" -if minetest.registered_aliases[COMPASS] then - COMPASS = minetest.registered_aliases[COMPASS] -end - -local E1 = { "mcl_core:emerald", 1, 1 } -- one emerald - --- Special trades for v6 only --- NOTE: These symbols MUST only be added at the end of a tier -local TRADE_V6_RED_SANDSTONE, TRADE_V6_DARK_OAK_SAPLING, TRADE_V6_ACACIA_SAPLING, TRADE_V6_BIRCH_SAPLING -if minetest.get_mapgen_setting("mg_name") == "v6" then - TRADE_V6_RED_SANDSTONE = { E1, { "mcl_core:redsandstone", 12, 16 } } - TRADE_V6_DARK_OAK_SAPLING = { { "mcl_core:emerald", 6, 9 }, { "mcl_core:darksapling", 1, 1 } } - TRADE_V6_ACACIA_SAPLING = { { "mcl_core:emerald", 14, 17 }, { "mcl_core:acaciasapling", 1, 1 } } - TRADE_V6_BIRCH_SAPLING = { { "mcl_core:emerald", 8, 11 }, { "mcl_core:birchsapling", 1, 1 } } -end - -local tiernames = { - "Novice", - "Apprentice", - "Journeyman", - "Expert", - "Master", -} - -local badges = { - "default_wood.png", - "default_steel_block.png", - "default_gold_block.png", - "mcl_core_emerald_block.png", - "default_diamond_block.png", -} - -local professions = { - unemployed = { - name = N("Unemployed"), - textures = { - "mobs_mc_villager.png", - "mobs_mc_villager.png", - }, - trades = nil, - }, - farmer = { - name = N("Farmer"), - textures = { - "mobs_mc_villager_farmer.png", - "mobs_mc_villager_farmer.png", - }, - jobsite = "mcl_composters:composter", - trades = { - { - { { "mcl_farming:wheat_item", 18, 22, }, E1 }, - { { "mcl_farming:potato_item", 15, 19, }, E1 }, - { { "mcl_farming:carrot_item", 15, 19, }, E1 }, - { E1, { "mcl_farming:bread", 2, 4 } }, - }, - - { - { { "mcl_farming:pumpkin", 8, 13 }, E1 }, - { E1, { "mcl_farming:pumpkin_pie", 2, 3} }, - { E1, { "mcl_core:apple", 2, 3} }, - }, - - { - { { "mcl_farming:melon", 7, 12 }, E1 }, - { E1, {"mcl_farming:cookie", 5, 7 }, }, - }, - { - { E1, { "mcl_mushrooms:mushroom_stew", 6, 10 } }, --FIXME: expert level farmer is supposed to sell sus stews. - }, - { - { E1, { "mcl_farming:carrot_item_gold", 3, 10 } }, - { E1, { "mcl_potions:speckled_melon", 4, 1 } }, - TRADE_V6_BIRCH_SAPLING, - TRADE_V6_DARK_OAK_SAPLING, - TRADE_V6_ACACIA_SAPLING, - }, - } - }, - fisherman = { - name = N("Fisherman"), - textures = { - "mobs_mc_villager_fisherman.png", - "mobs_mc_villager_fisherman.png", - }, - jobsite = "mcl_barrels:barrel_closed", - trades = { - { - { { "mcl_fishing:fish_raw", 6, 6, "mcl_core:emerald", 1, 1 },{ "mcl_fishing:fish_cooked", 6, 6 } }, - { { "mcl_mobitems:string", 15, 20 }, E1 }, - { { "mcl_core:coal_lump", 15, 10 }, E1 }, - -- FIXME missing: bucket of cod + fish should be cod. - }, - { - { { "mcl_fishing:fish_raw", 6, 15,}, E1 }, - { { "mcl_fishing:salmon_raw", 6, 6, "mcl_core:emerald", 1, 1 },{ "mcl_fishing:salmon_cooked", 6, 6 } }, - -- FIXME missing campfire - -- {{ "mcl_core:emerald", 1, 2 },{"mcl_campfires:campfire",1,1} }, - }, - { - { { "mcl_fishing:salmon_raw", 6, 13,}, E1 }, - { { "mcl_core:emerald", 7, 22 }, { "mcl_fishing:fishing_rod_enchanted", 1, 1} }, - }, - { - { { "mcl_fishing:clownfish_raw", 6, 6,}, E1 }, - }, - { - { { "mcl_fishing:pufferfish_raw", 4, 4,}, E1 }, - - { { "mcl_boats:boat", 1, 1,}, E1 }, - { { "mcl_boats:boat_acacia", 1, 1,}, E1 }, - { { "mcl_boats:boat_spruce", 1, 1,}, E1 }, - { { "mcl_boats:boat_dark_oak", 1, 1,}, E1 }, - { { "mcl_boats:boat_birch", 1, 1,}, E1 }, - }, - }, - }, - fletcher = { - name = N("Fletcher"), - textures = { - "mobs_mc_villager_fletcher.png", - "mobs_mc_villager_fletcher.png", - }, - jobsite = "mcl_fletching_table:fletching_table", - trades = { - { - { { "mcl_mobitems:string", 15, 20 }, E1 }, - { E1, { "mcl_bows:arrow", 8, 12 } }, - { { "mcl_core:gravel", 10, 10, "mcl_core:emerald", 1, 1 }, { "mcl_core:flint", 6, 10 } }, - }, - { - { { "mcl_core:flint", 26, 26 }, E1 }, - { { "mcl_core:emerald", 2, 3 }, { "mcl_bows:bow", 1, 1 } }, - }, - { - { { "mcl_mobitems:string", 14, 14 }, E1 }, - { { "mcl_core:emerald", 3, 3 }, { "mcl_bows:crossbow", 1, 1 } }, - }, - { - { { "mcl_mobitems:string", 24, 24 }, E1 }, - { { "mcl_core:emerald", 7, 21 } , { "mcl_bows:bow_enchanted", 1, 1 } }, - }, - { - --FIXME: supposed to be tripwire hook{ { "tripwirehook", 24, 24 }, E1 }, - { { "mcl_core:emerald", 8, 22 } , { "mcl_bows:crossbow_enchanted", 1, 1 } }, - { { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:healing_arrow", 5, 5 } }, - { { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:harming_arrow", 5, 5 } }, - { { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:night_vision_arrow", 5, 5 } }, - { { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:swiftness_arrow", 5, 5 } }, - { { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:slowness_arrow", 5, 5 } }, - { { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:leaping_arrow", 5, 5 } }, - { { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:poison_arrow", 5, 5 } }, - { { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:regeneration_arrow", 5, 5 } }, - { { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:invisibility_arrow", 5, 5 } }, - { { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:water_breathing_arrow", 5, 5 } }, - { { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:fire_resistance_arrow", 5, 5 } }, - }, - } - }, - shepherd ={ - name = N("Shepherd"), - textures = { - "mobs_mc_villager_sheperd.png", - "mobs_mc_villager_sheperd.png", - }, - jobsite = "mcl_loom:loom", - trades = { - { - { { "mcl_wool:white", 16, 22 }, E1 }, - { { "mcl_core:emerald", 3, 4 }, { "mcl_tools:shears", 1, 1 } }, - }, - - { - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:white", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:grey", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:silver", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:black", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:yellow", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:orange", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:red", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:magenta", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:purple", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:blue", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:cyan", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:lime", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:green", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:pink", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:light_blue", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:brown", 1, 1 } }, - }, - }, - }, - librarian = { - name = N("Librarian"), - textures = { - "mobs_mc_villager_librarian.png", - "mobs_mc_villager_librarian.png", - }, - jobsite = "mcl_books:bookshelf", --FIXME: lectern - trades = { - { - { { "mcl_core:paper", 24, 36 }, E1 }, - { { "mcl_books:book", 8, 10 }, E1 }, - { { "mcl_core:emerald", 9, 9 }, { "mcl_books:bookshelf", 1 ,1 }}, - { { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }}, - }, - { - { { "mcl_books:written_book", 2, 2 }, E1 }, - { { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }}, - { E1, { "mcl_lanterns:lantern_floor", 1, 1 } }, - }, - - { - { { "mcl_dye:black", 5, 5 }, E1 }, - { { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }}, - { E1, { "mcl_core:glass", 4, 4 } }, - }, - - { - { E1, { "mcl_books:writable_book", 1, 1 } }, - { { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }}, - { { "mcl_core:emerald", 4, 4 }, { "mcl_compass:compass", 1 ,1 }}, - { { "mcl_core:emerald", 5, 5 }, { "mcl_clock:clock", 1, 1 } }, - }, - - { - { { "mcl_core:emerald", 20, 20 }, { "mcl_mobs:nametag", 1, 1 } }, - } - }, - }, - cartographer = { - name = N("Cartographer"), - textures = { - "mobs_mc_villager_cartographer.png", - "mobs_mc_villager_cartographer.png", - }, - jobsite = "mcl_cartography_table:cartography_table", - trades = { - { - { { "mcl_core:paper", 24, 24 }, E1 }, - { { "mcl_core:emerald", 7, 7}, { "mcl_maps:empty_map", 1, 1 } }, - }, - { - -- compass subject to special checks - { { "xpanes:pane_natural_flat", 1, 1 }, E1 }, - --{ { "mcl_core:emerald", 13, 13, "mcl_compass:compass", 1, 1 }, { "FIXME:ocean explorer map" 1, 1} }, - }, - { - { { "mcl_compass:compass", 1, 1 }, E1 }, - --{ { "mcl_core:emerald", 13, 13, "mcl_compass:compass", 1, 1 }, { "FIXME:woodland explorer map" 1, 1} }, - }, - { - { { "mcl_core:emerald", 7, 7}, { "mcl_itemframes:item_frame", 1, 1 }}, - - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_white", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_grey", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_silver", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_black", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_red", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_green", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_cyan", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_blue", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_magenta", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_orange", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_purple", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_brown", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_pink", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_lime", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_light_blue", 1, 1 }}, - }, - { - --{ { "mcl_core:emerald", 8, 8}, { "FIXME: globe banner pattern", 1, 1 } }, - }, - -- TODO: special maps - }, - }, - armorer = { - name = N("Armorer"), - textures = { - "mobs_mc_villager_armorer.png", - "mobs_mc_villager_armorer.png", - }, - jobsite = "mcl_blast_furnace:blast_furnace", - trades = { - { - { { "mcl_core:coal_lump", 15, 15 }, E1 }, - { { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_iron", 1, 1 } }, - { { "mcl_core:emerald", 9, 9 }, { "mcl_armor:chestplate_iron", 1, 1 } }, - { { "mcl_core:emerald", 7, 7 }, { "mcl_armor:leggings_iron", 1, 1 } }, - { { "mcl_core:emerald", 4, 4 }, { "mcl_armor:boots_iron", 1, 1 } }, - }, - - { - { { "mcl_core:iron_ingot", 4, 4 }, E1 }, - { { "mcl_core:emerald", 36, 36 }, { "mcl_bells:bell", 1, 1 } }, - { { "mcl_core:emerald", 3, 3 }, { "mcl_armor:leggings_chain", 1, 1 } }, - { { "mcl_core:emerald", 1, 1 }, { "mcl_armor:boots_chain", 1, 1 } }, - }, - { - { { "mcl_buckets:bucket_lava", 1, 1 }, E1 }, - { { "mcl_core:diamond", 1, 1 }, E1 }, - { { "mcl_core:emerald", 1, 1 }, { "mcl_armor:helmet_chain", 1, 1 } }, - { { "mcl_core:emerald", 4, 4 }, { "mcl_armor:chestplate_chain", 1, 1 } }, - { { "mcl_core:emerald", 5, 5 }, { "mcl_shields:shield", 1, 1 } }, - }, - - { - { { "mcl_core:emerald", 19, 33 }, { "mcl_armor:leggings_diamond_enchanted", 1, 1 } }, - { { "mcl_core:emerald", 13, 27 }, { "mcl_armor:boots_diamond_enchanted", 1, 1 } }, - }, - { - { { "mcl_core:emerald", 13, 27 }, { "mcl_armor:helmet_diamond_enchanted", 1, 1 } }, - { { "mcl_core:emerald", 21, 35 }, { "mcl_armor:chestplate_diamond_enchanted", 1, 1 } }, - }, - }, - }, - leatherworker = { - name = N("Leatherworker"), - textures = { - "mobs_mc_villager_leatherworker.png", - "mobs_mc_villager_leatherworker.png", - }, - jobsite = "mcl_cauldrons:cauldron", - trades = { - { - { { "mcl_mobitems:leather", 9, 12 }, E1 }, - { { "mcl_core:emerald", 3, 3 }, { "mcl_armor:leggings_leather", 2, 4 } }, - { { "mcl_core:emerald", 7, 7 }, { "mcl_armor:chestplate_leather", 2, 4 } }, - }, - { - { { "mcl_core:flint", 26, 26 }, E1 }, - { { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_leather", 2, 4 } }, - { { "mcl_core:emerald", 4, 4 }, { "mcl_armor:boots_leather", 2, 4 } }, - }, - { - { { "mcl_mobitems:rabbit_hide", 9, 9 }, E1 }, - { { "mcl_core:emerald", 7, 7 }, { "mcl_armor:chestplate_leather", 1, 1 } }, - }, - { - --{ { "FIXME: scute", 4, 4 }, E1 }, - { { "mcl_core:emerald", 8, 10 }, { "mcl_mobitems:saddle", 1, 1 } }, - }, - { - { { "mcl_core:emerald", 6, 6 }, { "mcl_mobitems:saddle", 1, 1 } }, - { { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_leather", 2, 4 } }, - }, - }, - }, - butcher = { - name = N("Butcher"), - textures = { - "mobs_mc_villager_butcher.png", - "mobs_mc_villager_butcher.png", - }, - jobsite = "mcl_smoker:smoker", - trades = { - { - { { "mcl_mobitems:beef", 14, 14 }, E1 }, - { { "mcl_mobitems:chicken", 7, 7 }, E1 }, - { { "mcl_mobitems:rabbit", 4, 4 }, E1 }, - { E1, { "mcl_mobitems:rabbit_stew", 1, 1 } }, - }, - - { - { { "mcl_core:coal_lump", 15, 15 }, E1 }, - { E1, { "mcl_mobitems:cooked_porkchop", 5, 5 } }, - { E1, { "mcl_mobitems:cooked_chicken", 8, 8 } }, - }, - { - { { "mcl_mobitems:mutton", 7, 7 }, E1 }, - { { "mcl_mobitems:beef", 10, 10 }, E1 }, - }, - { - { { "mcl_mobitems:mutton", 7, 7 }, E1 }, - { { "mcl_mobitems:beef", 10, 10 }, E1 }, - }, - { - --{ { "FIXME: Sweet Berries", 10, 10 }, E1 }, - }, - }, - }, - weapon_smith = { - name = N("Weapon Smith"), - textures = { - "mobs_mc_villager_weaponsmith.png", - "mobs_mc_villager_weaponsmith.png", - }, - jobsite = "mcl_furnaces:furnace", --FIXME: grindstone - trades = { - { - { { "mcl_core:coal_lump", 15, 15 }, E1 }, - { { "mcl_core:emerald", 3, 3 }, { "mcl_tools:axe_iron", 1, 1 } }, - { { "mcl_core:emerald", 7, 21 }, { "mcl_tools:sword_iron_enchanted", 1, 1 } }, - }, - - { - { { "mcl_core:iron_ingot", 4, 4 }, E1 }, - { { "mcl_core:emerald", 36, 36 }, { "mcl_bells:bell", 1, 1 } }, - }, - { - { { "mcl_core:flint", 7, 9 }, E1 }, - }, - { - { { "mcl_core:diamond", 7, 9 }, E1 }, - { { "mcl_core:emerald", 17, 31 }, { "mcl_tools:axe_diamond_enchanted", 1, 1 } }, - }, - - { - { { "mcl_core:emerald", 13, 27 }, { "mcl_tools:sword_diamond_enchanted", 1, 1 } }, - }, - }, - }, - tool_smith = { - name = N("Tool Smith"), - textures = { - "mobs_mc_villager_toolsmith.png", - "mobs_mc_villager_toolsmith.png", - }, - jobsite = "mcl_anvils:anvil", --FIXME: smithing table - trades = { - { - { { "mcl_core:coal_lump", 15, 15 }, E1 }, - { E1, { "mcl_tools:axe_stone", 1, 1 } }, - { E1, { "mcl_tools:shovel_stone", 1, 1 } }, - { E1, { "mcl_tools:pick_stone", 1, 1 } }, - { E1, { "mcl_farming:hoe_stone", 1, 1 } }, - }, - - { - { { "mcl_core:iron_ingot", 4, 4 }, E1 }, - { { "mcl_core:emerald", 36, 36 }, { "mcl_bells:bell", 1, 1 } }, - }, - { - { { "mcl_core:flint", 30, 30 }, E1 }, - { { "mcl_core:emerald", 6, 20 }, { "mcl_tools:axe_iron_enchanted", 1, 1 } }, - { { "mcl_core:emerald", 7, 21 }, { "mcl_tools:shovel_iron_enchanted", 1, 1 } }, - { { "mcl_core:emerald", 8, 22 }, { "mcl_tools:pick_iron_enchanted", 1, 1 } }, - { { "mcl_core:emerald", 4, 4 }, { "mcl_farming:hoe_diamond", 1, 1 } }, - }, - { - { { "mcl_core:diamond", 1, 1 }, E1 }, - { { "mcl_core:emerald", 17, 31 }, { "mcl_tools:axe_diamond_enchanted", 1, 1 } }, - { { "mcl_core:emerald", 10, 24 }, { "mcl_tools:shovel_diamond_enchanted", 1, 1 } }, - }, - { - { { "mcl_core:emerald", 18, 32 }, { "mcl_tools:pick_diamond_enchanted", 1, 1 } }, - }, - }, - }, - cleric = { - name = N("Cleric"), - textures = { - "mobs_mc_villager_priest.png", - "mobs_mc_villager_priest.png", - }, - jobsite = "mcl_brewing:stand_000", - trades = { - { - { { "mcl_mobitems:rotten_flesh", 32, 32 }, E1 }, - { E1, { "mesecons:redstone", 2, 2 } }, - }, - { - { { "mcl_core:gold_ingot", 3, 3 }, E1 }, - { E1, { "mcl_dye:blue", 1, 1 } }, - }, - { - { { "mcl_mobitems:rabbit_foot", 2, 2 }, E1 }, - { E1, { "mcl_nether:glowstone", 4, 4 } }, - }, - { - --{ { "FIXME: scute", 4, 4 }, E1 }, - { { "mcl_potions:glass_bottle", 9, 9 }, E1 }, - { { "mcl_core:emerald", 5, 5 }, { "mcl_throwing:ender_pearl", 1, 1 } }, - TRADE_V6_RED_SANDSTONE, - }, - { - { { "mcl_nether:nether_wart_item", 22, 22 }, E1 }, - { { "mcl_core:emerald", 3, 3 }, { "mcl_experience:bottle", 1, 1 } }, - }, - }, - }, - nitwit = { - name = N("Nitwit"), - textures = { - "mobs_mc_villager_nitwit.png", - "mobs_mc_villager_nitwit.png", - }, - -- No trades for nitwit - trades = nil, - } -} - -local profession_names = {} -for id, _ in pairs(professions) do - table.insert(profession_names, id) -end - -local jobsites={} -for _,n in pairs(profession_names) do - table.insert(jobsites,professions[n].jobsite) -end - -local function stand_still(self) - self.walk_chance = 0 - self.jump = false -end - -local function init_trader_vars(self) - if not self._max_trade_tier then - self._max_trade_tier = 1 - end - if not self._locked_trades then - self._locked_trades = 0 - end - if not self._trading_players then - self._trading_players = {} - end -end - -local function get_badge_textures(self) - local t = professions[self._profession].textures - if self._profession == "unemployed" or self._profession == "nitwit" then return t end - local tier = self._max_trade_tier or 1 - return { - "[combine:64x64:0,0="..t[1]..":11,55=".. badges[tier].."\\^[resize\\:2x2", - t[2] - } -end - -local function set_textures(self) - self.object:set_properties({textures=get_badge_textures(self)}) -end - -local function go_home(entity) - entity.state = "go_home" - local b=entity._bed - if not b then return end - mcl_mobs:gopath(entity,b,function(entity,b) - if vector.distance(entity.object:get_pos(),b) < 2 then - entity.state = "stand" - set_velocity(entity,0) - entity.object:set_pos(b) - local n=minetest.get_node(b) - if n and n.name ~= "mcl_beds:bed_red_bottom" then - entity._bed=nil --the stormtroopers have killed uncle owen - return false - end - return true - end - end) -end - ------ JOBSITE LOGIC -local function get_profession_by_jobsite(js) - for k,v in pairs(professions) do - if v.jobsite == js then return k end - end -end - -local function employ(self,jobsite_pos) - local n = minetest.get_node(jobsite_pos) - local m = minetest.get_meta(jobsite_pos) - local p = get_profession_by_jobsite(n.name) - if p and m:get_string("villager") == "" then - self._profession=p - m:set_string("villager",self._id) - self._jobsite = jobsite_pos - set_textures(self) - return true - end -end - -local function look_for_job(self) - local p = self.object:get_pos() - local nn = minetest.find_nodes_in_area(vector.offset(p,-48,-48,-48),vector.offset(p,48,48,48),jobsites) - for _,n in pairs(nn) do - local m=minetest.get_meta(n) - if m:get_string("villager") == "" then - --minetest.log("goingt to jobsite "..minetest.pos_to_string(n) ) - local gp = mcl_mobs:gopath(self,n,function() - --minetest.log("arrived jobsite "..minetest.pos_to_string(n) ) - end) - if gp then return end - end - end -end - -local function get_a_job(self) - local p = self.object:get_pos() - local nn = minetest.find_nodes_in_area(vector.offset(p,-8,-8,-8),vector.offset(p,8,8,8),jobsites) - for _,n in pairs(nn) do - if n and employ(self,n) then return true end - end - if self.state ~= "gowp" then look_for_job(self) end -end - -local function update_max_tradenum(self) - if not self._trades then - return - end - local trades = minetest.deserialize(self._trades) - for t=1, #trades do - local trade = trades[t] - if trade.tier > self._max_trade_tier then - self._max_tradenum = t - 1 - return - end - end - self._max_tradenum = #trades -end - -local function init_trades(self, inv) - local profession = professions[self._profession] - local trade_tiers = profession.trades - if trade_tiers == nil then - -- Empty trades - self._trades = false - return - end - - local max_tier = #trade_tiers - local trades = {} - for tiernum=1, max_tier do - local tier = trade_tiers[tiernum] - for tradenum=1, #tier do - local trade = tier[tradenum] - local wanted1_item = trade[1][1] - local wanted1_count = math.random(trade[1][2], trade[1][3]) - local offered_item = trade[2][1] - local offered_count = math.random(trade[2][2], trade[2][3]) - - local offered_stack = ItemStack({name = offered_item, count = offered_count}) - if mcl_enchanting.is_enchanted(offered_item) then - if mcl_enchanting.is_book(offered_item) then - offered_stack = mcl_enchanting.enchant_uniform_randomly(offered_stack, {"soul_speed"}) - else - mcl_enchanting.enchant_randomly(offered_stack, math.random(5, 19), false, false, true) - mcl_enchanting.unload_enchantments(offered_stack) - end - end - - local wanted = { wanted1_item .. " " ..wanted1_count } - if trade[1][4] then - local wanted2_item = trade[1][4] - local wanted2_count = math.random(trade[1][5], trade[1][6]) - table.insert(wanted, wanted2_item .. " " ..wanted2_count) - end - - table.insert(trades, { - wanted = wanted, - offered = offered_stack:to_table(), - tier = tiernum, -- tier of this trade - traded_once = false, -- true if trade was traded at least once - trade_counter = 0, -- how often the this trade was mate after the last time it got unlocked - locked = false, -- if this trade is locked. Locked trades can't be used - }) - end - end - self._trades = minetest.serialize(trades) - minetest.deserialize(self._trades) -end - -local function set_trade(trader, player, inv, concrete_tradenum) - local trades = minetest.deserialize(trader._trades) - if not trades then - init_trades(trader) - trades = minetest.deserialize(trader._trades) - if not trades then - minetest.log("error", "[mobs_mc] Failed to select villager trade!") - return - end - end - local name = player:get_player_name() - - -- Stop tradenum from advancing into locked tiers or out-of-range areas - if concrete_tradenum > trader._max_tradenum then - concrete_tradenum = trader._max_tradenum - elseif concrete_tradenum < 1 then - concrete_tradenum = 1 - end - player_tradenum[name] = concrete_tradenum - local trade = trades[concrete_tradenum] - inv:set_stack("wanted", 1, ItemStack(trade.wanted[1])) - local offered = ItemStack(trade.offered) - -- Only load enchantments for enchanted items; fixes unnecessary metadata being applied to regular items from villagers. - if mcl_enchanting.is_enchanted(offered:get_name()) then - mcl_enchanting.load_enchantments(offered) - end - inv:set_stack("offered", 1, offered) - if trade.wanted[2] then - local wanted2 = ItemStack(trade.wanted[2]) - inv:set_stack("wanted", 2, wanted2) - else - inv:set_stack("wanted", 2, "") - end - -end - -local function show_trade_formspec(playername, trader, tradenum) - if not trader._trades then - return - end - if not tradenum then - tradenum = 1 - end - local trades = minetest.deserialize(trader._trades) - local trade = trades[tradenum] - local profession = professions[trader._profession].name - local disabled_img = "" - if trade.locked then - disabled_img = "image[4.3,2.52;1,1;mobs_mc_trading_formspec_disabled.png]".. - "image[4.3,1.1;1,1;mobs_mc_trading_formspec_disabled.png]" - end - local tradeinv_name = "mobs_mc:trade_"..playername - local tradeinv = F("detached:"..tradeinv_name) - - local b_prev, b_next = "", "" - if #trades > 1 then - if tradenum > 1 then - b_prev = "button[1,1;0.5,1;prev_trade;<]" - end - if tradenum < trader._max_tradenum then - b_next = "button[7.26,1;0.5,1;next_trade;>]" - end - end - - local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade_"..playername}) - if not inv then - return - end - local wanted1 = inv:get_stack("wanted", 1) - local wanted2 = inv:get_stack("wanted", 2) - local offered = inv:get_stack("offered", 1) - - local w2_formspec = "" - if not wanted2:is_empty() then - w2_formspec = "item_image[3,1;1,1;"..wanted2:to_string().."]" - .."tooltip[3,1;0.8,0.8;"..F(wanted2:get_description()).."]" - end - local tiername = tiernames[trader._max_trade_tier] - if tiername then - tiername = S(tiername) - else - tiername = S("Master") - end - local formspec = - "size[9,8.75]" - .."background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]" - ..disabled_img -.."label[3,0;"..F(minetest.colorize("#313131", S(profession).." - "..tiername)) .."]" - .."list[current_player;main;0,4.5;9,3;9]" - .."list[current_player;main;0,7.74;9,1;]" - ..b_prev..b_next - .."["..tradeinv..";wanted;2,1;2,1;]" - .."item_image[2,1;1,1;"..wanted1:to_string().."]" - .."tooltip[2,1;0.8,0.8;"..F(wanted1:get_description()).."]" - ..w2_formspec - .."item_image[5.76,1;1,1;"..offered:get_name().." "..offered:get_count().."]" - .."tooltip[5.76,1;0.8,0.8;"..F(offered:get_description()).."]" - .."list["..tradeinv..";input;2,2.5;2,1;]" - .."list["..tradeinv..";output;5.76,2.55;1,1;]" - .."listring["..tradeinv..";output]" - .."listring[current_player;main]" - .."listring["..tradeinv..";input]" - .."listring[current_player;main]" - minetest.sound_play("mobs_mc_villager_trade", {to_player = playername}, true) - minetest.show_formspec(playername, tradeinv_name, formspec) -end - -local function update_offer(inv, player, sound) - local name = player:get_player_name() - local trader = player_trading_with[name] - local tradenum = player_tradenum[name] - if not trader or not tradenum then - return false - end - local trades = minetest.deserialize(trader._trades) - if not trades then - return false - end - local trade = trades[tradenum] - if not trade then - return false - end - local wanted1, wanted2 = inv:get_stack("wanted", 1), inv:get_stack("wanted", 2) - local input1, input2 = inv:get_stack("input", 1), inv:get_stack("input", 2) - - -- BEGIN OF SPECIAL HANDLING OF COMPASS - -- These 2 functions are a complicated check to check if the input contains a - -- special item which we cannot check directly against their name, like - -- compass. - -- TODO: Remove these check functions when compass and clock are implemented - -- as single items. - local function check_special(special_item, group, wanted1, wanted2, input1, input2) - if minetest.registered_aliases[special_item] then - special_item = minetest.registered_aliases[special_item] - end - if wanted1:get_name() == special_item then - local function check_input(input, wanted, group) - return minetest.get_item_group(input:get_name(), group) ~= 0 and input:get_count() >= wanted:get_count() - end - if check_input(input1, wanted1, group) then - return true - elseif check_input(input2, wanted1, group) then - return true - else - return false - end - end - return false - end - -- Apply above function to all items which we consider special. - -- This function succeeds if ANY item check succeeds. - local function check_specials(wanted1, wanted2, input1, input2) - return check_special(COMPASS, "compass", wanted1, wanted2, input1, input2) - end - -- END OF SPECIAL HANDLING OF COMPASS - - if ( - ((inv:contains_item("input", wanted1) and - (wanted2:is_empty() or inv:contains_item("input", wanted2))) or - -- BEGIN OF SPECIAL HANDLING OF COMPASS - check_specials(wanted1, wanted2, input1, input2)) and - -- END OF SPECIAL HANDLING OF COMPASS - (trade.locked == false)) then - inv:set_stack("output", 1, inv:get_stack("offered", 1)) - if sound then - minetest.sound_play("mobs_mc_villager_accept", {to_player = name}, true) - end - return true - else - inv:set_stack("output", 1, ItemStack("")) - if sound then - minetest.sound_play("mobs_mc_villager_deny", {to_player = name}, true) - end - return false - end -end - --- Returns a single itemstack in the given inventory to the player's main inventory, or drop it when there's no space left -local function return_item(itemstack, dropper, pos, inv_p) - if dropper:is_player() then - -- Return to main inventory - if inv_p:room_for_item("main", itemstack) then - inv_p:add_item("main", itemstack) - else - -- Drop item on the ground - local v = dropper:get_look_dir() - local p = {x=pos.x, y=pos.y+1.2, z=pos.z} - p.x = p.x+(math.random(1,3)*0.2) - p.z = p.z+(math.random(1,3)*0.2) - local obj = minetest.add_item(p, itemstack) - if obj then - v.x = v.x*4 - v.y = v.y*4 + 2 - v.z = v.z*4 - obj:set_velocity(v) - obj:get_luaentity()._insta_collect = false - end - end - else - -- Fallback for unexpected cases - minetest.add_item(pos, itemstack) - end - return itemstack -end - -local function return_fields(player) - local name = player:get_player_name() - local inv_t = minetest.get_inventory({type="detached", name = "mobs_mc:trade_"..name}) - local inv_p = player:get_inventory() - if not inv_t or not inv_p then - return - end - for i=1, inv_t:get_size("input") do - local stack = inv_t:get_stack("input", i) - return_item(stack, player, player:get_pos(), inv_p) - stack:clear() - inv_t:set_stack("input", i, stack) - end - inv_t:set_stack("output", 1, "") -end - -minetest.register_on_player_receive_fields(function(player, formname, fields) - if string.sub(formname, 1, 14) == "mobs_mc:trade_" then - local name = player:get_player_name() - if fields.quit then - -- Get input items back - return_fields(player) - -- Reset internal "trading with" state - local trader = player_trading_with[name] - if trader then - trader._trading_players[name] = nil - end - player_trading_with[name] = nil - elseif fields.next_trade or fields.prev_trade then - local trader = player_trading_with[name] - if not trader or not trader.object:get_luaentity() then - return - end - local trades = trader._trades - if not trades then - return - end - local dir = 1 - if fields.prev_trade then - dir = -1 - end - local tradenum = player_tradenum[name] + dir - local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade_"..name}) - if not inv then - return - end - set_trade(trader, player, inv, tradenum) - update_offer(inv, player, false) - show_trade_formspec(name, trader, player_tradenum[name]) - end - end -end) - -minetest.register_on_leaveplayer(function(player) - local name = player:get_player_name() - return_fields(player) - player_tradenum[name] = nil - local trader = player_trading_with[name] - if trader then - trader._trading_players[name] = nil - end - player_trading_with[name] = nil - -end) - --- Return true if player is trading with villager, and the villager entity exists -local function trader_exists(playername) - local trader = player_trading_with[playername] - return trader ~= nil and trader.object:get_luaentity() ~= nil -end - -local trade_inventory = { - allow_take = function(inv, listname, index, stack, player) - if listname == "input" then - return stack:get_count() - elseif listname == "output" then - if not trader_exists(player:get_player_name()) then - return 0 - end - -- Only allow taking full stack - local count = stack:get_count() - if count == inv:get_stack(listname, index):get_count() then - -- Also update output stack again. - -- If input has double the wanted items, the - -- output will stay because there will be still - -- enough items in input after the trade - local wanted1 = inv:get_stack("wanted", 1) - local wanted2 = inv:get_stack("wanted", 2) - local input1 = inv:get_stack("input", 1) - local input2 = inv:get_stack("input", 2) - wanted1:set_count(wanted1:get_count()*2) - wanted2:set_count(wanted2:get_count()*2) - -- BEGIN OF SPECIAL HANDLING FOR COMPASS - local function special_checks(wanted1, input1, input2) - if wanted1:get_name() == COMPASS then - local compasses = 0 - if (minetest.get_item_group(input1:get_name(), "compass") ~= 0) then - compasses = compasses + input1:get_count() - end - if (minetest.get_item_group(input2:get_name(), "compass") ~= 0) then - compasses = compasses + input2:get_count() - end - return compasses >= wanted1:get_count() - end - return false - end - -- END OF SPECIAL HANDLING FOR COMPASS - if (inv:contains_item("input", wanted1) and - (wanted2:is_empty() or inv:contains_item("input", wanted2))) - -- BEGIN OF SPECIAL HANDLING FOR COMPASS - or special_checks(wanted1, input1, input2) then - -- END OF SPECIAL HANDLING FOR COMPASS - return -1 - else - -- If less than double the wanted items, - -- remove items from output (final trade, - -- input runs empty) - return count - end - else - return 0 - end - else - return 0 - end - end, - allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) - if from_list == "input" and to_list == "input" then - return count - elseif from_list == "output" and to_list == "input" then - if not trader_exists(player:get_player_name()) then - return 0 - end - local move_stack = inv:get_stack(from_list, from_index) - if inv:get_stack(to_list, to_index):item_fits(move_stack) then - return count - end - end - return 0 - end, - allow_put = function(inv, listname, index, stack, player) - if listname == "input" then - if not trader_exists(player:get_player_name()) then - return 0 - else - return stack:get_count() - end - else - return 0 - end - end, - on_put = function(inv, listname, index, stack, player) - update_offer(inv, player, true) - end, - on_move = function(inv, from_list, from_index, to_list, to_index, count, player) - if from_list == "output" and to_list == "input" then - inv:remove_item("input", inv:get_stack("wanted", 1)) - local wanted2 = inv:get_stack("wanted", 2) - if not wanted2:is_empty() then - inv:remove_item("input", inv:get_stack("wanted", 2)) - end - minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name()}, true) - end - update_offer(inv, player, true) - end, - on_take = function(inv, listname, index, stack, player) - local accept - local name = player:get_player_name() - if listname == "output" then - local wanted1 = inv:get_stack("wanted", 1) - inv:remove_item("input", wanted1) - local wanted2 = inv:get_stack("wanted", 2) - if not wanted2:is_empty() then - inv:remove_item("input", inv:get_stack("wanted", 2)) - end - -- BEGIN OF SPECIAL HANDLING FOR COMPASS - if wanted1:get_name() == COMPASS then - for n=1, 2 do - local input = inv:get_stack("input", n) - if minetest.get_item_group(input:get_name(), "compass") ~= 0 then - input:set_count(input:get_count() - wanted1:get_count()) - inv:set_stack("input", n, input) - break - end - end - end - -- END OF SPECIAL HANDLING FOR COMPASS - local trader = player_trading_with[name] - local tradenum = player_tradenum[name] - local trades - if trader and trader._trades then - trades = minetest.deserialize(trader._trades) - end - if trades then - local trade = trades[tradenum] - local unlock_stuff = false - if not trade.traded_once then - -- Unlock all the things if something was traded - -- for the first time ever - unlock_stuff = true - trade.traded_once = true - elseif trade.trade_counter == 0 and math.random(1,5) == 1 then - -- Otherwise, 20% chance to unlock if used freshly reset trade - unlock_stuff = true - end - local update_formspec = false - if unlock_stuff then - -- First-time trade unlock all trades and unlock next trade tier - if trade.tier + 1 > trader._max_trade_tier then - trader._max_trade_tier = trader._max_trade_tier + 1 - if trader._max_trade_tier > 5 then - trader._max_trade_tier = 5 - end - set_textures(trader) - update_max_tradenum(trader) - update_formspec = true - end - for t=1, #trades do - trades[t].locked = false - trades[t].trade_counter = 0 - end - trader._locked_trades = 0 - -- Also heal trader for unlocking stuff - -- TODO: Replace by Regeneration I - trader.health = math.min(trader.hp_max, trader.health + 4) - end - trade.trade_counter = trade.trade_counter + 1 - -- Semi-randomly lock trade for repeated trade (not if there's only 1 trade) - if trader._max_tradenum > 1 then - if trade.trade_counter >= 12 then - trade.locked = true - elseif trade.trade_counter >= 2 then - local r = math.random(1, math.random(4, 10)) - if r == 1 then - trade.locked = true - end - end - end - - if trade.locked then - inv:set_stack("output", 1, "") - update_formspec = true - trader._locked_trades = trader._locked_trades + 1 - -- Check if we managed to lock ALL available trades. Rare but possible. - if trader._locked_trades >= trader._max_tradenum then - -- Emergency unlock! Unlock all other trades except the current one - for t=1, #trades do - if t ~= tradenum then - trades[t].locked = false - trades[t].trade_counter = 0 - end - end - trader._locked_trades = 1 - -- Also heal trader for unlocking stuff - -- TODO: Replace by Regeneration I - trader.health = math.min(trader.hp_max, trader.health + 4) - end - end - trader._trades = minetest.serialize(trades) - if update_formspec then - show_trade_formspec(name, trader, tradenum) - end - else - minetest.log("error", "[mobs_mc] Player took item from trader output but player_trading_with or player_tradenum is nil!") - end - - accept = true - elseif listname == "input" then - update_offer(inv, player, false) - end - if accept then - minetest.sound_play("mobs_mc_villager_accept", {to_player = name}, true) - else - minetest.sound_play("mobs_mc_villager_deny", {to_player = name}, true) - end - end, -} - -minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() - player_tradenum[name] = 1 - player_trading_with[name] = nil - - -- Create or get player-specific trading inventory - local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade_"..name}) - if not inv then - inv = minetest.create_detached_inventory("mobs_mc:trade_"..name, trade_inventory, name) - end - inv:set_size("input", 2) - inv:set_size("output", 1) - inv:set_size("wanted", 2) - inv:set_size("offered", 1) -end) - ---[=======[ MOB REGISTRATION AND SPAWNING ]=======] - -local pick_up = { "mcl_farming:bread", "mcl_farming:carrot_item", "mcl_farming:beetroot_item" , "mcl_farming:potato_item" } - -mcl_mobs:register_mob("mobs_mc:villager", { - description = S("Villager"), - type = "npc", - spawn_class = "passive", - hp_min = 20, - hp_max = 20, - collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, - visual = "mesh", - mesh = "mobs_mc_villager.b3d", - textures = { - "mobs_mc_villager.png", - "mobs_mc_villager.png", --hat - }, - visual_size = {x=2.75, y=2.75}, - makes_footstep_sound = true, - walk_velocity = 1.2, - run_velocity = 2.4, - drops = {}, - can_despawn = false, - -- TODO: sounds - sounds = { - random = "mobs_mc_villager", - damage = "mobs_mc_villager_hurt", - distance = 10, - }, - animation = { - stand_speed = 25, - stand_start = 40, - stand_end = 59, - walk_speed = 25, - walk_start = 0, - walk_end = 40, - run_speed = 25, - run_start = 0, - run_end = 40, - head_shake_start = 210, - head_shake_end = 220, - head_shake_loop = false, - head_nod_start = 210, - head_nod_end = 220, - head_nod_loop = false, - }, - follow = pick_up, - nofollow = true, - view_range = 16, - fear_height = 4, - jump = true, - walk_chance = DEFAULT_WALK_CHANCE, - _bed = nil, - _id = nil, - _profession = "unemployed", - look_at_player = true, - pick_up = pick_up, - can_open_doors = true, - on_pick_up = function(self,itementity) - local clicker - for _,p in pairs(minetest.get_connected_players()) do - if vector.distance(p:get_pos(),self.object:get_pos()) < 10 then - clicker = p - end - end - if clicker then - mcl_mobs:feed_tame(self, clicker, 1, true, false) - return - end - return true --do not pick up - end, - on_rightclick = function(self, clicker) - local trg=vector.new(0,9,0) - if self._jobsite then - mcl_mobs:gopath(self,self._jobsite,function() - --minetest.log("arrived at jobsite") - end) - end - if self.child or self._profession == "unemployed" then - return - end - -- Initiate trading - init_trader_vars(self) - local name = clicker:get_player_name() - self._trading_players[name] = true - - if self._trades == nil then - init_trades(self) - end - update_max_tradenum(self) - if self._trades == false then - -- Villager has no trades, rightclick is a no-op - return - end - - player_trading_with[name] = self - - local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade_"..name}) - if not inv then - return - end - - set_trade(self, clicker, inv, 1) - - show_trade_formspec(name, self) - - -- Behaviour stuff: - -- Make villager look at player and stand still - local selfpos = self.object:get_pos() - local clickerpos = clicker:get_pos() - local dir = vector.direction(selfpos, clickerpos) - self.object:set_yaw(minetest.dir_to_yaw(dir)) - stand_still(self) - end, - - _player_scan_timer = 0, - _trading_players = {}, -- list of playernames currently trading with villager (open formspec) - do_custom = function(self, dtime) - -- Stand still if player is nearby. - if not self._player_scan_timer then - self._player_scan_timer = 0 - end - - self._player_scan_timer = self._player_scan_timer + dtime - -- Check infrequently to keep CPU load low - if self._player_scan_timer > PLAYER_SCAN_INTERVAL then - self._player_scan_timer = 0 - local selfpos = self.object:get_pos() - local objects = minetest.get_objects_inside_radius(selfpos, PLAYER_SCAN_RADIUS) - local has_player = false - for o, obj in pairs(objects) do - if obj:is_player() then - has_player = true - break - end - end - if has_player then - minetest.log("verbose", "[mobs_mc] Player near villager found!") - stand_still(self) - else - minetest.log("verbose", "[mobs_mc] No player near villager found!") - self.walk_chance = DEFAULT_WALK_CHANCE - self.jump = true - end - if self._bed and ( self.state ~= "go_home" and vector.distance(self.object:get_pos(),self._bed) > 50 ) then - go_home(self) - end - if self._profession == "unemployed" then - get_a_job(self) - end - end - end, - - on_spawn = function(self) - if self._id then - set_textures(self) - return - end - self._id=minetest.sha1(minetest.get_gametime()..minetest.pos_to_string(self.object:get_pos())..tostring(math.random())) - self._profession = "unemployed" - if math.random(100) == 1 then - self._profession = "nitwit" - end - set_textures(self) - end, - on_die = function(self, pos) - -- Close open trade formspecs and give input back to players - local trading_players = self._trading_players - if trading_players then - for name, _ in pairs(trading_players) do - minetest.close_formspec(name, "mobs_mc:trade_"..name) - local player = minetest.get_player_by_name(name) - if player then - return_fields(player) - end - end - end - end, -}) - - - -mcl_mobs:spawn_specific( -"mobs_mc:villager", -"overworld", -"ground", -{ -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"ColdTaiga", -"SunflowerPlains", -"RoofedForest", -"MesaPlateauFM_grasstop", -"ExtremeHillsM", -"BirchForestM", -}, -0, -minetest.LIGHT_MAX+1, -30, -20, -4, -mobs_mc.water_level+1, -mcl_vars.mg_overworld_max) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:villager", S("Villager"), "mobs_mc_spawn_icon_villager.png", 0) diff --git a/mods/ENTITIES/mobs_mc/villager_evoker.lua b/mods/ENTITIES/mobs_mc/villager_evoker.lua deleted file mode 100644 index 6e62e00b61..0000000000 --- a/mods/ENTITIES/mobs_mc/villager_evoker.lua +++ /dev/null @@ -1,87 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### EVOKER ---################### - -local pr = PseudoRandom(os.time()*666) - -mcl_mobs:register_mob("mobs_mc:evoker", { - description = S("Evoker"), - type = "monster", - spawn_class = "hostile", - physical = true, - pathfinding = 1, - hp_min = 24, - hp_max = 24, - xp_min = 10, - xp_max = 10, - collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.95, 0.4}, - visual = "mesh", - mesh = "mobs_mc_villager.b3d", - textures = { { - "mobs_mc_evoker.png", - "blank.png", --no hat - -- TODO: Attack glow - } }, - visual_size = {x=2.75, y=2.75}, - makes_footstep_sound = true, - damage = 6, - walk_velocity = 0.2, - run_velocity = 1.4, - group_attack = true, - attack_type = "dogfight", - -- Summon vexes - custom_attack = function(self, to_attack) - local r = pr:next(2,4) - local basepos = self.object:get_pos() - basepos.y = basepos.y + 1 - for i=1, r do - local spawnpos = vector.add(basepos, minetest.yaw_to_dir(pr:next(0,360))) - local vex = minetest.add_entity(spawnpos, "mobs_mc:vex") - local ent = vex:get_luaentity() - -- Mark vexes as summoned and start their life clock (they take damage it reaches 0) - ent._summoned = true - ent._lifetimer = pr:next(33, 108) - end - end, - shoot_interval = 15, - passive = false, - drops = { - {name = "mcl_core:emerald", - chance = 1, - min = 0, - max = 1, - looting = "common",}, - {name = "mcl_totems:totem", - chance = 1, - min = 1, - max = 1,}, - }, - -- TODO: sounds - animation = { - stand_speed = 25, - stand_start = 40, - stand_end = 59, - walk_speed = 25, - walk_start = 0, - walk_end = 40, - run_speed = 25, - shoot_start = 120, --magic arm swinging - shoot_end = 140, - die_speed = 15, - die_start = 190, - die_end = 200, - die_loop = false, - }, - view_range = 16, - fear_height = 4, -}) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:evoker", S("Evoker"), "mobs_mc_spawn_icon_evoker.png", 0) diff --git a/mods/ENTITIES/mobs_mc/villager_illusioner.lua b/mods/ENTITIES/mobs_mc/villager_illusioner.lua deleted file mode 100644 index 4af0c4024e..0000000000 --- a/mods/ENTITIES/mobs_mc/villager_illusioner.lua +++ /dev/null @@ -1,64 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") -local mod_bows = minetest.get_modpath("mcl_bows") ~= nil - -mcl_mobs:register_mob("mobs_mc:illusioner", { - description = S("Illusioner"), - type = "monster", - spawn_class = "hostile", - attack_type = "shoot", - shoot_interval = 2.5, - shoot_offset = 1.5, - arrow = "mcl_bows:arrow_entity", - shoot_arrow = function(self, pos, dir) - if mod_bows then - -- 1-4 damage per arrow - local dmg = math.random(1, 4) - mcl_bows.shoot_arrow("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object, nil, dmg) - end - end, - hp_min = 32, - hp_max = 32, - xp_min = 6, - xp_max = 6, - collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, - visual = "mesh", - mesh = "mobs_mc_illusioner.b3d", - textures = { { - "mobs_mc_illusionist.png", - "mobs_mc_illusionist.png", --hat - "mcl_bows_bow.png", - }, }, - sounds = { - -- TODO: more sounds - distance = 16, - }, - visual_size = {x=2.75, y=2.75}, - walk_velocity = 0.6, - run_velocity = 2, - jump = true, - animation = { - stand_speed = 25, - stand_start = 40, - stand_end = 59, - walk_speed = 25, - walk_start = 0, - walk_end = 40, - run_speed = 25, - shoot_start = 150, - shoot_end = 170, - die_speed = 15, - die_start = 170, - die_end = 180, - die_loop = false, - -- 120-140 magic arm swinging, 140-150 transition between magic to bow shooting - }, - view_range = 16, - fear_height = 4, -}) - -mcl_mobs:register_egg("mobs_mc:illusioner", S("Illusioner"), "mobs_mc_spawn_icon_illusioner.png", 0) diff --git a/mods/ENTITIES/mobs_mc/villager_vindicator.lua b/mods/ENTITIES/mobs_mc/villager_vindicator.lua deleted file mode 100644 index 0ed6118997..0000000000 --- a/mods/ENTITIES/mobs_mc/villager_vindicator.lua +++ /dev/null @@ -1,75 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### VINDICATOR ---################### - - -mcl_mobs:register_mob("mobs_mc:vindicator", { - description = S("Vindicator"), - type = "monster", - spawn_class = "hostile", - physical = false, - pathfinding = 1, - hp_min = 24, - hp_max = 24, - xp_min = 6, - xp_max = 6, - collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, - visual = "mesh", - mesh = "mobs_mc_vindicator.b3d", - textures = { - { - "mobs_mc_vindicator.png", - "blank.png", --no hat - "default_tool_steelaxe.png", - -- TODO: Glow when attacking (mobs_mc_vindicator.png) - }, - }, - visual_size = {x=2.75, y=2.75}, - makes_footstep_sound = true, - damage = 13, - reach = 2, - walk_velocity = 1.2, - run_velocity = 2.4, - attack_type = "dogfight", - drops = { - {name = "mcl_core:emerald", - chance = 1, - min = 0, - max = 1, - looting = "common",}, - {name = "mcl_tools:axe_iron", - chance = 100 / 8.5, - min = 1, - max = 1, - looting = "rare",}, - }, - -- TODO: sounds - animation = { - stand_speed = 25, - stand_start = 40, - stand_end = 59, - walk_speed = 25, - walk_start = 0, - walk_end = 40, - run_speed = 25, - punch_speed = 25, - punch_start = 90, - punch_end = 110, - die_speed = 15, - die_start = 170, - die_end = 180, - die_loop = false, - }, - view_range = 16, - fear_height = 4, -}) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:vindicator", S("Vindicator"), "mobs_mc_spawn_icon_vindicator.png", 0) diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mobs_mc/villager_zombie.lua deleted file mode 100644 index 3dece8c29c..0000000000 --- a/mods/ENTITIES/mobs_mc/villager_zombie.lua +++ /dev/null @@ -1,245 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### ZOMBIE VILLAGER ---################### - -local professions = { - farmer = "mobs_mc_villager_farmer.png", - fisherman = "mobs_mc_villager_farmer.png", - fletcher = "mobs_mc_villager_farmer.png", - shepherd = "mobs_mc_villager_farmer.png", - librarian = "mobs_mc_villager_librarian.png", - cartographer = "mobs_mc_villager_librarian.png", - armorer = "mobs_mc_villager_smith.png", - leatherworker = "mobs_mc_villager_butcher.png", - butcher = "mobs_mc_villager_butcher.png", - weapon_smith = "mobs_mc_villager_smith.png", - tool_smith = "mobs_mc_villager_smith.png", - cleric = "mobs_mc_villager_priest.png", - nitwit = "mobs_mc_villager.png", -} - -mcl_mobs:register_mob("mobs_mc:villager_zombie", { - description = S("Zombie Villager"), - type = "monster", - spawn_class = "hostile", - hp_min = 20, - hp_max = 20, - xp_min = 5, - xp_max = 5, - breath_max = -1, - armor = {undead = 90, fleshy = 90}, - collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, - visual = "mesh", - mesh = "mobs_mc_villager_zombie.b3d", - textures = { - {"mobs_mc_empty.png", "mobs_mc_zombie_butcher.png", "mobs_mc_empty.png"}, - {"mobs_mc_empty.png", "mobs_mc_zombie_farmer.png", "mobs_mc_empty.png"}, - {"mobs_mc_empty.png", "mobs_mc_zombie_librarian.png", "mobs_mc_empty.png"}, - {"mobs_mc_empty.png", "mobs_mc_zombie_priest.png", "mobs_mc_empty.png"}, - {"mobs_mc_empty.png", "mobs_mc_zombie_smith.png", "mobs_mc_empty.png"}, - {"mobs_mc_empty.png", "mobs_mc_zombie_villager.png", "mobs_mc_empty.png"}, - }, - visual_size = {x=2.75, y=2.75}, - makes_footstep_sound = true, - damage = 3, - reach = 2, - walk_velocity = 1.2, - run_velocity = 2.4, - attack_type = "dogfight", - group_attack = true, - drops = { - {name = "mcl_mobitems:rotten_flesh", - chance = 1, - min = 0, - max = 2, - looting = "common",}, - {name = "mcl_core:iron_ingot", - chance = 120, -- 2.5% / 3 - min = 1, - max = 1, - looting = "rare", - looting_factor = 0.01 / 3,}, - {name = "mcl_farming:carrot_item", - chance = 120, -- 2.5% / 3 - min = 1, - max = 1, - looting = "rare", - looting_factor = 0.01 / 3,}, - {name = "mcl_farming:potato_item", - chance = 120, -- 2.5% / 3 - min = 1, - max = 1, - looting = "rare", - looting_factor = 0.01 / 3,}, - }, - sounds = { - random = "mobs_mc_zombie_growl", - war_cry = "mobs_mc_zombie_growl", - death = "mobs_mc_zombie_death", - damage = "mobs_mc_zombie_hurt", - distance = 16, - }, - animation = { - speed_normal = 25, - speed_run = 50, - stand_start = 20, - stand_end = 40, - walk_start = 0, - walk_end = 20, - run_start = 0, - run_end = 20, - }, - on_rightclick = function(self, clicker) - if not self._curing and clicker and clicker:is_player() then - local wielditem = clicker:get_wielded_item() - -- ToDo: Only cure if zombie villager has the weakness effect - if wielditem:get_name() == "mcl_core:apple_gold" then - wielditem:take_item() - clicker:set_wielded_item(wielditem) - self._curing = math.random(3 * 60, 5 * 60) - self.shaking = true - end - end - end, - do_custom = function(self, dtime) - if self._curing then - self._curing = self._curing - dtime - local obj = self.object - if self._curing <= 0 then - local villager_obj = minetest.add_entity(obj:get_pos(), "mobs_mc:villager") - local villager = villager_obj:get_luaentity() - local yaw = obj:get_yaw() - villager_obj:set_yaw(yaw) - villager.target_yaw = yaw - villager.nametag = self.nametag - local texture = self.base_texture[1]:gsub("zombie", "villager") - if texture == "mobs_mc_villager_villager.png" then - texture = "mobs_mc_villager.png" - end - local textures = {texture} - villager.base_texture = textures - villager_obj:set_properties({textures = textures}) - local matches = {} - for prof, tex in pairs(professions) do - if texture == tex then - table.insert(matches, prof) - end - end - villager._profession = matches[math.random(#matches)] - self._curing = nil - mcl_burning.extinguish(obj) - obj:remove() - return false - end - end - end, - sunlight_damage = 2, - ignited_by_sunlight = true, - view_range = 16, - fear_height = 4, - harmed_by_heal = true, -}) - -mcl_mobs:spawn_specific( -"mobs_mc:villager_zombie", -"overworld", -"ground", -{ -"FlowerForest_underground", -"JungleEdge_underground", -"StoneBeach_underground", -"MesaBryce_underground", -"Mesa_underground", -"RoofedForest_underground", -"Jungle_underground", -"Swampland_underground", -"MushroomIsland_underground", -"BirchForest_underground", -"Plains_underground", -"MesaPlateauF_underground", -"ExtremeHills_underground", -"MegaSpruceTaiga_underground", -"BirchForestM_underground", -"SavannaM_underground", -"MesaPlateauFM_underground", -"Desert_underground", -"Savanna_underground", -"Forest_underground", -"SunflowerPlains_underground", -"ColdTaiga_underground", -"IcePlains_underground", -"IcePlainsSpikes_underground", -"MegaTaiga_underground", -"Taiga_underground", -"ExtremeHills+_underground", -"JungleM_underground", -"ExtremeHillsM_underground", -"JungleEdgeM_underground", -"Mesa", -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"Jungle", -"Savanna", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"Desert", -"ColdTaiga", -"MushroomIsland", -"IcePlainsSpikes", -"SunflowerPlains", -"IcePlains", -"RoofedForest", -"ExtremeHills+_snowtop", -"MesaPlateauFM_grasstop", -"JungleEdgeM", -"ExtremeHillsM", -"JungleM", -"BirchForestM", -"MesaPlateauF", -"MesaPlateauFM", -"MesaPlateauF_grasstop", -"MesaBryce", -"JungleEdge", -"SavannaM", -"FlowerForest_beach", -"Forest_beach", -"StoneBeach", -"ColdTaiga_beach_water", -"Taiga_beach", -"Savanna_beach", -"Plains_beach", -"ExtremeHills_beach", -"ColdTaiga_beach", -"Swampland_shore", -"MushroomIslandShore", -"JungleM_shore", -"Jungle_shore", -"MesaPlateauFM_sandlevel", -"MesaPlateauF_sandlevel", -"MesaBryce_sandlevel", -"Mesa_sandlevel", -}, -0, -7, -30, -4090, -4, -mcl_vars.mg_overworld_min, -mcl_vars.mg_overworld_max) ---mcl_mobs:spawn_specific("mobs_mc:villager_zombie", "overworld", "ground", 0, 7, 30, 60000, 4, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:villager_zombie", S("Zombie Villager"), "mobs_mc_spawn_icon_zombie_villager.png", 0) diff --git a/mods/ENTITIES/mobs_mc/witch.lua b/mods/ENTITIES/mobs_mc/witch.lua deleted file mode 100644 index f61fdb2d1f..0000000000 --- a/mods/ENTITIES/mobs_mc/witch.lua +++ /dev/null @@ -1,109 +0,0 @@ ---MCmobs v0.2 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### WITCH ---################### - - - - -mcl_mobs:register_mob("mobs_mc:witch", { - description = S("Witch"), - type = "monster", - spawn_class = "hostile", - hp_min = 26, - hp_max = 26, - xp_min = 5, - xp_max = 5, - collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, - visual = "mesh", - mesh = "mobs_mc_witch.b3d", - textures = { - {"mobs_mc_witch.png"}, - }, - visual_size = {x=2.75, y=2.75}, - makes_footstep_sound = true, - damage = 2, - reach = 2, - walk_velocity = 1.2, - run_velocity = 2.4, - pathfinding = 1, - group_attack = true, - attack_type = "dogshoot", - arrow = "mobs_mc:potion_arrow", - shoot_interval = 2.5, - shoot_offset = 1, - dogshoot_switch = 1, - dogshoot_count_max =1.8, - max_drops = 3, - drops = { - {name = "mcl_potions:glass_bottle", chance = 8, min = 0, max = 2, looting = "common",}, - {name = "mcl_nether:glowstone_dust", chance = 8, min = 0, max = 2, looting = "common",}, - {name = "mcl_mobitems:gunpowder", chance = 8, min = 0, max = 2, looting = "common",}, - {name = "mesecons:redstone", chance = 8, min = 0, max = 2, looting = "common",}, - {name = "mcl_mobitems:spider_eye", chance = 8, min = 0, max = 2, looting = "common",}, - {name = "mcl_core:sugar", chance = 8, min = 0, max = 2, looting = "common",}, - {name = "mcl_core:stick", chance = 4, min = 0, max = 2, looting = "common",}, - }, - -- TODO: sounds - animation = { - speed_normal = 30, - speed_run = 60, - stand_start = 0, - stand_end = 0, - walk_start = 0, - walk_end = 40, - run_start = 0, - run_end = 40, - hurt_start = 85, - hurt_end = 115, - death_start = 117, - death_end = 145, - shoot_start = 50, - shoot_end = 82, - }, - view_range = 16, - fear_height = 4, -}) - --- potion projectile (EXPERIMENTAL) -mcl_mobs:register_arrow("mobs_mc:potion_arrow", { - visual = "sprite", - visual_size = {x = 0.5, y = 0.5}, - --textures = {"vessels_glass_bottle.png"}, --TODO fix to else if default - textures = {"mcl_potions_dragon_breath.png"}, - velocity = 6, - - -- direct hit, no fire... just plenty of pain - hit_player = function(self, player) - player:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = 2}, - }, nil) - end, - - hit_mob = function(self, mob) - mob:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = 2}, - }, nil) - end, - - -- node hit, bursts into flame - hit_node = function(self, pos, node) - --TODO - end -}) - --- TODO: Spawn when witch works properly <- eventually -j4i ---mcl_mobs:spawn_specific("mobs_mc:witch", { "mcl_core:jungletree", "mcl_core:jungleleaves", "mcl_flowers:fern", "mcl_core:vine" }, {"air"}, 0, minetest.LIGHT_MAX-6, 12, 20000, 2, mobs_mc.water_level-6, mcl_vars.mg_overworld_max) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:witch", S("Witch"), "mobs_mc_spawn_icon_witch.png", 0, true) - -mcl_wip.register_wip_item("mobs_mc:witch") diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua deleted file mode 100644 index 3b47d07520..0000000000 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ /dev/null @@ -1,120 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### WITHER ---################### - -mcl_mobs:register_mob("mobs_mc:wither", { - description = S("Wither"), - type = "monster", - spawn_class = "hostile", - hp_max = 300, - hp_min = 300, - xp_min = 50, - xp_max = 50, - armor = {undead = 80, fleshy = 100}, - -- This deviates from MC Wiki's size, which makes no sense - collisionbox = {-0.9, 0.4, -0.9, 0.9, 2.45, 0.9}, - visual = "mesh", - mesh = "mobs_mc_wither.b3d", - textures = { - {"mobs_mc_wither.png"}, - }, - visual_size = {x=4, y=4}, - makes_footstep_sound = true, - view_range = 16, - fear_height = 4, - walk_velocity = 2, - run_velocity = 4, - sounds = { - shoot_attack = "mobs_mc_ender_dragon_shoot", - attack = "mobs_mc_ender_dragon_attack", - -- TODO: sounds - distance = 60, - }, - jump = true, - jump_height = 10, - fly = true, - makes_footstep_sound = false, - dogshoot_switch = 1, - dogshoot_count_max =1, - attack_animals = true, - can_despawn = false, - drops = { - {name = "mcl_mobitems:nether_star", - chance = 1, - min = 1, - max = 1}, - }, - lava_damage = 0, - fire_damage = 0, - attack_type = "dogshoot", - explosion_strength = 8, - dogshoot_stop = true, - arrow = "mobs_mc:wither_skull", - reach = 5, - shoot_interval = 0.5, - shoot_offset = -1, - animation = { - walk_speed = 12, run_speed = 12, stand_speed = 12, - stand_start = 0, stand_end = 20, - walk_start = 0, walk_end = 20, - run_start = 0, run_end = 20, - }, - harmed_by_heal = true, - do_custom = function(self) - if self.health < (self.hp_max / 2) then - self.base_texture = "mobs_mc_wither_half_health.png" - self.fly = false - self.object:set_properties({textures={self.base_texture}}) - self.armor = {undead = 80, fleshy = 80} - end - mcl_bossbars.update_boss(self.object, "Wither", "dark_purple") - end, - on_spawn = function(self) - minetest.sound_play("mobs_mc_wither_spawn", {object=self.object, gain=1.0, max_hear_distance=64}) - end, -}) - -local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false - -mcl_mobs:register_arrow("mobs_mc:wither_skull", { - visual = "sprite", - visual_size = {x = 0.75, y = 0.75}, - -- TODO: 3D projectile, replace tetxture - textures = {"mobs_mc_TEMP_wither_projectile.png"}, - velocity = 6, - - -- direct hit - hit_player = function(self, player) - player:punch(self.object, 1.0, { - full_punch_interval = 0.5, - damage_groups = {fleshy = 8}, - }, nil) - mcl_mobs:boom(self, self.object:get_pos(), 1) - end, - - hit_mob = function(self, mob) - mob:punch(self.object, 1.0, { - full_punch_interval = 0.5, - damage_groups = {fleshy = 8}, - }, nil) - mcl_mobs:boom(self, self.object:get_pos(), 1) - end, - - -- node hit, explode - hit_node = function(self, pos, node) - mcl_mobs:boom(self, pos, 1) - end -}) --- TODO: Add blue wither skull - ---Spawn egg -mcl_mobs:register_egg("mobs_mc:wither", S("Wither"), "mobs_mc_spawn_icon_wither.png", 0, true) - -mcl_wip.register_wip_item("mobs_mc:wither") diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua deleted file mode 100644 index f2232c3971..0000000000 --- a/mods/ENTITIES/mobs_mc/wolf.lua +++ /dev/null @@ -1,267 +0,0 @@ ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - -local default_walk_chance = 50 - -local pr = PseudoRandom(os.time()*10) - --- Wolf -local wolf = { - description = S("Wolf"), - type = "animal", - spawn_class = "passive", - can_despawn = true, - hp_min = 8, - hp_max = 8, - xp_min = 1, - xp_max = 3, - passive = false, - group_attack = true, - collisionbox = {-0.3, -0.01, -0.3, 0.3, 0.84, 0.3}, - visual = "mesh", - mesh = "mobs_mc_wolf.b3d", - textures = { - {"mobs_mc_wolf.png"}, - }, - visual_size = {x=3, y=3}, - makes_footstep_sound = true, - sounds = { - attack = "mobs_mc_wolf_bark", - war_cry = "mobs_mc_wolf_growl", - damage = {name = "mobs_mc_wolf_hurt", gain=0.6}, - death = {name = "mobs_mc_wolf_death", gain=0.6}, - eat = "mobs_mc_animal_eat_generic", - distance = 16, - }, - pathfinding = 1, - floats = 1, - view_range = 16, - walk_chance = default_walk_chance, - walk_velocity = 2, - run_velocity = 3, - damage = 4, - reach = 2, - attack_type = "dogfight", - fear_height = 4, - follow = { "mcl_mobitems:bone" }, - on_rightclick = function(self, clicker) - -- Try to tame wolf (intentionally does NOT use mcl_mobs:feed_tame) - local tool = clicker:get_wielded_item() - - local dog, ent - if tool:get_name() == "mcl_mobitems:bone" then - - minetest.sound_play("mobs_mc_wolf_take_bone", {object=self.object, max_hear_distance=16}, true) - if not minetest.is_creative_enabled(clicker:get_player_name()) then - tool:take_item() - clicker:set_wielded_item(tool) - end - -- 1/3 chance of getting tamed - if pr:next(1, 3) == 1 then - local yaw = self.object:get_yaw() - dog = minetest.add_entity(self.object:get_pos(), "mobs_mc:dog") - dog:set_yaw(yaw) - ent = dog:get_luaentity() - ent.owner = clicker:get_player_name() - -- cornfirm taming - minetest.sound_play("mobs_mc_wolf_bark", {object=dog, max_hear_distance=16}, true) - -- Replace wolf - self.object:remove() - end - end - end, - animation = { - speed_normal = 50, speed_run = 100, - stand_start = 40, stand_end = 45, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, - }, - jump = true, - attacks_monsters = true, - attack_animals = true, - specific_attack = { "player", "mobs_mc:sheep" }, -} - -mcl_mobs:register_mob("mobs_mc:wolf", wolf) - --- Tamed wolf - --- Collar colors -local colors = { - ["unicolor_black"] = "#000000", - ["unicolor_blue"] = "#0000BB", - ["unicolor_dark_orange"] = "#663300", -- brown - ["unicolor_cyan"] = "#01FFD8", - ["unicolor_dark_green"] = "#005B00", - ["unicolor_grey"] = "#C0C0C0", - ["unicolor_darkgrey"] = "#303030", - ["unicolor_green"] = "#00FF01", - ["unicolor_red_violet"] = "#FF05BB", -- magenta - ["unicolor_orange"] = "#FF8401", - ["unicolor_light_red"] = "#FF65B5", -- pink - ["unicolor_red"] = "#FF0000", - ["unicolor_violet"] = "#5000CC", - ["unicolor_white"] = "#FFFFFF", - ["unicolor_yellow"] = "#FFFF00", - - ["unicolor_light_blue"] = "#B0B0FF", -} - -local get_dog_textures = function(color) - if colors[color] then - return {"mobs_mc_wolf_tame.png^(mobs_mc_wolf_collar.png^[colorize:"..colors[color]..":192)"} - else - return nil - end -end - --- Tamed wolf (aka “dog”) -local dog = table.copy(wolf) -dog.can_despawn = false -dog.passive = true -dog.hp_min = 20 -dog.hp_max = 20 --- Tamed wolf texture + red collar -dog.textures = get_dog_textures("unicolor_red") -dog.owner = "" --- TODO: Start sitting by default -dog.order = "roam" -dog.owner_loyal = true -dog.follow_velocity = 3.2 --- Automatically teleport dog to owner -dog.do_custom = mobs_mc.make_owner_teleport_function(12) -dog.follow = { - "mcl_mobitems:rabbit", "mcl_mobitems:cooked_rabbit", - "mcl_mobitems:mutton", "mcl_mobitems:cooked_mutton", - "mcl_mobitems:beef", "mcl_mobitems:cooked_beef", - "mcl_mobitems:chicken", "mcl_mobitems:cooked_chicken", - "mcl_mobitems:porkchop", "mcl_mobitems:cooked_porkchop", - "mcl_mobitems:rotten_flesh", -} -dog.attack_animals = nil -dog.specific_attack = nil - -local is_food = function(itemstring) - return table.indexof(dog.follow, itemstring) ~= -1 -end - -dog.on_rightclick = function(self, clicker) - local item = clicker:get_wielded_item() - - if mcl_mobs:protect(self, clicker) then - return - elseif item:get_name() ~= "" and mcl_mobs:capture_mob(self, clicker, 0, 2, 80, false, nil) then - return - elseif is_food(item:get_name()) then - -- Feed to increase health - local hp = self.health - local hp_add = 0 - -- Use eatable group to determine health boost - local eatable = minetest.get_item_group(item, "eatable") - if eatable > 0 then - hp_add = eatable - elseif item:get_name() == "mcl_mobitems:rotten_flesh" then - hp_add = 4 - else - hp_add = 4 - end - local new_hp = hp + hp_add - if new_hp > self.hp_max then - new_hp = self.hp_max - end - if not minetest.is_creative_enabled(clicker:get_player_name()) then - item:take_item() - clicker:set_wielded_item(item) - end - self.health = new_hp - return - elseif minetest.get_item_group(item:get_name(), "dye") == 1 then - -- Dye (if possible) - for group, _ in pairs(colors) do - -- Check if color is supported - if minetest.get_item_group(item:get_name(), group) == 1 then - -- Dye collar - local tex = get_dog_textures(group) - if tex then - self.base_texture = tex - self.object:set_properties({ - textures = self.base_texture - }) - if not minetest.is_creative_enabled(clicker:get_player_name()) then - item:take_item() - clicker:set_wielded_item(item) - end - break - end - end - end - else - -- Toggle sitting order - - if not self.owner or self.owner == "" then - -- Huh? This wolf has no owner? Let's fix this! This should never happen. - self.owner = clicker:get_player_name() - end - - local pos = self.object:get_pos() - local particle - if not self.order or self.order == "" or self.order == "sit" then - particle = "mobs_mc_wolf_icon_roam.png" - self.order = "roam" - self.walk_chance = default_walk_chance - self.jump = true - -- TODO: Add sitting model - else - particle = "mobs_mc_wolf_icon_sit.png" - self.order = "sit" - self.walk_chance = 0 - self.jump = false - end - -- Display icon to show current order (sit or roam) - minetest.add_particle({ - pos = vector.add(pos, {x=0,y=1,z=0}), - velocity = {x=0,y=0.2,z=0}, - expirationtime = 1, - size = 4, - texture = particle, - playername = self.owner, - glow = minetest.LIGHT_MAX, - }) - end -end - -mcl_mobs:register_mob("mobs_mc:dog", dog) - --- Spawn -mcl_mobs:spawn_specific( -"mobs_mc:wolf", -"overworld", -"ground", -{ -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"ColdTaiga", -"SunflowerPlains", -"RoofedForest", -"MesaPlateauFM_grasstop", -"ExtremeHillsM", -"BirchForestM", -}, -0, -minetest.LIGHT_MAX+1, -30, -9000, -7, -mobs_mc.water_level+3, -mcl_vars.mg_overworld_max) - -mcl_mobs:register_egg("mobs_mc:wolf", S("Wolf"), "mobs_mc_spawn_icon_wolf.png", 0) diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua deleted file mode 100644 index 640b2ed11c..0000000000 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ /dev/null @@ -1,368 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### ZOMBIE ---################### - -local drops_common = { - {name = "mcl_mobitems:rotten_flesh", - chance = 1, - min = 0, - max = 2, - looting = "common",}, - {name = "mcl_core:iron_ingot", - chance = 120, -- 2.5% / 3 - min = 1, - max = 1, - looting = "rare", - looting_factor = 0.01 / 3,}, - {name = "mcl_farming:carrot_item", - chance = 120, -- 2.5% / 3 - min = 1, - max = 1, - looting = "rare", - looting_factor = 0.01 / 3,}, - {name = "mcl_farming:potato_item", - chance = 120, -- 2.5% / 3 - min = 1, - max = 1, - looting = "rare", - looting_factor = 0.01 / 3,}, -} - -local drops_zombie = table.copy(drops_common) -table.insert(drops_zombie, { - -- Zombie Head - -- TODO: Only drop if killed by charged creeper - name = "mcl_heads:zombie", - chance = 200, -- 0.5% - min = 1, - max = 1, -}) - -local zombie = { - description = S("Zombie"), - type = "monster", - spawn_class = "hostile", - hp_min = 20, - hp_max = 20, - xp_min = 5, - xp_max = 5, - breath_max = -1, - armor = {undead = 90, fleshy = 90}, - collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, - visual = "mesh", - mesh = "mobs_mc_zombie.b3d", - textures = { - { - "mobs_mc_empty.png", -- armor - "mobs_mc_zombie.png", -- texture - "mobs_mc_empty.png", -- wielded_item - } - }, - visual_size = {x=3, y=3}, - makes_footstep_sound = true, - sounds = { - random = "mobs_mc_zombie_growl", - war_cry = "mobs_mc_zombie_growl", - death = "mobs_mc_zombie_death", - damage = "mobs_mc_zombie_hurt", - distance = 16, - }, - walk_velocity = .8, - run_velocity = 1.6, - damage = 3, - reach = 2, - fear_height = 4, - pathfinding = 1, - jump = true, - jump_height = 4, - group_attack = { "mobs_mc:zombie", "mobs_mc:baby_zombie", "mobs_mc:husk", "mobs_mc:baby_husk" }, - drops = drops_zombie, - animation = { - speed_normal = 25, speed_run = 50, - stand_start = 40, stand_end = 80, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, - }, - ignited_by_sunlight = true, - sunlight_damage = 2, - view_range = 16, - attack_type = "dogfight", - harmed_by_heal = true, -} - -mcl_mobs:register_mob("mobs_mc:zombie", zombie) - --- Baby zombie. --- A smaller and more dangerous variant of the zombie - -local baby_zombie = table.copy(zombie) -baby_zombie.description = S("Baby Zombie") -baby_zombie.collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.94, 0.25} -baby_zombie.xp_min = 12 -baby_zombie.xp_max = 12 -baby_zombie.visual_size = {x=zombie.visual_size.x/2, y=zombie.visual_size.y/2} -baby_zombie.walk_velocity = 1.2 -baby_zombie.run_velocity = 2.4 -baby_zombie.child = 1 - -mcl_mobs:register_mob("mobs_mc:baby_zombie", baby_zombie) - --- Husk. --- Desert variant of the zombie -local husk = table.copy(zombie) -husk.description = S("Husk") -husk.textures = { - { - "mobs_mc_empty.png", -- armor - "mobs_mc_husk.png", -- texture - "mobs_mc_empty.png", -- wielded_item - } - } -husk.ignited_by_sunlight = false -husk.sunlight_damage = 0 -husk.drops = drops_common --- TODO: Husks avoid water - -mcl_mobs:register_mob("mobs_mc:husk", husk) - --- Baby husk. --- A smaller and more dangerous variant of the husk -local baby_husk = table.copy(husk) -baby_husk.description = S("Baby Husk") -baby_husk.collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.94, 0.25} -baby_husk.xp_min = 12 -baby_husk.xp_max = 12 -baby_husk.visual_size = {x=zombie.visual_size.x/2, y=zombie.visual_size.y/2} -baby_husk.walk_velocity = 1.2 -baby_husk.run_velocity = 2.4 -baby_husk.child = 1 - -mcl_mobs:register_mob("mobs_mc:baby_husk", baby_husk) - - --- Spawning - -mcl_mobs:spawn_specific( -"mobs_mc:zombie", -"overworld", -"ground", -{ -"FlowerForest_underground", -"JungleEdge_underground", -"StoneBeach_underground", -"MesaBryce_underground", -"Mesa_underground", -"RoofedForest_underground", -"Jungle_underground", -"Swampland_underground", -"MushroomIsland_underground", -"BirchForest_underground", -"Plains_underground", -"MesaPlateauF_underground", -"ExtremeHills_underground", -"MegaSpruceTaiga_underground", -"BirchForestM_underground", -"SavannaM_underground", -"MesaPlateauFM_underground", -"Desert_underground", -"Savanna_underground", -"Forest_underground", -"SunflowerPlains_underground", -"ColdTaiga_underground", -"IcePlains_underground", -"IcePlainsSpikes_underground", -"MegaTaiga_underground", -"Taiga_underground", -"ExtremeHills+_underground", -"JungleM_underground", -"ExtremeHillsM_underground", -"JungleEdgeM_underground", -"Mesa", -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"Jungle", -"Savanna", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"ColdTaiga", -"MushroomIsland", -"IcePlainsSpikes", -"SunflowerPlains", -"IcePlains", -"RoofedForest", -"ExtremeHills+_snowtop", -"MesaPlateauFM_grasstop", -"JungleEdgeM", -"ExtremeHillsM", -"JungleM", -"BirchForestM", -"MesaPlateauF", -"MesaPlateauFM", -"MesaPlateauF_grasstop", -"MesaBryce", -"JungleEdge", -"SavannaM", -"FlowerForest_beach", -"Forest_beach", -"StoneBeach", -"ColdTaiga_beach_water", -"Taiga_beach", -"Savanna_beach", -"Plains_beach", -"ExtremeHills_beach", -"ColdTaiga_beach", -"Swampland_shore", -"MushroomIslandShore", -"JungleM_shore", -"Jungle_shore", -"MesaPlateauFM_sandlevel", -"MesaPlateauF_sandlevel", -"MesaBryce_sandlevel", -"Mesa_sandlevel", -}, -0, -7, -30, -6000, -4, -mcl_vars.mg_overworld_min, -mcl_vars.mg_overworld_max) --- Baby zombie is 20 times less likely than regular zombies -mcl_mobs:spawn_specific( -"mobs_mc:baby_zombie", -"overworld", -"ground", -{ -"FlowerForest_underground", -"JungleEdge_underground", -"StoneBeach_underground", -"MesaBryce_underground", -"Mesa_underground", -"RoofedForest_underground", -"Jungle_underground", -"Swampland_underground", -"MushroomIsland_underground", -"BirchForest_underground", -"Plains_underground", -"MesaPlateauF_underground", -"ExtremeHills_underground", -"MegaSpruceTaiga_underground", -"BirchForestM_underground", -"SavannaM_underground", -"MesaPlateauFM_underground", -"Desert_underground", -"Savanna_underground", -"Forest_underground", -"SunflowerPlains_underground", -"ColdTaiga_underground", -"IcePlains_underground", -"IcePlainsSpikes_underground", -"MegaTaiga_underground", -"Taiga_underground", -"ExtremeHills+_underground", -"JungleM_underground", -"ExtremeHillsM_underground", -"JungleEdgeM_underground", -"Mesa", -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"Jungle", -"Savanna", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"ColdTaiga", -"MushroomIsland", -"IcePlainsSpikes", -"SunflowerPlains", -"IcePlains", -"RoofedForest", -"ExtremeHills+_snowtop", -"MesaPlateauFM_grasstop", -"JungleEdgeM", -"ExtremeHillsM", -"JungleM", -"BirchForestM", -"MesaPlateauF", -"MesaPlateauFM", -"MesaPlateauF_grasstop", -"MesaBryce", -"JungleEdge", -"SavannaM", -"FlowerForest_beach", -"Forest_beach", -"StoneBeach", -"ColdTaiga_beach_water", -"Taiga_beach", -"Savanna_beach", -"Plains_beach", -"ExtremeHills_beach", -"ColdTaiga_beach", -"Swampland_shore", -"MushroomIslandShore", -"JungleM_shore", -"Jungle_shore", -"MesaPlateauFM_sandlevel", -"MesaPlateauF_sandlevel", -"MesaBryce_sandlevel", -"Mesa_sandlevel", -}, -0, -7, -30, -60000, -4, -mcl_vars.mg_overworld_min, -mcl_vars.mg_overworld_max) - - -mcl_mobs:spawn_specific( -"mobs_mc:husk", -"overworld", -"ground", -{ -"Desert", -}, -0, -7, -30, -6500, -4, -mcl_vars.mg_overworld_min, -mcl_vars.mg_overworld_max) -mcl_mobs:spawn_specific( -"mobs_mc:baby_husk", -"overworld", -"ground", -{ -"Desert", -}, -0, -7, -30, -65000, -4, -mcl_vars.mg_overworld_min, -mcl_vars.mg_overworld_max) - --- Spawn eggs -mcl_mobs:register_egg("mobs_mc:husk", S("Husk"), "mobs_mc_spawn_icon_husk.png", 0) -mcl_mobs:register_egg("mobs_mc:zombie", S("Zombie"), "mobs_mc_spawn_icon_zombie.png", 0) diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mobs_mc/zombiepig.lua deleted file mode 100644 index 3d0b4f1833..0000000000 --- a/mods/ENTITIES/mobs_mc/zombiepig.lua +++ /dev/null @@ -1,150 +0,0 @@ ---MCmobs v0.4 ---maikerumine ---made for MC like Survival game ---License for code WTFPL and otherwise stated in readmes - -local S = minetest.get_translator("mobs_mc") - ---################### ---################### ZOMBIE PIGMAN ---################### - - -local pigman = { - description = S("Zombie Pigman"), - -- type="animal", passive=false: This combination is needed for a neutral mob which becomes hostile, if attacked - type = "animal", - passive = false, - spawn_class = "passive", - hp_min = 20, - hp_max = 20, - xp_min = 6, - xp_max = 6, - armor = {undead = 90, fleshy = 90}, - attack_type = "dogfight", - group_attack = { "mobs_mc:pigman", "mobs_mc:baby_pigman" }, - damage = 9, - reach = 2, - collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, - visual = "mesh", - mesh = "mobs_mc_zombie_pigman.b3d", - textures = { { - "blank.png", --baby - "default_tool_goldsword.png", --sword - "mobs_mc_zombie_pigman.png", --pigman - } }, - visual_size = {x=3, y=3}, - sounds = { - random = "mobs_mc_zombiepig_random", - war_cry = "mobs_mc_zombiepig_war_cry", - death = "mobs_mc_zombiepig_death", - damage = "mobs_mc_zombiepig_hurt", - distance = 16, - }, - jump = true, - makes_footstep_sound = true, - walk_velocity = .8, - run_velocity = 2.6, - pathfinding = 1, - drops = { - {name = "mcl_mobitems:rotten_flesh", - chance = 1, - min = 1, - max = 1, - looting = "common"}, - {name = "mcl_core:gold_nugget", - chance = 1, - min = 0, - max = 1, - looting = "common"}, - {name = "mcl_core:gold_ingot", - chance = 40, -- 2.5% - min = 1, - max = 1, - looting = "rare"}, - {name = "mcl_tools:sword_gold", - chance = 100 / 8.5, - min = 1, - max = 1, - looting = "rare"}, - }, - animation = { - stand_speed = 25, - walk_speed = 25, - run_speed = 50, - stand_start = 40, - stand_end = 80, - walk_start = 0, - walk_end = 40, - run_start = 0, - run_end = 40, - punch_start = 90, - punch_end = 130, - }, - lava_damage = 0, - fire_damage = 0, - fear_height = 4, - view_range = 16, - harmed_by_heal = true, - fire_damage_resistant = true, -} - -mcl_mobs:register_mob("mobs_mc:pigman", pigman) - --- Baby pigman. --- A smaller and more dangerous variant of the pigman - -local baby_pigman = table.copy(pigman) -baby_pigman.description = S("Baby Zombie Pigman") -baby_pigman.collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.94, 0.25} -baby_pigman.xp_min = 13 -baby_pigman.xp_max = 13 -baby_pigman.visual_size = {x=pigman.visual_size.x/2, y=pigman.visual_size.y/2} -baby_pigman.textures = { { - "mobs_mc_zombie_pigman.png", --baby - "default_tool_goldsword.png", --sword - "mobs_mc_zombie_pigman.png", --pigman -} } -baby_pigman.walk_velocity = 1.2 -baby_pigman.run_velocity = 2.4 -baby_pigman.light_damage = 0 -baby_pigman.child = 1 - -mcl_mobs:register_mob("mobs_mc:baby_pigman", baby_pigman) - --- Regular spawning in the Nether -mcl_mobs:spawn_specific( -"mobs_mc:pigman", -"nether", -"ground", -{ -"Nether" -}, -0, -minetest.LIGHT_MAX+1, -30, -6000, -3, -mcl_vars.mg_nether_min, -mcl_vars.mg_nether_max) --- Baby zombie is 20 times less likely than regular zombies -mcl_mobs:spawn_specific( -"mobs_mc:baby_pigman", -"nether", -"ground", -{ -"Nether" -}, -0, -minetest.LIGHT_MAX+1, -30, -100000, -4, -mcl_vars.mg_nether_min, -mcl_vars.mg_nether_max) - --- Spawning in Nether portals in the Overworld ---mobs:spawn_specific("mobs_mc:pigman", {"mcl_portals:portal"}, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 500, 4, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) - --- spawn eggs -mcl_mobs:register_egg("mobs_mc:pigman", S("Zombie Pigman"), "mobs_mc_spawn_icon_zombie_pigman.png", 0) diff --git a/mods/HUD/awards/LICENSE.txt b/mods/HUD/awards/LICENSE.txt deleted file mode 100644 index 4362b49151..0000000000 --- a/mods/HUD/awards/LICENSE.txt +++ /dev/null @@ -1,502 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -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 this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. 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 not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -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 -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the 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 -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "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 -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY 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 -LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey 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 library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/mods/HUD/awards/api.lua b/mods/HUD/awards/api.lua deleted file mode 100644 index 49b11a6cf0..0000000000 --- a/mods/HUD/awards/api.lua +++ /dev/null @@ -1,546 +0,0 @@ --- AWARDS --- --- Copyright (C) 2013-2015 rubenwardy --- 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 modname = minetest.get_current_modname() -local modpath = minetest.get_modpath(modname) -local S = minetest.get_translator(modname) - --- The global award namespace -awards = { - show_mode = "hud", -} - -dofile(modpath.."/api_helpers.lua") - --- Table Save Load Functions -function awards.save() - local file = io.open(minetest.get_worldpath().."/awards.txt", "w") - if file then - file:write(minetest.serialize(awards.players)) - file:close() - end -end - -function awards.init() - awards.players = awards.load() - awards.def = {} - awards.trigger_types = {} - awards.on = {} - awards.on_unlock = {} -end - -function awards.load() - local file = io.open(minetest.get_worldpath().."/awards.txt", "r") - if file then - local table = minetest.deserialize(file:read("*all")) - if type(table) == "table" then - return table - end - end - return {} -end - -function awards.register_trigger(name, func) - awards.trigger_types[name] = func - awards.on[name] = {} - awards["register_on_"..name] = function(func) - table.insert(awards.on[name], func) - end -end - -function awards.run_trigger_callbacks(player, data, trigger, table_func) - for i = 1, #awards.on[trigger] do - local res = nil - local entry = awards.on[trigger][i] - if type(entry) == "function" then - res = entry(player, data) - elseif type(entry) == "table" and entry.award then - res = table_func(entry) - end - - if res then - awards.unlock(player:get_player_name(), res) - end - end -end - -function awards.increment_item_counter(data, field, itemname, count) - local name_split = string.split(itemname, ":") - if #name_split ~= 2 then - return false - end - local mod = name_split[1] - local item = name_split[2] - - if data and field and mod and item then - awards.assertPlayer(data) - awards.tbv(data, field) - awards.tbv(data[field], mod) - awards.tbv(data[field][mod], item, 0) - - data[field][mod][item] = data[field][mod][item] + (count or 1) - return true - else - return false - end -end - -function awards.get_item_count(data, field, itemname) - local name_split = string.split(itemname, ":") - if #name_split ~= 2 then - return false - end - local mod = name_split[1] - local item = name_split[2] - - if data and field and mod and item then - awards.assertPlayer(data) - awards.tbv(data, field) - awards.tbv(data[field], mod) - awards.tbv(data[field][mod], item, 0) - return data[field][mod][item] - end -end - -function awards.get_total_item_count(data, field) - local i = 0 - if data and field then - awards.assertPlayer(data) - awards.tbv(data, field) - for mod,_ in pairs(data[field]) do - awards.tbv(data[field], mod) - for item,_ in pairs(data[field][mod]) do - awards.tbv(data[field][mod], item, 0) - i = i + data[field][mod][item] - end - end - end - return i -end - -function awards.register_on_unlock(func) - table.insert(awards.on_unlock, func) -end - --- API Functions -function awards._additional_triggers(name, def) - -- Depreciated! -end - -function awards.register_achievement(name, def) - def.name = name - - -- Add Triggers - if def.trigger and def.trigger.type then - local func = awards.trigger_types[def.trigger.type] - - if func then - func(def) - else - awards._additional_triggers(name, def) - end - end - - -- Add Award - awards.def[name] = def - - local tdef = awards.def[name] - if def.description == nil and tdef.getDefaultDescription then - def.description = tdef:getDefaultDescription() - end -end - -function awards.enable(name) - local data = awards.player(name) - if data then - data.disabled = nil - end -end - -function awards.disable(name) - local data = awards.player(name) - if data then - data.disabled = true - end -end - -function awards.clear_player(name) - awards.players[name] = {} -end - --- Returns true if award exists, false otherwise -function awards.exists(award) - return awards.def[award] ~= nil -end - --- This function is called whenever a target condition is met. --- It checks if a player already has that achievement, and if they do not, --- it gives it to them ----------------------------------------------- ---awards.unlock(name, award) --- name - the name of the player --- award - the name of the award to give -function awards.unlock(name, award) - -- Access Player Data - local data = awards.players[name] - local awdef = awards.def[award] - - -- Perform checks - if not data then - return - end - if not awdef then - return - end - if data.disabled then - return - end - awards.tbv(data,"unlocked") - - -- Don't give the achievement if it has already been given - if data.unlocked[award] and data.unlocked[award] == award then - return - end - - -- Get award - minetest.log("action", name.." has gotten award "..award) - minetest.chat_send_all(S("@1 has made the achievement @2", name, minetest.colorize(mcl_colors.GREEN, "[" .. (awdef.title or award) .. "]"))) - data.unlocked[award] = award - awards.save() - - -- Give Prizes - if awdef and awdef.prizes then - for i = 1, #awdef.prizes do - local itemstack = ItemStack(awdef.prizes[i]) - if not itemstack:is_empty() then - local receiverref = minetest.get_player_by_name(name) - if receiverref then - receiverref:get_inventory():add_item("main", itemstack) - end - end - end - end - - -- Run callbacks - if awdef.on_unlock and awdef.on_unlock(name, awdef) then - return - end - for _, callback in pairs(awards.on_unlock) do - if callback(name, awdef) then - return - end - end - - -- Get Notification Settings - local title = awdef.title or award - local desc = awdef.description or "" - local background = awdef.background or "awards_bg_default.png" - local icon = awdef.icon or "awards_unknown.png" - local sound = awdef.sound - if sound == nil then - -- Explicit check for nil because sound could be `false` to disable it - sound = {name="awards_got_generic", gain=0.25} - end - local custom_announce = awdef.custom_announce - if not custom_announce then - if awdef.secret then - custom_announce = S("Secret achievement gotten:") - else - custom_announce = S("Achievement gotten:") - end - end - - -- Do Notification - if sound then - -- Enforce sound delay to prevent sound spamming - local lastsound = awards.players[name].lastsound - if lastsound == nil or os.difftime(os.time(), lastsound) >= 1 then - minetest.sound_play(sound, {to_player=name}, true) - awards.players[name].lastsound = os.time() - end - end - - if awards.show_mode == "formspec" then - -- use a formspec to send it - minetest.show_formspec(name, "achievements:unlocked", "size[4,2]".. - "image_button_exit[0,0;4,2;"..background..";close1; ]".. - "image_button_exit[0.2,0.8;1,1;"..icon..";close2; ]".. - "label[1.1,1;"..title.."]".. - "label[0.3,0.1;"..custom_announce.."]") - elseif awards.show_mode == "chat" then - local chat_announce - if awdef.secret == true then - chat_announce = S("Secret achievement gotten: @1") - else - chat_announce = S("Achievement gotten: @1") - end - -- use the chat console to send it - minetest.chat_send_player(name, string.format(chat_announce, title)) - if desc~="" then - minetest.chat_send_player(name, desc) - end - else - local player = minetest.get_player_by_name(name) - local one = player:hud_add({ - hud_elem_type = "image", - name = "award_bg", - scale = {x = 1, y = 1}, - text = background, - position = {x = 0.5, y = 0}, - offset = {x = 0, y = 138}, - alignment = {x = 0, y = -1}, - z_index = 101, - }) - local hud_announce - if awdef.secret == true then - hud_announce = S("Secret achievement gotten!") - else - hud_announce = S("Achievement gotten!") - end - local two = player:hud_add({ - hud_elem_type = "text", - name = "award_au", - number = 0xFFFF00, - scale = {x = 100, y = 20}, - text = hud_announce, - position = {x = 0.5, y = 0}, - offset = {x = 0, y = 40}, - alignment = {x = 0, y = -1}, - z_index = 102, - }) - local three = player:hud_add({ - hud_elem_type = "text", - name = "award_title", - number = 0xFFFFFF, - scale = {x = 100, y = 20}, - text = title, - position = {x = 0.5, y = 0}, - offset = {x = 30, y = 100}, - alignment = {x = 0, y = -1}, - z_index = 102, - }) - --[[ We use a statbar instead of image here because statbar allows us to scale the image - properly. Note that number is 2, thus leading to a single full image. - Yes, it's a hack, but it works for all texture sizes and is needed because the image - type does NOT allow us a simple scaling. ]] - local four = player:hud_add({ - hud_elem_type = "statbar", - name = "award_icon", - size = {x=64, y = 64}, - number = 2, - text = icon, - position = {x = 0.5, y = 0}, - offset = {x = -110, y = 62}, - alignment = {x = 0, y = 0}, - direction = 0, - z_index = 102, - }) - minetest.after(3, function(name) - local player = minetest.get_player_by_name(name) - if not player then - return - end - player:hud_remove(one) - player:hud_remove(two) - player:hud_remove(three) - player:hud_remove(four) - end, player:get_player_name()) - end -end - --- Backwards compatibility -awards.give_achievement = awards.unlock - ---[[minetest.register_chatcommand("gawd", { - params = "award name", - description = "gawd: give award to self", - func = function(name, param) - awards.unlock(name,param) - end -})]]-- - -function awards.getFormspec(name, to, sid) - local formspec = "" - local listofawards = awards._order_awards(name) - local playerdata = awards.players[name] - - if #listofawards == 0 then - formspec = formspec .. "label[3.9,1.5;"..minetest.formspec_escape(S("Error: No awards available.")).."]" - formspec = formspec .. "button_exit[4.2,2.3;3,1;close;"..minetest.formspec_escape(S("OK")).."]" - return formspec - end - - -- Sidebar - if sid then - local item = listofawards[sid+0] - local def = awards.def[item.name] - - if def and def.secret and not item.got then - formspec = formspec .. "label[1,2.75;"..minetest.formspec_escape(S("(Secret achievement)")).."]".. - "image[1,0;3,3;awards_unknown.png]" - if def and def.description then - formspec = formspec .. "textarea[0.25,3.25;4.8,1.7;;"..minetest.formspec_escape(S("Get this achievement to find out what it is."))..";]" - end - else - local title = item.name - if def and def.title then - title = def.title - end - local status - if item.got then - status = S("@1 (got)", title) - else - status = title - end - formspec = formspec .. "label[1,2.75;" .. - minetest.formspec_escape(status) .. - "]" - if def and def.icon then - formspec = formspec .. "image[1,0;3,3;" .. def.icon .. "]" - end - local barwidth = 4.6 - local perc = nil - local label = nil - if def.getProgress and playerdata then - local res = def:getProgress(playerdata) - perc = res.perc - label = res.label - end - if perc then - if perc > 1 then - perc = 1 - end - formspec = formspec .. "background[0,4.80;" .. barwidth ..",0.3;awards_progress_gray.png;false]" - if perc > 0 then - formspec = formspec .. "background[0,4.80;" .. (barwidth * perc) ..",0.3;awards_progress_green.png;false]" - end - if label then - formspec = formspec .. "label[1.75,4.63;" .. minetest.formspec_escape(label) .. "]" - end - end - if def and def.description then - formspec = formspec .. "textarea[0.25,3.25;4.8,1.7;;"..minetest.formspec_escape(def.description)..";]" - end - end - end - - -- Create list box - formspec = formspec .. - "textlist[4.75,0;6,5;awards;" - local first = true - for _,award in pairs(listofawards) do - local def = awards.def[award.name] - if def then - if not first then - formspec = formspec .. "," - end - first = false - - if def.secret and not award.got then - formspec = formspec .. "#707070" .. minetest.formspec_escape(S("(Secret Award)")) - else - local title = award.name - if def and def.title then - title = def.title - end - if award.got then - formspec = formspec .. minetest.formspec_escape(title) - else - formspec = formspec .. "#ACACAC" .. minetest.formspec_escape(title) - end - end - end - end - return formspec .. ";"..sid.."]" -end - -function awards.show_to(name, to, sid, text) - if name == "" or name == nil then - name = to - end - if name == to and awards.player(to).disabled then - minetest.chat_send_player(S("You've disabled awards. Type /awards enable to reenable.")) - return - end - if text then - local listofawards = awards._order_awards(name) - if #listofawards == 0 then - minetest.chat_send_player(to, S("Error: No awards available.")) - return - elseif not awards.players[name] or not awards.players[name].unlocked then - minetest.chat_send_player(to, S("You have not gotten any awards.")) - return - end - minetest.chat_send_player(to, S("@1’s awards:", name)) - - for _, str in pairs(awards.players[name].unlocked) do - local def = awards.def[str] - if def then - if def.title then - if def.description then - minetest.chat_send_player(to, S("@1: @2", def.title, def.description)) - else - minetest.chat_send_player(to, def.title) - end - else - minetest.chat_send_player(to, str) - end - end - end - else - if sid == nil or sid < 1 then - sid = 1 - end - local deco = "" - if minetest.global_exists("default") then - deco = default.gui_bg .. default.gui_bg_img - end - -- Show formspec to user - minetest.show_formspec(to,"awards:awards", - "size[11,5]" .. deco .. - awards.getFormspec(name, to, sid)) - end -end -awards.showto = awards.show_to - -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "awards:awards" then - return false - end - if fields.quit then - return true - end - local name = player:get_player_name() - if fields.awards then - local event = minetest.explode_textlist_event(fields.awards) - if event.type == "CHG" then - awards.show_to(name, name, event.index, false) - end - end - - return true -end) - -awards.init() - -minetest.register_on_newplayer(function(player) - local playern = player:get_player_name() - awards.assertPlayer(playern) -end) - -minetest.register_on_shutdown(function() - awards.save() -end) diff --git a/mods/HUD/awards/api_helpers.lua b/mods/HUD/awards/api_helpers.lua deleted file mode 100644 index cd499ab423..0000000000 --- a/mods/HUD/awards/api_helpers.lua +++ /dev/null @@ -1,58 +0,0 @@ -function awards.tbv(tb,value,default) - if not default then - default = {} - end - if not tb or type(tb) ~= "table" then - if not value then - value = "[NULL]" - end - minetest.log("error", "awards.tbv - table "..dump(value).." is null, or not a table! Dump: "..dump(tb)) - return - end - if not value then - error("[ERROR] awards.tbv was not used correctly!\n".. - "Value: '"..dump(value).."'\n".. - "Dump:"..dump(tb)) - return - end - if not tb[value] then - tb[value] = default - end -end - -function awards.assertPlayer(playern) - awards.tbv(awards.players, playern) - awards.tbv(awards.players[playern], "name", playern) - awards.tbv(awards.players[playern], "unlocked") - awards.tbv(awards.players[playern], "place") - awards.tbv(awards.players[playern], "count") - awards.tbv(awards.players[playern], "craft") - awards.tbv(awards.players[playern], "eat") - awards.tbv(awards.players[playern], "deaths", 0) - awards.tbv(awards.players[playern], "joins", 0) - awards.tbv(awards.players[playern], "chats", 0) -end - -function awards.player(name) - return awards.players[name] -end - -function awards._order_awards(name) - local done = {} - local retval = {} - local player = awards.player(name) - if player and player.unlocked then - for _,got in pairs(player.unlocked) do - if awards.def[got] then - done[got] = true - table.insert(retval,{name=got,got=true}) - end - end - end - for _,def in pairs(awards.def) do - if not done[def.name] then - table.insert(retval,{name=def.name,got=false}) - end - end - return retval -end diff --git a/mods/HUD/awards/chat_commands.lua b/mods/HUD/awards/chat_commands.lua deleted file mode 100644 index 9b990fd0c5..0000000000 --- a/mods/HUD/awards/chat_commands.lua +++ /dev/null @@ -1,99 +0,0 @@ --- AWARDS --- --- Copyright (C) 2013-2015 rubenwardy --- 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 S = minetest.get_translator(minetest.get_current_modname()) - -minetest.register_chatcommand("awards", { - params = S("[c|clear|disable|enable]"), - description = S("Show, clear, disable or enable your achievements"), - func = function(name, param) - if param == "clear" then - if awards.player(name).disabled ~= nil then - minetest.chat_send_player(name, S("Awards are disabled, enable them first by using /awards enable!")) - else - awards.clear_player(name) - minetest.chat_send_player(name, - S("All your awards and statistics have been cleared. You can now start again.")) - end - elseif param == "disable" then - awards.disable(name) - minetest.chat_send_player(name, S("You have disabled your achievements.")) - elseif param == "enable" then - awards.enable(name) - minetest.chat_send_player(name, S("You have enabled your achievements.")) - elseif param == "c" then - if awards.player(name).disabled ~= nil then - minetest.chat_send_player(name, S("Awards are disabled, enable them first by using /awards enable!")) - else - awards.show_to(name, name, nil, true) - end - else - if awards.player(name).disabled ~= nil then - minetest.chat_send_player(name, S("Awards are disabled, enable them first by using /awards enable!")) - else - awards.show_to(name, name, nil, false) - end - end - end -}) - -minetest.register_privilege("achievements", { - description = S("Can give achievements to any player"), - give_to_singleplayer = false, - give_to_admin = false, -}) - -minetest.register_chatcommand("achievement", { - params = S("(grant ( | all)) | list"), - privs = { achievements = true }, - description = S("Give achievement to player or list all achievements"), - func = function(name, param) - if param == "list" then - local list = {} - for k,_ in pairs(awards.def) do - table.insert(list, k) - end - table.sort(list) - for a=1, #list do - minetest.chat_send_player(name, S("@1 (@2)", awards.def[list[a]].title, list[a])) - end - return true - end - local keyword, playername, achievement = string.match(param, "([^ ]+) (.+) (.+)") - if not keyword or not playername or not achievement then - return false, S("Invalid syntax.") - end - if keyword ~= "grant" then - return false, S("Invalid action.") - end - local player = minetest.get_player_by_name(playername) - if not player then - return false, S("Player is not online.") - end - if achievement == "all" then - for k,_ in pairs(awards.def) do - awards.unlock(playername, k) - end - return true, S("Done.") - elseif awards.exists(achievement) then - awards.unlock(playername, achievement) - return true, S("Done.") - else - return false, S("Achievement “@1” does not exist.", achievement) - end - end -}) - diff --git a/mods/HUD/awards/init.lua b/mods/HUD/awards/init.lua deleted file mode 100644 index 9b46fd066e..0000000000 --- a/mods/HUD/awards/init.lua +++ /dev/null @@ -1,24 +0,0 @@ --- AWARDS --- --- Copyright (C) 2013-2015 rubenwardy --- 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 modpath = minetest.get_modpath(minetest.get_current_modname()) - -dofile(modpath.."/api.lua") -dofile(modpath.."/chat_commands.lua") -dofile(modpath.."/sfinv.lua") -dofile(modpath.."/unified_inventory.lua") -dofile(modpath.."/triggers.lua") - diff --git a/mods/HUD/awards/locale/awards.de.tr b/mods/HUD/awards/locale/awards.de.tr deleted file mode 100644 index 19db5e0be4..0000000000 --- a/mods/HUD/awards/locale/awards.de.tr +++ /dev/null @@ -1,64 +0,0 @@ -# textdomain:awards -@1: @2=@1: @2 -@1 (got)=@1 (erhalten) -@1’s awards:=Auszeichnungen von @: -(Secret Award)=(Geheime Auszeichnung) -Achievement gotten!=Auszeichnung erhalten! -Achievement gotten:=Auszeichnung erhalten: -Achievement gotten: @1=Auszeichnung erhalten: @1 -Secret achievement gotten!=Geheime Auszeichnung erhalten! -Secret achievement gotten:=Geheime Auszeichnung erhalten: -Secret achievement gotten: @1=Geheime Auszeichnung erhalten: @1 -Get this achievement to find out what it is.=Verdienen Sie sich diese Auszeichnung, um herauszufinden, was sie ist. -You have not gotten any awards.=Sie haben noch keine Auszeichnungen. -You've disabled awards. Type /awards enable to reenable.=Sie haben die Auszeichnungen deaktiviert. Geben Sie »/awards enable« ein, um sie wieder zu aktivieren. -= -= -Achievement not found.=Auszeichnung nicht gefunden. -All your awards and statistics have been cleared. You can now start again.=All Ihre Auszeichnugen und Statistiken wurden zurückgesetzt. Sie können nun von vorne anfangen. -Get the achievements statistics for the given player or yourself=Die Statistik der Auszeichnungen eines Spielers zeigen -List awards in chat (deprecated)=Auszeichnungen im Chat anzeigen (veraltet) -Show, clear, disable or enable your achievements=Zeigen, löschen, deaktivieren oder aktivieren Sie Ihre Auszeichnungen -You have disabled your achievements.=Sie haben Ihre Auszeichnungen deaktiviert. -You have enabled your achievements.=Sie haben Ihre Auszeichnungen aktiviert. -[c|clear|disable|enable]=[c|clear|disable|enable] -Awards=Auszeichnungen -@1/@2 crafted=@1/@2 gefertigt -@1/@2 deaths=@1/@2 Tode -@1/@2 dug=@1/@2 abgebaut -@1/@2 game joins=@1/@2 Spielen beigetreten -@1/@2 placed=@1/@2 platziert -Die @1 times.=Sterben Sie @1 mal. -Die.=Sterben Sie. -Craft: @1×@2=Fertigen Sie an: @1×@2 -Craft: @1=Fertigen Sie an: @1 -Mine a block: @1=Bauen Sie einen Block ab: @1 -Mine blocks: @1×@2=Bauen Sie Blöcke ab: @1×@2 -Place a block: @1=Platzieren Sie einen Block: @1 -Place blocks: @1×@2=Platzieren Sie Blöcke: @1×@2 -Join the game.=Treten Sie dem Spiel bei. -Join the game @1 times.=Treten Sie dem Spiel @1 mal bei. -Show details of an achievement=Details einer Auszeichnung anzeigen -OK=OK -Error: No awards available.=Fehler: Keine Auszeichnungen vorhanden. -Eat: @1×@2=Essen Sie: @1×@2 -Eat: @1=Essen Sie: @1 -@1/@2 eaten=@1/@2 gegessen -Place @1 block(s).=Platzieren Sie @1 Blöcke. -Dig @1 block(s).=Bauen Sie @1 Blöcke ab. -Eat @1 item(s).=Essen Sie @1 Dinge. -Craft @1 item(s).=Fertigen Sie @1 Gegenstände. -Can give achievements to any player=Kann Spielern Auszeichnungen vergeben -(grant ( | all)) | list=(grant ( | all)) | list -Give achievement to player or list all achievements=Auszeichnung an Spieler vergeben oder alle Auszeichnungen auflisten -@1 (@2)=@1 (@2) -Invalid syntax.=Ungültige Syntax. -Invalid action.=Ungültige Aktion. -Player is not online.=Spieler ist nicht online. -Done.=Fertig. -Achievement “@1” does not exist.=Auszeichnung »@1« existiert nicht. -@1 has made the achievement @2=@1 hat die Auszeichnung @2 erhalten -Write something in chat.=Schreiben Sie etwas in den Chat. -Write @1 chat messages.=Schreiben Sie @1 Chatnachrichten. -@1/@2 chat messages=@1/@2 Chatnachrichten -Awards are disabled, enable them first by using /awards enable!=Ihre Auszeichnungen sind aktuell deaktiviert, bitte aktivieren Sie diese zuerst indem Sie /awards enable ausführen bevor Sie diesen Befehl erneut verwenden! \ No newline at end of file diff --git a/mods/HUD/awards/locale/awards.es.tr b/mods/HUD/awards/locale/awards.es.tr deleted file mode 100644 index 15e8c4670e..0000000000 --- a/mods/HUD/awards/locale/awards.es.tr +++ /dev/null @@ -1,51 +0,0 @@ -# textdomain:awards -@1: @2=@1: @2 -@1 (got)=@1 (Completado) -@1’s awards:=Premios de @1: -(Secret Award)=(Premio secreto) -Achievement gotten!=¡Logro conseguido! -Achievement gotten:=Logro conseguido: -Achievement gotten: @1=Logro conseguido: @1 -Secret achievement gotten!=¡Logro secreto conseguido! -Secret achievement gotten:=Logro secreto conseguido: -Secret achievement gotten: @1=Logro secreto conseguido: @1 -Get this achievement to find out what it is.=Obtén este logro para descubrir de qué se trata. -You have not gotten any awards.=No has recibido ningún premio. -You've disabled awards. Type /awards enable to reenable.=Has desactivado los premios. Introduce /awards enable para habilitarlos. -= -= -Achievement not found.=Logro no encontrado. -All your awards and statistics have been cleared. You can now start again.=Todos sus premios y estadísticas han sido borrados. Ahora puede comenzar de nuevo. -Get the achievements statistics for the given player or yourself=Obtén las estadísticas de logros para el jugador dado o para ti mismo -List awards in chat (deprecated)=Lista de premios en el chat (en desuso) -Show, clear, disable or enable your achievements=Muestra, borra, deshabilita o habilita tus logros -You have disabled your achievements.=Has deshabilitado tus logros. -You have enabled your achievements.=Has habilitado tus logros. -[c|clear|disable|enable]=[c|clear|disable|enable] -Awards=Premios -@1/@2 crafted=@1/@2 fabricado(s) -@1/@2 deaths=@1/@2 muertes -@1/@2 dug=@1/@2 excavado -@1/@2 game joins=@1/@2 inicios de sesión -@1/@2 lines of chat=@1/@2 líneas de chat -@1/@2 placed=@1/@2 metido -Die @1 times.=Muere @1 veces. -Die.=Muere. -Craft: @1×@2=Artista: @1×@2 -Craft: @1=Artista: @1 -Mine a block: @1=Mina un bloque: @1 -Mine blocks: @1×@2=Bloques de minas: @1×@2 -Place a block: @1=Coloca un bloque: @1 -Place blocks: @1×@2=Colocar bloques: @1×@2 -Join the game.=Unirse al juego. -Join the game @1 times.=Unirse al juego @1 veces. -Show details of an achievement=Mostrar detalles de un logro -OK=Aceptar -Error: No awards available.=Error: No hay premios disponibles. -Eat: @1×@2=Comer: @1×@2 -Eat: @1=Comer: @1 -@1/@2 eaten=@1/@2 comido -Place @1 block(s).=Posiciona @1 bloque(s). -Dig @1 block(s).=Cava @1 bloque(s). -Eat @1 item(s).=Come @1 alimento(s). -Craft @1 item(s).=Crea @1 artículo(s). diff --git a/mods/HUD/awards/locale/awards.fr.tr b/mods/HUD/awards/locale/awards.fr.tr deleted file mode 100644 index c227a9c07f..0000000000 --- a/mods/HUD/awards/locale/awards.fr.tr +++ /dev/null @@ -1,61 +0,0 @@ -# textdomain:awards -@1/@2 chat messages=@1/@2 chat messages -@1/@2 crafted=@1/@2 fabrication -@1/@2 deaths=@1/@2 Mort -@1/@2 dug=@1/@2 creusé -@1/@2 game joins=@1/@2 sessions -@1/@2 placed=@1/@2 mis -@1 (got)=@1 (obtenu) -@1: @1=@1: @1 -@1’s awards:=Récompenses de @1: -(Secret Award)=(Récompense Secrètte) -= -= -A Cat in a Pop-Tart?!=A Cat in a Pop-Tart?! -Achievement gotten!=Succès obtenu ! -Achievement gotten:=Succès obtenu : -Achievement gotten: @1=Succès obtenu : @1 -Achievement not found.=Succès inconnu -All your awards and statistics have been cleared. You can now start again.=Toutes vos récompenses et statistiques ont été effacées. Vous pouvez maintenant recommencer. -Awards=Récompenses -Craft: @1×@2=Frabrication: @1×@2 -Craft: @1=Frabrication: @1 -Die @1 times.=Mort @1 fois. -Die.=Mort. -Get the achievements statistics for the given player or yourself=Obtenez les statistiques de succès pour le joueur donné ou vous-même -Join the game @1 times.=Rejoignez le jeu @1 fois. -Join the game.=Rejoignez le jeu. -List awards in chat (deprecated)=Liste des récompenses dans le chat (obsolète) -Place a block: @1=Placer un bloc: @1 -Place blocks: @1×@2=Placer des blocs: @1×@2 -Secret Achievement gotten!=Succès secret obtenu ! -Secret Achievement gotten:=Succès secret obtenu : -Secret Achievement gotten: @1=Succès secret obtenu : @1 -Show details of an achievement=Afficher les détails d'un succès -Show, clear, disable or enable your achievements=Affichez, effacez, désactivez ou activez vos succès -Get this achievement to find out what it is.=Obtenez ce succès pour découvrir de quoi il s'agit. -Write @1 chat messages.=Écrivez @1 messages de chat. -Write something in chat.=Écrivez quelque chose dans le chat. -You have disabled your achievements.=Vous avez désactivé vos succès. -You have enabled your achievements.=Vous avez activé vos succès. -You have not gotten any awards.=Vous n'avez reçu aucune récompense. -You've disabled awards. Type /awards enable to reenable.=Vous avez désactivé les récompenses. Tapez "/awards enable" pour les réactiver. -[c|clear|disable|enable]=[c|clear|disable|enable] -OK=OK -Error: No awards available.=Erreur: aucune récompense disponible. -Eat: @1×@2=Manger: @1×@2 -Eat: @1=Manger: @1 -@1/@2 eaten=@1/@2 mangé -Place @1 block(s).=Placer @1 bloc(s). -Dig @1 block(s).=Creuser @1 bloc(s). -Eat @1 item(s).=Manger @1 aliment(s). -Craft @1 item(s).=Fabriquer @1 objet(s). -Can give achievements to any player=Peut donner des succès à n'importe quel joueur -(grant ( | all)) | list=(grant ( | all)) | list -Give achievement to player or list all achievements=Donner un succès à un joueur ou répertorier tous les succès -@1 (@2)=@1 (@2) -Invalid syntax.=Syntaxe invalide. -Invalid action.=Action invalide. -Player is not online.=Le joueur n'est pas en ligne. -Done.=Terminé. -Achievement “@1” does not exist.=Le succès «@1» n'existe pas. diff --git a/mods/HUD/awards/locale/awards.pl.tr b/mods/HUD/awards/locale/awards.pl.tr deleted file mode 100644 index 76d5b9161d..0000000000 --- a/mods/HUD/awards/locale/awards.pl.tr +++ /dev/null @@ -1,63 +0,0 @@ -# textdomain:awards -@1/@2 chat messages=@1/@2 wiadomości na czacie -@1/@2 crafted=Wytworzono @1/@2 -@1/@2 deaths=@1/@2 śmierci -@1/@2 dug=Wykopano @1/@2 -@1/@2 game joins=Dołączono do @1/@2 gier -@1/@2 placed=Postawiono @1/@2 -@1 (got)=@1 (zdobyto) -@1: @2=@1: @2 -@1’s awards:=Nagrody @1: -(Secret Award)=(Sekretna nagroda) -= -= -Achievement gotten!=Zdobyto osiągnięcie! -Achievement gotten:=Zdobyto osiągnięcie: -Achievement gotten: @1=Zdobyto osiągnięcie: @1 -Achievement not found.=Nie znaleziono osiągnięcia. -All your awards and statistics have been cleared. You can now start again.=Wszystkie twoje nagrody i statystyki zostały usunięte. Możesz zacząć ponownie. -Awards=Nagrody. -Craft: @1×@2=Wytwórz: @1×@2 -Craft: @1=Wytwórz: @1 -Die @1 times.=Zgiń @1 razy. -Die.=Zgiń. -Get the achievements statistics for the given player or yourself=Zobacz statystyki osiągnięć danego gracza lub siebie -Join the game @1 times.=Dołącz do gry @1 razy. -Join the game.=Dołącz do gry. -List awards in chat (deprecated)=Wypisz nagrody w czacie (przestarzałe) -Place a block: @1=Postaw blok: @1 -Place blocks: @1×@2=Postaw bloki: @1×@2 -Secret achievement gotten!=Zdobyto sekretne osiągnięcie! -Secret achievement gotten:=Zdobyto sekretne osiągnięcie: -Secret achievement gotten: @1=Zdobyto sekretne osiągnięcie: @1 -Show details of an achievement=Pokaż szczegóły osiągnięcia -Show, clear, disable or enable your achievements=Pokaż, wyczyść, wyłącz lub włącz swoje osiągnięcia -Get this achievement to find out what it is.=Zdobądź to osiągnięcie aby dowiedzieć się jakie ono jest. -Write @1 chat messages.=Napisz @1 wiadomości na czacie. -Write something in chat.=Napisz coś na czacie. -You have disabled your achievements.=Twoje osiągnięcia zostały wyłączone. -You have enabled your achievements.=Twoje osiągnięcia zostały włączone. -You have not gotten any awards.=Nie zdobyto żadnych osiągnięć. -You've disabled awards. Type /awards enable to reenable.=Wyłączono osiągnięcia. Napisz /awards by je włączyć. -[c|clear|disable|enable]=[c|clear|disable|enable] -OK=OK -Error: No awards available.=Błąd: Brak dostępnych nagród. -Eat: @1×@2=Zjedz: @1×@2 -Eat: @1=Zjedz: @1 -@1/@2 eaten=Zjedzono @1/@2 -Place @1 block(s).=Postaw bloki: @1. -Dig @1 block(s).=Wykop bloki: @1. -Eat @1 item(s).=Zjedz przedmioty: @1. -Craft @1 item(s).=Wytwórz przedmioty: @1. -Can give achievements to any player=Może przyznawać osiągnięcia dowolnemu graczowi. -(grant ( | all)) | list=(grant ( | all)) | list -Give achievement to player or list all achievements=Daj osiągnięcie graczowi lub wypisz wszystkie osiągnięcia -@1 (@2)=@1 (@2) -Invalid syntax.=Niepoprawna składnia. -Invalid action.=Niepoprawna czynność. -Player is not online.=Gracz nie jest online. -Done.=Gotowe. -Achievement “@1” does not exist.=Osiągnięcie "@1" nie istnieje. -@1 has made the achievement @2=@2 zostało zdobyte przez @1. -Mine a block: @1=Wykop blok: @1 -Mine blocks: @1×@2=Wykop blok: @1×@2 diff --git a/mods/HUD/awards/locale/awards.ru.tr b/mods/HUD/awards/locale/awards.ru.tr deleted file mode 100644 index 8495c270f6..0000000000 --- a/mods/HUD/awards/locale/awards.ru.tr +++ /dev/null @@ -1,62 +0,0 @@ -# textdomain:awards -@1/@2 chat messages=@1/@2 сообщений чата -@1/@2 crafted=@1/@2 скрафчено -@1/@2 deaths=@1/@2 смертей -@1/@2 dug=@1/@2 выкопано -@1/@2 game joins=@1/@2 присоединений к игре -@1/@2 placed=@1/@2 помещено -@1 (got)=@1 (получено) -@1: @1=@1: @1 -@1’s awards:=Награды @1: -(Secret Award)=(Секретная награда) -=<идентификатор достижения> -=<имя> -A Cat in a Pop-Tart?!=Кот в печеньке?! -Achievement gotten!=Получено достижение! -Achievement gotten:=Получено достижение: -Achievement gotten: @1=Получено достижение: @1 -Achievement not found.=Достижение не найдено. -All your awards and statistics have been cleared. You can now start again.=Ваши награды удалены вместе со всей статистикой. Теперь можно начать всё сначала. -Awards=Награды -Craft: @1×@2=Скрафчено: @1×@2 -Craft: @1=Скрафчено: @1 -Die @1 times.=Умер(ла) @1 раз(а). -Die.=Умер(ла). -Get the achievements statistics for the given player or yourself=Получение статистики достижений для заданного игрока или для себя -Join the game @1 times.=Присоединился(ась) к игре @1 раз(а). -Join the game.=Присоединился(ась) к игре. -List awards in chat (deprecated)=Вывести список наград в чат (устарело). -Place a block: @1=Разметил(а) блок: @1 -Place blocks: @1×@2=Разместил(а) блоки: @1×@2 -Secret Achievement gotten!=Секретное достижение получено! -Secret Achievement gotten:=Секретное достижение получено: -Secret Achievement gotten: @1=Секретное достижение получено: @1 -Show details of an achievement=Показать подробности достижения -Show, clear, disable or enable your achievements=Отобразить, очистить, запретить или разрешить ваши достижения -Get this achievement to find out what it is.=Получите это достижение, чтобы узнать, что это. -Write @1 chat messages.=Написано @1 сообщений(е,я) в чате. -Write something in chat.=Написал(а) что-то в чате. -You have disabled your achievements.=Вы запретили ваши достижения. -You have enabled your achievements.=Вы разрешили ваши достижения. -You have not gotten any awards.=Вы пока не получали наград. -You've disabled awards. Type /awards enable to reenable.=Вы запретили награды. Выполните /awards enable, чтобы разрешить их обратно. -[c|clear|disable|enable]=[c|clear - очистить|disable - запретить|enable - разрешить] -OK=О'кей -Error: No awards available.=Ошибка: Награды недоступны -Eat: @1×@2=Съедено: @1×@2 -Eat: @1=Съедено: @1 -@1/@2 eaten=@1/@2 съедено -Place @1 block(s).=Поместил(а) @1 блок(а,ов). -Dig @1 block(s).=Выкопал(а) @1 блок(а,ов). -Eat @1 item(s).=Съел(а) @1 предмет(а,ов). -Craft @1 item(s).=Скрафтил(а) @1 предмет(а,ов). -Can give achievements to any player=Может выдавать достижения любому игроку -(grant ( | all)) | list=(grant <игрок> (<достижение> | all - всем)) | список -Give achievement to player or list all achievements=Выдать достижение игроку или отобразить все достижения -@1 (@2)=@1 (@2) -Invalid syntax.=Неверный синтаксис. -Invalid action.=Непредусмотренное действие. -Player is not online.=Игрок не подключён. -Done.=Сделано. -Achievement “@1” does not exist.=Достижения “@1” не существует. -@1 has made the achievement @2=@1 получил(а) достижение @2 diff --git a/mods/HUD/awards/locale/template.txt b/mods/HUD/awards/locale/template.txt deleted file mode 100644 index fa05b22b31..0000000000 --- a/mods/HUD/awards/locale/template.txt +++ /dev/null @@ -1,64 +0,0 @@ -# textdomain:awards -@1/@2 chat messages= -@1/@2 crafted= -@1/@2 deaths= -@1/@2 dug= -@1/@2 game joins= -@1/@2 placed= -@1 (got)= -@1: @2= -@1’s awards:= -(Secret Award)= -= -= -Achievement gotten!= -Achievement gotten:= -Achievement gotten: @1= -Achievement not found.= -All your awards and statistics have been cleared. You can now start again.= -Awards= -Craft: @1×@2= -Craft: @1= -Die @1 times.= -Die.= -Get the achievements statistics for the given player or yourself= -Join the game @1 times.= -Join the game.= -List awards in chat (deprecated)= -Place a block: @1= -Place blocks: @1×@2= -Secret achievement gotten!= -Secret achievement gotten:= -Secret achievement gotten: @1= -Show details of an achievement= -Show, clear, disable or enable your achievements= -Get this achievement to find out what it is.= -Write @1 chat messages.= -Write something in chat.= -You have disabled your achievements.= -You have enabled your achievements.= -You have not gotten any awards.= -You've disabled awards. Type /awards enable to reenable.= -[c|clear|disable|enable]= -OK= -Error: No awards available.= -Eat: @1×@2= -Eat: @1= -@1/@2 eaten= -Place @1 block(s).= -Dig @1 block(s).= -Eat @1 item(s).= -Craft @1 item(s).= -Can give achievements to any player= -(grant ( | all)) | list= -Give achievement to player or list all achievements= -@1 (@2)= -Invalid syntax.= -Invalid action.= -Player is not online.= -Done.= -Achievement “@1” does not exist.= -@1 has made the achievement @2= -Mine a block: @1= -Mine blocks: @1×@2= -Awards are disabled, enable them first by using /awards enable!= diff --git a/mods/HUD/awards/mod.conf b/mods/HUD/awards/mod.conf deleted file mode 100644 index 1657323e2d..0000000000 --- a/mods/HUD/awards/mod.conf +++ /dev/null @@ -1,9 +0,0 @@ -name = awards -title = Achievements -author = rubenwardy -description = Adds achievements to Minetest, and an API to register new ones. -license = LGPL 2.1 or later -forum = https://forum.minetest.net/viewtopic.php?t=4870 -version = 2.3.0 -optional_depends = sfinv, unified_inventory -depends = mcl_colors diff --git a/mods/HUD/awards/readme.md b/mods/HUD/awards/readme.md deleted file mode 100644 index 70c650c84f..0000000000 --- a/mods/HUD/awards/readme.md +++ /dev/null @@ -1,164 +0,0 @@ -# Awards - -by Andrew "Rubenwardy" Ward, LGPL 2.1 or later. - -This mod adds achievements to Minetest. - -Majority of awards are back ported from Calinou's -old fork in Carbone, under same license. - - -# Basic API - -* awards.register_achievement(name, def) - * name: Unique identifier for achievement. You can use anything except "all" - * desciption - * sound [optional] - set a custom sound (SimpleSoundSpec) or `false` to play no sound. - If not specified, a default sound is played - * image [optional] - texture name, eg: award_one.png - * background [optional] - texture name, eg: award_one.png - * trigger [optional] [table] - * type - "dig", "place", "craft", "death", "chat", "join" or "eat" - * dig type: Dig a node. - * node: the dug node type. If nil, all dug nodes are counted - * place type: Place a node. - * node: the placed node type. If nil, all placed nodes are counted - * eat type: Eat an item. - * item: the eaten item type. If nil, all eaten items are counted - * craft type: Craft something. - * item: the crafted item type. If nil, all crafted items are counted - * death type: Die. - * chat type: Write a chat message. - * join type: Join the server. - * (for all types) target - how many times to dig/place/craft/etc. - * See Triggers - * secret [optional] - if true, then player needs to unlock to find out what it is. - * on_unlock [optional] - func(name, def) - * name is player name - * return true to cancel register_on_unlock callbacks and HUD -* awards.register_trigger(name, func(awardname, def)) - * Note: awards.on[name] is automatically created for triggers -* awards.run_trigger_callbacks(player, data, trigger, table_func(entry)) - * Goes through and checks all triggers registered to a trigger type, - unlocking the award if conditions are met. - * data is the player's award data, ie: awards.players[player_name] - * trigger is the name of the trigger type. Ie: awards.on[trigger] - * table_func is called if the trigger is a table - simply return an - award name to unlock it - * See triggers.lua for examples -* awards.increment_item_counter(data, field, itemname) - * add to an item's statistic count - * for example, (data, "place", "default:stone") will add 1 to the number of - times default:stone has been placed. - * data is the player's award data, ie: awards.players[player_name] - * returns true on success, false on failure (eg: cannot get modname and item from itemname) -* awards.register_on_unlock(func(name, def)) - * name is the player name - * def is the award def. - * return true to cancel HUD -* awards.unlock(name, award) - * gives an award to a player - * name is the player name -* awards.exists(award) - * returns true if award exists, false otherwise - -# Included in the Mod - -The API, above, allows you to register awards -and triggers (things that look for events and unlock awards, they need -to be registered in order to get details from award_def.trigger). - -However, all awards and triggers are separate from the API. -They can be found in init.lua and triggers.lua - -## Triggers - -Callbacks (register a function to be run) - -### dig - - trigger = { - type = "dig", - node = "default:dirt", - target = 50 - } - -### place - - trigger = { - type = "place", - node = "default:dirt", - target = 50 - } - -### death - - trigger = { - type = "death", - target = 5 - } - -### chat - - trigger = { - type = "chat", - target = 100 - } - -### join - - trigger = { - type = "join", - target = 100 - } - -### eat - - trigger = { - type = "eat", - item = "default:apple", - target = 100 - } - -## Callbacks relating to triggers - -* awards.register_on_dig(func(player, data)) - * data is player data (see below) - * return award name or null -* awards.register_on_place(func(player, data)) - * data is player data (see below) - * return award name or null -* awards.register_on_eat(func(player, data)) - * data is player data (see below) - * return award name or null -* awards.register_on_death(func(player, data)) - * data is player data (see below) - * return award name or null -* awards.register_on_chat(func(player, data)) - * data is player data (see below) - * return award name or null -* awards.register_on_join(func(player, data) - * data is player data (see below) - * return award name or null - - -# Player Data - -A list of data referenced/hashed by the player's name. -* player name - * name [string] - * count [table] - dig counter - * modname [table] - * itemname [int] - * place [table] - place counter - * modname [table] - * itemname [int] - * craft [table] - craft counter - * modname [table] - * itemname [int] - * eat [table] - eat counter - * modname [table] - * itemname [int] - * deaths - * chats - * joins diff --git a/mods/HUD/awards/sfinv.lua b/mods/HUD/awards/sfinv.lua deleted file mode 100644 index 3b41d29ab2..0000000000 --- a/mods/HUD/awards/sfinv.lua +++ /dev/null @@ -1,25 +0,0 @@ -if minetest.get_modpath("sfinv") then - local S = minetest.get_translator(minetest.get_current_modname()) - - sfinv.register_page("awards:awards", { - title = S("Awards"), - on_enter = function(self, player, context) - context.awards_idx = 1 - end, - get = function(self, player, context) - local name = player:get_player_name() - return sfinv.make_formspec(player, context, - awards.getFormspec(name, name, context.awards_idx or 1), - false, "size[11,5]") - end, - on_player_receive_fields = function(self, player, context, fields) - if fields.awards then - local event = minetest.explode_textlist_event(fields.awards) - if event.type == "CHG" then - context.awards_idx = event.index - sfinv.set_player_inventory_formspec(player, context) - end - end - end - }) -end diff --git a/mods/HUD/awards/sounds/awards_got_generic.ogg b/mods/HUD/awards/sounds/awards_got_generic.ogg deleted file mode 100644 index 87666c8fea..0000000000 Binary files a/mods/HUD/awards/sounds/awards_got_generic.ogg and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_bg_default.png b/mods/HUD/awards/textures/awards_bg_default.png deleted file mode 100644 index 86130d01f0..0000000000 Binary files a/mods/HUD/awards/textures/awards_bg_default.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_bg_mining.png b/mods/HUD/awards/textures/awards_bg_mining.png deleted file mode 100644 index a6987794f0..0000000000 Binary files a/mods/HUD/awards/textures/awards_bg_mining.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_progress_gray.png b/mods/HUD/awards/textures/awards_progress_gray.png deleted file mode 100644 index ea60ae17b9..0000000000 Binary files a/mods/HUD/awards/textures/awards_progress_gray.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_progress_green.png b/mods/HUD/awards/textures/awards_progress_green.png deleted file mode 100644 index 5f2bb3d282..0000000000 Binary files a/mods/HUD/awards/textures/awards_progress_green.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_template.png b/mods/HUD/awards/textures/awards_template.png deleted file mode 100644 index b290454803..0000000000 Binary files a/mods/HUD/awards/textures/awards_template.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_ui_icon.png b/mods/HUD/awards/textures/awards_ui_icon.png deleted file mode 100644 index 239ad71ec9..0000000000 Binary files a/mods/HUD/awards/textures/awards_ui_icon.png and /dev/null differ diff --git a/mods/HUD/awards/textures/awards_unknown.png b/mods/HUD/awards/textures/awards_unknown.png deleted file mode 100644 index b290454803..0000000000 Binary files a/mods/HUD/awards/textures/awards_unknown.png and /dev/null differ diff --git a/mods/HUD/awards/triggers.lua b/mods/HUD/awards/triggers.lua deleted file mode 100644 index c7194d2c97..0000000000 --- a/mods/HUD/awards/triggers.lua +++ /dev/null @@ -1,403 +0,0 @@ --- AWARDS --- --- Copyright (C) 2013-2015 rubenwardy --- 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 S = minetest.get_translator(minetest.get_current_modname()) - -awards.register_trigger("dig", function(def) - local tmp = { - award = def.name, - node = def.trigger.node, - target = def.trigger.target, - } - table.insert(awards.on.dig, tmp) - def.getProgress = function(self, data) - local itemcount - if tmp.node then - itemcount = awards.get_item_count(data, "count", tmp.node) or 0 - else - itemcount = awards.get_total_item_count(data, "count") - end - return { - perc = itemcount / tmp.target, - label = S("@1/@2 dug", itemcount, tmp.target) - } - end - def.getDefaultDescription = function(self) - if self.trigger.node then - local nname = minetest.registered_nodes[self.trigger.node].description - if nname == nil then - nname = self.trigger.node - end - if self.trigger.target ~= 1 then - return S("Mine blocks: @1×@2", self.trigger.target, nname) - else - return S("Mine a block: @1", nname) - end - else - return S("Mine @1 block(s).", self.trigger.target) - end - end -end) - -awards.register_trigger("place", function(def) - local tmp = { - award = def.name, - node = def.trigger.node, - target = def.trigger.target, - } - table.insert(awards.on.place, tmp) - def.getProgress = function(self, data) - local itemcount - if tmp.node then - itemcount = awards.get_item_count(data, "place", tmp.node) or 0 - else - itemcount = awards.get_total_item_count(data, "place") - end - return { - perc = itemcount / tmp.target, - label = S("@1/@2 placed"), itemcount, tmp.target - } - end - def.getDefaultDescription = function(self) - if self.trigger.node then - local nname = minetest.registered_nodes[self.trigger.node].description - if nname == nil then - nname = self.trigger.node - end - if self.trigger.target ~= 1 then - return S("Place blocks: @1×@2", self.trigger.target, nname) - else - return S("Place a block: @1", nname) - end - else - return S("Place @1 block(s).", self.trigger.target) - end - end -end) - -awards.register_trigger("eat", function(def) - local tmp = { - award = def.name, - item = def.trigger.item, - target = def.trigger.target, - } - table.insert(awards.on.eat, tmp) - def.getProgress = function(self, data) - local itemcount - if tmp.item then - itemcount = awards.get_item_count(data, "eat", tmp.item) or 0 - else - itemcount = awards.get_total_item_count(data, "eat") - end - return { - perc = itemcount / tmp.target, - label = S("@1/@2 eaten", itemcount, tmp.target) - } - end - def.getDefaultDescription = function(self) - if self.trigger.item then - local iname = minetest.registered_items[self.trigger.item].description - if iname == nil then - iname = self.trigger.iode - end - if self.trigger.target ~= 1 then - return S("Eat: @1×@2", self.trigger.target, iname) - else - return S("Eat: @1", iname) - end - else - return S("Eat @1 item(s).", self.trigger.target) - end - end -end) - -awards.register_trigger("death", function(def) - local tmp = { - award = def.name, - target = def.trigger.target, - } - table.insert(awards.on.death, tmp) - def.getProgress = function(self, data) - local itemcount = data.deaths or 0 - return { - perc = itemcount / tmp.target, - label = S("@1/@2 deaths", itemcount, tmp.target) - } - end - def.getDefaultDescription = function(self) - if self.trigger.target ~= 1 then - return S("Die @1 times.", self.trigger.target) - else - return S("Die.") - end - end -end) - -awards.register_trigger("chat", function(def) - local tmp = { - award = def.name, - target = def.trigger.target, - } - table.insert(awards.on.chat, tmp) - def.getProgress = function(self, data) - local itemcount = data.chats or 0 - return { - perc = itemcount / tmp.target, - label = S("@1/@2 chat messages", itemcount, tmp.target) - } - end - def.getDefaultDescription = function(self) - if self.trigger.target ~= 1 then - return S("Write @1 chat messages.", self.trigger.target) - else - return S("Write something in chat.") - end - end -end) - -awards.register_trigger("join", function(def) - local tmp = { - award = def.name, - target = def.trigger.target, - } - table.insert(awards.on.join, tmp) - def.getProgress = function(self, data) - local itemcount = data.joins or 0 - return { - perc = itemcount / tmp.target, - label = S("@1/@2 game joins", itemcount, tmp.target) - } - end - def.getDefaultDescription = function(self) - if self.trigger.target ~= 1 then - return S("Join the game @1 times.", self.trigger.target) - else - return S("Join the game.") - end - end -end) - -awards.register_trigger("craft", function(def) - local tmp = { - award = def.name, - item = def.trigger.item, - target = def.trigger.target, - } - table.insert(awards.on.craft, tmp) - def.getProgress = function(self, data) - local itemcount - if tmp.item then - itemcount = awards.get_item_count(data, "craft", tmp.item) or 0 - else - itemcount = awards.get_total_item_count(data, "craft") - end - return { - perc = itemcount / tmp.target, - label = S("@1/@2 crafted", itemcount, tmp.target) - } - end - def.getDefaultDescription = function(self) - if self.trigger.item then - local iname = minetest.registered_items[self.trigger.item].description - if iname == nil then - iname = self.trigger.item - end - if self.trigger.target ~= 1 then - return S("Craft: @1×@2", self.trigger.target, iname) - else - return S("Craft: @1", iname) - end - else - return S("Craft @1 item(s).", self.trigger.target) - end - end -end) - --- Backwards compatibility -awards.register_onDig = awards.register_on_dig -awards.register_onPlace = awards.register_on_place -awards.register_onDeath = awards.register_on_death -awards.register_onChat = awards.register_on_chat -awards.register_onJoin = awards.register_on_join -awards.register_onCraft = awards.register_on_craft - --- Trigger Handles -minetest.register_on_dignode(function(pos, oldnode, digger) - if not digger or not pos or not oldnode then - return - end - - local data = awards.players[digger:get_player_name()] - if not awards.increment_item_counter(data, "count", oldnode.name) then - return - end - awards.run_trigger_callbacks(digger, data, "dig", function(entry) - if entry.target then - if entry.node then - local tnodedug = string.split(entry.node, ":") - local tmod = tnodedug[1] - local titem = tnodedug[2] - if tmod and titem and data.count[tmod] and data.count[tmod][titem] and data.count[tmod][titem] > entry.target-1 then - return entry.award - end - elseif awards.get_total_item_count(data, "count") > entry.target-1 then - return entry.award - end - end - end) -end) - -minetest.register_on_placenode(function(pos, node, digger) - if not digger or not pos or not node or not digger:get_player_name() or digger:get_player_name()=="" then - return - end - local data = awards.players[digger:get_player_name()] - if not awards.increment_item_counter(data, "place", node.name) then - return - end - - awards.run_trigger_callbacks(digger, data, "place", function(entry) - if entry.target then - if entry.node then - local tnodedug = string.split(entry.node, ":") - local tmod = tnodedug[1] - local titem = tnodedug[2] - if tmod and titem and data.place[tmod] and data.place[tmod][titem] and data.place[tmod][titem] > entry.target-1 then - return entry.award - end - elseif awards.get_total_item_count(data, "place") > entry.target-1 then - return entry.award - end - end - end) -end) - -minetest.register_on_item_eat(function(hp_change, replace_with_item, itemstack, user, pointed_thing) - if not user or not itemstack or not user:get_player_name() or user:get_player_name()=="" then - return - end - local data = awards.players[user:get_player_name()] - if not awards.increment_item_counter(data, "eat", itemstack:get_name()) then - return - end - awards.run_trigger_callbacks(user, data, "eat", function(entry) - if entry.target then - if entry.item then - local titemstring = string.split(entry.item, ":") - local tmod = titemstring[1] - local titem = titemstring[2] - if tmod and titem and data.eat[tmod] and data.eat[tmod][titem] and data.eat[tmod][titem] > entry.target-1 then - return entry.award - end - elseif awards.get_total_item_count(data, "eat") > entry.target-1 then - return entry.award - end - end - end) -end) - -minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) - if not player or not itemstack then - return - end - - local data = awards.players[player:get_player_name()] - if not awards.increment_item_counter(data, "craft", itemstack:get_name(), itemstack:get_count()) then - return - end - - awards.run_trigger_callbacks(player, data, "craft", function(entry) - if entry.target then - if entry.item then - local titemcrafted = string.split(entry.item, ":") - local tmod = titemcrafted[1] - local titem = titemcrafted[2] - if tmod and titem and data.craft[tmod] and data.craft[tmod][titem] and data.craft[tmod][titem] > entry.target-1 then - return entry.award - end - elseif awards.get_total_item_count(data, "craft") > entry.target-1 then - return entry.award - end - end - end) -end) - -minetest.register_on_dieplayer(function(player) - -- Run checks - local name = player:get_player_name() - if not player or not name or name=="" then - return - end - - -- Get player - awards.assertPlayer(name) - local data = awards.players[name] - - -- Increment counter - data.deaths = data.deaths + 1 - - awards.run_trigger_callbacks(player, data, "death", function(entry) - if entry.target and entry.award and data.deaths and - data.deaths >= entry.target then - return entry.award - end - end) -end) - -minetest.register_on_joinplayer(function(player) - -- Run checks - local name = player:get_player_name() - if not player or not name or name=="" then - return - end - - -- Get player - awards.assertPlayer(name) - local data = awards.players[name] - - -- Increment counter - data.joins = data.joins + 1 - - awards.run_trigger_callbacks(player, data, "join", function(entry) - if entry.target and entry.award and data.joins and - data.joins >= entry.target then - return entry.award - end - end) -end) - -minetest.register_on_chat_message(function(name, message) - -- Run checks - local idx = string.find(message,"/") - if not name or (idx and idx <= 1) then - return - end - - -- Get player - awards.assertPlayer(name) - local data = awards.players[name] - local player = minetest.get_player_by_name(name) - - -- Increment counter - data.chats = data.chats + 1 - - awards.run_trigger_callbacks(player, data, "chat", function(entry) - if entry.target and entry.award and data.chats and - data.chats >= entry.target then - return entry.award - end - end) -end) diff --git a/mods/HUD/awards/unified_inventory.lua b/mods/HUD/awards/unified_inventory.lua deleted file mode 100644 index 3dc238e1a6..0000000000 --- a/mods/HUD/awards/unified_inventory.lua +++ /dev/null @@ -1,12 +0,0 @@ -if minetest.get_modpath("unified_inventory") then - local S = minetest.get_translator(minetest.get_current_modname()) - unified_inventory.register_button("awards", { - type = "image", - image = "awards_ui_icon.png", - tooltip = S("Awards"), - action = function(player) - local name = player:get_player_name() - awards.show_to(name, name, nil, false) - end, - }) -end diff --git a/mods/HUD/mcl_achievements/README.txt b/mods/HUD/mcl_achievements/README.txt deleted file mode 100644 index 352f9a1848..0000000000 --- a/mods/HUD/mcl_achievements/README.txt +++ /dev/null @@ -1 +0,0 @@ -License of this mod (including textures and other data): WTFPL diff --git a/mods/HUD/mcl_achievements/init.lua b/mods/HUD/mcl_achievements/init.lua deleted file mode 100644 index c963773d15..0000000000 --- a/mods/HUD/mcl_achievements/init.lua +++ /dev/null @@ -1,257 +0,0 @@ --- Settings - --- If true, activates achievements from other Minecraft editions (XBox, PS, etc.) -local non_pc_achievements = false - -local S = minetest.get_translator(minetest.get_current_modname()) - --- Achievements from PC Edition - -awards.register_achievement("mcl_buildWorkBench", { - title = S("Benchmarking"), - description = S("Craft a crafting table from 4 wooden planks."), - icon = "crafting_workbench_front.png", - trigger = { - type = "craft", - item = "mcl_crafting_table:crafting_table", - target = 1 - } -}) -awards.register_achievement("mcl:buildPickaxe", { - title = S("Time to Mine!"), - description = S("Use a crafting table to craft a wooden pickaxe from wooden planks and sticks."), - icon = "default_tool_woodpick.png", - trigger = { - type = "craft", - item = "mcl_tools:pick_wood", - target = 1 - } -}) -awards.register_achievement("mcl:buildFurnace", { - title = S("Hot Topic"), - description = S("Use 8 cobblestones to craft a furnace."), - icon = "default_furnace_front.png", - trigger = { - type = "craft", - item = "mcl_furnaces:furnace", - target = 1 - } -}) -awards.register_achievement("mcl:buildHoe", { - title = S("Time to Farm!"), - description = S("Use a crafting table to craft a wooden hoe from wooden planks and sticks."), - icon = "farming_tool_woodhoe.png", - trigger = { - type = "craft", - item = "mcl_farming:hoe_wood", - target = 1 - } -}) -awards.register_achievement("mcl:makeBread", { - title = S("Bake Bread"), - description = S("Use wheat to craft a bread."), - icon = "farming_bread.png", - trigger = { - type = "craft", - item = "mcl_farming:bread", - target = 1 - } -}) - -awards.register_achievement("mcl:bakeCake", { - title = S("The Lie"), - description = S("Craft a cake using wheat, sugar, milk and an egg."), - icon = "cake.png", - trigger = { - type = "craft", - item = "mcl_cake:cake", - target = 1 - } -}) -awards.register_achievement("mcl:buildBetterPickaxe", { - title = S("Getting an Upgrade"), - -- TODO: This achievement should support all non-wood pickaxes - description = S("Craft a stone pickaxe using sticks and cobblestone."), - icon = "default_tool_stonepick.png", - trigger = { - type = "craft", - item = "mcl_tools:pick_stone", - target = 1 - } -}) -awards.register_achievement("mcl:buildSword", { - title = S("Time to Strike!"), - description = S("Craft a wooden sword using wooden planks and sticks on a crafting table."), - icon = "default_tool_woodsword.png", - trigger = { - type = "craft", - item = "mcl_tools:sword_wood", - target = 1 - } -}) - -awards.register_achievement("mcl:bookcase", { - title = S("Librarian"), - description = S("Craft a bookshelf."), - icon = "default_bookshelf.png", - trigger = { - type = "craft", - item = "mcl_books:bookshelf", - target = 1 - } -}) - --- Item pickup achievements: These are awarded when picking up a certain item. --- The achivements are manually given in the mod mcl_item_entity. -awards.register_achievement("mcl:diamonds", { - title = S("DIAMONDS!"), - description = S("Pick up a diamond from the floor."), - icon = "mcl_core_diamond_ore.png", -}) -awards.register_achievement("mcl:blazeRod", { - title = S("Into Fire"), - description = S("Pick up a blaze rod from the floor."), - icon = "mcl_mobitems_blaze_rod.png", -}) - -awards.register_achievement("mcl:killCow", { - title = S("Cow Tipper"), - description = S("Pick up leather from the floor.\nHint: Cows and some other animals have a chance to drop leather, when killed."), - icon = "mcl_mobitems_leather.png", -}) -awards.register_achievement("mcl:mineWood", { - title = S("Getting Wood"), - description = S("Pick up a wood item from the ground.\nHint: Punch a tree trunk until it pops out as an item."), - icon = "default_tree.png", -}) - --- Smelting achivements: These are awarded when picking up an item from a furnace --- output. They are given in mcl_furnaces. -awards.register_achievement("mcl:acquireIron", { - title = S("Aquire Hardware"), - description = S("Take an iron ingot from a furnace's output slot.\nHint: To smelt an iron ingot, put a fuel (like coal) and iron ore into a furnace."), - icon = "default_steel_ingot.png", -}) -awards.register_achievement("mcl:cookFish", { - title = S("Delicious Fish"), - description = S("Take a cooked fish from a furnace.\nHint: Use a fishing rod to catch a fish and cook it in a furnace."), - icon = "mcl_fishing_fish_cooked.png", -}) - --- Other achievements triggered outside of mcl_achievements - --- Triggered in mcl_minecarts -awards.register_achievement("mcl:onARail", { - title = S("On A Rail"), - description = S("Travel by minecart for at least 1000 meters from your starting point in a single ride."), - icon = "default_rail.png", -}) - --- Triggered in mcl_bows -awards.register_achievement("mcl:snipeSkeleton", { - title = S("Sniper Duel"), - -- TODO: This achievement should be for killing, not hitting - -- TODO: The range should be 50, not 20. Nerfed because of reduced bow range - description = S("Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters."), - icon = "mcl_bows_bow.png", -}) - --- Triggered in mcl_portals -awards.register_achievement("mcl:buildNetherPortal", { - title = S("Into the Nether"), - description = S("Use obsidian and a fire starter to construct a Nether portal."), - icon = "default_obsidian.png", -}) - --- NON-PC ACHIEVEMENTS (XBox, Pocket Edition, etc.) - -if non_pc_achievements then - awards.register_achievement("mcl:n_placeDispenser", { - title = S("Dispense With This"), - description = S("Place a dispenser."), - icon = "mcl_dispensers_dispenser_front_horizontal.png", - trigger = { - type = "place", - node = "mcl_dispensers:dispenser", - target = 1 - } - }) - - -- FIXME: Eating achievements don't work when you have exactly one of these items on hand - awards.register_achievement("mcl:n_eatPorkchop", { - title = S("Pork Chop"), - description = S("Eat a cooked porkchop."), - icon = "mcl_mobitems_porkchop_cooked.png", - trigger = { - type = "eat", - item= "mcl_mobitems:cooked_porkchop", - target = 1, - } - }) - awards.register_achievement("mcl:n_eatRabbit", { - title = S("Rabbit Season"), - icon = "mcl_mobitems_rabbit_cooked.png", - description = S("Eat a cooked rabbit."), - trigger = { - type = "eat", - item= "mcl_mobitems:cooked_rabbit", - target = 1, - } - }) - awards.register_achievement("mcl:n_eatRottenFlesh", { - title = S("Iron Belly"), - description = S("Get really desperate and eat rotten flesh."), - icon = "mcl_mobitems_rotten_flesh.png", - trigger = { - type = "eat", - item= "mcl_mobitems:rotten_flesh", - target = 1, - } - }) - awards.register_achievement("mcl:n_placeFlowerpot", { - title = S("Pot Planter"), - description = S("Place a flower pot."), - icon = "mcl_flowerpots_flowerpot_inventory.png", - trigger = { - type = "place", - node = "mcl_flowerpots:flower_pot", - target = 1, - } - }) - - awards.register_achievement("mcl:n_emeralds", { - title = S("The Haggler"), - description = S("Mine emerald ore."), - icon = "default_emerald.png", - trigger = { - type = "dig", - node = "mcl_core:stone_with_emerald", - target = 1, - } - }) -end - --- Show achievements formspec when the button was pressed -minetest.register_on_player_receive_fields(function(player, formname, fields) - if fields.__mcl_achievements then - local name = player:get_player_name() - awards.show_to(name, name, nil, false) - end -end) - - -awards.register_achievement("mcl:stoneAge", { - title = S("Stone Age"), - description = S("Mine a stone with new pickaxe."), - icon = "default_cobble.png", -}) -awards.register_achievement("mcl:hotStuff", { - title = S("Hot Stuff"), - description = S("Put lava in a bucket."), - icon = "bucket_lava.png", -}) -awards.register_achievement("mcl:obsidian", { - title = S("Ice Bucket Challenge"), - description = S("Obtain an obsidian block."), - icon = "default_obsidian.png", -}) diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr deleted file mode 100644 index 49c486e481..0000000000 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr +++ /dev/null @@ -1,49 +0,0 @@ -# textdomain:mcl_achievements -Aquire Hardware=Schmied -Bake Bread=Brot backen -Benchmarking=Tischler -Cow Tipper=Kuhschubser -Craft a bookshelf.=Fertigen Sie ein Bücherregal. -Craft a cake using wheat, sugar, milk and an egg.=Fertigen Sie einen Kuchen aus Weizen, Zucker, Milch und einem Ei. -Craft a crafting table from 4 wooden planks.=Fertigen Sie eine Werkbank aus 4 Holzplanken. -Craft a stone pickaxe using sticks and cobblestone.=Fertigen Sie eine Steinspitzhacke aus Stöcken und Kopfsteinpflaster. -Craft a wooden sword using wooden planks and sticks on a crafting table.=Fertigen Sie ein Holzschwert aus Holzplanken und Stöcken an einer Werkbank. -DIAMONDS!=DIAMANTEN! -Delicious Fish=Leckerer Fisch -Dispense With This=Ein Auge darauf werfen -Eat a cooked porkchop.=Essen Sie ein gekochtes Schweinekotelett -Eat a cooked rabbit.=Essen Sie ein gekochtes Kaninchen -Get really desperate and eat rotten flesh.=Verzweifeln Sie und essen Sie Gammelfleisch. -Getting Wood=Holzhacker -Getting an Upgrade=Aufwertung -Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters.=Treffen Sie ein Skelett, Witherskelett oder einen Eiswanderer mit Bogen und Pfeil aus einer Entfernung von mindestens 20 Metern. -Hot Topic=Heißes Eisen -Into Fire=In das Feuer -Into the Nether=In den Nether -Iron Belly=Eiserner Magen -Librarian=Bibliothekar -Mine emerald ore.=Bauen Sie Smaragderz ab. -On A Rail=Auf der Schiene -Pick up a blaze rod from the floor.=Sammeln Sie eine Lohenrute vom Boden auf. -Pick up a diamond from the floor.=Sammeln Sie einen Diamanten vom Boden auf. -Pick up a wood item from the ground.@nHint: Punch a tree trunk until it pops out as an item.=Sammeln Sie ein Stück Holz vom Boden auf.@nTipp: Hauen Sie einen Baumstamm, bis er als Gegenstand herausploppt. -Pick up leather from the floor.@nHint: Cows and some other animals have a chance to drop leather, when killed.=Sammeln Sie Leder vom Boden auf.@nTipp: Kühe und einige andere Tiere werfen vielleicht Leder ab, wenn sie sterben. -Place a dispenser.=Platzieren Sie einen Werfer -Place a flower pot.=Platzieren Sie einen Blumentopf -Pork Chop=Kassler -Pot Planter=Topfpflanzer -Rabbit Season=Kaninchensaison -Sniper Duel=Scharfschützenduell -Take a cooked fish from a furnace.@nHint: Use a fishing rod to catch a fish and cook it in a furnace.=Nehmen Sie einen gekochten Fisch aus einem Ofen.@nTipp: Benutzen Sie eine Angel, um einen Fisch zu fangen und kochen Sie ihn in einem Ofen. -Take an iron ingot from a furnace's output slot.@nHint: To smelt an iron ingot, put a fuel (like coal) and iron ore into a furnace.=Nehmen Sie einen Eisenbarren aus dem Ausgabeschlitz eines Ofens.@nTipp: Um einen Eisenbarren zu erhalten, platzieren Sie einen Brennstoff (wie Kohle) und Eisenerz in einen Ofen. -The Haggler=Der Sammler -The Lie=Die Lüge -Time to Farm!=Bauernzeit -Time to Mine!=Zeit zum Graben! -Time to Strike!=Zuschlagen! -Travel by minecart for at least 1000 meters from your starting point in a single ride.=Reisen Sie mit einer Lore für mindestens 1000 Meter vom Startpunkt aus in einer einzigen Fahrt. -Use 8 cobblestones to craft a furnace.=Benutzen Sie 8 Kopfsteinpflaster, um einen Ofen zu fertigen. -Use a crafting table to craft a wooden hoe from wooden planks and sticks.=Benutzen Sie eine Werkbank, um eine Holzhacke aus Holzplanken und Stöcken zu fertigen. -Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.=Benutzen Sie eine Werkbank, um eine Holzspitzhacke aus Holzplanken und Stöcken zu fertigen. -Use obsidian and a fire starter to construct a Nether portal.=Benutzen Sie Obsidian und ein Feuerzeug, um ein Netherportal zu errichten. -Use wheat to craft a bread.=Benutzen Sie Weizen, um ein Brot zu machen. diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr deleted file mode 100644 index 2044e8261d..0000000000 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr +++ /dev/null @@ -1,49 +0,0 @@ -# textdomain:mcl_achievements -Aquire Hardware=Obteniendo un lingote -Bake Bread=Horneando pan -Benchmarking=Crea tu mesa de trabajo -Cow Tipper=Consiguiendo cuero -Craft a bookshelf.=Crea una estantería. -Craft a cake using wheat, sugar, milk and an egg.=Crea una tarta con trigo, azúcar, leche y un huevo. -Craft a crafting table from 4 wooden planks.=Crea una mesa de trabajo con 4 tablas de madera procesada. -Craft a stone pickaxe using sticks and cobblestone.=Crea un pico de piedra con palos y rocas. -Craft a wooden sword using wooden planks and sticks on a crafting table.=Haz una espada de madera con tablas de madera y palos en una mesa de trabajo. -DIAMONDS!=¡Diamantes! -Delicious Fish=Delicioso pescado -Dispense With This=Prescinda de esto -Eat a cooked porkchop.=Come una chuleta de cerdo cocinado. -Eat a cooked rabbit.=Come un conejo cocinado. -Get really desperate and eat rotten flesh.=Desesperate y come carne podrida. -Getting Wood=Obtén madera -Getting an Upgrade=Obteniendo una mejora -Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters.=Golpear un esqueleto, Wither o desviarle con arco y flecha desde una distancia de al menos 20 metros. -Hot Topic=Tema candente -Into Fire=En el fuego -Into the Nether=En el abismo -Iron Belly=Vientre de hierro -Librarian=Bibliotecario -Mine emerald ore.=Mina de esmeralda. -On A Rail=Viajando en un carril -Pick up a blaze rod from the floor.=Recoge una barra de fuego del suelo. -Pick up a diamond from the floor.=Recoge un diamante del suelo. -Pick up a wood item from the ground.@nHint: Punch a tree trunk until it pops out as an item.=Recoge un elemento de madera del suelo. @nSugerencia: Golpee el tronco de un árbol hasta que salga como un elemento. -Pick up leather from the floor.@nHint: Cows and some other animals have a chance to drop leather, when killed.=Recoja el cuero del suelo. @nSugerencia: Las vacas y algunos otros animales tienen la oportunidad de soltar el cuero cuando mueren. -Place a dispenser.=Coloca un dispensador. -Place a flower pot.=Coloca una maceta. -Pork Chop=Chuleta de cerdo -Pot Planter=Jardinero -Rabbit Season=Temporada del conejo -Sniper Duel=Duelo de arqueros -Take a cooked fish from a furnace.@nHint: Use a fishing rod to catch a fish and cook it in a furnace.=Tome un pescado cocido de un horno. @nSugerencia: Use una caña de pescar para atrapar un pez y cocínelo en un horno. -Take an iron ingot from a furnace's output slot.@nHint: To smelt an iron ingot, put a fuel (like coal) and iron ore into a furnace.=Obtén un lingote de hierro de un horno. @nSugerencia: Para fundir un lingote de hierro, coloque un combustible (como carbón) y mineral de hierro en un horno. -The Haggler=El regateador -The Lie=El cocinero -Time to Farm!=¡Hora de cultivar! -Time to Mine!=¡Hora de minar! -Time to Strike!=¡Hora de atacar! -Travel by minecart for at least 1000 meters from your starting point in a single ride.=Viaje en un carro minero durante al menos 1000 metros desde su punto de partida en un solo viaje. -Use 8 cobblestones to craft a furnace.=Usa 8 rocas para crear un horno. -Use a crafting table to craft a wooden hoe from wooden planks and sticks.=Usa una mesa de trabajo para hacer una azada de madera con tablas de madera procesada y palos de madera. -Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.=Usa una mesa de trabajo para hacer un pico de madera con tablas de madera procesada y palos de madera. -Use obsidian and a fire starter to construct a Nether portal.=Usa obsidiana y un iniciador de fuego para construir un portal abisal. -Use wheat to craft a bread.=Usa trigo para elaborar pan. diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr deleted file mode 100644 index ae4941d2e1..0000000000 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr +++ /dev/null @@ -1,49 +0,0 @@ -# textdomain:mcl_achievements -Aquire Hardware=Acquérir du matériel -Bake Bread=Faire du pain -Benchmarking=Fabriquer -Cow Tipper=Chevaucher une vache -Craft a bookshelf.=Fabriquez une Bibliothèque. -Craft a cake using wheat, sugar, milk and an egg.=Fabriquez un gâteau avec du blé, du sucre, du lait et un œuf. -Craft a crafting table from 4 wooden planks.=Fabriquez un établi à partir de 4 planches de bois. -Craft a stone pickaxe using sticks and cobblestone.=Fabriquez une pioche en pierre à l'aide de bâtons et de pierre. -Craft a wooden sword using wooden planks and sticks on a crafting table.=Fabriquez une épée en bois à l'aide de planches et de bâtons en bois sur un établi. -DIAMONDS!=DIAMANTS! -Delicious Fish=Délicieux Poisson -Dispense With This=Dispenser de ça -Eat a cooked porkchop.=Mangez du porc cuit. -Eat a cooked rabbit.=Mangez du lapin cuit. -Get really desperate and eat rotten flesh.=Soyez vraiment désespéré et mangez de la chair pourrie. -Getting Wood=Obtenir du bois -Getting an Upgrade=Obtenir une augmentaton de niveau -Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters.=Frappez un squelette, wither squelette ou stray à l'arc et à la flèche à une distance d'au moins 20 mètres. -Hot Topic=Sujet brûlant -Into Fire=Dans le feu -Into the Nether=Dans le Nether -Iron Belly=Ventre de fer -Librarian=Bibliothécaire -Mine emerald ore.=Mine de minerai d'émeraude. -On A Rail=Sur un rail -Pick up a blaze rod from the floor.=Ramassez une tige de feu sur le sol. -Pick up a diamond from the floor.=Ramassez un diamant sur le sol. -Pick up a wood item from the ground.@nHint: Punch a tree trunk until it pops out as an item.=Ramassez un objet en bois du sol.@nConseil: Frappez un tronc d'arbre jusqu'à ce qu'il ressorte comme un objet. -Pick up leather from the floor.@nHint: Cows and some other animals have a chance to drop leather, when killed.=Ramassez le cuir du sol.@nConseil: Les vaches et certains autres animaux ont une chance de laisser tomber le cuir lorsqu'ils sont tués. -Place a dispenser.=Placez un distributeur. -Place a flower pot.=Placez un pot de fleurs. -Pork Chop=Côtelette de porc -Pot Planter=Jardinière en pot -Rabbit Season=Saison du lapin -Sniper Duel=Duel de sniper -Take a cooked fish from a furnace.@nHint: Use a fishing rod to catch a fish and cook it in a furnace.=Prenez un poisson cuit d'un four.@nConseil: Utilisez une canne à pêche pour attraper un poisson et faites-le cuire dans un four. -Take an iron ingot from a furnace's output slot.@nHint: To smelt an iron ingot, put a fuel (like coal) and iron ore into a furnace.=Prenez un lingot de fer dans la fente de sortie d'un four.@nConseil: Pour faire fondre un lingot de fer, mettez du combustible (comme du charbon) et du minerai de fer dans un four. -The Haggler=Le marchand -The Lie=Le mensonge -Time to Farm!=C'est l'heure du fermier! -Time to Mine!=C'est l'heure de miner! -Time to Strike!=C'est l'heure de combattre! -Travel by minecart for at least 1000 meters from your starting point in a single ride.=Voyagez en wagonnet sur au moins 1000 mètres de votre point de départ en une seule fois. -Use 8 cobblestones to craft a furnace.=Utilise 8 pierres pour fabriquer un four. -Use a crafting table to craft a wooden hoe from wooden planks and sticks.=Utilisez un établi pour fabriquer une houe en bois à partir de planches et de bâtons en bois. -Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.=Utilisez un établi pour fabriquer une pioche en bois à partir de planches et de bâtons en bois. -Use obsidian and a fire starter to construct a Nether portal.=Utilisez de l'obsidienne et un briquet pour construire un portail du Nether. -Use wheat to craft a bread.=Utilisez du blé pour fabriquer un pain. diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.pl.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.pl.tr deleted file mode 100644 index 78ab53f820..0000000000 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.pl.tr +++ /dev/null @@ -1,50 +0,0 @@ -# textdomain:mcl_achievements -Aquire Hardware=Zdobądź narzędzie -Bake Bread=Upiecz chleb -Benchmarking=Rzemieślnictwo -Cow Tipper=Raz krowie śmierć -Craft a bookshelf.=Wytwórz półkę z książkami. -Craft a cake using wheat, sugar, milk and an egg.=Wytwórz ciasto z pszenicy, cukru, mleka i jajka. -Craft a crafting table from 4 wooden planks.=Wytwórz stół rzemieślniczy z 4 desek. -Craft a stone pickaxe using sticks and cobblestone.=Wytwórz kamienny kilof korzystając z patyków i brukowca. -Craft a wooden sword using wooden planks and sticks on a crafting table.=Wytwórz drewniany miecz korzystając z desek i patyków na stole rzemieślniczym. -DIAMONDS!=DIAMENTY! -Delicious Fish=Pyszna ryba -Dispense With This=Dozuj to -Eat a cooked porkchop.=Zjedz upieczony kotlet. -Eat a cooked rabbit.=Zjedz pieczonego królika. -Get really desperate and eat rotten flesh.=Bądź zdesperowany i zjedz zgniłe mięso. -Getting Wood=Zbieranie drewna -Getting an Upgrade=Ulepszenie -Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters.=Traf szkieleta, witherowego szkieleta lub tułacza strzałą z łuku z odległości co najmniej 20 metrów. -Hot Topic=Gorący temat -Into Fire=W ogień -Into the Nether=W Nether -Iron Belly=Żelazny żołądek -Librarian=Bibliotekarz -Mine emerald ore.=Wykop rudę szmaragdu. -On A Rail=Na torach -Pick up a blaze rod from the floor.=Podnieś płomienną różdżkę z podłogi. -Pick up a diamond from the floor.=Ponieś diament z podłogi. -Pick up a wood item from the ground.@nHint: Punch a tree trunk until it pops out as an item.=Podnieś drewniany przedmiot z ziemi.@nPodpowiedź: Uderzaj pień drzewa dopóki nie wyleci jako przedmiot. -Pick up leather from the floor.@nHint: Cows and some other animals have a chance to drop leather, when killed.=Podnieś skórkę z ziemi.@nPodpowiedź: Krowy i inne zwierzęta mają szansę upuścić skórę gdy zostaną zabite. -Place a dispenser.=Postaw dozownik. -Place a flower pot.=Postaw doniczkę. -Pork Chop=Kotlet -Pot Planter=Ogrodnik -Rabbit Season=Sezon na króliki -Sniper Duel=Pojedynek snajperów -Take a cooked fish from a furnace.@nHint: Use a fishing rod to catch a fish and cook it in a furnace.=Weź upieczoną rybę z pieca.@nPodpowiedź: Użyj wędki aby złapać rybę i upiecz ją w piecu. -Take an iron ingot from a furnace's output slot.@nHint: To smelt an iron ingot, put a fuel (like coal) and iron ore into a furnace.=Weź sztabkę żelaza z wyjściowego miejsca pieca.@nPodpowiedź: Aby wytopić sztabkę żelaza, umieść paliwo (np. węgiel) w piecu. -The Haggler=Handlarz -The Lie=Kłamstwo -Time to Farm!=Czas na rolnictwo! -Time to Mine!=Czas na kopanie! -Time to Strike!=Czas na atak! -Travel by minecart for at least 1000 meters from your starting point in a single ride.=Przejedź przez przynajmniej 1000 metrów od punktu startowego pojedynczą przejażdżką. -Use 8 cobblestones to craft a furnace.=Użyj 8 brukowców by wytworzyć piec. -Use a crafting table to craft a wooden hoe from wooden planks and sticks.=Użyj stołu rzemieślniczego aby wytworzyć drewnianą motykę z desek i patyków. -Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.=Użyj stołu rzemieślniczego aby wytworzyć drewniany kilof z desek i patyków. -Use obsidian and a fire starter to construct a Nether portal.=Użyj obsydianu i źródła ognia aby skonstruować portal do Netheru. -Use wheat to craft a bread.=Użyj pszenicy by wytworzyć chleb. - diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.ru.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.ru.tr deleted file mode 100644 index 0db2ae99d6..0000000000 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.ru.tr +++ /dev/null @@ -1,49 +0,0 @@ -# textdomain:mcl_achievements -Aquire Hardware=Куй Железо -Bake Bread=Хлеб всему голова -Benchmarking=Верстак -Cow Tipper=Кожа да кости -Craft a bookshelf.=Создание книжной полки -Craft a cake using wheat, sugar, milk and an egg.=Создание торта из пшеницы, сахара, молока и яйца. -Craft a crafting table from 4 wooden planks.=Создание верстака из 4 досок. -Craft a stone pickaxe using sticks and cobblestone.=Создание каменного топора из палок и булыжников. -Craft a wooden sword using wooden planks and sticks on a crafting table.=Изготовление деревянного меча из досок и палок на верстаке. -DIAMONDS!=АЛМАЗЫ! -Delicious Fish=Вкусная Рыба -Dispense With This=Раздавай Это -Eat a cooked porkchop.=Употребление в пищу приготовленной свиной отбивной. -Eat a cooked rabbit.=Употребление в пищу приготовленного кролика. -Get really desperate and eat rotten flesh.=Отчаянное и необдуманное употребление в пищу гнилого мяса -Getting Wood=Рубка Леса -Getting an Upgrade=Модернизация -Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters.=Удар по скелету, скелету-иссушителю либо уклонение от стрелы на расстоянии не менее 20 метров. -Hot Topic=Автор Жжёт -Into Fire=В Огне -Into the Nether=В Аду -Iron Belly=Железный Живот -Librarian=Библиотекарь -Mine emerald ore.=Добыча изумрудной руды. -On A Rail=На Рельсах -Pick up a blaze rod from the floor.=Поднятие огненного стержня с пола. -Pick up a diamond from the floor.=Поднятие алмаза с пола. -Pick up a wood item from the ground.@nHint: Punch a tree trunk until it pops out as an item.=Поднятие дерева с земли.@nПодсказка: Бейте по стволу, пока он не упадёт на землю, превратившись в предмет. -Pick up leather from the floor.@nHint: Cows and some other animals have a chance to drop leather, when killed.=Поднятие кожи с пола.@nПодсказка: Коровы и некоторые другие животные могут оставлять кожу, если их убивать. -Place a dispenser.=Установка диспенсера. -Place a flower pot.=Установка цветочного горшка. -Pork Chop=Свиная Отбивная -Pot Planter=Сажатель Горшков -Rabbit Season=Кроличий Сезон -Sniper Duel=Снайперская Дуэль -Take a cooked fish from a furnace.@nHint: Use a fishing rod to catch a fish and cook it in a furnace.=Приготовление рыбы в печи.@nПодсказка: Ловите рыбу удочкой и готовьте её в печи. -Take an iron ingot from a furnace's output slot.@nHint: To smelt an iron ingot, put a fuel (like coal) and iron ore into a furnace.=Получение слитка железа из печи.@nПодсказка: чтобы переплавить железную руду, нужно положить её в печь и туда же поместить топливо (уголь или другое). -The Haggler=Хагглер -The Lie=Тортик -Time to Farm!=Время фермерства! -Time to Mine!=Время добывать! -Time to Strike!=Время сражаться! -Travel by minecart for at least 1000 meters from your starting point in a single ride.=Поездка на вагонетке минимум на 1000 метров от стартовой точки за один раз. -Use 8 cobblestones to craft a furnace.=Создание печи из 8 булыжников. -Use a crafting table to craft a wooden hoe from wooden planks and sticks.=Создание деревянной мотыги из досок и палок на верстаке. -Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.=Создание деревянной кирки из досок и палок на верстаке. -Use obsidian and a fire starter to construct a Nether portal.=Создание Адского портала при помощи обсидиана и огнива. -Use wheat to craft a bread.=Использование пшеницы для приготовления хлеба. diff --git a/mods/HUD/mcl_achievements/locale/template.txt b/mods/HUD/mcl_achievements/locale/template.txt deleted file mode 100644 index ecdba26728..0000000000 --- a/mods/HUD/mcl_achievements/locale/template.txt +++ /dev/null @@ -1,49 +0,0 @@ -# textdomain:mcl_achievements -Aquire Hardware= -Bake Bread= -Benchmarking= -Cow Tipper= -Craft a bookshelf.= -Craft a cake using wheat, sugar, milk and an egg.= -Craft a crafting table from 4 wooden planks.= -Craft a stone pickaxe using sticks and cobblestone.= -Craft a wooden sword using wooden planks and sticks on a crafting table.= -DIAMONDS!= -Delicious Fish= -Dispense With This= -Eat a cooked porkchop.= -Eat a cooked rabbit.= -Get really desperate and eat rotten flesh.= -Getting Wood= -Getting an Upgrade= -Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters.= -Hot Topic= -Into Fire= -Into the Nether= -Iron Belly= -Librarian= -Mine emerald ore.= -On A Rail= -Pick up a blaze rod from the floor.= -Pick up a diamond from the floor.= -Pick up a wood item from the ground.@nHint: Punch a tree trunk until it pops out as an item.= -Pick up leather from the floor.@nHint: Cows and some other animals have a chance to drop leather, when killed.= -Place a dispenser.= -Place a flower pot.= -Pork Chop= -Pot Planter= -Rabbit Season= -Sniper Duel= -Take a cooked fish from a furnace.@nHint: Use a fishing rod to catch a fish and cook it in a furnace.= -Take an iron ingot from a furnace's output slot.@nHint: To smelt an iron ingot, put a fuel (like coal) and iron ore into a furnace.= -The Haggler= -The Lie= -Time to Farm!= -Time to Mine!= -Time to Strike!= -Travel by minecart for at least 1000 meters from your starting point in a single ride.= -Use 8 cobblestones to craft a furnace.= -Use a crafting table to craft a wooden hoe from wooden planks and sticks.= -Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.= -Use obsidian and a fire starter to construct a Nether portal.= -Use wheat to craft a bread.= diff --git a/mods/HUD/mcl_achievements/mod.conf b/mods/HUD/mcl_achievements/mod.conf deleted file mode 100644 index ed11618d77..0000000000 --- a/mods/HUD/mcl_achievements/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = mcl_achievements -author = Wuzzy -description = Adds MCL2 Archivements -depends = awards diff --git a/mods/HUD/mcl_achievements/textures/mcl_achievements_button.png b/mods/HUD/mcl_achievements/textures/mcl_achievements_button.png deleted file mode 100644 index cef7e59cc0..0000000000 Binary files a/mods/HUD/mcl_achievements/textures/mcl_achievements_button.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/README.txt b/mods/HUD/mcl_inventory/README.txt deleted file mode 100644 index 7dd80f1a4b..0000000000 --- a/mods/HUD/mcl_inventory/README.txt +++ /dev/null @@ -1,29 +0,0 @@ -Minetest mod "Crafting" -======================= -Version: 2.0.1 - -License of source code and Textures: WTFPL ------------------------------------- -copyright (c) 2013-2014 by BlockMen - -This program is free software. It comes without any warranty, to -the extent permitted by applicable law. You can redistribute it -and/or modify it under the terms of the Do What The Fuck You Want -To Public License, Version 2, as published by Sam Hocevar. See -http://sam.zoy.org/wtfpl/COPYING for more details. - - ---USING the mod-- -================= - -This mod changes the players inventory (survival and creative) with more slots (9*4 instead of 8*4) -Like known from Minecraft you have a 2x2 crafting grid at inventory now. Furthermore a categorized creative -inventory and a support for stu's 3d armor mod (To use the armor and a preview of player). - -Left items in the crafting slots are dropped infront of you. - - -Crafting table -_________ - -Has been moved to mcl_crafting_table diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua deleted file mode 100644 index 4c2faaef6d..0000000000 --- a/mods/HUD/mcl_inventory/creative.lua +++ /dev/null @@ -1,701 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) -local F = minetest.formspec_escape -local C = minetest.colorize - --- Prepare player info table -local players = {} - --- Containing all the items for each Creative Mode tab -local inventory_lists = {} - ---local mod_player = minetest.get_modpath("mcl_player") - --- Create tables -local builtin_filter_ids = {"blocks","deco","redstone","rail","food","tools","combat","mobs","brew","matr","misc","all"} -for _, f in pairs(builtin_filter_ids) do - inventory_lists[f] = {} -end - -local function replace_enchanted_books(tbl) - for k, item in ipairs(tbl) do - if item:find("mcl_enchanting:book_enchanted") == 1 then - local _, enchantment, level = item:match("(%a+) ([_%w]+) (%d+)") - level = level and tonumber(level) - if enchantment and level then - tbl[k] = mcl_enchanting.enchant(ItemStack("mcl_enchanting:book_enchanted"), enchantment, level) - end - end - end -end - ---[[ Populate all the item tables. We only do this once. Note this code must be -executed after loading all the other mods in order to work. ]] -minetest.register_on_mods_loaded(function() - for name,def in pairs(minetest.registered_items) do - if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then - local function is_redstone(def) - return def.mesecons or def.groups.mesecon or def.groups.mesecon_conductor_craftable or def.groups.mesecon_effecor_off - end - local function is_tool(def) - return def.groups.tool or (def.tool_capabilities and def.tool_capabilities.damage_groups == nil) - end - local function is_weapon_or_armor(def) - return def.groups.weapon or def.groups.weapon_ranged or def.groups.ammo or def.groups.combat_item or ((def.groups.armor_head or def.groups.armor_torso or def.groups.armor_legs or def.groups.armor_feet or def.groups.horse_armor) and def.groups.non_combat_armor ~= 1) - end - -- Is set to true if it was added in any category besides misc - local nonmisc = false - if def.groups.building_block then - table.insert(inventory_lists["blocks"], name) - nonmisc = true - end - if def.groups.deco_block then - table.insert(inventory_lists["deco"], name) - nonmisc = true - end - if is_redstone(def) then - table.insert(inventory_lists["redstone"], name) - nonmisc = true - end - if def.groups.transport then - table.insert(inventory_lists["rail"], name) - nonmisc = true - end - if (def.groups.food and not def.groups.brewitem) or def.groups.eatable then - table.insert(inventory_lists["food"], name) - nonmisc = true - end - if is_tool(def) then - table.insert(inventory_lists["tools"], name) - nonmisc = true - end - if is_weapon_or_armor(def) then - table.insert(inventory_lists["combat"], name) - nonmisc = true - end - if def.groups.spawn_egg == 1 then - table.insert(inventory_lists["mobs"], name) - nonmisc = true - end - if def.groups.brewitem then - table.insert(inventory_lists["brew"], name) - nonmisc = true - end - if def.groups.craftitem then - table.insert(inventory_lists["matr"], name) - nonmisc = true - end - -- Misc. category is for everything which is not in any other category - if not nonmisc then - table.insert(inventory_lists["misc"], name) - end - - table.insert(inventory_lists["all"], name) - end - end - - for ench, def in pairs(mcl_enchanting.enchantments) do - local str = "mcl_enchanting:book_enchanted " .. ench .. " " .. def.max_level - if def.inv_tool_tab then - table.insert(inventory_lists["tools"], str) - end - if def.inv_combat_tab then - table.insert(inventory_lists["combat"], str) - end - table.insert(inventory_lists["all"], str) - end - - for _, to_sort in pairs(inventory_lists) do - table.sort(to_sort) - replace_enchanted_books(to_sort) - end -end) - -local function filter_item(name, description, lang, filter) - local desc - if not lang then - desc = string.lower(description) - else - desc = string.lower(minetest.get_translated_string(lang, description)) - end - return string.find(name, filter) or string.find(desc, filter) -end - -local function set_inv_search(filter, player) - local playername = player:get_player_name() - local inv = minetest.get_inventory({type="detached", name="creative_"..playername}) - local creative_list = {} - local lang = minetest.get_player_information(playername).lang_code - for name,def in pairs(minetest.registered_items) do - if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then - if filter_item(string.lower(def.name), def.description, lang, filter) then - table.insert(creative_list, name) - end - end - end - for ench, def in pairs(mcl_enchanting.enchantments) do - for i = 1, def.max_level do - local stack = mcl_enchanting.enchant(ItemStack("mcl_enchanting:book_enchanted"), ench, i) - if filter_item("mcl_enchanting:book_enchanted", minetest.strip_colors(stack:get_description()), lang, filter) then - table.insert(creative_list, "mcl_enchanting:book_enchanted " .. ench .. " " .. i) - end - end - end - table.sort(creative_list) - replace_enchanted_books(creative_list) - - inv:set_size("main", #creative_list) - inv:set_list("main", creative_list) -end - -local function set_inv_page(page, player) - local playername = player:get_player_name() - local inv = minetest.get_inventory({type="detached", name="creative_"..playername}) - inv:set_size("main", 0) - local creative_list = {} - if inventory_lists[page] then -- Standard filter - creative_list = inventory_lists[page] - end - inv:set_size("main", #creative_list) - inv:set_list("main", creative_list) -end - -local function init(player) - local playername = player:get_player_name() - minetest.create_detached_inventory("creative_"..playername, { - allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) - if minetest.is_creative_enabled(playername) then - return count - else - return 0 - end - end, - allow_put = function(inv, listname, index, stack, player) - return 0 - end, - allow_take = function(inv, listname, index, stack, player) - if minetest.is_creative_enabled(player:get_player_name()) then - return -1 - else - return 0 - end - end, - }, playername) - set_inv_page("all", player) -end - --- Create the trash field -local trash = minetest.create_detached_inventory("trash", { - allow_put = function(inv, listname, index, stack, player) - if minetest.is_creative_enabled(player:get_player_name()) then - return stack:get_count() - else - return 0 - end - end, - on_put = function(inv, listname, index, stack, player) - inv:set_stack(listname, index, "") - end, -}) -trash:set_size("main", 1) - -local noffset = {} -- numeric tab offset -local offset = {} -- string offset: -local boffset = {} -- -local hoch = {} -local filtername = {} ---local bg = {} - -local noffset_x_start = -0.24 -local noffset_x = noffset_x_start -local noffset_y = -0.25 -local function next_noffset(id, right) - if right then - noffset[id] = { 8.94, noffset_y } - else - noffset[id] = { noffset_x, noffset_y } - noffset_x = noffset_x + 1.25 - end -end - --- Upper row -next_noffset("blocks") -next_noffset("deco") -next_noffset("redstone") -next_noffset("rail") -next_noffset("brew") -next_noffset("misc") -next_noffset("nix", true) - -noffset_x = noffset_x_start -noffset_y = 8.12 - --- Lower row -next_noffset("food") -next_noffset("tools") -next_noffset("combat") -next_noffset("mobs") -next_noffset("matr") -next_noffset("inv", true) - -for k,v in pairs(noffset) do - offset[k] = tostring(v[1]) .. "," .. tostring(v[2]) - boffset[k] = tostring(v[1]+0.19) .. "," .. tostring(v[2]+0.25) -end - -hoch["blocks"] = "" -hoch["deco"] = "" -hoch["redstone"] = "" -hoch["rail"] = "" -hoch["brew"] = "" -hoch["misc"] = "" -hoch["nix"] = "" -hoch["default"] = "" -hoch["food"] = "_down" -hoch["tools"] = "_down" -hoch["combat"] = "_down" -hoch["mobs"] = "_down" -hoch["matr"] = "_down" -hoch["inv"] = "_down" - -filtername["blocks"] = S("Building Blocks") -filtername["deco"] = S("Decoration Blocks") -filtername["redstone"] = S("Redstone") -filtername["rail"] = S("Transportation") -filtername["misc"] = S("Miscellaneous") -filtername["nix"] = S("Search Items") -filtername["food"] = S("Foodstuffs") -filtername["tools"] = S("Tools") -filtername["combat"] = S("Combat") -filtername["mobs"] = S("Mobs") -filtername["brew"] = S("Brewing") -filtername["matr"] = S("Materials") -filtername["inv"] = S("Survival Inventory") - ---local dark_bg = "crafting_creative_bg_dark.png" - ---[[local function reset_menu_item_bg() - bg["blocks"] = dark_bg - bg["deco"] = dark_bg - bg["redstone"] = dark_bg - bg["rail"] = dark_bg - bg["misc"] = dark_bg - bg["nix"] = dark_bg - bg["food"] = dark_bg - bg["tools"] = dark_bg - bg["combat"] = dark_bg - bg["mobs"] = dark_bg - bg["brew"] = dark_bg - bg["matr"] = dark_bg - bg["inv"] = dark_bg - bg["default"] = dark_bg -end]] - -local function get_stack_size(player) - return player:get_meta():get_int("mcl_inventory:switch_stack") -end - -local function set_stack_size(player, n) - player:get_meta():set_int("mcl_inventory:switch_stack", n) -end - -minetest.register_on_joinplayer(function (player) - if get_stack_size(player) == 0 then - set_stack_size(player, 64) - end -end) - -function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, show, page, filter) - --reset_menu_item_bg() - pagenum = math.floor(pagenum) or 1 - - local playername = player:get_player_name() - - if not inv_size then - if page == "nix" then - local inv = minetest.get_inventory({type="detached", name="creative_"..playername}) - inv_size = inv:get_size("main") - elseif page and page ~= "inv" then - inv_size = #(inventory_lists[page]) - else - inv_size = 0 - end - end - local pagemax = math.max(1, math.floor((inv_size-1) / (9*5) + 1)) - local name = "nix" - local main_list - local listrings = "listring[detached:creative_"..playername..";main]".. - "listring[current_player;main]".. - "listring[detached:trash;main]" - - if page then - name = page - if players[playername] then - players[playername].page = page - end - end - --bg[name] = "crafting_creative_bg.png" - - local inv_bg = "crafting_inventory_creative.png" - if name == "inv" then - inv_bg = "crafting_inventory_creative_survival.png" - - -- Background images for armor slots (hide if occupied) - local armor_slot_imgs = "" - local inv = player:get_inventory() - if inv:get_stack("armor", 2):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[2.5,1.3;1,1;mcl_inventory_empty_armor_slot_helmet.png]" - end - if inv:get_stack("armor", 3):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[2.5,2.75;1,1;mcl_inventory_empty_armor_slot_chestplate.png]" - end - if inv:get_stack("armor", 4):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[5.5,1.3;1,1;mcl_inventory_empty_armor_slot_leggings.png]" - end - if inv:get_stack("armor", 5):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[5.5,2.75;1,1;mcl_inventory_empty_armor_slot_boots.png]" - end - - if inv:get_stack("offhand", 1):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[1.5,2.025;1,1;mcl_inventory_empty_armor_slot_shield.png]" - end - - local stack_size = get_stack_size(player) - - -- Survival inventory slots - main_list = "list[current_player;main;0,3.75;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,3.75,9,3).. - -- armor - "list[current_player;armor;2.5,1.3;1,1;1]".. - "list[current_player;armor;2.5,2.75;1,1;2]".. - "list[current_player;armor;5.5,1.3;1,1;3]".. - "list[current_player;armor;5.5,2.75;1,1;4]".. - mcl_formspec.get_itemslot_bg(2.5,1.3,1,1).. - mcl_formspec.get_itemslot_bg(2.5,2.75,1,1).. - mcl_formspec.get_itemslot_bg(5.5,1.3,1,1).. - mcl_formspec.get_itemslot_bg(5.5,2.75,1,1).. - "list[current_player;offhand;1.5,2.025;1,1]".. - mcl_formspec.get_itemslot_bg(1.5,2.025,1,1).. - armor_slot_imgs.. - -- player preview - mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "").. - -- crafting guide button - "image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]".. - "tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]".. - -- help button - "image_button[9,2;1,1;doc_button_icon_lores.png;__mcl_doc;]".. - "tooltip[__mcl_doc;"..F(S("Help")).."]".. - -- skins button - "image_button[9,3;1,1;mcl_skins_button.png;__mcl_skins;]".. - "tooltip[__mcl_skins;"..F(S("Select player skin")).."]".. - -- achievements button - "image_button[9,4;1,1;mcl_achievements_button.png;__mcl_achievements;]".. - --"style_type[image_button;border=;bgimg=;bgimg_pressed=]".. - "tooltip[__mcl_achievements;"..F(S("Achievements")).."]".. - -- switch stack size button - "image_button[9,5;1,1;default_apple.png;__switch_stack;]".. - "label[9.4,5.4;".. F(C("#FFFFFF", stack_size ~= 1 and stack_size or "")) .."]".. - "tooltip[__switch_stack;"..F(S("Switch stack size")).."]" - - -- For shortcuts - listrings = listrings .. - "listring[detached:"..playername.."_armor;armor]".. - "listring[current_player;main]" - else - -- Creative inventory slots - main_list = "list[detached:creative_"..playername..";main;0,1.75;9,5;"..tostring(start_i).."]".. - mcl_formspec.get_itemslot_bg(0,1.75,9,5).. - -- Page buttons - "label[9.0,5.5;"..F(S("@1/@2", pagenum, pagemax)).."]".. - "image_button[9.0,6.0;0.7,0.7;crafting_creative_prev.png;creative_prev;]".. - "image_button[9.5,6.0;0.7,0.7;crafting_creative_next.png;creative_next;]" - end - - local tab_icon = { - blocks = "mcl_core:brick_block", - deco = "mcl_flowers:peony", - redstone = "mesecons:redstone", - rail = "mcl_minecarts:golden_rail", - misc = "mcl_buckets:bucket_lava", - nix = "mcl_compass:compass", - food = "mcl_core:apple", - tools = "mcl_core:axe_iron", - combat = "mcl_core:sword_gold", - mobs = "mobs_mc:cow", - brew = "mcl_potions:dragon_breath", - matr = "mcl_core:stick", - inv = "mcl_chests:chest", - } - local function tab(current_tab, this_tab) - local bg_img - if current_tab == this_tab then - bg_img = "crafting_creative_active"..hoch[this_tab]..".png" - else - bg_img = "crafting_creative_inactive"..hoch[this_tab]..".png" - end - return - "style["..this_tab..";border=false;bgimg=;bgimg_pressed=]".. - "item_image_button[" .. boffset[this_tab] ..";1,1;"..tab_icon[this_tab]..";"..this_tab..";]".. - "image[" .. offset[this_tab] .. ";1.5,1.44;" .. bg_img .. "]" - end - local caption = "" - if name ~= "inv" and filtername[name] then - caption = "label[0,1.2;"..F(minetest.colorize("#313131", filtername[name])).."]" - end - - local formspec = "size[10,9.3]".. - "no_prepend[]".. - mcl_vars.gui_nonbg..mcl_vars.gui_bg_color.. - "background[-0.19,-0.25;10.5,9.87;"..inv_bg.."]".. - "label[-5,-5;"..name.."]".. - tab(name, "blocks") .. - "tooltip[blocks;"..F(filtername["blocks"]).."]".. - tab(name, "deco") .. - "tooltip[deco;"..F(filtername["deco"]).."]".. - tab(name, "redstone") .. - "tooltip[redstone;"..F(filtername["redstone"]).."]".. - tab(name, "rail") .. - "tooltip[rail;"..F(filtername["rail"]).."]".. - tab(name, "misc") .. - "tooltip[misc;"..F(filtername["misc"]).."]".. - tab(name, "nix") .. - "tooltip[nix;"..F(filtername["nix"]).."]".. - caption.. - "list[current_player;main;0,7;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7,9,1).. - main_list.. - tab(name, "food") .. - "tooltip[food;"..F(filtername["food"]).."]".. - tab(name, "tools") .. - "tooltip[tools;"..F(filtername["tools"]).."]".. - tab(name, "combat") .. - "tooltip[combat;"..F(filtername["combat"]).."]".. - tab(name, "mobs") .. - "tooltip[mobs;"..F(filtername["mobs"]).."]".. - tab(name, "brew") .. - "tooltip[brew;"..F(filtername["brew"]).."]".. - tab(name, "matr") .. - "tooltip[matr;"..F(filtername["matr"]).."]".. - tab(name, "inv") .. - "tooltip[inv;"..F(filtername["inv"]).."]".. - "list[detached:trash;main;9,7;1,1;]".. - mcl_formspec.get_itemslot_bg(9,7,1,1).. - "image[9,7;1,1;crafting_creative_trash.png]".. - listrings - - if name == "nix" then - if filter == nil then - filter = "" - end - formspec = formspec .. "field[5.3,1.34;4,0.75;search;;"..minetest.formspec_escape(filter).."]" - formspec = formspec .. "field_close_on_enter[search;false]" - end - if pagenum then formspec = formspec .. "p"..tostring(pagenum) end - player:set_inventory_formspec(formspec) -end - -minetest.register_on_player_receive_fields(function(player, formname, fields) - local page = nil - - if not minetest.is_creative_enabled(player:get_player_name()) then - return - end - if formname ~= "" or fields.quit == "true" then - -- No-op if formspec closed or not player inventory (formname == "") - return - end - - local name = player:get_player_name() - - if fields.blocks then - if players[name].page == "blocks" then return end - set_inv_page("blocks",player) - page = "blocks" - elseif fields.deco then - if players[name].page == "deco" then return end - set_inv_page("deco",player) - page = "deco" - elseif fields.redstone then - if players[name].page == "redstone" then return end - set_inv_page("redstone",player) - page = "redstone" - elseif fields.rail then - if players[name].page == "rail" then return end - set_inv_page("rail",player) - page = "rail" - elseif fields.misc then - if players[name].page == "misc" then return end - set_inv_page("misc",player) - page = "misc" - elseif fields.nix then - set_inv_page("all",player) - page = "nix" - elseif fields.food then - if players[name].page == "food" then return end - set_inv_page("food",player) - page = "food" - elseif fields.tools then - if players[name].page == "tools" then return end - set_inv_page("tools",player) - page = "tools" - elseif fields.combat then - if players[name].page == "combat" then return end - set_inv_page("combat",player) - page = "combat" - elseif fields.mobs then - if players[name].page == "mobs" then return end - set_inv_page("mobs",player) - page = "mobs" - elseif fields.brew then - if players[name].page == "brew" then return end - set_inv_page("brew",player) - page = "brew" - elseif fields.matr then - if players[name].page == "matr" then return end - set_inv_page("matr",player) - page = "matr" - elseif fields.inv then - if players[name].page == "inv" then return end - page = "inv" - elseif fields.search == "" and not fields.creative_next and not fields.creative_prev then - set_inv_page("all", player) - page = "nix" - elseif fields.search and not fields.creative_next and not fields.creative_prev then - set_inv_search(string.lower(fields.search),player) - page = "nix" - elseif fields.__switch_stack then - local switch = 1 - if get_stack_size(player) == 1 then - switch = 64 - end - set_stack_size(player, switch) - end - - if page then - players[name].page = page - end - if players[name].page then - page = players[name].page - end - - -- Figure out current scroll bar from formspec - --local formspec = player:get_inventory_formspec() - - local start_i = players[name].start_i - - if fields.creative_prev then - start_i = start_i - 9*5 - elseif fields.creative_next then - start_i = start_i + 9*5 - else - -- Reset scroll bar if not scrolled - start_i = 0 - end - if start_i < 0 then - start_i = start_i + 9*5 - end - - local inv_size - if page == "nix" then - local inv = minetest.get_inventory({type="detached", name="creative_"..name}) - inv_size = inv:get_size("main") - elseif page and page ~= "inv" then - inv_size = #(inventory_lists[page]) - else - inv_size = 0 - end - - if start_i >= inv_size then - start_i = start_i - 9*5 - end - if start_i < 0 or start_i >= inv_size then - start_i = 0 - end - players[name].start_i = start_i - - local filter = "" - if not fields.nix and fields.search and fields.search ~= "" then - filter = fields.search - players[name].filter = filter - end - - mcl_inventory.set_creative_formspec(player, start_i, start_i / (9*5) + 1, inv_size, false, page, filter) -end) - - -if minetest.is_creative_enabled("") then - minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) - -- Place infinite nodes, except for shulker boxes - local group = minetest.get_item_group(itemstack:get_name(), "shulker_box") - return group == 0 or group == nil - end) - - function minetest.handle_node_drops(pos, drops, digger) - if not digger or not digger:is_player() then - for _,item in ipairs(drops) do - minetest.add_item(pos, item) - end - end - local inv = digger:get_inventory() - if inv then - for _,item in ipairs(drops) do - if not inv:contains_item("main", item, true) then - inv:add_item("main", item) - end - end - end - end - - mcl_inventory.update_inventory_formspec = function(player) - local page - - local name = player:get_player_name() - - if players[name].page then - page = players[name].page - else - page = "nix" - end - - -- Figure out current scroll bar from formspec - --local formspec = player:get_inventory_formspec() - local start_i = players[name].start_i - - local inv_size - if page == "nix" then - local inv = minetest.get_inventory({type="detached", name="creative_"..name}) - inv_size = inv:get_size("main") - elseif page and page ~= "inv" then - inv_size = #(inventory_lists[page]) - else - inv_size = 0 - end - - local filter = players[name].filter - if filter == nil then - filter = "" - end - - mcl_inventory.set_creative_formspec(player, start_i, start_i / (9*5) + 1, inv_size, false, page, filter) - end -end - -minetest.register_on_joinplayer(function(player) - -- Initialize variables and inventory - local name = player:get_player_name() - if not players[name] then - players[name] = {} - players[name].page = "nix" - players[name].filter = "" - players[name].start_i = 0 - end - init(player) - mcl_inventory.set_creative_formspec(player, 0, 1, nil, false, "nix", "") -end) - -minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) - if minetest.is_creative_enabled(player:get_player_name()) and get_stack_size(player) == 64 and action == "put" and inventory_info.listname == "main" then - local stack = inventory_info.stack - stack:set_count(stack:get_stack_max()) - player:get_inventory():set_stack("main", inventory_info.index, stack) - end -end) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua deleted file mode 100644 index 1a73e59df7..0000000000 --- a/mods/HUD/mcl_inventory/init.lua +++ /dev/null @@ -1,242 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) -local F = minetest.formspec_escape - -mcl_inventory = {} - ---local mod_player = minetest.get_modpath("mcl_player") ---local mod_craftguide = minetest.get_modpath("mcl_craftguide") - --- Returns a single itemstack in the given inventory to the main inventory, or drop it when there's no space left -function return_item(itemstack, dropper, pos, inv) - if dropper:is_player() then - -- Return to main inventory - if inv:room_for_item("main", itemstack) then - inv:add_item("main", itemstack) - else - -- Drop item on the ground - local v = dropper:get_look_dir() - local p = {x=pos.x, y=pos.y+1.2, z=pos.z} - p.x = p.x+(math.random(1,3)*0.2) - p.z = p.z+(math.random(1,3)*0.2) - local obj = minetest.add_item(p, itemstack) - if obj then - v.x = v.x*4 - v.y = v.y*4 + 2 - v.z = v.z*4 - obj:set_velocity(v) - obj:get_luaentity()._insta_collect = false - end - end - else - -- Fallback for unexpected cases - minetest.add_item(pos, itemstack) - end - return itemstack -end - --- Return items in the given inventory list (name) to the main inventory, or drop them if there is no space left -function return_fields(player, name) - local inv = player:get_inventory() - local list = inv:get_list(name) - if not list then return end - for i,stack in ipairs(list) do - return_item(stack, player, player:get_pos(), inv) - stack:clear() - inv:set_stack(name, i, stack) - end -end - -local function set_inventory(player, armor_change_only) - if minetest.is_creative_enabled(player:get_player_name()) then - if armor_change_only then - -- Stay on survival inventory plage if only the armor has been changed - mcl_inventory.set_creative_formspec(player, 0, 0, nil, nil, "inv") - else - mcl_inventory.set_creative_formspec(player, 0, 1) - end - return - end - local inv = player:get_inventory() - inv:set_width("craft", 2) - inv:set_size("craft", 4) - - local armor_slots = {"helmet", "chestplate", "leggings", "boots"} - local armor_slot_imgs = "" - for a=1,4 do - if inv:get_stack("armor", a+1):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[0,"..(a-1)..";1,1;mcl_inventory_empty_armor_slot_"..armor_slots[a]..".png]" - end - end - - if inv:get_stack("offhand", 1):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[3,2;1,1;mcl_inventory_empty_armor_slot_shield.png]" - end - - local form = "size[9,8.75]".. - "background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png]".. - mcl_player.get_player_formspec_model(player, 1.0, 0.0, 2.25, 4.5, "").. - --armor - "list[current_player;armor;0,0;1,1;1]".. - "list[current_player;armor;0,1;1,1;2]".. - "list[current_player;armor;0,2;1,1;3]".. - "list[current_player;armor;0,3;1,1;4]".. - mcl_formspec.get_itemslot_bg(0,0,1,1).. - mcl_formspec.get_itemslot_bg(0,1,1,1).. - mcl_formspec.get_itemslot_bg(0,2,1,1).. - mcl_formspec.get_itemslot_bg(0,3,1,1).. - "list[current_player;offhand;3,2;1,1]".. - mcl_formspec.get_itemslot_bg(3,2,1,1).. - armor_slot_imgs.. - -- craft and inventory - "label[0,4;"..F(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - "list[current_player;main;0,7.74;9,1;]".. - "label[4,0.5;"..F(minetest.colorize("#313131", S("Crafting"))).."]".. - "list[current_player;craft;4,1;2,2]".. - "list[current_player;craftpreview;7,1.5;1,1;]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - mcl_formspec.get_itemslot_bg(4,1,2,2).. - mcl_formspec.get_itemslot_bg(7,1.5,1,1).. - -- crafting guide button - "image_button[4.5,3;1,1;craftguide_book.png;__mcl_craftguide;]".. - "tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]".. - -- help button - "image_button[8,3;1,1;doc_button_icon_lores.png;__mcl_doc;]".. - "tooltip[__mcl_doc;"..F(S("Help")).."]".. - -- skins button - "image_button[3,3;1,1;mcl_skins_button.png;__mcl_skins;]".. - "tooltip[__mcl_skins;"..F(S("Select player skin")).."]".. - -- achievements button - "image_button[7,3;1,1;mcl_achievements_button.png;__mcl_achievements;]".. - "tooltip[__mcl_achievements;"..F(S("Achievements")).."]".. - -- for shortcuts - "listring[current_player;main]".. - "listring[current_player;armor]".. - "listring[current_player;main]" .. - "listring[current_player;craft]" .. - "listring[current_player;main]" - player:set_inventory_formspec(form) -end - --- Drop items in craft grid and reset inventory on closing -minetest.register_on_player_receive_fields(function(player, formname, fields) - if fields.quit then - return_fields(player,"craft") - return_fields(player,"enchanting_lapis") - return_fields(player,"enchanting_item") - if not minetest.is_creative_enabled(player:get_player_name()) and (formname == "" or formname == "main") then - set_inventory(player) - end - end -end) - -if not minetest.is_creative_enabled("") then - function mcl_inventory.update_inventory_formspec(player) - set_inventory(player) - end -end - --- Drop crafting grid items on leaving -minetest.register_on_leaveplayer(function(player) - return_fields(player, "craft") - return_fields(player, "enchanting_lapis") - return_fields(player, "enchanting_item") -end) - -minetest.register_on_joinplayer(function(player) - --init inventory - local inv = player:get_inventory() - inv:set_width("main", 9) - inv:set_size("main", 36) - inv:set_size("offhand", 1) - - --set hotbar size - player:hud_set_hotbar_itemcount(9) - --add hotbar images - player:hud_set_hotbar_image("mcl_inventory_hotbar.png") - player:hud_set_hotbar_selected_image("mcl_inventory_hotbar_selected.png") - - local old_update_player = mcl_armor.update_player - function mcl_armor.update_player(player, info) - old_update_player(player, info) - set_inventory(player, true) - end - - -- In Creative Mode, the initial inventory setup is handled in creative.lua - if not minetest.is_creative_enabled(player:get_player_name()) then - set_inventory(player) - end - - --[[ Make sure the crafting grid is empty. Why? Because the player might have - items remaining in the crafting grid from the previous join; this is likely - when the server has been shutdown and the server didn't clean up the player - inventories. ]] - return_fields(player, "craft") - return_fields(player, "enchanting_item") - return_fields(player, "enchanting_lapis") -end) - - -dofile(minetest.get_modpath(minetest.get_current_modname()).."/creative.lua") - -local mt_is_creative_enabled = minetest.is_creative_enabled - -function minetest.is_creative_enabled(name) - if mt_is_creative_enabled(name) then return true end - local p = minetest.get_player_by_name(name) - if p then - return p:get_meta():get_string("gamemode") == "creative" - end - return false -end - -local function in_table(n,h) - for k,v in pairs(h) do - if v == n then return true end - end - return false -end - -local gamemodes = { - "survival", - "creative" -} - -function mcl_inventory.player_set_gamemode(p,g) - local m = p:get_meta() - m:set_string("gamemode",g) - if g == "survival" then - mcl_experience.setup_hud(p) - mcl_experience.update(p) - elseif g == "creative" then - mcl_experience.remove_hud(p) - end - set_inventory(p) -end - -minetest.register_chatcommand("gamemode",{ - params = S("[] []"), - description = S("Change gamemode (survival/creative) for yourself or player"), - privs = { server = true }, - func = function(n,param) - -- Full input validation ( just for @erlehmann <3 ) - local p = minetest.get_player_by_name(n) - local args = param:split(" ") - if args[2] ~= nil then - p = minetest.get_player_by_name(args[2]) - end - if not p then - return false, S("Player not online") - end - if args[1] ~= nil and not in_table(args[1],gamemodes) then - return false, S("Gamemode " .. args[1] .. " does not exist.") - elseif args[1] ~= nil then - mcl_inventory.player_set_gamemode(p,args[1]) - end - --Result message - show effective game mode - local gm = p:get_meta():get_string("gamemode") - if gm == "" then gm = gamemodes[1] end - return true, S("Gamemode for player ")..n..S(": "..gm) - end -}) diff --git a/mods/HUD/mcl_inventory/locale/mcl_inventory.de.tr b/mods/HUD/mcl_inventory/locale/mcl_inventory.de.tr deleted file mode 100644 index d565240d17..0000000000 --- a/mods/HUD/mcl_inventory/locale/mcl_inventory.de.tr +++ /dev/null @@ -1,21 +0,0 @@ -# textdomain: mcl_inventory -Recipe book=Fertigungsbuch -Help=Hilfe -Select player skin=Spieleraussehen ändern -Achievements=Errungenschaften -Building Blocks=Baublöcke -Decoration Blocks=Dekoblöcke -Redstone=Redstone -Transportation=Transport -Brewing=Gebräu -Miscellaneous=Sonstiges -Search Items=Gegenstände durchsuchen -Foodstuffs=Lebensmittel -Tools=Werkzeuge -Combat=Kampf -Mobs=Mobs -Materials=Materialien -Survival Inventory=Überlebensinventar -Crafting=Fertigen -Inventory=Inventar -@1/@2=@1/@2 diff --git a/mods/HUD/mcl_inventory/locale/mcl_inventory.es.tr b/mods/HUD/mcl_inventory/locale/mcl_inventory.es.tr deleted file mode 100644 index d097daa14c..0000000000 --- a/mods/HUD/mcl_inventory/locale/mcl_inventory.es.tr +++ /dev/null @@ -1,20 +0,0 @@ -# textdomain: mcl_inventory -Recipe book=Libro de recetas -Help=Ayuda -Select player skin=Seleccionar skin -Achievements=Logros -Building Blocks=Bloques de construcción -Decoration Blocks=Bloques de decoración -Redstone=Redstone -Transportation=Transporte -Brewing= -Miscellaneous=Variado -Search Items=Buscar artículos -Foodstuffs=Productos alimenticios -Tools=Herramientas -Combat=Combate -Mobs=Mobs -Materials=Materiales -Survival Inventory=Inventario de supervivencia -Crafting=Elaboración -Inventory=Inventario diff --git a/mods/HUD/mcl_inventory/locale/mcl_inventory.fr.tr b/mods/HUD/mcl_inventory/locale/mcl_inventory.fr.tr deleted file mode 100644 index 208eb01dcb..0000000000 --- a/mods/HUD/mcl_inventory/locale/mcl_inventory.fr.tr +++ /dev/null @@ -1,21 +0,0 @@ -# textdomain: mcl_inventory -Recipe book=Livre de recettes -Help=Aide -Select player skin=Sélectionnez l'apparence du joueur -Achievements=Accomplissements -Building Blocks=Blocs de Construction -Decoration Blocks=Blocs de Décoration -Redstone=Redstone -Transportation=Transport -Brewing=Potion -Miscellaneous=Divers -Search Items=Rechercher des objets -Foodstuffs=Denrées alimentaires -Tools=Outils -Combat=Combat -Mobs=Mobs -Materials=Matériaux -Survival Inventory=Inventaire de survie -Crafting=Artisanat -Inventory=Inventaire -@1/@2=@1/@2 diff --git a/mods/HUD/mcl_inventory/locale/mcl_inventory.pl.tr b/mods/HUD/mcl_inventory/locale/mcl_inventory.pl.tr deleted file mode 100644 index 3817d88a1b..0000000000 --- a/mods/HUD/mcl_inventory/locale/mcl_inventory.pl.tr +++ /dev/null @@ -1,22 +0,0 @@ -# textdomain: mcl_inventory -Recipe book=Książka z recepturami -Help=Pomoc -Select player skin=Wybierz skin gracza -Achievements=Osiągnięcia -Building Blocks=Bloki budowlane -Decoration Blocks=Bloki dekoracyjne -Redstone=Czerwienit -Transportation=Transport -Brewing=Warzenie -Miscellaneous=Różne -Search Items=Wyszukaj przedmioty -Foodstuffs=Jedzenie -Tools=Narzędzia -Combat=Walka -Mobs=Moby -Materials=Materiały -Survival Inventory=Ekwipunek przetrwania -Crafting=Wytwarzanie -Inventory=Ekwipunek -@1/@2=@1/@2 - diff --git a/mods/HUD/mcl_inventory/locale/mcl_inventory.ru.tr b/mods/HUD/mcl_inventory/locale/mcl_inventory.ru.tr deleted file mode 100644 index d378e168b2..0000000000 --- a/mods/HUD/mcl_inventory/locale/mcl_inventory.ru.tr +++ /dev/null @@ -1,21 +0,0 @@ -# textdomain: mcl_inventory -Recipe book=Книга рецептов -Help=Помощь -Select player skin=Выбор скина -Achievements=Достижения -Building Blocks=Строительные блоки -Decoration Blocks=Декоративные блоки -Redstone=Редстоун (красный камень) -Transportation=Транспорт -Brewing=Зелья -Miscellaneous=Прочее -Search Items=Искать предметы -Foodstuffs=Продовольствие -Tools=Инструменты -Combat=Битва -Mobs=Мобы -Materials=Материалы -Survival Inventory=Инвентарь выживания -Crafting=Крафтинг (изготовление) -Inventory=Инвентарь -@1/@2=@1/@2 diff --git a/mods/HUD/mcl_inventory/locale/mcl_inventory.zh_TW.tr b/mods/HUD/mcl_inventory/locale/mcl_inventory.zh_TW.tr deleted file mode 100644 index 880d224f2b..0000000000 --- a/mods/HUD/mcl_inventory/locale/mcl_inventory.zh_TW.tr +++ /dev/null @@ -1,21 +0,0 @@ -# textdomain: mcl_inventory -Recipe book=合成教學 -Help=幫助 -Select player skin=選擇玩家皮膚 -Achievements=成就 -Building Blocks=建築方塊 -Decoration Blocks=裝飾性方塊 -Redstone=紅石 -Transportation=交通 -Brewing=釀造 -Miscellaneous=雜項 -Search Items=搜尋 -Foodstuffs=食物 -Tools=工具 -Combat=戰鬥 -Mobs=生物 -Materials=材料 -Survival Inventory=生存模式物品欄 -Crafting=合成 -Inventory=物品欄 -@1/@2= diff --git a/mods/HUD/mcl_inventory/locale/template.txt b/mods/HUD/mcl_inventory/locale/template.txt deleted file mode 100644 index 7f1c9769d0..0000000000 --- a/mods/HUD/mcl_inventory/locale/template.txt +++ /dev/null @@ -1,21 +0,0 @@ -# textdomain: mcl_inventory -Recipe book= -Help= -Select player skin= -Achievements= -Building Blocks= -Decoration Blocks= -Redstone= -Transportation= -Brewing= -Miscellaneous= -Search Items= -Foodstuffs= -Tools= -Combat= -Mobs= -Materials= -Survival Inventory= -Crafting= -Inventory= -@1/@2= diff --git a/mods/HUD/mcl_inventory/mod.conf b/mods/HUD/mcl_inventory/mod.conf deleted file mode 100644 index 10e6692659..0000000000 --- a/mods/HUD/mcl_inventory/mod.conf +++ /dev/null @@ -1,5 +0,0 @@ -name = mcl_inventory -author = BlockMen -description = Adds the player inventory and creative inventory. -depends = mcl_init, mcl_formspec, mcl_enchanting -optional_depends = mcl_armor, mcl_brewing, mcl_potions, mcl_enchanting, mcl_craftguide, mcl_player diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_active.png b/mods/HUD/mcl_inventory/textures/crafting_creative_active.png deleted file mode 100644 index a1dcc71352..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_creative_active.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_active_down.png b/mods/HUD/mcl_inventory/textures/crafting_creative_active_down.png deleted file mode 100644 index f24d047248..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_creative_active_down.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_bg.png b/mods/HUD/mcl_inventory/textures/crafting_creative_bg.png deleted file mode 100644 index a981832235..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_creative_bg.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_bg_dark.png b/mods/HUD/mcl_inventory/textures/crafting_creative_bg_dark.png deleted file mode 100644 index 5f06ee857d..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_creative_bg_dark.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_inactive.png b/mods/HUD/mcl_inventory/textures/crafting_creative_inactive.png deleted file mode 100644 index cf2ebe83ec..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_creative_inactive.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_inactive_down.png b/mods/HUD/mcl_inventory/textures/crafting_creative_inactive_down.png deleted file mode 100644 index c117b5dc5a..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_creative_inactive_down.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_marker.png b/mods/HUD/mcl_inventory/textures/crafting_creative_marker.png deleted file mode 100644 index 18ae1eea9e..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_creative_marker.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_next.png b/mods/HUD/mcl_inventory/textures/crafting_creative_next.png deleted file mode 100644 index 65586775cc..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_creative_next.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_prev.png b/mods/HUD/mcl_inventory/textures/crafting_creative_prev.png deleted file mode 100644 index 30e4bc311c..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_creative_prev.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_creative_trash.png b/mods/HUD/mcl_inventory/textures/crafting_creative_trash.png deleted file mode 100644 index ec567d7415..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_creative_trash.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_formspec_bg.png b/mods/HUD/mcl_inventory/textures/crafting_formspec_bg.png deleted file mode 100644 index 5fd888decb..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_formspec_bg.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_inventory_creative.png b/mods/HUD/mcl_inventory/textures/crafting_inventory_creative.png deleted file mode 100644 index b0348629e9..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_inventory_creative.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/crafting_inventory_creative_survival.png b/mods/HUD/mcl_inventory/textures/crafting_inventory_creative_survival.png deleted file mode 100644 index 828404ea2f..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/crafting_inventory_creative_survival.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_button9.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_button9.png deleted file mode 100644 index aab16013b4..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_button9.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_button9_pressed.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_button9_pressed.png deleted file mode 100644 index aeaea13a44..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_button9_pressed.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_empty_armor_slot_boots.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_empty_armor_slot_boots.png deleted file mode 100644 index cb9f2bec3d..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_empty_armor_slot_boots.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_empty_armor_slot_chestplate.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_empty_armor_slot_chestplate.png deleted file mode 100644 index b6445cbd54..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_empty_armor_slot_chestplate.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_empty_armor_slot_helmet.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_empty_armor_slot_helmet.png deleted file mode 100644 index 58bd6a006f..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_empty_armor_slot_helmet.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_empty_armor_slot_leggings.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_empty_armor_slot_leggings.png deleted file mode 100644 index 8d5e70a84f..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_empty_armor_slot_leggings.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_empty_armor_slot_shield.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_empty_armor_slot_shield.png deleted file mode 100644 index af0dd1f0c4..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_empty_armor_slot_shield.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_hotbar.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_hotbar.png deleted file mode 100644 index d3dd364d6c..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_hotbar.png and /dev/null differ diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_hotbar_selected.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_hotbar_selected.png deleted file mode 100644 index 1f7e263500..0000000000 Binary files a/mods/HUD/mcl_inventory/textures/mcl_inventory_hotbar_selected.png and /dev/null differ diff --git a/mods/HUD/mcl_offhand/init.lua b/mods/HUD/mcl_offhand/init.lua deleted file mode 100644 index 5f48eede9f..0000000000 --- a/mods/HUD/mcl_offhand/init.lua +++ /dev/null @@ -1,172 +0,0 @@ -local minetest, math = minetest, math -mcl_offhand = {} - -local max_offhand_px = 128 --- only supports up to 128px textures - -function mcl_offhand.get_offhand(player) - return player:get_inventory():get_stack("offhand", 1) -end - -local function offhand_get_wear(player) - return mcl_offhand.get_offhand(player):get_wear() -end - -local function offhand_get_count(player) - return mcl_offhand.get_offhand(player):get_count() -end - -minetest.register_on_joinplayer(function(player, last_login) - mcl_offhand[player] = { - hud = {}, - last_wear = offhand_get_wear(player), - last_count = offhand_get_count(player), - } -end) - -local function remove_hud(player, hud) - local offhand_hud = mcl_offhand[player].hud[hud] - if offhand_hud then - player:hud_remove(offhand_hud) - mcl_offhand[player].hud[hud] = nil - end -end - -function rgb_to_hex(r, g, b) - return string.format("%02x%02x%02x", r, g, b) -end - -local function update_wear_bar(player, itemstack) - local wear_bar_percent = (65535 - offhand_get_wear(player)) / 65535 - - local color = {255, 255, 255} - local wear = itemstack:get_wear() / 65535; - local wear_i = math.min(math.floor(wear * 600), 511); - wear_i = math.min(wear_i + 10, 511); - if wear_i <= 255 then - color = {wear_i, 255, 0} - else - color = {255, 511 - wear_i, 0} - end - local wear_bar = mcl_offhand[player].hud.wear_bar - player:hud_change(wear_bar, "text", "mcl_wear_bar.png^[colorize:#" .. rgb_to_hex(color[1], color[2], color[3])) - player:hud_change(wear_bar, "scale", {x = 40 * wear_bar_percent, y = 3}) - player:hud_change(wear_bar, "offset", {x = -320 - (20 - player:hud_get(wear_bar).scale.x / 2), y = -13}) -end - -minetest.register_globalstep(function(dtime) - for _, player in pairs(minetest.get_connected_players()) do - local itemstack = mcl_offhand.get_offhand(player) - local offhand_item = itemstack:get_name() - local offhand_hud = mcl_offhand[player].hud - local item = minetest.registered_items[offhand_item] - if offhand_item ~= "" and item then - local item_texture = item.inventory_image .. "^[resize:" .. max_offhand_px .. "x" .. max_offhand_px - local position = {x = 0.5, y = 1} - local offset = {x = -320, y = -32} - - if not offhand_hud.slot then - offhand_hud.slot = player:hud_add({ - hud_elem_type = "image", - position = position, - offset = offset, - scale = {x = 2.75, y = 2.75}, - text = "mcl_offhand_slot.png", - z_index = 0, - }) - end - if not offhand_hud.item then - offhand_hud.item = player:hud_add({ - hud_elem_type = "image", - position = position, - offset = offset, - scale = {x = 0.4, y = 0.4}, - text = item_texture, - z_index = 1, - }) - else - player:hud_change(offhand_hud.item, "text", item_texture) - end - if not offhand_hud.wear_bar_bg and minetest.registered_tools[offhand_item] then - if offhand_get_wear(player) > 0 then - local texture = "mcl_wear_bar.png^[colorize:#000000" - offhand_hud.wear_bar_bg = player:hud_add({ - hud_elem_type = "image", - position = {x = 0.5, y = 1}, - offset = {x = -320, y = -13}, - scale = {x = 40, y = 3}, - text = texture, - z_index = 2, - }) - offhand_hud.wear_bar = player:hud_add({ - hud_elem_type = "image", - position = {x = 0.5, y = 1}, - offset = {x = -320, y = -13}, - scale = {x = 10, y = 3}, - text = texture, - z_index = 3, - }) - update_wear_bar(player, itemstack) - end - end - - if not offhand_hud.item_count and offhand_get_count(player) > 1 then - offhand_hud.item_count = player:hud_add({ - hud_elem_type = "text", - position = {x = 0.5, y = 1}, - offset = {x = -298, y = -18}, - scale = {x = 1, y = 1}, - alignment = {x = -1, y = 0}, - text = offhand_get_count(player), - z_index = 4, - number = 0xFFFFFF, - }) - end - - if offhand_hud.wear_bar then - if offhand_hud.last_wear ~= offhand_get_wear(player) then - update_wear_bar(player, itemstack) - offhand_hud.last_wear = offhand_get_wear(player) - end - if offhand_get_wear(player) <= 0 or not minetest.registered_tools[offhand_item] then - remove_hud(player, "wear_bar_bg") - remove_hud(player, "wear_bar") - end - end - - if offhand_hud.item_count then - if offhand_hud.last_count ~= offhand_get_count(player) then - player:hud_change(offhand_hud.item_count, "text", offhand_get_count(player)) - offhand_hud.last_count = offhand_get_count(player) - end - if offhand_get_count(player) <= 1 then - remove_hud(player, "item_count") - end - end - - elseif offhand_hud.slot then - for index, _ in pairs(mcl_offhand[player].hud) do - remove_hud(player, index) - end - end - end -end) - -minetest.register_allow_player_inventory_action(function(player, action, inventory, inventory_info) - if action == "move" and inventory_info.to_list == "offhand" then - local itemstack = inventory:get_stack(inventory_info.from_list, inventory_info.from_index) - if not (minetest.get_item_group(itemstack:get_name(), "offhand_item") > 0) then - return 0 - else - return itemstack:get_stack_max() - end - end -end) - -minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) - local from_offhand = inventory_info.from_list == "offhand" - local to_offhand = inventory_info.to_list == "offhand" - if action == "move" and from_offhand or to_offhand then - mcl_inventory.update_inventory_formspec(player) - end -end) diff --git a/mods/HUD/mcl_offhand/mod.conf b/mods/HUD/mcl_offhand/mod.conf deleted file mode 100644 index f0260f35c3..0000000000 --- a/mods/HUD/mcl_offhand/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = mcl_offhand -author = NO11 -depends = mcl_inventory diff --git a/mods/HUD/mcl_offhand/textures/mcl_offhand_slot.png b/mods/HUD/mcl_offhand/textures/mcl_offhand_slot.png deleted file mode 100644 index 69ceb5973d..0000000000 Binary files a/mods/HUD/mcl_offhand/textures/mcl_offhand_slot.png and /dev/null differ diff --git a/mods/HUD/mcl_offhand/textures/mcl_wear_bar.png b/mods/HUD/mcl_offhand/textures/mcl_wear_bar.png deleted file mode 100644 index 6fee6bba6d..0000000000 Binary files a/mods/HUD/mcl_offhand/textures/mcl_wear_bar.png and /dev/null differ diff --git a/mods/ITEMS/mcl_armor_stand/LICENSE.txt b/mods/ITEMS/mcl_armor_stand/LICENSE.txt deleted file mode 100644 index 3ef9506742..0000000000 --- a/mods/ITEMS/mcl_armor_stand/LICENSE.txt +++ /dev/null @@ -1,8 +0,0 @@ -[mod] 3d Armor Stand [mcl_armor_stand] -====================================== - -License Source Code: LGPL v2.1 - -License Media: CC BY-SA 3.0 - -Source Code: Copyright (C) 2013 Stuart Jones - LGPL diff --git a/mods/ITEMS/mcl_armor_stand/README.txt b/mods/ITEMS/mcl_armor_stand/README.txt deleted file mode 100644 index 4ecbbba656..0000000000 --- a/mods/ITEMS/mcl_armor_stand/README.txt +++ /dev/null @@ -1,6 +0,0 @@ -[mod] 3d Armor Stand [mcl_armor_stand] -====================================== - -Depends: mcl_armor - -Adds an armor stand for armor storage and display. diff --git a/mods/ITEMS/mcl_armor_stand/init.lua b/mods/ITEMS/mcl_armor_stand/init.lua deleted file mode 100644 index d6080b8f84..0000000000 --- a/mods/ITEMS/mcl_armor_stand/init.lua +++ /dev/null @@ -1,156 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - --- Spawn a stand entity -local function spawn_stand_entity(pos, node) - local luaentity = minetest.add_entity(pos, "mcl_armor_stand:armor_entity"):get_luaentity() - luaentity:update_rotation(node or minetest.get_node(pos)) - return luaentity -end - --- Find a stand entity or spawn one -local function get_stand_entity(pos, node) - for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 0)) do - local luaentity = obj:get_luaentity() - if luaentity and luaentity.name == "mcl_armor_stand:armor_entity" then - return luaentity - end - end - return spawn_stand_entity(pos, node) -end - --- Migrate the old inventory format -local function migrate_inventory(inv) - inv:set_size("armor", 5) - local lists = inv:get_lists() - for name, element in pairs(mcl_armor.elements) do - local listname = "armor_" .. name - local list = lists[listname] - if list then - inv:set_stack("armor", element.index, list[1]) - inv:set_size(listname, 0) - end - end -end - --- Drop all armor on the ground when it got destroyed -local function drop_inventory(pos) - local inv = minetest.get_meta(pos):get_inventory() - for _, stack in pairs(inv:get_list("armor")) do - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - end -end - --- TODO: The armor stand should be an entity -minetest.register_node("mcl_armor_stand:armor_stand", { - description = S("Armor Stand"), - _tt_help = S("Displays pieces of armor"), - _doc_items_longdesc = S("An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand."), - _doc_items_usagehelp = S("Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand."), - drawtype = "mesh", - mesh = "3d_armor_stand.obj", - inventory_image = "3d_armor_stand_item.png", - wield_image = "3d_armor_stand_item.png", - tiles = {"default_wood.png", "mcl_stairs_stone_slab_top.png"}, - paramtype = "light", - paramtype2 = "facedir", - walkable = false, - is_ground_content = false, - stack_max = 16, - selection_box = { - type = "fixed", - fixed = {-0.5,-0.5,-0.5, 0.5,1.4,0.5} - }, - -- TODO: This should be breakable by 2 quick punches - groups = {handy=1, deco_block=1, dig_by_piston=1, attached_node=1}, - _mcl_hardness = 2, - sounds = mcl_sounds.node_sound_wood_defaults(), - on_construct = function(pos) - spawn_stand_entity(pos) - end, - on_destruct = function(pos) - drop_inventory(pos) - end, - on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - local protname = clicker:get_player_name() - - if minetest.is_protected(pos, protname) then - minetest.record_protection_violation(pos, protname) - return itemstack - end - - return mcl_armor.equip(itemstack, get_stand_entity(pos, node).object, true) - end, - on_rotate = function(pos, node, user, mode) - if mode == screwdriver.ROTATE_FACE then - node.param2 = (node.param2 + 1) % 4 - minetest.swap_node(pos, node) - get_stand_entity(pos, node):update_rotation(node) - return true - end - return false - end, -}) - -minetest.register_entity("mcl_armor_stand:armor_entity", { - initial_properties = { - physical = true, - visual = "mesh", - mesh = "3d_armor_entity.obj", - visual_size = {x=1, y=1}, - collisionbox = {-0.1,-0.4,-0.1, 0.1,1.3,0.1}, - pointable = false, - textures = {"blank.png"}, - timer = 0, - static_save = false, - }, - on_activate = function(self) - self.object:set_armor_groups({immortal = 1}) - self.node_pos = vector.round(self.object:get_pos()) - self.inventory = minetest.get_meta(self.node_pos):get_inventory() - migrate_inventory(self.inventory) - mcl_armor.update(self.object) - end, - on_step = function(self, dtime) - if minetest.get_node(self.node_pos).name ~= "mcl_armor_stand:armor_stand" then - self.object:remove() - end - end, - update_armor = function(self, info) - self.object:set_properties({textures = {info.texture}}) - end, - update_rotation = function(self, node) - self.object:set_yaw(minetest.dir_to_yaw(minetest.facedir_to_dir(node.param2))) - end, -}) - -minetest.register_lbm({ - label = "Respawn armor stand entities", - name = "mcl_armor_stand:respawn_entities", - nodenames = {"mcl_armor_stand:armor_stand"}, - run_at_every_load = true, - action = function(pos, node) - spawn_stand_entity(pos, node) - end, -}) - -minetest.register_craft({ - output = "mcl_armor_stand:armor_stand", - recipe = { - {"mcl_core:stick", "mcl_core:stick", "mcl_core:stick"}, - {"", "mcl_core:stick", ""}, - {"mcl_core:stick", "mcl_stairs:slab_stone", "mcl_core:stick"}, - } -}) - --- Legacy handling -minetest.register_alias("3d_armor_stand:armor_stand", "mcl_armor_stand:armor_stand") -minetest.register_entity(":3d_armor_stand:armor_entity", { - on_activate = function(self) - minetest.log("action", "[mcl_armor_stand] Removing legacy entity: 3d_armor_stand:armor_entity") - self.object:remove() - end, - static_save = false, -}) diff --git a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.de.tr b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.de.tr deleted file mode 100644 index e6f8fa91a6..0000000000 --- a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.de.tr +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain: mcl_armor_stand -Armor Stand=Rüstungsständer -An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.=Ein Rüstungsständer ist ein dekoratives Objekt, welches verschiedene Teile einer Rüstung präsentiert. Alles, was Spieler als Rüstung tragen kann, kann auch an einem Rüstungsständer platziert werden. -Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.=Platzieren Sie einfach einen Rüstungsgegenstand auf den Rüstungsständer. Um das oberte Rüstungsteil zu nehmen, wählen Sie Ihre Hand aus und benutzen Sie die Platzieren-Taste auf dem Rüstungsständer. -Displays pieces of armor=Stellt Rüstungsteile aus diff --git a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.es.tr b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.es.tr deleted file mode 100644 index 8e33389a3e..0000000000 --- a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.es.tr +++ /dev/null @@ -1,4 +0,0 @@ -# textdomain: mcl_armor_stand -Armor Stand=Soporte para armadura -An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.=Un soporte para armadura es un objeto decorativo que puede mostrar diferentes piezas de armadura. Cualquier cosa que los jugadores puedan usar como armadura también se puede poner en un soporte para armadura. -Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.=Simplemente coloca un objeto de armadura en el soporte para armadura. Para tomar la pieza superior de armadura del soporte para armadura, seleccione su mano y use la tecla de posición en el soporte para armadura. diff --git a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.fr.tr b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.fr.tr deleted file mode 100644 index 867b3f043f..0000000000 --- a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.fr.tr +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain: mcl_armor_stand -Armor Stand=Support d'armure -An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.=Un support d'armure est un objet décoratif qui peut afficher différentes pièces d'armure. Tout ce que les joueurs peuvent porter comme armure peut également être placé sur un support d'armure. -Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.=Placez simplement un objet d'armure sur le support d'armure. Pour prendre la pièce d'armure du support d'armure, sélectionnez votre main et utilisez la touche "Placer" sur le support d'armure. -Displays pieces of armor=Displays pieces of armor diff --git a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.pl.tr b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.pl.tr deleted file mode 100644 index cc134a2f03..0000000000 --- a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.pl.tr +++ /dev/null @@ -1,6 +0,0 @@ -# textdomain: mcl_armor_stand -Armor Stand=Stojak na zbroję -An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.=Stojak na zbroję jest obiektem dekoracyjnym, na którym można wystawiać różne części zbroi. Cokolwiek co może być noszone przez gracza jako zbroja, może być wystawione na stojaku na zbroję. -Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.=Aby to zrobić po prostu postaw przedmiot zbroi na stojaku. Aby wziąć górną część zbroi ze stojaka wybierz swoją dłoń i kliknij przycisk użyj na stojaku. -Displays pieces of armor=Prezentuje części zbroi - diff --git a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.ru.tr b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.ru.tr deleted file mode 100644 index 6d05d20fcb..0000000000 --- a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.ru.tr +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain: mcl_armor_stand -Armor Stand=Стенд защиты -An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.=Стенд защиты - декоративный объект, демонстрирующий различные части защиты. Всё, что игрок может носить на себе в качестве защиты, может быть также помещено на данный стенд. -Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.=Просто поместите элемент защиты на защитный стенд. Чтобы взять верхнюю часть защиты со стенда, выберите вашу руку и используйте клавишу размещения. -Displays pieces of armor=Демонстрирует части защиты diff --git a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.zh_TW.tr b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.zh_TW.tr deleted file mode 100644 index d5d107e556..0000000000 --- a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.zh_TW.tr +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain: mcl_armor_stand -Armor Stand=盔甲座 -An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.=盔甲架是一種裝飾實體,可以展示不同的盔甲。玩家可以作為盔甲穿戴的任何東西也都可以放在盔甲架上。 -Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.=只需将一件盔甲放在盔甲架上。要从盔甲架上取下最上面的一件盔甲,选择你的手并在盔甲架上使用放置键。 -Displays pieces of armor=展示盔甲 diff --git a/mods/ITEMS/mcl_armor_stand/locale/template.txt b/mods/ITEMS/mcl_armor_stand/locale/template.txt deleted file mode 100644 index 8d3f3cb8c7..0000000000 --- a/mods/ITEMS/mcl_armor_stand/locale/template.txt +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain: mcl_armor_stand -Armor Stand= -An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.= -Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.= -Displays pieces of armor= diff --git a/mods/ITEMS/mcl_armor_stand/mod.conf b/mods/ITEMS/mcl_armor_stand/mod.conf deleted file mode 100644 index eb803dc56f..0000000000 --- a/mods/ITEMS/mcl_armor_stand/mod.conf +++ /dev/null @@ -1,5 +0,0 @@ -name = mcl_armor_stand -author = stujones11 -description = Adds an armor stand for armor storage and display. -depends = mcl_armor, mcl_core, mcl_sounds, mcl_stairs -optional_depends = screwdriver diff --git a/mods/ITEMS/mcl_armor_stand/models/3d_armor_entity.obj b/mods/ITEMS/mcl_armor_stand/models/3d_armor_entity.obj deleted file mode 100644 index 37bc521e98..0000000000 --- a/mods/ITEMS/mcl_armor_stand/models/3d_armor_entity.obj +++ /dev/null @@ -1,459 +0,0 @@ -# Blender v2.92.0 OBJ File: '' -# www.blender.org -mtllib 3d_armor_entity.mtl -o Cube -v 1.000000 1.000000 -1.000000 -v 1.000000 -1.000000 -1.000000 -v 1.000000 1.000000 1.000000 -v 1.000000 -1.000000 1.000000 -v -1.000000 1.000000 -1.000000 -v -1.000000 -1.000000 -1.000000 -v -1.000000 1.000000 1.000000 -v -1.000000 -1.000000 1.000000 -vt 0.625000 0.500000 -vt 0.875000 0.500000 -vt 0.875000 0.750000 -vt 0.625000 0.750000 -vt 0.375000 0.750000 -vt 0.625000 1.000000 -vt 0.375000 1.000000 -vt 0.375000 0.000000 -vt 0.625000 0.000000 -vt 0.625000 0.250000 -vt 0.375000 0.250000 -vt 0.125000 0.500000 -vt 0.375000 0.500000 -vt 0.125000 0.750000 -vn 0.0000 1.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 1.0000 0.0000 0.0000 -vn 0.0000 0.0000 -1.0000 -usemtl Material -s off -f 1/1/1 5/2/1 7/3/1 3/4/1 -f 4/5/2 3/4/2 7/6/2 8/7/2 -f 8/8/3 7/9/3 5/10/3 6/11/3 -f 6/12/4 2/13/4 4/5/4 8/14/4 -f 2/13/5 1/1/5 3/4/5 4/5/5 -f 6/11/6 5/10/6 1/1/6 2/13/6 -o Player_Cube -v 2.200000 9.763893 1.200001 -v 2.200000 2.663871 1.200000 -v 2.200000 2.663871 -1.200000 -v 2.200000 9.763893 -1.200000 -v -2.200000 9.763893 -1.200000 -v -2.200000 9.763893 1.200001 -v -2.200000 2.663871 1.200000 -v -2.200000 2.663871 -1.200000 -v 2.300000 13.863962 2.300001 -v 2.300000 9.263885 2.300000 -v 2.300000 9.263885 -2.299999 -v 2.300000 13.863962 -2.299999 -v -2.300000 13.863962 -2.299999 -v -2.300000 13.863962 2.300001 -v -2.300000 9.263885 2.300000 -v -2.300000 9.263885 -2.299999 -v -2.322686 2.473175 -1.300000 -v -2.322686 2.473175 1.300000 -v -4.713554 2.682348 1.300000 -v -4.713554 2.682348 -1.300000 -v -4.077313 9.954605 -1.299999 -v -4.077313 9.954605 1.300000 -v -1.686446 9.745432 1.300000 -v -1.686446 9.745432 -1.299999 -v 1.686446 9.745432 1.300000 -v 2.322686 2.473175 1.300000 -v 4.713554 2.682348 1.300000 -v 4.077313 9.954605 1.300000 -v 1.686446 9.745432 -1.299999 -v 2.322686 2.473175 -1.300000 -v 4.077313 9.954605 -1.299999 -v 4.713554 2.682348 -1.300000 -v 2.538733 2.980834 -1.210000 -v 0.139099 2.938947 -1.200000 -v 0.139099 2.938947 1.200000 -v 2.538733 2.980834 1.190000 -v 0.261266 -4.059988 -1.200000 -v 2.660901 -4.018101 -1.210000 -v 2.660901 -4.018101 1.190000 -v 0.261266 -4.059988 1.200000 -v -2.538734 2.980834 -1.210000 -v -2.538734 2.980834 1.190000 -v -0.139099 2.938947 1.200000 -v -0.139099 2.938947 -1.200000 -v -0.261266 -4.059988 1.200000 -v -0.261266 -4.059988 -1.200000 -v -2.660901 -4.018101 -1.210000 -v -2.660901 -4.018101 1.190000 -v 0.000000 -4.387500 -1.400000 -v 0.000000 -4.387500 1.400000 -v -2.799999 -4.387500 1.390000 -v -2.799999 -4.387500 -1.410000 -v -2.800000 -0.812499 1.390000 -v -2.800000 -0.812499 -1.410000 -v 0.000000 -0.812499 1.400000 -v 0.000000 -0.812499 -1.400000 -v 0.000000 -0.812499 -1.400000 -v 0.000000 -4.387500 -1.400000 -v 0.000000 -4.387500 1.400000 -v 0.000000 -0.812499 1.400000 -v 2.800000 -0.812499 -1.410000 -v 2.799999 -4.387500 -1.410000 -v 2.799999 -4.387500 1.390000 -v 2.800000 -0.812499 1.390000 -v 2.267006 13.830965 2.267007 -v 2.267006 13.830965 -2.267005 -v 2.267006 9.296881 -2.267005 -v 2.267006 9.296881 2.267006 -v -2.267006 13.830965 -2.267005 -v -2.267006 13.830965 2.267007 -v -2.267006 9.296881 -2.267005 -v -2.267006 9.296881 2.267006 -v -4.168111 10.060661 1.681621 -v 1.741822 -5.305762 4.169018 -v 1.718504 -5.438008 3.407457 -v -6.641035 -3.963995 3.407457 -v 4.191429 8.586647 1.681621 -v -6.617718 -3.831752 4.169018 -v 4.168111 8.454401 0.920061 -v -4.191429 9.928415 0.920061 -v -4.191429 8.586648 1.681620 -v 6.617716 -3.831752 4.169018 -v 6.641035 -3.963997 3.407457 -v -1.718504 -5.438006 3.407457 -v 4.168111 10.060658 1.681621 -v -1.741822 -5.305762 4.169018 -v 4.191429 9.928414 0.920061 -v -4.168111 8.454404 0.920061 -vt 0.250000 0.375000 -vt 0.250000 0.000000 -vt 0.312500 0.000000 -vt 0.312500 0.375000 -vt 0.437500 0.375000 -vt 0.437500 0.500000 -vt 0.312500 0.500000 -vt 0.437500 0.500000 -vt 0.437500 0.375000 -vt 0.562500 0.375000 -vt 0.562500 0.500000 -vt 0.437500 0.000000 -vt 0.500000 0.000000 -vt 0.500000 0.375000 -vt 0.625000 0.000000 -vt 0.625000 0.375000 -vt 0.500000 0.750000 -vt 0.500000 0.500000 -vt 0.625000 0.500000 -vt 0.625000 0.750000 -vt 0.750000 0.750000 -vt 0.750000 1.000000 -vt 0.625000 1.000000 -vt 0.875000 0.750000 -vt 0.875000 1.000000 -vt 0.750000 1.000000 -vt 0.750000 0.750000 -vt 0.750000 0.500000 -vt 0.875000 0.750000 -vt 0.875000 0.500000 -vt 1.000000 0.750000 -vt 1.000000 0.500000 -vt 0.750000 0.375000 -vt 0.750000 0.500000 -vt 0.812500 0.500000 -vt 0.812500 0.375000 -vt 0.687500 0.375000 -vt 0.687500 0.500000 -vt 0.750000 0.500000 -vt 0.750000 0.375000 -vt 0.687500 0.375000 -vt 0.625000 0.375000 -vt 0.625000 0.000000 -vt 0.687500 0.000000 -vt 0.750000 0.000000 -vt 0.687500 0.000000 -vt 0.812500 0.375000 -vt 0.812500 0.000000 -vt 0.875000 0.375000 -vt 0.875000 0.000000 -vt 0.812500 0.375000 -vt 0.812500 0.000000 -vt 0.875000 0.000000 -vt 0.875000 0.375000 -vt 0.750000 0.375000 -vt 0.750000 0.000000 -vt 0.687500 0.375000 -vt 0.687500 0.000000 -vt 0.687500 0.375000 -vt 0.687500 0.000000 -vt 0.625000 0.000000 -vt 0.625000 0.375000 -vt 0.750000 0.500000 -vt 0.687500 0.500000 -vt 0.750000 0.375000 -vt 0.812500 0.375000 -vt 0.812500 0.500000 -vt 0.750000 0.500000 -vt 0.125000 0.375000 -vt 0.062500 0.375000 -vt 0.062500 0.500000 -vt 0.125000 0.500000 -vt 0.187500 0.375000 -vt 0.125000 0.375000 -vt 0.125000 0.500000 -vt 0.187500 0.500000 -vt 0.000000 0.375000 -vt 0.000000 0.000000 -vt 0.062500 0.000000 -vt 0.062500 0.375000 -vt 0.250000 0.375000 -vt 0.250000 0.000000 -vt 0.187500 0.000000 -vt 0.187500 0.375000 -vt 0.125000 0.000000 -vt 0.062500 0.000000 -vt 0.187500 0.375000 -vt 0.187500 0.000000 -vt 0.125000 0.000000 -vt 0.125000 0.375000 -vt 0.125000 0.375000 -vt 0.125000 0.500000 -vt 0.062500 0.500000 -vt 0.062500 0.375000 -vt 0.187500 0.375000 -vt 0.125000 0.375000 -vt 0.125000 0.000000 -vt 0.187500 0.000000 -vt 0.062500 0.000000 -vt 0.125000 0.000000 -vt 0.250000 0.375000 -vt 0.187500 0.375000 -vt 0.187500 0.000000 -vt 0.250000 0.000000 -vt 0.000000 0.375000 -vt 0.062500 0.375000 -vt 0.062500 0.000000 -vt 0.000000 0.000000 -vt 0.187500 0.375000 -vt 0.187500 0.500000 -vt 0.125000 0.500000 -vt 0.125000 0.375000 -vt 0.381250 0.832812 -vt 0.381250 0.845312 -vt 0.375000 0.845312 -vt 0.375000 0.832812 -vt 0.362500 0.832812 -vt 0.368750 0.832812 -vt 0.368750 0.810938 -vt 0.362500 0.810938 -vt 0.387500 0.832812 -vt 0.381250 0.832812 -vt 0.381250 0.810938 -vt 0.387500 0.810938 -vt 0.375000 0.832812 -vt 0.368750 0.832812 -vt 0.368750 0.810938 -vt 0.375000 0.810938 -vt 0.381250 0.832812 -vt 0.375000 0.832812 -vt 0.375000 0.810938 -vt 0.381250 0.810938 -vt 0.375000 0.845312 -vt 0.368750 0.845312 -vt 0.381250 0.832812 -vt 0.381250 0.810938 -vt 0.375000 0.810938 -vt 0.375000 0.832812 -vt 0.375000 0.832812 -vt 0.375000 0.810938 -vt 0.368750 0.810938 -vt 0.368750 0.832812 -vt 0.387500 0.832812 -vt 0.387500 0.810938 -vt 0.381250 0.810938 -vt 0.381250 0.832812 -vt 0.362500 0.832812 -vt 0.362500 0.810938 -vt 0.368750 0.810938 -vt 0.368750 0.832812 -vt 0.381250 0.832812 -vt 0.375000 0.832812 -vt 0.375000 0.845312 -vt 0.381250 0.845312 -vt 0.368750 0.845312 -vt 0.375000 0.845312 -vt 0.500000 0.750000 -vt 0.625000 0.750000 -vt 0.625000 0.500000 -vt 0.500000 0.500000 -vt 0.750000 0.750000 -vt 0.625000 1.000000 -vt 0.750000 1.000000 -vt 0.875000 0.750000 -vt 0.750000 0.750000 -vt 0.750000 1.000000 -vt 0.875000 1.000000 -vt 0.750000 0.500000 -vt 0.875000 0.750000 -vt 0.875000 0.500000 -vt 1.000000 0.750000 -vt 1.000000 0.500000 -vt 0.032859 0.558649 -vt 0.032859 0.998468 -vt 0.362724 0.998468 -vt 0.362724 0.558649 -vt 0.032859 0.558649 -vt 0.362724 0.558649 -vt 0.362724 0.998468 -vt 0.032859 0.998468 -vt 0.039157 0.992309 -vt 0.039157 0.656118 -vt 0.060169 0.656118 -vt 0.060169 0.992309 -vt -0.003415 0.501261 -vt 0.368238 0.501261 -vt 0.368238 0.563203 -vt -0.003415 0.563203 -vt 0.368238 0.996797 -vt -0.003415 0.996797 -vt -0.003415 0.934855 -vt 0.368238 0.934855 -vt 0.394691 0.498800 -vt 0.394691 0.994336 -vt 0.363720 0.994336 -vt 0.363720 0.498800 -vt 0.032859 0.998468 -vt 0.032859 0.558649 -vt 0.362724 0.558649 -vt 0.362724 0.998468 -vt 0.032859 0.998468 -vt 0.362724 0.998468 -vt 0.362724 0.558649 -vt 0.032859 0.558649 -vt 0.039157 0.656118 -vt 0.039157 0.992309 -vt 0.060169 0.992309 -vt 0.060169 0.656118 -vt -0.003415 0.996797 -vt 0.368238 0.996797 -vt 0.368238 0.934855 -vt -0.003415 0.934855 -vt 0.368238 0.501261 -vt -0.003415 0.501261 -vt -0.003415 0.563203 -vt 0.368238 0.563203 -vt 0.394691 0.994336 -vt 0.394691 0.498800 -vt 0.363720 0.498800 -vt 0.363720 0.994336 -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.0000 -1.0000 -vn -1.0000 0.0000 0.0000 -vn 0.0000 -0.0000 1.0000 -vn -0.0872 -0.9962 0.0000 -vn 0.0872 0.9962 0.0000 -vn -0.9962 0.0872 0.0000 -vn 0.9962 -0.0872 0.0000 -vn -0.9962 -0.0872 0.0000 -vn 0.9962 0.0872 0.0000 -vn -0.0872 0.9962 0.0000 -vn 0.0872 -0.9962 0.0000 -vn -0.0175 0.9998 0.0000 -vn 0.0175 -0.9998 0.0000 -vn 0.9998 0.0175 0.0000 -vn 0.0042 0.0001 1.0000 -vn -0.0042 -0.0001 -1.0000 -vn -0.9998 -0.0175 0.0000 -vn 0.0175 0.9998 0.0000 -vn 0.9998 -0.0175 0.0000 -vn 0.0042 -0.0001 -1.0000 -vn -0.0042 0.0001 1.0000 -vn -0.9998 0.0175 0.0000 -vn -0.0175 -0.9998 0.0000 -vn -0.0036 -0.0000 1.0000 -vn 0.0036 0.0000 -1.0000 -vn -0.0036 0.0000 -1.0000 -vn 0.0036 -0.0000 1.0000 -vn 0.0302 0.1710 0.9848 -vn -0.0302 -0.1710 -0.9848 -vn 0.1710 0.9698 -0.1737 -vn 0.9848 -0.1736 0.0000 -vn -0.9848 0.1736 -0.0000 -vn -0.1710 -0.9698 0.1736 -vn -0.0302 0.1710 0.9848 -vn 0.0302 -0.1710 -0.9848 -vn -0.1710 0.9698 -0.1736 -vn 0.9848 0.1736 0.0000 -vn -0.9848 -0.1736 -0.0000 -vn 0.1710 -0.9698 0.1736 -usemtl None -s off -f 9/15/7 10/16/7 11/17/7 12/18/7 -f 13/19/8 14/20/8 9/21/8 12/18/8 -f 15/22/9 16/23/9 11/24/9 10/25/9 -f 13/19/10 12/18/10 11/17/10 16/26/10 -f 16/26/11 15/27/11 14/28/11 13/19/11 -f 15/27/12 10/29/12 9/30/12 14/28/12 -f 17/31/7 18/32/7 19/33/7 20/34/7 -f 21/35/8 22/36/8 17/37/8 20/34/8 -f 19/38/9 18/39/9 23/40/9 24/41/9 -f 21/35/10 20/34/10 19/33/10 24/42/10 -f 22/43/11 21/35/11 24/42/11 23/44/11 -f 17/45/12 22/43/12 23/44/12 18/46/12 -f 25/47/13 26/48/13 27/49/13 28/50/13 -f 29/51/14 30/52/14 31/53/14 32/54/14 -f 30/55/15 29/56/15 28/57/15 27/58/15 -f 29/51/10 32/54/10 25/59/10 28/60/10 -f 32/54/16 31/61/16 26/62/16 25/59/16 -f 31/61/12 30/63/12 27/64/12 26/62/12 -f 33/65/12 34/66/12 35/67/12 36/68/12 -f 37/69/17 38/70/17 34/66/17 33/65/17 -f 39/71/10 40/72/10 38/70/10 37/69/10 -f 36/73/18 35/74/18 40/75/18 39/76/18 -f 39/71/19 37/69/19 33/77/19 36/78/19 -f 38/79/20 40/80/20 35/81/20 34/82/20 -f 41/83/21 42/84/21 43/85/21 44/86/21 -f 45/87/22 46/88/22 47/89/22 48/90/22 -f 44/91/23 47/92/23 46/93/23 41/94/23 -f 43/95/24 48/96/24 47/97/24 44/98/24 -f 41/83/25 46/99/25 45/100/25 42/84/25 -f 42/101/26 45/102/26 48/103/26 43/104/26 -f 49/105/27 50/106/27 51/107/27 52/108/27 -f 52/109/28 51/110/28 53/111/28 54/112/28 -f 49/105/29 52/108/29 54/113/29 55/114/29 -f 51/115/30 50/116/30 56/117/30 53/118/30 -f 50/119/31 49/120/31 55/121/31 56/122/31 -f 54/123/32 53/124/32 56/125/32 55/126/32 -f 57/127/9 58/128/9 59/129/9 60/130/9 -f 61/131/11 62/132/11 60/133/11 59/134/11 -f 63/135/33 61/136/33 59/137/33 58/138/33 -f 62/139/34 64/140/34 57/141/34 60/142/34 -f 64/143/7 63/144/7 58/145/7 57/146/7 -f 62/139/8 61/147/8 63/148/8 64/140/8 -f 65/149/11 66/150/11 67/151/11 68/152/11 -f 69/153/35 70/154/35 66/155/35 65/156/35 -f 68/157/36 67/158/36 71/159/36 72/160/36 -f 72/161/7 71/162/7 70/163/7 69/164/7 -f 66/165/9 70/166/9 71/167/9 67/168/9 -f 69/153/8 65/156/8 68/169/8 72/170/8 -f 73/171/11 74/172/11 75/173/11 76/174/11 -f 77/175/9 74/172/9 73/176/9 78/177/9 -f 75/178/8 79/179/8 80/180/8 76/181/8 -f 77/175/12 79/182/12 75/173/12 74/172/12 -f 78/183/7 80/184/7 79/182/7 77/175/7 -f 73/185/10 76/186/10 80/184/10 78/183/10 -f 85/187/37 81/188/37 86/189/37 82/190/37 -f 87/191/38 83/192/38 84/193/38 88/194/38 -f 81/195/39 85/196/39 87/197/39 88/198/39 -f 85/199/40 82/200/40 83/201/40 87/202/40 -f 86/203/41 81/204/41 88/205/41 84/206/41 -f 82/207/42 86/208/42 84/209/42 83/210/42 -f 93/211/43 89/212/43 94/213/43 90/214/43 -f 95/215/44 91/216/44 92/217/44 96/218/44 -f 89/219/45 93/220/45 95/221/45 96/222/45 -f 93/223/46 90/224/46 91/225/46 95/226/46 -f 94/227/47 89/228/47 96/229/47 92/230/47 -f 90/231/48 94/232/48 92/233/48 91/234/48 diff --git a/mods/ITEMS/mcl_armor_stand/models/3d_armor_stand.obj b/mods/ITEMS/mcl_armor_stand/models/3d_armor_stand.obj deleted file mode 100644 index 89f3793ad2..0000000000 --- a/mods/ITEMS/mcl_armor_stand/models/3d_armor_stand.obj +++ /dev/null @@ -1,191 +0,0 @@ -# Blender v2.73 (sub 0) OBJ File: '3d_armor_stand.blend' -# www.blender.org -mtllib 3d_armor_stand.mtl -o Player_Cube -v 0.062500 1.312500 -0.062500 -v 0.062500 1.312500 0.062500 -v -0.062500 1.312500 -0.062500 -v -0.062500 1.312500 0.062500 -v -0.187500 -0.437504 0.062500 -v -0.187500 -0.437504 -0.062500 -v -0.187500 0.937500 0.062500 -v -0.187500 0.937500 -0.062500 -v -0.250000 0.250000 0.062500 -v -0.250000 0.250000 -0.062500 -v -0.250000 0.125003 0.062500 -v -0.250000 0.125003 -0.062500 -v 0.250000 0.250000 0.062500 -v 0.250000 0.250000 -0.062500 -v 0.250000 0.125003 0.062500 -v 0.250000 0.125003 -0.062500 -v -0.062500 -0.437504 -0.062500 -v -0.062500 -0.437504 0.062500 -v -0.062500 0.937500 0.062500 -v -0.062500 0.937500 -0.062500 -v 0.062500 0.250000 0.062500 -v 0.062500 0.250000 -0.062500 -v 0.187500 0.250000 -0.062500 -v 0.187500 0.250000 0.062500 -v 0.187500 0.937500 -0.062500 -v 0.187500 0.937500 0.062500 -v 0.187500 -0.437504 -0.062500 -v 0.187500 -0.437504 0.062500 -v 0.062500 -0.437504 -0.062500 -v 0.062500 -0.437504 0.062500 -v 0.062500 0.937500 0.062500 -v 0.062500 0.937500 -0.062500 -v -0.062500 0.812500 -0.062500 -v -0.187500 0.812500 -0.062500 -v -0.062500 0.812500 0.062500 -v -0.187500 0.812500 0.062500 -v 0.062500 0.812500 -0.062500 -v 0.187500 0.812500 -0.062500 -v 0.187500 0.812500 0.062500 -v 0.062500 0.812500 0.062500 -v 0.375000 0.812500 0.062500 -v 0.375000 0.812500 -0.062500 -v 0.375000 0.937500 0.062500 -v 0.375000 0.937500 -0.062500 -v 0.500000 -0.437500 -0.500000 -v 0.500000 -0.437500 0.500000 -v -0.500000 -0.437500 -0.500000 -v -0.500000 -0.437500 0.500000 -v -0.062500 0.250000 -0.062500 -v -0.187500 0.250000 -0.062500 -v -0.062500 0.250000 0.062500 -v -0.187500 0.250000 0.062500 -v -0.375000 0.937500 0.062500 -v -0.375000 0.937500 -0.062500 -v -0.375000 0.812500 -0.062500 -v -0.375000 0.812500 0.062500 -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.187500 0.124998 0.062500 -v 0.187500 0.124998 -0.062500 -v 0.062500 0.124998 0.062500 -v 0.062500 0.124998 -0.062500 -v -0.062500 0.124998 -0.062500 -v -0.187500 0.124998 -0.062500 -v -0.062500 0.124998 0.062500 -v -0.187500 0.124998 0.062500 -vt 0.000000 0.000000 -vt 0.875000 0.000000 -vt 0.875000 0.250000 -vt 0.000000 0.250000 -vt 0.125000 0.500000 -vt 0.125000 0.750000 -vt -0.000000 0.750000 -vt -0.000000 0.500000 -vt 0.750000 0.000000 -vt 1.000000 0.000000 -vt 1.000000 0.250000 -vt 0.750000 0.250000 -vt 0.375000 0.500000 -vt 0.375000 0.750000 -vt 0.875000 0.750000 -vt 0.875000 1.000000 -vt 0.000000 1.000000 -vt 0.875000 0.500000 -vt 0.750000 0.500000 -vt 1.000000 0.500000 -vt 1.000000 0.750000 -vt 0.750000 0.750000 -vt 0.625000 1.000000 -vt 0.375000 1.000000 -vt 0.625000 0.750000 -vt 0.625000 0.500000 -vt 0.250000 0.500000 -vt 0.250000 0.750000 -vt 0.625000 0.250000 -vt 0.625000 -0.000000 -vt 0.250000 0.250000 -vt 0.250000 0.000000 -vt 0.375000 0.250000 -vt 0.250000 1.000000 -vt 1.000000 1.000000 -vt 0.750000 1.000000 -vt 0.375000 -0.000000 -vt 0.125000 0.250000 -vt 0.125000 1.000000 -vt 0.125000 0.000000 -vt -0.000000 0.937500 -vt 1.000000 0.937500 -vt 0.937500 0.000000 -vt 0.937500 1.000000 -vt 1.000000 0.062500 -vt 0.000000 0.062500 -vt 0.062500 0.000000 -vt 0.062500 1.000000 -g Player_Cube_Stand -usemtl Stand -s off -f 64/1 29/2 30/3 63/4 -f 52/5 50/6 10/7 9/8 -f 17/9 18/10 5/11 6/12 -f 68/3 66/2 6/1 5/4 -f 7/13 8/14 54/7 53/8 -f 67/15 68/16 5/17 18/7 -f 62/4 27/3 29/18 64/8 -f 66/3 65/18 17/8 6/4 -f 9/19 10/20 12/21 11/22 -f 63/7 30/15 28/16 61/17 -f 65/18 67/15 18/7 17/8 -f 61/8 28/18 27/15 62/7 -f 19/23 7/24 36/14 35/25 -f 8/14 7/13 19/26 20/25 -f 23/15 24/18 13/20 14/21 -f 13/8 15/27 16/28 14/7 -f 39/29 38/30 42/10 41/11 -f 29/31 27/4 28/1 30/32 -f 25/28 26/27 43/26 44/25 -f 38/12 25/19 44/13 42/33 -f 25/28 32/7 31/8 26/27 -f 8/26 20/13 33/33 34/29 -f 25/19 38/12 37/11 32/20 -f 31/17 40/7 39/28 26/34 -f 26/34 39/28 41/25 43/23 -f 43/7 41/28 42/34 44/17 -f 53/22 54/21 55/35 56/36 -f 36/14 7/24 53/17 56/7 -f 8/26 34/29 55/11 54/20 -f 34/37 36/33 56/4 55/1 -f 51/13 21/26 22/25 49/14 -f 20/4 3/12 1/19 32/8 -f 40/15 31/16 19/23 35/25 -f 35/29 33/30 37/2 40/3 -f 33/33 20/13 32/5 37/38 -f 3/14 4/24 2/23 1/25 -f 19/12 4/4 3/1 20/9 -f 31/36 2/17 4/7 19/22 -f 32/22 1/7 2/8 31/19 -f 23/5 62/38 64/33 22/13 -f 21/14 63/24 61/39 24/6 -f 61/3 62/2 16/10 15/11 -f 62/38 23/5 14/8 16/4 -f 24/6 61/39 15/17 13/7 -f 50/18 66/3 12/11 10/20 -f 66/40 68/38 11/4 12/1 -f 50/18 49/26 65/29 66/3 -f 51/25 52/15 68/16 67/23 -f 68/16 52/15 9/21 11/35 -f 49/26 22/13 64/33 65/29 -f 51/25 67/23 63/24 21/14 -f 67/33 65/37 64/30 63/29 -f 37/1 22/2 21/3 40/4 -f 38/4 23/3 22/18 37/8 -f 40/7 21/15 24/16 39/17 -f 39/8 24/18 23/15 38/7 -f 36/2 34/3 50/4 52/1 -f 35/15 36/16 52/17 51/7 -f 34/3 33/18 49/8 50/4 -f 33/18 35/15 51/7 49/8 -g Player_Cube_Base -usemtl Base -f 47/17 48/1 46/10 45/35 -f 59/1 57/10 58/35 60/17 -f 48/17 60/41 58/42 46/35 -f 46/43 58/10 57/35 45/44 -f 47/1 45/10 57/45 59/46 -f 48/47 47/48 59/17 60/1 diff --git a/mods/ITEMS/mcl_armor_stand/textures/3d_armor_stand_item.png b/mods/ITEMS/mcl_armor_stand/textures/3d_armor_stand_item.png deleted file mode 100644 index 06177d188f..0000000000 Binary files a/mods/ITEMS/mcl_armor_stand/textures/3d_armor_stand_item.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/README.txt b/mods/ITEMS/mcl_beds/README.txt deleted file mode 100644 index 34b493702f..0000000000 --- a/mods/ITEMS/mcl_beds/README.txt +++ /dev/null @@ -1,18 +0,0 @@ -Minetest Game mod: beds -======================= -See license.txt for license information. - -Authors of source code ----------------------- -Originally by BlockMen (MIT) -Various Minetest developers and contributors (MIT) - -Authors of media (textures) ---------------------------- -BlockMen (CC BY-SA 3.0) - -This mod adds a bed to Minetest which allows to skip the night. -To sleep, rightclick the bed. -Another feature is a controlled respawning. If you have slept in bed your respawn point is set to the beds location and you will respawn there after -death. -Use the mcl_playersSleepingPercentage setting to enable/disable night skipping or set a percentage of how many players need to sleep to skip the night. \ No newline at end of file diff --git a/mods/ITEMS/mcl_beds/api.lua b/mods/ITEMS/mcl_beds/api.lua deleted file mode 100644 index 86cc079fe6..0000000000 --- a/mods/ITEMS/mcl_beds/api.lua +++ /dev/null @@ -1,279 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -local minetest_get_node = minetest.get_node -local minetest_get_node_or_nil = minetest.get_node_or_nil -local minetest_remove_node = minetest.remove_node -local minetest_facedir_to_dir = minetest.facedir_to_dir -local minetest_add_item = minetest.add_item -local vector_add = vector.add -local vector_subtract = vector.subtract - -local function get_bed_next_node(pos, node) - local node = node or minetest_get_node_or_nil(pos) - if not node then return end - - local dir = minetest_facedir_to_dir(node.param2) - - local pos2, bottom - if string.sub(node.name, -4) == "_top" then - pos2 = vector_subtract(pos, dir) - else - pos2 = vector_add(pos, dir) - bottom = true - end - - local node2 = minetest_get_node(pos2) - return pos2, node2, bottom, dir -end - -local function rotate(pos, node, user, mode, new_param2) - if mode ~= screwdriver.ROTATE_FACE then - return false - end - - local p, node2, bottom = get_bed_next_node(pos, node) - if not node2 then return end - - local name = node2.name - if not minetest.get_item_group(name, "bed") == 2 or not node.param2 == node2.param2 then return false end - - if bottom then - name = string.sub(name, 1, -5) - else - name = string.sub(name, 1, -8) - end - - if minetest.is_protected(p, user:get_player_name()) then - minetest.record_protection_violation(p, user:get_player_name()) - return false - end - - local newp - local new_dir = minetest_facedir_to_dir(new_param2) - - if bottom then - newp = vector_add(pos, new_dir) - else - newp = vector_subtract(pos, new_dir) - end - - local node3 = minetest_get_node_or_nil(newp) - if not node3 then return false end - - local node_def = minetest.registered_nodes[node3.name] - if not node_def or not node_def.buildable_to then return false end - - if minetest.is_protected(newp, user:get_player_name()) then - minetest.record_protection_violation(newp, user:get_player_name()) - return false - end - - node.param2 = new_param2 - -- do not remove_node here - it will trigger destroy_bed() - minetest.swap_node(p, {name = "air"}) - minetest.swap_node(pos, node) - minetest.swap_node(newp, {name = name .. (bottom and "_top" or "_bottom"), param2 = new_param2}) - - return true -end - - -local function destruct_bed(pos, oldnode) - local node = oldnode or minetest_get_node_or_nil(pos) - if not node then return end - - local pos2, node2, bottom = get_bed_next_node(pos, oldnode) - - if bottom then - minetest_add_item(pos, node.name) - if node2 and string.sub(node2.name, -4) == "_top" then - minetest_remove_node(pos2) - end - else - if node2 and string.sub(node2.name, -7) == "_bottom" then - minetest_remove_node(pos2) - end - end -end - -local function kick_player_after_destruct(destruct_pos) - for name, player_bed_pos in pairs(mcl_beds.bed_pos) do - if vector.distance(destruct_pos, player_bed_pos) < 0.1 then - local player = minetest.get_player_by_name(name) - if player and player:is_player() then - mcl_beds.kick_player(player) - break - end - end - end -end - -local beddesc = S("Beds allow you to sleep at night and make the time pass faster.") -local beduse = S("To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.") -if minetest.settings:get_bool("enable_bed_respawn") == false then - beddesc = beddesc .. "\n" .. S("You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.") -else - beddesc = beddesc .. "\n" .. S("By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.") -end -if minetest.settings:get_bool("enable_bed_night_skip") == false then - beddesc = beddesc .. "\n" .. S("In this world, going to bed won't skip the night, but it will skip thunderstorms.") -else - beddesc = beddesc .. "\n" .. S("Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.") -end - -local default_sounds -if minetest.get_modpath("mcl_sounds") then - default_sounds = mcl_sounds.node_sound_wood_defaults({ - footstep = { gain = 0.5, name = "mcl_sounds_cloth" }, - }) -end - -function mcl_beds.register_bed(name, def) - local node_box_bottom, selection_box_bottom, collision_box_bottom - if def.nodebox and def.nodebox.bottom then - node_box_bottom = { type = "fixed", fixed = def.nodebox.bottom } - end - if def.selectionbox and def.selectionbox.bottom then - selection_box_bottom = { type = "fixed", fixed = def.selectionbox.bottom } - end - if def.collisionbox and def.collisionbox.bottom then - collision_box_bottom = { type = "fixed", fixed = def.collisionbox.bottom } - end - minetest.register_node(name .. "_bottom", { - description = def.description, - _tt_help = S("Allows you to sleep"), - _doc_items_longdesc = def._doc_items_longdesc or beddesc, - _doc_items_usagehelp = def._doc_items_usagehelp or beduse, - _doc_items_create_entry = def._doc_items_create_entry, - _doc_items_entry_name = def._doc_items_entry_name, - inventory_image = def.inventory_image, - wield_image = def.wield_image, - drawtype = "nodebox", - tiles = def.tiles.bottom, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, - paramtype = "light", - paramtype2 = "facedir", - is_ground_content = false, - stack_max = 1, - groups = {handy=1, bed = 1, dig_by_piston=1, bouncy=66, fall_damage_add_percent=-50, deco_block = 1, flammable=-1}, - _mcl_hardness = 0.2, - _mcl_blast_resistance = 1, - sounds = def.sounds or default_sounds, - node_box = node_box_bottom, - selection_box = selection_box_bottom, - collision_box = collision_box_bottom, - drop = "", - node_placement_prediction = "", - on_place = function(itemstack, placer, pointed_thing) - local under = pointed_thing.under - - -- Use pointed node's on_rightclick function first, if present - local node = minetest_get_node(under) - if placer and not placer:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack - end - end - - local pos - local undername = minetest_get_node(under).name - if minetest.registered_items[undername] and minetest.registered_items[undername].buildable_to then - pos = under - else - pos = pointed_thing.above - end - - if minetest.is_protected(pos, placer:get_player_name()) and - not minetest.check_player_privs(placer, "protection_bypass") then - minetest.record_protection_violation(pos, placer:get_player_name()) - return itemstack - end - - local node_def = minetest.registered_nodes[minetest_get_node(pos).name] - if not node_def or not node_def.buildable_to then - return itemstack - end - - local dir = minetest.dir_to_facedir(placer:get_look_dir()) - local botpos = vector_add(pos, minetest_facedir_to_dir(dir)) - - if minetest.is_protected(botpos, placer:get_player_name()) and - not minetest.check_player_privs(placer, "protection_bypass") then - minetest.record_protection_violation(botpos, placer:get_player_name()) - return itemstack - end - - local botdef = minetest.registered_nodes[minetest_get_node(botpos).name] - if not botdef or not botdef.buildable_to then - return itemstack - end - - minetest.set_node(pos, {name = name .. "_bottom", param2 = dir}) - minetest.set_node(botpos, {name = name .. "_top", param2 = dir}) - - if not minetest.is_creative_enabled(placer:get_player_name()) then - itemstack:take_item() - end - return itemstack - end, - - after_destruct = destruct_bed, - - on_destruct = kick_player_after_destruct, - - on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - mcl_beds.on_rightclick(pos, clicker, false) - return itemstack - end, - - on_rotate = rotate, - }) - - local node_box_top, selection_box_top, collision_box_top - if def.nodebox and def.nodebox.top then - node_box_top = { type = "fixed", fixed = def.nodebox.top } - end - if def.selectionbox and def.selectionbox.top then - selection_box_top = { type = "fixed", fixed = def.selectionbox.top } - end - if def.collisionbox and def.collisionbox.top then - collision_box_top = { type = "fixed", fixed = def.collisionbox.top } - end - - minetest.register_node(name .. "_top", { - drawtype = "nodebox", - tiles = def.tiles.top, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, - paramtype = "light", - paramtype2 = "facedir", - is_ground_content = false, - -- FIXME: Should be bouncy=66, but this would be a higher bounciness than slime blocks! - groups = {handy = 1, flammable = -1, bed = 2, dig_by_piston=1, bouncy=33, fall_damage_add_percent=-50, not_in_creative_inventory = 1}, - _mcl_hardness = 0.2, - _mcl_blast_resistance = 1, - sounds = def.sounds or default_sounds, - drop = "", - node_box = node_box_top, - selection_box = selection_box_top, - collision_box = collision_box_top, - on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - mcl_beds.on_rightclick(pos, clicker, true) - return itemstack - end, - on_rotate = rotate, - after_destruct = destruct_bed, - }) - - minetest.register_alias(name, name .. "_bottom") - - if def.recipe then - minetest.register_craft({ - output = name, - recipe = def.recipe - }) - end - - doc.add_entry_alias("nodes", name.."_bottom", "nodes", name.."_top") -end - - diff --git a/mods/ITEMS/mcl_beds/beds.lua b/mods/ITEMS/mcl_beds/beds.lua deleted file mode 100644 index 5043c85d23..0000000000 --- a/mods/ITEMS/mcl_beds/beds.lua +++ /dev/null @@ -1,113 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) -local mod_doc = minetest.get_modpath("doc") - -local nodebox = { - bottom = { - {-0.5, -5/16, -0.5, 0.5, 0.06, 0.5}, - {-0.5, -0.5, -0.5, -5/16, -5/16, -5/16}, - {0.5, -0.5, -0.5, 5/16, -5/16, -5/16}, - }, - top = { - {-0.5, -5/16, -0.5, 0.5, 0.06, 0.5}, - {-0.5, -0.5, 0.5, -5/16, -5/16, 5/16}, - {0.5, -0.5, 0.5, 5/16, -5/16, 5/16}, - }, -} - -local colors = { - -- { ID, decription, wool, dye } - { "red", S("Red Bed"), "mcl_wool:red", "mcl_dye:red" }, - { "blue", S("Blue Bed"), "mcl_wool:blue", "mcl_dye:blue" }, - { "cyan", S("Cyan Bed"), "mcl_wool:cyan", "mcl_dye:cyan" }, - { "grey", S("Grey Bed"), "mcl_wool:grey", "mcl_dye:dark_grey" }, - { "silver", S("Light Grey Bed"), "mcl_wool:silver", "mcl_dye:grey" }, - { "black", S("Black Bed"), "mcl_wool:black", "mcl_dye:black" }, - { "yellow", S("Yellow Bed"), "mcl_wool:yellow", "mcl_dye:yellow" }, - { "green", S("Green Bed"), "mcl_wool:green", "mcl_dye:dark_green" }, - { "magenta", S("Magenta Bed"), "mcl_wool:magenta", "mcl_dye:magenta" }, - { "orange", S("Orange Bed"), "mcl_wool:orange", "mcl_dye:orange" }, - { "purple", S("Purple Bed"), "mcl_wool:purple", "mcl_dye:violet" }, - { "brown", S("Brown Bed"), "mcl_wool:brown", "mcl_dye:brown" }, - { "pink", S("Pink Bed"), "mcl_wool:pink", "mcl_dye:pink" }, - { "lime", S("Lime Bed"), "mcl_wool:lime", "mcl_dye:green" }, - { "light_blue", S("Light Blue Bed"), "mcl_wool:light_blue", "mcl_dye:lightblue" }, - { "white", S("White Bed"), "mcl_wool:white", "mcl_dye:white" }, -} -local canonical_color = "red" - -for c=1, #colors do - local colorid = colors[c][1] - local is_canonical = colorid == canonical_color - - -- Recoloring recipe for white bed - if minetest.get_modpath("mcl_dye") then - minetest.register_craft({ - type = "shapeless", - output = "mcl_beds:bed_"..colorid.."_bottom", - recipe = { "mcl_beds:bed_white_bottom", colors[c][4] }, - }) - end - - -- Main bed recipe - local main_recipe - if minetest.get_modpath("mcl_wool") then - main_recipe = { - {colors[c][3], colors[c][3], colors[c][3]}, - {"group:wood", "group:wood", "group:wood"} - } - end - - local entry_name, create_entry - if mod_doc then - if is_canonical then - entry_name = S("Bed") - else - create_entry = false - end - end - -- Register bed - mcl_beds.register_bed("mcl_beds:bed_"..colorid, { - description = colors[c][2], - _doc_items_entry_name = entry_name, - _doc_items_create_entry = create_entry, - inventory_image = "mcl_beds_bed_"..colorid..".png", - wield_image = "mcl_beds_bed_"..colorid..".png", - tiles = { - bottom = { - "mcl_beds_bed_top_bottom_"..colorid..".png^[transformR90", - "default_wood.png^mcl_beds_bed_bottom_bottom.png", - "mcl_beds_bed_side_bottom_r_"..colorid..".png", - "mcl_beds_bed_side_bottom_r_"..colorid..".png^[transformfx", - "mcl_beds_bed_side_top_"..colorid..".png", - "mcl_beds_bed_side_bottom_"..colorid..".png" - }, - top = { - "mcl_beds_bed_top_top_"..colorid..".png^[transformR90", - "default_wood.png^mcl_beds_bed_bottom_top.png", - "mcl_beds_bed_side_top_r_"..colorid..".png", - "mcl_beds_bed_side_top_r_"..colorid..".png^[transformfx", - "mcl_beds_bed_side_top_"..colorid..".png", - "mcl_beds_bed_side_bottom_"..colorid..".png" - } - }, - nodebox = nodebox, - selectionbox = { - bottom = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, - top = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, - }, - -- Simplified collision box because Minetest acts weird if we use the nodebox one - collisionbox = { - bottom = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, - top = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, - }, - recipe = main_recipe, - }) - if mod_doc and not is_canonical then - doc.add_entry_alias("nodes", "mcl_beds:bed_"..canonical_color.."_bottom", "nodes", "mcl_beds:bed_"..colorid.."_bottom") - doc.add_entry_alias("nodes", "mcl_beds:bed_"..canonical_color.."_bottom", "nodes", "mcl_beds:bed_"..colorid.."_top") - end - -end - -minetest.register_alias("beds:bed_bottom", "mcl_beds:bed_red_bottom") -minetest.register_alias("beds:bed_top", "mcl_beds:bed_red_top") diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua deleted file mode 100644 index c1e76c90a3..0000000000 --- a/mods/ITEMS/mcl_beds/functions.lua +++ /dev/null @@ -1,406 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) -local F = minetest.formspec_escape - -local math = math -local vector = vector -local player_in_bed = 0 -local is_sp = minetest.is_singleplayer() -local weather_mod = minetest.get_modpath("mcl_weather") -local explosions_mod = minetest.get_modpath("mcl_explosions") -local spawn_mod = minetest.get_modpath("mcl_spawn") -local worlds_mod = minetest.get_modpath("mcl_worlds") - --- Helper functions - -local function get_look_yaw(pos) - local n = minetest.get_node(pos) - local param = n.param2 - if param == 1 then - return math.pi / 2, param - elseif param == 3 then - return -math.pi / 2, param - elseif param == 0 then - return math.pi, param - else - return 0, param - end -end - -local function players_in_bed_setting() - return tonumber(minetest.settings:get("mcl_playersSleepingPercentage")) or 100 -end - -local function is_night_skip_enabled() - return players_in_bed_setting() <= 100 -end - -local function check_in_beds(players) - if not players then - players = minetest.get_connected_players() - end - if player_in_bed <= 0 then - return false - end - return players_in_bed_setting() <= (player_in_bed * 100) / #players -end - --- These monsters do not prevent sleep -local monster_exceptions = { - ["mobs_mc:ghast"] = true, - ["mobs_mc:enderdragon"] = true, - ["mobs_mc:killer_bunny"] = true, - ["mobs_mc:slime_big"] = true, - ["mobs_mc:slime_small"] = true, - ["mobs_mc:slime_tiny"] = true, - ["mobs_mc:magma_cube_big"] = true, - ["mobs_mc:magma_cube_small"] = true, - ["mobs_mc:magma_cube_tiny"] = true, - ["mobs_mc:shulker"] = true, -} - -local function lay_down(player, pos, bed_pos, state, skip) - local name = player:get_player_name() - local hud_flags = player:hud_get_flags() - - if not player or not name then - return false - end - - local yaw, param2, dir, bed_pos2, bed_center - if bed_pos then - yaw, param2 = get_look_yaw(bed_pos) - dir = minetest.facedir_to_dir(param2) - bed_pos2 = {x = bed_pos.x - dir.x, y = bed_pos.y, z = bed_pos.z - dir.z} - bed_center = {x = bed_pos.x - dir.x/2, y = bed_pos.y + 0.1, z = bed_pos.z - dir.z/2} - - -- save respawn position when entering bed - if spawn_mod and mcl_spawn.set_spawn_pos(player, bed_pos, nil) then - minetest.chat_send_player(name, S("New respawn position set!")) - end - - -- No sleeping if too far away - if vector.distance(bed_pos, pos) > 2 and vector.distance(bed_pos2, pos) > 2 then - return false, S("You can't sleep, the bed's too far away!") - end - - for _, other_pos in pairs(mcl_beds.bed_pos) do - if vector.distance(bed_pos2, other_pos) < 0.1 then - return false, S("This bed is already occupied!") - end - end - - -- No sleeping while moving. Slightly different behaviour than in MC. - -- FIXME: Velocity threshold should be 0.01 but Minetest 5.3.0 - -- sometimes reports incorrect Y speed. A velocity threshold - -- of 0.125 still seems good enough. - if vector.length(player:get_velocity() or player:get_player_velocity()) > 0.125 then - return false, S("You have to stop moving before going to bed!") - end - - -- No sleeping if monsters nearby. - -- The exceptions above apply. - -- Zombie pigmen only prevent sleep while they are hostle. - for _, obj in pairs(minetest.get_objects_inside_radius(bed_pos, 8)) do - if obj and not obj:is_player() then - local ent = obj:get_luaentity() - local mobname = ent.name - local def = minetest.registered_entities[mobname] - -- Approximation of monster detection range - if def.is_mob and ((mobname ~= "mobs_mc:pigman" and def.type == "monster" and not monster_exceptions[mobname]) or (mobname == "mobs_mc:pigman" and ent.state == "attack")) then - if math.abs(bed_pos.y - obj:get_pos().y) <= 5 then - return false, S("You can't sleep now, monsters are nearby!") - end - end - end - end - end - - -- stand up - if state ~= nil and not state then - local p = mcl_beds.pos[name] or nil - if mcl_beds.player[name] then - mcl_beds.player[name] = nil - player_in_bed = player_in_bed - 1 - end - mcl_beds.pos[name] = nil - mcl_beds.bed_pos[name] = nil - if p then - player:set_pos(p) - end - - -- skip here to prevent sending player specific changes (used for leaving players) - if skip then - return false - end - - -- physics, eye_offset, etc - player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) - if player:get_look_vertical() > 0 then - player:set_look_vertical(0) - end - mcl_player.player_attached[name] = false - playerphysics.remove_physics_factor(player, "speed", "mcl_beds:sleeping") - playerphysics.remove_physics_factor(player, "jump", "mcl_beds:sleeping") - player:get_meta():set_string("mcl_beds:sleeping", "false") - hud_flags.wielditem = true - mcl_player.player_set_animation(player, "stand" , 30) - - -- lay down - else - local n1 = minetest.get_node({x = bed_pos.x, y = bed_pos.y + 1, z = bed_pos.z}) - local n2 = minetest.get_node({x = bed_pos2.x, y = bed_pos2.y + 1, z = bed_pos2.z}) - local def1 = minetest.registered_nodes[n1.name] - local def2 = minetest.registered_nodes[n2.name] - if def1.walkable or def2.walkable then - return false, S("You can't sleep, the bed is obstructed!") - elseif (def1.damage_per_second and def1.damage_per_second > 0) or (def2.damage_per_second and def2.damage_per_second > 0) then - return false, S("It's too dangerous to sleep here!") - end - - -- Check day of time and weather - local tod = minetest.get_timeofday() * 24000 - -- Values taken from Minecraft Wiki with offset of +6000 - if tod < 18541 and tod > 5458 and (not weather_mod or (mcl_weather.get_weather() ~= "thunder")) then - return false, S("You can only sleep at night or during a thunderstorm.") - end - - mcl_beds.player[name] = 1 - mcl_beds.pos[name] = pos - mcl_beds.bed_pos[name] = bed_pos2 - player_in_bed = player_in_bed + 1 - -- physics, eye_offset, etc - player:set_eye_offset({x = 0, y = -13, z = 0}, {x = 0, y = 0, z = 0}) - player:set_look_horizontal(yaw) - - -- With head tracking: - player:set_look_vertical(0) - -- Without head tracking: - -- player:set_look_vertical(-(math.pi/2)) - - player:get_meta():set_string("mcl_beds:sleeping", "true") - playerphysics.add_physics_factor(player, "speed", "mcl_beds:sleeping", 0) - playerphysics.add_physics_factor(player, "jump", "mcl_beds:sleeping", 0) - player:set_pos(bed_center) - mcl_player.player_attached[name] = true - hud_flags.wielditem = false - mcl_player.player_set_animation(player, "lay" , 0) - end - - player:hud_set_flags(hud_flags) - return true -end - -local function update_formspecs(finished, ges) - local ges = ges or #minetest.get_connected_players() - local form_n = "size[12,5;true]" - local all_in_bed = players_in_bed_setting() <= (player_in_bed * 100) / ges - local night_skip = is_night_skip_enabled() - local button_leave = "button_exit[4,3;4,0.75;leave;"..F(S("Leave bed")).."]" - local button_abort = "button_exit[4,3;4,0.75;leave;"..F(S("Abort sleep")).."]" - local bg_presleep = "bgcolor[#00000080;true]" - local bg_sleep = "bgcolor[#000000FF;true]" - - if finished then - for name,_ in pairs(mcl_beds.player) do - minetest.close_formspec(name, "mcl_beds_form") - end - return - elseif not is_sp then - local text = S("Players in bed: @1/@2", player_in_bed, ges) - if not night_skip then - text = text .. "\n" .. S("Note: Night skip is disabled.") - form_n = form_n .. bg_presleep - form_n = form_n .. button_leave - elseif all_in_bed then - text = text .. "\n" .. S("You're sleeping.") - form_n = form_n .. bg_sleep - form_n = form_n .. button_abort - else - local comment = "You will fall asleep when " - if players_in_bed_setting() == 100 then - comment = S(comment .. "all players are in bed.") - else - comment = S(comment .. "@1% of all players are in bed.", players_in_bed_setting()) - end - text = text .. "\n" .. comment - form_n = form_n .. bg_presleep - form_n = form_n .. button_leave - end - form_n = form_n .. "label[0.5,1;"..F(text).."]" - else - local text - if night_skip then - text = S("You're sleeping.") - form_n = form_n .. bg_sleep - form_n = form_n .. button_abort - else - text = S("You're in bed.") .. "\n" .. S("Note: Night skip is disabled.") - form_n = form_n .. bg_presleep - form_n = form_n .. button_leave - end - form_n = form_n .. "label[0.5,1;"..F(text).."]" - end - - for name,_ in pairs(mcl_beds.player) do - minetest.show_formspec(name, "mcl_beds_form", form_n) - end -end - --- Public functions - --- Handle environment stuff related to sleeping: skip night and thunderstorm -function mcl_beds.sleep() - local storm_skipped = mcl_beds.skip_thunderstorm() - -- Always clear weather - if weather_mod then - mcl_weather.change_weather("none") - end - if is_night_skip_enabled() then - if not storm_skipped then - mcl_beds.skip_night() - end - mcl_beds.kick_players() - end -end - --- Throw all players out of bed -function mcl_beds.kick_players() - for name, _ in pairs(mcl_beds.player) do - local player = minetest.get_player_by_name(name) - lay_down(player, nil, nil, false) - end - update_formspecs(false) -end - --- Throw a player out of bed -function mcl_beds.kick_player(player) - local name = player:get_player_name() - if mcl_beds.player[name] then - lay_down(player, nil, nil, false) - update_formspecs(false) - minetest.close_formspec(name, "mcl_beds_form") - end -end - -function mcl_beds.skip_night() - minetest.set_timeofday(0.25) -- tod = 6000 -end - -function mcl_beds.skip_thunderstorm() - -- Skip thunderstorm - if weather_mod and mcl_weather.get_weather() == "thunder" then - -- Sleep for a half day (=minimum thunderstorm duration) - minetest.set_timeofday((minetest.get_timeofday() + 0.5) % 1) - return true - end - return false -end - -function mcl_beds.on_rightclick(pos, player, is_top) - -- Anti-Inception: Don't allow to sleep while you're sleeping - if player:get_meta():get_string("mcl_beds:sleeping") == "true" then - return - end - if worlds_mod then - local dim = mcl_worlds.pos_to_dimension(pos) - if dim == "nether" or dim == "end" then - -- Bed goes BOOM in the Nether or End. - local node = minetest.get_node(pos) - local dir = minetest.facedir_to_dir(node.param2) - - minetest.remove_node(pos) - minetest.remove_node(string.sub(node.name, -4) == "_top" and vector.subtract(pos, dir) or vector.add(pos, dir)) - if explosions_mod then - mcl_explosions.explode(pos, 5, {drop_chance = 1.0, fire = true}) - end - return - end - end - local name = player:get_player_name() - local ppos = player:get_pos() - - -- move to bed - if not mcl_beds.player[name] then - local message - if is_top then - message = select(2, lay_down(player, ppos, pos)) - else - local node = minetest.get_node(pos) - local dir = minetest.facedir_to_dir(node.param2) - local other = vector.add(pos, dir) - message = select(2, lay_down(player, ppos, other)) - end - if message then - mcl_title.set(player, "actionbar", {text=message, color="white", stay=60}) - end - else - lay_down(player, nil, nil, false) - end - - update_formspecs(false) - - -- skip the night and let all players stand up - if check_in_beds() then - minetest.after(5, function() - if check_in_beds() then - update_formspecs(is_night_skip_enabled()) - mcl_beds.sleep() - end - end) - end -end - --- Callbacks -minetest.register_on_joinplayer(function(player) - local meta = player:get_meta() - if meta:get_string("mcl_beds:sleeping") == "true" then - -- Make player awake on joining server - meta:set_string("mcl_beds:sleeping", "false") - end - - playerphysics.remove_physics_factor(player, "speed", "mcl_beds:sleeping") - playerphysics.remove_physics_factor(player, "jump", "mcl_beds:sleeping") - update_formspecs(false) -end) - -minetest.register_on_leaveplayer(function(player) - lay_down(player, nil, nil, false, true) - local players = minetest.get_connected_players() - local name = player:get_player_name() - for n, player in ipairs(players) do - if player:get_player_name() == name then - players[n] = nil - break - end - end - if check_in_beds(players) then - minetest.after(5, function() - if check_in_beds() then - update_formspecs(is_night_skip_enabled()) - mcl_beds.sleep() - end - end) - end - update_formspecs(false, #players) -end) - -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "mcl_beds_form" then - return - end - if fields.quit or fields.leave then - lay_down(player, nil, nil, false) - update_formspecs(false) - end - - if fields.force then - update_formspecs(is_night_skip_enabled()) - mcl_beds.sleep() - end -end) - -minetest.register_on_player_hpchange(function(player, hp_change) - if hp_change < 0 then - mcl_beds.kick_player(player) - end -end) diff --git a/mods/ITEMS/mcl_beds/init.lua b/mods/ITEMS/mcl_beds/init.lua deleted file mode 100644 index ad9dbdded7..0000000000 --- a/mods/ITEMS/mcl_beds/init.lua +++ /dev/null @@ -1,13 +0,0 @@ -mcl_beds = {} -mcl_beds.player = {} -mcl_beds.pos = {} -mcl_beds.bed_pos = {} - -local modpath = minetest.get_modpath("mcl_beds") - --- Load files - -dofile(modpath .. "/functions.lua") -dofile(modpath .. "/api.lua") -dofile(modpath .. "/beds.lua") -dofile(modpath .. "/respawn_anchor.lua") \ No newline at end of file diff --git a/mods/ITEMS/mcl_beds/license.txt b/mods/ITEMS/mcl_beds/license.txt deleted file mode 100644 index 0494b36b4f..0000000000 --- a/mods/ITEMS/mcl_beds/license.txt +++ /dev/null @@ -1,60 +0,0 @@ -License of source code ----------------------- - -The MIT License (MIT) -Copyright (C) 2014-2016 BlockMen -Copyright (C) 2014-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) 2014-2016 BlockMen - -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/ diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr deleted file mode 100644 index 7fe400b7f6..0000000000 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr +++ /dev/null @@ -1,43 +0,0 @@ -# textdomain: mcl_beds -Beds allow you to sleep at night and make the time pass faster.=Mit Betten können Sie in der Nacht schlafen und die Zeit schneller verstreichen lassen. -To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.=Um ein Bett zu benutzen, stellen Sie sich direkt davor und rechtsklicken Sie darauf, um darin zu schlafen. Schlafen funktioniert nur, wenn die Sonne untergeht, in der Nacht oder während eines Gewittersturms. Das Bett muss außerdem fern von Gefahren sein. -You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.=Sie hörten von anderen Welten, in denen ein Bett den Startpunkt für Ihr nächstes Leben setzen würde. Aber diese Welt ist keine solche. -By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.=Indem Sie ein Bett benutzen, setzen Sie den Startpunkt Ihres nächsten Lebens. Wenn Sie sterben, werden Sie Ihr nächstes Leben auf diesem Bett beginnen, es sei denn, es ist blockiert oder zerstört. -In this world, going to bed won't skip the night, but it will skip thunderstorms.=In dieser Welt können mit dem Bett Nächte nicht übersprungen werden, nur Gewitterstürme. -Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.=Mit Schlaf können Sie die Nacht überspringen. Die Nacht wird übersprungen, wenn alle Spieler in dieser Welt sich schlafen gelegt haben. Die Nacht wird dann nach ein paar Sekunden übersprungen. Gewitterstürme werden auf die gleiche Weise übersprungen. -Bed=Bett -Red Bed=Rotes Bett -Blue Bed=Blaues Bett -Cyan Bed=Türkises Bett -Grey Bed=Graues Bett -Light Grey Bed=Hellgraues Bett -Black Bed=Schwarzes Bett -Yellow Bed=Gelbes Bett -Green Bed=Grünes Bett -Magenta Bed=Magenta Bett -Orange Bed=Orange Bett -Purple Bed=Violettes Bett -Brown Bed=Braunes Bett -Pink Bed=Rosa Bett -Lime Bed=Lindgrünes Bett -Light Blue Bed=Hellblaues Bett -White Bed=Weißes Bett -You can't sleep, the bed's too far away!=Sie können nicht schlafen, das Bett ist zu weit weg! -This bed is already occupied!=Dieses Bett ist schon belegt! -You have to stop moving before going to bed!=Sie müssen anhalten, bevor Sie zu Bett gehen! -You can't sleep now, monsters are nearby!=Sie können jetzt nicht schlafen, Monster sind in der Nähe! -You can't sleep, the bed is obstructed!=Sie können nicht schlafen, das Bett ist blockiert! -It's too dangerous to sleep here!=Es ist zu gefährlich, hier zu schlafen! -New respawn position set! But you can only sleep at night or during a thunderstorm.=Neue Wiedereinstiegsposition gesetzt! Aber Sie können nur nachts oder während eines Gewittersturms schlafen. -You can only sleep at night or during a thunderstorm.=Sie können nur nachts oder während eines Gewittersturms schlafen. -New respawn position set!=Neue Wiedereinstiegsposition gesetzt! -Leave bed=Bett verlassen -Abort sleep=Schlaf abbrechen -Players in bed: @1/@2=Spieler im Bett: @1/@2 -Note: Night skip is disabled.=Anmerkung: Überspringen der Nacht deaktiviert. -You're sleeping.=Sie schlafen. -You will fall asleep when all players are in bed.=Sie werden einschlafen, wenn alle Spieler im Bett sind. -You will fall asleep when @1% of all players are in bed.=Sie werden einschlafen, wenn @1% der Spieler im Bett sind. -You're in bed.=Sie sind im Bett. -Allows you to sleep=Zum Einschafen -Respawn Anchor=Seelenanker \ No newline at end of file diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.es.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.es.tr deleted file mode 100644 index e03087d391..0000000000 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.es.tr +++ /dev/null @@ -1,40 +0,0 @@ -# textdomain: mcl_beds -Beds allow you to sleep at night and make the time pass faster.=Las camas le permiten dormir por la noche y hacer que el tiempo pase más rápido. -To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.=Para usar una cama, párate cerca de ella y haz clic derecho en la cama para dormir en ella. Dormir solo funciona cuando se oculta el sol, por la noche o durante una tormenta eléctrica. La cama también debe estar libre de cualquier peligro. -You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.=Has oído hablar de otros mundos en los que una cama establecería el punto de partida para tu próxima vida. Pero este mundo no es uno de ellos. -By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.=Al usar una cama, se establece como el punto de partida para tu próxima vida. Si mueres, comenzarás tu próxima vida en esta cama, a menos que esté obstruida o destruida. -In this world, going to bed won't skip the night, but it will skip thunderstorms.=En este mundo, ir a la cama no se saltará la noche, pero se saltará las tormentas eléctricas. -Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.=Dormir te permite saltarte la noche. Se omite la noche cuando todos los jugadores en este mundo se fueron a dormir. La noche se salta después de dormir durante unos segundos. Las tormentas eléctricas se pueden omitir de la misma manera. -Bed=Cama -Red Bed=Cama roja -Blue Bed=Cama azul -Cyan Bed=Cama cian -Grey Bed=Cama gris -Light Grey Bed=Cama gris ocuro -Black Bed=Cama negra -Yellow Bed=Cama amarilla -Green Bed=Cama verde -Magenta Bed=Cama magenta -Orange Bed=Cama naranja -Purple Bed=Cama morada -Brown Bed=Cama marrón -Pink Bed=Cama rosa -Lime Bed=Cama verde lima -Light Blue Bed=Cama azul claro -White Bed=Cama blanca -You can't sleep, the bed's too far away!=¡No puedes dormir, la cama está muy lejos! -This bed is already occupied!=¡La cama ya está ocupada! -You have to stop moving before going to bed!=¡Tienes que dejar de moverte antes de acostarte! -You can't sleep now, monsters are nearby!=No puedes dormir ahora, ¡hay monstruos cerca! -You can't sleep, the bed is obstructed!=¡No puedes dormir, la cama está obstruida! -It's too dangerous to sleep here!=¡Es muy peligroso dormir aquí! -New respawn position set! But you can only sleep at night or during a thunderstorm.=¡Nueva posición de reaparición establecida! Pero solo puedes dormir por la noche o durante tormentas eléctricas. -You can only sleep at night or during a thunderstorm.=Solo puedes dormir por la noche o durante tormentas eléctricas. -New respawn position set!=¡Nueva posición de reaparición establecida! -Leave bed=Salir de la cama -Abort sleep=Levantarse -Players in bed: @1/@2=Jugadores en la cama: @1/@2 -Note: Night skip is disabled.=Nota: El salto nocturno está deshabilitado. -You're sleeping.=Estás durmiendo. -You will fall asleep when all players are in bed.=Te quedarás dormido cuando todos los jugadores estén en la cama. -You're in bed.=Estas en la cama. diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.fr.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.fr.tr deleted file mode 100644 index d85d48bf1c..0000000000 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.fr.tr +++ /dev/null @@ -1,41 +0,0 @@ -# textdomain: mcl_beds -Beds allow you to sleep at night and make the time pass faster.=Les lits vous permettent de dormir la nuit et de faire passer le temps plus rapidement. -To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.=Pour utiliser un lit, tenez-vous près de lui et faites un clic droit sur le lit pour y dormir. Dormir ne fonctionne que lorsque le soleil se couche, la nuit ou pendant un orage. Le lit doit également être à l'abri de tout danger. -You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.=Vous avez entendu parler d'autres mondes dans lesquels un lit serait le point de départ de votre prochaine vie. Mais ce monde n'en fait pas partie. -By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.=En utilisant un lit, vous définissez le point de départ de votre prochaine vie. Si vous mourez, vous commencerez votre prochaine vie dans ce lit, à moins qu'il ne soit obstrué ou détruit. -In this world, going to bed won't skip the night, but it will skip thunderstorms.=Dans ce monde, aller au lit ne sautera pas la nuit, mais cela évitera les orages. -Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.=Dormir vous permet de sauter la nuit. La nuit est sautée lorsque tous les joueurs de ce monde se sont endormis. La nuit est sautée après avoir dormi quelques secondes. Les orages peuvent être évités de la même manière. -Bed=Lit -Red Bed=Lit Rouge -Blue Bed=Lit Bleu -Cyan Bed=Lit Cyan -Grey Bed=Lit Gris -Light Grey Bed=Lit Gris Clair -Black Bed=Lit Noir -Yellow Bed=Lit Jaune -Green Bed=Lit Vert -Magenta Bed=Lit Magenta -Orange Bed=Lit Orange -Purple Bed=Lit Violet -Brown Bed=Lit Marron -Pink Bed=Lit Rose -Lime Bed=Lit Vert Clair -Light Blue Bed=Lit Bleu Clair -White Bed=Lit Blanc -You can't sleep, the bed's too far away!=Vous ne pouvez pas dormir, le lit est trop loin! -This bed is already occupied!=Ce lit est déjà occupé! -You have to stop moving before going to bed!=Vous devez arrêter de bouger avant de vous coucher! -You can't sleep now, monsters are nearby!=Vous ne pouvez pas dormir maintenant, les monstres sont à proximité! -You can't sleep, the bed is obstructed!=Vous ne pouvez pas dormir, le lit est obstrué! -It's too dangerous to sleep here!=C'est trop dangereux de dormir ici! -New respawn position set! But you can only sleep at night or during a thunderstorm.=Nouvelle position de réapparition définie! Mais vous ne pouvez dormir que la nuit ou pendant un orage. -You can only sleep at night or during a thunderstorm.=Vous ne pouvez dormir que la nuit ou pendant un orage. -New respawn position set!=Nouvelle position de réapparition définie! -Leave bed=Quitter le lit -Abort sleep=Abandonner le sommeil -Players in bed: @1/@2=Joueurs au lit: @1/@2 -Note: Night skip is disabled.=Remarque: Le saut de nuit est désactivé. -You're sleeping.=Tu dors. -You will fall asleep when all players are in bed.=Vous vous endormirez lorsque tous les joueurs seront au lit. -You're in bed.=Tu es au lit. -Allows you to sleep=Vous permet de dormir diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.pl.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.pl.tr deleted file mode 100644 index 3a1d8f6ce2..0000000000 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.pl.tr +++ /dev/null @@ -1,41 +0,0 @@ -# textdomain: mcl_beds -Beds allow you to sleep at night and make the time pass faster.=Łóżka pozwalają na spanie w nocy i sprawiają, że czas płynie szybciej. -To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.=Aby użyć łóżka stań blisko niego i kliknij je prawym przyciskiem myszy aby na nim zasnąć. Spać można tylko przy zachodzie słońca, w nocy lub podczas burz. Łóżko nie może być również narażone na niebezpieczeństwo. -You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.=Słyszałaś o światach w których łóżko byłoby twoim punktem wyjścia w następnym życiu. Ten świat nie jest jednym z nich. -By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.=Korzystając z łóżka ustawiasz punkt wyjścia w następnym życiu. Jeśli umrzesz, odrodzisz się przy tym łóżku chyba, że zostanie zniszczone lub zawalone. -In this world, going to bed won't skip the night, but it will skip thunderstorms.=W tym świecie pójście do łóżka nie ominie nocy, jednak może pominąć burze. -Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.=Spanie pozwala pominąć noc. Noc jest pomijana gdy wszyscy gracze w tym świecie pójdą spać. Jest ona pomijana po kilku sekundach. Burze można pomijać w ten sam sposób. -Bed=Łóżko -Red Bed=Czerwone łóżko -Blue Bed=Niebieskie łóżko -Cyan Bed=Błękitne łóżko -Grey Bed=Szare łóżko -Light Grey Bed=Jasnoszare łóżko -Black Bed=Czarne łóżko -Yellow Bed=Żółte łóżko -Green Bed=Zielone łóżko -Magenta Bed=Karmazynowe łóżko -Orange Bed=Pomarańczowe łóżko -Purple Bed=Fioletowe łóżko -Brown Bed=Brązowe łóżko -Pink Bed=Różowe łóżko -Lime Bed=Jasnozielone łóżko -Light Blue Bed=Jasnoniebieskie łóżko -White Bed=Białe łóżko -You can't sleep, the bed's too far away!=Nie możesz spać, łóżko jest zbyt daleko! -This bed is already occupied!=To łóżko jest zajęte! -You have to stop moving before going to bed!=Musisz przestać się poruszać przed pójściem do spania! -You can't sleep now, monsters are nearby!=Nie możesz spać, w pobliżu są potwory! -You can't sleep, the bed is obstructed!=Nie możesz spać, łóżko jest zawalone! -It's too dangerous to sleep here!=Tu jest zbyt niebezpiecznie by spać! -New respawn position set! But you can only sleep at night or during a thunderstorm.=Nowa pozycja do odrodzenia ustawiona! Ale możesz spać tylko podczas nocy, bądź burzy. -You can only sleep at night or during a thunderstorm.=Możesz spać tylko podczas nocy, bądź burzy. -New respawn position set!=Nowa pozycja odradzania ustawiona! -Leave bed=Opuść łóżka -Abort sleep=Przerwij sen -Players in bed: @1/@2=Graczy w łóżkach: @1/@2 -Note: Night skip is disabled.=Uwaga: Pomijanie nocy wyłączone. -You're sleeping.=Śpisz. -You will fall asleep when all players are in bed.=Zaśniesz gdy wszyscy gracze będą w łóżkach. -You're in bed.=Jesteś w łóżku. -Allows you to sleep=Pozwala spać diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.ru.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.ru.tr deleted file mode 100644 index 8093e95fbb..0000000000 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.ru.tr +++ /dev/null @@ -1,41 +0,0 @@ -# textdomain: mcl_beds -Beds allow you to sleep at night and make the time pass faster.=На кровати можно спать по ночам и заставлять ночи проходить быстрее. -To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.=Чтобы использовать кровать, встаньте рядом и кликните по ней правой кнопкой. Вы сможете уснуть, только если солнце в закате, либо уже наступила ночь, либо идёт гроза. Кровать при этом должна в месте, свободном от любых опасностей. -You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.=Вы слышали о других мирах, где кровать становится стартовой точкой для вашей следующей жизни. Но этот мир не такой. -By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.=Воспользовавшись кроватью, вы устанавливаете стартовую точку для вашей следующей жизни. Если вы умрёте, ваша новая жизнь начнётся в этой кровати, если она не уничтожена и не загромождена. -In this world, going to bed won't skip the night, but it will skip thunderstorms.=В этом мире использование кровати не заставит ночь пройти скорее, но может сократить время грозового шторма. -Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.=Сон позволяет вам пропустить ночь. Если все игроки в этом мире лягут спать, ночь будет пропущена. Она закончится буквально через несколько секунд. Таким же способом можно пропускать грозы. -Bed=Кровать -Red Bed=Красная кровать -Blue Bed=Синяя кровать -Cyan Bed=Голубая кровать -Grey Bed=Серая кровать -Light Grey Bed=Светло-серая кровать -Black Bed=Чёрная кровать -Yellow Bed=Жёлтая кровать -Green Bed=Зелёная кровать -Magenta Bed=Фиолетовая кровать -Orange Bed=Оранжевая кровать -Purple Bed=Пурпурная кровать -Brown Bed=Коричневая кровать -Pink Bed=Розовая кровать -Lime Bed=Зелёная лаймовая кровать -Light Blue Bed=Светло-голубая кровать -White Bed=Белая кровать -You can't sleep, the bed's too far away!=Не удаётся лечь, кровать слишком далеко! -This bed is already occupied!=Эта кровать уже занята! -You have to stop moving before going to bed!=Вам нужно перестать двигаться, чтобы лечь! -You can't sleep now, monsters are nearby!=Вы не можете спать, монстры слишком близко! -You can't sleep, the bed is obstructed!=Здесь не удастся поспать, кровать загромождена! -It's too dangerous to sleep here!=Спать здесь слишком опасно! -New respawn position set! But you can only sleep at night or during a thunderstorm.=Новая точка возрождения успешно задана! Но спать вы можете только ночью или во время грозы. -You can only sleep at night or during a thunderstorm.=Вы можете спать только ночью или во время грозы. -New respawn position set!=Задана новая точка возрождения! -Leave bed=Покинуть кровать -Abort sleep=Прервать сон -Players in bed: @1/@2=Игроков в кроватях: @1/@2 -Note: Night skip is disabled.=Предупреждение: Пропускание ночи отключено. -You're sleeping.=Вы спите... -You will fall asleep when all players are in bed.=Вы уснёте, когда лягут все игроки. -You're in bed.=Вы в кровати. -Allows you to sleep=Позволяет вам спать diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.zh_TW.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.zh_TW.tr deleted file mode 100644 index fd0a586293..0000000000 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.zh_TW.tr +++ /dev/null @@ -1,41 +0,0 @@ -# textdomain: mcl_beds -Beds allow you to sleep at night and make the time pass faster.=床可以讓你在晚上睡覺,讓時間過得更快。 -To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.=要使用床,站在靠近床的地方,右鍵點擊床,就可以在床上睡覺。只有在太陽落山、晚上或雷雨時才能睡覺。床也必須遠離任何危險。 -You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.=你聽說過其他的世界,在這個世界裡,一張床會成為你的重生點。但這個世界並不是其中之一。 -By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.=通過使用一張床,你設定了重生點。如果你死了,你將在這張床上重生,除非它被阻礙或破壞。 -In this world, going to bed won't skip the night, but it will skip thunderstorms.=在這個世界上,上床睡覺不會跳過夜晚,但是會跳過雷暴。 -Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.=睡覺可以跳過夜晚。當這個世界的所有玩家都進入睡眠狀態幾秒後,夜晚就會被跳過。雷雨也可以用同樣的方式跳過。 -Bed=床 -Red Bed=紅色床 -Blue Bed=藍色床 -Cyan Bed=青色床 -Grey Bed=灰色床 -Light Grey Bed=淺灰色床 -Black Bed=黑色床 -Yellow Bed=黃色床 -Green Bed=綠色床 -Magenta Bed=洋紅色床 -Orange Bed=橙色床 -Purple Bed=紫色床 -Brown Bed=棕色床 -Pink Bed=粉紅色床 -Lime Bed=淺綠色床 -Light Blue Bed=淺藍色床 -White Bed=白色床 -You can't sleep, the bed's too far away!=你無法休息,床離你太遠了! -This bed is already occupied!=這張床已被佔用! -You have to stop moving before going to bed!=在睡覺前,你必須停下! -You can't sleep now, monsters are nearby!=你無法休息,有怪物在附近遊蕩! -You can't sleep, the bed is obstructed!=你無法休息,床已被阻擋! -It's too dangerous to sleep here!=在這裏睡太危險了! -New respawn position set! But you can only sleep at night or during a thunderstorm.=你設定了重生點,但你只能在晚上或雷雨時才能睡覺。 -You can only sleep at night or during a thunderstorm.=你只能在晚上或雷雨時才能睡覺。 -New respawn position set!=你設定了重生點! -Leave bed=起來 -Abort sleep=醒來 -Players in bed: @1/@2=@2位玩家中的@1位在床上 -Note: Night skip is disabled.=注意:睡覺以跳過夜晚被停用 -You're sleeping.=你睡着了。 -You will fall asleep when all players are in bed.=你會在所有玩家在床上時睡着 -You're in bed.=你在床上。 -Allows you to sleep=允許你睡覺 diff --git a/mods/ITEMS/mcl_beds/locale/template.txt b/mods/ITEMS/mcl_beds/locale/template.txt deleted file mode 100644 index 69c4938801..0000000000 --- a/mods/ITEMS/mcl_beds/locale/template.txt +++ /dev/null @@ -1,43 +0,0 @@ -# textdomain: mcl_beds -Beds allow you to sleep at night and make the time pass faster.= -To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.= -You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.= -By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.= -In this world, going to bed won't skip the night, but it will skip thunderstorms.= -Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.= -Bed= -Red Bed= -Blue Bed= -Cyan Bed= -Grey Bed= -Light Grey Bed= -Black Bed= -Yellow Bed= -Green Bed= -Magenta Bed= -Orange Bed= -Purple Bed= -Brown Bed= -Pink Bed= -Lime Bed= -Light Blue Bed= -White Bed= -You can't sleep, the bed's too far away!= -This bed is already occupied!= -You have to stop moving before going to bed!= -You can't sleep now, monsters are nearby!= -You can't sleep, the bed is obstructed!= -It's too dangerous to sleep here!= -New respawn position set! But you can only sleep at night or during a thunderstorm.= -You can only sleep at night or during a thunderstorm.= -New respawn position set!= -Leave bed= -Abort sleep= -Players in bed: @1/@2= -Note: Night skip is disabled.= -You're sleeping.= -You will fall asleep when all players are in bed.= -You will fall asleep when @1% of all players are in bed.= -You're in bed.= -Allows you to sleep= -Respawn Anchor= diff --git a/mods/ITEMS/mcl_beds/mod.conf b/mods/ITEMS/mcl_beds/mod.conf deleted file mode 100644 index bb1ea175e8..0000000000 --- a/mods/ITEMS/mcl_beds/mod.conf +++ /dev/null @@ -1,5 +0,0 @@ -name = mcl_beds -author = BlockMen -description = -depends = playerphysics -optional_depends = mcl_sounds, mcl_worlds, mcl_wool, mcl_dye, mcl_explosions, mcl_weather, mcl_spawn, doc, mesecon \ No newline at end of file diff --git a/mods/ITEMS/mcl_beds/respawn_anchor.lua b/mods/ITEMS/mcl_beds/respawn_anchor.lua deleted file mode 100644 index 469a8ba4ff..0000000000 --- a/mods/ITEMS/mcl_beds/respawn_anchor.lua +++ /dev/null @@ -1,98 +0,0 @@ ---TODO: Add sounds for the respawn anchor (charge sounds etc.) - ---Nether ends at y -29077 ---Nether roof at y -28933 -local S = minetest.get_translator(minetest.get_current_modname()) ---local mod_doc = minetest.get_modpath("doc") -> maybe add documentation ? - -for i=0,4 do - local nodebox_uncharged = { --Reused the composter nodebox, since it is basicly the same - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall - { 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall - {-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall - {-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall - {-0.5, -0.5, -0.5, 0.5, -0.47, 0.5}, -- Bottom level, -0.47 because -0.5 is so low that you can see the texture of the block below through - } - } - - local nodebox_charged = { --Reused the composter nodebox, since it is basicly the same - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall - { 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall - {-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall - {-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall - {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Bottom level - } - } - - local function rightclick(pos, node, player, itemstack) - if itemstack.get_name(itemstack) == "mcl_nether:glowstone" and i ~= 4 then - minetest.set_node(pos, {name="mcl_beds:respawn_anchor_charged_" .. i+1}) - itemstack:take_item() - elseif mcl_worlds.pos_to_dimension(pos) ~= "nether" then - if node.name ~= "mcl_beds:respawn_anchor" then --only charged respawn anchors are exploding in the overworld & end in minecraft - mcl_explosions.explode(pos, 5, {drop_chance = 0, fire = true}) - end - elseif string.match(node.name, "mcl_beds:respawn_anchor_charged_") then - minetest.chat_send_player(player.get_player_name(player), S"New respawn position set!") - mcl_spawn.set_spawn_pos(player, pos, nil) - end - end - - - if i == 0 then - minetest.register_node("mcl_beds:respawn_anchor",{ - description=S("Respawn Anchor"), - tiles = { - "respawn_anchor_top_off.png", - "respawn_anchor_bottom.png", - "respawn_anchor_side0.png" - }, - drawtype = "nodebox", - node_box = nodebox_uncharged, - on_rightclick = rightclick, - groups = {pickaxey=1, material_stone=1}, - _mcl_hardness = 22.5, - sounds= mcl_sounds.node_sound_stone_defaults(), - use_texture_alpha = "blend", - }) - mesecon.register_mvps_stopper("mcl_beds:respawn_anchor") - else - minetest.register_node("mcl_beds:respawn_anchor_charged_"..i,{ - description=S("Respawn Anchor"), - tiles = { - "portal.png", - "respawn_anchor_bottom.png", - "respawn_anchor_side"..i ..".png" - }, - drawtype = "nodebox", - node_box = nodebox_charged, - on_rightclick = rightclick, - groups = {pickaxey=1, material_stone=1, not_in_creative_inventory=1}, - _mcl_hardness = 22.5, - sounds= mcl_sounds.node_sound_stone_defaults(), - drop = { - max_items = 1, - items = { - {items = {"mcl_beds:respawn_anchor"}}, - } - }, - light_source = math.min((4 * i) - 1, minetest.LIGHT_MAX), - use_texture_alpha = "blend", - }) - mesecon.register_mvps_stopper("mcl_beds:respawn_anchor_charged_"..i) - end - end - - -minetest.register_craft({ --TODO: Please change this crafting recipe once crying obsidian is implemented! - output = "mcl_beds:respawn_anchor", - recipe = { - {"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"}, - {"mcl_nether:glowstone", "mcl_nether:glowstone", "mcl_nether:glowstone"}, - {"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"} - } - }) diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_black.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_black.png deleted file mode 100644 index 6da9b5690a..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_black.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_blue.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_blue.png deleted file mode 100644 index d6bee0a72e..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_bottom_bottom.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_bottom_bottom.png deleted file mode 100644 index 35c9d59ca8..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_bottom_bottom.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_bottom_top.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_bottom_top.png deleted file mode 100644 index 87a0e2abdb..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_bottom_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_brown.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_brown.png deleted file mode 100644 index 5cb0e41963..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_brown.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_cyan.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_cyan.png deleted file mode 100644 index 03eec9c701..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_cyan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_green.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_green.png deleted file mode 100644 index a2fa4bff51..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_green.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_grey.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_grey.png deleted file mode 100644 index a53dec1539..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_grey.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_light_blue.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_light_blue.png deleted file mode 100644 index 2e70475aeb..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_light_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_lime.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_lime.png deleted file mode 100644 index 9bfb2f9c47..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_lime.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_magenta.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_magenta.png deleted file mode 100644 index b223b591e7..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_magenta.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_orange.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_orange.png deleted file mode 100644 index df14acbf9c..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_orange.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_pink.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_pink.png deleted file mode 100644 index e0f6365bac..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_pink.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_purple.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_purple.png deleted file mode 100644 index abf4c35931..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_purple.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_red.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_red.png deleted file mode 100644 index 20fcd7ca64..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_red.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_black.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_black.png deleted file mode 100644 index 302bc5b407..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_black.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_blue.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_blue.png deleted file mode 100644 index 0d5b3f4129..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_brown.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_brown.png deleted file mode 100644 index 25983a5302..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_brown.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_cyan.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_cyan.png deleted file mode 100644 index 94614b0753..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_cyan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_green.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_green.png deleted file mode 100644 index f4990d58fa..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_green.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_grey.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_grey.png deleted file mode 100644 index 40727ca8ed..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_grey.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_light_blue.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_light_blue.png deleted file mode 100644 index dec15108d9..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_light_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_lime.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_lime.png deleted file mode 100644 index fef72ce3b9..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_lime.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_magenta.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_magenta.png deleted file mode 100644 index f1cfdde625..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_magenta.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_orange.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_orange.png deleted file mode 100644 index e8faf315e4..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_orange.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_pink.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_pink.png deleted file mode 100644 index f536a7960e..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_pink.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_purple.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_purple.png deleted file mode 100644 index acdf05e879..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_purple.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_black.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_black.png deleted file mode 100644 index 84c1b31f2f..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_black.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_blue.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_blue.png deleted file mode 100644 index 474a8f6fb0..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_brown.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_brown.png deleted file mode 100644 index fe1e8e4256..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_brown.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_cyan.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_cyan.png deleted file mode 100644 index 5eacdf6547..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_cyan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_green.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_green.png deleted file mode 100644 index d98f4263ae..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_green.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_grey.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_grey.png deleted file mode 100644 index 02e80ed965..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_grey.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_light_blue.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_light_blue.png deleted file mode 100644 index c3ca6ed880..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_light_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_lime.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_lime.png deleted file mode 100644 index d33985789f..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_lime.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_magenta.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_magenta.png deleted file mode 100644 index 273f0f570b..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_magenta.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_orange.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_orange.png deleted file mode 100644 index 65333f73a2..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_orange.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_pink.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_pink.png deleted file mode 100644 index 5907ad86f3..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_pink.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_purple.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_purple.png deleted file mode 100644 index 0bfa0a1b78..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_purple.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_red.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_red.png deleted file mode 100644 index b324086d6b..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_red.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_silver.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_silver.png deleted file mode 100644 index 0269dc778b..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_silver.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_white.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_white.png deleted file mode 100644 index 1ed1e02391..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_white.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_yellow.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_yellow.png deleted file mode 100644 index 378b633419..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_r_yellow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_red.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_red.png deleted file mode 100644 index 103570e140..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_red.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_silver.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_silver.png deleted file mode 100644 index 490298dd16..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_silver.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_white.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_white.png deleted file mode 100644 index 8cdbd2b1d1..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_white.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_yellow.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_yellow.png deleted file mode 100644 index fed97cded0..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_bottom_yellow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_black.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_black.png deleted file mode 100644 index 39fb8c5800..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_black.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_blue.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_blue.png deleted file mode 100644 index 39fb8c5800..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_brown.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_brown.png deleted file mode 100644 index 39fb8c5800..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_brown.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_cyan.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_cyan.png deleted file mode 100644 index 39fb8c5800..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_cyan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_green.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_green.png deleted file mode 100644 index 39fb8c5800..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_green.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_grey.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_grey.png deleted file mode 100644 index 39fb8c5800..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_grey.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_light_blue.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_light_blue.png deleted file mode 100644 index 39fb8c5800..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_light_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_lime.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_lime.png deleted file mode 100644 index 39fb8c5800..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_lime.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_magenta.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_magenta.png deleted file mode 100644 index 39fb8c5800..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_magenta.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_orange.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_orange.png deleted file mode 100644 index 39fb8c5800..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_orange.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_pink.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_pink.png deleted file mode 100644 index 39fb8c5800..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_pink.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_purple.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_purple.png deleted file mode 100644 index 39fb8c5800..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_purple.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_black.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_black.png deleted file mode 100644 index 5bfa983c38..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_black.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_blue.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_blue.png deleted file mode 100644 index ecf58cd03e..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_brown.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_brown.png deleted file mode 100644 index f1473c36a2..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_brown.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_cyan.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_cyan.png deleted file mode 100644 index e3c466ece0..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_cyan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_green.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_green.png deleted file mode 100644 index e59981a4cd..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_green.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_grey.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_grey.png deleted file mode 100644 index 65052ad02d..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_grey.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_light_blue.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_light_blue.png deleted file mode 100644 index 974ac6566e..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_light_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_lime.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_lime.png deleted file mode 100644 index 88c3674073..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_lime.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_magenta.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_magenta.png deleted file mode 100644 index 04bdc7ddf2..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_magenta.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_orange.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_orange.png deleted file mode 100644 index 5271b820a2..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_orange.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_pink.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_pink.png deleted file mode 100644 index ca6b5047a0..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_pink.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_purple.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_purple.png deleted file mode 100644 index 740824b382..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_purple.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_red.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_red.png deleted file mode 100644 index 638bdd508b..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_red.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_silver.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_silver.png deleted file mode 100644 index b0739432ec..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_silver.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_white.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_white.png deleted file mode 100644 index 1e536432e6..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_white.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_yellow.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_yellow.png deleted file mode 100644 index a3d9c8c2b0..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_r_yellow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_red.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_red.png deleted file mode 100644 index 39fb8c5800..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_red.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_silver.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_silver.png deleted file mode 100644 index 39fb8c5800..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_silver.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_white.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_white.png deleted file mode 100644 index 39fb8c5800..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_white.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_yellow.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_yellow.png deleted file mode 100644 index 39fb8c5800..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_side_top_yellow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_silver.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_silver.png deleted file mode 100644 index 73de606f2e..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_silver.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_black.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_black.png deleted file mode 100644 index 046e847a68..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_black.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_blue.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_blue.png deleted file mode 100644 index 0c6affda8c..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_brown.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_brown.png deleted file mode 100644 index cf3eaa4054..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_brown.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_cyan.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_cyan.png deleted file mode 100644 index 2963d1da23..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_cyan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_gray.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_gray.png deleted file mode 100644 index d1cd638976..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_gray.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_green.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_green.png deleted file mode 100644 index 4eda85f33e..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_green.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_grey.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_grey.png deleted file mode 100644 index 1aa01946ee..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_grey.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_light_blue.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_light_blue.png deleted file mode 100644 index 949efb20ea..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_light_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_lime.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_lime.png deleted file mode 100644 index 14ad57bd14..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_lime.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_magenta.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_magenta.png deleted file mode 100644 index ce9e6a3de3..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_magenta.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_orange.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_orange.png deleted file mode 100644 index 036ec11699..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_orange.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_pink.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_pink.png deleted file mode 100644 index b94a3d989f..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_pink.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_purple.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_purple.png deleted file mode 100644 index bf053e334f..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_purple.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_red.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_red.png deleted file mode 100644 index 77668f2019..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_red.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_silver.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_silver.png deleted file mode 100644 index d17a506e3a..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_silver.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_white.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_white.png deleted file mode 100644 index ee8105119d..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_white.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_yellow.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_yellow.png deleted file mode 100644 index d10fb92fa4..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_bottom_yellow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_black.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_black.png deleted file mode 100644 index 1c2c0abcdf..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_black.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_blue.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_blue.png deleted file mode 100644 index ccc4921589..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_brown.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_brown.png deleted file mode 100644 index d18faece84..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_brown.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_cyan.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_cyan.png deleted file mode 100644 index 0bddf475ea..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_cyan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_green.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_green.png deleted file mode 100644 index 00b23cd8a7..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_green.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_grey.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_grey.png deleted file mode 100644 index 1c4903075c..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_grey.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_light_blue.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_light_blue.png deleted file mode 100644 index df13cf007d..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_light_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_lime.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_lime.png deleted file mode 100644 index b9194be167..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_lime.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_magenta.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_magenta.png deleted file mode 100644 index 215ef796c9..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_magenta.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_orange.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_orange.png deleted file mode 100644 index 473caf37f2..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_orange.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_pink.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_pink.png deleted file mode 100644 index ac8b29b9be..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_pink.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_purple.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_purple.png deleted file mode 100644 index e29210540b..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_purple.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_red.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_red.png deleted file mode 100644 index a418835b5f..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_red.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_silver.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_silver.png deleted file mode 100644 index 51609fb0c9..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_silver.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_white.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_white.png deleted file mode 100644 index d2dc477027..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_white.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_yellow.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_yellow.png deleted file mode 100644 index 10edecc3bf..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_top_top_yellow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_white.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_white.png deleted file mode 100644 index f4ed87dac1..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_white.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_yellow.png b/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_yellow.png deleted file mode 100644 index 6705b4a80a..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/mcl_beds_bed_yellow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/portal.png b/mods/ITEMS/mcl_beds/textures/portal.png deleted file mode 100644 index 160ad95f38..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/portal.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/respawn_anchor_bottom.png b/mods/ITEMS/mcl_beds/textures/respawn_anchor_bottom.png deleted file mode 100644 index d5d332c15c..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/respawn_anchor_bottom.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/respawn_anchor_side0.png b/mods/ITEMS/mcl_beds/textures/respawn_anchor_side0.png deleted file mode 100644 index 31a6e58f37..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/respawn_anchor_side0.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/respawn_anchor_side1.png b/mods/ITEMS/mcl_beds/textures/respawn_anchor_side1.png deleted file mode 100644 index ed4667a2ea..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/respawn_anchor_side1.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/respawn_anchor_side2.png b/mods/ITEMS/mcl_beds/textures/respawn_anchor_side2.png deleted file mode 100644 index 996042015c..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/respawn_anchor_side2.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/respawn_anchor_side3.png b/mods/ITEMS/mcl_beds/textures/respawn_anchor_side3.png deleted file mode 100644 index f0728943c2..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/respawn_anchor_side3.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/respawn_anchor_side4.png b/mods/ITEMS/mcl_beds/textures/respawn_anchor_side4.png deleted file mode 100644 index e9bea53717..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/respawn_anchor_side4.png and /dev/null differ diff --git a/mods/ITEMS/mcl_beds/textures/respawn_anchor_top_off.png b/mods/ITEMS/mcl_beds/textures/respawn_anchor_top_off.png deleted file mode 100644 index a180e96e7d..0000000000 Binary files a/mods/ITEMS/mcl_beds/textures/respawn_anchor_top_off.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/README.md b/mods/ITEMS/mcl_blackstone/README.md deleted file mode 100644 index d2e385f04b..0000000000 --- a/mods/ITEMS/mcl_blackstone/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Blackstone Mod - -This mod adds new Blocks: Blackstone, Basalt, Soul Fire, Soul Torch etc. - -## Version: - -Its version 1.0.2 - -## License - -CC BY-SA 4.0 diff --git a/mods/ITEMS/mcl_blackstone/init.lua b/mods/ITEMS/mcl_blackstone/init.lua deleted file mode 100644 index 4909edf2f7..0000000000 --- a/mods/ITEMS/mcl_blackstone/init.lua +++ /dev/null @@ -1,373 +0,0 @@ -local S = minetest.get_translator("mcl_blackstone") - - -local on_rotate -if minetest.get_modpath("screwdriver") then - on_rotate = screwdriver.rotate_3way -end - ---Blocks -minetest.register_node("mcl_blackstone:blackstone", { - description = S("Blackstone"), - tiles = {"mcl_blackstone.png"}, - sounds = mcl_sounds.node_sound_stone_defaults(), - is_ground_content = false, - groups = {cracky = 3, pickaxey=2, material_stone=1, cobble=1}, - _mcl_blast_resistance = 2, - _mcl_hardness = 2, -}) -minetest.register_node("mcl_blackstone:blackstone_gilded", { - description = S("Gilded Blackstone"), - tiles = {"mcl_blackstone.png^mcl_blackstone_gilded_side.png"}, - sounds = mcl_sounds.node_sound_stone_defaults(), - is_ground_content = false, - groups = {cracky = 3, pickaxey=2, material_stone=1, xp=1}, - drop = { - max_items = 1, - items = { - {items = {"mcl_core:gold_nugget 2"},rarity = 5}, - {items = {"mcl_core:gold_nugget 3"},rarity = 5}, - {items = {"mcl_core:gold_nugget 4"},rarity = 5}, - {items = {"mcl_core:gold_nugget 5"},rarity = 5}, - {items = {"mcl_blackstone:blackstone_gilded"}, rarity = 8}, - } - }, - _mcl_blast_resistance = 2, - _mcl_hardness = 2, - _mcl_silk_touch_drop = true, - _mcl_fortune_drop = mcl_core.fortune_drop_ore, -}) -minetest.register_node("mcl_blackstone:nether_gold", { - description = S("Nether Gold Ore"), - tiles = {"mcl_nether_netherrack.png^mcl_blackstone_gilded_side.png"}, - sounds = mcl_sounds.node_sound_stone_defaults(), - is_ground_content = false, - groups = {cracky = 3, pickaxey=2, material_stone=1, xp=1}, - drop = { - max_items = 1, - items = { - {items = {"mcl_core:gold_nugget 2"},rarity = 5}, - {items = {"mcl_core:gold_nugget 3"},rarity = 5}, - {items = {"mcl_core:gold_nugget 4"},rarity = 5}, - {items = {"mcl_core:gold_nugget 5"},rarity = 5}, - {items = {"mcl_blackstone:nether_gold"}, rarity = 8}, - } - }, - _mcl_blast_resistance = 2, - _mcl_hardness = 2, - _mcl_silk_touch_drop = true, - _mcl_fortune_drop = mcl_core.fortune_drop_ore, -}) -minetest.register_node("mcl_blackstone:basalt_polished", { - description = S("Polished Basalt"), - tiles = {"mcl_blackstone_basalt_top_polished.png", "mcl_blackstone_basalt_top_polished.png", "mcl_blackstone_basalt_side_polished.png"}, - sounds = mcl_sounds.node_sound_stone_defaults(), - paramtype2 = "facedir", - on_place = mcl_util.rotate_axis, - on_rotate = on_rotate, - is_ground_content = false, - groups = {cracky = 3, pickaxey=2, material_stone=1}, - _mcl_blast_resistance = 2, - _mcl_hardness = 2, -}) -minetest.register_node("mcl_blackstone:basalt", { - description = S("Basalt"), - tiles = {"mcl_blackstone_basalt_top.png", "mcl_blackstone_basalt_top.png", "mcl_blackstone_basalt_side.png"}, - sounds = mcl_sounds.node_sound_stone_defaults(), - paramtype2 = "facedir", - on_place = mcl_util.rotate_axis, - on_rotate = on_rotate, - is_ground_content = false, - groups = {cracky = 3, pickaxey=2, material_stone=1}, - _mcl_blast_resistance = 2, - _mcl_hardness = 2, -}) -minetest.register_node("mcl_blackstone:blackstone_polished", { - description = S("Polished Blackstone"), - tiles = {"mcl_blackstone_polished.png"}, - sounds = mcl_sounds.node_sound_stone_defaults(), - is_ground_content = false, - groups = {cracky = 3, pickaxey=2, material_stone=1}, - _mcl_blast_resistance = 2, - _mcl_hardness = 2, -}) -minetest.register_node("mcl_blackstone:blackstone_chiseled_polished", { - description = S("Chiseled Polished Blackstone"), - tiles = {"mcl_blackstone_chiseled_polished.png"}, - sounds = mcl_sounds.node_sound_stone_defaults(), - is_ground_content = false, - groups = {cracky = 3, pickaxey=2, material_stone=1}, - _mcl_blast_resistance = 2, - _mcl_hardness = 2, -}) -minetest.register_node("mcl_blackstone:blackstone_brick_polished", { - description = S("Polished Blackstone Bricks"), - tiles = {"mcl_blackstone_polished_bricks.png"}, - sounds = mcl_sounds.node_sound_stone_defaults(), - is_ground_content = false, - groups = {cracky = 3, pickaxey=2, material_stone=1}, - _mcl_blast_resistance = 2, - _mcl_hardness = 2, -}) -minetest.register_node("mcl_blackstone:quartz_brick", { - description = S("Quartz Bricks"), - tiles = {"mcl_backstone_quartz_bricks.png"}, - sounds = mcl_sounds.node_sound_stone_defaults(), - is_ground_content = false, - sounds = mcl_sounds.node_sound_stone_defaults(), - groups = {cracky = 3, pickaxey=2, material_stone=1}, - _mcl_blast_resistance = 2, - _mcl_hardness = 2, -}) -minetest.register_node("mcl_blackstone:soul_soil", { - description = S("Soul Soil"), - tiles = {"mcl_blackstone_soul_soil.png"}, - is_ground_content = false, - sounds = mcl_sounds.node_sound_sand_defaults(), - groups = { cracky = 3, handy = 1, shovely = 1, soul_block = 1 }, - _mcl_blast_resistance = 0.5, - _mcl_hardness = 0.5, -}) -minetest.register_node("mcl_blackstone:soul_fire", { - description = S("Eternal Soul Fire"), - _doc_items_longdesc = minetest.registered_nodes["mcl_fire:eternal_fire"]._doc_items_longdesc , - drawtype = "firelike", - tiles = { - { - name = "soul_fire_basic_flame_animated.png", - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 1 - }, - }, - }, - inventory_image = "soul_fire_basic_flame.png", - paramtype = "light", - light_source = 10, - walkable = false, - buildable_to = true, - sunlight_propagates = true, - damage_per_second = 2, - _mcl_node_death_message = minetest.registered_nodes["mcl_fire:fire"]._mcl_node_death_message, - groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston = 1, destroys_items = 1, set_on_fire=8}, - floodable = true, - drop = "", - on_flood = function(pos, oldnode, newnode) - if minetest.get_item_group(newnode.name, "water") > 0 then - minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) - end - end, - on_construct=function(pos) - local under = minetest.get_node(vector.offset(pos,0,-1,0)).name - if minetest.get_item_group(under,"soul_block") > 0 then - minetest.swap_node(pos, {name = "air"}) - end - end -}) - -local old_onconstruct=minetest.registered_nodes["mcl_fire:fire"].on_construct -minetest.registered_nodes["mcl_fire:fire"].on_construct=function(pos) - local under = minetest.get_node(vector.offset(pos,0,-1,0)).name - if minetest.get_item_group(under,"soul_block") > 0 then - minetest.swap_node(pos, {name = "mcl_blackstone:soul_fire"}) - end - old_onconstruct(pos) -end - ---slabs/stairs -mcl_stairs.register_stair_and_slab_simple("blackstone", "mcl_blackstone:blackstone", "Blackstone Stair", "Blackstone Slab", "Double Blackstone Slab") -mcl_stairs.register_stair_and_slab_simple("blackstone_polished", "mcl_blackstone:blackstone_polished", "Polished Blackstone Stair", "Polished Blackstone Slab", "Polished Double Blackstone Slab") -mcl_stairs.register_stair_and_slab_simple("blackstone_chiseled_polished", "mcl_blackstone:blackstone_chiseled_polished", "Polished Chiseled Blackstone Stair", "Chiseled Polished Blackstone Slab", "Double Polished Chiseled Blackstone Slab") -mcl_stairs.register_stair_and_slab_simple("blackstone_brick_polished", "mcl_blackstone:blackstone_brick_polished", "Polished Blackstone Brick Stair", "Polished Blackstone Brick Slab", "Double Polished Blackstone Brick Slab") - ---Wall -mcl_walls.register_wall("mcl_blackstone:wall", S("Blackstone Wall"), "mcl_blackstone:blackstone") - ---lavacooling -minetest.register_abm({ - label = "Lava cooling (basalt)", - nodenames = {"group:lava"}, - neighbors = {"mcl_core:ice"}, - interval = 1, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local water = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1}, {x=pos.x+1, y=pos.y+1, z=pos.z+1}, "mcl_core:ice") - local lavatype = minetest.registered_nodes[node.name].liquidtype - for w=1, #water do - local waternode = minetest.get_node(water[w]) - local watertype = minetest.registered_nodes[waternode.name].liquidtype - if water[w].y < pos.y and water[w].x == pos.x and water[w].z == pos.z then - minetest.set_node(water[w], {name="mcl_blackstone:basalt"}) - elseif lavatype == "flowing" and water[w].y == pos.y and (water[w].x == pos.x or water[w].z == pos.z) then - minetest.set_node(pos, {name="mcl_blackstone:basalt"}) - elseif lavatype == "flowing" and water[w].y > pos.y and water[w].x == pos.x and water[w].z == pos.z then - minetest.set_node(pos, {name="mcl_blackstone:basalt"}) - end - end - end, -}) - -minetest.register_abm({ - label = "Lava cooling (blackstone)", - nodenames = {"group:lava"}, - neighbors = {"mcl_core:packed_ice"}, - interval = 1, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local water = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y-1, z=pos.z-1}, {x=pos.x+1, y=pos.y+1, z=pos.z+1}, "mcl_core:packed_ice") - local lavatype = minetest.registered_nodes[node.name].liquidtype - for w=1, #water do - local waternode = minetest.get_node(water[w]) - local watertype = minetest.registered_nodes[waternode.name].liquidtype - if water[w].y < pos.y and water[w].x == pos.x and water[w].z == pos.z then - minetest.set_node(water[w], {name="mcl_blackstone:blackstone"}) - elseif lavatype == "flowing" and water[w].y == pos.y and (water[w].x == pos.x or water[w].z == pos.z) then - minetest.set_node(pos, {name="mcl_blackstone:blackstone"}) - elseif lavatype == "flowing" and water[w].y > pos.y and water[w].x == pos.x and water[w].z == pos.z then - minetest.set_node(pos, {name="mcl_blackstone:blackstone"}) - end - end - end, -}) - ---crafting -minetest.register_craft({ - output = "mcl_blackstone:blackstone_polished 4", - recipe = { - {"mcl_blackstone:blackstone","mcl_blackstone:blackstone"}, - {"mcl_blackstone:blackstone","mcl_blackstone:blackstone"}, - } -}) -minetest.register_craft({ - output = "mcl_blackstone:basalt_polished 4", - recipe = { - {"mcl_blackstone:basalt","mcl_blackstone:basalt"}, - {"mcl_blackstone:basalt","mcl_blackstone:basalt"}, - } -}) -minetest.register_craft({ - output = "mcl_blackstone:blackstone_chiseled_polished 2", - recipe = { - {"mcl_blackstone:blackstone_polished"}, - {"mcl_blackstone:blackstone_polished"}, - } -}) -minetest.register_craft({ - output = "mcl_blackstone:blackstone_brick_polished 4", - recipe = { - {"mcl_blackstone:blackstone_polished","mcl_blackstone:blackstone_polished"}, - {"mcl_blackstone:blackstone_polished","mcl_blackstone:blackstone_polished"}, - } -}) -minetest.register_craft({ - output = "mcl_blackstone:quartz_brick 4", - recipe = { - {"mcl_nether:quartz_block","mcl_nether:quartz_block"}, - {"mcl_nether:quartz_block","mcl_nether:quartz_block"}, - } -}) -minetest.register_craft({ - type = "cooking", - output = "mcl_core:gold_ingot", - recipe = "mcl_blackstone:nether_gold", - cooktime = 10, -}) -minetest.register_craft({ - type = "cooking", - output = "mcl_core:gold_ingot", - recipe = "mcl_blackstone:blackstone_gilded", - cooktime = 10, -}) -minetest.register_craft({ - type = "cooking", - output = "mcl_nether:quartz_smooth", - recipe = "mcl_nether:quartz_block", - cooktime = 10, -}) ---[[ Commented out for now because there the discussion how to handle this is ongoing] ---Generating -local specialstones = { "mcl_blackstone:blackstone", "mcl_blackstone:basalt", "mcl_blackstone:soul_soil" } -for s=1, #specialstones do - local node = specialstones[s] - minetest.register_ore({ - ore_type = "blob", - ore = node, - wherein = {"mcl_nether:netherrack"}, - clust_scarcity = 830, - clust_num_ores = 28, - clust_size = 3, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) - minetest.register_ore({ - ore_type = "blob", - ore = node, - wherein = {"mcl_nether:netherrack"}, - clust_scarcity = 8*8*8, - clust_num_ores = 40, - clust_size = 5, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) -end - -if minetest.settings:get_bool("mcl_generate_ores", true) then - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_blackstone:blackstone_gilded", - wherein = "mcl_blackstone:blackstone", - clust_scarcity = 4775, - clust_num_ores = 2, - clust_size = 2, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_blackstone:nether_gold", - wherein = "mcl_nether:netherrack", - clust_scarcity = 830, - clust_num_ores = 5, - clust_size = 3, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_blackstone:nether_gold", - wherein = "mcl_nether:netherrack", - clust_scarcity = 1660, - clust_num_ores = 4, - clust_size = 2, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) -end ---]] ---soul torch -mcl_torches.register_torch({ - name="soul_torch", - description=S("Soul Torch"), - doc_items_longdesc = S("Torches are light sources which can be placed at the side or on the top of most blocks."), - doc_items_hidden = false, - icon="soul_torch_on_floor.png", - tiles = {{ - name = "soul_torch_on_floor_animated.png", - animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} - }}, - light = 12, --soul torches are a bit dimmer than normal torches - groups = {dig_immediate = 3, deco_block = 1}, - sounds = mcl_sounds.node_sound_wood_defaults(), - particles = true, -}) - -minetest.register_craft({ - output = "mcl_blackstone:soul_torch 4", - recipe = { - {"group:coal"}, - { "mcl_core:stick" }, - { "group:soul_block" }, - } -}) diff --git a/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.de.tr b/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.de.tr deleted file mode 100644 index dee9cd15ef..0000000000 --- a/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.de.tr +++ /dev/null @@ -1,28 +0,0 @@ -# textdomain: mcl_blackstone -Blackstone=Schwarzstein -Polished Blackstone=Polierter Schwarzstein -Chieseled Polished Blackstone=Gemeißelter polierter Schwarzstein -Polished Blackstone Bricks=Polierter Schwarzsteinziegel -Basalt=Basalt -Polished Basalt=Polierter Basalt -Blackstone Slab=Schwarzstein Stufe -Polished Blackstone Slab=Polierte Schwarzstein Stufe -Chieseled Polished Blackstone Slab=Gemeißelte Polierte Schwarzstein Stufe -Polished Blackstone Brick Slab=Polierte Schwarzsteinziegel Stufe -Blackstone Stairs=Schwarzstein Treppe -Polished Blackstone Stairs=Polierte Schwarzstein Treppe -Chieseled Polished Blackstone Stairs=Gemeißelte Polierte Schwarzstein Treppe -Polished Blackstone Brick Stairs=Polierte Schwarzsteinziegel Treppe -Quartz Bricks=Quartz Ziegel -Soul Torch=Seelenfakel -Soul Lantern=Seelenlaterne -Soul Soil=Seelenerde -Eternal Soul Fire=Seelenfeuer -Gilded Blackstone=Vergoldeter Schwarzstein -Nether Gold Ore=Nethergolderz -Smooth Basalt=Glatter Basalt - -@1 has been cooked crisp.=@1 wurde knusprig gebraten. -@1 felt the burn.=@1 ist völlig verbrannt. -@1 died in the flames.=@1 starb in den Flammen. -@1 died in a fire.=@1 starb in einem Feuer. diff --git a/mods/ITEMS/mcl_blackstone/locale/template.txt b/mods/ITEMS/mcl_blackstone/locale/template.txt deleted file mode 100644 index 0af51d7d30..0000000000 --- a/mods/ITEMS/mcl_blackstone/locale/template.txt +++ /dev/null @@ -1,23 +0,0 @@ -# textdomain: mcl_blackstone -Blackstone= -Polished Blackstone= -Chieseled Polished Blackstone= -Polished Blackstone Bricks= -Basalt= -Polished Basalt= -Blackstone Slab= -Polished Blackstone Slab= -Chieseled Polished Blackstone Slab= -Polished Blackstone Brick Slab= -Blackstone Stairs= -Polished Blackstone Stairs= -Chieseled Polished Blackstone Stairs= -Polished Blackstone Brick Stairs= -Quartz Bricks= -Soul Torch= -Soul Lantern= -Soul Soil= -Eternal Soul Fire= -Gilded Blackstone= -Nether Gold Ore= -Smooth Basalt= diff --git a/mods/ITEMS/mcl_blackstone/mod.conf b/mods/ITEMS/mcl_blackstone/mod.conf deleted file mode 100644 index 8728f5b013..0000000000 --- a/mods/ITEMS/mcl_blackstone/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = mcl_blackstone -author = debian044 -depends = mcl_core, screwdriver, mcl_stairs, mclx_stairs, mcl_walls, mclx_fences, mcl_torches, mcl_fire diff --git a/mods/ITEMS/mcl_blackstone/textures/lantern.png b/mods/ITEMS/mcl_blackstone/textures/lantern.png deleted file mode 100644 index a0cec3cbfa..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/lantern.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/lantern_bottom.png b/mods/ITEMS/mcl_blackstone/textures/lantern_bottom.png deleted file mode 100644 index b424385a27..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/lantern_bottom.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/lantern_top.png b/mods/ITEMS/mcl_blackstone/textures/lantern_top.png deleted file mode 100644 index 60e85591a2..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/lantern_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/mcl_backstone_quartz_bricks.png b/mods/ITEMS/mcl_blackstone/textures/mcl_backstone_quartz_bricks.png deleted file mode 100644 index 7fd3e6be60..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/mcl_backstone_quartz_bricks.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone.png b/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone.png deleted file mode 100644 index a811c69404..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_basalt_side.png b/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_basalt_side.png deleted file mode 100644 index badbb65b93..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_basalt_side.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_basalt_side_polished.png b/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_basalt_side_polished.png deleted file mode 100644 index 556b4ae9f1..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_basalt_side_polished.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_basalt_smooth.png b/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_basalt_smooth.png deleted file mode 100644 index 3455bae19a..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_basalt_smooth.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_basalt_top.png b/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_basalt_top.png deleted file mode 100644 index 0793a4d673..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_basalt_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_basalt_top_polished.png b/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_basalt_top_polished.png deleted file mode 100644 index d5b85bd970..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_basalt_top_polished.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_chain.png b/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_chain.png deleted file mode 100644 index 79e9a85aa0..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_chain.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_chiseled_polished.png b/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_chiseled_polished.png deleted file mode 100644 index 8519bdd28b..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_chiseled_polished.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_gilded_side.png b/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_gilded_side.png deleted file mode 100644 index 1b8b5dee02..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_gilded_side.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_polished.png b/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_polished.png deleted file mode 100644 index 4ef4edb510..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_polished.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_polished_bricks.png b/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_polished_bricks.png deleted file mode 100644 index 6a774443e9..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_polished_bricks.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_soul_soil.png b/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_soul_soil.png deleted file mode 100644 index bb65a2e4b0..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/mcl_blackstone_soul_soil.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/mcl_nether_nether_wart_block_blue.png b/mods/ITEMS/mcl_blackstone/textures/mcl_nether_nether_wart_block_blue.png deleted file mode 100644 index adebf62336..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/mcl_nether_nether_wart_block_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/soul_fire_basic_flame.png b/mods/ITEMS/mcl_blackstone/textures/soul_fire_basic_flame.png deleted file mode 100644 index 74bd64d322..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/soul_fire_basic_flame.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/soul_fire_basic_flame_animated.png b/mods/ITEMS/mcl_blackstone/textures/soul_fire_basic_flame_animated.png deleted file mode 100644 index 010679eac4..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/soul_fire_basic_flame_animated.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/soul_mcl_burning_entity_flame_animated.png b/mods/ITEMS/mcl_blackstone/textures/soul_mcl_burning_entity_flame_animated.png deleted file mode 100644 index 795d3e9a7a..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/soul_mcl_burning_entity_flame_animated.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/soul_mcl_burning_hud_flame_animated.png b/mods/ITEMS/mcl_blackstone/textures/soul_mcl_burning_hud_flame_animated.png deleted file mode 100644 index 0466957163..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/soul_mcl_burning_hud_flame_animated.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/soul_torch_on_floor.png b/mods/ITEMS/mcl_blackstone/textures/soul_torch_on_floor.png deleted file mode 100644 index 81bdddc07b..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/soul_torch_on_floor.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blackstone/textures/soul_torch_on_floor_animated.png b/mods/ITEMS/mcl_blackstone/textures/soul_torch_on_floor_animated.png deleted file mode 100644 index b125743b0e..0000000000 Binary files a/mods/ITEMS/mcl_blackstone/textures/soul_torch_on_floor_animated.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blast_furnace/README.md b/mods/ITEMS/mcl_blast_furnace/README.md deleted file mode 100644 index e96c219429..0000000000 --- a/mods/ITEMS/mcl_blast_furnace/README.md +++ /dev/null @@ -1,13 +0,0 @@ -Blast Furnaces for MineClone 2. -Heavily based on Minetest Game (default/furnace.lua) and the MineClone 2 Furnaces. - -License of source code ----------------------- -LGPLv2.1 -Based on code from Minetest Game. -Modified by Wuzzy. -MCl 2 Furances modified by PrairieWind. - -License of media ----------------- -See the main MineClone 2 README.md file. diff --git a/mods/ITEMS/mcl_blast_furnace/init.lua b/mods/ITEMS/mcl_blast_furnace/init.lua deleted file mode 100644 index 168c28bd51..0000000000 --- a/mods/ITEMS/mcl_blast_furnace/init.lua +++ /dev/null @@ -1,575 +0,0 @@ - -local S = minetest.get_translator(minetest.get_current_modname()) - -local LIGHT_ACTIVE_FURNACE = 13 - --- --- Formspecs --- - -local function active_formspec(fuel_percent, item_percent) - return "size[9,8.75]".. - "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Blast Furnace"))).."]".. - "list[context;src;2.75,0.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. - "list[context;fuel;2.75,2.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. - "list[context;dst;5.75,1.5;1,1;]".. - mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. - "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. - (100-fuel_percent)..":default_furnace_fire_fg.png]".. - "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[lowpart:".. - (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. - -- Craft guide button temporarily removed due to Minetest bug. - -- TODO: Add it back when the Minetest bug is fixed. - --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. - --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. - "listring[context;dst]".. - "listring[current_player;main]".. - "listring[context;src]".. - "listring[current_player;main]".. - "listring[context;fuel]".. - "listring[current_player;main]" -end - -local inactive_formspec = "size[9,8.75]".. - "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Blast Furnace"))).."]".. - "list[context;src;2.75,0.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. - "list[context;fuel;2.75,2.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. - "list[context;dst;5.75,1.5;1,1;]".. - mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. - "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. - "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[transformR270]".. - -- Craft guide button temporarily removed due to Minetest bug. - -- TODO: Add it back when the Minetest bug is fixed. - --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. - --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. - "listring[context;dst]".. - "listring[current_player;main]".. - "listring[context;src]".. - "listring[current_player;main]".. - "listring[context;fuel]".. - "listring[current_player;main]" - -local receive_fields = function(pos, formname, fields, sender) - if fields.craftguide then - mcl_craftguide.show(sender:get_player_name()) - end -end - -local function give_xp(pos, player) - local meta = minetest.get_meta(pos) - local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2),-1.95) - local xp = meta:get_int("xp") - if xp > 0 then - if player then - mcl_experience.add_xp(player, xp) - else - mcl_experience.throw_xp(vector.add(pos, dir), xp) - end - meta:set_int("xp", 0) - end -end - --- --- Node callback functions that are the same for active and inactive furnace --- - -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if listname == "fuel" then - -- Test stack with size 1 because we burn one fuel at a time - local teststack = ItemStack(stack) - teststack:set_count(1) - local output, decremented_input = minetest.get_craft_result({method="fuel", width=1, items={teststack}}) - if output.time ~= 0 then - -- Only allow to place 1 item if fuel get replaced by recipe. - -- This is the case for lava buckets. - local replace_item = decremented_input.items[1] - if replace_item:is_empty() then - -- For most fuels, just allow to place everything - return stack:get_count() - else - if inv:get_stack(listname, index):get_count() == 0 then - return 1 - else - return 0 - end - end - else - return 0 - end - elseif listname == "src" then - return stack:get_count() - elseif listname == "dst" then - return 0 - end -end - -local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local stack = inv:get_stack(from_list, from_index) - return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) -end - -local function allow_metadata_inventory_take(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end - return stack:get_count() -end - -local function on_metadata_inventory_take(pos, listname, index, stack, player) - -- Award smelting achievements - if listname == "dst" then - if stack:get_name() == "mcl_core:iron_ingot" then - awards.unlock(player:get_player_name(), "mcl:acquireIron") - end - give_xp(pos, player) - end -end - -local function on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - if from_list == "dst" then - give_xp(pos, player) - end -end - -local function spawn_flames(pos, param2) - local minrelpos, maxrelpos - local dir = minetest.facedir_to_dir(param2) - if dir.x > 0 then - minrelpos = { x = -0.6, y = -0.05, z = -0.25 } - maxrelpos = { x = -0.55, y = -0.45, z = 0.25 } - elseif dir.x < 0 then - minrelpos = { x = 0.55, y = -0.05, z = -0.25 } - maxrelpos = { x = 0.6, y = -0.45, z = 0.25 } - elseif dir.z > 0 then - minrelpos = { x = -0.25, y = -0.05, z = -0.6 } - maxrelpos = { x = 0.25, y = -0.45, z = -0.55 } - elseif dir.z < 0 then - minrelpos = { x = -0.25, y = -0.05, z = 0.55 } - maxrelpos = { x = 0.25, y = -0.45, z = 0.6 } - else - return - end - mcl_particles.add_node_particlespawner(pos, { - amount = 4, - time = 0, - minpos = vector.add(pos, minrelpos), - maxpos = vector.add(pos, maxrelpos), - minvel = { x = -0.01, y = 0, z = -0.01 }, - maxvel = { x = 0.01, y = 0.1, z = 0.01 }, - minexptime = 0.3, - maxexptime = 0.6, - minsize = 0.4, - maxsize = 0.8, - texture = "mcl_particles_flame.png", - glow = LIGHT_ACTIVE_FURNACE, - }, "low") -end - -local function swap_node(pos, name) - local node = minetest.get_node(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) - if name == "mcl_blast_furnace:blast_furnace_active" then - spawn_flames(pos, node.param2) - else - mcl_particles.delete_node_particlespawners(pos) - end -end - -local function blast_furnace_reset_delta_time(pos) - local meta = minetest.get_meta(pos) - local time_speed = tonumber(minetest.settings:get("time_speed") or 72) - if (time_speed < 0.1) then - return - end - local time_multiplier = 86400 / time_speed - local current_game_time = .0 + ((minetest.get_day_count() + minetest.get_timeofday()) * time_multiplier) - - -- TODO: Change meta:get/set_string() to get/set_float() for "last_gametime". - -- In Windows *_float() works OK but under Linux it returns rounded unusable values like 449540.000000000 - local last_game_time = meta:get_string("last_gametime") - if last_game_time then - last_game_time = tonumber(last_game_time) - end - if not last_game_time or last_game_time < 1 or math.abs(last_game_time - current_game_time) <= 1.5 then - return - end - - meta:set_string("last_gametime", tostring(current_game_time)) -end - -local function blast_furnace_get_delta_time(pos, elapsed) - local meta = minetest.get_meta(pos) - local time_speed = tonumber(minetest.settings:get("time_speed") or 72) - local current_game_time - if (time_speed < 0.1) then - return meta, elapsed - else - local time_multiplier = 86400 / time_speed - current_game_time = .0 + ((minetest.get_day_count() + minetest.get_timeofday()) * time_multiplier) - end - - local last_game_time = meta:get_string("last_gametime") - if last_game_time then - last_game_time = tonumber(last_game_time) - end - if not last_game_time or last_game_time < 1 then - last_game_time = current_game_time - 0.1 - elseif last_game_time == current_game_time then - current_game_time = current_game_time + 1.0 - end - - local elapsed_game_time = .0 + current_game_time - last_game_time - - meta:set_string("last_gametime", tostring(current_game_time)) - - return meta, elapsed_game_time -end - -local function blast_furnace_node_timer(pos, elapsed) - -- - -- Inizialize metadata - -- - local meta, elapsed_game_time = blast_furnace_get_delta_time(pos, elapsed) - - local fuel_time = meta:get_float("fuel_time") or 0 - local src_time = meta:get_float("src_time") or 0 - local src_item = meta:get_string("src_item") or "" - local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 - - local inv = meta:get_inventory() - local srclist, fuellist - - local cookable, cooked - local active = true - local fuel - - srclist = inv:get_list("src") - fuellist = inv:get_list("fuel") - - -- Check if src item has been changed - if srclist[1]:get_name() ~= src_item then - -- Reset cooking progress in this case - src_time = 0 - src_item = srclist[1]:get_name() - end - - local update = true - while elapsed_game_time > 0.00001 and update do - -- - -- Cooking - -- - - local el = elapsed_game_time - - -- Check if we have cookable content: cookable - local aftercooked - cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) - cookable = minetest.get_item_group(inv:get_stack("src", 1):get_name(), "blast_furnace_smeltable") == 1 - if cookable then - -- Successful cooking requires space in dst slot and time - if not inv:room_for_item("dst", cooked.item) then - cookable = false - end - end - - if cookable then -- fuel lasts long enough, adjust el to cooking duration - el = math.min(el, cooked.time - src_time) - end - - -- Check if we have enough fuel to burn - active = fuel_time < fuel_totaltime - if cookable and not active then - -- We need to get new fuel - local afterfuel - fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) - - if fuel.time == 0 then - -- No valid fuel in fuel list -- stop - fuel_totaltime = 0 - src_time = 0 - update = false - else - -- Take fuel from fuel list - inv:set_stack("fuel", 1, afterfuel.items[1]) - fuel_time = 0 - fuel_totaltime = fuel.time - el = math.min(el, fuel_totaltime) - active = true - fuellist = inv:get_list("fuel") - end - elseif active then - el = math.min(el, fuel_totaltime - fuel_time) - -- The furnace is currently active and has enough fuel - fuel_time = (fuel_time + el) *2 --multiply speed of fuel consumption to match proper output - end - - -- If there is a cookable item then check if it is ready yet - if cookable and active then - -- In the src_time variable, the *2 is the multiplication that makes the blast furnace work faster than a normal furnace. - src_time = (src_time + el)*2 - -- Place result in dst list if done - if src_time >= cooked.time then - inv:add_item("dst", cooked.item) - inv:set_stack("src", 1, aftercooked.items[1]) - srclist = inv:get_list("src") - src_time = 0 - - meta:set_int("xp", meta:get_int("xp") + 1) -- ToDo give each recipe an idividial XP count - end - end - - elapsed_game_time = elapsed_game_time - el - end - - if fuel and fuel_totaltime > fuel.time then - fuel_totaltime = fuel.time - end - if srclist and srclist[1]:is_empty() then - src_time = 0 - end - - -- - -- Update formspec and node - -- - local formspec = inactive_formspec - local item_percent = 0 - if cookable then - item_percent = math.floor(src_time / cooked.time * 100) - end - - local result = false - - if active then - local fuel_percent = 0 - if fuel_totaltime > 0 then - fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) - end - formspec = active_formspec(fuel_percent, item_percent) - swap_node(pos, "mcl_blast_furnace:blast_furnace_active") - -- make sure timer restarts automatically - result = true - else - swap_node(pos, "mcl_blast_furnace:blast_furnace") - -- stop timer on the inactive furnace - minetest.get_node_timer(pos):stop() - end - - -- - -- Set meta values - -- - meta:set_float("fuel_totaltime", fuel_totaltime) - meta:set_float("fuel_time", fuel_time) - meta:set_float("src_time", src_time) - if srclist then - meta:set_string("src_item", src_item) - else - meta:set_string("src_item", "") - end - meta:set_string("formspec", formspec) - - return result -end - -local on_rotate, after_rotate_active -if minetest.get_modpath("screwdriver") then - on_rotate = screwdriver.rotate_simple - after_rotate_active = function(pos) - local node = minetest.get_node(pos) - mcl_particles.delete_node_particlespawners(pos) - if node.name == "mcl_blast_furnace:blast_furnace" then - return - end - spawn_flames(pos, node.param2) - end -end - -minetest.register_node("mcl_blast_furnace:blast_furnace", { - description = S("Blast Furnace"), - _tt_help = S("Smelts ores faster than furnace"), - _doc_items_longdesc = S("Blast Furnaces smelt several items, mainly ores and armor, using a furnace fuel, into something else."), - _doc_items_usagehelp = - S([[ - Use the furnace to open the furnace menu. - Place a furnace fuel in the lower slot and the source material in the upper slot. - The furnace will slowly use its fuel to smelt the item. - The result will be placed into the output slot at the right side. - ]]).."\n".. - S("Use the recipe book to see what ores you can smelt, what you can use as fuel and how long it will burn."), - _doc_items_hidden = false, - tiles = { - "blast_furnace_top.png", "blast_furnace_top.png", - "blast_furnace_side.png", "blast_furnace_side.png", - "blast_furnace_side.png", "blast_furnace_front.png" - }, - paramtype2 = "facedir", - groups = {pickaxey=1, container=4, deco_block=1, material_stone=1}, - is_ground_content = false, - sounds = mcl_sounds.node_sound_stone_defaults(), - - on_timer = blast_furnace_node_timer, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local meta = minetest.get_meta(pos) - local meta2 = meta:to_table() - meta:from_table(oldmetadata) - local inv = meta:get_inventory() - for _, listname in ipairs({"src", "dst", "fuel"}) do - local stack = inv:get_stack(listname, 1) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - end - meta:from_table(meta2) - end, - - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", inactive_formspec) - local inv = meta:get_inventory() - inv:set_size("src", 1) - inv:set_size("fuel", 1) - inv:set_size("dst", 1) - end, - on_destruct = function(pos) - mcl_particles.delete_node_particlespawners(pos) - give_xp(pos) - end, - - on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - -- Reset accumulated game time when player works with furnace: - blast_furnace_reset_delta_time(pos) - minetest.get_node_timer(pos):start(1.0) - - on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - end, - on_metadata_inventory_put = function(pos) - -- Reset accumulated game time when player works with furnace: - blast_furnace_reset_delta_time(pos) - -- start timer function, it will sort out whether furnace can burn or not. - minetest.get_node_timer(pos):start(1.0) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - -- Reset accumulated game time when player works with furnace: - blast_furnace_reset_delta_time(pos) - -- start timer function, it will helpful if player clears dst slot - minetest.get_node_timer(pos):start(1.0) - - on_metadata_inventory_take(pos, listname, index, stack, player) - end, - - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_take = allow_metadata_inventory_take, - on_receive_fields = receive_fields, - _mcl_blast_resistance = 3.5, - _mcl_hardness = 3.5, - on_rotate = on_rotate, -}) - -minetest.register_node("mcl_blast_furnace:blast_furnace_active", { - description = S("Burning Blast Furnace"), - _doc_items_create_entry = false, - tiles = { - "blast_furnace_top.png", "blast_furnace_top.png", - "blast_furnace_side.png", "blast_furnace_side.png", - "blast_furnace_side.png", {name = "blast_furnace_front_on.png", - animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 48}}, - }, - paramtype2 = "facedir", - paramtype = "light", - light_source = LIGHT_ACTIVE_FURNACE, - drop = "mcl_blast_furnace:blast_furnace", - groups = {pickaxey=1, container=4, deco_block=1, not_in_creative_inventory=1, material_stone=1}, - is_ground_content = false, - sounds = mcl_sounds.node_sound_stone_defaults(), - on_timer = blast_furnace_node_timer, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local meta = minetest.get_meta(pos) - local meta2 = meta - meta:from_table(oldmetadata) - local inv = meta:get_inventory() - for _, listname in ipairs({"src", "dst", "fuel"}) do - local stack = inv:get_stack(listname, 1) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - end - meta:from_table(meta2:to_table()) - end, - - on_construct = function(pos) - local node = minetest.get_node(pos) - spawn_flames(pos, node.param2) - end, - on_destruct = function(pos) - mcl_particles.delete_node_particlespawners(pos) - give_xp(pos) - end, - - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_take = allow_metadata_inventory_take, - on_metadata_inventory_move = on_metadata_inventory_move, - on_metadata_inventory_take = on_metadata_inventory_take, - on_receive_fields = receive_fields, - _mcl_blast_resistance = 3.5, - _mcl_hardness = 3.5, - on_rotate = on_rotate, - after_rotate = after_rotate_active, -}) - -minetest.register_craft({ - output = "mcl_blast_furnace:blast_furnace", - recipe = { - { "mcl_core:iron_ingot", "mcl_core:iron_ingot", "mcl_core:iron_ingot" }, - { "mcl_core:iron_ingot", "mcl_furnaces:furnace", "mcl_core:iron_ingot" }, - { "mcl_core:stone_smooth", "mcl_core:stone_smooth", "mcl_core:stone_smooth" }, - } -}) - --- Add entry alias for the Help -if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_blast_furnace:blast_furnace", "nodes", "mcl_blast_furnace:blast_furnace_active") -end - -minetest.register_lbm({ - label = "Active blast_furnace flame particles", - name = "mcl_blast_furnace:flames", - nodenames = {"mcl_blast_furnace:blast_furnace_active"}, - run_at_every_load = true, - action = function(pos, node) - spawn_flames(pos, node.param2) - end, -}) - diff --git a/mods/ITEMS/mcl_blast_furnace/mod.conf b/mods/ITEMS/mcl_blast_furnace/mod.conf deleted file mode 100644 index e330e80e4b..0000000000 --- a/mods/ITEMS/mcl_blast_furnace/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = mcl_blast_furnace -depends = mcl_init, mcl_formspec, mcl_core, mcl_furnaces, mcl_sounds, mcl_craftguide, mcl_achievements, mcl_particles -optional_depends = doc, screwdriver diff --git a/mods/ITEMS/mcl_blast_furnace/textures/blast_furnace_front.png b/mods/ITEMS/mcl_blast_furnace/textures/blast_furnace_front.png deleted file mode 100644 index 02acd6d31b..0000000000 Binary files a/mods/ITEMS/mcl_blast_furnace/textures/blast_furnace_front.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blast_furnace/textures/blast_furnace_front_on.png b/mods/ITEMS/mcl_blast_furnace/textures/blast_furnace_front_on.png deleted file mode 100644 index 712bac83fc..0000000000 Binary files a/mods/ITEMS/mcl_blast_furnace/textures/blast_furnace_front_on.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blast_furnace/textures/blast_furnace_side.png b/mods/ITEMS/mcl_blast_furnace/textures/blast_furnace_side.png deleted file mode 100644 index 966b001e2f..0000000000 Binary files a/mods/ITEMS/mcl_blast_furnace/textures/blast_furnace_side.png and /dev/null differ diff --git a/mods/ITEMS/mcl_blast_furnace/textures/blast_furnace_top.png b/mods/ITEMS/mcl_blast_furnace/textures/blast_furnace_top.png deleted file mode 100644 index 03ce91b5cf..0000000000 Binary files a/mods/ITEMS/mcl_blast_furnace/textures/blast_furnace_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua deleted file mode 100644 index 446be8cd66..0000000000 --- a/mods/ITEMS/mcl_books/init.lua +++ /dev/null @@ -1,366 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -local max_text_length = 4500 -- TODO: Increase to 12800 when scroll bar was added to written book -local max_title_length = 64 - -local header = "" -if minetest.get_modpath("mcl_init") then - header = "no_prepend[]" .. mcl_vars.gui_nonbg .. mcl_vars.gui_bg_color .. - "style_type[button;border=false;bgimg=mcl_books_button9.png;bgimg_pressed=mcl_books_button9_pressed.png;bgimg_middle=2,2]" -end - --- Book -minetest.register_craftitem("mcl_books:book", { - description = S("Book"), - _doc_items_longdesc = S("Books are used to make bookshelves and book and quills."), - inventory_image = "default_book.png", - stack_max = 64, - groups = { book=1, craftitem = 1, enchantability = 1 }, - _mcl_enchanting_enchanted_tool = "mcl_enchanting:book_enchanted", -}) - -if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then - minetest.register_craft({ - type = "shapeless", - output = "mcl_books:book", - recipe = { "mcl_core:paper", "mcl_core:paper", "mcl_core:paper", "mcl_mobitems:leather", } - }) -end - --- Get the included text out of the book item --- itemstack: Book item --- meta: Meta of book (optional) -local function get_text(itemstack) - -- Grab the text - local meta = itemstack:get_meta() - local text = meta:get_string("text") - - -- Backwards-compability with MCL2 0.21.0 - -- Remember that get_metadata is deprecated since MT 0.4.16! - if text == nil or text == "" then - local meta_legacy = itemstack:get_metadata() - if itemstack:get_name() == "mcl_books:written_book" then - local des = minetest.deserialize(meta_legacy) - if des then - text = des.text - end - else - text = meta_legacy - end - end - - -- Security check - if not text then - text = "" - end - return text -end - -local function make_description(title, author, generation) - local desc - if generation == 0 then - desc = S("“@1”", title) - elseif generation == 1 then - desc = S("Copy of “@1”", title) - elseif generation == 2 then - desc = S("Copy of Copy of “@1”", title) - else - desc = S("Tattered Book") - end - desc = desc .. "\n" .. minetest.colorize(mcl_colors.GRAY, S("by @1", author)) - return desc -end - -local function cap_text_length(text, max_length) - return string.sub(text, 1, max_length) -end - -local function write(itemstack, user, pointed_thing) - -- Call on_rightclick if the pointed node defines it - if pointed_thing.type == "node" then - local node = minetest.get_node(pointed_thing.under) - if user and not user:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack - end - end - end - - local text = get_text(itemstack) - local formspec = "size[8,9]".. - header.. - "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]".. - "textarea[0.75,0.1;7.25,9;text;;"..minetest.formspec_escape(text).."]".. - "button[0.75,7.95;3,1;sign;"..minetest.formspec_escape(S("Sign")).."]".. - "button_exit[4.25,7.95;3,1;ok;"..minetest.formspec_escape(S("Done")).."]" - minetest.show_formspec(user:get_player_name(), "mcl_books:writable_book", formspec) -end - -local function read(itemstack, user, pointed_thing) - -- Call on_rightclick if the pointed node defines it - if pointed_thing.type == "node" then - local node = minetest.get_node(pointed_thing.under) - if user and not user:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack - end - end - end - - local text = get_text(itemstack) - local formspec = "size[8,9]".. - header.. - "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]".. - "textarea[0.75,0.1;7.25,9;;"..minetest.formspec_escape(text)..";]".. - "button_exit[2.25,7.95;3,1;ok;"..minetest.formspec_escape(S("Done")).."]" - minetest.show_formspec(user:get_player_name(), "mcl_books:written_book", formspec) -end - --- Book and Quill -minetest.register_craftitem("mcl_books:writable_book", { - description = S("Book and Quill"), - _tt_help = S("Write down some notes"), - _doc_items_longdesc = S("This item can be used to write down some notes."), - _doc_items_usagehelp = S("Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.").."\n".. - S("A book can hold up to 4500 characters. The title length is limited to 64 characters."), - inventory_image = "mcl_books_book_writable.png", - groups = { book=1 }, - stack_max = 1, - on_place = write, - on_secondary_use = write, -}) - -minetest.register_on_player_receive_fields(function ( player, formname, fields ) - if ((formname == "mcl_books:writable_book") and fields and fields.text) then - local stack = player:get_wielded_item() - if (stack:get_name() and (stack:get_name() == "mcl_books:writable_book")) then - local meta = stack:get_meta() - local text = cap_text_length(fields.text, max_text_length) - if fields.ok then - meta:set_string("text", text) - player:set_wielded_item(stack) - elseif fields.sign then - meta:set_string("text", text) - player:set_wielded_item(stack) - - local name = player:get_player_name() - local formspec = "size[8,9]".. - header.. - "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]".. - "field[0.75,1;7.25,1;title;"..minetest.formspec_escape(minetest.colorize("#000000", S("Enter book title:")))..";]".. - "label[0.75,1.5;"..minetest.formspec_escape(minetest.colorize("#404040", S("by @1", name))).."]".. - "button_exit[0.75,7.95;3,1;sign;"..minetest.formspec_escape(S("Sign and Close")).."]".. - "tooltip[sign;"..minetest.formspec_escape(S("Note: The book will no longer be editable after signing")).."]".. - "button[4.25,7.95;3,1;cancel;"..minetest.formspec_escape(S("Cancel")).."]" - minetest.show_formspec(player:get_player_name(), "mcl_books:signing", formspec) - end - end - elseif ((formname == "mcl_books:signing") and fields and fields.sign and fields.title) then - local newbook = ItemStack("mcl_books:written_book") - local book = player:get_wielded_item() - local name = player:get_player_name() - if book:get_name() == "mcl_books:writable_book" then - local title = fields.title - if string.len(title) == 0 then - title = S("Nameless Book") - end - title = cap_text_length(title, max_title_length) - local meta = newbook:get_meta() - local text = cap_text_length(get_text(book), max_text_length) - meta:set_string("title", title) - meta:set_string("author", name) - meta:set_string("text", text) - meta:set_string("description", make_description(title, name, 0)) - - -- The book copy counter. 0 = original, 1 = copy of original, 2 = copy of copy of original, … - meta:set_int("generation", 0) - - player:set_wielded_item(newbook) - else - minetest.log("error", "[mcl_books] "..name.." failed to sign a book!") - end - elseif ((formname == "mcl_books:signing") and fields and fields.cancel) then - local book = player:get_wielded_item() - if book:get_name() == "mcl_books:writable_book" then - write(book, player, { type = "nothing" }) - end - end -end) - -if minetest.get_modpath("mcl_dye") and minetest.get_modpath("mcl_mobitems") then - minetest.register_craft({ - type = "shapeless", - output = "mcl_books:writable_book", - recipe = { "mcl_books:book", "mcl_dye:black", "mcl_mobitems:feather" }, - }) -end - --- Written Book -minetest.register_craftitem("mcl_books:written_book", { - description = S("Written Book"), - _doc_items_longdesc = S("Written books contain some text written by someone. They can be read and copied, but not edited."), - _doc_items_usagehelp = S("Hold it in your hand, then rightclick to read the book.").."\n\n".. - -S("To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied."), - inventory_image = "mcl_books_book_written.png", - groups = { not_in_creative_inventory=1, book=1, no_rename=1 }, - stack_max = 16, - on_place = read, - on_secondary_use = read -}) - --- Copy books - --- This adds 8 recipes -local baq = "mcl_books:writable_book" -local wb = "mcl_books:written_book" -local recipes = { - {wb, baq}, - {baq, baq, wb}, - {baq, baq, wb, baq}, - {baq, baq, baq, baq, wb}, - {baq, baq, baq, baq, wb, baq}, - {baq, baq, baq, baq, wb, baq, baq}, - {baq, baq, baq, baq, wb, baq, baq, baq}, - {baq, baq, baq, baq, wb, baq, baq, baq, baq}, -} -for r=#recipes, 1, -1 do - minetest.register_craft({ - type = "shapeless", - output = "mcl_books:written_book "..r, - recipe = recipes[r], - }) -end - -minetest.register_craft_predict(function(itemstack, player, old_craft_grid, craft_inv) - if itemstack:get_name() ~= "mcl_books:written_book" then - return - end - - local original - for i = 1, player:get_inventory():get_size("craft") do - if old_craft_grid[i]:get_name() == "mcl_books:written_book" then - original = old_craft_grid[i] - end - end - if not original then - return - end - - local ometa = original:get_meta() - local generation = ometa:get_int("generation") - - -- Check generation, don't allow crafting with copy of copy of book - if generation >= 2 then - return ItemStack("") - else - -- Valid copy. Let's update the description field of the result item - -- so it is properly displayed in the crafting grid. - local imeta = itemstack:get_meta() - local title = cap_text_length(ometa:get_string("title"), max_title_length) - local author = ometa:get_string("author") - - -- Increase book generation and update description - generation = generation + 1 - if generation < 1 then - generation = 1 - end - - local desc = make_description(title, author, generation) - imeta:set_string("description", desc) - return itemstack - end -end) - -minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) - if itemstack:get_name() ~= "mcl_books:written_book" then - return - end - - local original - local index - for i = 1, player:get_inventory():get_size("craft") do - if old_craft_grid[i]:get_name() == "mcl_books:written_book" then - original = old_craft_grid[i] - index = i - end - end - if not original then - return - end - - -- copy of the book - local text = get_text(original) - if not text or text == "" then - local copymeta = original:get_metadata() - itemstack:set_metadata(copymeta) - else - local ometa = original:get_meta() - local generation = ometa:get_int("generation") - - -- No copy of copy of copy of book allowed - if generation >= 2 then - return ItemStack("") - end - - -- Copy metadata - local imeta = itemstack:get_meta() - local title = cap_text_length(ometa:get_string("title"), max_title_length) - local author = ometa:get_string("author") - imeta:set_string("title", title) - imeta:set_string("author", author) - imeta:set_string("text", cap_text_length(text, max_text_length)) - - -- Increase book generation and update description - generation = generation + 1 - if generation < 1 then - generation = 1 - end - - local desc = make_description(title, author, generation) - - imeta:set_string("description", desc) - imeta:set_int("generation", generation) - end - -- put the book with metadata back in the craft grid - craft_inv:set_stack("craft", index, original) -end) - -local wood_sound -if minetest.get_modpath("mcl_sounds") then - wood_sound = mcl_sounds.node_sound_wood_defaults() -end - --- Bookshelf -minetest.register_node("mcl_books:bookshelf", { - description = S("Bookshelf"), - _doc_items_longdesc = S("Bookshelves are used for decoration."), - tiles = {"mcl_books_bookshelf_top.png", "mcl_books_bookshelf_top.png", "default_bookshelf.png"}, - stack_max = 64, - is_ground_content = false, - groups = { - handy=1, axey=1, deco_block=1, material_wood=1, - flammable=3, fire_encouragement=30, fire_flammability=20 - }, - drop = "mcl_books:book 3", - sounds = wood_sound, - _mcl_blast_resistance = 1.5, - _mcl_hardness = 1.5, - _mcl_silk_touch_drop = true, -}) - -minetest.register_craft({ - output = "mcl_books:bookshelf", - recipe = { - {"group:wood", "group:wood", "group:wood"}, - {"mcl_books:book", "mcl_books:book", "mcl_books:book"}, - {"group:wood", "group:wood", "group:wood"}, - } -}) - -minetest.register_craft({ - type = "fuel", - recipe = "mcl_books:bookshelf", - burntime = 15, -}) - diff --git a/mods/ITEMS/mcl_books/locale/mcl_books.de.tr b/mods/ITEMS/mcl_books/locale/mcl_books.de.tr deleted file mode 100644 index df51c18596..0000000000 --- a/mods/ITEMS/mcl_books/locale/mcl_books.de.tr +++ /dev/null @@ -1,26 +0,0 @@ -# textdomain: mcl_books -Book=Buch -Books are used to make bookshelves and book and quills.=Bücher werden zur Herstellung von Bücherregalen und Büchern mit Federkiel gebraucht. -“@1”=„@1“ -Copy of “@1”=Kopie von „@1“ -Copy of Copy of “@1”=Kopie von Kopie von „@1“ -Tattered Book=Zerfleddertes Buch -by @1=von @1 -Sign=Signieren -Done=Fertig -This item can be used to write down some notes.=Dies kann benutzt werden, um ein paar Notizen aufzuschreiben. -Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.=Halten Sie es in der Hand, dann rechtsklicken Sie, um die Notizen zu sehen und zu ändern. Sie können den Text beliebig ändern. Sie können das Buch auch signieren und in ein geschriebenes Buch verwandeln, das gestapelt, aber nicht mehr geändert werden kann. -A book can hold up to 4500 characters. The title length is limited to 64 characters.=Ein Buch kann bis zu 4500 Zeichen enthalten. Die Titellänge ist begrenzt auf 64 Zeichen. -Enter book title:=Buchtitel eingeben: -Note: The book will no longer be editable after signing=Anmerkung: Das Buch kann nach der Signierung nicht länger@nbearbeitet werden -Sign and Close=Signieren und schließen -Cancel=Abbrechen -Nameless Book=Namenloses Buch -Written Book=Geschriebenes Buch -Written books contain some text written by someone. They can be read and copied, but not edited.=Geschriebene Bücher enthalten etwas Text, den jemand geschrieben hat. Sie können gelesen und kopiert, aber nicht geändert werden. -Hold it in your hand, then rightclick to read the book.=Halten Sie es in Ihrer Hand und rechtsklicken Sie, um das Buch zu lesen. -To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.=Um den Text zu kopieren, platzieren Sie es ins Fertigungsgitter mit einem Buch mit Federkiel (oder mehreren) und fertigen Sie die Kopie an. Das geschriebene Buch bleibt. Kopien von Kopien können nicht kopiert werden. -Bookshelf=Bücherregal -Bookshelves are used for decoration.=Bücherregale werden zur Dekoration benutzt. -Book and Quill=Buch und Federkiel -Write down some notes=Zum Aufschreiben von Notizen diff --git a/mods/ITEMS/mcl_books/locale/mcl_books.es.tr b/mods/ITEMS/mcl_books/locale/mcl_books.es.tr deleted file mode 100644 index d1e0d947a9..0000000000 --- a/mods/ITEMS/mcl_books/locale/mcl_books.es.tr +++ /dev/null @@ -1,25 +0,0 @@ -# textdomain: mcl_books -Book=Libro -Books are used to make bookshelves and book and quills.=Los libros se usan para hacer estanterías, libros y plumas. -“@1”="@1“ -Copy of “@1”=Copia de "@1“ -Copy of Copy of “@1”=Kopie von Kopie von „@1“ -Tatter ed Book=Libro andrajoso -by @1=por @1 -Sign=Firmar -Done=Hecho -This item can be used to write down some notes.=Este elemento se puede usar para escribir algunas notas. -Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.=Sosténgalo en la mano, luego haga clic derecho para leer las notas actuales y luego edite. Puede editar el texto con la frecuencia que desee. También puede firmar el libro que lo convierte en un libro escrito que puede apilar, pero ya no se puede editar. -A book can hold up to 4500 characters. The title length is limited to 64 characters.=Un libro puede contener hasta 4500 caracteres. La longitud del título está limitada a 64 caracteres. -Enter book title:=Inserta el título del libro: -Note: The book will no longer be editable after signing=Nota: El libro ya no será editable después de firmarlo -Sign and Close=Firmar y cerrar libro -Cancel=Cancelar -Nameless Book=Libro sin nombre -Written Book=Libro escrito -Written books contain some text written by someone. They can be read and copied, but not edited.=Los libros escritos contienen texto escrito por alguien. Pueden leerse y copiarse, pero no editarse. -Hold it in your hand, then rightclick to read the book.=Sostenlo en tu mano, luego haz clic derecho para leer el libro. -To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.=Para copiar el texto del libro escrito, colóquelo en la cuadrícula de elaboración junto con un libro y pluma (o varios de esos) y haga manualidades. El libro escrito no se consumirá. Las copias de copias no se pueden copiar. -Bookshelf=Librería -Bookshelves are used for decoration.=Las librerías se utilizan para la decoración. -Book and Quill=Libro y pluma diff --git a/mods/ITEMS/mcl_books/locale/mcl_books.fr.tr b/mods/ITEMS/mcl_books/locale/mcl_books.fr.tr deleted file mode 100644 index 7024cf5d0d..0000000000 --- a/mods/ITEMS/mcl_books/locale/mcl_books.fr.tr +++ /dev/null @@ -1,28 +0,0 @@ -# textdomain: mcl_books -Book=Livre -Books are used to make bookshelves and book and quills.=Les livres sont utilisés pour fabriquer des étagères et des livres et des plumes. -“@1”="@1" -Copy of “@1”=Copie de "@1" -Copy of Copy of “@1”=Copie de Copie de "@1" -Tattered Book=Livre en lambeaux -by @1=ar @1 -# as in “to sign a book” -Sign=Signer -Done=Terminé -This item can be used to write down some notes.=Cet élément peut être utilisé pour écrire certaines notes. -Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.=Tenez-le dans la main, puis faites un clic droit pour lire les notes actuelles et modifiez-les ensuite. Vous pouvez modifier le texte aussi souvent que vous le souhaitez. Vous pouvez également signer le livre qui le transforme en livre écrit que vous pouvez empiler, mais il ne peut plus être édité. -A book can hold up to 4500 characters. The title length is limited to 64 characters.=Un livre peut contenir jusqu'à 4500 caractères. La longueur du titre est limitée à 64 caractères. -Enter book title:=Entrez le titre du livre: -by @1=par @1 -Note: The book will no longer be editable after signing=Remarque: le livre ne sera plus modifiable après la signature -Sign and Close=Signez et fermez -Cancel=Annuler -Nameless Book=Livre sans nom -Written Book=Livre écrit -Written books contain some text written by someone. They can be read and copied, but not edited.=Les livres écrits contiennent du texte écrit par quelqu'un. Ils peuvent être lus et copiés, mais pas modifiés. -Hold it in your hand, then rightclick to read the book.=Tenez-le dans votre main, puis faites un clic droit pour lire le livre. -To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.=Pour copier le texte du livre écrit, placez-le dans la grille d'artisanat avec un livre et une plume (ou plusieurs de ceux-ci) et de l'artisanat. Le livre écrit ne sera pas consommé. Les copies de copies ne peuvent pas être copiées. -Bookshelf=Bibliothèque -Bookshelves are used for decoration.=Les bibliothèques sont utilisées pour la décoration. -Book and Quill=Livre et Plume -Write down some notes=Notez quelques notes diff --git a/mods/ITEMS/mcl_books/locale/mcl_books.pl.tr b/mods/ITEMS/mcl_books/locale/mcl_books.pl.tr deleted file mode 100644 index 8ef0db8730..0000000000 --- a/mods/ITEMS/mcl_books/locale/mcl_books.pl.tr +++ /dev/null @@ -1,28 +0,0 @@ -# textdomain: mcl_books -Book=Książka -Books are used to make bookshelves and book and quills.=Książki są używane do tworzenia półek z książkami oraz książek z piórem. -“@1”=„@1” -Copy of “@1”=Kopia „@” -Copy of Copy of “@1”=Kopia kopii „@” -Tattered Book=Podarta książka -by @1=autorstwa @1 -# as in “to sign a book” -Sign=Podpisz -Done=Skończone -This item can be used to write down some notes.=Ten przedmiot może być wykorzystany do zapisania notatek -Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.=Weź ją do ręki, następnie kliknij prawym przyciskiem by przeczytać notatki i je edytować. Możesz edytować tekst tak często jak tylko chcesz. Możesz także podpisać książkę, co zamienia ją w zapisaną książkę, którą można grupować, ale nie można jej edytować. -A book can hold up to 4500 characters. The title length is limited to 64 characters.=W książce zmieści się maksymalnie 4500 znaków. Długość tytułu jest ograniczona do 64 znaków. -Enter book title:=Wprowadź tytuł książki: -by @1=autorstwa @1 -Note: The book will no longer be editable after signing=Uwaga: Książki nie da się edytować po podpisaniu -Sign and Close=Podpisz i zamknij -Cancel=Anuluj -Nameless Book=Nienazwana książka -Written Book=Zapisana książka -Written books contain some text written by someone. They can be read and copied, but not edited.=Zapisane książki przechowują tekst napisany przez kogoś. Mogą być czytane i kopiowane, ale nie edytowane. -Hold it in your hand, then rightclick to read the book.=Weź ją do ręki i kliknij prawym, aby przeczytać książkę. -To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.=Aby skopiować tekst z zapisanej książki umieść ją w siatce wytwarzania z książką z piórem (lub kilkoma) i wytwarzaj. Zapisana książka nie zostanie wykorzystana. Kopie kopii nie mogą być kopiowane. -Bookshelf=Półka z książkami -Bookshelves are used for decoration.=Półki z książkami są używane jako dekoracje -Book and Quill=Książka z piórem -Write down some notes=Zapisz jakieś notatki diff --git a/mods/ITEMS/mcl_books/locale/mcl_books.ru.tr b/mods/ITEMS/mcl_books/locale/mcl_books.ru.tr deleted file mode 100644 index a4cc9804ce..0000000000 --- a/mods/ITEMS/mcl_books/locale/mcl_books.ru.tr +++ /dev/null @@ -1,28 +0,0 @@ -# textdomain: mcl_books -Book=Книги -Books are used to make bookshelves and book and quills.=Из книг можно создавать книжные полки и книги с перьями. -“@1”=“@1” -Copy of “@1”=Копия “@1” -Copy of Copy of “@1”=Копия копии “@1” -Tattered Book=Потрёпанная книга -by @1=игрока @1 -# as in “to sign a book” -Sign=Подписать -Done=Готово -This item can be used to write down some notes.=Этот предмет можно использовать для записи заметок. -Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.=Удерживая его в руке, кликните правой, чтобы прочитать текущие записи и отредактировать. Вы можете редактировать текст, сколько захотите. Вы также можете подписать книгу, что превратит её в подписанную книгу, её можно будет уложить в стопку с другими такими же, но больше нельзя будет редактировать. -A book can hold up to 4500 characters. The title length is limited to 64 characters.=Книга может содержать до 4500 символов. Длина названия ограничена 64 символами. -Enter book title:=Введите название книги -by @1=игрока @1 -Note: The book will no longer be editable after signing=Предупреждение: Книгу больше нельзя будет редактировать, если вы её подпишете. -Sign and Close=Подписать и закрыть -Cancel=Отмена -Nameless Book=Безымянная книга -Written Book=Подписанная книга -Written books contain some text written by someone. They can be read and copied, but not edited.=Подписанная книга содержит текст, написанный кем-то. Она может быть прочитана и скопирована, но её нельзя редактировать. -Hold it in your hand, then rightclick to read the book.=Удерживая в руке, кликните правой, чтобы прочитать книгу. -To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.=Чтобы скопировать текст подписанной книги, поместите её в крафтинговую решётку вместе с книгой с пером (или сразу несколькими) и скрафтите. Подписанная книга не израсходуется. Не могут быть скопированы копии копий. -Bookshelf=Книжная полка -Bookshelves are used for decoration.=Книжные полки используют в качестве украшений -Book and Quill=Книга с пером -Write down some notes=Сделайте какие-нибудь записи diff --git a/mods/ITEMS/mcl_books/locale/mcl_books.zh_TW.tr b/mods/ITEMS/mcl_books/locale/mcl_books.zh_TW.tr deleted file mode 100644 index eb3ab51a73..0000000000 --- a/mods/ITEMS/mcl_books/locale/mcl_books.zh_TW.tr +++ /dev/null @@ -1,27 +0,0 @@ -# textdomain: mcl_books -Book=書 -Books are used to make bookshelves and book and quills.=書籍用於製作書櫃以及書和羽毛筆。 -“@1”=「@1」 -Copy of “@1”=「@1」的複本 -Copy of Copy of “@1”=「@1」的複本的複本 -Tattered Book=破舊的書 -by @1=由 @1 篇寫 -# as in “to sign a book” -Sign=署名 -Done=退出 -This item can be used to write down some notes.=這個物品可以用來寫下一些筆記。 -Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.=把它拿在手裡,然後右鍵閱讀當前的筆記,然後進行編輯。你可以隨心所欲地編輯文字。你也可以在書上署名名,這就把它變成了一本完成的書,你可以把它疊起來,但它不能再被編輯了。 -A book can hold up to 4500 characters. The title length is limited to 64 characters.=一本書最多可以容納4500個字符。標題長度限制為64個字符。 -Enter book title:=輸入書本標題: -Note: The book will no longer be editable after signing=注意:在署名後,它不能再被編輯了。 -Sign and Close=署名並退出 -Cancel=取消 -Nameless Book=未命名的書 -Written Book=完成的書 -Written books contain some text written by someone. They can be read and copied, but not edited.=完成的書包含一些由玩家寫的文字。它們可以被閱讀和復制,但不能被編輯。 -Hold it in your hand, then rightclick to read the book.=把書放在手裏,右鍵閱讀它。 -To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.=要復製完成的書的文本,請將其與書和羽毛筆(或多個)一起放入製作網格,然後製作。完成的書不會被消耗掉。複本的複本不能被複製。 -Bookshelf=書櫃 -Bookshelves are used for decoration.=書櫃是一種裝飾行方塊 -Book and Quill=書和羽毛筆 -Write down some notes=寫下一些筆記 diff --git a/mods/ITEMS/mcl_books/locale/template.txt b/mods/ITEMS/mcl_books/locale/template.txt deleted file mode 100644 index 8667d1f0b9..0000000000 --- a/mods/ITEMS/mcl_books/locale/template.txt +++ /dev/null @@ -1,28 +0,0 @@ -# textdomain: mcl_books -Book= -Books are used to make bookshelves and book and quills.= -“@1”= -Copy of “@1”= -Copy of Copy of “@1”= -Tattered Book= -by @1= -# as in “to sign a book” -Sign= -Done= -This item can be used to write down some notes.= -Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.= -A book can hold up to 4500 characters. The title length is limited to 64 characters.= -Enter book title:= -by @1= -Note: The book will no longer be editable after signing= -Sign and Close= -Cancel= -Nameless Book= -Written Book= -Written books contain some text written by someone. They can be read and copied, but not edited.= -Hold it in your hand, then rightclick to read the book.= -To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.= -Bookshelf= -Bookshelves are used for decoration.= -Book and Quill= -Write down some notes= diff --git a/mods/ITEMS/mcl_books/mod.conf b/mods/ITEMS/mcl_books/mod.conf deleted file mode 100644 index cea9a5dd8d..0000000000 --- a/mods/ITEMS/mcl_books/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = mcl_books -author = celeron55 -description = Books mod for MCL2 -optional_depends = mcl_init, mcl_core, mcl_sounds, mcl_mobitems, mcl_dye, mcl_colors diff --git a/mods/ITEMS/mcl_books/textures/default_book.png b/mods/ITEMS/mcl_books/textures/default_book.png deleted file mode 100644 index e9c2d9db64..0000000000 Binary files a/mods/ITEMS/mcl_books/textures/default_book.png and /dev/null differ diff --git a/mods/ITEMS/mcl_books/textures/default_bookshelf.png b/mods/ITEMS/mcl_books/textures/default_bookshelf.png deleted file mode 100644 index 48fb5ec894..0000000000 Binary files a/mods/ITEMS/mcl_books/textures/default_bookshelf.png and /dev/null differ diff --git a/mods/ITEMS/mcl_books/textures/mcl_books_book_bg.png b/mods/ITEMS/mcl_books/textures/mcl_books_book_bg.png deleted file mode 100644 index 835c54407e..0000000000 Binary files a/mods/ITEMS/mcl_books/textures/mcl_books_book_bg.png and /dev/null differ diff --git a/mods/ITEMS/mcl_books/textures/mcl_books_book_writable.png b/mods/ITEMS/mcl_books/textures/mcl_books_book_writable.png deleted file mode 100644 index caaeacde60..0000000000 Binary files a/mods/ITEMS/mcl_books/textures/mcl_books_book_writable.png and /dev/null differ diff --git a/mods/ITEMS/mcl_books/textures/mcl_books_book_written.png b/mods/ITEMS/mcl_books/textures/mcl_books_book_written.png deleted file mode 100644 index cbf85836ca..0000000000 Binary files a/mods/ITEMS/mcl_books/textures/mcl_books_book_written.png and /dev/null differ diff --git a/mods/ITEMS/mcl_books/textures/mcl_books_bookshelf_top.png b/mods/ITEMS/mcl_books/textures/mcl_books_bookshelf_top.png deleted file mode 100644 index b82bcfec8a..0000000000 Binary files a/mods/ITEMS/mcl_books/textures/mcl_books_bookshelf_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_books/textures/mcl_books_button9.png b/mods/ITEMS/mcl_books/textures/mcl_books_button9.png deleted file mode 100644 index 27b80a89b6..0000000000 Binary files a/mods/ITEMS/mcl_books/textures/mcl_books_button9.png and /dev/null differ diff --git a/mods/ITEMS/mcl_books/textures/mcl_books_button9_pressed.png b/mods/ITEMS/mcl_books/textures/mcl_books_button9_pressed.png deleted file mode 100644 index 08d4272ded..0000000000 Binary files a/mods/ITEMS/mcl_books/textures/mcl_books_button9_pressed.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/README.txt b/mods/ITEMS/mcl_bows/README.txt deleted file mode 100644 index fe879c95cf..0000000000 --- a/mods/ITEMS/mcl_bows/README.txt +++ /dev/null @@ -1,16 +0,0 @@ -This mod adds bows and arrows for MineClone 2. - -License: -* Source code: LGPL 3.0 - * Incorporates code from the [bow] mod by Arcelmi. - https://github.com/Arcelmi/minetest-bows - -* Textures: See MineClone 2 license notes. -* Sounds: - * mcl_bows_bow_shoot.ogg: CC0 by Freesound.org user JoeDinesSound - https://freesound.org/people/JoeDinesSound/sounds/534942/ - * mcl_bows_hit_other.ogg: CC0 by Freesound.org user JoeDinesSound - https://freesound.org/people/JoeDinesSound/sounds/534952/ - * mcl_bows_hit_player.ogg: CC BY 3.0 by Freesound.org user tim.kahn. - https://freesound.org/people/tim.kahn/sounds/38495/ - http://creativecommons.org/licenses/by/3.0/ diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua deleted file mode 100644 index 1816184bba..0000000000 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ /dev/null @@ -1,537 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -local mod_target = minetest.get_modpath("mcl_target") - -local math = math -local vector = vector - --- Time in seconds after which a stuck arrow is deleted -local ARROW_TIMEOUT = 60 --- Time after which stuck arrow is rechecked for being stuck -local STUCK_RECHECK_TIME = 5 - ---local GRAVITY = 9.81 - -local YAW_OFFSET = -math.pi/2 - -local function dir_to_pitch(dir) - --local dir2 = vector.normalize(dir) - local xz = math.abs(dir.x) + math.abs(dir.z) - return -math.atan2(-dir.y, xz) -end - -local function random_arrow_positions(positions, placement) - if positions == "x" then - return math.random(-4, 4) - elseif positions == "y" then - return math.random(0, 10) - end - if placement == "front" and positions == "z" then - return 3 - elseif placement == "back" and positions == "z" then - return -3 - end - return 0 -end - -local mod_awards = minetest.get_modpath("awards") and minetest.get_modpath("mcl_achievements") -local mod_button = minetest.get_modpath("mesecons_button") - -minetest.register_craftitem("mcl_bows:arrow", { - description = S("Arrow"), - _tt_help = S("Ammunition").."\n"..S("Damage from bow: 1-10").."\n"..S("Damage from dispenser: 3"), - _doc_items_longdesc = S("Arrows are ammunition for bows and dispensers.").."\n".. -S("An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.").."\n".. -S("Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons."), - _doc_items_usagehelp = S("To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it."), - inventory_image = "mcl_bows_arrow_inv.png", - groups = { ammo=1, ammo_bow=1, ammo_bow_regular=1, ammo_crossbow=1 }, - _on_dispense = function(itemstack, dispenserpos, droppos, dropnode, dropdir) - -- Shoot arrow - local shootpos = vector.add(dispenserpos, vector.multiply(dropdir, 0.51)) - local yaw = math.atan2(dropdir.z, dropdir.x) + YAW_OFFSET - mcl_bows.shoot_arrow(itemstack:get_name(), shootpos, dropdir, yaw, nil, 19, 3) - end, -}) - -local ARROW_ENTITY={ - physical = true, - pointable = false, - visual = "mesh", - mesh = "mcl_bows_arrow.obj", - visual_size = {x=-1, y=1}, - textures = {"mcl_bows_arrow.png"}, - collisionbox = {-0.19, -0.125, -0.19, 0.19, 0.125, 0.19}, - collide_with_objects = false, - _fire_damage_resistant = true, - - _lastpos={}, - _startpos=nil, - _damage=1, -- Damage on impact - _is_critical=false, -- Whether this arrow would deal critical damage - _stuck=false, -- Whether arrow is stuck - _stucktimer=nil,-- Amount of time (in seconds) the arrow has been stuck so far - _stuckrechecktimer=nil,-- An additional timer for periodically re-checking the stuck status of an arrow - _stuckin=nil, --Position of node in which arow is stuck. - _shooter=nil, -- ObjectRef of player or mob who shot it - _is_arrow = true, - _in_player = false, - _blocked = false, - _viscosity=0, -- Viscosity of node the arrow is currently in - _deflection_cooloff=0, -- Cooloff timer after an arrow deflection, to prevent many deflections in quick succession -} - --- Destroy arrow entity self at pos and drops it as an item -local function spawn_item(self, pos) - if not minetest.is_creative_enabled("") then - local item = minetest.add_item(pos, "mcl_bows:arrow") - item:set_velocity(vector.new(0, 0, 0)) - item:set_yaw(self.object:get_yaw()) - end - mcl_burning.extinguish(self.object) - self.object:remove() -end - -local function damage_particles(pos, is_critical) - if is_critical then - minetest.add_particlespawner({ - amount = 15, - time = 0.1, - minpos = vector.offset(pos, -0.5, -0.5, -0.5), - maxpos = vector.offset(pos, 0.5, 0.5, 0.5), - minvel = vector.new(-0.1, -0.1, -0.1), - maxvel = vector.new(0.1, 0.1, 0.1), - minexptime = 1, - maxexptime = 2, - minsize = 1.5, - maxsize = 1.5, - collisiondetection = false, - vertical = false, - texture = "mcl_particles_crit.png^[colorize:#bc7a57:127", - }) - end -end - -function ARROW_ENTITY.on_step(self, dtime) - mcl_burning.tick(self.object, dtime, self) - - self._time_in_air = self._time_in_air + .001 - - local pos = self.object:get_pos() - local dpos = vector.round(vector.new(pos)) -- digital pos - local node = minetest.get_node(dpos) - - if self._stuck then - self._stucktimer = self._stucktimer + dtime - self._stuckrechecktimer = self._stuckrechecktimer + dtime - if self._stucktimer > ARROW_TIMEOUT then - mcl_burning.extinguish(self.object) - self.object:remove() - return - end - -- Drop arrow as item when it is no longer stuck - -- FIXME: Arrows are a bit slow to react and continue to float in mid air for a few seconds. - if self._stuckrechecktimer > STUCK_RECHECK_TIME then - local stuckin_def - if self._stuckin then - stuckin_def = minetest.registered_nodes[minetest.get_node(self._stuckin).name] - end - -- TODO: In MC, arrow just falls down without turning into an item - if stuckin_def and stuckin_def.walkable == false then - spawn_item(self, pos) - return - end - self._stuckrechecktimer = 0 - end - -- Pickup arrow if player is nearby (not in Creative Mode) - local objects = minetest.get_objects_inside_radius(pos, 1) - for _,obj in ipairs(objects) do - if obj:is_player() then - if self._collectable and not minetest.is_creative_enabled(obj:get_player_name()) then - if obj:get_inventory():room_for_item("main", "mcl_bows:arrow") then - obj:get_inventory():add_item("main", "mcl_bows:arrow") - minetest.sound_play("item_drop_pickup", { - pos = pos, - max_hear_distance = 16, - gain = 1.0, - }, true) - end - end - mcl_burning.extinguish(self.object) - self.object:remove() - return - end - end - - -- Check for object "collision". Done every tick (hopefully this is not too stressing) - else - - if self._damage >= 9 and self._in_player == false then - minetest.add_particlespawner({ - amount = 1, - time = .001, - minpos = pos, - maxpos = pos, - minvel = vector.new(-0.1,-0.1,-0.1), - maxvel = vector.new(0.1,0.1,0.1), - minexptime = 0.5, - maxexptime = 0.5, - minsize = 2, - maxsize = 2, - collisiondetection = false, - vertical = false, - texture = "mobs_mc_arrow_particle.png", - glow = 1, - }) - end - -- We just check for any hurtable objects nearby. - -- The radius of 3 is fairly liberal, but anything lower than than will cause - -- arrow to hilariously go through mobs often. - -- TODO: Implement an ACTUAL collision detection (engine support needed). - local objs = minetest.get_objects_inside_radius(pos, 1.5) - local closest_object - local closest_distance - - if self._deflection_cooloff > 0 then - self._deflection_cooloff = self._deflection_cooloff - dtime - end - - -- Iterate through all objects and remember the closest attackable object - for k, obj in pairs(objs) do - local ok = false - -- Arrows can only damage players and mobs - if obj:is_player() then - ok = true - elseif obj:get_luaentity() then - if (obj:get_luaentity().is_mob or obj:get_luaentity()._hittable_by_projectile) then - ok = true - end - end - - if ok then - local dist = vector.distance(pos, obj:get_pos()) - if not closest_object or not closest_distance then - closest_object = obj - closest_distance = dist - elseif dist < closest_distance then - closest_object = obj - closest_distance = dist - end - end - end - - -- If an attackable object was found, we will damage the closest one only - - if closest_object then - local obj = closest_object - local is_player = obj:is_player() - local lua = obj:get_luaentity() - if obj == self._shooter and self._time_in_air > 1.02 or obj ~= self._shooter and (is_player or (lua and (lua.is_mob or lua._hittable_by_projectile))) then - if obj:get_hp() > 0 then - -- Check if there is no solid node between arrow and object - local ray = minetest.raycast(self.object:get_pos(), obj:get_pos(), true) - for pointed_thing in ray do - if pointed_thing.type == "object" and pointed_thing.ref == closest_object then - -- Target reached! We can proceed now. - break - elseif pointed_thing.type == "node" then - local nn = minetest.get_node(minetest.get_pointed_thing_position(pointed_thing)).name - local def = minetest.registered_nodes[nn] - if (not def) or def.walkable then - -- There's a node in the way. Delete arrow without damage - mcl_burning.extinguish(self.object) - self.object:remove() - return - end - end - end - - -- Punch target object but avoid hurting enderman. - if not lua or lua.name ~= "mobs_mc:enderman" then - if not self._in_player then - damage_particles(self.object:get_pos(), self._is_critical) - end - if mcl_burning.is_burning(self.object) then - mcl_burning.set_on_fire(obj, 5) - end - if not self._in_player and not self._blocked then - obj:punch(self.object, 1.0, { - full_punch_interval=1.0, - damage_groups={fleshy=self._damage}, - }, self.object:get_velocity()) - if obj:is_player() then - if not mcl_shields.is_blocking(obj) then - local placement - self._placement = math.random(1, 2) - if self._placement == 1 then - placement = "front" - else - placement = "back" - end - self._in_player = true - if self._placement == 2 then - self._rotation_station = 90 - else - self._rotation_station = -90 - end - self._y_position = random_arrow_positions("y", placement) - self._x_position = random_arrow_positions("x", placement) - if self._y_position > 6 and self._x_position < 2 and self._x_position > -2 then - self._attach_parent = "Head" - self._y_position = self._y_position - 6 - elseif self._x_position > 2 then - self._attach_parent = "Arm_Right" - self._y_position = self._y_position - 3 - self._x_position = self._x_position - 2 - elseif self._x_position < -2 then - self._attach_parent = "Arm_Left" - self._y_position = self._y_position - 3 - self._x_position = self._x_position + 2 - else - self._attach_parent = "Body" - end - self._z_rotation = math.random(-30, 30) - self._y_rotation = math.random( -30, 30) - self.object:set_attach( - obj, self._attach_parent, - vector.new(self._x_position, self._y_position, random_arrow_positions("z", placement)), - vector.new(0, self._rotation_station + self._y_rotation, self._z_rotation) - ) - else - self._blocked = true - self.object:set_velocity(vector.multiply(self.object:get_velocity(), -0.25)) - end - minetest.after(150, function() - self.object:remove() - end) - end - end - end - - - if is_player then - if self._shooter and self._shooter:is_player() and not self._in_player and not self._blocked then - -- “Ding” sound for hitting another player - minetest.sound_play({name="mcl_bows_hit_player", gain=0.1}, {to_player=self._shooter:get_player_name()}, true) - end - end - - if lua then - local entity_name = lua.name - -- Achievement for hitting skeleton, wither skeleton or stray (TODO) with an arrow at least 50 meters away - -- NOTE: Range has been reduced because mobs unload much earlier than that ... >_> - -- TODO: This achievement should be given for the kill, not just a hit - if self._shooter and self._shooter:is_player() and vector.distance(pos, self._startpos) >= 20 then - if mod_awards and (entity_name == "mobs_mc:skeleton" or entity_name == "mobs_mc:stray" or entity_name == "mobs_mc:witherskeleton") then - awards.unlock(self._shooter:get_player_name(), "mcl:snipeSkeleton") - end - end - end - if not self._in_player and not self._blocked then - minetest.sound_play({name="mcl_bows_hit_other", gain=0.3}, {pos=self.object:get_pos(), max_hear_distance=16}, true) - end - end - if not obj:is_player() then - mcl_burning.extinguish(self.object) - if self._piercing == 0 then - self.object:remove() - end - end - return - end - end - end - - -- Check for node collision - if self._lastpos.x~=nil and not self._stuck then - local def = minetest.registered_nodes[node.name] - local vel = self.object:get_velocity() - -- Arrow has stopped in one axis, so it probably hit something. - -- This detection is a bit clunky, but sadly, MT does not offer a direct collision detection for us. :-( - if (math.abs(vel.x) < 0.0001) or (math.abs(vel.z) < 0.0001) or (math.abs(vel.y) < 0.00001) then - -- Check for the node to which the arrow is pointing - local dir - if math.abs(vel.y) < 0.00001 then - if self._lastpos.y < pos.y then - dir = vector.new(0, 1, 0) - else - dir = vector.new(0, -1, 0) - end - else - dir = minetest.facedir_to_dir(minetest.dir_to_facedir(minetest.yaw_to_dir(self.object:get_yaw()-YAW_OFFSET))) - end - self._stuckin = vector.add(dpos, dir) - local snode = minetest.get_node(self._stuckin) - local sdef = minetest.registered_nodes[snode.name] - - -- If node is non-walkable, unknown or ignore, don't make arrow stuck. - -- This causes a deflection in the engine. - if not sdef or sdef.walkable == false or snode.name == "ignore" then - self._stuckin = nil - if self._deflection_cooloff <= 0 then - -- Lose 1/3 of velocity on deflection - local newvel = vector.multiply(vel, 0.6667) - - self.object:set_velocity(newvel) - -- Reset deflection cooloff timer to prevent many deflections happening in quick succession - self._deflection_cooloff = 1.0 - end - else - - -- Node was walkable, make arrow stuck - self._stuck = true - self._stucktimer = 0 - self._stuckrechecktimer = 0 - - self.object:set_velocity(vector.new(0, 0, 0)) - self.object:set_acceleration(vector.new(0, 0, 0)) - - minetest.sound_play({name="mcl_bows_hit_other", gain=0.3}, {pos=self.object:get_pos(), max_hear_distance=16}, true) - - if mcl_burning.is_burning(self.object) and snode.name == "mcl_tnt:tnt" then - tnt.ignite(self._stuckin) - end - - -- Activate target - if mod_target and snode.name == "mcl_target:target_off" then - mcl_target.hit(self._stuckin, 1) --10 redstone ticks - end - - -- Push the button! Push, push, push the button! - if mod_button and minetest.get_item_group(node.name, "button") > 0 and minetest.get_item_group(node.name, "button_push_by_arrow") == 1 then - local bdir = minetest.wallmounted_to_dir(node.param2) - -- Check the button orientation - if vector.equals(vector.add(dpos, bdir), self._stuckin) then - mesecon.push_button(dpos, node) - end - end - end - elseif (def and def.liquidtype ~= "none") then - -- Slow down arrow in liquids - local v = def.liquid_viscosity - if not v then - v = 0 - end - --local old_v = self._viscosity - self._viscosity = v - local vpenalty = math.max(0.1, 0.98 - 0.1 * v) - if math.abs(vel.x) > 0.001 then - vel.x = vel.x * vpenalty - end - if math.abs(vel.z) > 0.001 then - vel.z = vel.z * vpenalty - end - self.object:set_velocity(vel) - end - end - - -- Update yaw - if not self._stuck then - local vel = self.object:get_velocity() - local yaw = minetest.dir_to_yaw(vel)+YAW_OFFSET - local pitch = dir_to_pitch(vel) - self.object:set_rotation({ x = 0, y = yaw, z = pitch }) - end - - -- Update internal variable - self._lastpos = pos -end - --- Force recheck of stuck arrows when punched. --- Otherwise, punching has no effect. -function ARROW_ENTITY.on_punch(self) - if self._stuck then - self._stuckrechecktimer = STUCK_RECHECK_TIME - end -end - -function ARROW_ENTITY.get_staticdata(self) - local out = { - lastpos = self._lastpos, - startpos = self._startpos, - damage = self._damage, - is_critical = self._is_critical, - stuck = self._stuck, - stuckin = self._stuckin, - stuckin_player = self._in_player, - } - if self._stuck then - -- If _stucktimer is missing for some reason, assume the maximum - if not self._stucktimer then - self._stucktimer = ARROW_TIMEOUT - end - out.stuckstarttime = minetest.get_gametime() - self._stucktimer - end - if self._shooter and self._shooter:is_player() then - out.shootername = self._shooter:get_player_name() - end - return minetest.serialize(out) -end - -function ARROW_ENTITY.on_activate(self, staticdata, dtime_s) - self._time_in_air = 1.0 - local data = minetest.deserialize(staticdata) - if data then - self._stuck = data.stuck - if data.stuck then - if data.stuckstarttime then - -- First, check if the stuck arrow is aleady past its life timer. - -- If yes, delete it. - self._stucktimer = minetest.get_gametime() - data.stuckstarttime - if self._stucktimer > ARROW_TIMEOUT then - mcl_burning.extinguish(self.object) - self.object:remove() - return - end - end - - -- Perform a stuck recheck on the next step. - self._stuckrechecktimer = STUCK_RECHECK_TIME - - self._stuckin = data.stuckin - end - - -- Get the remaining arrow state - self._lastpos = data.lastpos - self._startpos = data.startpos - self._damage = data.damage - self._is_critical = data.is_critical - if data.shootername then - local shooter = minetest.get_player_by_name(data.shootername) - if shooter and shooter:is_player() then - self._shooter = shooter - end - end - - if data.stuckin_player then - self.object:remove() - end - end - self.object:set_armor_groups({ immortal = 1 }) -end - -minetest.register_on_respawnplayer(function(player) - for _, obj in pairs(player:get_children()) do - local ent = obj:get_luaentity() - if ent and ent.name and string.find(ent.name, "mcl_bows:arrow_entity") then - obj:remove() - end - end -end) - -minetest.register_entity("mcl_bows:arrow_entity", ARROW_ENTITY) - -if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then - minetest.register_craft({ - output = "mcl_bows:arrow 4", - recipe = { - {"mcl_core:flint"}, - {"mcl_core:stick"}, - {"mcl_mobitems:feather"} - } - }) -end - -if minetest.get_modpath("doc_identifier") then - doc.sub.identifier.register_object("mcl_bows:arrow_entity", "craftitems", "mcl_bows:arrow") -end diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua deleted file mode 100644 index 23b6b43108..0000000000 --- a/mods/ITEMS/mcl_bows/bow.lua +++ /dev/null @@ -1,393 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -mcl_bows = {} - --- local arrows = { --- ["mcl_bows:arrow"] = "mcl_bows:arrow_entity", --- } - -local GRAVITY = 9.81 -local BOW_DURABILITY = 385 - --- Charging time in microseconds -local BOW_CHARGE_TIME_HALF = 200000 -- bow level 1 -local BOW_CHARGE_TIME_FULL = 500000 -- bow level 2 (full charge) - --- Factor to multiply with player speed while player uses bow --- This emulates the sneak speed. -local PLAYER_USE_BOW_SPEED = tonumber(minetest.settings:get("movement_speed_crouch")) / tonumber(minetest.settings:get("movement_speed_walk")) - --- TODO: Use Minecraft speed (ca. 53 m/s) --- Currently nerfed because at full speed the arrow would easily get out of the range of the loaded map. -local BOW_MAX_SPEED = 40 - ---[[ Store the charging state of each player. -keys: player name -value: -nil = not charging or player not existing -number: currently charging, the number is the time from minetest.get_us_time - in which the charging has started -]] -local bow_load = {} - --- Another player table, this one stores the wield index of the bow being charged -local bow_index = {} - -function mcl_bows.shoot_arrow(arrow_item, pos, dir, yaw, shooter, power, damage, is_critical, bow_stack, collectable) - local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, arrow_item.."_entity") - if power == nil then - power = BOW_MAX_SPEED --19 - end - if damage == nil then - damage = 3 - end - local knockback - if bow_stack then - local enchantments = mcl_enchanting.get_enchantments(bow_stack) - if enchantments.power then - damage = damage + (enchantments.power + 1) / 4 - end - if enchantments.punch then - knockback = enchantments.punch * 3 - end - if enchantments.flame then - mcl_burning.set_on_fire(obj, math.huge) - end - end - obj:set_velocity({x=dir.x*power, y=dir.y*power, z=dir.z*power}) - obj:set_acceleration({x=0, y=-GRAVITY, z=0}) - obj:set_yaw(yaw-math.pi/2) - local le = obj:get_luaentity() - le._shooter = shooter - le._source_object = shooter - le._damage = damage - le._is_critical = is_critical - le._startpos = pos - le._knockback = knockback - le._collectable = collectable - minetest.sound_play("mcl_bows_bow_shoot", {pos=pos, max_hear_distance=16}, true) - if shooter and shooter:is_player() then - if obj:get_luaentity().player == "" then - obj:get_luaentity().player = shooter - end - obj:get_luaentity().node = shooter:get_inventory():get_stack("main", 1):get_name() - end - return obj -end - -local function get_arrow(player) - local inv = player:get_inventory() - local arrow_stack, arrow_stack_id - for i=1, inv:get_size("main") do - local it = inv:get_stack("main", i) - if not it:is_empty() and minetest.get_item_group(it:get_name(), "ammo_bow") ~= 0 then - arrow_stack = it - arrow_stack_id = i - break - end - end - return arrow_stack, arrow_stack_id -end - -local function player_shoot_arrow(itemstack, player, power, damage, is_critical) - local arrow_stack, arrow_stack_id = get_arrow(player) - local arrow_itemstring - local has_infinity_enchantment = mcl_enchanting.has_enchantment(player:get_wielded_item(), "infinity") - local infinity_used = false - - if minetest.is_creative_enabled(player:get_player_name()) then - if arrow_stack then - arrow_itemstring = arrow_stack:get_name() - else - arrow_itemstring = "mcl_bows:arrow" - end - else - if not arrow_stack then - return false - end - arrow_itemstring = arrow_stack:get_name() - if has_infinity_enchantment and minetest.get_item_group(arrow_itemstring, "ammo_bow_regular") > 0 then - infinity_used = true - else - arrow_stack:take_item() - end - local inv = player:get_inventory() - inv:set_stack("main", arrow_stack_id, arrow_stack) - end - if not arrow_itemstring then - return false - end - local playerpos = player:get_pos() - local dir = player:get_look_dir() - local yaw = player:get_look_horizontal() - - mcl_bows.shoot_arrow(arrow_itemstring, {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, dir, yaw, player, power, damage, is_critical, player:get_wielded_item(), not infinity_used) - return true -end - --- Bow item, uncharged state -minetest.register_tool("mcl_bows:bow", { - description = S("Bow"), - _tt_help = S("Launches arrows"), - _doc_items_longdesc = S("Bows are ranged weapons to shoot arrows at your foes.").."\n".. -S("The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead."), - _doc_items_usagehelp = S("To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot."), - _doc_items_durability = BOW_DURABILITY, - inventory_image = "mcl_bows_bow.png", - wield_scale = mcl_vars.tool_wield_scale, - stack_max = 1, - range = 4, - -- Trick to disable digging as well - on_use = function() return end, - on_place = function(itemstack, player, pointed_thing) - if pointed_thing and pointed_thing.type == "node" then - -- Call on_rightclick if the pointed node defines it - local node = minetest.get_node(pointed_thing.under) - if player and not player:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, player, itemstack) or itemstack - end - end - end - - itemstack:get_meta():set_string("active", "true") - return itemstack - end, - on_secondary_use = function(itemstack) - itemstack:get_meta():set_string("active", "true") - return itemstack - end, - groups = {weapon=1,weapon_ranged=1,bow=1,enchantability=1}, - _mcl_uses = 385, -}) - --- Iterates through player inventory and resets all the bows in "charging" state back to their original stage -local function reset_bows(player) - local inv = player:get_inventory() - local list = inv:get_list("main") - for place, stack in pairs(list) do - if stack:get_name() == "mcl_bows:bow" or stack:get_name() == "mcl_bows:bow_enchanted" then - stack:get_meta():set_string("active", "") - elseif stack:get_name()=="mcl_bows:bow_0" or stack:get_name()=="mcl_bows:bow_1" or stack:get_name()=="mcl_bows:bow_2" then - stack:set_name("mcl_bows:bow") - stack:get_meta():set_string("active", "") - list[place] = stack - elseif stack:get_name()=="mcl_bows:bow_0_enchanted" or stack:get_name()=="mcl_bows:bow_1_enchanted" or stack:get_name()=="mcl_bows:bow_2_enchanted" then - stack:set_name("mcl_bows:bow_enchanted") - stack:get_meta():set_string("active", "") - list[place] = stack - end - end - inv:set_list("main", list) -end - --- Resets the bow charging state and player speed. To be used when the player is no longer charging the bow -local function reset_bow_state(player, also_reset_bows) - bow_load[player:get_player_name()] = nil - bow_index[player:get_player_name()] = nil - if minetest.get_modpath("playerphysics") then - playerphysics.remove_physics_factor(player, "speed", "mcl_bows:use_bow") - end - if also_reset_bows then - reset_bows(player) - end -end - --- Bow in charging state -for level=0, 2 do - minetest.register_tool("mcl_bows:bow_"..level, { - description = S("Bow"), - _doc_items_create_entry = false, - inventory_image = "mcl_bows_bow_"..level..".png", - wield_scale = mcl_vars.tool_wield_scale, - stack_max = 1, - range = 0, -- Pointing range to 0 to prevent punching with bow :D - groups = {not_in_creative_inventory=1, not_in_craft_guide=1, bow=1, enchantability=1}, - -- Trick to disable digging as well - on_use = function() return end, - on_drop = function(itemstack, dropper, pos) - reset_bow_state(dropper) - itemstack:get_meta():set_string("active", "") - if mcl_enchanting.is_enchanted(itemstack:get_name()) then - itemstack:set_name("mcl_bows:bow_enchanted") - else - itemstack:set_name("mcl_bows:bow") - end - minetest.item_drop(itemstack, dropper, pos) - itemstack:take_item() - return itemstack - end, - -- Prevent accidental interaction with itemframes and other nodes - on_place = function(itemstack) - return itemstack - end, - _mcl_uses = 385, - }) -end - - -controls.register_on_release(function(player, key, time) - if key~="RMB" then return end - --local inv = minetest.get_inventory({type="player", name=player:get_player_name()}) - local wielditem = player:get_wielded_item() - if (wielditem:get_name()=="mcl_bows:bow_0" or wielditem:get_name()=="mcl_bows:bow_1" or wielditem:get_name()=="mcl_bows:bow_2" or - wielditem:get_name()=="mcl_bows:bow_0_enchanted" or wielditem:get_name()=="mcl_bows:bow_1_enchanted" or wielditem:get_name()=="mcl_bows:bow_2_enchanted") then - - local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) - local speed, damage - local p_load = bow_load[player:get_player_name()] - local charge - -- Type sanity check - if type(p_load) == "number" then - charge = minetest.get_us_time() - p_load - else - -- In case something goes wrong ... - -- Just assume minimum charge. - charge = 0 - minetest.log("warning", "[mcl_bows] Player "..player:get_player_name().." fires arrow with non-numeric bow_load!") - end - charge = math.max(math.min(charge, BOW_CHARGE_TIME_FULL), 0) - - local charge_ratio = charge / BOW_CHARGE_TIME_FULL - charge_ratio = math.max(math.min(charge_ratio, 1), 0) - - -- Calculate damage and speed - -- Fully charged - local is_critical = false - if charge >= BOW_CHARGE_TIME_FULL then - speed = BOW_MAX_SPEED - local r = math.random(1,5) - if r == 1 then - -- 20% chance for critical hit - damage = 10 - is_critical = true - else - damage = 9 - end - -- Partially charged - else - -- Linear speed and damage increase - speed = math.max(4, BOW_MAX_SPEED * charge_ratio) - damage = math.max(1, math.floor(9 * charge_ratio)) - end - - local has_shot = player_shoot_arrow(wielditem, player, speed, damage, is_critical) - - if enchanted then - wielditem:set_name("mcl_bows:bow_enchanted") - else - wielditem:set_name("mcl_bows:bow") - end - - if has_shot and not minetest.is_creative_enabled(player:get_player_name()) then - local durability = BOW_DURABILITY - local unbreaking = mcl_enchanting.get_enchantment(wielditem, "unbreaking") - if unbreaking > 0 then - durability = durability * (unbreaking + 1) - end - wielditem:add_wear(65535/durability) - end - player:set_wielded_item(wielditem) - reset_bow_state(player, true) - end -end) - -controls.register_on_hold(function(player, key, time) - local name = player:get_player_name() - local creative = minetest.is_creative_enabled(name) - if key ~= "RMB" or not (creative or get_arrow(player)) then - return - end - --local inv = minetest.get_inventory({type="player", name=name}) - local wielditem = player:get_wielded_item() - if bow_load[name] == nil and (wielditem:get_name()=="mcl_bows:bow" or wielditem:get_name()=="mcl_bows:bow_enchanted") and wielditem:get_meta():get("active") and (creative or get_arrow(player)) then - local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) - if enchanted then - wielditem:set_name("mcl_bows:bow_0_enchanted") - else - wielditem:set_name("mcl_bows:bow_0") - end - player:set_wielded_item(wielditem) - if minetest.get_modpath("playerphysics") then - -- Slow player down when using bow - playerphysics.add_physics_factor(player, "speed", "mcl_bows:use_bow", PLAYER_USE_BOW_SPEED) - end - bow_load[name] = minetest.get_us_time() - bow_index[name] = player:get_wield_index() - else - if player:get_wield_index() == bow_index[name] then - if type(bow_load[name]) == "number" then - if wielditem:get_name() == "mcl_bows:bow_0" and minetest.get_us_time() - bow_load[name] >= BOW_CHARGE_TIME_HALF then - wielditem:set_name("mcl_bows:bow_1") - elseif wielditem:get_name() == "mcl_bows:bow_0_enchanted" and minetest.get_us_time() - bow_load[name] >= BOW_CHARGE_TIME_HALF then - wielditem:set_name("mcl_bows:bow_1_enchanted") - elseif wielditem:get_name() == "mcl_bows:bow_1" and minetest.get_us_time() - bow_load[name] >= BOW_CHARGE_TIME_FULL then - wielditem:set_name("mcl_bows:bow_2") - elseif wielditem:get_name() == "mcl_bows:bow_1_enchanted" and minetest.get_us_time() - bow_load[name] >= BOW_CHARGE_TIME_FULL then - wielditem:set_name("mcl_bows:bow_2_enchanted") - end - else - if wielditem:get_name() == "mcl_bows:bow_0" or wielditem:get_name() == "mcl_bows:bow_1" or wielditem:get_name() == "mcl_bows:bow_2" then - wielditem:set_name("mcl_bows:bow") - elseif wielditem:get_name() == "mcl_bows:bow_0_enchanted" or wielditem:get_name() == "mcl_bows:bow_1_enchanted" or wielditem:get_name() == "mcl_bows:bow_2_enchanted" then - wielditem:set_name("mcl_bows:bow_enchanted") - end - end - player:set_wielded_item(wielditem) - else - reset_bow_state(player, true) - end - end -end) - -minetest.register_globalstep(function(dtime) - for _, player in pairs(minetest.get_connected_players()) do - local name = player:get_player_name() - local wielditem = player:get_wielded_item() - local wieldindex = player:get_wield_index() - --local controls = player:get_player_control() - if type(bow_load[name]) == "number" and ((wielditem:get_name()~="mcl_bows:bow_0" and wielditem:get_name()~="mcl_bows:bow_1" and wielditem:get_name()~="mcl_bows:bow_2" and wielditem:get_name()~="mcl_bows:bow_0_enchanted" and wielditem:get_name()~="mcl_bows:bow_1_enchanted" and wielditem:get_name()~="mcl_bows:bow_2_enchanted") or wieldindex ~= bow_index[name]) then - reset_bow_state(player, true) - end - end -end) - -minetest.register_on_joinplayer(function(player) - reset_bows(player) -end) - -minetest.register_on_leaveplayer(function(player) - reset_bow_state(player, true) -end) - -if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then - minetest.register_craft({ - output = "mcl_bows:bow", - recipe = { - {"", "mcl_core:stick", "mcl_mobitems:string"}, - {"mcl_core:stick", "", "mcl_mobitems:string"}, - {"", "mcl_core:stick", "mcl_mobitems:string"}, - } - }) - minetest.register_craft({ - output = "mcl_bows:bow", - recipe = { - {"mcl_mobitems:string", "mcl_core:stick", ""}, - {"mcl_mobitems:string", "", "mcl_core:stick"}, - {"mcl_mobitems:string", "mcl_core:stick", ""}, - } - }) -end - -minetest.register_craft({ - type = "fuel", - recipe = "group:bow", - burntime = 15, -}) - --- Add entry aliases for the Help -if minetest.get_modpath("doc") then - doc.add_entry_alias("tools", "mcl_bows:bow", "tools", "mcl_bows:bow_0") - doc.add_entry_alias("tools", "mcl_bows:bow", "tools", "mcl_bows:bow_1") - doc.add_entry_alias("tools", "mcl_bows:bow", "tools", "mcl_bows:bow_2") -end diff --git a/mods/ITEMS/mcl_bows/crossbow.lua b/mods/ITEMS/mcl_bows/crossbow.lua deleted file mode 100644 index b211f6b399..0000000000 --- a/mods/ITEMS/mcl_bows/crossbow.lua +++ /dev/null @@ -1,454 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -mcl_bows_s = {} - --- local arrows = { --- ["mcl_bows:arrow"] = "mcl_bows:arrow_entity", --- } - -local GRAVITY = 9.81 -local BOW_DURABILITY = 385 - --- Charging time in microseconds -local _BOW_CHARGE_TIME_HALF = 350000 -- bow level 1 -local _BOW_CHARGE_TIME_FULL = 900000 -- bow level 2 (full charge) - -local BOW_CHARGE_TIME_HALF = 350000 -- bow level 1 -local BOW_CHARGE_TIME_FULL = 900000 -- bow level 2 (full charge) - --- Factor to multiply with player speed while player uses bow --- This emulates the sneak speed. -local PLAYER_USE_CROSSBOW_SPEED = tonumber(minetest.settings:get("movement_speed_crouch")) / tonumber(minetest.settings:get("movement_speed_walk")) - --- TODO: Use Minecraft speed (ca. 53 m/s) --- Currently nerfed because at full speed the arrow would easily get out of the range of the loaded map. -local BOW_MAX_SPEED = 68 - -local function play_load_sound(id, pos) - minetest.sound_play("mcl_bows_crossbow_drawback_"..id, {pos=pos, max_hear_distance=12}, true) -end - ---[[ Store the charging state of each player. -keys: player name -value: -nil = not charging or player not existing -number: currently charging, the number is the time from minetest.get_us_time - in which the charging has started -]] -local bow_load = {} - --- Another player table, this one stores the wield index of the bow being charged -local bow_index = {} - -function mcl_bows_s.shoot_arrow_crossbow(arrow_item, pos, dir, yaw, shooter, power, damage, is_critical, crossbow_stack, collectable) - local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, arrow_item.."_entity") - if power == nil then - power = BOW_MAX_SPEED --19 - end - if damage == nil then - damage = 3 - end - local knockback - if crossbow_stack then - local enchantments = mcl_enchanting.get_enchantments(crossbow_stack) - if enchantments.piercing then - obj:get_luaentity()._piercing = 1 * enchantments.piercing - else - obj:get_luaentity()._piercing = 0 - end - end - obj:set_velocity({x=dir.x*power, y=dir.y*power, z=dir.z*power}) - obj:set_acceleration({x=0, y=-GRAVITY, z=0}) - obj:set_yaw(yaw-math.pi/2) - local le = obj:get_luaentity() - le._shooter = shooter - le._source_object = shooter - le._damage = damage - le._is_critical = is_critical - le._startpos = pos - le._knockback = knockback - le._collectable = collectable - minetest.sound_play("mcl_bows_crossbow_shoot", {pos=pos, max_hear_distance=16}, true) - if shooter and shooter:is_player() then - if obj:get_luaentity().player == "" then - obj:get_luaentity().player = shooter - end - obj:get_luaentity().node = shooter:get_inventory():get_stack("main", 1):get_name() - end - return obj -end - -local function get_arrow(player) - local inv = player:get_inventory() - local arrow_stack, arrow_stack_id - for i=1, inv:get_size("main") do - local it = inv:get_stack("main", i) - if not it:is_empty() and minetest.get_item_group(it:get_name(), "ammo_crossbow") ~= 0 then - arrow_stack = it - arrow_stack_id = i - break - end - end - return arrow_stack, arrow_stack_id -end - -local function player_shoot_arrow(wielditem, player, power, damage, is_critical) - local has_multishot_enchantment = mcl_enchanting.has_enchantment(player:get_wielded_item(), "multishot") - local arrow_itemstring = wielditem:get_meta():get("arrow") - - if not arrow_itemstring then - return false - end - - local playerpos = player:get_pos() - local dir = player:get_look_dir() - local yaw = player:get_look_horizontal() - - if has_multishot_enchantment then - mcl_bows_s.shoot_arrow_crossbow(arrow_itemstring, {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, {x=dir.x, y=dir.y, z=dir.z + .2}, yaw, player, power, damage, is_critical, player:get_wielded_item(), false) - mcl_bows_s.shoot_arrow_crossbow(arrow_itemstring, {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, {x=dir.x, y=dir.y, z=dir.z - .2}, yaw, player, power, damage, is_critical, player:get_wielded_item(), false) - mcl_bows_s.shoot_arrow_crossbow(arrow_itemstring, {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, dir, yaw, player, power, damage, is_critical, player:get_wielded_item(), true) - else - mcl_bows_s.shoot_arrow_crossbow(arrow_itemstring, {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, dir, yaw, player, power, damage, is_critical, player:get_wielded_item(), true) - end - return true -end - --- Bow item, uncharged state -minetest.register_tool("mcl_bows:crossbow", { - description = S("Crossbow"), - _tt_help = S("Launches arrows"), - _doc_items_longdesc = S("Bows are ranged weapons to shoot arrows at your foes.").."\n".. -S("The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead."), - _doc_items_usagehelp = S("To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot."), - _doc_items_durability = BOW_DURABILITY, - inventory_image = "mcl_bows_crossbow.png", - wield_scale = mcl_vars.tool_wield_scale, - stack_max = 1, - range = 4, - -- Trick to disable digging as well - on_use = function() return end, - on_place = function(itemstack, player, pointed_thing) - if pointed_thing and pointed_thing.type == "node" then - -- Call on_rightclick if the pointed node defines it - local node = minetest.get_node(pointed_thing.under) - if player and not player:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, player, itemstack) or itemstack - end - end - end - - itemstack:get_meta():set_string("active", "true") - return itemstack - end, - on_secondary_use = function(itemstack) - itemstack:get_meta():set_string("active", "true") - return itemstack - end, - groups = {weapon=1,weapon_ranged=1,crossbow=1,enchantability=1}, - _mcl_uses = 326, -}) - -minetest.register_tool("mcl_bows:crossbow_loaded", { - description = S("Corssbow"), - _tt_help = S("Launches arrows"), - _doc_items_longdesc = S("Corssbow are ranged weapons to shoot arrows at your foes.").."\n".. -S("The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead."), - _doc_items_usagehelp = S("To use the corssbow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to load an arrow into the chamber, then to shoot press left mouse."), - _doc_items_durability = BOW_DURABILITY, - inventory_image = "mcl_bows_crossbow_3.png", - wield_scale = mcl_vars.tool_wield_scale, - stack_max = 1, - range = 4, - -- Trick to disable digging as well - on_use = function() return end, - on_place = function(itemstack, player, pointed_thing) - if pointed_thing and pointed_thing.type == "node" then - -- Call on_rightclick if the pointed node defines it - local node = minetest.get_node(pointed_thing.under) - if player and not player:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, player, itemstack) or itemstack - end - end - end - - itemstack:get_meta():set_string("active", "true") - return itemstack - end, - on_secondary_use = function(itemstack) - itemstack:get_meta():set_string("active", "true") - return itemstack - end, - groups = {weapon=1,weapon_ranged=1,crossbow=1,enchantability=1}, - _mcl_uses = 326, -}) - --- Iterates through player inventory and resets all the bows in "charging" state back to their original stage -local function reset_bows(player) - local inv = player:get_inventory() - local list = inv:get_list("main") - for place, stack in pairs(list) do - if stack:get_name() == "mcl_bows:crossbow" or stack:get_name() == "mcl_bows:crossbow_enchanted" then - stack:get_meta():set_string("active", "") - elseif stack:get_name()=="mcl_bows:crossbow_0" or stack:get_name()=="mcl_bows:crossbow_1" or stack:get_name()=="mcl_bows:crossbow_2" then - stack:set_name("mcl_bows:crossbow") - stack:get_meta():set_string("active", "") - list[place] = stack - elseif stack:get_name()=="mcl_bows:crossbow_0_enchanted" or stack:get_name()=="mcl_bows:crossbow_1_enchanted" or stack:get_name()=="mcl_bows:crossbow_2_enchanted" then - stack:set_name("mcl_bows:crossbow_enchanted") - stack:get_meta():set_string("active", "") - list[place] = stack - end - end - inv:set_list("main", list) -end - --- Resets the bow charging state and player speed. To be used when the player is no longer charging the bow -local function reset_bow_state(player, also_reset_bows) - bow_load[player:get_player_name()] = nil - bow_index[player:get_player_name()] = nil - if minetest.get_modpath("playerphysics") then - playerphysics.remove_physics_factor(player, "speed", "mcl_bows:use_crossbow") - end - if also_reset_bows then - reset_bows(player) - end -end - --- Bow in charging state -for level=0, 2 do - minetest.register_tool("mcl_bows:crossbow_"..level, { - description = S("Crossbow"), - _doc_items_create_entry = false, - inventory_image = "mcl_bows_crossbow_"..level..".png", - wield_scale = mcl_vars.tool_wield_scale, - stack_max = 1, - range = 0, -- Pointing range to 0 to prevent punching with bow :D - groups = {not_in_creative_inventory=1, not_in_craft_guide=1, bow=1, enchantability=1}, - -- Trick to disable digging as well - on_use = function() return end, - on_drop = function(itemstack, dropper, pos) - reset_bow_state(dropper) - itemstack:get_meta():set_string("active", "") - if mcl_enchanting.is_enchanted(itemstack:get_name()) then - itemstack:set_name("mcl_bows:crossbow_enchanted") - else - itemstack:set_name("mcl_bows:crossbow") - end - minetest.item_drop(itemstack, dropper, pos) - itemstack:take_item() - return itemstack - end, - -- Prevent accidental interaction with itemframes and other nodes - on_place = function(itemstack) - return itemstack - end, - _mcl_uses = 385, - }) -end - - -controls.register_on_release(function(player, key, time) - if key~="RMB" then return end - --local inv = minetest.get_inventory({type="player", name=player:get_player_name()}) - local wielditem = player:get_wielded_item() - if wielditem:get_name()=="mcl_bows:crossbow_2" and get_arrow(player) or wielditem:get_name()=="mcl_bows:crossbow_2" and minetest.is_creative_enabled(player:get_player_name()) or wielditem:get_name()=="mcl_bows:crossbow_2_enchanted" and get_arrow(player) or wielditem:get_name()=="mcl_bows:crossbow_2_enchanted" and minetest.is_creative_enabled(player:get_player_name()) then - local arrow_stack, arrow_stack_id = get_arrow(player) - local arrow_itemstring - - if minetest.is_creative_enabled(player:get_player_name()) then - if arrow_stack then - arrow_itemstring = arrow_stack:get_name() - else - arrow_itemstring = "mcl_bows:arrow" - end - else - arrow_itemstring = arrow_stack:get_name() - arrow_stack:take_item() - player:get_inventory():set_stack("main", arrow_stack_id, arrow_stack) - end - - wielditem:get_meta():set_string("arrow", arrow_itemstring) - - if wielditem:get_name()=="mcl_bows:crossbow_2" then - wielditem:set_name("mcl_bows:crossbow_loaded") - else - wielditem:set_name("mcl_bows:crossbow_loaded_enchanted") - end - player:set_wielded_item(wielditem) - minetest.sound_play("mcl_bows_crossbow_load", {pos=player:get_pos(), max_hear_distance=16}, true) - else - reset_bow_state(player, true) - end -end) - -controls.register_on_press(function(player, key, time) - if key~="LMB" then return end - local wielditem = player:get_wielded_item() - if wielditem:get_name()=="mcl_bows:crossbow_loaded" or wielditem:get_name()=="mcl_bows:crossbow_loaded_enchanted" then - local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) - local speed, damage - local p_load = bow_load[player:get_player_name()] - local charge - -- Type sanity check - if type(p_load) == "number" then - charge = minetest.get_us_time() - p_load - else - -- In case something goes wrong ... - -- Just assume minimum charge. - charge = 0 - minetest.log("warning", "[mcl_bows] Player "..player:get_player_name().." fires arrow with non-numeric bow_load!") - end - charge = math.max(math.min(charge, BOW_CHARGE_TIME_FULL), 0) - - local charge_ratio = charge / BOW_CHARGE_TIME_FULL - charge_ratio = math.max(math.min(charge_ratio, 1), 0) - - -- Calculate damage and speed - -- Fully charged - local is_critical = false - speed = BOW_MAX_SPEED - local r = math.random(1,5) - if r == 1 then - -- 20% chance for critical hit - damage = 10 - is_critical = true - else - damage = 9 - end - - local has_shot = player_shoot_arrow(wielditem, player, speed, damage, is_critical) - - if enchanted then - wielditem:set_name("mcl_bows:crossbow_enchanted") - else - wielditem:set_name("mcl_bows:crossbow") - end - - if has_shot and not minetest.is_creative_enabled(player:get_player_name()) then - local durability = BOW_DURABILITY - local unbreaking = mcl_enchanting.get_enchantment(wielditem, "unbreaking") - local multishot = mcl_enchanting.get_enchantment(wielditem, "multishot") - if unbreaking > 0 then - durability = durability * (unbreaking + 1) - end - if multishot then - durability = durability / 3 - end - wielditem:add_wear(65535/durability) - end - player:set_wielded_item(wielditem) - reset_bow_state(player, true) - end -end) - -controls.register_on_hold(function(player, key, time) - local name = player:get_player_name() - local creative = minetest.is_creative_enabled(name) - if key ~= "RMB" then - return - end - --local inv = minetest.get_inventory({type="player", name=name}) - local wielditem = player:get_wielded_item() - local enchantments = mcl_enchanting.get_enchantments(wielditem) - if enchantments.quick_charge then - BOW_CHARGE_TIME_HALF = _BOW_CHARGE_TIME_HALF - (enchantments.quick_charge * 0.13 * 1000000 * .5) - BOW_CHARGE_TIME_FULL = _BOW_CHARGE_TIME_FULL - (enchantments.quick_charge * 0.13 * 1000000) - else - BOW_CHARGE_TIME_HALF = _BOW_CHARGE_TIME_HALF - BOW_CHARGE_TIME_FULL = _BOW_CHARGE_TIME_FULL - end - - if bow_load[name] == nil and (wielditem:get_name()=="mcl_bows:crossbow" or wielditem:get_name()=="mcl_bows:crossbow_enchanted") and wielditem:get_meta():get("active") and (creative or get_arrow(player)) then - local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) - if enchanted then - wielditem:set_name("mcl_bows:crossbow_0_enchanted") - play_load_sound(0, player:get_pos()) - else - wielditem:set_name("mcl_bows:crossbow_0") - play_load_sound(0, player:get_pos()) - end - player:set_wielded_item(wielditem) - if minetest.get_modpath("playerphysics") then - -- Slow player down when using bow - playerphysics.add_physics_factor(player, "speed", "mcl_bows:use_crossbow", PLAYER_USE_CROSSBOW_SPEED) - end - bow_load[name] = minetest.get_us_time() - bow_index[name] = player:get_wield_index() - else - if player:get_wield_index() == bow_index[name] then - if type(bow_load[name]) == "number" then - if wielditem:get_name() == "mcl_bows:crossbow_0" and minetest.get_us_time() - bow_load[name] >= BOW_CHARGE_TIME_HALF then - wielditem:set_name("mcl_bows:crossbow_1") - play_load_sound(1, player:get_pos()) - elseif wielditem:get_name() == "mcl_bows:crossbow_0_enchanted" and minetest.get_us_time() - bow_load[name] >= BOW_CHARGE_TIME_HALF then - wielditem:set_name("mcl_bows:crossbow_1_enchanted") - play_load_sound(1, player:get_pos()) - elseif wielditem:get_name() == "mcl_bows:crossbow_1" and minetest.get_us_time() - bow_load[name] >= BOW_CHARGE_TIME_FULL then - wielditem:set_name("mcl_bows:crossbow_2") - play_load_sound(2, player:get_pos()) - elseif wielditem:get_name() == "mcl_bows:crossbow_1_enchanted" and minetest.get_us_time() - bow_load[name] >= BOW_CHARGE_TIME_FULL then - wielditem:set_name("mcl_bows:crossbow_2_enchanted") - play_load_sound(2, player:get_pos()) - end - else - if wielditem:get_name() == "mcl_bows:crossbow_0" or wielditem:get_name() == "mcl_bows:crossbow_1" or wielditem:get_name() == "mcl_bows:crossbow_2" then - wielditem:set_name("mcl_bows:crossbow") - play_load_sound(1, player:get_pos()) - elseif wielditem:get_name() == "mcl_bows:crossbow_0_enchanted" or wielditem:get_name() == "mcl_bows:crossbow_1_enchanted" or wielditem:get_name() == "mcl_bows:crossbow_2_enchanted" then - wielditem:set_name("mcl_bows:crossbow_enchanted") - play_load_sound(1, player:get_pos()) - end - end - player:set_wielded_item(wielditem) - else - reset_bow_state(player, true) - end - end -end) - -minetest.register_globalstep(function(dtime) - for _, player in pairs(minetest.get_connected_players()) do - local name = player:get_player_name() - local wielditem = player:get_wielded_item() - local wieldindex = player:get_wield_index() - --local controls = player:get_player_control() - if type(bow_load[name]) == "number" and ((wielditem:get_name()~="mcl_bows:crossbow_0" and wielditem:get_name()~="mcl_bows:crossbow_1" and wielditem:get_name()~="mcl_bows:crossbow_2" and wielditem:get_name()~="mcl_bows:crossbow_0_enchanted" and wielditem:get_name()~="mcl_bows:crossbow_1_enchanted" and wielditem:get_name()~="mcl_bows:crossbow_2_enchanted") or wieldindex ~= bow_index[name]) then - reset_bow_state(player, true) - end - end -end) - -minetest.register_on_joinplayer(function(player) - reset_bows(player) -end) - -minetest.register_on_leaveplayer(function(player) - reset_bow_state(player, true) -end) - -if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then - minetest.register_craft({ - output = "mcl_bows:crossbow", - recipe = { - {"mcl_core:stick", "mcl_core:iron_ingot", "mcl_core:stick"}, - {"mcl_mobitems:string", "mcl_bows:arrow", "mcl_mobitems:string"}, - {"", "mcl_core:stick", ""}, - } - }) -end - -minetest.register_craft({ - type = "fuel", - recipe = "group:bow", - burntime = 15, -}) - --- Add entry aliases for the Help -if minetest.get_modpath("doc") then - doc.add_entry_alias("tools", "mcl_bows:crossbow", "tools", "mcl_bows:crossbow_0") - doc.add_entry_alias("tools", "mcl_bows:crossbow", "tools", "mcl_bows:crossbow_1") - doc.add_entry_alias("tools", "mcl_bows:crossbow", "tools", "mcl_bows:crossbow_2") -end diff --git a/mods/ITEMS/mcl_bows/init.lua b/mods/ITEMS/mcl_bows/init.lua deleted file mode 100644 index d5b06dac7c..0000000000 --- a/mods/ITEMS/mcl_bows/init.lua +++ /dev/null @@ -1,11 +0,0 @@ ---Bow -dofile(minetest.get_modpath("mcl_bows") .. "/arrow.lua") -dofile(minetest.get_modpath("mcl_bows") .. "/bow.lua") -dofile(minetest.get_modpath("mcl_bows") .. "/rocket.lua") - ---Crossbow -dofile(minetest.get_modpath("mcl_bows") .. "/crossbow.lua") - ---Compatiblility with older MineClone worlds -minetest.register_alias("mcl_throwing:bow", "mcl_bows:bow") -minetest.register_alias("mcl_throwing:arrow", "mcl_bows:arrow") diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.de.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.de.tr deleted file mode 100644 index c3b4268100..0000000000 --- a/mods/ITEMS/mcl_bows/locale/mcl_bows.de.tr +++ /dev/null @@ -1,15 +0,0 @@ -# textdomain: mcl_bows -Arrow=Pfeil -Arrows are ammunition for bows and dispensers.=Pfeile sind Munition für Bögen und Werfer. -An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.=Ein Bogen von einem Pfeil richtet regulär 1-9 Schaden an. Mit voller Zugkraft gibt es eine 20%-ige Chance auf einen kritischen Treffer mit 10 Schaden. Ein Pfeil aus einem Werfer richtet immer 3 Schaden an. -Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.=Pfeile können in festen Blöcken stecken bleiben und wieder aufgesammelt werden. Sie können auf Holzknöpfe drücken. -To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.=Um Pfeile als Munition für dne Bogen zu benutzen, platzieren Sie sie einfach irgendwo im Inventar, sie werden automatisch benutzt. Um Pfeile als Munition für Werfer zu benutzen, platzieren Sie sie ins Inventar eines Werferr. Um einen steckengebliebenen Pfeil aufzusammeln, gehen Sie einfach zu ihm hin. -Bow=Bogen -Bows are ranged weapons to shoot arrows at your foes.=Bogen sind Fernwaffen, um Pfeile auf Ihre Feinde zu schießen. -The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.=Die Geschwindigkeit und der Schaden des Bogens erhöht sich, je länger sie den Bogen spannen. Der reguläre Schaden des Pfeiles ist zwischen 1 und 9. Ist der Bogen voll gespannt, gibt es eine 20%-ig Change für einen kritischen Treffer, der 10 Schaden anrichtet. -To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Um den Bogen zu benutzen, muss sich im Inventar mindestens ein Pfeil befinden (außer im Kreativmodus). Halten sie die rechte Maustaste gedrückt zum Spannen, lassen Sie sie los zum Schießen. -Bow=Bogen -Ammunition=Munition -Damage from bow: 1-10=Schaden vom Bogen: 1-10 -Damage from dispenser: 3=Schaden vom Werfer: 3 -Launches arrows=Verschießt Pfeile diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr deleted file mode 100644 index 539afdcf0d..0000000000 --- a/mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr +++ /dev/null @@ -1,11 +0,0 @@ -# textdomain: mcl_bows -Arrow=Flecha -Arrows are ammunition for bows and dispensers.=Las flechas son municiones para arcos y dispensadores. -An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.=Una flecha disparada desde un arco tiene un daño regular de 1-9. A plena carga, hay un 20% de posibilidades de que un golpe crítico inflija 10 daños en su lugar. Una flecha disparada desde un dispensador siempre causa 3 de daño. -Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.=Las flechas pueden atascarse en bloques sólidos y pueden recuperarse nuevamente. También son capaces de presionar botones de madera. -To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.=Para usar flechas como municiones para un arco, simplemente colóquelas en cualquier parte de su inventario, se usarán automáticamente. Para usar flechas como municiones para un dispensador, colóquelas en el inventario del dispensador. Para recuperar una flecha que se pega en un bloque, simplemente camine cerca de ella. -Bow=Arco -Bows are ranged weapons to shoot arrows at your foes.=Los arcos son armas a distancia para disparar flechas a tus enemigos. -The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.=La velocidad y el daño de la flecha aumentan cuanto más tiempo tenses. El daño regular de la flecha está entre 1 y 9. A plena carga, también hay un 20% de un golpe crítico, que en vez de eso causa 10 de daño. -To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Para usar el arco, primero debes de tener al menos una flecha en cualquier parte de su inventario (a menos que esté en modo creativo). Mantenga presionado el botón derecho del mouse para tensar, suelte para disparar. -Bow=Arco \ No newline at end of file diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr deleted file mode 100644 index 313081e48e..0000000000 --- a/mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr +++ /dev/null @@ -1,15 +0,0 @@ -# textdomain: mcl_bows -Arrow=Flèche -Arrows are ammunition for bows and dispensers.=Les flèches sont des munitions pour les arcs et les distributeurs. -An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.=Une flèche tirée d'un arc a des dégâts réguliers de 1 à 9. À pleine charge, il y a 20% de chances qu'un coup critique inflige 10 dégâts à la place. Une flèche tirée depuis un distributeur inflige toujours 3 dégâts. -Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.=Les flèches peuvent se coincer sur des blocs solides et peuvent être récupérées à nouveau. Ils sont également capables de pousser des boutons en bois. -To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.=Pour utiliser des flèches comme munitions pour un arc, il suffit de les placer n'importe où dans votre inventaire, elles seront utilisées automatiquement. Pour utiliser des flèches comme munitions pour un distributeur, placez-les dans l'inventaire du distributeur. Pour récupérer une flèche qui colle dans un bloc, il vous suffit de vous en approcher. -Bow=Arc -Bows are ranged weapons to shoot arrows at your foes.=Les arcs sont des armes à distance pour tirer des flèches sur vos ennemis. -The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.=La vitesse et les dégâts de la flèche augmentent plus vous chargez. Les dégâts réguliers de la flèche sont compris entre 1 et 9. À pleine charge, il y a également 20% d'un coup critique, infligeant 10 dégâts à la place. -To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Pour utiliser l'arc, vous devez d'abord avoir au moins une flèche n'importe où dans votre inventaire (sauf en mode créatif). Maintenez enfoncé le bouton droit de la souris pour charger, relâchez pour tirer. -Bow=Arc -Ammunition=Munition -Damage from bow: 1-10=Dégâts de l'arc: 1-10 -Damage from dispenser: 3=Dégâts du distributeur: 3 -Launches arrows=Lance des flèches diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.pl.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.pl.tr deleted file mode 100644 index a518ac0ea5..0000000000 --- a/mods/ITEMS/mcl_bows/locale/mcl_bows.pl.tr +++ /dev/null @@ -1,16 +0,0 @@ -# textdomain: mcl_bows -Arrow=Strzała -Arrows are ammunition for bows and dispensers.=Strzały są amunicją do łuku i dozowników. -An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.=Strzała wypuszczona z łuku ma typowe obrażania 1-9. Przy pełnym napięciu jest szansa 20% na trafienie krytyczne zadające 10 obrażeń. Strzała wystrzelona z dozownika zawsze zadaje 3 obrażenia. -Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.=Strzały zatrzymują się na stałych blokach i mogą być wówczas odzyskane. Są również w stanie klikać drewniane przyciski. -To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.=Aby użyć strzał jako amunicję do łuku umieść je gdziekolwiek w twoim ekwipunku, będą użyte automatyczne. Aby użyć strzał jako amunicję do dozownika umieść je w jego ekwipunku. Aby odzyskać strzałę wbitą w blok po prostu podejdź do niej. -Bow=Łuk -Bows are ranged weapons to shoot arrows at your foes.=Łuki to bronie dystansowe do strzelania strzałami w twoich przeciwników. -The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.=Szybkość i obrażenia strzały wzrastają im dłużej ją naciągasz. Zwykłe obrażenia strzały są pomiędzy 1 a 9. Przy pełnym napięciu jest szansa 20% na trafienie krytyczne zadające 10 obrażeń. -To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Aby użyć łuku musisz mieć przynajmniej jedną strzałę gdziekolwiek w twoim ekwipunku (chyba, że to tryb Kreatywny). Przytrzymaj prawy przycisk myszy aby napiąć łuk, puść by strzelić. -Bow=Łuk -Ammunition=Amunicja -Damage from bow: 1-10=Obrażenia z łuku 1-10 -Damage from dispenser: 3=Obrażenia z dozownika: 3 -Launches arrows=Strzela strzałami - diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.ru.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.ru.tr deleted file mode 100644 index 6a1b7ed31f..0000000000 --- a/mods/ITEMS/mcl_bows/locale/mcl_bows.ru.tr +++ /dev/null @@ -1,15 +0,0 @@ -# textdomain: mcl_bows -Arrow=Стрела -Arrows are ammunition for bows and dispensers.=Стрелы - это боеприпасы для луков и диспенсеров. -An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.=Стрела, выпущенная из лука, обычно наносит урон 1-9. При полном натяжении есть 20-процентный шанс критического удара с уроном 10. Стрела из диспенсера всегда наносит урон уровня 3. -Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.=Стрелы могут застревать в твёрдых блоках, их можно подбирать для повторного использования. Они также способны нажимать деревянные кнопки. -To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.=Чтобы использовать стрелы в качестве боеприпасов для лука, просто положите их в любую ячейку вашего инвентаря, и они будут использоваться автоматически. Чтобы использовать стрелы в качестве боеприпасов для диспенсера, поместите их в инвентарь диспенсера. Чтобы взять стрелу, застрявшую в блоке, просто пройдите рядом с ней. -Bow=Лук -Bows are ranged weapons to shoot arrows at your foes.=Лук - это оружие дальнего боя, чтобы стрелять стрелами по вашим врагам. -The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.=Скорость и урон стрелы увеличиваются, пока вы её натягиваете. Обычный урон стрелы находится между 1 и 9. При полном натяжении есть 20-процентный шанс критического удара с уроном 10. -To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Чтобы использовать лук, нужно иметь хотя бы одну стрелу в вашем инвентаре (за исключением творческого режима). Удерживайте правую клавишу мыши, чтобы натягивать тетиву, затем отпустите, чтобы выстрелить. -Bow=Лук -Ammunition=Боеприпасы -Damage from bow: 1-10=Урон от лука: 1-10 -Damage from dispenser: 3=Урон от диспенсера: 3 -Launches arrows=Пускает стрелы diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.zh_TW.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.zh_TW.tr deleted file mode 100644 index 6b59895d3e..0000000000 --- a/mods/ITEMS/mcl_bows/locale/mcl_bows.zh_TW.tr +++ /dev/null @@ -1,14 +0,0 @@ -# textdomain: mcl_bows -Arrow=箭 -Arrows are ammunition for bows and dispensers.=箭頭是弓箭和發射器的彈藥。 -An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.=從弓上射出的箭有1-9的常規傷害。在最大能量的情況下,有20%的機會暴擊,造成10的傷害。從發射器中發射的箭總是造成3點傷害。 -Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.=箭頭可能會卡在固體方塊上,可以再次取回。他們也能按下木質按鈕。 -To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.=要把箭作為弓的彈藥,只需把它們放在你物品欄的任何地方,它們就會被自動使用。要使用箭作為發射器的彈藥,把它們放在發射器的物品欄中。要取回插在方塊上的箭,只需走到它附近。 -Bow=弓 -Bows are ranged weapons to shoot arrows at your foes.=弓是遠程武器,可以向敵人發射箭頭。 -The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.=拉弓時間越長,箭的速度和傷害越大。箭的常規傷害在1到9之間。在拉滿弓的情況下,20%的機會暴擊,造成10的傷害。 -To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=要使用這把弓,你首先需要在你物品欄的任何地方至少有一支箭(除非在創造模式下)。按住鼠標右鍵充電,鬆開即可射擊。 -Ammunition=彈藥 -Damage from bow: 1-10=從弓發射時的傷害:1-10 -Damage from dispenser: 3=從發射器發射時的傷害:3 -Launches arrows=發射箭 diff --git a/mods/ITEMS/mcl_bows/locale/template.txt b/mods/ITEMS/mcl_bows/locale/template.txt deleted file mode 100644 index 228b617099..0000000000 --- a/mods/ITEMS/mcl_bows/locale/template.txt +++ /dev/null @@ -1,15 +0,0 @@ -# textdomain: mcl_bows -Arrow= -Arrows are ammunition for bows and dispensers.= -An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.= -Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.= -To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.= -Bow= -Bows are ranged weapons to shoot arrows at your foes.= -The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.= -To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.= -Bow= -Ammunition= -Damage from bow: 1-10= -Damage from dispenser: 3= -Launches arrows= diff --git a/mods/ITEMS/mcl_bows/mod.conf b/mods/ITEMS/mcl_bows/mod.conf deleted file mode 100644 index 7b174826a5..0000000000 --- a/mods/ITEMS/mcl_bows/mod.conf +++ /dev/null @@ -1,6 +0,0 @@ -name = mcl_bows -author = Arcelmi -description = This mod adds bows and arrows for MineClone 2. -depends = controls, mcl_particles, mcl_enchanting, mcl_init, mcl_util, mcl_shields -optional_depends = awards, mcl_achievements, mcl_core, mcl_mobitems, playerphysics, doc, doc_identifier, mesecons_button - diff --git a/mods/ITEMS/mcl_bows/models/mcl_bows_arrow.obj b/mods/ITEMS/mcl_bows/models/mcl_bows_arrow.obj deleted file mode 100644 index bee2c0f4bf..0000000000 --- a/mods/ITEMS/mcl_bows/models/mcl_bows_arrow.obj +++ /dev/null @@ -1,56 +0,0 @@ -# Blender v2.92.0 OBJ File: '' -# www.blender.org -mtllib mcl_bows_arrow.mtl -o Plane -v 3.782006 1.444249 -0.000500 -v 3.782006 -1.443249 -0.000500 -v -3.782006 -1.443249 -0.000500 -v -3.782006 1.444249 -0.000500 -v 3.331104 -1.100076 -1.064829 -v 3.331104 1.069925 -1.064830 -v 3.331104 1.069925 1.085017 -v 3.331104 -1.100076 1.085017 -v 3.782006 0.001000 -1.443750 -v -3.782006 0.001000 -1.443749 -v -3.782006 0.001000 1.443750 -v 3.782006 0.001000 1.443749 -v 3.782006 1.444249 0.000500 -v -3.782006 1.444249 0.000500 -v -3.782006 -1.443249 0.000500 -v 3.782006 -1.443249 0.000500 -v 3.782006 0.000000 -1.443750 -v 3.782006 -0.000000 1.443749 -v -3.782006 -0.000000 1.443750 -v -3.782006 0.000000 -1.443749 -vt -0.000893 0.835148 -vt -0.000893 1.008567 -vt 0.486244 1.008567 -vt 0.486244 0.835148 -vt 0.159016 0.682983 -vt 0.159016 0.849928 -vt -0.005031 0.849928 -vt -0.005031 0.682983 -vt -0.000893 0.835148 -vt 0.486244 0.835148 -vt 0.486244 1.008567 -vt -0.000893 1.008567 -vt -0.000893 0.835148 -vt 0.486244 0.835148 -vt 0.486244 1.008567 -vt -0.000893 1.008567 -vt -0.000893 0.835148 -vt -0.000893 1.008567 -vt 0.486244 1.008567 -vt 0.486244 0.835148 -vn 0.0000 0.0000 -1.0000 -vn 1.0000 0.0000 0.0000 -vn 0.0000 1.0000 0.0000 -vn 0.0000 -0.0000 1.0000 -vn -0.0000 -1.0000 -0.0000 -usemtl Material.002 -s 1 -f 1/1/1 2/2/1 3/3/1 4/4/1 -f 5/5/2 6/6/2 7/7/2 8/8/2 -f 9/9/3 10/10/3 11/11/3 12/12/3 -f 13/13/4 14/14/4 15/15/4 16/16/4 -f 17/17/5 18/18/5 19/19/5 20/20/5 diff --git a/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.b3d b/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.b3d deleted file mode 100644 index 0a34f1eaa6..0000000000 Binary files a/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.b3d and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.mtl b/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.mtl deleted file mode 100644 index f231bdf4c1..0000000000 --- a/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.mtl +++ /dev/null @@ -1,10 +0,0 @@ -# Blender MTL File: 'None' -# Material Count: 1 - -newmtl None -Ns 500 -Ka 0.8 0.8 0.8 -Kd 0.8 0.8 0.8 -Ks 0.8 0.8 0.8 -d 1 -illum 2 diff --git a/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.obj b/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.obj deleted file mode 100644 index e2bd11d347..0000000000 --- a/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.obj +++ /dev/null @@ -1,1016 +0,0 @@ -# Blender v3.0.0 Alpha OBJ File: '' -# www.blender.org -mtllib mcl_bows_rocket.mtl -o Plane -v -1.414214 -0.063116 0.000000 -v 0.000000 -0.063116 1.414214 -v -0.000000 -0.063116 -1.414214 -v 1.414214 -0.063116 -0.000000 -v -1.414214 -0.062205 0.000000 -v 0.000000 -0.062205 1.414214 -v -0.000000 -0.062205 -1.414214 -v 1.414214 -0.062205 -0.000000 -v -1.414214 -0.060838 0.000000 -v 0.000000 -0.060838 1.414214 -v -0.000000 -0.060838 -1.414214 -v 1.414214 -0.060838 -0.000000 -v -1.414214 -0.059926 0.000000 -v 0.000000 -0.059926 1.414214 -v -0.000000 -0.059926 -1.414214 -v 1.414214 -0.059926 -0.000000 -v -1.414214 -0.058559 0.000000 -v 0.000000 -0.058559 1.414214 -v -0.000000 -0.058559 -1.414214 -v 1.414214 -0.058559 -0.000000 -v -1.414214 -0.057648 0.000000 -v 0.000000 -0.057648 1.414214 -v -0.000000 -0.057648 -1.414214 -v 1.414214 -0.057648 -0.000000 -v -1.414214 -0.056281 0.000000 -v 0.000000 -0.056281 1.414214 -v -0.000000 -0.056281 -1.414214 -v 1.414214 -0.056281 -0.000000 -v -1.414214 -0.055369 0.000000 -v 0.000000 -0.055369 1.414214 -v -0.000000 -0.055369 -1.414214 -v 1.414214 -0.055369 -0.000000 -v -1.414214 -0.054002 0.000000 -v 0.000000 -0.054002 1.414214 -v -0.000000 -0.054002 -1.414214 -v 1.414214 -0.054002 -0.000000 -v -1.414214 -0.053091 0.000000 -v 0.000000 -0.053091 1.414214 -v -0.000000 -0.053091 -1.414214 -v 1.414214 -0.053091 -0.000000 -v -1.414214 -0.051723 0.000000 -v 0.000000 -0.051723 1.414214 -v -0.000000 -0.051723 -1.414214 -v 1.414214 -0.051723 -0.000000 -v -1.414214 -0.050812 0.000000 -v 0.000000 -0.050812 1.414214 -v -0.000000 -0.050812 -1.414214 -v 1.414214 -0.050812 -0.000000 -v -1.414214 -0.049445 0.000000 -v 0.000000 -0.049445 1.414214 -v -0.000000 -0.049445 -1.414214 -v 1.414214 -0.049445 -0.000000 -v -1.414214 -0.048533 0.000000 -v 0.000000 -0.048533 1.414214 -v -0.000000 -0.048533 -1.414214 -v 1.414214 -0.048533 -0.000000 -v -1.414214 -0.047166 0.000000 -v 0.000000 -0.047166 1.414214 -v -0.000000 -0.047166 -1.414214 -v 1.414214 -0.047166 -0.000000 -v -1.414214 -0.046255 0.000000 -v 0.000000 -0.046255 1.414214 -v -0.000000 -0.046255 -1.414214 -v 1.414214 -0.046255 -0.000000 -v -1.414214 -0.044888 0.000000 -v 0.000000 -0.044888 1.414214 -v -0.000000 -0.044888 -1.414214 -v 1.414214 -0.044888 -0.000000 -v -1.414214 -0.043976 0.000000 -v 0.000000 -0.043976 1.414214 -v -0.000000 -0.043976 -1.414214 -v 1.414214 -0.043976 -0.000000 -v -1.414214 -0.042609 0.000000 -v 0.000000 -0.042609 1.414214 -v -0.000000 -0.042609 -1.414214 -v 1.414214 -0.042609 -0.000000 -v -1.414214 -0.041698 0.000000 -v 0.000000 -0.041698 1.414214 -v -0.000000 -0.041698 -1.414214 -v 1.414214 -0.041698 -0.000000 -v -1.414214 -0.040331 0.000000 -v 0.000000 -0.040331 1.414214 -v -0.000000 -0.040331 -1.414214 -v 1.414214 -0.040331 -0.000000 -v -1.414214 -0.039419 0.000000 -v 0.000000 -0.039419 1.414214 -v -0.000000 -0.039419 -1.414214 -v 1.414214 -0.039419 -0.000000 -v -1.414214 -0.038052 0.000000 -v 0.000000 -0.038052 1.414214 -v -0.000000 -0.038052 -1.414214 -v 1.414214 -0.038052 -0.000000 -v -1.414214 -0.037141 0.000000 -v 0.000000 -0.037141 1.414214 -v -0.000000 -0.037141 -1.414214 -v 1.414214 -0.037141 -0.000000 -v -1.414214 -0.035773 0.000000 -v 0.000000 -0.035773 1.414214 -v -0.000000 -0.035773 -1.414214 -v 1.414214 -0.035773 -0.000000 -v -1.414214 -0.034862 0.000000 -v 0.000000 -0.034862 1.414214 -v -0.000000 -0.034862 -1.414214 -v 1.414214 -0.034862 -0.000000 -v -1.414214 -0.033495 0.000000 -v 0.000000 -0.033495 1.414214 -v -0.000000 -0.033495 -1.414214 -v 1.414214 -0.033495 -0.000000 -v -1.414214 -0.032583 0.000000 -v 0.000000 -0.032583 1.414214 -v -0.000000 -0.032583 -1.414214 -v 1.414214 -0.032583 -0.000000 -v -1.414214 -0.031216 0.000000 -v 0.000000 -0.031216 1.414214 -v -0.000000 -0.031216 -1.414214 -v 1.414214 -0.031216 -0.000000 -v -1.414214 -0.030305 0.000000 -v 0.000000 -0.030305 1.414214 -v -0.000000 -0.030305 -1.414214 -v 1.414214 -0.030305 -0.000000 -v -1.414214 -0.028938 0.000000 -v 0.000000 -0.028938 1.414214 -v -0.000000 -0.028938 -1.414214 -v 1.414214 -0.028938 -0.000000 -v -1.414214 -0.028026 0.000000 -v 0.000000 -0.028026 1.414214 -v -0.000000 -0.028026 -1.414214 -v 1.414214 -0.028026 -0.000000 -v -1.414214 -0.026659 0.000000 -v 0.000000 -0.026659 1.414214 -v -0.000000 -0.026659 -1.414214 -v 1.414214 -0.026659 -0.000000 -v -1.414214 -0.025748 0.000000 -v 0.000000 -0.025748 1.414214 -v -0.000000 -0.025748 -1.414214 -v 1.414214 -0.025748 -0.000000 -v -1.414214 -0.024381 0.000000 -v 0.000000 -0.024381 1.414214 -v -0.000000 -0.024381 -1.414214 -v 1.414214 -0.024381 -0.000000 -v -1.414214 -0.023469 0.000000 -v 0.000000 -0.023469 1.414214 -v -0.000000 -0.023469 -1.414214 -v 1.414214 -0.023469 -0.000000 -v -1.414214 -0.022102 0.000000 -v 0.000000 -0.022102 1.414214 -v -0.000000 -0.022102 -1.414214 -v 1.414214 -0.022102 -0.000000 -v -1.414214 -0.021191 0.000000 -v 0.000000 -0.021191 1.414214 -v -0.000000 -0.021191 -1.414214 -v 1.414214 -0.021191 -0.000000 -v -1.414214 -0.019824 0.000000 -v 0.000000 -0.019824 1.414214 -v -0.000000 -0.019824 -1.414214 -v 1.414214 -0.019824 -0.000000 -v -1.414214 -0.018912 0.000000 -v 0.000000 -0.018912 1.414214 -v -0.000000 -0.018912 -1.414214 -v 1.414214 -0.018912 -0.000000 -v -1.414214 -0.017545 0.000000 -v 0.000000 -0.017545 1.414214 -v -0.000000 -0.017545 -1.414214 -v 1.414214 -0.017545 -0.000000 -v -1.414214 -0.016634 0.000000 -v 0.000000 -0.016634 1.414214 -v -0.000000 -0.016634 -1.414214 -v 1.414214 -0.016634 -0.000000 -v -1.414214 -0.015266 0.000000 -v 0.000000 -0.015266 1.414214 -v -0.000000 -0.015266 -1.414214 -v 1.414214 -0.015266 -0.000000 -v -1.414214 -0.014355 0.000000 -v 0.000000 -0.014355 1.414214 -v -0.000000 -0.014355 -1.414214 -v 1.414214 -0.014355 -0.000000 -v -1.414214 -0.012988 0.000000 -v 0.000000 -0.012988 1.414214 -v -0.000000 -0.012988 -1.414214 -v 1.414214 -0.012988 -0.000000 -v -1.414214 -0.012076 0.000000 -v 0.000000 -0.012076 1.414214 -v -0.000000 -0.012076 -1.414214 -v 1.414214 -0.012076 -0.000000 -v -1.414214 -0.010709 0.000000 -v 0.000000 -0.010709 1.414214 -v -0.000000 -0.010709 -1.414214 -v 1.414214 -0.010709 -0.000000 -v -1.414214 -0.009798 0.000000 -v 0.000000 -0.009798 1.414214 -v -0.000000 -0.009798 -1.414214 -v 1.414214 -0.009798 -0.000000 -v -1.414214 -0.008431 0.000000 -v 0.000000 -0.008431 1.414214 -v -0.000000 -0.008431 -1.414214 -v 1.414214 -0.008431 -0.000000 -v -1.414214 -0.007519 0.000000 -v 0.000000 -0.007519 1.414214 -v -0.000000 -0.007519 -1.414214 -v 1.414214 -0.007519 -0.000000 -v -1.414214 -0.006152 0.000000 -v 0.000000 -0.006152 1.414214 -v -0.000000 -0.006152 -1.414214 -v 1.414214 -0.006152 -0.000000 -v -1.414214 -0.005241 0.000000 -v 0.000000 -0.005241 1.414214 -v -0.000000 -0.005241 -1.414214 -v 1.414214 -0.005241 -0.000000 -v -1.414214 -0.003874 0.000000 -v 0.000000 -0.003874 1.414214 -v -0.000000 -0.003874 -1.414214 -v 1.414214 -0.003874 -0.000000 -v -1.414214 -0.002962 0.000000 -v 0.000000 -0.002962 1.414214 -v -0.000000 -0.002962 -1.414214 -v 1.414214 -0.002962 -0.000000 -v -1.414214 -0.001595 0.000000 -v 0.000000 -0.001595 1.414214 -v -0.000000 -0.001595 -1.414214 -v 1.414214 -0.001595 -0.000000 -v -1.414214 -0.000684 0.000000 -v 0.000000 -0.000684 1.414214 -v -0.000000 -0.000684 -1.414214 -v 1.414214 -0.000684 -0.000000 -v -1.414214 0.000684 0.000000 -v 0.000000 0.000684 1.414214 -v -0.000000 0.000684 -1.414214 -v 1.414214 0.000684 -0.000000 -v -1.414214 0.001595 0.000000 -v 0.000000 0.001595 1.414214 -v -0.000000 0.001595 -1.414214 -v 1.414214 0.001595 -0.000000 -v -1.414214 0.002962 0.000000 -v 0.000000 0.002962 1.414214 -v -0.000000 0.002962 -1.414214 -v 1.414214 0.002962 -0.000000 -v -1.414214 0.003874 0.000000 -v 0.000000 0.003874 1.414214 -v -0.000000 0.003874 -1.414214 -v 1.414214 0.003874 -0.000000 -v -1.414214 0.005241 0.000000 -v 0.000000 0.005241 1.414214 -v -0.000000 0.005241 -1.414214 -v 1.414214 0.005241 -0.000000 -v -1.414214 0.006152 0.000000 -v 0.000000 0.006152 1.414214 -v -0.000000 0.006152 -1.414214 -v 1.414214 0.006152 -0.000000 -v -1.414214 0.007519 0.000000 -v 0.000000 0.007519 1.414214 -v -0.000000 0.007519 -1.414214 -v 1.414214 0.007519 -0.000000 -v -1.414214 0.008431 0.000000 -v 0.000000 0.008431 1.414214 -v -0.000000 0.008431 -1.414214 -v 1.414214 0.008431 -0.000000 -v -1.414214 0.009798 0.000000 -v 0.000000 0.009798 1.414214 -v -0.000000 0.009798 -1.414214 -v 1.414214 0.009798 -0.000000 -v -1.414214 0.010709 0.000000 -v 0.000000 0.010709 1.414214 -v -0.000000 0.010709 -1.414214 -v 1.414214 0.010709 -0.000000 -v -1.414214 0.012076 0.000000 -v 0.000000 0.012076 1.414214 -v -0.000000 0.012076 -1.414214 -v 1.414214 0.012076 -0.000000 -v -1.414214 0.012988 0.000000 -v 0.000000 0.012988 1.414214 -v -0.000000 0.012988 -1.414214 -v 1.414214 0.012988 -0.000000 -v -1.414214 0.014355 0.000000 -v 0.000000 0.014355 1.414214 -v -0.000000 0.014355 -1.414214 -v 1.414214 0.014355 -0.000000 -v -1.414214 0.015266 0.000000 -v 0.000000 0.015266 1.414214 -v -0.000000 0.015266 -1.414214 -v 1.414214 0.015266 -0.000000 -v -1.414214 0.016634 0.000000 -v 0.000000 0.016634 1.414214 -v -0.000000 0.016634 -1.414214 -v 1.414214 0.016634 -0.000000 -v -1.414214 0.017545 0.000000 -v 0.000000 0.017545 1.414214 -v -0.000000 0.017545 -1.414214 -v 1.414214 0.017545 -0.000000 -v -1.414214 0.018912 0.000000 -v 0.000000 0.018912 1.414214 -v -0.000000 0.018912 -1.414214 -v 1.414214 0.018912 -0.000000 -v -1.414214 0.019824 0.000000 -v 0.000000 0.019824 1.414214 -v -0.000000 0.019824 -1.414214 -v 1.414214 0.019824 -0.000000 -v -1.414214 0.021191 0.000000 -v 0.000000 0.021191 1.414214 -v -0.000000 0.021191 -1.414214 -v 1.414214 0.021191 -0.000000 -v -1.414214 0.022102 0.000000 -v 0.000000 0.022102 1.414214 -v -0.000000 0.022102 -1.414214 -v 1.414214 0.022102 -0.000000 -v -1.414214 0.023469 0.000000 -v 0.000000 0.023469 1.414214 -v -0.000000 0.023469 -1.414214 -v 1.414214 0.023469 -0.000000 -v -1.414214 0.024381 0.000000 -v 0.000000 0.024381 1.414214 -v -0.000000 0.024381 -1.414214 -v 1.414214 0.024381 -0.000000 -v -1.414214 0.025748 0.000000 -v 0.000000 0.025748 1.414214 -v -0.000000 0.025748 -1.414214 -v 1.414214 0.025748 -0.000000 -v -1.414214 0.026659 0.000000 -v 0.000000 0.026659 1.414214 -v -0.000000 0.026659 -1.414214 -v 1.414214 0.026659 -0.000000 -v -1.414214 0.028026 0.000000 -v 0.000000 0.028026 1.414214 -v -0.000000 0.028026 -1.414214 -v 1.414214 0.028026 -0.000000 -v -1.414214 0.028938 0.000000 -v 0.000000 0.028938 1.414214 -v -0.000000 0.028938 -1.414214 -v 1.414214 0.028938 -0.000000 -v -1.414214 0.030305 0.000000 -v 0.000000 0.030305 1.414214 -v -0.000000 0.030305 -1.414214 -v 1.414214 0.030305 -0.000000 -v -1.414214 0.031216 0.000000 -v 0.000000 0.031216 1.414214 -v -0.000000 0.031216 -1.414214 -v 1.414214 0.031216 -0.000000 -v -1.414214 0.032584 0.000000 -v 0.000000 0.032584 1.414214 -v -0.000000 0.032584 -1.414214 -v 1.414214 0.032584 -0.000000 -v -1.414214 0.033495 0.000000 -v 0.000000 0.033495 1.414214 -v -0.000000 0.033495 -1.414214 -v 1.414214 0.033495 -0.000000 -v -1.414214 0.034862 0.000000 -v 0.000000 0.034862 1.414214 -v -0.000000 0.034862 -1.414214 -v 1.414214 0.034862 -0.000000 -v -1.414214 0.035774 0.000000 -v 0.000000 0.035774 1.414214 -v -0.000000 0.035774 -1.414214 -v 1.414214 0.035774 -0.000000 -v -1.414214 0.037141 0.000000 -v 0.000000 0.037141 1.414214 -v -0.000000 0.037141 -1.414214 -v 1.414214 0.037141 -0.000000 -v -1.414214 0.038052 0.000000 -v 0.000000 0.038052 1.414214 -v -0.000000 0.038052 -1.414214 -v 1.414214 0.038052 -0.000000 -v -1.414214 0.039419 0.000000 -v 0.000000 0.039419 1.414214 -v -0.000000 0.039419 -1.414214 -v 1.414214 0.039419 -0.000000 -v -1.414214 0.040331 0.000000 -v 0.000000 0.040331 1.414214 -v -0.000000 0.040331 -1.414214 -v 1.414214 0.040331 -0.000000 -v -1.414214 0.041698 0.000000 -v 0.000000 0.041698 1.414214 -v -0.000000 0.041698 -1.414214 -v 1.414214 0.041698 -0.000000 -v -1.414214 0.042609 0.000000 -v 0.000000 0.042609 1.414214 -v -0.000000 0.042609 -1.414214 -v 1.414214 0.042609 -0.000000 -v -1.414214 0.043976 0.000000 -v 0.000000 0.043976 1.414214 -v -0.000000 0.043976 -1.414214 -v 1.414214 0.043976 -0.000000 -v -1.414214 0.044888 0.000000 -v 0.000000 0.044888 1.414214 -v -0.000000 0.044888 -1.414214 -v 1.414214 0.044888 -0.000000 -v -1.414214 0.046255 0.000000 -v 0.000000 0.046255 1.414214 -v -0.000000 0.046255 -1.414214 -v 1.414214 0.046255 -0.000000 -v -1.414214 0.047166 0.000000 -v 0.000000 0.047166 1.414214 -v -0.000000 0.047166 -1.414214 -v 1.414214 0.047166 -0.000000 -v -1.414214 0.048533 0.000000 -v 0.000000 0.048533 1.414214 -v -0.000000 0.048533 -1.414214 -v 1.414214 0.048533 -0.000000 -v -1.414214 0.049445 0.000000 -v 0.000000 0.049445 1.414214 -v -0.000000 0.049445 -1.414214 -v 1.414214 0.049445 -0.000000 -v -1.414214 0.050812 0.000000 -v 0.000000 0.050812 1.414214 -v -0.000000 0.050812 -1.414214 -v 1.414214 0.050812 -0.000000 -v -1.414214 0.051723 0.000000 -v 0.000000 0.051723 1.414214 -v -0.000000 0.051723 -1.414214 -v 1.414214 0.051723 -0.000000 -v -1.414214 0.053091 0.000000 -v 0.000000 0.053091 1.414214 -v -0.000000 0.053091 -1.414214 -v 1.414214 0.053091 -0.000000 -v -1.414214 0.054002 0.000000 -v 0.000000 0.054002 1.414214 -v -0.000000 0.054002 -1.414214 -v 1.414214 0.054002 -0.000000 -v -1.414214 0.055369 0.000000 -v 0.000000 0.055369 1.414214 -v -0.000000 0.055369 -1.414214 -v 1.414214 0.055369 -0.000000 -v -1.414214 0.056281 0.000000 -v 0.000000 0.056281 1.414214 -v -0.000000 0.056281 -1.414214 -v 1.414214 0.056281 -0.000000 -v -1.414214 0.057648 0.000000 -v 0.000000 0.057648 1.414214 -v -0.000000 0.057648 -1.414214 -v 1.414214 0.057648 -0.000000 -v -1.414214 0.058559 0.000000 -v 0.000000 0.058559 1.414214 -v -0.000000 0.058559 -1.414214 -v 1.414214 0.058559 -0.000000 -v -1.414214 0.059926 0.000000 -v 0.000000 0.059926 1.414214 -v -0.000000 0.059926 -1.414214 -v 1.414214 0.059926 -0.000000 -v -1.414214 0.060838 0.000000 -v 0.000000 0.060838 1.414214 -v -0.000000 0.060838 -1.414214 -v 1.414214 0.060838 -0.000000 -v -1.414214 0.062205 0.000000 -v 0.000000 0.062205 1.414214 -v -0.000000 0.062205 -1.414214 -v 1.414214 0.062205 -0.000000 -v -1.414214 0.063116 0.000000 -v 0.000000 0.063116 1.414214 -v -0.000000 0.063116 -1.414214 -v 1.414214 0.063116 -0.000000 -vt 0.000000 0.000000 -vt 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.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 0.000000 1.000000 -vt 1.000000 1.000000 -vt 1.000000 0.000000 -vt 0.000000 0.000000 -vt 1.000000 0.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vn 0.0000 -1.0000 0.0000 -vn 0.0000 1.0000 0.0000 -usemtl None -s off -f 1/1/1 3/2/1 4/3/1 2/4/1 -f 5/5/2 6/6/2 8/7/2 7/8/2 -f 9/9/1 11/10/1 12/11/1 10/12/1 -f 13/13/2 14/14/2 16/15/2 15/16/2 -f 17/17/1 19/18/1 20/19/1 18/20/1 -f 21/21/2 22/22/2 24/23/2 23/24/2 -f 25/25/1 27/26/1 28/27/1 26/28/1 -f 29/29/2 30/30/2 32/31/2 31/32/2 -f 33/33/1 35/34/1 36/35/1 34/36/1 -f 37/37/2 38/38/2 40/39/2 39/40/2 -f 41/41/1 43/42/1 44/43/1 42/44/1 -f 45/45/2 46/46/2 48/47/2 47/48/2 -f 49/49/1 51/50/1 52/51/1 50/52/1 -f 53/53/2 54/54/2 56/55/2 55/56/2 -f 57/57/1 59/58/1 60/59/1 58/60/1 -f 61/61/2 62/62/2 64/63/2 63/64/2 -f 65/65/1 67/66/1 68/67/1 66/68/1 -f 69/69/2 70/70/2 72/71/2 71/72/2 -f 73/73/1 75/74/1 76/75/1 74/76/1 -f 77/77/2 78/78/2 80/79/2 79/80/2 -f 81/81/1 83/82/1 84/83/1 82/84/1 -f 85/85/2 86/86/2 88/87/2 87/88/2 -f 89/89/1 91/90/1 92/91/1 90/92/1 -f 93/93/2 94/94/2 96/95/2 95/96/2 -f 97/97/1 99/98/1 100/99/1 98/100/1 -f 101/101/2 102/102/2 104/103/2 103/104/2 -f 105/105/1 107/106/1 108/107/1 106/108/1 -f 109/109/2 110/110/2 112/111/2 111/112/2 -f 113/113/1 115/114/1 116/115/1 114/116/1 -f 117/117/2 118/118/2 120/119/2 119/120/2 -f 121/121/1 123/122/1 124/123/1 122/124/1 -f 125/125/2 126/126/2 128/127/2 127/128/2 -f 129/129/1 131/130/1 132/131/1 130/132/1 -f 133/133/2 134/134/2 136/135/2 135/136/2 -f 137/137/1 139/138/1 140/139/1 138/140/1 -f 141/141/2 142/142/2 144/143/2 143/144/2 -f 145/145/1 147/146/1 148/147/1 146/148/1 -f 149/149/2 150/150/2 152/151/2 151/152/2 -f 153/153/1 155/154/1 156/155/1 154/156/1 -f 157/157/2 158/158/2 160/159/2 159/160/2 -f 161/161/1 163/162/1 164/163/1 162/164/1 -f 165/165/2 166/166/2 168/167/2 167/168/2 -f 169/169/1 171/170/1 172/171/1 170/172/1 -f 173/173/2 174/174/2 176/175/2 175/176/2 -f 177/177/1 179/178/1 180/179/1 178/180/1 -f 181/181/2 182/182/2 184/183/2 183/184/2 -f 185/185/1 187/186/1 188/187/1 186/188/1 -f 189/189/2 190/190/2 192/191/2 191/192/2 -f 193/193/1 195/194/1 196/195/1 194/196/1 -f 197/197/2 198/198/2 200/199/2 199/200/2 -f 201/201/1 203/202/1 204/203/1 202/204/1 -f 205/205/2 206/206/2 208/207/2 207/208/2 -f 209/209/1 211/210/1 212/211/1 210/212/1 -f 213/213/2 214/214/2 216/215/2 215/216/2 -f 217/217/1 219/218/1 220/219/1 218/220/1 -f 221/221/2 222/222/2 224/223/2 223/224/2 -f 225/225/1 227/226/1 228/227/1 226/228/1 -f 229/229/2 230/230/2 232/231/2 231/232/2 -f 233/233/1 235/234/1 236/235/1 234/236/1 -f 237/237/2 238/238/2 240/239/2 239/240/2 -f 241/241/1 243/242/1 244/243/1 242/244/1 -f 245/245/2 246/246/2 248/247/2 247/248/2 -f 249/249/1 251/250/1 252/251/1 250/252/1 -f 253/253/2 254/254/2 256/255/2 255/256/2 -f 257/257/1 259/258/1 260/259/1 258/260/1 -f 261/261/2 262/262/2 264/263/2 263/264/2 -f 265/265/1 267/266/1 268/267/1 266/268/1 -f 269/269/2 270/270/2 272/271/2 271/272/2 -f 273/273/1 275/274/1 276/275/1 274/276/1 -f 277/277/2 278/278/2 280/279/2 279/280/2 -f 281/281/1 283/282/1 284/283/1 282/284/1 -f 285/285/2 286/286/2 288/287/2 287/288/2 -f 289/289/1 291/290/1 292/291/1 290/292/1 -f 293/293/2 294/294/2 296/295/2 295/296/2 -f 297/297/1 299/298/1 300/299/1 298/300/1 -f 301/301/2 302/302/2 304/303/2 303/304/2 -f 305/305/1 307/306/1 308/307/1 306/308/1 -f 309/309/2 310/310/2 312/311/2 311/312/2 -f 313/313/1 315/314/1 316/315/1 314/316/1 -f 317/317/2 318/318/2 320/319/2 319/320/2 -f 321/321/1 323/322/1 324/323/1 322/324/1 -f 325/325/2 326/326/2 328/327/2 327/328/2 -f 329/329/1 331/330/1 332/331/1 330/332/1 -f 333/333/2 334/334/2 336/335/2 335/336/2 -f 337/337/1 339/338/1 340/339/1 338/340/1 -f 341/341/2 342/342/2 344/343/2 343/344/2 -f 345/345/1 347/346/1 348/347/1 346/348/1 -f 349/349/2 350/350/2 352/351/2 351/352/2 -f 353/353/1 355/354/1 356/355/1 354/356/1 -f 357/357/2 358/358/2 360/359/2 359/360/2 -f 361/361/1 363/362/1 364/363/1 362/364/1 -f 365/365/2 366/366/2 368/367/2 367/368/2 -f 369/369/1 371/370/1 372/371/1 370/372/1 -f 373/373/2 374/374/2 376/375/2 375/376/2 -f 377/377/1 379/378/1 380/379/1 378/380/1 -f 381/381/2 382/382/2 384/383/2 383/384/2 -f 385/385/1 387/386/1 388/387/1 386/388/1 -f 389/389/2 390/390/2 392/391/2 391/392/2 -f 393/393/1 395/394/1 396/395/1 394/396/1 -f 397/397/2 398/398/2 400/399/2 399/400/2 -f 401/401/1 403/402/1 404/403/1 402/404/1 -f 405/405/2 406/406/2 408/407/2 407/408/2 -f 409/409/1 411/410/1 412/411/1 410/412/1 -f 413/413/2 414/414/2 416/415/2 415/416/2 -f 417/417/1 419/418/1 420/419/1 418/420/1 -f 421/421/2 422/422/2 424/423/2 423/424/2 -f 425/425/1 427/426/1 428/427/1 426/428/1 -f 429/429/2 430/430/2 432/431/2 431/432/2 -f 433/433/1 435/434/1 436/435/1 434/436/1 -f 437/437/2 438/438/2 440/439/2 439/440/2 -f 441/441/1 443/442/1 444/443/1 442/444/1 -f 445/445/2 446/446/2 448/447/2 447/448/2 diff --git a/mods/ITEMS/mcl_bows/rocket.lua b/mods/ITEMS/mcl_bows/rocket.lua deleted file mode 100644 index b8ad2c1f00..0000000000 --- a/mods/ITEMS/mcl_bows/rocket.lua +++ /dev/null @@ -1,699 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -local math = math -local vector = vector - --- Time in seconds after which a stuck arrow is deleted -local ARROW_TIMEOUT = 1 --- Time after which stuck arrow is rechecked for being stuck -local STUCK_RECHECK_TIME = 0.1 - ---local GRAVITY = 9.81 - -local YAW_OFFSET = -math.pi/2 - -local function dir_to_pitch(dir) - --local dir2 = vector.normalize(dir) - local xz = math.abs(dir.x) + math.abs(dir.z) - return -math.atan2(-dir.y, xz) -end - -local function damage_explosion(self, damagemulitplier) - local p = self.object:get_pos() - mcl_explosions.explode(p, 3, {}) - local objects = minetest.get_objects_inside_radius(p, 8) - for _,obj in pairs(objects) do - if obj:is_player() then - mcl_util.deal_damage(obj, damagemulitplier - vector.distance(p, obj:get_pos()), {type = "explosion"}) - elseif obj:get_luaentity().is_mob then - obj:punch(self.object, 1.0, { - full_punch_interval=1.0, - damage_groups={fleshy=damagemulitplier - vector.distance(p, obj:get_pos())}, - }, self.object:get_velocity()) - end - end -end - -local function particle_explosion(self) - local particle_pattern = math.random(1, 3) - local fpitch - --local true_type - local type = math.random(1, 2) - local size = math.random(1, 3) - local colors = {"red", "yellow", "blue", "green", "white"} - local this_colors = {colors[math.random(#colors)], colors[math.random(#colors)], colors[math.random(#colors)]} - - if size == 1 then - fpitch = math.random(200, 300) - elseif size == 2 then - fpitch = math.random(100, 130) - else - fpitch = math.random(60, 70) - end - - --[[if type == 1 then - true_type = "Popper" - else - true_type = "Floof" - end]] - - if type == 1 then - minetest.sound_play("mcl_bows_firework", { - pos = self.object:get_pos(), - max_hear_distance = 100, - gain = 3.0, - pitch = fpitch/100 - }, true) - else - minetest.sound_play("mcl_bows_firework_soft", { - pos = self.object:get_pos(), - max_hear_distance = 100, - gain = 4.0, - pitch = fpitch/100 - }, true) - end - - if particle_pattern == 1 then - minetest.add_particlespawner({ - amount = 400 * size, - time = 0.0001, - minpos = self.object:get_pos(), - maxpos = self.object:get_pos(), - minvel = vector.new(-7 * size,-7 * size,-7 * size), - maxvel = vector.new(7 * size,7 * size,7 * size), - minexptime = .6 * size / 2, - maxexptime = .9 * size / 2, - minsize = 2 * size, - maxsize = 3 * size, - collisiondetection = false, - vertical = false, - texture = "mcl_bows_firework_"..this_colors[1]..".png", - glow = 14, - }) - minetest.add_particlespawner({ - amount = 400 * size, - time = 0.0001, - minpos = self.object:get_pos(), - maxpos = self.object:get_pos(), - minvel = vector.new(-2 * size,-2 * size,-2 * size), - maxvel = vector.new(2 * size,2 * size,2 * size), - minexptime = .6 * size / 2, - maxexptime = .9 * size / 2, - minsize = 2 * size, - maxsize = 3 * size, - collisiondetection = false, - vertical = false, - texture = "mcl_bows_firework_"..this_colors[2]..".png", - glow = 14, - }) - minetest.add_particlespawner({ - amount = 100 * size, - time = 0.0001, - minpos = self.object:get_pos(), - maxpos = self.object:get_pos(), - minvel = vector.new(-14 * size,-14 * size,-14 * size), - maxvel = vector.new(14 * size,14 * size,14 * size), - minexptime = .6 * size / 2, - maxexptime = .9 * size / 2, - minsize = 2 * size, - maxsize = 3 * size, - collisiondetection = false, - vertical = false, - texture = "mcl_bows_firework_"..this_colors[3]..".png", - glow = 14, - }) - elseif particle_pattern == 2 then - - minetest.add_particlespawner({ - amount = 240 * size, - time = 0.0001, - minpos = self.object:get_pos(), - maxpos = self.object:get_pos(), - minvel = vector.new(-5 * size,-5 * size,-5 * size), - maxvel = vector.new(5 * size,5 * size,5 * size), - minexptime = .6 * size / 2, - maxexptime = .9 * size / 2, - minsize = 2 * size, - maxsize = 3 * size, - collisiondetection = false, - vertical = false, - texture = "mcl_bows_firework_"..this_colors[1]..".png", - glow = 14, - }) - minetest.add_particlespawner({ - amount = 500 * size, - time = 0.0001, - minpos = self.object:get_pos(), - maxpos = self.object:get_pos(), - minvel = vector.new(-2 * size,-2 * size,-2 * size), - maxvel = vector.new(2 * size,2 * size,2 * size), - minexptime = .6 * size / 2, - maxexptime = .9 * size / 2, - minsize = 2 * size, - maxsize = 3 * size, - collisiondetection = false, - vertical = false, - texture = "mcl_bows_firework_"..this_colors[2]..".png", - glow = 14, - }) - minetest.add_particlespawner({ - amount = 350 * size, - time = 0.0001, - minpos = self.object:get_pos(), - maxpos = self.object:get_pos(), - minvel = vector.new(-3 * size,-3 * size,-3 * size), - maxvel = vector.new(3 * size,3 * size,3 * size), - minexptime = .6 * size / 2, - maxexptime = .9 * size / 2, - minsize = 2 * size, - maxsize = 3 * size, - collisiondetection = false, - vertical = false, - texture = "mcl_bows_firework_"..this_colors[3]..".png", - glow = 14, - }) - elseif particle_pattern == 3 then - - minetest.add_particlespawner({ - amount = 400 * size, - time = 0.0001, - minpos = self.object:get_pos(), - maxpos = self.object:get_pos(), - minvel = vector.new(-6 * size,-4 * size,-6 * size), - maxvel = vector.new(6 * size,4 * size,6 * size), - minexptime = .6 * size, - maxexptime = .9 * size, - minsize = 2 * size, - maxsize = 3 * size, - collisiondetection = false, - vertical = false, - texture = "mcl_bows_firework_"..this_colors[1]..".png", - glow = 14, - }) - minetest.add_particlespawner({ - amount = 120 * size, - time = 0.0001, - minpos = self.object:get_pos(), - maxpos = self.object:get_pos(), - minvel = vector.new(-8 * size,6 * size,-8 * size), - maxvel = vector.new(8 * size,6 * size,8 * size), - minexptime = .6 * size, - maxexptime = .9 * size, - minsize = 2 * size, - maxsize = 3 * size, - collisiondetection = false, - vertical = false, - texture = "mcl_bows_firework_"..this_colors[2]..".png", - glow = 14, - }) - minetest.add_particlespawner({ - amount = 130 * size, - time = 0.0001, - minpos = self.object:get_pos(), - maxpos = self.object:get_pos(), - minvel = vector.new(-3 * size,3 * size,-3 * size), - maxvel = vector.new(3 * size,3 * size,3 * size), - minexptime = .6 * size, - maxexptime = .9 * size, - minsize = 2 * size, - maxsize = 3 * size, - collisiondetection = false, - vertical = false, - texture = "mcl_bows_firework_"..this_colors[3]..".png", - glow = 14, - }) - end - - return size - -end - -local mod_awards = minetest.get_modpath("awards") and minetest.get_modpath("mcl_achievements") -local mod_button = minetest.get_modpath("mesecons_button") -local mod_target = minetest.get_modpath("mcl_target") - -minetest.register_craftitem("mcl_bows:rocket", { - description = S("Arrow"), - _tt_help = S("Ammunition").."\n"..S("Damage from bow: 1-10").."\n"..S("Damage from dispenser: 3"), - _doc_items_longdesc = S("Arrows are ammunition for bows and dispensers.").."\n".. -S("An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.").."\n".. -S("Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons."), - _doc_items_usagehelp = S("To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it."), - inventory_image = "mcl_bows_rocket.png", - groups = { ammo=1, ammo_crossbow=1, ammo_bow_regular=1 }, - _on_dispense = function(itemstack, dispenserpos, droppos, dropnode, dropdir) - -- Shoot arrow - local shootpos = vector.add(dispenserpos, vector.multiply(dropdir, 0.51)) - local yaw = math.atan2(dropdir.z, dropdir.x) + YAW_OFFSET - mcl_bows.shoot_arrow(itemstack:get_name(), shootpos, dropdir, yaw, nil, 19, 3) - end, -}) - - - -local ARROW_ENTITY={ - physical = true, - pointable = false, - visual = "mesh", - mesh = "mcl_bows_rocket.obj", - visual_size = {x=2.5, y=2.5}, - textures = {"mcl_bows_rocket.png"}, - collisionbox = {-0.19, -0.125, -0.19, 0.19, 0.125, 0.19}, - collide_with_objects = false, - _fire_damage_resistant = true, - - _lastpos={}, - _startpos=nil, - _damage=1, -- Damage on impact - _is_critical=false, -- Whether this arrow would deal critical damage - _stuck=false, -- Whether arrow is stuck - _fuse=nil,-- Amount of time (in seconds) the arrow has been stuck so far - _fuserechecktimer=nil,-- An additional timer for periodically re-checking the stuck status of an arrow - _stuckin=nil, --Position of node in which arow is stuck. - _shooter=nil, -- ObjectRef of player or mob who shot it - _is_arrow = true, - - _viscosity=0, -- Viscosity of node the arrow is currently in - _deflection_cooloff=0, -- Cooloff timer after an arrow deflection, to prevent many deflections in quick succession -} - --- Destroy arrow entity self at pos and drops it as an item -local function spawn_item(self, pos) - if not minetest.is_creative_enabled("") then - local item = minetest.add_item(pos, "mcl_bows:rocket") - item:set_velocity({x=0, y=0, z=0}) - item:set_yaw(self.object:get_yaw()) - end - mcl_burning.extinguish(self.object) - self.object:remove() -end - -local function damage_particles(pos, is_critical) - if is_critical then - minetest.add_particlespawner({ - amount = 15, - time = 0.1, - 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.1, y=-0.1, z=-0.1}, - maxvel = {x=0.1, y=0.1, z=0.1}, - minacc = {x=0, y=0, z=0}, - maxacc = {x=0, y=0, z=0}, - minexptime = 1, - maxexptime = 2, - minsize = 1.5, - maxsize = 1.5, - collisiondetection = false, - vertical = false, - texture = "mcl_particles_crit.png^[colorize:#bc7a57:127", - }) - end -end - -function ARROW_ENTITY.on_step(self, dtime) - mcl_burning.tick(self.object, dtime, self) - - self._time_in_air = self._time_in_air + .001 - - - local pos = self.object:get_pos() - local dpos = table.copy(pos) -- digital pos - dpos = vector.round(dpos) - local node = minetest.get_node(dpos) - - if not self._fuse then - self._fuse = 0 - end - if not self._fuserechecktimer then - self._fuserechecktimer = 0 - end - - self._fuse = self._fuse + dtime - self._fuserechecktimer = self._fuserechecktimer + dtime - - if self._fuse > ARROW_TIMEOUT then - self._stuck = true - end - if self._stuck then - if self._fuse > ARROW_TIMEOUT then - local eploded_particle = particle_explosion(self) - damage_explosion(self, eploded_particle * 17) - mcl_burning.extinguish(self.object) - self.object:remove() - return - end - -- Drop arrow as item when it is no longer stuck - -- FIXME: Arrows are a bit slow to react and continue to float in mid air for a few seconds. - if self._fuserechecktimer > STUCK_RECHECK_TIME then - local stuckin_def - if self._stuckin then - stuckin_def = minetest.registered_nodes[minetest.get_node(self._stuckin).name] - end - -- TODO: In MC, arrow just falls down without turning into an item - if stuckin_def and stuckin_def.walkable == false then - spawn_item(self, pos) - return - end - self._fuserechecktimer = 0 - end - -- Pickup arrow if player is nearby (not in Creative Mode) - local objects = minetest.get_objects_inside_radius(pos, 1) - for _,obj in ipairs(objects) do - if obj:is_player() then - if self._collectable and not minetest.is_creative_enabled(obj:get_player_name()) then - if obj:get_inventory():room_for_item("main", "mcl_bows:rocket") then - obj:get_inventory():add_item("main", "mcl_bows:rocket") - minetest.sound_play("item_drop_pickup", { - pos = pos, - max_hear_distance = 16, - gain = 1.0, - }, true) - end - end - mcl_burning.extinguish(self.object) - self.object:remove() - return - end - end - - -- Check for object "collision". Done every tick (hopefully this is not too stressing) - else - - if self._in_player == false then - minetest.add_particlespawner({ - amount = 1, - time = .0001, - minpos = pos, - maxpos = pos, - minvel = vector.new(-0.1,-0.1,-0.1), - maxvel = vector.new(0.1,0.1,0.1), - minexptime = 0.5, - maxexptime = 0.5, - minsize = 2, - maxsize = 2, - collisiondetection = false, - vertical = false, - texture = "mcl_bows_rocket_particle.png", - glow = 1, - }) - end - -- We just check for any hurtable objects nearby. - -- The radius of 3 is fairly liberal, but anything lower than than will cause - -- arrow to hilariously go through mobs often. - -- TODO: Implement an ACTUAL collision detection (engine support needed). - local objs = minetest.get_objects_inside_radius(pos, 1.5) - local closest_object - local closest_distance - - if self._deflection_cooloff > 0 then - self._deflection_cooloff = self._deflection_cooloff - dtime - end - - -- Iterate through all objects and remember the closest attackable object - for k, obj in pairs(objs) do - local ok = false - -- Arrows can only damage players and mobs - if obj:is_player() then - ok = true - elseif obj:get_luaentity() then - if (obj:get_luaentity().is_mob or obj:get_luaentity()._hittable_by_projectile) then - ok = true - end - end - - if ok then - local dist = vector.distance(pos, obj:get_pos()) - if not closest_object or not closest_distance then - closest_object = obj - closest_distance = dist - elseif dist < closest_distance then - closest_object = obj - closest_distance = dist - end - end - end - - -- If an attackable object was found, we will damage the closest one only - - if closest_object then - local obj = closest_object - local is_player = obj:is_player() - local lua = obj:get_luaentity() - if obj == self._shooter and self._time_in_air > 1.02 or obj ~= self._shooter and (is_player or (lua and (lua.is_mob or lua._hittable_by_projectile))) then - if obj:get_hp() > 0 then - -- Check if there is no solid node between arrow and object - local ray = minetest.raycast(self.object:get_pos(), obj:get_pos(), true) - for pointed_thing in ray do - if pointed_thing.type == "object" and pointed_thing.ref == closest_object then - -- Target reached! We can proceed now. - break - elseif pointed_thing.type == "node" then - local nn = minetest.get_node(minetest.get_pointed_thing_position(pointed_thing)).name - local def = minetest.registered_nodes[nn] - if (not def) or def.walkable then - -- There's a node in the way. Delete arrow without damage - mcl_burning.extinguish(self.object) - self.object:remove() - return - end - end - end - - -- Punch target object but avoid hurting enderman. - if not lua or lua.name ~= "mobs_mc:enderman" then - if self._in_player == false then - damage_particles(self.object:get_pos(), self._is_critical) - end - if mcl_burning.is_burning(self.object) then - mcl_burning.set_on_fire(obj, 5) - end - if self._in_player == false then - obj:punch(self.object, 1.0, { - full_punch_interval=1.0, - damage_groups={fleshy=self._damage}, - }, self.object:get_velocity()) - if obj:is_player() then - local eploded_particle = particle_explosion(self) - damage_explosion(self, eploded_particle * 17) - mcl_burning.extinguish(self.object) - self.object:remove() - end - end - end - - - if is_player then - if self._shooter and self._shooter:is_player() and self._in_player == false then - -- “Ding” sound for hitting another player - minetest.sound_play({name="mcl_bows_hit_player", gain=0.1}, {to_player=self._shooter:get_player_name()}, true) - end - end - - if lua then - local entity_name = lua.name - -- Achievement for hitting skeleton, wither skeleton or stray (TODO) with an arrow at least 50 meters away - -- NOTE: Range has been reduced because mobs unload much earlier than that ... >_> - -- TODO: This achievement should be given for the kill, not just a hit - if self._shooter and self._shooter:is_player() and vector.distance(pos, self._startpos) >= 20 then - if mod_awards and (entity_name == "mobs_mc:skeleton" or entity_name == "mobs_mc:stray" or entity_name == "mobs_mc:witherskeleton") then - awards.unlock(self._shooter:get_player_name(), "mcl:snipeSkeleton") - end - end - end - if self._in_player == false then - minetest.sound_play({name="mcl_bows_hit_other", gain=0.3}, {pos=self.object:get_pos(), max_hear_distance=16}, true) - end - end - if not obj:is_player() then - mcl_burning.extinguish(self.object) - if self._piercing == 0 then - local eploded_particle = particle_explosion(self) - damage_explosion(self, eploded_particle * 17) - self.object:remove() - end - end - return - end - end - end - - -- Check for node collision - if self._lastpos.x~=nil and not self._stuck then - local def = minetest.registered_nodes[node.name] - local vel = self.object:get_velocity() - -- Arrow has stopped in one axis, so it probably hit something. - -- This detection is a bit clunky, but sadly, MT does not offer a direct collision detection for us. :-( - if (math.abs(vel.x) < 0.0001) or (math.abs(vel.z) < 0.0001) or (math.abs(vel.y) < 0.00001) then - -- Check for the node to which the arrow is pointing - local dir - if math.abs(vel.y) < 0.00001 then - if self._lastpos.y < pos.y then - dir = {x=0, y=1, z=0} - else - dir = {x=0, y=-1, z=0} - end - else - dir = minetest.facedir_to_dir(minetest.dir_to_facedir(minetest.yaw_to_dir(self.object:get_yaw()-YAW_OFFSET))) - end - self._stuckin = vector.add(dpos, dir) - local snode = minetest.get_node(self._stuckin) - local sdef = minetest.registered_nodes[snode.name] - - -- If node is non-walkable, unknown or ignore, don't make arrow stuck. - -- This causes a deflection in the engine. - if not sdef or sdef.walkable == false or snode.name == "ignore" then - self._stuckin = nil - if self._deflection_cooloff <= 0 then - -- Lose 1/3 of velocity on deflection - local newvel = vector.multiply(vel, 0.6667) - - self.object:set_velocity(newvel) - -- Reset deflection cooloff timer to prevent many deflections happening in quick succession - self._deflection_cooloff = 1.0 - end - else - - -- Node was walkable, make arrow stuck - self._stuck = true - self._fuserechecktimer = 0 - - self.object:set_velocity({x=0, y=0, z=0}) - self.object:set_acceleration({x=0, y=0, z=0}) - - minetest.sound_play({name="mcl_bows_hit_other", gain=0.3}, {pos=self.object:get_pos(), max_hear_distance=16}, true) - - if mcl_burning.is_burning(self.object) and snode.name == "mcl_tnt:tnt" then - tnt.ignite(self._stuckin) - end - - -- Activate target - if mod_target and snode.name == "mcl_target:target_off" then - mcl_target.hit(self._stuckin, 1) --10 redstone ticks - end - - -- Push the button! Push, push, push the button! - if mod_button and minetest.get_item_group(node.name, "button") > 0 and minetest.get_item_group(node.name, "button_push_by_arrow") == 1 then - local bdir = minetest.wallmounted_to_dir(node.param2) - -- Check the button orientation - if vector.equals(vector.add(dpos, bdir), self._stuckin) then - mesecon.push_button(dpos, node) - end - end - end - elseif (def and def.liquidtype ~= "none") then - -- Slow down arrow in liquids - local v = def.liquid_viscosity - if not v then - v = 0 - end - --local old_v = self._viscosity - self._viscosity = v - local vpenalty = math.max(0.1, 0.98 - 0.1 * v) - if math.abs(vel.x) > 0.001 then - vel.x = vel.x * vpenalty - end - if math.abs(vel.z) > 0.001 then - vel.z = vel.z * vpenalty - end - self.object:set_velocity(vel) - end - end - - -- Update yaw - if not self._stuck then - local vel = self.object:get_velocity() - local yaw = minetest.dir_to_yaw(vel)+YAW_OFFSET - local pitch = dir_to_pitch(vel) - self.object:set_rotation({ x = 0, y = yaw, z = pitch }) - end - - -- Update internal variable - self._lastpos={x=pos.x, y=pos.y, z=pos.z} -end - --- Force recheck of stuck arrows when punched. --- Otherwise, punching has no effect. -function ARROW_ENTITY.on_punch(self) - if self._stuck then - self._fuserechecktimer = STUCK_RECHECK_TIME - end -end - -function ARROW_ENTITY.get_staticdata(self) - local out = { - lastpos = self._lastpos, - startpos = self._startpos, - damage = self._damage, - is_critical = self._is_critical, - stuck = self._stuck, - stuckin = self._stuckin, - } - if self._stuck then - -- If _fuse is missing for some reason, assume the maximum - if not self._fuse then - self._fuse = ARROW_TIMEOUT - end - out.stuckstarttime = minetest.get_gametime() - self._fuse - end - if self._shooter and self._shooter:is_player() then - out.shootername = self._shooter:get_player_name() - end - return minetest.serialize(out) -end - -function ARROW_ENTITY.on_activate(self, staticdata, dtime_s) - self._time_in_air = 1.0 - self._in_player = false - local data = minetest.deserialize(staticdata) - if data then - self._stuck = data.stuck - if data.stuck then - if data.stuckstarttime then - -- First, check if the stuck arrow is aleady past its life timer. - -- If yes, delete it. - self._fuse = minetest.get_gametime() - data.stuckstarttime - if self._fuse > ARROW_TIMEOUT then - mcl_burning.extinguish(self.object) - self.object:remove() - return - end - end - - self._fuse = 2 - -- Perform a stuck recheck on the next step. - self._fuserechecktimer = STUCK_RECHECK_TIME - - self._stuckin = data.stuckin - end - - -- Get the remaining arrow state - self._lastpos = data.lastpos - self._startpos = data.startpos - self._damage = data.damage - self._is_critical = data.is_critical - if data.shootername then - local shooter = minetest.get_player_by_name(data.shootername) - if shooter and shooter:is_player() then - self._shooter = shooter - end - end - end - self.object:set_armor_groups({ immortal = 1 }) -end - -minetest.register_entity("mcl_bows:rocket_entity", ARROW_ENTITY) - -if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then - minetest.register_craft({ - output = "mcl_bows:rocket 1", - recipe = { - {"mcl_core:paper"}, - {"mcl_fireworks:rocket_2"}, - {"mcl_bows:arrow"}, - } - }) -end - -if minetest.get_modpath("doc_identifier") then - doc.sub.identifier.register_object("mcl_bows:rocket_entity", "craftitems", "mcl_bows:rocket") -end diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_bow_shoot.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_bow_shoot.ogg deleted file mode 100644 index ca8b0f7186..0000000000 Binary files a/mods/ITEMS/mcl_bows/sounds/mcl_bows_bow_shoot.ogg and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_0.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_0.ogg deleted file mode 100644 index f4f81b3074..0000000000 Binary files a/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_0.ogg and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_1.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_1.ogg deleted file mode 100644 index c8c06b4fac..0000000000 Binary files a/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_1.ogg and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_2.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_2.ogg deleted file mode 100644 index 4ddd20c422..0000000000 Binary files a/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_2.ogg and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_load.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_load.ogg deleted file mode 100644 index 02d2fd1afc..0000000000 Binary files a/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_load.ogg and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_shoot.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_shoot.ogg deleted file mode 100644 index a7d7b69d12..0000000000 Binary files a/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_shoot.ogg and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_firework.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_firework.ogg deleted file mode 100644 index ea9a4c4be5..0000000000 Binary files a/mods/ITEMS/mcl_bows/sounds/mcl_bows_firework.ogg and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_firework_soft.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_firework_soft.ogg deleted file mode 100644 index 8b2e7bc5bd..0000000000 Binary files a/mods/ITEMS/mcl_bows/sounds/mcl_bows_firework_soft.ogg and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_hit_other.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_hit_other.ogg deleted file mode 100644 index 6956e4d8dd..0000000000 Binary files a/mods/ITEMS/mcl_bows/sounds/mcl_bows_hit_other.ogg and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_hit_player.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_hit_player.ogg deleted file mode 100644 index abf6163a34..0000000000 Binary files a/mods/ITEMS/mcl_bows/sounds/mcl_bows_hit_player.ogg and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow.png deleted file mode 100644 index f7bd92a9cc..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_back.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_back.png deleted file mode 100644 index 4fa82ce26d..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_back.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_front.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_front.png deleted file mode 100644 index 054561f72a..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_front.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_inv.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_inv.png deleted file mode 100644 index 8635d28a1e..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_inv.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_overlay.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_overlay.png deleted file mode 100644 index ee628e29da..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow_overlay.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_bow.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_bow.png deleted file mode 100644 index 7d695bc932..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_bow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_bow_0.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_bow_0.png deleted file mode 100644 index 8bb41ea44f..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_bow_0.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_bow_1.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_bow_1.png deleted file mode 100644 index f85304e40b..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_bow_1.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_bow_2.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_bow_2.png deleted file mode 100644 index 205220f2c2..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_bow_2.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow.png deleted file mode 100644 index b688dab947..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_0.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_0.png deleted file mode 100644 index 41daad6d84..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_0.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_1.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_1.png deleted file mode 100644 index 3769f2967b..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_1.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_2.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_2.png deleted file mode 100644 index b1bb50feb2..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_2.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_3.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_3.png deleted file mode 100644 index 8a8f1b03fc..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_3.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_blue.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_blue.png deleted file mode 100644 index 608dbe0d0f..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_green.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_green.png deleted file mode 100644 index acd74d6d1c..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_green.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_red.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_red.png deleted file mode 100644 index 4d7355c57a..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_red.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_white.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_white.png deleted file mode 100644 index 1860ee53c5..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_white.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_yellow.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_yellow.png deleted file mode 100644 index c2b745def7..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_yellow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_rocket.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_rocket.png deleted file mode 100644 index 800185ce08..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_rocket.png and /dev/null differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_rocket_particle.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_rocket_particle.png deleted file mode 100644 index 12a894c721..0000000000 Binary files a/mods/ITEMS/mcl_bows/textures/mcl_bows_rocket_particle.png and /dev/null differ diff --git a/mods/ITEMS/mcl_brewing/init.lua b/mods/ITEMS/mcl_brewing/init.lua deleted file mode 100644 index 2ff2a806f0..0000000000 --- a/mods/ITEMS/mcl_brewing/init.lua +++ /dev/null @@ -1,982 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -local function active_brewing_formspec(fuel_percent, brew_percent) - - return "size[9,8.75]".. - "background[-0.19,-0.25;9.5,9.5;mcl_brewing_inventory.png]".. - "label[4,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Brewing Stand"))).."]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.75;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.75,9,1).. - "list[context;fuel;0.5,1.75;1,1;]".. - mcl_formspec.get_itemslot_bg(0.5,1.75,1,1).."image[0.5,1.75;1,1;mcl_brewing_fuel_bg.png]".. - "list[context;input;2.75,0.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. - "list[context;stand;4.5,2.5;1,1;]".. - mcl_formspec.get_itemslot_bg(4.5,2.5,1,1).."image[4.5,2.5;1,1;mcl_brewing_bottle_bg.png]".. - "list[context;stand;6,2.8;1,1;1]".. - mcl_formspec.get_itemslot_bg(6,2.8,1,1).."image[6,2.8;1,1;mcl_brewing_bottle_bg.png]".. - "list[context;stand;7.5,2.5;1,1;2]".. - mcl_formspec.get_itemslot_bg(7.5,2.5,1,1).."image[7.5,2.5;1,1;mcl_brewing_bottle_bg.png]".. - - "image[2.7,3.33;1.28,0.41;mcl_brewing_burner.png^[lowpart:".. - (100-fuel_percent)..":mcl_brewing_burner_active.png^[transformR270]".. - - "image[2.76,1.4;1,2.15;mcl_brewing_bubbles.png^[lowpart:".. - (brew_percent)..":mcl_brewing_bubbles_active.png]".. - - "listring[current_player;main]".. - "listring[context;fuel]".. - "listring[context;input]".. - "listring[context;stand]" -end - -local brewing_formspec = "size[9,8.75]".. - "background[-0.19,-0.25;9.5,9.5;mcl_brewing_inventory.png]".. - "label[4,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Brewing Stand"))).."]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.75;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.75,9,1).. - "list[context;fuel;0.5,1.75;1,1;]".. - mcl_formspec.get_itemslot_bg(0.5,1.75,1,1).."image[0.5,1.75;1,1;mcl_brewing_fuel_bg.png]".. - "list[context;input;2.75,0.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. - "list[context;stand;4.5,2.5;1,1;]".. - mcl_formspec.get_itemslot_bg(4.5,2.5,1,1).."image[4.5,2.5;1,1;mcl_brewing_bottle_bg.png]".. - "list[context;stand;6,2.8;1,1;1]".. - mcl_formspec.get_itemslot_bg(6,2.8,1,1).."image[6,2.8;1,1;mcl_brewing_bottle_bg.png]".. - "list[context;stand;7.5,2.5;1,1;2]".. - mcl_formspec.get_itemslot_bg(7.5,2.5,1,1).."image[7.5,2.5;1,1;mcl_brewing_bottle_bg.png]".. - - "image[2.7,3.33;1.28,0.41;mcl_brewing_burner.png^[transformR270]".. - "image[2.76,1.4;1,2.15;mcl_brewing_bubbles.png]".. - - "listring[current_player;main]".. - "listring[context;fuel]".. - "listring[context;input]".. - "listring[context;stand]" - - ---[[local function swap_node(pos, name) - local node = minetest.get_node(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end]] - - -local function brewable(inv) - - local ingredient = inv:get_stack("input",1):get_name() - local stands = {} - local stand_size = inv:get_size("stand") - local was_alchemy = {false,false,false} - - local bottle, alchemy - - for i=1,stand_size do - - bottle = inv:get_stack("stand", i):get_name() - alchemy = mcl_potions.get_alchemy(ingredient, bottle) - - if alchemy then - stands[i] = alchemy - was_alchemy[i] = true - else - stands[i] = bottle - end - - end - -- if any stand holds a new potion, return the list of new potions - for i=1,#was_alchemy do - if was_alchemy[i] then return stands end - end - - return false -end - - -local function brewing_stand_timer(pos, elapsed) - -- Inizialize metadata - local meta = minetest.get_meta(pos) - - local fuel_timer = meta:get_float("fuel_timer") or 0 - local BREW_TIME = 20 -- all brews brew the same - local BURN_TIME = BREW_TIME * 10 - - --local input_item = meta:get_string("input_item") or "" - local stand_timer = meta:get_float("stand_timer") or 0 - local fuel = meta:get_float("fuel") or 0 - local inv = meta:get_inventory() - - --local input_list, stand_list, fuel_list - local brew_output, d - local input_count, fuel_name, fuel_count, formspec, fuel_percent, brew_percent - - local update = true - - while update do - - update = false - - --input_list = inv:get_list("input") - --stand_list = inv:get_list("stand") - --fuel_list = inv:get_list("fuel") - - -- TODO ... fix this. Goal is to reset the process if the stand changes - -- for i=1, inv:get_size("stand", i) do -- reset the process due to change - -- local _name = inv:get_stack("stand", i):get_name() - -- if _name ~= stand_items[i] then - -- stand_timer = 0 - -- stand_items[i] = _name - -- update = true -- need to update the stand with new data - -- return 1 - -- end - -- end - - brew_output = brewable(inv) - if fuel ~= 0 and brew_output then - - fuel_timer = fuel_timer + elapsed - stand_timer = stand_timer + elapsed - - if fuel_timer >= BURN_TIME then --replace with more fuel - fuel = 0 --force a new fuel grab - fuel_timer = 0 - end - - d = 0.5 - minetest.add_particlespawner({ - amount = 4, - time = 1, - minpos = {x=pos.x-d, y=pos.y+0.5, z=pos.z-d}, - maxpos = {x=pos.x+d, y=pos.y+2, z=pos.z+d}, - minvel = {x=-0.1, y=0, z=-0.1}, - maxvel = {x=0.1, y=0.5, z=0.1}, - minacc = {x=-0.05, y=0, z=-0.05}, - maxacc = {x=0.05, y=.1, z=0.05}, - minexptime = 1, - maxexptime = 2, - minsize = 0.5, - maxsize = 2, - collisiondetection = true, - vertical = false, - texture = "mcl_brewing_bubble_sprite.png", - }) - - -- Replace the stand item with the brew result - if stand_timer >= BREW_TIME then - - input_count = inv:get_stack("input",1):get_count() - if (input_count-1) ~= 0 then - inv:set_stack("input",1,inv:get_stack("input",1):get_name().." "..(input_count-1)) - else - inv:set_stack("input",1,"") - end - - for i=1, inv:get_size("stand") do - if brew_output[i] then - minetest.sound_play("mcl_brewing_complete", {pos=pos, gain=0.4, max_hear_range=6}, true) - inv:set_stack("stand", i, brew_output[i]) - minetest.sound_play("mcl_potions_bottle_pour", {pos=pos, gain=0.6, max_hear_range=6}, true) - end - end - stand_timer = 0 - update = false -- stop the update if brew is complete - end - - elseif fuel == 0 then --get more fuel from fuel_list - - -- only allow blaze powder fuel - fuel_name = inv:get_stack("fuel",1):get_name() - fuel_count = inv:get_stack("fuel",1):get_count() - - if fuel_name == "mcl_mobitems:blaze_powder" then -- Grab another fuel - - if (fuel_count-1) ~= 0 then - inv:set_stack("fuel",1,fuel_name.." "..(fuel_count-1)) - else - inv:set_stack("fuel",1,"") - end - update = true - fuel = 1 - else -- no fuel available - update = false - end - - end - - elapsed = 0 - end - - --update formspec - formspec = brewing_formspec - - local result = false - - if fuel_timer ~= 0 then - fuel_percent = math.floor(fuel_timer/BURN_TIME*100 % BURN_TIME) - brew_percent = math.floor(stand_timer/BREW_TIME*100) - formspec = active_brewing_formspec(fuel_percent, brew_percent*1 % 100) - result = true - else - minetest.get_node_timer(pos):stop() - end - - meta:set_float("fuel_timer", fuel_timer) - meta:set_float("stand_timer", stand_timer) - meta:set_float("fuel", fuel) - meta:set_string("formspec", formspec) - - return result -end - - ---[[local function allow_metadata_inventory_put(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if listname == "fuel" then - - -- Test stack with size 1 because we burn one fuel at a time - local teststack = ItemStack(stack) - teststack:set_count(1) - local output, decremented_input = minetest.get_craft_result({method="fuel", width=1, items={teststack}}) - if output.time ~= 0 then - -- Only allow to place 1 item if fuel get replaced by recipe. - -- This is the case for lava buckets. - local replace_item = decremented_input.items[1] - if replace_item:is_empty() then - -- For most fuels, just allow to place everything - return stack:get_count() - else - if inv:get_stack(listname, index):get_count() == 0 then - return 1 - else - return 0 - end - end - else - return 0 - end - elseif listname == "input" then - return stack:get_count() - elseif listname == "stand" then - return 0 - end -end]] - - --- Drop input items of brewing_stand at pos with metadata meta -local function drop_brewing_stand_items(pos, meta) - - local inv = meta:get_inventory() - - local stack = inv:get_stack("fuel", 1) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - - local stack = inv:get_stack("input", 1) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - - for i=1, inv:get_size("stand") do - local stack = inv:get_stack("stand", i) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - end -end - - -local on_rotate -if minetest.get_modpath("screwdriver") then - on_rotate = screwdriver.rotate_simple -end - -local doc_string = - S("To use a brewing stand, rightclick it.").."\n".. - S("To brew, you need blaze powder as fuel, a brewing material and at least 1 glass bottle filled with a liquid.").."\n".. - S("Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.").."\n".. - S("When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.").."\n".. - S("Different combinations of brewing materials and liquids will give different results. Try to experiment!") - -local tiles = { - "mcl_brewing_top.png", --top - "mcl_brewing_base.png", --bottom - "mcl_brewing_side.png", --right - "mcl_brewing_side.png", --left - "mcl_brewing_side.png", --back - "mcl_brewing_side.png^[transformFX", --front -} - -local function allow_put(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - else - return stack:get_count() - end -end - -local function on_put(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local str = "" - local stack - for i=1, inv:get_size("stand") do - stack = inv:get_stack("stand", i) - if not stack:is_empty() then - str = str.."1" - else str = str.."0" - end - end - minetest.swap_node(pos, {name = "mcl_brewing:stand_"..str}) - minetest.get_node_timer(pos):start(1.0) - --some code here to enforce only potions getting placed on stands -end - ---[[local function after_dig(pos, oldnode, oldmetadata, digger) - local meta = minetest.get_meta(pos) - meta:from_table(oldmetadata) - drop_brewing_stand_items(pos, meta) -end]] - -local function on_destruct(pos) - local meta = minetest.get_meta(pos) - drop_brewing_stand_items(pos, meta) -end - -local function allow_take(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - else - return stack:get_count() - end -end - - -minetest.register_node("mcl_brewing:stand_000", { - description = S("Brewing Stand"), - _doc_items_longdesc = S("The stand allows you to brew potions!"), - _doc_items_usagehelp = doc_string, - _tt_help = S("Brew Potions"), - groups = {pickaxey=1, brewitem=1 }, - tiles = tiles, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - drop = "mcl_brewing:stand", - paramtype = "light", - sunlight_propagates = true, - is_ground_content = false, - paramtype2 = "facedir", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - - {-1/16, -5/16, -1/16, 1/16, 8/16, 1/16}, -- heat plume - { 2/16, -8/16, -8/16, 8/16, -6/16, -2/16}, -- base - {-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base - {-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base - - {-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1 - {-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1 - {-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1 - {-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1 - - {5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2 - {4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2 - {3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2 - {2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2 - - {0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3 - {0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3 - {0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3 - } - }, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 1, - _mcl_hardness = 1, - on_destruct = on_destruct, - allow_metadata_inventory_take = allow_take, - allow_metadata_inventory_put = allow_put, - on_metadata_inventory_put = on_put, - on_metadata_inventory_take = on_put, - - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("input", 1) - inv:set_size("fuel", 1) - inv:set_size("stand", 3) - local form = brewing_formspec - meta:set_string("formspec", form) - end, - - on_receive_fields = function(pos, formname, fields, sender) - local sender_name = sender:get_player_name() - if minetest.is_protected(pos, sender_name) then - minetest.record_protection_violation(pos, sender_name) - return - end - end, - - on_timer = brewing_stand_timer, - on_rotate = on_rotate, -}) -minetest.register_node("mcl_brewing:stand_100", { - description = S("Brewing Stand"), - _doc_items_create_entry = false, - _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, - tiles = tiles, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - drop = "mcl_brewing:stand", - paramtype = "light", - sunlight_propagates = true, - is_ground_content = false, - paramtype2 = "facedir", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - - {-1/16, -5/16, -1/16, 1/16, 8/16, 1/16}, -- heat plume - { 2/16, -8/16, -8/16, 8/16, -6/16, -2/16}, -- base - {-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base - {-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base - - {-7/16, -6/16 ,-7/16 , -6/16, 1/16, -6/16 }, -- bottle 1 - {-6/16, -6/16 ,-6/16 , -5/16, 3/16, -5/16 }, -- bottle 1 - {-5/16, -6/16 ,-5/16 , -4/16, 3/16, -4/16 }, -- bottle 1 - {-4/16, -6/16 ,-4/16 , -3/16, 3/16, -3/16 }, -- bottle 1 - {-3/16, -6/16 ,-3/16 , -2/16, 1/16, -2/16 }, -- bottle 1 - - {-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1 - {-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1 - {-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1 - {-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1 - - {5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2 - {4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2 - {3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2 - {2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2 - - {0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3 - {0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3 - {0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3 - } - }, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 1, - _mcl_hardness = 1, - on_destruct = on_destruct, - allow_metadata_inventory_take = allow_take, - allow_metadata_inventory_put = allow_put, - on_metadata_inventory_put = on_put, - on_metadata_inventory_take = on_put, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("input", 1) - inv:set_size("fuel", 1) - inv:set_size("stand", 3) - local form = brewing_formspec - meta:set_string("formspec", form) - end, - on_receive_fields = function(pos, formname, fields, sender) - local sender_name = sender:get_player_name() - if minetest.is_protected(pos, sender_name) then - minetest.record_protection_violation(pos, sender_name) - return - end - end, - on_timer = brewing_stand_timer, - on_rotate = on_rotate, -}) - -minetest.register_node("mcl_brewing:stand_010", { - description = S("Brewing Stand"), - _doc_items_create_entry = false, - _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, - tiles = tiles, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - drop = "mcl_brewing:stand", - paramtype = "light", - sunlight_propagates = true, - is_ground_content = false, - paramtype2 = "facedir", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - - {-1/16, -5/16, -1/16, 1/16, 8/16, 1/16}, -- heat plume - { 2/16, -8/16, -8/16, 8/16, -6/16, -2/16}, -- base - {-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base - {-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base - - {-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1 - {-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1 - {-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1 - {-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1 - - - {7/16, -6/16 ,-7/16 , 6/16, 1/16, -6/16 }, -- bottle 2 - {6/16, -6/16 ,-6/16 , 5/16, 3/16, -5/16 }, -- bottle 2 - {5/16, -6/16 ,-5/16 , 4/16, 3/16, -4/16 }, -- bottle 2 - {4/16, -6/16 ,-4/16 , 3/16, 3/16, -3/16 }, -- bottle 2 - {3/16, -6/16 ,-3/16 , 2/16, 1/16, -2/16 }, -- bottle 2 - - {5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2 - {4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2 - {3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2 - {2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2 - - {0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3 - {0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3 - {0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3 - } - }, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 1, - _mcl_hardness = 1, - on_destruct = on_destruct, - allow_metadata_inventory_take = allow_take, - allow_metadata_inventory_put = allow_put, - on_metadata_inventory_put = on_put, - on_metadata_inventory_take = on_put, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("input", 1) - inv:set_size("fuel", 1) - inv:set_size("stand", 3) - local form = brewing_formspec - meta:set_string("formspec", form) - end, - on_receive_fields = function(pos, formname, fields, sender) - local sender_name = sender:get_player_name() - if minetest.is_protected(pos, sender_name) then - minetest.record_protection_violation(pos, sender_name) - return - end - end, - on_timer = brewing_stand_timer, - on_rotate = on_rotate, -}) - -minetest.register_node("mcl_brewing:stand_001", { - description = S("Brewing Stand"), - _doc_items_create_entry = false, - _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, - tiles = tiles, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - drop = "mcl_brewing:stand", - paramtype = "light", - sunlight_propagates = true, - is_ground_content = false, - paramtype2 = "facedir", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/16, -5/16, -1/16, 1/16, 8/16, 1/16}, -- heat plume - { 2/16, -8/16, -8/16, 8/16, -6/16, -2/16}, -- base - {-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base - {-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base - - {-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1 - {-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1 - {-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1 - {-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1 - - {5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2 - {4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2 - {3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2 - {2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2 - - {0/16, -6/16 , 2/16 , 1/16, 1/16, 7/16 }, -- bottle 3 - {0/16, 1/16 , 3/16 , 1/16, 3/16, 6/16 }, -- bottle 3 - - {0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3 - {0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3 - {0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3 - } - }, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 1, - _mcl_hardness = 1, - on_destruct = on_destruct, - allow_metadata_inventory_take = allow_take, - allow_metadata_inventory_put = allow_put, - on_metadata_inventory_put = on_put, - on_metadata_inventory_take = on_put, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("input", 1) - inv:set_size("fuel", 1) - inv:set_size("stand", 3) - local form = brewing_formspec - meta:set_string("formspec", form) - end, - on_receive_fields = function(pos, formname, fields, sender) - local sender_name = sender:get_player_name() - if minetest.is_protected(pos, sender_name) then - minetest.record_protection_violation(pos, sender_name) - return - end - end, - on_timer = brewing_stand_timer, - on_rotate = on_rotate, -}) - -minetest.register_node("mcl_brewing:stand_110", { - description = S("Brewing Stand"), - _doc_items_create_entry = false, - _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, - tiles = tiles, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - drop = "mcl_brewing:stand", - paramtype = "light", - sunlight_propagates = true, - is_ground_content = false, - paramtype2 = "facedir", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/16, -5/16, -1/16, 1/16, 8/16, 1/16}, -- heat plume - { 2/16, -8/16, -8/16, 8/16, -6/16, -2/16}, -- base - {-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base - {-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base - - {-7/16, -6/16 ,-7/16 , -6/16, 1/16, -6/16 }, -- bottle 1 - {-6/16, -6/16 ,-6/16 , -5/16, 3/16, -5/16 }, -- bottle 1 - {-5/16, -6/16 ,-5/16 , -4/16, 3/16, -4/16 }, -- bottle 1 - {-4/16, -6/16 ,-4/16 , -3/16, 3/16, -3/16 }, -- bottle 1 - {-3/16, -6/16 ,-3/16 , -2/16, 1/16, -2/16 }, -- bottle 1 - - {-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1 - {-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1 - {-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1 - {-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1 - - - {7/16, -6/16 ,-7/16 , 6/16, 1/16, -6/16 }, -- bottle 2 - {6/16, -6/16 ,-6/16 , 5/16, 3/16, -5/16 }, -- bottle 2 - {5/16, -6/16 ,-5/16 , 4/16, 3/16, -4/16 }, -- bottle 2 - {4/16, -6/16 ,-4/16 , 3/16, 3/16, -3/16 }, -- bottle 2 - {3/16, -6/16 ,-3/16 , 2/16, 1/16, -2/16 }, -- bottle 2 - - {5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2 - {4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2 - {3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2 - {2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2 - - {0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3 - {0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3 - {0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3 - } - }, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 1, - _mcl_hardness = 1, - on_destruct = on_destruct, - allow_metadata_inventory_take = allow_take, - allow_metadata_inventory_put = allow_put, - on_metadata_inventory_put = on_put, - on_metadata_inventory_take = on_put, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("input", 1) - inv:set_size("fuel", 1) - inv:set_size("stand", 3) - local form = brewing_formspec - meta:set_string("formspec", form) - end, - on_receive_fields = function(pos, formname, fields, sender) - local sender_name = sender:get_player_name() - if minetest.is_protected(pos, sender_name) then - minetest.record_protection_violation(pos, sender_name) - return - end - end, - on_timer = brewing_stand_timer, - on_rotate = on_rotate, -}) - -minetest.register_node("mcl_brewing:stand_101", { - description = S("Brewing Stand"), - _doc_items_create_entry = false, - _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, - tiles = tiles, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - drop = "mcl_brewing:stand", - paramtype = "light", - sunlight_propagates = true, - is_ground_content = false, - paramtype2 = "facedir", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/16, -5/16, -1/16, 1/16, 8/16, 1/16}, -- heat plume - { 2/16, -8/16, -8/16, 8/16, -6/16, -2/16}, -- base - {-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base - {-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base - - {-7/16, -6/16 ,-7/16 , -6/16, 1/16, -6/16 }, -- bottle 1 - {-6/16, -6/16 ,-6/16 , -5/16, 3/16, -5/16 }, -- bottle 1 - {-5/16, -6/16 ,-5/16 , -4/16, 3/16, -4/16 }, -- bottle 1 - {-4/16, -6/16 ,-4/16 , -3/16, 3/16, -3/16 }, -- bottle 1 - {-3/16, -6/16 ,-3/16 , -2/16, 1/16, -2/16 }, -- bottle 1 - - {-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1 - {-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1 - {-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1 - {-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1 - - {5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2 - {4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2 - {3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2 - {2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2 - - {0/16, -6/16 , 2/16 , 1/16, 1/16, 7/16 }, -- bottle 3 - {0/16, 1/16 , 3/16 , 1/16, 3/16, 6/16 }, -- bottle 3 - - {0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3 - {0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3 - {0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3 - } - }, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 1, - _mcl_hardness = 1, - on_destruct = on_destruct, - allow_metadata_inventory_take = allow_take, - allow_metadata_inventory_put = allow_put, - on_metadata_inventory_put = on_put, - on_metadata_inventory_take = on_put, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("input", 1) - inv:set_size("fuel", 1) - inv:set_size("stand", 3) - local form = brewing_formspec - meta:set_string("formspec", form) - end, - on_receive_fields = function(pos, formname, fields, sender) - local sender_name = sender:get_player_name() - if minetest.is_protected(pos, sender_name) then - minetest.record_protection_violation(pos, sender_name) - return - end - end, - on_timer = brewing_stand_timer, - on_rotate = on_rotate, -}) - -minetest.register_node("mcl_brewing:stand_011", { - description = S("Brewing Stand"), - _doc_items_create_entry = false, - _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, - tiles = tiles, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - drop = "mcl_brewing:stand", - paramtype = "light", - sunlight_propagates = true, - is_ground_content = false, - paramtype2 = "facedir", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/16, -5/16, -1/16, 1/16, 8/16, 1/16}, -- heat plume - { 2/16, -8/16, -8/16, 8/16, -6/16, -2/16}, -- base - {-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base - {-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base - - {-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1 - {-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1 - {-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1 - {-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1 - - {7/16, -6/16 ,-7/16 , 6/16, 1/16, -6/16 }, -- bottle 2 - {6/16, -6/16 ,-6/16 , 5/16, 3/16, -5/16 }, -- bottle 2 - {5/16, -6/16 ,-5/16 , 4/16, 3/16, -4/16 }, -- bottle 2 - {4/16, -6/16 ,-4/16 , 3/16, 3/16, -3/16 }, -- bottle 2 - {3/16, -6/16 ,-3/16 , 2/16, 1/16, -2/16 }, -- bottle 2 - - {5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2 - {4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2 - {3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2 - {2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2 - - {0/16, -6/16 , 2/16 , 1/16, 1/16, 7/16 }, -- bottle 3 - {0/16, 1/16 , 3/16 , 1/16, 3/16, 6/16 }, -- bottle 3 - - {0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3 - {0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3 - {0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3 - } - }, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 1, - _mcl_hardness = 1, - on_destruct = on_destruct, - allow_metadata_inventory_take = allow_take, - allow_metadata_inventory_put = allow_put, - on_metadata_inventory_put = on_put, - on_metadata_inventory_take = on_put, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("input", 1) - inv:set_size("fuel", 1) - inv:set_size("stand", 3) - local form = brewing_formspec - meta:set_string("formspec", form) - end, - on_receive_fields = function(pos, formname, fields, sender) - local sender_name = sender:get_player_name() - if minetest.is_protected(pos, sender_name) then - minetest.record_protection_violation(pos, sender_name) - return - end - end, - on_timer = brewing_stand_timer, - on_rotate = on_rotate, -}) - -minetest.register_node("mcl_brewing:stand_111", { - description = S("Brewing Stand"), - _doc_items_create_entry = false, - _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, - tiles = tiles, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - drop = "mcl_brewing:stand", - paramtype = "light", - sunlight_propagates = true, - is_ground_content = false, - paramtype2 = "facedir", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/16, -5/16, -1/16, 1/16, 8/16, 1/16}, -- heat plume - { 2/16, -8/16, -8/16, 8/16, -6/16, -2/16}, -- base - {-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base - {-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base - - {-7/16, -6/16 ,-7/16 , -6/16, 1/16, -6/16 }, -- bottle 1 - {-6/16, -6/16 ,-6/16 , -5/16, 3/16, -5/16 }, -- bottle 1 - {-5/16, -6/16 ,-5/16 , -4/16, 3/16, -4/16 }, -- bottle 1 - {-4/16, -6/16 ,-4/16 , -3/16, 3/16, -3/16 }, -- bottle 1 - {-3/16, -6/16 ,-3/16 , -2/16, 1/16, -2/16 }, -- bottle 1 - - {-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1 - {-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1 - {-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1 - {-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1 - - - {7/16, -6/16 ,-7/16 , 6/16, 1/16, -6/16 }, -- bottle 2 - {6/16, -6/16 ,-6/16 , 5/16, 3/16, -5/16 }, -- bottle 2 - {5/16, -6/16 ,-5/16 , 4/16, 3/16, -4/16 }, -- bottle 2 - {4/16, -6/16 ,-4/16 , 3/16, 3/16, -3/16 }, -- bottle 2 - {3/16, -6/16 ,-3/16 , 2/16, 1/16, -2/16 }, -- bottle 2 - - {5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2 - {4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2 - {3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2 - {2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2 - - {0/16, -6/16 , 2/16 , 1/16, 1/16, 7/16 }, -- bottle 3 - {0/16, 1/16 , 3/16 , 1/16, 3/16, 6/16 }, -- bottle 3 - - {0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3 - {0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3 - {0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3 - } - }, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 1, - _mcl_hardness = 1, - on_destruct = on_destruct, - allow_metadata_inventory_take = allow_take, - allow_metadata_inventory_put = allow_put, - on_metadata_inventory_put = on_put, - on_metadata_inventory_take = on_put, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("input", 1) - inv:set_size("fuel", 1) - inv:set_size("stand", 3) - local form = brewing_formspec - meta:set_string("formspec", form) - end, - on_receive_fields = function(pos, formname, fields, sender) - local sender_name = sender:get_player_name() - if minetest.is_protected(pos, sender_name) then - minetest.record_protection_violation(pos, sender_name) - return - end - end, - on_timer = brewing_stand_timer, - on_rotate = on_rotate, -}) - -minetest.register_craft({ - output = "mcl_brewing:stand_000", - recipe = { - { "", "mcl_mobitems:blaze_rod", "" }, - { "group:cobble", "group:cobble", "group:cobble" }, - } -}) - -minetest.register_alias("mcl_brewing:stand", "mcl_brewing:stand_000") - -if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_brewing:stand_000", "nodes", "mcl_brewing:stand_001") - doc.add_entry_alias("nodes", "mcl_brewing:stand_000", "nodes", "mcl_brewing:stand_010") - doc.add_entry_alias("nodes", "mcl_brewing:stand_000", "nodes", "mcl_brewing:stand_011") - doc.add_entry_alias("nodes", "mcl_brewing:stand_000", "nodes", "mcl_brewing:stand_100") - doc.add_entry_alias("nodes", "mcl_brewing:stand_000", "nodes", "mcl_brewing:stand_101") - doc.add_entry_alias("nodes", "mcl_brewing:stand_000", "nodes", "mcl_brewing:stand_110") - doc.add_entry_alias("nodes", "mcl_brewing:stand_000", "nodes", "mcl_brewing:stand_111") -end - -if minetest.get_modpath("mesecons_mvps") then - for _, s in ipairs({"000", "001", "010", "011", "100", "101", "110", "111"}) do - mesecon.register_mvps_stopper("mcl_brewing:stand_" .. s) - end -end diff --git a/mods/ITEMS/mcl_brewing/locale/mcl_brewing.de.tr b/mods/ITEMS/mcl_brewing/locale/mcl_brewing.de.tr deleted file mode 100644 index fb127c914d..0000000000 --- a/mods/ITEMS/mcl_brewing/locale/mcl_brewing.de.tr +++ /dev/null @@ -1,10 +0,0 @@ -# textdomain: mcl_brewing -Brewing Stand=Braustand -Inventory=Inventar -To use a brewing stand, rightclick it.=Um einen Braustand zu benutzen, rechtsklicken Sie ihn. -To brew, you need blaze powder as fuel, a brewing material and at least 1 glass bottle filled with a liquid.=Zum Brauen benötigt man Lohenstaub als Brennstoff, ein Braumaterial und mindestens 1 Glasflasche, die mit einer Flüssigkeit gefüllt ist. -Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.=Platzieren Sie den Lohenstaub in den linken Plartz, das Braumaterial in den mittleren Platz und 1-3 Glasflaschen in die übrigen Plätze. -When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.=Wenn Sie eine gute Kombination gefunden haben, beginnt der Brauvorgang automatisch, und es entsteht Dampf. Der Brennstoff und das Brühmaterial wird aufbraucht. Die Tränke werden bald fertig sein. -Different combinations of brewing materials and liquids will give different results. Try to experiment!=Unterschiedliche Kombinationen von Braumaterialien und Flüssigkeiten werden zu unterschiedlichen Ergebnissen führen. Experimentieren Sie! -The stand allows you to brew potions!=Der Stand ermöglicht das Brauen von Tränken. -Brew Potions=Tränke brauen diff --git a/mods/ITEMS/mcl_brewing/locale/mcl_brewing.fr.tr b/mods/ITEMS/mcl_brewing/locale/mcl_brewing.fr.tr deleted file mode 100644 index 232026fbaa..0000000000 --- a/mods/ITEMS/mcl_brewing/locale/mcl_brewing.fr.tr +++ /dev/null @@ -1,10 +0,0 @@ -# textdomain: mcl_brewing -Brewing Stand=Alambic -Inventory=Inventaire -To use a brewing stand, rightclick it.=Pour utiliser un alambic, faites un clic droit dessus. -To brew, you need blaze powder as fuel, a brewing material and at least 1 glass bottle filled with a liquid.=Pour distiller, vous avez besoin de poudre de blaze comme carburant, d'un ingrédient à distiller et d'au moins 1 bouteille en verre remplie d'un liquide. -Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.=Placez la poudre de blaze dans l'emplacement de gauche, l'ingrédient à distiller dans l'emplacement du milieu et 1 à 3 bouteilles dans les emplacements restantes. -When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.=Lorsque vous avez trouvé une bonne combinaison, la distillation commencera automatiquement et de la vapeur commencera à apparaître, consommant le carburant et l'ingrédient à distiller. Les potions seront bientôt prêtes. -Different combinations of brewing materials and liquids will give different results. Try to experiment!=Différentes combinaisons d'ingrédients et de liquides donneront des résultats différents. Essayez d'expérimenter! -The stand allows you to brew potions!=L'alambic permet de produire des potions! -Brew Potions=Potions diff --git a/mods/ITEMS/mcl_brewing/locale/mcl_brewing.pl.tr b/mods/ITEMS/mcl_brewing/locale/mcl_brewing.pl.tr deleted file mode 100644 index cdcc1f8870..0000000000 --- a/mods/ITEMS/mcl_brewing/locale/mcl_brewing.pl.tr +++ /dev/null @@ -1,10 +0,0 @@ -# textdomain: mcl_brewing -Brewing Stand=Statyw alchemiczny -Inventory=Ekwipunek -To use a brewing stand, rightclick it.=Aby użyć statywu alchemicznego kliknij go prawym przyciskiem myszy. -To brew, you need blaze powder as fuel, a brewing material and at least 1 glass bottle filled with a liquid.=Aby warzyć mikstury potrzebujesz płomiennego proszku, materiału do warzenia i przynajmniej jedną butelkę wypełnioną płynem. -Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.=Wstaw płomienny proszek po lewej, materiał do warzenia w środku i 1-3 butelek w pozostałych. -When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.=Kiedy znajdziesz odpowiednią kombinację, warzenie rozpocznie się automatycznie, pojawi się para, a paliwo i materiał zaczną się zużywać. Mikstury wkrótce będą gotowe. -Different combinations of brewing materials and liquids will give different results. Try to experiment!=Różne kombinacje materiałów i płynów dadzą inne rezultaty. Spróbuj poeksperymentować! -The stand allows you to brew potions!=Statyw pozwala na warzenie mikstur! -Brew Potions=Uwarz mikstury. diff --git a/mods/ITEMS/mcl_brewing/locale/mcl_brewing.ru.tr b/mods/ITEMS/mcl_brewing/locale/mcl_brewing.ru.tr deleted file mode 100644 index 37b96819d9..0000000000 --- a/mods/ITEMS/mcl_brewing/locale/mcl_brewing.ru.tr +++ /dev/null @@ -1,10 +0,0 @@ -# textdomain: mcl_brewing -Brewing Stand=Варочный стенд -Inventory=Инвентарь -To use a brewing stand, rightclick it.=Кликните правой, чтобы использовать варочный стенд. -To brew, you need blaze powder as fuel, a brewing material and at least 1 glass bottle filled with a liquid.=Для приготовления зелья вам понадобится огненный порошок в качестве топлива, исходный материал и как минимум 1 стеклянная бутылка, наполненная жидкостью. -Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.=Поместите огненный порошок в левый отсек, исходный материал в средний отсек и 1-3 бутылки в оставшиеся отсеки. -When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.=Когда вы подберёте хорошее сочетание, приготовление зелья начнётся автоматически — появится пар и начнётся расход топлива и исходного материала. Зелья вскоре будут готовы. -Different combinations of brewing materials and liquids will give different results. Try to experiment!=Разные сочетания варочных материалов и жидкостей будут давать разные результаты. Поэкспериментируйте! -The stand allows you to brew potions!=Стенд позволяет вам варить зелья! -Brew Potions=Зельеварение diff --git a/mods/ITEMS/mcl_brewing/locale/mcl_brewing.zh_TW.tr b/mods/ITEMS/mcl_brewing/locale/mcl_brewing.zh_TW.tr deleted file mode 100644 index da4b70890a..0000000000 --- a/mods/ITEMS/mcl_brewing/locale/mcl_brewing.zh_TW.tr +++ /dev/null @@ -1,10 +0,0 @@ -# textdomain: mcl_brewing -Brewing Stand=釀造台 -Inventory=物品欄 -To use a brewing stand, rightclick it.=右鍵點擊以使用釀造台。 -To brew, you need blaze powder as fuel, a brewing material and at least 1 glass bottle filled with a liquid.=釀造時,你需要烈焰粉作為燃料,一個釀造材料和至少1個裝滿液體的玻璃瓶。 -Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.=將烈焰粉放在左邊的槽中,將釀造材料放在中間的槽中,將1-3個瓶子放在其餘的槽中。 -When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.=當你找到一個好的組合時,釀造將自動開始,並開始出現蒸汽,耗盡燃料和釀造材料。藥水很快就會準備好。 -Different combinations of brewing materials and liquids will give different results. Try to experiment!=釀造材料和液體的不同組合會產生不同的結果。試著去實驗吧! -The stand allows you to brew potions!=釀造台可以讓你釀製藥水! -Brew Potions=釀造藥水 diff --git a/mods/ITEMS/mcl_brewing/locale/template.txt b/mods/ITEMS/mcl_brewing/locale/template.txt deleted file mode 100644 index e5619f1e10..0000000000 --- a/mods/ITEMS/mcl_brewing/locale/template.txt +++ /dev/null @@ -1,10 +0,0 @@ -# textdomain: mcl_brewing -Brewing Stand= -Inventory= -To use a brewing stand, rightclick it.= -To brew, you need blaze powder as fuel, a brewing material and at least 1 glass bottle filled with a liquid.= -Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.= -When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.= -Different combinations of brewing materials and liquids will give different results. Try to experiment!= -The stand allows you to brew potions!= -Brew Potions= diff --git a/mods/ITEMS/mcl_brewing/mod.conf b/mods/ITEMS/mcl_brewing/mod.conf deleted file mode 100644 index 0f6217f098..0000000000 --- a/mods/ITEMS/mcl_brewing/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = mcl_brewing -author = bzoss -depends = mcl_init, mcl_formspec, mcl_sounds, mcl_potions, mcl_mobitems -optional_depends = mcl_core, doc, screwdriver, mesecons_mvps diff --git a/mods/ITEMS/mcl_brewing/sounds/mcl_brewing_complete.ogg b/mods/ITEMS/mcl_brewing/sounds/mcl_brewing_complete.ogg deleted file mode 100644 index 1798cb2730..0000000000 Binary files a/mods/ITEMS/mcl_brewing/sounds/mcl_brewing_complete.ogg and /dev/null differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_base.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_base.png deleted file mode 100644 index 8831ffb9b5..0000000000 Binary files a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_base.png and /dev/null differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bottle_bg.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bottle_bg.png deleted file mode 100644 index c0c4fd2be1..0000000000 Binary files a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bottle_bg.png and /dev/null differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bubble_sprite.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bubble_sprite.png deleted file mode 100644 index 74447439e4..0000000000 Binary files a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bubble_sprite.png and /dev/null differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bubbles.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bubbles.png deleted file mode 100644 index 780352408f..0000000000 Binary files a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bubbles.png and /dev/null differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bubbles_active.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bubbles_active.png deleted file mode 100644 index 2a367807ac..0000000000 Binary files a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bubbles_active.png and /dev/null differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_burner.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_burner.png deleted file mode 100644 index e2e8e8afeb..0000000000 Binary files a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_burner.png and /dev/null differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_burner_active.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_burner_active.png deleted file mode 100644 index 93655b6732..0000000000 Binary files a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_burner_active.png and /dev/null differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_fuel_bg.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_fuel_bg.png deleted file mode 100644 index fd730958af..0000000000 Binary files a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_fuel_bg.png and /dev/null differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_inventory.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_inventory.png deleted file mode 100644 index 0ed2f4029f..0000000000 Binary files a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_inventory.png and /dev/null differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_potion_bg.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_potion_bg.png deleted file mode 100644 index 818e41d4b8..0000000000 Binary files a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_potion_bg.png and /dev/null differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_side.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_side.png deleted file mode 100644 index 057a405e0b..0000000000 Binary files a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_side.png and /dev/null differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_top.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_top.png deleted file mode 100644 index 81e000053d..0000000000 Binary files a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_cake/init.lua b/mods/ITEMS/mcl_cake/init.lua deleted file mode 100644 index 1b0824e773..0000000000 --- a/mods/ITEMS/mcl_cake/init.lua +++ /dev/null @@ -1,156 +0,0 @@ ---[[ -#!#!#!#Cake mod created by Jordan4ibanez#!#!# -#!#!#!#Released under CC Attribution-ShareAlike 3.0 Unported #!#!# -]]-- - -local CAKE_HUNGER_POINTS = 2 - -local S = minetest.get_translator(minetest.get_current_modname()) - -local cake_texture = {"cake_top.png","cake_bottom.png","cake_inner.png","cake_side.png","cake_side.png","cake_side.png"} -local slice_1 = { -7/16, -8/16, -7/16, -5/16, 0/16, 7/16} -local slice_2 = { -7/16, -8/16, -7/16, -3/16, 0/16, 7/16} -local slice_3 = { -7/16, -8/16, -7/16, -1/16, 0/16, 7/16} -local slice_4 = { -7/16, -8/16, -7/16, 1/16, 0/16, 7/16} -local slice_5 = { -7/16, -8/16, -7/16, 3/16, 0/16, 7/16} -local slice_6 = { -7/16, -8/16, -7/16, 5/16, 0/16, 7/16} - -local full_cake = { -7/16, -8/16, -7/16, 7/16, 0/16, 7/16} - -minetest.register_craft({ - output = "mcl_cake:cake", - recipe = { - {"mcl_mobitems:milk_bucket", "mcl_mobitems:milk_bucket", "mcl_mobitems:milk_bucket"}, - {"mcl_core:sugar", "mcl_throwing:egg", "mcl_core:sugar"}, - {"mcl_farming:wheat_item", "mcl_farming:wheat_item", "mcl_farming:wheat_item"}, - }, - replacements = { - {"mcl_mobitems:milk_bucket", "mcl_buckets:bucket_empty"}, - {"mcl_mobitems:milk_bucket", "mcl_buckets:bucket_empty"}, - {"mcl_mobitems:milk_bucket", "mcl_buckets:bucket_empty"}, - }, -}) - -minetest.register_node("mcl_cake:cake", { - description = S("Cake"), - _tt_help = S("With 7 tasty slices!").."\n"..S("Hunger points: +@1 per slice", CAKE_HUNGER_POINTS), - _doc_items_longdesc = S("Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken."), - _doc_items_usagehelp = S("Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full."), - tiles = {"cake_top.png","cake_bottom.png","cake_side.png","cake_side.png","cake_side.png","cake_side.png"}, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, - inventory_image = "cake.png", - wield_image = "cake.png", - paramtype = "light", - is_ground_content = false, - drawtype = "nodebox", - selection_box = { - type = "fixed", - fixed = full_cake - }, - node_box = { - type = "fixed", - fixed = full_cake - }, - stack_max = 1, - groups = { - handy = 1, attached_node = 1, dig_by_piston = 1, comparator_signal = 14, - cake = 7, food = 2, no_eat_delay = 1, compostability = 100 - }, - drop = "", - on_rightclick = function(pos, node, clicker, itemstack) - -- Cake is subject to protection - local name = clicker:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return - end - local newcake = minetest.do_item_eat(2, ItemStack("mcl_cake:cake_6"), ItemStack("mcl_cake:cake"), clicker, {type="nothing"}) - -- Check if we were allowed to eat - if newcake:get_name() ~= "mcl_cake:cake" or minetest.is_creative_enabled(clicker:get_player_name()) then - minetest.add_node(pos,{type="node",name="mcl_cake:cake_6",param2=0}) - end - end, - sounds = mcl_sounds.node_sound_leaves_defaults(), - - _food_particles = false, - _mcl_saturation = 0.4, - _mcl_blast_resistance = 0.5, - _mcl_hardness = 0.5, -}) - -local register_slice = function(level, nodebox, desc) - local this = "mcl_cake:cake_"..level - local after_eat = "mcl_cake:cake_"..(level-1) - local on_rightclick - if level > 1 then - on_rightclick = function(pos, node, clicker, itemstack) - local name = clicker:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return - end - local newcake = minetest.do_item_eat(CAKE_HUNGER_POINTS, ItemStack(after_eat), ItemStack(this), clicker, {type="nothing"}) - -- Check if we were allowed to eat - if newcake:get_name() ~= this or minetest.is_creative_enabled(clicker:get_player_name()) then - minetest.add_node(pos,{type="node",name=after_eat,param2=0}) - end - end - else - -- Last slice - on_rightclick = function(pos, node, clicker, itemstack) - local name = clicker:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return - end - local newcake = minetest.do_item_eat(CAKE_HUNGER_POINTS, ItemStack("mcl:cake:cake 0"), ItemStack("mcl_cake:cake_1"), clicker, {type="nothing"}) - -- Check if we were allowed to eat - if newcake:get_name() ~= this or minetest.is_creative_enabled(clicker:get_player_name()) then - minetest.remove_node(pos) - minetest.check_for_falling(pos) - end - end - end - - minetest.register_node(this, { - description = desc, - _doc_items_create_entry = false, - tiles = cake_texture, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, - paramtype = "light", - is_ground_content = false, - drawtype = "nodebox", - selection_box = { - type = "fixed", - fixed = nodebox, - }, - node_box = { - type = "fixed", - fixed = nodebox, - }, - groups = { - handy = 1, attached_node = 1, not_in_creative_inventory = 1, - dig_by_piston = 1, cake = level, comparator_signal = level * 2, - food = 2, no_eat_delay = 1 - }, - drop = "", - on_rightclick = on_rightclick, - sounds = mcl_sounds.node_sound_leaves_defaults(), - - _food_particles = false, - _mcl_saturation = 0.4, - _mcl_blast_resistance = 0.5, - _mcl_hardness = 0.5, - }) - - if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_cake:cake", "nodes", "mcl_cake:cake_"..level) - end -end - -register_slice(6, slice_6, S("Cake (6 Slices Left)")) -register_slice(5, slice_5, S("Cake (5 Slices Left)")) -register_slice(4, slice_4, S("Cake (4 Slices Left)")) -register_slice(3, slice_3, S("Cake (3 Slices Left)")) -register_slice(2, slice_2, S("Cake (2 Slices Left)")) -register_slice(1, slice_1, S("Cake (1 Slice Left)")) diff --git a/mods/ITEMS/mcl_cake/locale/mcl_cake.de.tr b/mods/ITEMS/mcl_cake/locale/mcl_cake.de.tr deleted file mode 100644 index f5af4f30a5..0000000000 --- a/mods/ITEMS/mcl_cake/locale/mcl_cake.de.tr +++ /dev/null @@ -1,12 +0,0 @@ -# textdomain: mcl_cake -Cake=Kuchen -Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.=Kuchen können platziert und gegessen werden, um Hungerpunkte wiederherzustellen. Ein Kuchen hat 7 Stücke. Jedes Stück stellt 2 Hungerpunkte und 0,4 Sättigungspunkte wieder her. Kuchen werden zerstört, wenn sie abgebaut werden oder der Block unter ihnen bricht. -Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.=Platzieren Sie ihn irgendwo, dann rechtsklicken Sie auf ihn, um ein Stück zu essen. Sie können nicht vom Kuchen naschen, wenn ihre Hungerleiste voll ist. -Cake (6 Slices Left)=Kuchen (6 Stücke übrig) -Cake (5 Slices Left)=Kuchen (5 Stücke übrig) -Cake (4 Slices Left)=Kuchen (4 Stücke übrig) -Cake (3 Slices Left)=Kuchen (3 Stücke übrig) -Cake (2 Slices Left)=Kuchen (2 Stücke übrig) -Cake (1 Slice Left)=Kuchen (1 Stück übrig) -With 7 tasty slices!=Mit 7 leckeren Stücken! -Hunger points: +@1 per slice=Hungerpunkte: +@1 pro Stück diff --git a/mods/ITEMS/mcl_cake/locale/mcl_cake.es.tr b/mods/ITEMS/mcl_cake/locale/mcl_cake.es.tr deleted file mode 100644 index 261d581e10..0000000000 --- a/mods/ITEMS/mcl_cake/locale/mcl_cake.es.tr +++ /dev/null @@ -1,10 +0,0 @@ -# textdomain: mcl_cake -Cake=Tarta -Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.=Los pasteles se pueden colocar y comer para restaurar los puntos de hambre. Un pastel tiene 7 trozos. Cada trozo restaura 2 puntos de hambre y 0.4 puntos de saturación. Los pasteles se destruirán cuando se caven o cuando se rompa el bloque debajo de ellos. -Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.=Coloque el pastel en cualquier lugar, luego haga clic derecho para comer una sola trozo. No puedes comer del pastel cuando tu barra de hambre está llena. -Cake (6 Slices Left)=Tarta (Quedan 6 trozos) -Cake (5 Slices Left)=Tarta (Quedan 5 trozos) -Cake (4 Slices Left)=Tarta (Quedan 4 trozos) -Cake (3 Slices Left)=Tarta (Quedan 3 trozos) -Cake (2 Slices Left)=Tarta (Quedan 2 trozos) -Cake (1 Slice Left)=Tarta (Queda 1 trozo) diff --git a/mods/ITEMS/mcl_cake/locale/mcl_cake.fr.tr b/mods/ITEMS/mcl_cake/locale/mcl_cake.fr.tr deleted file mode 100644 index 06e3b7ceb0..0000000000 --- a/mods/ITEMS/mcl_cake/locale/mcl_cake.fr.tr +++ /dev/null @@ -1,12 +0,0 @@ -# textdomain: mcl_cake -Cake=Gâteau -Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.=Les gâteaux peuvent être placés et mangés pour restaurer les points de faim. Un gâteau a 7 tranches. Chaque tranche restaure 2 points de faim et 0,4 points de saturation. Les gâteaux seront détruits lorsqu'ils seront creusés ou lorsque le bloc en dessous d'eux sera brisé. -Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.=Placez le gâteau n'importe où, puis faites un clic droit pour manger une seule tranche. Vous ne pouvez pas manger du gâteau lorsque votre barre de faim est pleine. -Cake (6 Slices Left)=Gâteau (reste 6 tranches) -Cake (5 Slices Left)=Gâteau (reste 5 tranches) -Cake (4 Slices Left)=Gâteau (reste 4 tranches) -Cake (3 Slices Left)=Gâteau (reste 3 tranches) -Cake (2 Slices Left)=Gâteau (reste 2 tranches) -Cake (1 Slice Left)=Gâteau (reste 1 tranche) -With 7 tasty slices!=Avec 7 tranches savoureuses! -Hunger points: +@1 per slice=Points de faim: +@1 par tranche diff --git a/mods/ITEMS/mcl_cake/locale/mcl_cake.pl.tr b/mods/ITEMS/mcl_cake/locale/mcl_cake.pl.tr deleted file mode 100644 index f90e665e76..0000000000 --- a/mods/ITEMS/mcl_cake/locale/mcl_cake.pl.tr +++ /dev/null @@ -1,12 +0,0 @@ -# textdomain: mcl_cake -Cake=Ciasto -Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.=Ciasto może być postawione i zjedzone by odzyskać punkty głodu. Ciasto ma 7 kawałków. Każdy kawałek przywraca dwa punkty głodu i 0.4 punktu nasycenia. Ciasta zostaną zniszczone przy próbie wykopania, lub gdy blok pod nimi zostanie zniszczony. -Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.=Postaw ciasto gdziekolwiek, następnie kliknij prawym by zjeść pojedynczy kawałek. Nie możesz jeść ciasta gdy twój pasek głodu jest pełny. -Cake (6 Slices Left)=Ciasto (pozostały 6 kawałki) -Cake (5 Slices Left)=Ciasto (pozostały 5 kawałki) -Cake (4 Slices Left)=Ciasto (pozostały 4 kawałki) -Cake (3 Slices Left)=Ciasto (pozostały 3 kawałki) -Cake (2 Slices Left)=Ciasto (pozostały 2 kawałki) -Cake (1 Slice Left)=Ciasto (pozostał 1 kawałek) -With 7 tasty slices!=Z 7 pysznymi kawałkami! -Hunger points: +@1 per slice=Punkty głodu: +@1 za kawałek diff --git a/mods/ITEMS/mcl_cake/locale/mcl_cake.ru.tr b/mods/ITEMS/mcl_cake/locale/mcl_cake.ru.tr deleted file mode 100644 index 50a5b34c13..0000000000 --- a/mods/ITEMS/mcl_cake/locale/mcl_cake.ru.tr +++ /dev/null @@ -1,12 +0,0 @@ -# textdomain: mcl_cake -Cake=Торт -Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.=Торты можно есть, восстанавливая очки голода, а также размещать на других блоках. Торт состоит из 7 кусочков. Каждый кусочек восстанавливает 2 очка голода и 0.4 очка сытости. Торты уничтожаются при выкапывании или разрушении нижестоящего блока. -Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.=Поместите торт куда-нибудь, затем кликните правой, чтобы съесть кусочек. -Cake (6 Slices Left)=Торт (осталось 6 кусочков) -Cake (5 Slices Left)=Торт (осталось 5 кусочков) -Cake (4 Slices Left)=Торт (осталось 4 кусочка) -Cake (3 Slices Left)=Торт (осталось 3 кусочка) -Cake (2 Slices Left)=Торт (осталось 2 кусочка) -Cake (1 Slice Left)=Торт (остался 1 кусочек) -With 7 tasty slices!=Из 7 вкусных кусочков -Hunger points: +@1 per slice=Очки голода: +@1 с каждым куском diff --git a/mods/ITEMS/mcl_cake/locale/mcl_cake.zh_TW.tr b/mods/ITEMS/mcl_cake/locale/mcl_cake.zh_TW.tr deleted file mode 100644 index 702791b495..0000000000 --- a/mods/ITEMS/mcl_cake/locale/mcl_cake.zh_TW.tr +++ /dev/null @@ -1,12 +0,0 @@ -# textdomain: mcl_cake -Cake=蛋糕 -Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.=蛋糕可以被放置和食用,以恢復飢餓值。一個蛋糕有7片。每片可以恢復2個飢餓值和0.4個飽食度。蛋糕在被挖掘或其下面的方塊被打破時將被摧毀。 -Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.=將蛋糕放在任何地方,然後右鍵單擊以吃一小片。 當您的飢餓條已滿時,您不能從蛋糕上吃東西。 -Cake (6 Slices Left)=蛋糕(還剩6片) -Cake (5 Slices Left)=蛋糕(還剩5片) -Cake (4 Slices Left)=蛋糕(還剩4片) -Cake (3 Slices Left)=蛋糕(還剩3片) -Cake (2 Slices Left)=蛋糕(還剩2片) -Cake (1 Slice Left)=蛋糕(還剩1片) -With 7 tasty slices!=有七塊美味的蛋糕! -Hunger points: +@1 per slice=飢餓值:每片 +@1 diff --git a/mods/ITEMS/mcl_cake/locale/template.txt b/mods/ITEMS/mcl_cake/locale/template.txt deleted file mode 100644 index 080e73955a..0000000000 --- a/mods/ITEMS/mcl_cake/locale/template.txt +++ /dev/null @@ -1,12 +0,0 @@ -# textdomain: mcl_cake -Cake= -Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.= -Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.= -Cake (6 Slices Left)= -Cake (5 Slices Left)= -Cake (4 Slices Left)= -Cake (3 Slices Left)= -Cake (2 Slices Left)= -Cake (1 Slice Left)= -With 7 tasty slices!= -Hunger points: +@1 per slice= diff --git a/mods/ITEMS/mcl_cake/mod.conf b/mods/ITEMS/mcl_cake/mod.conf deleted file mode 100644 index e7260468ec..0000000000 --- a/mods/ITEMS/mcl_cake/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = mcl_cake -description = Add cakes to mcl -depends = mcl_core, mcl_sounds, mcl_hunger, mcl_buckets, mcl_farming, mcl_mobitems -optional_depends = doc diff --git a/mods/ITEMS/mcl_cake/textures/cake.png b/mods/ITEMS/mcl_cake/textures/cake.png deleted file mode 100644 index 736faa6db2..0000000000 Binary files a/mods/ITEMS/mcl_cake/textures/cake.png and /dev/null differ diff --git a/mods/ITEMS/mcl_cake/textures/cake_bottom.png b/mods/ITEMS/mcl_cake/textures/cake_bottom.png deleted file mode 100644 index d64db7f7d0..0000000000 Binary files a/mods/ITEMS/mcl_cake/textures/cake_bottom.png and /dev/null differ diff --git a/mods/ITEMS/mcl_cake/textures/cake_inner.png b/mods/ITEMS/mcl_cake/textures/cake_inner.png deleted file mode 100644 index 18c37959f4..0000000000 Binary files a/mods/ITEMS/mcl_cake/textures/cake_inner.png and /dev/null differ diff --git a/mods/ITEMS/mcl_cake/textures/cake_side.png b/mods/ITEMS/mcl_cake/textures/cake_side.png deleted file mode 100644 index 3d4643e419..0000000000 Binary files a/mods/ITEMS/mcl_cake/textures/cake_side.png and /dev/null differ diff --git a/mods/ITEMS/mcl_cake/textures/cake_top.png b/mods/ITEMS/mcl_cake/textures/cake_top.png deleted file mode 100644 index 576c3fe8c9..0000000000 Binary files a/mods/ITEMS/mcl_cake/textures/cake_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/init.lua b/mods/ITEMS/mcl_colorblocks/init.lua deleted file mode 100644 index 6eec8a9df9..0000000000 --- a/mods/ITEMS/mcl_colorblocks/init.lua +++ /dev/null @@ -1,227 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) -local doc_mod = minetest.get_modpath("doc") - -local block = {} - -block.dyes = { - {"white", S("White Terracotta"), S("White Glazed Terracotta"), S("White Concrete Powder"), S("White Concrete"), "white"}, - {"grey", S("Grey Terracotta"), S("Grey Glazed Terracotta"), S("Grey Concrete Powder"), S("Grey Concrete"), "dark_grey"}, - {"silver", S("Light Grey Terracotta"), S("Light Grey Glazed Terracotta"), S("Light Grey Concrete Powder"), S("Light Grey Concrete"), "grey"}, - {"black", S("Black Terracotta"), S("Black Glazed Terracotta"), S("Black Concrete Powder"), S("Black Concrete"), "black"}, - {"red", S("Red Terracotta"), S("Red Glazed Terracotta"), S("Red Concrete Powder"), S("Red Concrete"), "red"}, - {"yellow", S("Yellow Terracotta"), S("Yellow Glazed Terracotta"), S("Yellow Concrete Powder"), S("Yellow Concrete"), "yellow"}, - {"green", S("Green Terracotta"), S("Green Glazed Terracotta"), S("Green Concrete Powder"), S("Green Concrete"), "dark_green"}, - {"cyan", S("Cyan Terracotta"), S("Cyan Glazed Terracotta"), S("Cyan Concrete Powder"), S("Cyan Concrete"), "cyan"}, - {"blue", S("Blue Terracotta"), S("Blue Glazed Terracotta"), S("Blue Concrete Powder"), S("Blue Concrete"), "blue"}, - {"magenta", S("Magenta Terracotta"), S("Magenta Glazed Terracotta"), S("Magenta Concrete Powder"), S("Magenta Concrete"), "magenta"}, - {"orange", S("Orange Terracotta"), S("Orange Glazed Terracotta"), S("Orange Concrete Powder"), S("Orange Concrete"), "orange"}, - {"purple", S("Purple Terracotta"), S("Purple Glazed Terracotta"), S("Purple Concrete Powder"), S("Purple Concrete"), "violet"}, - {"brown", S("Brown Terracotta"), S("Brown Glazed Terracotta"), S("Brown Concrete Powder"), S("Brown Concrete"), "brown"}, - {"pink", S("Pink Terracotta"), S("Pink Glazed Terracotta"), S("Pink Concrete Powder"), S("Pink Concrete"), "pink"}, - {"lime", S("Lime Terracotta"), S("Lime Glazed Terracotta"), S("Lime Concrete Powder"), S("Lime Concrete"), "green"}, - {"light_blue", S("Light Blue Terracotta"), S("Light Blue Glazed Terracotta"), S("Light Blue Concrete Powder"), S("Light Blue Concrete"), "lightblue"}, -} -local canonical_color = "yellow" - -local hc_desc = S("Terracotta is a basic building material. It comes in many different colors.") -local gt_desc = S("Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.") -local cp_desc = S("Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.") -local c_desc = S("Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.") -local cp_tt = S("Turns into concrete on water contact") - -minetest.register_node("mcl_colorblocks:hardened_clay", { - description = S("Terracotta"), - _doc_items_longdesc = S("Terracotta is a basic building material which comes in many different colors. This particular block is uncolored."), - tiles = {"hardened_clay.png"}, - stack_max = 64, - groups = {pickaxey=1, hardened_clay=1,building_block=1, material_stone=1}, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 4.2, - _mcl_hardness = 1.25, -}) - -minetest.register_craft({ - type = "cooking", - output = "mcl_colorblocks:hardened_clay", - recipe = "mcl_core:clay", - cooktime = 10, -}) - -local on_rotate -if minetest.get_modpath("screwdriver") then - on_rotate = screwdriver.rotate_simple -end - -for _, row in ipairs(block.dyes) do - local name = row[1] - local is_canonical = name == canonical_color - local sdesc_hc = row[2] - local sdesc_gt = row[3] - local sdesc_cp = row[4] - local sdesc_c = row[5] - local ldesc_hc, ldesc_gt, ldesc_cp, ldesc_c - local create_entry - local ename_hc, ename_gt, ename_cp, ename_c - local ltt_cp = cp_tt - if is_canonical then - ldesc_hc = hc_desc - ldesc_gt = gt_desc - ldesc_cp = cp_desc - ldesc_c = c_desc - ename_hc = S("Colored Terracotta") - ename_gt = S("Glazed Terracotta") - ename_cp = S("Concrete Powder") - ename_c = S("Concrete") - else - create_entry = false - end - local craft_color_group = row[6] - -- Node Definition - minetest.register_node("mcl_colorblocks:hardened_clay_"..name, { - description = sdesc_hc, - _doc_items_longdesc = ldesc_hc, - _doc_items_create_entry = create_entry, - _doc_items_entry_name = ename_hc, - tiles = {"hardened_clay_stained_"..name..".png"}, - groups = {pickaxey=1, hardened_clay=1,building_block=1, material_stone=1}, - stack_max = 64, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 4.2, - _mcl_hardness = 1.25, - }) - - minetest.register_node("mcl_colorblocks:concrete_powder_"..name, { - description = sdesc_cp, - _tt_help = ltt_cp, - _doc_items_longdesc = ldesc_cp, - _doc_items_create_entry = create_entry, - _doc_items_entry_name = ename_cp, - tiles = {"mcl_colorblocks_concrete_powder_"..name..".png"}, - groups = {handy=1,shovely=1, concrete_powder=1,building_block=1,falling_node=1, material_sand=1, float=1}, - stack_max = 64, - is_ground_content = false, - sounds = mcl_sounds.node_sound_sand_defaults(), - on_place = function(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" then - return itemstack - end - - -- Call on_rightclick if the pointed node defines it - local unode = minetest.get_node(pointed_thing.under) - if placer and not placer:get_player_control().sneak then - if minetest.registered_nodes[unode.name] and minetest.registered_nodes[unode.name].on_rightclick then - return minetest.registered_nodes[unode.name].on_rightclick(pointed_thing.under, unode, placer, itemstack) or itemstack - end - end - - -- If placed in water, immediately harden this node - local n = minetest.get_node(pointed_thing.above) - local oldname = itemstack:get_name() - if minetest.get_item_group(n.name, "water") ~= 0 then - itemstack:set_name(itemstack:get_definition()._mcl_colorblocks_harden_to) - end - itemstack = minetest.item_place_node(itemstack, placer, pointed_thing) - itemstack:set_name(oldname) - return itemstack - end, - - -- Specify the node to which this node will convert after getting in contact with water - _mcl_colorblocks_harden_to = "mcl_colorblocks:concrete_"..name, - _mcl_blast_resistance = 0.5, - _mcl_hardness = 0.5, - }) - - minetest.register_node("mcl_colorblocks:concrete_"..name, { - description = sdesc_c, - _doc_items_longdesc = ldesc_c, - _doc_items_create_entry = create_entry, - _doc_items_entry_name = ename_c, - tiles = {"mcl_colorblocks_concrete_"..name..".png"}, - groups = {handy=1,pickaxey=1, concrete=1,building_block=1, material_stone=1}, - stack_max = 64, - is_ground_content = false, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 1.8, - _mcl_hardness = 1.8, - }) - - local tex = "mcl_colorblocks_glazed_terracotta_"..name..".png" - local texes = { tex, tex, tex.."^[transformR180", tex, tex.."^[transformR270", tex.."^[transformR90" } - minetest.register_node("mcl_colorblocks:glazed_terracotta_"..name, { - description = sdesc_gt, - _doc_items_longdesc = ldesc_gt, - _doc_items_create_entry = create_entry, - _doc_items_entry_name = ename_gt, - tiles = texes, - groups = {handy=1,pickaxey=1, glazed_terracotta=1,building_block=1, material_stone=1}, - paramtype2 = "facedir", - stack_max = 64, - is_ground_content = false, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 4.2, - _mcl_hardness = 1.4, - on_rotate = on_rotate, - }) - - if not is_canonical and doc_mod then - doc.add_entry_alias("nodes", "mcl_colorblocks:hardened_clay_"..canonical_color, "nodes", "mcl_colorblocks:hardened_clay_"..name) - doc.add_entry_alias("nodes", "mcl_colorblocks:glazed_terracotta_"..canonical_color, "nodes", "mcl_colorblocks:glazed_terracotta_"..name) - doc.add_entry_alias("nodes", "mcl_colorblocks:concrete_"..canonical_color, "nodes", "mcl_colorblocks:concrete_"..name) - doc.add_entry_alias("nodes", "mcl_colorblocks:concrete_powder_"..canonical_color, "nodes", "mcl_colorblocks:concrete_powder_"..name) - end - - -- Crafting recipes - if craft_color_group then - minetest.register_craft({ - output = "mcl_colorblocks:hardened_clay_"..name.." 8", - recipe = { - {"mcl_colorblocks:hardened_clay", "mcl_colorblocks:hardened_clay", "mcl_colorblocks:hardened_clay"}, - {"mcl_colorblocks:hardened_clay", "mcl_dye:"..craft_color_group, "mcl_colorblocks:hardened_clay"}, - {"mcl_colorblocks:hardened_clay", "mcl_colorblocks:hardened_clay", "mcl_colorblocks:hardened_clay"}, - }, - }) - minetest.register_craft({ - type = "shapeless", - output = "mcl_colorblocks:concrete_powder_"..name.." 8", - recipe = { - "mcl_core:sand", "mcl_core:gravel", "mcl_core:sand", - "mcl_core:gravel", "mcl_dye:"..craft_color_group, "mcl_core:gravel", - "mcl_core:sand", "mcl_core:gravel", "mcl_core:sand", - } - }) - - minetest.register_craft({ - type = "cooking", - output = "mcl_colorblocks:glazed_terracotta_"..name, - recipe = "mcl_colorblocks:hardened_clay_"..name, - cooktime = 10, - }) - end -end - --- When water touches concrete powder, it turns into concrete of the same color -minetest.register_abm({ - label = "Concrete powder hardening", - interval = 1, - chance = 1, - nodenames = {"group:concrete_powder"}, - neighbors = {"group:water"}, - action = function(pos, node) - local harden_to = minetest.registered_nodes[node.name]._mcl_colorblocks_harden_to - -- It should be impossible for harden_to to be nil, but a Minetest bug might call - -- the ABM on the new concrete node, which isn't part of this ABM! - if harden_to then - node.name = harden_to - --Fix "float" group not lowering concrete into the water by 1. - local water_pos = { x = pos.x, y = pos.y-1, z = pos.z } - local water_node = minetest.get_node(water_pos) - if minetest.get_item_group(water_node.name, "water") == 0 then - minetest.set_node(pos, node) - else - minetest.set_node(water_pos,node) - minetest.set_node(pos, {name = "air"}) - minetest.check_for_falling(pos) -- Update C. Powder that stacked above so they fall down after setting air. - end - end - end, -}) diff --git a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.de.tr b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.de.tr deleted file mode 100644 index 359a2f7cb0..0000000000 --- a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.de.tr +++ /dev/null @@ -1,76 +0,0 @@ -# textdomain: mcl_colorblocks -White Terracotta=Weiße Terrakotta -White Glazed Terracotta=Weiße glasierte Terrakotta -White Concrete Powder=Weißes Betonpulver -White Concrete=Weißer Beton -Grey Terracotta=Graue Terrakotta -Grey Glazed Terracotta=Graue glasierte Terrakotta -Grey Concrete Powder=Graues Betonpulver -Grey Concrete=Grauer Beton -Light Grey Terracotta=Hellgraue Terrakotta -Light Grey Glazed Terracotta=Hellgraue glasierte Terrakotta -Light Grey Concrete Powder=Hellgraues Betonpulver -Light Grey Concrete=Hellgrauer Beton -Black Terracotta=Schwarze Terrakotta -Black Glazed Terracotta=Schwarze glasierte Terrakotta -Black Concrete Powder=Schwarzes Betonpulver -Black Concrete=Schwarzer Beton -Red Terracotta=Rote Terrakotta -Red Glazed Terracotta=Rote glasierte Terrakotta -Red Concrete Powder=Rotes Betonpulver -Red Concrete=Roter Beton -Yellow Terracotta=Gelbe Terrakotta -Yellow Glazed Terracotta=Gelbe glasierte Terrakotta -Yellow Concrete Powder=Gelbes Betonpulver -Yellow Concrete=Gelber Beton -Green Terracotta=Grüne Terrakotta -Green Glazed Terracotta=Grüne glasierte Terrakotta -Green Concrete Powder=Grünes Betonpulver -Green Concrete=Grüner Beton -Cyan Terracotta=Türkise Terrakotta -Cyan Glazed Terracotta=Türkise glasierte Terrakotta -Cyan Concrete Powder=Türkises Betonpulver -Cyan Concrete=Türkiser Beton -Blue Terracotta=Blaue Terrakotta -Blue Glazed Terracotta=Blaue glasierte Terrakotta -Blue Concrete Powder=Blaues Betonpulver -Blue Concrete=Blauer Beton -Magenta Terracotta=Magenta Terrakotta -Magenta Glazed Terracotta=Magenta glasierte Terrakotta -Magenta Concrete Powder=Magenta Betonpulver -Magenta Concrete=Magenta Beton -Orange Terracotta=Orange Terrakotta -Orange Glazed Terracotta=Orange glasierte Terrakotta -Orange Concrete Powder=Orange Betonpulver -Orange Concrete=Orange Beton -Purple Terracotta=Violette Terrakotta -Purple Glazed Terracotta=Violette glasierte Terrakotta -Purple Concrete Powder=Violettes Betonpulver -Purple Concrete=Violetter Beton -Brown Terracotta=Braune Terrakotta -Brown Glazed Terracotta=Braune glasierte Terrakotta -Brown Concrete Powder=Braunes Betonpulver -Brown Concrete=Brauner Beton -Pink Terracotta=Rosa Terrakotta -Pink Glazed Terracotta=Rosa glasierte Terrakotta -Pink Concrete Powder=Rosa Betonpulver -Pink Concrete=Rosa Beton -Lime Terracotta=Lindgrüne Terrakotta -Lime Glazed Terracotta=Lindgrüne glasierte Terrakotta -Lime Concrete Powder=Lindgrünes Betonpulver -Lime Concrete=Lindgrüner Beton -Light Blue Terracotta=Hellbaue Terrakotta -Light Blue Glazed Terracotta=Hellblaue glasierte Terrakotta -Light Blue Concrete Powder=Hellblaues Betonpulver -Light Blue Concrete=Hellblauer Beton -Terracotta is a basic building material. It comes in many different colors.=Terrakotta ist ein Baumaterial. Es gibt es in vielen verschiedenen Farben. -Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.=Glasierte Terrakotta ist ein dekorativer Block mit einem komplexen Muster. Sie kann rotiert werden, indem man sie in verschiedene Richtungen platziert. -Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.=Betonpulver wird benutzt, um Beton herzustellen, aber es kann auch selbst als Dekoration benutzt werden. Es kommt in verschiedenen Farben daher. Betonpulver verwandelt sich in Beton der selben Farbe, wenn es mit Wasser in Berührung kommt. -Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.=Beton ist ein dekorativer Block, der in verschiedenen Farben daherkommt. Er hat eine besonders kräftige und klare Farbe. -Terracotta=Terrakotta -Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.=Terrakotta ist ein Baumaterial, welches in vielen verschiedenen Farben vorkommt. Diese Variante ist ungefärbt. -Colored Terracotta=Gefärbte Terrakotta -Glazed Terracotta=Glasierte Terrakotta -Concrete Powder=Betonpulver -Concrete=Beton -Turns into concrete on water contact=Wird zu Beton bei Wasserkontakt diff --git a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.es.tr b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.es.tr deleted file mode 100644 index cae96e62ab..0000000000 --- a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.es.tr +++ /dev/null @@ -1,75 +0,0 @@ -# textdomain: mcl_colorblocks -White Terracotta=Terracota blanca -White Glazed Terracotta=Terracota cristalizada blanca -White Concrete Powder=Cemento blanco -White Concrete=Hormigón blanco -Grey Terracotta=Terracota gris -Grey Glazed Terracotta=Terracota cristalizada gris -Grey Concrete Powder=Cemento gris -Grey Concrete=Hormigón gris -Light Grey Terracotta=Terracota gris claro -Light Grey Glazed Terracotta=Terracota cristalizada gris claro -Light Grey Concrete Powder=Cemento gris claro -Light Grey Concrete=Hormigón gris claro -Black Terracotta=Terracota negra -Black Glazed Terracotta=Terracota cristalizada negra -Black Concrete Powder=Cemento negro -Black Concrete=Hormigón negro -Red Terracotta=Terracota roja -Red Glazed Terracotta=Terracota cristalizada roja -Red Concrete Powder=Cemento rojo -Red Concrete=Hormigón rojo -Yellow Terracotta=Terracota amarilla -Yellow Glazed Terracotta=Terracota cristalizada amarilla -Yellow Concrete Powder=Cemento amarillo -Yellow Concrete=Hormigón amarillo -Green Terracotta=Terracota verde -Green Glazed Terracotta=Terracota cristalizada verde -Green Concrete Powder=Cemento verde -Green Concrete=Hormigón verde -Cyan Terracotta=Terracota cian -Cyan Glazed Terracotta=Terracota cristalizada cian -Cyan Concrete Powder=Cemento cian -Cyan Concrete=Hormigón cian -Blue Terracotta=Terracota azul -Blue Glazed Terracotta=Terracota cristalizada azul -Blue Concrete Powder=Cemento azul -Blue Concrete=Hormigón azul -Magenta Terracotta=Terracota magenta -Magenta Glazed Terracotta=Terracota cristalizada magenta -Magenta Concrete Powder=Cemento magenta -Magenta Concrete=Hormigón magenta -Orange Terracotta=Terracota naranja -Orange Glazed Terracotta=Terracota cristalizada naranja -Orange Concrete Powder=Cemento naranja -Orange Concrete=Hormigón naranja -Purple Terracotta=Terracota morada -Purple Glazed Terracotta=Terracota cristalizada morada -Purple Concrete Powder=Cemento morado -Purple Concrete=Hormigón morado -Brown Terracotta=Terracota marrón -Brown Glazed Terracotta=Terracota cristalizada marrón -Brown Concrete Powder=Cemento marrón -Brown Concrete=Hormigón marrón -Pink Terracotta=Terracota rosa -Pink Glazed Terracotta=Terracota cristalizada rosa -Pink Concrete Powder=Cemento rosa -Pink Concrete=Hormigón rosa -Lime Terracotta=Terracota verde lima -Lime Glazed Terracotta=Terracota cristalizada verde lima -Lime Concrete Powder=Cemento verde lima -Lime Concrete=Hormigón verde lima -Light Blue Terracotta=Terracota azul claro -Light Blue Glazed Terracotta=Terracota cristalizada azul claro -Light Blue Concrete Powder=Cemento azul claro -Light Blue Concrete=Hormigón azul claro -Terracotta is a basic building material. It comes in many different colors.=La terracota es un material de construcción básico. Viene en muchos colores diferentes. -Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.=La terracota cristalizada es un bloque decorativo con un patrón complejo. Se puede girar colocándolo en diferentes direcciones. -Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.=La Cemento se usa para crear Hormigón, pero también se puede usar como decoración en sí. Viene en diferentes colores. La Cemento se convierte en Hormigón del mismo color cuando entra en contacto con el agua. -Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.=El Hormigón es un bloque decorativo que viene en muchos colores diferentes. Es notable por tener un color muy fuerte y limpio. -Terracotta=Terracota -Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.=La terracota es un material de construcción básico que viene en muchos colores diferentes. Este bloque en particular no tiene color. -Colored Terracotta=Terracota coloreada -Glazed Terracotta=Terracota vidriada -Concrete Powder=Cemento -Concrete=Hormigón diff --git a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.fr.tr b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.fr.tr deleted file mode 100644 index d457364ef5..0000000000 --- a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.fr.tr +++ /dev/null @@ -1,76 +0,0 @@ -# textdomain: mcl_colorblocks -White Terracotta=Terre Cuite Blanche -White Glazed Terracotta=Terre Cuite Emaillée Blanche -White Concrete Powder=Béton en Poudre Blanc -White Concrete=Béton Blanc -Grey Terracotta=Terre Cuite Grise -Grey Glazed Terracotta=Terre Cuite Emaillée Grise -Grey Concrete Powder=Béton en Poudre Gris -Grey Concrete=Béton Gris -Light Grey Terracotta=Terre Cuite Gris Clair -Light Grey Glazed Terracotta=Terre Cuite Emaillée Gris Clair -Light Grey Concrete Powder=Béton en Poudre Gris Clair -Light Grey Concrete=Béton Gris Clair -Black Terracotta=Terre Cuite Noir -Black Glazed Terracotta=Terre Cuite Emaillée Noir -Black Concrete Powder=Béton en Poudre Noir -Black Concrete=Béton Noir -Red Terracotta=Terre Cuite Rouge -Red Glazed Terracotta=Terre Cuite Emaillée Rouge -Red Concrete Powder=Béton en Poudre Rouge -Red Concrete=Béton Rouge -Yellow Terracotta=Terre Cuite Jaune -Yellow Glazed Terracotta=Terre Cuite Emaillée Jaune -Yellow Concrete Powder=Béton en Poudre Jaune -Yellow Concrete=Béton Jaune -Green Terracotta=Terre Cuite Verte -Green Glazed Terracotta=Terre Cuite Emaillée Verte -Green Concrete Powder=Béton en Poudre Vert -Green Concrete=Béton Vert -Cyan Terracotta=Terre Cuite Cyan -Cyan Glazed Terracotta=Terre Cuite Emaillée Cyan -Cyan Concrete Powder=Béton en Poudre Cyan -Cyan Concrete=Béton Cyan -Blue Terracotta=Terre Cuite Bleue -Blue Glazed Terracotta=Terre Cuite Emaillée Bleue -Blue Concrete Powder=Béton en Poudre Bleu -Blue Concrete=Béton Bleu -Magenta Terracotta=Terre Cuite Magenta -Magenta Glazed Terracotta=Terre Cuite Emaillée Magenta -Magenta Concrete Powder=Béton en Poudre Magenta -Magenta Concrete=Béton Magenta -Orange Terracotta=Terre Cuite Orange -Orange Glazed Terracotta=Terre Cuite Emaillée Orange -Orange Concrete Powder=Béton en Poudre Orange -Orange Concrete=Béton Orange -Purple Terracotta=Terre Cuite Violette -Purple Glazed Terracotta=Terre Cuite Emaillée Violette -Purple Concrete Powder=Béton en Poudre Violet -Purple Concrete=Béton Violet -Brown Terracotta=Terre Cuite Marron -Brown Glazed Terracotta=Terre Cuite Emaillée Marron -Brown Concrete Powder=Béton en Poudre Marron -Brown Concrete=Béton Marron -Pink Terracotta=Terre Cuite Rose -Pink Glazed Terracotta=Terre Cuite Emaillée Rose -Pink Concrete Powder=Béton en Poudre Rose -Pink Concrete=Béton Rose -Lime Terracotta=Terre Cuite Verte Clair -Lime Glazed Terracotta=Terre Cuite Emaillée Verte Clair -Lime Concrete Powder=Béton en Poudre Vert Clair -Lime Concrete=Béton Vert Clair -Light Blue Terracotta=Terre Cuite Bleu Clair -Light Blue Glazed Terracotta=Terre Cuite Emaillée Bleu Clair -Light Blue Concrete Powder=Béton en Poudre Bleu Clair -Light Blue Concrete=Béton Bleu Clair -Terracotta is a basic building material. It comes in many different colors.=La terre cuite est un matériau de construction de base. Il est disponible dans de nombreuses couleurs différentes. -Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.=La terre cuite émaillée est un bloc décoratif au motif complexe. Il peut être tourné en le plaçant dans différentes directions. -Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.=La poudre de béton est utilisée pour créer du béton, mais elle peut également être utilisée comme décoration elle-même. Il est disponible en différentes couleurs. La poudre de béton se transforme en béton de la même couleur au contact de l'eau. -Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.=Le béton est un bloc décoratif qui se décline en de nombreuses couleurs différentes. Il est remarquable pour avoir une couleur très forte et propre. -Terracotta=Terre Cuite -Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.=La terre cuite est un matériau de construction de base qui se décline en de nombreuses couleurs différentes. Ce bloc particulier n'est pas coloré. -Colored Terracotta=Terre Cuite Coloré -Glazed Terracotta=Terre Cuite Emaillée -Concrete Powder=Béton en Poudre -Concrete=Béton -Turns into concrete on water contact=Se transforme en béton au contact de l'eau diff --git a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.pl.tr b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.pl.tr deleted file mode 100644 index 90a6f2431d..0000000000 --- a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.pl.tr +++ /dev/null @@ -1,76 +0,0 @@ -# textdomain: mcl_colorblocks -White Terracotta=Biała terakota -White Glazed Terracotta=Biała glazurowana terakota -White Concrete Powder=Biały cement -White Concrete=Biały beton -Grey Terracotta=Szara terakota -Grey Glazed Terracotta=Szara glazurowana terakota -Grey Concrete Powder=Szary cement -Grey Concrete=Szary beton -Light Grey Terracotta=Jasnoszara terakota -Light Grey Glazed Terracotta=Jasnoszara glazurowana terakota -Light Grey Concrete Powder=Jasnoszary cement -Light Grey Concrete=Jasnoszary beton -Black Terracotta=Czarna terakota -Black Glazed Terracotta=Czarna glazurowana terakota -Black Concrete Powder=Czarny cement -Black Concrete=Czarny beton -Red Terracotta=Czerwona terakota -Red Glazed Terracotta=Czerwona glazurowana terakota -Red Concrete Powder=Czerwony cement -Red Concrete=Czerwony beton -Yellow Terracotta=Żółta terakota -Yellow Glazed Terracotta=Żółta glazurowana terakota -Yellow Concrete Powder=Żółty cement -Yellow Concrete=Żółty beton -Green Terracotta=Zielona terakota -Green Glazed Terracotta=Zielona glazurowana terakota -Green Concrete Powder=Zielony cement -Green Concrete=Zielony beton -Cyan Terracotta=Błękitna terakota -Cyan Glazed Terracotta=Błękitna glazurowana terakota -Cyan Concrete Powder=Błękitny cement -Cyan Concrete=Błękitny beton -Blue Terracotta=Niebieska terakota -Blue Glazed Terracotta=Niebieska glazurowana terakota -Blue Concrete Powder=Niebieski cement -Blue Concrete=Niebieski beton -Magenta Terracotta=Karmazynowa terakota -Magenta Glazed Terracotta=Karmazynowa glazurowana terakota -Magenta Concrete Powder=Karmazynowy cement -Magenta Concrete=Karmazynowy beton -Orange Terracotta=Pomarańczowa terakota -Orange Glazed Terracotta=Pomarańczowa glazurowana terakota -Orange Concrete Powder=Pomarańczowy cement -Orange Concrete=Pomarańczowy beton -Purple Terracotta=Fioletowa terakota -Purple Glazed Terracotta=Fioletowa glazurowana terakota -Purple Concrete Powder=Fioletowy cement -Purple Concrete=Fioletowy beton -Brown Terracotta=Brązowa terakota -Brown Glazed Terracotta=Brązowa glazurowana terakota -Brown Concrete Powder=Brązowy cement -Brown Concrete=Brązowy beton -Pink Terracotta=Różowa terakota -Pink Glazed Terracotta=Różowa glazurowana terakota -Pink Concrete Powder=Różowy cement -Pink Concrete=Różowy beton -Lime Terracotta=Jasnozielona terakota -Lime Glazed Terracotta=Jasnozielona glazurowana terakota -Lime Concrete Powder=Jasnozielony cement -Lime Concrete=Jasnozielony beton -Light Blue Terracotta=Jasnoniebieska terakota -Light Blue Glazed Terracotta=Jasnoniebieska glazurowana terakota -Light Blue Concrete Powder=Jasnoniebieski cement -Light Blue Concrete=Jasnoniebieski beton -Terracotta is a basic building material. It comes in many different colors.=Terakota jest podstawowym blokiem budowlanym. Może mieć wiele różnych kolorów. -Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.=Glazurowana terakota jest dekoracyjnym blokiem ze złożonym wzorem. Może być obracana przez stawianie jej w różnych kierunkach. -Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.=Cement jest używany do stworzenia betonu, ale może być również sam użyty jako dekoracja. Może mieć wiele różnych kolorów. Cement zamienia się w beton tego samego koloru gdy wejdzie w kontakt z wodą. -Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.=Beton jest blokiem dekoracyjnym, który może mieć wiele różnych kolorów. Jest warty uwagi ze względu na swój czysty i wyrazisty kolor. -Terracotta=Terakota -Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.=Terakota jest podstawowym blokiem budowlanym, który może mieć wiele różnych kolorów. Ten konkretny blok nie ma żadnego koloru. -Colored Terracotta=Barwiona terakota -Glazed Terracotta=Glazurowana terakota -Concrete Powder=Cement -Concrete=Beton -Turns into concrete on water contact=Zamienia się w beton w kontakcie z wodą diff --git a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.ru.tr b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.ru.tr deleted file mode 100644 index e1d6944570..0000000000 --- a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.ru.tr +++ /dev/null @@ -1,76 +0,0 @@ -# textdomain: mcl_colorblocks -White Terracotta=Белая керамика -White Glazed Terracotta=Белая глазурованная керамика -White Concrete Powder=Белый цемент -White Concrete=Белый бетон -Grey Terracotta=Серая керамика -Grey Glazed Terracotta=Серая глазурованная керамика -Grey Concrete Powder=Серый цемент -Grey Concrete=Серый бетон -Light Grey Terracotta=Светло-серая керамика -Light Grey Glazed Terracotta=Светло-серая глазурованная керамика -Light Grey Concrete Powder=Светло-серый цемент -Light Grey Concrete=Светло-серый бетон -Black Terracotta=Чёрная керамика -Black Glazed Terracotta=Чёрная глазурованная керамика -Black Concrete Powder=Чёрный цемент -Black Concrete=Чёрный бетон -Red Terracotta=Красная керамика -Red Glazed Terracotta=Красная глазурованная керамика -Red Concrete Powder=Красный цемент -Red Concrete=Красный бетон -Yellow Terracotta=Жёлтая керамика -Yellow Glazed Terracotta=Жёлтая глазурованная керамика -Yellow Concrete Powder=Жёлтый цемент -Yellow Concrete=Жёлтый бетон -Green Terracotta=Зелёная керамика -Green Glazed Terracotta=Зелёная глазурованная керамика -Green Concrete Powder=Зелёный цемент -Green Concrete=Зелёный бетон -Cyan Terracotta=Голубая керамика -Cyan Glazed Terracotta=Голубая глазурованная керамика -Cyan Concrete Powder=Голубой цемент -Cyan Concrete=Голубой бетон -Blue Terracotta=Синяя керамика -Blue Glazed Terracotta=Синяя глазурованная керамика -Blue Concrete Powder=Синий цемент -Blue Concrete=Синий бетон -Magenta Terracotta=Фиолетовая керамика -Magenta Glazed Terracotta=Фиолетовая глазурованная керамика -Magenta Concrete Powder=Фиолетовый цемент -Magenta Concrete=Фиолетовый бетон -Orange Terracotta=Оранжевая керамика -Orange Glazed Terracotta=Оранжевая глазурованная керамика -Orange Concrete Powder=Оранжевый цемент -Orange Concrete=Оранжевый бетон -Purple Terracotta=Пурпурная керамика -Purple Glazed Terracotta=Пурпурная глазурованная керамика -Purple Concrete Powder=Пурпурный цемент -Purple Concrete=Пурпурный бетон -Brown Terracotta=Коричневая керамика -Brown Glazed Terracotta=Коричневая глазурованная керамика -Brown Concrete Powder=Коричневый цемент -Brown Concrete=Коричневый бетон -Pink Terracotta=Розовая керамика -Pink Glazed Terracotta=Розовая глазурованная керамика -Pink Concrete Powder=Розовый цемент -Pink Concrete=Розовый бетон -Lime Terracotta=Зелёная лаймовая керамика -Lime Glazed Terracotta=Зелёная лаймовая глазурованная керамика -Lime Concrete Powder=Зелёный лаймовый цемент -Lime Concrete=Зелёный лаймовый бетон -Light Blue Terracotta=Светло-голубая керамика -Light Blue Glazed Terracotta=Светло-голубая глазурованная керамика -Light Blue Concrete Powder=Светло-голубой цемент -Light Blue Concrete=Светло-голубой бетон -Terracotta is a basic building material. It comes in many different colors.=Керамика это основной строительный материал. Он бывает разных цветов. -Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.=Глазурованная керамика это декоративный блок со сложным орнаментом. -Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.=Цемент используется для создания бетона, хотя также может быть украшением сам по себе. Он бывает разных цветов. При контакте с водой цемент превращается в бетон, сохраняя свой цвет. -Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.=Бетон это декоративный блок, который бывает разных цветов. Бетон славится хорошим и чистым цветом. -Terracotta=Керамика -Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.=Керамика - основной строительный материал, который может быть разных цветов. Обычный блок керамики не окрашен. -Colored Terracotta=Окрашенная керамика -Glazed Terracotta=Глазурованная керамика -Concrete Powder=Цемент -Concrete=Бетон -Turns into concrete on water contact=Превращается в бетон при контакте с водой diff --git a/mods/ITEMS/mcl_colorblocks/locale/template.txt b/mods/ITEMS/mcl_colorblocks/locale/template.txt deleted file mode 100644 index ca1c059a12..0000000000 --- a/mods/ITEMS/mcl_colorblocks/locale/template.txt +++ /dev/null @@ -1,76 +0,0 @@ -# textdomain: mcl_colorblocks -White Terracotta= -White Glazed Terracotta= -White Concrete Powder= -White Concrete= -Grey Terracotta= -Grey Glazed Terracotta= -Grey Concrete Powder= -Grey Concrete= -Light Grey Terracotta= -Light Grey Glazed Terracotta= -Light Grey Concrete Powder= -Light Grey Concrete= -Black Terracotta= -Black Glazed Terracotta= -Black Concrete Powder= -Black Concrete= -Red Terracotta= -Red Glazed Terracotta= -Red Concrete Powder= -Red Concrete= -Yellow Terracotta= -Yellow Glazed Terracotta= -Yellow Concrete Powder= -Yellow Concrete= -Green Terracotta= -Green Glazed Terracotta= -Green Concrete Powder= -Green Concrete= -Cyan Terracotta= -Cyan Glazed Terracotta= -Cyan Concrete Powder= -Cyan Concrete= -Blue Terracotta= -Blue Glazed Terracotta= -Blue Concrete Powder= -Blue Concrete= -Magenta Terracotta= -Magenta Glazed Terracotta= -Magenta Concrete Powder= -Magenta Concrete= -Orange Terracotta= -Orange Glazed Terracotta= -Orange Concrete Powder= -Orange Concrete= -Purple Terracotta= -Purple Glazed Terracotta= -Purple Concrete Powder= -Purple Concrete= -Brown Terracotta= -Brown Glazed Terracotta= -Brown Concrete Powder= -Brown Concrete= -Pink Terracotta= -Pink Glazed Terracotta= -Pink Concrete Powder= -Pink Concrete= -Lime Terracotta= -Lime Glazed Terracotta= -Lime Concrete Powder= -Lime Concrete= -Light Blue Terracotta= -Light Blue Glazed Terracotta= -Light Blue Concrete Powder= -Light Blue Concrete= -Terracotta is a basic building material. It comes in many different colors.= -Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.= -Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.= -Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.= -Terracotta= -Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.= -Colored Terracotta= -Glazed Terracotta= -Concrete Powder= -Concrete= -Turns into concrete on water contact= diff --git a/mods/ITEMS/mcl_colorblocks/mod.conf b/mods/ITEMS/mcl_colorblocks/mod.conf deleted file mode 100644 index dab0ce5898..0000000000 --- a/mods/ITEMS/mcl_colorblocks/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = mcl_colorblocks -description = Adds blocks which can be colored, namely hardened clay. -depends = mcl_core, mcl_sounds, mcl_dye -optional_depends = doc, screwdriver diff --git a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay.png b/mods/ITEMS/mcl_colorblocks/textures/hardened_clay.png deleted file mode 100644 index b593db8f42..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_black.png b/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_black.png deleted file mode 100644 index 223a5f8dcb..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_black.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_blue.png b/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_blue.png deleted file mode 100644 index 1684848084..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_brown.png b/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_brown.png deleted file mode 100644 index f742362d6d..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_brown.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_cyan.png b/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_cyan.png deleted file mode 100644 index c8e4067508..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_cyan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_green.png b/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_green.png deleted file mode 100644 index b01606528f..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_green.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_grey.png b/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_grey.png deleted file mode 100644 index f903783743..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_grey.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_light_blue.png b/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_light_blue.png deleted file mode 100644 index 80babe531a..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_light_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_lime.png b/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_lime.png deleted file mode 100644 index 46150314a6..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_lime.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_magenta.png b/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_magenta.png deleted file mode 100644 index 600824b821..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_magenta.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_orange.png b/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_orange.png deleted file mode 100644 index d03046b0af..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_orange.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_pink.png b/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_pink.png deleted file mode 100644 index 6a121cebf8..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_pink.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_purple.png b/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_purple.png deleted file mode 100644 index 9c13af8c28..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_purple.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_red.png b/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_red.png deleted file mode 100644 index 5fb28150cc..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_red.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_silver.png b/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_silver.png deleted file mode 100644 index 41271e900d..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_silver.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_white.png b/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_white.png deleted file mode 100644 index c213343079..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_white.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_yellow.png b/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_yellow.png deleted file mode 100644 index 9d21ed2eef..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/hardened_clay_stained_yellow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_black.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_black.png deleted file mode 100644 index d0787ab940..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_black.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_blue.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_blue.png deleted file mode 100644 index 530be05099..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_brown.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_brown.png deleted file mode 100644 index 3344f07573..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_brown.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_cyan.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_cyan.png deleted file mode 100644 index 64f5bfacf6..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_cyan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_green.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_green.png deleted file mode 100644 index 5d1e5366c7..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_green.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_grey.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_grey.png deleted file mode 100644 index 885b62fc75..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_grey.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_light_blue.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_light_blue.png deleted file mode 100644 index a6afea9d7f..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_light_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_lime.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_lime.png deleted file mode 100644 index d7ac279467..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_lime.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_magenta.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_magenta.png deleted file mode 100644 index 258efb7860..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_magenta.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_orange.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_orange.png deleted file mode 100644 index 8d931086fc..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_orange.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_pink.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_pink.png deleted file mode 100644 index 75dfa29a10..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_pink.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_black.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_black.png deleted file mode 100644 index f3447237bf..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_black.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_blue.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_blue.png deleted file mode 100644 index 12c64fc6d1..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_brown.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_brown.png deleted file mode 100644 index 9e355c8a44..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_brown.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_cyan.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_cyan.png deleted file mode 100644 index c0a6e4f053..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_cyan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_green.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_green.png deleted file mode 100644 index f4013845be..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_green.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_grey.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_grey.png deleted file mode 100644 index 23d957a8f6..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_grey.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_light_blue.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_light_blue.png deleted file mode 100644 index da4f461c44..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_light_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_lime.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_lime.png deleted file mode 100644 index 536e5edc31..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_lime.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_magenta.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_magenta.png deleted file mode 100644 index 9357b61618..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_magenta.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_orange.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_orange.png deleted file mode 100644 index e589eaa492..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_orange.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_pink.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_pink.png deleted file mode 100644 index 4a949719fb..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_pink.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_purple.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_purple.png deleted file mode 100644 index d204b036af..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_purple.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_red.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_red.png deleted file mode 100644 index 32195ff46b..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_red.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_silver.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_silver.png deleted file mode 100644 index 37edd79b9c..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_silver.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_white.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_white.png deleted file mode 100644 index 86f2a848d2..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_white.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_yellow.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_yellow.png deleted file mode 100644 index 83d693e097..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_powder_yellow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_purple.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_purple.png deleted file mode 100644 index 4d69536953..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_purple.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_red.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_red.png deleted file mode 100644 index a02379ed31..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_red.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_silver.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_silver.png deleted file mode 100644 index 0eb56f1f99..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_silver.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_white.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_white.png deleted file mode 100644 index 4561f65381..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_white.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_yellow.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_yellow.png deleted file mode 100644 index 990a5d2d9f..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_concrete_yellow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_black.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_black.png deleted file mode 100644 index 04eab43936..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_black.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_blue.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_blue.png deleted file mode 100644 index 1fd064eae6..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_brown.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_brown.png deleted file mode 100644 index 4adcb671ad..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_brown.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_cyan.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_cyan.png deleted file mode 100644 index 6289015a68..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_cyan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_green.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_green.png deleted file mode 100644 index 61b7440a54..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_green.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_grey.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_grey.png deleted file mode 100644 index 2f3813ada4..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_grey.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_light_blue.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_light_blue.png deleted file mode 100644 index f78fa94a13..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_light_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_lime.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_lime.png deleted file mode 100644 index 7e944f5f7b..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_lime.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_magenta.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_magenta.png deleted file mode 100644 index 0673eab675..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_magenta.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_orange.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_orange.png deleted file mode 100644 index 470d56943a..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_orange.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_pink.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_pink.png deleted file mode 100644 index 7e71e8c8b8..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_pink.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_purple.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_purple.png deleted file mode 100644 index f9d025bf91..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_purple.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_red.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_red.png deleted file mode 100644 index 5f2fa718b1..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_red.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_silver.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_silver.png deleted file mode 100644 index c634af4772..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_silver.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_white.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_white.png deleted file mode 100644 index 65757aabf0..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_white.png and /dev/null differ diff --git a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_yellow.png b/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_yellow.png deleted file mode 100644 index 2f2bb44744..0000000000 Binary files a/mods/ITEMS/mcl_colorblocks/textures/mcl_colorblocks_glazed_terracotta_yellow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_composters/init.lua b/mods/ITEMS/mcl_composters/init.lua deleted file mode 100644 index 56422d8b5e..0000000000 --- a/mods/ITEMS/mcl_composters/init.lua +++ /dev/null @@ -1,276 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - --- --- Composter mod, adds composters. --- --- Copyleft 2022 by kabou --- GNU General Public Licence 3.0 --- - -local composter_description = S( - "Composter" -) -local composter_longdesc = S( - "Composters can convert various organic items into bonemeal." -) -local composter_usagehelp = S( - "Use organic items on the composter to fill it with layers of compost. " .. - "Every time an item is put in the composter, there is a chance that the " .. - "composter adds another layer of compost. Some items have a bigger chance " .. - "of adding an extra layer than other items. After filling up with 7 layers " .. - "of compost, the composter is full. After a delay of approximately one " .. - "second the composter becomes ready and bone meal can be retrieved from it. " .. - "Right-clicking the composter takes out the bone meal empties the composter." -) - -minetest.register_craft({ - output = "mcl_composters:composter", - recipe = { - {"group:wood_slab", "", "group:wood_slab"}, - {"group:wood_slab", "", "group:wood_slab"}, - {"group:wood_slab", "group:wood_slab", "group:wood_slab"}, - } -}) - -minetest.register_craft({ - type = "fuel", - recipe = "mcl_composters:composter", - burntime = 15, -}) - -local get_item_group = minetest.get_item_group -local is_creative_enabled = minetest.is_creative_enabled -local registered_nodes = minetest.registered_nodes -local swap_node = minetest.swap_node -local get_node_timer = minetest.get_node_timer -local add_item = minetest.add_item -local vector_offset = vector.offset -local is_protected = minetest.is_protected -local record_protection_violation = minetest.record_protection_violation - ---- Fill the composter when rightclicked. --- --- `on_rightclick` handler for composter blocks of all fill levels except --- for the "ready" composter (see: composter_harvest). --- If the item used on the composter block is compostable, there is a chance --- that the level of the composter may increase, depending on the value of --- compostability of the item. --- --- parameters are the standard parameters passed to `on_rightclick`. --- returns the remaining itemstack. --- -local function composter_add_item(pos, node, player, itemstack, pointed_thing) - if not player or (player:get_player_control() and player:get_player_control().sneak) then - return itemstack - end - local name = player:get_player_name() - if is_protected(pos, name) then - record_protection_violation(pos, name) - return itemstack - end - if not itemstack or itemstack:is_empty() then - return itemstack - end - local itemname = itemstack:get_name() - local chance = get_item_group(itemname, "compostability") - if chance > 0 then - if not is_creative_enabled(player:get_player_name()) then - itemstack:take_item() - end - -- calculate leveling up chance - local rand = math.random(0,100) - if chance >= rand then - -- get current compost level - local level = registered_nodes[node.name]["_mcl_compost_level"] - -- spawn green particles above new layer - mcl_dye.add_bone_meal_particle(vector_offset(pos, 0, level/8, 0)) - -- TODO: play some sounds - -- update composter block - if level < 7 then - level = level + 1 - else - level = "ready" - end - swap_node(pos, {name = "mcl_composters:composter_" .. level}) - -- a full composter becomes ready for harvest after one second - -- the block will get updated by the node timer callback set in node reg def - if level == 7 then - local timer = get_node_timer(pos) - timer:start(1) - end - end - end - return itemstack -end - ---- Update a full composter block to ready for harvesting. --- --- `on_timer` handler. The timer is set in function 'composter_add_item' --- when the composter level has reached 7. --- --- pos: position of the composter block. --- returns false, thereby cancelling further activity of the timer. --- -local function composter_ready(pos) - swap_node(pos, {name = "mcl_composters:composter_ready"}) - -- maybe spawn particles again? - -- TODO: play some sounds - return false -end - ---- Spawn bone meal item and reset composter block. --- --- `on_rightclick` handler for the "ready" composter block. Causes a --- bone meal item to be spawned from the composter and resets the --- composter block to an empty composter block. --- --- parameterss are the standard parameters passed to `on_rightclick`. --- returns itemstack (unchanged in this function). --- -local function composter_harvest(pos, node, player, itemstack, pointed_thing) - if not player or (player:get_player_control() and player:get_player_control().sneak) then - return itemstack - end - local name = player:get_player_name() - if is_protected(pos, name) then - record_protection_violation(pos, name) - return itemstack - end - -- reset ready type composter to empty type - swap_node(pos, {name="mcl_composters:composter"}) - -- spawn bone meal item (wtf dye?! is this how they make white cocoa) - add_item(pos, "mcl_dye:white") - -- TODO play some sounds - return itemstack -end - ---- Construct composter nodeboxes with varying levels of compost. --- --- level: compost level in the composter --- returns a nodebox definition table. --- -local function composter_get_nodeboxes(level) - local top_y_tbl = {[0]=-7, -5, -3, -1, 1, 3, 5, 7} - local top_y = top_y_tbl[level] / 16 - return { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall - { 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall - {-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall - {-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall - {-0.5, -0.5, -0.5, 0.5, top_y, 0.5}, -- Bottom level - } - } -end - ---- Register empty composter node. --- --- This is the craftable base model that can be placed in an inventory. --- -minetest.register_node("mcl_composters:composter", { - description = composter_description, - _tt_help = S("Converts organic items into bonemeal"), - _doc_items_longdesc = composter_longdesc, - _doc_items_usagehelp = composter_usagehelp, - paramtype = "light", - drawtype = "nodebox", - node_box = composter_get_nodeboxes(0), - selection_box = {type = "regular"}, - tiles = { - "mcl_composter_bottom.png^mcl_composter_top.png", - "mcl_composter_bottom.png", - "mcl_composter_side.png" - }, - is_ground_content = false, - groups = { - handy=1, material_wood=1, deco_block=1, dirtifier=1, - flammable=2, fire_encouragement=3, fire_flammability=4, - }, - sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_hardness = 0.6, - _mcl_blast_resistance = 0.6, - _mcl_compost_level = 0, - on_rightclick = composter_add_item -}) - ---- Template function for composters with compost. --- --- For each fill level a custom node is registered. --- -local function register_filled_composter(level) - local id = "mcl_composters:composter_"..level - minetest.register_node(id, { - description = S("Composter") .. " (" .. level .. "/7 " .. S("filled") .. ")", - _doc_items_create_entry = false, - paramtype = "light", - drawtype = "nodebox", - node_box = composter_get_nodeboxes(level), - selection_box = {type = "regular"}, - tiles = { - "mcl_composter_compost.png^mcl_composter_top.png", - "mcl_composter_bottom.png", - "mcl_composter_side.png" - }, - is_ground_content = false, - groups = { - handy=1, material_wood=1, deco_block=1, dirtifier=1, - not_in_creative_inventory=1, not_in_craft_guide=1, - flammable=2, fire_encouragement=3, fire_flammability=4, - comparator_signal=level - }, - sounds = mcl_sounds.node_sound_wood_defaults(), - drop = "mcl_composters:composter", - _mcl_hardness = 0.6, - _mcl_blast_resistance = 0.6, - _mcl_compost_level = level, - on_rightclick = composter_add_item, - on_timer = composter_ready - }) - - -- Add entry aliases for the Help - if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_composters:composter", "nodes", id) - end -end - ---- Register filled composters (7 levels). --- -for level = 1, 7 do - register_filled_composter(level) -end - ---- Register composter that is ready to be harvested. --- -minetest.register_node("mcl_composters:composter_ready", { - description = S("Composter") .. "(" .. S("ready for harvest") .. ")", - _doc_items_create_entry = false, - paramtype = "light", - drawtype = "nodebox", - node_box = composter_get_nodeboxes(7), - selection_box = {type = "regular"}, - tiles = { - "mcl_composter_ready.png^mcl_composter_top.png", - "mcl_composter_bottom.png", - "mcl_composter_side.png" - }, - is_ground_content = false, - groups = { - handy=1, material_wood=1, deco_block=1, dirtifier=1, - not_in_creative_inventory=1, not_in_craft_guide=1, - flammable=2, fire_encouragement=3, fire_flammability=4, - comparator_signal=8 - }, - sounds = mcl_sounds.node_sound_wood_defaults(), - drop = "mcl_composters:composter", - _mcl_hardness = 0.6, - _mcl_blast_resistance = 0.6, - _mcl_compost_level = 7, - on_rightclick = composter_harvest -}) - --- Add entry aliases for the Help -if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_composters:composter", - "nodes", "mcl_composters:composter_ready" ) -end diff --git a/mods/ITEMS/mcl_composters/locale/template.txt b/mods/ITEMS/mcl_composters/locale/template.txt deleted file mode 100644 index c5f9bb858e..0000000000 --- a/mods/ITEMS/mcl_composters/locale/template.txt +++ /dev/null @@ -1,7 +0,0 @@ -# textdomain: mcl_composters -Composter= -Composters can convert various organic items into bonemeal.= -Use organic items on the composter to fill it with layers of compost. Every time an item is put in the composter, there is a chance that the composter adds another layer of compost. Some items have a bigger chance of adding an extra layer than other items. After filling up with 7 layers of compost, the composter is full. After a delay of approximately one second the composter becomes ready and bone meal can be retrieved from it. Right-clicking the composter takes out the bone meal empties the composter."= -filled= -ready for harvest= -Converts organic items into bonemeal= diff --git a/mods/ITEMS/mcl_composters/mod.conf b/mods/ITEMS/mcl_composters/mod.conf deleted file mode 100644 index 86d7298875..0000000000 --- a/mods/ITEMS/mcl_composters/mod.conf +++ /dev/null @@ -1,5 +0,0 @@ -name = mcl_composters -author = kabou -description = Composters can convert various organic items into bonemeal. -depends = mcl_core, mcl_sounds, mcl_dye -optional_depends = doc diff --git a/mods/ITEMS/mcl_composters/textures/mcl_composter_bottom.png b/mods/ITEMS/mcl_composters/textures/mcl_composter_bottom.png deleted file mode 100644 index cfed3a8a5c..0000000000 Binary files a/mods/ITEMS/mcl_composters/textures/mcl_composter_bottom.png and /dev/null differ diff --git a/mods/ITEMS/mcl_composters/textures/mcl_composter_compost.png b/mods/ITEMS/mcl_composters/textures/mcl_composter_compost.png deleted file mode 100644 index afda87c716..0000000000 Binary files a/mods/ITEMS/mcl_composters/textures/mcl_composter_compost.png and /dev/null differ diff --git a/mods/ITEMS/mcl_composters/textures/mcl_composter_ready.png b/mods/ITEMS/mcl_composters/textures/mcl_composter_ready.png deleted file mode 100644 index 7caf79f96e..0000000000 Binary files a/mods/ITEMS/mcl_composters/textures/mcl_composter_ready.png and /dev/null differ diff --git a/mods/ITEMS/mcl_composters/textures/mcl_composter_side.png b/mods/ITEMS/mcl_composters/textures/mcl_composter_side.png deleted file mode 100644 index c9e5a6fe3c..0000000000 Binary files a/mods/ITEMS/mcl_composters/textures/mcl_composter_side.png and /dev/null differ diff --git a/mods/ITEMS/mcl_composters/textures/mcl_composter_top.png b/mods/ITEMS/mcl_composters/textures/mcl_composter_top.png deleted file mode 100644 index fc6e202d3c..0000000000 Binary files a/mods/ITEMS/mcl_composters/textures/mcl_composter_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_copper/README.md b/mods/ITEMS/mcl_copper/README.md deleted file mode 100644 index 6a6f2d7d2f..0000000000 --- a/mods/ITEMS/mcl_copper/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# MineClone2 Copper - -### by NO11 - -Adds copper ore, blocks and items. - -![screenshot](./screenshot.png) diff --git a/mods/ITEMS/mcl_copper/crafting.lua b/mods/ITEMS/mcl_copper/crafting.lua deleted file mode 100644 index 7b1e183c79..0000000000 --- a/mods/ITEMS/mcl_copper/crafting.lua +++ /dev/null @@ -1,76 +0,0 @@ -minetest.register_craft({ - output = "mcl_copper:block_raw", - recipe = { - { "mcl_copper:raw_copper", "mcl_copper:raw_copper", "mcl_copper:raw_copper" }, - { "mcl_copper:raw_copper", "mcl_copper:raw_copper", "mcl_copper:raw_copper" }, - { "mcl_copper:raw_copper", "mcl_copper:raw_copper", "mcl_copper:raw_copper" }, - }, -}) - -minetest.register_craft({ - output = "mcl_copper:block", - recipe = { - { "mcl_copper:copper_ingot", "mcl_copper:copper_ingot" }, - { "mcl_copper:copper_ingot", "mcl_copper:copper_ingot" }, - }, -}) - -minetest.register_craft({ - output = "mcl_copper:block_cut 4", - recipe = { - { "mcl_copper:block", "mcl_copper:block" }, - { "mcl_copper:block", "mcl_copper:block" }, - }, -}) - -minetest.register_craft({ - output = "mcl_copper:block_exposed_cut 4", - recipe = { - { "mcl_copper:block_exposed", "mcl_copper:block_exposed" }, - { "mcl_copper:block_exposed", "mcl_copper:block_exposed" }, - }, -}) - -minetest.register_craft({ - output = "mcl_copper:block_oxidized_cut 4", - recipe = { - { "mcl_copper:block_oxidized", "mcl_copper:block_oxidized" }, - { "mcl_copper:block_oxidized", "mcl_copper:block_oxidized" }, - }, -}) - -minetest.register_craft({ - output = "mcl_copper:mcl_copper:block_weathered_cut 4", - recipe = { - { "mcl_copper:block_weathered", "mcl_copper:block_weathered" }, - { "mcl_copper:block_weathered", "mcl_copper:block_weathered" }, - }, -}) - -minetest.register_craft({ - output = "mcl_copper:copper_ingot 4", - recipe = { - { "mcl_copper:block" }, - }, -}) - -minetest.register_craft({ - output = "mcl_copper:raw_copper 9", - recipe = { - { "mcl_copper:block_raw" }, - }, -}) - -minetest.register_craft({ - type = "cooking", - output = "mcl_copper:copper_ingot", - recipe = "mcl_copper:raw_copper", - cooktime = 10, -}) - -minetest.register_craft({ - type = "cooking", - output = "mcl_copper:copper_ingot", - recipe = "mcl_copper:stone_with_copper", - cooktime = 10, -}) \ No newline at end of file diff --git a/mods/ITEMS/mcl_copper/functions.lua b/mods/ITEMS/mcl_copper/functions.lua deleted file mode 100644 index b6e0cb7e26..0000000000 --- a/mods/ITEMS/mcl_copper/functions.lua +++ /dev/null @@ -1,181 +0,0 @@ ---local deepslate_mod = minetest.get_modpath("mcl_deepslate") - -local function register_oxidation_abm(abm_name, node_name, oxidized_variant) - minetest.register_abm({ - label = abm_name, - nodenames = {node_name}, - interval = 500, - chance = 3, - action = function(pos, node) - minetest.swap_node(pos, {name = oxidized_variant, param2 = node.param2}) - end, - }) -end - ---[[ -local stairs = { - {"stair", "exposed", "_inner", "cut_inner"}, - {"stair", "weathered", "_inner", "exposed_cut_inner"}, - {"stair", "exposed", "_outer", "cut_outer"}, - {"stair", "weathered", "_outer", "exposed_cut_outer"}, - {"stair", "oxidized", "_outer", "weathered_cut_outer"}, - {"stair", "oxidized", "_inner", "weathered_cut_inner"}, - {"slab", "exposed", "","cut"}, - {"slab", "oxidized", "","weathered_cut"}, - {"slab", "weathered", "","exposed_cut"}, - {"slab", "exposed", "_top","cut_top"}, - {"slab", "oxidized", "_top", "weathered_cut_top"}, - {"slab", "weathered", "_top","exposed_cut_top"}, - {"slab", "exposed", "_double","cut_double"}, - {"slab", "oxidized", "_double","weathered_cut_double"}, - {"slab", "weathered", "_double","exposed_cut_double"}, - {"stair", "exposed", "","cut"}, - {"stair", "oxidized", "", "weathered_cut"}, - {"stair", "weathered", "", "exposed_cut"}, -}]] - ---[[ -local function anti_oxidation_particles(pointed_thing) - local pos = pointed_thing.under - minetest.add_particlespawner({ - amount = 8, - time = 1, - minpos = {x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, - maxpos = {x = pos.x + 1, y = pos.y + 1, z = pos.z + 1}, - minvel = {x = 0, y = 0, z = 0}, - maxvel = {x = 0, y = 0, z = 0}, - minacc = {x = 0, y = 0, z = 0}, - maxacc = {x = 0, y = 0, z = 0}, - minexptime = 0.5, - maxexptime = 1, - minsize = 1, - maxsize = 2.5, - collisiondetection = false, - vertical = false, - texture = "mcl_copper_anti_oxidation_particle.png", - glow = 5, - }) -end - -local function add_wear(placer, itemstack) - if not minetest.is_creative_enabled(placer:get_player_name()) then - local tool = itemstack:get_name() - local wear = mcl_autogroup.get_wear(tool, "axey") - itemstack:add_wear(wear) - end -end - -local function anti_oxidation(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" then return end - - local node = minetest.get_node(pointed_thing.under) - local noddef = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name] - - if not placer:get_player_control().sneak and noddef.on_rightclick then - return minetest.item_place(itemstack, placer, pointed_thing) - end - - if minetest.is_protected(pointed_thing.under, placer:get_player_name()) then - minetest.record_protection_violation(pointed_thing.under, placer:get_player_name()) - return itemstack - end - - if noddef._mcl_stripped_variant == nil then - for _, c in pairs(stairs) do - if noddef.name == "mcl_stairs:"..c[1].."_copper_"..c[2].."_cut"..c[3] then - minetest.swap_node(pointed_thing.under, {name="mcl_stairs:"..c[1].."_copper_"..c[4], param2=node.param2}) - anti_oxidation_particles(pointed_thing) - add_wear(placer, itemstack) - end - end - if noddef._mcl_anti_oxidation_variant ~= nil then - minetest.swap_node(pointed_thing.under, {name=noddef._mcl_anti_oxidation_variant, param2=node.param2}) - anti_oxidation_particles(pointed_thing) - add_wear(placer, itemstack) - end - elseif noddef._mcl_stripped_variant ~= nil then - minetest.swap_node(pointed_thing.under, {name=noddef._mcl_stripped_variant, param2=node.param2}) - add_wear(placer, itemstack) - else - return itemstack - end - return itemstack -end - -local function register_axe_override(axe_name) - minetest.override_item("mcl_tools:axe_"..axe_name, { - on_place = anti_oxidation, - }) -end]] - ---[[ Commented out for now because there the discussion how to handle this is ongoing -local stonelike = {"mcl_core:stone", "mcl_core:diorite", "mcl_core:andesite", "mcl_core:granite"} -if not deepslate_mod then - if minetest.settings:get_bool("mcl_generate_ores", true) then - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_copper:stone_with_copper", - wherein = stonelike, - clust_scarcity = 830, - clust_num_ores = 5, - clust_size = 3, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_worlds.layer_to_y(39), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_copper:stone_with_copper", - wherein = stonelike, - clust_scarcity = 1660, - clust_num_ores = 4, - clust_size = 2, - y_min = mcl_worlds.layer_to_y(40), - y_max = mcl_worlds.layer_to_y(63), - }) - end -end ---]] -local block_oxidation = { - {"", "_exposed"}, - {"_cut", "_exposed_cut"}, - {"_exposed", "_weathered"}, - {"_exposed_cut", "_weathered_cut"}, - {"_weathered", "_oxidized"}, - {"_weathered_cut", "_oxidized_cut"} -} - -local stair_oxidation = { - {"slab", "cut", "exposed_cut"}, - {"slab", "exposed_cut", "weathered_cut"}, - {"slab", "weathered_cut", "oxidized_cut"}, - {"slab", "cut_top", "exposed_cut_top"}, - {"slab", "exposed_cut_top", "weathered_cut_top"}, - {"slab", "weathered_cut_top", "oxidized_cut_double"}, - {"slab", "cut_double", "exposed_cut_double"}, - {"slab", "exposed_cut_double", "weathered_cut_double"}, - {"slab", "weathered_cut_double", "oxidized_cut_double"}, - {"stair", "cut", "exposed_cut"}, - {"stair", "exposed_cut", "weathered_cut"}, - {"stair", "weathered_cut", "oxidized_cut"}, - {"stair", "cut_inner", "exposed_cut_inner"}, - {"stair", "exposed_cut_inner", "weathered_cut_inner"}, - {"stair", "weathered_cut_inner", "oxidized_cut_inner"}, - {"stair", "cut_outer", "exposed_cut_outer"}, - {"stair", "exposed_cut_outer", "weathered_cut_outer"}, - {"stair", "weathered_cut_outer", "oxidized_cut_outer"} -} - -for _, b in pairs(block_oxidation) do - register_oxidation_abm("Copper oxidation", "mcl_copper:block"..b[1], "mcl_copper:block"..b[2]) -end - -for _, s in pairs(stair_oxidation) do - register_oxidation_abm("Copper oxidation", "mcl_stairs:"..s[1].."_copper_"..s[2], "mcl_stairs:"..s[1].."_copper_"..s[3]) -end - ---local axes = {"wood", "stone", "iron", "gold", "diamond"} ---[[ -for _, axe in pairs(axes) do - register_axe_override(axe) -end -]] diff --git a/mods/ITEMS/mcl_copper/init.lua b/mods/ITEMS/mcl_copper/init.lua deleted file mode 100644 index ea15e58274..0000000000 --- a/mods/ITEMS/mcl_copper/init.lua +++ /dev/null @@ -1,6 +0,0 @@ -local path = minetest.get_modpath("mcl_copper") - -dofile(path .. "/nodes.lua") -dofile(path .. "/items.lua") -dofile(path .. "/crafting.lua") -dofile(path .. "/functions.lua") \ No newline at end of file diff --git a/mods/ITEMS/mcl_copper/items.lua b/mods/ITEMS/mcl_copper/items.lua deleted file mode 100644 index 450ec8cb38..0000000000 --- a/mods/ITEMS/mcl_copper/items.lua +++ /dev/null @@ -1,15 +0,0 @@ -local S = minetest.get_translator("mcl_copper") - -minetest.register_craftitem("mcl_copper:copper_ingot", { - description = S("Copper Ingot"), - _doc_items_longdesc = S("Molten Raw Copper. It is used to craft blocks."), - inventory_image = "mcl_copper_ingot.png", - groups = { craftitem = 1 }, -}) - -minetest.register_craftitem("mcl_copper:raw_copper", { - description = S("Raw Copper"), - _doc_items_longdesc = S("Raw Copper. Mine a Copper Ore to get it."), - inventory_image = "mcl_copper_raw.png", - groups = { craftitem = 1 }, -}) \ No newline at end of file diff --git a/mods/ITEMS/mcl_copper/locale/mcl_copper.de.tr b/mods/ITEMS/mcl_copper/locale/mcl_copper.de.tr deleted file mode 100644 index cc2290e1e8..0000000000 --- a/mods/ITEMS/mcl_copper/locale/mcl_copper.de.tr +++ /dev/null @@ -1,37 +0,0 @@ -# textdomain: mcl_copper -A block of copper is mostly a decorative block.=Ein Kupferblock wird meistens als dekorativer Block verwendet. -A block used for compact raw copper storage.=Ein Block für die kompakte Lagerung von Rohkupfer. -Block of Copper=Kupferblock -Block of Raw Copper=Rohkupferblock -Copper Ingot=Kupfer Barren -Copper Ore=Kupfererz -Cut copper is a decorative block.=Ein Geschnittener Kupferblock ist ein dekorativer Block. -Cut Copper=Geschnittener Kupferblock -Double Slab of Cut Copper=Doppelte Geschnittene Kupferstufe -Double Slab of Exposed Cut Copper=Doppelte Angelaufene Geschnittene Kupferstufe -Double Slab of Oxidized Cut Copper=Doppelte Oxidierte Geschnittene Kupferstufe -Double Slab of Weathered Cut Copper=Doppelte Verwitterte Geschnittene Kupferstufe -Exposed copper is a decorative block.=Ein Angelaufener Kupferblock ist ein dekorativer Block. -Exposed Copper=Angelaufener Kupferblock -Exposed cut copper is a decorative block.=Ein Angelaufener geschnittener Kupferblock ist ein dekorativer Block. -Exposed Cut Copper=Angelaufener geschnittener Kupferblock -Molten Raw Copper. It is used to craft blocks.=Geschmolzenes Rohkupfer. Es wird verwendet, um Blöcke herzustellen. -Oxidized copper is a decorative block.=Ein Oxidierter Kupferblockist ist ein dekorativer Block. -Oxidized Copper=Oxidierter Kupferblock -Oxidized cut copper is a decorative block.=Ein Oxidierter geschnittener Kupferblock ist ein dekorativer Block. -Oxidized Cut Copper=Oxidierter geschnittener Kupferblock -Raw Copper. Mine a Copper Ore to get it.=Bauen sie ein Kupfererz ab, um es zu erhalten. -Raw Copper=Rohkupfer -Slab of Cut Copper=Geschnittene Kupferstufe -Slab of Exposed Cut Copper=Angelaufene Geschnittene Kupferstufe -Slab of Oxidized Cut Copper=Oxidierte Geschnittene Kupferstufe -Slab of Weathered Cut Copper=Verwitterte Geschnittene Kupferstufe -Some copper contained in stone, it is pretty common and can be found below sea level.=Stein, in dem etwas Kupfer enthalten ist. Es ist ziemlich häufig und kann unter dem Meeresspiegel gefunden werden. -Stairs of Cut Copper=Geschnittene Kupfertreppe -Stairs of Exposed Cut Copper=Angelaufene Geschnittene Kupfertreppe -Stairs of Oxidized Cut Copper=Oxidierte Geschnittene Kupfertreppe -Stairs of Weathered Cut Copper=Verwitterte Geschnittene Kupfertreppe -Weathered copper is a decorative block.=Ein Verwitterter Kupferblock ist ein dekorativer Block. -Weathered Copper=Verwitterter Kupferblock -Weathered cut copper is a decorative block.=Ein Verwitterter geschnittener Kupferblock ist ein dekorativer Block. -Weathered Cut Copper=Verwitterter geschnittener Kupferblock diff --git a/mods/ITEMS/mcl_copper/locale/template.txt b/mods/ITEMS/mcl_copper/locale/template.txt deleted file mode 100644 index 050c099ee2..0000000000 --- a/mods/ITEMS/mcl_copper/locale/template.txt +++ /dev/null @@ -1,37 +0,0 @@ -# textdomain: mcl_copper -A block of copper is mostly a decorative block.= -A block used for compact raw copper storage.= -Block of Copper= -Block of Raw Copper= -Copper Ingot= -Copper Ore= -Cut copper is a decorative block.= -Cut Copper= -Double Slab of Cut Copper= -Double Slab of Exposed Cut Copper= -Double Slab of Oxidized Cut Copper= -Double Slab of Weathered Cut Copper= -Exposed copper is a decorative block.= -Exposed Copper= -Exposed cut copper is a decorative block.= -Exposed Cut Copper= -Molten Raw Copper. It is used to craft blocks.= -Oxidized copper is a decorative block.= -Oxidized Copper= -Oxidized cut copper is a decorative block.= -Oxidized Cut Copper= -Raw Copper. Mine a Copper Ore to get it.= -Raw Copper= -Slab of Cut Copper= -Slab of Exposed Cut Copper= -Slab of Oxidized Cut Copper= -Slab of Weathered Cut Copper= -Some copper contained in stone, it is pretty common and can be found below sea level.= -Stairs of Cut Copper= -Stairs of Exposed Cut Copper= -Stairs of Oxidized Cut Copper= -Stairs of Weathered Cut Copper= -Weathered copper is a decorative block.= -Weathered Copper= -Weathered cut copper is a decorative block.= -Weathered Cut Copper= diff --git a/mods/ITEMS/mcl_copper/mod.conf b/mods/ITEMS/mcl_copper/mod.conf deleted file mode 100644 index dde96263ae..0000000000 --- a/mods/ITEMS/mcl_copper/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = mcl_copper -author = NO11 -depends = mcl_core, mcl_sounds, mcl_stairs -description = Adds Copper Ore, blocks and items. diff --git a/mods/ITEMS/mcl_copper/nodes.lua b/mods/ITEMS/mcl_copper/nodes.lua deleted file mode 100644 index 38fbb6c3d8..0000000000 --- a/mods/ITEMS/mcl_copper/nodes.lua +++ /dev/null @@ -1,177 +0,0 @@ -local S = minetest.get_translator("mcl_copper") - -minetest.register_node("mcl_copper:stone_with_copper", { - description = S("Copper Ore"), - _doc_items_longdesc = S("Some copper contained in stone, it is pretty common and can be found below sea level."), - tiles = {"default_stone.png^mcl_copper_ore.png"}, - is_ground_content = true, - groups = {pickaxey = 3, building_block = 1, material_stone = 1, blast_furnace_smeltable=1}, - drop = "mcl_copper:raw_copper", - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 3, - _mcl_hardness = 3, - _mcl_silk_touch_drop = true, - _mcl_fortune_drop = mcl_core.fortune_drop_ore, - -}) - -minetest.register_node("mcl_copper:block_raw", { - description = S("Block of Raw Copper"), - _doc_items_longdesc = S("A block used for compact raw copper storage."), - tiles = {"mcl_copper_block_raw.png"}, - is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 6, - _mcl_hardness = 5, -}) - -minetest.register_node("mcl_copper:block", { - description = S("Block of Copper"), - _doc_items_longdesc = S("A block of copper is mostly a decorative block."), - tiles = {"mcl_copper_block.png"}, - is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 6, - _mcl_hardness = 5, -}) - -minetest.register_node("mcl_copper:block_exposed", { - description = S("Exposed Copper"), - _doc_items_longdesc = S("Exposed copper is a decorative block."), - tiles = {"mcl_copper_exposed.png"}, - is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 6, - _mcl_hardness = 5, - _mcl_anti_oxidation_varient = "mcl_copper:block", -}) - -minetest.register_node("mcl_copper:block_oxidized", { - description = S("Oxidized Copper"), - _doc_items_longdesc = S("Oxidized copper is a decorative block."), - tiles = {"mcl_copper_oxidized.png"}, - is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 6, - _mcl_hardness = 5, - _mcl_anti_oxidation_varient = "mcl_copper:block_weathered", -}) - -minetest.register_node("mcl_copper:block_weathered", { - description = S("Weathered Copper"), - _doc_items_longdesc = S("Weathered copper is a decorative block."), - tiles = {"mcl_copper_weathered.png"}, - is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 6, - _mcl_hardness = 5, - _mcl_anti_oxidation_varient = "mcl_copper:block_exposed", -}) - -minetest.register_node("mcl_copper:block_cut", { - description = S("Cut Copper"), - _doc_items_longdesc = S("Cut copper is a decorative block."), - tiles = {"mcl_copper_block_cut.png"}, - is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 6, - _mcl_hardness = 5, -}) - -minetest.register_node("mcl_copper:block_exposed_cut", { - description = S("Exposed Cut Copper"), - _doc_items_longdesc = S("Exposed cut copper is a decorative block."), - tiles = {"mcl_copper_exposed_cut.png"}, - is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 6, - _mcl_hardness = 5, - _mcl_anti_oxidation_varient = "mcl_copper:block_cut", -}) - -minetest.register_node("mcl_copper:block_oxidized_cut", { - description = S("Oxidized Cut Copper"), - _doc_items_longdesc = S("Oxidized cut copper is a decorative block."), - tiles = {"mcl_copper_oxidized_cut.png"}, - is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 6, - _mcl_hardness = 5, - _mcl_anti_oxidation_varient = "mcl_copper:block_weathered_cut", -}) - -minetest.register_node("mcl_copper:block_weathered_cut", { - description = S("Weathered Cut Copper"), - _doc_items_longdesc = S("Weathered cut copper is a decorative block."), - tiles = {"mcl_copper_weathered_cut.png"}, - is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, - sounds = mcl_sounds.node_sound_metal_defaults(), - _mcl_blast_resistance = 6, - _mcl_hardness = 5, - _mcl_anti_oxidation_varient = "mcl_copper:block_exposed_cut", -}) - -mcl_stairs.register_slab("copper_cut", "mcl_copper:block_cut", - {pickaxey = 2}, - {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, - S("Slab of Cut Copper"), - nil, nil, nil, - S("Double Slab of Cut Copper")) - -mcl_stairs.register_slab("copper_exposed_cut", "mcl_copper:block_exposed_cut", - {pickaxey = 2}, - {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, - S("Slab of Exposed Cut Copper"), - nil, nil, nil, - S("Double Slab of Exposed Cut Copper")) - -mcl_stairs.register_slab("copper_oxidized_cut", "mcl_copper:block_oxidized_cut", - {pickaxey = 2}, - {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, - S("Slab of Oxidized Cut Copper"), - nil, nil, nil, - S("Double Slab of Oxidized Cut Copper")) - -mcl_stairs.register_slab("copper_weathered_cut", "mcl_copper:block_weathered_cut", - {pickaxey = 2}, - {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, - S("Slab of Weathered Cut Copper"), - nil, nil, nil, - S("Double Slab of Weathered Cut Copper")) - -mcl_stairs.register_stair("copper_cut", "mcl_copper:block_cut", - {pickaxey = 2}, - {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, - S("Stairs of Cut Copper"), - nil, 6, nil, - "woodlike") - -mcl_stairs.register_stair("copper_exposed_cut", "mcl_copper:block_exposed_cut", - {pickaxey = 2}, - {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, - S("Stairs of Exposed Cut Copper"), - nil, 6, nil, - "woodlike") - -mcl_stairs.register_stair("copper_oxidized_cut", "mcl_copper:block_oxidized_cut", - {pickaxey = 2}, - {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, - S("Stairs of Oxidized Cut Copper"), - nil, 6, nil, - "woodlike") - -mcl_stairs.register_stair("copper_weathered_cut", "mcl_copper:block_weathered_cut", - {pickaxey = 2}, - {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, - S("Stairs of Weathered Cut Copper"), - nil, 6, nil, - "woodlike") \ No newline at end of file diff --git a/mods/ITEMS/mcl_copper/screenshot.png b/mods/ITEMS/mcl_copper/screenshot.png deleted file mode 100644 index 032d45fb17..0000000000 Binary files a/mods/ITEMS/mcl_copper/screenshot.png and /dev/null differ diff --git a/mods/ITEMS/mcl_copper/textures/mcl_copper_anti_oxidation_particle.png b/mods/ITEMS/mcl_copper/textures/mcl_copper_anti_oxidation_particle.png deleted file mode 100644 index c7192df0eb..0000000000 Binary files a/mods/ITEMS/mcl_copper/textures/mcl_copper_anti_oxidation_particle.png and /dev/null differ diff --git a/mods/ITEMS/mcl_copper/textures/mcl_copper_block.png b/mods/ITEMS/mcl_copper/textures/mcl_copper_block.png deleted file mode 100644 index 31e0853abd..0000000000 Binary files a/mods/ITEMS/mcl_copper/textures/mcl_copper_block.png and /dev/null differ diff --git a/mods/ITEMS/mcl_copper/textures/mcl_copper_block_cut.png b/mods/ITEMS/mcl_copper/textures/mcl_copper_block_cut.png deleted file mode 100644 index 5f92b46934..0000000000 Binary files a/mods/ITEMS/mcl_copper/textures/mcl_copper_block_cut.png and /dev/null differ diff --git a/mods/ITEMS/mcl_copper/textures/mcl_copper_block_raw.png b/mods/ITEMS/mcl_copper/textures/mcl_copper_block_raw.png deleted file mode 100644 index 88404601e3..0000000000 Binary files a/mods/ITEMS/mcl_copper/textures/mcl_copper_block_raw.png and /dev/null differ diff --git a/mods/ITEMS/mcl_copper/textures/mcl_copper_exposed.png b/mods/ITEMS/mcl_copper/textures/mcl_copper_exposed.png deleted file mode 100644 index 0dc2a6d879..0000000000 Binary files a/mods/ITEMS/mcl_copper/textures/mcl_copper_exposed.png and /dev/null differ diff --git a/mods/ITEMS/mcl_copper/textures/mcl_copper_exposed_cut.png b/mods/ITEMS/mcl_copper/textures/mcl_copper_exposed_cut.png deleted file mode 100644 index 6c4a5e7dda..0000000000 Binary files a/mods/ITEMS/mcl_copper/textures/mcl_copper_exposed_cut.png and /dev/null differ diff --git a/mods/ITEMS/mcl_copper/textures/mcl_copper_ingot.png b/mods/ITEMS/mcl_copper/textures/mcl_copper_ingot.png deleted file mode 100644 index b75e9b9c97..0000000000 Binary files a/mods/ITEMS/mcl_copper/textures/mcl_copper_ingot.png and /dev/null differ diff --git a/mods/ITEMS/mcl_copper/textures/mcl_copper_ore.png b/mods/ITEMS/mcl_copper/textures/mcl_copper_ore.png deleted file mode 100644 index 3ad14fb994..0000000000 Binary files a/mods/ITEMS/mcl_copper/textures/mcl_copper_ore.png and /dev/null differ diff --git a/mods/ITEMS/mcl_copper/textures/mcl_copper_oxidized.png b/mods/ITEMS/mcl_copper/textures/mcl_copper_oxidized.png deleted file mode 100644 index 5bea2569e1..0000000000 Binary files a/mods/ITEMS/mcl_copper/textures/mcl_copper_oxidized.png and /dev/null differ diff --git a/mods/ITEMS/mcl_copper/textures/mcl_copper_oxidized_cut.png b/mods/ITEMS/mcl_copper/textures/mcl_copper_oxidized_cut.png deleted file mode 100644 index f28af71c37..0000000000 Binary files a/mods/ITEMS/mcl_copper/textures/mcl_copper_oxidized_cut.png and /dev/null differ diff --git a/mods/ITEMS/mcl_copper/textures/mcl_copper_raw.png b/mods/ITEMS/mcl_copper/textures/mcl_copper_raw.png deleted file mode 100644 index fda0f886df..0000000000 Binary files a/mods/ITEMS/mcl_copper/textures/mcl_copper_raw.png and /dev/null differ diff --git a/mods/ITEMS/mcl_copper/textures/mcl_copper_weathered.png b/mods/ITEMS/mcl_copper/textures/mcl_copper_weathered.png deleted file mode 100644 index 75b352133f..0000000000 Binary files a/mods/ITEMS/mcl_copper/textures/mcl_copper_weathered.png and /dev/null differ diff --git a/mods/ITEMS/mcl_copper/textures/mcl_copper_weathered_cut.png b/mods/ITEMS/mcl_copper/textures/mcl_copper_weathered_cut.png deleted file mode 100644 index 306329eb77..0000000000 Binary files a/mods/ITEMS/mcl_copper/textures/mcl_copper_weathered_cut.png and /dev/null differ diff --git a/mods/ITEMS/mcl_deepslate/README.md b/mods/ITEMS/mcl_deepslate/README.md deleted file mode 100644 index 398e703616..0000000000 --- a/mods/ITEMS/mcl_deepslate/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Mineclone2 New Ores and Deepslate -by NO11 - -This mod adds Deepslate to the Minetest game Mineclone2, which Minecraft adds in version 1.17. -Find new ores or build something from the 30 new blocks! Deepslate is generated directly above the lava layer in overworld. - -Important: You need my "Mineclone2 Raw Ores" mod for this mod to work! -All other dependencies are automatically in the mineclone2 game. -Optionally use "Mineclone2 Copper" to get the deepslate copper ore as well. - - -You can find all craft recipes for deepslate blocks here: https://minecraft.fandom.com/wiki/Deepslate_(disambiguation) -(just click on the respective block) - -Textures are from Pixel Perfection! diff --git a/mods/ITEMS/mcl_deepslate/init.lua b/mods/ITEMS/mcl_deepslate/init.lua deleted file mode 100644 index 6b03358e29..0000000000 --- a/mods/ITEMS/mcl_deepslate/init.lua +++ /dev/null @@ -1,440 +0,0 @@ -local modname = minetest.get_current_modname() -local S = minetest.get_translator(modname) - ---local layer_max = mcl_worlds.layer_to_y(16) ---local layer_min = mcl_vars.mg_overworld_min - -local copper_mod = minetest.get_modpath("mcl_copper") - -local cobble = "mcl_deepslate:deepslate_cobbled" -local stick = "mcl_core:stick" - ---[[ -local mountains = { - "ExtremeHills", "ExtremeHills_beach", "ExtremeHills_ocean", "ExtremeHills_deep_ocean", "ExtremeHills_underground", - "ExtremeHills+", "ExtremeHills+_ocean", "ExtremeHills+_deep_ocean", "ExtremeHills+_underground", - "ExtremeHillsM", "ExtremeHillsM_ocean", "ExtremeHillsM_deep_ocean", "ExtremeHillsM_underground", -} -]] - -minetest.register_node("mcl_deepslate:deepslate", { - description = S("Deepslate"), - _doc_items_longdesc = S("Deepslate is a stone type found deep underground in the Overworld that functions similar to regular stone but is harder than the stone."), - _doc_items_hidden = false, - tiles = { "mcl_deepslate_top.png", "mcl_deepslate_top.png", "mcl_deepslate.png" }, - paramtype2 = "facedir", - is_ground_content = true, - on_place = mcl_util.rotate_axis, - groups = { pickaxey = 1, stone = 1, building_block = 1, material_stone = 1 }, - drop = cobble, - sounds = mcl_sounds.node_sound_stone_defaults(), - on_rotate = screwdriver.rotate_3way, - _mcl_blast_resistance = 6, - _mcl_hardness = 3, - _mcl_silk_touch_drop = true, -}) - -local function spawn_silverfish(pos, oldnode, oldmetadata, digger) - if not minetest.is_creative_enabled("") then - minetest.add_entity(pos, "mobs_mc:silverfish") - end -end - -minetest.register_node("mcl_deepslate:infested_deepslate", { - description = S("Infested Deepslate"), - _doc_items_longdesc = S("An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart."), - _tt_help = S("Hides a silverfish"), - tiles = { "mcl_deepslate_top.png", "mcl_deepslate_top.png", "mcl_deepslate.png" }, - is_ground_content = true, - groups = { dig_immediate = 3, spawns_silverfish = 1, deco_block = 1 }, - drop = "", - sounds = mcl_sounds.node_sound_stone_defaults(), - after_dig_node = spawn_silverfish, - _mcl_hardness = 0, - _mcl_blast_resistance = 0.5, -}) - -minetest.register_node("mcl_deepslate:tuff", { - description = S("Tuff"), - _doc_items_longdesc = S("Tuff is an ornamental rock formed from volcanic ash, occurring in underground blobs below Y=16."), - _doc_items_hidden = false, - tiles = { "mcl_deepslate_tuff.png" }, - groups = { pickaxey = 1, deco_block = 1 }, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 6, - _mcl_hardness = 1.5, - _mcl_silk_touch_drop = true, -}) - -local function register_deepslate_ore(desc, drop, cooked, pick, xp) - local item = desc:lower() - local item_string - if item == "lapis lazuli" then - item_string = "lapis" - else - item_string = item - end - local nodename = "mcl_deepslate:deepslate_with_"..item_string - minetest.register_node(nodename, { - description = S("Deepslate "..desc.." Ore"), - _doc_items_longdesc = S("Deepslate "..item.." ore is a variant of "..item.." ore that can generate in deepslate and tuff blobs."), - _doc_items_hidden = false, - tiles = { "mcl_deepslate_"..item_string.."_ore.png" }, - is_ground_content = true, - stack_max = 64, - groups = { pickaxey = pick, building_block = 1, material_stone = 1, xp = xp }, - drop = drop, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 3, - _mcl_hardness = 4.5, - _mcl_silk_touch_drop = true, - _mcl_fortune_drop = mcl_core.fortune_drop_ore, - }) - - minetest.register_craft({ - type = "cooking", - output = cooked, - recipe = nodename, - cooktime = 10, - }) -end - -local lapis_drops = { - max_items = 1, items = { - { items = { "mcl_dye:blue 8" }, rarity = 5 }, - { items = { "mcl_dye:blue 7" }, rarity = 5 }, - { items = { "mcl_dye:blue 6" }, rarity = 5 }, - { items = { "mcl_dye:blue 5" }, rarity = 5 }, - { items = { "mcl_dye:blue 4" } } - } -} - -local deepslate_ores = { - { "Coal", "mcl_core:coal_lump", "mcl_core:coal_lump", 1, 1 }, - { "Iron", "mcl_raw_ores:raw_iron", "mcl_core:iron_ingot", 3, 0 }, - { "Gold", "mcl_raw_ores:raw_gold", "mcl_core:gold_ingot", 4, 0 }, - { "Emerald", "mcl_core:emerald", "mcl_core:emerald", 4, 6 }, - { "Diamond", "mcl_core:diamond", "mcl_core:diamond", 4, 4 }, - { "Lapis Lazuli", lapis_drops, "mcl_dye:blue", 3, 6 }, -} - -for _, p in pairs(deepslate_ores) do - register_deepslate_ore(p[1], p[2], p[3], p[4], p[5]) -end - -if copper_mod then - register_deepslate_ore("Copper", "mcl_copper:raw_copper", "mcl_copper:copper_ingot", 4, 4) -end - -local redstone_timer = 68.28 - -local function redstone_ore_activate(pos) - minetest.swap_node(pos, { name = "mcl_deepslate:deepslate_with_redstone_lit" }) - local t = minetest.get_node_timer(pos) - t:start(redstone_timer) -end - -local function redstone_ore_reactivate(pos) - local t = minetest.get_node_timer(pos) - t:start(redstone_timer) -end - -minetest.register_node("mcl_deepslate:deepslate_with_redstone", { - description = S("Deepslate Redstone Ore"), - _doc_items_longdesc = S("Deepslate redstone ore is a variant of redstone ore that can generate in deepslate and tuff blobs."), - tiles = { "mcl_deepslate_redstone_ore.png" }, - is_ground_content = true, - groups = { pickaxey = 4, building_block = 1, material_stone = 1, xp = 7 }, - drop = { - items = { - max_items = 1, - { items = { "mesecons:redstone 4" }, rarity = 2 }, - { items = { "mesecons:redstone 5" } }, - } - }, - sounds = mcl_sounds.node_sound_stone_defaults(), - on_punch = redstone_ore_activate, - on_walk_over = redstone_ore_activate, - _mcl_blast_resistance = 3, - _mcl_hardness = 4.5, - _mcl_silk_touch_drop = true, - _mcl_fortune_drop = { - discrete_uniform_distribution = true, - items = { "mesecons:redstone" }, - min_count = 4, - max_count = 5, - } -}) - -minetest.register_node("mcl_deepslate:deepslate_with_redstone_lit", { - description = S("Lit Deepslate Redstone Ore"), - _doc_items_create_entry = false, - tiles = { "mcl_deepslate_redstone_ore.png" }, - paramtype = "light", - light_source = 9, - is_ground_content = true, - groups = { pickaxey = 4, not_in_creative_inventory = 1, material_stone = 1, xp = 7 }, - drop = { - items = { - max_items = 1, - { items = { "mesecons:redstone 4" }, rarity = 2 }, - { items = { "mesecons:redstone 5" } }, - } - }, - sounds = mcl_sounds.node_sound_stone_defaults(), - on_punch = redstone_ore_reactivate, - on_walk_over = redstone_ore_reactivate, -- Uses walkover mod - on_timer = function(pos, _) - minetest.swap_node(pos, { name = "mcl_deepslate:deepslate_with_redstone" }) - end, - _mcl_blast_resistance = 3, - _mcl_hardness = 4.5, - _mcl_silk_touch_drop = { "mcl_deepslate:deepslate_with_redstone" }, - _mcl_fortune_drop = { - discrete_uniform_distribution = true, - items = { "mesecons:redstone" }, - min_count = 4, - max_count = 5, - }, -}) - -minetest.register_craft({ - type = "cooking", - output = "mesecons:redstone", - recipe = "mcl_deepslate:deepslate_with_redstone", - cooktime = 10, -}) - ---[[ Commented out for now because there the discussion how to handle this is ongoing -minetest.register_ore({ - ore_type = "blob", - ore = "mcl_deepslate:deepslate", - wherein = { "mcl_core:stone" }, - clust_scarcity = 200, - clust_num_ores = 100, - clust_size = 10, - y_min = layer_min, - y_max = layer_max, - noise_params = { - offset = 0, - scale = 1, - spread = { x = 250, y = 250, z = 250 }, - seed = 12345, - octaves = 3, - persist = 0.6, - lacunarity = 2, - flags = "defaults", - } -}) - -minetest.register_ore({ - ore_type = "blob", - ore = "mcl_deepslate:tuff", - wherein = { "mcl_core:stone", "mcl_core:diorite", "mcl_core:andesite", "mcl_core:granite", "mcl_deepslate:deepslate" }, - clust_scarcity = 10*10*10, - clust_num_ores = 58, - clust_size = 7, - y_min = layer_min, - y_max = layer_max, - noise_params = { - offset = 0, - scale = 1, - spread = {x=250, y=250, z=250}, - seed = 12345, - octaves = 3, - persist = 0.6, - lacunarity = 2, - flags = "defaults", - } -}) - -minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_deepslate:infested_deepslate", - wherein = "mcl_deepslate:deepslate", - clust_scarcity = 26 * 26 * 26, - clust_num_ores = 3, - clust_size = 2, - y_min = layer_min, - y_max = layer_max, - biomes = mountains, -}) - -minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:water_source", - wherein = "mcl_deepslate:deepslate", - clust_scarcity = 9000, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_worlds.layer_to_y(5), - y_max = layer_max, -}) - -minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:lava_source", - wherein = "mcl_deepslate:deepslate", - clust_scarcity = 2000, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_worlds.layer_to_y(1), - y_max = mcl_worlds.layer_to_y(10), -}) - -minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:lava_source", - wherein = "mcl_deepslate:deepslate", - clust_scarcity = 9000, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_worlds.layer_to_y(11), - y_max = layer_max, -}) - - -if minetest.settings:get_bool("mcl_generate_ores", true) then - local stonelike = { "mcl_core:stone", "mcl_core:diorite", "mcl_core:andesite", "mcl_core:granite" } - local function register_ore_mg(ore, scarcity, num, size, y_min, y_max, biomes) - biomes = biomes or "" - minetest.register_ore({ - ore_type = "scatter", - ore = ore, - wherein = { "mcl_deepslate:deepslate", "mcl_deepslate:tuff" }, - clust_scarcity = scarcity, - clust_num_ores = num, - clust_size = size, - y_min = y_min, - y_max = y_max, - biomes = biomes, - }) - end - local ore_mapgen = { - { "coal", 1575, 5, 3, layer_min, layer_max }, - { "coal", 1530, 8, 3, layer_min, layer_max }, - { "coal", 1500, 12, 3, layer_min, layer_max }, - { "iron", 830, 5, 3, layer_min, layer_max }, - { "gold", 4775, 5, 3, layer_min, layer_max }, - { "gold", 6560, 7, 3, layer_min, layer_max }, - { "diamond", 10000, 4, 3, layer_min, mcl_worlds.layer_to_y(12) }, - { "diamond", 5000, 2, 3, layer_min, mcl_worlds.layer_to_y(12) }, - { "diamond", 10000, 8, 3, layer_min, mcl_worlds.layer_to_y(12) }, - { "diamond", 20000, 1, 1, mcl_worlds.layer_to_y(13), mcl_worlds.layer_to_y(15) }, - { "diamond", 20000, 2, 2, mcl_worlds.layer_to_y(13), mcl_worlds.layer_to_y(15) }, - { "redstone", 500, 4, 3, layer_min, mcl_worlds.layer_to_y(13) }, - { "redstone", 800, 7, 4, layer_min, mcl_worlds.layer_to_y(13) }, - { "redstone", 1000, 4, 3, mcl_worlds.layer_to_y(13), mcl_worlds.layer_to_y(15) }, - { "redstone", 1600, 7, 4, mcl_worlds.layer_to_y(13), mcl_worlds.layer_to_y(15) }, - { "lapis", 10000, 7, 4, mcl_worlds.layer_to_y(14), layer_max }, - { "lapis", 12000, 6, 3, mcl_worlds.layer_to_y(10), mcl_worlds.layer_to_y(13) }, - { "lapis", 14000, 5, 3, mcl_worlds.layer_to_y(6), mcl_worlds.layer_to_y(9) }, - { "lapis", 16000, 4, 3, mcl_worlds.layer_to_y(2), mcl_worlds.layer_to_y(5) }, - { "lapis", 18000, 3, 2, mcl_worlds.layer_to_y(0), mcl_worlds.layer_to_y(2) }, - } - for _, o in pairs(ore_mapgen) do - register_ore_mg("mcl_deepslate:deepslate_with_"..o[1], o[2], o[3], o[4], o[5], o[6]) - end - if minetest.get_mapgen_setting("mg_name") == "v6" then - register_ore_mg("mcl_deepslate:deepslate_with_emerald", 14340, 1, 1, layer_min, layer_max) - else - register_ore_mg("mcl_deepslate:deepslate_with_emerald", 16384, 1, 1, mcl_worlds.layer_to_y(4), layer_max, mountains) - end - if copper_mod then - register_ore_mg("mcl_deepslate:deepslate_with_copper", 830, 5, 3, layer_min, layer_max) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_copper:stone_with_copper", - wherein = stonelike, - clust_scarcity = 830, - clust_num_ores = 5, - clust_size = 3, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_worlds.layer_to_y(39), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_copper:stone_with_copper", - wherein = stonelike, - clust_scarcity = 1660, - clust_num_ores = 4, - clust_size = 2, - y_min = mcl_worlds.layer_to_y(40), - y_max = mcl_worlds.layer_to_y(63), - }) - end -end ---]] -local function register_deepslate_variant(item, desc, longdesc) - local texture = desc:lower():gsub("% ", "_") - local def = { - description = S(desc), - _doc_items_longdesc = S(longdesc), - _doc_items_hidden = false, - tiles = { "mcl_"..texture..".png" }, - groups = { pickaxey = 1, building_block = 1, material_stone = 1 }, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 6, - _mcl_hardness = 3.5, - _mcl_silk_touch_drop = true, - } - if item == "cobbled" then - def.groups.cobble = 1 - end - minetest.register_node("mcl_deepslate:deepslate_"..item, table.copy(def)) - - if item == "bricks" or item == "tiles" then - def.description = S("Cracked "..desc) - def._doc_items_longdesc = S("Cracked "..desc:lower().." are a cracked variant.") - def.tiles = { "mcl_cracked_"..texture..".png" } - minetest.register_node("mcl_deepslate:deepslate_"..item.."_cracked", def) - end - if item ~= "chiseled" then - mcl_stairs.register_stair_and_slab_simple("deepslate_"..item, "mcl_deepslate:deepslate_"..item, S(desc.." Stairs"), S(desc.." Slab"), S("Double "..desc.." Slab")) - mcl_walls.register_wall("mcl_deepslate:deepslate"..item.."wall", S(desc.." Wall"), "mcl_deepslate:deepslate_"..item) - end -end - -local deepslate_variants = { - { "cobbled", "Cobbled Deepslate", "Cobbled deepslate is a stone variant that functions similar to cobblestone or blackstone." }, - { "polished", "Polished Deepslate", "Polished deepslate is the stone-like polished version of deepslate." }, - { "bricks", "Deepslate Bricks", "Deepslate bricks are the brick version of deepslate." }, - { "tiles", "Deepslate Tiles", "Deepslate tiles are a decorative variant of deepslate." }, - { "chiseled", "Chiseled Deepslate", "Chiseled deepslate is the chiseled version of deepslate." }, -} - -for _, dv in pairs(deepslate_variants) do - register_deepslate_variant(dv[1], dv[2], dv[3]) -end - -for i = 1, 3 do - local s = "mcl_deepslate:deepslate_"..deepslate_variants[i][1] - minetest.register_craft({ - output = "mcl_deepslate:deepslate_"..deepslate_variants[i+1][1].." 4", - recipe = { { s, s }, { s, s } } - }) -end - -for _, p in pairs({ "bricks", "tiles" }) do - minetest.register_craft({ - type = "cooking", - output = "mcl_deepslate:deepslate_"..p.."_cracked", - recipe = "mcl_deepslate:deepslate_"..p, - cooktime = 10, - }) -end - -minetest.register_craft({ - type = "cooking", - output = "mcl_deepslate:deepslate", - recipe = cobble, - cooktime = 10, -}) - -minetest.register_craft({ - output = "mcl_deepslate:deepslate_chiseled", - recipe = { - { "mcl_stairs:slab_deepslate_cobbled" }, - { "mcl_stairs:slab_deepslate_cobbled" }, - }, -}) diff --git a/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.de.tr b/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.de.tr deleted file mode 100644 index 35cf86869b..0000000000 --- a/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.de.tr +++ /dev/null @@ -1,53 +0,0 @@ -# textdomain: mcl_deepslate -An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Ein befallener Block ist ein Block, aus dem ein Silberfisch herausspringt, wenn er abgebaut wird. Er sieht genauso aus wie sein normales Gegenstück. -Chiseled deepslate is the chiseled version of deepslate.=Gemeißelter Tiefenschiefer ist die behauene Version von Tiefenschiefer. -Chiseled Deepslate=Gemeißelter Tiefenschiefer -Cobbled deepslate is a stone variant that functions similar to cobblestone or blackstone.=Bruchtiefenschiefer funktioniert ähnlich wie Bruchstein, hat jedoch eine längere Abbauzeit. -Cobbled Deepslate Slab=Bruchtiefenschieferstufe -Cobbled Deepslate Stairs=Bruchtiefenschiefertreppe -Cobbled Deepslate Wall=Bruchtiefenschiefermauer -Cobbled Deepslate=Bruchtiefenschiefer -Cracked Deepslate Bricks=Rissige Tiefenschieferziegel -Cracked Deepslate Tiles=Rissige Tiefenschieferfliesen -Deepslate bricks are the brick version of deepslate.=Tiefenschieferziegel ist eine Variante des Tiefenschiefers. Er kann als dekorativer Block verwendet werden. -Deepslate Bricks Slab=Tiefenschieferziegelstufe -Deepslate Bricks Stairs=Tiefenschieferziegeltreppe -Deepslate Bricks Wall=Tiefenschieferziegelmauer -Deepslate Bricks=Tiefenschieferziegel -Deepslate coal ore is a variant of coal ore that can generate in deepslate and tuff blobs.=Tiefenschiefer-Steinkohle ist eine Variante von Steinkohle, die in Tiefenschiefer und Tuff generiert werden kann. -Deepslate Coal Ore=Tiefenschiefer-Steinkohle -Deepslate copper ore is a variant of copper ore that can generate in deepslate and tuff blobs.=Tiefenschiefer-Kupfererz ist eine Variante von Kupfererz, die in Tiefenschiefer und Tuff generiert werden kann. -Deepslate Copper Ore=Tiefenschiefer-Kupfererz -Deepslate diamond ore is a variant of diamond ore that can generate in deepslate and tuff blobs.=Tiefenschiefer-Diamanterz ist eine Variante von Diamanterz, die in Tiefenschiefer und Tuff generiert werden kann. -Deepslate Diamond Ore=Tiefenschiefer-Diamanterz -Deepslate emerald ore is a variant of emerald ore that can generate in deepslate and tuff blobs.=Tiefenschiefer-Smaragderz ist eine Variante von Smaragderz, die in Tiefenschiefer und Tuff generiert werden kann. -Deepslate Emerald Ore=Tiefenschiefer-Smaragderz -Deepslate gold ore is a variant of gold ore that can generate in deepslate and tuff blobs.=Tiefenschiefer-Golderz ist eine Variante von Golderz, die in Tiefenschiefer und Tuff generiert werden kann. -Deepslate Gold Ore=Tiefenschiefer-Golderz -Deepslate iron ore is a variant of iron ore that can generate in deepslate and tuff blobs.=Tiefenschiefer-Eisenerz ist eine Variante von Eisenerz, die in Tiefenschiefer und Tuff generiert werden kann. -Deepslate Iron Ore=Tiefenschiefer-Eisenerz -Deepslate is a stone type found deep underground in the Overworld that functions similar to regular stone but is harder than the stone.=Tiefenschiefer ist eine Gesteinsart. Er kann als dekorativer Block verwendet und in viele Varianten weiterverarbeitet werden. -Deepslate Lapis Lazuli Ore=Tiefenschiefer-Lapislazulierz -Deepslate lapis ore is a variant of lapis ore that can generate in deepslate and tuff blobs.=Tiefenschiefer-Lapislazulierz ist eine Variante von Lapislazulierz, die in Tiefenschiefer und Tuff generiert werden kann. -Deepslate redstone ore is a variant of redstone ore that can generate in deepslate and tuff blobs.=Tiefenschiefer-Redstone-Erz ist eine Variante von Redstone-Erz, die in Tiefenschiefer und Tuff generiert werden kann. -Deepslate Redstone Ore=Tiefenschiefer-Redstone-Erz -Deepslate tiles are a decorative variant of deepslate.=Tiefenschieferfliesen ist eine Variante des Tiefenschiefers. Der Block kann als dekorativer Block verwendet werden. -Deepslate Tiles Slab=Tiefenschieferfliesenstufe -Deepslate Tiles Stairs=Tiefenschieferfliesentreppe -Deepslate Tiles Wall=Tiefenschieferfliesenmauer -Deepslate Tiles=Tiefenschieferfliesen -Deepslate=Tiefenschiefer -Double Cobbled Deepslate Slab=Doppelte Bruchtiefenschieferstufe -Double Deepslate Bricks Slab=Doppelte Tiefenschieferziegelstufe -Double Deepslate Tiles Slab=Doppelte Tiefenschieferfliesenstufe -Double Polished Deepslate Slab=Doppelte Polierte Tiefenschieferstufe -Hides a silverfish=Versteckt einen Silberfisch -Infested Deepslate=Befallener Tiefenschiefer -Lit Deepslate Redstone Ore=Leuchtendes Tiefschiefer-Redstone-Erz -Polished deepslate is the stone-like polished version of deepslate.=Polierter Tiefenschiefer ist eine Variante des Tiefenschiefers. Er kann als dekorativer Block verwendet werden. -Polished Deepslate Slab=Polierte Tiefenschieferstufe -Polished Deepslate Stairs=Polierte Tiefenschiefertreppe -Polished Deepslate Wall=Polierte Tiefenschiefermauer -Polished Deepslate=Polierter Tiefenschiefer -Tuff=Tuffstein -Tuff is an ornamental rock formed from volcanic ash, occurring in underground blobs below Y=16.=Der Tuffstein ist ein grauer, vulkanischer Block. diff --git a/mods/ITEMS/mcl_deepslate/locale/template.txt b/mods/ITEMS/mcl_deepslate/locale/template.txt deleted file mode 100644 index 44da92c66b..0000000000 --- a/mods/ITEMS/mcl_deepslate/locale/template.txt +++ /dev/null @@ -1,53 +0,0 @@ -# textdomain: mcl_deepslate -An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.= -Chiseled deepslate is the chiseled version of deepslate.= -Chiseled Deepslate= -Cobbled deepslate is a stone variant that functions similar to cobblestone or blackstone.= -Cobbled Deepslate Slab= -Cobbled Deepslate Stairs= -Cobbled Deepslate Wall= -Cobbled Deepslate= -Cracked Deepslate Bricks= -Cracked Deepslate Tiles= -Deepslate bricks are the brick version of deepslate.= -Deepslate Bricks Slab= -Deepslate Bricks Stairs= -Deepslate Bricks Wall= -Deepslate Bricks= -Deepslate coal ore is a variant of coal ore that can generate in deepslate and tuff blobs.= -Deepslate Coal Ore= -Deepslate copper ore is a variant of copper ore that can generate in deepslate and tuff blobs.= -Deepslate Copper Ore= -Deepslate diamond ore is a variant of diamond ore that can generate in deepslate and tuff blobs.= -Deepslate Diamond Ore= -Deepslate emerald ore is a variant of emerald ore that can generate in deepslate and tuff blobs.= -Deepslate Emerald Ore= -Deepslate gold ore is a variant of gold ore that can generate in deepslate and tuff blobs.= -Deepslate Gold Ore= -Deepslate iron ore is a variant of iron ore that can generate in deepslate and tuff blobs.= -Deepslate Iron Ore= -Deepslate is a stone type found deep underground in the Overworld that functions similar to regular stone but is harder than the stone.= -Deepslate Lapis Lazuli Ore= -Deepslate lapis ore is a variant of lapis ore that can generate in deepslate and tuff blobs.= -Deepslate redstone ore is a variant of redstone ore that can generate in deepslate and tuff blobs.= -Deepslate Redstone Ore= -Deepslate tiles are a decorative variant of deepslate.= -Deepslate Tiles Slab= -Deepslate Tiles Stairs= -Deepslate Tiles Wall= -Deepslate Tiles= -Deepslate= -Double Cobbled Deepslate Slab= -Double Deepslate Bricks Slab= -Double Deepslate Tiles Slab= -Double Polished Deepslate Slab= -Hides a silverfish= -Infested Deepslate= -Lit Deepslate Redstone Ore= -Polished deepslate is the stone-like polished version of deepslate.= -Polished Deepslate Slab= -Polished Deepslate Stairs= -Polished Deepslate Wall= -Polished Deepslate= -Tuff= -Tuff is an ornamental rock formed from volcanic ash, occurring in underground blobs below Y=16.= diff --git a/mods/ITEMS/mcl_deepslate/mod.conf b/mods/ITEMS/mcl_deepslate/mod.conf deleted file mode 100644 index 7e9a44cfc6..0000000000 --- a/mods/ITEMS/mcl_deepslate/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = mcl_deepslate -author = NO11 -depends = mcl_raw_ores, mcl_core, mcl_sounds, mcl_dye, mcl_util, screwdriver, mobs_mc, walkover, mcl_walls, mcl_stairs, mcl_brewing, mcl_mobitems, mcl_furnaces, mcl_farming, mcl_worlds -optional_depends = mcl_copper diff --git a/mods/ITEMS/mcl_deepslate/textures/mcl_chiseled_deepslate.png b/mods/ITEMS/mcl_deepslate/textures/mcl_chiseled_deepslate.png deleted file mode 100644 index 19955d5787..0000000000 Binary files a/mods/ITEMS/mcl_deepslate/textures/mcl_chiseled_deepslate.png and /dev/null differ diff --git a/mods/ITEMS/mcl_deepslate/textures/mcl_cobbled_deepslate.png b/mods/ITEMS/mcl_deepslate/textures/mcl_cobbled_deepslate.png deleted file mode 100644 index 67dcd172cd..0000000000 Binary files a/mods/ITEMS/mcl_deepslate/textures/mcl_cobbled_deepslate.png and /dev/null differ diff --git a/mods/ITEMS/mcl_deepslate/textures/mcl_cracked_deepslate_bricks.png b/mods/ITEMS/mcl_deepslate/textures/mcl_cracked_deepslate_bricks.png deleted file mode 100644 index a2cf287ebf..0000000000 Binary files a/mods/ITEMS/mcl_deepslate/textures/mcl_cracked_deepslate_bricks.png and /dev/null differ diff --git a/mods/ITEMS/mcl_deepslate/textures/mcl_cracked_deepslate_tiles.png b/mods/ITEMS/mcl_deepslate/textures/mcl_cracked_deepslate_tiles.png deleted file mode 100644 index c62f36d926..0000000000 Binary files a/mods/ITEMS/mcl_deepslate/textures/mcl_cracked_deepslate_tiles.png and /dev/null differ diff --git a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate.png b/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate.png deleted file mode 100644 index 68cd507d64..0000000000 Binary files a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate.png and /dev/null differ diff --git a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_bricks.png b/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_bricks.png deleted file mode 100644 index b6ef3b4bd7..0000000000 Binary files a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_bricks.png and /dev/null differ diff --git a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_coal_ore.png b/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_coal_ore.png deleted file mode 100644 index ae42a31861..0000000000 Binary files a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_coal_ore.png and /dev/null differ diff --git a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_copper_ore.png b/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_copper_ore.png deleted file mode 100644 index 140adbc0a7..0000000000 Binary files a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_copper_ore.png and /dev/null differ diff --git a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_diamond_ore.png b/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_diamond_ore.png deleted file mode 100644 index 67afa14fe5..0000000000 Binary files a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_diamond_ore.png and /dev/null differ diff --git a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_emerald_ore.png b/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_emerald_ore.png deleted file mode 100644 index 3041551c97..0000000000 Binary files a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_emerald_ore.png and /dev/null differ diff --git a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_gold_ore.png b/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_gold_ore.png deleted file mode 100644 index 1cf0c81539..0000000000 Binary files a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_gold_ore.png and /dev/null differ diff --git a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_iron_ore.png b/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_iron_ore.png deleted file mode 100644 index 4e94d6a80f..0000000000 Binary files a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_iron_ore.png and /dev/null differ diff --git a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_lapis_ore.png b/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_lapis_ore.png deleted file mode 100644 index 31781c1c62..0000000000 Binary files a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_lapis_ore.png and /dev/null differ diff --git a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_redstone_ore.png b/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_redstone_ore.png deleted file mode 100644 index 3b979ed515..0000000000 Binary files a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_redstone_ore.png and /dev/null differ diff --git a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_tiles.png b/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_tiles.png deleted file mode 100644 index 43fe0f319a..0000000000 Binary files a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_tiles.png and /dev/null differ diff --git a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_top.png b/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_top.png deleted file mode 100644 index 9e66d7b9a3..0000000000 Binary files a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_tuff.png b/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_tuff.png deleted file mode 100644 index f1c8fc2a11..0000000000 Binary files a/mods/ITEMS/mcl_deepslate/textures/mcl_deepslate_tuff.png and /dev/null differ diff --git a/mods/ITEMS/mcl_deepslate/textures/mcl_polished_deepslate.png b/mods/ITEMS/mcl_deepslate/textures/mcl_polished_deepslate.png deleted file mode 100644 index cfbc9c4189..0000000000 Binary files a/mods/ITEMS/mcl_deepslate/textures/mcl_polished_deepslate.png and /dev/null differ diff --git a/mods/ITEMS/mcl_dye/API.md b/mods/ITEMS/mcl_dye/API.md deleted file mode 100644 index 04169f9661..0000000000 --- a/mods/ITEMS/mcl_dye/API.md +++ /dev/null @@ -1,14 +0,0 @@ -# mcl_dye - -# Bone meal API -Callback and particle functions. - -## mcl_dye.add_bone_meal_particle(pos, def) -Spawns standard or custom bone meal particles. -* `pos`: position, is ignored if you define def.minpos and def.maxpos -* `def`: (optional) particle definition - -## mcl_dye.register_on_bone_meal_apply(function(pointed_thing, user)) -Called when the bone meal is applied anywhere. -* `pointed_thing`: exact pointing location (see Minetest API), where the bone meal is applied -* `user`: ObjectRef of the player who aplied the bone meal, can be nil! \ No newline at end of file diff --git a/mods/ITEMS/mcl_dye/README.txt b/mods/ITEMS/mcl_dye/README.txt deleted file mode 100644 index dc0ea1647c..0000000000 --- a/mods/ITEMS/mcl_dye/README.txt +++ /dev/null @@ -1,15 +0,0 @@ -Minetest 0.4 mod: dye -====================== - -See init.lua for documentation. - -License of source code: ---------------------------------------- -Copyright (C) 2012 Perttu Ahola (celeron55) - -This program is free software. It comes without any warranty, to -the extent permitted by applicable law. You can redistribute it -and/or modify it under the terms of the Do What The Fuck You Want -To Public License, Version 2, as published by Sam Hocevar. See -http://sam.zoy.org/wtfpl/COPYING for more details. - diff --git a/mods/ITEMS/mcl_dye/init.lua b/mods/ITEMS/mcl_dye/init.lua deleted file mode 100644 index 727a784601..0000000000 --- a/mods/ITEMS/mcl_dye/init.lua +++ /dev/null @@ -1,563 +0,0 @@ --- To make recipes that will work with any dye ever made by anybody, define --- them based on groups. --- You can select any group of groups, based on your need for amount of colors. --- basecolor: 9, excolor: 17, unicolor: 89 --- --- Example of one shapeless recipe using a color group: --- Note: As this uses basecolor_*, you'd need 9 of these. --- minetest.register_craft({ --- type = "shapeless", --- output = ":item_yellow", --- recipe = {":item_no_color", "group:basecolor_yellow"}, --- }) - -mcl_dye = {} - -local S = minetest.get_translator(minetest.get_current_modname()) - -local math = math -local string = string - --- Other mods can use these for looping through available colors -mcl_dye.basecolors = {"white", "grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta"} -mcl_dye.excolors = {"white", "lightgrey", "grey", "darkgrey", "black", "red", "orange", "yellow", "lime", "green", "aqua", "cyan", "sky_blue", "blue", "violet", "magenta", "red_violet"} - --- Base color groups: --- - basecolor_white --- - basecolor_grey --- - basecolor_black --- - basecolor_red --- - basecolor_yellow --- - basecolor_green --- - basecolor_cyan --- - basecolor_blue --- - basecolor_magenta - --- Extended color groups (* = equal to a base color): --- * excolor_white --- - excolor_lightgrey --- * excolor_grey --- - excolor_darkgrey --- * excolor_black --- * excolor_red --- - excolor_orange --- * excolor_yellow --- - excolor_lime --- * excolor_green --- - excolor_aqua --- * excolor_cyan --- - excolor_sky_blue --- * excolor_blue --- - excolor_violet --- * excolor_magenta --- - excolor_red_violet - --- The whole unifieddyes palette as groups: --- - unicolor_ --- For the following, no white/grey/black is allowed: --- - unicolor_medium_ --- - unicolor_dark_ --- - unicolor_light_ --- - unicolor__s50 --- - unicolor_medium__s50 --- - unicolor_dark__s50 - --- Local stuff -local dyelocal = {} - --- This collection of colors is partly a historic thing, partly something else. -dyelocal.dyes = { - {"white", "mcl_dye_white", S("Bone Meal"), {dye=1, craftitem=1, basecolor_white=1, excolor_white=1, unicolor_white=1}}, - {"grey", "dye_grey", S("Light Grey Dye"), {dye=1, craftitem=1, basecolor_grey=1, excolor_grey=1, unicolor_grey=1}}, - {"dark_grey", "dye_dark_grey", S("Grey Dye"), {dye=1, craftitem=1, basecolor_grey=1, excolor_darkgrey=1, unicolor_darkgrey=1}}, - {"black", "mcl_dye_black", S("Ink Sac"), {dye=1, craftitem=1, basecolor_black=1, excolor_black=1, unicolor_black=1}}, - {"violet", "dye_violet", S("Purple Dye"), {dye=1, craftitem=1, basecolor_magenta=1, excolor_violet=1, unicolor_violet=1}}, - {"blue", "mcl_dye_blue", S("Lapis Lazuli"), {dye=1, craftitem=1, basecolor_blue=1, excolor_blue=1, unicolor_blue=1}}, - {"lightblue", "mcl_dye_light_blue", S("Light Blue Dye"), {dye=1, craftitem=1, basecolor_blue=1, excolor_blue=1, unicolor_light_blue=1}}, - {"cyan", "dye_cyan", S("Cyan Dye"), {dye=1, craftitem=1, basecolor_cyan=1, excolor_cyan=1, unicolor_cyan=1}}, - {"dark_green", "dye_dark_green", S("Cactus Green"),{dye=1, craftitem=1, basecolor_green=1, excolor_green=1, unicolor_dark_green=1}}, - {"green", "mcl_dye_lime", S("Lime Dye"), {dye=1, craftitem=1, basecolor_green=1, excolor_green=1, unicolor_green=1}}, - {"yellow", "dye_yellow", S("Dandelion Yellow"), {dye=1, craftitem=1, basecolor_yellow=1, excolor_yellow=1, unicolor_yellow=1}}, - {"brown", "mcl_dye_brown", S("Cocoa Beans"), {dye=1, craftitem=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1, compostability = 65}}, - {"orange", "dye_orange", S("Orange Dye"), {dye=1, craftitem=1, basecolor_orange=1, excolor_orange=1, unicolor_orange=1}}, - {"red", "dye_red", S("Rose Red"), {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_red=1}}, - {"magenta", "dye_magenta", S("Magenta Dye"), {dye=1, craftitem=1, basecolor_magenta=1, excolor_red_violet=1,unicolor_red_violet=1}}, - {"pink", "dye_pink", S("Pink Dye"), {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_light_red=1}}, -} - -local mg_name = minetest.get_mapgen_setting("mg_name") - -dyelocal.unicolor_to_dye_id = {} -for d=1, #dyelocal.dyes do - for k, _ in pairs(dyelocal.dyes[d][4]) do - if string.sub(k, 1, 9) == "unicolor_" then - dyelocal.unicolor_to_dye_id[k] = dyelocal.dyes[d][1] - end - end -end - --- Takes an unicolor group name (e.g. “unicolor_white”) and returns a corresponding dye name (if it exists), nil otherwise. -function mcl_dye.unicolor_to_dye(unicolor_group) - local color = dyelocal.unicolor_to_dye_id[unicolor_group] - if color then - return "mcl_dye:" .. color - else - return nil - end -end - --- Define items -for _, row in ipairs(dyelocal.dyes) do - local name = row[1] - -- White and brown dyes are defined explicitly below - if name ~= "white" and name ~= "brown" then - local img = row[2] - local description = row[3] - local groups = row[4] - local item_name = "mcl_dye:"..name - local item_image = img..".png" - minetest.register_craftitem(item_name, { - inventory_image = item_image, - description = description, - _doc_items_longdesc = S("This item is a dye which is used for dyeing and crafting."), - _doc_items_usagehelp = S("Rightclick on a sheep to dye its wool. Other things are dyed by crafting."), - groups = groups, - stack_max = 64, - }) - end -end - --- Bone Meal -function mcl_dye.add_bone_meal_particle(pos, def) - if not def then - def = {} - end - minetest.add_particlespawner({ - amount = def.amount or 10, - time = def.time or 0.1, - minpos = def.minpos or vector.subtract(pos, 0.5), - maxpos = def.maxpos or vector.add(pos, 0.5), - minvel = def.minvel or vector.new(-0.01, 0.01, -0.01), - maxvel = def.maxvel or vector.new(0.01, 0.01, 0.01), - minacc = def.minacc or vector.new(0, 0, 0), - maxacc = def.maxacc or vector.new(0, 0, 0), - minexptime = def.minexptime or 1, - maxexptime = def.maxexptime or 4, - minsize = def.minsize or 0.7, - maxsize = def.maxsize or 2.4, - texture = "mcl_particles_bonemeal.png^[colorize:#00EE00:125", -- TODO: real MC color - glow = def.glow or 1, - }) -end - -mcl_dye.bone_meal_callbacks = {} - -function mcl_dye.register_on_bone_meal_apply(func) - table.insert(mcl_dye.bone_meal_callbacks, func) -end - -local function apply_bone_meal(pointed_thing) - -- Bone meal currently spawns all flowers found in the plains. - local flowers_table_plains = { - "mcl_flowers:dandelion", - "mcl_flowers:dandelion", - "mcl_flowers:poppy", - - "mcl_flowers:oxeye_daisy", - "mcl_flowers:tulip_orange", - "mcl_flowers:tulip_red", - "mcl_flowers:tulip_white", - "mcl_flowers:tulip_pink", - "mcl_flowers:azure_bluet", - } - local flowers_table_simple = { - "mcl_flowers:dandelion", - "mcl_flowers:poppy", - } - local flowers_table_swampland = { - "mcl_flowers:blue_orchid", - } - local flowers_table_flower_forest = { - "mcl_flowers:dandelion", - "mcl_flowers:poppy", - "mcl_flowers:oxeye_daisy", - "mcl_flowers:tulip_orange", - "mcl_flowers:tulip_red", - "mcl_flowers:tulip_white", - "mcl_flowers:tulip_pink", - "mcl_flowers:azure_bluet", - "mcl_flowers:allium", - } - - local pos = pointed_thing.under - local n = minetest.get_node(pos) - if n.name == "" then return false end - - for _, func in pairs(mcl_dye.bone_meal_callbacks) do - if func(pointed_thing, user) then - return true - end - end - - if minetest.get_item_group(n.name, "sapling") >= 1 then - mcl_dye.add_bone_meal_particle(pos) - -- Saplings: 45% chance to advance growth stage - if math.random(1,100) <= 45 then - return mcl_core.grow_sapling(pos, n) - end - elseif minetest.get_item_group(n.name, "mushroom") == 1 then - mcl_dye.add_bone_meal_particle(pos) - -- Try to grow huge mushroom - - -- Must be on a dirt-type block - local below = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) - if below.name ~= "mcl_core:mycelium" and below.name ~= "mcl_core:dirt" and minetest.get_item_group(below.name, "grass_block") ~= 1 and below.name ~= "mcl_core:coarse_dirt" and below.name ~= "mcl_core:podzol" then - return false - end - - -- Select schematic - local schematic, offset, height - if n.name == "mcl_mushrooms:mushroom_brown" then - schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_huge_brown.mts" - offset = { x = -3, y = -1, z = -3 } - height = 8 - elseif n.name == "mcl_mushrooms:mushroom_red" then - schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_huge_red.mts" - offset = { x = -2, y = -1, z = -2 } - height = 8 - else - return false - end - -- 40% chance - if math.random(1, 100) <= 40 then - -- Check space requirements - for i=1,3 do - local cpos = vector.add(pos, {x=0, y=i, z=0}) - if minetest.get_node(cpos).name ~= "air" then - return false - end - end - local yoff = 3 - local minp, maxp = {x=pos.x-3, y=pos.y+yoff, z=pos.z-3}, {x=pos.x+3, y=pos.y+yoff+(height-3), z=pos.z+3} - local diff = vector.subtract(maxp, minp) - diff = vector.add(diff, {x=1,y=1,z=1}) - local totalnodes = diff.x * diff.y * diff.z - local goodnodes = minetest.find_nodes_in_area(minp, maxp, {"air", "group:leaves"}) - if #goodnodes < totalnodes then - return false - end - - -- Place the huge mushroom - minetest.remove_node(pos) - local place_pos = vector.add(pos, offset) - local ok = minetest.place_schematic(place_pos, schematic, 0, nil, false) - return ok ~= nil - end - return false - -- Wheat, Potato, Carrot, Pumpkin Stem, Melon Stem: Advance by 2-5 stages - elseif string.find(n.name, "mcl_farming:wheat_") then - mcl_dye.add_bone_meal_particle(pos) - local stages = math.random(2, 5) - return mcl_farming:grow_plant("plant_wheat", pos, n, stages, true) - elseif string.find(n.name, "mcl_farming:potato_") then - mcl_dye.add_bone_meal_particle(pos) - local stages = math.random(2, 5) - return mcl_farming:grow_plant("plant_potato", pos, n, stages, true) - elseif string.find(n.name, "mcl_farming:carrot_") then - mcl_dye.add_bone_meal_particle(pos) - local stages = math.random(2, 5) - return mcl_farming:grow_plant("plant_carrot", pos, n, stages, true) - elseif string.find(n.name, "mcl_farming:pumpkin_") then - mcl_dye.add_bone_meal_particle(pos) - local stages = math.random(2, 5) - return mcl_farming:grow_plant("plant_pumpkin_stem", pos, n, stages, true) - elseif string.find(n.name, "mcl_farming:melontige_") then - mcl_dye.add_bone_meal_particle(pos) - local stages = math.random(2, 5) - return mcl_farming:grow_plant("plant_melon_stem", pos, n, stages, true) - elseif string.find(n.name, "mcl_farming:beetroot_") then - mcl_dye.add_bone_meal_particle(pos) - -- Beetroot: 75% chance to advance to next stage - if math.random(1, 100) <= 75 then - return mcl_farming:grow_plant("plant_beetroot", pos, n, 1, true) - end - elseif n.name == "mcl_cocoas:cocoa_1" or n.name == "mcl_cocoas:cocoa_2" then - mcl_dye.add_bone_meal_particle(pos) - -- Cocoa: Advance by 1 stage - mcl_cocoas.grow(pos) - return true - elseif minetest.get_item_group(n.name, "grass_block") == 1 then - -- Grass Block: Generate tall grass and random flowers all over the place - for i = -7, 7 do - for j = -7, 7 do - for y = -1, 1 do - pos = vector.offset(pointed_thing.above, i, y, j) - n = minetest.get_node(pos) - local n2 = minetest.get_node(vector.offset(pos, 0, -1, 0)) - - if n.name ~= "" and n.name == "air" and (minetest.get_item_group(n2.name, "grass_block_no_snow") == 1) then - -- Randomly generate flowers, tall grass or nothing - if math.random(1, 100) <= 90 / ((math.abs(i) + math.abs(j)) / 2)then - -- 90% tall grass, 10% flower - mcl_dye.add_bone_meal_particle(pos, {amount = 4}) - if math.random(1,100) <= 90 then - local col = n2.param2 - minetest.add_node(pos, {name="mcl_flowers:tallgrass", param2=col}) - else - local flowers_table - if mg_name == "v6" then - flowers_table = flowers_table_plains - else - local biome = minetest.get_biome_name(minetest.get_biome_data(pos).biome) - if biome == "Swampland" or biome == "Swampland_shore" or biome == "Swampland_ocean" or biome == "Swampland_deep_ocean" or biome == "Swampland_underground" then - flowers_table = flowers_table_swampland - elseif biome == "FlowerForest" or biome == "FlowerForest_beach" or biome == "FlowerForest_ocean" or biome == "FlowerForest_deep_ocean" or biome == "FlowerForest_underground" then - flowers_table = flowers_table_flower_forest - elseif biome == "Plains" or biome == "Plains_beach" or biome == "Plains_ocean" or biome == "Plains_deep_ocean" or biome == "Plains_underground" or biome == "SunflowerPlains" or biome == "SunflowerPlains_ocean" or biome == "SunflowerPlains_deep_ocean" or biome == "SunflowerPlains_underground" then - flowers_table = flowers_table_plains - else - flowers_table = flowers_table_simple - end - end - minetest.add_node(pos, {name=flowers_table[math.random(1, #flowers_table)]}) - end - end - end - end - end - end - return true - - -- Double flowers: Drop corresponding item - elseif n.name == "mcl_flowers:rose_bush" or n.name == "mcl_flowers:rose_bush_top" then - mcl_dye.add_bone_meal_particle(pos) - minetest.add_item(pos, "mcl_flowers:rose_bush") - return true - elseif n.name == "mcl_flowers:peony" or n.name == "mcl_flowers:peony_top" then - mcl_dye.add_bone_meal_particle(pos) - minetest.add_item(pos, "mcl_flowers:peony") - return true - elseif n.name == "mcl_flowers:lilac" or n.name == "mcl_flowers:lilac_top" then - mcl_dye.add_bone_meal_particle(pos) - minetest.add_item(pos, "mcl_flowers:lilac") - return true - elseif n.name == "mcl_flowers:sunflower" or n.name == "mcl_flowers:sunflower_top" then - mcl_dye.add_bone_meal_particle(pos) - minetest.add_item(pos, "mcl_flowers:sunflower") - return true - - elseif n.name == "mcl_flowers:tallgrass" then - mcl_dye.add_bone_meal_particle(pos) - -- Tall Grass: Grow into double tallgrass - local toppos = { x=pos.x, y=pos.y+1, z=pos.z } - local topnode = minetest.get_node(toppos) - if minetest.registered_nodes[topnode.name].buildable_to then - minetest.set_node(pos, { name = "mcl_flowers:double_grass", param2 = n.param2 }) - minetest.set_node(toppos, { name = "mcl_flowers:double_grass_top", param2 = n.param2 }) - return true - end - - elseif n.name == "mcl_flowers:fern" then - mcl_dye.add_bone_meal_particle(pos) - -- Fern: Grow into large fern - local toppos = { x=pos.x, y=pos.y+1, z=pos.z } - local topnode = minetest.get_node(toppos) - if minetest.registered_nodes[topnode.name].buildable_to then - minetest.set_node(pos, { name = "mcl_flowers:double_fern", param2 = n.param2 }) - minetest.set_node(toppos, { name = "mcl_flowers:double_fern_top", param2 = n.param2 }) - return true - end - end - - return false -end - -minetest.register_craftitem("mcl_dye:white", { - inventory_image = "mcl_dye_white.png", - description = S("Bone Meal"), - _tt_help = S("Speeds up plant growth"), - _doc_items_longdesc = S("Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants."), - _doc_items_usagehelp = S("Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place."), - stack_max = 64, - groups = dyelocal.dyes[1][4], - on_place = function(itemstack, user, pointed_thing) - -- Use pointed node's on_rightclick function first, if present - local node = minetest.get_node(pointed_thing.under) - if user and not user:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack - end - end - - -- Use the bone meal on the ground - if (apply_bone_meal(pointed_thing, user) and (not minetest.is_creative_enabled(user:get_player_name()))) then - itemstack:take_item() - end - return itemstack - end, - _on_dispense = function(stack, pos, droppos, dropnode, dropdir) - -- Apply bone meal, if possible - local pointed_thing - if dropnode.name == "air" then - pointed_thing = { above = droppos, under = { x=droppos.x, y=droppos.y-1, z=droppos.z } } - else - pointed_thing = { above = pos, under = droppos } - end - local success = apply_bone_meal(pointed_thing, nil) - if success then - stack:take_item() - end - return stack - end, - _dispense_into_walkable = true -}) - -minetest.register_craftitem("mcl_dye:brown", { - inventory_image = "mcl_dye_brown.png", - _tt_help = S("Grows at the side of jungle trees"), - _doc_items_longdesc = S("Cocoa beans are a brown dye and can be used to plant cocoas."), - _doc_items_usagehelp = S("Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa."), - description = S("Cocoa Beans"), - stack_max = 64, - groups = dyelocal.dyes[12][4], - on_place = function(itemstack, placer, pointed_thing) - return mcl_cocoas.place(itemstack, placer, pointed_thing, "mcl_cocoas:cocoa_1") - end, -}) - --- Dye mixing -minetest.register_craft({ - type = "shapeless", - output = "mcl_dye:dark_grey 2", - recipe = {"mcl_dye:black", "mcl_dye:white"}, -}) -minetest.register_craft({ - type = "shapeless", - output = "mcl_dye:lightblue 2", - recipe = {"mcl_dye:blue", "mcl_dye:white"}, -}) -minetest.register_craft({ - type = "shapeless", - output = "mcl_dye:grey 3", - recipe = {"mcl_dye:black", "mcl_dye:white", "mcl_dye:white"}, -}) -minetest.register_craft({ - type = "shapeless", - output = "mcl_dye:grey 2", - recipe = {"mcl_dye:dark_grey", "mcl_dye:white"}, -}) -minetest.register_craft({ - type = "shapeless", - output = "mcl_dye:green 2", - recipe = {"mcl_dye:dark_green", "mcl_dye:white"}, -}) -minetest.register_craft({ - type = "shapeless", - output = "mcl_dye:magenta 4", - recipe = {"mcl_dye:blue", "mcl_dye:white", "mcl_dye:red", "mcl_dye:red"}, -}) -minetest.register_craft({ - type = "shapeless", - output = "mcl_dye:magenta 3", - recipe = {"mcl_dye:pink", "mcl_dye:red", "mcl_dye:blue"}, -}) -minetest.register_craft({ - type = "shapeless", - output = "mcl_dye:magenta 2", - recipe = {"mcl_dye:violet", "mcl_dye:pink"}, -}) - -minetest.register_craft({ - type = "shapeless", - output = "mcl_dye:pink 2", - recipe = {"mcl_dye:red", "mcl_dye:white"}, -}) - -minetest.register_craft({ - type = "shapeless", - output = "mcl_dye:cyan 2", - recipe = {"mcl_dye:blue", "mcl_dye:dark_green"}, -}) - -minetest.register_craft({ - type = "shapeless", - output = "mcl_dye:violet 2", - recipe = {"mcl_dye:blue", "mcl_dye:red"}, -}) -minetest.register_craft({ - type = "shapeless", - output = "mcl_dye:orange 2", - recipe = {"mcl_dye:yellow", "mcl_dye:red"}, -}) - --- Dye creation -minetest.register_craft({ - output = "mcl_dye:yellow", - recipe = {{"mcl_flowers:dandelion"}}, -}) -minetest.register_craft({ - output = "mcl_dye:yellow 2", - recipe = {{"mcl_flowers:sunflower"}}, -}) -minetest.register_craft({ - output = "mcl_dye:lightblue", - recipe = {{"mcl_flowers:blue_orchid"}}, -}) -minetest.register_craft({ - output = "mcl_dye:grey", - recipe = {{"mcl_flowers:azure_bluet"}}, -}) -minetest.register_craft({ - output = "mcl_dye:grey", - recipe = {{"mcl_flowers:oxeye_daisy"}}, -}) -minetest.register_craft({ - output = "mcl_dye:grey", - recipe = {{"mcl_flowers:tulip_white"}}, -}) -minetest.register_craft({ - output = "mcl_dye:magenta", - recipe = {{"mcl_flowers:allium"}}, -}) -minetest.register_craft({ - output = "mcl_dye:magenta 2", - recipe = {{"mcl_flowers:lilac"}}, -}) -minetest.register_craft({ - output = "mcl_dye:orange", - recipe = {{"mcl_flowers:tulip_orange"}}, -}) -minetest.register_craft({ - output = "mcl_dye:pink", - recipe = {{"mcl_flowers:tulip_pink"}}, -}) -minetest.register_craft({ - output = "mcl_dye:pink 2", - recipe = {{"mcl_flowers:peony"}}, -}) -minetest.register_craft({ - output = "mcl_dye:red", - recipe = {{"mcl_farming:beetroot_item"}}, -}) -minetest.register_craft({ - output = "mcl_dye:red", - recipe = {{"mcl_flowers:poppy"}}, -}) -minetest.register_craft({ - output = "mcl_dye:red", - recipe = {{"mcl_flowers:tulip_red"}}, -}) -minetest.register_craft({ - output = "mcl_dye:red 2", - recipe = {{"mcl_flowers:rose_bush"}}, -}) -minetest.register_craft({ - type = "cooking", - output = "mcl_dye:dark_green", - recipe = "mcl_core:cactus", - cooktime = 10, -}) -minetest.register_craft({ - output = "mcl_dye:white 3", - recipe = {{"mcl_mobitems:bone"}}, -}) diff --git a/mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr deleted file mode 100644 index 29cd4d20d0..0000000000 --- a/mods/ITEMS/mcl_dye/locale/mcl_dye.de.tr +++ /dev/null @@ -1,27 +0,0 @@ -# textdomain: mcl_dye -Bone Meal=Knochenmehl -Light Grey Dye=Hellgrauer Farbstoff -Grey Dye=Grauer Farbstoff -Ink Sac=Tintenbeutel -Purple Dye=Violetter Farbstoff -Lapis Lazuli=Lapislazuli -Light Blue Dye=Hellblauer Farbstoff -Cyan Dye=Türkiser Farbstoff -Cactus Green=Kaktusgrün -Lime Dye=Lindgrüner Farbstoff -Dandelion Yellow=Löwenzahngelb -Cocoa Beans=Kakaobohnen -Orange Dye=Orange Farbstoff -Rose Red=Rosenrot -Magenta Dye=Magenta Farbstoff -Pink Dye=Rosa Farbstoff -This item is a dye which is used for dyeing and crafting.=Dieser Gegenstand ist ein Farbstoff, der zum Einfärben und in der Herstellung benutzt werden kann. -Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=Rechtsklicken Sie auf ein Schaf, um seine Wolle zu färben. Andere Dinge werden mit der Fertigung eingefärbt. -Bone Meal=Knochenmehl -Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.=Knochenmehl ist ein weißer Farbstoff und auch nützlich als Dünger, um das Wachstum vieler Pflanzen zu beschleunigen. -Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.=Rechtsklicken Sie auf ein Schaf, um die Wolle weiß einzufärben. Rechtsklicken Sie auf eine Pflanze, um ihr Wachstum zu beschleunigen. Beachten Sie, dass nicht alle Pflanzen darauf ansprechen. Benutzen Sie es auf einem Grasblock, wächst viel hohes Gras und vielleicht auch ein paar Blumen. -Cocoa beans are a brown dye and can be used to plant cocoas.=Kakaobohnen sind ein brauner Farbstoff und werden benutzt, um Kakao anzupflanzen. -Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Rechtsklicken Sie auf ein Schaf, um die Wolle braun einzufärben. Rechtsklicken Sie an die Seite eines Dschungelbaumstamms (Dschungelholz), um eine junge Kakaoschote zu pflanzen. -Cocoa Beans=Kakaobohnen -Grows at the side of jungle trees=Wächst an der Seite von Dschungelbäumen -Speeds up plant growth=Beschleunigt Pflanzenwachstum diff --git a/mods/ITEMS/mcl_dye/locale/mcl_dye.es.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.es.tr deleted file mode 100644 index d20e8c96ac..0000000000 --- a/mods/ITEMS/mcl_dye/locale/mcl_dye.es.tr +++ /dev/null @@ -1,25 +0,0 @@ -# textdomain: mcl_dye -Bone Meal=Harina de hueso -Light Grey Dye=Tinte gris claro -Grey Dye=Tinte gris -Ink Sac=Saco de tinta -Purple Dye=Tinte púrpura -Lapis Lazuli=Lapislázuli -Light Blue Dye=Tinte azul claro -Cyan Dye=Tinte cian -Cactus Green=Tinte verde -Lime Dye=Tinte amarillo verdoso -Dandelion Yellow=Tinte amarillo -Cocoa Beans=Granos de cacao -Orange Dye=Tinte naranja -Rose Red=Tinte rojo -Magenta Dye=Tinte magenta -Pink Dye=Tinte rosado -This item is a dye which is used for dyeing and crafting.=Este artículo es un tinte que se utiliza para teñir y elaborar. -Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=Haga clic derecho sobre una oveja para teñir su lana. Otras cosas pueden ser teñidas mediante la elaboración. -Bone Meal=Harina de hueso -Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.=La harina de hueso es un tinte blanco y también es útil como fertilizante para acelerar el crecimiento de muchas plantas. -Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.=RHaga clic derecho en una oveja para volver su lana blanca. Haga clic derecho en una planta para acelerar su crecimiento. Tenga en cuenta que no todas las plantas pueden ser fertilizadas de esta manera. Cuando haces clic derecho en un bloque de hierba, crecerán hierba alta y flores por todo el lugar. -Cocoa beans are a brown dye and can be used to plant cocoas.=Los granos de cacao son un tinte marrón y se pueden usar para plantar cacao. -Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Haga clic derecho en una oveja para convertir su lana en marrón. Haga clic derecho en el costado del tronco de un árbol de jungla para plantar un cacao joven. -Cocoa Beans=Granos de cacao diff --git a/mods/ITEMS/mcl_dye/locale/mcl_dye.fr.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.fr.tr deleted file mode 100644 index 8d53cc73e8..0000000000 --- a/mods/ITEMS/mcl_dye/locale/mcl_dye.fr.tr +++ /dev/null @@ -1,27 +0,0 @@ -# textdomain: mcl_dye -Bone Meal=Poudre d'Os -Light Grey Dye=Teinture Gris Clair -Grey Dye=Teinture Gris -Ink Sac=Poche d'Encre -Purple Dye=Teinture Violette -Lapis Lazuli=Lapis Lazuli -Light Blue Dye=Teinture Bleu Clair -Cyan Dye=Teinture Cyan -Cactus Green=Cactus Vert -Lime Dye=Teinture Vert Clair -Dandelion Yellow=Pissenlit Jaune -Cocoa Beans=Fèves de Cacao -Orange Dye=Teinture Orange -Rose Red=Rose Rouge -Magenta Dye=Teinture Magenta -Pink Dye=Teinture Rose -This item is a dye which is used for dyeing and crafting.=Cet objet est un colorant utilisé pour la teinture et l'artisanat. -Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=Clic droit sur un mouton pour teindre sa laine. D'autres choses sont teintes par l'artisanat. -Bone Meal=Farine d'Os -Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.=La farine d'os est une teinture blanche et également utile comme engrais pour accélérer la croissance de nombreuses plantes. -Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.=Cliquez avec le bouton droit sur un mouton pour blanchir sa laine. Cliquez avec le bouton droit sur une plante pour accélérer sa croissance. Notez que toutes les plantes ne peuvent pas être fertilisées comme ça. Lorsque vous cliquez avec le bouton droit sur un bloc d'herbe, les hautes herbes et les fleurs poussent partout. -Cocoa beans are a brown dye and can be used to plant cocoas.=Les fèves de cacao ont une teinture brune et peuvent être utilisées pour planter du cacao. -Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Faites un clic droit sur un mouton pour brunir sa laine. Clic droit sur le côté d'un tronc d'arbre de la jungle (Bois Acajou) pour planter un jeune cacao. -Cocoa Beans=Fèves de Cacao -Grows at the side of jungle trees=Pousse à côté des arbres de la jungle -Speeds up plant growth=Accélère la croissance des plantes diff --git a/mods/ITEMS/mcl_dye/locale/mcl_dye.pl.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.pl.tr deleted file mode 100644 index d16edb5b0f..0000000000 --- a/mods/ITEMS/mcl_dye/locale/mcl_dye.pl.tr +++ /dev/null @@ -1,27 +0,0 @@ -# textdomain: mcl_dye -Bone Meal=Mączka kostna -Light Grey Dye=Jasnoszara farba -Grey Dye=Szara farba -Ink Sac=Torbiel z atramentem -Purple Dye=Fioletowa farba -Lapis Lazuli=Lazuryt -Light Blue Dye=Jasnoniebieska farba -Cyan Dye=Błękitna farba -Cactus Green=Kaktusowa zieleń -Lime Dye=Jasnozielona farba -Dandelion Yellow=Mleczowy żółty -Cocoa Beans=Ziarna kakaowe -Orange Dye=Pomarańczowa farba -Rose Red=Różany czerwony -Magenta Dye=Karmazynowa farba -Pink Dye=Różowa farba -This item is a dye which is used for dyeing and crafting.=Ten przedmiot to farba wykorzystywana to farbowania i wytwarzania. -Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=Kliknij prawym na owcę aby zafarbować jej wełnę. Inne rzeczy mogą być zafarbowane przy wytwarzaniu. -Bone Meal=Mączka kostna -Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.=Mączka kostna to biała farba i przydatny nawóz, który przyspiesza rośnięcie wielu roślin. -Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.=Kliknij prawym na owcę, aby wybielić jej wełnę. Kliknij prawym na roślinę aby przyspieszyć jej wzrost. Zważ, że nie na wszystkie rośliny to tak działa. Gdy klikniesz prawym na blok trawy, wysoka trawa wyrośnie wokół. -Cocoa beans are a brown dye and can be used to plant cocoas.=Ziarna kakaowe mogą być wykorzystane do sadzenia kakao. -Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Naciśnij prawym aby zafarbować wełnę owcy na brązowo. Naciśnij prawym na boku tropikalnego pnia (Tropikalne drewno) aby zasadzić młode kakao. -Cocoa Beans=Ziarna kakaowe -Grows at the side of jungle trees=Rośnie na boku tropikalnych drzew -Speeds up plant growth=Przyspiesza wzrost roślin diff --git a/mods/ITEMS/mcl_dye/locale/mcl_dye.ru.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.ru.tr deleted file mode 100644 index e70388115b..0000000000 --- a/mods/ITEMS/mcl_dye/locale/mcl_dye.ru.tr +++ /dev/null @@ -1,27 +0,0 @@ -# textdomain: mcl_dye -Bone Meal=Костная мука -Light Grey Dye=Светло-серый краситель -Grey Dye=Серый краситель -Ink Sac=Чернильный мешок -Purple Dye=Пурпурный краситель -Lapis Lazuli=Ляпис-лазурь -Light Blue Dye=Светло-голубой краситель -Cyan Dye=Голубой краситель -Cactus Green=Зелень кактуса -Lime Dye=Зелёный лаймовый краситель -Dandelion Yellow=Одуванчиковый жёлтый краситель -Cocoa Beans=Какао-бобы -Orange Dye=Оранжевый краситель -Rose Red=Экстракт красной розы -Magenta Dye=Фиолетовый краситель -Pink Dye=Розовый краситель -This item is a dye which is used for dyeing and crafting.=Это краситель, которые используется, чтобы окрашивать и крафтить. -Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=Кликните правой по овце, чтобы окрасить её шерсть. Остальные вещи окрашиваются путём крафтинга. -Bone Meal=Костная мука -Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.=Костная мука является белым красителем. Она также полезна в качестве удобрения, чтобы увеличить скорость роста многих растений. -Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.=Кликните правой по овце, чтобы сделать её шерсть белой. Кликните правой по растению, чтобы ускорить его рост. Имейте в виду, что не все растения можно удобрять таким способом. Если вы кликнете по травяному блоку, то на этом месте вырастет высокая трава и цветы. -Cocoa beans are a brown dye and can be used to plant cocoas.=Какао-бобы являются коричневым красителем. Их также можно использовать, чтобы посадить какао. -Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Кликните правой по овце, чтобы сделать её шерсть коричневой. Кликните правой по боковой части ствола дерева джунглей, чтобы посадить молодое какао. -Cocoa Beans=Какао-бобы -Grows at the side of jungle trees=Растут на стволах деревьев джунглей -Speeds up plant growth=Ускоряет рост растений diff --git a/mods/ITEMS/mcl_dye/locale/mcl_dye.zh_TW.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.zh_TW.tr deleted file mode 100644 index 23d2face21..0000000000 --- a/mods/ITEMS/mcl_dye/locale/mcl_dye.zh_TW.tr +++ /dev/null @@ -1,25 +0,0 @@ -# textdomain: mcl_dye -Bone Meal=骨粉 -Light Grey Dye=淺灰色染料 -Grey Dye=灰色染料 -Ink Sac=墨囊 -Purple Dye=紫色染料 -Lapis Lazuli=青金石 -Light Blue Dye=淺藍色染料 -Cyan Dye=青色染料 -Cactus Green=仙人掌綠 -Lime Dye=淺綠色染料 -Dandelion Yellow=蒲公英黃 -Cocoa Beans=可可豆 -Orange Dye=橙色染料 -Rose Red=玫瑰紅 -Magenta Dye=洋紅色染料 -Pink Dye=粉紅色染料 -This item is a dye which is used for dyeing and crafting.=這個物品是一種用於染色和合成的染料。 -Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=右鍵單擊綿羊以染它的毛。其他東西是通過合成染色的。 -Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.=骨粉是一種白色染料,也可作為肥料,加速許多植物的生長。 -Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.=右鍵點擊一隻羊,使其羊毛變白。右鍵點擊一株植物以加快其生長速度。注意,不是所有的植物都能像這樣施肥。當你右鍵點擊一個草方時,高高的草和花會到處生長。 -Cocoa beans are a brown dye and can be used to plant cocoas.=可可豆是一種棕色染料,也可用於種植可可。 -Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=右鍵點擊一隻羊,使其羊毛變成褐色。右鍵點擊叢林木的一側,可以種植一個可可。 -Grows at the side of jungle trees=在叢林木側生長 -Speeds up plant growth=加速植物生長 diff --git a/mods/ITEMS/mcl_dye/locale/template.txt b/mods/ITEMS/mcl_dye/locale/template.txt deleted file mode 100644 index 94e250f064..0000000000 --- a/mods/ITEMS/mcl_dye/locale/template.txt +++ /dev/null @@ -1,27 +0,0 @@ -# textdomain: mcl_dye -Bone Meal= -Light Grey Dye= -Grey Dye= -Ink Sac= -Purple Dye= -Lapis Lazuli= -Light Blue Dye= -Cyan Dye= -Cactus Green= -Lime Dye= -Dandelion Yellow= -Cocoa Beans= -Orange Dye= -Rose Red= -Magenta Dye= -Pink Dye= -This item is a dye which is used for dyeing and crafting.= -Rightclick on a sheep to dye its wool. Other things are dyed by crafting.= -Bone Meal= -Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.= -Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.= -Cocoa beans are a brown dye and can be used to plant cocoas.= -Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.= -Cocoa Beans= -Grows at the side of jungle trees= -Speeds up plant growth= diff --git a/mods/ITEMS/mcl_dye/mod.conf b/mods/ITEMS/mcl_dye/mod.conf deleted file mode 100644 index fe93278fcb..0000000000 --- a/mods/ITEMS/mcl_dye/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = mcl_dye -depends = mcl_core, mcl_flowers, mcl_mobitems, mcl_cocoas diff --git a/mods/ITEMS/mcl_dye/textures/dye_cyan.png b/mods/ITEMS/mcl_dye/textures/dye_cyan.png deleted file mode 100644 index 1507fcd6d7..0000000000 Binary files a/mods/ITEMS/mcl_dye/textures/dye_cyan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_dye/textures/dye_dark_green.png b/mods/ITEMS/mcl_dye/textures/dye_dark_green.png deleted file mode 100644 index 738d6758a3..0000000000 Binary files a/mods/ITEMS/mcl_dye/textures/dye_dark_green.png and /dev/null differ diff --git a/mods/ITEMS/mcl_dye/textures/dye_dark_grey.png b/mods/ITEMS/mcl_dye/textures/dye_dark_grey.png deleted file mode 100644 index 1cae4c2f14..0000000000 Binary files a/mods/ITEMS/mcl_dye/textures/dye_dark_grey.png and /dev/null differ diff --git a/mods/ITEMS/mcl_dye/textures/dye_grey.png b/mods/ITEMS/mcl_dye/textures/dye_grey.png deleted file mode 100644 index a8724c941a..0000000000 Binary files a/mods/ITEMS/mcl_dye/textures/dye_grey.png and /dev/null differ diff --git a/mods/ITEMS/mcl_dye/textures/dye_magenta.png b/mods/ITEMS/mcl_dye/textures/dye_magenta.png deleted file mode 100644 index 2652dfbeb3..0000000000 Binary files a/mods/ITEMS/mcl_dye/textures/dye_magenta.png and /dev/null differ diff --git a/mods/ITEMS/mcl_dye/textures/dye_orange.png b/mods/ITEMS/mcl_dye/textures/dye_orange.png deleted file mode 100644 index 30fd814c58..0000000000 Binary files a/mods/ITEMS/mcl_dye/textures/dye_orange.png and /dev/null differ diff --git a/mods/ITEMS/mcl_dye/textures/dye_pink.png b/mods/ITEMS/mcl_dye/textures/dye_pink.png deleted file mode 100644 index 420fba2839..0000000000 Binary files a/mods/ITEMS/mcl_dye/textures/dye_pink.png and /dev/null differ diff --git a/mods/ITEMS/mcl_dye/textures/dye_red.png b/mods/ITEMS/mcl_dye/textures/dye_red.png deleted file mode 100644 index 8e8c4fff97..0000000000 Binary files a/mods/ITEMS/mcl_dye/textures/dye_red.png and /dev/null differ diff --git a/mods/ITEMS/mcl_dye/textures/dye_violet.png b/mods/ITEMS/mcl_dye/textures/dye_violet.png deleted file mode 100644 index 26c94f3ed0..0000000000 Binary files a/mods/ITEMS/mcl_dye/textures/dye_violet.png and /dev/null differ diff --git a/mods/ITEMS/mcl_dye/textures/dye_yellow.png b/mods/ITEMS/mcl_dye/textures/dye_yellow.png deleted file mode 100644 index 8f2a0d569b..0000000000 Binary files a/mods/ITEMS/mcl_dye/textures/dye_yellow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_dye/textures/mcl_dye_black.png b/mods/ITEMS/mcl_dye/textures/mcl_dye_black.png deleted file mode 100644 index 95a8df4ad1..0000000000 Binary files a/mods/ITEMS/mcl_dye/textures/mcl_dye_black.png and /dev/null differ diff --git a/mods/ITEMS/mcl_dye/textures/mcl_dye_blue.png b/mods/ITEMS/mcl_dye/textures/mcl_dye_blue.png deleted file mode 100644 index e0e3023075..0000000000 Binary files a/mods/ITEMS/mcl_dye/textures/mcl_dye_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_dye/textures/mcl_dye_brown.png b/mods/ITEMS/mcl_dye/textures/mcl_dye_brown.png deleted file mode 100644 index 877ee69dc2..0000000000 Binary files a/mods/ITEMS/mcl_dye/textures/mcl_dye_brown.png and /dev/null differ diff --git a/mods/ITEMS/mcl_dye/textures/mcl_dye_light_blue.png b/mods/ITEMS/mcl_dye/textures/mcl_dye_light_blue.png deleted file mode 100644 index bc819e1180..0000000000 Binary files a/mods/ITEMS/mcl_dye/textures/mcl_dye_light_blue.png and /dev/null differ diff --git a/mods/ITEMS/mcl_dye/textures/mcl_dye_lime.png b/mods/ITEMS/mcl_dye/textures/mcl_dye_lime.png deleted file mode 100644 index 7b4d08b34e..0000000000 Binary files a/mods/ITEMS/mcl_dye/textures/mcl_dye_lime.png and /dev/null differ diff --git a/mods/ITEMS/mcl_dye/textures/mcl_dye_white.png b/mods/ITEMS/mcl_dye/textures/mcl_dye_white.png deleted file mode 100644 index bc06c2865e..0000000000 Binary files a/mods/ITEMS/mcl_dye/textures/mcl_dye_white.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/README.txt b/mods/ITEMS/mcl_farming/README.txt deleted file mode 100644 index 5779d70356..0000000000 --- a/mods/ITEMS/mcl_farming/README.txt +++ /dev/null @@ -1,46 +0,0 @@ -===FARMING MOD for MINETEST-C55=== -by PilzAdam - -Introduction: -This mod adds farming to Minetest. - -How to install: -Unzip the archive an place it in minetest-base-directory/mods/minetest/ -if you have a windows client or a linux run-in-place client. If you have -a linux system-wide instalation place it in ~/.minetest/mods/minetest/. -If you want to install this mod only in one world create the folder -worldmods/ in your worlddirectory. -For further information or help see: -http://wiki.minetest.com/wiki/Installing_Mods - -How to use the mod: -Craft a wood/stone/iron/gold/diamond hoe: -material material - stick - stick -Dig dirt with it and turn it to soil. Water the soil and plant the seeds -you get by digging dirt with the hoe. Wait until the seeds are seasoned -and harvest them. When harvesting you will get the product and new seeds. -For further information or help see: -http://minetest.net/forum/viewtopic.php?id=2787 - -License: -Sourcecode: WTFPL (see below) -Graphics: WTFPL (see below) - -See also: -http://minetest.net/ - - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - Version 2, December 2004 - - Copyright (C) 2004 Sam Hocevar - - Everyone is permitted to copy and distribute verbatim or modified - copies of this license document, and changing it is allowed as long - as the name is changed. - - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/mods/ITEMS/mcl_farming/beetroot.lua b/mods/ITEMS/mcl_farming/beetroot.lua deleted file mode 100644 index 21096042b8..0000000000 --- a/mods/ITEMS/mcl_farming/beetroot.lua +++ /dev/null @@ -1,167 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -minetest.register_craftitem("mcl_farming:beetroot_seeds", { - description = S("Beetroot Seeds"), - _tt_help = S("Grows on farmland"), - _doc_items_longdesc = S("Grows into a beetroot plant. Chickens like beetroot seeds."), - _doc_items_usagehelp = S("Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds."), - groups = {craftitem = 1, compostability = 30}, - inventory_image = "mcl_farming_beetroot_seeds.png", - wield_image = "mcl_farming_beetroot_seeds.png", - on_place = function(itemstack, placer, pointed_thing) - return mcl_farming:place_seed(itemstack, placer, pointed_thing, "mcl_farming:beetroot_0") - end -}) - -minetest.register_node("mcl_farming:beetroot_0", { - description = S("Premature Beetroot Plant (Stage 1)"), - _doc_items_longdesc = S("Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature."), - _doc_items_entry_name = S("Premature Beetroot Plant"), - paramtype = "light", - paramtype2 = "meshoptions", - sunlight_propagates = true, - place_param2 = 3, - walkable = false, - drawtype = "plantlike", - drop = "mcl_farming:beetroot_seeds", - tiles = {"mcl_farming_beetroot_0.png"}, - inventory_image = "mcl_farming_beetroot_0.png", - wield_image = "mcl_farming_beetroot_0.png", - selection_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5} - }, - }, - groups = {dig_immediate=3, not_in_creative_inventory=1,plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1}, - sounds = mcl_sounds.node_sound_leaves_defaults(), - _mcl_blast_resistance = 0, -}) - -minetest.register_node("mcl_farming:beetroot_1", { - description = S("Premature Beetroot Plant (Stage 2)"), - _doc_items_create_entry = false, - paramtype = "light", - paramtype2 = "meshoptions", - sunlight_propagates = true, - place_param2 = 3, - walkable = false, - drawtype = "plantlike", - drop = "mcl_farming:beetroot_seeds", - tiles = {"mcl_farming_beetroot_1.png"}, - inventory_image = "mcl_farming_beetroot_1.png", - wield_image = "mcl_farming_beetroot_1.png", - selection_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, -3/16, 0.5} - }, - }, - groups = {dig_immediate=3, not_in_creative_inventory=1,plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1}, - sounds = mcl_sounds.node_sound_leaves_defaults(), - _mcl_blast_resistance = 0, -}) - -minetest.register_node("mcl_farming:beetroot_2", { - description = S("Premature Beetroot Plant (Stage 3)"), - _doc_items_create_entry = false, - paramtype = "light", - paramtype2 = "meshoptions", - sunlight_propagates = true, - place_param2 = 3, - walkable = false, - drawtype = "plantlike", - drop = "mcl_farming:beetroot_seeds", - tiles = {"mcl_farming_beetroot_2.png"}, - inventory_image = "mcl_farming_beetroot_2.png", - wield_image = "mcl_farming_beetroot_2.png", - selection_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, 2/16, 0.5} - }, - }, - groups = {dig_immediate=3, not_in_creative_inventory=1,plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1}, - sounds = mcl_sounds.node_sound_leaves_defaults(), - _mcl_blast_resistance = 0, -}) - -minetest.register_node("mcl_farming:beetroot", { - description = S("Mature Beetroot Plant"), - _doc_items_longdesc = S("A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further."), - _doc_items_create_entry = true, - paramtype = "light", - paramtype2 = "meshoptions", - sunlight_propagates = true, - place_param2 = 3, - walkable = false, - drawtype = "plantlike", - drop = { - --[[ drops 1 beetroot guaranteed. - drops 0-3 beetroot seeds: - 0 seeds: 42.18% - 1 seed: 14.06% - 2 seeds: 18.75% - 3 seeds: 25% ]] - max_items = 2, - items = { - { items = {"mcl_farming:beetroot_item"}, rarity = 1 }, - { items = {"mcl_farming:beetroot_seeds 3"}, rarity = 4 }, - { items = {"mcl_farming:beetroot_seeds 2"}, rarity = 4 }, - { items = {"mcl_farming:beetroot_seeds 1"}, rarity = 4 }, - }, - }, - tiles = {"mcl_farming_beetroot_3.png"}, - inventory_image = "mcl_farming_beetroot_3.png", - wield_image = "mcl_farming_beetroot_3.png", - selection_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, 3/16, 0.5} - }, - }, - groups = {dig_immediate=3, not_in_creative_inventory=1,plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,beetroot=4}, - sounds = mcl_sounds.node_sound_leaves_defaults(), - _mcl_blast_resistance = 0, -}) - -minetest.register_craftitem("mcl_farming:beetroot_item", { - description = S("Beetroot"), - _doc_items_longdesc = S("Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too."), - _doc_items_usagehelp = S("Hold it in your hand and right-click to eat it. Rightclick an animal to feed it."), - inventory_image = "mcl_farming_beetroot.png", - wield_image = "mcl_farming_beetroot.png", - on_place = minetest.item_eat(1), - on_secondary_use = minetest.item_eat(1), - groups = {food = 2, eatable = 1, compostability = 65}, - _mcl_saturation = 1.2, -}) - -minetest.register_craftitem("mcl_farming:beetroot_soup", { - description = S("Beetroot Soup"), - _doc_items_longdesc = S("Beetroot soup is a food item."), - stack_max = 1, - inventory_image = "mcl_farming_beetroot_soup.png", - wield_image = "mcl_farming_beetroot_soup.png", - on_place = minetest.item_eat(6, "mcl_core:bowl"), - on_secondary_use = minetest.item_eat(6, "mcl_core:bowl"), - groups = { food = 3, eatable = 6 }, - _mcl_saturation = 7.2, -}) - -minetest.register_craft({ - output = "mcl_farming:beetroot_soup", - recipe = { - { "mcl_farming:beetroot_item","mcl_farming:beetroot_item","mcl_farming:beetroot_item", }, - { "mcl_farming:beetroot_item","mcl_farming:beetroot_item","mcl_farming:beetroot_item", }, - { "", "mcl_core:bowl", "" }, - }, -}) - -mcl_farming:add_plant("plant_beetroot", "mcl_farming:beetroot", {"mcl_farming:beetroot_0", "mcl_farming:beetroot_1", "mcl_farming:beetroot_2"}, 68, 3) - -if minetest.get_modpath("doc") then - for i=1,2 do - doc.add_entry_alias("nodes", "mcl_farming:beetroot_0", "nodes", "mcl_farming:beetroot_"..i) - end -end diff --git a/mods/ITEMS/mcl_farming/carrots.lua b/mods/ITEMS/mcl_farming/carrots.lua deleted file mode 100644 index 1c3ebcdfa5..0000000000 --- a/mods/ITEMS/mcl_farming/carrots.lua +++ /dev/null @@ -1,127 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -for i=1, 7 do - local texture, sel_height - if i < 3 then - sel_height = -5/16 - texture = "farming_carrot_1.png" - elseif i < 5 then - sel_height = -3/16 - texture = "farming_carrot_2.png" - else - sel_height = 2/16 - texture = "farming_carrot_3.png" - end - - local create, name, longdesc - if i == 1 then - create = true - name = S("Premature Carrot Plant") - longdesc = S("Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.") - else - create = false - end - minetest.register_node("mcl_farming:carrot_"..i, { - description = S("Premature Carrot Plant (Stage @1)", i), - _doc_items_create_entry = create, - _doc_items_entry_name = name, - _doc_items_longdesc = longdesc, - paramtype = "light", - sunlight_propagates = true, - paramtype2 = "meshoptions", - place_param2 = 3, - walkable = false, - drawtype = "plantlike", - drop = "mcl_farming:carrot_item", - tiles = {texture}, - inventory_image = texture, - wield_image = texture, - selection_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, sel_height, 0.5} - }, - }, - groups = {dig_immediate=3, not_in_creative_inventory=1,plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1}, - sounds = mcl_sounds.node_sound_leaves_defaults(), - _mcl_blast_resistance = 0, - }) -end - -minetest.register_node("mcl_farming:carrot", { - description = S("Mature Carrot Plant"), - _doc_items_longdesc = S("Mature carrot plants are ready to be harvested for carrots. They won't grow any further."), - paramtype = "light", - sunlight_propagates = true, - paramtype2 = "meshoptions", - place_param2 = 3, - walkable = false, - drawtype = "plantlike", - tiles = {"farming_carrot_4.png"}, - inventory_image = "farming_carrot_4.png", - wield_image = "farming_carrot_4.png", - drop = { - max_items = 1, - items = { - { items = {"mcl_farming:carrot_item 4"}, rarity = 5 }, - { items = {"mcl_farming:carrot_item 3"}, rarity = 2 }, - { items = {"mcl_farming:carrot_item 2"}, rarity = 2 }, - { items = {"mcl_farming:carrot_item 1"} }, - } - }, - selection_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, 4/16, 0.5} - }, - }, - groups = {dig_immediate=3, not_in_creative_inventory=1,plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1}, - sounds = mcl_sounds.node_sound_leaves_defaults(), - _mcl_blast_resistance = 0, -}) - -minetest.register_craftitem("mcl_farming:carrot_item", { - description = S("Carrot"), - _tt_help = S("Grows on farmland"), - _doc_items_longdesc = S("Carrots can be eaten and planted. Pigs and rabbits like carrots."), - _doc_items_usagehelp = S("Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it."), - inventory_image = "farming_carrot.png", - groups = {food = 2, eatable = 3, compostability = 65}, - _mcl_saturation = 3.6, - on_secondary_use = minetest.item_eat(3), - on_place = function(itemstack, placer, pointed_thing) - local new = mcl_farming:place_seed(itemstack, placer, pointed_thing, "mcl_farming:carrot_1") - if new then - return new - else - return minetest.do_item_eat(3, nil, itemstack, placer, pointed_thing) - end - end, -}) - -minetest.register_craftitem("mcl_farming:carrot_item_gold", { - description = S("Golden Carrot"), - _doc_items_longdesc = S("A golden carrot is a precious food item which can be eaten. It is really, really filling!"), - inventory_image = "farming_carrot_gold.png", - on_place = minetest.item_eat(6), - on_secondary_use = minetest.item_eat(6), - groups = { brewitem = 1, food = 2, eatable = 6 }, - _mcl_saturation = 14.4, -}) - -minetest.register_craft({ - output = "mcl_farming:carrot_item_gold", - recipe = { - {"mcl_core:gold_nugget", "mcl_core:gold_nugget", "mcl_core:gold_nugget"}, - {"mcl_core:gold_nugget", "mcl_farming:carrot_item", "mcl_core:gold_nugget"}, - {"mcl_core:gold_nugget", "mcl_core:gold_nugget", "mcl_core:gold_nugget"}, - } -}) - -mcl_farming:add_plant("plant_carrot", "mcl_farming:carrot", {"mcl_farming:carrot_1", "mcl_farming:carrot_2", "mcl_farming:carrot_3", "mcl_farming:carrot_4", "mcl_farming:carrot_5", "mcl_farming:carrot_6", "mcl_farming:carrot_7"}, 25, 20) - -if minetest.get_modpath("doc") then - for i=2,7 do - doc.add_entry_alias("nodes", "mcl_farming:carrot_1", "nodes", "mcl_farming:carrot_"..i) - end -end diff --git a/mods/ITEMS/mcl_farming/hoes.lua b/mods/ITEMS/mcl_farming/hoes.lua deleted file mode 100644 index d2250eb707..0000000000 --- a/mods/ITEMS/mcl_farming/hoes.lua +++ /dev/null @@ -1,275 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -local function create_soil(pos, inv) - if pos == nil then - return false - end - local node = minetest.get_node(pos) - local name = node.name - local above = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) - if minetest.get_item_group(name, "cultivatable") == 2 then - if above.name == "air" then - node.name = "mcl_farming:soil" - minetest.set_node(pos, node) - minetest.sound_play("default_dig_crumbly", { pos = pos, gain = 0.5 }, true) - return true - end - elseif minetest.get_item_group(name, "cultivatable") == 1 then - if above.name == "air" then - node.name = "mcl_core:dirt" - minetest.set_node(pos, node) - minetest.sound_play("default_dig_crumbly", { pos = pos, gain = 0.6 }, true) - return true - end - end - return false -end - -local hoe_on_place_function = function(wear_divisor) - return function(itemstack, user, pointed_thing) - -- Call on_rightclick if the pointed node defines it - local node = minetest.get_node(pointed_thing.under) - if user and not user:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack - end - end - - if minetest.is_protected(pointed_thing.under, user:get_player_name()) then - minetest.record_protection_violation(pointed_thing.under, user:get_player_name()) - return itemstack - end - - if create_soil(pointed_thing.under, user:get_inventory()) then - if not minetest.is_creative_enabled(user:get_player_name()) then - itemstack:add_wear(65535/wear_divisor) - end - return itemstack - end - end -end - -local uses = { - wood = 60, - stone = 132, - iron = 251, - gold = 33, - diamond = 1562, -} - -local hoe_tt = S("Turns block into farmland") -local hoe_longdesc = S("Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.") -local hoe_usagehelp = S("Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.") - -minetest.register_tool("mcl_farming:hoe_wood", { - description = S("Wood Hoe"), - _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.wood), - _doc_items_longdesc = hoe_longdesc, - _doc_items_usagehelp = hoe_usagehelp, - _doc_items_hidden = false, - inventory_image = "farming_tool_woodhoe.png", - wield_scale = mcl_vars.tool_wield_scale, - on_place = hoe_on_place_function(uses.wood), - groups = { tool=1, hoe=1, enchantability=15 }, - tool_capabilities = { - full_punch_interval = 1, - damage_groups = { fleshy = 1, }, - punch_attack_uses = uses.wood, - }, - _repair_material = "group:wood", - _mcl_toollike_wield = true, - _mcl_diggroups = { - hoey = { speed = 2, level = 1, uses = 60 } - }, -}) - -minetest.register_craft({ - output = "mcl_farming:hoe_wood", - recipe = { - {"group:wood", "group:wood"}, - {"", "mcl_core:stick"}, - {"", "mcl_core:stick"} - } -}) -minetest.register_craft({ - output = "mcl_farming:hoe_wood", - recipe = { - {"group:wood", "group:wood"}, - {"mcl_core:stick", ""}, - {"mcl_core:stick", ""} - } -}) -minetest.register_craft({ - type = "fuel", - recipe = "mcl_farming:hoe_wood", - burntime = 10, -}) - -minetest.register_tool("mcl_farming:hoe_stone", { - description = S("Stone Hoe"), - _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.stone), - _doc_items_longdesc = hoe_longdesc, - _doc_items_usagehelp = hoe_usagehelp, - inventory_image = "farming_tool_stonehoe.png", - wield_scale = mcl_vars.tool_wield_scale, - on_place = hoe_on_place_function(uses.stone), - groups = { tool=1, hoe=1, enchantability=5 }, - tool_capabilities = { - full_punch_interval = 0.5, - damage_groups = { fleshy = 1, }, - punch_attack_uses = uses.stone, - }, - _repair_material = "group:cobble", - _mcl_toollike_wield = true, - _mcl_diggroups = { - hoey = { speed = 4, level = 3, uses = 132 } - }, -}) - -minetest.register_craft({ - output = "mcl_farming:hoe_stone", - recipe = { - {"group:cobble", "group:cobble"}, - {"", "mcl_core:stick"}, - {"", "mcl_core:stick"} - } -}) -minetest.register_craft({ - output = "mcl_farming:hoe_stone", - recipe = { - {"group:cobble", "group:cobble"}, - {"mcl_core:stick", ""}, - {"mcl_core:stick", ""} - } -}) - -minetest.register_tool("mcl_farming:hoe_iron", { - description = S("Iron Hoe"), - _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.iron), - _doc_items_longdesc = hoe_longdesc, - _doc_items_usagehelp = hoe_usagehelp, - inventory_image = "farming_tool_steelhoe.png", - wield_scale = mcl_vars.tool_wield_scale, - on_place = hoe_on_place_function(uses.iron), - groups = { tool=1, hoe=1, enchantability=14 }, - tool_capabilities = { - -- 1/3 - full_punch_interval = 0.33333333, - damage_groups = { fleshy = 1, }, - punch_attack_uses = uses.iron, - }, - _repair_material = "mcl_core:iron_ingot", - _mcl_toollike_wield = true, - _mcl_diggroups = { - hoey = { speed = 6, level = 4, uses = 251 } - }, -}) - -minetest.register_craft({ - output = "mcl_farming:hoe_iron", - recipe = { - {"mcl_core:iron_ingot", "mcl_core:iron_ingot"}, - {"", "mcl_core:stick"}, - {"", "mcl_core:stick"} - } -}) -minetest.register_craft({ - output = "mcl_farming:hoe_iron", - recipe = { - {"mcl_core:iron_ingot", "mcl_core:iron_ingot"}, - {"mcl_core:stick", ""}, - {"mcl_core:stick", ""} - } -}) - -minetest.register_craft({ - type = "cooking", - output = "mcl_core:iron_nugget", - recipe = "mcl_farming:hoe_iron", - cooktime = 10, -}) - -minetest.register_tool("mcl_farming:hoe_gold", { - description = S("Golden Hoe"), - _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.gold), - _doc_items_longdesc = hoe_longdesc, - _doc_items_usagehelp = hoe_usagehelp, - inventory_image = "farming_tool_goldhoe.png", - wield_scale = mcl_vars.tool_wield_scale, - on_place = hoe_on_place_function(uses.gold), - groups = { tool=1, hoe=1, enchantability=22 }, - tool_capabilities = { - full_punch_interval = 1, - damage_groups = { fleshy = 1, }, - punch_attack_uses = uses.gold, - }, - _repair_material = "mcl_core:gold_ingot", - _mcl_toollike_wield = true, - _mcl_diggroups = { - hoey = { speed = 12, level = 2, uses = 33 } - }, -}) - -minetest.register_craft({ - output = "mcl_farming:hoe_gold", - recipe = { - {"mcl_core:gold_ingot", "mcl_core:gold_ingot"}, - {"", "mcl_core:stick"}, - {"", "mcl_core:stick"} - } -}) -minetest.register_craft({ - output = "mcl_farming:hoe_gold", - recipe = { - {"mcl_core:gold_ingot", "mcl_core:gold_ingot"}, - {"mcl_core:stick", ""}, - {"mcl_core:stick", ""} - } -}) - - - -minetest.register_craft({ - type = "cooking", - output = "mcl_core:gold_nugget", - recipe = "mcl_farming:hoe_gold", - cooktime = 10, -}) - -minetest.register_tool("mcl_farming:hoe_diamond", { - description = S("Diamond Hoe"), - _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.diamond), - _doc_items_longdesc = hoe_longdesc, - _doc_items_usagehelp = hoe_usagehelp, - inventory_image = "farming_tool_diamondhoe.png", - wield_scale = mcl_vars.tool_wield_scale, - on_place = hoe_on_place_function(uses.diamond), - groups = { tool=1, hoe=1, enchantability=10 }, - tool_capabilities = { - full_punch_interval = 0.25, - damage_groups = { fleshy = 1, }, - punch_attack_uses = uses.diamond, - }, - _repair_material = "mcl_core:diamond", - _mcl_toollike_wield = true, - _mcl_diggroups = { - hoey = { speed = 8, level = 5, uses = 1562 } - }, -}) - -minetest.register_craft({ - output = "mcl_farming:hoe_diamond", - recipe = { - {"mcl_core:diamond", "mcl_core:diamond"}, - {"", "mcl_core:stick"}, - {"", "mcl_core:stick"} - } -}) -minetest.register_craft({ - output = "mcl_farming:hoe_diamond", - recipe = { - {"mcl_core:diamond", "mcl_core:diamond"}, - {"mcl_core:stick", ""}, - {"mcl_core:stick", ""} - } -}) diff --git a/mods/ITEMS/mcl_farming/init.lua b/mods/ITEMS/mcl_farming/init.lua deleted file mode 100644 index adce058ee3..0000000000 --- a/mods/ITEMS/mcl_farming/init.lua +++ /dev/null @@ -1,29 +0,0 @@ -mcl_farming = {} - --- IMPORTANT API AND HELPER FUNCTIONS -- --- Contain functions for planting seed, addind plant growth and gourds (melon/pumpkin-like) -dofile(minetest.get_modpath("mcl_farming").."/shared_functions.lua") - --- ========= SOIL ========= -dofile(minetest.get_modpath("mcl_farming").."/soil.lua") - --- ========= HOES ========= -dofile(minetest.get_modpath("mcl_farming").."/hoes.lua") - --- ========= WHEAT ========= -dofile(minetest.get_modpath("mcl_farming").."/wheat.lua") - --- ======= PUMPKIN ========= -dofile(minetest.get_modpath("mcl_farming").."/pumpkin.lua") - --- ========= MELON ========= -dofile(minetest.get_modpath("mcl_farming").."/melon.lua") - --- ========= CARROT ========= -dofile(minetest.get_modpath("mcl_farming").."/carrots.lua") - --- ========= POTATOES ========= -dofile(minetest.get_modpath("mcl_farming").."/potatoes.lua") - --- ========= BEETROOT ========= -dofile(minetest.get_modpath("mcl_farming").."/beetroot.lua") diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr deleted file mode 100644 index 54b3563064..0000000000 --- a/mods/ITEMS/mcl_farming/locale/mcl_farming.de.tr +++ /dev/null @@ -1,99 +0,0 @@ -# textdomain: mcl_farming -Beetroot Seeds=Rote-Beete-Samen -Grows into a beetroot plant. Chickens like beetroot seeds.=Wachsen zu Rote Beete heran. Hühner mögen Rote-Beete-Samen. -Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.=Platzieren Sie die Rote-Beete-Samen auf Ackerboden (der mit einer Hacke gemacht werden kann), um Rote Beete zu pflanzen. Sie wächst im Sonnenlicht und wächst auf bewässertem Ackerboden schneller. Rechtsklicken Sie auf ein Tier, um es mit Rote-Beete-Samen zu füttern. -Premature Beetroot Plant (Stage 1)=Junge Rote Beete (1. Stufe) -Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Rote Beete ist eine Pflanze, die auf Ackerboden im Sonnenlicht in 4 Stufen wächst. Auf bewässertem Ackerboden wächst sie etwas schneller. Sie kann jederzeit abgeerntet werden, aber wird nur einen Ertrag abwerfen, wenn sie ausgewachsen ist. -Premature Beetroot Plant=Junge Rote Beete -Premature Beetroot Plant (Stage 2)=Junge Rote Beete (2. Stufe) -Premature Beetroot Plant (Stage 3)=Junge Rote Beete (3. Stufe) -Mature Beetroot Plant=Ausgewachsene Rote Beete -A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.=Eine ausgewachsene Rote Beete ist eine erntereife Pflanze, die für eine Rote-Beete-Rübe und ein paar Rote-Beete-Samen abgeerntet werden kann. Sie wächst nicht weiter. -Beetroot=Rote-Beete-Rübe -Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.=Rote-Beete-Rüben sind eine Speise und nützlich zur Herstellung von Farbstoffen. Schweine mögen sie auch. -Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.=Halten Sie es in der Hand und rechtsklicken Sie, um es zu essen. Rechtsklicken Sie auf ein Tier, um es zu füttern. -Beetroot Soup=Rote-Beete-Suppe -Beetroot soup is a food item.=Rote-Beete-Suppe ist ein Lebensmittel. -Premature Carrot Plant=Junge Karottenpflanze -Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Karottenpflanzen sind Pflanzen, die auf Ackerboden im Sonnenlicht in 8 Stufen wachsen, aber es gibt nur 4 sichtbar unterscheidbare Stufen. Auf bewässertem Ackerboden wachsen sie etwas schneller. Sie können jederzeit abgeerntet werden, aber werden nur einen Ertrag abwerfen, wenn sie ausgewachsen sind. -Premature Carrot Plant (Stage @1)=Junge Karottenpflanze (@1. Stufe) -Mature Carrot Plant=Ausgewachsene Karottenpflanze -Mature carrot plants are ready to be harvested for carrots. They won't grow any further.=Ausgewachsene Karottenpflanzen können für Karotten abgeerntet werden. Sie werden nicht weiter wachsen. -Carrot=Karotte -Carrots can be eaten and planted. Pigs and rabbits like carrots.=Karotten können gegessen und gepflanzt werden. Schweine und Kaninchen mögen Karotten. -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Halten Sie es in ihrer Hand und rechtsklicken Sie, um es zu essen. Platzieren Sie sie auf Ackerboden, um sie einzupflanzen. Sie wächst im Sonnenlicht und wächst auf bewässertem Ackerboden schneller. Rechtsklicken Sie auf ein Tier, um es zu füttern. -Golden Carrot=Goldene Karotte -A golden carrot is a precious food item which can be eaten. It is really, really filling!=Eine goldene Karotte ist ein kostbares Lebensmittel. Es ist sehr, sehr sättigend! -Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.=Hacken sind unerlässliche Werkzeuge für die Zucht von Feldpflanzen. Sie können benutzt werden, um einen Ackerboden zu machen, auf dem Samen gepflanzt werden können. Hacken können zur Not auch als sehr schwache Waffen benutzt werden. -Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.=Benutzen Sie die Hacke auf einen beackerbaren Block (indem Sie ihn rechtsklicken), um ihn zu Ackerboden in verwandeln. Erde, Grasblöcke und Graspfade können beackert werden. Grobe Erde wird zu Erde. -Wood Hoe=Holzhacke -Stone Hoe=Steinhacke -Iron Hoe=Eisenhacke -Golden Hoe=Goldhacke -Diamond Hoe=Diamanthacke -Melon Seeds=Melonensamen -Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.=Platzieren Sie die Melonensamen auf Ackerboden (der mit einer Hacke gemacht werden kann), um einen Melonenstängel zu pflanzen. Melonenstängel wachsen im Sonnenlicht und wachen auf bewässertem Ackerboden schneller. Ausgewachsen wird der Melonenstängel versuchen, an der Seite eine Melone wachsen zu lassen. Rechtsklicken Sie auf ein Tier, um es mit Melonensamen zu füttern. -Melon=Melone -Grows into a melon stem which in turn grows melons. Chickens like melon seeds.=Wächst zu einem Melonenstängel heran, aus dem wiederum Melonen wachsen. Hühner mögen Melonensamen. -A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.=Eine Melone ist ein Block, der von Melonenstängeln wächst, der wiederum aus Melonensamen wächst. Er kann für Melonenstücke abgeerntet werden. -Premature Melon Stem=Junger Melonenstängel -Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.=Melonenstängel wachsen auf Ackerboden in 8 Stufen. Auf bewässertem Ackerboden ist das Wachstum etwas schneller. Aus ausgewachsenen Melonenstängeln können Melonen wachsen. -Premature Melon Stem (Stage @1)=Junger Melonenstängel (@1. Stufe) -Mature Melon Stem=Ausgewachsener Melonenstängel -A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.=Ein ausgewachsener Melonenstängel versucht, auf einem seiner vier benachbarten Blöcke eine Melone wachsen zu lassen. Eine Melone kann nur auf Ackerboden, Erde oder einem Grasblock wachsen. Wenn sich eine Melone neben einem Melonenstängel befindet, verbiegt sich der Melonenstängel und verbindet sich mit der Melone. Solange der Stängel verbunden ist, kann aus ihm keine neue Melone wachsen. Wenn alle Melonen um den Melonenstängel entfernt wurden, verliert er die Verbindung und aus ihm kann eine weitere Melone wachsen. -Melon Slice=Melonenstück -This is a food item which can be eaten.=Ein essbares Lebensmittel. -Premature Potato Plant=Junge Kartoffelpflanze -Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Kartoffelpflanzen sind Pflanzen, die auf Ackerboden im Sonnenlicht in 8 Stufen wachsen, aber es gibt nur 4 sichtbar unterscheidbare Stufen. Auf bewässertem Ackerboden wachsen sie etwas schneller. Sie können jederzeit abgeerntet werden, aber werden nur einen Ertrag abwerfen, wenn sie ausgewachsen sind. -Premature Potato Plant (Stage @1)=Junge Kartoffelpflanze (@1. Stufe) -Mature Potato Plant=Ausgewachsene Kartoffelpflanze -Mature potato plants are ready to be harvested for potatoes. They won't grow any further.=Ausgewachsene Kartoffelpflanzen können für Kartoffeln abgeerntet werden. Sie wachsen nicht weiter. -Potato=Kartoffel -Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.=Kartoffeln sind essbare Lebensmittel, können im Ofen gebacken und eingepflanzt werden. Schweine mögen Kartoffeln. -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Halten Sie sie in der Hand und rechtsklicken Sie zum Essen. Platzieren Sie sie auf Ackerboden, um sie zu pflanzen. Sie wächst im Sonnenlicht und wächst auf bewässertem Ackerboden schneller. Rechtsklicken Sie auf ein Tier, um es zu füttern. -Baked Potato=Ofenkartoffel -Baked potatoes are food items which are more filling than the unbaked ones.=Ofenkartoffeln sind Lebensmittel, die etwas nahrhafter als rohe Kartoffeln sind. -Poisonous Potato=Giftige Kartoffel -This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.=Diese Kartoffel sieht nicht gerade gesund aus. Sie kann gegessen werden, um Hungerpunkte zu erhalten, aber es gibt eine Chance von 60%, dass das Sie kurz vergiften wird. -Pumpkin Seeds=Kürbissamen -Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds.=Wächst zu einem Kürbisstängel heran, aus dem wiederum Kürbisse wachsen. Hühner mögen Kürbissamen. -Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.=Platzieren Sie die Kürbissamen auf Ackerboden (der mit einer Hacke gemacht werden kann), um einen Kürbisstängel zu pflanzen. Kürbisstängel wachsen im Sonnenlicht und wachsen auf bewässertem Ackerboden schneller. Ausgewachsen wird der Kürbisstängel versuchen, einen Kürbis an einem benachbartem Feld wachsen zu lassen. Rechtsklicken Sie auf ein Tier, um es mit Kürbissamen zu füttern. -Premature Pumpkin Stem=Junger Kürbisstängel -Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.=Kürbisstängel wachsen auf Ackerboden in 8 Stufen. Auf bewässertem Ackerboden ist das Wachstum etwas schneller. Aus ausgewachsenen Kürbisstängeln können Kürbisse wachsen. -Premature Pumpkin Stem (Stage @1)=Junger Kürbisstängel (@1. Stufe) -Mature Pumpkin Stem=Ausgewachsener Kürbisstängel -A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin.=Ein ausgewachsener Kürbisstängel versucht, auf einem seiner vier benachbarten Blöcke einen Kürbis wachsen zu lassen. Ein Kürbis kann nur auf Ackerboden, Erde oder einem Grasblock wachsen. Wenn sich ein Kürbis neben einem Kürbisstängel befindet, verbiegt sich der Kürbisstängel und verbindet sich mit dem Kürbis. Solange der Stängel verbunden ist, kann aus ihm kein neuer Kürbis wachsen. Wenn alle Kürbisse um den Kürbisstängel entfernt wurden, verliert er die Verbindung und aus ihm kann ein weiterer Kürbis wachsen. -Faceless Pumpkin=Gesichtsloser Kürbis -A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.=Ein gesichtsloser Kürbis ist ein dekorativer Block. Mit einer Schere kann man in ihm ein Muster schnitzen, um Kürbissamen zu erhalten. -Pumpkin=Kürbis -A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.=Einen Kürbis kann zum Spaß als Helm getragen werden, aber er bietet keinen Schutz. Kürbisse wachsen aus Kürbisstängeln, welche wiederum aus Kürbissamen wachsen. -Jack o'Lantern=Kürbislaterne -A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.=Eine Kürbislaterne ist eine traditionelle Dekoration für Halloween. Sie leuchtet hell. -Pumpkin Pie=Kürbiskuchen -A pumpkin pie is a tasty food item which can be eaten.=Ein Kürbiskuchen ist ein leckeres essbares Lebensmittel. -Farmland=Ackerboden -Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Ackerboden wird für den Ackerbau genutzt, ein unerlässlicher Boden zum Anbau von Nutzpflanzen. Er wird erstellt, wenn eine Hacke auf Erde oder einem ähnlichen Block benutzt wird. Pflanzen können auf Ackerboden wachsen, aber nur langsam. Ackerboden wird zu bewässertem Ackerboden (auf dem Pflanzen schneller wachsen), wenn es regnet oder sich eine Wasserquelle in der Nähe befindet. Dieser Block wird sich zurück zu Erde verwandeln, wenn über ihn ein fester Block auftaucht oder sich über ihn ein Kolbenarm ausbreitet. -Hydrated Farmland=Bewässerter Ackerboden -Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Bewässerter Ackerboden wird für den Ackerbau benutzt, auf ihm kann man Nutzpflanzen züchten. Er entsteht, wenn sich Ackerboden unter Regen oder in der Nähe von Wasser befindet. Ohne Wasser wird dieser Block irgendwann austrocknen. Dieser Block verwandelt sich zurück zu Erde, wenn über ihm ein fester Block auftaucht, oder ein Kolbenarm sich über ihn bewegt. -Wheat Seeds=Weizensamen -Grows into a wheat plant. Chickens like wheat seeds.=Wachsen zu einer Weizenpflanze heran. Hühner mögen Weizensamen. -Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.=Platzieren Sie die Weizensamen auf Ackerboden (welcher mit einer Hacke gemacht werden kann), um eine Weizenpflanze zu pflanzen. Sie wächst im Sonnenlicht und wächst schneller auf bewässertem Ackerboden. Rechtsklicken Sie auf ein Tier, um es mit Weizensamen zu füttern. -Premature Wheat Plant=Junge Weizenpflanze -Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.=Junge Weizenpflanzen wachsen auf Ackerboden im Sonnenlicht in 8 Stufen. Auf bewässertem Ackerboden wachsen sie schneller. Sie können jederzeit abgeerntet werden, aber werden nur ertragreich sein, wenn sie ausgewachsen sind. -Premature Wheat Plant (Stage @1)=Junge Weizenpflanze (@1. Stufe) -Mature Wheat Plant=Ausgewachsene Weizenpflanze -Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.=Ausgewachsene Weizenpflanzen können für Weizen und Weizensamen abgeerntet werden. Sie wachsen nicht weiter. -Wheat=Weizen -Wheat is used in crafting. Some animals like wheat.=Weizen wird in der Herstellung gebraucht. Einige Tiere mögen Weizen. -Cookie=Keks -Bread=Brot -Hay Bale=Heuballen -Hay bales are decorative blocks made from wheat.=Heuballen sind dekorative Blöcke, die aus Weizen gemacht sind. -To carve a face into the pumpkin, use the shears on the side you want to carve.=Um ein Gesicht in den Kürbis zu schnitzen, benutzen Sie die Schere an der Seite, die Sie schnitzen wollen. -Use the “Place” key on an animal to try to feed it wheat.=Benutzen Sie die „Platzieren“-Taste auf einem Tier, um zu versuchen, es zu füttern. -Grows on farmland=Wächst auf Ackerboden -Turns block into farmland=Macht Block zu Ackerboden -60% chance of poisoning=60% Vergiftungswahrscheinlichkeit -Surface for crops=Boden für Nutzpflanzen -Can become wet=Kann nass werden -Uses: @1=Verwendungen: @1 diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.es.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.es.tr deleted file mode 100644 index 8366e82520..0000000000 --- a/mods/ITEMS/mcl_farming/locale/mcl_farming.es.tr +++ /dev/null @@ -1,93 +0,0 @@ -# textdomain: mcl_farming -Beetroot Seeds=Semillas de remolacha -Grows into a beetroot plant. Chickens like beetroot seeds.=Crece en una planta de remolacha. A los pollos les gustan las semillas de remolacha. -Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.=Coloque las semillas de remolacha en tierras de cultivo (que se pueden crear con una azada) para plantar una planta de remolacha. Crecen a la luz del sol y crecen más rápido en tierras de cultivo hidratadas. Haga clic derecho en un animal para alimentarlo con semillas de remolacha. -Premature Beetroot Plant (Stage 1)=Planta de remolacha prematura (Etapa 1) -Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Las plantas de remolacha son plantas que crecen en tierras de cultivo bajo la luz solar en 4 etapas. En tierras de cultivo hidratadas, crecen un poco más rápido. Se pueden cosechar en cualquier momento, pero solo generarán ganancias cuando maduren. -Premature Beetroot Plant=Planta de remolacha prematura -Premature Beetroot Plant (Stage 2)=Planta de remolacha prematura (Etapa 2) -Premature Beetroot Plant (Stage 3)=Planta de remolacha prematura (Etapa 3) -Mature Beetroot Plant=Planta de remolacha madura -A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.=Una planta de remolacha madura es una planta de cultivo que está lista para ser cosechada para una remolacha y algunas semillas de remolacha. No crecerá más. -Beetroot=Remolacha -Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.=Las remolachas se usan como alimento y como colorante. A los cerdos también les gustan las remolachas. -Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.=Sostenlo en tu mano y haz clic derecho para comértelo. Haga clic derecho en un animal para alimentarlo. -Beetroot Soup=Estofado de remolacha -Beetroot soup is a food item.=El estofado de remolacha es un alimento. -Premature Carrot Plant=Planta de zanahoria prematura -Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Las plantas de zanahoria son plantas que crecen en tierras de cultivo bajo la luz solar en 8 etapas, pero solo 4 etapas se pueden distinguir visualmente. En tierras de cultivo hidratadas, crecen un poco más rápido. Se pueden cosechar en cualquier momento, pero solo generarán ganancias cuando maduren. -Premature Carrot Plant (Stage @1)=Planta de zanahoria prematura (Etapa @1) -Mature Carrot Plant=Planta de zanahoria madura -Mature carrot plants are ready to be harvested for carrots. They won't grow any further.=Las plantas de zanahoria maduras están listas para ser cosechadas para zanahorias. No crecerán más. -Carrot=Zanahoria -Carrots can be eaten and planted. Pigs and rabbits like carrots.=Las zanahorias se pueden comer y plantar. A los cerdos y conejos les gustan las zanahorias. -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Sostenlo en tu mano y haz clic derecho para comértelo. Colóquelo encima de las tierras de cultivo para plantar la zanahoria. Crece a la luz del sol y crece más rápido en tierras de cultivo hidratadas. Haga clic derecho en un animal para alimentarlo. -Golden Carrot=Zanahoria dorada -A golden carrot is a precious food item which can be eaten. It is really, really filling!=Una zanahoria dorada es un alimento precioso que se puede comer. ¡Es realmente, realmente abundante! -Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.=Las azadas son herramientas esenciales para el cultivo. Se utilizan para crear tierras de cultivo para plantar semillas en él. Las azadas también se pueden usar como armas muy débiles en caso de apuro. -Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.=Use la azada en un bloque cultivable (al hacer clic derecho) para convertirlo en tierras de cultivo. La tierra, los bloques de hierba y los caminos de hierba son bloques cultivables. Usar una azada en tierra gruesa la convierte en tierra. -Wood Hoe=Azada de madera -Stone Hoe=Azada de piedra -Iron Hoe=Azada de hierro -Golden Hoe=Azada de oro -Diamond Hoe=Azada de diamante -Melon Seeds=Semillas de sandía -Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.=Coloque las semillas de sandía en tierras de cultivo (que se pueden crear con una azada) para plantar un tallo de sandía. Los tallos de sandía crecen a la luz del sol y crecen más rápido en tierras de cultivo hidratadas. Cuando esté maduro, el tallo intentará cultivar un sandía a un lado. Haga clic derecho en un animal para alimentarlo con semillas de sandía. -Melon=Sandía -Grows into a melon stem which in turn grows melons. Chickens like melon seeds.=Crece en un tallo de sandía que a su vez produce melones. A las gallinas les gustan las semillas de sandía. -A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.=Un sandía es un bloque que se puede cultivar a partir de tallos de sandía, que a su vez se cultivan a partir de semillas de sandía. Se puede cosechar para rebanadas de sandía. -Premature Melon Stem=Tallo de sandía prematuro -Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.=Los tallos de sandía crecen en tierras de cultivo en 8 etapas. En tierras de cultivo hidratadas, el crecimiento es un poco más rápido. Los tallos de sandía maduros pueden cultivar melones. -Premature Melon Stem (Stage @1)=Tallo de sandía prematuro (Etapa @1) -Mature Melon Stem=Tallo de sandía maduro -A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.=Un tallo de sandía maduro intenta cultivar un sandía en uno de sus cuatro bloques adyacentes. Un sandía solo puede crecer sobre tierras de cultivo, tierra o un bloque de hierba. Cuando un sandía está al lado de un tallo, el tallo se dobla inmediatamente y se conecta al sandía. Mientras está conectado, un tallo de sandía no puede cultivar otro sandía. Tan pronto como se hayan eliminado todos los melones alrededor del tallo, pierde la conexión y está listo para cultivar otro sandía. -Melon Slice=Rodaja de sandía -This is a food item which can be eaten.=Este es un alimento que se puede comer. -Premature Potato Plant=Planta de patata prematura -Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Las plantas de patata son plantas que crecen en tierras de cultivo bajo la luz solar en 8 etapas, pero solo 4 etapas se pueden distinguir visualmente. En tierras de cultivo hidratadas, crecen un poco más rápido. Se pueden cosechar en cualquier momento, pero solo generarán ganancias cuando maduren. -Premature Potato Plant (Stage @1)=Planta de patata prematura (Etapa @1) -Mature Potato Plant=Planta de patata madura -Mature potato plants are ready to be harvested for potatoes. They won't grow any further.=Las plantas de patatas maduras están listas para ser cosechadas. No crecerán más. -Potato=Patata -Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.=Las patatas son alimentos que se pueden comer, cocinar en el horno y plantar. A los cerdos les gustan las patatas. -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Sostenlo en tu mano y haz clic derecho para comértelo. Colóquelo encima de las tierras de cultivo para plantarlo. Crece a la luz del sol y crece más rápido en tierras de cultivo hidratadas. Haga clic derecho en un animal para alimentarlo. -Baked Potato=Patata cocida -Baked potatoes are food items which are more filling than the unbaked ones.=Las patatas cocidas son alimentos que llenan más que las que no están cocidas. -Poisonous Potato=Patata venenosa -This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.=Esta patata no se ve muy saludable. Puedes comerla para restablecer los puntos de hambre, pero hay un 60% de posibilidades de que te envenene brevemente. -Pumpkin Seeds=Semillas de calabaza -Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds.=Crece en un tallo de calabaza que a su vez produce calabazas. A los pollos les gustan las semillas de calabaza. -Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.=Coloque las semillas de calabaza en tierras de cultivo (que se pueden crear con una azada) para plantar un tallo de calabaza. Los tallos de calabaza crecen a la luz del sol y crecen más rápido en tierras de cultivo hidratadas. Cuando está maduro, el tallo intenta cultivar una calabaza junto a él. Haga clic derecho en un animal para alimentarlo con semillas de calabaza. -Premature Pumpkin Stem=Tallo de calabaza prematuro -Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.=Los tallos de calabaza crecen en tierras de cultivo en 8 etapas. En tierras de cultivo hidratadas, el crecimiento es un poco más rápido. Los tallos de calabaza maduros pueden cultivar calabazas. -Premature Pumpkin Stem (Stage @1)=Tallo de calabaza prematuro (Etapa @1) -Mature Pumpkin Stem=Tallo maduro de calabaza -A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin.=Un tallo maduro de calabaza intenta cultivar una calabaza en uno de sus cuatro bloques adyacentes. Una calabaza solo puede crecer sobre tierras de cultivo, tierra o un bloque de hierba. Cuando una calabaza está al lado de un tallo de calabaza, el tallo de la calabaza se dobla inmediatamente y se conecta a la calabaza. Un tallo de calabaza conectado no puede cultivar otra calabaza. Tan pronto como se hayan eliminado todas las calabazas alrededor del tallo, pierde la conexión y está lista para cultivar otra calabaza. -Faceless Pumpkin=Calabaza sin rostro -A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.=Una calabaza sin rostro es un bloque decorativo. Se puede tallar con tijeras para obtener semillas de calabaza. -Pumpkin=Calabaza -A pumpkin can be worn as a helmet for fun, but it doesn't offer any protection. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.=Una calabaza se puede usar como casco por diversión, pero no ofrece ninguna protección. Las calabazas crecen de tallos de calabaza, que a su vez crecen de semillas de calabaza. -Jack o'Lantern=Calabaza de Halloween -A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.=La calabaza de Halloween es una decoración tradicional de Halloween hecha de una calabaza. Brilla intensamente. -Pumpkin Pie=Tarta de calabaza -A pumpkin pie is a tasty food item which can be eaten.=Un tarta de calabaza es un alimento sabroso que se puede comer. -Farmland=Tierra de cultivo -Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Las tierras de cultivo se utilizan para la agricultura, una superficie necesaria para plantar cultivos. Se crea cuando se usa una azada sobre tierra o un bloque similar. Las plantas pueden crecer en tierras de cultivo, pero lentamente. Las tierras de cultivo se convertirán en tierras de cultivo hidratadas (en las cuales las plantas crecen más rápido) cuando llueve o hay una fuente de agua cerca. Este bloque volverá a convertirse en tierra cuando aparezca un bloque sólido sobre él o un brazo de pistón se extienda sobre él. -Hydrated Farmland=Tierra de cultivo hidratada -Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Las tierras de cultivo hidratadas se usan en la agricultura, aquí es donde puedes plantar y cultivar algunas plantas. Se crea cuando las tierras de cultivo están bajo la lluvia o cerca del agua. Sin agua, este bloque se secará eventualmente. Este bloque volverá a convertirse en tierra cuando aparezca un bloque sólido sobre él o un brazo de pistón se extienda sobre él. -Wheat Seeds=Semillas de trigo -Grows into a wheat plant. Chickens like wheat seeds.=Crece en una planta de trigo. A las gallinas les gustan las semillas de trigo. -Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.=Coloque las semillas de trigo en tierras de cultivo (que se pueden crear con una azada) para plantar una planta de trigo. Crecen a la luz del sol y crecen más rápido en tierras de cultivo hidratadas. Haga clic derecho en un animal para alimentarlo con semillas de trigo. -Premature Wheat Plant=Planta de trigo prematuro -Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.=Las plantas de trigo prematuras crecen en tierras de cultivo bajo la luz solar en 8 etapas. En tierras de cultivo hidratadas, crecen más rápido. Se pueden cosechar en cualquier momento, pero solo generarán ganancias cuando maduren. -Premature Wheat Plant (Stage @1)=Planta de trigo prematuro (Etapa @1) -Mature Wheat Plant=Planta de trigo maduro -Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.=Las plantas maduras de trigo están listas para ser cosechadas, las semillas de trigo no crecerán más. -Wheat=Trigo -Wheat is used in crafting. Some animals like wheat.=El trigo se usa en la elaboración. A algunos animales les gusta el trigo. -Cookie=Galleta -Bread=Pan -Hay Bale=Fardo de heno -Hay bales are decorative blocks made from wheat.=Las balas de heno son bloques decorativos hechos de trigo. -To carve a face into the pumpkin, use the shears on the side you want to carve.=Para tallar una cara en la calabaza, use las tijeras en el lado que desea tallar. -Use the “Place” key on an animal to try to feed it wheat.=Use la tecla "Colocar" en un animal para tratar de alimentarlo con trigo. diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr deleted file mode 100644 index 5ee1bcdfc0..0000000000 --- a/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr +++ /dev/null @@ -1,99 +0,0 @@ -# textdomain: mcl_farming -Beetroot Seeds=Graines de Betterave -Grows into a beetroot plant. Chickens like beetroot seeds.=Pousse en bettrave. Les poulets aiment les graines de betterave -Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.=Placez les graines de betterave sur les terres agricoles (qui peuvent être créées avec une houe) pour planter un plant de betterave. Elles poussent au soleil et poussent plus vite sur les terres agricoles hydratées. Faites un clic droit sur un animal pour le nourrir de graines de betteraves. -Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Les plants de betteraves poussent sur les terres agricoles sous le soleil en 4 étapes. Sur les terres agricoles hydratées, elles poussent un peu plus vite. Elles peuvent être récoltées à tout moment mais ne rapporteront de bénéfices qu'à maturité. -Premature Beetroot Plant=Plant de Betterave Prématurée -Premature Beetroot Plant (Stage 1)=Plant de Betterave Prématurée (Etape 1) -Premature Beetroot Plant (Stage 2)=Plant de Betterave Prématurée (Etape 2) -Premature Beetroot Plant (Stage 3)=Plant de Betterave Prématurée (Etape 3) -Mature Beetroot Plant=Betterave Mature -A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.=Une betterave mature est une plante agricole prête à être récoltée pour une betterave et quelques graines de betterave. Elle ne grandira plus. -Beetroot=Betterave -Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.=Les betteraves sont à la fois utilisées comme aliment et comme ingrédient colorant. Les porcs aiment aussi les betteraves. -Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.=Tenez-le dans votre main et faites un clic droit pour le manger. Faites un clic droit sur un animal pour le nourrir. -Beetroot Soup=Soupe de Betterave -Beetroot soup is a food item.=La soupe de betterave est un aliment. -Premature Carrot Plant=Plant de Carrote Prématurée -Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Les plants de carotte sont des plantes qui poussent sur les terres agricoles sous la lumière du soleil en 8 étapes, mais seulement 4 étapes peuvent être distinguées visuellement. Sur les terres agricoles hydratées, elles poussent un peu plus vite. Ils peuvent être récoltés à tout moment mais ne rapporteront de bénéfices qu'à maturité. -Premature Carrot Plant (Stage @1)=Plant de Carrote Prématurée (Etape 1) -Mature Carrot Plant=Plant de Carotte Mature -Mature carrot plants are ready to be harvested for carrots. They won't grow any further.=Les plants de carottes matures sont prêts à être récoltés pour les carottes. Ils ne grandiront plus. -Carrot=Carrotte -Carrots can be eaten and planted. Pigs and rabbits like carrots.=Les carottes peuvent être mangées et plantées. Les cochons et les lapins comme les carottes. -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Tenez-la dans votre main et faites un clic droit pour le manger. Placez-le au-dessus des terres agricoles pour planter la carotte. Elle pousse au soleil et pousse plus vite sur les terres agricoles hydratées. Faites un clic droit sur un animal pour le nourrir. -Golden Carrot=Carrot Dorée -A golden carrot is a precious food item which can be eaten. It is really, really filling!=Une carotte dorée est un aliment précieux qui peut être mangé. C'est vraiment, vraiment rassasiant! -Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.=Les houes sont des outils essentiels pour faire pousser des cultures. Ils sont utilisés pour créer des terres agricoles afin d'y planter des graines. Les houes peuvent également être utilisées comme armes très faibles à la rigueur. -Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.=Utilisez la houe sur un bloc cultivable (en cliquant dessus avec le bouton droit) pour le transformer en terre agricole. La saleté, les blocs d'herbe et les chemins d'herbe sont des blocs cultivables. L'utilisation d'une houe sur la terre grossière la transforme en terre. -Wood Hoe=Houe en Bois -Stone Hoe=Houe en Pierre -Iron Hoe=Houe en Fer -Golden Hoe=Houe en Or -Diamond Hoe=Houe en Diamant -Melon Seeds=Graine de Pastèque -Grows into a melon stem which in turn grows melons. Chickens like melon seeds.=Se développe en une tige de pastèque qui à son tour forme des pastèques. Les poulets aiment les graines de pastèque. -Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.=Placez les graines de pastèque sur les terres agricoles (qui peuvent être créées avec une houe) pour planter une tige de pastèque. Les tiges de pastèque poussent au soleil et se développent plus rapidement sur les terres agricoles hydratées. À maturité, la tige tentera de faire pousser une pastèque sur le côté. Faites un clic droit sur un animal pour le nourrir de graines de pastèque. -Melon=Pastèque -A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.=Une pastèque est un bloc qui peut être cultivé à partir de tiges de pastèque, qui à leur tour sont cultivées à partir de graines de pastèque. Elle peut être récoltée pour des tranches de pastèque. -Premature Melon Stem=Tige de Pastèque Prématurée -Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.=Les tiges de pastèque poussent sur les terres agricoles en 8 étapes. Sur les terres agricoles hydratées, la croissance est un peu plus rapide. Les tiges de pastèque matures sont capables de faire pousser des pastèques. -Premature Melon Stem (Stage @1)=Tige de Pastèque Prématurée (Etape @1) -Mature Melon Stem=Tige de Pastèque Mature -A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.=Une tige de pastèque mature tente de faire pousser un pastèque sur l'un de ses quatre blocs adjacents. Une pastèque ne peut pousser que sur des terres agricoles, de la terre ou un bloc d'herbe. Lorsqu'une pastèque est à côté d'une tige de pastèque, la tige de pastèque se plie immédiatement et se connecte au melon. Lorsqu'elle est connectée, une tige de pastèque ne peut pas faire pousser une autre pastèque. Dès que tous les pastèques autour de la tige ont été supprimés, elle perd la connexion et est prêt à faire pousser une autre pastèque. -Melon Slice=Tranche de Pastèque -This is a food item which can be eaten.=Il s'agit d'un aliment qui peut être mangé. -Premature Potato Plant=Plant de Pomme de Terre Prématuré -Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Les plants de pommes de terre sont des plants qui poussent sur les terres agricoles sous la lumière du soleil en 8 étapes, mais seulement 4 étapes peuvent être distinguées visuellement. Sur les terres agricoles hydratées, elles poussent un peu plus vite. Ils peuvent être récoltés à tout moment mais ne rapporteront de bénéfices qu'à maturité. -Premature Potato Plant (Stage @1)=Plant de pomme de terre prématuré (Etape @1) -Mature Potato Plant=Plant de Pomme de Terre Mature -Mature potato plants are ready to be harvested for potatoes. They won't grow any further.=Les plants de pommes de terre matures sont prêts à être récoltés pour les pommes de terre. Ils ne grandiront plus. -Potato=Pomme de terre -Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.=Les pommes de terre sont des aliments qui peuvent être consommés, cuits au four et plantés. Des porcs comme des pommes de terre. -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Tenez-le dans votre main et faites un clic droit pour le manger. Placez-le au-dessus des terres agricoles pour le planter. Il pousse au soleil et pousse plus vite sur les terres agricoles hydratées. Faites un clic droit sur un animal pour le nourrir. -Baked Potato=Pomme de Terre au Four -Baked potatoes are food items which are more filling than the unbaked ones.=Les pommes de terre au four sont des aliments qui sont plus copieux que ceux non cuits. -Poisonous Potato=Pomme de Terre Toxique -This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.=Cette pomme de terre n'a pas l'air trop saine. Vous pouvez le manger pour restaurer des points de faim, mais il y a 60% de chances qu'il vous empoisonne brièvement. -Pumpkin Seeds=Graines de Citrouille -Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds.=Pousse dans une tige de citrouille qui à son tour fait pousser des citrouilles. Les poulets aiment des graines de citrouille. -Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.=Placez les graines de citrouille sur les terres agricoles (qui peuvent être créées avec une houe) pour planter une tige de citrouille. Les tiges de citrouille poussent au soleil et poussent plus vite sur les terres agricoles hydratées. À maturité, la tige tente de faire pousser une citrouille à côté d'elle. Faites un clic droit sur un animal pour le nourrir de graines de citrouille. -Premature Pumpkin Stem=Tige de Citrouille Prématurée -Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.=Les tiges de citrouille poussent sur les terres agricoles en 8 étapes. Sur les terres agricoles hydratées, la croissance est un peu plus rapide. Les tiges de citrouille matures peuvent faire pousser des citrouilles. -Premature Pumpkin Stem (Stage @1)=Tige de Citrouille Prématurée (Etape @1) -Mature Pumpkin Stem=Tige de Citrouille Mature -A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin.=Une tige de citrouille mature tente de faire pousser une citrouille dans l'un de ses quatre blocs adjacents. Une citrouille ne peut pousser que sur des terres agricoles, de la terre ou un bloc d'herbe. Lorsqu'une citrouille est à côté d'une tige de citrouille, la tige de citrouille se plie immédiatement et se connecte à la citrouille. Une tige de citrouille connectée ne peut pas faire pousser une autre citrouille. Dès que toutes les citrouilles autour de la tige ont été retirées, elle perd la connexion et est prête à faire pousser une autre citrouille. -Faceless Pumpkin=Citrouille sans visage -A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.=Une citrouille sans visage est un bloc décoratif. Il peut être sculpté avec une cisaille pour obtenir des graines de citrouille. -Pumpkin=Citrouille -A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.=Une citrouille peut être portée comme un casque. Les citrouilles poussent à partir de tiges de citrouille, qui à leur tour poussent à partir de graines de citrouille. -Jack o'Lantern=Citrouille-lanterne -A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.=Une citrouille-lanterne est une décoration traditionnelle d'Halloween à base de citrouille. Il brille de mille feux. -Pumpkin Pie=Tarte à la Citrouille -A pumpkin pie is a tasty food item which can be eaten.=Une tarte à la citrouille est un aliment savoureux qui peut être mangé. -Farmland=Terres Agricoles -Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Les terres agricoles sont utilisées pour l'agriculture, une surface nécessaire pour planter des cultures. Il est créé lorsqu'une houe est utilisée sur de la terre ou un bloc similaire. Les plantes peuvent pousser sur les terres agricoles, mais lentement. Les terres agricoles deviendront des terres agricoles hydratées (sur lesquelles les plantes poussent plus rapidement) lorsqu'il pleut ou lorsqu'une source d'eau est à proximité. Ce bloc redeviendra de la terre lorsqu'un bloc solide apparaît au-dessus ou qu'un bras de piston s'étend au-dessus. -Hydrated Farmland=Terres Agricoles Hydratées -Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Les terres agricoles hydratées sont utilisées dans l'agriculture, c'est là que vous pouvez planter et faire pousser certaines plantes. Il est créé lorsque les terres agricoles sont sous la pluie ou près de l'eau. Sans eau, ce bloc finira par se dessécher. Ce bloc redeviendra de la terre lorsqu'un bloc solide apparaît au-dessus ou qu'un bras de piston s'étend au-dessus. -Wheat Seeds=Graines de blé -Grows into a wheat plant. Chickens like wheat seeds.=Se transforme en blé. Les poulets aiment les graines de blé. -Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.=Placez les graines de blé sur les terres agricoles (qui peuvent être créées avec une houe) pour planter une plante de blé. Ils poussent au soleil et poussent plus vite sur les terres agricoles hydratées. Faites un clic droit sur un animal pour le nourrir de graines de blé. -Premature Wheat Plant=Plant de Blé Prématurée -Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.=Les plants de blé prématurés poussent sur les terres agricoles sous la lumière du soleil en 8 étapes. Sur les terres agricoles hydratées, ils croissent plus rapidement. Ils peuvent être récoltés à tout moment mais ne rapporteront de bénéfices qu'à maturité. -Premature Wheat Plant (Stage @1)=Plant de blé prématurée (Etape @1) -Mature Wheat Plant=Plant de Blé Maturée -Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.=Les plants de blé matures sont prêts à être récoltés pour le blé et les graines de blé. Ils ne grandiront plus. -Wheat=Blé -Wheat is used in crafting. Some animals like wheat.=Le blé est utilisé dans l'artisanat. Certains animaux aiment le blé. -Cookie=Cookie -Bread=Pain -Hay Bale=Balle de Foin -Hay bales are decorative blocks made from wheat.=Les balles de foin sont des blocs décoratifs en blé. -To carve a face into the pumpkin, use the shears on the side you want to carve.=Pour sculpter un visage dans la citrouille, utilisez les cisailles du côté que vous souhaitez sculpter. -Use the “Place” key on an animal to try to feed it wheat.=Utilisez la touche "Placer" sur un animal pour essayer de le nourrir de blé. -Grows on farmland=Pousse sur les terres agricoles -Turns block into farmland=Transforme un bloc en terres agricoles -60% chance of poisoning=60% de chances d'empoisonnement -Surface for crops=Surface pour les cultures -Can become wet=Peut devenir humide -Uses: @1=Utilisations: @1 diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.pl.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.pl.tr deleted file mode 100644 index 3f8d0fc6cc..0000000000 --- a/mods/ITEMS/mcl_farming/locale/mcl_farming.pl.tr +++ /dev/null @@ -1,100 +0,0 @@ - -# textdomain: mcl_farming -Beetroot Seeds=Nasiona buraka -Grows into a beetroot plant. Chickens like beetroot seeds.=Wyrasta w roślinę buraka. Kurczaki lubią nasiona buraka. -Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.=Postaw nasiona buraka na polu uprawnym (możesz zaorać ziemię motyką) aby zasadzić roślinę buraka. Wyrasta ona w słońcu i rośnie szybciej na nawodnionym polu uprawnym. Kliknij prawym przyciskiem na zwierzę, aby je nakarmić nasionami buraka. -Premature Beetroot Plant (Stage 1)=Niedojrzała roślina buraka (etap 1) -Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Rośliny buraka są roślinami rosnącymi na oświetlonym polu uprawnym w czterech etapach. Na nawodnionym polu rosną nieco szybciej. Mogą być zebrane w dowolnym momencie ale będzie to zyskowne tylko jeśli są dojrzałe. -Premature Beetroot Plant=Niedojrzała roślina buraka -Premature Beetroot Plant (Stage 2)=Niedojrzała roślina buraka (etap 2) -Premature Beetroot Plant (Stage 3)=Niedojrzała roślina buraka (etap 3) -Mature Beetroot Plant=Dojrzała roślina buraka -A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.=Dojrzała roślina buraka jest rośliną hodowlaną, która jest gotowa do zebrania w celu uzyskania buraków i nasion. Nie urośnie już więcej. -Beetroot=Burak -Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.=Buraki są używane zarówno jako przedmioty jadalne jak i jako składniki do farb. -Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.=Weź je do ręki i kliknij prawy przycisk myszy by je zjeść. -Beetroot Soup=Zupa z buraków -Beetroot soup is a food item.=Zupa z buraków to przedmiot jadalny. -Premature Carrot Plant=Niedojrzała roślina marchwi -Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Rośliny marchwi są roślinami rosnącymi na polach uprawnych w słońcu w 8 etapach, ale tylko 4 etapy mogą być odróżnione wizualnie. Na nawodnionych polach uprawnych rosną one nieco szybciej. -Premature Carrot Plant (Stage @1)=Niedojrzała roślina marchwi (etap @1) -Mature Carrot Plant=Dojrzała roślina marchwi -Mature carrot plants are ready to be harvested for carrots. They won't grow any further.=Dojrzałe rośliny marchwi są gotowe do zebrania w celu uzyskania marchwi. -Carrot=Marchew -Carrots can be eaten and planted. Pigs and rabbits like carrots.=Marchewki mogą być zjedzone bądź zasadzone. Świnie i króliki lubią marchwie. -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Weź ją do ręki i kliknij prawy przycisk myszy by ją zjeść. Postaw ją na górze pola uprawnego aby ją zasadzić. Rośnie w słońcu i rośnie szybciej na nawodnionym polu. Kliknij prawym przyciskiem na zwierzę aby je nakarmić. -Golden Carrot=Złota marchew -A golden carrot is a precious food item which can be eaten. It is really, really filling!=Złota marchewka to cenny przedmiot jadalny. Jest bardzo, bardzo sycąca! -Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.=Motyki są niezbędnymi narzędziami do uprawiania roślin. Są używane do tworzenia pól uprawnych na których można sadzić nasiona. Motyki mogą być również użyte jako bardzo słabe bronie w razie konieczności. -Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.=Użyj motyki na bloku który można zaorać (klikając go prawym przyciskiem), aby zamienić go w pole uprawne. Ziemia, bloki trawy i ścieżki trawy są blokami, które można zaorać. Korzystanie z motyki na twardej ziemi zamienia ją w ziemię. -Wood Hoe=Drewniana motyka -Stone Hoe=Kamienna motyka -Iron Hoe=Żelazna motyka -Golden Hoe=Złota motyka -Diamond Hoe=Diamentowa motyka -Melon Seeds=Nasiona melona -Grows into a melon stem which in turn grows melons. Chickens like melon seeds.=Wyrasta z nich łodyga melona, z której z kolei wyrastają melony. Kurczaki lubią nasiona melona. -Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.=Umieść nasiona melona na polu uprawnym (ziemię można zaorać motyką), aby zasadzić łodygę melona. Łodygi melona rosną w słońcu i rosną szybciej na nawodnionym polu. Gdy są dojrzałe, łodygi melona będą próbować umieścić melon na boku. Kliknij prawym na zwierzę aby nakarmić je nasionami melona. -Melon=Melon -A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.=Melon jest blokiem, który wyrasta z łodygi melona, która z kolei wyrasta z nasion melona. -Premature Melon Stem=Niedojrzała łodyga melona. -Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.=Łodygi melona rosną na polu uprawnym w 8 etapach. Na nawodnionym polu rosną nieco szybciej. Dojrzałe łodygi melona są w stanie tworzyć melony. -Premature Melon Stem (Stage @1)=Niedojrzała łodyga melona (etap @1) -Mature Melon Stem=Dojrzała łodyga melona -A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.=Dojrzała łodyga melona próbuje stworzyć melona na jednym z czterech sąsiednich bloków. Melon może wyrosnąć tylko na polu uprawnym, ziemi lub bloku trawy. Gdy melon jest obok łodygi melona, łodyga natychmiast się zgina i łączy z melonem. Dopóki jest połączona, nie może z niej wyrosnąć inny melon. Jak tylko wszystkie melony wokół łodygi są usunięte traci ona połączenie i może z niej wyrosnąć następny melon. -Melon Slice=Kawałek melona -This is a food item which can be eaten.=Jest to przedmiot, który można zjeść. -Premature Potato Plant=Niedojrzała roślina ziemniaka -Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Rośliny ziemniaka są roślinami rosnącymi w słońcu w 8 etapach, ale tylko 4 są rozróżnialne wizualnie. Na nawodnionym polu rosną nieco szybciej. Mogą być zebrane w dowolnym momencie, ale jest to zyskowne tylko gdy są dojrzałe. -Premature Potato Plant (Stage @1)=Niedojrzała roślina ziemniaka (Etap @1) -Mature Potato Plant=Dojrzała roślina ziemniaka -Mature potato plants are ready to be harvested for potatoes. They won't grow any further.=Dojrzałe rośliny ziemniaka są gotowe do zebrania. Nie będą już rosnąć. -Potato=Ziemniak -Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.=Ziemniaki to przedmioty, które można zjeść, upiec w piecu i zasadzić. Świnie lubią ziemniaki. -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Weź je do ręki i kliknij prawy by je zjeść. Postaw je na polu uprawnym by je zasadzić. Rosną w słońcu i rosną szybciej na nawodnionym polu. Kliknij prawym na zwierzę by je nakarmić. -Baked Potato=Upieczony ziemniak -Baked potatoes are food items which are more filling than the unbaked ones.=Upieczone ziemniaki są przedmiotami jadalnymi, które są bardziej sycące niż nieupieczone ziemniaki. -Poisonous Potato=Zatruty ziemniak -This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.=Ten ziemniak nie wygląda na zdrowy. Możesz go zjeść aby odzyskać punkty głodu, ale jest 60% szans, że chwilowo cię zatruje. -Pumpkin Seeds=Nasiona dyni -Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds.=Wyrasta z nich łodyga dyni, z której z kolei wyrastają dynie. Kurczaki lubią nasiona dyni. -Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.=Postaw nasiona dyni na polu uprawnym (możesz zaorać ziemię motyką) aby zasadzić łodygę dyni. Łodygi dyni rosną w słońcu i rosną szybciej na nawodnionym polu. Gdy są dojrzałe, próbują one postawić dynię na jednym z sąsiednich pól. -Premature Pumpkin Stem=Niedojrzała łodyga dyni -Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.=Łodygi dyni rosną w 8 etapach. Na nawodnionym polu rośnie nieco szybciej. Z dojrzałych łodyg dyni są w stanie wyrosnąć dynie. -Premature Pumpkin Stem (Stage @1)=Niedojrzała łodyga dyni (etap @1) -Mature Pumpkin Stem=Dojrzała łodyga dyni -A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin.=Dojrzała łodyga dyni próbuje postawić dynię na jednym z czterech sąsiadujących bloków. Dynia może wyrosnąć tylko na polu uprawnym, ziemi lub bloku trawy. Gdy dynia jest obok łodygi dyni, ugina się ona i łączy z dynią. Z połączonej łodygi dyni nie może wyrosnąć kolejna dynia. Jak tylko wszystkie pobliskie dynie są usunięte, traci ona połączenie i może z niej wyrosnąć następna dynia. -Faceless Pumpkin=Dynia bez twarzy -A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.=Dynia bez twarzy jest blokiem dekoracyjnym. Może być pokrojona nożycami aby otrzymać nasiona dyni. -Pumpkin=Dynia -A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.=Dynia może być noszona jak hełm. Dynie rosną z łodygi dyni, która z kolei rośnie z nasion dyni. -Jack o'Lantern=Świecąca dynia -A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.=Świecąca dynia jest tradycyjną dekoracją Halloween wykonaną z dyni, która jasno świeci. -Pumpkin Pie=Ciasto z dyni -A pumpkin pie is a tasty food item which can be eaten.=Ciasto z dyni jest pysznym przedmiotem, który można zjeść. -Farmland=Pole uprawne -Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Pole uprawne jest wykorzystywane do rolnictwa. Jest to niezbędne powierzchnia do sadzenia roślin. Jest tworzona gdy motyka jest użyta na ziemi lub podobnym bloku. Rośliny mogą rosnąć na polu uprawnym, ale powoli. Pola uprawne zamienią się w nawodnione pola uprawne (na których rośliny rosną szybciej) kiedy spadnie deszcz lub źródło wody jest w pobliżu. Ten blok zamieni się w ziemię gdy stały blok pojawi się nad nim, lub ramię tłoku będzie nad nim wysunięte. -Hydrated Farmland=Nawodnione pole uprawne -Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Nawodnione pole uprawne jest używane w rolnictwie, do sadzenia roślin. Jest utworzone gdy na pole uprawne spadnie deszcz lub w pobliżu jest woda. Bez wody blok ten wyschnie po jakimś czasie. Ten blok zamieni się w ziemię gdy stały blok pojawi się nad nim, lub ramię tłoku będzie nad nim wysunięte. -Wheat Seeds=Nasiona zboża -Grows into a wheat plant. Chickens like wheat seeds.=Wyrasta w zboże. Kurczaki lubią nasiona zboża. -Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.=Postaw nasiona zboża na polu uprawnym (możesz zaorać ziemię motyką) aby zasadzić zboże. Wyrasta ono w słońcu i rośnie szybciej na nawodnionym polu uprawnym. Kliknij prawym przyciskiem na zwierzę, aby je nakarmić. -Premature Wheat Plant=Niedojrzałe zboże -Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.=Zboże rośnie w słońcu na polu uprawnym w 8 etapach. Na nawodnionym polu rośnie nieco szybciej. Może być zebrane w dowolnym momencie ale będzie to zyskowne tylko jeśli jest dojrzałe. -Premature Wheat Plant (Stage @1)=Niedojrzałe zboże (etap @1) -Mature Wheat Plant=Dojrzałe zboże -Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.=Dojrzałe zboże jest gotowe by zostać zebrane w celu pozyskania nasion zboża. Nie urośnie ono więcej. -Wheat=Zboże -Wheat is used in crafting. Some animals like wheat.=Zboże jest używane do wytwarzania. Niektóre zwierzęta lubią zboże. -Cookie=Ciastko -Bread=Chleb -Hay Bale=Bela siana -Hay bales are decorative blocks made from wheat.=Bele siana są blokami dekoracyjnymi wytwarzanymi ze zboża. -To carve a face into the pumpkin, use the shears on the side you want to carve.=Aby wyrzeźbić twarz w dyni, użyj nożyc na boku w którym chcesz wyrzeźbić. -Use the “Place” key on an animal to try to feed it wheat.=Użyj przycisku "Umieść" na zwierzęciu, aby spróbować je nakarmić. -Grows on farmland=Rośnie na polu uprawnym -Turns block into farmland=Zamienia blok w pole uprawne -60% chance of poisoning=60% szans na zatrucie -Surface for crops=Podłoże pod uprawy -Can become wet=Może się zmoczyć -Uses: @1=Wykorzystuje: @1 diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.ru.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.ru.tr deleted file mode 100644 index f587fb9436..0000000000 --- a/mods/ITEMS/mcl_farming/locale/mcl_farming.ru.tr +++ /dev/null @@ -1,99 +0,0 @@ -# textdomain: mcl_farming -Beetroot Seeds=Семена свёклы -Grows into a beetroot plant. Chickens like beetroot seeds.=Вырастают на свёкле. Куры обожают свекольные семена. -Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.=Положите семена свёклы на грядку (которую можно создать при помощи мотыги), чтобы посадить свёклу. Они прорастают при солнечном свете и растут быстрее на увлажнённой почке. Кликните правой по животному, чтобы накормить его семенами свёклы. -Premature Beetroot Plant (Stage 1)=Рассада молодой свёклы (стадия 1) -Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Свёкла растёт в 4 стадии на грядках под действием солнечного света. На увлажнённой грядке процесс пойдёт чуть быстрее. Собирать урожай можно на любой стадии, но выгода будет только при сборе созревших экземпляров. -Premature Beetroot Plant=Рассада молодой свёклы -Premature Beetroot Plant (Stage 2)=Рассада молодой свёклы (стадия 2) -Premature Beetroot Plant (Stage 3)=Рассада молодой свёклы (стадия 3) -Mature Beetroot Plant=Созревшая свёкла -A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.=Созревшая свёкла это культивируемое растение, с которого уже можно собирать урожай свёклы и некоторое количество свекольных семян. Дальше расти она уже не будет. -Beetroot=Свёкла -Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.=Свёкла это еда и ингредиент для красителя. Свёклу также очень любят свиньи. -Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.=Чтобы съесть, кликните правой, держа её в руке. Или кликните правой по животному, чтобы покормить его. -Beetroot Soup=Борщ -Beetroot soup is a food item.=Борщ можно есть, он съедобен. -Premature Carrot Plant=Рассада молодой моркови -Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Морковь растёт в 8 стадий на грядках под действием солнечного света, но визуально различить можно только 4 стадии. На увлажнённой грядке рост идёт чуть быстрее. Собирать урожай можно на любой стадии, но выгода будет только при сборе созревших экземпляров. -Premature Carrot Plant (Stage @1)=Рассада молодой моркови (стадия @1) -Mature Carrot Plant=Созревшая морковь -Mature carrot plants are ready to be harvested for carrots. They won't grow any further.=Созревшая морковь готова к сбору. Дальше расти она уже не будет. -Carrot=Морковь -Carrots can be eaten and planted. Pigs and rabbits like carrots.=Морковь можно есть и садить. Свиньи и кролики очень любят морковь. -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Чтобы съесть, кликните правой, держа её в руке. Или поместите её на грядку, чтобы посадить морковь. Она растёт под действием солнечного света, на влажных грядках процесс идёт быстрее. Или кликните правой по животному, чтобы покормить его. -Golden Carrot=Золотая морковь -A golden carrot is a precious food item which can be eaten. It is really, really filling!=Золотая морковь это изысканный продуктовый предмет, которые можно есть. Она отлично, отлично утоляет голод! -Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.=Мотыга это инструмент, необходимый для выращивания урожая. Она используется для создания грядок, на которые потом можно высадить семена. В случае необходимости мотыгу можно использовать и в качестве слабого оружия. -Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.=Примените мотыгу к культивируемому блоку (кликнув правой по нему), чтобы превратить его в грядку. Грязь, травяные блоки и тропинки это культивируемые блоки. Разрыхлив мотыгой грубую грязь, вы получите из её обыкновенную грязь. -Wood Hoe=Деревянная мотыга -Stone Hoe=Каменная мотыга -Iron Hoe=Железная мотыга -Golden Hoe=Золотая мотыга -Diamond Hoe=Алмазная мотыга -Melon Seeds=Семена дыни -Grows into a melon stem which in turn grows melons. Chickens like melon seeds.=Из них вырастают дыневые стебли, из которых, в свою очередь, вырастают дыни. Семена дыни любят куры. -Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.=Положите семена дыни на грядку (которую можно создать при помощи мотыги), чтобы посадить дыню. Дыневые стебли прорастают при солнечном свете, они растут быстрее на увлажнённой почке. На боку вызревшего стебля будет пытаться расти дыня. Кликните правой по животному, чтобы накормить его дыневыми семенами. -Melon=Дыня -A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.=Дыня это блок, который может расти на дыневом стебле, выросшем из семян дыни. -Premature Melon Stem=Созревший дыневый стебель -Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.=Стебель дыни растёт на грядке в 8 стадий. На увлажнённой грядке рост происходит немного быстрее. На созревших стеблях могут расти дыни. -Premature Melon Stem (Stage @1)=Молодой стебель дыни (стадия @1) -Mature Melon Stem=Созревший дыневый стебель -A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.=Зрелый стебель дыни пытается вырастить дыню на одном из четырех соседних блоков. Дыня может расти только на грядках, грязи или на травяном блоке. Когда дыня находится рядом со стеблем, он сразу же изгибается и соединяется с ней. При этом стебель не может выращивать другую дыню. И только когда все дыни вокруг стебля убраны, он будет готов вырастить другую дыню. -Melon Slice=Кусок дыни -This is a food item which can be eaten.=Это продуктовый предмет, его можно есть. -Premature Potato Plant=Молодой картофель -Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Картофель растёт в 8 стадий на грядках под действием солнечного света, но визуально различить можно только 4 стадии. На увлажнённой грядке рост идёт чуть быстрее. Собирать урожай можно на любой стадии, но выгода будет только при сборе созревших экземпляров. -Premature Potato Plant (Stage @1)=Саженец молодого картофеля (стадия @1) -Mature Potato Plant=Созревший картофель -Mature potato plants are ready to be harvested for potatoes. They won't grow any further.=Созревший картофель готов к сбору. Дальше расти он уже не будет. -Potato=Картофель -Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.=Картофель это продуктовый предмет, его можно есть, готовить в печи, а также садить. Картофель любят свиньи. -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Чтобы съесть, кликните правой, держа его в руке. Или поместите его на грядку, чтобы посадить картофель. Он растёт под действием солнечного света, на влажных грядках процесс идёт быстрее. Или кликните правой по животному, чтобы покормить его. -Baked Potato=Печёный картофель -Baked potatoes are food items which are more filling than the unbaked ones.=Печёный картофель это продуктовый предмет, который насыщает лучше, чем сырой картофель. -Poisonous Potato=Ядовитый картофель -This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.=Этот картофель вреден для здоровья. Его можно есть для восстановления очков голода, но с вероятностью 60% он вас ненадолго отравит. -Pumpkin Seeds=Семена тыквы -Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds.=Из них вырастают тыквенный стебель, на котором, в свою очередь, растут тыквы. -Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.=Положите семена тыквы на грядку (которую можно создать при помощи мотыги), чтобы посадить тыкву. Тыквенные стебли прорастают при солнечном свете, они растут быстрее на увлажнённой почке. Когда стебель созреет, то попытается вырастить тыкву рядом с собой. Кликните правой по животному, чтобы накормить его тыквенными семенами. -Premature Pumpkin Stem=Созревший тыквенный стебель -Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.=Стебель тыквы растёт на грядке в 8 стадий. На увлажнённой грядке рост происходит немного быстрее. На созревших стеблях могут расти тыквы. -Premature Pumpkin Stem (Stage @1)=Молодой стебель тыквы (стадия @1) -Mature Pumpkin Stem=Созревший тыквенный стебель -A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin.=Зрелый стебель тыквы пытается вырастить тыкву на одном из четырех соседних блоков. Тыква может расти только на грядках, грязи или на травяном блоке. Когда тыква находится рядом со стеблем, он сразу же изгибается и соединяется с ней. При этом стебель не может выращивать другую тыкву. И только когда все тыквы вокруг стебля убраны, он будет готов вырастить другую тыкву. -Faceless Pumpkin=Безликая тыква -A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.=Безликая тыква это декоративный блок. Его можно разрезать ножницами для получения семян тыквы. -Pumpkin=Тыква -A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.=Тыкву можно носить как шлем. Тыквы растут из тыквенных стеблей, которые растут из семян тыквы. -Jack o'Lantern=Светильник Джека -A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.=Светильник Джека это традиционное украшение на Хеллоуин, изготавливаемое из тыквы. Он ярко светит. -Pumpkin Pie=Тыквенный пирог -A pumpkin pie is a tasty food item which can be eaten.=Тыквенный пирог это вкусный продуктовый предмет, который можно съесть. -Farmland=Грядка -Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Грядка нужна для земледелия, она представляет собой поверхность для высадки культур. Он создается при применении мотыги к грязи и тому подобным блокам. Растения могут расти на грядках, но медленно. Грядки превратятся в увлажнённые грядки, если пойдёт дождь, либо если поблизости есть источник воды. Этот блок превратится обратно в грязь, если поместить на него твёрдый блок, а также под действием поршневого рычага. -Hydrated Farmland=Увлажнённая грядка -Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Увлажнённая грядка нужна для земледелия, на ней вы можете выращивать некоторые растения. Она создается, когда обыкновенная грядка попадает под дождь, либо рядом есть источник воды. Без воды этот блок рано или поздно высохнет. Увлажнённая грядка превратится обратно в грязь, если поместить на неё твёрдый блок, либо она попадёт под действие поршневого рычага. -Wheat Seeds=Семена пшеницы -Grows into a wheat plant. Chickens like wheat seeds.=Вырастают в пшеницу. Семена пшеницы любят куры. -Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.=Положите семена пшеницы на грядку (которую можно создать при помощи мотыги), чтобы посадить пшеницу. Семена растут при солнечном свете, их рост происходит быстрее на увлажнённой почке. Кликните правой по животному, чтобы накормить его семенами пшеницы. -Premature Wheat Plant=Ростки молодой пшеницы -Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.=Молодая пшеница растёт на грядке под действием солнечного света за 8 стадий. На увлажнённой грядке она растёт быстрее. Собирать урожай можно на любой стадии, но выгода будет только при сборе созревших экземпляров. -Premature Wheat Plant (Stage @1)=Ростки молодой пшеницы (стадия @1) -Mature Wheat Plant=Зрелая пшеница -Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.=Зрелая пшеница готова к сбору сена и семян, дальше расти она уже не будет. -Wheat=Пшеница -Wheat is used in crafting. Some animals like wheat.=Пшеницы используется для крафтинга. Некоторые животные любят пшеницу. -Cookie=Печенье -Bread=Хлеб -Hay Bale=Стог сена -Hay bales are decorative blocks made from wheat.=Стог сена - декоративный блок, сделанный из пшеницы. -To carve a face into the pumpkin, use the shears on the side you want to carve.=Чтобы вырезать лицо на тыкве, примените ножницы к выбранной стороне тыквы. -Use the “Place” key on an animal to try to feed it wheat.=Нажмите клавишу “Разместить” на животном, чтобы попытаться покормить его пшеницей. -Grows on farmland=Прорастает(ют) на грядке -Turns block into farmland=Превращает блоки в грядки -60% chance of poisoning=Вероятность отравления: 60% -Surface for crops=Поверхность для культур -Can become wet=Может намокать -Uses: @1=Выдерживает: @1 использований(е,я) diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.zh_TW.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.zh_TW.tr deleted file mode 100644 index 7017f78521..0000000000 --- a/mods/ITEMS/mcl_farming/locale/mcl_farming.zh_TW.tr +++ /dev/null @@ -1,99 +0,0 @@ -# textdomain: mcl_farming -Beetroot Seeds=甜菜種子 -Grows into a beetroot plant. Chickens like beetroot seeds.=長成甜菜根。雞喜歡甜菜種子。 -Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.=將甜菜種子放在農田上(可以用鋤頭創造)種植甜菜。它們在陽光下生長,在有水分的農田上生長更快。右鍵點擊一個動物來餵牠甜菜種子。 -Premature Beetroot Plant (Stage 1)=未熟的甜菜植物(第1階段) -Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=甜菜根植物是在農田裡陽光下生長的植物,分為4個階段。在有水分的農田裡,它們生長得更快一些。它們可以在任何時候被收割,但只有在成熟時才會產生利潤。 -Premature Beetroot Plant=未熟的甜菜 -Premature Beetroot Plant (Stage 2)=未熟的甜菜(第2階段) -Premature Beetroot Plant (Stage 3)=未熟的甜菜(第3階段) -Mature Beetroot Plant=成熟的甜菜 -A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.=成熟的甜菜是一種隨時可以收穫甜菜根和一些甜菜種子的植物。它不會再增長了。 -Beetroot=甜菜根 -Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.=甜菜根既用作食品又用作染料成分。豬也喜歡甜菜根。 -Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.=把它拿在手裡,右鍵點擊以吃掉它。右鍵點擊一個動物來餵牠。 -Beetroot Soup=甜菜根湯 -Beetroot soup is a food item.=甜菜根湯是一種食物。 -Premature Carrot Plant=成長中的胡蘿蔔 -Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=胡蘿蔔是在農田中陽光下生長的植物,分為8個階段,但只有4個階段可以從視覺上區​​分。在水分充足的農田裡,它們生長得更快一些。它們可以在任何時候收割,但只有在成熟時才會有收益。 -Premature Carrot Plant (Stage @1)=成長中的胡蘿蔔(第@1階段) -Mature Carrot Plant=成熟的胡蘿蔔 -Mature carrot plants are ready to be harvested for carrots. They won't grow any further.=成熟的胡蘿蔔是一種隨時可以收穫胡蘿蔔的植物。它不會再增長了。 -Carrot=胡蘿蔔 -Carrots can be eaten and planted. Pigs and rabbits like carrots.=胡蘿蔔既可以吃又可以種植。豬和兔子都喜款胡蘿蔔。 -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=把它拿在手裡,右鍵點擊以吃掉它;把它放置在農田上種植它。在水分充足的農田裡,它們生長得更快一些。右鍵點擊一個動物來餵牠。 -Golden Carrot=金胡蘿蔔 -A golden carrot is a precious food item which can be eaten. It is really, really filling!=金胡蘿蔔是一種可以吃的珍貴食品。它真的非常、非常的有營養! -Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.=鋤頭是種植農作物的基本工具。它們被用來開闢農田,以便在上面種植種子。在緊要關頭,鋤頭也可以作為非常薄弱的​​武器使用。 -Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.=在可耕地塊上使用鋤頭(通過右鍵點擊),將其變成農田。泥土、草塊和草路都是可耕地塊。在粗泥上使用鋤頭可以將其變成泥土。 -Wood Hoe=木鋤 -Stone Hoe=石鋤 -Iron Hoe=鐵鋤 -Golden Hoe=金鋤 -Diamond Hoe=鑽石鋤 -Melon Seeds=西瓜種子 -Grows into a melon stem which in turn grows melons. Chickens like melon seeds.=長成可長出西瓜的瓜莖。雞喜歡西瓜種子。 -Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.=將西瓜種子放在農田上(可以用鋤頭打造)以種植西瓜莖。瓜莖在陽光下生長,在水分充足的農田上生長更快。成熟後,莖會試圖在邊上長出一個西瓜。右鍵點擊動物以餵食西瓜種子。 -Melon=西瓜 -A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.=西瓜是一種方塊,可以從西瓜莖中生長出來,而西瓜莖又是從西瓜種子中生長出來的。它可以收穫西瓜片。 -Premature Melon Stem=成長中的西瓜莖 -Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.=西瓜莖是在農田中陽光下生長的植物,分為8個階段。在水分充足的農田裡,它們生長得更快一些。成熟的西瓜莖能夠長出西瓜。 -Premature Melon Stem (Stage @1)=成長中的西瓜莖(第@1階段) -Mature Melon Stem=成熟的西瓜莖 -A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.=一個成熟的西瓜莖試圖在其四個相鄰的區塊中的一個長出西瓜。西瓜只能在農田、泥土或草塊上面生長。當西瓜挨著西瓜莖時,西瓜莖會立即彎曲並與該西瓜連接。在連接時,瓜莖不能再長出另一個西瓜。一旦西瓜莖周圍的所有西瓜都被移走,它就失去了連接,並準備好長出另一個西瓜。 -Melon Slice=西瓜片 -This is a food item which can be eaten.=這是一種可以吃的食物 -Premature Potato Plant=成長中的馬鈴薯 -Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=馬鈴薯是在農田中陽光下生長的植物,分為8個階段,但只有4個階段可以從視覺上區​​分。在水分充足的農田裡,它們生長得更快一些。它們可以在任何時候收割,但只有在成熟時才會有收益。 -Premature Potato Plant (Stage @1)=成長中的馬鈴薯(第@1階段) -Mature Potato Plant=成熟的馬鈴薯 -Mature potato plants are ready to be harvested for potatoes. They won't grow any further.=成熟的馬鈴薯是一種隨時可以收穫馬鈴薯的植物。它不會再增長了。 -Potato=馬鈴薯 -Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.=馬鈴薯是可以食用、在熔爐中烹調和種植的食品。豬喜歡馬鈴薯。 -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=把它拿在手裡,點擊右鍵就可以吃掉它。把它放在農田上面來種植。它在陽光下生長,在有水分的農田上生長得更快。右鍵點擊一個動物來餵牠。 -Baked Potato=烤馬鈴薯 -Baked potatoes are food items which are more filling than the unbaked ones.=烤馬鈴薯是比未烤過的馬鈴薯更有營養的食物。 -Poisonous Potato=毒馬鈴薯 -This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.=這個馬鈴薯看起來不是很健康。你可以吃它來恢復飢餓值,但有60%的可能性會讓你短暫中毒。 -Pumpkin Seeds=南瓜種子 -Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds.=長成可以長出南瓜的南瓜莖。雞喜歡南瓜種子。 -Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.=將南瓜種子放在農田上(可以用鋤頭打造)以種植南瓜莖。南瓜莖在陽光下生長,在水分充足的農田裡生長得更快。成熟後,莖會試圖在它旁邊長出一個南瓜。右鍵點擊動物以給它餵食南瓜種子。 -Premature Pumpkin Stem=成長中的南瓜莖 -Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.=南瓜莖在農田上的生長分為8個階段,在水分充足的農田裡生長得更快。成熟的南瓜莖能夠長出南瓜。 -Premature Pumpkin Stem (Stage @1)=成長中的南瓜莖(第@1階段) -Mature Pumpkin Stem=成熟的南瓜莖 -A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin.=一個成熟的南瓜莖試圖在其四個相鄰的區塊之一長出一個南瓜。南瓜只能生長在農田、泥土或草塊的上面。當南瓜挨著南瓜莖時,南瓜莖會立即彎曲並連接到該南瓜上。連接的南瓜莖不能再長出另一個南瓜。只要南瓜莖周圍的所有南瓜都被移走,它就失去了連接,可以再長出一個南瓜。 -Faceless Pumpkin=南瓜 -A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.=南瓜是一種裝飾方塊。它可以用剪刀進行雕刻,以獲得南瓜種子。 -Pumpkin=雕刻過的南瓜 -A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.=南瓜可以作為頭盔佩戴。南瓜由南瓜莖生長,而南瓜莖又由南瓜種子生長。 -Jack o'Lantern=南瓜燈 -A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.=南瓜燈是由南瓜製成的傳統萬聖節裝飾。它發出明亮的光芒。 -Pumpkin Pie=南瓜派 -A pumpkin pie is a tasty food item which can be eaten.=南瓜派是可以吃的美味食品。 -Farmland=農田 -Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=農田用於耕作,是種植農作物的必要表面。它是在泥土類方塊上使用鋤頭時形成的。植物能夠在農田上生長,但速度很慢。當下雨或附近有水源時,農田會變成濕潤的耕地(植物在上面生長更快)。當上面出現固體方塊或活塞臂延伸到上面時,這個方塊會變回泥土。 -Hydrated Farmland=濕潤的耕地 -Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=濕潤的耕地用於耕作,這是你可以種植和生長一些植物的地方。它是在農田被雨水沖刷或靠近水的情況下形成的。如果沒有水,這個方塊最終會變乾。當上面出現固體方塊或活塞臂延伸到上面時,這個方塊會變回泥土。 -Wheat Seeds=小麥種子 -Grows into a wheat plant. Chickens like wheat seeds.=長成小麥。雞喜歡小麥種子。 -Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.=將小麥種子放在農田上(可以用鋤頭製造)以種植一株小麥。它們在陽光下生長,在有水的農田裡生長得更快。右鍵點擊一個動物以給它餵食小麥種子。 -Premature Wheat Plant=成長中的小麥 -Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.=小麥是在農田中陽光下生長的植物,分為8個階段。在水分充足的農田裡,它們生長得更快一些。它們可以在任何時候收割,但只有在成熟時才會有收益。 -Premature Wheat Plant (Stage @1)=成長中的小麥(第@1階段) -Mature Wheat Plant=成熟的小麥 -Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.=成熟的小麥是一種隨時可以收穫小麥的植物。它不會再增長了。 -Wheat=小麥 -Wheat is used in crafting. Some animals like wheat.=小麥主要用於合成。有些動物喜歡小麥。 -Cookie=餅乾 -Bread=面包 -Hay Bale=乾草捆 -Hay bales are decorative blocks made from wheat.=乾草捆是用小麥製成的裝飾方塊。 -To carve a face into the pumpkin, use the shears on the side you want to carve.=要在南瓜上雕刻,請將剪刀放在你要雕刻的一側。 -Use the “Place” key on an animal to try to feed it wheat.=在動物身上使用「放置」鍵以嘗試給它餵食小麥。 -Grows on farmland=在農田上生長 -Turns block into farmland=把方塊變成農田 -60% chance of poisoning=有60%的可能性會讓你中毒 -Surface for crops=種植農作物的表面 -Can become wet=可以變溼 -Uses: @1=使用:@1 diff --git a/mods/ITEMS/mcl_farming/locale/template.txt b/mods/ITEMS/mcl_farming/locale/template.txt deleted file mode 100644 index 7359fefa6b..0000000000 --- a/mods/ITEMS/mcl_farming/locale/template.txt +++ /dev/null @@ -1,99 +0,0 @@ -# textdomain: mcl_farming -Beetroot Seeds= -Grows into a beetroot plant. Chickens like beetroot seeds.= -Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.= -Premature Beetroot Plant (Stage 1)= -Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.= -Premature Beetroot Plant= -Premature Beetroot Plant (Stage 2)= -Premature Beetroot Plant (Stage 3)= -Mature Beetroot Plant= -A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.= -Beetroot= -Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.= -Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.= -Beetroot Soup= -Beetroot soup is a food item.= -Premature Carrot Plant= -Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.= -Premature Carrot Plant (Stage @1)= -Mature Carrot Plant= -Mature carrot plants are ready to be harvested for carrots. They won't grow any further.= -Carrot= -Carrots can be eaten and planted. Pigs and rabbits like carrots.= -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.= -Golden Carrot= -A golden carrot is a precious food item which can be eaten. It is really, really filling!= -Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.= -Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.= -Wood Hoe= -Stone Hoe= -Iron Hoe= -Golden Hoe= -Diamond Hoe= -Melon Seeds= -Grows into a melon stem which in turn grows melons. Chickens like melon seeds.= -Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.= -Melon= -A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.= -Premature Melon Stem= -Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.= -Premature Melon Stem (Stage @1)= -Mature Melon Stem= -A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.= -Melon Slice= -This is a food item which can be eaten.= -Premature Potato Plant= -Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.= -Premature Potato Plant (Stage @1)= -Mature Potato Plant= -Mature potato plants are ready to be harvested for potatoes. They won't grow any further.= -Potato= -Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.= -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.= -Baked Potato= -Baked potatoes are food items which are more filling than the unbaked ones.= -Poisonous Potato= -This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.= -Pumpkin Seeds= -Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds.= -Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.= -Premature Pumpkin Stem= -Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.= -Premature Pumpkin Stem (Stage @1)= -Mature Pumpkin Stem= -A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin.= -Faceless Pumpkin= -A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.= -Pumpkin= -A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.= -Jack o'Lantern= -A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.= -Pumpkin Pie= -A pumpkin pie is a tasty food item which can be eaten.= -Farmland= -Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.= -Hydrated Farmland= -Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.= -Wheat Seeds= -Grows into a wheat plant. Chickens like wheat seeds.= -Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.= -Premature Wheat Plant= -Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.= -Premature Wheat Plant (Stage @1)= -Mature Wheat Plant= -Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.= -Wheat= -Wheat is used in crafting. Some animals like wheat.= -Cookie= -Bread= -Hay Bale= -Hay bales are decorative blocks made from wheat.= -To carve a face into the pumpkin, use the shears on the side you want to carve.= -Use the “Place” key on an animal to try to feed it wheat.= -Grows on farmland= -Turns block into farmland= -60% chance of poisoning= -Surface for crops= -Can become wet= -Uses: @1= diff --git a/mods/ITEMS/mcl_farming/melon.lua b/mods/ITEMS/mcl_farming/melon.lua deleted file mode 100644 index 6bbc507ec9..0000000000 --- a/mods/ITEMS/mcl_farming/melon.lua +++ /dev/null @@ -1,162 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - --- Seeds -minetest.register_craftitem("mcl_farming:melon_seeds", { - description = S("Melon Seeds"), - _tt_help = S("Grows on farmland"), - _doc_items_longdesc = S("Grows into a melon stem which in turn grows melons. Chickens like melon seeds."), - _doc_items_usagehelp = S("Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds."), - stack_max = 64, - groups = {craftitem = 1, compostability = 30}, - inventory_image = "mcl_farming_melon_seeds.png", - on_place = function(itemstack, placer, pointed_thing) - return mcl_farming:place_seed(itemstack, placer, pointed_thing, "mcl_farming:melontige_1") - end, -}) - --- Melon template (will be fed into mcl_farming.register_gourd - -local melon_base_def = { - description = S("Melon"), - _doc_items_longdesc = S("A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices."), - stack_max = 64, - tiles = {"farming_melon_top.png", "farming_melon_top.png", "farming_melon_side.png", "farming_melon_side.png", "farming_melon_side.png", "farming_melon_side.png"}, - groups = { - handy = 1, axey = 1, plant = 1, building_block = 1, dig_by_piston = 1, - enderman_takable = 1, compostability = 65 - }, - drop = { - max_items = 1, - items = { - { items = {"mcl_farming:melon_item 7"}, rarity = 14 }, - { items = {"mcl_farming:melon_item 6"}, rarity = 10 }, - { items = {"mcl_farming:melon_item 5"}, rarity = 5 }, - { items = {"mcl_farming:melon_item 4"}, rarity = 2 }, - { items = {"mcl_farming:melon_item 3"} }, - } - }, - sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 1, - _mcl_hardness = 1, - _mcl_silk_touch_drop = true, - _mcl_fortune_drop = { - discrete_uniform_distribution = true, - items = {"mcl_farming:melon_item"}, - min_count = 3, - max_count = 7, - cap = 9, - } -} - --- Drop proabilities for melon stem -local stem_drop = { - max_items = 1, - -- The probabilities are slightly off from the original. - -- Update this drop list when the Minetest drop probability system - -- is more powerful. - items = { - -- 1 seed: Approximation to 20/125 chance - -- 20/125 = 0.16 - -- Approximation: 1/6 = ca. 0.166666666666667 - { items = {"mcl_farming:melon_seeds 1"}, rarity = 6 }, - - -- 2 seeds: Approximation to 4/125 chance - -- 4/125 = 0.032 - -- Approximation: 1/31 = ca. 0.032258064516129 - { items = {"mcl_farming:melon_seeds 2"}, rarity = 31 }, - - -- 3 seeds: 1/125 chance - { items = {"mcl_farming:melon_seeds 3"}, rarity = 125 }, - }, -} - --- Growing unconnected stems - - -local startcolor = { r = 0x2E , g = 0x9D, b = 0x2E } -local endcolor = { r = 0xFF , g = 0xA8, b = 0x00 } - - -for s=1,7 do - local h = s / 8 - local doc = s == 1 - local longdesc, entry_name - if doc then - entry_name = S("Premature Melon Stem") - longdesc = S("Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.") - end - local colorstring = mcl_farming:stem_color(startcolor, endcolor, s, 8) - local texture = "([combine:16x16:0,"..((8-s)*2).."=mcl_farming_melon_stem_disconnected.png)^[colorize:"..colorstring..":127" - minetest.register_node("mcl_farming:melontige_"..s, { - description = S("Premature Melon Stem (Stage @1)", s), - _doc_items_create_entry = doc, - _doc_items_entry_name = entry_name, - _doc_items_longdesc = longdesc, - paramtype = "light", - walkable = false, - drawtype = "plantlike", - sunlight_propagates = true, - drop = stem_drop, - tiles = {texture}, - wield_image = texture, - inventory_image = texture, - selection_box = { - type = "fixed", - fixed = { - {-0.15, -0.5, -0.15, 0.15, -0.5+h, 0.15} - }, - }, - groups = {dig_immediate=3, not_in_creative_inventory=1, plant=1,attached_node=1, dig_by_water=1,destroy_by_lava_flow=1, plant_melon_stem=s}, - sounds = mcl_sounds.node_sound_leaves_defaults(), - _mcl_blast_resistance = 0, - }) -end - --- Full melon stem, able to spawn melons -local stem_def = { - description = S("Mature Melon Stem"), - _doc_items_create_entry = true, - _doc_items_longdesc = S("A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon."), - tiles = {"mcl_farming_melon_stem_disconnected.png^[colorize:#FFA800:127"}, - wield_image = "mcl_farming_melon_stem_disconnected.png^[colorize:#FFA800:127", - inventory_image = "mcl_farming_melon_stem_disconnected.png^[colorize:#FFA800:127", -} - --- Register stem growth -mcl_farming:add_plant("plant_melon_stem", "mcl_farming:melontige_unconnect", {"mcl_farming:melontige_1", "mcl_farming:melontige_2", "mcl_farming:melontige_3", "mcl_farming:melontige_4", "mcl_farming:melontige_5", "mcl_farming:melontige_6", "mcl_farming:melontige_7"}, 30, 5) - --- Register actual melon, connected stems and stem-to-melon growth -mcl_farming:add_gourd("mcl_farming:melontige_unconnect", "mcl_farming:melontige_linked", "mcl_farming:melontige_unconnect", stem_def, stem_drop, "mcl_farming:melon", melon_base_def, 25, 15, "mcl_farming_melon_stem_connected.png^[colorize:#FFA800:127") - --- Items and crafting -minetest.register_craftitem("mcl_farming:melon_item", { - -- Original name: “Melon” - description = S("Melon Slice"), - _doc_items_longdesc = S("This is a food item which can be eaten."), - stack_max = 64, - inventory_image = "farming_melon.png", - on_place = minetest.item_eat(2), - on_secondary_use = minetest.item_eat(2), - groups = {food = 2, eatable = 2, compostability = 50}, - _mcl_saturation = 1.2, -}) - -minetest.register_craft({ - output = "mcl_farming:melon_seeds", - recipe = {{"mcl_farming:melon_item"}} -}) - -minetest.register_craft({ - output = "mcl_farming:melon", - recipe = { - {"mcl_farming:melon_item", "mcl_farming:melon_item", "mcl_farming:melon_item"}, - {"mcl_farming:melon_item", "mcl_farming:melon_item", "mcl_farming:melon_item"}, - {"mcl_farming:melon_item", "mcl_farming:melon_item", "mcl_farming:melon_item"}, - } -}) - -if minetest.get_modpath("doc") then - for i=2,8 do - doc.add_entry_alias("nodes", "mcl_farming:melontige_1", "nodes", "mcl_farming:melontige_"..i) - end -end diff --git a/mods/ITEMS/mcl_farming/mod.conf b/mods/ITEMS/mcl_farming/mod.conf deleted file mode 100644 index fe4bc15640..0000000000 --- a/mods/ITEMS/mcl_farming/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = mcl_farming -depends = mcl_core, mcl_sounds, mcl_wool, mcl_torches, mcl_weather, mobs_mc, mcl_colors, mcl_init -optional_depends = mcl_armor, doc diff --git a/mods/ITEMS/mcl_farming/potatoes.lua b/mods/ITEMS/mcl_farming/potatoes.lua deleted file mode 100644 index 04a971de88..0000000000 --- a/mods/ITEMS/mcl_farming/potatoes.lua +++ /dev/null @@ -1,149 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - --- Premature potato plants - -for i=1, 7 do - local texture, selbox - if i < 3 then - texture = "mcl_farming_potatoes_stage_0.png" - selbox = { -0.5, -0.5, -0.5, 0.5, -5/16, 0.5 } - elseif i < 5 then - texture = "mcl_farming_potatoes_stage_1.png" - selbox = { -0.5, -0.5, -0.5, 0.5, -2/16, 0.5 } - else - texture = "mcl_farming_potatoes_stage_2.png" - selbox = { -0.5, -0.5, -0.5, 0.5, 2/16, 0.5 } - end - - local create, name, longdesc - if i==1 then - create = true - name = S("Premature Potato Plant") - longdesc = S("Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.") - else - create = false - if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_farming:potato_1", "nodes", "mcl_farming:potato_"..i) - end - end - - minetest.register_node("mcl_farming:potato_"..i, { - description = S("Premature Potato Plant (Stage @1)", i), - _doc_items_create_entry = create, - _doc_items_entry_name = name, - _doc_items_longdesc = longdesc, - paramtype = "light", - paramtype2 = "meshoptions", - sunlight_propagates = true, - place_param2 = 3, - walkable = false, - drawtype = "plantlike", - drop = "mcl_farming:potato_item", - tiles = { texture }, - inventory_image = texture, - wield_image = texture, - selection_box = { - type = "fixed", - fixed = { selbox }, - }, - groups = {dig_immediate=3, not_in_creative_inventory=1,plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1}, - sounds = mcl_sounds.node_sound_leaves_defaults(), - _mcl_blast_resistance = 0, - }) -end - --- Mature plant -minetest.register_node("mcl_farming:potato", { - description = S("Mature Potato Plant"), - _doc_items_longdesc = S("Mature potato plants are ready to be harvested for potatoes. They won't grow any further."), - paramtype = "light", - paramtype2 = "meshoptions", - sunlight_propagates = true, - place_param2 = 3, - walkable = false, - drawtype = "plantlike", - tiles = {"mcl_farming_potatoes_stage_3.png"}, - wield_image = "mcl_farming_potatoes_stage_3.png", - inventory_image = "mcl_farming_potatoes_stage_3.png", - drop = { - items = { - { items = {"mcl_farming:potato_item 1"} }, - { items = {"mcl_farming:potato_item 1"}, rarity = 2 }, - { items = {"mcl_farming:potato_item 1"}, rarity = 2 }, - { items = {"mcl_farming:potato_item 1"}, rarity = 2 }, - { items = {"mcl_farming:potato_item_poison 1"}, rarity = 50 } - } - }, - selection_box = { - type = "fixed", - fixed = { - { -0.5, -0.5, -0.5, 0.5, 1/16, 0.5 } - } - }, - groups = {dig_immediate=3, not_in_creative_inventory=1,plant=1,attached_node=1,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1}, - sounds = mcl_sounds.node_sound_leaves_defaults(), - _mcl_blast_resistance = 0, -}) - -minetest.register_craftitem("mcl_farming:potato_item", { - description = S("Potato"), - _tt_help = S("Grows on farmland"), - _doc_items_longdesc = S("Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes."), - _doc_items_usagehelp = S("Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it."), - inventory_image = "farming_potato.png", - groups = {food = 2, eatable = 1, compostability = 65}, - _mcl_saturation = 0.6, - stack_max = 64, - on_secondary_use = minetest.item_eat(1), - on_place = function(itemstack, placer, pointed_thing) - local new = mcl_farming:place_seed(itemstack, placer, pointed_thing, "mcl_farming:potato_1") - if new then - return new - else - return minetest.do_item_eat(1, nil, itemstack, placer, pointed_thing) - end - end, -}) - -minetest.register_craftitem("mcl_farming:potato_item_baked", { - description = S("Baked Potato"), - _doc_items_longdesc = S("Baked potatoes are food items which are more filling than the unbaked ones."), - stack_max = 64, - inventory_image = "farming_potato_baked.png", - on_place = minetest.item_eat(5), - on_secondary_use = minetest.item_eat(5), - groups = {food = 2, eatable = 5, compostability = 85}, - _mcl_saturation = 6.0, -}) - -minetest.register_craftitem("mcl_farming:potato_item_poison", { - description = S("Poisonous Potato"), - _tt_help = minetest.colorize(mcl_colors.YELLOW, S("60% chance of poisoning")), - _doc_items_longdesc = S("This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly."), - stack_max = 64, - inventory_image = "farming_potato_poison.png", - on_place = minetest.item_eat(2), - on_secondary_use = minetest.item_eat(2), - groups = { food = 2, eatable = 2 }, - _mcl_saturation = 1.2, -}) - -minetest.register_craft({ - type = "cooking", - output = "mcl_farming:potato_item_baked", - recipe = "mcl_farming:potato_item", - cooktime = 10, -}) - -mcl_farming:add_plant("plant_potato", "mcl_farming:potato", {"mcl_farming:potato_1", "mcl_farming:potato_2", "mcl_farming:potato_3", "mcl_farming:potato_4", "mcl_farming:potato_5", "mcl_farming:potato_6", "mcl_farming:potato_7"}, 19.75, 20) - -minetest.register_on_item_eat(function (hp_change, replace_with_item, itemstack, user, pointed_thing) - - -- 60% chance of poisoning with poisonous potato - if itemstack:get_name() == "mcl_farming:potato_item_poison" then - if math.random(1,10) >= 6 then - mcl_potions.poison_func(user, 1, 5) - end - end - -end ) diff --git a/mods/ITEMS/mcl_farming/pumpkin.lua b/mods/ITEMS/mcl_farming/pumpkin.lua deleted file mode 100644 index f235baaf38..0000000000 --- a/mods/ITEMS/mcl_farming/pumpkin.lua +++ /dev/null @@ -1,250 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -local mod_screwdriver = minetest.get_modpath("screwdriver") - -local on_rotate -if mod_screwdriver then - on_rotate = screwdriver.rotate_simple -end - --- Seeds -minetest.register_craftitem("mcl_farming:pumpkin_seeds", { - description = S("Pumpkin Seeds"), - _tt_help = S("Grows on farmland"), - _doc_items_longdesc = S("Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds."), - _doc_items_usagehelp = S("Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds."), - stack_max = 64, - inventory_image = "mcl_farming_pumpkin_seeds.png", - groups = {craftitem=1, compostability = 30}, - on_place = function(itemstack, placer, pointed_thing) - return mcl_farming:place_seed(itemstack, placer, pointed_thing, "mcl_farming:pumpkin_1") - end -}) - -local stem_drop = { - max_items = 1, - -- The probabilities are slightly off from the original. - -- Update this drop list when the Minetest drop probability system - -- is more powerful. - items = { - -- 1 seed: Approximation to 20/125 chance - -- 20/125 = 0.16 - -- Approximation: 1/6 = ca. 0.166666666666667 - { items = {"mcl_farming:pumpkin_seeds 1"}, rarity = 6 }, - - -- 2 seeds: Approximation to 4/125 chance - -- 4/125 = 0.032 - -- Approximation: 1/31 = ca. 0.032258064516129 - { items = {"mcl_farming:pumpkin_seeds 2"}, rarity = 31 }, - - -- 3 seeds: 1/125 chance - { items = {"mcl_farming:pumkin_seeds 3"}, rarity = 125 }, - }, -} - --- Unconnected immature stem - -local startcolor = { r = 0x2E , g = 0x9D, b = 0x2E } -local endcolor = { r = 0xFF , g = 0xA8, b = 0x00 } - -for s=1,7 do - local h = s / 8 - local doc = s == 1 - local longdesc, entry_name - if doc then - entry_name = S("Premature Pumpkin Stem") - longdesc = S("Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.") - end - local colorstring = mcl_farming:stem_color(startcolor, endcolor, s, 8) - local texture = "([combine:16x16:0,"..((8-s)*2).."=mcl_farming_pumpkin_stem_disconnected.png)^[colorize:"..colorstring..":127" - minetest.register_node("mcl_farming:pumpkin_"..s, { - description = S("Premature Pumpkin Stem (Stage @1)", s), - _doc_items_entry_name = entry_name, - _doc_items_create_entry = doc, - _doc_items_longdesc = longdesc, - paramtype = "light", - walkable = false, - drawtype = "plantlike", - sunlight_propagates = true, - drop = stem_drop, - tiles = {texture}, - inventory_image = texture, - wield_image = texture, - selection_box = { - type = "fixed", - fixed = { - {-0.15, -0.5, -0.15, 0.15, -0.5+h, 0.15} - }, - }, - groups = {dig_immediate=3, not_in_creative_inventory=1, plant=1,attached_node=1, dig_by_water=1,destroy_by_lava_flow=1,}, - sounds = mcl_sounds.node_sound_leaves_defaults(), - _mcl_blast_resistance = 0, - }) -end - --- Full stem (not connected) -local stem_def = { - description = S("Mature Pumpkin Stem"), - _doc_items_longdesc = S("A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin."), - tiles = {"mcl_farming_pumpkin_stem_disconnected.png^[colorize:#FFA800:127"}, - wield_image = "mcl_farming_pumpkin_stem_disconnected.png^[colorize:#FFA800:127", - inventory_image = "mcl_farming_pumpkin_stem_disconnected.png^[colorize:#FFA800:127", -} - --- Template for pumpkin -local pumpkin_base_def = { - description = S("Faceless Pumpkin"), - _doc_items_longdesc = S("A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds."), - _doc_items_usagehelp = S("To carve a face into the pumpkin, use the shears on the side you want to carve."), - stack_max = 64, - paramtype2 = "facedir", - tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png"}, - groups = { - handy = 1, axey = 1, plant = 1, building_block = 1, dig_by_piston = 1, - enderman_takable = 1, compostability = 65 - }, - sounds = mcl_sounds.node_sound_wood_defaults(), - on_rotate = on_rotate, - _mcl_blast_resistance = 1, - _mcl_hardness = 1, -} - -local pumpkin_face_base_def = table.copy(pumpkin_base_def) -pumpkin_face_base_def.description = S("Pumpkin") -pumpkin_face_base_def._doc_items_longdesc = S("A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.") -pumpkin_face_base_def._doc_items_usagehelp = nil -pumpkin_face_base_def.tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_face.png"} -pumpkin_face_base_def.groups.armor=1 -pumpkin_face_base_def.groups.non_combat_armor=1 -pumpkin_face_base_def.groups.armor_head=1 -pumpkin_face_base_def.groups.non_combat_armor_head=1 -pumpkin_face_base_def._mcl_armor_mob_range_factor = 0 -pumpkin_face_base_def._mcl_armor_mob_range_mob = "mobs_mc:enderman" - -pumpkin_face_base_def._mcl_armor_element = "head" -pumpkin_face_base_def._mcl_armor_texture = "mcl_farming_pumpkin_face.png" - -pumpkin_face_base_def.on_construct = function(pos) - -- Attempt to spawn iron golem or snow golem - mobs_mc.check_iron_golem_summon(pos) - mobs_mc.check_snow_golem_summon(pos) -end - -if minetest.get_modpath("mcl_armor") then - local pumpkin_hud = {} - local function add_pumpkin_hud(player) - pumpkin_hud[player] = { - pumpkin_blur = player:hud_add({ - hud_elem_type = "image", - position = {x = 0.5, y = 0.5}, - scale = {x = -101, y = -101}, - text = "mcl_farming_pumpkin_hud.png", - z_index = -200 - }), - --this is a fake crosshair, because hotbar and crosshair doesn't support z_index - --TODO: remove this and add correct z_index values - fake_crosshair = player:hud_add({ - hud_elem_type = "image", - position = {x = 0.5, y = 0.5}, - scale = {x = 1, y = 1}, - text = "crosshair.png", - z_index = -100 - }) - } - end - local function remove_pumpkin_hud(player) - if pumpkin_hud[player] then - player:hud_remove(pumpkin_hud[player].pumpkin_blur) - player:hud_remove(pumpkin_hud[player].fake_crosshair) - pumpkin_hud[player] = nil - end - end - - pumpkin_face_base_def.on_secondary_use = mcl_armor.equip_on_use - pumpkin_face_base_def._on_equip = add_pumpkin_hud - pumpkin_face_base_def._on_unequip = remove_pumpkin_hud - - minetest.register_on_joinplayer(function(player) - if player:get_inventory():get_stack("armor", 2):get_name() == "mcl_farming:pumpkin_face" then - add_pumpkin_hud(player) - end - end) - minetest.register_on_dieplayer(function(player) - if not minetest.settings:get_bool("mcl_keepInventory") then - remove_pumpkin_hud(player) - end - end) - minetest.register_on_leaveplayer(function(player) - pumpkin_hud[player] = nil - end) -end - --- Register stem growth -mcl_farming:add_plant("plant_pumpkin_stem", "mcl_farming:pumpkintige_unconnect", {"mcl_farming:pumpkin_1", "mcl_farming:pumpkin_2", "mcl_farming:pumpkin_3", "mcl_farming:pumpkin_4", "mcl_farming:pumpkin_5", "mcl_farming:pumpkin_6", "mcl_farming:pumpkin_7"}, 30, 5) - --- Register actual pumpkin, connected stems and stem-to-pumpkin growth -mcl_farming:add_gourd("mcl_farming:pumpkintige_unconnect", "mcl_farming:pumpkintige_linked", "mcl_farming:pumpkintige_unconnect", stem_def, stem_drop, "mcl_farming:pumpkin", pumpkin_base_def, 30, 15, "mcl_farming_pumpkin_stem_connected.png^[colorize:#FFA800:127") - --- Steal function to properly disconnect a carved pumpkin -pumpkin_face_base_def.after_destruct = minetest.registered_nodes["mcl_farming:pumpkin"].after_destruct -minetest.register_node("mcl_farming:pumpkin_face", pumpkin_face_base_def) - --- Jack o'Lantern -minetest.register_node("mcl_farming:pumpkin_face_light", { - description = S("Jack o'Lantern"), - _doc_items_longdesc = S("A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly."), - is_ground_content = false, - stack_max = 64, - paramtype = "light", - paramtype2 = "facedir", - light_source = minetest.LIGHT_MAX, - tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_face_light.png"}, - groups = {handy=1,axey=1, building_block=1, dig_by_piston=1 }, - sounds = mcl_sounds.node_sound_wood_defaults(), - on_construct = function(pos) - -- Attempt to spawn iron golem or snow golem - mobs_mc.check_iron_golem_summon(pos) - mobs_mc.check_snow_golem_summon(pos) - end, - on_rotate = on_rotate, - _mcl_blast_resistance = 1, - _mcl_hardness = 1, -}) - --- Crafting - -minetest.register_craft({ - output = "mcl_farming:pumpkin_face_light", - recipe = {{"mcl_farming:pumpkin_face"}, - {"mcl_torches:torch"}} -}) - -minetest.register_craft({ - output = "mcl_farming:pumpkin_seeds 4", - recipe = {{"mcl_farming:pumpkin"}} -}) - -minetest.register_craftitem("mcl_farming:pumpkin_pie", { - description = S("Pumpkin Pie"), - _doc_items_longdesc = S("A pumpkin pie is a tasty food item which can be eaten."), - stack_max = 64, - inventory_image = "mcl_farming_pumpkin_pie.png", - wield_image = "mcl_farming_pumpkin_pie.png", - on_place = minetest.item_eat(8), - on_secondary_use = minetest.item_eat(8), - groups = {food = 2, eatable = 8, compostability = 100}, - _mcl_saturation = 4.8, -}) - -minetest.register_craft({ - type = "shapeless", - output = "mcl_farming:pumpkin_pie", - recipe = {"mcl_farming:pumpkin", "mcl_core:sugar", "mcl_throwing:egg"}, -}) - - -if minetest.get_modpath("doc") then - for i=2,8 do - doc.add_entry_alias("nodes", "mcl_farming:pumpkin_1", "nodes", "mcl_farming:pumpkin_"..i) - end -end diff --git a/mods/ITEMS/mcl_farming/shared_functions.lua b/mods/ITEMS/mcl_farming/shared_functions.lua deleted file mode 100644 index 7b9784503a..0000000000 --- a/mods/ITEMS/mcl_farming/shared_functions.lua +++ /dev/null @@ -1,477 +0,0 @@ -local math = math -local tostring = tostring - -mcl_farming.plant_lists = {} - -local plant_lists = {} - -local plant_nodename_to_id_list = {} - -local function get_intervals_counter(pos, interval, chance) - local meta = minetest.get_meta(pos) - local time_speed = tonumber(minetest.settings:get("time_speed") or 72) - local current_game_time - if time_speed == nil then - return 1 - end - if (time_speed < 0.1) then - return 1 - end - local time_multiplier = 86400 / time_speed - current_game_time = .0 + ((minetest.get_day_count() + minetest.get_timeofday()) * time_multiplier) - - local approx_interval = math.max(interval, 1) * math.max(chance, 1) - - local last_game_time = meta:get_string("last_gametime") - if last_game_time then - last_game_time = tonumber(last_game_time) - end - if not last_game_time or last_game_time < 1 then - last_game_time = current_game_time - approx_interval / 10 - elseif last_game_time == current_game_time then - current_game_time = current_game_time + approx_interval - end - - local elapsed_game_time = .0 + current_game_time - last_game_time - - meta:set_string("last_gametime", tostring(current_game_time)) - - return elapsed_game_time / approx_interval -end - -local function get_avg_light_level(pos) - local node_light = tonumber(minetest.get_node_light(pos) or 0) - local meta = minetest.get_meta(pos) - local counter = meta:get_int("avg_light_count") - local summary = meta:get_int("avg_light_summary") - if counter > 99 then - counter = 51 - summary = math.ceil((summary + 0.0) / 2.0) - else - counter = counter + 1 - end - summary = summary + node_light - meta:set_int("avg_light_count", counter) - meta:set_int("avg_light_summary", summary) - return math.ceil((summary + 0.0) / counter) -end - -function mcl_farming:add_plant(identifier, full_grown, names, interval, chance) - mcl_farming.plant_lists[identifier] = {} - mcl_farming.plant_lists[identifier].full_grown = full_grown - mcl_farming.plant_lists[identifier].names = names - mcl_farming.plant_lists[identifier].interval = interval - mcl_farming.plant_lists[identifier].chance = chance - plant_lists = mcl_farming.plant_lists --provide local copy of plant lists (performances) - minetest.register_abm({ - label = string.format("Farming plant growth (%s)", identifier), - nodenames = names, - interval = interval, - chance = chance, - action = function(pos, node) - local low_speed = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name ~= "mcl_farming:soil_wet" - mcl_farming:grow_plant(identifier, pos, node, false, false, low_speed) - end, - }) - for _, nodename in pairs(names) do - plant_nodename_to_id_list[nodename] = identifier - end -end - --- Attempts to advance a plant at pos by one or more growth stages (if possible) --- identifier: Identifier of plant as defined by mcl_farming:add_plant --- pos: Position --- node: Node table --- stages: Number of stages to advance (optional, defaults to 1) --- ignore_light: if true, ignore light requirements for growing - --- Returns true if plant has been grown by 1 or more stages. --- Returns false if nothing changed. -function mcl_farming:grow_plant(identifier, pos, node, stages, ignore_light, low_speed) - local average_light_level = get_avg_light_level(pos) - local plant_info = plant_lists[identifier] - local intervals_counter = get_intervals_counter(pos, plant_info.interval, plant_info.chance) - local low_speed = low_speed or false - if low_speed then - if intervals_counter < 1.01 and math.random(0, 9) > 0 then - return - else - intervals_counter = intervals_counter / 10 - end - end - if not minetest.get_node_light(pos) and not ignore_light and intervals_counter < 1.5 then - return false - end - if minetest.get_node_light(pos) < 10 and not ignore_light and intervals_counter < 1.5 then - return false - end - - if intervals_counter >= 1.5 then - if average_light_level < 0.1 then - return false - end - if average_light_level < 10 then - intervals_counter = intervals_counter * average_light_level / 10 - end - end - - local step = nil - - for i, name in ipairs(plant_info.names) do - if name == node.name then - step = i - break - end - end - if step == nil then - return false - end - if not stages then - stages = 1 - end - stages = stages + math.ceil(intervals_counter) - local new_node = {name = plant_info.names[step+stages]} - if new_node.name == nil then - new_node.name = plant_info.full_grown - end - new_node.param = node.param - new_node.param2 = node.param2 - minetest.set_node(pos, new_node) - return true -end - -function mcl_farming:place_seed(itemstack, placer, pointed_thing, plantname) - local pt = pointed_thing - if not pt then - return - end - if pt.type ~= "node" then - return - end - - -- Use pointed node's on_rightclick function first, if present - local node = minetest.get_node(pt.under) - if placer and not placer:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pt.under, node, placer, itemstack) or itemstack - end - end - - local pos = {x=pt.above.x, y=pt.above.y-1, z=pt.above.z} - local farmland = minetest.get_node(pos) - pos= {x=pt.above.x, y=pt.above.y, z=pt.above.z} - local place_s = minetest.get_node(pos) - - if string.find(farmland.name, "mcl_farming:soil") and string.find(place_s.name, "air") then - minetest.sound_play(minetest.registered_nodes[plantname].sounds.place, {pos = pos}, true) - minetest.add_node(pos, {name=plantname, param2 = minetest.registered_nodes[plantname].place_param2}) - --local intervals_counter = get_intervals_counter(pos, 1, 1) - else - return - end - - if not minetest.is_creative_enabled(placer:get_player_name()) then - itemstack:take_item() - end - return itemstack -end - - ---[[ Helper function to create a gourd (e.g. melon, pumpkin), the connected stem nodes as - -- full_unconnected_stem: itemstring of the full-grown but unconnceted stem node. This node must already be done -- connected_stem_basename: prefix of the itemstrings used for the 4 connected stem nodes to create -- stem_itemstring: Desired itemstring of the fully-grown unconnected stem node -- stem_def: Partial node definition of the fully-grown unconnected stem node. Many fields are already defined. You need to add `tiles` and `description` at minimum. Don't define on_construct without good reason -- stem_drop: Drop probability table for all stem -- gourd_itemstring: Desired itemstring of the full gourd node -- gourd_def: (almost) full definition of the gourd node. This function will add on_construct and after_destruct to the definition for unconnecting any connected stems -- grow_interval: Will attempt to grow a gourd periodically at this interval in seconds -- grow_chance: Chance of 1/grow_chance to grow a gourd next to the full unconnected stem after grow_interval has passed. Must be a natural number -- connected_stem_texture: Texture of the connected stem -- gourd_on_construct_extra: Custom on_construct extra function for the gourd. Will be called after the stem check code -]] - -function mcl_farming:add_gourd(full_unconnected_stem, connected_stem_basename, stem_itemstring, stem_def, stem_drop, gourd_itemstring, gourd_def, grow_interval, grow_chance, connected_stem_texture, gourd_on_construct_extra) - - local connected_stem_names = { - connected_stem_basename .. "_r", - connected_stem_basename .. "_l", - connected_stem_basename .. "_t", - connected_stem_basename .. "_b", - } - - local neighbors = { - { x=-1, y=0, z=0 }, - { x=1, y=0, z=0 }, - { x=0, y=0, z=-1 }, - { x=0, y=0, z=1 }, - } - - -- Connect the stem at stempos to the first neighboring gourd block. - -- No-op if not a stem or no gourd block found - local function try_connect_stem(stempos) - local stem = minetest.get_node(stempos) - if stem.name ~= full_unconnected_stem then - return false - end - for n=1, #neighbors do - local offset = neighbors[n] - local blockpos = vector.add(stempos, offset) - local block = minetest.get_node(blockpos) - if block.name == gourd_itemstring then - if offset.x == 1 then - minetest.set_node(stempos, {name=connected_stem_names[1]}) - elseif offset.x == -1 then - minetest.set_node(stempos, {name=connected_stem_names[2]}) - elseif offset.z == 1 then - minetest.set_node(stempos, {name=connected_stem_names[3]}) - elseif offset.z == -1 then - minetest.set_node(stempos, {name=connected_stem_names[4]}) - end - return true - end - end - end - - -- Register gourd - if not gourd_def.after_destruct then - gourd_def.after_destruct = function(blockpos, oldnode) - -- Disconnect any connected stems, turning them back to normal stems - for n=1, #neighbors do - local offset = neighbors[n] - local expected_stem = connected_stem_names[n] - local stempos = vector.add(blockpos, offset) - local stem = minetest.get_node(stempos) - if stem.name == expected_stem then - minetest.add_node(stempos, {name=full_unconnected_stem}) - try_connect_stem(stempos) - end - end - end - end - if not gourd_def.on_construct then - function gourd_def.on_construct(blockpos) - -- Connect all unconnected stems at full size - for n=1, #neighbors do - local stempos = vector.add(blockpos, neighbors[n]) - try_connect_stem(stempos) - end - -- Call custom on_construct - if gourd_on_construct_extra then - gourd_on_construct_extra(blockpos) - end - end - end - minetest.register_node(gourd_itemstring, gourd_def) - - -- Register unconnected stem - - -- Default values for the stem definition - if not stem_def.selection_box then - stem_def.selection_box = { - type = "fixed", - fixed = { - {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15} - }, - } - end - if not stem_def.paramtype then - stem_def.paramtype = "light" - end - if not stem_def.drawtype then - stem_def.drawtype = "plantlike" - end - if stem_def.walkable == nil then - stem_def.walkable = false - end - if stem_def.sunlight_propagates == nil then - stem_def.sunlight_propagates = true - end - if stem_def.drop == nil then - stem_def.drop = stem_drop - end - if stem_def.groups == nil then - stem_def.groups = {dig_immediate=3, not_in_creative_inventory=1, plant=1,attached_node=1, dig_by_water=1,destroy_by_lava_flow=1,} - end - if stem_def.sounds == nil then - stem_def.sounds = mcl_sounds.node_sound_leaves_defaults() - end - - if not stem_def.on_construct then - function stem_def.on_construct(stempos) - -- Connect stem to gourd (if possible) - try_connect_stem(stempos) - end - end - minetest.register_node(stem_itemstring, stem_def) - - -- Register connected stems - - local connected_stem_tiles = { - { "blank.png", --top - "blank.png", -- bottom - "blank.png", -- right - "blank.png", -- left - connected_stem_texture, -- back - connected_stem_texture.."^[transformFX90" --front - }, - { "blank.png", --top - "blank.png", -- bottom - "blank.png", -- right - "blank.png", -- left - connected_stem_texture.."^[transformFX90", --back - connected_stem_texture, -- front - }, - { "blank.png", --top - "blank.png", -- bottom - connected_stem_texture.."^[transformFX90", -- right - connected_stem_texture, -- left - "blank.png", --back - "blank.png", -- front - }, - { "blank.png", --top - "blank.png", -- bottom - connected_stem_texture, -- right - connected_stem_texture.."^[transformFX90", -- left - "blank.png", --back - "blank.png", -- front - } - } - local connected_stem_nodebox = { - {-0.5, -0.5, 0, 0.5, 0.5, 0}, - {-0.5, -0.5, 0, 0.5, 0.5, 0}, - {0, -0.5, -0.5, 0, 0.5, 0.5}, - {0, -0.5, -0.5, 0, 0.5, 0.5}, - } - local connected_stem_selectionbox = { - {-0.1, -0.5, -0.1, 0.5, 0.2, 0.1}, - {-0.5, -0.5, -0.1, 0.1, 0.2, 0.1}, - {-0.1, -0.5, -0.1, 0.1, 0.2, 0.5}, - {-0.1, -0.5, -0.5, 0.1, 0.2, 0.1}, - } - - for i=1, 4 do - minetest.register_node(connected_stem_names[i], { - _doc_items_create_entry = false, - paramtype = "light", - sunlight_propagates = true, - walkable = false, - drop = stem_drop, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = connected_stem_nodebox[i] - }, - selection_box = { - type = "fixed", - fixed = connected_stem_selectionbox[i] - }, - tiles = connected_stem_tiles[i], - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - groups = {dig_immediate=3, not_in_creative_inventory=1, plant=1,attached_node=1, dig_by_water=1,destroy_by_lava_flow=1,}, - sounds = mcl_sounds.node_sound_leaves_defaults(), - _mcl_blast_resistance = 0, - }) - - if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", full_unconnected_stem, "nodes", connected_stem_names[i]) - end - end - - minetest.register_abm({ - label = "Grow gourd stem to gourd ("..full_unconnected_stem.." → "..gourd_itemstring..")", - nodenames = {full_unconnected_stem}, - neighbors = {"air"}, - interval = grow_interval, - chance = grow_chance, - action = function(stempos) - local light = minetest.get_node_light(stempos) - if light and light > 10 then - -- Check the four neighbors and filter out neighbors where gourds can't grow - local neighbors = { - { 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 floorpos, floor - for n=#neighbors, 1, -1 do - local offset = neighbors[n] - local blockpos = vector.add(stempos, offset) - floorpos = { x=blockpos.x, y=blockpos.y-1, z=blockpos.z } - floor = minetest.get_node(floorpos) - local block = minetest.get_node(blockpos) - local soilgroup = minetest.get_item_group(floor.name, "soil") - if not ((minetest.get_item_group(floor.name, "grass_block") == 1 or floor.name=="mcl_core:dirt" or soilgroup == 2 or soilgroup == 3) and block.name == "air") then - table.remove(neighbors, n) - end - end - - -- Gourd needs at least 1 free neighbor to grow - if #neighbors > 0 then - -- From the remaining neighbors, grow randomly - local r = math.random(1, #neighbors) - local offset = neighbors[r] - local blockpos = vector.add(stempos, offset) - local p2 - if offset.x == 1 then - minetest.set_node(stempos, {name=connected_stem_names[1]}) - p2 = 3 - elseif offset.x == -1 then - minetest.set_node(stempos, {name=connected_stem_names[2]}) - p2 = 1 - elseif offset.z == 1 then - minetest.set_node(stempos, {name=connected_stem_names[3]}) - p2 = 2 - elseif offset.z == -1 then - minetest.set_node(stempos, {name=connected_stem_names[4]}) - p2 = 0 - end - -- Place the gourd - if gourd_def.paramtype2 == "facedir" then - minetest.add_node(blockpos, {name=gourd_itemstring, param2=p2}) - else - minetest.add_node(blockpos, {name=gourd_itemstring}) - end - -- Reset farmland, etc. to dirt when the gourd grows on top - if minetest.get_item_group(floor.name, "dirtifies_below_solid") == 1 then - minetest.set_node(floorpos, {name = "mcl_core:dirt"}) - end - end - end - end, - }) -end - --- Used for growing gourd stems. Returns the intermediate color between startcolor and endcolor at a step --- * startcolor: ColorSpec in table form for the stem in its lowest growing stage --- * endcolor: ColorSpec in table form for the stem in its final growing stage --- * step: The nth growth step. Counting starts at 1 --- * step_count: The number of total growth steps -function mcl_farming:stem_color(startcolor, endcolor, step, step_count) - local color = {} - local function get_component(startt, endd, step, step_count) - return math.floor(math.max(0, math.min(255, (startt + (((step-1)/step_count) * endd))))) - end - color.r = get_component(startcolor.r, endcolor.r, step, step_count) - color.g = get_component(startcolor.g, endcolor.g, step, step_count) - color.b = get_component(startcolor.b, endcolor.b, step, step_count) - local colorstring = string.format("#%02X%02X%02X", color.r, color.g, color.b) - return colorstring -end - -minetest.register_lbm({ - label = "Add growth for unloaded farming plants", - name = "mcl_farming:growth", - nodenames = {"group:plant"}, - run_at_every_load = true, - action = function(pos, node) - local identifier = plant_nodename_to_id_list[node.name] - if not identifier then - return - end - local low_speed = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name ~= "mcl_farming:soil_wet" - mcl_farming:grow_plant(identifier, pos, node, false, false, low_speed) - end, -}) diff --git a/mods/ITEMS/mcl_farming/soil.lua b/mods/ITEMS/mcl_farming/soil.lua deleted file mode 100644 index 8b31d888f1..0000000000 --- a/mods/ITEMS/mcl_farming/soil.lua +++ /dev/null @@ -1,126 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -minetest.register_node("mcl_farming:soil", { - tiles = {"mcl_farming_farmland_dry.png", "default_dirt.png"}, - description = S("Farmland"), - _tt_help = S("Surface for crops").."\n"..S("Can become wet"), - _doc_items_longdesc = S("Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it."), - drop = "mcl_core:dirt", - drawtype = "nodebox", - paramtype = "light", - node_box = { - type = "fixed", - fixed = { - -- 15/16 of the normal height - {-0.5, -0.5, -0.5, 0.5, 0.4375, 0.5}, - } - }, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_int("wet", 0) - end, - groups = {handy=1,shovely=1, dirtifies_below_solid=1, dirtifier=1, soil=2, soil_sapling=1, deco_block=1 }, - sounds = mcl_sounds.node_sound_dirt_defaults(), - _mcl_blast_resistance = 0.5, - _mcl_hardness = 0.6, -}) - -minetest.register_node("mcl_farming:soil_wet", { - tiles = {"mcl_farming_farmland_wet.png", "default_dirt.png"}, - description = S("Hydrated Farmland"), - _doc_items_longdesc = S("Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it."), - drop = "mcl_core:dirt", - drawtype = "nodebox", - paramtype = "light", - node_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, 0.4375, 0.5}, - } - }, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_int("wet", 7) - end, - groups = {handy=1,shovely=1, not_in_creative_inventory=1, dirtifies_below_solid=1, dirtifier=1, soil=3, soil_sapling=1 }, - sounds = mcl_sounds.node_sound_dirt_defaults(), - _mcl_blast_resistance = 0.5, - _mcl_hardness = 0.6, -}) - -minetest.register_abm({ - label = "Farmland hydration", - nodenames = {"mcl_farming:soil", "mcl_farming:soil_wet"}, - interval = 15, - chance = 4, - action = function(pos, node) - -- Get wetness value - local meta = minetest.get_meta(pos) - local wet = meta:get_int("wet") - if not wet then - if node.name == "mcl_farming:soil" then - wet = 0 - else - wet = 7 - end - end - - -- Turn back into dirt when covered by solid node - local above_node = minetest.get_node_or_nil({x=pos.x,y=pos.y+1,z=pos.z}) - if above_node then - if minetest.get_item_group(above_node.name, "solid") ~= 0 then - node.name = "mcl_core:dirt" - minetest.set_node(pos, node) - return - end - end - - -- Check an area of 9×2×9 around the node for nodename (9×9 on same level and 9×9 below) - local function check_surroundings(pos, nodename) - local nodes = minetest.find_nodes_in_area({x=pos.x-4,y=pos.y,z=pos.z-4}, {x=pos.x+4,y=pos.y+1,z=pos.z+4}, {nodename}) - return #nodes > 0 - end - - if check_surroundings(pos, "group:water") then - if node.name ~= "mcl_farming:soil_wet" then - -- Make it wet - node.name = "mcl_farming:soil_wet" - minetest.set_node(pos, node) - end - else -- No water nearby. - -- The decay branch (make farmland dry or turn back to dirt) - - -- Don't decay while it's raining - if mcl_weather.rain.raining then - if mcl_weather.is_outdoor(pos) then - return - end - end - -- No decay near unloaded areas since these might include water. - if not check_surroundings(pos, "ignore") then - if wet <= 0 then - --local n_def = minetest.registered_nodes[node.name] or nil - local nn = minetest.get_node_or_nil({x=pos.x,y=pos.y+1,z=pos.z}) - if not nn or not nn.name then - return - end - local nn_def = minetest.registered_nodes[nn.name] or nil - - if nn_def and minetest.get_item_group(nn.name, "plant") == 0 then - node.name = "mcl_core:dirt" - minetest.set_node(pos, node) - return - end - else - if wet == 7 then - node.name = "mcl_farming:soil" - minetest.swap_node(pos, node) - end - -- Slowly count down wetness - meta:set_int("wet", wet-1) - end - end - end - end, -}) - diff --git a/mods/ITEMS/mcl_farming/textures/farming_bread.png b/mods/ITEMS/mcl_farming/textures/farming_bread.png deleted file mode 100644 index 2793fcd14e..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_bread.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_carrot.png b/mods/ITEMS/mcl_farming/textures/farming_carrot.png deleted file mode 100644 index 7c916fce4a..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_carrot.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_carrot_1.png b/mods/ITEMS/mcl_farming/textures/farming_carrot_1.png deleted file mode 100644 index c10faffbc6..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_carrot_1.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_carrot_2.png b/mods/ITEMS/mcl_farming/textures/farming_carrot_2.png deleted file mode 100644 index d4f3bd2921..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_carrot_2.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_carrot_3.png b/mods/ITEMS/mcl_farming/textures/farming_carrot_3.png deleted file mode 100644 index 80089fc3c2..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_carrot_3.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_carrot_4.png b/mods/ITEMS/mcl_farming/textures/farming_carrot_4.png deleted file mode 100644 index d1017eee11..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_carrot_4.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_carrot_gold.png b/mods/ITEMS/mcl_farming/textures/farming_carrot_gold.png deleted file mode 100644 index febaa87ae4..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_carrot_gold.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_cookie.png b/mods/ITEMS/mcl_farming/textures/farming_cookie.png deleted file mode 100644 index 38f8f4b547..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_cookie.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_melon.png b/mods/ITEMS/mcl_farming/textures/farming_melon.png deleted file mode 100644 index cbd9461448..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_melon.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_melon_side.png b/mods/ITEMS/mcl_farming/textures/farming_melon_side.png deleted file mode 100644 index 6630ce52b5..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_melon_side.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_melon_top.png b/mods/ITEMS/mcl_farming/textures/farming_melon_top.png deleted file mode 100644 index 770871c92a..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_melon_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_potato.png b/mods/ITEMS/mcl_farming/textures/farming_potato.png deleted file mode 100644 index 6614adcb2a..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_potato.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_potato_baked.png b/mods/ITEMS/mcl_farming/textures/farming_potato_baked.png deleted file mode 100644 index 9921da97d1..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_potato_baked.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_potato_poison.png b/mods/ITEMS/mcl_farming/textures/farming_potato_poison.png deleted file mode 100644 index 68e8ad153e..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_potato_poison.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_pumpkin_face.png b/mods/ITEMS/mcl_farming/textures/farming_pumpkin_face.png deleted file mode 100644 index 4cc15ddc2f..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_pumpkin_face.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_pumpkin_face_light.png b/mods/ITEMS/mcl_farming/textures/farming_pumpkin_face_light.png deleted file mode 100644 index a47c72e801..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_pumpkin_face_light.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_pumpkin_side.png b/mods/ITEMS/mcl_farming/textures/farming_pumpkin_side.png deleted file mode 100644 index 9ed67ca23b..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_pumpkin_side.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_pumpkin_top.png b/mods/ITEMS/mcl_farming/textures/farming_pumpkin_top.png deleted file mode 100644 index 73d1ef5405..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_pumpkin_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_tool_diamondhoe.png b/mods/ITEMS/mcl_farming/textures/farming_tool_diamondhoe.png deleted file mode 100644 index 0adc102ac2..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_tool_diamondhoe.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_tool_goldhoe.png b/mods/ITEMS/mcl_farming/textures/farming_tool_goldhoe.png deleted file mode 100644 index 2038ca3626..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_tool_goldhoe.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_tool_steelhoe.png b/mods/ITEMS/mcl_farming/textures/farming_tool_steelhoe.png deleted file mode 100644 index e3cc7bc794..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_tool_steelhoe.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_tool_stonehoe.png b/mods/ITEMS/mcl_farming/textures/farming_tool_stonehoe.png deleted file mode 100644 index 49fc89bad1..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_tool_stonehoe.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_tool_woodhoe.png b/mods/ITEMS/mcl_farming/textures/farming_tool_woodhoe.png deleted file mode 100644 index 118f7650fc..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_tool_woodhoe.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/farming_wheat_harvested.png b/mods/ITEMS/mcl_farming/textures/farming_wheat_harvested.png deleted file mode 100644 index 32acfd609f..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/farming_wheat_harvested.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot.png deleted file mode 100644 index 680b727044..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot_0.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot_0.png deleted file mode 100644 index 52dd1dabe7..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot_0.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot_1.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot_1.png deleted file mode 100644 index 6b47963b0d..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot_1.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot_2.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot_2.png deleted file mode 100644 index f2bc171d4d..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot_2.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot_3.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot_3.png deleted file mode 100644 index c3edf28965..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot_3.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot_seeds.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot_seeds.png deleted file mode 100644 index 31670d7ddd..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot_seeds.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot_soup.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot_soup.png deleted file mode 100644 index b82fa6a400..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_beetroot_soup.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_farmland_dry.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_farmland_dry.png deleted file mode 100644 index 4606f6fa33..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_farmland_dry.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_farmland_wet.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_farmland_wet.png deleted file mode 100644 index bad8fb0025..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_farmland_wet.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_hayblock_side.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_hayblock_side.png deleted file mode 100644 index ec51c0d740..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_hayblock_side.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_hayblock_top.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_hayblock_top.png deleted file mode 100644 index 24dd63ef05..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_hayblock_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_melon_seeds.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_melon_seeds.png deleted file mode 100644 index 66025d253f..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_melon_seeds.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_melon_stem_connected.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_melon_stem_connected.png deleted file mode 100644 index c71ebc4eff..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_melon_stem_connected.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_melon_stem_disconnected.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_melon_stem_disconnected.png deleted file mode 100644 index e48e1367fb..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_melon_stem_disconnected.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_potatoes_stage_0.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_potatoes_stage_0.png deleted file mode 100644 index 8f021b1ec3..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_potatoes_stage_0.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_potatoes_stage_1.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_potatoes_stage_1.png deleted file mode 100644 index 8d4d1abcaa..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_potatoes_stage_1.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_potatoes_stage_2.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_potatoes_stage_2.png deleted file mode 100644 index 828ff7d918..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_potatoes_stage_2.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_potatoes_stage_3.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_potatoes_stage_3.png deleted file mode 100644 index 6352485309..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_potatoes_stage_3.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_face.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_face.png deleted file mode 100644 index 095b90cc67..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_face.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_hud.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_hud.png deleted file mode 100644 index 48f47253b9..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_hud.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_pie.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_pie.png deleted file mode 100644 index f366baabb0..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_pie.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_seeds.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_seeds.png deleted file mode 100644 index 52c239c7f5..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_seeds.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_stem_connected.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_stem_connected.png deleted file mode 100644 index c71ebc4eff..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_stem_connected.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_stem_disconnected.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_stem_disconnected.png deleted file mode 100644 index 2de1ce4f7b..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_stem_disconnected.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_seeds.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_seeds.png deleted file mode 100644 index dcd6901a86..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_seeds.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_0.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_0.png deleted file mode 100644 index 67114bdae0..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_0.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_1.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_1.png deleted file mode 100644 index 448f047e44..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_1.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_2.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_2.png deleted file mode 100644 index 3788a40dab..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_2.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_3.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_3.png deleted file mode 100644 index 889a56d630..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_3.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_4.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_4.png deleted file mode 100644 index 91bdd2b329..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_4.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_5.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_5.png deleted file mode 100644 index fb54936140..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_5.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_6.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_6.png deleted file mode 100644 index 6b2b230786..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_6.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_7.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_7.png deleted file mode 100644 index 83d2592748..0000000000 Binary files a/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_stage_7.png and /dev/null differ diff --git a/mods/ITEMS/mcl_farming/wheat.lua b/mods/ITEMS/mcl_farming/wheat.lua deleted file mode 100644 index a254ed36c6..0000000000 --- a/mods/ITEMS/mcl_farming/wheat.lua +++ /dev/null @@ -1,190 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -minetest.register_craftitem("mcl_farming:wheat_seeds", { - -- Original Minecraft name: “Seeds” - description = S("Wheat Seeds"), - _tt_help = S("Grows on farmland"), - _doc_items_longdesc = S("Grows into a wheat plant. Chickens like wheat seeds."), - _doc_items_usagehelp = S([[ - Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. - They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds. - ]]), - groups = {craftitem = 1, compostability = 30}, - inventory_image = "mcl_farming_wheat_seeds.png", - on_place = function(itemstack, placer, pointed_thing) - return mcl_farming:place_seed(itemstack, placer, pointed_thing, "mcl_farming:wheat_1") - end -}) - -local sel_heights = { - -5/16, - -2/16, - 0, - 3/16, - 5/16, - 6/16, - 7/16, -} - -for i=1,7 do - local create, name, longdesc - if i == 1 then - create = true - name = S("Premature Wheat Plant") - longdesc = S([[ - Premature wheat plants grow on farmland under sunlight in 8 stages. - On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature. - ]]) - else - create = false - end - - minetest.register_node("mcl_farming:wheat_"..i, { - description = S("Premature Wheat Plant (Stage @1)", i), - _doc_items_create_entry = create, - _doc_items_entry_name = name, - _doc_items_longdesc = longdesc, - paramtype = "light", - paramtype2 = "meshoptions", - place_param2 = 3, - sunlight_propagates = true, - walkable = false, - drawtype = "plantlike", - drop = "mcl_farming:wheat_seeds", - tiles = {"mcl_farming_wheat_stage_"..(i-1)..".png"}, - inventory_image = "mcl_farming_wheat_stage_"..(i-1)..".png", - wield_image = "mcl_farming_wheat_stage_"..(i-1)..".png", - selection_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, sel_heights[i], 0.5} - }, - }, - groups = {dig_immediate=3, not_in_creative_inventory=1, plant=1,attached_node=1, - dig_by_water=1,destroy_by_lava_flow=1, dig_by_piston=1}, - sounds = mcl_sounds.node_sound_leaves_defaults(), - _mcl_blast_resistance = 0, - }) -end - -minetest.register_node("mcl_farming:wheat", { - description = S("Mature Wheat Plant"), - _doc_items_longdesc = S([[ - Mature wheat plants are ready to be harvested for wheat and wheat seeds. - They won't grow any further. - ]]), - sunlight_propagates = true, - paramtype = "light", - paramtype2 = "meshoptions", - place_param2 = 3, - walkable = false, - drawtype = "plantlike", - tiles = {"mcl_farming_wheat_stage_7.png"}, - inventory_image = "mcl_farming_wheat_stage_7.png", - wield_image = "mcl_farming_wheat_stage_7.png", - drop = { - max_items = 4, - items = { - { items = {"mcl_farming:wheat_seeds"} }, - { items = {"mcl_farming:wheat_seeds"}, rarity = 2}, - { items = {"mcl_farming:wheat_seeds"}, rarity = 5}, - { items = {"mcl_farming:wheat_item"} } - } - }, - groups = {dig_immediate=3, not_in_creative_inventory=1, plant=1, attached_node=1, - dig_by_water=1,destroy_by_lava_flow=1, dig_by_piston=1}, - sounds = mcl_sounds.node_sound_leaves_defaults(), - _mcl_blast_resistance = 0, -}) - -mcl_farming:add_plant("plant_wheat", "mcl_farming:wheat", {"mcl_farming:wheat_1", "mcl_farming:wheat_2", "mcl_farming:wheat_3", "mcl_farming:wheat_4", "mcl_farming:wheat_5", "mcl_farming:wheat_6", "mcl_farming:wheat_7"}, 25, 20) - -minetest.register_craftitem("mcl_farming:wheat_item", { - description = S("Wheat"), - _doc_items_longdesc = S("Wheat is used in crafting. Some animals like wheat."), - _doc_items_usagehelp = S("Use the “Place” key on an animal to try to feed it wheat."), - inventory_image = "farming_wheat_harvested.png", - groups = {craftitem = 1, compostability = 65}, -}) - -minetest.register_craft({ - output = "mcl_farming:bread", - recipe = { - {"mcl_farming:wheat_item", "mcl_farming:wheat_item", "mcl_farming:wheat_item"}, - } -}) - -minetest.register_craft({ - output = "mcl_farming:cookie 8", - recipe = { - {"mcl_farming:wheat_item", "mcl_dye:brown", "mcl_farming:wheat_item"}, - } -}) - -minetest.register_craftitem("mcl_farming:cookie", { - description = S("Cookie"), - _doc_items_longdesc = S("This is a food item which can be eaten."), - inventory_image = "farming_cookie.png", - groups = {food = 2, eatable = 2, compostability = 85}, - _mcl_saturation = 0.4, - on_place = minetest.item_eat(2), - on_secondary_use = minetest.item_eat(2), -}) - - -minetest.register_craftitem("mcl_farming:bread", { - description = S("Bread"), - _doc_items_longdesc = S("This is a food item which can be eaten."), - inventory_image = "farming_bread.png", - groups = {food = 2, eatable = 5, compostability = 85}, - _mcl_saturation = 6.0, - on_place = minetest.item_eat(5), - on_secondary_use = minetest.item_eat(5), -}) - -local mod_screwdriver = minetest.get_modpath("screwdriver") -local on_rotate -if mod_screwdriver then - on_rotate = screwdriver.rotate_3way -end - -minetest.register_node("mcl_farming:hay_block", { - description = S("Hay Bale"), - _doc_items_longdesc = S("Hay bales are decorative blocks made from wheat."), - tiles = {"mcl_farming_hayblock_top.png", "mcl_farming_hayblock_top.png", "mcl_farming_hayblock_side.png"}, - is_ground_content = false, - stack_max = 64, - paramtype2 = "facedir", - on_place = mcl_util.rotate_axis, - groups = { - handy = 1, hoey = 1, building_block = 1, fall_damage_add_percent = -80, - flammable = 2, fire_encouragement = 60, fire_flammability = 20, - compostability = 85 - }, - sounds = mcl_sounds.node_sound_leaves_defaults(), - on_rotate = on_rotate, - _mcl_blast_resistance = 0.5, - _mcl_hardness = 0.5, -}) - -minetest.register_craft({ - output = "mcl_farming:hay_block", - recipe = { - {"mcl_farming:wheat_item", "mcl_farming:wheat_item", "mcl_farming:wheat_item"}, - {"mcl_farming:wheat_item", "mcl_farming:wheat_item", "mcl_farming:wheat_item"}, - {"mcl_farming:wheat_item", "mcl_farming:wheat_item", "mcl_farming:wheat_item"}, - } -}) - -minetest.register_craft({ - output = "mcl_farming:wheat_item 9", - recipe = { - {"mcl_farming:hay_block"}, - } -}) - -if minetest.get_modpath("doc") then - for i=2,7 do - doc.add_entry_alias("nodes", "mcl_farming:wheat_1", "nodes", "mcl_farming:wheat_"..i) - end -end diff --git a/mods/ITEMS/mcl_flowerpots/credits.txt b/mods/ITEMS/mcl_flowerpots/credits.txt deleted file mode 100644 index 88393eaaca..0000000000 --- a/mods/ITEMS/mcl_flowerpots/credits.txt +++ /dev/null @@ -1,5 +0,0 @@ -All models are made by tobyplowy(aka toby109tt) and code is by D00med and tobyplowy (aka toby109tt), modified by Wuzzy. -Textures come from the Faithful 1.11 Minecraft resource pack (by Vattic, xMrVizzy and many others). -The cactus flower pot textures were manually created by Wuzzy, based on Faithful 1.11. - -Please give credit if used! diff --git a/mods/ITEMS/mcl_flowerpots/init.lua b/mods/ITEMS/mcl_flowerpots/init.lua deleted file mode 100644 index 578553b312..0000000000 --- a/mods/ITEMS/mcl_flowerpots/init.lua +++ /dev/null @@ -1,216 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) -local has_doc = minetest.get_modpath("doc") - -mcl_flowerpots = {} -mcl_flowerpots.registered_pots = {} - -minetest.register_node("mcl_flowerpots:flower_pot", { - description = S("Flower Pot"), - _tt_help = S("Can hold a small flower or plant"), - _doc_items_longdesc = S("Flower pots are decorative blocks in which flowers and other small plants can be placed."), - _doc_items_usagehelp = S("Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant."), - drawtype = "mesh", - mesh = "flowerpot.obj", - tiles = { - "mcl_flowerpots_flowerpot.png", - }, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - visual_scale = 0.5, - wield_image = "mcl_flowerpots_flowerpot_inventory.png", - wield_scale = {x=1.0, y=1.0, z=1.0}, - paramtype = "light", - sunlight_propagates = true, - selection_box = { - type = "fixed", - fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} - }, - collision_box = { - type = "fixed", - fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} - }, - is_ground_content = false, - inventory_image = "mcl_flowerpots_flowerpot_inventory.png", - groups = {dig_immediate=3, deco_block=1, attached_node=1, dig_by_piston=1, flower_pot=1}, - sounds = mcl_sounds.node_sound_stone_defaults(), - on_rightclick = function(pos, node, clicker, itemstack) - local name = clicker:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return - end - local item = clicker:get_wielded_item():get_name() - if mcl_flowerpots.registered_pots[item] then - minetest.swap_node(pos, {name="mcl_flowerpots:flower_pot_"..mcl_flowerpots.registered_pots[item]}) - if not minetest.is_creative_enabled(clicker:get_player_name()) then - itemstack:take_item() - end - end - end, -}) - -minetest.register_craft({ - output = "mcl_flowerpots:flower_pot", - recipe = { - {"mcl_core:brick", "", "mcl_core:brick"}, - {"", "mcl_core:brick", ""}, - {"", "", ""}, - } -}) - -function mcl_flowerpots.register_potted_flower(name, def) - mcl_flowerpots.registered_pots[name] = def.name - minetest.register_node(":mcl_flowerpots:flower_pot_"..def.name, { - description = def.desc.." "..S("Flower Pot"), - _doc_items_create_entry = false, - drawtype = "mesh", - mesh = "flowerpot.obj", - tiles = { - "[combine:32x32:0,0=mcl_flowerpots_flowerpot.png:0,0="..def.image, - }, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - visual_scale = 0.5, - wield_scale = {x=1.0, y=1.0, z=1.0}, - paramtype = "light", - sunlight_propagates = true, - selection_box = { - type = "fixed", - fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} - }, - collision_box = { - type = "fixed", - fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} - }, - is_ground_content = false, - groups = {dig_immediate=3, attached_node=1, dig_by_piston=1, not_in_creative_inventory=1, flower_pot=2}, - sounds = mcl_sounds.node_sound_stone_defaults(), - on_rightclick = function(pos, item, clicker) - local player_name = clicker:get_player_name() - if minetest.is_protected(pos, player_name) then - minetest.record_protection_violation(pos, player_name) - return - end - minetest.add_item({x=pos.x, y=pos.y+0.5, z=pos.z}, name) - minetest.set_node(pos, {name="mcl_flowerpots:flower_pot"}) - end, - drop = { - items = { - { items = { "mcl_flowerpots:flower_pot", name } } - } - }, - }) - -- Add entry alias for the Help - if has_doc then - doc.add_entry_alias("nodes", "mcl_flowerpots:flower_pot", "nodes", "mcl_flowerpots:flower_pot_"..name) - end -end - -function mcl_flowerpots.register_potted_cube(name, def) - mcl_flowerpots.registered_pots[name] = def.name - minetest.register_node(":mcl_flowerpots:flower_pot_"..def.name, { - description = def.desc.." "..S("Flower Pot"), - _doc_items_create_entry = false, - drawtype = "mesh", - mesh = "flowerpot_with_long_cube.obj", - tiles = { - def.image, - }, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - visual_scale = 0.5, - wield_scale = {x=1.0, y=1.0, z=1.0}, - paramtype = "light", - sunlight_propagates = true, - selection_box = { - type = "fixed", - fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} - }, - collision_box = { - type = "fixed", - fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} - }, - is_ground_content = false, - groups = {dig_immediate=3, attached_node=1, dig_by_piston=1, not_in_creative_inventory=1, flower_pot=2}, - sounds = mcl_sounds.node_sound_stone_defaults(), - on_rightclick = function(pos, item, clicker) - local player_name = "" - if clicker:is_player() then - player_name = clicker:get_player_name() - end - if minetest.is_protected(pos, player_name) then - minetest.record_protection_violation(pos, player_name) - return - end - minetest.add_item({x=pos.x, y=pos.y+0.5, z=pos.z}, name) - minetest.set_node(pos, {name="mcl_flowerpots:flower_pot"}) - end, - drop = { - items = { - { items = { "mcl_flowerpots:flower_pot", name } } - } - }, - }) - -- Add entry alias for the Help - if has_doc then - doc.add_entry_alias("nodes", "mcl_flowerpots:flower_pot", "nodes", "mcl_flowerpots:flower_pot_"..def.name) - end -end - ---forced because hard dependency to mcl_core -mcl_flowerpots.register_potted_cube("mcl_core:cactus", { - name = "cactus", - desc = S("Cactus"), - image = "mcl_flowerpots_cactus.png", -}) - -mcl_flowerpots.register_potted_flower("mcl_mushrooms:mushroom_brown", { - name = "mushroom_brown", - desc = S("Brown Mushroom"), - image = "farming_mushroom_brown.png", -}) - -mcl_flowerpots.register_potted_flower("mcl_mushrooms:mushroom_red", { - name = "mushroom_red", - desc = S("Red Mushroom"), - image = "farming_mushroom_red.png", -}) - -mcl_flowerpots.register_potted_flower("mcl_core:sapling", { - name = "sapling", - desc = S("Oak Sapling"), - image = "default_sapling.png", -}) - -mcl_flowerpots.register_potted_flower("mcl_core:acaciasapling", { - name = "acaciasapling", - desc = S("Acacia Sapling"), - image = "default_acacia_sapling.png", -}) - -mcl_flowerpots.register_potted_flower("mcl_core:junglesapling", { - name = "junglesapling", - desc = S("Jungle Sapling"), - image = "default_junglesapling.png", -}) - -mcl_flowerpots.register_potted_flower("mcl_core:darksapling", { - name = "darksapling", - desc = S("Dark Oak Sapling"), - image = "mcl_core_sapling_big_oak.png", -}) - -mcl_flowerpots.register_potted_flower("mcl_core:sprucesapling", { - name = "sprucesapling", - desc = S("Spruce Sapling"), - image = "mcl_core_sapling_spruce.png", -}) - -mcl_flowerpots.register_potted_flower("mcl_core:birchsapling", { - name = "birchsapling", - desc = S("Birch Sapling"), - image = "mcl_core_sapling_birch.png", -}) - -mcl_flowerpots.register_potted_flower("mcl_core:deadbush", { - name = "deadbush", - desc = S("Dead Bush"), - image = "default_dry_shrub.png", -}) diff --git a/mods/ITEMS/mcl_flowerpots/license.txt b/mods/ITEMS/mcl_flowerpots/license.txt deleted file mode 100644 index cd80afbab5..0000000000 --- a/mods/ITEMS/mcl_flowerpots/license.txt +++ /dev/null @@ -1,30 +0,0 @@ -License for code ----------------- -Copyright (C) 2017 D00Med and toby109tt(aka tobyplowy) - -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. - -License for models ---------------------------------------- -All models are made by tobyplowy (aka toby109tt). - -Licenes: CC BY-SA 3.0 Unported - -License for textures ---------------------------------------- -Textures come from the Faithful 1.11 Minecraft resource pack (by Vattic, xMrVizzy and many others). -The cactus flower pot textures were partially created by Wuzzy, based on Faithful 1.11. - -License: MIT License diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr deleted file mode 100644 index a110d5ffc5..0000000000 --- a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr +++ /dev/null @@ -1,26 +0,0 @@ -# textdomain: mcl_flowerpots -Dandelion Flower Pot=Blumentopf mit Löwenzahn -Poppy Flower Pot=Blumentopf mit Mohn -Blue Orchid Flower Pot=Blumentopf mit blauer Orchidee -Allium Flower Pot=Blumentopf mit Sternlauch -Azure Bluet Flower Pot=Blumentopf mit Porzellansternchen -Red Tulip Flower Pot=Blumentopf mit roter Tulpe -Pink Tulip Flower Pot=Blumentopf mit rosa Tulpe -White Tulip Flower Pot=Blumentopf mit weißer Tulpe -Orange Tulip Flower Pot=Blumentopf mit orange Tulpe -Oxeye Daisy Flower Pot=Bluemtopf mit Margerite -Brown Mushroom Flower Pot=Blumentopf mit braunem Pilz -Red Mushroom Flower Pot=Blumentopf mit rotem Pilz -Oak Sapling Flower Pot=Blumentopf mit Eichensetzling -Acacia Sapling Flower Pot=Blumentopf mit Akaziensetzling -Jungle Sapling Flower Pot=Blumentopf mit Dschungelsetzling -Dark Oak Sapling Flower Pot=Blumentopf mit Schwarzeichensetzling -Spruce Sapling Flower Pot=Blumentopf mit Fichtensetzling -Birch Sapling Flower Pot=Blumentopf mit Birkensetzling -Dead Bush Flower Pot=Blumentopf mit totem Busch -Fern Flower Pot=Blumentopf mit Farn -Cactus Flower Pot=Blumentopf mit Kaktus -Flower Pot=Blumentopf -Flower pots are decorative blocks in which flowers and other small plants can be placed.=Blumentöpfe sind dekorative Blöcke, in die Blumen und andere kleine Pflanzen platziert werden können. -Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Platzieren Sie einfach eine Pflanze auf den Blumentopf. Blumentöpfe können kleine Blumen (nicht höher als 1 Block), Setzlinge, Farne, tote Büsche, Pilze und Kakteen halten. Rechtsklicken Sie auf eine Topfpflanze, um sie zurück zu erhalten. -Can hold a small flower or plant=Hält eine kleine Blume oder Pflanze diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.es.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.es.tr deleted file mode 100644 index fd12b1b4f5..0000000000 --- a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.es.tr +++ /dev/null @@ -1,25 +0,0 @@ -# textdomain: mcl_flowerpots -Dandelion Flower Pot=Maceta con diente de león -Poppy Flower Pot=Maceta con amapola -Blue Orchid Flower Pot=Maceta con orquídeas azules -Allium Flower Pot=Maceta con puerro -Azure Bluet Flower Pot=Maceta con flor azul celeste -Red Tulip Flower Pot=Maceta con tulipán rojo -Pink Tulip Flower Pot=Maceta con tulipán rosa -White Tulip Flower Pot=Maceta con tulipán blanco -Orange Tulip Flower Pot=Maceta con tulipán naranja -Oxeye Daisy Flower Pot=Maceta con margarita -Brown Mushroom Flower Pot=Maceta con seta marrón -Red Mushroom Flower Pot=Maceta con seta roja -Oak Sapling Flower Pot=Maceta con roble joven -Acacia Sapling Flower Pot=Maceta con acacia -Jungle Sapling Flower Pot=Maceta con la jungla -Dark Oak Sapling Flower Pot=Maceta con roble oscuro -Spruce Sapling Flower Pot=Maceta con abeto -Birch Sapling Flower Pot=Maceta con abedul -Dead Bush Flower Pot=Maceta con arbusto muerto -Fern Flower Pot=Maceta con helecho -Cactus Flower Pot=Maceta con cactus -Flower Pot=Maceta -Flower pots are decorative blocks in which flowers and other small plants can be placed.=Las macetas son bloques decorativos en los que se pueden colocar flores y otras plantas pequeñas. -Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Simplemente coloque una planta en la maceta. Las macetas pueden contener flores pequeñas (no más de 1 bloque), árboles jóvenes, helechos, arbustos muertos, hongos y cactus. Haga clic derecho en una planta en maceta para recuperar la planta. diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.fr.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.fr.tr deleted file mode 100644 index d804971178..0000000000 --- a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.fr.tr +++ /dev/null @@ -1,26 +0,0 @@ -# textdomain: mcl_flowerpots -Dandelion Flower Pot=Pissenlit en Pot -Poppy Flower Pot=Coquelicot en Pot -Blue Orchid Flower Pot=Orchidée Bleue en Pot -Allium Flower Pot=Allium en Pot -Azure Bluet Flower Pot=Houstonie Bleue en Pot -Red Tulip Flower Pot=Tulipe Rouge en Pot -Pink Tulip Flower Pot=Tulipe Rose en Pot -White Tulip Flower Pot=Tulipe Blanche en Pot -Orange Tulip Flower Pot=Tulipe Orange en Pot -Oxeye Daisy Flower Pot=Marguerite en Pot -Brown Mushroom Flower Pot=Champignon Marron en Pot -Red Mushroom Flower Pot=Champignon Rouge en Pot -Oak Sapling Flower Pot=Pousse de Chêne en Pot -Acacia Sapling Flower Pot=Pousse d'Acacia en Pot -Jungle Sapling Flower Pot=Pousse d'Acajou en Pot -Dark Oak Sapling Flower Pot=Pousse de Chêne Noir en Pot -Spruce Sapling Flower Pot=Pousse de Sapin en Pot -Birch Sapling Flower Pot=Pousse de Bouleau en Pot -Dead Bush Flower Pot=Arbuste Mort en Pot -Fern Flower Pot=Fougère en Pot -Cactus Flower Pot=Cactus en Pot -Flower Pot=Pot de Fleurs -Flower pots are decorative blocks in which flowers and other small plants can be placed.=Les pots de fleurs sont des blocs décoratifs dans lesquels des fleurs et d'autres petites plantes peuvent être placées. -Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Placez simplement une plante sur le pot de fleurs. Les pots de fleurs peuvent contenir de petites fleurs (pas plus d'un bloc), des pousses, des fougères, des buissons morts, des champignons et des cactus. Cliquez avec le bouton droit sur une plante en pot pour récupérer la plante. -Can hold a small flower or plant=Peut contenir une petite fleur ou plante diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.pl.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.pl.tr deleted file mode 100644 index 4bc5e282a6..0000000000 --- a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.pl.tr +++ /dev/null @@ -1,27 +0,0 @@ -# textdomain: mcl_flowerpots -Dandelion Flower Pot=Doniczka z mleczem -Poppy Flower Pot=Doniczka z makiem -Blue Orchid Flower Pot=Doniczka z niebieską orchideą -Allium Flower Pot=Doniczka z czosnkiem -Azure Bluet Flower Pot=Doniczka z houstonią błękitną -Red Tulip Flower Pot=Doniczka z czerwonym tulipanem -Pink Tulip Flower Pot=Doniczka z różowym tulipanem -White Tulip Flower Pot=Doniczka z białym tulipanem -Orange Tulip Flower Pot=Doniczka z pomarańczowym tulipanem -Oxeye Daisy Flower Pot=Doniczka ze stokrotką -Brown Mushroom Flower Pot=Doniczka z brązowym grzybem -Red Mushroom Flower Pot=Doniczka z czerwonym grzybem -Oak Sapling Flower Pot=Doniczka z sadzonką dębu -Acacia Sapling Flower Pot=Doniczka z sadzonką akacji -Jungle Sapling Flower Pot=Doniczka z tropikalną sadzonką -Dark Oak Sapling Flower Pot=Doniczka z sadzonką ciemnego dębu -Spruce Sapling Flower Pot=Doniczka z sadzonką świerku -Birch Sapling Flower Pot=Doniczka z sadzonką brzozy -Dead Bush Flower Pot=Doniczka z martwym buszem -Fern Flower Pot=Doniczka z paprocią -Cactus Flower Pot=Doniczka z kaktusem -Flower Pot=Doniczka -Flower pots are decorative blocks in which flowers and other small plants can be placed.=Doniczki są dekoracyjnymi blokami w których mogą zostać postawione kwiaty i inne małe rośliny. -Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Po prostu umieść roślinę w doniczce. Mogę one przechowywać małe kwiaty (nie większe niż 1 blok), sadzonki, paprocie, martwe busze, grzyby i kaktusy. Kliknij prawym przyciskiem w doniczkę aby odzyskać roślinę. -Can hold a small flower or plant=Może przechowywać mały kwiat lub roślinę - diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.ru.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.ru.tr deleted file mode 100644 index 6bb6be923e..0000000000 --- a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.ru.tr +++ /dev/null @@ -1,26 +0,0 @@ -# textdomain: mcl_flowerpots -Dandelion Flower Pot=Одуванчик в горшке -Poppy Flower Pot=Мак в горшке -Blue Orchid Flower Pot=Голубая орхидея в горшке -Allium Flower Pot=Лук в горшке -Azure Bluet Flower Pot=Хоустония Альба в горшке -Red Tulip Flower Pot=Красный тюльпан в горшке -Pink Tulip Flower Pot=Розовый тюльпан в горшке -White Tulip Flower Pot=Белый тюльпан в горшке -Orange Tulip Flower Pot=Оранжевый тюльпан в горшке -Oxeye Daisy Flower Pot=Нивяник обыкновенный в горшке -Brown Mushroom Flower Pot=Коричневый гриб в горшке -Red Mushroom Flower Pot=Красный гриб в горшке -Oak Sapling Flower Pot=Саженец дуба в горшке -Acacia Sapling Flower Pot=Саженец акации в горшке -Jungle Sapling Flower Pot=Саженец дерева джунглей в горшке -Dark Oak Sapling Flower Pot=Саженец тёмного дуба в горшке -Spruce Sapling Flower Pot=Саженец ели в горшке -Birch Sapling Flower Pot=Саженец берёзы в горшке -Dead Bush Flower Pot=Мёртвый куст в горшке -Fern Flower Pot=Цветок папоротника в горшке -Cactus Flower Pot=Кактус в горшке -Flower Pot=Цветочный горшок -Flower pots are decorative blocks in which flowers and other small plants can be placed.=Цветочные горшки это декоративные блоки, в которые можно посадить цветы и другие небольшие растения. -Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Просто поместите растение в цветочный горшок. Цветочные горшки могут выдержать небольшие цветы (не выше 1 блока), саженцы, папоротники, мёртвые кусты, грибы и кактусы. Кликните правой по горшёчному растению, чтобы вытащить его из горшка. -Can hold a small flower or plant=Можно использовать для высадки небольшого растения или цветка diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.zh_TW.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.zh_TW.tr deleted file mode 100644 index 78ee96e8a3..0000000000 --- a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.zh_TW.tr +++ /dev/null @@ -1,26 +0,0 @@ -# textdomain: mcl_flowerpots -Dandelion Flower Pot=蒲公英盆栽 -Poppy Flower Pot=罌粟盆栽 -Blue Orchid Flower Pot=藍色蝴蝶蘭盆栽 -Allium Flower Pot=紫紅球花盆栽 -Azure Bluet Flower Pot=雛草盆栽 -Red Tulip Flower Pot=紅色鬱金香盆栽 -Pink Tulip Flower Pot=粉色鬱金香盆栽 -White Tulip Flower Pot=白色鬱金香盆栽 -Orange Tulip Flower Pot=橙色鬱金香盆栽 -Oxeye Daisy Flower Pot=雛菊盆栽 -Brown Mushroom Flower Pot=棕色蘑菇盆栽 -Red Mushroom Flower Pot=紅色蘑菇盆栽 -Oak Sapling Flower Pot=橡木樹苗盆栽 -Acacia Sapling Flower Pot=相思木樹苗盆栽 -Jungle Sapling Flower Pot=叢林木樹苗盆栽 -Dark Oak Sapling Flower Pot=黑橡木樹苗盆栽 -Spruce Sapling Flower Pot=杉木樹苗盆栽 -Birch Sapling Flower Pot=樺木樹苗盆栽 -Dead Bush Flower Pot=枯灌木盆栽 -Fern Flower Pot=蕨盆栽 -Cactus Flower Pot=仙人掌盆栽 -Flower Pot=花盆 -Flower pots are decorative blocks in which flowers and other small plants can be placed.=花盆是可以放置鮮花和其他小植物的裝飾方塊。 -Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=只需在花盆上放置一株植物即可。花盆可以放置小花(不高於1格)、樹苗、蕨類植物、枯樹叢、蘑菇和仙人掌。右鍵點擊盆栽即可取回植物。 -Can hold a small flower or plant=放置鮮花和其他小植物 diff --git a/mods/ITEMS/mcl_flowerpots/locale/template.txt b/mods/ITEMS/mcl_flowerpots/locale/template.txt deleted file mode 100644 index fcdf7d21eb..0000000000 --- a/mods/ITEMS/mcl_flowerpots/locale/template.txt +++ /dev/null @@ -1,26 +0,0 @@ -# textdomain: mcl_flowerpots -Dandelion Flower Pot= -Poppy Flower Pot= -Blue Orchid Flower Pot= -Allium Flower Pot= -Azure Bluet Flower Pot= -Red Tulip Flower Pot= -Pink Tulip Flower Pot= -White Tulip Flower Pot= -Orange Tulip Flower Pot= -Oxeye Daisy Flower Pot= -Brown Mushroom Flower Pot= -Red Mushroom Flower Pot= -Oak Sapling Flower Pot= -Acacia Sapling Flower Pot= -Jungle Sapling Flower Pot= -Dark Oak Sapling Flower Pot= -Spruce Sapling Flower Pot= -Birch Sapling Flower Pot= -Dead Bush Flower Pot= -Fern Flower Pot= -Cactus Flower Pot= -Flower Pot= -Flower pots are decorative blocks in which flowers and other small plants can be placed.= -Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.= -Can hold a small flower or plant= diff --git a/mods/ITEMS/mcl_flowerpots/mod.conf b/mods/ITEMS/mcl_flowerpots/mod.conf deleted file mode 100644 index e6a71c4daf..0000000000 --- a/mods/ITEMS/mcl_flowerpots/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name=mcl_flowerpots -depends=mcl_core, mcl_sounds, mcl_farming -optional_depends=doc \ No newline at end of file diff --git a/mods/ITEMS/mcl_flowerpots/models/flowerpot.obj b/mods/ITEMS/mcl_flowerpots/models/flowerpot.obj deleted file mode 100644 index 5921a5b9f7..0000000000 --- a/mods/ITEMS/mcl_flowerpots/models/flowerpot.obj +++ /dev/null @@ -1,74 +0,0 @@ -# Blender v2.72 (sub 0) OBJ File: 'flowerpot.blend' -# www.blender.org -mtllib flowerpot.mtl -o Cube_Cube.001 -v -0.376261 -1.015969 0.376261 -v -0.376261 -0.263447 0.376261 -v -0.376261 -1.015969 -0.376261 -v -0.376261 -0.263447 -0.376261 -v 0.376261 -1.015969 0.376261 -v 0.376261 -0.263447 0.376261 -v 0.376261 -1.015969 -0.376261 -v 0.376261 -0.263447 -0.376261 -v -0.250727 -0.559166 0.250727 -v -0.250727 -0.263549 0.250727 -v -0.250727 -0.559166 -0.250727 -v -0.250727 -0.263549 -0.250727 -v 0.250727 -0.559166 0.250727 -v 0.250727 -0.263549 0.250727 -v 0.250727 -0.559166 -0.250727 -v 0.250727 -0.263549 -0.250727 -v 0.678334 1.490754 0.678334 -v 0.678334 -0.569152 0.678334 -v -0.678334 1.490754 -0.678334 -v -0.678334 -0.569152 -0.678334 -v -0.678334 1.490754 0.678334 -v -0.678334 -0.569152 0.678334 -v 0.678334 1.490754 -0.678334 -v 0.678334 -0.569152 -0.678334 -vt 0.562500 0.187500 -vt 0.562500 0.375000 -vt 0.375000 0.375000 -vt 0.375000 0.187500 -vt 0.187500 0.375000 -vt 0.187500 0.187500 -vt 0.000000 0.375000 -vt 0.000000 0.187500 -vt 0.750000 0.187500 -vt 0.750000 0.375000 -vt 0.687500 0.000000 -vt 0.875000 0.000000 -vt 0.875000 0.187500 -vt 0.687500 0.187500 -vt 0.500000 0.000000 -vt 0.500000 0.187500 -vt 0.375000 0.000000 -vt 0.250000 0.000000 -vt 0.250000 0.062500 -vt 0.375000 0.062500 -vt 0.125000 0.000000 -vt 0.125000 0.062500 -vt 0.000000 0.000000 -vt 0.000000 0.062500 -vt 0.500000 0.062500 -vt 0.125000 0.187500 -vt 0.250000 0.187500 -vt 0.000000 1.000000 -vt 0.500000 1.000000 -vt 0.500000 0.500000 -vt 0.000000 0.500000 -usemtl None -s off -f 1/1 2/2 4/3 3/4 -f 3/4 4/3 8/5 7/6 -f 7/6 8/5 6/7 5/8 -f 5/9 6/10 2/2 1/1 -f 3/11 7/12 5/13 1/14 -f 8/15 4/11 2/14 6/16 -f 9/17 11/18 12/19 10/20 -f 11/18 15/21 16/22 12/19 -f 15/21 13/23 14/24 16/22 -f 13/15 9/17 10/20 14/25 -f 11/22 9/26 13/27 15/19 -f 17/28 19/29 20/30 18/31 -f 21/28 23/29 24/30 22/31 diff --git a/mods/ITEMS/mcl_flowerpots/models/flowerpot_with_Xflower.obj b/mods/ITEMS/mcl_flowerpots/models/flowerpot_with_Xflower.obj deleted file mode 100644 index d2127236c7..0000000000 --- a/mods/ITEMS/mcl_flowerpots/models/flowerpot_with_Xflower.obj +++ /dev/null @@ -1,90 +0,0 @@ -# Blender v2.78 (sub 0) OBJ File: '' -# www.blender.org -mtllib flowerpot_with_Xflower.mtl -o Cube_Cube.001 -v -0.376017 -1.015283 0.376017 -v -0.376017 -0.263249 0.376017 -v -0.376017 -0.263249 -0.376017 -v -0.376017 -1.015283 -0.376017 -v 0.376017 -0.263249 -0.376017 -v 0.376017 -1.015283 -0.376017 -v 0.376017 -0.263249 0.376017 -v 0.376017 -1.015283 0.376017 -v -0.250565 -0.558776 0.250565 -v -0.250565 -0.558776 -0.250565 -v -0.250565 -0.263350 -0.250565 -v -0.250565 -0.263350 0.250565 -v 0.250565 -0.558776 -0.250565 -v 0.250565 -0.263350 -0.250565 -v 0.250565 -0.558776 0.250565 -v 0.250565 -0.263350 0.250565 -v -0.677552 -0.564356 0.677766 -v -0.677552 1.848188 0.677767 -v 0.677280 -0.564356 -0.677066 -v 0.677280 1.848188 -0.677066 -v 0.677280 -0.564356 0.677767 -v 0.677280 1.848188 0.677767 -v -0.677552 -0.564356 -0.677066 -v -0.677552 1.848188 -0.677066 -vt 1.0000 0.0000 -vt 1.0000 0.6250 -vt 0.5000 0.6250 -vt 0.5000 -0.0000 -vt 1.0000 0.0000 -vt 1.0000 0.6250 -vt 0.5000 0.6250 -vt 0.5000 -0.0000 -vt 0.5625 0.6250 -vt 0.5625 0.8125 -vt 0.3750 0.8125 -vt 0.3750 0.6250 -vt 0.1875 0.8125 -vt 0.1875 0.6250 -vt -0.0000 0.8125 -vt 0.0000 0.6250 -vt 0.7500 0.6250 -vt 0.7500 0.8125 -vt 0.3750 0.8125 -vt 0.5625 0.8125 -vt 0.5625 1.0000 -vt 0.3750 1.0000 -vt 0.3750 1.0000 -vt 0.1875 1.0000 -vt 0.3750 0.4375 -vt 0.2500 0.4375 -vt 0.2500 0.5000 -vt 0.3750 0.5000 -vt 0.1250 0.4375 -vt 0.1250 0.5000 -vt -0.0000 0.4375 -vt -0.0000 0.5000 -vt 0.5000 0.4375 -vt 0.5000 0.5000 -vt 0.1250 0.5000 -vt 0.1250 0.6250 -vt 0.2500 0.6250 -vt 0.2500 0.5000 -vn -0.7071 0.0000 -0.7071 -vn -0.7071 0.0000 0.7071 -vn -1.0000 0.0000 0.0000 -vn 0.0000 0.0000 -1.0000 -vn 1.0000 -0.0000 0.0000 -vn 0.0000 -0.0000 1.0000 -vn 0.0000 -1.0000 -0.0000 -vn 0.0000 1.0000 0.0000 -usemtl None -s off -f 17/1/1 18/2/1 20/3/1 19/4/1 -f 21/5/2 22/6/2 24/7/2 23/8/2 -s 1 -f 1/9/3 2/10/3 3/11/3 4/12/3 -f 4/12/4 3/11/4 5/13/4 6/14/4 -f 6/14/5 5/13/5 7/15/5 8/16/5 -f 8/17/6 7/18/6 2/10/6 1/9/6 -f 4/19/7 6/20/7 8/21/7 1/22/7 -f 5/13/8 3/11/8 2/23/8 7/24/8 -f 9/25/5 10/26/5 11/27/5 12/28/5 -f 10/26/6 13/29/6 14/30/6 11/27/6 -f 13/29/3 15/31/3 16/32/3 14/30/3 -f 15/33/4 9/25/4 12/28/4 16/34/4 -f 10/35/8 9/36/8 15/37/8 13/38/8 diff --git a/mods/ITEMS/mcl_flowerpots/models/flowerpot_with_long_cube.obj b/mods/ITEMS/mcl_flowerpots/models/flowerpot_with_long_cube.obj deleted file mode 100644 index 0b7f58da17..0000000000 --- a/mods/ITEMS/mcl_flowerpots/models/flowerpot_with_long_cube.obj +++ /dev/null @@ -1,150 +0,0 @@ -# Blender v2.78 (sub 0) OBJ File: '' -# www.blender.org -mtllib flowerpot_with_long_cube.mtl -o Cube_Cube.001 -v 0.256212 -0.267479 0.256212 -v 0.256212 1.081644 0.256212 -v 0.256212 -0.267479 -0.256212 -v 0.256212 1.081644 -0.256212 -v -0.256212 -0.267479 -0.256212 -v -0.256212 1.081644 -0.256212 -v -0.256212 1.081644 0.256212 -v -0.256212 -0.267479 0.256212 -v -0.376017 -1.015283 0.376017 -v -0.376017 -0.263249 0.376017 -v -0.376017 -0.263249 -0.376017 -v -0.376017 -1.015283 -0.376017 -v 0.376017 -0.263249 -0.376017 -v 0.376017 -1.015283 -0.376017 -v 0.376017 -0.263249 0.376017 -v 0.376017 -1.015283 0.376017 -v -0.250565 -0.558776 0.250565 -v -0.250565 -0.558776 -0.250565 -v -0.250565 -0.263350 -0.250565 -v -0.250565 -0.263350 0.250565 -v 0.250565 -0.558776 -0.250565 -v 0.250565 -0.263350 -0.250565 -v 0.250565 -0.558776 0.250565 -v 0.250565 -0.263350 0.250565 -v 0.685750 -0.738264 0.685751 -v 0.685751 1.201331 0.685750 -v -0.685750 -0.738264 -0.685750 -v -0.685750 1.201331 -0.685751 -v -0.685750 -0.738264 0.685750 -v -0.685750 1.201331 0.685751 -v 0.685751 -0.738264 -0.685751 -v 0.685751 1.201331 -0.685750 -v 0.130337 -0.351889 0.130337 -v 0.130337 0.272653 0.130337 -v 0.130337 -0.351888 -0.130337 -v 0.130337 0.272653 -0.130337 -v -0.130337 -0.351888 -0.130337 -v -0.130337 0.272653 -0.130337 -v -0.130337 0.272653 0.130337 -v -0.130337 -0.351889 0.130337 -vt 1.0000 0.0000 -vt 1.0000 0.5000 -vt 0.5000 0.5000 -vt 0.5000 0.0000 -vt 1.0000 0.0000 -vt 1.0000 0.5000 -vt 0.5000 0.5000 -vt 0.5000 0.0000 -vt 0.2500 0.0000 -vt 0.2500 0.3125 -vt 0.1250 0.3125 -vt 0.1250 -0.0000 -vt 0.3750 0.0000 -vt 0.3750 0.3125 -vt 0.5625 0.6250 -vt 0.5625 0.8125 -vt 0.3750 0.8125 -vt 0.3750 0.6250 -vt 0.1875 0.8125 -vt 0.1875 0.6250 -vt -0.0000 0.8125 -vt 0.0000 0.6250 -vt 0.7500 0.6250 -vt 0.7500 0.8125 -vt 0.3750 0.8125 -vt 0.5625 0.8125 -vt 0.5625 1.0000 -vt 0.3750 1.0000 -vt 0.3750 1.0000 -vt 0.1875 1.0000 -vt 0.3750 0.4375 -vt 0.2500 0.4375 -vt 0.2500 0.5000 -vt 0.3750 0.5000 -vt 0.1250 0.4375 -vt 0.1250 0.5000 -vt -0.0000 0.4375 -vt -0.0000 0.5000 -vt 0.5000 0.4375 -vt 0.5000 0.5000 -vt 0.1250 0.5000 -vt 0.1250 0.6250 -vt 0.2500 0.6250 -vt 0.2500 0.5000 -vt 0.0000 0.3125 -vt -0.0000 -0.0000 -vt 0.5000 -0.0000 -vt 0.5000 0.3125 -vt 0.2500 0.3125 -vt 0.3750 0.3125 -vt 0.3750 0.4375 -vt 0.2500 0.4375 -vt 0.2500 0.4375 -vt 0.1250 0.4375 -vt 0.8750 0.6250 -vt 0.8750 0.7188 -vt 0.8125 0.7188 -vt 0.8125 0.6250 -vt 0.9375 0.6250 -vt 0.9375 0.7188 -vt 0.7500 0.7188 -vt 0.7500 0.6250 -vt 1.0000 0.6250 -vt 1.0000 0.7188 -vt 0.8750 0.7188 -vt 0.9375 0.7188 -vt 0.9375 0.7812 -vt 0.8750 0.7812 -vt 0.8750 0.7812 -vt 0.8125 0.7812 -vn -0.7071 0.0000 0.7071 -vn -0.7071 0.0000 -0.7071 -vn 0.0000 0.0000 -1.0000 -vn -1.0000 -0.0000 0.0000 -vn 1.0000 -0.0000 0.0000 -vn 0.0000 -0.0000 1.0000 -vn 0.0000 -1.0000 -0.0000 -vn 0.0000 1.0000 0.0000 -usemtl None -s off -f 25/1/1 26/2/1 28/3/1 27/4/1 -f 29/5/2 30/6/2 32/7/2 31/8/2 -s 1 -f 5/9/3 6/10/3 4/11/3 3/12/3 -f 8/13/4 7/14/4 6/10/4 5/9/4 -f 9/15/4 10/16/4 11/17/4 12/18/4 -f 12/18/3 11/17/3 13/19/3 14/20/3 -f 14/20/5 13/19/5 15/21/5 16/22/5 -f 16/23/6 15/24/6 10/16/6 9/15/6 -f 12/25/7 14/26/7 16/27/7 9/28/7 -f 13/19/8 11/17/8 10/29/8 15/30/8 -f 17/31/5 18/32/5 19/33/5 20/34/5 -f 18/32/6 21/35/6 22/36/6 19/33/6 -f 21/35/4 23/37/4 24/38/4 22/36/4 -f 23/39/3 17/31/3 20/34/3 24/40/3 -f 18/41/8 17/42/8 23/43/8 21/44/8 -f 3/12/5 4/11/5 2/45/5 1/46/5 -f 1/47/6 2/48/6 7/14/6 8/13/6 -f 5/49/7 3/50/7 1/51/7 8/52/7 -f 4/11/8 6/10/8 7/53/8 2/54/8 -f 37/55/3 38/56/3 36/57/3 35/58/3 -f 40/59/4 39/60/4 38/56/4 37/55/4 -f 35/58/5 36/57/5 34/61/5 33/62/5 -f 33/63/6 34/64/6 39/60/6 40/59/6 -f 37/65/7 35/66/7 33/67/7 40/68/7 -f 36/57/8 38/56/8 39/69/8 34/70/8 diff --git a/mods/ITEMS/mcl_flowerpots/textures/mcl_flowerpots_cactus.png b/mods/ITEMS/mcl_flowerpots/textures/mcl_flowerpots_cactus.png deleted file mode 100644 index 6c40875ef5..0000000000 Binary files a/mods/ITEMS/mcl_flowerpots/textures/mcl_flowerpots_cactus.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowerpots/textures/mcl_flowerpots_flowerpot.png b/mods/ITEMS/mcl_flowerpots/textures/mcl_flowerpots_flowerpot.png deleted file mode 100644 index a07dd788a7..0000000000 Binary files a/mods/ITEMS/mcl_flowerpots/textures/mcl_flowerpots_flowerpot.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowerpots/textures/mcl_flowerpots_flowerpot_inventory.png b/mods/ITEMS/mcl_flowerpots/textures/mcl_flowerpots_flowerpot_inventory.png deleted file mode 100644 index 5d6a6a244a..0000000000 Binary files a/mods/ITEMS/mcl_flowerpots/textures/mcl_flowerpots_flowerpot_inventory.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/API.md b/mods/ITEMS/mcl_flowers/API.md deleted file mode 100644 index f3dc87725a..0000000000 --- a/mods/ITEMS/mcl_flowers/API.md +++ /dev/null @@ -1,9 +0,0 @@ -# API -Flower mod for mcl2 -# Functions -## mcl_flowers.register_simple_flower(name, desc, image, simple_selection_box) -Register a simple flower: -* name: legacity name eg: "my_super_flower" -* desc: description eg: "My Super Flower" -* image: texture -* simple_selection_box: nodebox of the flower \ No newline at end of file diff --git a/mods/ITEMS/mcl_flowers/README.txt b/mods/ITEMS/mcl_flowers/README.txt deleted file mode 100644 index baee0ef4fb..0000000000 --- a/mods/ITEMS/mcl_flowers/README.txt +++ /dev/null @@ -1,12 +0,0 @@ -Minetest 0.4 mod: flowers -========================= - -License of source code: ------------------------ -Copyright (C) 2012-2013 Ironzorg, VanessaE - -This program is free software. It comes without any warranty, to -the extent permitted by applicable law. You can redistribute it -and/or modify it under the terms of the Do What The Fuck You Want -To Public License, Version 2, as published by Sam Hocevar. See -http://sam.zoy.org/wtfpl/COPYING for more details. diff --git a/mods/ITEMS/mcl_flowers/credit.txt b/mods/ITEMS/mcl_flowers/credit.txt deleted file mode 100644 index f57fe17976..0000000000 --- a/mods/ITEMS/mcl_flowers/credit.txt +++ /dev/null @@ -1,8 +0,0 @@ -Credit to people who made things. - -jojoa1997: --edited all of it --flower pot - -VanessaE: --waterlily diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua deleted file mode 100644 index 33ea531c5c..0000000000 --- a/mods/ITEMS/mcl_flowers/init.lua +++ /dev/null @@ -1,521 +0,0 @@ -local modname = minetest.get_current_modname() -local modpath = minetest.get_modpath(modname) -local S = minetest.get_translator(modname) - -local mod_screwdriver = minetest.get_modpath("screwdriver") -local has_mcl_flowerpots = minetest.get_modpath("mcl_flowerpots") - -mcl_flowers = {} -mcl_flowers.registered_simple_flowers = {} --- Simple flower template -local smallflowerlongdesc = S("This is a small flower. Small flowers are mainly used for dye production and can also be potted.") -local plant_usage_help = S("It can only be placed on a block on which it would also survive.") - -local get_palette_color_from_pos = function(pos) - local biome_data = minetest.get_biome_data(pos) - local index = 0 - if biome_data then - local biome = biome_data.biome - local biome_name = minetest.get_biome_name(biome) - local reg_biome = minetest.registered_biomes[biome_name] - if reg_biome then - index = reg_biome._mcl_palette_index - end - end - return index -end - --- on_place function for flowers -local on_place_flower = mcl_util.generate_on_place_plant_function(function(pos, node, itemstack) - local below = {x=pos.x, y=pos.y-1, z=pos.z} - local soil_node = minetest.get_node_or_nil(below) - if not soil_node then return false end - - local has_palette = minetest.registered_nodes[itemstack:get_name()].palette ~= nil - local colorize - if has_palette then - colorize = get_palette_color_from_pos(pos) - end - if not colorize then - colorize = 0 - end - ---[[ Placement requirements: - * Dirt or grass block - * If not flower, also allowed on podzol and coarse dirt - * Light level >= 8 at any time or exposed to sunlight at day -]] - local light_night = minetest.get_node_light(pos, 0.0) - local light_day = minetest.get_node_light(pos, 0.5) - local light_ok = false - if (light_night and light_night >= 8) or (light_day and light_day >= minetest.LIGHT_MAX) then - light_ok = true - end - local is_flower = minetest.get_item_group(itemstack:get_name(), "flower") == 1 - local ok = (soil_node.name == "mcl_core:dirt" or minetest.get_item_group(soil_node.name, "grass_block") == 1 or (not is_flower and (soil_node.name == "mcl_core:coarse_dirt" or soil_node.name == "mcl_core:podzol" or soil_node.name == "mcl_core:podzol_snow"))) and light_ok - return ok, colorize -end) - -function mcl_flowers.register_simple_flower(name, def) - local newname = "mcl_flowers:"..name - if not def._mcl_silk_touch_drop then def._mcl_silk_touch_drop = nil end - if not def.drop then def.drop = newname end - mcl_flowers.registered_simple_flowers[newname] = { - name=name, - desc=def.desc, - image=def.image, - simple_selection_box=def.simple_selection_box, - } - minetest.register_node(newname, { - description = def.desc, - _doc_items_longdesc = smallflowerlongdesc, - _doc_items_usagehelp = plant_usage_help, - drawtype = "plantlike", - waving = 1, - tiles = { def.image }, - inventory_image = def.image, - wield_image = def.image, - sunlight_propagates = true, - paramtype = "light", - walkable = false, - stack_max = 64, - drop = def.drop, - groups = { - attached_node = 1, deco_block = 1, dig_by_piston = 1, dig_immediate = 3, - dig_by_water = 1, destroy_by_lava_flow = 1, enderman_takable = 1, - plant = 1, flower = 1, place_flowerlike = 1, non_mycelium_plant = 1, - flammable = 2, fire_encouragement = 60, fire_flammability = 100, - compostability = 65 - }, - sounds = mcl_sounds.node_sound_leaves_defaults(), - node_placement_prediction = "", - on_place = on_place_flower, - selection_box = { - type = "fixed", - fixed = def.selection_box, - }, - _mcl_silk_touch_drop = def._mcl_silk_touch_drop, - }) - if def.potted and has_mcl_flowerpots then - mcl_flowerpots.register_potted_flower(newname, { - name = name, - desc = def.desc, - image = def.image, - }) - end -end - -local wheat_seed_drop = { - max_items = 1, - items = { - { - items = {"mcl_farming:wheat_seeds"}, - rarity = 8, - }, - }, -} - -local fortune_wheat_seed_drop = { - discrete_uniform_distribution = true, - items = {"mcl_farming:wheat_seeds"}, - chance = 1 / 8, - min_count = 1, - max_count = 1, - factor = 2, - overwrite = true, -} - --- CHECKME: How does tall grass behave when pushed by a piston? - ---- Tall Grass --- -local def_tallgrass = { - description = S("Tall Grass"), - drawtype = "plantlike", - _doc_items_longdesc = S("Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high."), - _doc_items_usagehelp = plant_usage_help, - _doc_items_hidden = false, - waving = 1, - tiles = {"mcl_flowers_tallgrass.png"}, - inventory_image = "mcl_flowers_tallgrass_inv.png", - wield_image = "mcl_flowers_tallgrass_inv.png", - selection_box = { - type = "fixed", - fixed = {{ -6/16, -8/16, -6/16, 6/16, 4/16, 6/16 }}, - }, - paramtype = "light", - paramtype2 = "color", - palette = "mcl_core_palette_grass.png", - sunlight_propagates = true, - walkable = false, - buildable_to = true, - is_ground_content = true, - groups = { - handy = 1, shearsy = 1, attached_node = 1, deco_block = 1, - plant = 1, place_flowerlike = 2, non_mycelium_plant = 1, - flammable = 3, fire_encouragement = 60, fire_flammability = 100, - dig_by_water = 1, destroy_by_lava_flow = 1, compostability = 30 - }, - sounds = mcl_sounds.node_sound_leaves_defaults(), - drop = wheat_seed_drop, - _mcl_shears_drop = true, - _mcl_fortune_drop = fortune_wheat_seed_drop, - node_placement_prediction = "", - on_place = on_place_flower, - _mcl_blast_resistance = 0, - _mcl_hardness = 0, -} -minetest.register_node("mcl_flowers:tallgrass", def_tallgrass) - ---- Fern --- --- The fern is very similar to tall grass, so we can copy a lot from it. -local def_fern = table.copy(def_tallgrass) -def_fern.description = S("Fern") -def_fern._doc_items_longdesc = S("Ferns are small plants which occur naturally in jungles and taigas. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.") -def_fern.tiles = { "mcl_flowers_fern.png" } -def_fern.inventory_image = "mcl_flowers_fern_inv.png" -def_fern.wield_image = "mcl_flowers_fern_inv.png" -def_fern.selection_box = { - type = "fixed", - fixed = { -6/16, -0.5, -6/16, 6/16, 5/16, 6/16 }, -} -def_fern.groups.compostability = 65 - -minetest.register_node("mcl_flowers:fern", def_fern) - -if has_mcl_flowerpots then - mcl_flowerpots.register_potted_flower("mcl_flowers:fern", { - name = "fern", - desc = S("Fern"), - image = "mcl_flowers_fern_inv.png", - }) -end - -local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_img, selbox_radius, selbox_top_height, drop, shears_drop, is_flower, grass_color, fortune_drop) - if not inv_img then - inv_img = top_img - end - local create_entry, paramtype2, palette - if is_flower == nil then - is_flower = true - end - - local bottom_groups = { - attached_node = 1, deco_block = 1, - dig_by_water = 1, destroy_by_lava_flow = 1, dig_by_piston = 1, - flammable = 2, fire_encouragement = 60, fire_flammability = 100, - plant = 1, double_plant = 1, non_mycelium_plant = 1, compostability = 65 - } - if name == "double_grass" then - bottom_groups.compostability = 50 - end - if is_flower then - bottom_groups.flower = 1 - bottom_groups.place_flowerlike = 1 - bottom_groups.dig_immediate = 3 - else - bottom_groups.place_flowerlike = 2 - bottom_groups.handy = 1 - bottom_groups.shearsy = 1 - end - if grass_color then - paramtype2 = "color" - palette = "mcl_core_palette_grass.png" - end - if longdesc == nil then - bottom_groups.not_in_creative_inventory = 1 - create_entry = false - end - -- Drop itself by default - local drop_bottom, drop_top - if not drop then - drop_top = "mcl_flowers:"..name - else - drop_top = drop - drop_bottom = drop - end - minetest.register_node("mcl_flowers:"..name, { - description = desc, - _doc_items_create_entry = create_entry, - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = plant_usage_help, - drawtype = "plantlike", - tiles = { bottom_img }, - inventory_image = inv_img, - wield_image = inv_img, - sunlight_propagates = true, - paramtype = "light", - paramtype2 = paramtype2, - palette = palette, - walkable = false, - buildable_to = true, - drop = drop_bottom, - _mcl_shears_drop = shears_drop, - _mcl_fortune_drop = fortune_drop, - node_placement_prediction = "", - selection_box = { - type = "fixed", - fixed = { -selbox_radius, -0.5, -selbox_radius, selbox_radius, 0.5, selbox_radius }, - }, - on_place = function(itemstack, placer, pointed_thing) - -- We can only place on nodes - if pointed_thing.type ~= "node" then - return - end - - local itemstring = "mcl_flowers:"..name - - -- Call on_rightclick if the pointed node defines it - local node = minetest.get_node(pointed_thing.under) - if placer and not placer:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack - end - end - - -- Check for a floor and a space of 1×2×1 - local ptu_node = minetest.get_node(pointed_thing.under) - local bottom - if not minetest.registered_nodes[ptu_node.name] then - return itemstack - end - if minetest.registered_nodes[ptu_node.name].buildable_to then - bottom = pointed_thing.under - else - bottom = pointed_thing.above - end - if not minetest.registered_nodes[minetest.get_node(bottom).name] then - return itemstack - end - local top = { x = bottom.x, y = bottom.y + 1, z = bottom.z } - local bottom_buildable = minetest.registered_nodes[minetest.get_node(bottom).name].buildable_to - local top_buildable = minetest.registered_nodes[minetest.get_node(top).name].buildable_to - local floor = minetest.get_node({x=bottom.x, y=bottom.y-1, z=bottom.z}) - if not minetest.registered_nodes[floor.name] then - return itemstack - end - - local light_night = minetest.get_node_light(bottom, 0.0) - local light_day = minetest.get_node_light(bottom, 0.5) - local light_ok = false - if (light_night and light_night >= 8) or (light_day and light_day >= minetest.LIGHT_MAX) then - light_ok = true - end - - -- Placement rules: - -- * Allowed on dirt or grass block - -- * If not a flower, also allowed on podzol and coarse dirt - -- * Only with light level >= 8 - -- * Only if two enough space - if (floor.name == "mcl_core:dirt" or minetest.get_item_group(floor.name, "grass_block") == 1 or (not is_flower and (floor.name == "mcl_core:coarse_dirt" or floor.name == "mcl_core:podzol" or floor.name == "mcl_core:podzol_snow"))) and bottom_buildable and top_buildable and light_ok then - local param2 - if grass_color then - param2 = get_palette_color_from_pos(bottom) - end - -- Success! We can now place the flower - minetest.sound_play(minetest.registered_nodes[itemstring].sounds.place, {pos = bottom, gain=1}, true) - minetest.set_node(bottom, {name=itemstring, param2=param2}) - minetest.set_node(top, {name=itemstring.."_top", param2=param2}) - if not minetest.is_creative_enabled(placer:get_player_name()) then - itemstack:take_item() - end - end - return itemstack - end, - after_destruct = function(pos, oldnode) - -- Remove top half of flower (if it exists) - local bottom = pos - local top = { x = bottom.x, y = bottom.y + 1, z = bottom.z } - if minetest.get_node(bottom).name ~= "mcl_flowers:"..name and minetest.get_node(top).name == "mcl_flowers:"..name.."_top" then - minetest.remove_node(top) - end - end, - groups = bottom_groups, - sounds = mcl_sounds.node_sound_leaves_defaults(), - }) - - local top_groups = table.copy(bottom_groups) - top_groups.not_in_creative_inventory=1 - top_groups.double_plant=2 - top_groups.attached_node=nil - - -- Top - minetest.register_node("mcl_flowers:"..name.."_top", { - description = desc.." " .. S("(Top Part)"), - _doc_items_create_entry = false, - drawtype = "plantlike", - tiles = { top_img }, - sunlight_propagates = true, - paramtype = "light", - paramtype2 = paramtype2, - palette = palette, - walkable = false, - buildable_to = true, - selection_box = { - type = "fixed", - fixed = { -selbox_radius, -0.5, -selbox_radius, selbox_radius, selbox_top_height, selbox_radius }, - }, - drop = drop_top, - _mcl_shears_drop = shears_drop, - _mcl_fortune_drop = fortune_drop, - after_destruct = function(pos, oldnode) - -- Remove bottom half of flower (if it exists) - local top = pos - local bottom = { x = top.x, y = top.y - 1, z = top.z } - if minetest.get_node(top).name ~= "mcl_flowers:"..name.."_top" and minetest.get_node(bottom).name == "mcl_flowers:"..name then - minetest.remove_node(bottom) - end - end, - groups = top_groups, - sounds = mcl_sounds.node_sound_leaves_defaults(), - }) - - if minetest.get_modpath("doc") and longdesc then - doc.add_entry_alias("nodes", "mcl_flowers:"..name, "nodes", "mcl_flowers:"..name.."_top") - -- If no longdesc, help alias must be added manually - end - -end - -add_large_plant("peony", S("Peony"), S("A peony is a large plant which occupies two blocks. It is mainly used in dye production."), "mcl_flowers_double_plant_paeonia_bottom.png", "mcl_flowers_double_plant_paeonia_top.png", nil, 5/16, 6/16) -add_large_plant("rose_bush", S("Rose Bush"), S("A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production."), "mcl_flowers_double_plant_rose_bottom.png", "mcl_flowers_double_plant_rose_top.png", nil, 5/16, 1/16) -add_large_plant("lilac", S("Lilac"), S("A lilac is a large plant which occupies two blocks. It is mainly used in dye production."), "mcl_flowers_double_plant_syringa_bottom.png", "mcl_flowers_double_plant_syringa_top.png", nil, 5/16, 6/16) - --- TODO: Make the sunflower face East. Requires a mesh for the top node. -add_large_plant("sunflower", S("Sunflower"), S("A sunflower is a large plant which occupies two blocks. It is mainly used in dye production."), "mcl_flowers_double_plant_sunflower_bottom.png", "mcl_flowers_double_plant_sunflower_top.png^mcl_flowers_double_plant_sunflower_front.png", "mcl_flowers_double_plant_sunflower_front.png", 6/16, 6/16) - -local longdesc_grass = S("Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.") -local longdesc_fern = S("Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.") - -add_large_plant("double_grass", S("Double Tallgrass"), longdesc_grass, "mcl_flowers_double_plant_grass_bottom.png", "mcl_flowers_double_plant_grass_top.png", "mcl_flowers_double_plant_grass_inv.png", 6/16, 4/16, wheat_seed_drop, {"mcl_flowers:tallgrass 2"}, false, true, fortune_wheat_seed_drop) -add_large_plant("double_fern", S("Large Fern"), longdesc_fern, "mcl_flowers_double_plant_fern_bottom.png", "mcl_flowers_double_plant_fern_top.png", "mcl_flowers_double_plant_fern_inv.png", 5/16, 5/16, wheat_seed_drop, {"mcl_flowers:fern 2"}, false, true, fortune_wheat_seed_drop) - -minetest.register_abm({ - label = "Pop out flowers", - nodenames = {"group:flower"}, - interval = 12, - chance = 2, - action = function(pos, node) - -- Ignore the upper part of double plants - if minetest.get_item_group(node.name, "double_plant") == 2 then - return - end - local below = minetest.get_node_or_nil({x=pos.x, y=pos.y-1, z=pos.z}) - if not below then - return - end - -- Pop out flower if not on dirt, grass block or too low brightness - if (below.name ~= "mcl_core:dirt" and minetest.get_item_group(below.name, "grass_block") ~= 1) or (minetest.get_node_light(pos, 0.5) < 8) then - minetest.dig_node(pos) - return - end - end, -}) - -local on_rotate -if mod_screwdriver then - on_rotate = screwdriver.rotate_simple -end - --- Lily Pad -minetest.register_node("mcl_flowers:waterlily", { - description = S("Lily Pad"), - _doc_items_longdesc = S("A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice."), - drawtype = "nodebox", - paramtype = "light", - paramtype2 = "facedir", - tiles = {"flowers_waterlily.png", "flowers_waterlily.png^[transformFY"}, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - inventory_image = "flowers_waterlily.png", - wield_image = "flowers_waterlily.png", - liquids_pointable = true, - walkable = true, - sunlight_propagates = true, - groups = { - deco_block = 1, plant = 1, compostability = 65, destroy_by_lava_flow = 1, - dig_immediate = 3, dig_by_water = 1, dig_by_piston = 1, dig_by_boat = 1, - }, - sounds = mcl_sounds.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 nodename = node.name - local def = minetest.registered_nodes[nodename] - local node_above = minetest.get_node(pointed_thing.above).name - local def_above = minetest.registered_nodes[node_above] - local player_name = placer:get_player_name() - - if def then - -- Use pointed node's on_rightclick function first, if present - if placer and not placer:get_player_control().sneak then - if def and def.on_rightclick then - return def.on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack - end - end - - if (pointed_thing.under.x == pointed_thing.above.x and pointed_thing.under.z == pointed_thing.above.z) and - ((def.liquidtype == "source" and minetest.get_item_group(nodename, "water") > 0) or - (nodename == "mcl_core:ice") or - (minetest.get_item_group(nodename, "frosted_ice") > 0)) and - (def_above.buildable_to and minetest.get_item_group(node_above, "liquid") == 0) then - if not minetest.is_protected(pos, player_name) then - minetest.set_node(pos, {name = "mcl_flowers:waterlily", param2 = math.random(0, 3)}) - local idef = itemstack:get_definition() - - if idef.sounds and idef.sounds.place then - minetest.sound_play(idef.sounds.place, {pos=pointed_thing.above, gain=1}, true) - end - - if not minetest.is_creative_enabled(player_name) then - itemstack:take_item() - end - else - minetest.record_protection_violation(pos, player_name) - end - end - end - return itemstack - end, - on_rotate = on_rotate, -}) - --- Legacy support -minetest.register_alias("mcl_core:tallgrass", "mcl_flowers:tallgrass") - --- mcimport support: re-adds missing double_plant tops in mcimported worlds. -local mg_name = minetest.get_mapgen_setting("mg_name") -local mod_mcimport = minetest.get_modpath("mcimport") - -local fix_doubleplants = minetest.settings:get_bool("fix_doubleplants", true) - -if mod_mcimport and mg_name == "singlenode" and fix_doubleplants == true then - local flowernames = { "peony", "rose_bush", "lilac", "sunflower", "double_fern", "double_grass" } - - minetest.register_lbm({ - label = "Add double plant tops.", - name = "mcl_flowers:double_plant_topper", - run_at_every_load = true, - nodenames = { "mcl_flowers:peony", "mcl_flowers:rose_bush", "mcl_flowers:lilac", "mcl_flowers:sunflower", "mcl_flowers:double_fern", "mcl_flowers:double_grass" }, - action = function(pos, node) - for c = 1, 6 do - local flowername = flowernames[c] - local bottom = pos - local top = { x = bottom.x, y = bottom.y + 1, z = bottom.z } - if node.name == "mcl_flowers:"..flowername then - minetest.set_node(top, {name = "mcl_flowers:"..flowername.."_top"}) - end - end - end, - }) -end - -dofile(modpath.."/register.lua") diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr deleted file mode 100644 index 0e1262e3c0..0000000000 --- a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.de.tr +++ /dev/null @@ -1,32 +0,0 @@ -# textdomain: mcl_flowers -This is a small flower. Small flowers are mainly used for dye production and can also be potted.=Dies ist eine kleine Blume. Kleine Blumen werden hauptsächlich in der Farbenproduktion benutzt, können aber auch in Blumentöpfen platziert werden. -It can only be placed on a block on which it would also survive.=Diese Pflanze kann nur auf einem Block platziert werden, auf dem sie auch überleben würde. -Poppy=Mohn -Dandelion=Löwenzahn -Oxeye Daisy=Margerite -Orange Tulip=Orange Tulpe -Pink Tulip=Rosa Tulpe -Red Tulip=Rote Tulpe -White Tulip=Weiße Tulpe -Allium=Sternlauch -Azure Bluet=Porzellansternchen -Blue Orchid=Blaue Orchidee -Tall Grass=Hohes Gras -Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.=Hohes Gras ist eine kleine Pflanze, die oft auf Wiesenflächen wächst. Es kann für Weizensamen abgeerntet werden. Mit Knochenmehl lässt sich hohes Gras zu doppelhohem Gras verwandeln. -Fern=Farn -Ferns are small plants which occur naturally in jungles and taigas. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.=Farne sind kleine Pflanzen, die oft in Dschungeln und Taigas vorkommen. Sie können für Weizensamen abgeerntet werden. Mit Knochenmehl lässt sich ein Farn zu einem großen Farn, der zwei Blöcke hoch ist, verwandeln. -(Top Part)=(Oberseite) -Peony=Pfingstrose -A peony is a large plant which occupies two blocks. It is mainly used in dye production.=Eine Pfingstrose ist eine große Pflanze, die zwei Blöcke hoch ist. Sie wird hauptsächlich für die Farbenproduktion gebraucht. -Rose Bush=Rosenbusch -A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production.=Ein Rosenbusch ist eine große Pflanze, die zwei Blöcke hoch ist. Es ist sicher, durch ihn hindurch zu gehen. Er wird hauptsächlich für die Farbenproduktion gebraucht. -Lilac=Flieder -A lilac is a large plant which occupies two blocks. It is mainly used in dye production.=Ein Flieder ist eine große Pflanze, die zwei Blöcke hoch ist. Er wird hauptsächlich für die Farbenproduktion gebraucht. -Sunflower=Sonnenblume -A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.=Eine Sonnenblume ist eine große Pflanze, die zwei Blöcke hoch ist. Sie wird hauptsächlich für die Farbenproduktion gebraucht. -Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.=Doppelhohes Gras ist eine Variante von hohem Gras und nimmt zwei Blöcke an Platz ein. Er kann für Weizensamen abgeerntet werden. -Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.=Ein großer Farn ist eine Variante von Farn und nimmt zwei Blöcke an Platz ein. Er kann für Weizensamen abgeerntet werden. -Double Tallgrass=Doppelhohes Gras -Large Fern=Großer Farn -Lily Pad=Seerosenblatt -A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Ein Seerosenblatt ist eine flache Pflanze, die eine stabile begehbare Oberfläche ist. Sie kann auf Wasserquellen, auf Eis und brüchigem Eis platziert werden. diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.es.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.es.tr deleted file mode 100644 index fbad0c2b18..0000000000 --- a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.es.tr +++ /dev/null @@ -1,34 +0,0 @@ -# textdomain: mcl_flowers -This is a small flower. Small flowers are mainly used for dye production and can also be potted.=Esta es una pequeña flor. Las flores pequeñas se utilizan principalmente para la producción de tinte y también se pueden macetas. -It can only be placed on a block on which it would also survive.=Solo se puede colocar en un bloque en el que también sobreviviría. -Poppy=Amapola -Dandelion=Diente de león -Oxeye Daisy=Margarita -Orange Tulip=Tulipán naranja -Pink Tulip=Tulipán rosa -Red Tulip=Tulipán rojo -White Tulip=Tulipán blanco -Allium=Allium -Azure Bluet=Azul celeste -Blue Orchid=Orquídea azul -Tall Grass=Cesped alto -Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.=El cesped alto es una planta pequeña que a menudo se encuentra en la superficie de los pastizales. Se puede cosechar para semillas de trigo. Mediante el uso de harina de hueso, la hierba alta se puede convertir en hierba alta doble que tiene dos bloques de altura. -Fern=Helecho -Ferns are small plants which occur naturally in jungles and taigas. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.=Los helechos son plantas pequeñas que se producen naturalmente en las selvas y taigas. Se pueden cosechar para semillas de trigo. Al usar harina de hueso, un helecho se puede convertir en un helecho grande que tiene dos bloques de altura. -(Top Part)=(Parte superior) -Peony=Peonía -A peony is a large plant which occupies two blocks. It is mainly used in dye production.=Una peonía es una planta grande que ocupa dos bloques. Se utiliza principalmente en la protección del tinte. -# ^^^ OLD TRANSLATION FOR ABOVE: Una peonía es una planta grande que ocupa dos bloques. Se utiliza principalmente en la protección del tinte. -Rose Bush=Rosal -A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production.= -# ^^^ OLD TRANSLATION FOR ABOVE: Un rosal es una planta grande que ocupa dos bloques. Es seguro tocarlo. Los rosales se utilizan principalmente en la protección del tinte. -Lilac=Lila -A lilac is a large plant which occupies two blocks. It is mainly used in dye production.=Una lila es una planta grande que ocupa dos bloques. Se utiliza principalmente en la producción de tintes. -Sunflower=Girasol -A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.=Un girasol es una planta grande que ocupa dos bloques. Se utiliza principalmente en la producción de tintes. -Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.=Doble hierba alta una variante de hierba alta y ocupa dos bloques. Se puede cosechar para semillas de trigo. -Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.=El helecho grande es una variante del helecho y ocupa dos bloques. Se puede cosechar para semillas de trigo. -Double Tallgrass=Doble hierba alta -Large Fern=Helecho grande -Lily Pad=Nenúfar -A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Un nenúfar es un bloque de planta plano sobre el que se puede caminar. Se pueden colocar en fuentes de agua y hielo. diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.fr.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.fr.tr deleted file mode 100644 index 945a799e2f..0000000000 --- a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.fr.tr +++ /dev/null @@ -1,32 +0,0 @@ -# textdomain: mcl_flowers -This is a small flower. Small flowers are mainly used for dye production and can also be potted.=Ceci est une petite fleur. Les petites fleurs sont principalement utilisées pour la production de teintures et peuvent également être mises en pot. -It can only be placed on a block on which it would also survive.=Elles ne peuvent être placées que sur un bloc sur lequel elles survivraient également. -Poppy=Coquelicot -Dandelion=Pisselit -Oxeye Daisy=Marguerite -Orange Tulip=Tulipe Orange -Pink Tulip=Tulipe Rose -Red Tulip=Tulipe Rouge -White Tulip=Tulipe Blanche -Allium=Allium -Azure Bluet=Houstonie Bleue -Blue Orchid=Orchidée Bleue -Tall Grass=Hautes herbes -Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.=L'herbe haute est une petite plante qui se rencontre souvent à la surface des prairies. Il peut être récolté pour les graines de blé. En utilisant de la farine d'os, les hautes herbes peuvent être transformées en herbes hautes doubles de deux blocs de hauteur. -Fern=Fougère -Ferns are small plants which occur naturally in jungles and taigas. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.=Les fougères sont de petites plantes qui se produisent naturellement dans les jungles et les taigas. Ils peuvent être récoltés pour les graines de blé. En utilisant de la farine d'os, une fougère peut être transformée en une grande fougère haute de deux blocs. -(Top Part)=(Partie supérieure) -Peony=Pivoine -A peony is a large plant which occupies two blocks. It is mainly used in dye production.=Une pivoine est une grande plante qui occupe deux blocs. Principalement utilisé dans la production de colorants. -Rose Bush=Rosier -A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production.=Un rosier est une grande plante qui occupe deux blocs. Il n'y a rien a craindre à le toucher. Les rosiers sont principalement utilisés dans la production de teinture. -Lilac=Lilas -A lilac is a large plant which occupies two blocks. It is mainly used in dye production.=Un lilas est une grande plante qui occupe deux blocs. Il est principalement utilisé dans la production de colorants. -Sunflower=Tournesol -A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.=Un tournesol est une grande plante qui occupe deux blocs. Il est principalement utilisé dans la production de colorants. -Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.=La grande herbe haute une variante de l'herbe haute et occupe deux blocs. Elle peut être récoltée pour les graines de blé. -Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.=La grande fougère est une variante de la fougère et occupe deux blocs. Elle peut être récoltée pour les graines de blé. -Double Tallgrass=Grande Herbe -Large Fern=Grande Fougère -Lily Pad=Nénuphar -A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Un nénuphar est un bloc de plante plat sur lequel on peut marcher. Ils peuvent être placés sur des sources d'eau, de la glace et de la glace givrée. diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.pl.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.pl.tr deleted file mode 100644 index 828eea96ae..0000000000 --- a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.pl.tr +++ /dev/null @@ -1,32 +0,0 @@ -# textdomain: mcl_flowers -This is a small flower. Small flowers are mainly used for dye production and can also be potted.=To jest mały kwiat. Małe kwiaty są głównie wykorzystywane do tworzenia farb oraz do ustawiania w doniczkach. -It can only be placed on a block on which it would also survive.=Może być postawiony tylko na blokach na których jest w stanie przeżyć. -Poppy=Mak -Dandelion=Mniszek lekarski -Oxeye Daisy=Stokrotka -Orange Tulip=Pomarańczowy tulipan -Pink Tulip=Różowy tulipan -Red Tulip=Czerwony tulipan -White Tulip=Biały tulipan -Allium=Czosnek -Azure Bluet=Houstonia błękitna -Blue Orchid=Niebieska orchidea -Tall Grass=Wysoka trawa -Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.=Wysoka trawa jest małą rośliną często występująca na trawiastych biomach. Mogą z nich wypaść nasiona. Używając mączki kostnej można ją zamienić w podwójnie wysoką trawę, która ma dwa bloki wysokości. -Fern=Paproć -Ferns are small plants which occur naturally in jungles and taigas. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.=Paprocie to małe rośliny występujące naturalnie w tropikach i tajgach. Mogą z nich wypaść nasiona. Używając mączki kostnej można je zamienić w duże paprocie, które mają dwa bloki wysokości. -(Top Part)=(Górna część) -Peony=Piwonia -A peony is a large plant which occupies two blocks. It is mainly used in dye production.=Piwonia jest dużą rośliną zajmującą dwa bloki. Jest głównie używana jako źródło farby. -Rose Bush=Krzew róży. -A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production.=Krzew róży jest dużą rośliną zajmującą dwa bloki. Można go dotykać. Jest głównie używana jako źródło farby. -Lilac=Bez -A lilac is a large plant which occupies two blocks. It is mainly used in dye production.=Bez jest dużą rośliną zajmującą dwa bloki. Jest głównie używana jako źródło farby. -Sunflower=Słonecznik -A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.=Słonecznik jest dużą rośliną zajmującą dwa bloki. Jest głównie używana jako źródło farby. -Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.=Podwójna wysoka trawa jest dużą rośliną zajmującą dwa bloki. Mogą z niej wypaść nasiona zboża. -Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.=Duża paproć jest dużą rośliną zajmującą dwa bloki. Mogą z niej wypaść nasiona zboża. -Double Tallgrass=Podwójnie wysoka trawa -Large Fern=Duża paproć -Lily Pad=Lilia wodna -A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Lilia wodna jest płaską rośliną po której można chodzić. Można je stawiać na źródłach wody, lodzie i oszronionym lodzie. diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.ru.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.ru.tr deleted file mode 100644 index f5cb5e18db..0000000000 --- a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.ru.tr +++ /dev/null @@ -1,32 +0,0 @@ -# textdomain: mcl_flowers -This is a small flower. Small flowers are mainly used for dye production and can also be potted.=Это небольшой цветок. Такие цветы в основном используются для производства красителей. Их можно садить в горшки. -It can only be placed on a block on which it would also survive.=Его можно высаживать только на те блоки, на которых он может расти. -Poppy=Мак -Dandelion=Одуванчик -Oxeye Daisy=Нивяник обыкновенный -Orange Tulip=Оранжевый тюльпан -Pink Tulip=Розовый тюльпан -Red Tulip=Красный тюльпан -White Tulip=Белый тюльпан -Allium=Лук -Azure Bluet=Хоустония Альба -Blue Orchid=Голубая орхидея -Tall Grass=Высокая трава -Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.=Высокая трава это маленькое растение, часто встречающееся на поверхности лугов. Их можно собирать, добывая семена пшеницы. С помощью костной муки высокая трава может быть превращена в двойную высокую траву (2 блока в высоту). -Fern=Папоротник -Ferns are small plants which occur naturally in jungles and taigas. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.=Папоротники - маленькие растения, встречающиеся в тайге и джунглях. Их можно собирать, добывая семена пшеницы. С помощью костной муки папоротник может быть превращён в большой папоротник высотой в два блока. -(Top Part)=(верхняя часть) -Peony=Пион -A peony is a large plant which occupies two blocks. It is mainly used in dye production.=Пион - большое растение, занимающее два блока. В основном используется для производства красителя. -Rose Bush=Розовый куст -A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production.=Розовый куст - большое растение, занимающее два блока. Трогать его не опасно. В основном используется для производства красителя. -Lilac=Сирень -A lilac is a large plant which occupies two blocks. It is mainly used in dye production.=Сирень - большое растение, занимающее два блока. В основном используется для производства красителя. -Sunflower=Подсолнух -A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.=Подсолнух - большое растение, занимающее два блока. В основном используется для производства красителя. -Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.=Двойная высокая трава - большое растение, занимающее два блока. Её можно собирать, добывая семена пшеницы. -Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.=Большой папоротник - вид папоротника, занимающий два блока. Его можно собирать, добывая семена пшеницы. -Double Tallgrass=Двойная высокая трава -Large Fern=Большой папоротник -Lily Pad=Лилия -A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Лилия это плоский растительный блок, по которому можно ходить. Он размещается на водных источниках, а также на льду и замороженном льду. diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.zh_TW.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.zh_TW.tr deleted file mode 100644 index b8fb0cbe4c..0000000000 --- a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.zh_TW.tr +++ /dev/null @@ -1,32 +0,0 @@ -# textdomain: mcl_flowers -This is a small flower. Small flowers are mainly used for dye production and can also be potted.= -It can only be placed on a block on which it would also survive.= -Poppy=罌粟 -Dandelion=蒲公英 -Oxeye Daisy=雛菊 -Orange Tulip=橙色鬱金香 -Pink Tulip=粉紅色鬱金香 -Red Tulip=紅色鬱金香 -White Tulip=白色鬱金香 -Allium=紫紅球花 -Azure Bluet=藍花美耳草 -Blue Orchid=藍色蝴蝶蘭 -Tall Grass=草 -Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.=草是一種小植物,經常出現在草原的表面。它可以收穫小麥的種子。通過使用骨粉,高草可以變成兩塊高的芒草。 -Fern=蕨 -Ferns are small plants which occur naturally in jungles and taigas. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.=蕨是自然存在於叢林和台地的小型植物。它們可以被收割為小麥種子。通過使用骨粉,可以把蕨變成兩塊高的高蕨。 -(Top Part)=(上部分) -Peony=牡丹花 -A peony is a large plant which occupies two blocks. It is mainly used in dye production.=牡丹花是一種大型植物,共有兩格高。它主要用於染料生產。 -Rose Bush=玫瑰叢 -A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production.=玫瑰叢是一種大型植物,共有兩格高。觸摸它是安全的。玫瑰叢主要用於染料生產。 -Lilac=紫丁香 -A lilac is a large plant which occupies two blocks. It is mainly used in dye production.=紫丁香是一種大型植物,共有兩格高。它主要用於染料生產。 -Sunflower=向日葵 -A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.=向日葵是一種大型植物,共有兩格高。它主要用於染料生產。 -Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.=芒草是草的兩格高變種。可以收割小麥種子。 -Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.=高蕨是蕨的兩格高變種。可以收割小麥種子。 -Double Tallgrass=芒草 -Large Fern=高蕨 -Lily Pad=荷葉 -A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=荷葉是一種平坦的植物方塊,可以在上面行走。它們可以放在水源、冰面和結霜的冰面上。 diff --git a/mods/ITEMS/mcl_flowers/locale/template.txt b/mods/ITEMS/mcl_flowers/locale/template.txt deleted file mode 100644 index 53a6e74952..0000000000 --- a/mods/ITEMS/mcl_flowers/locale/template.txt +++ /dev/null @@ -1,32 +0,0 @@ -# textdomain: mcl_flowers -This is a small flower. Small flowers are mainly used for dye production and can also be potted.= -It can only be placed on a block on which it would also survive.= -Poppy= -Dandelion= -Oxeye Daisy= -Orange Tulip= -Pink Tulip= -Red Tulip= -White Tulip= -Allium= -Azure Bluet= -Blue Orchid= -Tall Grass= -Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.= -Fern= -Ferns are small plants which occur naturally in jungles and taigas. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.= -(Top Part)= -Peony= -A peony is a large plant which occupies two blocks. It is mainly used in dye production.= -Rose Bush= -A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production.= -Lilac= -A lilac is a large plant which occupies two blocks. It is mainly used in dye production.= -Sunflower= -A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.= -Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.= -Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.= -Double Tallgrass= -Large Fern= -Lily Pad= -A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.= diff --git a/mods/ITEMS/mcl_flowers/mod.conf b/mods/ITEMS/mcl_flowers/mod.conf deleted file mode 100644 index b309ac22e8..0000000000 --- a/mods/ITEMS/mcl_flowers/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name=mcl_flowers -depends=mcl_core, mcl_util, mcl_sounds -optional_depends=screwdriver, doc, mcl_flowerpots \ No newline at end of file diff --git a/mods/ITEMS/mcl_flowers/register.lua b/mods/ITEMS/mcl_flowers/register.lua deleted file mode 100644 index b45f3e1ee7..0000000000 --- a/mods/ITEMS/mcl_flowers/register.lua +++ /dev/null @@ -1,62 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -mcl_flowers.register_simple_flower("poppy", { - desc = S("Poppy"), - image = "mcl_flowers_poppy.png", - selection_box = { -5/16, -0.5, -5/16, 5/16, 5/16, 5/16 }, - potted = true, -}) -mcl_flowers.register_simple_flower("dandelion", { - desc = S("Dandelion"), - image = "flowers_dandelion_yellow.png", - selection_box = { -4/16, -0.5, -4/16, 4/16, 3/16, 4/16 }, - potted = true, -}) -mcl_flowers.register_simple_flower("oxeye_daisy", { - desc = S("Oxeye Daisy"), - image = "mcl_flowers_oxeye_daisy.png", - selection_box = { -4/16, -0.5, -4/16, 4/16, 4/16, 4/16 }, - potted = true, -}) -mcl_flowers.register_simple_flower("tulip_orange", { - desc = S("Orange Tulip"), - image = "flowers_tulip.png", - selection_box = { -3/16, -0.5, -3/16, 3/16, 5/16, 3/16 }, - potted = true, -}) -mcl_flowers.register_simple_flower("tulip_pink", { - desc = S("Pink Tulip"), - image = "mcl_flowers_tulip_pink.png", - selection_box = { -3/16, -0.5, -3/16, 3/16, 5/16, 3/16 }, - potted = true, -}) -mcl_flowers.register_simple_flower("tulip_red", { - desc = S("Red Tulip"), - image = "mcl_flowers_tulip_red.png", - selection_box = { -3/16, -0.5, -3/16, 3/16, 6/16, 3/16 }, - potted = true, -}) -mcl_flowers.register_simple_flower("tulip_white", { - desc = S("White Tulip"), - image = "mcl_flowers_tulip_white.png", - selection_box = { -3/16, -0.5, -3/16, 3/16, 4/16, 3/16 }, - potted = true, -}) -mcl_flowers.register_simple_flower("allium", { - desc = S("Allium"), - image = "mcl_flowers_allium.png", - selection_box = { -3/16, -0.5, -3/16, 3/16, 6/16, 3/16 }, - potted = true, -}) -mcl_flowers.register_simple_flower("azure_bluet", { - desc = S("Azure Bluet"), - image = "mcl_flowers_azure_bluet.png", - selection_box = { -5/16, -0.5, -5/16, 5/16, 3/16, 5/16 }, - potted = true, -}) -mcl_flowers.register_simple_flower("blue_orchid", { - desc = S("Blue Orchid"), - image = "mcl_flowers_blue_orchid.png", - selection_box = { -5/16, -0.5, -5/16, 5/16, 7/16, 5/16 }, - potted = true, -}) \ No newline at end of file diff --git a/mods/ITEMS/mcl_flowers/textures/flowers_dandelion_yellow.png b/mods/ITEMS/mcl_flowers/textures/flowers_dandelion_yellow.png deleted file mode 100644 index 3ba281d4de..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/flowers_dandelion_yellow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/flowers_tulip.png b/mods/ITEMS/mcl_flowers/textures/flowers_tulip.png deleted file mode 100644 index 5ea741120b..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/flowers_tulip.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/flowers_waterlily.png b/mods/ITEMS/mcl_flowers/textures/flowers_waterlily.png deleted file mode 100644 index 53b13f25bd..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/flowers_waterlily.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_allium.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_allium.png deleted file mode 100644 index db5f8206ed..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_allium.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_azure_bluet.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_azure_bluet.png deleted file mode 100644 index e84d347e55..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_azure_bluet.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_blue_orchid.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_blue_orchid.png deleted file mode 100644 index c5ddf11cc1..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_blue_orchid.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_bottom.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_bottom.png deleted file mode 100644 index 84427db2d3..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_bottom.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_inv.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_inv.png deleted file mode 100644 index 5bc4aa7958..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_inv.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_top.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_top.png deleted file mode 100644 index 5d503f85b2..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_fern_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_bottom.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_bottom.png deleted file mode 100644 index fc42bb20e7..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_bottom.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_inv.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_inv.png deleted file mode 100644 index 6f53fac563..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_inv.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_top.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_top.png deleted file mode 100644 index 2dbe8aa3cb..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_grass_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_paeonia_bottom.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_paeonia_bottom.png deleted file mode 100644 index e942cb8b90..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_paeonia_bottom.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_paeonia_top.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_paeonia_top.png deleted file mode 100644 index 6f34148c37..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_paeonia_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_rose_bottom.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_rose_bottom.png deleted file mode 100644 index 13170e669c..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_rose_bottom.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_rose_top.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_rose_top.png deleted file mode 100644 index c10d2b08c2..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_rose_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_back.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_back.png deleted file mode 100644 index 3bf3717759..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_back.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_bottom.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_bottom.png deleted file mode 100644 index 4f169a8430..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_bottom.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_front.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_front.png deleted file mode 100644 index 6263dbe93c..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_front.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_top.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_top.png deleted file mode 100644 index c86d84e70d..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_sunflower_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_syringa_bottom.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_syringa_bottom.png deleted file mode 100644 index ac6a2146b3..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_syringa_bottom.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_syringa_top.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_syringa_top.png deleted file mode 100644 index ca478a3f84..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_double_plant_syringa_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_fern.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_fern.png deleted file mode 100644 index 7850e9a81d..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_fern.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_fern_inv.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_fern_inv.png deleted file mode 100644 index 3041c3178c..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_fern_inv.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_oxeye_daisy.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_oxeye_daisy.png deleted file mode 100644 index 0f4759958d..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_oxeye_daisy.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_poppy.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_poppy.png deleted file mode 100644 index a88cf15166..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_poppy.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tallgrass.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tallgrass.png deleted file mode 100644 index 5ab4b00f72..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tallgrass.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tallgrass_inv.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tallgrass_inv.png deleted file mode 100644 index 3481b46d41..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tallgrass_inv.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tulip_pink.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tulip_pink.png deleted file mode 100644 index 4513b99529..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tulip_pink.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tulip_red.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tulip_red.png deleted file mode 100644 index 41d4c66432..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tulip_red.png and /dev/null differ diff --git a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tulip_white.png b/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tulip_white.png deleted file mode 100644 index ba7e2a1b60..0000000000 Binary files a/mods/ITEMS/mcl_flowers/textures/mcl_flowers_tulip_white.png and /dev/null differ diff --git a/mods/ITEMS/mcl_furnaces/README.md b/mods/ITEMS/mcl_furnaces/README.md deleted file mode 100644 index c7282124b8..0000000000 --- a/mods/ITEMS/mcl_furnaces/README.md +++ /dev/null @@ -1,12 +0,0 @@ -Furnaces for MineClone 2. -Heavily based on Minetest Game (default/furnace.lua). - -License of source code ----------------------- -LGPLv2.1 -Based on code from Minetest Game. -Modified by Wuzzy. - -License of media ----------------- -See the main MineClone 2 README.md file. diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua deleted file mode 100644 index 59cfe78588..0000000000 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ /dev/null @@ -1,609 +0,0 @@ - -local S = minetest.get_translator(minetest.get_current_modname()) - -local LIGHT_ACTIVE_FURNACE = 13 - --- --- Formspecs --- - -local function active_formspec(fuel_percent, item_percent) - return "size[9,8.75]".. - "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Furnace"))).."]".. - "list[context;src;2.75,0.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. - "list[context;fuel;2.75,2.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. - "list[context;dst;5.75,1.5;1,1;]".. - mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. - "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. - (100-fuel_percent)..":default_furnace_fire_fg.png]".. - "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[lowpart:".. - (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. - -- Craft guide button temporarily removed due to Minetest bug. - -- TODO: Add it back when the Minetest bug is fixed. - --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. - --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. - "listring[context;dst]".. - "listring[current_player;main]".. - "listring[context;src]".. - "listring[current_player;main]".. - "listring[context;fuel]".. - "listring[current_player;main]" -end - -local inactive_formspec = "size[9,8.75]".. - "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Furnace"))).."]".. - "list[context;src;2.75,0.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. - "list[context;fuel;2.75,2.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. - "list[context;dst;5.75,1.5;1,1;]".. - mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. - "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. - "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[transformR270]".. - -- Craft guide button temporarily removed due to Minetest bug. - -- TODO: Add it back when the Minetest bug is fixed. - --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. - --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. - "listring[context;dst]".. - "listring[current_player;main]".. - "listring[context;src]".. - "listring[current_player;main]".. - "listring[context;fuel]".. - "listring[current_player;main]" - -local receive_fields = function(pos, formname, fields, sender) - if fields.craftguide then - mcl_craftguide.show(sender:get_player_name()) - end -end - -local function give_xp(pos, player) - local meta = minetest.get_meta(pos) - local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2),-1.95) - local xp = meta:get_int("xp") - if xp > 0 then - if player then - mcl_experience.add_xp(player, xp) - else - mcl_experience.throw_xp(vector.add(pos, dir), xp) - end - meta:set_int("xp", 0) - end -end - --- --- Node callback functions that are the same for active and inactive furnace --- - -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if listname == "fuel" then - -- Special case: empty bucket (not a fuel, but used for sponge drying) - if stack:get_name() == "mcl_buckets:bucket_empty" then - if inv:get_stack(listname, index):get_count() == 0 then - return 1 - else - return 0 - end - end - - -- Test stack with size 1 because we burn one fuel at a time - local teststack = ItemStack(stack) - teststack:set_count(1) - local output, decremented_input = minetest.get_craft_result({method="fuel", width=1, items={teststack}}) - if output.time ~= 0 then - -- Only allow to place 1 item if fuel get replaced by recipe. - -- This is the case for lava buckets. - local replace_item = decremented_input.items[1] - if replace_item:is_empty() then - -- For most fuels, just allow to place everything - return stack:get_count() - else - if inv:get_stack(listname, index):get_count() == 0 then - return 1 - else - return 0 - end - end - else - return 0 - end - elseif listname == "src" then - return stack:get_count() - elseif listname == "dst" then - return 0 - end -end - -local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local stack = inv:get_stack(from_list, from_index) - return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) -end - -local function allow_metadata_inventory_take(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end - return stack:get_count() -end - -local function on_metadata_inventory_take(pos, listname, index, stack, player) - -- Award smelting achievements - if listname == "dst" then - if stack:get_name() == "mcl_core:iron_ingot" then - awards.unlock(player:get_player_name(), "mcl:acquireIron") - elseif stack:get_name() == "mcl_fishing:fish_cooked" then - awards.unlock(player:get_player_name(), "mcl:cookFish") - end - give_xp(pos, player) - end -end - -local function on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - if from_list == "dst" then - give_xp(pos, player) - end -end - -local function spawn_flames(pos, param2) - local minrelpos, maxrelpos - local dir = minetest.facedir_to_dir(param2) - if dir.x > 0 then - minrelpos = { x = -0.6, y = -0.05, z = -0.25 } - maxrelpos = { x = -0.55, y = -0.45, z = 0.25 } - elseif dir.x < 0 then - minrelpos = { x = 0.55, y = -0.05, z = -0.25 } - maxrelpos = { x = 0.6, y = -0.45, z = 0.25 } - elseif dir.z > 0 then - minrelpos = { x = -0.25, y = -0.05, z = -0.6 } - maxrelpos = { x = 0.25, y = -0.45, z = -0.55 } - elseif dir.z < 0 then - minrelpos = { x = -0.25, y = -0.05, z = 0.55 } - maxrelpos = { x = 0.25, y = -0.45, z = 0.6 } - else - return - end - mcl_particles.add_node_particlespawner(pos, { - amount = 4, - time = 0, - minpos = vector.add(pos, minrelpos), - maxpos = vector.add(pos, maxrelpos), - minvel = { x = -0.01, y = 0, z = -0.01 }, - maxvel = { x = 0.01, y = 0.1, z = 0.01 }, - minexptime = 0.3, - maxexptime = 0.6, - minsize = 0.4, - maxsize = 0.8, - texture = "mcl_particles_flame.png", - glow = LIGHT_ACTIVE_FURNACE, - }, "low") -end - -local function swap_node(pos, name) - local node = minetest.get_node(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) - if name == "mcl_furnaces:furnace_active" then - spawn_flames(pos, node.param2) - else - mcl_particles.delete_node_particlespawners(pos) - end -end - -local function furnace_reset_delta_time(pos) - local meta = minetest.get_meta(pos) - local time_speed = tonumber(minetest.settings:get("time_speed") or 72) - if (time_speed < 0.1) then - return - end - local time_multiplier = 86400 / time_speed - local current_game_time = .0 + ((minetest.get_day_count() + minetest.get_timeofday()) * time_multiplier) - - -- TODO: Change meta:get/set_string() to get/set_float() for "last_gametime". - -- In Windows *_float() works OK but under Linux it returns rounded unusable values like 449540.000000000 - local last_game_time = meta:get_string("last_gametime") - if last_game_time then - last_game_time = tonumber(last_game_time) - end - if not last_game_time or last_game_time < 1 or math.abs(last_game_time - current_game_time) <= 1.5 then - return - end - - meta:set_string("last_gametime", tostring(current_game_time)) -end - -local function furnace_get_delta_time(pos, elapsed) - local meta = minetest.get_meta(pos) - local time_speed = tonumber(minetest.settings:get("time_speed") or 72) - local current_game_time - if (time_speed < 0.1) then - return meta, elapsed - else - local time_multiplier = 86400 / time_speed - current_game_time = .0 + ((minetest.get_day_count() + minetest.get_timeofday()) * time_multiplier) - end - - local last_game_time = meta:get_string("last_gametime") - if last_game_time then - last_game_time = tonumber(last_game_time) - end - if not last_game_time or last_game_time < 1 then - last_game_time = current_game_time - 0.1 - elseif last_game_time == current_game_time then - current_game_time = current_game_time + 1.0 - end - - local elapsed_game_time = .0 + current_game_time - last_game_time - - meta:set_string("last_gametime", tostring(current_game_time)) - - return meta, elapsed_game_time -end - -local function furnace_node_timer(pos, elapsed) - -- - -- Inizialize metadata - -- - local meta, elapsed_game_time = furnace_get_delta_time(pos, elapsed) - - local fuel_time = meta:get_float("fuel_time") or 0 - local src_time = meta:get_float("src_time") or 0 - local src_item = meta:get_string("src_item") or "" - local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 - - local inv = meta:get_inventory() - local srclist, fuellist - - local cookable, cooked - local active = true - local fuel - - srclist = inv:get_list("src") - fuellist = inv:get_list("fuel") - - -- Check if src item has been changed - if srclist[1]:get_name() ~= src_item then - -- Reset cooking progress in this case - src_time = 0 - src_item = srclist[1]:get_name() - end - - local update = true - while elapsed_game_time > 0.00001 and update do - -- - -- Cooking - -- - - local el = elapsed_game_time - - -- Check if we have cookable content: cookable - local aftercooked - cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) - cookable = cooked.time ~= 0 - if cookable then - -- Successful cooking requires space in dst slot and time - if not inv:room_for_item("dst", cooked.item) then - cookable = false - end - end - - if cookable then -- fuel lasts long enough, adjust el to cooking duration - el = math.min(el, cooked.time - src_time) - end - - -- Check if we have enough fuel to burn - active = fuel_time < fuel_totaltime - if cookable and not active then - -- We need to get new fuel - local afterfuel - fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) - - if fuel.time == 0 then - -- No valid fuel in fuel list -- stop - fuel_totaltime = 0 - src_time = 0 - update = false - else - -- Take fuel from fuel list - inv:set_stack("fuel", 1, afterfuel.items[1]) - fuel_time = 0 - fuel_totaltime = fuel.time - el = math.min(el, fuel_totaltime) - active = true - fuellist = inv:get_list("fuel") - end - elseif active then - el = math.min(el, fuel_totaltime - fuel_time) - -- The furnace is currently active and has enough fuel - fuel_time = fuel_time + el - end - - -- If there is a cookable item then check if it is ready yet - if cookable and active then - src_time = src_time + el - -- Place result in dst list if done - if src_time >= cooked.time then - inv:add_item("dst", cooked.item) - inv:set_stack("src", 1, aftercooked.items[1]) - - -- Unique recipe: Pour water into empty bucket after cooking wet sponge successfully - if inv:get_stack("fuel", 1):get_name() == "mcl_buckets:bucket_empty" then - if srclist[1]:get_name() == "mcl_sponges:sponge_wet" then - inv:set_stack("fuel", 1, "mcl_buckets:bucket_water") - fuellist = inv:get_list("fuel") - -- Also for river water - elseif srclist[1]:get_name() == "mcl_sponges:sponge_wet_river_water" then - inv:set_stack("fuel", 1, "mcl_buckets:bucket_river_water") - fuellist = inv:get_list("fuel") - end - end - - srclist = inv:get_list("src") - src_time = 0 - - meta:set_int("xp", meta:get_int("xp") + 1) -- ToDo give each recipe an idividial XP count - end - end - - elapsed_game_time = elapsed_game_time - el - end - - if fuel and fuel_totaltime > fuel.time then - fuel_totaltime = fuel.time - end - if srclist and srclist[1]:is_empty() then - src_time = 0 - end - - -- - -- Update formspec and node - -- - local formspec = inactive_formspec - local item_percent = 0 - if cookable then - item_percent = math.floor(src_time / cooked.time * 100) - end - - local result = false - - if active then - local fuel_percent = 0 - if fuel_totaltime > 0 then - fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) - end - formspec = active_formspec(fuel_percent, item_percent) - swap_node(pos, "mcl_furnaces:furnace_active") - -- make sure timer restarts automatically - result = true - else - swap_node(pos, "mcl_furnaces:furnace") - -- stop timer on the inactive furnace - minetest.get_node_timer(pos):stop() - end - - -- - -- Set meta values - -- - meta:set_float("fuel_totaltime", fuel_totaltime) - meta:set_float("fuel_time", fuel_time) - meta:set_float("src_time", src_time) - if srclist then - meta:set_string("src_item", src_item) - else - meta:set_string("src_item", "") - end - meta:set_string("formspec", formspec) - - return result -end - -local on_rotate, after_rotate_active -if minetest.get_modpath("screwdriver") then - on_rotate = screwdriver.rotate_simple - after_rotate_active = function(pos) - local node = minetest.get_node(pos) - mcl_particles.delete_node_particlespawners(pos) - if node.name == "mcl_furnaces:furnace" then - return - end - spawn_flames(pos, node.param2) - end -end - -minetest.register_node("mcl_furnaces:furnace", { - description = S("Furnace"), - _tt_help = S("Uses fuel to smelt or cook items"), - _doc_items_longdesc = S("Furnaces cook or smelt several items, using a furnace fuel, into something else."), - _doc_items_usagehelp = - S([[ - Use the furnace to open the furnace menu. - Place a furnace fuel in the lower slot and the source material in the upper slot. - The furnace will slowly use its fuel to smelt the item. - The result will be placed into the output slot at the right side. - ]]).."\n".. - S("Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn."), - _doc_items_hidden = false, - tiles = { - "default_furnace_top.png", "default_furnace_bottom.png", - "default_furnace_side.png", "default_furnace_side.png", - "default_furnace_side.png", "default_furnace_front.png" - }, - paramtype2 = "facedir", - groups = {pickaxey=1, container=4, deco_block=1, material_stone=1}, - is_ground_content = false, - sounds = mcl_sounds.node_sound_stone_defaults(), - - on_timer = furnace_node_timer, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local meta = minetest.get_meta(pos) - local meta2 = meta:to_table() - meta:from_table(oldmetadata) - local inv = meta:get_inventory() - for _, listname in ipairs({"src", "dst", "fuel"}) do - local stack = inv:get_stack(listname, 1) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - end - meta:from_table(meta2) - end, - - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", inactive_formspec) - local inv = meta:get_inventory() - inv:set_size("src", 1) - inv:set_size("fuel", 1) - inv:set_size("dst", 1) - end, - on_destruct = function(pos) - mcl_particles.delete_node_particlespawners(pos) - give_xp(pos) - end, - - on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - -- Reset accumulated game time when player works with furnace: - furnace_reset_delta_time(pos) - minetest.get_node_timer(pos):start(1.0) - - on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - end, - on_metadata_inventory_put = function(pos) - -- Reset accumulated game time when player works with furnace: - furnace_reset_delta_time(pos) - -- start timer function, it will sort out whether furnace can burn or not. - minetest.get_node_timer(pos):start(1.0) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - -- Reset accumulated game time when player works with furnace: - furnace_reset_delta_time(pos) - -- start timer function, it will helpful if player clears dst slot - minetest.get_node_timer(pos):start(1.0) - - on_metadata_inventory_take(pos, listname, index, stack, player) - end, - - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_take = allow_metadata_inventory_take, - on_receive_fields = receive_fields, - _mcl_blast_resistance = 3.5, - _mcl_hardness = 3.5, - on_rotate = on_rotate, -}) - -minetest.register_node("mcl_furnaces:furnace_active", { - description = S("Burning Furnace"), - _doc_items_create_entry = false, - tiles = { - "default_furnace_top.png", "default_furnace_bottom.png", - "default_furnace_side.png", "default_furnace_side.png", - "default_furnace_side.png", "default_furnace_front_active.png", - }, - paramtype2 = "facedir", - paramtype = "light", - light_source = LIGHT_ACTIVE_FURNACE, - drop = "mcl_furnaces:furnace", - groups = {pickaxey=1, container=4, deco_block=1, not_in_creative_inventory=1, material_stone=1}, - is_ground_content = false, - sounds = mcl_sounds.node_sound_stone_defaults(), - on_timer = furnace_node_timer, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local meta = minetest.get_meta(pos) - local meta2 = meta - meta:from_table(oldmetadata) - local inv = meta:get_inventory() - for _, listname in ipairs({"src", "dst", "fuel"}) do - local stack = inv:get_stack(listname, 1) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - end - meta:from_table(meta2:to_table()) - end, - - on_construct = function(pos) - local node = minetest.get_node(pos) - spawn_flames(pos, node.param2) - end, - on_destruct = function(pos) - mcl_particles.delete_node_particlespawners(pos) - give_xp(pos) - end, - - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_take = allow_metadata_inventory_take, - on_metadata_inventory_move = on_metadata_inventory_move, - on_metadata_inventory_take = on_metadata_inventory_take, - on_receive_fields = receive_fields, - _mcl_blast_resistance = 3.5, - _mcl_hardness = 3.5, - on_rotate = on_rotate, - after_rotate = after_rotate_active, -}) - -minetest.register_craft({ - output = "mcl_furnaces:furnace", - recipe = { - { "group:cobble", "group:cobble", "group:cobble" }, - { "group:cobble", "", "group:cobble" }, - { "group:cobble", "group:cobble", "group:cobble" }, - } -}) - --- Add entry alias for the Help -if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_furnaces:furnace", "nodes", "mcl_furnaces:furnace_active") -end - -minetest.register_lbm({ - label = "Active furnace flame particles", - name = "mcl_furnaces:flames", - nodenames = {"mcl_furnaces:furnace_active"}, - run_at_every_load = true, - action = function(pos, node) - spawn_flames(pos, node.param2) - end, -}) - --- Legacy -minetest.register_lbm({ - label = "Update furnace formspecs (0.60.0)", - name = "mcl_furnaces:update_formspecs_0_60_0", - -- Only update inactive furnaces because active ones should update themselves - nodenames = { "mcl_furnaces:furnace" }, - run_at_every_load = false, - action = function(pos, node) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", inactive_formspec) - end, -}) diff --git a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.de.tr b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.de.tr deleted file mode 100644 index 5e55af7f9f..0000000000 --- a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.de.tr +++ /dev/null @@ -1,9 +0,0 @@ -# textdomain: mcl_furnaces -Furnace=Ofen -Furnaces cook or smelt several items, using a furnace fuel, into something else.=Ofen kochen oder schmelzen diverse Gegenstände, unter Zuhilfenahme eines Brennstoffs, zu etwas anderem. -Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.=Benutzen Sie den Ofen, um das Ofenmenü zu öffnen. Platzieren Sie einen Brennstoff in den unteren Platz und das Quellmaterial in den oberen Platz. Der Ofen wird langsam seinen Brennstoff benutzen, um den Gegenstand zu schmelzen. Das Ergebnis landet im Ausgabeplatz rechts. -Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Benutzen Sie das Rezeptbuch, um zu sehen, was Sie schmelzen können und was Sie als Brennstoff benutzen können und wie lange dieser brennt. -Burning Furnace=Aktiver Ofen -Recipe book=Fertigungsbuch -Inventory=Inventar -Uses fuel to smelt or cook items=Benutzt Brennstoff, um Dinge zu schmelzen oder zu kochen diff --git a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.es.tr b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.es.tr deleted file mode 100644 index 10378c2da3..0000000000 --- a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.es.tr +++ /dev/null @@ -1,8 +0,0 @@ -# textdomain: mcl_furnaces -Furnace=Horno -Furnaces cook or smelt several items, using a furnace fuel, into something else.=Los hornos cocinan u funden varios elementos, utilizando un combustible de horno, en otra cosa. -Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.=Use el horno para abrir el menú del horno. Coloque un combustible de horno en la ranura inferior y el material de origen en la ranura superior. El horno usará lentamente su combustible para fundir el artículo. El resultado se colocará en la ranura de salida en el lado derecho. -Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Use el libro de recetas para ver qué puede crear, qué puede usar como combustible y durante cuánto tiempo se quemará. -Burning Furnace=Horno ardiente -Recipe book=Libro de recetas -Inventory=Inventario diff --git a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.fr.tr b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.fr.tr deleted file mode 100644 index deec7981c7..0000000000 --- a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.fr.tr +++ /dev/null @@ -1,9 +0,0 @@ -# textdomain: mcl_furnaces -Furnace=Four -Furnaces cook or smelt several items, using a furnace fuel, into something else.=Les fours cuisent ou fondent plusieurs articles, en utilisant un combustible de four, dans quelque chose d'autre. -Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.=Utilisez le four pour ouvrir le menu du four. Placez un combustible de four dans la fente inférieure et le matériau source dans la fente supérieure. Le four utilisera lentement son combustible pour fondre l'article. Le résultat sera placé dans la fente de sortie du côté droit. -Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Utilisez le livre de recettes pour voir ce que vous pouvez cuire, ce que vous pouvez utiliser comme carburant et combien de temps il brûlera. -Burning Furnace=Four Allumé -Recipe book=Livre de Recette -Inventory=Inventaire -Uses fuel to smelt or cook items=Utilise du carburant pour fondre ou cuire des articles diff --git a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.pl.tr b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.pl.tr deleted file mode 100644 index a957155ade..0000000000 --- a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.pl.tr +++ /dev/null @@ -1,9 +0,0 @@ -# textdomain: mcl_furnaces -Furnace=Piec -Furnaces cook or smelt several items, using a furnace fuel, into something else.=Piece mogą gotować lub przetapiać niektóre przedmioty, przy użyciu paliwa, w inne przedmioty. -Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.=Kliknij w piec aby otworzyć jego menu. Połóż paliwo w dolnym miejscu a materiał źródłowy w górnym. Piec będzie powoli zużywał paliwo aby przetopić przedmiot. Rezultat pojawi się w miejscu po prawej. -Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Użyj książki receptur aby dowiedzieć się co możesz przetopić, co możesz użyć jako paliwa i na jak długo wystarczy. -Burning Furnace=Palący się piec -Recipe book=Książka receptur -Inventory=Ekwipunek -Uses fuel to smelt or cook items=Zużywa paliwo aby ugotować lub stopić przedmioty diff --git a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.ru.tr b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.ru.tr deleted file mode 100644 index 1ba8732df1..0000000000 --- a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.ru.tr +++ /dev/null @@ -1,9 +0,0 @@ -# textdomain: mcl_furnaces -Furnace=Печь -Furnaces cook or smelt several items, using a furnace fuel, into something else.=В печи готовят или переплавляют предметы, но для этого требуется загрузить топливо. -Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.=[Используйте] печь, чтобы открыть её меню. Положите печное топливо в нижний отсек, а материал-источник в верхний. Печь будет понемногу расходовать топливо для переплавки предмета. Получившийся в результате предмет будет помещён в выходной отсек справа. -Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Используйте книгу рецептов, чтобы узнать, что вы можете переплавить в печи, что сгодится в качестве топлива и как долго будет идти процесс. -Burning Furnace=Горящая печь -Recipe book=Книга рецептов -Inventory=Инвентарь -Uses fuel to smelt or cook items=Расходует топливо для приготовления или переплавки предметов diff --git a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.zh_TW.tr b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.zh_TW.tr deleted file mode 100644 index 447fb835c4..0000000000 --- a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.zh_TW.tr +++ /dev/null @@ -1,9 +0,0 @@ -# textdomain: mcl_furnaces -Furnace=熔爐 -Furnaces cook or smelt several items, using a furnace fuel, into something else.=熔爐用一種爐子燃料將幾種物品烹飪或熔煉成其他東西。 -Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.=使用熔爐打開爐子菜單。將熔爐燃料放在下槽,將源材料放在上槽。熔爐將慢慢地使用它的燃料來熔煉或烹飪物品。其結果將被放入右側的輸出槽中。 -Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=使用合成教學來查看您可以冶煉的東西,可以用作燃料的物品以及可燃燒時間。 -Burning Furnace=燃燒的熔爐 -Recipe book=合成教學 -Inventory=物品欄 -Uses fuel to smelt or cook items=使用燃料來熔煉或烹飪物品 diff --git a/mods/ITEMS/mcl_furnaces/locale/template.txt b/mods/ITEMS/mcl_furnaces/locale/template.txt deleted file mode 100644 index 4f88824b0e..0000000000 --- a/mods/ITEMS/mcl_furnaces/locale/template.txt +++ /dev/null @@ -1,9 +0,0 @@ -# textdomain: mcl_furnaces -Furnace= -Furnaces cook or smelt several items, using a furnace fuel, into something else.= -Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.= -Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.= -Burning Furnace= -Recipe book= -Inventory= -Uses fuel to smelt or cook items= diff --git a/mods/ITEMS/mcl_furnaces/mod.conf b/mods/ITEMS/mcl_furnaces/mod.conf deleted file mode 100644 index fe0b9c2081..0000000000 --- a/mods/ITEMS/mcl_furnaces/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = mcl_furnaces -depends = mcl_init, mcl_formspec, mcl_core, mcl_sounds, mcl_craftguide, mcl_achievements, mcl_particles -optional_depends = doc, screwdriver diff --git a/mods/ITEMS/mcl_furnaces/textures/default_furnace_bottom.png b/mods/ITEMS/mcl_furnaces/textures/default_furnace_bottom.png deleted file mode 100644 index 7844072d54..0000000000 Binary files a/mods/ITEMS/mcl_furnaces/textures/default_furnace_bottom.png and /dev/null differ diff --git a/mods/ITEMS/mcl_furnaces/textures/default_furnace_fire_bg.png b/mods/ITEMS/mcl_furnaces/textures/default_furnace_fire_bg.png deleted file mode 100644 index abeefc0f52..0000000000 Binary files a/mods/ITEMS/mcl_furnaces/textures/default_furnace_fire_bg.png and /dev/null differ diff --git a/mods/ITEMS/mcl_furnaces/textures/default_furnace_fire_fg.png b/mods/ITEMS/mcl_furnaces/textures/default_furnace_fire_fg.png deleted file mode 100644 index e5b3909669..0000000000 Binary files a/mods/ITEMS/mcl_furnaces/textures/default_furnace_fire_fg.png and /dev/null differ diff --git a/mods/ITEMS/mcl_furnaces/textures/default_furnace_front.png b/mods/ITEMS/mcl_furnaces/textures/default_furnace_front.png deleted file mode 100644 index 388addd4e5..0000000000 Binary files a/mods/ITEMS/mcl_furnaces/textures/default_furnace_front.png and /dev/null differ diff --git a/mods/ITEMS/mcl_furnaces/textures/default_furnace_front_active.png b/mods/ITEMS/mcl_furnaces/textures/default_furnace_front_active.png deleted file mode 100644 index c425604d25..0000000000 Binary files a/mods/ITEMS/mcl_furnaces/textures/default_furnace_front_active.png and /dev/null differ diff --git a/mods/ITEMS/mcl_furnaces/textures/default_furnace_side.png b/mods/ITEMS/mcl_furnaces/textures/default_furnace_side.png deleted file mode 100644 index c154414b1c..0000000000 Binary files a/mods/ITEMS/mcl_furnaces/textures/default_furnace_side.png and /dev/null differ diff --git a/mods/ITEMS/mcl_furnaces/textures/default_furnace_top.png b/mods/ITEMS/mcl_furnaces/textures/default_furnace_top.png deleted file mode 100644 index 7844072d54..0000000000 Binary files a/mods/ITEMS/mcl_furnaces/textures/default_furnace_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_furnaces/textures/gui_furnace_arrow_bg.png b/mods/ITEMS/mcl_furnaces/textures/gui_furnace_arrow_bg.png deleted file mode 100644 index 2456a803ea..0000000000 Binary files a/mods/ITEMS/mcl_furnaces/textures/gui_furnace_arrow_bg.png and /dev/null differ diff --git a/mods/ITEMS/mcl_furnaces/textures/gui_furnace_arrow_fg.png b/mods/ITEMS/mcl_furnaces/textures/gui_furnace_arrow_fg.png deleted file mode 100644 index e1407051cf..0000000000 Binary files a/mods/ITEMS/mcl_furnaces/textures/gui_furnace_arrow_fg.png and /dev/null differ diff --git a/mods/ITEMS/mcl_itemframes/README.txt b/mods/ITEMS/mcl_itemframes/README.txt deleted file mode 100644 index d9514a03b7..0000000000 --- a/mods/ITEMS/mcl_itemframes/README.txt +++ /dev/null @@ -1,6 +0,0 @@ -This mod is originally by Zeg9, but heavily modified for MineClone 2. - -Model created by 22i, licensed under the -GNU GPLv3 . - -Source: diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua deleted file mode 100644 index eac5b066b6..0000000000 --- a/mods/ITEMS/mcl_itemframes/init.lua +++ /dev/null @@ -1,346 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -local VISUAL_SIZE = 0.3 - -minetest.register_entity("mcl_itemframes:item",{ - hp_max = 1, - visual = "wielditem", - visual_size = {x=VISUAL_SIZE, y=VISUAL_SIZE}, - physical = false, - pointable = false, - textures = { "blank.png" }, - _texture = "blank.png", - _scale = 1, - - on_activate = function(self, staticdata) - if staticdata and staticdata ~= "" then - local data = staticdata:split(";") - if data and data[1] and data[2] then - self._nodename = data[1] - self._texture = data[2] - if data[3] then - self._scale = data[3] - else - self._scale = 1 - end - end - end - if self._texture then - self.object:set_properties({ - textures={self._texture}, - visual_size={x=VISUAL_SIZE/self._scale, y=VISUAL_SIZE/self._scale}, - }) - end - end, - get_staticdata = function(self) - if self._nodename and self._texture then - local ret = self._nodename .. ";" .. self._texture - if self._scale then - ret = ret .. ";" .. self._scale - end - return ret - end - return "" - end, - - _update_texture = function(self) - if self._texture then - self.object:set_properties({ - textures={self._texture}, - visual_size={x=VISUAL_SIZE/self._scale, y=VISUAL_SIZE/self._scale}, - }) - end - end, -}) - -minetest.register_entity("mcl_itemframes:map", { - initial_properties = { - visual = "upright_sprite", - visual_size = {x = 1, y = 1}, - pointable = false, - physical = false, - collide_with_objects = false, - textures = {"blank.png"}, - }, - on_activate = function(self, staticdata) - self.id = staticdata - mcl_maps.load_map(self.id, function(texture) - -- will not crash even if self.object is invalid by now - self.object:set_properties({textures = {texture}}) - end) - end, - get_staticdata = function(self) - return self.id - end, -}) - - -local facedir = {} -facedir[0] = {x=0,y=0,z=1} -facedir[1] = {x=1,y=0,z=0} -facedir[2] = {x=0,y=0,z=-1} -facedir[3] = {x=-1,y=0,z=0} - -local remove_item_entity = function(pos, node) - if node.name == "mcl_itemframes:item_frame" then - for _, obj in pairs(minetest.get_objects_inside_radius(pos, 0.5)) do - local entity = obj:get_luaentity() - if entity and (entity.name == "mcl_itemframes:item" or entity.name == "mcl_itemframes:map") then - obj:remove() - end - end - end -end - -local update_item_entity = function(pos, node, param2) - remove_item_entity(pos, node) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local item = inv:get_stack("main", 1) - if not item:is_empty() then - if not param2 then - param2 = node.param2 - end - if node.name == "mcl_itemframes:item_frame" then - local posad = facedir[param2] - pos.x = pos.x + posad.x*6.5/16 - pos.y = pos.y + posad.y*6.5/16 - pos.z = pos.z + posad.z*6.5/16 - end - local yaw = math.pi*2 - param2 * math.pi/2 - local map_id = item:get_meta():get_string("mcl_maps:id") - if map_id == "" then - local e = minetest.add_entity(pos, "mcl_itemframes:item") - local lua = e:get_luaentity() - lua._nodename = node.name - local itemname = item:get_name() - if itemname == "" or itemname == nil then - lua._texture = "blank.png" - lua._scale = 1 - else - lua._texture = itemname - local def = minetest.registered_items[itemname] - lua._scale = def and def.wield_scale and def.wield_scale.x or 1 - end - lua:_update_texture() - if node.name == "mcl_itemframes:item_frame" then - e:set_yaw(yaw) - end - else - local e = minetest.add_entity(pos, "mcl_itemframes:map", map_id) - e:set_yaw(yaw) - end - end -end - -local drop_item = function(pos, node, meta, clicker) - local cname = "" - if clicker and clicker:is_player() then - cname = clicker:get_player_name() - end - if node.name == "mcl_itemframes:item_frame" and not minetest.is_creative_enabled(cname) then - local inv = meta:get_inventory() - local item = inv:get_stack("main", 1) - if not item:is_empty() then - minetest.add_item(pos, item) - end - end - meta:set_string("infotext", "") - remove_item_entity(pos, node) -end - -minetest.register_node("mcl_itemframes:item_frame",{ - description = S("Item Frame"), - _tt_help = S("Can hold an item"), - _doc_items_longdesc = S("Item frames are decorative blocks in which items can be placed."), - _doc_items_usagehelp = S("Just place any item on the item frame. Use the item frame again to retrieve the item."), - drawtype = "mesh", - is_ground_content = false, - mesh = "mcl_itemframes_itemframe1facedir.obj", - selection_box = { type = "fixed", fixed = {-6/16, -6/16, 7/16, 6/16, 6/16, 0.5} }, - collision_box = { type = "fixed", fixed = {-6/16, -6/16, 7/16, 6/16, 6/16, 0.5} }, - tiles = {"mcl_itemframes_itemframe_background.png", "mcl_itemframes_itemframe_background.png", "mcl_itemframes_itemframe_background.png", "mcl_itemframes_itemframe_background.png", "default_wood.png", "mcl_itemframes_itemframe_background.png"}, - inventory_image = "mcl_itemframes_item_frame.png", - wield_image = "mcl_itemframes_item_frame.png", - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - groups = { dig_immediate=3,deco_block=1,dig_by_piston=1,container=7,attached_node_facedir=1 }, - sounds = mcl_sounds.node_sound_defaults(), - node_placement_prediction = "", - on_timer = function(pos) - local inv = minetest.get_meta(pos):get_inventory() - local stack = inv:get_stack("main", 1) - local itemname = stack:get_name() - if minetest.get_item_group(itemname, "clock") > 0 then - local new_name = "mcl_clock:clock_" .. (mcl_worlds.clock_works(pos) and mcl_clock.old_time or mcl_clock.random_frame) - if itemname ~= new_name then - stack:set_name(new_name) - inv:set_stack("main", 1, stack) - local node = minetest.get_node(pos) - update_item_entity(pos, node, node.param2) - end - minetest.get_node_timer(pos):start(1.0) - end - end, - on_place = function(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" then - return itemstack - end - - -- Use pointed node's on_rightclick function first, if present - local node = minetest.get_node(pointed_thing.under) - if placer and not placer:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack - end - end - - return minetest.item_place(itemstack, placer, pointed_thing, minetest.dir_to_facedir(vector.direction(pointed_thing.above, pointed_thing.under))) - end, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("main", 1) - end, - on_rightclick = function(pos, node, clicker, itemstack) - if not itemstack then - return - end - local pname = clicker:get_player_name() - if minetest.is_protected(pos, pname) then - minetest.record_protection_violation(pos, pname) - return - end - local meta = minetest.get_meta(pos) - drop_item(pos, node, meta, clicker) - local inv = meta:get_inventory() - if itemstack:is_empty() then - remove_item_entity(pos, node) - meta:set_string("infotext", "") - inv:set_stack("main", 1, "") - return itemstack - end - local put_itemstack = ItemStack(itemstack) - put_itemstack:set_count(1) - local itemname = put_itemstack:get_name() - if minetest.get_item_group(itemname, "compass") > 0 then - put_itemstack:set_name(mcl_compass.get_compass_itemname(pos, minetest.dir_to_yaw(minetest.facedir_to_dir(node.param2)), put_itemstack)) - end - if minetest.get_item_group(itemname, "clock") > 0 then - minetest.get_node_timer(pos):start(1.0) - end - inv:set_stack("main", 1, put_itemstack) - update_item_entity(pos, node) - -- Add node infotext when item has been named - local imeta = itemstack:get_meta() - local iname = imeta:get_string("name") - if iname then - meta:set_string("infotext", iname) - end - - if not minetest.is_creative_enabled(clicker:get_player_name()) then - itemstack:take_item() - end - return itemstack - end, - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - else - return count - end - end, - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - else - return stack:get_count() - end - end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - else - return stack:get_count() - end - end, - on_destruct = function(pos) - local meta = minetest.get_meta(pos) - local node = minetest.get_node(pos) - drop_item(pos, node, meta) - end, - on_rotate = function(pos, node, user, mode, param2) - if mode == screwdriver.ROTATE_FACE then - -- Rotate face - --local meta = minetest.get_meta(pos) - local node = minetest.get_node(pos) - - local objs = nil - if node.name == "mcl_itemframes:item_frame" then - objs = minetest.get_objects_inside_radius(pos, 0.5) - end - if objs then - for _, obj in ipairs(objs) do - if obj and obj:get_luaentity() and obj:get_luaentity().name == "mcl_itemframes:item" then - update_item_entity(pos, node, (node.param2+1) % 4) - break - end - end - end - return - elseif mode == screwdriver.ROTATE_AXIS then - return false - end - end, -}) - -minetest.register_craft({ - output = "mcl_itemframes:item_frame", - recipe = { - {"mcl_core:stick", "mcl_core:stick", "mcl_core:stick"}, - {"mcl_core:stick", "mcl_mobitems:leather", "mcl_core:stick"}, - {"mcl_core:stick", "mcl_core:stick", "mcl_core:stick"}, - } -}) - -minetest.register_lbm({ - label = "Update legacy item frames", - name = "mcl_itemframes:update_legacy_item_frames", - nodenames = {"itemframes:frame"}, - action = function(pos, node) - -- Swap legacy node, then respawn entity - node.name = "mcl_itemframes:item_frame" - local meta = minetest.get_meta(pos) - local item = meta:get_string("item") - minetest.swap_node(pos, node) - if item ~= "" then - local itemstack = ItemStack(minetest.deserialize(meta:get_string("itemdata"))) - local inv = meta:get_inventory() - inv:set_size("main", 1) - if not itemstack:is_empty() then - inv:set_stack("main", 1, itemstack) - end - end - update_item_entity(pos, node) - end, -}) - --- FIXME: Item entities can get destroyed by /clearobjects -minetest.register_lbm({ - label = "Respawn item frame item entities", - name = "mcl_itemframes:respawn_entities", - nodenames = {"mcl_itemframes:item_frame"}, - run_at_every_load = true, - action = function(pos, node) - update_item_entity(pos, node) - end, -}) - -minetest.register_alias("itemframes:frame", "mcl_itemframes:item_frame") diff --git a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.de.tr b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.de.tr deleted file mode 100644 index 07d7812f62..0000000000 --- a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.de.tr +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain: mcl_itemframes -Item Frame=Rahmen -Item frames are decorative blocks in which items can be placed.=Rahmen sind dekorative Blöcke, in denen man Gegenstände platzieren kann. -Just place any item on the item frame. Use the item frame again to retrieve the item.=Platzieren Sie einfach einen beliebigen Gegenstand in den Rahmen. Benutzen Sie den Rahmen erneut, um den Gegenstand zurück zu erhalten. -Can hold an item=Kann einen Gegenstand halten diff --git a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.es.tr b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.es.tr deleted file mode 100644 index 0803234b0b..0000000000 --- a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.es.tr +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain: mcl_itemframes -Item Frame=Marco -Item frames are decorative blocks in which items can be placed.=Los marcos de elementos son bloques decorativos en los que se pueden colocar elementos. -Just place any item on the item frame. Use the item frame again to retrieve the item.=Simplemente coloque cualquier artículo en el marco del artículo. Use el marco del artículo nuevamente para recuperar el artículo. - diff --git a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.fr.tr b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.fr.tr deleted file mode 100644 index 180c5555f6..0000000000 --- a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.fr.tr +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain: mcl_itemframes -Item Frame=Cadre -Item frames are decorative blocks in which items can be placed.=Les cadres sont des blocs décoratifs dans lesquels les objets peuvent être placés. -Just place any item on the item frame. Use the item frame again to retrieve the item.=Placez simplement n'importe quel objet sur le cadre. Utilisez à nouveau le cadre décoré pour récupérer l'élément. -Can hold an item=Peut contenir un objet diff --git a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.pl.tr b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.pl.tr deleted file mode 100644 index 8de889471e..0000000000 --- a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.pl.tr +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain: mcl_itemframes -Item Frame=Ramka na przedmiot -Item frames are decorative blocks in which items can be placed.=Ramki na przedmiot to dekoracyjne bloki w których można umieszczać przedmioty. -Just place any item on the item frame. Use the item frame again to retrieve the item.=Umieść dowolny przedmiot w ramce. Użyj ramki ponownie aby odzyskać przedmiot. -Can hold an item=Może przetrzymywać przedmiot diff --git a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.ru.tr b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.ru.tr deleted file mode 100644 index 7d3d90cc44..0000000000 --- a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.ru.tr +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain: mcl_itemframes -Item Frame=Рамка -Item frames are decorative blocks in which items can be placed.=Рамки это декоративные блоки, в которые можно помещать предметы. -Just place any item on the item frame. Use the item frame again to retrieve the item.=Просто поместите в рамку любой предмет. Используйте рамку вновь, чтобы заполучить из неё предмет обратно. -Can hold an item=Может хранить предмет diff --git a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.zh_TW.tr b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.zh_TW.tr deleted file mode 100644 index d45c14d74b..0000000000 --- a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.zh_TW.tr +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain: mcl_itemframes -Item Frame=物品展示框 -Item frames are decorative blocks in which items can be placed.=物品展示框是可以展示物品的裝飾方塊。 -Just place any item on the item frame. Use the item frame again to retrieve the item.=只需將物品放在物品展示框上即可。再次使用物品展示框來提出物品。 -Can hold an item=可以展示物品 diff --git a/mods/ITEMS/mcl_itemframes/locale/template.txt b/mods/ITEMS/mcl_itemframes/locale/template.txt deleted file mode 100644 index bacbfaa69c..0000000000 --- a/mods/ITEMS/mcl_itemframes/locale/template.txt +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain: mcl_itemframes -Item Frame= -Item frames are decorative blocks in which items can be placed.= -Just place any item on the item frame. Use the item frame again to retrieve the item.= -Can hold an item= diff --git a/mods/ITEMS/mcl_itemframes/mod.conf b/mods/ITEMS/mcl_itemframes/mod.conf deleted file mode 100644 index ff09c3bcc2..0000000000 --- a/mods/ITEMS/mcl_itemframes/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = mcl_itemframes -depends = mcl_core, mcl_sounds, mcl_compass, mcl_maps -optional_depends = screwdriver diff --git a/mods/ITEMS/mcl_itemframes/models/mcl_itemframes_itemframe1facedir.obj b/mods/ITEMS/mcl_itemframes/models/mcl_itemframes_itemframe1facedir.obj deleted file mode 100644 index d0a5b0c5ff..0000000000 --- a/mods/ITEMS/mcl_itemframes/models/mcl_itemframes_itemframe1facedir.obj +++ /dev/null @@ -1,156 +0,0 @@ -# Blender v2.76 (sub 0) OBJ File: 'itemframe1facedir.blend' -# www.blender.org -mtllib itemframe1facedir.mtl -o right.frame_Cube.005 -v -0.313413 -0.313413 0.435326 -v -0.313413 0.313413 0.435326 -v -0.313413 -0.313413 0.498008 -v -0.313413 0.313413 0.498008 -v -0.376095 -0.313413 0.435326 -v -0.376095 0.313413 0.435326 -v -0.376095 -0.313413 0.498008 -v -0.376095 0.313413 0.498008 -vt 0.875000 0.812500 -vt 0.812500 0.812500 -vt 0.812500 0.187500 -vt 0.875000 0.187500 -vt 1.000000 0.812500 -vt 0.937500 0.812500 -vt 0.937500 0.187500 -vt 1.000000 0.187500 -vt -0.000000 0.937500 -vt 0.062500 0.937500 -vt 0.062500 1.000000 -vt -0.000000 1.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.000000 -1.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 1.000000 0.000000 -usemtl None -s off -f 2/1/1 4/2/1 3/3/1 1/4/1 -f 4/1/2 8/2/2 7/3/2 3/4/2 -f 8/5/3 6/6/3 5/7/3 7/8/3 -f 6/1/4 2/2/4 1/3/4 5/4/4 -f 1/9/5 3/10/5 7/11/5 5/12/5 -f 6/9/6 8/10/6 4/11/6 2/12/6 -o left.frame_Cube.004 -v 0.376095 -0.313413 0.435326 -v 0.376095 0.313413 0.435326 -v 0.376095 -0.313413 0.498008 -v 0.376095 0.313413 0.498008 -v 0.313413 -0.313413 0.435326 -v 0.313413 0.313413 0.435326 -v 0.313413 -0.313413 0.498008 -v 0.313413 0.313413 0.498008 -vt 0.875000 0.812500 -vt 0.812500 0.812500 -vt 0.812500 0.187500 -vt 0.875000 0.187500 -vt 1.000000 0.812500 -vt 0.937500 0.812500 -vt 0.937500 0.187500 -vt 1.000000 0.187500 -vt -0.000000 0.937500 -vt 0.062500 0.937500 -vt 0.062500 1.000000 -vt -0.000000 1.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.000000 -1.000000 -vn 0.000000 -1.000000 -0.000000 -vn 0.000000 1.000000 0.000000 -usemtl None -s off -f 10/13/7 12/14/7 11/15/7 9/16/7 -f 12/13/8 16/14/8 15/15/8 11/16/8 -f 16/17/9 14/18/9 13/19/9 15/20/9 -f 14/13/10 10/14/10 9/15/10 13/16/10 -f 9/21/11 11/22/11 15/23/11 13/24/11 -f 14/21/12 16/22/12 12/23/12 10/24/12 -o lower.frame_Cube.003 -v 0.376095 -0.376095 0.435326 -v 0.376095 -0.313413 0.435326 -v 0.376095 -0.376095 0.498008 -v 0.376095 -0.313413 0.498008 -v -0.376095 -0.376095 0.435326 -v -0.376095 -0.313413 0.435326 -v -0.376095 -0.376095 0.498008 -v -0.376095 -0.313413 0.498008 -vt 0.187500 0.187500 -vt 0.125000 0.187500 -vt 0.125000 0.125000 -vt 0.187500 0.125000 -vt 0.875000 0.187500 -vt 0.875000 0.125000 -vt 0.812500 0.187500 -vt 0.812500 0.125000 -vt 0.875000 0.937500 -vt 0.875000 1.000000 -vt 0.125000 1.000000 -vt 0.125000 0.937500 -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.000000 -1.000000 -vn 0.000000 -1.000000 0.000000 -vn 0.000000 1.000000 0.000000 -usemtl None -s off -f 18/25/13 20/26/13 19/27/13 17/28/13 -f 20/29/14 24/26/14 23/27/14 19/30/14 -f 24/29/15 22/31/15 21/32/15 23/30/15 -f 22/29/16 18/26/16 17/27/16 21/30/16 -f 17/33/17 19/34/17 23/35/17 21/36/17 -f 22/30/18 24/29/18 20/26/18 18/27/18 -o upper.frame_Cube.002 -v 0.376095 0.313413 0.435326 -v 0.376095 0.376095 0.435326 -v 0.376095 0.313413 0.498008 -v 0.376095 0.376095 0.498008 -v -0.376095 0.313413 0.435326 -v -0.376095 0.376095 0.435326 -v -0.376095 0.313413 0.498008 -v -0.376095 0.376095 0.498008 -vt 0.187500 0.875000 -vt 0.125000 0.875000 -vt 0.125000 0.812500 -vt 0.187500 0.812500 -vt 0.875000 0.875000 -vt 0.875000 0.812500 -vt 0.812500 0.875000 -vt 0.812500 0.812500 -vt 0.875000 0.937500 -vt 0.875000 1.000000 -vt 0.125000 1.000000 -vt 0.125000 0.937500 -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.000000 -1.000000 -vn 0.000000 -1.000000 0.000000 -vn 0.000000 1.000000 0.000000 -usemtl None -s off -f 26/37/19 28/38/19 27/39/19 25/40/19 -f 28/41/20 32/38/20 31/39/20 27/42/20 -f 32/41/21 30/43/21 29/44/21 31/42/21 -f 30/41/22 26/38/22 25/39/22 29/42/22 -f 25/45/23 27/46/23 31/47/23 29/48/23 -f 30/48/24 32/38/24 28/41/24 26/45/24 -o background_Plane -v 0.313413 -0.313413 0.466667 -v -0.313413 -0.313413 0.466667 -v 0.313413 0.313413 0.466667 -v -0.313413 0.313413 0.466667 -vt 0.187500 0.187500 -vt 0.812500 0.187500 -vt 0.812500 0.812500 -vt 0.187500 0.812500 -vn -0.000000 0.000000 -1.000000 -usemtl None -s off -f 33/49/25 34/50/25 36/51/25 35/52/25 diff --git a/mods/ITEMS/mcl_itemframes/textures/mcl_itemframes_item_frame.png b/mods/ITEMS/mcl_itemframes/textures/mcl_itemframes_item_frame.png deleted file mode 100644 index 274749919d..0000000000 Binary files a/mods/ITEMS/mcl_itemframes/textures/mcl_itemframes_item_frame.png and /dev/null differ diff --git a/mods/ITEMS/mcl_itemframes/textures/mcl_itemframes_itemframe_background.png b/mods/ITEMS/mcl_itemframes/textures/mcl_itemframes_itemframe_background.png deleted file mode 100644 index d48cf26c54..0000000000 Binary files a/mods/ITEMS/mcl_itemframes/textures/mcl_itemframes_itemframe_background.png and /dev/null differ diff --git a/mods/ITEMS/mcl_maps/colors.json b/mods/ITEMS/mcl_maps/colors.json deleted file mode 100644 index b6519a9c3d..0000000000 --- a/mods/ITEMS/mcl_maps/colors.json +++ /dev/null @@ -1 +0,0 @@ -{"player.png": [123, 74, 62], "player_back.png": [114, 68, 56], "mcl_skins_button.png": [121, 95, 85], "mcl_skins_character_1.png": [93, 90, 77], "mcl_hunger_bar_saturation.png": [255, 255, 0], "hbhunger_bar_health_poison.png": [148, 120, 24], "mcl_hunger_bar_exhaustion.png": [255, 255, 255], "mcl_hunger_icon_exhaustion.png": [213, 213, 213], "mcl_hunger_bgicon_exhaustion.png": [25, 25, 26], "mcl_hunger_icon_foodpoison.png": [109, 106, 40], "mcl_hunger_bgicon_saturation.png": [24, 24, 26], "hbhunger_bar.png": [200, 103, 0], "hbhunger_bgicon.png": [24, 24, 26], "hbhunger_icon_health_poison.png": [69, 98, 45], "mcl_hunger_bar_foodpoison.png": [116, 132, 88], "hbhunger_icon.png": [175, 132, 97], "mcl_hunger_icon_saturation.png": [157, 140, 64], "mcl_playerplus_end_sky.png": [14, 14, 14], "mobs_mc_llama_decor_purple.png": [108, 72, 115], "mobs_mc_spawn_icon_illusioner.png": [98, 111, 155], "mobs_mc_llama_gray.png": [195, 188, 175], "mobs_mc_spawn_icon_zombie.png": [64, 136, 112], "mobs_mc_llama_decor_blue.png": [117, 121, 156], "mobs_mc_spawn_icon_skeleton.png": [146, 146, 146], "mobs_mc_shulker_blue.png": [89, 100, 126], "mobs_mc_shulker_black.png": [78, 75, 76], "mobs_mc_wolf_collar.png": [186, 186, 186], "mobs_mc_spawn_icon_bat.png": [130, 63, 13], "mobs_mc_villager_weaponsmith.png": [75, 74, 62], "mobs_mc_parrot_green.png": [47, 208, 62], "mobs_mc_llama_decor_magenta.png": [186, 84, 131], "mobs_mc_rabbit_black.png": [73, 64, 61], "mobs_mc_vindicator.png": [56, 56, 57], "mobs_mc_polarbear.png": [233, 220, 208], "mobs_mc_magmacube.png": [83, 40, 27], "mobs_mc_chicken.png": [198, 182, 176], "mobs_mc_villager_toolsmith.png": [78, 76, 64], "mobs_mc_ghast_firing.png": [198, 198, 198], "mobs_mc_spawn_icon_zombie_pigman.png": [202, 160, 135], "mobs_mc_husk.png": [98, 95, 76], "mobs_mc_villager_librarian.png": [167, 161, 151], "mobs_mc_villager_priest.png": [119, 112, 98], "mobs_mc_villager_fletcher.png": [84, 86, 52], "mobs_mc_villager_smith.png": [76, 76, 63], "mobs_mc_spawn_icon_dragon.png": [98, 47, 89], "mobs_mc_spawn_icon_donkey.png": [152, 132, 100], "mobs_mc_squid.png": [37, 52, 68], "mobs_mc_villager_farmer.png": [94, 87, 70], "mobs_mc_spawn_icon_horse_skeleton.png": [245, 204, 202], "mobs_mc_villager_sheperd.png": [97, 98, 66], "mobs_mc_horse_markings_blackdots.png": [24, 22, 22], "mobs_mc_zombie_farmer.png": [119, 99, 85], "mobs_mc_spawn_icon_vex.png": [145, 185, 185], "mobs_mc_villager_armorer.png": [86, 87, 55], "mobs_mc_parrot_blue.png": [43, 58, 148], "mobs_mc_spider_eyes.png": [174, 48, 48], "mobs_mc_zombie.png": [78, 110, 105], "mobs_mc_llama_decor_light_blue.png": [116, 200, 250], "mobs_mc_zombie_priest.png": [120, 104, 110], "mobs_mc_llama_decor_black.png": [12, 8, 24], "mobs_mc_horse_white.png": [190, 173, 154], "mobs_mc_spawn_icon_vindicator.png": [102, 103, 104], "mobs_mc_silverfish.png": [179, 164, 144], "mobs_mc_llama_decor_gray.png": [110, 110, 110], "mobs_mc_spawn_icon_guardian.png": [119, 156, 148], "mobs_mc_creeper.png": [98, 107, 71], "mobs_mc_shulker_purple.png": [135, 87, 99], "mobs_mc_spawn_icon_rabbit.png": [156, 126, 84], "mobs_mc_sheep.png": [182, 161, 149], "mobs_mc_parrot_grey.png": [33, 178, 173], "mobs_mc_wolf_icon_sit.png": [8, 88, 116], "mobs_mc_gold_horse_armor.png": [140, 106, 67], "mobs_mc_spawn_icon_witch.png": [98, 85, 68], "mobs_mc_shulker_green.png": [89, 122, 84], "mobs_mc_bat.png": [87, 63, 54], "mobs_mc_villager_cartographer.png": [164, 157, 145], "mobs_mc_horse_chestnut.png": [126, 78, 58], "mobs_mc_shulker_yellow.png": [175, 128, 69], "mobs_mc_spawn_icon_creeper.png": [115, 125, 53], "mobs_mc_slime.png": [63, 133, 78], "mobs_mc_evoker.png": [44, 48, 43], "mobs_mc_horse_skeleton.png": [163, 156, 141], "mobs_mc_spawn_icon_blaze.png": [142, 76, 49], "mobs_mc_shulker_light_blue.png": [114, 140, 158], "mobs_mc_shulker_gray.png": [106, 104, 109], "mobs_mc_horse_darkbrown.png": [69, 47, 34], "mobs_mc_stray_overlay.png": [63, 59, 65], "mobs_mc_arrow_particle.png": [218, 171, 136], "mobs_mc_spawn_icon_cat.png": [120, 66, 10], "mobs_mc_stray.png": [155, 157, 161], "mobs_mc_villager_nitwit.png": [91, 93, 60], "mobs_mc_trading_formspec_bg.png": [157, 157, 157], "mobs_mc_spawn_icon_villager.png": [134, 124, 81], "mobs_mc_pig.png": [228, 175, 165], "mobs_mc_spawn_icon_mooshroom.png": [160, 56, 55], "mobs_mc_wolf_angry.png": [187, 179, 176], "mobs_mc_cat_black.png": [206, 181, 154], "mobs_mc_vex_charging.png": [142, 153, 153], "mobs_mc_llama.png": [207, 189, 155], "mobs_mc_mushroom_brown.png": [122, 81, 58], "mobs_mc_spawn_icon_shulker.png": [170, 117, 130], "mobs_mc_wither_half_health.png": [7, 58, 91], "mobs_mc_spawn_icon_guardian_elder.png": [174, 140, 113], "mobs_mc_enderman_eyes.png": [184, 211, 242], "mobs_mc_horse_creamy.png": [146, 111, 75], "mobs_mc_spawn_icon_zombie_villager.png": [95, 110, 68], "mobs_mc_vex.png": [128, 162, 162], "mobs_mc_iron_golem.png": [47, 44, 44], "mobs_mc_cat_ocelot.png": [163, 111, 52], "mobs_mc_llama_decor_green.png": [51, 84, 27], "mobs_mc_cow.png": [94, 68, 55], "mobs_mc_llama_decor_brown.png": [85, 58, 46], "mobs_mc_villager_butcher.png": [95, 92, 79], "mobs_mc_parrot_yellow_blue.png": [98, 187, 205], "mobs_mc_zombie_pigman.png": [164, 129, 117], "mobs_mc_spawn_icon_wolf.png": [231, 218, 207], "mobs_mc_zombie_villager.png": [112, 108, 90], "mobs_mc_sheep_fur.png": [203, 186, 174], "mobs_mc_spawn_icon_horse_zombie.png": [129, 143, 66], "mobs_mc_blaze.png": [84, 63, 50], "mobs_mc_rabbit_salt.png": [122, 99, 87], "mobs_mc_rabbit_white_splotched.png": [146, 139, 135], "mobs_mc_horse_brown.png": [115, 84, 61], "mobs_mc_ghast.png": [199, 199, 199], "mobs_mc_horse_markings_white.png": [165, 149, 132], "mobs_mc_horse_markings_whitefield.png": [193, 178, 162], "mobs_mc_spawn_icon_endermite.png": [138, 67, 74], "mobs_mc_shulker_magenta.png": [143, 97, 130], "mobs_mc_snowman.png": [211, 217, 221], "mobs_mc_zombie_smith.png": [71, 59, 54], "mobs_mc_spawn_icon_squid.png": [55, 58, 103], "mobs_mc_dragon_fireball.png": [89, 66, 79], "mobs_mc_diamond_horse_armor.png": [67, 95, 112], "mobs_mc_rabbit_toast.png": [130, 123, 119], "mobs_mc_llama_white.png": [207, 199, 184], "mobs_mc_llama_creamy.png": [208, 190, 155], "mobs_mc_pig_saddle.png": [82, 63, 45], "mobs_mc_spawn_icon_cave_spider.png": [23, 43, 57], "mobs_mc_shulker_silver.png": [140, 138, 143], "mobs_mc_trading_formspec_disabled.png": [193, 26, 26], "mobs_mc_spider.png": [41, 38, 37], "mobs_mc_wither.png": [33, 33, 33], "mobs_mc_llama_decor_white.png": [231, 231, 231], "mobs_mc_witch.png": [80, 74, 67], "mobs_mc_wolf_icon_roam.png": [6, 124, 36], "mobs_mc_illusionist.png": [56, 68, 114], "mobs_mc_endermite.png": [55, 20, 65], "mobs_mc_spawn_icon_witherskeleton.png": [71, 71, 71], "mobs_mc_llama_decor_light_gray.png": [201, 201, 201], "mobs_mc_llama_decor_cyan.png": [20, 157, 160], "mobs_mc_skeleton.png": [124, 124, 124], "mobs_mc_spawn_icon_llama.png": [230, 221, 178], "mobs_mc_spawn_icon_chicken.png": [170, 160, 156], "mobs_mc_shulker_pink.png": [173, 127, 160], "mobs_mc_spawn_icon_spider.png": [53, 43, 43], "mobs_mc_shulker_red.png": [146, 77, 71], "mobs_mc_shulker_white.png": [184, 181, 186], "mobs_mc_spawn_icon_magmacube.png": [52, 33, 23], "mobs_mc_spawn_icon_ghast.png": [212, 212, 212], "mobs_mc_rabbit_brown.png": [112, 86, 73], "mobs_mc_spawn_icon_pig.png": [242, 200, 188], "mobs_mc_spawn_icon_horse.png": [44, 36, 25], "mobs_mc_cat_siamese.png": [161, 144, 133], "mobs_mc_mushroom_red.png": [176, 51, 49], "mobs_mc_shulker_brown.png": [94, 81, 70], "mobs_mc_villager_leatherworker.png": [96, 93, 58], "mobs_mc_guardian.png": [78, 116, 130], "mobs_mc_creeper_charge.png": [121, 219, 255], "mobs_mc_villager.png": [88, 91, 55], "mobs_mc_llama_decor_lime.png": [170, 214, 67], "mobs_mc_llama_brown.png": [136, 97, 52], "mobs_mc_enderman_cactus_background.png": [44, 71, 27], "mobs_mc_parrot_red_blue.png": [171, 70, 37], "mobs_mc_spawn_icon_husk.png": [174, 174, 128], "mobs_mc_rabbit_gold.png": [151, 130, 96], "mobs_mc_spawn_icon_evoker.png": [92, 103, 86], "mobs_mc_iron_horse_armor.png": [133, 119, 114], "mobs_mc_llama_decor_red.png": [215, 58, 50], "mobs_mc_enderman.png": [3, 10, 10], "mobs_mc_mooshroom_brown.png": [93, 50, 28], "mobs_mc_llama_decor_pink.png": [207, 140, 182], "mobs_mc_enderman_block.png": [46, 42, 38], "mobs_mc_mooshroom.png": [90, 42, 41], "mobs_mc_cat_red.png": [221, 163, 120], "mobs_mc_shulkerbullet.png": [216, 190, 153], "mobs_mc_horse_markings_whitedots.png": [230, 220, 207], "mobs_mc_mule.png": [108, 75, 51], "mobs_mc_spawn_icon_iron_golem.png": [122, 72, 41], "mobs_mc_zombie_butcher.png": [107, 98, 87], "mobs_mc_llama_decor_yellow.png": [218, 187, 8], "mobs_mc_wolf_tame.png": [179, 159, 154], "mobs_mc_horse_gray.png": [78, 68, 62], "mobs_mc_shulker_lime.png": [106, 132, 88], "mobs_mc_rabbit_caerbannog.png": [186, 179, 174], "mobs_mc_zombie_librarian.png": [106, 104, 104], "mobs_mc_spawn_icon_silverfish.png": [199, 168, 128], "mobs_mc_spawn_icon_stray.png": [118, 116, 118], "mobs_mc_spawn_icon_polarbear.png": [237, 235, 212], "mobs_mc_guardian_elder.png": [141, 141, 125], "mobs_mc_spawn_icon_slime.png": [76, 130, 33], "mobs_mc_cave_spider.png": [14, 28, 38], "mobs_mc_spawn_icon_cow.png": [162, 118, 72], "mobs_mc_wolf.png": [182, 165, 159], "mobs_mc_wither_skeleton.png": [50, 50, 50], "mobs_mc_endergolem.png": [135, 87, 99], "mobs_mc_spawn_icon_mule.png": [115, 82, 47], "mobs_mc_llama_decor_orange.png": [151, 80, 27], "mobs_chicken_egg.png": [199, 157, 106], "mobs_mc_rabbit_white.png": [161, 153, 149], "mobs_mc_horse_black.png": [49, 42, 39], "mobs_mc_dragon.png": [79, 54, 67], "mobs_mc_villager_fisherman.png": [98, 92, 58], "mobs_mc_spawn_icon_parrot.png": [202, 100, 54], "mobs_mc_spawn_icon_snowman.png": [216, 173, 147], "mobs_mc_donkey.png": [91, 78, 68], "mobs_mc_shulker_cyan.png": [89, 114, 128], "mobs_mc_spawn_icon_sheep.png": [209, 185, 175], "mobs_mc_TEMP_wither_projectile.png": [69, 69, 69], "mobs_mc_spawn_icon_enderman.png": [63, 82, 87], "mobs_mc_shulker_orange.png": [156, 90, 67], "mobs_mc_empty.png": [255, 255, 255], "mobs_mc_spawn_icon_wither.png": [102, 102, 102], "mcl_boats_spruce_boat.png": [72, 61, 51], "mcl_boats_jungle_boat.png": [102, 73, 58], "mcl_boats_texture_birch_boat.png": [131, 105, 83], "mcl_boats_texture_oak_boat.png": [103, 82, 65], "mcl_boats_birch_boat.png": [120, 95, 78], "mcl_boats_texture_jungle_boat.png": [109, 78, 60], "mcl_boats_oak_boat.png": [93, 76, 62], "mcl_boats_texture_acacia_boat.png": [136, 90, 64], "mcl_boats_obsidian_boat.png": [17, 15, 27], "mcl_boats_texture_obsidian_boat.png": [13, 10, 26], "mcl_boats_texture_dark_oak_boat.png": [89, 76, 64], "mcl_boats_texture_spruce_boat.png": [74, 61, 50], "mcl_boats_acacia_boat.png": [124, 82, 59], "mcl_boats_dark_oak_boat.png": [89, 76, 64], "mobs_nametag.png": [138, 114, 89], "mobs_blood.png": [27, 27, 29], "mcl_minecarts_rail_golden_curved_powered.png": [89, 71, 57], "mcl_minecarts_rail_golden_crossing.png": [83, 70, 55], "mcl_minecarts_rail_detector_curved_powered.png": [81, 68, 64], "mcl_minecarts_rail_golden_t_junction_powered.png": [82, 69, 59], "mcl_minecarts_rail_golden_t_junction.png": [80, 70, 59], "mcl_minecarts_rail_detector.png": [85, 74, 67], "mcl_minecarts_rail_detector_crossing.png": [77, 69, 65], "default_rail_t_junction.png": [79, 68, 61], "mcl_minecarts_rail_activator_crossing_powered.png": [72, 55, 51], "mcl_minecarts_minecart_hopper.png": [45, 45, 45], "mcl_minecarts_minecart_furnace.png": [66, 65, 64], "mcl_minecarts_minecart_command_block.png": [64, 62, 61], "mcl_minecarts_rail_golden.png": [92, 77, 60], "mcl_minecarts_rail_activator_t_junction_powered.png": [76, 61, 55], "default_rail_curved.png": [76, 67, 60], "mcl_minecarts_rail_activator_t_junction.png": [72, 62, 56], "mcl_minecarts_rail_golden_crossing_powered.png": [86, 70, 54], "mcl_minecarts_rail_detector_crossing_powered.png": [78, 68, 64], "mcl_minecarts_rail_detector_curved.png": [77, 70, 66], "default_rail_crossing.png": [79, 68, 59], "mcl_minecarts_rail_detector_t_junction.png": [74, 66, 61], "mcl_minecarts_minecart.png": [72, 60, 51], "mcl_minecarts_rail_golden_curved.png": [85, 73, 58], "mcl_minecarts_rail_activator.png": [78, 64, 56], "mcl_minecarts_rail_activator_powered.png": [86, 62, 54], "mcl_minecarts_rail_detector_t_junction_powered.png": [76, 66, 61], "mcl_minecarts_minecart_normal.png": [47, 45, 43], "mcl_minecarts_minecart_tnt.png": [75, 52, 52], "mcl_minecarts_rail_detector_powered.png": [87, 74, 67], "mcl_minecarts_rail_golden_powered.png": [94, 77, 60], "mcl_minecarts_rail_activator_crossing.png": [65, 56, 52], "default_rail.png": [83, 70, 61], "mcl_minecarts_rail_activator_curved_powered.png": [75, 55, 52], "mcl_minecarts_rail_activator_curved.png": [66, 56, 53], "mcl_minecarts_minecart_chest.png": [51, 48, 46], "mcl_paintings_paintings.png": [104, 99, 89], "mcl_paintings_painting.png": [139, 133, 119], "mcl_particles_totem4.png": [255, 255, 255], "mcl_particles_lava.png": [250, 150, 64], "mcl_particles_bonemeal.png": [185, 185, 185], "mcl_particles_instant_effect.png": [160, 160, 160], "mcl_particles_note.png": [41, 40, 39], "mcl_particles_bubble.png": [147, 174, 195], "mcl_particles_sponge1.png": [241, 238, 226], "mcl_particles_smoke_anim.png": [172, 172, 172], "mcl_particles_crit.png": [165, 165, 165], "mcl_particles_totem2.png": [255, 255, 255], "mcl_particles_mob_death.png": [198, 198, 198], "mcl_particles_droplet_bottle.png": [203, 203, 203], "mcl_particles_sponge4.png": [241, 238, 226], "mcl_particles_effect.png": [184, 184, 184], "mcl_particles_teleport.png": [86, 22, 128], "mcl_particles_sponge5.png": [241, 238, 226], "mcl_particles_flame.png": [244, 149, 63], "mcl_particles_sponge3.png": [241, 238, 226], "mcl_particles_sponge2.png": [241, 238, 226], "mcl_particles_totem1.png": [255, 255, 255], "mcl_particles_smoke.png": [174, 174, 174], "mcl_particles_totem3.png": [255, 255, 255], "lightning_lightning_2.png": [255, 255, 255], "lightning_lightning_3.png": [217, 217, 217], "lightning_lightning_1.png": [223, 223, 223], "weather_pack_rain_raindrop_2.png": [33, 79, 142], "weather_pack_rain_raindrop_3.png": [59, 88, 128], "mcl_particles_nether_dust3.png": [143, 105, 102], "weather_pack_rain_raindrop_1.png": [97, 137, 179], "mcl_particles_nether_dust1.png": [143, 105, 102], "weather_pack_snow_snowflake1.png": [255, 255, 255], "mcl_particles_nether_dust2.png": [143, 105, 102], "weather_pack_snow_snowflake2.png": [255, 255, 255], "mcl_moon_moon_phases.png": [80, 106, 141], "hbarmor_bgicon.png": [27, 27, 29], "hbarmor_bar.png": [175, 172, 165], "hbarmor_icon.png": [135, 131, 126], "mcl_base_textures_background9.png": [179, 179, 179], "object_crosshair.png": [255, 255, 255], "bubble.png": [69, 138, 194], "crosshair.png": [255, 255, 255], "heart.png": [137, 47, 40], "mcl_base_textures_background.png": [179, 179, 179], "crack_anylength.png": [93, 93, 93], "mcl_base_textures_button9_pressed.png": [162, 162, 162], "mcl_base_textures_button9.png": [162, 162, 162], "smoke_puff.png": [255, 255, 255], "credits_bg.png": [94, 72, 60], "mineclone2_logo.png": [75, 74, 69], "mineclone2_icon.png": [58, 74, 44], "awards_template.png": [134, 134, 134], "awards_bg_mining.png": [73, 68, 51], "awards_progress_gray.png": [157, 157, 157], "awards_ui_icon.png": [190, 34, 34], "awards_unknown.png": [134, 134, 134], "awards_progress_green.png": [0, 155, 74], "awards_bg_default.png": [38, 38, 38], "hudbars_bar_breath.png": [159, 161, 255], "hudbars_icon_health.png": [137, 47, 40], "hudbars_bar_health.png": [168, 55, 47], "hudbars_bgicon_breath.png": [0, 0, 0], "hudbars_bgicon_health.png": [27, 27, 29], "hudbars_icon_breath.png": [69, 138, 194], "hudbars_bar_background.png": [71, 71, 71], "mcl_achievements_button.png": [158, 152, 67], "mcl_inventory_hotbar.png": [81, 81, 85], "crafting_inventory_creative_survival.png": [195, 195, 195], "crafting_creative_bg_dark.png": [157, 157, 157], "mcl_inventory_empty_armor_slot_shield.png": [25, 32, 34], "crafting_formspec_bg.png": [9, 9, 9], "mcl_inventory_empty_armor_slot_helmet.png": [25, 32, 34], "mcl_inventory_hotbar_selected.png": [113, 85, 40], "crafting_creative_inactive_down.png": [151, 151, 151], "crafting_creative_active_down.png": [196, 196, 196], "crafting_creative_prev.png": [254, 254, 254], "crafting_creative_marker.png": [0, 0, 0], "mcl_inventory_button9_pressed.png": [162, 162, 162], "crafting_creative_active.png": [202, 202, 202], "mcl_inventory_button9.png": [162, 162, 162], "mcl_inventory_empty_armor_slot_chestplate.png": [0, 0, 0], "mcl_inventory_empty_armor_slot_boots.png": [0, 0, 0], "crafting_creative_bg.png": [207, 207, 207], "crafting_creative_inactive.png": [157, 157, 157], "crafting_creative_next.png": [254, 254, 254], "mcl_inventory_empty_armor_slot_leggings.png": [25, 32, 34], "crafting_inventory_creative.png": [206, 206, 206], "crafting_creative_trash.png": [144, 113, 113], "mcl_formspec_itemslot.png": [157, 157, 157], "mcl_wear_bar.png": [255, 255, 255], "mcl_offhand_slot.png": [92, 92, 94], "mcl_experience_bottle.png": [136, 174, 169], "mcl_experience_bar.png": [74, 102, 70], "mcl_experience_orb.png": [93, 174, 0], "mcl_experience_bar_background.png": [49, 46, 45], "mcl_bossbars_empty.png": [255, 255, 255], "mcl_bossbars.png": [76, 68, 75], "blast_furnace_front_on.png": [98, 88, 83], "blast_furnace_top.png": [126, 115, 110], "blast_furnace_side.png": [99, 92, 89], "blast_furnace_front.png": [93, 88, 85], "mcl_itemframes_item_frame.png": [123, 90, 63], "mcl_itemframes_itemframe_background.png": [136, 104, 75], "mcl_banners_stripe_middle.png": [255, 255, 255], "mcl_banners_skull.png": [255, 255, 255], "mcl_banners_bricks.png": [255, 255, 255], "mcl_banners_square_bottom_left.png": [255, 255, 255], "mcl_banners_gradient.png": [254, 254, 254], "mcl_banners_cross.png": [255, 255, 255], "mcl_banners_gradient_up.png": [254, 254, 254], "mcl_banners_item_overlay.png": [240, 240, 240], "mcl_banners_stripe_downright.png": [255, 255, 255], "mcl_banners_stripe_downleft.png": [255, 255, 255], "mcl_banners_fallback_wood.png": [102, 88, 74], "mcl_banners_base_inverted.png": [255, 255, 255], "mcl_banners_triangles_top.png": [255, 255, 255], "mcl_banners_banner_base.png": [215, 206, 193], "mcl_banners_curly_border.png": [254, 254, 254], "mcl_banners_thing.png": [253, 253, 253], "mcl_banners_small_stripes.png": [255, 255, 255], "mcl_banners_triangle_bottom.png": [254, 254, 254], "mcl_banners_stripe_right.png": [255, 255, 255], "mcl_banners_straight_cross.png": [255, 255, 255], "mcl_banners_triangle_top.png": [255, 255, 255], "mcl_banners_border.png": [255, 255, 255], "mcl_banners_diagonal_left.png": [255, 255, 255], "mcl_banners_diagonal_right.png": [255, 255, 255], "mcl_banners_base.png": [255, 255, 255], "mcl_banners_half_vertical.png": [255, 255, 255], "mcl_banners_circle.png": [254, 254, 254], "mcl_banners_triangles_bottom.png": [255, 255, 255], "mcl_banners_item_base.png": [103, 89, 75], "mcl_banners_stripe_left.png": [255, 255, 255], "mcl_banners_rhombus.png": [255, 255, 255], "mcl_banners_creeper.png": [255, 255, 255], "mcl_banners_flower.png": [254, 254, 254], "mcl_banners_stripe_bottom.png": [255, 255, 255], "mcl_banners_half_horizontal.png": [255, 255, 255], "mcl_banners_half_horizontal_bottom.png": [255, 255, 255], "mcl_banners_square_top_left.png": [255, 255, 255], "mcl_banners_square_top_right.png": [255, 255, 255], "mcl_banners_stripe_center.png": [255, 255, 255], "mcl_banners_diagonal_up_left.png": [255, 255, 255], "mcl_banners_stripe_top.png": [255, 255, 255], "mcl_banners_diagonal_up_right.png": [255, 255, 255], "mcl_banners_square_bottom_right.png": [255, 255, 255], "mcl_banners_half_vertical_right.png": [255, 255, 255], "mcl_doors_trapdoor_dark_oak.png": [81, 68, 56], "mcl_doors_trapdoor_acacia_side.png": [154, 102, 71], "doors_trapdoor_steel_side.png": [149, 140, 140], "mcl_doors_door_jungle_side_upper.png": [109, 75, 57], "mcl_doors_door_dark_oak_side_lower.png": [103, 90, 75], "mcl_doors_door_iron_lower.png": [157, 152, 151], "mcl_doors_door_acacia_upper.png": [152, 100, 69], "mcl_doors_door_jungle_side_lower.png": [107, 72, 55], "mcl_doors_door_wood_lower.png": [89, 70, 55], "doors_trapdoor_steel.png": [149, 140, 140], "mcl_doors_door_iron_side_upper.png": [155, 149, 148], "mcl_doors_door_acacia_side_upper.png": [133, 80, 53], "mcl_doors_door_jungle.png": [116, 83, 62], "mcl_doors_door_iron_side_lower.png": [157, 152, 151], "mcl_doors_door_birch_upper.png": [179, 158, 139], "mcl_doors_trapdoor_spruce_side.png": [73, 59, 47], "mcl_doors_door_iron_upper.png": [155, 149, 148], "mcl_doors_door_spruce_side_lower.png": [92, 79, 68], "mcl_doors_trapdoor_spruce.png": [71, 57, 46], "mcl_doors_trapdoor_birch_side.png": [147, 116, 89], "doors_trapdoor_side.png": [113, 86, 67], "mcl_doors_door_acacia_lower.png": [153, 101, 70], "mcl_doors_door_dark_oak_side_upper.png": [102, 89, 75], "mcl_doors_door_acacia_side_lower.png": [131, 78, 51], "mcl_doors_door_wood_upper.png": [92, 72, 57], "mcl_doors_trapdoor_birch.png": [173, 151, 132], "mcl_doors_door_dark_oak_upper.png": [83, 71, 59], "mcl_doors_door_acacia.png": [148, 98, 67], "mcl_doors_door_spruce.png": [67, 56, 47], "mcl_doors_door_spruce_lower.png": [71, 58, 48], "mcl_doors_door_birch_side_upper.png": [153, 121, 94], "mcl_doors_trapdoor_dark_oak_side.png": [85, 72, 60], "mcl_doors_door_wood_side_upper.png": [84, 65, 51], "mcl_doors_door_birch.png": [172, 147, 124], "mcl_doors_door_birch_lower.png": [165, 140, 119], "mcl_doors_trapdoor_jungle.png": [103, 70, 52], "doors_item_steel.png": [148, 144, 143], "doors_trapdoor.png": [98, 75, 59], "mcl_doors_door_jungle_lower.png": [116, 82, 61], "doors_item_wood.png": [88, 67, 53], "mcl_doors_door_jungle_upper.png": [113, 79, 59], "mcl_doors_door_spruce_upper.png": [71, 58, 47], "mcl_doors_door_dark_oak_lower.png": [84, 71, 59], "mcl_doors_door_dark_oak.png": [82, 69, 57], "mcl_doors_door_wood_side_lower.png": [132, 102, 81], "mcl_doors_trapdoor_jungle_side.png": [121, 87, 62], "mcl_doors_door_spruce_side_upper.png": [92, 79, 68], "mcl_doors_door_birch_side_lower.png": [152, 119, 92], "mcl_doors_trapdoor_acacia.png": [148, 96, 66], "mcl_fishing_clownfish_raw.png": [205, 127, 81], "mcl_fishing_fish_raw.png": [70, 112, 154], "mcl_fishing_salmon_raw.png": [112, 105, 102], "mcl_fishing_fish_cooked.png": [93, 84, 94], "mcl_fishing_bobber.png": [171, 117, 119], "mcl_fishing_pufferfish_raw.png": [219, 165, 77], "mcl_fishing_fishing_rod.png": [134, 116, 103], "mcl_fishing_salmon_cooked.png": [97, 91, 89], "mcl_barrels_barrel_top_open.png": [58, 43, 35], "mcl_barrels_barrel_bottom.png": [78, 61, 47], "mcl_barrels_barrel_side.png": [70, 57, 47], "mcl_barrels_barrel_top.png": [79, 61, 48], "mcl_stairs_diorite_smooth_slab.png": [156, 153, 151], "mcl_stairs_iron_block_slab.png": [166, 159, 159], "mcl_stairs_andesite_smooth_slab.png": [106, 113, 108], "mcl_stairs_gold_block_slab.png": [191, 146, 56], "mcl_stairs_granite_smooth_slab.png": [150, 121, 109], "mcl_stairs_lapis_block_slab.png": [49, 89, 158], "lantern_top.png": [65, 66, 70], "mcl_blackstone_basalt_smooth.png": [87, 86, 86], "mcl_blackstone_basalt_top_polished.png": [77, 76, 76], "mcl_backstone_quartz_bricks.png": [189, 184, 181], "soul_fire_basic_flame_animated.png": [75, 161, 161], "mcl_blackstone_basalt_side_polished.png": [64, 63, 63], "soul_torch_on_floor_animated.png": [94, 96, 84], "mcl_blackstone_chiseled_polished.png": [40, 38, 43], "lantern_bottom.png": [78, 138, 137], "lantern.png": [69, 121, 121], "soul_mcl_burning_hud_flame_animated.png": [75, 161, 161], "mcl_blackstone_basalt_side.png": [60, 59, 59], "mcl_blackstone_basalt_top.png": [68, 68, 68], "mcl_blackstone_polished.png": [43, 41, 46], "mcl_blackstone_polished_bricks.png": [41, 38, 43], "mcl_blackstone_soul_soil.png": [91, 71, 52], "soul_mcl_burning_entity_flame_animated.png": [75, 161, 161], "mcl_blackstone_chain.png": [33, 33, 33], "soul_fire_basic_flame.png": [76, 164, 164], "mcl_blackstone.png": [30, 29, 31], "soul_torch_on_floor.png": [92, 94, 83], "mcl_nether_nether_wart_block_blue.png": [72, 95, 175], "mcl_blackstone_gilded_side.png": [184, 140, 50], "mcl_fireworks_rocket.png": [155, 84, 71], "mcl_bows_arrow_inv.png": [144, 129, 121], "mcl_bows_crossbow_0.png": [95, 77, 61], "mcl_bows_rocket.png": [188, 86, 83], "mcl_bows_firework_white.png": [222, 222, 222], "mcl_bows_firework_green.png": [156, 238, 141], "mcl_bows_firework_blue.png": [141, 174, 238], "mcl_bows_firework_red.png": [238, 141, 141], "mcl_bows_arrow_overlay.png": [184, 181, 175], "mcl_bows_bow_1.png": [112, 95, 79], "mcl_bows_bow_0.png": [111, 94, 79], "mcl_bows_crossbow_2.png": [100, 82, 66], "mcl_bows_bow_2.png": [115, 98, 82], "mcl_bows_rocket_particle.png": [215, 215, 215], "mcl_bows_crossbow_3.png": [103, 87, 73], "mcl_bows_bow.png": [114, 95, 78], "mcl_bows_arrow.png": [133, 116, 108], "mcl_bows_crossbow.png": [94, 76, 60], "mcl_bows_crossbow_1.png": [97, 79, 62], "mcl_bows_arrow_front.png": [178, 175, 168], "mcl_bows_arrow_back.png": [218, 216, 213], "mcl_bows_firework_yellow.png": [238, 218, 141], "mcl_ocean_dead_bubble_coral.png": [118, 108, 126], "mcl_ocean_tube_coral.png": [57, 88, 209], "mcl_ocean_sea_pickle_2_anim.png": [95, 122, 51], "mcl_ocean_dead_horn_coral_fan.png": [150, 143, 123], "mcl_ocean_dead_bubble_coral_block.png": [114, 105, 122], "mcl_ocean_sea_pickle_3_off.png": [68, 99, 36], "mcl_ocean_dead_horn_coral_block.png": [152, 146, 125], "mcl_ocean_bubble_coral_block.png": [143, 76, 195], "mcl_ocean_horn_coral.png": [233, 195, 69], "mcl_ocean_dead_tube_coral_block.png": [99, 104, 127], "mcl_ocean_sea_pickle_item.png": [93, 120, 50], "mcl_ocean_kelp_item.png": [42, 105, 55], "mcl_ocean_dried_kelp_side.png": [71, 80, 67], "mcl_ocean_dead_tube_coral.png": [99, 105, 128], "mcl_ocean_fire_coral_block.png": [198, 74, 62], "mcl_ocean_bubble_coral.png": [149, 77, 200], "mcl_ocean_prismarine_bricks.png": [104, 112, 115], "mcl_ocean_brain_coral.png": [206, 87, 153], "mcl_ocean_dried_kelp_top.png": [56, 71, 57], "mcl_ocean_brain_coral_block.png": [200, 85, 148], "mcl_ocean_prismarine_dark.png": [77, 89, 97], "mcl_ocean_dead_fire_coral_block.png": [127, 102, 100], "mcl_ocean_prismarine_shard.png": [122, 144, 135], "mcl_ocean_sea_pickle_2_off.png": [70, 100, 36], "mcl_ocean_sea_pickle_4_anim.png": [85, 113, 46], "mcl_ocean_dead_brain_coral.png": [134, 117, 127], "mcl_ocean_tube_coral_fan.png": [59, 85, 203], "mcl_ocean_sea_pickle_4_off.png": [68, 98, 36], "mcl_ocean_sea_pickle_1_anim.png": [106, 132, 57], "mcl_ocean_fire_coral.png": [208, 78, 65], "mcl_ocean_sea_pickle_3_anim.png": [89, 116, 48], "mcl_ocean_dead_fire_coral_fan.png": [140, 113, 110], "mcl_ocean_prismarine_crystals.png": [182, 193, 190], "mcl_ocean_prismarine_anim.png": [104, 123, 122], "mcl_ocean_horn_coral_fan.png": [230, 189, 68], "mcl_ocean_dead_tube_coral_fan.png": [98, 103, 125], "mcl_ocean_sea_pickle_1_off.png": [72, 103, 37], "mcl_ocean_dead_horn_coral.png": [154, 148, 127], "mcl_ocean_dead_fire_coral.png": [133, 107, 105], "mcl_ocean_bubble_coral_fan.png": [141, 75, 192], "mcl_ocean_horn_coral_block.png": [232, 193, 69], "mcl_ocean_brain_coral_fan.png": [206, 87, 154], "mcl_ocean_sea_lantern.png": [133, 144, 145], "mcl_ocean_seagrass.png": [48, 125, 60], "mcl_ocean_dead_brain_coral_fan.png": [134, 117, 127], "mcl_ocean_dried_kelp.png": [36, 57, 40], "mcl_ocean_dead_bubble_coral_fan.png": [113, 104, 120], "mcl_ocean_dried_kelp_bottom.png": [56, 71, 57], "mcl_ocean_kelp_plant.png": [42, 105, 55], "mcl_ocean_tube_coral_block.png": [58, 88, 207], "mcl_ocean_dead_brain_coral_block.png": [130, 114, 123], "mcl_ocean_fire_coral_fan.png": [205, 77, 64], "mcl_portals_endframe_bottom.png": [109, 99, 87], "mcl_portals_particle3.png": [146, 0, 201], "mcl_portals_particle2.png": [146, 0, 201], "mcl_portals_endframe_top.png": [95, 85, 74], "mcl_portals_particle4.png": [146, 0, 201], "mcl_portals_endframe_eye.png": [135, 36, 18], "mcl_portals_end_portal.png": [14, 14, 14], "mcl_particles_nether_portal.png": [206, 0, 206], "mcl_portals_particle5.png": [189, 11, 213], "mcl_portals_endframe_side.png": [110, 99, 86], "mcl_portals_particle1.png": [173, 28, 229], "mcl_portals_portal.png": [74, 24, 172], "mcl_particles_nether_portal_t.png": [159, 0, 223], "cake_side.png": [201, 170, 155], "cake_inner.png": [185, 129, 99], "cake_bottom.png": [160, 86, 51], "cake_top.png": [241, 228, 226], "cake.png": [216, 187, 176], "mcl_cocoas_cocoa_top_stage_2.png": [138, 68, 52], "mcl_cocoas_cocoa_stage_1.png": [172, 121, 69], "mcl_cocoas_cocoa_stage_2.png": [132, 65, 50], "mcl_cocoas_cocoa_stage_0.png": [65, 77, 39], "mcl_fences_fence_red_nether_brick.png": [68, 17, 0], "mcl_fences_fence_gate_red_nether_brick.png": [64, 15, 0], "mcl_fences_fence_gate_nether_brick.png": [50, 25, 26], "mcl_mobitems_spider_eye.png": [154, 69, 60], "mcl_mobitems_leather.png": [105, 75, 45], "mcl_mobitems_feather.png": [206, 185, 183], "mcl_mobitems_string.png": [202, 186, 166], "mcl_mobitems_rabbit_foot.png": [124, 107, 97], "mcl_mobitems_saddle.png": [93, 72, 50], "mcl_mobitems_bone.png": [182, 162, 139], "mcl_mobitems_horse_armor_iron.png": [134, 123, 118], "mcl_mobitems_shulker_shell.png": [118, 68, 83], "mcl_mobitems_blaze_rod.png": [143, 64, 28], "mcl_mobitems_beef_raw.png": [147, 63, 54], "mcl_mobitems_rabbit_stew.png": [127, 98, 79], "mcl_mobitems_rotten_flesh.png": [110, 68, 45], "mcl_mobitems_horse_armor_diamond.png": [78, 110, 129], "mcl_mobitems_chicken_raw.png": [217, 178, 149], "mcl_mobitems_ghast_tear.png": [148, 160, 166], "mcl_mobitems_porkchop_raw.png": [160, 72, 69], "mcl_mobitems_horse_armor_gold.png": [143, 110, 59], "mcl_mobitems_rabbit_hide.png": [108, 85, 73], "mcl_mobitems_slimeball.png": [75, 134, 82], "mcl_mobitems_magma_cream.png": [102, 54, 34], "default_gunpowder.png": [48, 41, 36], "mcl_mobitems_chicken_cooked.png": [187, 145, 106], "mcl_mobitems_beef_cooked.png": [112, 70, 49], "mcl_mobitems_rabbit_cooked.png": [188, 155, 131], "mcl_mobitems_blaze_powder.png": [86, 50, 34], "mcl_mobitems_rabbit_raw.png": [217, 177, 157], "mcl_mobitems_carrot_on_a_stick.png": [133, 113, 93], "mcl_mobitems_mutton_cooked.png": [144, 104, 77], "mcl_mobitems_nether_star.png": [234, 189, 123], "mcl_mobitems_porkchop_cooked.png": [116, 72, 48], "mcl_mobitems_mutton_raw.png": [175, 77, 77], "mcl_mobitems_bucket_milk.png": [180, 175, 166], "mcl_farming_wheat_stage_0.png": [53, 101, 46], "farming_carrot.png": [147, 106, 63], "farming_potato_poison.png": [121, 93, 55], "mcl_farming_pumpkin_hud.png": [0, 0, 0], "farming_cookie.png": [144, 100, 61], "mcl_farming_melon_seeds.png": [100, 72, 61], "mcl_farming_potatoes_stage_1.png": [69, 113, 61], "mcl_farming_melon_stem_disconnected.png": [96, 96, 96], "farming_carrot_4.png": [93, 105, 58], "mcl_farming_wheat_stage_5.png": [101, 142, 66], "farming_tool_woodhoe.png": [120, 101, 86], "mcl_farming_potatoes_stage_0.png": [73, 119, 65], "farming_carrot_1.png": [75, 112, 61], "farming_carrot_3.png": [70, 107, 57], "farming_melon.png": [153, 84, 62], "mcl_farming_pumpkin_seeds.png": [132, 120, 87], "farming_wheat_harvested.png": [178, 134, 80], "farming_pumpkin_side.png": [186, 100, 42], "mcl_farming_pumpkin_face.png": [181, 94, 40], "mcl_farming_wheat_stage_4.png": [86, 129, 65], "mcl_farming_farmland_wet.png": [69, 55, 46], "mcl_farming_beetroot_0.png": [56, 122, 75], "mcl_farming_pumpkin_stem_connected.png": [94, 94, 94], "mcl_farming_farmland_dry.png": [101, 80, 68], "farming_tool_diamondhoe.png": [101, 104, 104], "mcl_farming_beetroot_1.png": [54, 118, 72], "mcl_farming_beetroot_2.png": [54, 119, 73], "mcl_farming_wheat_stage_7.png": [165, 116, 75], "mcl_farming_beetroot.png": [113, 69, 66], "mcl_farming_wheat_stage_6.png": [145, 145, 69], "mcl_farming_wheat_stage_3.png": [64, 113, 52], "mcl_farming_pumpkin_stem_disconnected.png": [96, 96, 96], "mcl_farming_hayblock_top.png": [154, 116, 81], "farming_pumpkin_face_light.png": [189, 100, 45], "farming_potato_baked.png": [118, 84, 45], "farming_melon_side.png": [68, 95, 37], "farming_potato.png": [107, 74, 39], "mcl_farming_wheat_stage_1.png": [49, 97, 45], "farming_pumpkin_top.png": [172, 87, 40], "farming_bread.png": [177, 133, 94], "mcl_farming_beetroot_soup.png": [120, 70, 63], "farming_melon_top.png": [58, 80, 33], "mcl_farming_potatoes_stage_3.png": [82, 106, 57], "farming_tool_stonehoe.png": [133, 122, 111], "mcl_farming_beetroot_seeds.png": [107, 104, 88], "farming_tool_goldhoe.png": [162, 131, 70], "farming_carrot_gold.png": [140, 122, 48], "farming_carrot_2.png": [72, 108, 58], "farming_pumpkin_face.png": [161, 79, 37], "mcl_farming_melon_stem_connected.png": [94, 94, 94], "mcl_farming_pumpkin_pie.png": [172, 98, 45], "mcl_farming_wheat_stage_2.png": [49, 97, 45], "farming_tool_steelhoe.png": [123, 112, 102], "mcl_farming_potatoes_stage_2.png": [72, 116, 62], "mcl_farming_beetroot_3.png": [73, 105, 71], "mcl_farming_wheat_seeds.png": [102, 87, 55], "mcl_farming_hayblock_side.png": [135, 99, 71], "mcl_raw_ores_raw_iron_block.png": [194, 172, 156], "mcl_raw_ores_raw_gold_block.png": [208, 166, 77], "mcl_raw_ores_raw_gold.png": [195, 152, 64], "mcl_raw_ores_raw_iron.png": [182, 160, 145], "mcl_end_purpur_block.png": [161, 111, 175], "mcl_end_chorus_flower_dead.png": [82, 79, 118], "mcl_end_end_stone.png": [221, 214, 130], "mcl_end_endframe_side.png": [110, 99, 86], "mcl_end_purpur_pillar.png": [157, 108, 171], "mcl_end_chorus_fruit.png": [87, 89, 121], "mcl_end_endframe_eye.png": [135, 36, 18], "mcl_end_chorus_fruit_popped.png": [70, 67, 110], "mcl_end_end_rod_top.png": [123, 75, 97], "mcl_end_endframe_top.png": [95, 85, 74], "mcl_end_purpur_pillar_top.png": [159, 110, 173], "mcl_end_chorus_flower.png": [92, 92, 125], "mcl_end_crystal_item.png": [170, 140, 162], "mcl_end_end_bricks.png": [194, 187, 123], "mcl_end_dragon_egg.png": [55, 34, 32], "mcl_end_ender_eye.png": [130, 33, 17], "mcl_end_chorus_plant.png": [78, 73, 115], "mcl_end_end_rod_bottom.png": [122, 74, 96], "mcl_end_crystal_beam.png": [195, 81, 183], "mcl_end_end_rod_side.png": [242, 202, 177], "mcl_cracked_deepslate_tiles.png": [47, 46, 46], "mcl_cracked_deepslate_bricks.png": [60, 58, 58], "mcl_deepslate_iron_ore.png": [88, 82, 79], "mcl_deepslate_bricks.png": [62, 61, 60], "mcl_deepslate_tuff.png": [98, 81, 69], "mcl_deepslate_gold_ore.png": [87, 78, 64], "mcl_chiseled_deepslate.png": [44, 43, 43], "mcl_deepslate_diamond_ore.png": [74, 92, 100], "mcl_deepslate_lapis_ore.png": [63, 74, 90], "mcl_cobbled_deepslate.png": [78, 76, 75], "mcl_deepslate_tiles.png": [49, 47, 47], "mcl_deepslate.png": [70, 68, 67], "mcl_deepslate_redstone_ore.png": [89, 61, 60], "mcl_deepslate_emerald_ore.png": [63, 81, 71], "mcl_deepslate_top.png": [75, 73, 72], "mcl_polished_deepslate.png": [68, 66, 66], "mcl_deepslate_copper_ore.png": [82, 70, 67], "mcl_deepslate_coal_ore.png": [63, 60, 59], "mcl_clock_clock_18.png": [152, 123, 81], "mcl_clock_clock_03.png": [160, 129, 88], "mcl_clock_clock_49.png": [155, 122, 79], "mcl_clock_clock_34.png": [140, 115, 76], "mcl_clock_clock_01.png": [161, 129, 88], "mcl_clock_clock_32.png": [141, 116, 77], "mcl_clock_clock_27.png": [142, 117, 78], "mcl_clock_clock_42.png": [147, 119, 79], "mcl_clock_clock_25.png": [145, 119, 78], "mcl_clock_clock_56.png": [160, 126, 81], "mcl_clock_clock_22.png": [146, 119, 79], "mcl_clock_clock_31.png": [141, 116, 76], "mcl_clock_clock_57.png": [161, 127, 83], "mcl_clock_clock_58.png": [157, 127, 86], "mcl_clock_clock_39.png": [146, 119, 79], "mcl_clock_clock_59.png": [160, 128, 86], "mcl_clock_clock_16.png": [157, 125, 80], "mcl_clock_clock_38.png": [141, 117, 78], "mcl_clock_clock_53.png": [158, 124, 80], "mcl_clock_clock_43.png": [149, 121, 80], "mcl_clock_clock_09.png": [161, 127, 81], "mcl_clock_clock_33.png": [141, 116, 76], "mcl_clock_clock_07.png": [162, 128, 83], "mcl_clock_clock_23.png": [148, 121, 80], "mcl_clock_clock_51.png": [156, 123, 80], "mcl_clock_clock_10.png": [158, 127, 85], "mcl_clock_clock_55.png": [160, 126, 81], "mcl_clock_clock_46.png": [152, 122, 81], "mcl_clock_clock_26.png": [142, 117, 79], "mcl_clock_clock_06.png": [157, 127, 86], "mcl_clock_clock_00.png": [162, 129, 87], "mcl_clock_clock_28.png": [141, 116, 77], "mcl_clock_clock_44.png": [150, 120, 79], "mcl_clock_clock_08.png": [160, 127, 81], "mcl_clock_clock_19.png": [152, 122, 80], "mcl_clock_clock_12.png": [159, 127, 83], "mcl_clock_clock_45.png": [153, 123, 81], "mcl_clock_clock_24.png": [147, 120, 80], "mcl_clock_clock_15.png": [157, 125, 81], "mcl_clock_clock_20.png": [150, 121, 79], "mcl_clock_clock_61.png": [160, 129, 88], "mcl_clock_clock_02.png": [159, 129, 89], "mcl_clock_clock_40.png": [147, 120, 79], "mcl_clock_clock_37.png": [143, 118, 79], "mcl_clock_clock_48.png": [155, 123, 79], "mcl_clock_clock_13.png": [159, 126, 82], "mcl_clock_clock_17.png": [156, 125, 81], "mcl_clock_clock_52.png": [156, 123, 80], "mcl_clock_clock_54.png": [156, 125, 84], "mcl_clock_clock_04.png": [159, 128, 87], "mcl_clock_clock_47.png": [154, 122, 80], "mcl_clock_clock_62.png": [159, 129, 89], "mcl_clock_clock_41.png": [147, 120, 79], "mcl_clock_clock_35.png": [140, 115, 76], "mcl_clock_clock_60.png": [159, 128, 87], "mcl_clock_clock_50.png": [155, 123, 80], "mcl_clock_clock_29.png": [142, 117, 78], "mcl_clock_clock_21.png": [150, 122, 81], "mcl_clock_clock_30.png": [140, 115, 76], "mcl_clock_clock_14.png": [157, 125, 81], "mcl_clock_clock_05.png": [160, 128, 85], "mcl_clock_clock_36.png": [141, 116, 77], "mcl_clock_clock_63.png": [161, 129, 88], "mcl_clock_clock_11.png": [160, 127, 82], "lodestone_side3.png": [83, 73, 69], "mcl_compass_compass_02.png": [116, 107, 104], "lodestone_bottom.png": [81, 72, 69], "mcl_compass_compass_06.png": [117, 107, 104], "mcl_compass_compass_04.png": [117, 106, 104], "mcl_compass_compass_19.png": [116, 106, 103], "mcl_compass_compass_16.png": [114, 106, 104], "lodestone_side1.png": [83, 73, 69], "mcl_compass_compass_26.png": [117, 107, 104], "lodestone_side4.png": [85, 75, 70], "mcl_compass_compass_25.png": [117, 107, 105], "mcl_compass_compass_24.png": [117, 107, 105], "mcl_compass_compass_17.png": [115, 106, 104], "lodestone_top.png": [78, 69, 66], "mcl_compass_compass_23.png": [117, 107, 105], "mcl_compass_compass_01.png": [115, 107, 104], "mcl_compass_compass_28.png": [116, 107, 104], "mcl_compass_compass_05.png": [117, 106, 104], "mcl_compass_compass_09.png": [117, 107, 104], "mcl_compass_compass_10.png": [117, 107, 105], "lodestone_side2.png": [82, 72, 68], "mcl_compass_compass_14.png": [116, 107, 105], "mcl_compass_compass_18.png": [117, 107, 104], "mcl_compass_compass_13.png": [117, 106, 104], "mcl_compass_compass_08.png": [117, 107, 104], "mcl_compass_compass_21.png": [117, 107, 104], "mcl_compass_compass_27.png": [117, 106, 104], "mcl_compass_compass_30.png": [116, 107, 104], "mcl_compass_compass_15.png": [115, 106, 104], "mcl_compass_compass_29.png": [115, 106, 104], "mcl_compass_compass_03.png": [116, 106, 104], "mcl_compass_compass_07.png": [117, 107, 104], "mcl_compass_compass_22.png": [117, 107, 105], "mcl_compass_compass_12.png": [117, 106, 104], "mcl_compass_compass_00.png": [114, 107, 104], "mcl_compass_compass_20.png": [116, 106, 104], "mcl_compass_compass_31.png": [115, 107, 104], "mcl_compass_compass_11.png": [117, 106, 104], "mcl_jukebox_record_wait.png": [39, 42, 55], "mcl_jukebox_record_cat.png": [40, 45, 51], "mcl_jukebox_record_mellohi.png": [46, 44, 59], "mcl_jukebox_record_13.png": [51, 47, 51], "mcl_jukebox_record_ward.png": [39, 43, 51], "mcl_jukebox_record_chirp.png": [49, 40, 50], "mcl_jukebox_record_blocks.png": [47, 37, 49], "mcl_jukebox_record_11.png": [41, 40, 52], "mcl_jukebox_record_mall.png": [42, 41, 62], "mcl_jukebox_top.png": [72, 56, 44], "mcl_jukebox_record_strad.png": [45, 45, 57], "mcl_jukebox_record_far.png": [47, 48, 52], "mcl_jukebox_side.png": [94, 74, 57], "mcl_jukebox_record_stal.png": [39, 38, 49], "loom_front.png": [127, 101, 84], "loom_side1.png": [130, 102, 80], "loom_bottom1.png": [163, 130, 100], "loom_top1.png": [186, 160, 137], "loom_bottom.png": [111, 84, 69], "loom_front1.png": [148, 123, 102], "loom_top.png": [134, 111, 97], "loom_side.png": [121, 91, 72], "mcl_fences_fence_acacia.png": [152, 99, 68], "mcl_fences_fence_gate_mask.png": [255, 126, 126], "mcl_fences_fence_gate_spruce.png": [85, 69, 56], "mcl_fences_fence_big_oak.png": [83, 71, 59], "mcl_fences_fence_spruce.png": [84, 67, 54], "mcl_fences_fence_gate_birch.png": [153, 121, 94], "mcl_fences_fence_gate_acacia.png": [155, 102, 70], "mcl_fences_fence_gate_big_oak.png": [85, 73, 61], "mcl_fences_fence_oak.png": [108, 83, 64], "mcl_fences_fence_gate_oak.png": [111, 85, 66], "mcl_fences_fence_jungle.png": [115, 80, 60], "mcl_fences_fence_nether_brick.png": [49, 24, 24], "mcl_fences_fence_birch.png": [151, 119, 93], "mcl_fences_fence_gate_jungle.png": [117, 82, 61], "mcl_fences_fence_mask.png": [255, 126, 126], "mcl_composter_bottom.png": [141, 111, 87], "mcl_composter_side.png": [117, 92, 74], "mcl_composter_ready.png": [109, 107, 74], "mcl_composter_compost.png": [75, 76, 41], "mcl_composter_top.png": [157, 129, 103], "mcl_core_leaves_birch.png": [28, 57, 28], "default_mossycobble.png": [100, 105, 94], "default_flint.png": [70, 67, 64], "mcl_core_bowl.png": [78, 61, 47], "mcl_core_glass_lime_detail.png": [126, 203, 24], "mcl_core_bone_block_top.png": [220, 201, 170], "default_acacia_tree.png": [105, 91, 74], "default_steel_block.png": [159, 151, 151], "mcl_core_stonebrick_mossy.png": [81, 101, 76], "default_diamond_block.png": [92, 160, 200], "mcl_core_glass_brown_detail.png": [101, 75, 50], "mcl_core_glass_blue_detail.png": [50, 75, 178], "default_leaves.png": [39, 79, 38], "mcl_core_web.png": [202, 189, 167], "mcl_core_reeds.png": [57, 100, 52], "default_gold_ingot.png": [179, 133, 47], "mcl_core_grass_path_side.png": [113, 89, 62], "mcl_core_red_sand.png": [224, 137, 111], "mcl_core_glass_black_detail.png": [24, 24, 24], "default_apple.png": [137, 57, 44], "mcl_core_log_birch_top.png": [155, 130, 112], "default_coal_block.png": [51, 49, 51], "mcl_core_andesite_smooth.png": [107, 113, 109], "mcl_core_apple_golden.png": [176, 138, 51], "mcl_core_diorite.png": [153, 149, 146], "mcl_core_granite_smooth.png": [150, 121, 110], "mcl_core_bedrock.png": [91, 77, 66], "mcl_core_planks_spruce.png": [81, 65, 54], "mcl_core_sapling_big_oak.png": [69, 92, 80], "mcl_core_emerald_ore.png": [115, 122, 103], "mcl_core_sandstone_smooth.png": [202, 155, 121], "mcl_core_glass_light_blue.png": [101, 153, 215], "default_brick.png": [139, 87, 75], "mcl_core_redstone_ore.png": [128, 91, 88], "mcl_core_cactus_top.png": [77, 99, 49], "mcl_core_frosted_ice_1.png": [147, 198, 227], "mcl_core_glass_white_detail.png": [254, 254, 254], "mcl_core_sapling_spruce.png": [55, 72, 53], "mcl_core_stripped_acacia_top.png": [157, 98, 62], "mcl_core_log_spruce_top.png": [97, 71, 57], "mcl_core_glass_lime.png": [126, 203, 24], "mcl_core_lapis_ore.png": [111, 113, 125], "default_junglesapling.png": [64, 88, 39], "default_clay_brick.png": [127, 57, 48], "default_gold_block.png": [192, 147, 59], "mcl_core_glass_green_detail.png": [101, 126, 50], "mcl_core_glass_pink_detail.png": [241, 126, 164], "default_water_source_animated.png": [37, 98, 129], "mcl_core_glass_orange_detail.png": [215, 126, 50], "mcl_core_glass_yellow.png": [228, 228, 50], "default_acacia_sapling.png": [109, 92, 59], "mcl_core_stripped_acacia_side.png": [151, 90, 57], "mcl_core_sandstone_carved.png": [199, 152, 119], "mcl_core_glass_blue.png": [50, 75, 178], "mcl_core_glass_gray_detail.png": [75, 75, 75], "mcl_core_red_sandstone_normal.png": [198, 120, 104], "mcl_core_glass_red_detail.png": [153, 50, 50], "mcl_core_glass_gray.png": [75, 75, 75], "mcl_core_leaves_spruce.png": [38, 74, 47], "mcl_core_glass_pink.png": [241, 126, 164], "mcl_core_lapis_block.png": [50, 92, 162], "mcl_core_glass_purple.png": [126, 62, 178], "mcl_core_iron_nugget.png": [156, 151, 145], "default_dry_grass.png": [100, 94, 54], "mcl_core_stripped_dark_oak_top.png": [90, 78, 68], "mcl_core_glass_silver.png": [153, 153, 153], "mcl_core_andesite.png": [104, 110, 107], "mcl_core_frosted_ice_3.png": [165, 209, 233], "mcl_core_sugar.png": [215, 215, 215], "default_acacia_wood.png": [152, 100, 69], "mcl_core_glass_black.png": [24, 24, 24], "mcl_core_iron_ore.png": [134, 123, 117], "mcl_core_stripped_birch_side.png": [179, 143, 115], "default_clay.png": [124, 124, 124], "mcl_core_stripped_jungle_side.png": [175, 117, 86], "mcl_core_glass_red.png": [153, 50, 50], "mcl_core_grass_block_top.png": [141, 130, 113], "mcl_core_planks_birch.png": [145, 113, 89], "mcl_core_glass_white.png": [254, 254, 254], "mcl_core_stripped_oak_side.png": [162, 122, 84], "mcl_core_glass_cyan.png": [75, 126, 153], "mcl_core_cactus_side.png": [88, 110, 56], "default_ladder.png": [83, 64, 50], "mcl_core_glass_silver_detail.png": [153, 153, 153], "default_dry_grass_side.png": [91, 93, 52], "mcl_core_glass_light_blue_detail.png": [101, 153, 215], "mcl_core_stripped_jungle_top.png": [170, 113, 83], "mcl_core_ice_packed.png": [165, 211, 231], "mcl_core_frosted_ice_2.png": [153, 202, 229], "default_dry_shrub.png": [118, 88, 69], "mcl_core_red_sandstone_carved.png": [202, 122, 104], "default_tree.png": [95, 75, 57], "default_clay_lump.png": [111, 111, 111], "mcl_core_red_sandstone_top.png": [212, 126, 108], "mcl_core_dirt_podzol_side.png": [101, 79, 63], "mcl_core_red_sandstone_smooth.png": [207, 124, 106], "default_jungletree_top.png": [125, 87, 67], "mcl_core_coal_ore.png": [109, 101, 99], "default_jungleleaves.png": [29, 84, 30], "mcl_core_vine.png": [21, 61, 21], "default_snow.png": [221, 229, 234], "mcl_core_leaves_big_oak.png": [21, 69, 28], "mcl_core_void.png": [59, 59, 59], "default_tree_top.png": [135, 104, 74], "mcl_core_gold_ore.png": [132, 119, 103], "default_steel_ingot.png": [142, 137, 131], "default_sapling.png": [62, 90, 45], "mcl_core_log_birch.png": [194, 184, 174], "mcl_core_glass_cyan_detail.png": [75, 126, 153], "mcl_core_glass_yellow_detail.png": [228, 228, 50], "mcl_core_stripped_spruce_top.png": [107, 79, 64], "default_water_flowing_animated.png": [38, 101, 129], "mcl_core_emerald_block.png": [44, 138, 39], "default_jungletree.png": [86, 58, 45], "mcl_core_grass_side_snowed.png": [162, 154, 150], "default_stone_brick.png": [97, 89, 86], "default_lava_flowing_animated.png": [177, 42, 16], "mcl_core_stripped_spruce_side.png": [109, 81, 67], "default_coal_lump.png": [41, 39, 41], "mcl_core_glass_purple_detail.png": [126, 62, 178], "default_sand.png": [220, 170, 127], "mcl_core_glass_green.png": [101, 126, 50], "mcl_core_glass_orange.png": [215, 126, 50], "default_acacia_tree_top.png": [130, 84, 55], "mcl_core_stripped_oak_top.png": [153, 115, 80], "mcl_core_grass_block_side_overlay.png": [153, 142, 123], "default_lava_source_animated.png": [180, 45, 17], "mcl_core_cactus_bottom.png": [169, 168, 116], "mcl_core_sandstone_bottom.png": [202, 155, 121], "default_paper.png": [213, 184, 154], "mcl_core_diamond_ore.png": [122, 124, 126], "default_ice.png": [145, 197, 226], "mcl_core_dirt_podzol_top.png": [85, 63, 42], "mcl_core_slime.png": [93, 157, 86], "mcl_core_gold_nugget.png": [213, 169, 74], "default_stick.png": [88, 70, 57], "mcl_core_emerald.png": [59, 160, 52], "default_diamond.png": [109, 179, 217], "mcl_core_mycelium_top.png": [108, 89, 117], "mcl_core_bone_block_side.png": [226, 207, 174], "mcl_core_diorite_smooth.png": [157, 154, 152], "default_obsidian.png": [13, 9, 25], "mcl_core_planks_big_oak.png": [87, 74, 62], "mcl_core_log_spruce.png": [66, 51, 44], "mcl_core_glass_magenta.png": [178, 75, 215], "mcl_core_granite.png": [153, 121, 110], "mcl_core_log_big_oak_top.png": [83, 70, 62], "default_cobble.png": [113, 106, 104], "mcl_core_red_sandstone_bottom.png": [207, 124, 106], "mcl_core_barrier.png": [138, 46, 38], "mcl_core_glass_magenta_detail.png": [178, 75, 215], "mcl_core_stripped_dark_oak_side.png": [91, 78, 70], "mcl_core_mycelium_side.png": [107, 84, 87], "mcl_core_stonebrick_cracked.png": [94, 87, 83], "mcl_core_charcoal.png": [40, 35, 32], "mcl_core_glass_brown.png": [101, 75, 50], "default_glass_detail.png": [244, 244, 250], "mcl_core_papyrus.png": [105, 105, 105], "mcl_core_stonebrick_carved.png": [97, 90, 85], "default_wood.png": [113, 87, 67], "default_dirt.png": [108, 83, 70], "mcl_core_log_big_oak.png": [74, 62, 55], "default_junglewood.png": [113, 78, 59], "mcl_core_frosted_ice_0.png": [140, 193, 224], "mcl_core_sandstone_normal.png": [195, 149, 117], "default_gravel.png": [112, 105, 99], "mcl_core_sandstone_top.png": [201, 154, 121], "default_glass.png": [213, 223, 235], "default_stone.png": [130, 122, 118], "mcl_core_sapling_birch.png": [78, 110, 74], "mcl_core_coarse_dirt.png": [117, 92, 76], "default_acacia_leaves.png": [110, 89, 45], "mcl_core_stripped_birch_top.png": [170, 135, 108], "mcl_core_grass_path_top.png": [125, 101, 50], "mcl_lanterns_chain.png": [40, 40, 40], "mcl_lanterns_soul_lantern.png": [50, 67, 68], "mcl_lanterns_lantern.png": [72, 59, 48], "mcl_lanterns_chain_inv.png": [40, 40, 40], "mcl_lanterns_lantern_inv.png": [98, 75, 53], "mcl_lanterns_soul_lantern_inv.png": [59, 90, 91], "mcl_throwing_ender_pearl.png": [78, 19, 26], "mcl_throwing_egg.png": [199, 157, 106], "mcl_throwing_snowball.png": [191, 200, 203], "mcl_flowers_tulip_red.png": [82, 57, 43], "mcl_flowers_double_plant_rose_top.png": [81, 69, 45], "mcl_flowers_double_plant_sunflower_front.png": [203, 157, 61], "mcl_flowers_tulip_white.png": [106, 122, 95], "mcl_flowers_double_plant_grass_top.png": [156, 145, 125], "mcl_flowers_azure_bluet.png": [97, 114, 98], "mcl_flowers_oxeye_daisy.png": [130, 139, 110], "mcl_flowers_poppy.png": [96, 59, 43], "mcl_flowers_double_plant_paeonia_top.png": [90, 84, 81], "mcl_flowers_double_plant_rose_bottom.png": [78, 63, 41], "mcl_flowers_tallgrass.png": [151, 141, 122], "mcl_flowers_double_plant_sunflower_bottom.png": [45, 76, 40], "mcl_flowers_fern.png": [143, 132, 115], "flowers_tulip.png": [106, 84, 51], "mcl_flowers_double_plant_syringa_bottom.png": [63, 77, 60], "mcl_flowers_double_plant_fern_bottom.png": [140, 130, 113], "flowers_dandelion_yellow.png": [111, 111, 55], "mcl_flowers_double_plant_paeonia_bottom.png": [82, 83, 73], "mcl_flowers_double_plant_sunflower_back.png": [174, 146, 57], "mcl_flowers_allium.png": [120, 116, 144], "flowers_waterlily.png": [28, 81, 29], "mcl_flowers_tulip_pink.png": [100, 99, 90], "mcl_flowers_double_plant_sunflower_top.png": [48, 81, 44], "mcl_flowers_double_plant_syringa_top.png": [95, 90, 98], "mcl_flowers_double_plant_grass_bottom.png": [151, 140, 121], "mcl_flowers_double_plant_grass_inv.png": [48, 95, 43], "mcl_flowers_fern_inv.png": [43, 86, 39], "mcl_flowers_double_plant_fern_top.png": [148, 138, 119], "mcl_flowers_tallgrass_inv.png": [47, 92, 41], "mcl_flowers_double_plant_fern_inv.png": [45, 89, 40], "mcl_flowers_blue_orchid.png": [46, 91, 86], "mcl_armor_leggings_iron.png": [132, 128, 123], "mcl_armor_inv_leggings_iron.png": [130, 125, 120], "mcl_armor_inv_helmet_gold.png": [178, 134, 51], "mcl_armor_leggings_chain.png": [64, 66, 69], "mcl_armor_inv_boots_iron.png": [134, 129, 124], "mcl_armor_inv_chestplate_chain.png": [128, 105, 96], "mcl_armor_inv_chestplate_gold.png": [171, 128, 55], "mcl_armor_inv_helmet_diamond.png": [109, 130, 142], "mcl_armor_boots_leather.png": [122, 111, 93], "mcl_armor_inv_chestplate_diamond.png": [106, 146, 168], "mcl_armor_helmet_diamond.png": [70, 85, 93], "mcl_armor_inv_chestplate_leather.png": [143, 136, 118], "mcl_armor_boots_diamond.png": [87, 132, 157], "mcl_armor_leggings_diamond.png": [78, 102, 115], "mcl_armor_chestplate_gold.png": [157, 117, 55], "mcl_armor_inv_helmet_chain.png": [140, 137, 132], "mcl_armor_inv_leggings_chain.png": [81, 81, 82], "mcl_armor_inv_helmet_iron.png": [143, 138, 133], "mcl_armor_helmet_leather.png": [130, 121, 102], "mcl_armor_chestplate_diamond.png": [110, 157, 183], "mcl_armor_leggings_leather.png": [119, 108, 91], "mcl_armor_inv_boots_gold.png": [152, 113, 44], "mcl_armor_chestplate_leather.png": [139, 132, 112], "mcl_armor_boots_iron.png": [118, 113, 109], "mcl_armor_elytra.png": [75, 121, 147], "mcl_armor_helmet_chain.png": [127, 124, 121], "mcl_armor_helmet_iron.png": [153, 149, 144], "mcl_armor_inv_boots_leather.png": [130, 121, 103], "mcl_armor_leggings_gold.png": [182, 158, 126], "mcl_armor_inv_leggings_gold.png": [175, 145, 97], "mcl_armor_chestplate_iron.png": [130, 120, 112], "mcl_armor_inv_elytra.png": [76, 122, 148], "mcl_armor_boots_chain.png": [88, 88, 88], "mcl_armor_helmet_gold.png": [178, 136, 56], "mcl_armor_inv_boots_diamond.png": [75, 121, 147], "mcl_armor_inv_chestplate_iron.png": [135, 125, 115], "mcl_armor_inv_leggings_diamond.png": [75, 93, 103], "mcl_armor_inv_leggings_leather.png": [126, 116, 98], "mcl_armor_inv_helmet_leather.png": [140, 132, 114], "mcl_armor_inv_boots_chain.png": [69, 69, 72], "mcl_armor_chestplate_chain.png": [119, 98, 93], "mcl_armor_boots_gold.png": [160, 118, 42], "cartography_table_side2.png": [91, 76, 62], "cartography_table_side1.png": [81, 65, 51], "cartography_table_side3.png": [85, 62, 47], "cartography_table_top.png": [111, 95, 80], "mcl_walls_cobble_wall_top.png": [120, 114, 112], "mcl_walls_cobble_mossy_wall_top.png": [53, 97, 61], "mcl_walls_cobble_wall_side.png": [109, 103, 101], "mcl_walls_cobble_mossy_wall_side.png": [86, 98, 83], "mcl_hoppers_item.png": [44, 44, 44], "mcl_hoppers_hopper_top.png": [43, 43, 43], "mcl_hoppers_hopper_outside.png": [44, 43, 43], "mcl_hoppers_hopper_inside.png": [50, 50, 50], "mcl_stairs_stone_slab_top.png": [127, 118, 114], "mcl_stairs_stone_slab_side.png": [127, 117, 113], "mcl_stairs_turntexture.png": [255, 0, 255], "mcl_shield_pattern_stripe_downleft.png": [255, 255, 255], "mcl_shield_pattern_diagonal_right.png": [255, 255, 255], "mcl_shield_pattern_stripe_center.png": [255, 255, 255], "mcl_shield_pattern_half_vertical_right.png": [255, 255, 255], "mcl_shield_pattern_straight_cross.png": [255, 255, 255], "mcl_shield_pattern_stripe_bottom.png": [255, 255, 255], "mcl_shield_pattern_stripe_right.png": [255, 255, 255], "mcl_shield_pattern_circle.png": [239, 239, 239], "mcl_shield_pattern_diagonal_left.png": [255, 255, 255], "mcl_shield_pattern_stripe_top.png": [255, 255, 255], "mcl_shield_pattern_diagonal_up_left.png": [255, 255, 255], "mcl_shield_pattern_creeper.png": [255, 255, 255], "mcl_shield_pattern_triangle_top.png": [255, 255, 255], "mcl_shield_item_overlay.png": [255, 255, 255], "mcl_shield_pattern_square_top_left.png": [255, 255, 255], "mcl_shield_pattern_flower.png": [255, 255, 255], "mcl_shield_pattern_half_horizontal.png": [255, 255, 255], "mcl_shield_pattern_stripe_middle.png": [255, 255, 255], "mcl_shield_pattern_half_vertical.png": [255, 255, 255], "mcl_shield_pattern_triangles_top.png": [255, 255, 255], "mcl_shield_pattern_stripe_downright.png": [255, 255, 255], "mcl_shield_pattern_skull.png": [247, 247, 247], "mcl_shield.png": [76, 61, 49], "mcl_shield_pattern_base.png": [255, 255, 255], "mcl_shield_pattern_gradient_up.png": [254, 254, 254], "mcl_shield_pattern_small_stripes.png": [255, 255, 255], "mcl_shield_pattern_square_bottom_left.png": [255, 255, 255], "mcl_shield_pattern_diagonal_up_right.png": [255, 255, 255], "mcl_shield_pattern_triangles_bottom.png": [255, 255, 255], "mcl_shield_pattern_curly_border.png": [255, 255, 255], "mcl_shield_pattern_cross.png": [255, 255, 255], "mcl_shield_pattern_stripe_left.png": [255, 255, 255], "mcl_shield_pattern_gradient.png": [254, 254, 254], "mcl_shield_pattern_square_bottom_right.png": [255, 255, 255], "mcl_shield_pattern_triangle_bottom.png": [255, 255, 255], "mcl_shield_pattern_half_horizontal_bottom.png": [255, 255, 255], "mcl_shield_pattern_bricks.png": [255, 255, 255], "mcl_shield_pattern_thing.png": [255, 255, 255], "mcl_shield_pattern_square_top_right.png": [255, 255, 255], "mcl_shield_pattern_rhombus.png": [255, 255, 255], "mcl_shield_pattern_border.png": [255, 255, 255], "mcl_shield_hud.png": [74, 58, 44], "mcl_shield_base_nopattern.png": [72, 59, 49], "mcl_brewing_bottle_bg.png": [204, 204, 204], "mcl_brewing_bubble_sprite.png": [167, 167, 167], "mcl_brewing_side.png": [175, 156, 160], "mcl_brewing_inventory.png": [168, 168, 168], "mcl_brewing_bubbles_active.png": [186, 186, 186], "mcl_brewing_fuel_bg.png": [200, 200, 200], "mcl_brewing_potion_bg.png": [204, 204, 204], "mcl_brewing_bubbles.png": [154, 154, 154], "mcl_brewing_top.png": [139, 130, 126], "mcl_brewing_base.png": [130, 122, 118], "mcl_brewing_burner.png": [183, 183, 183], "mcl_brewing_burner_active.png": [212, 161, 132], "fletching_table_front.png": [141, 115, 95], "fletching_table_side.png": [150, 117, 95], "fletching_table_top.png": [158, 129, 104], "xpanes_top_glass_cyan.png": [76, 127, 153], "xpanes_top_glass_brown.png": [102, 76, 51], "xpanes_top_glass_magenta.png": [178, 75, 215], "xpanes_top_glass_light_blue.png": [102, 153, 216], "xpanes_top_glass_blue.png": [51, 76, 178], "xpanes_top_glass_gray.png": [76, 76, 76], "xpanes_top_glass_silver.png": [153, 153, 153], "xpanes_top_iron.png": [155, 146, 146], "xpanes_top_glass_black.png": [25, 25, 25], "xpanes_top_glass_white.png": [255, 255, 255], "xpanes_top_glass_lime.png": [127, 204, 25], "xpanes_top_glass_orange.png": [216, 127, 51], "xpanes_top_glass_purple.png": [127, 63, 178], "xpanes_top_glass_red.png": [153, 51, 51], "xpanes_top_glass_natural.png": [222, 222, 239], "xpanes_top_glass_green.png": [102, 127, 51], "xpanes_top_glass_pink.png": [241, 126, 164], "xpanes_pane_iron.png": [160, 152, 152], "xpanes_top_glass_yellow.png": [229, 229, 51], "hardened_clay_stained_pink.png": [164, 79, 76], "mcl_colorblocks_glazed_terracotta_yellow.png": [232, 199, 99], "mcl_colorblocks_glazed_terracotta_orange.png": [170, 146, 81], "mcl_colorblocks_concrete_powder_lime.png": [125, 186, 42], "mcl_colorblocks_concrete_brown.png": [98, 60, 32], "mcl_colorblocks_concrete_magenta.png": [171, 49, 162], "mcl_colorblocks_glazed_terracotta_magenta.png": [210, 108, 215], "mcl_colorblocks_concrete_silver.png": [128, 129, 118], "mcl_colorblocks_glazed_terracotta_grey.png": [90, 90, 90], "mcl_colorblocks_concrete_powder_blue.png": [72, 75, 169], "mcl_colorblocks_concrete_yellow.png": [241, 177, 21], "mcl_colorblocks_concrete_red.png": [146, 34, 34], "mcl_colorblocks_glazed_terracotta_lime.png": [152, 211, 72], "mcl_colorblocks_concrete_black.png": [8, 10, 15], "mcl_colorblocks_glazed_terracotta_silver.png": [134, 151, 151], "hardened_clay_stained_white.png": [213, 197, 184], "mcl_colorblocks_glazed_terracotta_green.png": [111, 135, 50], "mcl_colorblocks_glazed_terracotta_blue.png": [34, 65, 117], "mcl_colorblocks_concrete_powder_red.png": [172, 57, 52], "mcl_colorblocks_concrete_powder_cyan.png": [38, 150, 159], "hardened_clay_stained_purple.png": [81, 71, 123], "hardened_clay_stained_brown.png": [96, 69, 61], "hardened_clay_stained_grey.png": [110, 92, 85], "mcl_colorblocks_concrete_lime.png": [96, 171, 25], "hardened_clay_stained_blue.png": [68, 91, 143], "mcl_colorblocks_concrete_powder_white.png": [224, 225, 225], "hardened_clay_stained_yellow.png": [177, 128, 51], "hardened_clay_stained_light_blue.png": [91, 128, 171], "hardened_clay.png": [143, 104, 87], "mcl_colorblocks_concrete_cyan.png": [21, 123, 140], "mcl_colorblocks_glazed_terracotta_brown.png": [108, 88, 64], "mcl_colorblocks_concrete_grey.png": [56, 59, 64], "mcl_colorblocks_concrete_powder_magenta.png": [196, 94, 189], "mcl_colorblocks_concrete_powder_black.png": [22, 26, 30], "mcl_colorblocks_concrete_pink.png": [213, 103, 144], "mcl_colorblocks_concrete_powder_orange.png": [227, 141, 38], "mcl_colorblocks_glazed_terracotta_cyan.png": [90, 131, 136], "mcl_colorblocks_glazed_terracotta_red.png": [184, 67, 53], "mcl_colorblocks_concrete_green.png": [75, 94, 37], "mcl_colorblocks_concrete_blue.png": [46, 48, 147], "mcl_colorblocks_glazed_terracotta_light_blue.png": [99, 162, 204], "hardened_clay_stained_orange.png": [156, 95, 69], "mcl_colorblocks_concrete_powder_silver.png": [160, 160, 155], "mcl_colorblocks_concrete_powder_pink.png": [224, 148, 176], "hardened_clay_stained_silver.png": [149, 129, 117], "hardened_clay_stained_red.png": [159, 81, 66], "hardened_clay_stained_magenta.png": [150, 80, 85], "mcl_colorblocks_glazed_terracotta_black.png": [38, 22, 22], "mcl_colorblocks_concrete_white.png": [208, 214, 215], "hardened_clay_stained_green.png": [74, 101, 63], "hardened_clay_stained_lime.png": [105, 134, 73], "mcl_colorblocks_concrete_powder_green.png": [104, 127, 45], "mcl_colorblocks_concrete_light_blue.png": [37, 140, 200], "mcl_colorblocks_concrete_powder_brown.png": [128, 86, 54], "mcl_colorblocks_concrete_purple.png": [103, 32, 159], "hardened_clay_stained_cyan.png": [71, 107, 123], "mcl_colorblocks_concrete_powder_purple.png": [138, 58, 180], "mcl_colorblocks_concrete_powder_yellow.png": [230, 198, 54], "mcl_colorblocks_concrete_powder_light_blue.png": [75, 181, 212], "mcl_colorblocks_glazed_terracotta_pink.png": [251, 138, 170], "mcl_colorblocks_glazed_terracotta_purple.png": [112, 49, 152], "mcl_colorblocks_concrete_orange.png": [226, 101, 1], "mcl_colorblocks_concrete_powder_grey.png": [91, 98, 103], "hardened_clay_stained_black.png": [69, 52, 46], "mcl_colorblocks_glazed_terracotta_white.png": [188, 211, 202], "fire_basic_flame_animated.png": [206, 98, 34], "mcl_burning_hud_flame_animated.png": [206, 98, 34], "mcl_fire_fire_charge.png": [95, 58, 41], "mcl_burning_entity_flame_animated.png": [206, 98, 34], "mcl_fire_flint_and_steel.png": [96, 95, 93], "fire_basic_flame.png": [207, 100, 36], "dye_red.png": [113, 74, 47], "dye_yellow.png": [123, 91, 49], "dye_violet.png": [107, 76, 57], "dye_dark_green.png": [99, 81, 47], "mcl_dye_blue.png": [58, 101, 173], "dye_cyan.png": [104, 89, 60], "mcl_dye_lime.png": [107, 91, 53], "dye_pink.png": [120, 81, 61], "mcl_dye_light_blue.png": [103, 88, 70], "dye_dark_grey.png": [108, 81, 52], "mcl_dye_white.png": [205, 193, 166], "dye_grey.png": [113, 86, 58], "dye_magenta.png": [111, 79, 59], "dye_orange.png": [122, 85, 48], "mcl_dye_brown.png": [104, 75, 56], "mcl_dye_black.png": [56, 56, 64], "default_river_water_flowing_animated.png": [38, 123, 130], "default_river_water_source_animated.png": [37, 120, 130], "3d_armor_stand_item.png": [134, 114, 98], "smoker_front_on.png": [105, 81, 68], "smoker_bottom.png": [115, 102, 97], "smoker_side.png": [105, 91, 82], "smoker_front.png": [93, 80, 71], "smoker_top.png": [110, 99, 95], "mob_spawner.png": [40, 40, 40], "mcl_nether_quartz_chiseled_side.png": [194, 186, 183], "mcl_nether_quartz_pillar_top.png": [195, 188, 185], "mcl_nether_nether_wart.png": [190, 79, 75], "mcl_nether_nether_wart_stage_1.png": [86, 54, 51], "mcl_nether_quartz_ore.png": [133, 64, 53], "mcl_nether_soul_sand.png": [90, 70, 51], "mcl_nether_nether_wart_block.png": [175, 76, 73], "mcl_nether_nether_wart_stage_0.png": [53, 41, 38], "mcl_nether_quartz_block_bottom.png": [198, 191, 187], "mcl_nether_quartz_block_top.png": [198, 190, 187], "mcl_nether_quartz.png": [152, 149, 147], "mcl_nether_quartz_pillar_side.png": [195, 188, 184], "mcl_nether_netherbrick.png": [58, 24, 20], "mcl_nether_glowstone.png": [202, 154, 96], "mcl_nether_netherrack.png": [130, 50, 39], "mcl_nether_red_nether_brick.png": [69, 17, 5], "mcl_nether_quartz_chiseled_top.png": [197, 189, 186], "mcl_nether_glowstone_dust.png": [209, 137, 67], "mcl_nether_nether_wart_stage_2.png": [106, 57, 53], "mcl_nether_quartz_block_side.png": [198, 190, 187], "mcl_nether_nether_brick.png": [49, 23, 24], "mcl_nether_magma.png": [85, 33, 27], "mcl_cauldrons_cauldron_inner.png": [24, 24, 24], "mcl_cauldrons_cauldron_top.png": [54, 54, 54], "mcl_cauldrons_cauldron_bottom.png": [50, 37, 38], "mcl_cauldrons_cauldron.png": [47, 47, 47], "mcl_cauldrons_cauldron_side.png": [43, 43, 43], "mcl_beds_bed_side_bottom_magenta.png": [127, 48, 89], "mcl_beds_bed_blue.png": [73, 78, 105], "mcl_beds_bed_side_top_r_black.png": [99, 86, 75], "mcl_beds_bed_side_bottom_r_magenta.png": [132, 46, 94], "mcl_beds_bed_side_top_brown.png": [98, 76, 59], "respawn_anchor_side2.png": [100, 76, 77], "mcl_beds_bed_lime.png": [96, 135, 66], "mcl_beds_bed_side_top_green.png": [98, 76, 59], "mcl_beds_bed_light_blue.png": [100, 107, 142], "mcl_beds_bed_pink.png": [184, 105, 115], "mcl_beds_bed_side_bottom_black.png": [66, 56, 47], "mcl_beds_bed_top_bottom_green.png": [57, 110, 29], "mcl_beds_bed_side_top_blue.png": [98, 76, 59], "mcl_beds_bed_top_top_pink.png": [217, 138, 147], "mcl_beds_bed_side_bottom_light_blue.png": [90, 94, 129], "mcl_beds_bed_side_bottom_blue.png": [63, 65, 90], "mcl_beds_bed_top_top_red.png": [173, 90, 83], "mcl_beds_bed_side_top_grey.png": [98, 76, 59], "respawn_anchor_bottom.png": [45, 26, 54], "mcl_beds_bed_top_top_white.png": [198, 190, 183], "mcl_beds_bed_top_top_black.png": [107, 100, 92], "mcl_beds_bed_top_bottom_brown.png": [101, 69, 38], "mcl_beds_bed_top_bottom_pink.png": [232, 105, 135], "mcl_beds_bed_side_bottom_r_pink.png": [183, 95, 106], "respawn_anchor_side4.png": [110, 87, 85], "mcl_beds_bed_side_bottom_r_green.png": [73, 97, 42], "mcl_beds_bed_side_bottom_r_grey.png": [86, 77, 69], "mcl_beds_bed_side_top_r_white.png": [158, 145, 134], "mcl_beds_bed_side_bottom_orange.png": [143, 84, 28], "mcl_beds_bed_side_bottom_purple.png": [105, 36, 112], "mcl_beds_bed_side_bottom_r_light_blue.png": [90, 97, 136], "mcl_beds_bed_side_top_r_magenta.png": [140, 81, 103], "mcl_beds_bed_side_bottom_r_yellow.png": [150, 131, 25], "mcl_beds_bed_side_top_r_pink.png": [176, 111, 113], "mcl_beds_bed_top_top_blue.png": [105, 112, 137], "portal.png": [102, 61, 130], "mcl_beds_bed_side_bottom_green.png": [74, 94, 43], "mcl_beds_bed_side_bottom_r_blue.png": [61, 66, 95], "mcl_beds_bed_top_top_grey.png": [129, 121, 113], "mcl_beds_bed_black.png": [76, 68, 61], "mcl_beds_bed_top_top_silver.png": [159, 151, 143], "mcl_beds_bed_white.png": [173, 165, 158], "mcl_beds_bed_top_top_cyan.png": [105, 144, 135], "mcl_beds_bed_top_bottom_orange.png": [184, 91, 0], "mcl_beds_bed_side_top_silver.png": [98, 76, 59], "mcl_beds_bed_top_top_brown.png": [143, 118, 93], "mcl_beds_bed_side_top_r_light_blue.png": [115, 111, 132], "mcl_beds_bed_side_bottom_r_lime.png": [86, 129, 53], "mcl_beds_bed_red.png": [139, 58, 51], "mcl_beds_bed_top_bottom_lime.png": [79, 163, 47], "mcl_beds_bed_side_top_r_brown.png": [121, 97, 75], "respawn_anchor_top_off.png": [80, 61, 74], "mcl_beds_bed_side_bottom_r_silver.png": [119, 109, 102], "mcl_beds_bed_yellow.png": [154, 138, 41], "mcl_beds_bed_side_top_yellow.png": [98, 76, 59], "mcl_beds_bed_top_bottom_black.png": [37, 37, 37], "mcl_beds_bed_brown.png": [110, 85, 61], "mcl_beds_bed_side_top_orange.png": [98, 76, 59], "mcl_beds_bed_side_top_red.png": [98, 76, 59], "mcl_beds_bed_top_top_purple.png": [148, 79, 161], "mcl_beds_bed_side_bottom_pink.png": [177, 93, 102], "mcl_beds_bed_side_top_r_grey.png": [112, 99, 88], "respawn_anchor_side1.png": [95, 71, 76], "mcl_beds_bed_side_top_r_blue.png": [97, 91, 104], "mcl_beds_bed_side_top_purple.png": [98, 76, 59], "mcl_beds_bed_side_top_cyan.png": [98, 76, 59], "mcl_beds_bed_top_bottom_blue.png": [32, 60, 119], "mcl_beds_bed_side_bottom_yellow.png": [143, 125, 28], "mcl_beds_bed_side_top_black.png": [98, 76, 59], "mcl_beds_bed_top_top_orange.png": [188, 130, 72], "mcl_beds_bed_top_bottom_silver.png": [129, 129, 129], "mcl_beds_bed_top_top_green.png": [117, 140, 88], "mcl_beds_bed_cyan.png": [73, 111, 103], "mcl_beds_bed_top_bottom_red.png": [157, 20, 20], "mcl_beds_bed_top_bottom_purple.png": [111, 0, 163], "mcl_beds_bed_side_top_r_silver.png": [133, 120, 109], "mcl_beds_bed_side_bottom_grey.png": [86, 76, 67], "mcl_beds_bed_grey.png": [96, 88, 81], "mcl_beds_bed_side_top_r_yellow.png": [151, 132, 62], "respawn_anchor_side0.png": [81, 64, 73], "mcl_beds_bed_side_top_r_green.png": [103, 111, 72], "mcl_beds_bed_side_bottom_brown.png": [100, 73, 48], "mcl_beds_bed_magenta.png": [138, 60, 104], "mcl_beds_bed_side_bottom_r_red.png": [134, 44, 37], "mcl_beds_bed_side_bottom_r_brown.png": [101, 73, 47], "mcl_beds_bed_side_top_lime.png": [98, 76, 59], "mcl_beds_bed_side_top_light_blue.png": [98, 76, 59], "mcl_beds_bed_side_bottom_red.png": [129, 47, 38], "mcl_beds_bed_bottom_top.png": [48, 38, 29], "mcl_beds_bed_top_bottom_grey.png": [76, 76, 76], "mcl_beds_bed_side_bottom_r_orange.png": [150, 86, 25], "mcl_beds_bed_side_bottom_r_black.png": [64, 54, 47], "mcl_beds_bed_top_bottom_cyan.png": [32, 119, 114], "mcl_beds_bed_side_bottom_silver.png": [116, 106, 97], "mcl_beds_bed_side_top_magenta.png": [98, 76, 59], "mcl_beds_bed_top_bottom_white.png": [201, 201, 201], "mcl_beds_bed_side_top_r_orange.png": [151, 105, 62], "mcl_beds_bed_top_bottom_magenta.png": [154, 23, 118], "mcl_beds_bed_side_top_r_lime.png": [110, 131, 80], "mcl_beds_bed_top_top_magenta.png": [172, 92, 137], "mcl_beds_bed_bottom_bottom.png": [48, 38, 29], "mcl_beds_bed_side_top_r_purple.png": [125, 73, 119], "mcl_beds_bed_side_top_r_cyan.png": [97, 113, 103], "mcl_beds_bed_side_top_white.png": [98, 76, 59], "mcl_beds_bed_side_bottom_r_cyan.png": [61, 101, 93], "mcl_beds_bed_side_bottom_cyan.png": [63, 97, 89], "mcl_beds_bed_side_bottom_white.png": [161, 151, 142], "mcl_beds_bed_top_bottom_yellow.png": [184, 169, 0], "respawn_anchor_side3.png": [104, 80, 79], "mcl_beds_bed_top_bottom_light_blue.png": [82, 113, 182], "mcl_beds_bed_top_top_lime.png": [130, 169, 98], "mcl_beds_bed_silver.png": [109, 100, 93], "mcl_beds_bed_purple.png": [115, 47, 128], "mcl_beds_bed_side_top_r_red.png": [141, 80, 69], "mcl_beds_bed_top_top_light_blue.png": [132, 141, 174], "mcl_beds_bed_side_bottom_r_purple.png": [107, 32, 120], "mcl_beds_bed_side_bottom_r_white.png": [161, 151, 144], "mcl_beds_bed_orange.png": [154, 96, 41], "mcl_beds_bed_top_bottom_gray.png": [57, 57, 57], "mcl_beds_bed_side_bottom_lime.png": [85, 122, 53], "mcl_beds_bed_green.png": [85, 107, 56], "mcl_beds_bed_top_top_yellow.png": [188, 172, 72], "mcl_beds_bed_side_top_pink.png": [98, 76, 59], "mcl_sponges_sponge_wet_river_water.png": [157, 141, 104], "mcl_sponges_sponge.png": [210, 177, 118], "mcl_sponges_sponge_wet.png": [156, 134, 92], "mcl_copper_exposed_cut.png": [129, 92, 82], "mcl_copper_raw.png": [133, 68, 50], "mcl_copper_block_cut.png": [148, 77, 57], "mcl_copper_oxidized_cut.png": [91, 110, 110], "mcl_copper_block.png": [147, 77, 56], "mcl_copper_oxidized.png": [90, 108, 110], "mcl_copper_block_raw.png": [168, 90, 68], "mcl_copper_ingot.png": [157, 82, 61], "mcl_copper_weathered.png": [103, 102, 100], "mcl_copper_weathered_cut.png": [107, 103, 100], "mcl_copper_anti_oxidation_particle.png": [251, 250, 247], "mcl_copper_ore.png": [127, 66, 48], "mcl_copper_exposed.png": [128, 92, 83], "farming_mushroom_red.png": [169, 59, 58], "mcl_mushrooms_mushroom_block_inside.png": [218, 175, 136], "mcl_mushrooms_mushroom_block_skin_brown.png": [131, 86, 68], "mcl_mushrooms_mushroom_block_skin_stem.png": [204, 183, 149], "mcl_mushrooms_mushroom_block_skin_red.png": [137, 39, 25], "farming_mushroom_brown.png": [121, 81, 59], "farming_mushroom_stew.png": [134, 97, 67], "mcl_bells_bell_top.png": [207, 203, 82], "mcl_bells_bell_side.png": [214, 204, 84], "mcl_bells_bell.png": [188, 143, 54], "mcl_bells_bell_bottom.png": [117, 114, 39], "default_tool_goldsword.png": [194, 154, 70], "default_tool_steelsword.png": [134, 130, 125], "default_tool_woodsword.png": [100, 82, 68], "default_tool_goldshovel.png": [167, 133, 64], "default_tool_steelpick.png": [137, 128, 119], "default_tool_woodshovel.png": [108, 90, 76], "default_tool_goldpick.png": [172, 139, 73], "default_tool_woodaxe.png": [110, 92, 77], "default_tool_diamondsword.png": [105, 133, 149], "default_tool_steelshovel.png": [125, 115, 107], "default_tool_stonesword.png": [133, 125, 118], "default_tool_woodpick.png": [110, 91, 76], "default_tool_shears.png": [139, 132, 124], "default_tool_goldaxe.png": [160, 128, 66], "default_tool_stoneshovel.png": [126, 116, 107], "default_tool_diamondaxe.png": [103, 110, 113], "default_tool_diamondshovel.png": [106, 125, 134], "default_tool_steelaxe.png": [129, 119, 110], "default_tool_stoneaxe.png": [126, 115, 104], "default_tool_diamondpick.png": [92, 105, 111], "default_tool_stonepick.png": [126, 114, 104], "mcl_chests_ender_chest_right.png": [73, 67, 64], "mcl_chests_chest_trapped_right.png": [98, 78, 62], "default_chest_front.png": [85, 70, 58], "mcl_chests_blue_shulker_box_top.png": [67, 85, 119], "mcl_chests_chest_left.png": [99, 78, 63], "mcl_chests_dark_green_shulker_box_top.png": [67, 111, 70], "mcl_chests_chest_back.png": [92, 75, 61], "mcl_chests_ender_chest_bottom.png": [61, 55, 55], "mcl_chests_ender.png": [70, 62, 58], "mcl_chests_brown_shulker_box_top.png": [73, 63, 55], "mcl_chests_chest_trapped_back.png": [92, 75, 61], "mcl_chests_chest_trapped_side_big.png": [96, 77, 62], "mcl_chests_magenta_shulker_box_top.png": [128, 81, 124], "mcl_chests_noise.png": [192, 186, 189], "mcl_chests_ender_chest_back.png": [72, 66, 64], "mcl_chests_chest_trapped_bottom.png": [118, 91, 70], "mcl_chests_chest_trapped_front.png": [86, 68, 57], "default_chest_side_big.png": [96, 77, 62], "mcl_chests_green_shulker_box_top.png": [88, 122, 75], "mcl_chests_noise_double.png": [191, 189, 189], "mcl_chests_pink_shulker_box_top.png": [163, 116, 158], "mcl_chests_trapped.png": [95, 76, 61], "mcl_chests_blank.png": [255, 255, 255], "mcl_chests_normal_double.png": [98, 78, 62], "mcl_chests_chest_trapped_top.png": [88, 73, 61], "mcl_chests_normal.png": [95, 76, 61], "default_chest_front_big.png": [93, 75, 61], "mcl_chests_ender_chest_front.png": [76, 69, 65], "mcl_chests_white_shulker_box_top.png": [176, 178, 187], "mcl_chests_cyan_shulker_box_top.png": [67, 101, 121], "mcl_chests_ender_present.png": [123, 76, 93], "mcl_chests_chest_trapped_top_big.png": [100, 80, 65], "default_chest_top_big.png": [100, 80, 65], "mcl_chests_grey_shulker_box_top.png": [126, 129, 138], "mcl_chests_normal_present.png": [181, 46, 19], "mcl_chests_red_shulker_box_top.png": [132, 58, 57], "mcl_chests_trapped_double.png": [98, 78, 62], "mcl_chests_violet_shulker_box_top.png": [120, 71, 88], "mcl_chests_chest_trapped_front_big.png": [94, 75, 61], "mcl_chests_lightblue_shulker_box_top.png": [96, 130, 155], "mcl_chests_dark_grey_shulker_box_top.png": [87, 90, 99], "mcl_chests_black_shulker_box_top.png": [56, 57, 62], "mcl_chests_chest_right.png": [98, 78, 62], "mcl_chests_yellow_shulker_box_top.png": [165, 116, 53], "mcl_chests_trapped_present.png": [73, 100, 151], "mcl_chests_chest_bottom.png": [118, 91, 70], "default_chest_top.png": [88, 73, 61], "mcl_chests_trapped_double_present.png": [143, 77, 22], "mcl_chests_normal_double_present.png": [72, 90, 12], "mcl_chests_ender_chest_top.png": [70, 64, 61], "mcl_chests_ender_chest_left.png": [73, 67, 64], "mcl_chests_chest_trapped_left.png": [99, 78, 63], "mcl_chests_orange_shulker_box_top.png": [143, 74, 51], "screwdriver.png": [132, 119, 108], "_un.png": [0, 0, 0], "_at.png": [0, 0, 0], "_s_.png": [0, 0, 0], "_sz.png": [0, 0, 0], "_q.png": [0, 0, 0], "_1.png": [0, 0, 0], "_h_.png": [0, 0, 0], "_o_tilde.png": [0, 0, 0], "_q_.png": [0, 0, 0], "_ae.png": [0, 0, 0], "_e_circumflex_.png": [0, 0, 0], "_ex.png": [0, 0, 0], "_e_.png": [0, 0, 0], "_qo.png": [0, 0, 0], "_z_.png": [0, 0, 0], "_ps.png": [0, 0, 0], "_pound.png": [0, 0, 0], "_div.png": [0, 0, 0], "_l_.png": [0, 0, 0], "_pilcrow.png": [0, 0, 0], "_3_sup.png": [0, 0, 0], "_e_acute.png": [0, 0, 0], "_9.png": [0, 0, 0], "_e_grave_.png": [0, 0, 0], "_u_acute.png": [0, 0, 0], "_a_sup.png": [0, 0, 0], "_sr.png": [0, 0, 0], "_v.png": [0, 0, 0], "_ue_.png": [0, 0, 0], "_t_.png": [0, 0, 0], "_cl.png": [0, 0, 0], "_n_tilde_.png": [0, 0, 0], "_p_.png": [0, 0, 0], "_c.png": [0, 0, 0], "_a.png": [0, 0, 0], "_a_circumflex_.png": [0, 0, 0], "_8.png": [0, 0, 0], "_s.png": [0, 0, 0], "_o_.png": [0, 0, 0], "_1_4.png": [0, 0, 0], "_e_grave.png": [0, 0, 0], "_o_dash.png": [0, 0, 0], "_5.png": [0, 0, 0], "_d_dash_.png": [0, 0, 0], "_i_grave.png": [0, 0, 0], "_vb.png": [0, 0, 0], "_sp.png": [255, 255, 255], "_a_acute_.png": [0, 0, 0], "_as.png": [0, 0, 0], "_y_acute.png": [0, 0, 0], "_3_4.png": [0, 0, 0], "_6.png": [0, 0, 0], "_7.png": [0, 0, 0], "_tl.png": [0, 0, 0], "_t.png": [0, 0, 0], "_y.png": [0, 0, 0], "_ca.png": [0, 0, 0], "_e.png": [0, 0, 0], "_hs.png": [0, 0, 0], "_copyright.png": [0, 0, 0], "_l.png": [0, 0, 0], "_h.png": [0, 0, 0], "_u_circumflex_.png": [0, 0, 0], "_i_acute_.png": [0, 0, 0], "_ha.png": [0, 0, 0], "_y_diaresis.png": [0, 0, 0], "_gt.png": [0, 0, 0], "_b.png": [0, 0, 0], "_degree.png": [0, 0, 0], "_a_tilde_.png": [0, 0, 0], "_u_.png": [0, 0, 0], "_o_sup.png": [0, 0, 0], "_m_.png": [0, 0, 0], "_c_.png": [0, 0, 0], "_cr.png": [0, 0, 0], "_3.png": [0, 0, 0], "_currency.png": [0, 0, 0], "_f.png": [0, 0, 0], "_cedille.png": [0, 0, 0], "_u_grave_.png": [0, 0, 0], "_dt.png": [0, 0, 0], "_am.png": [0, 0, 0], "_c_cedille_.png": [0, 0, 0], "_u_acute_.png": [0, 0, 0], "_bl.png": [0, 0, 0], "_registered.png": [0, 0, 0], "_i_acute.png": [0, 0, 0], "_lt.png": [0, 0, 0], "_e_acute_.png": [0, 0, 0], "_paragraph.png": [0, 0, 0], "_i_grave_.png": [0, 0, 0], "_o.png": [0, 0, 0], "_1_sup.png": [0, 0, 0], "mcl_signs_sign.png": [114, 89, 69], "_yen.png": [0, 0, 0], "_b_.png": [0, 0, 0], "_macron.png": [0, 0, 0], "_qu_inv.png": [0, 0, 0], "_o_dash_.png": [0, 0, 0], "_guill_right.png": [0, 0, 0], "_p.png": [0, 0, 0], "_thorn_.png": [0, 0, 0], "_2_sup.png": [0, 0, 0], "_pr.png": [0, 0, 0], "default_sign.png": [145, 115, 88], "_times_dot.png": [0, 0, 0], "_acute.png": [0, 0, 0], "_g_.png": [0, 0, 0], "_o_acute_.png": [0, 0, 0], "_a_tilde.png": [0, 0, 0], "_j.png": [0, 0, 0], "_k.png": [0, 0, 0], "_co.png": [0, 0, 0], "_dv.png": [0, 0, 0], "_o_circumflex.png": [0, 0, 0], "_a_ring.png": [0, 0, 0], "_br.png": [0, 0, 0], "_d.png": [0, 0, 0], "_ap.png": [0, 0, 0], "_sl.png": [0, 0, 0], "_mn.png": [0, 0, 0], "_m.png": [0, 0, 0], "_ae_lig.png": [0, 0, 0], "_thorn.png": [0, 0, 0], "_2.png": [0, 0, 0], "_gr.png": [0, 0, 0], "_i.png": [0, 0, 0], "_y_acute_.png": [0, 0, 0], "_diaresis.png": [0, 0, 0], "_oe.png": [0, 0, 0], "_mu.png": [0, 0, 0], "_guill_left.png": [0, 0, 0], "_times_cross.png": [0, 0, 0], "_ae_.png": [0, 0, 0], "_w.png": [0, 0, 0], "_u.png": [0, 0, 0], "_broken_bar.png": [0, 0, 0], "_4.png": [0, 0, 0], "_plus_minus.png": [0, 0, 0], "_1_2.png": [0, 0, 0], "_u_circumflex.png": [0, 0, 0], "_w_.png": [0, 0, 0], "_x_.png": [0, 0, 0], "_e_circumflex.png": [0, 0, 0], "_g.png": [0, 0, 0], "_o_tilde_.png": [0, 0, 0], "_ae_lig_.png": [0, 0, 0], "_v_.png": [0, 0, 0], "_dl.png": [0, 0, 0], "_a_grave.png": [0, 0, 0], "_re.png": [0, 0, 0], "_a_acute.png": [0, 0, 0], "_qu.png": [0, 0, 0], "_oe_.png": [0, 0, 0], "_n_tilde.png": [0, 0, 0], "_eq.png": [0, 0, 0], "_d_.png": [0, 0, 0], "_sm.png": [0, 0, 0], "_y_.png": [0, 0, 0], "_not.png": [0, 0, 0], "_n.png": [0, 0, 0], "_j_.png": [0, 0, 0], "_k_.png": [0, 0, 0], "_0.png": [0, 0, 0], "_o_grave_.png": [0, 0, 0], "_r_.png": [0, 0, 0], "_r.png": [0, 0, 0], "_u_grave.png": [0, 0, 0], "_ee_.png": [0, 0, 0], "_c_cedille.png": [0, 0, 0], "_ex_inv.png": [0, 0, 0], "_cm.png": [0, 0, 0], "_o_grave.png": [0, 0, 0], "_x.png": [0, 0, 0], "_i_.png": [0, 0, 0], "_n_.png": [0, 0, 0], "_rc.png": [0, 0, 0], "_a_.png": [0, 0, 0], "_a_grave_.png": [0, 0, 0], "_ee.png": [0, 0, 0], "_o_acute.png": [0, 0, 0], "_a_ring_.png": [0, 0, 0], "_i_circumflex_.png": [0, 0, 0], "_cent.png": [0, 0, 0], "_d_dash.png": [0, 0, 0], "_f_.png": [0, 0, 0], "_o_circumflex_.png": [0, 0, 0], "_ue.png": [0, 0, 0], "_a_circumflex.png": [0, 0, 0], "_i_circumflex.png": [0, 0, 0], "_z.png": [0, 0, 0], "gui_furnace_arrow_fg.png": [239, 239, 239], "default_furnace_front.png": [105, 95, 91], "default_furnace_fire_bg.png": [139, 139, 139], "default_furnace_top.png": [148, 138, 133], "default_furnace_fire_fg.png": [179, 115, 70], "default_furnace_side.png": [117, 107, 102], "gui_furnace_arrow_bg.png": [139, 139, 139], "default_furnace_front_active.png": [119, 95, 85], "default_furnace_bottom.png": [148, 138, 133], "default_torch_on_floor.png": [115, 82, 59], "default_torch_on_floor_animated.png": [116, 84, 61], "default_tnt_bottom.png": [161, 54, 58], "mcl_tnt_blink.png": [255, 255, 255], "default_tnt_top.png": [125, 54, 57], "default_tnt_side.png": [178, 105, 98], "mcl_heads_skeleton.png": [125, 125, 125], "mcl_heads_skeleton_node.png": [124, 124, 124], "mcl_heads_creeper_node.png": [98, 107, 71], "mcl_heads_zombie.png": [66, 104, 69], "mcl_heads_creeper.png": [92, 110, 68], "mcl_heads_steve_node.png": [115, 70, 58], "mcl_heads_zombie_node.png": [78, 110, 105], "mcl_heads_steve.png": [108, 76, 59], "mcl_heads_wither_skeleton_node.png": [50, 50, 50], "mcl_heads_wither_skeleton.png": [50, 50, 50], "mcl_flowerpots_cactus.png": [109, 83, 52], "mcl_flowerpots_flowerpot_inventory.png": [121, 54, 45], "mcl_flowerpots_flowerpot.png": [120, 55, 47], "bucket_lava.png": [166, 127, 113], "bucket_river_water.png": [139, 152, 155], "bucket_water.png": [139, 147, 155], "bucket.png": [147, 143, 139], "mcl_totems_totem.png": [185, 139, 52], "mcl_anvils_anvil_top_damaged_1.png": [50, 50, 50], "mcl_anvils_anvil_top_damaged_2.png": [48, 48, 48], "mcl_anvils_anvil_top_damaged_0.png": [52, 52, 52], "mcl_anvils_anvil_side.png": [45, 45, 45], "mcl_anvils_inventory.png": [157, 157, 157], "mcl_anvils_anvil_base.png": [40, 40, 40], "mcl_maps_player_arrow.png": [95, 95, 95], "mcl_maps_map_filled.png": [213, 176, 148], "mcl_maps_player_dot.png": [105, 105, 105], "mcl_maps_map_empty.png": [217, 187, 157], "mcl_maps_map_filled_markings.png": [183, 183, 183], "mcl_maps_map_background.png": [224, 196, 166], "mcl_dispensers_dispenser_front_vertical.png": [115, 104, 99], "mcl_dispensers_dispenser_front_horizontal.png": [105, 96, 92], "jeija_wall_lever.png": [95, 80, 69], "mesecons_delayer_front_locked_off.png": [97, 85, 77], "mesecons_delayer_locked_on.png": [114, 100, 95], "mesecons_delayer_sides_locked_off.png": [95, 80, 73], "mesecons_delayer_sides_on.png": [106, 71, 63], "mesecons_delayer_item.png": [100, 87, 82], "mesecons_delayer_end_locked_off.png": [97, 85, 77], "mesecons_delayer_end_locked_on.png": [101, 85, 78], "mesecons_delayer_ends_off.png": [99, 86, 80], "mesecons_delayer_front_locked_on.png": [101, 85, 77], "mesecons_delayer_ends_on.png": [105, 87, 81], "mesecons_delayer_sides_locked_on.png": [104, 81, 74], "mesecons_delayer_locked_off.png": [110, 99, 95], "mesecons_delayer_sides_off.png": [90, 69, 61], "mesecons_delayer_off.png": [112, 100, 96], "mesecons_delayer_on.png": [116, 101, 97], "redstone_redstone_dust_line0.png": [168, 168, 168], "redstone_redstone_dust.png": [81, 0, 0], "redstone_redstone_dust_dot.png": [168, 168, 168], "redstone_redstone_dust_line1.png": [173, 173, 173], "jeija_commandblock_off.png": [110, 99, 96], "jeija_commandblock_on.png": [110, 99, 96], "redstone_redstone_block.png": [128, 8, 9], "jeija_torches_on.png": [102, 68, 56], "jeija_torches_off.png": [90, 66, 54], "mesecons_button_wield_mask.png": [255, 126, 126], "mcl_droppers_dropper_front_vertical.png": [118, 108, 103], "mcl_droppers_dropper_front_horizontal.png": [110, 101, 96], "mesecons_noteblock.png": [104, 81, 63], "jeija_solar_panel_inverted.png": [100, 107, 117], "jeija_solar_panel.png": [124, 113, 101], "jeija_solar_panel_side.png": [60, 47, 36], "mcl_observers_observer_top.png": [139, 128, 123], "mcl_observers_observer_front.png": [95, 80, 84], "mcl_observers_observer_back_lit.png": [75, 67, 65], "mcl_observers_observer_back.png": [72, 67, 64], "mcl_observers_observer_side.png": [111, 103, 99], "mesecons_piston_pusher_front_sticky.png": [97, 81, 63], "mesecons_piston_pusher_top.png": [106, 83, 65], "mesecons_piston_back.png": [110, 101, 98], "mesecons_piston_on_front.png": [111, 101, 98], "mesecons_piston_pusher_back.png": [106, 83, 65], "mesecons_piston_bottom.png": [120, 107, 100], "mesecons_piston_pusher_right.png": [106, 83, 65], "mesecons_piston_pusher_bottom.png": [106, 83, 65], "mesecons_piston_pusher_front.png": [106, 83, 65], "mesecons_piston_pusher_left.png": [106, 83, 65], "jeija_lightstone_gray_on.png": [97, 56, 37], "jeija_lightstone_gray_off.png": [64, 49, 43], "mcl_target_target_side.png": [177, 117, 94], "mcl_target_target_top.png": [177, 117, 94], "mcl_comparators_sides_on.png": [105, 87, 81], "mcl_comparators_comp.png": [61, 20, 20], "mcl_comparators_on.png": [116, 102, 98], "mcl_comparators_sides_comp.png": [99, 88, 83], "mcl_comparators_off.png": [113, 102, 98], "mcl_comparators_ends_comp.png": [99, 88, 83], "mcl_comparators_ends_sub.png": [105, 88, 83], "mcl_comparators_ends_off.png": [96, 80, 74], "mcl_comparators_ends_on.png": [105, 81, 75], "mcl_comparators_sub.png": [112, 25, 25], "mcl_comparators_item.png": [98, 83, 79], "mcl_comparators_sides_off.png": [99, 86, 80], "mcl_comparators_sides_sub.png": [105, 88, 83], "default_book.png": [103, 67, 44], "default_bookshelf.png": [84, 67, 54], "mcl_books_book_written.png": [110, 74, 44], "mcl_books_book_bg.png": [203, 180, 151], "mcl_books_button9_pressed.png": [145, 112, 86], "mcl_books_button9.png": [145, 112, 86], "mcl_books_book_writable.png": [151, 122, 108], "mcl_books_bookshelf_top.png": [109, 84, 65], "wool_dark_grey.png": [96, 87, 87], "wool_grey.png": [143, 134, 134], "wool_magenta.png": [140, 85, 125], "wool_black.png": [45, 42, 42], "wool_orange.png": [188, 106, 45], "wool_blue.png": [43, 73, 125], "wool_yellow.png": [201, 163, 69], "wool_pink.png": [171, 91, 108], "wool_dark_green.png": [53, 91, 51], "wool_brown.png": [86, 57, 43], "wool_red.png": [132, 42, 45], "mcl_wool_light_blue.png": [91, 130, 180], "wool_cyan.png": [30, 94, 113], "mcl_wool_lime.png": [107, 151, 76], "wool_white.png": [212, 199, 182], "wool_violet.png": [77, 57, 102], "mcl_potions_melon_speckled.png": [170, 97, 62], "mcl_potions_effect_swift.png": [106, 96, 85], "mcl_potions_spider_eye_fermented.png": [143, 97, 62], "mcl_potions_splash_bottle.png": [168, 156, 183], "mcl_potions_effect_water_breathing.png": [59, 69, 100], "mcl_potions_effect_leaping.png": [100, 91, 86], "mcl_potions_effect_weak.png": [127, 126, 126], "mcl_potions_dragon_breath.png": [171, 137, 163], "mcl_potions_effect_food_poisoning.png": [112, 123, 89], "hudbars_icon_regenerate.png": [195, 77, 114], "mcl_potions_effect_fire_proof.png": [112, 68, 68], "mcl_potions_splash_overlay.png": [202, 202, 202], "mcl_potions_effect_invisible.png": [96, 103, 95], "hbhunger_icon_regen_poison.png": [147, 111, 115], "mcl_potions_effect_slow.png": [78, 81, 85], "mcl_potions_lingering_bottle.png": [181, 159, 192], "mcl_potions_potion_overlay.png": [201, 201, 201], "mcl_potions_effect_regenerating.png": [133, 90, 83], "mcl_potions_arrow_inv.png": [171, 165, 160], "mcl_potions_effect_night_vision.png": [86, 99, 74], "mcl_potions_potion_bottle.png": [156, 172, 203], "mcl_potions_effect_poisoned.png": [78, 110, 80], "mcl_potions_effect_strong.png": [100, 82, 97], "crafting_workbench_front.png": [120, 93, 72], "gui_crafting_arrow.png": [139, 139, 139], "crafting_workbench_side.png": [120, 93, 72], "crafting_workbench_top.png": [152, 121, 93], "mcl_amethyst_amethyst_bud_small.png": [176, 131, 203], "mcl_amethyst_amethyst_block.png": [139, 84, 172], "mcl_amethyst_amethyst_cluster.png": [161, 111, 190], "mcl_amethyst_calcite_block.png": [189, 193, 207], "mcl_amethyst_amethyst_shard.png": [163, 113, 192], "mcl_amethyst_amethyst_bud_medium.png": [184, 140, 209], "mcl_amethyst_amethyst_bud_large.png": [173, 127, 201], "mcl_amethyst_tinted_glass.png": [125, 67, 160], "mcl_amethyst_amethyst_cluster_block.png": [180, 136, 206], "mcl_amethyst_budding_amethyst.png": [134, 77, 167], "mcl_enchanting_glyph_11.png": [209, 209, 231], "mcl_enchanting_glyph_14.png": [209, 209, 231], "mcl_enchanting_glyph_6.png": [209, 209, 231], "mcl_enchanting_glyph_8.png": [209, 209, 231], "mcl_enchanting_glyph_9.png": [209, 209, 231], "mcl_enchanting_glyph_3.png": [209, 209, 231], "mcl_enchanting_number_1_off.png": [255, 255, 255], "mcl_enchanting_number_3_off.png": [255, 255, 255], "mcl_enchanting_number_3.png": [151, 47, 40], "mcl_enchanting_book_open.png": [153, 123, 99], "mcl_enchanting_button_off.png": [255, 255, 255], "mcl_enchanting_glyph_2.png": [209, 209, 231], "mcl_enchanting_glyph_1.png": [209, 209, 231], "mcl_enchanting_button.png": [255, 255, 255], "mcl_enchanting_table_side.png": [66, 58, 55], "mcl_enchanting_book_closed.png": [112, 78, 55], "mcl_enchanting_table_bottom.png": [58, 51, 52], "mcl_enchanting_glyph_15.png": [209, 209, 231], "mcl_enchanting_number_2_off.png": [255, 255, 255], "mcl_enchanting_glyph_5.png": [209, 209, 231], "mcl_enchanting_number_1.png": [149, 45, 39], "mcl_enchanting_glyph_7.png": [209, 209, 231], "mcl_enchanting_table_top.png": [88, 86, 84], "mcl_enchanting_number_2.png": [149, 46, 39], "mcl_enchanting_glyph_16.png": [209, 209, 231], "mcl_enchanting_button_hovered.png": [255, 255, 255], "mcl_enchanting_book_enchanted.png": [122, 69, 46], "mcl_enchanting_glyph_4.png": [209, 209, 231], "mcl_enchanting_glyph_10.png": [209, 209, 231], "mcl_enchanting_glyph_13.png": [209, 209, 231], "mcl_enchanting_glyph_17.png": [209, 209, 231], "mcl_enchanting_glyph_18.png": [209, 209, 231], "mcl_enchanting_lapis_background.png": [255, 255, 255], "mcl_enchanting_button_background.png": [229, 202, 171], "mcl_enchanting_glyph_12.png": [209, 209, 231], "doc_basics_gameplay_mtg_2.png": [151, 168, 207], "doc_basics_liquids_renewable_1.png": [139, 146, 159], "doc_basics_players_sam.png": [95, 133, 106], "doc_basics_players_flat.png": [127, 155, 130], "doc_basics_craft_shapeless_2.png": [52, 52, 48], "doc_basics_build.png": [84, 84, 55], "doc_basics_pointing.png": [66, 104, 32], "doc_basics_nodes.png": [108, 104, 94], "doc_basics_craft_groups_2.png": [65, 58, 52], "doc_basics_craft_groups_1.png": [57, 57, 58], "doc_basics_inventory.png": [47, 47, 45], "doc_basics_minimap_radar.png": [73, 164, 128], "doc_basics_sneak.png": [70, 69, 69], "doc_basics_camera_behind.png": [108, 144, 135], "doc_basics_craft_repair.png": [47, 46, 45], "doc_basics_hotbar_relations.png": [85, 84, 69], "doc_basics_gameplay_lott.png": [119, 122, 112], "doc_basics_tools_mining.png": [64, 62, 59], "doc_basics_players_lott.png": [180, 193, 224], "doc_basics_gameplay_outback.png": [146, 114, 109], "doc_basics_gameplay_pixture.png": [94, 120, 57], "doc_basics_craft_grid.png": [46, 46, 46], "doc_basics_craft_groups_3.png": [61, 58, 55], "doc_basics_camera_front.png": [99, 133, 110], "doc_basics_minimap_map.png": [149, 169, 183], "doc_basics_gameplay_mtg_1.png": [136, 117, 86], "doc_basics_gameplay_xtraores_xtension.png": [95, 15, 86], "doc_basics_light_torch.png": [25, 43, 14], "doc_basics_minimap_round.png": [160, 175, 189], "doc_basics_light_test.png": [133, 113, 69], "doc_basics_liquids_nonrenewable.png": [64, 87, 87], "doc_basics_gameplay_hades.png": [81, 70, 62], "doc_basics_gameplay_moontest.png": [75, 74, 79], "doc_basics_liquids_range.png": [146, 166, 179], "doc_basics_inventory_detail.png": [43, 41, 39], "doc_basics_camera_ego.png": [111, 147, 139], "doc_basics_tools.png": [46, 45, 42], "doc_basics_liquids_renewable_2.png": [136, 148, 166], "doc_basics_items_dropped.png": [195, 185, 147], "doc_basics_liquids_types.png": [146, 164, 171], "doc_basics_gameplay_carbone_ng.png": [121, 118, 89], "doc_basics_craft_shaped.png": [55, 52, 50], "doc_basics_hotbar.png": [141, 175, 226], "doc_basics_craft_shapeless_1.png": [52, 52, 48], "doc_button_icon_lores.png": [19, 143, 183], "doc_awards_icon_generic.png": [14, 125, 162], "inventory_plus_doc_inventory_plus.png": [19, 143, 183], "doc_button_icon_hires.png": [30, 149, 188], "doc_identifier_identifier.png": [172, 151, 139], "doc_identifier_identifier_liquid.png": [125, 147, 190], "craftguide_furnace.png": [119, 95, 85], "craftguide_clear_icon.png": [254, 254, 254], "craftguide_book.png": [84, 117, 39], "mcl_craftguide_fuel.png": [187, 121, 75], "craftguide_prev_icon.png": [255, 255, 255], "craftguide_zoomout_icon.png": [255, 255, 255], "craftguide_search_icon.png": [254, 254, 254], "craftguide_arrow.png": [139, 139, 139], "craftguide_zoomin_icon.png": [255, 255, 255], "craftguide_shapeless.png": [130, 130, 130], "craftguide_next_icon.png": [255, 255, 255]} \ No newline at end of file diff --git a/mods/ITEMS/mcl_maps/init.lua b/mods/ITEMS/mcl_maps/init.lua deleted file mode 100644 index fb13625d59..0000000000 --- a/mods/ITEMS/mcl_maps/init.lua +++ /dev/null @@ -1,371 +0,0 @@ -mcl_maps = {} - -local modname = minetest.get_current_modname() -local modpath = minetest.get_modpath(modname) -local S = minetest.get_translator(modname) - -local math = math -local vector = vector -local table = table -local pairs = pairs - -local pos_to_string = minetest.pos_to_string -local string_to_pos = minetest.string_to_pos -local get_item_group = minetest.get_item_group -local dynamic_add_media = minetest.dynamic_add_media -local get_connected_players = minetest.get_connected_players - -local storage = minetest.get_mod_storage() -local worldpath = minetest.get_worldpath() -local map_textures_path = worldpath .. "/mcl_maps/" ---local last_finished_id = storage:get_int("next_id") - 1 - -minetest.mkdir(map_textures_path) - -local function load_json_file(name) - local file = assert(io.open(modpath .. "/" .. name .. ".json", "r")) - local data = minetest.parse_json(file:read()) - file:close() - return data -end - -local texture_colors = load_json_file("colors") -local palettes = load_json_file("palettes") - -local color_cache = {} - -local creating_maps = {} -local loaded_maps = {} - -local c_air = minetest.get_content_id("air") - -function mcl_maps.create_map(pos) - local minp = vector.multiply(vector.floor(vector.divide(pos, 128)), 128) - local maxp = vector.add(minp, vector.new(127, 127, 127)) - - local itemstack = ItemStack("mcl_maps:filled_map") - local meta = itemstack:get_meta() - local next_id = storage:get_int("next_id") - storage:set_int("next_id", next_id + 1) - local id = tostring(next_id) - meta:set_string("mcl_maps:id", id) - meta:set_string("mcl_maps:minp", pos_to_string(minp)) - meta:set_string("mcl_maps:maxp", pos_to_string(maxp)) - tt.reload_itemstack_description(itemstack) - - creating_maps[id] = true - minetest.emerge_area(minp, maxp, function(blockpos, action, calls_remaining) - if calls_remaining > 0 then - return - end - local vm = minetest.get_voxel_manip() - local emin, emax = vm:read_from_map(minp, maxp) - local data = vm:get_data() - local param2data = vm:get_param2_data() - local area = VoxelArea:new({MinEdge = emin, MaxEdge = emax}) - local pixels = {} - local last_heightmap - for x = 1, 128 do - local map_x = minp.x - 1 + x - local heightmap = {} - for z = 1, 128 do - local map_z = minp.z - 1 + z - local color, height - for map_y = maxp.y, minp.y, -1 do - local index = area:index(map_x, map_y, map_z) - local c_id = data[index] - if c_id ~= c_air then - color = color_cache[c_id] - if color == nil then - local nodename = minetest.get_name_from_content_id(c_id) - local def = minetest.registered_nodes[nodename] - if def then - local texture - if def.palette then - texture = def.palette - elseif def.tiles then - texture = def.tiles[1] - if type(texture) == "table" then - texture = texture.name - end - end - if texture then - texture = texture:match("([^=^%^]-([^.]+))$"):split("^")[1] - end - if def.palette then - local palette = palettes[texture] - color = palette and {palette = palette} - else - color = texture_colors[texture] - end - end - end - - if color and color.palette then - color = color.palette[param2data[index] + 1] - else - color_cache[c_id] = color or false - end - - if color and last_heightmap then - local last_height = last_heightmap[z] - if last_height < map_y then - color = { - math.min(255, color[1] + 16), - math.min(255, color[2] + 16), - math.min(255, color[3] + 16), - } - elseif last_height > map_y then - color = { - math.max(0, color[1] - 16), - math.max(0, color[2] - 16), - math.max(0, color[3] - 16), - } - end - end - height = map_y - break - end - end - heightmap[z] = height or minp.y - pixels[z] = pixels[z] or {} - pixels[z][x] = color or {0, 0, 0} - end - last_heightmap = heightmap - end - tga_encoder.image(pixels):save(map_textures_path .. "mcl_maps_map_texture_" .. id .. ".tga") - creating_maps[id] = nil - end) - return itemstack -end - -function mcl_maps.load_map(id, callback) - if id == "" or creating_maps[id] then - return - end - - local texture = "mcl_maps_map_texture_" .. id .. ".tga" - - if not loaded_maps[id] then - if not minetest.features.dynamic_add_media_table then - -- minetest.dynamic_add_media() blocks in - -- Minetest 5.3 and 5.4 until media loads - loaded_maps[id] = true - dynamic_add_media(map_textures_path .. texture, function() end) - if callback then callback(texture) end - else - -- minetest.dynamic_add_media() never blocks - -- in Minetest 5.5, callback runs after load - dynamic_add_media(map_textures_path .. texture, function() - loaded_maps[id] = true - if callback then callback(texture) end - end) - end - end - - if loaded_maps[id] then - if callback then callback(texture) end - return texture - end -end - -function mcl_maps.load_map_item(itemstack) - return mcl_maps.load_map(itemstack:get_meta():get_string("mcl_maps:id")) -end - -local function fill_map(itemstack, placer, pointed_thing) - local new_stack = mcl_util.call_on_rightclick(itemstack, placer, pointed_thing) - if new_stack then - return new_stack - end - - if minetest.settings:get_bool("enable_real_maps", true) then - local new_map = mcl_maps.create_map(placer:get_pos()) - itemstack:take_item() - if itemstack:is_empty() then - return new_map - else - local inv = placer:get_inventory() - if inv:room_for_item("main", new_map) then - inv:add_item("main", new_map) - else - minetest.add_item(placer:get_pos(), new_map) - end - return itemstack - end - end -end - -minetest.register_craftitem("mcl_maps:empty_map", { - description = S("Empty Map"), - _doc_items_longdesc = S("Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used."), - _doc_items_usagehelp = S("Rightclick to create a filled map (which can't be stacked anymore)."), - inventory_image = "mcl_maps_map_empty.png", - on_place = fill_map, - on_secondary_use = fill_map, - stack_max = 64, -}) - -local filled_def = { - description = S("Map"), - _tt_help = S("Shows a map image."), - _doc_items_longdesc = S("When created, the map saves the nearby area as an image that can be viewed any time by holding the map."), - _doc_items_usagehelp = S("Hold the map in your hand. This will display a map on your screen."), - inventory_image = "mcl_maps_map_filled.png^(mcl_maps_map_filled_markings.png^[colorize:#000000)", - stack_max = 64, - groups = {not_in_creative_inventory = 1, filled_map = 1, tool = 1}, -} - -minetest.register_craftitem("mcl_maps:filled_map", filled_def) - -local filled_wield_def = table.copy(filled_def) -filled_wield_def.use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false -filled_wield_def.visual_scale = 1 -filled_wield_def.wield_scale = {x = 1, y = 1, z = 1} -filled_wield_def.paramtype = "light" -filled_wield_def.drawtype = "mesh" -filled_wield_def.node_placement_prediction = "" -filled_wield_def.range = minetest.registered_items[""].range -filled_wield_def.on_place = mcl_util.call_on_rightclick - -for _, texture in pairs(mcl_skins.list) do - local def = table.copy(filled_wield_def) - def.tiles = {texture .. ".png"} - def.mesh = "mcl_meshhand.b3d" - def._mcl_hand_id = texture - minetest.register_node("mcl_maps:filled_map_" .. texture, def) - - local female_def = table.copy(def) - female_def.mesh = "mcl_meshhand_female.b3d" - female_def._mcl_hand_id = texture .. "_female" - minetest.register_node("mcl_maps:filled_map_" .. texture .. "_female", female_def) -end - -local old_add_item = minetest.add_item -function minetest.add_item(pos, stack) - stack = ItemStack(stack) - if get_item_group(stack:get_name(), "filled_map") > 0 then - stack:set_name("mcl_maps:filled_map") - end - return old_add_item(pos, stack) -end - -tt.register_priority_snippet(function(itemstring, _, itemstack) - if itemstack and get_item_group(itemstring, "filled_map") > 0 then - local id = itemstack:get_meta():get_string("mcl_maps:id") - if id ~= "" then - return "#" .. id, mcl_colors.GRAY - end - end -end) - -minetest.register_craft({ - output = "mcl_maps:empty_map", - recipe = { - { "mcl_core:paper", "mcl_core:paper", "mcl_core:paper" }, - { "mcl_core:paper", "group:compass", "mcl_core:paper" }, - { "mcl_core:paper", "mcl_core:paper", "mcl_core:paper" }, - } -}) - -minetest.register_craft({ - type = "shapeless", - output = "mcl_maps:filled_map 2", - recipe = {"group:filled_map", "mcl_maps:empty_map"}, -}) - -local function on_craft(itemstack, player, old_craft_grid, craft_inv) - if itemstack:get_name() == "mcl_maps:filled_map" then - for _, stack in pairs(old_craft_grid) do - if get_item_group(stack:get_name(), "filled_map") > 0 then - itemstack:get_meta():from_table(stack:get_meta():to_table()) - return itemstack - end - end - end -end - -minetest.register_on_craft(on_craft) -minetest.register_craft_predict(on_craft) - -local maps = {} -local huds = {} - -minetest.register_on_joinplayer(function(player) - local map_def = { - hud_elem_type = "image", - text = "blank.png", - position = {x = 0.75, y = 0.8}, - alignment = {x = 0, y = -1}, - offset = {x = 0, y = 0}, - scale = {x = 2, y = 2}, - } - local marker_def = table.copy(map_def) - marker_def.alignment = {x = 0, y = 0} - huds[player] = { - map = player:hud_add(map_def), - marker = player:hud_add(marker_def), - } -end) - -minetest.register_on_leaveplayer(function(player) - maps[player] = nil - huds[player] = nil -end) - -minetest.register_globalstep(function(dtime) - for _, player in pairs(get_connected_players()) do - local wield = player:get_wielded_item() - local texture = mcl_maps.load_map_item(wield) - local hud = huds[player] - if texture then - local wield_def = wield:get_definition() - local hand_def = player:get_inventory():get_stack("hand", 1):get_definition() - - if hand_def and wield_def and hand_def._mcl_hand_id ~= wield_def._mcl_hand_id then - wield:set_name("mcl_maps:filled_map_" .. hand_def._mcl_hand_id) - player:set_wielded_item(wield) - end - - if texture ~= maps[player] then - player:hud_change(hud.map, "text", "[combine:140x140:0,0=mcl_maps_map_background.png:6,6=" .. texture) - maps[player] = texture - end - - local pos = vector.round(player:get_pos()) - local meta = wield:get_meta() - local minp = string_to_pos(meta:get_string("mcl_maps:minp")) - local maxp = string_to_pos(meta:get_string("mcl_maps:maxp")) - - local marker = "mcl_maps_player_arrow.png" - - if pos.x < minp.x then - marker = "mcl_maps_player_dot.png" - pos.x = minp.x - elseif pos.x > maxp.x then - marker = "mcl_maps_player_dot.png" - pos.x = maxp.x - end - - if pos.z < minp.z then - marker = "mcl_maps_player_dot.png" - pos.z = minp.z - elseif pos.z > maxp.z then - marker = "mcl_maps_player_dot.png" - pos.z = maxp.z - end - - if marker == "mcl_maps_player_arrow.png" then - local yaw = (math.floor(player:get_look_horizontal() * 180 / math.pi / 90 + 0.5) % 4) * 90 - marker = marker .. "^[transformR" .. yaw - end - - player:hud_change(hud.marker, "text", marker) - player:hud_change(hud.marker, "offset", {x = (6 - 140 / 2 + pos.x - minp.x) * 2, y = (6 - 140 + maxp.z - pos.z) * 2}) - elseif maps[player] then - player:hud_change(hud.map, "text", "blank.png") - player:hud_change(hud.marker, "text", "blank.png") - maps[player] = nil - end - end -end) diff --git a/mods/ITEMS/mcl_maps/locale/mcl_maps.de.tr b/mods/ITEMS/mcl_maps/locale/mcl_maps.de.tr deleted file mode 100644 index d7762e512d..0000000000 --- a/mods/ITEMS/mcl_maps/locale/mcl_maps.de.tr +++ /dev/null @@ -1,8 +0,0 @@ -# textdomain: mcl_maps -Empty Map=Leere Karte -Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=Leere Karten sind als Karten nicht nützlich, aber sie können gestapelt werden und zu benutzbaren Karten umgewandelt werden. -Rightclick to create a filled map (which can't be stacked anymore).=Rechtsklick, um die Karte zu füllen. Sie kann dann nicht mehr gestapelt werden. -Map=Karte -Shows a map image.=Zeigt ein Kartenbild. -When created, the map saves the nearby area as an image that can be viewed any time by holding the map.=Beim Erstellen speichert die Karte die Gegend in der Nähe als ein Bild, dass jederzeit durch halten der Karte angesehen werden kann. -Hold the map in your hand. This will display a map on your screen.=Halten Sie die Karte in Ihrer Hand. Eine Karte wird auf Ihrem Bildschirm angezeigt werden. diff --git a/mods/ITEMS/mcl_maps/locale/mcl_maps.es.tr b/mods/ITEMS/mcl_maps/locale/mcl_maps.es.tr deleted file mode 100644 index cec96b17b8..0000000000 --- a/mods/ITEMS/mcl_maps/locale/mcl_maps.es.tr +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain: mcl_maps -Empty Map=Mapa vacio -Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=Los mapas vacíos no son útiles como mapas, pero se pueden apilar y convertir en mapas que se pueden usar. -Rightclick to start using the map (which can't be stacked anymore).=Haga clic derecho para comenzar a usar el mapa (que ya no se puede apilar). -Map=Mapa diff --git a/mods/ITEMS/mcl_maps/locale/mcl_maps.fr.tr b/mods/ITEMS/mcl_maps/locale/mcl_maps.fr.tr deleted file mode 100644 index 1808e839d3..0000000000 --- a/mods/ITEMS/mcl_maps/locale/mcl_maps.fr.tr +++ /dev/null @@ -1,8 +0,0 @@ -# textdomain: mcl_maps -Empty Map=Carte Vierge -Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=Les cartes vierges ne sont pas utiles en tant que cartes, mais elles peuvent être empilées et transformées en cartes utilisables. -Rightclick to create a filled map (which can't be stacked anymore).=Clic droit pour créer une carte remplie (qui ne peut plus être empilée). -Map=Carte -Shows a map image.=Affiche une carte. -When created, the map saves the nearby area as an image that can be viewed any time by holding the map.=Lors de sa création, la carte sauvegarde le terrain proche sous forme d'image qui peut être consultée n'importe quand en tenant la carte dans la main. -Hold the map in your hand. This will display a map on your screen.=Tenez la carte dans votre main. Cela affichera la carte à l'écran. diff --git a/mods/ITEMS/mcl_maps/locale/mcl_maps.pl.tr b/mods/ITEMS/mcl_maps/locale/mcl_maps.pl.tr deleted file mode 100644 index de6ff84d68..0000000000 --- a/mods/ITEMS/mcl_maps/locale/mcl_maps.pl.tr +++ /dev/null @@ -1,8 +0,0 @@ -# textdomain: mcl_maps -Empty Map=Pusta mapa -Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=Puste mapy nie są tak użyteczne jak mapy ale mogą być grupowane i zamienione w mapy które już są pożyteczne. -Rightclick to create a filled map (which can't be stacked anymore).=Kliknij prawy przycisk aby stworzyć wypełnioną mapę (nie będzie już jej można grupować). -Map=Mapa -Shows a map image.=Pokazuje obraz mapy. -When created, the map saves the nearby area as an image that can be viewed any time by holding the map.=Gdy są utworzone mapy zapisują obszar okolicy jako obrazek, który może być oglądany przez trzymanie mapy w rękach. -Hold the map in your hand. This will display a map on your screen.=Weź mapę do ręki. To pokaże mapę na twoim ekranie. diff --git a/mods/ITEMS/mcl_maps/locale/mcl_maps.ru.tr b/mods/ITEMS/mcl_maps/locale/mcl_maps.ru.tr deleted file mode 100644 index 6c34007a9e..0000000000 --- a/mods/ITEMS/mcl_maps/locale/mcl_maps.ru.tr +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain: mcl_maps -Empty Map=Пустая карта -Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=Пустые карты не могут использоваться в качестве карт, но могут складываться в стопки, а также могут быть превращены в полноценные карты. -Rightclick to start using the map (which can't be stacked anymore).=Кликните правой, чтобы начать использовать карту (её больше нельзя будет уложить в стопку). -Map=Карта diff --git a/mods/ITEMS/mcl_maps/locale/mcl_maps.zh_TW.tr b/mods/ITEMS/mcl_maps/locale/mcl_maps.zh_TW.tr deleted file mode 100644 index 62206306ce..0000000000 --- a/mods/ITEMS/mcl_maps/locale/mcl_maps.zh_TW.tr +++ /dev/null @@ -1,10 +0,0 @@ -# textdomain: mcl_maps -Empty Map=空地圖 -Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=空的地圖作為地圖是沒有用的,但它們可以被疊加,並變成可以使用的地圖。 -Rightclick to start using the map (which can't be stacked anymore).=右鍵單擊以開始使用地圖(該地圖無法再堆疊)。 -Map=地圖 -Maps show your surroundings as you explore the world.=當您探索世界時,地圖會顯示您的周圍環境。 -Hold the map in any of the hotbar slots. This allows you to access the minimap by pressing the minimap key (see controls settings).=在任何一個熱鍵槽中放置地圖。這允許你通過按小地圖鍵來訪問小地圖(見控制設置)。 -In Creative Mode, you don't need this item; the minimap is always available.=在創造模式下,您不需要此項目; 小地圖始終可用。 -Enables minimap=啓用小地圖 -Use the minimap key to show the map.=使用小地圖鍵來顯示小地圖。 diff --git a/mods/ITEMS/mcl_maps/locale/template.txt b/mods/ITEMS/mcl_maps/locale/template.txt deleted file mode 100644 index 27298d2ec8..0000000000 --- a/mods/ITEMS/mcl_maps/locale/template.txt +++ /dev/null @@ -1,8 +0,0 @@ -# textdomain: mcl_maps -Empty Map= -Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.= -Rightclick to create a filled map (which can't be stacked anymore).= -Map= -Shows a map image.= -When created, the map saves the nearby area as an image that can be viewed any time by holding the map.= -Hold the map in your hand. This will display a map on your screen.= diff --git a/mods/ITEMS/mcl_maps/mod.conf b/mods/ITEMS/mcl_maps/mod.conf deleted file mode 100644 index e1f068963c..0000000000 --- a/mods/ITEMS/mcl_maps/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = mcl_maps -depends = mcl_core, mcl_flowers, tga_encoder, tt, mcl_colors, mcl_skins, mcl_util diff --git a/mods/ITEMS/mcl_maps/palettes.json b/mods/ITEMS/mcl_maps/palettes.json deleted file mode 100644 index 958882a16f..0000000000 --- a/mods/ITEMS/mcl_maps/palettes.json +++ /dev/null @@ -1 +0,0 @@ -{"mcl_core_palette_grass.png": [[109, 196, 117], [159, 193, 114], [118, 177, 120], [118, 177, 120], [107, 186, 107], [118, 177, 120], [92, 182, 119], [92, 182, 119], [92, 182, 119], [92, 182, 119], [118, 177, 120], [109, 196, 117], [35, 175, 105], [94, 190, 107], [94, 190, 107], [94, 190, 107], [94, 190, 107], [159, 193, 114], [76, 176, 84], [164, 150, 110], [164, 150, 110], [164, 150, 110], [164, 150, 110], [159, 193, 114], [93, 181, 76], [93, 181, 76], [93, 181, 76], [93, 181, 76], [76, 118, 60], [94, 190, 107], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117], [109, 196, 117]]} \ No newline at end of file diff --git a/mods/ITEMS/mcl_maps/textures/mcl_maps_map_background.png b/mods/ITEMS/mcl_maps/textures/mcl_maps_map_background.png deleted file mode 100644 index 9eeb0ea560..0000000000 Binary files a/mods/ITEMS/mcl_maps/textures/mcl_maps_map_background.png and /dev/null differ diff --git a/mods/ITEMS/mcl_maps/textures/mcl_maps_map_empty.png b/mods/ITEMS/mcl_maps/textures/mcl_maps_map_empty.png deleted file mode 100644 index 4fe7724b49..0000000000 Binary files a/mods/ITEMS/mcl_maps/textures/mcl_maps_map_empty.png and /dev/null differ diff --git a/mods/ITEMS/mcl_maps/textures/mcl_maps_map_filled.png b/mods/ITEMS/mcl_maps/textures/mcl_maps_map_filled.png deleted file mode 100644 index d5dc8fe278..0000000000 Binary files a/mods/ITEMS/mcl_maps/textures/mcl_maps_map_filled.png and /dev/null differ diff --git a/mods/ITEMS/mcl_maps/textures/mcl_maps_map_filled_markings.png b/mods/ITEMS/mcl_maps/textures/mcl_maps_map_filled_markings.png deleted file mode 100644 index c8a49891bb..0000000000 Binary files a/mods/ITEMS/mcl_maps/textures/mcl_maps_map_filled_markings.png and /dev/null differ diff --git a/mods/ITEMS/mcl_maps/textures/mcl_maps_player_arrow.png b/mods/ITEMS/mcl_maps/textures/mcl_maps_player_arrow.png deleted file mode 100644 index 3f58f67650..0000000000 Binary files a/mods/ITEMS/mcl_maps/textures/mcl_maps_player_arrow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_maps/textures/mcl_maps_player_dot.png b/mods/ITEMS/mcl_maps/textures/mcl_maps_player_dot.png deleted file mode 100644 index 391197c406..0000000000 Binary files a/mods/ITEMS/mcl_maps/textures/mcl_maps_player_dot.png and /dev/null differ diff --git a/mods/ITEMS/mcl_monster_eggs/init.lua b/mods/ITEMS/mcl_monster_eggs/init.lua deleted file mode 100644 index 59ab728765..0000000000 --- a/mods/ITEMS/mcl_monster_eggs/init.lua +++ /dev/null @@ -1,43 +0,0 @@ --- Monster eggs! --- Blocks which spawn silverfish when destroyed. - -local S = minetest.get_translator(minetest.get_current_modname()) - -local function spawn_silverfish(pos, oldnode, oldmetadata, digger) - if not minetest.is_creative_enabled("") then - minetest.add_entity(pos, "mobs_mc:silverfish") - end -end - --- Template function for registering monster egg blocks -local function register_block(subname, description, tiles, is_ground_content) - if is_ground_content == nil then - is_ground_content = false - end - minetest.register_node("mcl_monster_eggs:monster_egg_"..subname, { - description = description, - tiles = tiles, - is_ground_content = is_ground_content, - groups = {dig_immediate = 3, spawns_silverfish = 1, deco_block = 1}, - drop = "", - sounds = mcl_sounds.node_sound_stone_defaults(), - after_dig_node = spawn_silverfish, - _tt_help = S("Hides a silverfish"), - _doc_items_longdesc = S([[ - An infested block is a block from which a silverfish will pop out when it is broken. - It looks identical to its normal counterpart. - ]]), - _mcl_hardness = 0, - _mcl_blast_resistance = 0.5, - }) -end - --- Register all the monster egg blocks -register_block("stone", S("Infested Stone"), {"default_stone.png"}, true) -register_block("cobble", S("Infested Cobblestone"), {"default_cobble.png"}) -register_block("stonebrick", S("Infested Stone Bricks"), {"default_stone_brick.png"}) -register_block("stonebrickcracked", S("Infested Cracked Stone Bricks"), {"mcl_core_stonebrick_cracked.png"}) -register_block("stonebrickmossy", S("Infested Mossy Stone Bricks"), {"mcl_core_stonebrick_mossy.png"}) -register_block("stonebrickcarved", S("Infested Chiseled Stone Bricks"), {"mcl_core_stonebrick_carved.png"}) - - diff --git a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.de.tr b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.de.tr deleted file mode 100644 index 78c26bf781..0000000000 --- a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.de.tr +++ /dev/null @@ -1,9 +0,0 @@ -# textdomain: mcl_monster_eggs -An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Ein verseuchter Block ist ein Block, aus dem ein Silberfischchen hinausfallen wird, wenn er zerbrochen wird. Er sieht identisch zu seinem normalen Pendant aus. -Infested Stone=Verseuchter Stein -Infested Cobblestone=Verseuchtes Kopfsteinpflaster -Infested Stone Bricks=Verseuchte Steinziegel -Infested Cracked Stone Bricks=Verseuchte rissige Steinziegel -Infested Mossy Stone Bricks=Verseuchte moosige Steinziegel -Infested Chiseled Stone Bricks=Verseuchte gemeißelte Steinziegel -Hides a silverfish=Verbirgt ein Silberfischchen diff --git a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.es.tr b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.es.tr deleted file mode 100644 index f35b45633d..0000000000 --- a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.es.tr +++ /dev/null @@ -1,8 +0,0 @@ -# textdomain: mcl_monster_eggs -An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Un bloque infestado es un bloque del que saldrá un pez plateado cuando se rompa. Se ve idéntico a su contraparte normal. -Infested Stone=Piedra infestada -Infested Cobblestone=Roca infestada -Infested Stone Bricks=Ladrillos de piedra infestados -Infested Cracked Stone Bricks=Ladrillos de piedra agrietados infestados -Infested Mossy Stone Bricks=Ladrillos de piedra musgosos infestados -Infested Chiseled Stone Bricks=Ladrillos de piedra cincelados infestados diff --git a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.fr.tr b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.fr.tr deleted file mode 100644 index fa2d204be9..0000000000 --- a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.fr.tr +++ /dev/null @@ -1,9 +0,0 @@ -# textdomain: mcl_monster_eggs -An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Un bloc infesté est un bloc à partir duquel un Poisson d'Argent sortira lorsqu'il sera brisé. Il semble identique à son homologue normal. -Infested Stone=Roche Infestée -Infested Cobblestone=Pierre Infestée -Infested Stone Bricks=Pierre Taillée Infestée -Infested Cracked Stone Bricks=Pierre Taillée Craquelée Infestée -Infested Mossy Stone Bricks=Pierre Taillée Moussue Infestée -Infested Chiseled Stone Bricks=Pierre sculptée Infestée -Hides a silverfish=Cache un Poisson d'Argent diff --git a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.pl.tr b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.pl.tr deleted file mode 100644 index 2d55f713f5..0000000000 --- a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.pl.tr +++ /dev/null @@ -1,9 +0,0 @@ -# textdomain: mcl_monster_eggs -An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Zarobaczony blok to blok z którego po rozbiciu wypadną rybiki cukrowe. Wygląda identycznie co niezarobaczona wersja. -Infested Stone=Zarobaczony kamień -Infested Cobblestone=Zarobaczony brukowiec -Infested Stone Bricks=Zarobaczone kamienne cegły -Infested Cracked Stone Bricks=Zarobaczone popękane kamienne cegły -Infested Mossy Stone Bricks=Zarobaczone zamszone kamienne cegły -Infested Chiseled Stone Bricks=Zarobaczone wygładzone kamienne cegły -Hides a silverfish=Chowa w sobie rybika cukrowego diff --git a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.ru.tr b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.ru.tr deleted file mode 100644 index 6902b610f1..0000000000 --- a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.ru.tr +++ /dev/null @@ -1,9 +0,0 @@ -# textdomain: mcl_monster_eggs -An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Блок с икрой - это блок, из которого вылетает чешуйница, если его сломать. Выглядит идентично своему обычному аналогу. -Infested Stone=Камень с икрой -Infested Cobblestone=Булыжник с икрой -Infested Stone Bricks=Каменные блоки с икрой -Infested Cracked Stone Bricks=Треснутые каменные блоки с икрой -Infested Mossy Stone Bricks=Мшистый каменный блок с икрой -Infested Chiseled Stone Bricks=Точёный каменный блок с икрой -Hides a silverfish=Скрывает чешуйницу diff --git a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.zh_TW.tr b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.zh_TW.tr deleted file mode 100644 index 542c0f1b97..0000000000 --- a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.zh_TW.tr +++ /dev/null @@ -1,9 +0,0 @@ -# textdomain: mcl_monster_eggs -An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=蛀蝕的方塊是一個方塊,當它被打破時,蠹魚會從裡面跳出來。它看起來與正常的方塊完全一樣。 -Infested Stone=蛀蝕的石頭 -Infested Cobblestone=蛀蝕的鵝卵石 -Infested Stone Bricks=蛀蝕的石磚 -Infested Cracked Stone Bricks=蛀蝕的裂紋石磚 -Infested Mossy Stone Bricks=蛀蝕的青苔石磚 -Infested Chiseled Stone Bricks=蛀蝕的浮雕石磚 -Hides a silverfish=包含一個蠹魚 diff --git a/mods/ITEMS/mcl_monster_eggs/locale/template.txt b/mods/ITEMS/mcl_monster_eggs/locale/template.txt deleted file mode 100644 index 8f420b6177..0000000000 --- a/mods/ITEMS/mcl_monster_eggs/locale/template.txt +++ /dev/null @@ -1,9 +0,0 @@ -# textdomain: mcl_monster_eggs -An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.= -Infested Stone= -Infested Cobblestone= -Infested Stone Bricks= -Infested Cracked Stone Bricks= -Infested Mossy Stone Bricks= -Infested Chiseled Stone Bricks= -Hides a silverfish= diff --git a/mods/ITEMS/mcl_monster_eggs/mod.conf b/mods/ITEMS/mcl_monster_eggs/mod.conf deleted file mode 100644 index b296018640..0000000000 --- a/mods/ITEMS/mcl_monster_eggs/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = mcl_monster_eggs -description = Adds infested blocks: Blocks which which disguise themselves as stone blocks and spawn a silverfish when broken. -depends = mcl_sounds, mobs_mc diff --git a/mods/ITEMS/mcl_ocean/corals.lua b/mods/ITEMS/mcl_ocean/corals.lua deleted file mode 100644 index 338929a19b..0000000000 --- a/mods/ITEMS/mcl_ocean/corals.lua +++ /dev/null @@ -1,318 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) -local mod_doc = minetest.get_modpath("doc") - -local corals = { - { "tube", S("Tube Coral Block"), S("Dead Tube Coral Block"), S("Tube Coral"), S("Dead Tube Coral"), S("Tube Coral Fan"), S("Dead Tube Coral Fan") }, - { "brain", S("Brain Coral Block"), S("Dead Brain Coral Block"), S("Brain Coral"), S("Dead Brain Coral"), S("Brain Coral Fan"), S("Dead Brain Coral Fan") }, - { "bubble", S("Bubble Coral Block"), S("Dead Bubble Coral Block"), S("Bubble Coral"), S("Dead Bubble Coral"), S("Bubble Coral Fan"), S("Dead Bubble Coral Fan")}, - { "fire", S("Fire Coral Block"), S("Dead Fire Coral Block"), S("Fire Coral"), S("Dead Fire Coral"), S("Fire Coral Fan"), S("Dead Fire Coral Fan") }, - { "horn", S("Horn Coral Block"), S("Dead Horn Coral Block"), S("Horn Coral"), S("Dead Horn Coral"), S("Horn Coral Fan"), S("Dead Horn Coral Fan") }, -} - -local function coral_on_place(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" or not placer then - return itemstack - end - - local player_name = placer:get_player_name() - local pos_under = pointed_thing.under - local pos_above = pointed_thing.above - local node_under = minetest.get_node(pos_under) - local def_under = minetest.registered_nodes[node_under.name] - - if def_under and def_under.on_rightclick and not placer:get_player_control().sneak then - return def_under.on_rightclick(pos_under, node_under, - placer, itemstack, pointed_thing) or itemstack - end - - if pos_under.y >= pos_above.y then - return itemstack - end - - local g_block = minetest.get_item_group(node_under.name, "coral_block") - local g_coral = minetest.get_item_group(itemstack:get_name(), "coral") - local g_species_block = minetest.get_item_group(node_under.name, "coral_species") - local g_species_plant = minetest.get_item_group(itemstack:get_name(), "coral_species") - - -- Placement rules: - -- Coral plant can only be placed on top of a matching coral block. - if g_block == 0 or (g_coral ~= g_block) or (g_species_block ~= g_species_plant) then - return itemstack - end - - if minetest.is_protected(pos_under, player_name) or - minetest.is_protected(pos_above, player_name) then - minetest.log("action", player_name - .. " tried to place " .. itemstack:get_name() - .. " at protected position " - .. minetest.pos_to_string(pos_under)) - minetest.record_protection_violation(pos_under, player_name) - return itemstack - end - - node_under.name = itemstack:get_name() - node_under.param2 = minetest.registered_items[node_under.name].place_param2 or 1 - if node_under.param2 < 8 and math.random(1,2) == 1 then - -- Random horizontal displacement - node_under.param2 = node_under.param2 + 8 - end - minetest.set_node(pos_under, node_under) - local def_node = minetest.registered_nodes[node_under.name] - if def_node.sounds then - minetest.sound_play(def_node.sounds.place, { gain = 0.5, pos = pos_under }, true) - end - if not minetest.is_creative_enabled(player_name) then - itemstack:take_item() - end - - return itemstack -end - --- Sound for non-block corals -local sounds_coral_plant = mcl_sounds.node_sound_leaves_defaults({footstep = mcl_sounds.node_sound_dirt_defaults().footstep}) - -for c=1, #corals do - local id = corals[c][1] - local doc_desc_block = S("Coral blocks live in the oceans and need a water source next to them to survive. Without water, they die off.") - local doc_desc_coral = S("Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.") - local doc_desc_fan = S("Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.") - local tt_block = S("Needs water to live") - local tt_coral_dead = S("Grows on coral block of same species") - local tt_coral = tt_coral_dead .. "\n" .. S("Needs water to live") - - -- Coral Block - minetest.register_node("mcl_ocean:"..id.."_coral_block", { - description = corals[c][2], - _doc_items_longdesc = doc_desc_block, - _tt_help = tt_block, - tiles = { "mcl_ocean_"..id.."_coral_block.png" }, - groups = { pickaxey = 1, building_block = 1, coral=1, coral_block=1, coral_species=c, }, - sounds = mcl_sounds.node_sound_dirt_defaults(), - drop = "mcl_ocean:dead_"..id.."_coral_block", - _mcl_hardness = 1.5, - _mcl_blast_resistance = 6, - _mcl_silk_touch_drop = true, - }) - minetest.register_node("mcl_ocean:dead_"..id.."_coral_block", { - description = corals[c][3], - _doc_items_create_entry = false, - tiles = { "mcl_ocean_dead_"..id.."_coral_block.png" }, - groups = { pickaxey = 1, building_block = 1, coral=2, coral_block=2, coral_species=c, }, - sounds = mcl_sounds.node_sound_dirt_defaults(), - _mcl_hardness = 1.5, - _mcl_blast_resistance = 6, - }) - - -- Coral - minetest.register_node("mcl_ocean:"..id.."_coral", { - description = corals[c][4], - _doc_items_longdesc = doc_desc_coral, - _tt_help = tt_coral, - drawtype = "plantlike_rooted", - paramtype = "light", - paramtype2 = "meshoptions", - place_param2 = 1, - tiles = { "mcl_ocean_"..id.."_coral_block.png" }, - special_tiles = { { name = "mcl_ocean_"..id.."_coral.png" } }, - inventory_image = "mcl_ocean_"..id.."_coral.png", - selection_box = { - type = "fixed", - fixed = { - { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, - { -0.5, 0.5, -0.5, 0.5, 1.0, 0.5 }, - } - }, - groups = { dig_immediate = 3, deco_block = 1, coral=1, coral_plant=1, coral_species=c, }, - sounds = sounds_coral_plant, - drop = "mcl_ocean:dead_"..id.."_coral", - node_placement_prediction = "", - node_dig_prediction = "mcl_ocean:"..id.."_coral_block", - on_place = coral_on_place, - after_dig_node = function(pos) - local node = minetest.get_node(pos) - if minetest.get_item_group(node.name, "coral") == 0 then - minetest.set_node(pos, {name="mcl_ocean:"..id.."_coral_block"}) - end - end, - _mcl_hardness = 0, - _mcl_blast_resistance = 0, - _mcl_silk_touch_drop = true, - }) - minetest.register_node("mcl_ocean:dead_"..id.."_coral", { - description = corals[c][5], - _doc_items_create_entry = false, - _tt_help = tt_coral_dead, - drawtype = "plantlike_rooted", - paramtype = "light", - paramtype2 = "meshoptions", - place_param2 = 1, - tiles = { "mcl_ocean_dead_"..id.."_coral_block.png" }, - special_tiles = { { name = "mcl_ocean_dead_"..id.."_coral.png" } }, - inventory_image = "mcl_ocean_dead_"..id.."_coral.png", - groups = { dig_immediate = 3, deco_block = 1, coral=2, coral_plant=2, coral_species=c, }, - selection_box = { - type = "fixed", - fixed = { - { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, - { -0.5, 0.5, -0.5, 0.5, 1.0, 0.5 }, - } - }, - sounds = sounds_coral_plant, - node_placement_prediction = "", - node_dig_prediction = "mcl_ocean:dead_"..id.."_coral_block", - on_place = coral_on_place, - after_dig_node = function(pos) - local node = minetest.get_node(pos) - if minetest.get_item_group(node.name, "coral") == 0 then - minetest.set_node(pos, {name="mcl_ocean:dead_"..id.."_coral_block"}) - end - end, - _mcl_hardness = 0, - _mcl_blast_resistance = 0, - }) - - -- Coral Fan - minetest.register_node("mcl_ocean:"..id.."_coral_fan", { - description = corals[c][6], - _doc_items_longdesc = doc_desc_fan, - _tt_help = tt_coral, - drawtype = "plantlike_rooted", - paramtype = "light", - paramtype2 = "meshoptions", - place_param2 = 4, - tiles = { "mcl_ocean_"..id.."_coral_block.png" }, - special_tiles = { { name = "mcl_ocean_"..id.."_coral_fan.png" } }, - inventory_image = "mcl_ocean_"..id.."_coral_fan.png", - groups = { dig_immediate = 3, deco_block = 1, coral=1, coral_fan=1, coral_species=c, }, - selection_box = { - type = "fixed", - fixed = { - { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, - { -0.5, 0.5, -0.5, 0.5, 1.0, 0.5 }, - } - }, - sounds = sounds_coral_plant, - drop = "mcl_ocean:dead_"..id.."_coral_fan", - node_placement_prediction = "", - node_dig_prediction = "mcl_ocean:"..id.."_coral_block", - on_place = coral_on_place, - after_dig_node = function(pos) - local node = minetest.get_node(pos) - if minetest.get_item_group(node.name, "coral") == 0 then - minetest.set_node(pos, {name="mcl_ocean:"..id.."_coral_block"}) - end - end, - _mcl_hardness = 0, - _mcl_blast_resistance = 0, - _mcl_silk_touch_drop = true, - }) - minetest.register_node("mcl_ocean:dead_"..id.."_coral_fan", { - description = corals[c][7], - _doc_items_create_entry = false, - _tt_help = tt_coral_dead, - drawtype = "plantlike_rooted", - paramtype = "light", - paramtype2 = "meshoptions", - place_param2 = 4, - tiles = { "mcl_ocean_dead_"..id.."_coral_block.png" }, - special_tiles = { { name = "mcl_ocean_dead_"..id.."_coral_fan.png" } }, - inventory_image = "mcl_ocean_dead_"..id.."_coral_fan.png", - groups = { dig_immediate = 3, deco_block = 1, coral=2, coral_fan=2, coral_species=c, }, - selection_box = { - type = "fixed", - fixed = { - { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, - { -0.5, 0.5, -0.5, 0.5, 1.0, 0.5 }, - } - }, - sounds = sounds_coral_plant, - node_placement_prediction = "", - node_dig_prediction = "mcl_ocean:dead_"..id.."_coral_block", - on_place = coral_on_place, - after_dig_node = function(pos) - local node = minetest.get_node(pos) - if minetest.get_item_group(node.name, "coral") == 0 then - minetest.set_node(pos, {name="mcl_ocean:dead_"..id.."_coral_block"}) - end - end, - _mcl_hardness = 0, - _mcl_blast_resistance = 0, - _mcl_silk_touch_drop = true, - }) - - if mod_doc then - doc.add_entry_alias("nodes", "mcl_ocean:"..id.."_coral", "nodes", "mcl_ocean:"..id.."_coral") - doc.add_entry_alias("nodes", "mcl_ocean:"..id.."_coral_fan", "nodes", "mcl_ocean:"..id.."_coral_fan") - doc.add_entry_alias("nodes", "mcl_ocean:"..id.."_coral_block", "nodes", "mcl_ocean:"..id.."_coral_block") - doc.add_entry_alias("nodes", "mcl_ocean:"..id.."_coral", "nodes", "mcl_ocean:dead_"..id.."_coral") - doc.add_entry_alias("nodes", "mcl_ocean:"..id.."_coral_fan", "nodes", "mcl_ocean:dead_"..id.."_coral_fan") - doc.add_entry_alias("nodes", "mcl_ocean:"..id.."_coral_block", "nodes", "mcl_ocean:dead_"..id.."_coral_block") - end -end - --- Turn corals and coral fans to dead corals if not inside a water source -minetest.register_abm({ - label = "Coral plant / coral fan death", - nodenames = { "group:coral_plant", "group_coral_fan" }, - interval = 17, - chance = 5, - catch_up = false, - action = function(pos, node, active_object_count, active_object_count_wider) - -- Check if coral's alive - local coral_state = minetest.get_item_group(node.name, "coral") - if coral_state == 1 then - -- Check node above, here lives the actual plant (it's plantlike_rooted) - if minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name ~= "mcl_core:water_source" then - -- Find dead form (it's the same as the node's drop) - local def = minetest.registered_nodes[node.name] - if def then - node.name = def.drop - else - return - end - -- Set node to dead form. - minetest.set_node(pos, node) - end - end - end, -}) - --- Turn corals blocks to dead coral blocks if not next to a water source -minetest.register_abm({ - label = "Coral block death", - nodenames = { "group:coral_block" }, - interval = 17, - chance = 5, - catch_up = false, - action = function(pos, node, active_object_count, active_object_count_wider) - -- Check if coral's alive - local coral_state = minetest.get_item_group(node.name, "coral") - if coral_state == 1 then - local posses = { - { x=0,y=1,z=0 }, - { x=-1,y=0,z=0 }, - { x=1,y=0,z=0 }, - { x=0,y=0,z=-1 }, - { x=0,y=0,z=1 }, - { x=0,y=-1,z=0 }, - } - -- Check all 6 neighbors for water - for p=1, #posses do - local checknode = minetest.get_node(vector.add(pos, posses[p])) - if checknode.name == "mcl_core:water_source" then - -- Water found! Don't die. - return - end - end - -- Find dead form (it's the same as the node's drop) - local def = minetest.registered_nodes[node.name] - if def then - node.name = def.drop - else - return - end - -- Set node to dead form - minetest.set_node(pos, node) - end - end, -}) diff --git a/mods/ITEMS/mcl_ocean/init.lua b/mods/ITEMS/mcl_ocean/init.lua deleted file mode 100644 index f723a1f3ff..0000000000 --- a/mods/ITEMS/mcl_ocean/init.lua +++ /dev/null @@ -1,16 +0,0 @@ -mcl_ocean = {} - --- Prismarine (includes sea lantern) -dofile(minetest.get_modpath(minetest.get_current_modname()).."/prismarine.lua") - --- Corals -dofile(minetest.get_modpath(minetest.get_current_modname()).."/corals.lua") - --- Seagrass -dofile(minetest.get_modpath(minetest.get_current_modname()).."/seagrass.lua") - --- Kelp -dofile(minetest.get_modpath(minetest.get_current_modname()).."/kelp.lua") - --- Sea Pickle -dofile(minetest.get_modpath(minetest.get_current_modname()).."/sea_pickle.lua") diff --git a/mods/ITEMS/mcl_ocean/kelp.lua b/mods/ITEMS/mcl_ocean/kelp.lua deleted file mode 100644 index ae273abe9a..0000000000 --- a/mods/ITEMS/mcl_ocean/kelp.lua +++ /dev/null @@ -1,845 +0,0 @@ --- TODO: whenever it becomes possible to fully implement kelp without the --- plantlike_rooted limitation, please update accordingly. --- --- TODO: whenever it becomes possible to make kelp grow infinitely without --- resorting to making intermediate kelp stem node, please update accordingly. --- --- TODO: In MC, you can't actually destroy kelp by bucket'ing water in the middle. --- However, because of the plantlike_rooted hack, we'll just allow it for now. - -local S = minetest.get_translator(minetest.get_current_modname()) -local mod_doc = minetest.get_modpath("doc") - --------------------------------------------------------------------------------- --- local-ify runtime functions --------------------------------------------------------------------------------- --- objects -local mt_registered_items = minetest.registered_items -local mt_registered_nodes = minetest.registered_nodes - --- functions -local mt_log = minetest.log -local mt_add_item = minetest.add_item -local mt_get_item_group = minetest.get_item_group -local mt_get_node = minetest.get_node -local mt_get_node_level = minetest.get_node_level -local mt_get_node_max_level = minetest.get_node_max_level -local mt_get_node_or_nil = minetest.get_node_or_nil -local mt_get_node_timer = minetest.get_node_timer -local mt_get_meta = minetest.get_meta -local mt_hash_node_position = minetest.hash_node_position -local mt_set_node = minetest.set_node -local mt_swap_node = minetest.swap_node -local mt_pos_to_string = minetest.pos_to_string -local mt_is_protected = minetest.is_protected -local mt_record_protection_violation = minetest.record_protection_violation - -local mt_is_creative_enabled = minetest.is_creative_enabled -local mt_sound_play = minetest.sound_play - -local math = math ---local string = string -local table = table - --- DEBUG: functions --- local log = minetest.log --- local chatlog = minetest.chat_send_all - --------------------------------------------------------------------------------- --- Kelp API --------------------------------------------------------------------------------- - -local kelp = {} -mcl_ocean.kelp = kelp - --- Kelp minimum and maximum age. Once reached the maximum, kelp no longer grows. -kelp.MIN_AGE = 0 -kelp.MAX_AGE = 25 - --- Tick interval (in seconds) for updating kelp. -kelp.TICK = 0.2 - --- Tick interval (in seconds) to store kelp meta. -kelp.META_TICK = 2 - --- Max age queue length -kelp.MAX_AGE_QUEUE = 20 - --- The average amount of growth for kelp in a day is 2.16 (https://youtu.be/5Bp4lAjAk3I) --- Normally, a day lasts 20 minutes, meaning kelp.next_grow() is executed --- 1200 / TICK times. Per tick probability = (216/100) / (1200/TICK) --- NOTE: currently, we can't exactly use the same type of randomness MC does, because --- it has multiple complicated sets of PRNGs. --- NOTE: Small loss of precision, should be 10 to preserve it. --- kelp.ROLL_GROWTH_PRECISION = 10 --- kelp.ROLL_GROWTH_NUMERATOR = 216 * kelp.TICK * kelp.ROLL_GROWTH_PRECISION --- kelp.ROLL_GROWTH_DENOMINATOR = 100 * 1200 * kelp.ROLL_GROWTH_PRECISION -kelp.ROLL_GROWTH_PRECISION = 1 -kelp.ROLL_GROWTH_NUMERATOR = 216 * kelp.TICK -kelp.ROLL_GROWTH_DENOMINATOR = 100 * 1200 - --- Sounds used to dig and place kelp. -kelp.leaf_sounds = mcl_sounds.node_sound_leaves_defaults() - --- Pool storing nodetimers -kelp.timers_pool = {} - --- Pool storing age, indexed by pos_hash. -kelp.age_pool = {} - --- Queue(List) of hashed positions to save their ages. --- Invalid ones may still persist in this queue. -kelp.age_queue = {} --- Stores only valid positions of each hashed postiions. -kelp.age_queue_pos = {} - - --- is age in the growable range? -function kelp.is_age_growable(age) - return age >= 0 and age < kelp.MAX_AGE -end - - --- Is this water? --- Returns the liquidtype, if indeed water. -function kelp.is_submerged(node) - if mt_get_item_group(node.name, "water") ~= 0 then - -- Expected only "source" and "flowing" from water liquids - return mt_registered_nodes[node.name].liquidtype - end - return false -end - - --- Is the water downward flowing? --- (kelp can grow/be placed inside downward flowing water) -function kelp.is_downward_flowing(pos, node, pos_above, node_above, __is_above__) - -- Function params: (pos[, node]) or (node, pos_above) or (node, node_above) - local node = node or mt_get_node(pos) - - local result = (math.floor(node.param2 / 8) % 2) == 1 - if not (result or __is_above__) then - -- If not, also check node above. - -- (this is needed due a weird quirk in the definition of "downwards flowing" - -- liquids in Minetest) - local pos_above = pos_above or {x=pos.x,y=pos.y+1,z=pos.z} - local node_above = node_above or mt_get_node(pos_above) - result = kelp.is_submerged(node_above) - or kelp.is_downward_flowing(nil, node_above, nil, nil, true) - end - return result -end - - --- Will node fall at that position? --- This only checks if a node would fall, meaning that node need not be at pos. -function kelp.is_falling(pos, node, is_falling, pos_bottom, node_bottom, def_bottom) - -- Optional params: is_falling, pos_bottom, node_bottom, def_bottom - - -- NOTE: Modified from check_single_for_falling in builtin. - -- Please update accordingly. - local nodename = node.name - - if is_falling == false or - is_falling == nil and mt_get_item_group(nodename, "falling_node") == 0 then - return false - end - - local pos_bottom = pos_bottom or {x = pos.x, y = pos.y - 1, z = pos.z} - -- get_node_or_nil: Only fall if node below is loaded - local node_bottom = node_bottom or mt_get_node_or_nil(pos_bottom) - local nodename_bottom = node_bottom.name - local def_bottom = def_bottom or node_bottom and mt_registered_nodes[nodename_bottom] - if not def_bottom then - return false - end - - local same = nodename == nodename_bottom - -- Let leveled nodes fall if it can merge with the bottom node - if same and def_bottom.paramtype2 == "leveled" and - mt_get_node_level(pos_bottom) < - mt_get_node_max_level(pos_bottom) then - return true - end - - -- Otherwise only if the bottom node is considered "fall through" - if not same and - (not def_bottom.walkable or def_bottom.buildable_to) and - (mt_get_item_group(nodename, "float") == 0 or - def_bottom.liquidtype == "none") then - return true - end - - return false -end - - --- Roll whether to grow kelp or not. -function kelp.roll_growth(numerator, denominator) - -- Optional params: numerator, denominator - return math.random(denominator or kelp.ROLL_GROWTH_DENOMINATOR) <= (numerator or kelp.ROLL_GROWTH_NUMERATOR) -end - - --- Roll initial age for kelp. -function kelp.roll_init_age(min, max) - -- Optional params - return math.random(min or kelp.MIN_AGE, (max or kelp.MAX_AGE)-1) -end - - --- Converts param2 to kelp height. --- For the special case where the max param2 is reached, interpret that as the --- 16th kelp stem. -function kelp.get_height(param2) - return math.floor(param2 / 16) + math.floor(param2 % 16 / 8) -end - - --- Obtain pos and node of the tip of kelp. -function kelp.get_tip(pos, height) - -- Optional params: height - local height = height or kelp.get_height(mt_get_node(pos).param2) - local pos_tip = {x=pos.x, y=pos.y+height+1, z=pos.z} - return pos_tip, mt_get_node(pos_tip), height -end - - --- Obtain position of the first kelp unsubmerged. -function kelp.find_unsubmerged(pos, node, height) - -- Optional params: node, height - local node = node or mt_get_node(pos) - local height = height or ((node.param2 >= 0 and node.param2 < 16) and 1) or kelp.get_height(node.param2) - - local walk_pos = {x=pos.x, z=pos.z} - local y = pos.y - for i=1,height do - walk_pos.y = y + i - local walk_node = mt_get_node(walk_pos) - if not kelp.is_submerged(walk_node) then - return walk_pos, walk_node, height, i - end - end - return nil, nil, height, height -end - - --- Obtain next param2. -function kelp.next_param2(param2) - -- param2 max value is 255, so adding to 256 causes overflow. - return math.min(param2+16 - param2 % 16, 255); -end - - --- Stores age from kelp.age_queue* into their respective meta -function kelp.store_meta() - local count = 0 - for _ in pairs(kelp.age_queue_pos) do - count = count + 1 - end - -- chatlog(string.format("Storing age metadata: %d in queue", #kelp.age_queue)) - -- chatlog(string.format("Storing age metadata: %d valid in queue", count)) - for i=1,#kelp.age_queue do - local pos_hash = kelp.age_queue[i] - local pos = kelp.age_queue_pos[pos_hash] - -- queued hashes may no longer point to a valid pos, e.g. kelp is destroyed. - if pos then - mt_get_meta(pos):set_int("mcl_ocean:kelp_age", kelp.age_pool[pos_hash]) - end - end - kelp.age_queue = {} - kelp.age_queue_pos = {} -end - - --- Store and queue a kelp's age to be saved into meta later. -function kelp.store_age(age, pos, pos_hash) - -- Watched params: pos - -- Optional params: pos_hash - local pos_hash = pos_hash or mt_hash_node_position(pos) - - kelp.age_pool[pos_hash] = age - if not kelp.age_queue_pos[pos_hash] then - table.insert(kelp.age_queue, pos_hash) - kelp.age_queue_pos[pos_hash] = pos - return true, pos_hash - end - - return false, pos_hash -end - - --- Initialise a kelp's age. -function kelp.init_age(pos, age, pos_hash, meta) - -- Watched params: pos - -- Optional params: age, pos_hash, meta - local pos_hash = pos_hash or mt_hash_node_position(pos) - local meta = meta or mt_get_meta(pos) - - local age = age - if age then - kelp.store_age(age, pos, pos_hash) - elseif not meta:contains("mcl_ocean:kelp_age") then - age = kelp.roll_init_age() - kelp.store_age(age, pos, pos_hash) - else - age = meta:get_int("mcl_ocean:kelp_age") - if not kelp.age_pool[pos_hash] then - kelp.age_pool[pos_hash] = age - end - end - - return age, pos_hash, meta -end - - --- Initialise kelp nodetimer. -function kelp.init_timer(pos, pos_hash) - -- Optional params: pos_hash - local pos_hash = pos_hash or mt_hash_node_position(pos) - - local timer = kelp.timers_pool[pos_hash] - if not timer then - timer = mt_get_node_timer(pos) - kelp.timers_pool[pos_hash] = timer - end - if not timer:is_started() then - timer:start(kelp.TICK) - end - - return pos_hash -end - - --- Apply next kelp height. The surface is swapped. so on_construct is skipped. -function kelp.next_height(pos, node, pos_tip, node_tip, submerged, downward_flowing) - -- Modified params: node - -- Optional params: node, set_node, pos_tip, node_tip, submerged, downward_flowing - local node = node or mt_get_node(pos) - local pos_tip = pos_tip - local node_tip = node_tip or (pos_tip and mt_get_node(pos_tip)) - if not pos_tip then - pos_tip,node_tip = kelp.get_tip(pos) - end - local downward_flowing = downward_flowing or - (submerged or kelp.is_submerged(node_tip) - and kelp.is_downward_flowing(pos_tip, node_tip)) - - -- Liquid source: Grow normally. - node.param2 = kelp.next_param2(node.param2) - mt_swap_node(pos, node) - - -- Flowing liquid: Grow 1 step, but also turn the tip node into a liquid source. - if downward_flowing then - local alt_liq = mt_registered_nodes[node_tip.name].liquid_alternative_source - if alt_liq then - mt_set_node(pos_tip, {name=alt_liq}) - end - end - - return node, pos_tip, node_tip, submerged, downward_flowing -end - - --- Grow next kelp. -function kelp.next_grow(age, pos, node, pos_hash, pos_tip, node_tip, submerged, downward_flowing) - -- Watched params: pos - -- Modified params: node - -- Optional params: node, pos_hash, pos_tip, node_tip, submerged, downward_flowing - local node = node or mt_get_node(pos) - local pos_hash = pos_hash or mt_hash_node_position(pos) - local pos_tip = pos_tip - local node_tip = node_tip or (pos_tip and mt_get_node(pos_tip)) - if not pos_tip then - pos_tip,node_tip = kelp.get_tip(pos) - end - - -- New kelp must also be submerged in water. - local downward_flowing = downward_flowing or kelp.is_downward_flowing(pos_tip, node_tip) - if not (submerged or kelp.is_submerged(node_tip)) then - return - end - - kelp.next_height(pos, node, pos_tip, node_tip, submerged, downward_flowing) - - return kelp.store_age(age, pos, pos_hash), node, pos_hash, pos_tip, node_tip, submerged, downward_flowing -end - - --- Drops the items for detached kelps. -function kelp.detach_drop(pos, height) - -- Optional params: height - local height = height or kelp.get_height(mt_get_node(pos).param2) - local y = pos.y - local walk_pos = {x=pos.x, z=pos.z} - for i=1,height do - walk_pos.y = y+i - mt_add_item(walk_pos, "mcl_ocean:kelp") - end - return true -end - - --- Detach the kelp at dig_pos, and drop their items. --- Synonymous to digging the kelp. --- NOTE: this is intended for whenever kelp truly becomes segmented plants --- instead of rooted to the floor. Don't try to remove dig_pos. -function kelp.detach_dig(dig_pos, pos, drop, node, height) - -- Optional params: drop, node, height - - local node = node or mt_get_node(pos) - local height = height or kelp.get_height(node.param2) - -- pos.y points to the surface, offset needed to point to the first kelp. - local new_height = dig_pos.y - (pos.y+1) - - -- Digs the entire kelp. - if new_height <= 0 then - if drop then - kelp.detach_drop(dig_pos, height) - end - mt_set_node(pos, { - name=mt_registered_nodes[node.name].node_dig_prediction, - param=node.param, - param2=0 }) - - -- Digs the kelp beginning at a height. - else - if drop then - kelp.detach_drop(dig_pos, height - new_height) - end - mt_swap_node(pos, {name=node.name, param=node.param, param2=16*new_height}) - end -end - - --------------------------------------------------------------------------------- --- Kelp callback functions --------------------------------------------------------------------------------- - -function kelp.surface_on_dig(pos, node, digger) - kelp.detach_dig(pos, pos, true, node) -end - - -function kelp.surface_after_dig_node(pos, node) - return mt_set_node(pos, {name=minetest.registered_nodes[node.name].node_dig_prediction}) -end - - -function kelp.surface_on_timer(pos) - local node = mt_get_node(pos) - local pos_hash - - -- Update detahed kelps - local dig_pos,_, height = kelp.find_unsubmerged(pos, node) - if dig_pos then - pos_hash = mt_hash_node_position(pos) - mt_sound_play(mt_registered_nodes[node.name].sounds.dug, { gain = 0.5, pos = dig_pos }, true) - kelp.detach_dig(dig_pos, pos, true, node, height) - kelp.store_age(kelp.roll_init_age(), pos, pos_hash) - end - - -- Grow kelp on chance - if kelp.roll_growth() then - pos_hash = pos_hash or mt_hash_node_position(pos) - local age = kelp.age_pool[pos_hash] - if kelp.is_age_growable(age) then - kelp.next_grow(age+1, pos, node, pos_hash) - end - end - - return true -end - -function kelp.surface_on_construct(pos) - local pos_hash = mt_hash_node_position(pos) - kelp.init_age(pos, nil, pos_hash) - kelp.init_timer(pos, pos_hash) -end - - -function kelp.surface_on_destruct(pos) - local node = mt_get_node(pos) - local pos_hash = mt_hash_node_position(pos) - - -- on_falling callback. Activated by pistons for falling nodes too. - if kelp.is_falling(pos, node) then - kelp.detach_drop(pos, kelp.get_height(node.param2)) - end - - -- Removes position from queue - kelp.age_queue_pos[pos_hash] = nil -end - - - -function kelp.surface_on_mvps_move(pos, node, oldpos, nodemeta) - -- Pistons moving falling nodes will have already activated on_falling callback. - kelp.detach_dig(pos, pos, mt_get_item_group(node.name, "falling_node") ~= 1, node) -end - - --- NOTE: Old ABM implementation. --- local function surface_unsubmerged_abm(pos, node) --- local dig_pos = find_unsubmerged(pos, node) --- if dig_pos then --- detach_dig(dig_pos, pos, node, true) --- end --- return true --- end - - -function kelp.kelp_on_place(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" or not placer then - return itemstack - end - - local player_name = placer:get_player_name() - local pos_under = pointed_thing.under - local pos_above = pointed_thing.above - local node_under = mt_get_node(pos_under) - local nu_name = node_under.name - local def_under = mt_registered_nodes[nu_name] - - -- Allow rightclick to override place. - if def_under and def_under.on_rightclick and not placer:get_player_control().sneak then - return def_under.on_rightclick(pos_under, node_under, - placer, itemstack, pointed_thing) or itemstack - end - - -- Protection - if mt_is_protected(pos_under, player_name) or - mt_is_protected(pos_above, player_name) then - mt_log("action", player_name - .. " tried to place " .. itemstack:get_name() - .. " at protected position " - .. mt_pos_to_string(pos_under)) - mt_record_protection_violation(pos_under, player_name) - return itemstack - end - - - local pos_tip, node_tip, def_tip, new_surface, height - -- Kelp must also be placed on the top/tip side of the surface/kelp - if pos_under.y >= pos_above.y then - return itemstack - end - - -- When placed on kelp. - if mt_get_item_group(nu_name, "kelp") == 1 then - height = kelp.get_height(node_under.param2) - pos_tip,node_tip = kelp.get_tip(pos_under, height) - def_tip = mt_registered_nodes[node_tip.name] - - -- When placed on surface. - else - new_surface = false - for _,surface in pairs(kelp.surfaces) do - if nu_name == surface.nodename then - node_under.name = "mcl_ocean:kelp_" ..surface.name - node_under.param2 = 0 - new_surface = true - break - end - end - -- Surface must support kelp - if not new_surface then - return itemstack - end - - pos_tip = pos_above - node_tip = mt_get_node(pos_above) - def_tip = mt_registered_nodes[node_tip.name] - height = 0 - end - - -- Next kelp must also be submerged in water. - local downward_flowing = kelp.is_downward_flowing(pos_tip, node_tip) - local submerged = kelp.is_submerged(node_tip) - if not submerged then - return itemstack - end - - -- Play sound, place surface/kelp and take away an item - local def_node = mt_registered_items[nu_name] - if def_node.sounds then - mt_sound_play(def_node.sounds.place, { gain = 0.5, pos = pos_under }, true) - end - -- TODO: get rid of rooted plantlike hack - if height < 16 then - kelp.next_height(pos_under, node_under, pos_tip, node_tip, def_tip, submerged, downward_flowing) - else - mt_add_item(pos_tip, "mcl_ocean:kelp") - end - if not mt_is_creative_enabled(player_name) then - itemstack:take_item() - end - - -- Initialize age and timer when it's planted on a new surface. - local pos_hash = mt_hash_node_position(pos_under) - if new_surface then - kelp.init_age(pos_under, nil, pos_hash) - kelp.init_timer(pos_under, pos_hash) - else - kelp.store_age(kelp.roll_init_age(), pos_under, pos_hash) - end - - return itemstack -end - - -function kelp.lbm_register_nodetimer(pos, node) - local pos_hash = mt_hash_node_position(pos) - kelp.init_age(pos, nil, pos_hash) - kelp.init_timer(pos, pos_hash) -end - - -local gstep_time = 0 -function kelp.globalstep(dtime) - if #kelp.age_queue > kelp.MAX_AGE_QUEUE then - kelp.store_meta() - end - - gstep_time = gstep_time + dtime - if gstep_time < kelp.META_TICK then - return - end - gstep_time = 0 - - if #kelp.age_queue > 0 then - kelp.store_meta() - end -end - - -function kelp.on_shutdown() - if #kelp.age_queue > 0 then - kelp.store_meta() - end -end - --------------------------------------------------------------------------------- --- Kelp registration API --------------------------------------------------------------------------------- - --- List of supported surfaces for seagrass and kelp. -kelp.surfaces = { - { name="dirt", nodename="mcl_core:dirt", }, - { name="sand", nodename="mcl_core:sand", }, - { name="redsand", nodename="mcl_core:redsand", }, - { name="gravel", nodename="mcl_core:gravel", }, -} -kelp.registered_surfaces = {} - --- Commented properties are the ones obtained using register_kelp_surface. --- If you define your own properties, it overrides the default ones. -kelp.surface_deftemplate = { - drawtype = "plantlike_rooted", - paramtype = "light", - paramtype2 = "leveled", - place_param2 = 16, - --tiles = def.tiles, - special_tiles = { - { - image = "mcl_ocean_kelp_plant.png", - animation = {type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}, - tileable_vertical = true, - } - }, - --inventory_image = "("..def.tiles[1]..")^mcl_ocean_kelp_item.png", - wield_image = "mcl_ocean_kelp_item.png", - selection_box = { - type = "fixed", - fixed = { - { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, - { -0.5, 0.5, -0.5, 0.5, 1.5, 0.5 }, - }, - }, - -- groups.falling_node = is_falling, - groups = { dig_immediate = 3, deco_block = 1, plant = 1, kelp = 1, }, - --sounds = sounds, - --node_dig_prediction = nodename, - on_construct = kelp.surface_on_construct, - on_destruct = kelp.surface_on_destruct, - on_dig = kelp.surface_on_dig, - after_dig_node = kelp.surface_after_dig_node, - on_timer = kelp.surface_on_timer, - mesecon = { on_mvps_move = kelp.surface_on_mvps_move, }, - drop = "", -- drops are handled in on_dig - --_mcl_falling_node_alternative = is_falling and nodename or nil, - _mcl_hardness = 0, - _mcl_blast_resistance = 0, -} - --- Commented properties are the ones obtained using register_kelp_surface. -kelp.surface_docs = { - -- entry_id_orig = nodename, - _doc_items_entry_name = S("Kelp"), - _doc_items_longdesc = S("Kelp grows inside water on top of dirt, sand or gravel."), - --_doc_items_create_entry = doc_create, - _doc_items_image = "mcl_ocean_kelp_item.png", -} - --- Creates new surfaces. --- NOTE: surface_deftemplate will be modified in-place. -function kelp.register_kelp_surface(surface, surface_deftemplate, surface_docs) - local name = surface.name - local nodename = surface.nodename - local def = mt_registered_nodes[nodename] - local def_tiles = def.tiles - - local surfacename = "mcl_ocean:kelp_"..name - local surface_deftemplate = surface_deftemplate or kelp.surface_deftemplate -- Optional param - - local doc_create = surface.doc_create or false - local surface_docs = surface_docs or kelp.surface_docs -- Optional param - - if doc_create then - surface_deftemplate._doc_items_entry_name = surface_docs._doc_items_entry_name - surface_deftemplate._doc_items_longdesc = surface_docs._doc_items_longdesc - surface_deftemplate._doc_items_create_entry = true - surface_deftemplate._doc_items_image = surface_docs._doc_items_image - -- Sets the first surface as the docs' entry ID - if not surface_docs.entry_id_orig then - surface_docs.entry_id_orig = nodename - end - elseif mod_doc then - doc.add_entry_alias("nodes", surface_docs.entry_id_orig, "nodes", surfacename) - end - - local sounds = table.copy(def.sounds) - sounds.dig = kelp.leaf_sounds.dig - sounds.dug = kelp.leaf_sounds.dug - sounds.place = kelp.leaf_sounds.place - - surface_deftemplate.tiles = surface_deftemplate.tiles or def_tiles - surface_deftemplate.inventory_image = surface_deftemplate.inventory_image or "("..def_tiles[1]..")^mcl_ocean_kelp_item.png" - surface_deftemplate.sounds = surface_deftemplate.sound or sounds - local falling_node = mt_get_item_group(nodename, "falling_node") - surface_deftemplate.node_dig_prediction = surface_deftemplate.node_dig_prediction or nodename - surface_deftemplate.groups.falling_node = surface_deftemplate.groups.falling_node or falling_node - surface_deftemplate._mcl_falling_node_alternative = surface_deftemplate._mcl_falling_node_alternative or (falling_node and nodename or nil) - - minetest.register_node(surfacename, surface_deftemplate) -end - --- Kelp surfaces nodes --------------------------------------------------------- - --- Dirt must be registered first, for the docs -kelp.register_kelp_surface(kelp.surfaces[1], table.copy(kelp.surface_deftemplate), kelp.surface_docs) -for i=2, #kelp.surfaces do - kelp.register_kelp_surface(kelp.surfaces[i], table.copy(kelp.surface_deftemplate), kelp.surface_docs) -end - --- Kelp item ------------------------------------------------------------------- - -minetest.register_craftitem("mcl_ocean:kelp", { - description = S("Kelp"), - _tt_help = S("Grows in water on dirt, sand, gravel"), - _doc_items_create_entry = false, - inventory_image = "mcl_ocean_kelp_item.png", - wield_image = "mcl_ocean_kelp_item.png", - on_place = kelp.kelp_on_place, - groups = {deco_block = 1, compostability = 30}, -}) - -if mod_doc then - doc.add_entry_alias("nodes", kelp.surface_docs.entry_id_orig, "craftitems", "mcl_ocean:kelp") -end - --- Dried kelp ------------------------------------------------------------------ - --- TODO: This is supposed to be eaten very fast -minetest.register_craftitem("mcl_ocean:dried_kelp", { - description = S("Dried Kelp"), - _doc_items_longdesc = S("Dried kelp is a food item."), - inventory_image = "mcl_ocean_dried_kelp.png", - wield_image = "mcl_ocean_dried_kelp.png", - groups = {food = 2, eatable = 1, compostability = 30}, - on_place = minetest.item_eat(1), - on_secondary_use = minetest.item_eat(1), - _mcl_saturation = 0.6, -}) - - -local mod_screwdriver = minetest.get_modpath("screwdriver") -local on_rotate -if mod_screwdriver then - on_rotate = screwdriver.rotate_3way -end - -minetest.register_node("mcl_ocean:dried_kelp_block", { - description = S("Dried Kelp Block"), - _doc_items_longdesc = S("A decorative block that serves as a great furnace fuel."), - tiles = { "mcl_ocean_dried_kelp_top.png", "mcl_ocean_dried_kelp_bottom.png", "mcl_ocean_dried_kelp_side.png" }, - groups = { - handy = 1, hoey = 1, building_block = 1, compostability = 50, - flammable = 2, fire_encouragement = 30, fire_flammability = 60 - }, - sounds = mcl_sounds.node_sound_leaves_defaults(), - paramtype2 = "facedir", - on_place = mcl_util.rotate_axis, - on_rotate = on_rotate, - _mcl_hardness = 0.5, - _mcl_blast_resistance = 12.5, -}) - -minetest.register_craft({ - type = "cooking", - recipe = "mcl_ocean:kelp", - output = "mcl_ocean:dried_kelp", - cooktime = 10, -}) -minetest.register_craft({ - recipe = { - { "mcl_ocean:dried_kelp","mcl_ocean:dried_kelp","mcl_ocean:dried_kelp" }, - { "mcl_ocean:dried_kelp","mcl_ocean:dried_kelp","mcl_ocean:dried_kelp" }, - { "mcl_ocean:dried_kelp","mcl_ocean:dried_kelp","mcl_ocean:dried_kelp" }, - }, - output = "mcl_ocean:dried_kelp_block", -}) -minetest.register_craft({ - recipe = { - { "mcl_ocean:dried_kelp_block" }, - }, - output = "mcl_ocean:dried_kelp 9", -}) -minetest.register_craft({ - type = "fuel", - recipe = "mcl_ocean:dried_kelp_block", - burntime = 200, -}) - --- Global registration ------------------------------------------------------------------------ - -minetest.register_lbm({ - label = "Kelp initialise", - name = "mcl_ocean:kelp_init", - nodenames = { "group:kelp" }, - run_at_every_load = true, -- so old kelps are also initialised - action = kelp.lbm_register_nodetimer, -}) - - -minetest.register_globalstep(kelp.globalstep) -minetest.register_on_shutdown(kelp.on_shutdown) - --- NOTE: Old ABM implementation. --- minetest.register_abm({ --- label = "Kelp drops", --- nodenames = { "group:kelp" }, --- interval = 1.0, --- chance = 1, --- catch_up = false, --- action = surface_unsubmerged_abm, --- }) --- --- minetest.register_abm({ --- label = "Kelp growth", --- nodenames = { "group:kelp" }, --- interval = 45, --- chance = 12, --- catch_up = false, --- action = grow_abm, --- }) diff --git a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.de.tr b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.de.tr deleted file mode 100644 index fc7e8b56e4..0000000000 --- a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.de.tr +++ /dev/null @@ -1,57 +0,0 @@ -# textdomain: mcl_ocean -Sea Lantern=Seelaterne -Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.=Seelaternen sind dekorative Lichtquellen, die im Wasser schick aussehen, aber sie können überall platziert werden. -Prismarine=Prismarin -Prismarine is used as a building block. It slowly changes its color.=Prismarin wird aus Baumaterial benutzt. Er verändert langsam seine Farbe. -Prismarine Bricks=Prismarinziegel -Dark Prismarine=Dunkelprismarin -Prismarine Crystals=Prismarinkristalle -Prismarine Shard=Prismarinsplitter -Dried Kelp=Getrockneter Seetang -Dried Kelp Block=Getrockneter Seetangblock -Brain Coral Block=Hirnkorallenblock -Brain Coral Fan=Hirnkorallenfächer -Brain Coral=Hirnkoralle -Bubble Coral Block=Blasenkorallenblock -Bubble Coral Fan=Blasenkorallenfächer -Bubble Coral=Blasenkoralle -Fire Coral Block=Feuerkorallenblock -Fire Coral Fan=Feuerkorallenfächer -Fire Coral=Feuerkoralle -Horn Coral Block=Hornkorallenblock -Horn Coral Fan=Hornkorallenfächer -Horn Coral=Hornkoralle -Tube Coral Block=Trompetenkorallenblock -Tube Coral Fan=Trompetenkorallenfächer -Tube Coral=Trompetenkoralle -Dead Brain Coral Block=Toter Hirnkorallenblock -Dead Brain Coral Fan=Toter Hirnkorallenfächer -Dead Brain Coral=Tote Hirnkoralle -Dead Bubble Coral Block=Toter Blasenkorallenblock -Dead Bubble Coral Fan=Toter Blasenkorallenfächer -Dead Bubble Coral=Tote Blasenkoralle -Dead Fire Coral Block=Toter Feuerkorallenblock -Dead Fire Coral Fan=Toter Feuerkorallenfächer -Dead Fire Coral=Tote Feuerkoralle -Dead Horn Coral Block=Toter Hornkorallenblock -Dead Horn Coral Fan=Toter Hornkorallenfächer -Dead Horn Coral=Tote Hornkoralle -Dead Tube Coral Block=Toter Trompetenkorallenblock -Dead Tube Coral Fan=Toter Trompetenkorallenfächer -Dead Tube Coral=Tote Trompetenkoralle -Seagrass=Seegras -Kelp=Seetang -Kelp grows inside water on top of dirt, sand or gravel.=Seetang wächst im Wasser auf Erde, Sand oder Kies. -Coral blocks live in the oceans and need a water source next to them to survive. Without water, they die off.=Korallenblöcke leben im Ozean und benötigen eine Wasserquelle neben ihnen, um zu überleben. Ohne Wasser sterben sie ab. -Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Korallen wachsen auf Korallenblöcken und müssen sich in einer Wasserquelle befinden, um zu überleben. Ohne Wasser sterben sie gemeinsam mit dem Korallenblock ab. -Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Korallenfächer wachsen auf Korallenblöcken und müssen sich in einer Wasserquelle befinden, um zu überleben. Ohne Wasser sterben sie gemeinsam mit dem Korallenblock ab. -Seagrass grows inside water on top of dirt, sand or gravel.=Seegras wächst im Wasser auf Erde, Sand oder Kies. -A decorative block that serves as a great furnace fuel.=Ein dekorativer Block, der sich gut als Ofenbrennstoff eignet. -Dried kelp is a food item.=Getrockneter Seetang ist ein Lebensmittel. -Grows on coral block of same species=Wächst auf Korallenblock der gleichen Art -Needs water to live=Benötigt Wasser zum Leben -Grows in water on dirt, sand, gravel=Wächst im Wasser auf Erde, Sand, Kies -Glows in the water=Leuchtet im Wasser -4 possible sizes=4 mögliche Größen -Grows on dead brain coral block=Wächst auf totem Hirnkorallenblock -Sea Pickle=Meeresgurke diff --git a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.es.tr b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.es.tr deleted file mode 100644 index 294da64b0e..0000000000 --- a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.es.tr +++ /dev/null @@ -1,51 +0,0 @@ -# textdomain: mcl_ocean -Sea Lantern=Linterna de mar -Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.=Las linternas marinas son fuentes de luz decorativas que se ven muy bien bajo el agua pero se pueden colocar en cualquier lugar. -Prismarine=Prismarina -Prismarine is used as a building block. It slowly changes its color.=La prismarina se usa como bloque de construcción. Poco a poco cambia su color. -Prismarine Bricks=Ladrillos de prismarina -Dark Prismarine=Prismarina oscura -Prismarine Crystals=Cristales de prismatina -Prismarine Shard=Fragmento de prismatina -Dried Kelp=Algas secas -Dried Kelp Block=Bloque de algas secas -Brain Coral Block=Bloque de coral de cerebro -Brain Coral Fan=Coral de cerebro desparramado -Brain Coral=Coral de cerebro -Bubble Coral Block=Bloque de coral de burbuja -Bubble Coral Fan=Coral de burbuja desparramado -Bubble Coral=Coral de burbuja -Fire Coral Block=Bloque de coral de fuego -Fire Coral Fan=Coral de fuego desparramado -Fire Coral=Coral de fuego -Horn Coral Block=Bloque de coral de cuerno -Horn Coral Fan=Coral de cuerno desparramado -Horn Coral=Coral de cuerno -Tube Coral Block=Bloque de coral de tubo -Tube Coral Fan=Coral de tubo desparramado -Tube Coral=Coral de tubo -Dead Brain Coral Block=Bloque de coral muerto -Dead Brain Coral Fan=Coral desparramado -Dead Brain Coral=Coral de cerebro muerto -Dead Bubble Coral Block=Bloque de coral de burbuja muerto -Dead Bubble Coral Fan=Coral de burbuja desparramado -Dead Bubble Coral=Coral de burbuja muerto -Dead Fire Coral Block=Bloque de coral de fuego muerto -Dead Fire Coral Fan=Coral de fuego desparramado -Dead Fire Coral=Coral de fuego muerto -Dead Horn Coral Block=Bloque de coral de cuerno muerto -Dead Horn Coral Fan=Coral de cuerno desparramado -Dead Horn Coral=Coral de cuerno muerto -Dead Tube Coral Block=Bloque de coral de tubo muerto -Dead Tube Coral Fan=Coral de tubo desparramado -Dead Tube Coral=Coral de tubo muerto -Seagrass=Hierba marina -Kelp=Alga -Kelp grows inside water on top of dirt, sand or gravel.=Las algas crecen dentro del agua sobre tierra, arena o grava. -Coral blocks live in the oceans and need a water source next to them to survive. Without water, they die off.=Los bloques de coral viven en los océanos y necesitan una fuente de agua junto a ellos para sobrevivir. Sin agua, mueren. -Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Los corales crecen sobre bloques de coral y necesitan estar dentro de una fuente de agua para sobrevivir. Sin agua, morirá, al igual que el bloque de coral que se encuentra debajo. -Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Los fanáticos de los corales crecen encima de los bloques de coral y necesitan estar dentro de una fuente de agua para sobrevivir. Sin agua, morirá, al igual que el bloque de coral que se encuentra debajo. -Seagrass grows inside water on top of dirt, sand or gravel.=La hierba marina crece dentro del agua sobre tierra, arena o grava. -A decorative block that serves as a great furnace fuel.=Un bloque decorativo que sirve como un gran combustible de horno. -Dried kelp is a food item.=Las algas secas son un alimento. -Sea Pickle= diff --git a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.fr.tr b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.fr.tr deleted file mode 100644 index a1b3f0b777..0000000000 --- a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.fr.tr +++ /dev/null @@ -1,59 +0,0 @@ -# textdomain: mcl_ocean -Sea Lantern=Lanterne aquatique -Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.=Les lanternes marines sont des sources lumineuses décoratives qui ont fière allure sous l'eau mais peuvent être placées n'importe où. -Prismarine=Prismarine -Prismarine is used as a building block. It slowly changes its color.=La prismarine est utilisée comme bloc de construction. Il change lentement de couleur. -Prismarine Bricks=Prismarine Taillée -Dark Prismarine=Prismarine Sombre -Prismarine Crystals=Cristaux de Prismarine -Prismarine Shard=Éclat de Prismarine -Dried Kelp=Algue Séchée -Dried Kelp Block=Bloc d'Algue Séchée -Brain Coral Block=Bloc de Corail -Brain Coral Fan=Gorgone de Corail -Brain Coral=Corail -Bubble Coral Block=Bloc de Corail Bulles -Bubble Coral Fan=Gorgone de Corail Bulles -Bubble Coral=Corail Bulles -Fire Coral Block=Bloc Corail de Feu -Fire Coral Fan=Gorgone Corail de Feu -Fire Coral=Corail de Feu -Horn Coral Block=Bloc de Corail Corné -Horn Coral Fan=Gorgone de Corail Corné -Horn Coral=Corail Corné -Tube Coral Block=Bloc de Corail Tubulaire -Tube Coral Fan=Gorgone de Corail Tubulaire -Tube Coral=Corail Tubulaire -Dead Brain Coral Block=Bloc de Corail Mort -Dead Brain Coral Fan=Gorgone de Corail Mort -Dead Brain Coral=Corail Mort -Dead Bubble Coral Block=Bloc de Corail Bulles Mort -Dead Bubble Coral Fan=Gorgone de Corail Bulles Mort -Dead Bubble Coral=Corail Bulles Mort -Dead Fire Coral Block=Bloc de Corail de Feu Mort -Dead Fire Coral Fan=Gorgone de Corail de Feu Mort -Dead Fire Coral=Corail de Feu Mort -Dead Horn Coral Block=Bloc de Corail Corné Mort -Dead Horn Coral Fan=Gorgone de Corail Corné Mort -Dead Horn Coral=Corail Corné Mort -Dead Tube Coral Block=Bloc de Corail Tubulaire Mort -Dead Tube Coral Fan=Gorgone de Corail Tubulaire Mort -Dead Tube Coral=Corail Tubulaire Mort -Seagrass=Herbe aquatique -Kelp=Algue -Kelp grows inside water on top of dirt, sand or gravel.=Les Algues pousse à l'intérieur de l'eau sur la terre, le sable ou le gravier. -Coral blocks live in the oceans and need a water source next to them to survive. Without water, they die off.=Les blocs de corail vivent dans les océans et ont besoin d'une source d'eau à côté d'eux pour survivre. Sans eau, ils meurent. -Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Les coraux se développent au-dessus des blocs de corail et doivent être à l'intérieur d'une source d'eau pour survivre. Sans eau, il mourra, ainsi que le bloc de corail en dessous. -Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Les gorgones de coraux se développent au-dessus des blocs de corail et doivent être à l'intérieur d'une source d'eau pour survivre. Sans eau, il mourra, ainsi que le bloc de corail en dessous. -Seagrass grows inside water on top of dirt, sand or gravel.=Les herbiers aquatique poussent à l'intérieur de l'eau sur la terre, le sable ou le gravier. -A decorative block that serves as a great furnace fuel.=Un bloc décoratif qui sert de bon combustible pour le four. -Dried kelp is a food item.=L'algue séchée est un aliment. -Grows on coral block of same species=Pousse sur un bloc de corail de la même espèce -Needs water to live=A besoin d'eau pour vivre -Grows in water on dirt, sand, gravel=Pousse dans l'eau sur la terre, le sable et le gravier -Glows in the water=Brille dans l'eau -4 possible sizes=4 tailles possibles -Grows on dead brain coral block=Pousse sur un bloc de corail mort -Sea Pickle=Cornichon de mer -Sea pickles grow on dead brain coral blocks and provide light when underwater. They come in 4 sizes that vary in brightness.=Les cornichons de mer poussent sur des blocs de corail morts et fournissent de la lumière lorsqu'ils sont sous l'eau. Ils viennent en 4 tailles qui varient en luminosité. -It can only be placed on top of dead brain coral blocks. Placing a sea pickle on another sea pickle will make it grow and brighter.=Il ne peut être placé que sur des blocs de corail morts. Placer un cornichon sur un autre cornichon le rendra plus brillant et plus brillant. \ No newline at end of file diff --git a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.pl.tr b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.pl.tr deleted file mode 100644 index 7c63e49593..0000000000 --- a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.pl.tr +++ /dev/null @@ -1,60 +0,0 @@ -# textdomain: mcl_ocean -Sea Lantern=Latarnia morska -Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.=Latarnie morskie to dekoracyjne źródła światła, które wyglądają bardzo dobrze pod wodą, ale mogą być umieszczone gdziekolwiek. -Prismarine=Pryzmaryn -Prismarine is used as a building block. It slowly changes its color.=Pryzmaryn jest blokiem budowlanym. Powoli zmienia on swój kolor. -Prismarine Bricks=Pryzmarynowe cegły -Dark Prismarine=Ciemny pryzmaryn -Prismarine Crystals=Pryzmarynowe kryształy -Prismarine Shard=Pryzmarynowe odłamki -Dried Kelp=Suszone wodorosty -Dried Kelp Block=Blok suszonych wodorostów -Brain Coral Block=Blok mózgowatego koralowca -Brain Coral Fan=Wachlarz mózgowatego koralowca -Brain Coral=Mózgowaty koralowiec -Bubble Coral Block=Blok bąbelkowego koralowca -Bubble Coral Fan=Wachlarz bąbelkowego koralowca -Bubble Coral=Bąbelkowy koralowiec -Fire Coral Block=Blok ognistego koralowca -Fire Coral Fan=Wachlarz ognistego koralowca -Fire Coral=Ognisty koralowiec -Horn Coral Block=Blok rogatego koralowca -Horn Coral Fan=Wachlarz rogatego koralowca -Horn Coral=Rogaty koralowiec -Tube Coral Block=Blok rurkowatego koralowca -Tube Coral Fan=Wachlarz rurkowatego koralowca -Tube Coral=Rurkowaty koralowiec -Dead Brain Coral Block=Martwy blok mózgowatego koralowca -Dead Brain Coral Fan=Martwy wachlarz mózgowatego koralowca -Dead Brain Coral=Martwy mózgowaty koralowiec -Dead Bubble Coral Block=Martwy blok bąbelkowego koralowca -Dead Bubble Coral Fan=Martwy wachlarz bąbelkowego koralowca -Dead Bubble Coral=Martwy bąbelkowy koralowiec -Dead Fire Coral Block=Martwy blok ognistego koralowca -Dead Fire Coral Fan=Martwy wachlarz ognistego koralowca -Dead Fire Coral=Martwy ognisty koralowiec -Dead Horn Coral Block=Martwy blok rogatego koralowca -Dead Horn Coral Fan=Martwy wachlarz rogatego koralowca -Dead Horn Coral=Martwy rogaty koralowiec -Dead Tube Coral Block=Martwy blok rurkowatego koralowca -Dead Tube Coral Fan=Martwy wachlarz rurkowatego koralowca -Dead Tube Coral=Martwy rurkowaty koralowiec -Seagrass=Trawa morska -Kelp=Wodorosty -Kelp grows inside water on top of dirt, sand or gravel.=Wodorosty rosną w wodzie na ziemi, piasku i żwirze. -Coral blocks live in the oceans and need a water source next to them to survive. Without water, they die off.=Bloki koralowca żyją w oceanach i potrzebują źródła wody obok aby przeżyć. Bez wody obumierają. -Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Koralowiec rośnie na blokach koralowca i musi być wewnątrz źródła wody aby przeżyć. Bez wody obumiera. -Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Wachlarz koralowca rośnie na blokach koralowca i musi być wewnątrz źródła wody aby przeżyć. Bez wody obumiera zarówno on jak i blok koralowca pod nim. -Seagrass grows inside water on top of dirt, sand or gravel.=Trawa morska rośnie w wodzie na ziemi, piasku i żwirze. -A decorative block that serves as a great furnace fuel.=Blok dekoracyjny, który świetnie sprawdza się jako paliwo do pieca. -Dried kelp is a food item.=Suszone wodorosty jest przedmiotem do jedzenia. -Grows on coral block of same species=Rośnie na blokach koralowca tego samego gatunku. -Needs water to live=Potrzebuje wody do życia. -Grows in water on dirt, sand, gravel=Rośnie w wodzie na ziemi, piasku i żwirze. -Glows in the water=Świeci w wodzie -4 possible sizes=4 możliwe wielkości -Grows on dead brain coral block=Rośnie na martwych blokach mózgowatego koralowca -Sea Pickle=Iskrzyłuda -Sea pickles grow on dead brain coral blocks and provide light when underwater. They come in 4 sizes that vary in brightness.=Iskrzyłuda rośnie na martwych blokach mózgowatego koralowca i jest źródłem światła pod wodą. -It can only be placed on top of dead brain coral blocks. Placing a sea pickle on another sea pickle will make it grow and brighter.=Może być postawiona tylko na blokach mózgowatego koralowca. Postawienie iskrzyłuda na innej iskrzyłudzie sprawi, że się powiększy i będzie jaśniejsza. - diff --git a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.ru.tr b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.ru.tr deleted file mode 100644 index e7e5a12e3d..0000000000 --- a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.ru.tr +++ /dev/null @@ -1,59 +0,0 @@ -# textdomain: mcl_ocean -Sea Lantern=Морской светильник -Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.=Морской светильник это декоративный источник света. Он отлично смотрится под водой, но размещать его можно в любых местах. -Prismarine=Призмарин -Prismarine is used as a building block. It slowly changes its color.=Призмарин хорош как строительный блок. Он медленно меняет свой цвет. -Prismarine Bricks=Призмариновые кирпичи -Dark Prismarine=Тёмный призмарин -Prismarine Crystals=Призмариновые кристаллы -Prismarine Shard=Осколок призмарина -Dried Kelp=Сушёная ламинария -Dried Kelp Block=Блок сухой ламинарии -Brain Coral Block=Блок мозгового коралла -Brain Coral Fan=Вентилятор мозгового коралла -Brain Coral=Мозговой коралл -Bubble Coral Block=Блок пузыристого коралла -Bubble Coral Fan=Вентилятор пузыристого коралла -Bubble Coral=Пузыристый коралл -Fire Coral Block=Блок огненного коралла -Fire Coral Fan=Вентилятор огненного коралла -Fire Coral=Огненный коралл -Horn Coral Block=Блок рожкового коралла -Horn Coral Fan=Вентилятор рожкового коралла -Horn Coral=Рожковый коралл -Tube Coral Block=Блок трубного коралла -Tube Coral Fan=Вентилятор трубного коралла -Tube Coral=Трубный коралл -Dead Brain Coral Block=Блок мёртвого мозгового коралла -Dead Brain Coral Fan=Вентилятор мёртвого мозгового коралла -Dead Brain Coral=Мёртвый мозговой коралл -Dead Bubble Coral Block=Блок мёртвого пузыристого коралла -Dead Bubble Coral Fan=Вентилятор мёртвого пузыристого коралла -Dead Bubble Coral=Мёртвый пузыристый коралл -Dead Fire Coral Block=Блок мёртвого огненного коралла -Dead Fire Coral Fan=Вентилятор мёртвого огненного коралла -Dead Fire Coral=Мёртвый огненный коралл -Dead Horn Coral Block=Блок мёртвого рожкового коралла -Dead Horn Coral Fan=Вентилятор мёртвого рожкового коралла -Dead Horn Coral=Мёртвый рожковый коралл -Dead Tube Coral Block=Блок мёртвого трубного коралла -Dead Tube Coral Fan=Вентилятор мёртвого трубного коралла -Dead Tube Coral=Мёртвый трубный коралл -Seagrass=Водоросли -Kelp=Ламинария -Kelp grows inside water on top of dirt, sand or gravel.=Водоросли растут в воде поверх грязи, песка или гравия. -Coral blocks live in the oceans and need a water source next to them to survive. Without water, they die off.=Коралловые блоки живут в океанах и нуждаются в источниках воды рядом с ними, чтобы выжить. Без воды они умирают. -Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Кораллы растут на вершинах коралловых блоков и должны быть внутри источника воды, чтобы жить. Без воды они умирают, как и коралловые блоки внизу. -Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Кораллов вентиляторы растут на вершинах коралловых блоков и должны быть внутри источника воды, чтобы выжить. Без воды они умирают, как и коралловые блоки внизу. -Seagrass grows inside water on top of dirt, sand or gravel.=Водоросли растут в воде поверх грязи, песка или гравия. -A decorative block that serves as a great furnace fuel.=Декоративный блок, служащий отличным топливом для печи. -Dried kelp is a food item.=Сушеная ламинария - это продуктовый предмет. -Grows on coral block of same species=Растет на коралловом блоке того же вида -Needs water to live=Нуждается в воде, чтобы жить -Grows in water on dirt, sand, gravel=Растёт в воде на грязи, песке, гравии -Glows in the water=Светится в воде -4 possible sizes=4 возможных размера -Grows on dead brain coral block=Растёт на блоке мёртвого коралла -Sea Pickle=Морской огурец -Sea pickles grow on dead brain coral blocks and provide light when underwater. They come in 4 sizes that vary in brightness.=Морские огурцы растут на мертвых коралловых блоках и дают свет под водой. Они бывают четырёх размеров, которые различаются по яркости. -It can only be placed on top of dead brain coral blocks. Placing a sea pickle on another sea pickle will make it grow and brighter.=Это можно помещать только на верхушку блока мертвого мозгового коралла. Помещение морского огурца на другой морской огурец приведёт к тому, что он вырастет и станет ярче. diff --git a/mods/ITEMS/mcl_ocean/locale/template.txt b/mods/ITEMS/mcl_ocean/locale/template.txt deleted file mode 100644 index 975976db29..0000000000 --- a/mods/ITEMS/mcl_ocean/locale/template.txt +++ /dev/null @@ -1,60 +0,0 @@ -# textdomain: mcl_ocean -Sea Lantern= -Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.= -Prismarine= -Prismarine is used as a building block. It slowly changes its color.= -Prismarine Bricks= -Dark Prismarine= -Prismarine Crystals= -Prismarine Shard= -Dried Kelp= -Dried Kelp Block= -Brain Coral Block= -Brain Coral Fan= -Brain Coral= -Bubble Coral Block= -Bubble Coral Fan= -Bubble Coral= -Fire Coral Block= -Fire Coral Fan= -Fire Coral= -Horn Coral Block= -Horn Coral Fan= -Horn Coral= -Tube Coral Block= -Tube Coral Fan= -Tube Coral= -Dead Brain Coral Block= -Dead Brain Coral Fan= -Dead Brain Coral= -Dead Bubble Coral Block= -Dead Bubble Coral Fan= -Dead Bubble Coral= -Dead Fire Coral Block= -Dead Fire Coral Fan= -Dead Fire Coral= -Dead Horn Coral Block= -Dead Horn Coral Fan= -Dead Horn Coral= -Dead Tube Coral Block= -Dead Tube Coral Fan= -Dead Tube Coral= -Seagrass= -Kelp= -Kelp grows inside water on top of dirt, sand or gravel.= -Coral blocks live in the oceans and need a water source next to them to survive. Without water, they die off.= -Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.= -Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.= -Seagrass grows inside water on top of dirt, sand or gravel.= -A decorative block that serves as a great furnace fuel.= -Dried kelp is a food item.= -Grows on coral block of same species= -Needs water to live= -Grows in water on dirt, sand, gravel= -Glows in the water= -4 possible sizes= -Grows on dead brain coral block= -Sea Pickle= -Sea pickles grow on dead brain coral blocks and provide light when underwater. They come in 4 sizes that vary in brightness.= -It can only be placed on top of dead brain coral blocks. Placing a sea pickle on another sea pickle will make it grow and brighter.= - diff --git a/mods/ITEMS/mcl_ocean/mod.conf b/mods/ITEMS/mcl_ocean/mod.conf deleted file mode 100644 index 9b639a7b0b..0000000000 --- a/mods/ITEMS/mcl_ocean/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = mcl_ocean -description = Includes various ocean nodes -depends = mcl_core, mcl_sounds, mcl_dye -optional_depends = doc, doc_items, screwdriver diff --git a/mods/ITEMS/mcl_ocean/prismarine.lua b/mods/ITEMS/mcl_ocean/prismarine.lua deleted file mode 100644 index e38b3e0a68..0000000000 --- a/mods/ITEMS/mcl_ocean/prismarine.lua +++ /dev/null @@ -1,125 +0,0 @@ --- Nodes - -local S = minetest.get_translator(minetest.get_current_modname()) - -minetest.register_node("mcl_ocean:sea_lantern", { - description = S("Sea Lantern"), - _doc_items_longdesc = S("Sea lanterns are decorative light sources which look great underwater but can be placed anywhere."), - paramtype2 = "facedir", - is_ground_content = false, - stack_max = 64, - light_source = minetest.LIGHT_MAX, - drop = { - max_items = 1, - items = { - { items = {"mcl_ocean:prismarine_crystals 3"}, rarity = 2 }, - { items = {"mcl_ocean:prismarine_crystals 2"}} - } - }, - tiles = {{name="mcl_ocean_sea_lantern.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=1.25}}}, - groups = {handy=1, building_block=1, material_glass=1}, - sounds = mcl_sounds.node_sound_glass_defaults(), - _mcl_blast_resistance = 0.3, - _mcl_hardness = 0.3, - _mcl_silk_touch_drop = true, - _mcl_fortune_drop = { - discrete_uniform_distribution = true, - items = {"mcl_ocean:prismarine_crystals"}, - min_count = 2, - max_count = 3, - cap = 5, - } -}) - -minetest.register_node("mcl_ocean:prismarine", { - description = S("Prismarine"), - _doc_items_longdesc = S("Prismarine is used as a building block. It slowly changes its color."), - stack_max = 64, - is_ground_content = false, - -- Texture should have 22 frames for smooth transitions. - tiles = {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, - groups = {pickaxey=1, building_block=1, material_stone=1}, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 1.5, - _mcl_hardness = 1.5, -}) - -minetest.register_node("mcl_ocean:prismarine_brick", { - description = S("Prismarine Bricks"), - _doc_items_longdesc = doc.sub.items.temp.build, - stack_max = 64, - is_ground_content = false, - tiles = {"mcl_ocean_prismarine_bricks.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1}, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 1.5, - _mcl_hardness = 1.5, -}) - -minetest.register_node("mcl_ocean:prismarine_dark", { - description = S("Dark Prismarine"), - _doc_items_longdesc = doc.sub.items.temp.build, - stack_max = 64, - is_ground_content = false, - tiles = {"mcl_ocean_prismarine_dark.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1}, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 1.5, - _mcl_hardness = 1.5, -}) - --- Craftitems - -minetest.register_craftitem("mcl_ocean:prismarine_crystals", { - description = S("Prismarine Crystals"), - _doc_items_longdesc = doc.sub.items.temp.craftitem, - inventory_image = "mcl_ocean_prismarine_crystals.png", - stack_max = 64, - groups = { craftitem = 1 }, -}) - -minetest.register_craftitem("mcl_ocean:prismarine_shard", { - description = S("Prismarine Shard"), - _doc_items_longdesc = doc.sub.items.temp.craftitem, - inventory_image = "mcl_ocean_prismarine_shard.png", - stack_max = 64, - groups = { craftitem = 1 }, -}) - --- Crafting - -minetest.register_craft({ - output = "mcl_ocean:sea_lantern", - recipe = { - {"mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_crystals", "mcl_ocean:prismarine_shard"}, - {"mcl_ocean:prismarine_crystals", "mcl_ocean:prismarine_crystals", "mcl_ocean:prismarine_crystals"}, - {"mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_crystals", "mcl_ocean:prismarine_shard"}, - } -}) - -minetest.register_craft({ - output = "mcl_ocean:prismarine", - recipe = { - {"mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_shard"}, - {"mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_shard"}, - } -}) - -minetest.register_craft({ - output = "mcl_ocean:prismarine_brick", - recipe = { - {"mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_shard"}, - {"mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_shard"}, - {"mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_shard"}, - } -}) - -minetest.register_craft({ - output = "mcl_ocean:prismarine_dark", - recipe = { - {"mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_shard"}, - {"mcl_ocean:prismarine_shard", "mcl_dye:black", "mcl_ocean:prismarine_shard"}, - {"mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_shard", "mcl_ocean:prismarine_shard"}, - } -}) - diff --git a/mods/ITEMS/mcl_ocean/sea_pickle.lua b/mods/ITEMS/mcl_ocean/sea_pickle.lua deleted file mode 100644 index 6a4e4a751d..0000000000 --- a/mods/ITEMS/mcl_ocean/sea_pickle.lua +++ /dev/null @@ -1,209 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -local mod_doc = minetest.get_modpath("doc") - -local function sea_pickle_on_place(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" or not placer then - return itemstack - end - - local player_name = placer:get_player_name() - local pos_under = pointed_thing.under - local pos_above = pointed_thing.above - local node_under = minetest.get_node(pos_under) - local node_above = minetest.get_node(pos_above) - local def_under = minetest.registered_nodes[node_under.name] - --local def_above = minetest.registered_nodes[node_above.name] - - if def_under and def_under.on_rightclick and not placer:get_player_control().sneak then - return def_under.on_rightclick(pos_under, node_under, - placer, itemstack, pointed_thing) or itemstack - end - - if minetest.is_protected(pos_under, player_name) or - minetest.is_protected(pos_above, player_name) then - minetest.log("action", player_name - .. " tried to place " .. itemstack:get_name() - .. " at protected position " - .. minetest.pos_to_string(pos_under)) - minetest.record_protection_violation(pos_under, player_name) - return itemstack - end - - local submerged = false - if minetest.get_item_group(node_above.name, "water") ~= 0 then - submerged = true - end - -- Place - if node_under.name == "mcl_ocean:dead_brain_coral_block" then - -- Place on suitable coral block - if submerged then - node_under.name = "mcl_ocean:sea_pickle_1_dead_brain_coral_block" - else - node_under.name = "mcl_ocean:sea_pickle_1_off_dead_brain_coral_block" - end - minetest.set_node(pos_under, node_under) - elseif minetest.get_item_group(node_under.name, "sea_pickle") ~= 0 then - -- Grow by 1 stage - local def = minetest.registered_nodes[node_under.name] - if def and def._mcl_sea_pickle_next then - node_under.name = def._mcl_sea_pickle_next - minetest.set_node(pos_under, node_under) - else - return itemstack - end - else - return itemstack - end - if not minetest.is_creative_enabled(player_name) then - itemstack:take_item() - end - return itemstack -end - --- Sea Pickle on brain coral - -local sounds_coral_plant = mcl_sounds.node_sound_leaves_defaults({footstep = mcl_sounds.node_sound_dirt_defaults().footstep}) -local ontop = "dead_brain_coral_block" -local canonical = "mcl_ocean:sea_pickle_1_"..ontop - -for s=1,4 do - local desc, doc_desc, doc_use, doc_create, tt_help, nici, img, img_off, on_place - if s == 1 then - desc = S("Sea Pickle") - doc_desc = S("Sea pickles grow on dead brain coral blocks and provide light when underwater. They come in 4 sizes that vary in brightness.") - doc_use = S("It can only be placed on top of dead brain coral blocks. Placing a sea pickle on another sea pickle will make it grow and brighter.") - tt_help = S("Glows in the water").."\n"..S("4 possible sizes").."\n"..S("Grows on dead brain coral block") - img = "mcl_ocean_sea_pickle_item.png" - on_place = sea_pickle_on_place - else - doc_create = false - nici = 1 - img = "mcl_ocean_"..ontop..".png^(mcl_ocean_sea_pickle_"..s.."_anim.png^[verticalframe:2:1)" - end - img_off = "mcl_ocean_"..ontop..".png^mcl_ocean_sea_pickle_"..s.."_off.png" - local next_on, next_off - if s < 4 then - next_on = "mcl_ocean:sea_pickle_"..tostring(s+1).."_"..ontop - next_off = "mcl_ocean:sea_pickle_"..tostring(s+1).."_off_"..ontop - end - - minetest.register_node("mcl_ocean:sea_pickle_"..s.."_"..ontop, { - description = desc, - _tt_help = tt_help, - _doc_items_create_entry = doc_create, - _doc_items_longdesc = doc_desc, - _doc_items_usagehelp = doc_use, - drawtype = "plantlike_rooted", - paramtype = "light", - paramtype2 = "meshoptions", - tiles = { "mcl_ocean_"..ontop..".png" }, - special_tiles = { - { - image = "mcl_ocean_sea_pickle_"..s.."_anim.png", - animation = {type="vertical_frames", aspect_w=16, aspect_h=16, length=1.7}, - } - }, - inventory_image = img, - wield_image = img, - groups = { - dig_immediate = 3, deco_block = 1, sea_pickle = 1, - not_in_creative_inventory=nici, compostability = 65 - }, - -- Light level: 6 at size 1, +3 for each additional stage - light_source = math.min(6 + (s-1)*3, minetest.LIGHT_MAX), - selection_box = { - type = "fixed", - fixed = { - { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, - { -0.15, 0.5, -0.15, 0.15, 0.5+2/16+(2/16)*s, 0.15 }, - } - }, - sounds = sounds_coral_plant, - drop = canonical .. " "..s, - node_placement_prediction = "", - node_dig_prediction = "mcl_ocean:"..ontop, - after_dig_node = function(pos) - local node = minetest.get_node(pos) - if minetest.get_item_group(node.name, "sea_pickle") == 0 then - minetest.set_node(pos, {name="mcl_ocean:"..ontop}) - end - end, - on_place = on_place, - _mcl_sea_pickle_off = "mcl_ocean:sea_pickle_"..s.."_off_"..ontop, - _mcl_sea_pickle_next = next_on, - _mcl_hardness = 0, - _mcl_blast_resistance = 0, - }) - - minetest.register_node("mcl_ocean:sea_pickle_"..s.."_off_"..ontop, { - drawtype = "plantlike_rooted", - paramtype = "light", - paramtype2 = "meshoptions", - tiles = { "mcl_ocean_"..ontop..".png" }, - special_tiles = { "mcl_ocean_sea_pickle_"..s.."_off.png", }, - groups = { dig_immediate = 3, deco_block = 1, sea_pickle=2, not_in_creative_inventory=1 }, - selection_box = { - type = "fixed", - fixed = { - { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, - { -0.15, 0.5, -0.15, 0.15, 0.5+2/16+(2/16)*s, 0.15 }, - } - }, - inventory_image = img_off, - wield_image = img_off, - sounds = sounds_coral_plant, - drop = canonical .. " "..s, - node_placement_prediction = "", - node_dig_prediction = "mcl_ocean:"..ontop, - after_dig_node = function(pos) - local node = minetest.get_node(pos) - if minetest.get_item_group(node.name, "sea_pickle") == 0 then - minetest.set_node(pos, {name="mcl_ocean:"..ontop}) - end - end, - _mcl_sea_pickle_on = "mcl_ocean:sea_pickle_"..s.."_"..ontop, - _mcl_sea_pickle_next = next_off, - _mcl_hardness = 0, - _mcl_blast_resistance = 0, - }) - - if mod_doc then - if s == 1 then - doc.add_entry_alias("nodes", "mcl_ocean:sea_pickle_1_dead_brain_coral_block", "nodes", "mcl_ocean:sea_pickle_1_off_"..ontop) - else - doc.add_entry_alias("nodes", "mcl_ocean:sea_pickle_1_dead_brain_coral_block", "nodes", "mcl_ocean:sea_pickle_"..s.."_off_"..ontop) - doc.add_entry_alias("nodes", "mcl_ocean:sea_pickle_1_dead_brain_coral_block", "nodes", "mcl_ocean:sea_pickle_"..s.."_"..ontop) - end - end -end - -minetest.register_abm({ - label = "Sea pickle update", - nodenames = { "group:sea_pickle" }, - interval = 17, - chance = 5, - catch_up = false, - action = function(pos, node, active_object_count, active_object_count_wider) - -- Check if it's lit - local state = minetest.get_item_group(node.name, "sea_pickle") - -- Check for water - local checknode = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) - local def = minetest.registered_nodes[node.name] - if minetest.get_item_group(checknode.name, "water") ~= 0 then - -- Sea pickle is unlit - if state == 2 then - node.name = def._mcl_sea_pickle_on - minetest.set_node(pos, node) - return - end - else - -- Sea pickle is lit - if state == 1 then - node.name = def._mcl_sea_pickle_off - minetest.set_node(pos, node) - return - end - end - end, -}) diff --git a/mods/ITEMS/mcl_ocean/seagrass.lua b/mods/ITEMS/mcl_ocean/seagrass.lua deleted file mode 100644 index 2f58a28124..0000000000 --- a/mods/ITEMS/mcl_ocean/seagrass.lua +++ /dev/null @@ -1,157 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -local mod_doc = minetest.get_modpath("doc") - --- List of supported surfaces for seagrass -local surfaces = { - { "dirt", "mcl_core:dirt" }, - { "sand", "mcl_core:sand", 1 }, - { "redsand", "mcl_core:redsand", 1 }, - { "gravel", "mcl_core:gravel", 1 }, -} - -local function seagrass_on_place(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" or not placer then - return itemstack - end - - local player_name = placer:get_player_name() - local pos_under = pointed_thing.under - local pos_above = pointed_thing.above - local node_under = minetest.get_node(pos_under) - local node_above = minetest.get_node(pos_above) - local def_under = minetest.registered_nodes[node_under.name] - local def_above = minetest.registered_nodes[node_above.name] - - if def_under and def_under.on_rightclick and not placer:get_player_control().sneak then - return def_under.on_rightclick(pos_under, node_under, - placer, itemstack, pointed_thing) or itemstack - end - - if pos_under.y >= pos_above.y then - return itemstack - end - - -- Placement rules: - -- Seagrass can only be placed on top of dirt inside water - local g_above_water = minetest.get_item_group(node_above.name, "water") - if not (g_above_water ~= 0 and def_above.liquidtype == "source") then - return itemstack - end - - if minetest.is_protected(pos_under, player_name) or - minetest.is_protected(pos_above, player_name) then - minetest.log("action", player_name - .. " tried to place " .. itemstack:get_name() - .. " at protected position " - .. minetest.pos_to_string(pos_under)) - minetest.record_protection_violation(pos_under, player_name) - return itemstack - end - - -- Select a seagrass node - if node_under.name == "mcl_core:dirt" then - node_under.name = "mcl_ocean:seagrass_dirt" - elseif node_under.name == "mcl_core:sand" then - node_under.name = "mcl_ocean:seagrass_sand" - elseif node_under.name == "mcl_core:redsand" then - node_under.name = "mcl_ocean:seagrass_redsand" - elseif node_under.name == "mcl_core:gravel" then - node_under.name = "mcl_ocean:seagrass_gravel" - else - return itemstack - end - node_under.param2 = minetest.registered_items[node_under.name].place_param2 or 3 - if node_under.param2 < 8 and math.random(1,2) == 1 then - -- Random horizontal displacement - node_under.param2 = node_under.param2 + 8 - end - local def_node = minetest.registered_items[node_under.name] - if def_node.sounds then - minetest.sound_play(def_node.sounds.place, { gain = 0.5, pos = pos_under }, true) - end - minetest.set_node(pos_under, node_under) - if not minetest.is_creative_enabled(player_name) then - itemstack:take_item() - end - - return itemstack -end - -minetest.register_craftitem("mcl_ocean:seagrass", { - description = S("Seagrass"), - _tt_help = S("Grows in water on dirt, sand, gravel"), - _doc_items_create_entry = false, - inventory_image = "mcl_ocean_seagrass.png^[verticalframe:12:0", - wield_image = "mcl_ocean_seagrass.png^[verticalframe:12:0", - on_place = seagrass_on_place, - groups = {deco_block = 1, compostability = 30}, -}) - --- Seagrass nodes: seagrass on a surface node - -for s=1, #surfaces do - local def = minetest.registered_nodes[surfaces[s][2]] - local alt - if surfaces[s][3] == 1 then - alt = surfaces[s][2] - end - local sounds = table.copy(def.sounds) - local leaf_sounds = mcl_sounds.node_sound_leaves_defaults() - sounds.dig = leaf_sounds.dig - sounds.dug = leaf_sounds.dug - sounds.place = leaf_sounds.place - local doc_longdesc, doc_img, desc - if surfaces[s][1] == "dirt" then - doc_longdesc = S("Seagrass grows inside water on top of dirt, sand or gravel.") - desc = S("Seagrass") - doc_create = true - doc_img = "mcl_ocean_seagrass.png^[verticalframe:12:0" - else - doc_create = false - end - minetest.register_node("mcl_ocean:seagrass_"..surfaces[s][1], { - _doc_items_entry_name = desc, - _doc_items_longdesc = doc_longdesc, - _doc_items_create_entry = doc_create, - _doc_items_image = doc_img, - drawtype = "plantlike_rooted", - paramtype = "light", - paramtype2 = "meshoptions", - place_param2 = 3, - tiles = def.tiles, - special_tiles = { - { - image = "mcl_ocean_seagrass.png", - animation = {type="vertical_frames", aspect_w=16, aspect_h=16, length=1.0}, - } - }, - inventory_image = "("..def.tiles[1]..")^(mcl_ocean_seagrass.png^[verticalframe:12:0)", - wield_image = "mcl_ocean_seagrass.png^[verticalframe:12:0", - selection_box = { - type = "fixed", - fixed = { - { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, - { -0.5, 0.5, -0.5, 0.5, 1.3, 0.5 }, - }, - }, - groups = { handy = 1, shearsy = 1, deco_block = 1, plant = 1, seagrass = 1, falling_node = surfaces[s][3], not_in_creative_inventory = 1 }, - sounds = sounds, - node_dig_prediction = surfaces[s][2], - after_dig_node = function(pos) - minetest.set_node(pos, {name=surfaces[s][2]}) - end, - drop = "", - _mcl_falling_node_alternative = alt, - _mcl_shears_drop = { "mcl_ocean:seagrass" }, - _mcl_hardness = 0, - _mcl_blast_resistance = 0, - }) - if mod_doc and surfaces[s][1] ~= "dirt" then - doc.add_entry_alias("nodes", "mcl_ocean:seagrass_dirt", "nodes", "mcl_ocean:seagrass_"..surfaces[s][1]) - end -end - -if mod_doc then - doc.add_entry_alias("nodes", "mcl_ocean:seagrass_dirt", "craftitems", "mcl_ocean:seagrass") -end diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_brain_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_brain_coral.png deleted file mode 100644 index 60a4c53da6..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_brain_coral.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_brain_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_brain_coral_block.png deleted file mode 100644 index a9a508be8c..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_brain_coral_block.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_brain_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_brain_coral_fan.png deleted file mode 100644 index 0ffe520e01..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_brain_coral_fan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_bubble_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_bubble_coral.png deleted file mode 100644 index 905ba2f7c9..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_bubble_coral.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_bubble_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_bubble_coral_block.png deleted file mode 100644 index 5519755131..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_bubble_coral_block.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_bubble_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_bubble_coral_fan.png deleted file mode 100644 index c9a49f45f0..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_bubble_coral_fan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_brain_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_brain_coral.png deleted file mode 100644 index 8d8068200e..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_brain_coral.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_brain_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_brain_coral_block.png deleted file mode 100644 index 2938880efc..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_brain_coral_block.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_brain_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_brain_coral_fan.png deleted file mode 100644 index b297894e8c..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_brain_coral_fan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_bubble_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_bubble_coral.png deleted file mode 100644 index 0d69e128c3..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_bubble_coral.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_bubble_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_bubble_coral_block.png deleted file mode 100644 index 86333fb470..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_bubble_coral_block.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_bubble_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_bubble_coral_fan.png deleted file mode 100644 index 0b11adc316..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_bubble_coral_fan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_fire_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_fire_coral.png deleted file mode 100644 index c050ecfead..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_fire_coral.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_fire_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_fire_coral_block.png deleted file mode 100644 index 836ab2a7f3..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_fire_coral_block.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_fire_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_fire_coral_fan.png deleted file mode 100644 index 63c0806b95..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_fire_coral_fan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_horn_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_horn_coral.png deleted file mode 100644 index c0ede515d0..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_horn_coral.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_horn_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_horn_coral_block.png deleted file mode 100644 index 8f37cd1e31..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_horn_coral_block.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_horn_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_horn_coral_fan.png deleted file mode 100644 index 161c0ec7bf..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_horn_coral_fan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_tube_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_tube_coral.png deleted file mode 100644 index d1bef3abd4..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_tube_coral.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_tube_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_tube_coral_block.png deleted file mode 100644 index eb0e0da615..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_tube_coral_block.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_tube_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_tube_coral_fan.png deleted file mode 100644 index 5d0500d18b..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dead_tube_coral_fan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp.png deleted file mode 100644 index 2d7879200d..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp_bottom.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp_bottom.png deleted file mode 100644 index 148ecfd353..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp_bottom.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp_side.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp_side.png deleted file mode 100644 index 71d1cb2ad6..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp_side.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp_top.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp_top.png deleted file mode 100644 index 148ecfd353..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_dried_kelp_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_fire_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_fire_coral.png deleted file mode 100644 index e7958d50ce..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_fire_coral.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_fire_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_fire_coral_block.png deleted file mode 100644 index e562b024e2..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_fire_coral_block.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_fire_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_fire_coral_fan.png deleted file mode 100644 index 412e97f8ed..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_fire_coral_fan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_horn_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_horn_coral.png deleted file mode 100644 index 8f32276182..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_horn_coral.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_horn_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_horn_coral_block.png deleted file mode 100644 index c56a1344ed..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_horn_coral_block.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_horn_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_horn_coral_fan.png deleted file mode 100644 index 63e7d12ea7..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_horn_coral_fan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_kelp_item.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_kelp_item.png deleted file mode 100644 index 396f8b3efb..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_kelp_item.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_kelp_plant.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_kelp_plant.png deleted file mode 100644 index 11eaf610a2..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_kelp_plant.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_anim.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_anim.png deleted file mode 100644 index a433caa41f..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_anim.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_bricks.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_bricks.png deleted file mode 100644 index f708a270aa..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_bricks.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_crystals.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_crystals.png deleted file mode 100644 index 048ecb6739..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_crystals.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_dark.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_dark.png deleted file mode 100644 index ac27934c55..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_dark.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_shard.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_shard.png deleted file mode 100644 index 200afd4dde..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_prismarine_shard.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_lantern.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_lantern.png deleted file mode 100644 index 7f627aff19..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_lantern.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_1_anim.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_1_anim.png deleted file mode 100644 index 5c4f0064c6..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_1_anim.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_1_off.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_1_off.png deleted file mode 100644 index 24b648777c..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_1_off.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_2_anim.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_2_anim.png deleted file mode 100644 index ce063765f8..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_2_anim.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_2_off.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_2_off.png deleted file mode 100644 index c0b34e8e92..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_2_off.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_3_anim.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_3_anim.png deleted file mode 100644 index d484085e25..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_3_anim.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_3_off.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_3_off.png deleted file mode 100644 index 56ac78f3a0..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_3_off.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_4_anim.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_4_anim.png deleted file mode 100644 index 6d3e566752..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_4_anim.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_4_off.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_4_off.png deleted file mode 100644 index d2df931094..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_4_off.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_item.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_item.png deleted file mode 100644 index 88a4669add..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_sea_pickle_item.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_seagrass.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_seagrass.png deleted file mode 100644 index 216d25312f..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_seagrass.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_tube_coral.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_tube_coral.png deleted file mode 100644 index 63cf864c72..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_tube_coral.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_tube_coral_block.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_tube_coral_block.png deleted file mode 100644 index 016888db32..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_tube_coral_block.png and /dev/null differ diff --git a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_tube_coral_fan.png b/mods/ITEMS/mcl_ocean/textures/mcl_ocean_tube_coral_fan.png deleted file mode 100644 index 7d055a7bd6..0000000000 Binary files a/mods/ITEMS/mcl_ocean/textures/mcl_ocean_tube_coral_fan.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/README.txt b/mods/ITEMS/mcl_potions/README.txt deleted file mode 100644 index 7ebe4ba6cc..0000000000 --- a/mods/ITEMS/mcl_potions/README.txt +++ /dev/null @@ -1,5 +0,0 @@ -License information: - -* Code: MIT License -* Textures: See main MineClone 2 README.md file -* Sounds: CC0 diff --git a/mods/ITEMS/mcl_potions/commands.lua b/mods/ITEMS/mcl_potions/commands.lua deleted file mode 100644 index 1fbf591d9d..0000000000 --- a/mods/ITEMS/mcl_potions/commands.lua +++ /dev/null @@ -1,56 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - --- ░█████╗░██╗░░██╗░█████╗░████████╗  ░█████╗░░█████╗░███╗░░░███╗███╗░░░███╗░█████╗░███╗░░██╗██████╗░░██████╗ --- ██╔══██╗██║░░██║██╔══██╗╚══██╔══╝  ██╔══██╗██╔══██╗████╗░████║████╗░████║██╔══██╗████╗░██║██╔══██╗██╔════╝ --- ██║░░╚═╝███████║███████║░░░██║░░░  ██║░░╚═╝██║░░██║██╔████╔██║██╔████╔██║███████║██╔██╗██║██║░░██║╚█████╗░ --- ██║░░██╗██╔══██║██╔══██║░░░██║░░░  ██║░░██╗██║░░██║██║╚██╔╝██║██║╚██╔╝██║██╔══██║██║╚████║██║░░██║░╚═══██╗ --- ╚█████╔╝██║░░██║██║░░██║░░░██║░░░  ╚█████╔╝╚█████╔╝██║░╚═╝░██║██║░╚═╝░██║██║░░██║██║░╚███║██████╔╝██████╔╝ --- ░╚════╝░╚═╝░░╚═╝╚═╝░░╚═╝░░░╚═╝░░░  ░╚════╝░░╚════╝░╚═╝░░░░░╚═╝╚═╝░░░░░╚═╝╚═╝░░╚═╝╚═╝░░╚══╝╚═════╝░╚═════╝░ - - -local get_chat_function = {} - -get_chat_function["poison"] = mcl_potions.poison_func -get_chat_function["regeneration"] = mcl_potions.regeneration_func -get_chat_function["invisibility"] = mcl_potions.invisiblility_func -get_chat_function["fire_resistance"] = mcl_potions.fire_resistance_func -get_chat_function["night_vision"] = mcl_potions.night_vision_func -get_chat_function["water_breathing"] = mcl_potions.water_breathing_func -get_chat_function["leaping"] = mcl_potions.leaping_func -get_chat_function["swiftness"] = mcl_potions.swiftness_func -get_chat_function["heal"] = mcl_potions.healing_func - -minetest.register_chatcommand("effect",{ - params = S(" []"), - description = S("Add a status effect to yourself. Arguments: : name of status effect, e.g. poison. : duration in seconds. : effect strength multiplier (1 = 100%)"), - privs = {server = true}, - func = function(name, params) - - local P = {} - local i = 0 - for str in string.gmatch(params, "([^ ]+)") do - i = i + 1 - P[i] = str - end - - if not P[1] then - return false, S("Missing effect parameter!") - elseif not tonumber(P[2]) then - return false, S("Missing or invalid duration parameter!") - elseif P[3] and not tonumber(P[3]) then - return false, S("Invalid factor parameter!") - end - -- Default factor = 1 - if not P[3] then - P[3] = 1.0 - end - - if get_chat_function[P[1]] then - get_chat_function[P[1]](minetest.get_player_by_name(name), tonumber(P[3]), tonumber(P[2])) - return true - else - return false, S("@1 is not an available status effect.", P[1]) - end - - end, -}) diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua deleted file mode 100644 index 2c47d50d1b..0000000000 --- a/mods/ITEMS/mcl_potions/functions.lua +++ /dev/null @@ -1,986 +0,0 @@ -local EF = {} -EF.invisible = {} -EF.poisoned = {} -EF.regenerating = {} -EF.strong = {} -EF.weak = {} -EF.water_breathing = {} -EF.leaping = {} -EF.swift = {} -- for swiftness AND slowness -EF.night_vision = {} -EF.fire_proof = {} - -local EFFECT_TYPES = 0 -for _,_ in pairs(EF) do - EFFECT_TYPES = EFFECT_TYPES + 1 -end - -local icon_ids = {} - -local function potions_set_hudbar(player) - - if EF.poisoned[player] and EF.regenerating[player] then - hb.change_hudbar(player, "health", nil, nil, "hbhunger_icon_regen_poison.png", nil, "hudbars_bar_health.png") - elseif EF.poisoned[player] then - hb.change_hudbar(player, "health", nil, nil, "hbhunger_icon_health_poison.png", nil, "hudbars_bar_health.png") - elseif EF.regenerating[player] then - hb.change_hudbar(player, "health", nil, nil, "hudbars_icon_regenerate.png", nil, "hudbars_bar_health.png") - else - hb.change_hudbar(player, "health", nil, nil, "hudbars_icon_health.png", nil, "hudbars_bar_health.png") - end - -end - -local function potions_init_icons(player) - local name = player:get_player_name() - icon_ids[name] = {} - for e=1, EFFECT_TYPES do - local x = -52 * e - 2 - local id = player:hud_add({ - hud_elem_type = "image", - text = "blank.png", - position = { x = 1, y = 0 }, - offset = { x = x, y = 3 }, - scale = { x = 3, y = 3 }, - alignment = { x = 1, y = 1 }, - z_index = 100, - }) - table.insert(icon_ids[name], id) - end -end - -local function potions_set_icons(player) - local name = player:get_player_name() - if not icon_ids[name] then - return - end - local active_effects = {} - for effect_name, effect in pairs(EF) do - if effect[player] then - table.insert(active_effects, effect_name) - end - end - - for i=1, EFFECT_TYPES do - local icon = icon_ids[name][i] - local effect_name = active_effects[i] - if effect_name == "swift" and EF.swift[player].is_slow then - effect_name = "slow" - end - if effect_name == nil then - player:hud_change(icon, "text", "blank.png") - else - player:hud_change(icon, "text", "mcl_potions_effect_"..effect_name..".png") - end - end - -end - -local function potions_set_hud(player) - - potions_set_hudbar(player) - potions_set_icons(player) - -end - - --- ███╗░░░███╗░█████╗░██╗███╗░░██╗  ███████╗███████╗███████╗███████╗░█████╗░████████╗ --- ████╗░████║██╔══██╗██║████╗░██║  ██╔════╝██╔════╝██╔════╝██╔════╝██╔══██╗╚══██╔══╝ --- ██╔████╔██║███████║██║██╔██╗██║  █████╗░░█████╗░░█████╗░░█████╗░░██║░░╚═╝░░░██║░░░ --- ██║╚██╔╝██║██╔══██║██║██║╚████║  ██╔══╝░░██╔══╝░░██╔══╝░░██╔══╝░░██║░░██╗░░░██║░░░ --- ██║░╚═╝░██║██║░░██║██║██║░╚███║  ███████╗██║░░░░░██║░░░░░███████╗╚█████╔╝░░░██║░░░ --- ╚═╝░░░░░╚═╝╚═╝░░╚═╝╚═╝╚═╝░░╚══╝  ╚══════╝╚═╝░░░░░╚═╝░░░░░╚══════╝░╚════╝░░░░╚═╝░░░ --- --- ░█████╗░██╗░░██╗███████╗░█████╗░██╗░░██╗███████╗██████╗░ --- ██╔══██╗██║░░██║██╔════╝██╔══██╗██║░██╔╝██╔════╝██╔══██╗ --- ██║░░╚═╝███████║█████╗░░██║░░╚═╝█████═╝░█████╗░░██████╔╝ --- ██║░░██╗██╔══██║██╔══╝░░██║░░██╗██╔═██╗░██╔══╝░░██╔══██╗ --- ╚█████╔╝██║░░██║███████╗╚█████╔╝██║░╚██╗███████╗██║░░██║ --- ░╚════╝░╚═╝░░╚═╝╚══════╝░╚════╝░╚═╝░░╚═╝╚══════╝╚═╝░░╚═╝ - -local is_player, entity, meta - -minetest.register_globalstep(function(dtime) - - -- Check for invisible players - for player, vals in pairs(EF.invisible) do - - EF.invisible[player].timer = EF.invisible[player].timer + dtime - - if player:get_pos() then mcl_potions._add_spawner(player, "#7F8392") end - - if EF.invisible[player].timer >= EF.invisible[player].dur then - mcl_potions.make_invisible(player, false) - EF.invisible[player] = nil - if player:is_player() then - meta = player:get_meta() - meta:set_string("_is_invisible", minetest.serialize(EF.invisible[player])) - end - potions_set_hud(player) - - end - - end - - -- Check for poisoned players - for player, vals in pairs(EF.poisoned) do - - is_player = player:is_player() - entity = player:get_luaentity() - - EF.poisoned[player].timer = EF.poisoned[player].timer + dtime - EF.poisoned[player].hit_timer = (EF.poisoned[player].hit_timer or 0) + dtime - - if player:get_pos() then mcl_potions._add_spawner(player, "#4E9331") end - - if EF.poisoned[player].hit_timer >= EF.poisoned[player].step then - if mcl_util.get_hp(player) - 1 > 0 then - mcl_util.deal_damage(player, 1, {type = "magic"}) - end - EF.poisoned[player].hit_timer = 0 - end - - if EF.poisoned[player] and EF.poisoned[player].timer >= EF.poisoned[player].dur then - EF.poisoned[player] = nil - if is_player then - meta = player:get_meta() - meta:set_string("_is_poisoned", minetest.serialize(EF.poisoned[player])) - potions_set_hud(player) - end - end - - end - - -- Check for regnerating players - for player, vals in pairs(EF.regenerating) do - - is_player = player:is_player() - entity = player:get_luaentity() - - EF.regenerating[player].timer = EF.regenerating[player].timer + dtime - EF.regenerating[player].heal_timer = (EF.regenerating[player].heal_timer or 0) + dtime - - if player:get_pos() then mcl_potions._add_spawner(player, "#CD5CAB") end - - if EF.regenerating[player].heal_timer >= EF.regenerating[player].step then - - if is_player then - player:set_hp(math.min(player:get_properties().hp_max or 20, player:get_hp() + 1), { type = "set_hp", other = "regeneration" }) - EF.regenerating[player].heal_timer = 0 - elseif entity and entity.is_mob then - entity.health = math.min(entity.hp_max, entity.health + 1) - EF.regenerating[player].heal_timer = 0 - else -- stop regenerating if not a player or mob - EF.regenerating[player] = nil - end - - end - - if EF.regenerating[player] and EF.regenerating[player].timer >= EF.regenerating[player].dur then - EF.regenerating[player] = nil - if is_player then - meta = player:get_meta() - meta:set_string("_is_regenerating", minetest.serialize(EF.regenerating[player])) - potions_set_hud(player) - end - end - - end - - -- Check for water breathing players - for player, vals in pairs(EF.water_breathing) do - - if player:is_player() then - - EF.water_breathing[player].timer = EF.water_breathing[player].timer + dtime - - if player:get_pos() then mcl_potions._add_spawner(player, "#2E5299") end - - if player:get_breath() then - hb.hide_hudbar(player, "breath") - if player:get_breath() < 10 then player:set_breath(10) end - end - - if EF.water_breathing[player].timer >= EF.water_breathing[player].dur then - meta = player:get_meta() - meta:set_string("_is_water_breathing", minetest.serialize(EF.water_breathing[player])) - EF.water_breathing[player] = nil - end - potions_set_hud(player) - - else - EF.water_breathing[player] = nil - end - - end - - -- Check for leaping players - for player, vals in pairs(EF.leaping) do - - if player:is_player() then - - EF.leaping[player].timer = EF.leaping[player].timer + dtime - - if player:get_pos() then mcl_potions._add_spawner(player, "#22FF4C") end - - if EF.leaping[player].timer >= EF.leaping[player].dur then - playerphysics.remove_physics_factor(player, "jump", "mcl_potions:leaping") - EF.leaping[player] = nil - meta = player:get_meta() - meta:set_string("_is_leaping", minetest.serialize(EF.leaping[player])) - end - potions_set_hud(player) - - else - EF.leaping[player] = nil - end - - end - - -- Check for swift players - for player, vals in pairs(EF.swift) do - - if player:is_player() then - - EF.swift[player].timer = EF.swift[player].timer + dtime - - if player:get_pos() then mcl_potions._add_spawner(player, "#7CAFC6") end - - if EF.swift[player].timer >= EF.swift[player].dur then - playerphysics.remove_physics_factor(player, "speed", "mcl_potions:swiftness") - EF.swift[player] = nil - meta = player:get_meta() - meta:set_string("_is_swift", minetest.serialize(EF.swift[player])) - end - potions_set_hud(player) - - else - EF.swift[player] = nil - end - - end - - -- Check for Night Vision equipped players - for player, vals in pairs(EF.night_vision) do - - if player:is_player() then - - EF.night_vision[player].timer = EF.night_vision[player].timer + dtime - - if player:get_pos() then mcl_potions._add_spawner(player, "#1F1FA1") end - - if EF.night_vision[player].timer >= EF.night_vision[player].dur then - EF.night_vision[player] = nil - meta = player:get_meta() - meta:set_string("_is_cat", minetest.serialize(EF.night_vision[player])) - meta:set_int("night_vision", 0) - end - mcl_weather.skycolor.update_sky_color({player}) - potions_set_hud(player) - - else - EF.night_vision[player] = nil - end - - end - - -- Check for Fire Proof players - for player, vals in pairs(EF.fire_proof) do - - if player:is_player() then - - player = player or player:get_luaentity() - - EF.fire_proof[player].timer = EF.fire_proof[player].timer + dtime - - if player:get_pos() then mcl_potions._add_spawner(player, "#E49A3A") end - - if EF.fire_proof[player].timer >= EF.fire_proof[player].dur then - EF.fire_proof[player] = nil - meta = player:get_meta() - meta:set_string("_is_fire_proof", minetest.serialize(EF.fire_proof[player])) - end - potions_set_hud(player) - - else - EF.fire_proof[player] = nil - end - - end - - -- Check for Weak players - for player, vals in pairs(EF.weak) do - - if player:is_player() then - - EF.weak[player].timer = EF.weak[player].timer + dtime - - if player:get_pos() then mcl_potions._add_spawner(player, "#484D48") end - - if EF.weak[player].timer >= EF.weak[player].dur then - EF.weak[player] = nil - meta = player:get_meta() - meta:set_string("_is_weak", minetest.serialize(EF.weak[player])) - end - - else - EF.weak[player] = nil - end - - end - - -- Check for Strong players - for player, vals in pairs(EF.strong) do - - if player:is_player() then - - EF.strong[player].timer = EF.strong[player].timer + dtime - - if player:get_pos() then mcl_potions._add_spawner(player, "#932423") end - - if EF.strong[player].timer >= EF.strong[player].dur then - EF.strong[player] = nil - meta = player:get_meta() - meta:set_string("_is_strong", minetest.serialize(EF.strong[player])) - end - - else - EF.strong[player] = nil - end - - end - -end) - --- Prevent damage to player with Fire Resistance enabled -mcl_damage.register_modifier(function(obj, damage, reason) - if EF.fire_proof[obj] and not reason.flags.bypasses_magic and reason.flags.is_fire then - return 0 - end -end, -50) - - - --- ███████╗███████╗███████╗███████╗░█████╗░████████╗ --- ██╔════╝██╔════╝██╔════╝██╔════╝██╔══██╗╚══██╔══╝ --- █████╗░░█████╗░░█████╗░░█████╗░░██║░░╚═╝░░░██║░░░ --- ██╔══╝░░██╔══╝░░██╔══╝░░██╔══╝░░██║░░██╗░░░██║░░░ --- ███████╗██║░░░░░██║░░░░░███████╗╚█████╔╝░░░██║░░░ --- ╚══════╝╚═╝░░░░░╚═╝░░░░░╚══════╝░╚════╝░░░░╚═╝░░░ --- --- ██╗░░░░░░█████╗░░█████╗░██████╗░░░░░██╗░██████╗░█████╗░██╗░░░██╗███████╗ --- ██║░░░░░██╔══██╗██╔══██╗██╔══██╗░░░██╔╝██╔════╝██╔══██╗██║░░░██║██╔════╝ --- ██║░░░░░██║░░██║███████║██║░░██║░░██╔╝░╚█████╗░███████║╚██╗░██╔╝█████╗░░ --- ██║░░░░░██║░░██║██╔══██║██║░░██║░██╔╝░░░╚═══██╗██╔══██║░╚████╔╝░██╔══╝░░ --- ███████╗╚█████╔╝██║░░██║██████╔╝██╔╝░░░██████╔╝██║░░██║░░╚██╔╝░░███████╗ --- ╚══════╝░╚════╝░╚═╝░░╚═╝╚═════╝░╚═╝░░░░╚═════╝░╚═╝░░╚═╝░░░╚═╝░░░╚══════╝ - - -function mcl_potions._reset_player_effects(player, set_hud) - - if not player:is_player() then - return - end - meta = player:get_meta() - - mcl_potions.make_invisible(player, false) - EF.invisible[player] = nil - EF.poisoned[player] = nil - EF.regenerating[player] = nil - EF.strong[player] = nil - EF.weak[player] = nil - EF.water_breathing[player] = nil - - EF.leaping[player] = nil - playerphysics.remove_physics_factor(player, "jump", "mcl_potions:leaping") - - EF.swift[player] = nil - playerphysics.remove_physics_factor(player, "speed", "mcl_potions:swiftness") - - EF.night_vision[player] = nil - meta:set_int("night_vision", 0) - mcl_weather.skycolor.update_sky_color({player}) - - EF.fire_proof[player] = nil - - if set_hud ~= false then - potions_set_hud(player) - end - -end - -function mcl_potions._save_player_effects(player) - - if not player:is_player() then - return - end - meta = player:get_meta() - - meta:set_string("_is_invisible", minetest.serialize(EF.invisible[player])) - meta:set_string("_is_poisoned", minetest.serialize(EF.poisoned[player])) - meta:set_string("_is_regenerating", minetest.serialize(EF.regenerating[player])) - meta:set_string("_is_strong", minetest.serialize(EF.strong[player])) - meta:set_string("_is_weak", minetest.serialize(EF.weak[player])) - meta:set_string("_is_water_breathing", minetest.serialize(EF.water_breathing[player])) - meta:set_string("_is_leaping", minetest.serialize(EF.leaping[player])) - meta:set_string("_is_swift", minetest.serialize(EF.swift[player])) - meta:set_string("_is_cat", minetest.serialize(EF.night_vision[player])) - meta:set_string("_is_fire_proof", minetest.serialize(EF.fire_proof[player])) - -end - -function mcl_potions._load_player_effects(player) - - if not player:is_player() then - return - end - meta = player:get_meta() - - if minetest.deserialize(meta:get_string("_is_invisible")) then - EF.invisible[player] = minetest.deserialize(meta:get_string("_is_invisible")) - mcl_potions.make_invisible(player, true) - end - - if minetest.deserialize(meta:get_string("_is_poisoned")) then - EF.poisoned[player] = minetest.deserialize(meta:get_string("_is_poisoned")) - end - - if minetest.deserialize(meta:get_string("_is_regenerating")) then - EF.regenerating[player] = minetest.deserialize(meta:get_string("_is_regenerating")) - end - - if minetest.deserialize(meta:get_string("_is_strong")) then - EF.strong[player] = minetest.deserialize(meta:get_string("_is_strong")) - end - - if minetest.deserialize(meta:get_string("_is_weak")) then - EF.weak[player] = minetest.deserialize(meta:get_string("_is_weak")) - end - - if minetest.deserialize(meta:get_string("_is_water_breathing")) then - EF.water_breathing[player] = minetest.deserialize(meta:get_string("_is_water_breathing")) - end - - if minetest.deserialize(meta:get_string("_is_leaping")) then - EF.leaping[player] = minetest.deserialize(meta:get_string("_is_leaping")) - end - - if minetest.deserialize(meta:get_string("_is_swift")) then - EF.swift[player] = minetest.deserialize(meta:get_string("_is_swift")) - end - - if minetest.deserialize(meta:get_string("_is_cat")) then - EF.night_vision[player] = minetest.deserialize(meta:get_string("_is_cat")) - end - - if minetest.deserialize(meta:get_string("_is_fire_proof")) then - EF.fire_proof[player] = minetest.deserialize(meta:get_string("_is_fire_proof")) - end - -end - --- Returns true if player has given effect -function mcl_potions.player_has_effect(player, effect_name) - if not EF[effect_name] then - return false - end - return EF[effect_name][player] ~= nil -end - -minetest.register_on_leaveplayer( function(player) - mcl_potions._save_player_effects(player) - mcl_potions._reset_player_effects(player) -- clearout the buffer to prevent looking for a player not there - icon_ids[player:get_player_name()] = nil -end) - -minetest.register_on_dieplayer( function(player) - mcl_potions._reset_player_effects(player) - potions_set_hud(player) -end) - -minetest.register_on_joinplayer( function(player) - mcl_potions._reset_player_effects(player, false) -- make sure there are no wierd holdover effects - mcl_potions._load_player_effects(player) - potions_init_icons(player) - -- .after required because player:hud_change doesn't work when called - -- in same tick as player:hud_add - -- (see ) - -- FIXME: Remove minetest.after - minetest.after(3, function(player) - if player and player:is_player() then - potions_set_hud(player) - end - end, player) -end) - -minetest.register_on_shutdown(function() - -- save player effects on server shutdown - for _,player in pairs(minetest.get_connected_players()) do - mcl_potions._save_player_effects(player) - end - -end) - - --- ░██████╗██╗░░░██╗██████╗░██████╗░░█████╗░██████╗░████████╗██╗███╗░░██╗░██████╗░ --- ██╔════╝██║░░░██║██╔══██╗██╔══██╗██╔══██╗██╔══██╗╚══██╔══╝██║████╗░██║██╔════╝░ --- ╚█████╗░██║░░░██║██████╔╝██████╔╝██║░░██║██████╔╝░░░██║░░░██║██╔██╗██║██║░░██╗░ --- ░╚═══██╗██║░░░██║██╔═══╝░██╔═══╝░██║░░██║██╔══██╗░░░██║░░░██║██║╚████║██║░░╚██╗ --- ██████╔╝╚██████╔╝██║░░░░░██║░░░░░╚█████╔╝██║░░██║░░░██║░░░██║██║░╚███║╚██████╔╝ --- ╚═════╝░░╚═════╝░╚═╝░░░░░╚═╝░░░░░░╚════╝░╚═╝░░╚═╝░░░╚═╝░░░╚═╝╚═╝░░╚══╝░╚═════╝░ --- --- ███████╗██╗░░░██╗███╗░░██╗░█████╗░████████╗██╗░█████╗░███╗░░██╗░██████╗ --- ██╔════╝██║░░░██║████╗░██║██╔══██╗╚══██╔══╝██║██╔══██╗████╗░██║██╔════╝ --- █████╗░░██║░░░██║██╔██╗██║██║░░╚═╝░░░██║░░░██║██║░░██║██╔██╗██║╚█████╗░ --- ██╔══╝░░██║░░░██║██║╚████║██║░░██╗░░░██║░░░██║██║░░██║██║╚████║░╚═══██╗ --- ██║░░░░░╚██████╔╝██║░╚███║╚█████╔╝░░░██║░░░██║╚█████╔╝██║░╚███║██████╔╝ --- ╚═╝░░░░░░╚═════╝░╚═╝░░╚══╝░╚════╝░░░░╚═╝░░░╚═╝░╚════╝░╚═╝░░╚══╝╚═════╝░ - -function mcl_potions.is_obj_hit(self, pos) - - local entity - for _,object in pairs(minetest.get_objects_inside_radius(pos, 1.1)) do - - entity = object:get_luaentity() - - if entity and entity.name ~= self.object:get_luaentity().name then - - if entity.is_mob then - return true - end - - elseif object:is_player() and self._thrower ~= object:get_player_name() then - return true - end - - end - return false -end - - -function mcl_potions.make_invisible(player, toggle) - - if not player then - return false - end - - local is_player = player:is_player() - local entity = player:get_luaentity() - --local playername = player:get_player_name() - local skin_file - - if toggle then -- hide player - - skin_file = "mobs_mc_empty.png" - - if entity then - EF.invisible[player].old_size = entity.visual_size - elseif not is_player then -- if not a player or entity, do nothing - return - end - - if is_player then - mcl_player.player_set_skin(player, skin_file) - elseif not is_player then - player:set_properties({visual_size = {x = 0, y = 0}}) - end - player:set_nametag_attributes({color = {a = 0}}) - - elseif EF.invisible[player] then -- show player - - if is_player then - mcl_skins.update_player_skin(player) - elseif not is_player then - player:set_properties({visual_size = EF.invisible[player].old_size}) - end - player:set_nametag_attributes({color = {r = 255, g = 255, b = 255, a = 255}}) - - end - -end - - -function mcl_potions._use_potion(item, obj, color) - local d = 0.1 - local pos = obj:get_pos() - minetest.sound_play("mcl_potions_drinking", {pos = pos, max_hear_distance = 6, gain = 1}) - minetest.add_particlespawner({ - amount = 25, - time = 1, - minpos = {x=pos.x-d, y=pos.y+1, z=pos.z-d}, - maxpos = {x=pos.x+d, y=pos.y+2, z=pos.z+d}, - minvel = {x=-0.1, y=0, z=-0.1}, - maxvel = {x=0.1, y=0.1, z=0.1}, - minacc = {x=-0.1, y=0, z=-0.1}, - maxacc = {x=0.1, y=.1, z=0.1}, - minexptime = 1, - maxexptime = 5, - minsize = 0.5, - maxsize = 1, - collisiondetection = true, - vertical = false, - texture = "mcl_particles_effect.png^[colorize:"..color..":127", - }) -end - - -function mcl_potions._add_spawner(obj, color) - local d = 0.2 - local pos = obj:get_pos() - minetest.add_particlespawner({ - amount = 1, - time = 1, - minpos = {x=pos.x-d, y=pos.y+1, z=pos.z-d}, - maxpos = {x=pos.x+d, y=pos.y+2, z=pos.z+d}, - minvel = {x=-0.1, y=0, z=-0.1}, - maxvel = {x=0.1, y=0.1, z=0.1}, - minacc = {x=-0.1, y=0, z=-0.1}, - maxacc = {x=0.1, y=.1, z=0.1}, - minexptime = 0.5, - maxexptime = 1, - minsize = 0.5, - maxsize = 1, - collisiondetection = false, - vertical = false, - texture = "mcl_particles_effect.png^[colorize:"..color..":127", - }) -end - - - --- ██████╗░░█████╗░░██████╗███████╗  ██████╗░░█████╗░████████╗██╗░█████╗░███╗░░██╗ --- ██╔══██╗██╔══██╗██╔════╝██╔════╝  ██╔══██╗██╔══██╗╚══██╔══╝██║██╔══██╗████╗░██║ --- ██████╦╝███████║╚█████╗░█████╗░░  ██████╔╝██║░░██║░░░██║░░░██║██║░░██║██╔██╗██║ --- ██╔══██╗██╔══██║░╚═══██╗██╔══╝░░  ██╔═══╝░██║░░██║░░░██║░░░██║██║░░██║██║╚████║ --- ██████╦╝██║░░██║██████╔╝███████╗  ██║░░░░░╚█████╔╝░░░██║░░░██║╚█████╔╝██║░╚███║ --- ╚═════╝░╚═╝░░╚═╝╚═════╝░╚══════╝  ╚═╝░░░░░░╚════╝░░░░╚═╝░░░╚═╝░╚════╝░╚═╝░░╚══╝ --- --- ███████╗███████╗███████╗███████╗░█████╗░████████╗ --- ██╔════╝██╔════╝██╔════╝██╔════╝██╔══██╗╚══██╔══╝ --- █████╗░░█████╗░░█████╗░░█████╗░░██║░░╚═╝░░░██║░░░ --- ██╔══╝░░██╔══╝░░██╔══╝░░██╔══╝░░██║░░██╗░░░██║░░░ --- ███████╗██║░░░░░██║░░░░░███████╗╚█████╔╝░░░██║░░░ --- ╚══════╝╚═╝░░░░░╚═╝░░░░░╚══════╝░╚════╝░░░░╚═╝░░░ --- --- ███████╗██╗░░░██╗███╗░░██╗░█████╗░████████╗██╗░█████╗░███╗░░██╗░██████╗ --- ██╔════╝██║░░░██║████╗░██║██╔══██╗╚══██╔══╝██║██╔══██╗████╗░██║██╔════╝ --- █████╗░░██║░░░██║██╔██╗██║██║░░╚═╝░░░██║░░░██║██║░░██║██╔██╗██║╚█████╗░ --- ██╔══╝░░██║░░░██║██║╚████║██║░░██╗░░░██║░░░██║██║░░██║██║╚████║░╚═══██╗ --- ██║░░░░░╚██████╔╝██║░╚███║╚█████╔╝░░░██║░░░██║╚█████╔╝██║░╚███║██████╔╝ --- ╚═╝░░░░░░╚═════╝░╚═╝░░╚══╝░╚════╝░░░░╚═╝░░░╚═╝░╚════╝░╚═╝░░╚══╝╚═════╝░ - - -function mcl_potions.healing_func(player, hp) - - local obj = player:get_luaentity() - - if player:get_hp() == 0 then - return - end - - if obj and obj.harmed_by_heal then hp = -hp end - - if hp > 0 then - -- at least 1 HP - if hp < 1 then - hp = 1 - end - - if obj and obj.is_mob then - obj.health = math.max(obj.health + hp, obj.hp_max) - elseif player:is_player() then - player:set_hp(math.min(player:get_hp() + hp, player:get_properties().hp_max), { type = "set_hp", other = "healing" }) - end - - elseif hp < 0 then - if hp > -1 then - hp = -1 - end - - mcl_util.deal_damage(player, -hp, {type = "magic"}) - end - -end - -function mcl_potions.swiftness_func(player, factor, duration) - - if not player:get_meta() then - return false - end - - if not EF.swift[player] then - - EF.swift[player] = {dur = duration, timer = 0, is_slow = factor < 1} - playerphysics.add_physics_factor(player, "speed", "mcl_potions:swiftness", factor) - - else - - local victim = EF.swift[player] - - playerphysics.add_physics_factor(player, "speed", "mcl_potions:swiftness", factor) - victim.dur = math.max(duration, victim.dur - victim.timer) - victim.timer = 0 - victim.is_slow = factor < 1 - - end - - if player:is_player() then - potions_set_icons(player) - end - -end - -function mcl_potions.leaping_func(player, factor, duration) - - if not player:get_meta() then - return false - end - - if not EF.leaping[player] then - - EF.leaping[player] = {dur = duration, timer = 0} - playerphysics.add_physics_factor(player, "jump", "mcl_potions:leaping", factor) - - else - - local victim = EF.leaping[player] - - playerphysics.add_physics_factor(player, "jump", "mcl_potions:leaping", factor) - victim.dur = math.max(duration, victim.dur - victim.timer) - victim.timer = 0 - - end - - if player:is_player() then - potions_set_icons(player) - end - -end - - -function mcl_potions.weakness_func(player, factor, duration) - - if not EF.weak[player] then - - EF.weak[player] = {dur = duration, timer = 0, factor = factor} - - else - - local victim = EF.weak[player] - - victim.factor = factor - victim.dur = math.max(duration, victim.dur - victim.timer) - victim.timer = 0 - - end - - if player:is_player() then - potions_set_icons(player) - end - -end - - -function mcl_potions.strength_func(player, factor, duration) - - if not EF.strong[player] then - - EF.strong[player] = {dur = duration, timer = 0, factor = factor} - - else - - local victim = EF.strong[player] - - victim.factor = factor - victim.dur = math.max(duration, victim.dur - victim.timer) - victim.timer = 0 - - end - - if player:is_player() then - potions_set_icons(player) - end - -end - - -function mcl_potions.poison_func(player, factor, duration) - - if not EF.poisoned[player] then - - EF.poisoned[player] = {step = factor, dur = duration, timer = 0} - - else - - local victim = EF.poisoned[player] - - victim.step = math.min(victim.step, factor) - victim.dur = math.max(duration, victim.dur - victim.timer) - victim.timer = 0 - - end - - if player:is_player() then - potions_set_hud(player) - end - -end - - -function mcl_potions.regeneration_func(player, factor, duration) - - if not EF.regenerating[player] then - - EF.regenerating[player] = {step = factor, dur = duration, timer = 0} - - else - - local victim = EF.regenerating[player] - - victim.step = math.min(victim.step, factor) - victim.dur = math.max(duration, victim.dur - victim.timer) - victim.timer = 0 - - end - - if player:is_player() then - potions_set_hud(player) - end - -end - - -function mcl_potions.invisiblility_func(player, null, duration) - - if not EF.invisible[player] then - - EF.invisible[player] = {dur = duration, timer = 0} - mcl_potions.make_invisible(player, true) - - else - - local victim = EF.invisible[player] - - victim.dur = math.max(duration, victim.dur - victim.timer) - victim.timer = 0 - - end - - if player:is_player() then - potions_set_icons(player) - end - -end - -function mcl_potions.water_breathing_func(player, null, duration) - - if not EF.water_breathing[player] then - - EF.water_breathing[player] = {dur = duration, timer = 0} - - else - - local victim = EF.water_breathing[player] - - victim.dur = math.max(duration, victim.dur - victim.timer) - victim.timer = 0 - - end - - if player:is_player() then - potions_set_icons(player) - end - -end - - -function mcl_potions.fire_resistance_func(player, null, duration) - - if not EF.fire_proof[player] then - - EF.fire_proof[player] = {dur = duration, timer = 0} - - else - - local victim = EF.fire_proof[player] - victim.dur = math.max(duration, victim.dur - victim.timer) - victim.timer = 0 - - end - - if player:is_player() then - potions_set_icons(player) - end - -end - - -function mcl_potions.night_vision_func(player, null, duration) - - meta = player:get_meta() - if not EF.night_vision[player] then - - EF.night_vision[player] = {dur = duration, timer = 0} - - else - - local victim = EF.night_vision[player] - - victim.dur = math.max(duration, victim.dur - victim.timer) - victim.timer = 0 - - end - - is_player = player:is_player() - if is_player then - meta:set_int("night_vision", 1) - else - return -- Do not attempt to set night_vision on mobs - end - mcl_weather.skycolor.update_sky_color({player}) - - if player:is_player() then - potions_set_icons(player) - end - -end - -function mcl_potions._extinguish_nearby_fire(pos, radius) - local epos = {x=pos.x, y=pos.y+0.5, z=pos.z} - local dnode = minetest.get_node({x=pos.x,y=pos.y-0.5,z=pos.z}) - if minetest.get_item_group(dnode.name, "fire") ~= 0 then - epos.y = pos.y - 0.5 - end - local exting = false - -- No radius: Splash, extinguish epos and 4 nodes around - if not radius then - local dirs = { - {x=0,y=0,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}, - } - for d=1, #dirs do - local tpos = vector.add(epos, dirs[d]) - local node = minetest.get_node(tpos) - if minetest.get_item_group(node.name, "fire") ~= 0 then - minetest.sound_play("fire_extinguish_flame", {pos = tpos, gain = 0.25, max_hear_distance = 16}, true) - minetest.remove_node(tpos) - exting = true - end - end - -- Has radius: lingering, extinguish all nodes in area - else - local nodes = minetest.find_nodes_in_area( - {x=epos.x-radius,y=epos.y,z=epos.z-radius}, - {x=epos.x+radius,y=epos.y,z=epos.z+radius}, - {"group:fire"}) - for n=1, #nodes do - minetest.sound_play("fire_extinguish_flame", {pos = nodes[n], gain = 0.25, max_hear_distance = 16}, true) - minetest.remove_node(nodes[n]) - exting = true - end - end - return exting -end diff --git a/mods/ITEMS/mcl_potions/init.lua b/mods/ITEMS/mcl_potions/init.lua deleted file mode 100644 index 5b9f1fab35..0000000000 --- a/mods/ITEMS/mcl_potions/init.lua +++ /dev/null @@ -1,461 +0,0 @@ -local modname = minetest.get_current_modname() -local modpath = minetest.get_modpath(modname) -local S = minetest.get_translator(modname) - -mcl_potions = {} - --- duration effects of redstone are a factor of 8/3 --- duration effects of glowstone are a time factor of 1/2 --- splash potion duration effects are reduced by a factor of 3/4 - -mcl_potions.II_FACTOR = 2 -mcl_potions.PLUS_FACTOR = 8/3 - -mcl_potions.DURATION = 180 -mcl_potions.DURATION_PLUS = mcl_potions.DURATION * mcl_potions.PLUS_FACTOR -mcl_potions.DURATION_2 = mcl_potions.DURATION / mcl_potions.II_FACTOR - -mcl_potions.INV_FACTOR = 0.50 -mcl_potions.SPLASH_FACTOR = 0.75 -mcl_potions.LINGERING_FACTOR = 0.25 - -dofile(modpath .. "/functions.lua") -dofile(modpath .. "/commands.lua") -dofile(modpath .. "/splash.lua") -dofile(modpath .. "/lingering.lua") -dofile(modpath .. "/tipped_arrow.lua") -dofile(modpath .. "/potions.lua") - -minetest.register_craftitem("mcl_potions:fermented_spider_eye", { - description = S("Fermented Spider Eye"), - _doc_items_longdesc = S("Try different combinations to create potions."), - wield_image = "mcl_potions_spider_eye_fermented.png", - inventory_image = "mcl_potions_spider_eye_fermented.png", - groups = { brewitem = 1, }, - stack_max = 64, -}) - -minetest.register_craft({ - type = "shapeless", - output = "mcl_potions:fermented_spider_eye", - recipe = { "mcl_mushrooms:mushroom_brown", "mcl_core:sugar", "mcl_mobitems:spider_eye" }, -}) - -minetest.register_craftitem("mcl_potions:glass_bottle", { - description = S("Glass Bottle"), - _tt_help = S("Liquid container"), - _doc_items_longdesc = S("A glass bottle is used as a container for liquids and can be used to collect water directly."), - _doc_items_usagehelp = S("To collect water, use it on a cauldron with water (which removes a level of water) or any water source (which removes no water)."), - inventory_image = "mcl_potions_potion_bottle.png", - wield_image = "mcl_potions_potion_bottle.png", - groups = {brewitem=1}, - liquids_pointable = true, - on_place = function(itemstack, placer, pointed_thing) - if pointed_thing.type == "node" then - local node = minetest.get_node(pointed_thing.under) - local def = minetest.registered_nodes[node.name] - - -- Call on_rightclick if the pointed node defines it - if placer and not placer:get_player_control().sneak then - if def and def.on_rightclick then - return def.on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack - end - end - - -- Try to fill glass bottle with water - local get_water = false - --local from_liquid_source = false - local river_water = false - if def and def.groups and def.groups.water and def.liquidtype == "source" then - -- Water source - get_water = true - --from_liquid_source = true - river_water = node.name == "mclx_core:river_water_source" - -- Or reduce water level of cauldron by 1 - elseif string.sub(node.name, 1, 14) == "mcl_cauldrons:" then - local pname = placer:get_player_name() - if minetest.is_protected(pointed_thing.under, pname) then - minetest.record_protection_violation(pointed_thing.under, pname) - return itemstack - end - if node.name == "mcl_cauldrons:cauldron_3" then - get_water = true - minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron_2"}) - elseif node.name == "mcl_cauldrons:cauldron_2" then - get_water = true - minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron_1"}) - elseif node.name == "mcl_cauldrons:cauldron_1" then - get_water = true - minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron"}) - elseif node.name == "mcl_cauldrons:cauldron_3r" then - get_water = true - river_water = true - minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron_2r"}) - elseif node.name == "mcl_cauldrons:cauldron_2r" then - get_water = true - river_water = true - minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron_1r"}) - elseif node.name == "mcl_cauldrons:cauldron_1r" then - get_water = true - river_water = true - minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron"}) - end - end - if get_water then - local water_bottle - if river_water then - water_bottle = ItemStack("mcl_potions:river_water") - else - water_bottle = ItemStack("mcl_potions:water") - end - -- Replace with water bottle, if possible, otherwise - -- place the water potion at a place where's space - local inv = placer:get_inventory() - minetest.sound_play("mcl_potions_bottle_fill", {pos=pointed_thing.under, gain=0.5, max_hear_range=16}, true) - if minetest.is_creative_enabled(placer:get_player_name()) then - -- Don't replace empty bottle in creative for convenience reasons - if not inv:contains_item("main", water_bottle) then - inv:add_item("main", water_bottle) - end - elseif itemstack:get_count() == 1 then - return water_bottle - else - if inv:room_for_item("main", water_bottle) then - inv:add_item("main", water_bottle) - else - minetest.add_item(placer:get_pos(), water_bottle) - end - itemstack:take_item() - end - end - end - return itemstack - end, -}) - -minetest.register_craft( { - output = "mcl_potions:glass_bottle 3", - recipe = { - { "mcl_core:glass", "", "mcl_core:glass" }, - { "", "mcl_core:glass", "" } - } -}) - --- Template function for creating images of filled potions --- - colorstring must be a ColorString of form “#RRGGBB”, e.g. “#0000FF” for blue. --- - opacity is optional opacity from 0-255 (default: 127) -local function potion_image(colorstring, opacity) - if not opacity then - opacity = 127 - end - return "mcl_potions_potion_overlay.png^[colorize:"..colorstring..":"..tostring(opacity).."^mcl_potions_potion_bottle.png" -end - - - --- Cauldron fill up rules: --- Adding any water increases the water level by 1, preserving the current water type -local cauldron_levels = { - -- start = { add water, add river water } - { "", "_1", "_1r" }, - { "_1", "_2", "_2" }, - { "_2", "_3", "_3" }, - { "_1r", "_2r", "_2r" }, - { "_2r", "_3r", "_3r" }, -} -local fill_cauldron = function(cauldron, water_type) - local base = "mcl_cauldrons:cauldron" - for i=1, #cauldron_levels do - if cauldron == base .. cauldron_levels[i][1] then - if water_type == "mclx_core:river_water_source" then - return base .. cauldron_levels[i][3] - else - return base .. cauldron_levels[i][2] - end - end - end -end - --- Itemstring of potions is “mcl_potions:” - -minetest.register_craftitem("mcl_potions:water", { - description = S("Water Bottle"), - _tt_help = S("No effect"), - _doc_items_longdesc = S("Water bottles can be used to fill cauldrons. Drinking water has no effect."), - _doc_items_usagehelp = S("Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron."), - stack_max = 1, - inventory_image = potion_image("#0022FF"), - wield_image = potion_image("#0022FF"), - groups = {brewitem=1, food=3, can_eat_when_full=1, water_bottle=1}, - on_place = function(itemstack, placer, pointed_thing) - if pointed_thing.type == "node" then - local node = minetest.get_node(pointed_thing.under) - local def = minetest.registered_nodes[node.name] - - -- Call on_rightclick if the pointed node defines it - if placer and not placer:get_player_control().sneak then - if def and def.on_rightclick then - return def.on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack - end - end - - local cauldron = fill_cauldron(node.name, "mcl_core:water_source") - if cauldron then - local pname = placer:get_player_name() - if minetest.is_protected(pointed_thing.under, pname) then - minetest.record_protection_violation(pointed_thing.under, pname) - return itemstack - end - -- Increase water level of cauldron by 1 - minetest.set_node(pointed_thing.under, {name=cauldron}) - minetest.sound_play("mcl_potions_bottle_pour", {pos=pointed_thing.under, gain=0.5, max_hear_range=16}, true) - if minetest.is_creative_enabled(placer:get_player_name()) then - return itemstack - else - return "mcl_potions:glass_bottle" - end - end - end - - -- Drink the water by default - return minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, placer, pointed_thing) - end, - on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), -}) - - -minetest.register_craftitem("mcl_potions:river_water", { - description = S("River Water Bottle"), - _tt_help = S("No effect"), - _doc_items_longdesc = S("River water bottles can be used to fill cauldrons. Drinking it has no effect."), - _doc_items_usagehelp = S("Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron."), - - stack_max = 1, - inventory_image = potion_image("#0044FF"), - wield_image = potion_image("#0044FF"), - groups = {brewitem=1, food=3, can_eat_when_full=1, water_bottle=1}, - on_place = function(itemstack, placer, pointed_thing) - if pointed_thing.type == "node" then - local node = minetest.get_node(pointed_thing.under) - local def = minetest.registered_nodes[node.name] - - -- Call on_rightclick if the pointed node defines it - if placer and not placer:get_player_control().sneak then - if def and def.on_rightclick then - return def.on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack - end - end - - local cauldron = fill_cauldron(node.name, "mclx_core:river_water_source") - if cauldron then - local pname = placer:get_player_name() - if minetest.is_protected(pointed_thing.under, pname) then - minetest.record_protection_violation(pointed_thing.under, pname) - return itemstack - end - -- Increase water level of cauldron by 1 - minetest.set_node(pointed_thing.under, {name=cauldron}) - minetest.sound_play("mcl_potions_bottle_pour", {pos=pointed_thing.under, gain=0.5, max_hear_range=16}, true) - if minetest.is_creative_enabled(placer:get_player_name()) then - return itemstack - else - return "mcl_potions:glass_bottle" - end - end - end - - -- Drink the water by default - return minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, placer, pointed_thing) - end, - on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), - -}) - --- Hurt mobs -local function water_splash(obj, damage) - if not obj then - return - end - if not damage or (damage > 0 and damage < 1) then - damage = 1 - end - -- Damage mobs that are vulnerable to water - local lua = obj:get_luaentity() - if lua and lua.is_mob then - obj:punch(obj, 1.0, { - full_punch_interval = 1.0, - damage_groups = {water_vulnerable=damage}, - }, nil) - end -end - -mcl_potions.register_splash("water", S("Splash Water Bottle"), "#0022FF", { - tt=S("Extinguishes fire and hurts some mobs"), - longdesc=S("A throwable water bottle that will shatter on impact, where it extinguishes nearby fire and hurts mobs that are vulnerable to water."), - no_effect=true, - potion_fun=water_splash, - effect=1 -}) -mcl_potions.register_lingering("water", S("Lingering Water Bottle"), "#0022FF", { - tt=S("Extinguishes fire and hurts some mobs"), - longdesc=S("A throwable water bottle that will shatter on impact, where it creates a cloud of water vapor that lingers on the ground for a while. This cloud extinguishes fire and hurts mobs that are vulnerable to water."), - no_effect=true, - potion_fun=water_splash, - effect=1 -}) - -minetest.register_craftitem("mcl_potions:speckled_melon", { - description = S("Glistering Melon"), - _doc_items_longdesc = S("This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else."), - stack_max = 64, - groups = { brewitem = 1, }, - inventory_image = "mcl_potions_melon_speckled.png", -}) - -minetest.register_craft({ - output = "mcl_potions:speckled_melon", - recipe = { - {"mcl_core:gold_nugget", "mcl_core:gold_nugget", "mcl_core:gold_nugget"}, - {"mcl_core:gold_nugget", "mcl_farming:melon_item", "mcl_core:gold_nugget"}, - {"mcl_core:gold_nugget", "mcl_core:gold_nugget", "mcl_core:gold_nugget"}, - } -}) - - -local water_table = { - ["mcl_nether:nether_wart_item"] = "mcl_potions:awkward", - -- ["mcl_potions:fermented_spider_eye"] = "mcl_potions:weakness", - ["mcl_potions:speckled_melon"] = "mcl_potions:mundane", - ["mcl_core:sugar"] = "mcl_potions:mundane", - ["mcl_mobitems:magma_cream"] = "mcl_potions:mundane", - ["mcl_mobitems:blaze_powder"] = "mcl_potions:mundane", - ["mesecons:wire_00000000_off"] = "mcl_potions:mundane", - ["mcl_mobitems:ghast_tear"] = "mcl_potions:mundane", - ["mcl_mobitems:spider_eye"] = "mcl_potions:mundane", - ["mcl_mobitems:rabbit_foot"] = "mcl_potions:mundane", - ["mcl_nether:glowstone_dust"] = "mcl_potions:thick", - ["mcl_mobitems:gunpowder"] = "mcl_potions:water_splash" -} - -local awkward_table = { - ["mcl_potions:speckled_melon"] = "mcl_potions:healing", - ["mcl_farming:carrot_item_gold"] = "mcl_potions:night_vision", - ["mcl_core:sugar"] = "mcl_potions:swiftness", - ["mcl_mobitems:magma_cream"] = "mcl_potions:fire_resistance", - -- ["mcl_mobitems:blaze_powder"] = "mcl_potions:strength", - ["mcl_fishing:pufferfish_raw"] = "mcl_potions:water_breathing", - ["mcl_mobitems:ghast_tear"] = "mcl_potions:regeneration", - ["mcl_mobitems:spider_eye"] = "mcl_potions:poison", - ["mcl_mobitems:rabbit_foot"] = "mcl_potions:leaping", -} - -local output_table = { - ["mcl_potions:river_water"] = water_table, - ["mcl_potions:water"] = water_table, - ["mcl_potions:awkward"] = awkward_table, -} - - -local enhancement_table = {} -local extension_table = {} -local potions = {} - -for i, potion in ipairs({"healing","harming","swiftness","slowness", - "leaping","poison","regeneration","invisibility","fire_resistance", - -- "weakness","strength", - "water_breathing","night_vision"}) do - - table.insert(potions, potion) - - if potion ~= "invisibility" and potion ~= "night_vision" and potion ~= "weakness" and potion ~= "water_breathing" and potion ~= "fire_resistance" then - enhancement_table["mcl_potions:"..potion] = "mcl_potions:"..potion.."_2" - enhancement_table["mcl_potions:"..potion.."_splash"] = "mcl_potions:"..potion.."_2_splash" - table.insert(potions, potion.."_2") - end - - if potion ~= "healing" and potion ~= "harming" then - extension_table["mcl_potions:"..potion.."_splash"] = "mcl_potions:"..potion.."_plus_splash" - extension_table["mcl_potions:"..potion] = "mcl_potions:"..potion.."_plus" - table.insert(potions, potion.."_plus") - end - -end - -for i, potion in ipairs({"awkward", "mundane", "thick", "water"}) do - table.insert(potions, potion) -end - - -local inversion_table = { - ["mcl_potions:healing"] = "mcl_potions:harming", - ["mcl_potions:healing_2"] = "mcl_potions:harming_2", - ["mcl_potions:swiftness"] = "mcl_potions:slowness", - ["mcl_potions:swiftness_plus"] = "mcl_potions:slowness_plus", - ["mcl_potions:leaping"] = "mcl_potions:slowness", - ["mcl_potions:leaping_plus"] = "mcl_potions:slowness_plus", - ["mcl_potions:night_vision"] = "mcl_potions:invisibility", - ["mcl_potions:night_vision_plus"] = "mcl_potions:invisibility_plus", - ["mcl_potions:poison"] = "mcl_potions:harming", - ["mcl_potions:poison_2"] = "mcl_potions:harming_2", - ["mcl_potions:healing_splash"] = "mcl_potions:harming_splash", - ["mcl_potions:healing_2_splash"] = "mcl_potions:harming_2_splash", - ["mcl_potions:swiftness_splash"] = "mcl_potions:slowness_splash", - ["mcl_potions:swiftness_plus_splash"] = "mcl_potions:slowness_plus_splash", - ["mcl_potions:leaping_splash"] = "mcl_potions:slowness_splash", - ["mcl_potions:leaping_plus_splash"] = "mcl_potions:slowness_plus_splash", - ["mcl_potions:night_vision_splash"] = "mcl_potions:invisibility_splash", - ["mcl_potions:night_vision_plus_splash"] = "mcl_potions:invisibility_plus_splash", - ["mcl_potions:poison_splash"] = "mcl_potions:harming_splash", - ["mcl_potions:poison_2_splash"] = "mcl_potions:harming_2_splash", -} - - -local splash_table = {} -local lingering_table = {} - -for i, potion in ipairs(potions) do - splash_table["mcl_potions:"..potion] = "mcl_potions:"..potion.."_splash" - lingering_table["mcl_potions:"..potion.."_splash"] = "mcl_potions:"..potion.."_lingering" -end - - -local mod_table = { - ["mesecons:wire_00000000_off"] = extension_table, - ["mcl_potions:fermented_spider_eye"] = inversion_table, - ["mcl_nether:glowstone_dust"] = enhancement_table, - ["mcl_mobitems:gunpowder"] = splash_table, - ["mcl_potions:dragon_breath"] = lingering_table, -} - --- Compare two ingredients for compatable alchemy -function mcl_potions.get_alchemy(ingr, pot) - if output_table[pot] then - - local brew_table = output_table[pot] - - if brew_table[ingr] then - return brew_table[ingr] - end - end - - if mod_table[ingr] then - - local brew_table = mod_table[ingr] - - if brew_table[pot] then - return brew_table[pot] - end - - end - - return false -end - -mcl_wip.register_wip_item("mcl_potions:night_vision") -mcl_wip.register_wip_item("mcl_potions:night_vision_plus") -mcl_wip.register_wip_item("mcl_potions:night_vision_splash") -mcl_wip.register_wip_item("mcl_potions:night_vision_plus_splash") -mcl_wip.register_wip_item("mcl_potions:night_vision_lingering") -mcl_wip.register_wip_item("mcl_potions:night_vision_plus_lingering") -mcl_wip.register_wip_item("mcl_potions:night_vision_arrow") -mcl_wip.register_wip_item("mcl_potions:night_vision_plus_arrow") \ No newline at end of file diff --git a/mods/ITEMS/mcl_potions/lingering.lua b/mods/ITEMS/mcl_potions/lingering.lua deleted file mode 100644 index 17088ad130..0000000000 --- a/mods/ITEMS/mcl_potions/lingering.lua +++ /dev/null @@ -1,170 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -local mod_target = minetest.get_modpath("mcl_target") - -local function lingering_image(colorstring, opacity) - if not opacity then - opacity = 127 - end - return "mcl_potions_splash_overlay.png^[colorize:"..colorstring..":"..tostring(opacity).."^mcl_potions_lingering_bottle.png" -end - -local lingering_effect_at = {} - -local function add_lingering_effect(pos, color, def, is_water, instant) - lingering_effect_at[pos] = {color = color, timer = 30, def = def, is_water = is_water} -end - -local function linger_particles(pos, d, texture, color) - minetest.add_particlespawner({ - amount = 10 * d^2, - time = 1, - minpos = {x=pos.x-d, y=pos.y+0.5, z=pos.z-d}, - maxpos = {x=pos.x+d, y=pos.y+1, z=pos.z+d}, - minvel = {x=-0.5, y=0, z=-0.5}, - maxvel = {x=0.5, y=0.5, z=0.5}, - minacc = {x=-0.2, y=0, z=-0.2}, - maxacc = {x=0.2, y=.05, z=0.2}, - minexptime = 1, - maxexptime = 2, - minsize = 2, - maxsize = 4, - collisiondetection = true, - vertical = false, - texture = texture.."^[colorize:"..color..":127", - }) -end - -local lingering_timer = 0 -minetest.register_globalstep(function(dtime) - - lingering_timer = lingering_timer + dtime - if lingering_timer >= 1 then - - for pos, vals in pairs(lingering_effect_at) do - - vals.timer = vals.timer - lingering_timer - local d = 4 * (vals.timer / 30.0) - local texture - if vals.is_water then - texture = "mcl_particles_droplet_bottle.png" - elseif vals.def.instant then - texture = "mcl_particles_instant_effect.png" - else - texture = "mcl_particles_effect.png" - end - linger_particles(pos, d, texture, vals.color) - - -- Extinguish fire if water bottle - if vals.is_water then - if mcl_potions._extinguish_nearby_fire(pos, d) then - vals.timer = vals.timer - 3.25 - end - end - - -- Affect players and mobs - for _, obj in pairs(minetest.get_objects_inside_radius(pos, d)) do - - local entity = obj:get_luaentity() - if obj:is_player() or entity.is_mob then - - vals.def.potion_fun(obj) - -- TODO: Apply timer penalty only if the potion effect was acutally applied - vals.timer = vals.timer - 3.25 - - end - end - - if vals.timer <= 0 then - lingering_effect_at[pos] = nil - end - - end - lingering_timer = 0 - end -end) - - - -function mcl_potions.register_lingering(name, descr, color, def) - - local id = "mcl_potions:"..name.."_lingering" - local longdesc = def.longdesc - if not def.no_effect then - longdesc = S("A throwable potion that will shatter on impact, where it creates a magic cloud that lingers around for a while. Any player or mob inside the cloud will receive the potion's effect, possibly repeatedly.") - if def.longdesc then - longdesc = longdesc .. "\n" .. def.longdesc - end - end - minetest.register_craftitem(id, { - description = descr, - _tt_help = def.tt, - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = S("Use the “Punch” key to throw it."), - inventory_image = lingering_image(color), - groups = {brewitem=1, not_in_creative_inventory=0}, - on_use = function(item, placer, pointed_thing) - local velocity = 10 - local dir = placer:get_look_dir(); - local pos = placer:getpos(); - minetest.sound_play("mcl_throwing_throw", {pos = pos, gain = 0.4, max_hear_distance = 16}, true) - local obj = minetest.add_entity({x=pos.x+dir.x,y=pos.y+2+dir.y,z=pos.z+dir.z}, id.."_flying") - obj:setvelocity({x=dir.x*velocity,y=dir.y*velocity,z=dir.z*velocity}) - obj:setacceleration({x=dir.x*-3, y=-9.8, z=dir.z*-3}) - obj:get_luaentity()._thrower = placer:get_player_name() - if not minetest.is_creative_enabled(placer:get_player_name()) then - item:take_item() - end - return item - end, - stack_max = 1, - _on_dispense = function(stack, dispenserpos, droppos, dropnode, dropdir) - local s_pos = vector.add(dispenserpos, vector.multiply(dropdir, 0.51)) - local pos = {x=s_pos.x+dropdir.x,y=s_pos.y+dropdir.y,z=s_pos.z+dropdir.z} - minetest.sound_play("mcl_throwing_throw", {pos = pos, gain = 0.4, max_hear_distance = 16}, true) - local obj = minetest.add_entity(pos, id.."_flying") - local velocity = 22 - obj:set_velocity({x=dropdir.x*velocity,y=dropdir.y*velocity,z=dropdir.z*velocity}) - obj:set_acceleration({x=dropdir.x*-3, y=-9.8, z=dropdir.z*-3}) - end - }) - - local w = 0.7 - - minetest.register_entity(id.."_flying",{ - textures = {lingering_image(color)}, - hp_max = 1, - visual_size = {x=w/2,y=w/2}, - collisionbox = {-0.1,-0.1,-0.1,0.1,0.1,0.1}, - pointable = false, - on_step = function(self, dtime) - local pos = self.object:get_pos() - local node = minetest.get_node(pos) - local n = node.name - local g = minetest.get_item_group(n, "liquid") - local d = 4 - if mod_target and n == "mcl_target:target_off" then - mcl_target.hit(vector.round(pos), 0.4) --4 redstone ticks - end - if n ~= "air" and n ~= "mcl_portals:portal" and n ~= "mcl_portals:portal_end" and g == 0 or mcl_potions.is_obj_hit(self, pos) then - minetest.sound_play("mcl_potions_breaking_glass", {pos = pos, max_hear_distance = 16, gain = 1}) - add_lingering_effect(pos, color, def, name == "water") - local texture - if name == "water" then - texture = "mcl_particles_droplet_bottle.png" - else - if def.instant then - texture = "mcl_particles_instant_effect.png" - else - texture = "mcl_particles_effect.png" - end - end - linger_particles(pos, d, texture, color) - if name == "water" then - mcl_potions._extinguish_nearby_fire(pos, d) - end - self.object:remove() - end - end, - }) -end diff --git a/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr b/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr deleted file mode 100644 index 34693d531a..0000000000 --- a/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr +++ /dev/null @@ -1,114 +0,0 @@ -# textdomain: mcl_potions - []= [] - -Add a status effect to yourself. Arguments: : name of status effect, e.g. poison. : duration in seconds. : effect strength multiplier (1 @= 100%)=Ihnen einen Statuseffekt geben. Parameter: : Name des Statuseffekts, z.B. „poison“. : Dauer in Sekunden. : Effektstärkenmultiplikator (1 @= 100%) - -Missing effect parameter!=Fehlender Effektparameter! -Missing or invalid duration parameter!=Fehlender oder ungültiger Dauerparameter! -Invalid factor parameter!=Ungültiger Faktorparameter! -@1 is not an available status effect.=@1 ist kein verfügbarer Statuseffekt. -Fermented Spider Eye=Fermentiertes Spinnenauge -Glass Bottle=Glasflasche -Liquid container=Flüssigkeitsbehälter - -A glass bottle is used as a container for liquids and can be used to collect water directly.=Eine Glasflasche wird als Behälter von Flüssigkeiten benutzt und kann Wasser direkt aufsammeln. - -To collect water, use it on a cauldron with water (which removes a level of water) or any water source (which removes no water).=Um Wasser aufzusammeln, benutzen Sie sie an einem Kessel mit Wasser (was etwas Wasser entfernt) oder einer Wasserquelle (was kein Wasser entfernt). - -Water Bottle=Wasserflasche -Water bottles can be used to fill cauldrons. Drinking water has no effect.=Wasserflaschen können benutzt werden, um Kessel aufzufüllen. Trinken hat keine Wirkung. - -Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron.=Benutzen Sie die „Platzieren“-Taste zum Trinken. Platzieren Sie diesen Gegenstand auf einen Kessel, um das Wasser in den Kessel zu schütten. - -River Water Bottle=Flusswasserflasche -River water bottles can be used to fill cauldrons. Drinking it has no effect.=Flusswasserflaschen können benutzt werden, um Kessel aufzufüllen. Trinken hat keine Wirkung. - -Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron.=Benutzen Sie die „Platzieren“-Taste zum Trinken. Platzieren Sie diesen Gegenstand auf einen Kessel, um das Flusswasser in den Kessel zu schütten. - -Splash Water Bottle=Wurfwasserflasche -Extinguishes fire and hurts some mobs=Löscht Feuer und verletzt einige Mobs - -A throwable water bottle that will shatter on impact, where it extinguishes nearby fire and hurts mobs that are vulnerable to water.=Eine werfbare Wasserflasche, die beim Einschlag zerbrechen wird und nahes Feuer löschen und einige wasserempfindliche Mobs verletzen wird. - -Lingering Water Bottle=Verweilwasserflasche - -A throwable water bottle that will shatter on impact, where it creates a cloud of water vapor that lingers on the ground for a while. This cloud extinguishes fire and hurts mobs that are vulnerable to water.=Eine werfbare Wasserflasche, die beim Einschlag zerbrechen und eine Wolke aus Wasserdunst erzeugen wird, welche Feuer löscht und wasserempfindliche Mobs verletzt. - -Glistering Melon=Glitzermelone - -This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.=Diese glänzende Melone ist voller winziger Goldnuggets und sähe ganz nett in einem Rahmen aus. Er ist nicht essbar und auch sonst zu nichts zu gebrauchen. - -A throwable potion that will shatter on impact, where it creates a magic cloud that lingers around for a while. Any player or mob inside the cloud will receive the potion's effect, possibly repeatedly.=Ein werfbarer Trank, der bei Kollision zerbrechen wird, wo er eine magische Wolke erzeugt, die für eine gewisse Zeit verweilen wird. Jeder Spieler und jede Mob in der Wolke wird die Trankwirkung erhalten, möglicherweise mehrmals. - -Use the “Punch” key to throw it.=Benutzen Sie die „Schlagen“-Taste zum Werfen. -Use the “Place” key to drink it.=Benutzen Sie die „Platzieren“-Taste zum Trinken. -Drinking a potion gives you a particular effect.=Das Trinken eines Tranks gibt Ihnen einen bestimmten Effekt. -1 HP/@1s | @2=1 TP/@1s | @2 -@1 HP=@1 TP -@1 Potion=Trank der @1 -Splash @1 Potion=Wurftrank der @1 -Lingering @1 Potion=Verweiltrank der @1 -Arrow of @1=Pfeil der @1 - II= II - IV= IV -@1 Potion@2=Trank der @1@2 -Splash @1@2 Potion=Wurftrank der @1@2 -Lingering @1@2 Potion=Verweiltrank der @1@2 -Arrow of @1@2=Pfeil der @1@2 -@1 + Potion=Trank der @1 + -Splash @1 + Potion=Wurftrank der @1 + -Lingering @1 + Potion=Verweiltrank der @1 + -Arrow of @1 +=Pfeil der @1 -Awkward Potion=Seltsamer Trank -Awkward Splash Potion=Seltsamer Wurftrank -Awkward Lingering Potion=Seltsamer Verweiltrank -Has an awkward taste and is used for brewing potions.=Hat einen seltsamen Geschmack und wird in der Trankherstellung benutzt. -Mundane Potion=Klarer Trank -Mundane Splash Potion=Klarer Wurftrank -Mundane Lingering Potion=Klarer Verweiltrank -Has a terrible taste and is not useful for brewing potions.=Hat einen furchtbaren Geschmack und ist nicht für die Trankherstellung brauchbar. -Thick Potion=Bitterer Trank -Thick Splash Potion=Bitterer Wurftrank -Thick Lingering Potion=Bitterer Verweiltrank -Has a bitter taste and is not useful for brewing potions.=Hat einen bitteren Geschmack und ist nicht für die Trankherstellung brauchbar. -Dragon's Breath=Drachenatem - -This item is used in brewing and can be combined with splash potions to create lingering potions.=Dieser Objekt wird für die Trankherstellung benutzt und kann mit Wurftränken kombiniert werden, um Verweiltränke herzustellen. - -Healing=Heilung -+4 HP=+4 TP -+8 HP=+8 TP -Instantly heals.=Heilt sofort. -Harming=Verletzung --6 HP=-6 TP --12 HP=-12 TP -Instantly deals damage.=Richtet sofort Schaden an. -Night Vision=Nachtsicht -Increases the perceived brightness of light under a dark sky.=Erhöht die wahrgenommene Helligkeit des Lichts unter einem dunklem Himmel. -Swiftness=Schnelligkeit -Increases walking speed.=Erhöht Gehgeschwindigkeit. -Slowness=Langsamkeit -Decreases walking speed.=Verringert Gehgeschwindigkeit. -Leaping=Sprungkraft -Increases jump strength.=Erhöht Sprungstärke. -Poison=Vergiftung -Applies the poison effect which deals damage at a regular interval.=Gibt den Gifteffekt, der Schaden in regelmäßigen Abständen anrichtet. -Regeneration=Regenerierung -Regenerates health over time.=Regeneriert Gesundheit mit der Zeit. -Invisibility=Unsichtbarkeit -Grants invisibility.=Gibt Unsichtbarkeit. -Water Breathing=Wasseratmung -Grants limitless breath underwater.=Gibt unbegrenzten Atem im Wasser. -Fire Resistance=Feuerresistenz -Grants immunity to damage from heat sources like fire.=Gibt Immunität gegenüber Schaden von Hitzequellen wie Feuer. -Weakness=Schwäche -Weakness +=Schwäche + -Strength=Stärke -Strength II=Stärke II -Strength +=Stärke + -Try different combinations to create potions.=Probieren Sie Kombinationen aus, um Tränke herzustellen. -No effect=Keine Wirkung - -A throwable potion that will shatter on impact, where it gives all nearby players and mobs a status effect.=Ein werfbarer Trank, der bei Kollision zerbrechen wird, wo er allen nahen Spielern und Mobs einen Statuseffekt geben wird. - -This particular arrow is tipped and will give an effect when it hits a player or mob.=Diese Pfeilspitze dieses Pfeils in einem Trank getränkt und gibt einen Effekt, wenn er einen Spieler oder einen Mob trifft. diff --git a/mods/ITEMS/mcl_potions/locale/mcl_potions.es.tr b/mods/ITEMS/mcl_potions/locale/mcl_potions.es.tr deleted file mode 100644 index efa9902474..0000000000 --- a/mods/ITEMS/mcl_potions/locale/mcl_potions.es.tr +++ /dev/null @@ -1,115 +0,0 @@ -# textdomain: mcl_potions - []= - -Add a status effect to yourself. Arguments: : name of status effect, e.g. poison. : duration in seconds. : effect strength multiplier (1 @= 100%)= - -Missing effect parameter!= -Missing or invalid duration parameter!= -Invalid factor parameter!= -@1 is not an available status effect.= -Fermented Spider Eye=Ojo de araña fermentado -Glass Bottle=Frasco de cristal -Liquid container= - -A glass bottle is used as a container for liquids and can be used to collect water directly.=El frasco de cristal se usa como recipiente para líquidos y se puede usar para recoger agua directamente. - -To collect water, use it on a cauldron with water (which removes a level of water) or any water source (which removes no water).=Para recoger agua, colóquela en un caldero con agua (que elimina un nivel de agua) o cualquier fuente de agua (que no elimine agua). - -Water Bottle=Frasco de cristal con agua -Water bottles can be used to fill cauldrons. Drinking water has no effect.=Las botellas de agua se pueden usar para llenar calderos. El agua potable no tiene efecto. - -Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron.=Use la tecla "Acción" para beber. Coloque este artículo en un caldero para verter el agua en el caldero. - -River Water Bottle=Frasco de cristal con agua de rio -River water bottles can be used to fill cauldrons. Drinking it has no effect.=Las botellas de agua de río se pueden usar para llenar calderos. Beberlo no tiene ningún efecto. - -Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron.=Use la tecla "Acción" para beber. Coloque este artículo en un caldero para verter el agua de río en el caldero. - -Splash Water Bottle= -Extinguishes fire and hurts some mobs= - -A throwable water bottle that will shatter on impact, where it extinguishes nearby fire and hurts mobs that are vulnerable to water.= - -Lingering Water Bottle= - -A throwable water bottle that will shatter on impact, where it creates a cloud of water vapor that lingers on the ground for a while. This cloud extinguishes fire and hurts mobs that are vulnerable to water.= - -Glistering Melon=Rodaja de sandía reluciente - -This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.=Esta sandía brillante está llena de pequeñas pepitas de oro y sería bueno en un marco de artículo. No es comestible y no es útil para nada más. - -A throwable potion that will shatter on impact, where it creates a magic cloud that lingers around for a while. Any player or mob inside the cloud will receive the potion's effect, possibly repeatedly.= - -Use the “Punch” key to throw it.= -Use the “Place” key to drink it.=Use la tecla "Colocar" para beberlo. -Drinking a potion gives you a particular effect.= -1 HP/@1s | @2= -@1 HP= -@1 Potion= -Splash @1 Potion= -Lingering @1 Potion= -Arrow of @1= - II= - IV= -@1 Potion@2= -Splash @1@2 Potion= -Lingering @1@2 Potion= -Arrow of @1@2= -@1 + Potion= -Splash @1 + Potion= -Lingering @1 + Potion= -Arrow of @1 += -Awkward Potion=Poción incomoda -Awkward Splash Potion= -Awkward Lingering Potion= -Has an awkward taste and is used for brewing potions.= -Mundane Potion=Poción Mundana -Mundane Splash Potion= -Mundane Lingering Potion= -Has a terrible taste and is not useful for brewing potions.= -Thick Potion=Poción densa -Thick Splash Potion= -Thick Lingering Potion= -Has a bitter taste and is not useful for brewing potions.= -Dragon's Breath=Aliento de dragón - -This item is used in brewing and can be combined with splash potions to create lingering potions.= - -Healing= -+4 HP= -+8 HP= -Instantly heals.= -Harming= --6 HP= --12 HP= -Instantly deals damage.= -Night Vision= -Increases the perceived brightness of light under a dark sky.= -Swiftness= -Increases walking speed.= -Slowness= -Decreases walking speed.= -Leaping= -Increases jump strength.= -Poison= -Applies the poison effect which deals damage at a regular interval.= -Regeneration= -Regenerates health over time.= -Invisibility= -Grants invisibility.= -Water Breathing= -Grants limitless breath underwater.= -Fire Resistance= -Grants immunity to damage from heat sources like fire.= -Weakness= -Weakness += -Strength= -Strength II= -Strength += -Try different combinations to create potions.= -No effect= - -A throwable potion that will shatter on impact, where it gives all nearby players and mobs a status effect.= - -This particular arrow is tipped and will give an effect when it hits a player or mob.= - diff --git a/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr b/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr deleted file mode 100644 index f3850a7b67..0000000000 --- a/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr +++ /dev/null @@ -1,115 +0,0 @@ -# textdomain: mcl_potions - []= [] - -Add a status effect to yourself. Arguments: : name of status effect, e.g. poison. : duration in seconds. : effect strength multiplier (1 @= 100%)=Ajoutez-vous un effet de statut. Arguments: : nom de l'effet de statut, par ex. poison. : durée en secondes. : multiplicateur de force d'effet (1 @ = 100%) - -Missing effect parameter!=Paramètre d'effet manquant! -Missing or invalid duration parameter!=Paramètre durée manquant ou invalide! -Invalid factor parameter!=Paramètre facteur invalide! -@1 is not an available status effect.=@1 n'est pas un effet disponible. -Fermented Spider Eye=Oeil d'araignée fermenté -Glass Bottle=Bouteille en verre -Liquid container=Récipient de liquide - -A glass bottle is used as a container for liquids and can be used to collect water directly.=Une bouteille en verre est utilisée comme récipient pour les liquides et peut être utilisée pour collecter l'eau directement. - -To collect water, use it on a cauldron with water (which removes a level of water) or any water source (which removes no water).=Pour collecter l'eau, poser la sur un chaudron avec de l'eau (qui enlève un niveau d'eau) ou toute source d'eau (qui n'enlève pas d'eau). - -Water Bottle=Bouteille d'eau -Water bottles can be used to fill cauldrons. Drinking water has no effect.=Les bouteilles d'eau peuvent être utilisées pour remplir les chaudrons. L'eau potable n'a aucun effet. - -Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron.=Utilisez la touche "Utiliser" pour boire. Placez cet article sur un chaudron pour verser l'eau dans le chaudron. - -River Water Bottle=Bouteille d'eau de rivière -River water bottles can be used to fill cauldrons. Drinking it has no effect.=Les bouteilles d'eau de rivière peuvent être utilisées pour remplir les chaudrons. Le boire n'a aucun effet. - -Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron.=Utilisez la touche "Utiliser" pour boire. Placez cet objet sur un chaudron pour verser l'eau de la rivière dans le chaudron. - -Splash Water Bottle=Bouteille d'eau jetable -Extinguishes fire and hurts some mobs=Éteint le feu et blesse certains mobs - -A throwable water bottle that will shatter on impact, where it extinguishes nearby fire and hurts mobs that are vulnerable to water.=Une bouteille d'eau jetable qui se brisera à l'impact, où elle éteint le feu à proximité et blesse les mobs vulnérables à l'eau. - -Lingering Water Bottle=Bouteille d'eau persistante - -A throwable water bottle that will shatter on impact, where it creates a cloud of water vapor that lingers on the ground for a while. This cloud extinguishes fire and hurts mobs that are vulnerable to water.=Une bouteille d'eau jetable qui se brisera à l'impact, où elle crée un nuage de vapeur d'eau qui s'attarde au sol pendant un moment. Ce nuage éteint le feu et blesse les mobs vulnérables à l'eau. - -Glistering Melon=Melon étincelant - -This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.=Ce melon brillant est plein de minuscules pépites d'or et serait bien dans un cadre d'objet. Il n'est pas comestible et n'est utile à rien d'autre. - -A throwable potion that will shatter on impact, where it creates a magic cloud that lingers around for a while. Any player or mob inside the cloud will receive the potion's effect, possibly repeatedly.=Une potion jetable qui se brisera à l'impact, où elle crée un nuage magique qui persiste pendant un moment. Tout joueur ou mob à l'intérieur du nuage recevra l'effet de la potion, peut-être à plusieurs reprises. - -Use the “Punch” key to throw it.=Utilisez la touche "Frapper" pour le lancer. -Use the “Place” key to drink it.=Utilisez la touche "Utiliser" pour le boire. -Drinking a potion gives you a particular effect.=Boire une potion vous donne un effet particulier. -1 HP/@1s | @2=1 HP/@1s | @2 -@1 HP=@1 HP -@1 Potion=Potion @1 -Splash @1 Potion=Potion @1 jetable -Lingering @1 Potion=Potion @1 persistante -Arrow of @1=Flêche de @1 - II= II - IV= IV -@1 Potion@2=@1 Potion@2 -Splash @1@2 Potion=Potion @1@2 jetable -Lingering @1@2 Potion=Potion @1@2 persistante -Arrow of @1@2=Flêche de @1@2 -@1 + Potion=@1 + Potion -Splash @1 + Potion=Potion @1 + jetable -Lingering @1 + Potion=Potion @1 + persistante -Arrow of @1 +=Flêche de @1 + -Awkward Potion=Potion étrange -Awkward Splash Potion=Potion étrange jetable -Awkward Lingering Potion=Potion étrange persistante -Has an awkward taste and is used for brewing potions.=A un goût étrange et est utilisé pour préparer des potions. -Mundane Potion=Potion banale -Mundane Splash Potion=Potion banale jetable -Mundane Lingering Potion=Potion banale persistante -Has a terrible taste and is not useful for brewing potions.=A un goût terrible et n'est pas utile pour préparer des potions. -Thick Potion=Potion épaisse -Thick Splash Potion=Potion épaisse jetable -Thick Lingering Potion=Potion épaisse persistante -Has a bitter taste and is not useful for brewing potions.=A un goût amer et n'est pas utile pour préparer des potions. -Dragon's Breath=Souffle du dragon - -This item is used in brewing and can be combined with splash potions to create lingering potions.=Cet objet est utilisé dans le brassage et peut être combiné avec des potions d'éclaboussures pour créer des potions persistantes. - -Healing=Guérison -+4 HP=+4 HP -+8 HP=+8 HP -Instantly heals.=Guérit instantanément. -Harming=Dégâts --6 HP=-6 HP --12 HP=-12 HP -Instantly deals damage.=Instantly deals damage. -Night Vision=Vision Nocturne -Increases the perceived brightness of light under a dark sky.=Augmente la luminosité perçue de la lumière sous un ciel sombre. -Swiftness=Rapidité -Increases walking speed.=Augmente la vitesse de marche. -Slowness=Lenteur -Decreases walking speed.=Diminue la vitesse de marche. -Leaping=Saut -Increases jump strength.=Augmente la force de saut. -Poison=Poison -Applies the poison effect which deals damage at a regular interval.=Applique l'effet de poison qui inflige des dégâts à intervalle régulier. -Regeneration=Régénération -Regenerates health over time.=Régénère la santé au fil du temps. -Invisibility=Invisibilité -Grants invisibility.=Accorde l'invisibilité. -Water Breathing=Respiration Aquatique -Grants limitless breath underwater.=Donne une respiration illimitée sous l'eau. -Fire Resistance=Résistance au Feu -Grants immunity to damage from heat sources like fire.=Confère une immunité aux dommages causés par des sources de chaleur comme le feu. -Weakness=Faiblesse -Weakness +=Faiblesse + -Strength=Force -Strength II=Force II -Strength +=Force + -Try different combinations to create potions.=Essayez différentes combinaisons pour créer des potions. -No effect=Aucun effet - -A throwable potion that will shatter on impact, where it gives all nearby players and mobs a status effect.=Une potion jetable qui se brisera à l'impact, où elle donne à tous les joueurs et créatures proches un effet de statut. - -This particular arrow is tipped and will give an effect when it hits a player or mob.=Cette flèche particulière est enchantée et donnera un effet lorsqu'elle touche un joueur ou un mob. - diff --git a/mods/ITEMS/mcl_potions/locale/mcl_potions.pl.tr b/mods/ITEMS/mcl_potions/locale/mcl_potions.pl.tr deleted file mode 100644 index abf61d4d3e..0000000000 --- a/mods/ITEMS/mcl_potions/locale/mcl_potions.pl.tr +++ /dev/null @@ -1,115 +0,0 @@ -# textdomain: mcl_potions - []= [] - -Add a status effect to yourself. Arguments: : name of status effect, e.g. poison. : duration in seconds. : effect strength multiplier (1 @= 100%)=Dodaj status na siebie. Argumenty: : nazwa efektu statusu, np. trucizna. : czas trwania w sekundach. : czynnik siły efektu (1 @= 100%) - -Missing effect parameter!=Brak parametru efektu! -Missing or invalid duration parameter!=Brak lub nieprawidłowy parametr czasu trwania! -Invalid factor parameter!=Nieprawidłowy parametr czynnika! -@1 is not an available status effect.=@1 nie jest dostępnym efektem statusu. -Fermented Spider Eye=Fermentowane oko pająka -Glass Bottle=Szklana butelka -Liquid container=Pojemnik na płyn - -A glass bottle is used as a container for liquids and can be used to collect water directly.=Szklana butelka jest używana jako pojemnik na płyny i może być wykorzystana bezpośrednio do pozyskiwania wody. - -To collect water, use it on a cauldron with water (which removes a level of water) or any water source (which removes no water).=Aby pozyskać wodę użyj jej na kotle z wodą (co usunie jeden poziom wody) lub jakimkolwiek źródle wody (co nie usunie wody). - -Water Bottle=Butelka wody -Water bottles can be used to fill cauldrons. Drinking water has no effect.=Butelka wody może być wykorzystana do napełniania kotłów. Picie wody nie ma żadnych efektów. - -Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron.=Użyj przycisku do stawiania aby pić. Postaw ten przedmiot na kotle aby wylać wodę do kotła. - -River Water Bottle=Butelka wody rzecznej -River water bottles can be used to fill cauldrons. Drinking it has no effect.=Butelka wody rzecznej może być wykorzystana do napełniania kotłów. Picie jej nie ma żadnego efektu. - -Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron.=Użyj przycisku do stawiania aby pić. Postaw ten przedmiot na kotle aby wylać wodę rzeczną do kotła. - -Splash Water Bottle=Miotana butelka wody -Extinguishes fire and hurts some mobs=Gasi ogień i rani niektóre moby - -A throwable water bottle that will shatter on impact, where it extinguishes nearby fire and hurts mobs that are vulnerable to water.=Butelka wody którą można rzucać i roztrzaska się przy uderzeniu, gdzie ugasi ogień i rani moby podatne na wodę. - -Lingering Water Bottle=Trwała miotana butelka wody - -A throwable water bottle that will shatter on impact, where it creates a cloud of water vapor that lingers on the ground for a while. This cloud extinguishes fire and hurts mobs that are vulnerable to water.=Butelka wody którą można rzucać i roztrzaska się przy uderzeniu tworząc opary wody pozostające przez chwilę na ziemi. Opary te gaszą ogień i ranią moby podatne na wodę. - -Glistering Melon=Błyszczący arbuz - -This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.=Ten błyszczący arbuz jest pełen tycich odłamków złota i wygląda ładnie w ramkach na przedmioty. Nie jest jadalny ani użyteczny do innych rzeczy. - -A throwable potion that will shatter on impact, where it creates a magic cloud that lingers around for a while. Any player or mob inside the cloud will receive the potion's effect, possibly repeatedly.=Mikstura którą można rzucać i roztrzaska się przy uderzeniu tworząc magiczne opary pozostające przez chwilę na ziemi. Jakikolwiek gracz lub mob wewnątrz oparów będzie wystawiony na efekt mikstury. - -Use the “Punch” key to throw it.=Użyj przycisku "Uderz" by rzucić. -Use the “Place” key to drink it.=Użyj przycisku "Postaw" by wypić. -Drinking a potion gives you a particular effect.=Wypicie mikstury sprawi, że będziesz wystawiona na jej efekty. -1 HP/@1s | @2=1 HP/@1s | @2 -@1 HP=@1 HP -@1 Potion=Mikstura @1 -Splash @1 Potion=Miotana mikstura @1 -Lingering @1 Potion=Trwała miotana mikstura @1 -Arrow of @1=Strzała @1 - II= II - IV= IV -@1 Potion@2=Mikstura @1@2 -Splash @1@2 Potion=Miotana mikstura @1@2 -Lingering @1@2 Potion=Trwała miotana mikstura @1@2 -Arrow of @1@2=Strzała @1@2 -@1 + Potion=Mikstura @1 + -Splash @1 + Potion=Miotana mikstura @1 + -Lingering @1 + Potion=Trwała miotana mikstura @1 + -Arrow of @1 +=Strzała @1 + -Awkward Potion=Klarowna mikstura -Awkward Splash Potion=Klarowna miotana mikstura -Awkward Lingering Potion=Klarowna trwała miotana mikstura -Has an awkward taste and is used for brewing potions.=Ma dziwny smak i jest użyteczna przy warzenia mikstur. -Mundane Potion=Mdła mikstura -Mundane Splash Potion=Mdła miotana mikstura -Mundane Lingering Potion=Mdła trwała miotana mikstura -Has a terrible taste and is not useful for brewing potions.=Ma ohydny smak i nie jest użyteczna przy warzenia mikstur. -Thick Potion=Gęsta mikstura -Thick Splash Potion=Gęsta miotana mikstura -Thick Lingering Potion=Gęsta trwała miotana mikstura -Has a bitter taste and is not useful for brewing potions.=Ma cierpki smak i nie jest użyteczna przy warzenia mikstur. -Dragon's Breath=Oddech smoka - -This item is used in brewing and can be combined with splash potions to create lingering potions.=Ten przedmiot jest używany przy warzeniu i może zostać dodany do miotanych mikstur aby uczynić je trwałymi. - -Healing=leczenia -+4 HP=+4 HP -+8 HP=+8 HP -Instantly heals.=Natychmiastowo leczy. -Harming=obrażeń --6 HP=-6 HP --12 HP=-12 HP -Instantly deals damage.=Natychmiastowo zadaje obrażenia. -Night Vision=widzenia w ciemności -Increases the perceived brightness of light under a dark sky.=Zwiększa postrzeganą jasność przy ciemnym niebie. -Swiftness=prędkości -Increases walking speed.=Zwiększa prędkość poruszania. -Slowness=spowolnienia -Decreases walking speed.=Zmniejsza prędkość poruszania. -Leaping=skakania -Increases jump strength.=Zwiększa siłę skoku. -Poison=trucizny -Applies the poison effect which deals damage at a regular interval.=Aplikuje efekt trucizny zadający obrażenia w regularnych odstępach czasu. -Regeneration=regeneracji -Regenerates health over time.=Regeneruje życie przez pewien czas. -Invisibility=niewidzialności -Grants invisibility.=Sprawia, że cel jest niewidzialny. -Water Breathing=oddychania pod wodą -Grants limitless breath underwater.=Sprawia, że cel może oddychać pod wodą. -Fire Resistance=odporności na ogień -Grants immunity to damage from heat sources like fire.=Sprawia, że cel jest odporny na obrażenia od źródeł ciepła takich jak ogień. -Weakness=słabości -Weakness +=słabości + -Strength=siły -Strength II=siły II -Strength +=siły + -Try different combinations to create potions.=Spróbuj innej kombinacji aby stworzyć miksturę. -No effect=Brak efektu - -A throwable potion that will shatter on impact, where it gives all nearby players and mobs a status effect.=Mikstura, którą można rzucić i rozbije się przy uderzeniu wystawiając wszystkich pobliskich graczy i moby na efekt jej działania. - -This particular arrow is tipped and will give an effect when it hits a player or mob.=Czubek tej strzały jest zanurzony w miksturze co wystawi jej cel na efekt jej działania. - diff --git a/mods/ITEMS/mcl_potions/locale/mcl_potions.ru.tr b/mods/ITEMS/mcl_potions/locale/mcl_potions.ru.tr deleted file mode 100644 index 2bc4380ecf..0000000000 --- a/mods/ITEMS/mcl_potions/locale/mcl_potions.ru.tr +++ /dev/null @@ -1,116 +0,0 @@ -# textdomain: mcl_potions - []=<эффект> <длительность> [<фактор>] - -Add a status effect to yourself. Arguments: : name of status effect, e.g. poison. : duration in seconds. : effect strength multiplier (1 @= 100%)=Добавляет вам эффект состояния. Параметры: <эффект> - название эффекта состояния, например, poison (отравление). <Длительность> - длительность в секундах. <Фактор> - коэффициент силы эффекта (1 @= 100%) - -Missing effect parameter!=Отсутствует параметр эффекта! -Missing or invalid duration parameter!=Отсутствует либо неправильно задан параметр длительности! -Invalid factor parameter!=Отсутствует параметр фактора! -@1 is not an available status effect.=@1 не является допустимым эффектом состояния. -Fermented Spider Eye=Прокисший паучий глаз -Glass Bottle=Стеклянная бутылка -Liquid container=Контейнер для жидкостей - -A glass bottle is used as a container for liquids and can be used to collect water directly.=Стеклянная бутылка используется для хранения жидкостей, её также можно использовать для сбора воды. - -To collect water, use it on a cauldron with water (which removes a level of water) or any water source (which removes no water).=Воду в бутылку можно набрать из котла с помощью команды [Использовать] (это уменьшает уровень воды в котле) или из другого источника (уровень которого не уменьшится). - -Water Bottle=Бутылка с водой -Water bottles can be used to fill cauldrons. Drinking water has no effect.=Бутылки с водой можно использовать для наполнения котлов. Выпивание воды не даст никакого эффекта. - -Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron.=Используйте клавишу “Разместить”, чтобы выпить это. Поместите этот предмет на котёл, чтобы вылить воду в котёл. - -River Water Bottle=Бутылка с речной водой -River water bottles can be used to fill cauldrons. Drinking it has no effect.=Бутылки с речной водой можно использовать для наполнения котлов. Выпивание воды не даст никакого эффекта. - -Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron.=Используйте клавишу “Разместить”, чтобы выпить это. Поместите этот предмет на котёл, чтобы вылить речную воду в котёл. - -Splash Water Bottle=Бутылка со взрывающейся водой -Extinguishes fire and hurts some mobs=Тушит огонь и ранит некоторых мобов - -A throwable water bottle that will shatter on impact, where it extinguishes nearby fire and hurts mobs that are vulnerable to water.=Бутылка с водой, которую можно метать. Она разбивается при ударе, тушит ближайший огонь и ранит мобов, уязвимых к воде. - -Lingering Water Bottle=Бутылка с оседающей водой - -A throwable water bottle that will shatter on impact, where it creates a cloud of water vapor that lingers on the ground for a while. This cloud extinguishes fire and hurts mobs that are vulnerable to water.=Бутылка с водой, которую можно метать. Она разбивается при ударе, образуя облако пара, которое оседает на землю через некоторое время. Это облако тушит огонь и ранит мобов, уязвимых к воде. - -Glistering Melon=Искрящаяся дыня - -This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.=Искрящаяся дыня полна маленьких золотых самородков и может отлично смотреться в рамке. Она несъедобна и не годится больше ни для чего. - -A throwable potion that will shatter on impact, where it creates a magic cloud that lingers around for a while. Any player or mob inside the cloud will receive the potion's effect, possibly repeatedly.=Зелье, которое можно метать. При ударе оно разбивается, создавая волшебное облако, которое задерживается на некоторое время. Любой игрок или моб внутри облака получит эффект зелья, возможно, неоднократно. - -Use the “Punch” key to throw it.=Нажмите [Ударить] для метания. -Use the “Place” key to drink it.=Нажмите [Разместить] для выпивания. -Drinking a potion gives you a particular effect.=Выпивание зелья даёт вам особый эффект. -1 HP/@1s | @2=1 HP/@1с | @2 -@1 HP=@1 HP -@1 Potion=Зелье @1 -Splash @1 Potion=Взрывающееся зелье @1 -Lingering @1 Potion=Оседающее зелье @1 -Arrow of @1=Стрела @1 - II= II - IV= IV -@1 Potion@2=Зелье @1 @2 -Splash @1@2 Potion=Взрывающееся зелье @1@2 -Lingering @1@2 Potion=Оседающее зелье @1@2 -Arrow of @1@2=Стрела @1@2 -@1 + Potion=Зелье @1+ -Splash @1 + Potion=Взрывающееся зелье @1+ -Lingering @1 + Potion=Оседающее зелье @1+ -Arrow of @1 +=Стрела @1+ -Awkward Potion=Невкусное зелье -Awkward Splash Potion=Невкусное взрывающееся зелье -Awkward Lingering Potion=Невкусное оседающее зелье -Has an awkward taste and is used for brewing potions.=Имеет неприятный вкус и используется для приготовления других зелий. -Mundane Potion=Успокоительное зелье -Mundane Splash Potion=Успокоительное взрывающееся зелье -Mundane Lingering Potion=Успокоительное оседающее зелье -Has a terrible taste and is not useful for brewing potions.=Имеет отвратительный вкус и используется для приготовления других зелий. -Thick Potion=Густое зелье -Thick Splash Potion=Густое взрывающееся зелье -Thick Lingering Potion=Густое оседающее зелье -Has a bitter taste and is not useful for brewing potions.=Имеет горький вкус и используется для приготовления других зелий. -Dragon's Breath=Дыхание дракона - -This item is used in brewing and can be combined with splash potions to create lingering potions.=Этот предмет используется в зельеварении и может объединяться со взрывающимися зельями, чтобы создать эффект оседания - -Healing=исцеления -+4 HP=+4 HP -+8 HP=+8 HP -Instantly heals.=Лечит мгновенно -Harming=урона --6 HP=-6 HP --12 HP=-12 HP -Instantly deals damage.=Вызывает мгновенную смерть. -Night Vision=ночного зрения -Increases the perceived brightness of light under a dark sky.=Усиливает восприятие яркости освещения под тёмным небом. -Swiftness=ускорения -Increases walking speed.=Увеличивает скорость ходьбы -Slowness=замедления -Decreases walking speed.=Уменьшает скорость ходьбы -Leaping=прыгучести -Increases jump strength.=Увеличивает силу прыжка -Poison=отравления -Applies the poison effect which deals damage at a regular interval.=Наносит эффект яда, который вызывает урон через равные промежутки времени. -Regeneration=восстановления -Regenerates health over time.=Восстанавливает здоровье со временем. -Invisibility=невидимости -Grants invisibility.=Делает невидимым. -Water Breathing=подводного дыхания -Grants limitless breath underwater.=Даёт возможность неограниченно дышать под водой. -Fire Resistance=огнестойкости -Grants immunity to damage from heat sources like fire.=Делает невосприимчивым к урону от источников тепла, например, от огня. -Weakness=Слабость -Weakness +=Слабость + -Strength=Сила -Strength II=Сила II -Strength +=Сила + -Try different combinations to create potions.=Пробуйте разные сочетания для приготовления зелий. -No effect=Не оказывает эффекта - -A throwable potion that will shatter on impact, where it gives all nearby players and mobs a status effect.=Зелье, которое можно метать. Оно разбивается при ударе и он дает всем ближайшим игрокам и мобам эффект состояния. - -This particular arrow is tipped and will give an effect when it hits a player or mob.=Эта необычная стрела с обработанным наконечником даёт эффект при попадании в игрока или моба. - - diff --git a/mods/ITEMS/mcl_potions/locale/template.txt b/mods/ITEMS/mcl_potions/locale/template.txt deleted file mode 100644 index 1420dabee3..0000000000 --- a/mods/ITEMS/mcl_potions/locale/template.txt +++ /dev/null @@ -1,115 +0,0 @@ -# textdomain: mcl_potions - []= - -Add a status effect to yourself. Arguments: : name of status effect, e.g. poison. : duration in seconds. : effect strength multiplier (1 @= 100%)= - -Missing effect parameter!= -Missing or invalid duration parameter!= -Invalid factor parameter!= -@1 is not an available status effect.= -Fermented Spider Eye= -Glass Bottle= -Liquid container= - -A glass bottle is used as a container for liquids and can be used to collect water directly.= - -To collect water, use it on a cauldron with water (which removes a level of water) or any water source (which removes no water).= - -Water Bottle= -Water bottles can be used to fill cauldrons. Drinking water has no effect.= - -Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron.= - -River Water Bottle= -River water bottles can be used to fill cauldrons. Drinking it has no effect.= - -Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron.= - -Splash Water Bottle= -Extinguishes fire and hurts some mobs= - -A throwable water bottle that will shatter on impact, where it extinguishes nearby fire and hurts mobs that are vulnerable to water.= - -Lingering Water Bottle= - -A throwable water bottle that will shatter on impact, where it creates a cloud of water vapor that lingers on the ground for a while. This cloud extinguishes fire and hurts mobs that are vulnerable to water.= - -Glistering Melon= - -This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.= - -A throwable potion that will shatter on impact, where it creates a magic cloud that lingers around for a while. Any player or mob inside the cloud will receive the potion's effect, possibly repeatedly.= - -Use the “Punch” key to throw it.= -Use the “Place” key to drink it.= -Drinking a potion gives you a particular effect.= -1 HP/@1s | @2= -@1 HP= -@1 Potion= -Splash @1 Potion= -Lingering @1 Potion= -Arrow of @1= - II= - IV= -@1 Potion@2= -Splash @1@2 Potion= -Lingering @1@2 Potion= -Arrow of @1@2= -@1 + Potion= -Splash @1 + Potion= -Lingering @1 + Potion= -Arrow of @1 += -Awkward Potion= -Awkward Splash Potion= -Awkward Lingering Potion= -Has an awkward taste and is used for brewing potions.= -Mundane Potion= -Mundane Splash Potion= -Mundane Lingering Potion= -Has a terrible taste and is not useful for brewing potions.= -Thick Potion= -Thick Splash Potion= -Thick Lingering Potion= -Has a bitter taste and is not useful for brewing potions.= -Dragon's Breath= - -This item is used in brewing and can be combined with splash potions to create lingering potions.= - -Healing= -+4 HP= -+8 HP= -Instantly heals.= -Harming= --6 HP= --12 HP= -Instantly deals damage.= -Night Vision= -Increases the perceived brightness of light under a dark sky.= -Swiftness= -Increases walking speed.= -Slowness= -Decreases walking speed.= -Leaping= -Increases jump strength.= -Poison= -Applies the poison effect which deals damage at a regular interval.= -Regeneration= -Regenerates health over time.= -Invisibility= -Grants invisibility.= -Water Breathing= -Grants limitless breath underwater.= -Fire Resistance= -Grants immunity to damage from heat sources like fire.= -Weakness= -Weakness += -Strength= -Strength II= -Strength += -Try different combinations to create potions.= -No effect= - -A throwable potion that will shatter on impact, where it gives all nearby players and mobs a status effect.= - -This particular arrow is tipped and will give an effect when it hits a player or mob.= - diff --git a/mods/ITEMS/mcl_potions/mod.conf b/mods/ITEMS/mcl_potions/mod.conf deleted file mode 100644 index bcb6d8ad37..0000000000 --- a/mods/ITEMS/mcl_potions/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = mcl_potions -depends = mcl_core, mcl_farming, mcl_mobitems, mcl_fishing, mcl_bows, mcl_end, mcl_weather, playerphysics, mcl_wip diff --git a/mods/ITEMS/mcl_potions/potions.lua b/mods/ITEMS/mcl_potions/potions.lua deleted file mode 100644 index 3d89d1d409..0000000000 --- a/mods/ITEMS/mcl_potions/potions.lua +++ /dev/null @@ -1,728 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) ---local brewhelp = S("Try different combinations to create potions.") - -local function potion_image(colorstring, opacity) - if not opacity then - opacity = 127 - end - return "mcl_potions_potion_overlay.png^[colorize:"..colorstring..":"..tostring(opacity).."^mcl_potions_potion_bottle.png" -end - -local how_to_drink = S("Use the “Place” key to drink it.") -local potion_intro = S("Drinking a potion gives you a particular effect.") - -local function time_string(dur) - if not dur then - return nil - end - return math.floor(dur/60)..string.format(":%02d",math.floor(dur % 60)) -end -local function perc_string(num) - - local rem = math.floor((num-1.0)*100 + 0.1) % 5 - local out = math.floor((num-1.0)*100 + 0.1) - rem - - if (num - 1.0) < 0 then - return out.."%" - else - return "+"..out.."%" - end -end - - --- ██████╗░███████╗░██████╗░██╗░██████╗████████╗███████╗██████╗░ --- ██╔══██╗██╔════╝██╔════╝░██║██╔════╝╚══██╔══╝██╔════╝██╔══██╗ --- ██████╔╝█████╗░░██║░░██╗░██║╚█████╗░░░░██║░░░█████╗░░██████╔╝ --- ██╔══██╗██╔══╝░░██║░░╚██╗██║░╚═══██╗░░░██║░░░██╔══╝░░██╔══██╗ --- ██║░░██║███████╗╚██████╔╝██║██████╔╝░░░██║░░░███████╗██║░░██║ --- ╚═╝░░╚═╝╚══════╝░╚═════╝░╚═╝╚═════╝░░░░╚═╝░░░╚══════╝╚═╝░░╚═╝ --- --- ██████╗░░█████╗░████████╗██╗░█████╗░███╗░░██╗░██████╗ --- ██╔══██╗██╔══██╗╚══██╔══╝██║██╔══██╗████╗░██║██╔════╝ --- ██████╔╝██║░░██║░░░██║░░░██║██║░░██║██╔██╗██║╚█████╗░ --- ██╔═══╝░██║░░██║░░░██║░░░██║██║░░██║██║╚████║░╚═══██╗ --- ██║░░░░░╚█████╔╝░░░██║░░░██║╚█████╔╝██║░╚███║██████╔╝ --- ╚═╝░░░░░░╚════╝░░░░╚═╝░░░╚═╝░╚════╝░╚═╝░░╚══╝╚═════╝░ - - -function return_on_use(def, effect, dur) - return function (itemstack, user, pointed_thing) - if pointed_thing.type == "node" then - if user and not user:get_player_control().sneak then - -- Use pointed node's on_rightclick function first, if present - local node = minetest.get_node(pointed_thing.under) - if user and not user:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack - end - end - end - elseif pointed_thing.type == "object" then - return itemstack - end - - def.on_use(user, effect, dur) - local old_name, old_count = itemstack:get_name(), itemstack:get_count() - itemstack = minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) - if old_name ~= itemstack:get_name() or old_count ~= itemstack:get_count() then - mcl_potions._use_potion(itemstack, user, def.color) - end - return itemstack - end -end - - -local function register_potion(def) - - local dur = mcl_potions.DURATION - - if def.is_inv then - dur = dur * mcl_potions.INV_FACTOR - end - if def.name == "poison" or def.name == "regeneration" then - dur = 45 - end - - local on_use = nil - - if def.on_use then - on_use = return_on_use(def, def.effect, dur) - end - - local function get_tt(tt, effect, dur) - local _tt - if effect and def.is_dur then - _tt = perc_string(effect).." | "..time_string(dur) - if def.name == "poison" or def.name == "regeneration" then - _tt = S("1 HP/@1s | @2", effect, time_string(dur)) - end - elseif def.name == "healing" or def.name == "harming" then - _tt = S("@1 HP", effect) - else - _tt = tt or time_string(dur) or S("No effect") - end - return _tt - end - - local function get_splash_fun(effect, sp_dur) - if def.is_dur then - return function(player, redx) def.on_use(player, effect, sp_dur*redx) end - elseif def.effect then - return function(player, redx) def.on_use(player, effect*redx, sp_dur) end - end - -- covers case of no effect (water, awkward, mundane) - return function() end - end - - local function get_lingering_fun(effect, ling_dur) - if def.is_dur then - return function(player) def.on_use(player, effect, ling_dur) end - elseif def.effect then - return function(player) def.on_use(player, effect*0.5, ling_dur) end - end - -- covers case of no effect (water, awkward, mundane) - return function() end - end - - local function get_arrow_fun(effect, dur) - if def.is_dur then - return function(player) def.on_use(player, effect, dur) end - elseif def.effect then - return function(player) def.on_use(player, effect, dur) end - end - -- covers case of no effect (water, awkward, mundane) - return function() end - end - - local desc - if not def.no_potion then - if def.description_potion then - desc = def.description_potion - else - desc = S("@1 Potion", def.description) - end - else - desc = def.description - end - local potion_longdesc = def._longdesc - if not def.no_effect then - potion_longdesc = potion_intro .. "\n" .. def._longdesc - end - local potion_usagehelp - local basic_potion_tt - if def.name ~= "dragon_breath" then - potion_usagehelp = how_to_drink - basic_potion_tt = get_tt(def._tt, def.effect, dur) - end - - minetest.register_craftitem("mcl_potions:"..def.name, { - description = desc, - _tt_help = basic_potion_tt, - _doc_items_longdesc = potion_longdesc, - _doc_items_usagehelp = potion_usagehelp, - stack_max = def.stack_max or 1, - inventory_image = def.image or potion_image(def.color), - wield_image = def.image or potion_image(def.color), - groups = def.groups or {brewitem=1, food=3, can_eat_when_full=1 }, - on_place = on_use, - on_secondary_use = on_use, - }) - - -- Register Splash and Lingering - local splash_dur = dur * mcl_potions.SPLASH_FACTOR - local ling_dur = dur * mcl_potions.LINGERING_FACTOR - - local splash_def = { - tt = get_tt(def._tt, def.effect, splash_dur), - longdesc = def._longdesc, - potion_fun = get_splash_fun(def.effect, splash_dur), - no_effect = def.no_effect, - instant = def.instant, - } - - local ling_def - if def.name == "healing" or def.name == "harming" then - ling_def = { - tt = get_tt(def._tt, def.effect*mcl_potions.LINGERING_FACTOR, ling_dur), - longdesc = def._longdesc, - potion_fun = get_lingering_fun(def.effect*mcl_potions.LINGERING_FACTOR, ling_dur), - no_effect = def.no_effect, - instant = def.instant, - } - else - ling_def = { - tt = get_tt(def._tt, def.effect, ling_dur), - longdesc = def._longdesc, - potion_fun = get_lingering_fun(def.effect, ling_dur), - no_effect = def.no_effect, - instant = def.instant, - } - end - - local arrow_def = { - tt = get_tt(def._tt, def.effect, dur/8.), - longdesc = def._longdesc, - potion_fun = get_arrow_fun(def.effect, dur/8.), - no_effect = def.no_effect, - instant = def.instant, - } - - if def.color and not def.no_throwable then - local desc - if def.description_splash then - desc = def.description_splash - else - desc = S("Splash @1 Potion", def.description) - end - mcl_potions.register_splash(def.name, desc, def.color, splash_def) - if def.description_lingering then - desc = def.description_lingering - else - desc = S("Lingering @1 Potion", def.description) - end - mcl_potions.register_lingering(def.name, desc, def.color, ling_def) - if not def.no_arrow then - mcl_potions.register_arrow(def.name, S("Arrow of @1", def.description), def.color, arrow_def) - end - end - - if def.is_II then - - local desc_mod = S(" II") - - local effect_II - if def.name == "healing" or def.name == "harming" then - effect_II = def.effect*mcl_potions.II_FACTOR - elseif def.name == "poison" or def.name == "regeneration" then - effect_II = 1.2 - else - effect_II = def.effect^mcl_potions.II_FACTOR - end - - local dur_2 = dur / mcl_potions.II_FACTOR - if def.name == "poison" then dur_2 = dur_2 - 1 end - - if def.name == "slowness" then - dur_2 = 20 - effect_II = 0.40 - desc_mod = S(" IV") - end - - on_use = return_on_use(def, effect_II, dur_2) - - minetest.register_craftitem("mcl_potions:"..def.name.."_2", { - description = S("@1 Potion@2", def.description, desc_mod), - _tt_help = get_tt(def._tt_2, effect_II, dur_2), - _doc_items_longdesc = potion_longdesc, - _doc_items_usagehelp = potion_usagehelp, - stack_max = def.stack_max or 1, - inventory_image = def.image or potion_image(def.color), - wield_image = def.image or potion_image(def.color), - groups = def.groups or {brewitem=1, food=3, can_eat_when_full=1}, - on_place = on_use, - on_secondary_use = on_use, - }) - - -- Register Splash and Lingering - local splash_dur_2 = dur_2 * mcl_potions.SPLASH_FACTOR - local ling_dur_2 = dur_2 * mcl_potions.LINGERING_FACTOR - - local splash_def_2 - if def.name == "healing" then - splash_def_2 = { - tt = get_tt(def._tt_2, 7, splash_dur_2), - longdesc = def._longdesc, - potion_fun = get_splash_fun(7, splash_dur_2), - no_effect = def.no_effect, - instant = def.instant, - } - else - splash_def_2 = { - tt = get_tt(def._tt_2, effect_II, splash_dur_2), - longdesc = def._longdesc, - potion_fun = get_splash_fun(effect_II, splash_dur_2), - no_effect = def.no_effect, - instant = def.instant, - } - end - - - local ling_def_2 - if def.name == "healing" or def.name == "harming" then - ling_def_2 = { - tt = get_tt(def._tt_2, effect_II*mcl_potions.LINGERING_FACTOR, ling_dur_2), - longdesc = def._longdesc, - potion_fun = get_lingering_fun(effect_II*mcl_potions.LINGERING_FACTOR, ling_dur_2), - no_effect = def.no_effect, - instant = def.instant, - } - else - ling_def_2 = { - tt = get_tt(def._tt_2, effect_II, ling_dur_2), - longdesc = def._longdesc, - potion_fun = get_lingering_fun(effect_II, ling_dur_2), - no_effect = def.no_effect, - instant = def.instant, - } - end - - local arrow_def_2 = { - tt = get_tt(def._tt_2, effect_II, dur_2/8.), - longdesc = def._longdesc, - potion_fun = get_arrow_fun(effect_II, dur_2/8.), - no_effect = def.no_effect, - instant = def.instant, - } - - if def.color and not def.no_throwable then - mcl_potions.register_splash(def.name.."_2", S("Splash @1@2 Potion", def.description, desc_mod), def.color, splash_def_2) - mcl_potions.register_lingering(def.name.."_2", S("Lingering @1@2 Potion", def.description, desc_mod), def.color, ling_def_2) - if not def.no_arrow then - mcl_potions.register_arrow(def.name.."_2", S("Arrow of @1@2", def.description, desc_mod), def.color, arrow_def_2) - end - end - - end - - if def.is_plus then - - local dur_pl = dur * mcl_potions.PLUS_FACTOR - if def.name == "poison" or def.name == "regeneration" then - dur_pl = 90 - end - - on_use = return_on_use(def, def.effect, dur_pl) - - minetest.register_craftitem("mcl_potions:"..def.name.."_plus", { - description = S("@1 + Potion", def.description), - _tt_help = get_tt(def._tt_plus, def.effect, dur_pl), - _doc_items_longdesc = potion_longdesc, - _doc_items_usagehelp = potion_usagehelp, - stack_max = 1, - inventory_image = def.image or potion_image(def.color), - wield_image = def.image or potion_image(def.color), - groups = def.groups or {brewitem=1, food=3, can_eat_when_full=1}, - on_place = on_use, - on_secondary_use = on_use, - }) - - -- Register Splash - local splash_dur_pl = dur_pl * mcl_potions.SPLASH_FACTOR - local ling_dur_pl = dur_pl * mcl_potions.LINGERING_FACTOR - - local splash_def_pl = { - tt = get_tt(def._tt_plus, def.effect, splash_dur_pl), - longdesc = def._longdesc, - potion_fun = get_splash_fun(def.effect, splash_dur_pl), - no_effect = def.no_effect, - instant = def.instant, - } - local ling_def_pl = { - tt = get_tt(def._tt_plus, def.effect, ling_dur_pl), - longdesc = def._longdesc, - potion_fun = get_lingering_fun(def.effect, ling_dur_pl), - no_effect = def.no_effect, - instant = def.instant, - } - local arrow_def_pl = { - tt = get_tt(def._tt_pl, def.effect, dur_pl/8.), - longdesc = def._longdesc, - potion_fun = get_arrow_fun(def.effect, dur_pl/8.), - no_effect = def.no_effect, - instant = def.instant, - } - if def.color and not def.no_throwable then - mcl_potions.register_splash(def.name.."_plus", S("Splash @1 + Potion", def.description), def.color, splash_def_pl) - mcl_potions.register_lingering(def.name.."_plus", S("Lingering @1 + Potion", def.description), def.color, ling_def_pl) - if not def.no_arrow then - mcl_potions.register_arrow(def.name.."_plus", S("Arrow of @1 +", def.description), def.color, arrow_def_pl) - end - end - - end - -end - - --- ██████╗░░█████╗░████████╗██╗░█████╗░███╗░░██╗ --- ██╔══██╗██╔══██╗╚══██╔══╝██║██╔══██╗████╗░██║ --- ██████╔╝██║░░██║░░░██║░░░██║██║░░██║██╔██╗██║ --- ██╔═══╝░██║░░██║░░░██║░░░██║██║░░██║██║╚████║ --- ██║░░░░░╚█████╔╝░░░██║░░░██║╚█████╔╝██║░╚███║ --- ╚═╝░░░░░░╚════╝░░░░╚═╝░░░╚═╝░╚════╝░╚═╝░░╚══╝ --- --- ██████╗░███████╗███████╗██╗███╗░░██╗██╗████████╗██╗░█████╗░███╗░░██╗░██████╗ --- ██╔══██╗██╔════╝██╔════╝██║████╗░██║██║╚══██╔══╝██║██╔══██╗████╗░██║██╔════╝ --- ██║░░██║█████╗░░█████╗░░██║██╔██╗██║██║░░░██║░░░██║██║░░██║██╔██╗██║╚█████╗░ --- ██║░░██║██╔══╝░░██╔══╝░░██║██║╚████║██║░░░██║░░░██║██║░░██║██║╚████║░╚═══██╗ --- ██████╔╝███████╗██║░░░░░██║██║░╚███║██║░░░██║░░░██║╚█████╔╝██║░╚███║██████╔╝ --- ╚═════╝░╚══════╝╚═╝░░░░░╚═╝╚═╝░░╚══╝╚═╝░░░╚═╝░░░╚═╝░╚════╝░╚═╝░░╚══╝╚═════╝░ - - -local awkward_def = { - name = "awkward", - description_potion = S("Awkward Potion"), - description_splash = S("Awkward Splash Potion"), - description_lingering = S("Awkward Lingering Potion"), - no_arrow = true, - no_effect = true, - _tt = S("No effect"), - _longdesc = S("Has an awkward taste and is used for brewing potions."), - color = "#0000FF", - groups = {brewitem=1, food=3, can_eat_when_full=1}, - on_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), -} - -local mundane_def = { - name = "mundane", - description_potion = S("Mundane Potion"), - description_splash = S("Mundane Splash Potion"), - description_lingering = S("Mundane Lingering Potion"), - no_arrow = true, - no_effect = true, - _tt = S("No effect"), - _longdesc = S("Has a terrible taste and is not useful for brewing potions."), - color = "#0000FF", - on_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), -} - -local thick_def = { - name = "thick", - description_potion = S("Thick Potion"), - description_splash = S("Thick Splash Potion"), - description_lingering = S("Thick Lingering Potion"), - no_arrow = true, - no_effect = true, - _tt = S("No effect"), - _longdesc = S("Has a bitter taste and is not useful for brewing potions."), - color = "#0000FF", - on_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), -} - -local dragon_breath_def = { - name = "dragon_breath", - description = S("Dragon's Breath"), - no_arrow = true, - no_potion = true, - no_throwable = true, - no_effect = true, - _longdesc = S("This item is used in brewing and can be combined with splash potions to create lingering potions."), - image = "mcl_potions_dragon_breath.png", - groups = { brewitem = 1 }, - on_use = nil, - stack_max = 64, -} - -local healing_def = { - name = "healing", - description = S("Healing"), - _tt = S("+4 HP"), - _tt_2 = S("+8 HP"), - _longdesc = S("Instantly heals."), - color = "#F82423", - effect = 4, - instant = true, - on_use = mcl_potions.healing_func, - is_II = true, -} - - -local harming_def = { - name = "harming", - description = S("Harming"), - _tt = S("-6 HP"), - _tt_II = S("-12 HP"), - _longdesc = S("Instantly deals damage."), - color = "#430A09", - effect = -6, - instant = true, - on_use = mcl_potions.healing_func, - is_II = true, - is_inv = true, -} - -local night_vision_def = { - name = "night_vision", - description = S("Night Vision"), - _tt = nil, - _longdesc = S("Increases the perceived brightness of light under a dark sky."), - color = "#1F1FA1", - effect = nil, - is_dur = true, - on_use = mcl_potions.night_vision_func, - is_plus = true, -} - -local swiftness_def = { - name = "swiftness", - description = S("Swiftness"), - _tt = nil, - _longdesc = S("Increases walking speed."), - color = "#7CAFC6", - effect = 1.2, - is_dur = true, - on_use = mcl_potions.swiftness_func, - is_II = true, - is_plus = true, -} - -local slowness_def = { - name = "slowness", - description = S("Slowness"), - _tt = nil, - _longdesc = S("Decreases walking speed."), - color = "#5A6C81", - effect = 0.85, - is_dur = true, - on_use = mcl_potions.swiftness_func, - is_II = true, - is_plus = true, - is_inv = true, -} - -local leaping_def = { - name = "leaping", - description = S("Leaping"), - _tt = nil, - _longdesc = S("Increases jump strength."), - color = "#22FF4C", - effect = 1.15, - is_dur = true, - on_use = mcl_potions.leaping_func, - is_II = true, - is_plus = true, -} - -local poison_def = { - name = "poison", - description = S("Poison"), - _tt = nil, - _longdesc = S("Applies the poison effect which deals damage at a regular interval."), - color = "#4E9331", - effect = 2.5, - is_dur = true, - on_use = mcl_potions.poison_func, - is_II = true, - is_plus = true, - is_inv = true, -} - -local regeneration_def = { - name = "regeneration", - description = S("Regeneration"), - _tt = nil, - _longdesc = S("Regenerates health over time."), - color = "#CD5CAB", - effect = 2.5, - is_dur = true, - on_use = mcl_potions.regeneration_func, - is_II = true, - is_plus = true, -} - -local invisibility_def = { - name = "invisibility", - description = S("Invisibility"), - _tt = nil, - _longdesc = S("Grants invisibility."), - color = "#7F8392", - is_dur = true, - on_use = mcl_potions.invisiblility_func, - is_plus = true, -} - -local water_breathing_def = { - name = "water_breathing", - description = S("Water Breathing"), - _tt = nil, - _longdesc = S("Grants limitless breath underwater."), - color = "#2E5299", - is_dur = true, - on_use = mcl_potions.water_breathing_func, - is_plus = true, -} - -local fire_resistance_def = { - name = "fire_resistance", - description = S("Fire Resistance"), - _tt = nil, - _longdesc = S("Grants immunity to damage from heat sources like fire."), - color = "#E49A3A", - is_dur = true, - on_use = mcl_potions.fire_resistance_func, - is_plus = true, -} - - - -local defs = { awkward_def, mundane_def, thick_def, dragon_breath_def, - healing_def, harming_def, night_vision_def, swiftness_def, - slowness_def, leaping_def, poison_def, regeneration_def, - invisibility_def, water_breathing_def, fire_resistance_def} - -for _, def in ipairs(defs) do - register_potion(def) -end - - - - --- minetest.register_craftitem("mcl_potions:weakness", { --- description = S("Weakness"), --- _tt_help = TODO, --- _doc_items_longdesc = brewhelp, --- wield_image = potion_image("#484D48"), --- inventory_image = potion_image("#484D48"), --- groups = { brewitem=1, food=3, can_eat_when_full=1 }, --- stack_max = 1, --- --- on_place = function(itemstack, user, pointed_thing) --- mcl_potions.weakness_func(user, -4, mcl_potions.DURATION*mcl_potions.INV_FACTOR) --- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) --- mcl_potions._use_potion(itemstack, user, "#484D48") --- return itemstack --- end, --- --- on_secondary_use = function(itemstack, user, pointed_thing) --- mcl_potions.weakness_func(user, -4, mcl_potions.DURATION*mcl_potions.INV_FACTOR) --- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) --- mcl_potions._use_potion(itemstack, user, "#484D48") --- return itemstack --- end --- }) --- --- minetest.register_craftitem("mcl_potions:weakness_plus", { --- description = S("Weakness +"), --- _tt_help = TODO, --- _doc_items_longdesc = brewhelp, --- wield_image = potion_image("#484D48"), --- inventory_image = potion_image("#484D48"), --- groups = { brewitem=1, food=3, can_eat_when_full=1 }, --- stack_max = 1, --- --- on_place = function(itemstack, user, pointed_thing) --- mcl_potions.weakness_func(user, -4, mcl_potions.DURATION_2*mcl_potions.INV_FACTOR) --- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) --- mcl_potions._use_potion(itemstack, user, "#484D48") --- return itemstack --- end, --- --- on_secondary_use = function(itemstack, user, pointed_thing) --- mcl_potions.weakness_func(user, -4, mcl_potions.DURATION_2*mcl_potions.INV_FACTOR) --- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) --- mcl_potions._use_potion(itemstack, user, "#484D48") --- return itemstack --- end --- }) --- --- minetest.register_craftitem("mcl_potions:strength", { --- description = S("Strength"), --- _tt_help = TODO, --- _doc_items_longdesc = brewhelp, --- wield_image = potion_image("#932423"), --- inventory_image = potion_image("#932423"), --- groups = { brewitem=1, food=3, can_eat_when_full=1 }, --- stack_max = 1, --- --- on_place = function(itemstack, user, pointed_thing) --- mcl_potions.weakness_func(user, 3, mcl_potions.DURATION) --- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) --- mcl_potions._use_potion(itemstack, user, "#932423") --- return itemstack --- end, --- --- on_secondary_use = function(itemstack, user, pointed_thing) --- mcl_potions.weakness_func(user, 3, mcl_potions.DURATION) --- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) --- mcl_potions._use_potion(itemstack, user, "#932423") --- return itemstack --- end --- }) --- --- minetest.register_craftitem("mcl_potions:strength_2", { --- description = S("Strength II"), --- _tt_help = TODO, --- _doc_items_longdesc = brewhelp, --- wield_image = potion_image("#932423"), --- inventory_image = potion_image("#932423"), --- groups = { brewitem=1, food=3, can_eat_when_full=1 }, --- stack_max = 1, --- --- on_place = function(itemstack, user, pointed_thing) --- mcl_potions.weakness_func(user, 6, mcl_potions.DURATION_2) --- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) --- mcl_potions._use_potion(itemstack, user, "#932423") --- return itemstack --- end, --- --- on_secondary_use = function(itemstack, user, pointed_thing) --- mcl_potions.weakness_func(user, 6, mcl_potions.DURATION_2) --- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) --- mcl_potions._use_potion(itemstack, user, "#932423") --- return itemstack --- end --- }) --- --- minetest.register_craftitem("mcl_potions:strength_plus", { --- description = S("Strength +"), --- _tt_help = TODO, --- _doc_items_longdesc = brewhelp, --- wield_image = potion_image("#932423"), --- inventory_image = potion_image("#932423"), --- groups = { brewitem=1, food=3, can_eat_when_full=1 }, --- stack_max = 1, --- --- on_place = function(itemstack, user, pointed_thing) --- mcl_potions.weakness_func(user, 3, mcl_potions.DURATION_PLUS) --- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) --- mcl_potions._use_potion(itemstack, user, "#932423") --- return itemstack --- end, --- --- on_secondary_use = function(itemstack, user, pointed_thing) --- mcl_potions.weakness_func(user, 3, mcl_potions.DURATION_PLUS) --- minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) --- mcl_potions._use_potion(itemstack, user, "#932423") --- return itemstack --- end --- }) diff --git a/mods/ITEMS/mcl_potions/sounds/mcl_potions_bottle_fill.ogg b/mods/ITEMS/mcl_potions/sounds/mcl_potions_bottle_fill.ogg deleted file mode 100644 index c78bfee1e8..0000000000 Binary files a/mods/ITEMS/mcl_potions/sounds/mcl_potions_bottle_fill.ogg and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/sounds/mcl_potions_bottle_pour.ogg b/mods/ITEMS/mcl_potions/sounds/mcl_potions_bottle_pour.ogg deleted file mode 100644 index 8acc0c150f..0000000000 Binary files a/mods/ITEMS/mcl_potions/sounds/mcl_potions_bottle_pour.ogg and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/sounds/mcl_potions_breaking_glass.ogg b/mods/ITEMS/mcl_potions/sounds/mcl_potions_breaking_glass.ogg deleted file mode 100755 index 4cb7b5a0d4..0000000000 Binary files a/mods/ITEMS/mcl_potions/sounds/mcl_potions_breaking_glass.ogg and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/sounds/mcl_potions_drinking.ogg b/mods/ITEMS/mcl_potions/sounds/mcl_potions_drinking.ogg deleted file mode 100644 index 6e3978d292..0000000000 Binary files a/mods/ITEMS/mcl_potions/sounds/mcl_potions_drinking.ogg and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/splash.lua b/mods/ITEMS/mcl_potions/splash.lua deleted file mode 100644 index 730796952a..0000000000 --- a/mods/ITEMS/mcl_potions/splash.lua +++ /dev/null @@ -1,132 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) -local GRAVITY = tonumber(minetest.settings:get("movement_gravity")) - -local mod_target = minetest.get_modpath("mcl_target") - -local function splash_image(colorstring, opacity) - if not opacity then - opacity = 127 - end - return "mcl_potions_splash_overlay.png^[colorize:"..colorstring..":"..tostring(opacity).."^mcl_potions_splash_bottle.png" -end - - -function mcl_potions.register_splash(name, descr, color, def) - local id = "mcl_potions:"..name.."_splash" - local longdesc = def.longdesc - if not def.no_effect then - longdesc = S("A throwable potion that will shatter on impact, where it gives all nearby players and mobs a status effect.") - if def.longdesc then - longdesc = longdesc .. "\n" .. def.longdesc - end - end - minetest.register_craftitem(id, { - description = descr, - _tt_help = def.tt, - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = S("Use the “Punch” key to throw it."), - inventory_image = splash_image(color), - groups = {brewitem=1, not_in_creative_inventory=0}, - on_use = function(item, placer, pointed_thing) - local velocity = 10 - local dir = placer:get_look_dir(); - local pos = placer:get_pos(); - minetest.sound_play("mcl_throwing_throw", {pos = pos, gain = 0.4, max_hear_distance = 16}, true) - local obj = minetest.add_entity({x=pos.x+dir.x,y=pos.y+2+dir.y,z=pos.z+dir.z}, id.."_flying") - obj:set_velocity({x=dir.x*velocity,y=dir.y*velocity,z=dir.z*velocity}) - obj:set_acceleration({x=dir.x*-3, y=-9.8, z=dir.z*-3}) - obj:get_luaentity()._thrower = placer:get_player_name() - if not minetest.is_creative_enabled(placer:get_player_name()) then - item:take_item() - end - return item - end, - stack_max = 1, - _on_dispense = function(stack, dispenserpos, droppos, dropnode, dropdir) - local s_pos = vector.add(dispenserpos, vector.multiply(dropdir, 0.51)) - local pos = {x=s_pos.x+dropdir.x,y=s_pos.y+dropdir.y,z=s_pos.z+dropdir.z} - minetest.sound_play("mcl_throwing_throw", {pos = pos, gain = 0.4, max_hear_distance = 16}, true) - local obj = minetest.add_entity(pos, id.."_flying") - local velocity = 22 - obj:set_velocity({x=dropdir.x*velocity,y=dropdir.y*velocity,z=dropdir.z*velocity}) - obj:set_acceleration({x=dropdir.x*-3, y=-9.8, z=dropdir.z*-3}) - end - }) - - local w = 0.7 - - minetest.register_entity(id.."_flying",{ - textures = {splash_image(color)}, - hp_max = 1, - visual_size = {x=w/2,y=w/2}, - collisionbox = {-0.1,-0.1,-0.1,0.1,0.1,0.1}, - pointable = false, - on_step = function(self, dtime) - local pos = self.object:get_pos() - local node = minetest.get_node(pos) - local n = node.name - local g = minetest.get_item_group(n, "liquid") - local d = 0.1 - local redux_map = {7/8,0.5,0.25} - if mod_target and n == "mcl_target:target_off" then - mcl_target.hit(vector.round(pos), 0.4) --4 redstone ticks - end - if n ~= "air" and n ~= "mcl_portals:portal" and n ~= "mcl_portals:portal_end" and g == 0 or mcl_potions.is_obj_hit(self, pos) then - minetest.sound_play("mcl_potions_breaking_glass", {pos = pos, max_hear_distance = 16, gain = 1}) - local texture, acc - if name == "water" then - texture = "mcl_particles_droplet_bottle.png" - acc = {x=0, y=-GRAVITY, z=0} - else - if def.instant then - texture = "mcl_particles_instant_effect.png" - else - texture = "mcl_particles_effect.png" - end - acc = {x=0, y=0, z=0} - end - minetest.add_particlespawner({ - amount = 50, - time = 0.1, - minpos = {x=pos.x-d, y=pos.y+0.5, z=pos.z-d}, - maxpos = {x=pos.x+d, y=pos.y+0.5+d, z=pos.z+d}, - minvel = {x=-2, y=0, z=-2}, - maxvel = {x=2, y=2, z=2}, - minacc = acc, - maxacc = acc, - minexptime = 0.5, - maxexptime = 1.25, - minsize = 1, - maxsize = 2, - collisiondetection = true, - vertical = false, - texture = texture.."^[colorize:"..color..":127" - }) - - if name == "water" then - mcl_potions._extinguish_nearby_fire(pos) - end - self.object:remove() - for _,obj in pairs(minetest.get_objects_inside_radius(pos, 4)) do - - local entity = obj:get_luaentity() - if obj:is_player() or entity.is_mob then - - local pos2 = obj:get_pos() - local rad = math.floor(math.sqrt((pos2.x-pos.x)^2 + (pos2.y-pos.y)^2 + (pos2.z-pos.z)^2)) - if rad > 0 then - def.potion_fun(obj, redux_map[rad]) - else - def.potion_fun(obj, 1) - end - end - end - - end - end, - }) -end - ---[[local function time_string(dur) - return math.floor(dur/60)..string.format(":%02d",math.floor(dur % 60)) -end]] diff --git a/mods/ITEMS/mcl_potions/textures/hbhunger_icon_regen_poison.png b/mods/ITEMS/mcl_potions/textures/hbhunger_icon_regen_poison.png deleted file mode 100644 index d4fe9b4e07..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/hbhunger_icon_regen_poison.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/hudbars_icon_regenerate.png b/mods/ITEMS/mcl_potions/textures/hudbars_icon_regenerate.png deleted file mode 100644 index 4ae2598971..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/hudbars_icon_regenerate.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_arrow_inv.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_arrow_inv.png deleted file mode 100644 index 4bda14bd58..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_arrow_inv.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_dragon_breath.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_dragon_breath.png deleted file mode 100644 index c5bbddbfae..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_dragon_breath.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_fire_proof.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_fire_proof.png deleted file mode 100644 index f5df4dab63..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_fire_proof.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_food_poisoning.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_food_poisoning.png deleted file mode 100644 index 2490b0cfbf..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_food_poisoning.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_invisible.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_invisible.png deleted file mode 100644 index ffefb89bfb..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_invisible.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_leaping.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_leaping.png deleted file mode 100644 index 5614729bad..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_leaping.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_night_vision.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_night_vision.png deleted file mode 100644 index 579defa710..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_night_vision.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_poisoned.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_poisoned.png deleted file mode 100644 index 1b96ef2d9f..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_poisoned.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_regenerating.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_regenerating.png deleted file mode 100644 index 634b74fada..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_regenerating.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_slow.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_slow.png deleted file mode 100644 index 1869a58ffb..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_slow.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_strong.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_strong.png deleted file mode 100644 index 2a69bd4a80..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_strong.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_swift.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_swift.png deleted file mode 100644 index 8ae960cc91..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_swift.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_water_breathing.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_water_breathing.png deleted file mode 100644 index d68983b5af..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_water_breathing.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_weak.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_weak.png deleted file mode 100644 index 9ac3985e23..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_effect_weak.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_lingering_bottle.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_lingering_bottle.png deleted file mode 100644 index 431fe5bc67..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_lingering_bottle.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_melon_speckled.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_melon_speckled.png deleted file mode 100644 index cd2d43581f..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_melon_speckled.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_potion_bottle.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_potion_bottle.png deleted file mode 100644 index 66d6424bfd..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_potion_bottle.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_potion_overlay.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_potion_overlay.png deleted file mode 100644 index 9bef3d93bf..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_potion_overlay.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_spider_eye_fermented.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_spider_eye_fermented.png deleted file mode 100644 index 82af0549bd..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_spider_eye_fermented.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_splash_bottle.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_splash_bottle.png deleted file mode 100644 index 17a69a8b62..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_splash_bottle.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_splash_overlay.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_splash_overlay.png deleted file mode 100644 index 9acbce6cda..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_splash_overlay.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/tipped_arrow.lua b/mods/ITEMS/mcl_potions/tipped_arrow.lua deleted file mode 100644 index e6da04dff5..0000000000 --- a/mods/ITEMS/mcl_potions/tipped_arrow.lua +++ /dev/null @@ -1,473 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -local mod_target = minetest.get_modpath("mcl_target") - -local math = math - --- Time in seconds after which a stuck arrow is deleted -local ARROW_TIMEOUT = 60 --- Time after which stuck arrow is rechecked for being stuck -local STUCK_RECHECK_TIME = 5 - ---local GRAVITY = 9.81 - -local YAW_OFFSET = -math.pi/2 - -local function dir_to_pitch(dir) - --local dir2 = vector.normalize(dir) - local xz = math.abs(dir.x) + math.abs(dir.z) - return -math.atan2(-dir.y, xz) -end - -local function arrow_image(colorstring, opacity) - if not opacity then - opacity = 127 - end - return {"mcl_bows_arrow.png^(mcl_bows_arrow_overlay.png^[colorize:"..colorstring..":"..tostring(opacity)..")"} -end - -local how_to_shoot = minetest.registered_items["mcl_bows:arrow"]._doc_items_usagehelp - -local mod_awards = minetest.get_modpath("awards") and minetest.get_modpath("mcl_achievements") -local mod_button = minetest.get_modpath("mesecons_button") - -local arrow_longdesc = minetest.registered_items["mcl_bows:arrow"]._doc_items_longdesc or "" -local arrow_tt = minetest.registered_items["mcl_bows:arrow"]._tt_help or "" - -function mcl_potions.register_arrow(name, desc, color, def) - - local longdesc = def.longdesc or "" - minetest.register_craftitem("mcl_potions:"..name.."_arrow", { - description = desc, - _tt_help = arrow_tt .. "\n" .. def.tt, - _doc_items_longdesc = arrow_longdesc .. "\n" .. - S("This particular arrow is tipped and will give an effect when it hits a player or mob.") .. "\n" .. - longdesc, - _doc_items_usagehelp = how_to_shoot, - inventory_image = "mcl_bows_arrow_inv.png^(mcl_potions_arrow_inv.png^[colorize:"..color..":100)", - groups = { ammo=1, ammo_bow=1, brewitem=1}, - _on_dispense = function(itemstack, dispenserpos, droppos, dropnode, dropdir) - -- Shoot arrow - local shootpos = vector.add(dispenserpos, vector.multiply(dropdir, 0.51)) - local yaw = math.atan2(dropdir.z, dropdir.x) + YAW_OFFSET - mcl_bows.shoot_arrow(itemstack:get_name(), shootpos, dropdir, yaw, nil, 19, 3) - end, - }) - - - -- This is a fake node, used as model for the arrow entity. - -- It's not supposed to be usable as item or real node. - -- TODO: Use a proper mesh for the arrow entity - minetest.register_node("mcl_potions:"..name.."_arrow_box", { - drawtype = "nodebox", - is_ground_content = false, - node_box = { - type = "fixed", - fixed = { - -- Shaft - {-6.5/17, -1.5/17, -1.5/17, -4.5/17, 1.5/17, 1.5/17}, - {-4.5/17, -0.5/17, -0.5/17, 5.5/17, 0.5/17, 0.5/17}, - {5.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17}, - -- Tip - {-4.5/17, 2.5/17, 2.5/17, -3.5/17, -2.5/17, -2.5/17}, - {-8.5/17, 0.5/17, 0.5/17, -6.5/17, -0.5/17, -0.5/17}, - -- Fletching - {6.5/17, 1.5/17, 1.5/17, 7.5/17, 2.5/17, 2.5/17}, - {7.5/17, -2.5/17, 2.5/17, 6.5/17, -1.5/17, 1.5/17}, - {7.5/17, 2.5/17, -2.5/17, 6.5/17, 1.5/17, -1.5/17}, - {6.5/17, -1.5/17, -1.5/17, 7.5/17, -2.5/17, -2.5/17}, - - {7.5/17, 2.5/17, 2.5/17, 8.5/17, 3.5/17, 3.5/17}, - {8.5/17, -3.5/17, 3.5/17, 7.5/17, -2.5/17, 2.5/17}, - {8.5/17, 3.5/17, -3.5/17, 7.5/17, 2.5/17, -2.5/17}, - {7.5/17, -2.5/17, -2.5/17, 8.5/17, -3.5/17, -3.5/17}, - } - }, - tiles = arrow_image(color, 100), - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - groups = {not_in_creative_inventory=1, dig_immediate=3}, - drop = "", - node_placement_prediction = "", - on_construct = function(pos) - minetest.log("error", "[mcl_potions] Trying to construct mcl_potions:"..name.."arrow_box at "..minetest.pos_to_string(pos)) - minetest.remove_node(pos) - end, - }) - - - local ARROW_ENTITY={ - physical = true, - visual = "mesh", - mesh = "mcl_bows_arrow.obj", - visual_size = {x=-1, y=1}, - textures = arrow_image(color, 100), - collisionbox = {-0.19, -0.125, -0.19, 0.19, 0.125, 0.19}, - collide_with_objects = false, - - _lastpos={}, - _startpos=nil, - _damage=1, -- Damage on impact - _stuck=false, -- Whether arrow is stuck - _stucktimer=nil,-- Amount of time (in seconds) the arrow has been stuck so far - _stuckrechecktimer=nil,-- An additional timer for periodically re-checking the stuck status of an arrow - _stuckin=nil, --Position of node in which arow is stuck. - _shooter=nil, -- ObjectRef of player or mob who shot it - - _viscosity=0, -- Viscosity of node the arrow is currently in - _deflection_cooloff=0, -- Cooloff timer after an arrow deflection, to prevent many deflections in quick succession - } - - -- Destroy arrow entity self at pos and drops it as an item - local function spawn_item(self, pos) - if not minetest.is_creative_enabled("") then - local item = minetest.add_item(pos, "mcl_potions:"..name.."_arrow") - item:set_velocity({x=0, y=0, z=0}) - item:set_yaw(self.object:get_yaw()) - end - self.object:remove() - end - - function ARROW_ENTITY.on_step(self, dtime) - local pos = self.object:get_pos() - local dpos = table.copy(pos) -- digital pos - dpos = vector.round(dpos) - local node = minetest.get_node(dpos) - - if self._stuck then - self._stucktimer = self._stucktimer + dtime - self._stuckrechecktimer = self._stuckrechecktimer + dtime - if self._stucktimer > ARROW_TIMEOUT then - self.object:remove() - return - end - -- Drop arrow as item when it is no longer stuck - -- FIXME: Arrows are a bit slow to react and continue to float in mid air for a few seconds. - if self._stuckrechecktimer > STUCK_RECHECK_TIME then - local stuckin_def - if self._stuckin then - stuckin_def = minetest.registered_nodes[minetest.get_node(self._stuckin).name] - end - -- TODO: In MC, arrow just falls down without turning into an item - if stuckin_def and stuckin_def.walkable == false then - spawn_item(self, pos) - return - end - self._stuckrechecktimer = 0 - end - -- Pickup arrow if player is nearby (not in Creative Mode) - local objects = minetest.get_objects_inside_radius(pos, 1) - for _,obj in ipairs(objects) do - if obj:is_player() then - if not minetest.is_creative_enabled(obj:get_player_name()) then - if obj:get_inventory():room_for_item("main", "mcl_potions:"..name.."_arrow") then - obj:get_inventory():add_item("main", "mcl_potions:"..name.."_arrow") - minetest.sound_play("item_drop_pickup", { - pos = pos, - max_hear_distance = 16, - gain = 1.0, - }, true) - end - end - self.object:remove() - return - end - end - - -- Check for object "collision". Done every tick (hopefully this is not too stressing) - else - - if self._damage == 10 or self._damage == 9 then - minetest.add_particlespawner({ - amount = 1, - time = .001, - minpos = pos, - maxpos = pos, - minvel = vector.new(-0.1,-0.1,-0.1), - maxvel = vector.new(0.1,0.1,0.1), - minexptime = 0.5, - maxexptime = 0.5, - minsize = 2, - maxsize = 2, - collisiondetection = false, - vertical = false, - texture = "mobs_mc_arrow_particle.png", - glow = 1, - }) - end - -- We just check for any hurtable objects nearby. - -- The radius of 3 is fairly liberal, but anything lower than than will cause - -- arrow to hilariously go through mobs often. - -- TODO: Implement an ACTUAL collision detection (engine support needed). - local objs = minetest.get_objects_inside_radius(pos, 1.5) - local closest_object - local closest_distance - - if self._deflection_cooloff > 0 then - self._deflection_cooloff = self._deflection_cooloff - dtime - end - - -- Iterate through all objects and remember the closest attackable object - for k, obj in pairs(objs) do - local ok = false - -- Arrows can only damage players and mobs - if obj ~= self._shooter and obj:is_player() then - ok = true - elseif obj:get_luaentity() then - if obj ~= self._shooter and obj:get_luaentity().is_mob then - ok = true - end - end - - if ok then - local dist = vector.distance(pos, obj:get_pos()) - if not closest_object or not closest_distance then - closest_object = obj - closest_distance = dist - elseif dist < closest_distance then - closest_object = obj - closest_distance = dist - end - end - end - - -- If an attackable object was found, we will damage the closest one only - if closest_object then - local obj = closest_object - local is_player = obj:is_player() - local lua = obj:get_luaentity() - if obj ~= self._shooter and (is_player or (lua and lua.is_mob)) then - - if obj:get_hp() > 0 then - -- Check if there is no solid node between arrow and object - local ray = minetest.raycast(self.object:get_pos(), obj:get_pos(), true) - for pointed_thing in ray do - if pointed_thing.type == "object" and pointed_thing.ref == closest_object then - -- Target reached! We can proceed now. - break - elseif pointed_thing.type == "node" then - local nn = minetest.get_node(minetest.get_pointed_thing_position(pointed_thing)).name - local nodedef = minetest.registered_nodes[nn] - if (not nodedef) or nodedef.walkable then - -- There's a node in the way. Delete arrow without damage - self.object:remove() - return - end - end - end - - -- Punch target object but avoid hurting enderman. - if lua then - if lua.name ~= "mobs_mc:enderman" then - obj:punch(self.object, 1.0, { - full_punch_interval=1.0, - damage_groups={fleshy=self._damage}, - }, nil) - def.potion_fun(obj) - end - else - obj:punch(self.object, 1.0, { - full_punch_interval=1.0, - damage_groups={fleshy=self._damage}, - }, nil) - def.potion_fun(obj) - end - - if is_player then - if self._shooter and self._shooter:is_player() then - -- “Ding” sound for hitting another player - minetest.sound_play({name="mcl_bows_hit_player", gain=0.1}, {to_player=self._shooter}, true) - end - end - - if lua then - local entity_name = lua.name - -- Achievement for hitting skeleton, wither skeleton or stray (TODO) with an arrow at least 50 meters away - -- NOTE: Range has been reduced because mobs unload much earlier than that ... >_> - -- TODO: This achievement should be given for the kill, not just a hit - if self._shooter and self._shooter:is_player() and vector.distance(pos, self._startpos) >= 20 then - if mod_awards and (entity_name == "mobs_mc:skeleton" or entity_name == "mobs_mc:stray" or entity_name == "mobs_mc:witherskeleton") then - awards.unlock(self._shooter:get_player_name(), "mcl:snipeSkeleton") - end - end - end - end - self.object:remove() - return - end - end - end - - -- Check for node collision - if self._lastpos.x~=nil and not self._stuck then - local nodedef = minetest.registered_nodes[node.name] - local vel = self.object:get_velocity() - -- Arrow has stopped in one axis, so it probably hit something. - -- This detection is a bit clunky, but sadly, MT does not offer a direct collision detection for us. :-( - if (math.abs(vel.x) < 0.0001) or (math.abs(vel.z) < 0.0001) or (math.abs(vel.y) < 0.00001) then - -- Check for the node to which the arrow is pointing - local dir - if math.abs(vel.y) < 0.00001 then - if self._lastpos.y < pos.y then - dir = {x=0, y=1, z=0} - else - dir = {x=0, y=-1, z=0} - end - else - dir = minetest.facedir_to_dir(minetest.dir_to_facedir(minetest.yaw_to_dir(self.object:get_yaw()-YAW_OFFSET))) - end - self._stuckin = vector.add(dpos, dir) - local snode = minetest.get_node(self._stuckin) - local sdef = minetest.registered_nodes[snode.name] - - -- If node is non-walkable, unknown or ignore, don't make arrow stuck. - -- This causes a deflection in the engine. - if not sdef or sdef.walkable == false or snode.name == "ignore" then - self._stuckin = nil - if self._deflection_cooloff <= 0 then - -- Lose 1/3 of velocity on deflection - local newvel = vector.multiply(vel, 0.6667) - - self.object:set_velocity(newvel) - -- Reset deflection cooloff timer to prevent many deflections happening in quick succession - self._deflection_cooloff = 1.0 - end - else - - -- Node was walkable, make arrow stuck - self._stuck = true - self._stucktimer = 0 - self._stuckrechecktimer = 0 - - self.object:set_velocity({x=0, y=0, z=0}) - self.object:set_acceleration({x=0, y=0, z=0}) - - -- Activate target - if mod_target and snode.name == "mcl_target:target_off" then - mcl_target.hit(self._stuckin, 1) --10 redstone ticks - end - - -- Push the button! Push, push, push the button! - if mod_button and minetest.get_item_group(node.name, "button") > 0 and minetest.get_item_group(node.name, "button_push_by_arrow") == 1 then - local bdir = minetest.wallmounted_to_dir(node.param2) - -- Check the button orientation - if vector.equals(vector.add(dpos, bdir), self._stuckin) then - mesecon.push_button(dpos, node) - end - end - end - elseif (nodedef and nodedef.liquidtype ~= "none") then - -- Slow down arrow in liquids - local v = nodedef.liquid_viscosity - if not v then - v = 0 - end - --local old_v = self._viscosity - self._viscosity = v - local vpenalty = math.max(0.1, 0.98 - 0.1 * v) - if math.abs(vel.x) > 0.001 then - vel.x = vel.x * vpenalty - end - if math.abs(vel.z) > 0.001 then - vel.z = vel.z * vpenalty - end - self.object:set_velocity(vel) - end - end - - -- Update yaw - if not self._stuck then - local vel = self.object:get_velocity() - local yaw = minetest.dir_to_yaw(vel)+YAW_OFFSET - local pitch = dir_to_pitch(vel) - self.object:set_rotation({ x = 0, y = yaw, z = pitch }) - end - - -- Update internal variable - self._lastpos={x=pos.x, y=pos.y, z=pos.z} - end - - -- Force recheck of stuck arrows when punched. - -- Otherwise, punching has no effect. - function ARROW_ENTITY.on_punch(self) - if self._stuck then - self._stuckrechecktimer = STUCK_RECHECK_TIME - end - end - - function ARROW_ENTITY.get_staticdata(self) - local out = { - lastpos = self._lastpos, - startpos = self._startpos, - damage = self._damage, - stuck = self._stuck, - stuckin = self._stuckin, - } - if self._stuck then - -- If _stucktimer is missing for some reason, assume the maximum - if not self._stucktimer then - self._stucktimer = ARROW_TIMEOUT - end - out.stuckstarttime = minetest.get_gametime() - self._stucktimer - end - if self._shooter and self._shooter:is_player() then - out.shootername = self._shooter:get_player_name() - end - return minetest.serialize(out) - end - - function ARROW_ENTITY.on_activate(self, staticdata, dtime_s) - local data = minetest.deserialize(staticdata) - if data then - self._stuck = data.stuck - if data.stuck then - if data.stuckstarttime then - -- First, check if the stuck arrow is aleady past its life timer. - -- If yes, delete it. - self._stucktimer = minetest.get_gametime() - data.stuckstarttime - if self._stucktimer > ARROW_TIMEOUT then - self.object:remove() - return - end - end - - -- Perform a stuck recheck on the next step. - self._stuckrechecktimer = STUCK_RECHECK_TIME - - self._stuckin = data.stuckin - end - - -- Get the remaining arrow state - self._lastpos = data.lastpos - self._startpos = data.startpos - self._damage = data.damage - if data.shootername then - local shooter = minetest.get_player_by_name(data.shootername) - if shooter and shooter:is_player() then - self._shooter = shooter - end - end - end - self.object:set_armor_groups({ immortal = 1 }) - end - - minetest.register_entity("mcl_potions:"..name.."_arrow_entity", ARROW_ENTITY) - - if minetest.get_modpath("mcl_bows") then - minetest.register_craft({ - output = "mcl_potions:"..name.."_arrow 8", - recipe = { - {"mcl_bows:arrow","mcl_bows:arrow","mcl_bows:arrow"}, - {"mcl_bows:arrow","mcl_potions:"..name.."_lingering","mcl_bows:arrow"}, - {"mcl_bows:arrow","mcl_bows:arrow","mcl_bows:arrow"} - } - }) - - end - - if minetest.get_modpath("doc_identifier") then - doc.sub.identifier.register_object("mcl_bows:arrow_entity", "craftitems", "mcl_bows:arrow") - end -end diff --git a/mods/ITEMS/mcl_smoker/README.md b/mods/ITEMS/mcl_smoker/README.md deleted file mode 100644 index 895a8dd818..0000000000 --- a/mods/ITEMS/mcl_smoker/README.md +++ /dev/null @@ -1,13 +0,0 @@ -Smoker for MineClone 2. -Heavily based on Minetest Game (default/furnace.lua) and the MineClone 2 Furnaces. - -License of source code ----------------------- -LGPLv2.1 -Based on code from Minetest Game. -Modified by Wuzzy. -MCl 2 Furances modified by PrairieWind. - -License of media ----------------- -See the main MineClone 2 README.md file. diff --git a/mods/ITEMS/mcl_smoker/init.lua b/mods/ITEMS/mcl_smoker/init.lua deleted file mode 100644 index e45a2712ce..0000000000 --- a/mods/ITEMS/mcl_smoker/init.lua +++ /dev/null @@ -1,575 +0,0 @@ - -local S = minetest.get_translator(minetest.get_current_modname()) - -local LIGHT_ACTIVE_FURNACE = 13 - --- --- Formspecs --- - -local function active_formspec(fuel_percent, item_percent) - return "size[9,8.75]".. - "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Smoker"))).."]".. - "list[context;src;2.75,0.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. - "list[context;fuel;2.75,2.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. - "list[context;dst;5.75,1.5;1,1;]".. - mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. - "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. - (100-fuel_percent)..":default_furnace_fire_fg.png]".. - "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[lowpart:".. - (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. - -- Craft guide button temporarily removed due to Minetest bug. - -- TODO: Add it back when the Minetest bug is fixed. - --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. - --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. - "listring[context;dst]".. - "listring[current_player;main]".. - "listring[context;src]".. - "listring[current_player;main]".. - "listring[context;fuel]".. - "listring[current_player;main]" -end - -local inactive_formspec = "size[9,8.75]".. - "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Smoker"))).."]".. - "list[context;src;2.75,0.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. - "list[context;fuel;2.75,2.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. - "list[context;dst;5.75,1.5;1,1;]".. - mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. - "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. - "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[transformR270]".. - -- Craft guide button temporarily removed due to Minetest bug. - -- TODO: Add it back when the Minetest bug is fixed. - --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. - --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. - "listring[context;dst]".. - "listring[current_player;main]".. - "listring[context;src]".. - "listring[current_player;main]".. - "listring[context;fuel]".. - "listring[current_player;main]" - -local receive_fields = function(pos, formname, fields, sender) - if fields.craftguide then - mcl_craftguide.show(sender:get_player_name()) - end -end - -local function give_xp(pos, player) - local meta = minetest.get_meta(pos) - local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2),-1.95) - local xp = meta:get_int("xp") - if xp > 0 then - if player then - mcl_experience.add_xp(player, xp) - else - mcl_experience.throw_xp(vector.add(pos, dir), xp) - end - meta:set_int("xp", 0) - end -end - --- --- Node callback functions that are the same for active and inactive furnace --- - -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if listname == "fuel" then - -- Test stack with size 1 because we burn one fuel at a time - local teststack = ItemStack(stack) - teststack:set_count(1) - local output, decremented_input = minetest.get_craft_result({method="fuel", width=1, items={teststack}}) - if output.time ~= 0 then - -- Only allow to place 1 item if fuel get replaced by recipe. - -- This is the case for lava buckets. - local replace_item = decremented_input.items[1] - if replace_item:is_empty() then - -- For most fuels, just allow to place everything - return stack:get_count() - else - if inv:get_stack(listname, index):get_count() == 0 then - return 1 - else - return 0 - end - end - else - return 0 - end - elseif listname == "src" then - return stack:get_count() - elseif listname == "dst" then - return 0 - end -end - -local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local stack = inv:get_stack(from_list, from_index) - return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) -end - -local function allow_metadata_inventory_take(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end - return stack:get_count() -end - -local function on_metadata_inventory_take(pos, listname, index, stack, player) - -- Award smelting achievements - if listname == "dst" then - if stack:get_name() == "mcl_fishing:fish_cooked" then - awards.unlock(player:get_player_name(), "mcl:cookFish") - end - give_xp(pos, player) - end -end - -local function on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - if from_list == "dst" then - give_xp(pos, player) - end -end - -local function spawn_flames(pos, param2) - local minrelpos, maxrelpos - local dir = minetest.facedir_to_dir(param2) - if dir.x > 0 then - minrelpos = { x = -0.6, y = -0.05, z = -0.25 } - maxrelpos = { x = -0.55, y = -0.45, z = 0.25 } - elseif dir.x < 0 then - minrelpos = { x = 0.55, y = -0.05, z = -0.25 } - maxrelpos = { x = 0.6, y = -0.45, z = 0.25 } - elseif dir.z > 0 then - minrelpos = { x = -0.25, y = -0.05, z = -0.6 } - maxrelpos = { x = 0.25, y = -0.45, z = -0.55 } - elseif dir.z < 0 then - minrelpos = { x = -0.25, y = -0.05, z = 0.55 } - maxrelpos = { x = 0.25, y = -0.45, z = 0.6 } - else - return - end - mcl_particles.add_node_particlespawner(pos, { - amount = 4, - time = 0, - minpos = vector.add(pos, minrelpos), - maxpos = vector.add(pos, maxrelpos), - minvel = { x = -0.01, y = 0, z = -0.01 }, - maxvel = { x = 0.01, y = 0.1, z = 0.01 }, - minexptime = 0.3, - maxexptime = 0.6, - minsize = 0.4, - maxsize = 0.8, - texture = "mcl_particles_flame.png", - glow = LIGHT_ACTIVE_FURNACE, - }, "low") -end - -local function swap_node(pos, name) - local node = minetest.get_node(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) - if name == "mcl_smoker:smoker_active" then - spawn_flames(pos, node.param2) - else - mcl_particles.delete_node_particlespawners(pos) - end -end - -local function smoker_reset_delta_time(pos) - local meta = minetest.get_meta(pos) - local time_speed = tonumber(minetest.settings:get("time_speed") or 72) - if (time_speed < 0.1) then - return - end - local time_multiplier = 86400 / time_speed - local current_game_time = .0 + ((minetest.get_day_count() + minetest.get_timeofday()) * time_multiplier) - - -- TODO: Change meta:get/set_string() to get/set_float() for "last_gametime". - -- In Windows *_float() works OK but under Linux it returns rounded unusable values like 449540.000000000 - local last_game_time = meta:get_string("last_gametime") - if last_game_time then - last_game_time = tonumber(last_game_time) - end - if not last_game_time or last_game_time < 1 or math.abs(last_game_time - current_game_time) <= 1.5 then - return - end - - meta:set_string("last_gametime", tostring(current_game_time)) -end - -local function smoker_get_delta_time(pos, elapsed) - local meta = minetest.get_meta(pos) - local time_speed = tonumber(minetest.settings:get("time_speed") or 72) - local current_game_time - if (time_speed < 0.1) then - return meta, elapsed - else - local time_multiplier = 86400 / time_speed - current_game_time = .0 + ((minetest.get_day_count() + minetest.get_timeofday()) * time_multiplier) - end - - local last_game_time = meta:get_string("last_gametime") - if last_game_time then - last_game_time = tonumber(last_game_time) - end - if not last_game_time or last_game_time < 1 then - last_game_time = current_game_time - 0.1 - elseif last_game_time == current_game_time then - current_game_time = current_game_time + 1.0 - end - - local elapsed_game_time = .0 + current_game_time - last_game_time - - meta:set_string("last_gametime", tostring(current_game_time)) - - return meta, elapsed_game_time -end - -local function smoker_node_timer(pos, elapsed) - -- - -- Inizialize metadata - -- - local meta, elapsed_game_time = smoker_get_delta_time(pos, elapsed) - - local fuel_time = meta:get_float("fuel_time") or 0 - local src_time = meta:get_float("src_time") or 0 - local src_item = meta:get_string("src_item") or "" - local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 - - local inv = meta:get_inventory() - local srclist, fuellist - - local cookable, cooked - local active = true - local fuel - - srclist = inv:get_list("src") - fuellist = inv:get_list("fuel") - - -- Check if src item has been changed - if srclist[1]:get_name() ~= src_item then - -- Reset cooking progress in this case - src_time = 0 - src_item = srclist[1]:get_name() - end - - local update = true - while elapsed_game_time > 0.00001 and update do - -- - -- Cooking - -- - - local el = elapsed_game_time - - -- Check if we have cookable content: cookable - local aftercooked - cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) - cookable = minetest.get_item_group(inv:get_stack("src", 1):get_name(), "smoker_cookable") == 1 - if cookable then - -- Successful cooking requires space in dst slot and time - if not inv:room_for_item("dst", cooked.item) then - cookable = false - end - end - - if cookable then -- fuel lasts long enough, adjust el to cooking duration - el = math.min(el, cooked.time - src_time) - end - - -- Check if we have enough fuel to burn - active = fuel_time < fuel_totaltime - if cookable and not active then - -- We need to get new fuel - local afterfuel - fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) - - if fuel.time == 0 then - -- No valid fuel in fuel list -- stop - fuel_totaltime = 0 - src_time = 0 - update = false - else - -- Take fuel from fuel list - inv:set_stack("fuel", 1, afterfuel.items[1]) - fuel_time = 0 - fuel_totaltime = fuel.time - el = math.min(el, fuel_totaltime) - active = true - fuellist = inv:get_list("fuel") - end - elseif active then - el = math.min(el, fuel_totaltime - fuel_time) - -- The furnace is currently active and has enough fuel - fuel_time = ( fuel_time + el ) * 2 - end - - -- If there is a cookable item then check if it is ready yet - if cookable and active then - -- In the src_time variable, the *2 is the multiplication that makes the smoker work faster than a normal furnace. - src_time = (src_time + el)*2 - -- Place result in dst list if done - if src_time >= cooked.time then - inv:add_item("dst", cooked.item) - inv:set_stack("src", 1, aftercooked.items[1]) - - srclist = inv:get_list("src") - src_time = 0 - - meta:set_int("xp", meta:get_int("xp") + 1) -- ToDo give each recipe an idividial XP count - end - end - - elapsed_game_time = elapsed_game_time - el - end - - if fuel and fuel_totaltime > fuel.time then - fuel_totaltime = fuel.time - end - if srclist and srclist[1]:is_empty() then - src_time = 0 - end - - -- - -- Update formspec and node - -- - local formspec = inactive_formspec - local item_percent = 0 - if cookable then - item_percent = math.floor(src_time / cooked.time * 100) - end - - local result = false - - if active then - local fuel_percent = 0 - if fuel_totaltime > 0 then - fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) - end - formspec = active_formspec(fuel_percent, item_percent) - swap_node(pos, "mcl_smoker:smoker_active") - -- make sure timer restarts automatically - result = true - else - swap_node(pos, "mcl_smoker:smoker") - -- stop timer on the inactive furnace - minetest.get_node_timer(pos):stop() - end - - -- - -- Set meta values - -- - meta:set_float("fuel_totaltime", fuel_totaltime) - meta:set_float("fuel_time", fuel_time) - meta:set_float("src_time", src_time) - if srclist then - meta:set_string("src_item", src_item) - else - meta:set_string("src_item", "") - end - meta:set_string("formspec", formspec) - - return result -end - -local on_rotate, after_rotate_active -if minetest.get_modpath("screwdriver") then - on_rotate = screwdriver.rotate_simple - after_rotate_active = function(pos) - local node = minetest.get_node(pos) - mcl_particles.delete_node_particlespawners(pos) - if node.name == "mcl_smoker:smoker" then - return - end - spawn_flames(pos, node.param2) - end -end - -minetest.register_node("mcl_smoker:smoker", { - description = S("Smoker"), - _tt_help = S("Cooks food faster than furnace"), - _doc_items_longdesc = S("Smokers cook several items, using a furnace fuel, into something else, but twice as fast as a normal furnace"), - _doc_items_usagehelp = - S([[ - Use the smoker to open the furnace menu. - Place a furnace fuel in the lower slot and the source material in the upper slot. - The smoker will slowly use its fuel to smelt the item. - The result will be placed into the output slot at the right side. - ]]).."\n".. - S("Use the recipe book to see what foods you can smelt, what you can use as fuel and how long it will burn."), - _doc_items_hidden = false, - tiles = { - "smoker_top.png", "smoker_bottom.png", - "smoker_side.png", "smoker_side.png", - "smoker_side.png", "smoker_front.png" - }, - paramtype2 = "facedir", - groups = {pickaxey=1, container=4, deco_block=1, material_stone=1}, - is_ground_content = false, - sounds = mcl_sounds.node_sound_stone_defaults(), - - on_timer = smoker_node_timer, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local meta = minetest.get_meta(pos) - local meta2 = meta:to_table() - meta:from_table(oldmetadata) - local inv = meta:get_inventory() - for _, listname in ipairs({"src", "dst", "fuel"}) do - local stack = inv:get_stack(listname, 1) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - end - meta:from_table(meta2) - end, - - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", inactive_formspec) - local inv = meta:get_inventory() - inv:set_size("src", 1) - inv:set_size("fuel", 1) - inv:set_size("dst", 1) - end, - on_destruct = function(pos) - mcl_particles.delete_node_particlespawners(pos) - give_xp(pos) - end, - - on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - -- Reset accumulated game time when player works with furnace: - smoker_reset_delta_time(pos) - minetest.get_node_timer(pos):start(1.0) - - on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - end, - on_metadata_inventory_put = function(pos) - -- Reset accumulated game time when player works with furnace: - smoker_reset_delta_time(pos) - -- start timer function, it will sort out whether furnace can burn or not. - minetest.get_node_timer(pos):start(1.0) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - -- Reset accumulated game time when player works with furnace: - smoker_reset_delta_time(pos) - -- start timer function, it will helpful if player clears dst slot - minetest.get_node_timer(pos):start(1.0) - - on_metadata_inventory_take(pos, listname, index, stack, player) - end, - - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_take = allow_metadata_inventory_take, - on_receive_fields = receive_fields, - _mcl_blast_resistance = 3.5, - _mcl_hardness = 3.5, - on_rotate = on_rotate, -}) - -minetest.register_node("mcl_smoker:smoker_active", { - description = S("Burning Smoker"), - _doc_items_create_entry = false, - tiles = { - "smoker_top.png", "smoker_bottom.png", - "smoker_side.png", "smoker_side.png", - "smoker_side.png", {name = "smoker_front_on.png", - animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 48}}, - }, - paramtype2 = "facedir", - paramtype = "light", - light_source = LIGHT_ACTIVE_FURNACE, - drop = "mcl_smoker:smoker", - groups = {pickaxey=1, container=4, deco_block=1, not_in_creative_inventory=1, material_stone=1}, - is_ground_content = false, - sounds = mcl_sounds.node_sound_stone_defaults(), - on_timer = smoker_node_timer, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local meta = minetest.get_meta(pos) - local meta2 = meta - meta:from_table(oldmetadata) - local inv = meta:get_inventory() - for _, listname in ipairs({"src", "dst", "fuel"}) do - local stack = inv:get_stack(listname, 1) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) - end - end - meta:from_table(meta2:to_table()) - end, - - on_construct = function(pos) - local node = minetest.get_node(pos) - spawn_flames(pos, node.param2) - end, - on_destruct = function(pos) - mcl_particles.delete_node_particlespawners(pos) - give_xp(pos) - end, - - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_take = allow_metadata_inventory_take, - on_metadata_inventory_move = on_metadata_inventory_move, - on_metadata_inventory_take = on_metadata_inventory_take, - on_receive_fields = receive_fields, - _mcl_blast_resistance = 3.5, - _mcl_hardness = 3.5, - on_rotate = on_rotate, - after_rotate = after_rotate_active, -}) - -minetest.register_craft({ - output = "mcl_smoker:smoker", - recipe = { - { "", "group:tree", "" }, - { "group:tree", "mcl_furnaces:furnace", "group:tree" }, - { "", "group:tree", "" }, - } -}) - --- Add entry alias for the Help -if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", "mcl_smoker:smoker", "nodes", "mcl_smoker:smoker_active") -end - -minetest.register_lbm({ - label = "Active smoker flame particles", - name = "mcl_smoker:flames", - nodenames = {"mcl_smoker:smoker_active"}, - run_at_every_load = true, - action = function(pos, node) - spawn_flames(pos, node.param2) - end, -}) diff --git a/mods/ITEMS/mcl_smoker/mod.conf b/mods/ITEMS/mcl_smoker/mod.conf deleted file mode 100644 index c6bda0fc1e..0000000000 --- a/mods/ITEMS/mcl_smoker/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = mcl_smoker -depends = mcl_init, mcl_formspec, mcl_core, mcl_furnaces, mcl_sounds, mcl_craftguide, mcl_achievements, mcl_particles -optional_depends = doc, screwdriver diff --git a/mods/ITEMS/mcl_smoker/textures/smoker_bottom.png b/mods/ITEMS/mcl_smoker/textures/smoker_bottom.png deleted file mode 100644 index cccc5a6972..0000000000 Binary files a/mods/ITEMS/mcl_smoker/textures/smoker_bottom.png and /dev/null differ diff --git a/mods/ITEMS/mcl_smoker/textures/smoker_front.png b/mods/ITEMS/mcl_smoker/textures/smoker_front.png deleted file mode 100644 index 37f43c3065..0000000000 Binary files a/mods/ITEMS/mcl_smoker/textures/smoker_front.png and /dev/null differ diff --git a/mods/ITEMS/mcl_smoker/textures/smoker_front_on.png b/mods/ITEMS/mcl_smoker/textures/smoker_front_on.png deleted file mode 100644 index 502fdb983a..0000000000 Binary files a/mods/ITEMS/mcl_smoker/textures/smoker_front_on.png and /dev/null differ diff --git a/mods/ITEMS/mcl_smoker/textures/smoker_side.png b/mods/ITEMS/mcl_smoker/textures/smoker_side.png deleted file mode 100644 index f1e57a7511..0000000000 Binary files a/mods/ITEMS/mcl_smoker/textures/smoker_side.png and /dev/null differ diff --git a/mods/ITEMS/mcl_smoker/textures/smoker_top.png b/mods/ITEMS/mcl_smoker/textures/smoker_top.png deleted file mode 100644 index bc5a0dba78..0000000000 Binary files a/mods/ITEMS/mcl_smoker/textures/smoker_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_stairs/API.md b/mods/ITEMS/mcl_stairs/API.md deleted file mode 100644 index 6c91754b70..0000000000 --- a/mods/ITEMS/mcl_stairs/API.md +++ /dev/null @@ -1,83 +0,0 @@ -# API for `mcl_stairs` - -Register your own stairs and slabs! - -## Quick start - -Register platinum stair and slab based on node `example:platinum`: - -``` -mcl_stairs.register_stair_and_slab_simple("platinum", "example:platinum", "Platinum Stair", "Platinum Slab", "Double Platinum Slab") -``` - -## `mcl_stairs.register_stair_and_slab_simple(subname, sourcenode, desc_stair, desc_slab, double_description, corner_stair_texture_override)` -Register a simple stair and a slab. The stair and slab will inherit all attributes from `sourcenode`. The `sourcenode` is also used as the item for crafting recipes. - -This function is meant for simple nodes; if you need more flexibility, use one of the other functions instead. - -See `register_stair` and `register_slab` for the itemstrings of the registered nodes. - -### Parameters -* `subname`: Name fragment for node itemstrings (see `register_stair` and `register_slab`) -* `sourcenode`: The node on which this stair is based on -* `desc_stair`: Description of stair node -* `desc_slab`: Description of slab node -* `double_description`: Description of double slab node -* `corner_stair_texture_override`: Optional, see `register_stair` - -## `mcl_stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds, hardness, double_description, corner_stair_texture_override)` -Register a simple stair and a slab, plus crafting recipes. In this function, you need to specify most things explicitly. - -### Parameters -* `desc_stair`: Description of stair node -* `desc_slab`: Description of slab node -* Other parameters: Same as for `register_stair` and `register_slab` - -## `mcl_stairs.register_stair(subname, recipeitem, groups, images, description, sounds, hardness, corner_stair_texture_override)` -Registers a stair. This also includes the inner and outer corner stairs, they are added automatically. Also adds crafting recipes. - -The itemstrings for the registered nodes will be of the form: - -* `mcl_stairs:stair_`: Normal stair -* `mcl_stairs:stair__inner`: Inner stair -* `mcl_stairs:stair__outer`: Outer stair - -### Parameters -* `subname`: Name fragment for node itemstrings (see above) -* `recipeitem`: Item for crafting recipe. Use `group:` prefix to use a group instead -* `groups`: Groups used for stair -* `images`: Textures -* `description`: Stair description/tooltip -* `sounds`: Sounds table -* `hardness`: MCL2 block hardness value -* `corner_stair_texture_override`: Optional. Custom textures for corner stairs, see below - -`groups`, `images`, `sounds` or `hardness` can be `nil`, in which case the value is inhereted from the `recipeitem`. - -#### `corner_stair_texture_override` -This optional parameter specifies the textures to be used for corner stairs. - -It can be one of the following data types: - -* string: one of: - * "default": Use same textures as original node - * "woodlike": Take first frame of the original tiles, then take a triangle piece - of the texture, rotate it by 90° and overlay it over the original texture -* table: Specify textures explicitly. Table of tiles to override textures for - inner and outer stairs. Table format: - { tiles_def_for_outer_stair, tiles_def_for_inner_stair } -* nil: Equivalent to "default" - -## `mcl_stairs.register_slab(subname, recipeitem, groups, images, description, sounds, hardness, double_description)` -Registers a slab and a corresponding double slab. Also adds crafting recipe. - -The itemstrings for the registered nodes will be of the form: - -* `mcl_stairs:slab_`: Slab -* `mcl_stairs:slab__top`: Upper slab, used internally -* `mcl_stairs:slab__double`: Double slab - -### Parameters -* `double_description`: Node description/tooltip for double slab -* Other parameters: Same as for `register_stair` - diff --git a/mods/ITEMS/mcl_stairs/README.txt b/mods/ITEMS/mcl_stairs/README.txt deleted file mode 100644 index 9607b5d00a..0000000000 --- a/mods/ITEMS/mcl_stairs/README.txt +++ /dev/null @@ -1,18 +0,0 @@ -MineClone 2 mod: mcl_stairs -========================= -Forked from stairs mod in Minetest Game 0.4.16. -See license.txt for license information. - -Authors of source code ----------------------- -Originally by Kahrl (LGPL 2.1) and -celeron55, Perttu Ahola (LGPL 2.1) -Various Minetest developers and contributors (LGPL 2.1) - -Authors of media (models) -------------------------- -Jean-Patrick G. (kilbith) (CC BY-SA 3.0): - stairs_stair.obj - - - diff --git a/mods/ITEMS/mcl_stairs/alias.lua b/mods/ITEMS/mcl_stairs/alias.lua deleted file mode 100644 index 1865b57792..0000000000 --- a/mods/ITEMS/mcl_stairs/alias.lua +++ /dev/null @@ -1,20 +0,0 @@ --- Aliases for backwards-compability with 0.21.0 - -local materials = { - "wood", "junglewood", "sprucewood", "acaciawood", "birchwood", "darkwood", - "cobble", "brick_block", "sandstone", "redsandstone", "stonebrick", - "quartzblock", "purpur_block", "nether_brick" -} - -for m=1, #materials do - local mat = materials[m] - minetest.register_alias("stairs:slab_"..mat, "mcl_stairs:slab_"..mat) - minetest.register_alias("stairs:stair_"..mat, "mcl_stairs:stair_"..mat) - - -- corner stairs - minetest.register_alias("stairs:stair_"..mat.."_inner", "mcl_stairs:stair_"..mat.."_inner") - minetest.register_alias("stairs:stair_"..mat.."_outer", "mcl_stairs:stair_"..mat.."_outer") -end - -minetest.register_alias("stairs:slab_stone", "mcl_stairs:slab_stone") -minetest.register_alias("stairs:slab_stone_double", "mcl_stairs:slab_stone_double") diff --git a/mods/ITEMS/mcl_stairs/api.lua b/mods/ITEMS/mcl_stairs/api.lua deleted file mode 100644 index 34afb018ef..0000000000 --- a/mods/ITEMS/mcl_stairs/api.lua +++ /dev/null @@ -1,379 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - --- Core mcl_stairs API - --- Wrapper around mintest.pointed_thing_to_face_pos. -local function get_fpos(placer, pointed_thing) - local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) - return finepos.y % 1 -end - -local function place_slab_normal(itemstack, placer, pointed_thing) - -- Use pointed node's on_rightclick function first, if present - local node = minetest.get_node(pointed_thing.under) - if placer and not placer:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack - end - end - - local p0 = pointed_thing.under - local p1 = pointed_thing.above - - --local placer_pos = placer:get_pos() - - local fpos = get_fpos(placer, pointed_thing) - - local place = ItemStack(itemstack) - local origname = itemstack:get_name() - if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) - or (fpos < -0.5 and fpos > -0.999999999) then - place:set_name(origname .. "_top") - end - local ret = minetest.item_place(place, placer, pointed_thing, 0) - ret:set_name(origname) - return ret -end - -local function place_stair(itemstack, placer, pointed_thing) - -- Use pointed node's on_rightclick function first, if present - local node = minetest.get_node(pointed_thing.under) - if placer and not placer:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack - end - end - - local p0 = pointed_thing.under - local p1 = pointed_thing.above - local param2 = 0 - - local placer_pos = placer:get_pos() - if placer_pos then - param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) - end - - local fpos = get_fpos(placer, pointed_thing) - - if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) - or (fpos < -0.5 and fpos > -0.999999999) then - param2 = param2 + 20 - if param2 == 21 then - param2 = 23 - elseif param2 == 23 then - param2 = 21 - end - end - return minetest.item_place(itemstack, placer, pointed_thing, param2) -end - --- Register stairs. --- Node will be called mcl_stairs:stair_ - -function mcl_stairs.register_stair(subname, recipeitem, groups, images, description, sounds, blast_resistance, hardness, corner_stair_texture_override) - groups.stair = 1 - groups.building_block = 1 - - if recipeitem then - if not images then - images = minetest.registered_items[recipeitem].tiles - end - if not groups then - groups = minetest.registered_items[recipeitem].groups - end - if not sounds then - sounds = minetest.registered_items[recipeitem].sounds - end - if not hardness then - hardness = minetest.registered_items[recipeitem]._mcl_hardness - end - if not blast_resistance then - blast_resistance = minetest.registered_items[recipeitem]._mcl_blast_resistance - end - end - - minetest.register_node(":mcl_stairs:stair_" .. subname, { - description = description, - _doc_items_longdesc = S("Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down."), - drawtype = "mesh", - mesh = "stairs_stair.obj", - tiles = images, - paramtype = "light", - paramtype2 = "facedir", - is_ground_content = false, - groups = groups, - sounds = sounds, - selection_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}, - }, - }, - collision_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}, - }, - }, - on_place = function(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" then - return itemstack - end - - return place_stair(itemstack, placer, pointed_thing) - end, - on_rotate = function(pos, node, user, mode, param2) - -- Flip stairs vertically - if mode == screwdriver.ROTATE_AXIS then - local minor = node.param2 - if node.param2 >= 20 then - minor = node.param2 - 20 - if minor == 3 then - minor = 1 - elseif minor == 1 then - minor = 3 - end - node.param2 = minor - else - if minor == 3 then - minor = 1 - elseif minor == 1 then - minor = 3 - end - node.param2 = minor - node.param2 = node.param2 + 20 - end - minetest.set_node(pos, node) - return true - end - end, - _mcl_blast_resistance = blast_resistance, - _mcl_hardness = hardness, - }) - - if recipeitem then - minetest.register_craft({ - output = "mcl_stairs:stair_" .. subname .. " 4", - recipe = { - {recipeitem, "", ""}, - {recipeitem, recipeitem, ""}, - {recipeitem, recipeitem, recipeitem}, - }, - }) - - -- Flipped recipe - minetest.register_craft({ - output = "mcl_stairs:stair_" .. subname .. " 4", - recipe = { - {"", "", recipeitem}, - {"", recipeitem, recipeitem}, - {recipeitem, recipeitem, recipeitem}, - }, - }) - end - - mcl_stairs.cornerstair.add("mcl_stairs:stair_"..subname, corner_stair_texture_override) -end - - --- Slab facedir to placement 6d matching table ---local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4} - --- Register slabs. --- Node will be called mcl_stairs:slab_ - --- double_description: NEW argument, not supported in Minetest Game --- double_description: Description of double slab -function mcl_stairs.register_slab(subname, recipeitem, groups, images, description, sounds, blast_resistance, hardness, double_description) - local lower_slab = "mcl_stairs:slab_"..subname - local upper_slab = lower_slab.."_top" - local double_slab = lower_slab.."_double" - - if recipeitem then - if not images then - images = minetest.registered_items[recipeitem].tiles - end - if not groups then - groups = minetest.registered_items[recipeitem].groups - end - if not sounds then - sounds = minetest.registered_items[recipeitem].sounds - end - if not hardness then - hardness = minetest.registered_items[recipeitem]._mcl_hardness - end - if not blast_resistance then - blast_resistance = minetest.registered_items[recipeitem]._mcl_blast_resistance - end - end - - -- Automatically generate double slab description - if not double_description then - double_description = S("Double @1", description) - minetest.log("warning", "[stairs] No explicit description for double slab '"..double_slab.."' added. Using auto-generated description.") - end - - groups.slab = 1 - groups.building_block = 1 - local longdesc = S("Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.") - - local slabdef = { - description = description, - _doc_items_longdesc = longdesc, - drawtype = "nodebox", - tiles = images, - paramtype = "light", - -- Facedir intentionally left out (see below) - is_ground_content = false, - groups = groups, - sounds = sounds, - node_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - }, - on_place = function(itemstack, placer, pointed_thing) - local under = minetest.get_node(pointed_thing.under) - local wield_item = itemstack:get_name() - local creative_enabled = minetest.is_creative_enabled(placer:get_player_name()) - - -- place slab using under node orientation - local dir = vector.subtract(pointed_thing.above, pointed_thing.under) - - local p2 = under.param2 - - -- combine two slabs if possible - -- Requirements: Same slab material, must be placed on top of lower slab, or on bottom of upper slab - if (wield_item == under.name or (minetest.registered_nodes[under.name] and wield_item == minetest.registered_nodes[under.name]._mcl_other_slab_half)) and - not ((dir.y >= 0 and minetest.get_item_group(under.name, "slab_top") == 1) or - (dir.y <= 0 and minetest.get_item_group(under.name, "slab_top") == 0)) then - - local player_name = placer:get_player_name() - if minetest.is_protected(pointed_thing.under, player_name) and not - minetest.check_player_privs(placer, "protection_bypass") then - minetest.record_protection_violation(pointed_thing.under, - player_name) - return - end - local newnode = double_slab - minetest.set_node(pointed_thing.under, {name = newnode, param2 = p2}) - if not creative_enabled then - itemstack:take_item() - end - return itemstack - -- No combination possible: Place slab normally - else - return place_slab_normal(itemstack, placer, pointed_thing) - end - end, - _mcl_hardness = hardness, - _mcl_blast_resistance = blast_resistance, - _mcl_other_slab_half = upper_slab, - on_rotate = function(pos, node, user, mode, param2) - -- Flip slab - if mode == screwdriver.ROTATE_AXIS then - node.name = upper_slab - minetest.set_node(pos, node) - return true - end - return false - end, - } - - minetest.register_node(":"..lower_slab, slabdef) - - -- Register the upper slab. - -- Using facedir is not an option, as this would rotate the textures as well and would make - -- e.g. upper sandstone slabs look completely wrong. - local topdef = table.copy(slabdef) - topdef.groups.slab = 1 - topdef.groups.slab_top = 1 - topdef.groups.not_in_creative_inventory = 1 - topdef.groups.not_in_craft_guide = 1 - topdef.description = S("Upper @1", description) - topdef._doc_items_create_entry = false - topdef._doc_items_longdesc = nil - topdef._doc_items_usagehelp = nil - topdef.drop = lower_slab - topdef._mcl_other_slab_half = lower_slab - function topdef.on_rotate(pos, node, user, mode, param2) - -- Flip slab - if mode == screwdriver.ROTATE_AXIS then - node.name = lower_slab - minetest.set_node(pos, node) - return true - end - return false - end - topdef.node_box = { - type = "fixed", - fixed = {-0.5, 0, -0.5, 0.5, 0.5, 0.5}, - } - topdef.selection_box = { - type = "fixed", - fixed = {-0.5, 0, -0.5, 0.5, 0.5, 0.5}, - } - minetest.register_node(":"..upper_slab, topdef) - - - -- Double slab node - local dgroups = table.copy(groups) - dgroups.not_in_creative_inventory = 1 - dgroups.not_in_craft_guide = 1 - dgroups.slab = nil - dgroups.double_slab = 1 - minetest.register_node(":"..double_slab, { - description = double_description, - _doc_items_longdesc = S("Double slabs are full blocks which are created by placing two slabs of the same kind on each other."), - tiles = images, - is_ground_content = false, - groups = dgroups, - sounds = sounds, - drop = lower_slab .. " 2", - _mcl_hardness = hardness, - _mcl_blast_resistance = blast_resistance, - }) - - if recipeitem then - minetest.register_craft({ - output = lower_slab .. " 6", - recipe = { - {recipeitem, recipeitem, recipeitem}, - }, - }) - - end - - -- Help alias for the upper slab - if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", lower_slab, "nodes", upper_slab) - end -end - - --- Stair/slab registration function. --- Nodes will be called mcl_stairs:{stair,slab}_ - -function mcl_stairs.register_stair_and_slab(subname, recipeitem, - groups, images, desc_stair, desc_slab, sounds, blast_resistance, hardness, - double_description, corner_stair_texture_override) - mcl_stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds, blast_resistance, hardness, corner_stair_texture_override) - mcl_stairs.register_slab(subname, recipeitem, groups, images, desc_slab, sounds, blast_resistance, hardness, double_description) -end - --- Very simple registration function --- Makes stair and slab out of a source node -function mcl_stairs.register_stair_and_slab_simple(subname, sourcenode, desc_stair, desc_slab, desc_double_slab, corner_stair_texture_override) - local def = minetest.registered_nodes[sourcenode] - local groups = {} - -- Only allow a strict set of groups to be added to stairs and slabs for more predictable results - local allowed_groups = { "dig_immediate", "handy", "pickaxey", "axey", "shovely", "shearsy", "shearsy_wool", "swordy", "swordy_wool" } - for a=1, #allowed_groups do - if def.groups[allowed_groups[a]] then - groups[allowed_groups[a]] = def.groups[allowed_groups[a]] - end - end - mcl_stairs.register_stair_and_slab(subname, sourcenode, groups, def.tiles, desc_stair, desc_slab, def.sounds, def._mcl_blast_resistance, def._mcl_hardness, desc_double_slab, corner_stair_texture_override) -end - diff --git a/mods/ITEMS/mcl_stairs/cornerstair.lua b/mods/ITEMS/mcl_stairs/cornerstair.lua deleted file mode 100644 index ae3eb4ea39..0000000000 --- a/mods/ITEMS/mcl_stairs/cornerstair.lua +++ /dev/null @@ -1,700 +0,0 @@ --- Corner stairs handling - --- This code originally copied from the [mcstair] mod and merged into this mod. --- This file is licensed under CC0. - -mcl_stairs.cornerstair = {} - -local function get_stair_param(node) - local stair = minetest.get_item_group(node.name, "stair") - if stair == 1 then - return node.param2 - elseif stair == 2 then - if node.param2 < 12 then - return node.param2 + 4 - else - return node.param2 - 4 - end - elseif stair == 3 then - if node.param2 < 12 then - return node.param2 + 8 - else - return node.param2 - 8 - end - end -end - -local function get_stair_from_param(param, stairs) - if param < 12 then - if param < 4 then - return {name = stairs[1], param2 = param} - elseif param < 8 then - return {name = stairs[2], param2 = param - 4} - else - return {name = stairs[3], param2 = param - 8} - end - else - if param >= 20 then - return {name = stairs[1], param2 = param} - elseif param >= 16 then - return {name = stairs[2], param2 = param + 4} - else - return {name = stairs[3], param2 = param + 8} - end - end -end - -local function stair_param_to_connect(param, ceiling) - local out = {false, false, false, false, false, false, false, false} - if not ceiling then - if param == 0 then - out[3] = true - out[8] = true - elseif param == 1 then - out[2] = true - out[5] = true - elseif param == 2 then - out[4] = true - out[7] = true - elseif param == 3 then - out[1] = true - out[6] = true - elseif param == 4 then - out[1] = true - out[8] = true - elseif param == 5 then - out[2] = true - out[3] = true - elseif param == 6 then - out[4] = true - out[5] = true - elseif param == 7 then - out[6] = true - out[7] = true - elseif param == 8 then - out[3] = true - out[6] = true - elseif param == 9 then - out[5] = true - out[8] = true - elseif param == 10 then - out[2] = true - out[7] = true - elseif param == 11 then - out[1] = true - out[4] = true - end - else - if param == 12 then - out[5] = true - out[8] = true - elseif param == 13 then - out[3] = true - out[6] = true - elseif param == 14 then - out[1] = true - out[4] = true - elseif param == 15 then - out[2] = true - out[7] = true - elseif param == 16 then - out[2] = true - out[3] = true - elseif param == 17 then - out[1] = true - out[8] = true - elseif param == 18 then - out[6] = true - out[7] = true - elseif param == 19 then - out[4] = true - out[5] = true - elseif param == 20 then - out[3] = true - out[8] = true - elseif param == 21 then - out[1] = true - out[6] = true - elseif param == 22 then - out[4] = true - out[7] = true - elseif param == 23 then - out[2] = true - out[5] = true - end - end - return out -end - -local function stair_connect_to_param(connect, ceiling) - local param - if not ceiling then - if connect[3] and connect[8] then - param = 0 - elseif connect[2] and connect[5] then - param = 1 - elseif connect[4] and connect[7] then - param = 2 - elseif connect[1] and connect[6] then - param = 3 - elseif connect[1] and connect[8] then - param = 4 - elseif connect[2] and connect[3] then - param = 5 - elseif connect[4] and connect[5] then - param = 6 - elseif connect[6] and connect[7] then - param = 7 - elseif connect[3] and connect[6] then - param = 8 - elseif connect[5] and connect[8] then - param = 9 - elseif connect[2] and connect[7] then - param = 10 - elseif connect[1] and connect[4] then - param = 11 - end - else - if connect[5] and connect[8] then - param = 12 - elseif connect[3] and connect[6] then - param = 13 - elseif connect[1] and connect[4] then - param = 14 - elseif connect[2] and connect[7] then - param = 15 - elseif connect[2] and connect[3] then - param = 16 - elseif connect[1] and connect[8] then - param = 17 - elseif connect[6] and connect[7] then - param = 18 - elseif connect[4] and connect[5] then - param = 19 - elseif connect[3] and connect[8] then - param = 20 - elseif connect[1] and connect[6] then - param = 21 - elseif connect[4] and connect[7] then - param = 22 - elseif connect[2] and connect[5] then - param = 23 - end - end - return param -end - ---[[ -mcl_stairs.cornerstair.add(name, stairtiles) - -NOTE: This function is used internally. If you register a stair, this function is already called, no -need to call it again! - -Usage: -* name is the name of the node to make corner stairs for. -* stairtiles is optional, can specify textures for inner and outer stairs. 3 data types are accepted: - * string: one of: - * "default": Use same textures as original node - * "woodlike": Take first frame of the original tiles, then take a triangle piece - of the texture, rotate it by 90° and overlay it over the original texture - * table: Specify textures explicitly. Table of tiles to override textures for - inner and outer stairs. Table format: - { tiles_def_for_outer_stair, tiles_def_for_inner_stair } - * nil: Equivalent to "default" -]] - -function mcl_stairs.cornerstair.add(name, stairtiles) - local node_def = minetest.registered_nodes[name] - local outer_tiles - local inner_tiles - if stairtiles == "woodlike" then - outer_tiles = table.copy(node_def.tiles) - inner_tiles = table.copy(node_def.tiles) - for i=2,6 do - if outer_tiles[i] == nil then - outer_tiles[i] = outer_tiles[i-1] - end - if inner_tiles[i] == nil then - inner_tiles[i] = inner_tiles[i-1] - end - end - local t = node_def.tiles[1] - outer_tiles[1] = t.."^("..t.."^[transformR90^mcl_stairs_turntexture.png^[makealpha:255,0,255)" - outer_tiles[2] = t.."^("..t.."^mcl_stairs_turntexture.png^[transformR270^[makealpha:255,0,255)" - outer_tiles[3] = t - inner_tiles[1] = t.."^("..t.."^[transformR90^(mcl_stairs_turntexture.png^[transformR180)^[makealpha:255,0,255)" - inner_tiles[2] = t.."^("..t.."^[transformR270^(mcl_stairs_turntexture.png^[transformR90)^[makealpha:255,0,255)" - inner_tiles[3] = t - elseif stairtiles == nil or stairtiles == "default" then - outer_tiles = node_def.tiles - inner_tiles = node_def.tiles - else - outer_tiles = stairtiles[1] - inner_tiles = stairtiles[2] - end - local outer_groups = table.copy(node_def.groups) - outer_groups.not_in_creative_inventory = 1 - local inner_groups = table.copy(outer_groups) - outer_groups.stair = 2 - outer_groups.not_in_craft_guide = 1 - inner_groups.stair = 3 - inner_groups.not_in_craft_guide = 1 - local drop = node_def.drop or name - local function after_dig_node(pos, oldnode) - local param = get_stair_param(oldnode) - local ceiling - if param < 12 then - ceiling = false - else - ceiling = true - end - local connect = stair_param_to_connect(param, ceiling) - local t = { - {pos = {x = pos.x, y = pos.y, z = pos.z + 2}}, - {pos = {x = pos.x - 1, y = pos.y, z = pos.z + 1}}, {pos = {x = pos.x, y = pos.y, z = pos.z + 1}}, {pos = {x = pos.x + 1, y = pos.y, z = pos.z + 1}}, - {pos = {x = pos.x - 2, y = pos.y, z = pos.z}}, {pos = {x = pos.x - 1, y = pos.y, z = pos.z}}, - {pos = pos, connect = connect}, - {pos = {x = pos.x + 1, y = pos.y, z = pos.z}}, {pos = {x = pos.x + 2, y = pos.y, z = pos.z}}, - {pos = {x = pos.x - 1, y = pos.y, z = pos.z - 1}}, {pos = {x = pos.x, y = pos.y, z = pos.z - 1}}, {pos = {x = pos.x + 1, y = pos.y, z = pos.z - 1}}, - {pos = {x = pos.x, y = pos.y, z = pos.z - 2}} - } - for i,v in ipairs(t) do - if not v.connect then - local node = minetest.get_node(v.pos) - local node_def = minetest.registered_nodes[node.name] - if not node_def then - return - end - if node_def.stairs then - t[i].stairs = node_def.stairs - t[i].connect = stair_param_to_connect(get_stair_param(node), ceiling) - else - t[i].connect = {false, false, false, false, false, false, false, false} - end - end - end - local function swap_stair(index, n1, n2) - local connect = {false, false, false, false, false, false, false, false} - connect[n1] = true - connect[n2] = true - local node = get_stair_from_param(stair_connect_to_param(connect, ceiling), t[index].stairs) - minetest.swap_node(t[index].pos, node) - end - if t[3].stairs then - if t[7].connect[1] and t[3].connect[6] then - if t[3].connect[1] and t[1].connect[6] then - if t[2].connect[3] then - swap_stair(3, 1, 8) - elseif t[4].connect[7] then - swap_stair(3, 1, 4) - end - elseif t[3].connect[7] then - swap_stair(3, 4, 7) - elseif t[3].connect[3] then - swap_stair(3, 3, 8) - end - elseif t[7].connect[2] and t[3].connect[5] then - if t[3].connect[2] and t[1].connect[5] then - if t[4].connect[8] then - swap_stair(3, 2, 3) - elseif t[2].connect[4] then - swap_stair(3, 2, 7) - end - elseif t[3].connect[4] then - swap_stair(3, 4, 7) - elseif t[3].connect[8] then - swap_stair(3, 3, 8) - end - end - end - if t[8].stairs then - if t[7].connect[3] and t[8].connect[8] then - if t[8].connect[3] and t[9].connect[8] then - if t[4].connect[5] then - swap_stair(8, 2, 3) - elseif t[12].connect[1] then - swap_stair(8, 3, 6) - end - elseif t[8].connect[1] then - swap_stair(8, 1, 6) - elseif t[8].connect[5] then - swap_stair(8, 2, 5) - end - elseif t[7].connect[4] and t[8].connect[7] then - if t[8].connect[4] and t[9].connect[7] then - if t[12].connect[2] then - swap_stair(8, 4, 5) - elseif t[4].connect[6] then - swap_stair(8, 1, 4) - end - elseif t[8].connect[6] then - swap_stair(8, 1, 6) - elseif t[8].connect[2] then - swap_stair(8, 2, 5) - end - end - end - if t[11].stairs then - if t[7].connect[5] and t[11].connect[2] then - if t[11].connect[5] and t[13].connect[2] then - if t[12].connect[7] then - swap_stair(11, 4, 5) - elseif t[10].connect[3] then - swap_stair(11, 5, 8) - end - elseif t[11].connect[3] then - swap_stair(11, 3, 8) - elseif t[11].connect[7] then - swap_stair(11, 4, 7) - end - elseif t[7].connect[6] and t[11].connect[1] then - if t[11].connect[6] and t[13].connect[1] then - if t[10].connect[4] then - swap_stair(11, 6, 7) - elseif t[12].connect[8] then - swap_stair(11, 3, 6) - end - elseif t[11].connect[8] then - swap_stair(11, 3, 8) - elseif t[11].connect[4] then - swap_stair(11, 4, 7) - end - end - end - if t[6].stairs then - if t[7].connect[7] and t[6].connect[4] then - if t[6].connect[7] and t[5].connect[4] then - if t[10].connect[1] then - swap_stair(6, 6, 7) - elseif t[2].connect[5] then - swap_stair(6, 2, 7) - end - elseif t[6].connect[5] then - swap_stair(6, 2, 5) - elseif t[6].connect[1] then - swap_stair(6, 1, 6) - end - elseif t[7].connect[8] and t[6].connect[3] then - if t[6].connect[8] and t[5].connect[3] then - if t[2].connect[6] then - swap_stair(6, 1, 8) - elseif t[10].connect[2] then - swap_stair(6, 5, 8) - end - elseif t[6].connect[2] then - swap_stair(6, 2, 5) - elseif t[6].connect[6] then - swap_stair(6, 1, 6) - end - end - end - end - minetest.override_item(name, { - stairs = {name, name.."_outer", name.."_inner"}, - after_dig_node = function(pos, oldnode) after_dig_node(pos, oldnode) end, - on_place = nil, - after_place_node = function(pos, placer, itemstack, pointed_thing) - local node = minetest.get_node(pos) - local ceiling = false - if pointed_thing.under.y > pointed_thing.above.y then - ceiling = true - if node.param2 == 0 then node.param2 = 20 - elseif node.param2 == 1 then node.param2 = 23 - elseif node.param2 == 2 then node.param2 = 22 - elseif node.param2 == 3 then node.param2 = 21 - end - end - local connect = stair_param_to_connect(get_stair_param(node), ceiling) - local t = { - {pos = {x = pos.x - 1, y = pos.y, z = pos.z + 1}}, {pos = {x = pos.x, y = pos.y, z = pos.z + 1}}, {pos = {x = pos.x + 1, y = pos.y, z = pos.z + 1}}, - {pos = {x = pos.x - 1, y = pos.y, z = pos.z}}, {pos = pos, stairs = {name, name.."_outer", name.."_inner"}, connect = connect}, {pos = {x = pos.x + 1, y = pos.y, z = pos.z}}, - {pos = {x = pos.x - 1, y = pos.y, z = pos.z - 1}}, {pos = {x = pos.x, y = pos.y, z = pos.z - 1}}, {pos = {x = pos.x + 1, y = pos.y, z = pos.z - 1}}, - } - for i,v in ipairs(t) do - if not v.connect then - local node = minetest.get_node(v.pos) - local node_def = minetest.registered_nodes[node.name] - if not node_def then - return - end - if node_def.stairs then - t[i].stairs = node_def.stairs - t[i].connect = stair_param_to_connect(get_stair_param(node), ceiling) - else - t[i].connect = {false, false, false, false, false, false, false, false} - end - end - end - local function reset_node(n1, n2) - local connect = {false, false, false, false, false, false, false, false} - connect[n1] = true - connect[n2] = true - node = get_stair_from_param(stair_connect_to_param(connect, ceiling), t[5].stairs) - end - local function swap_stair(index, n1, n2) - local connect = {false, false, false, false, false, false, false, false} - connect[n1] = true - connect[n2] = true - local node = get_stair_from_param(stair_connect_to_param(connect, ceiling), t[index].stairs) - t[index].connect = connect - minetest.swap_node(t[index].pos, node) - end - if connect[3] then - if t[4].connect[2] and t[4].connect[5] and t[1].connect[5] and not t[7].connect[2] then - swap_stair(4, 2, 3) - elseif t[4].connect[1] and t[4].connect[6] and t[7].connect[1] and not t[1].connect[6] then - swap_stair(4, 3, 6) - end - if t[6].connect[1] and t[6].connect[6] and t[3].connect[6] and not t[9].connect[1] then - swap_stair(6, 1, 8) - elseif t[6].connect[2] and t[6].connect[5] and t[9].connect[2] and not t[3].connect[5] then - swap_stair(6, 5, 8) - end - if t[4].connect[3] ~= t[6].connect[8] then - if t[4].connect[3] then - if t[2].connect[6] then - reset_node(1, 8) - elseif t[8].connect[2] then - reset_node(5, 8) - elseif t[2].connect[4] and t[2].connect[7] and t[1].connect[4] and not t[3].connect[7] then - swap_stair(2, 6, 7) - reset_node(1, 8) - elseif t[2].connect[3] and t[2].connect[8] and t[3].connect[8] and not t[1].connect[3] then - swap_stair(2, 3, 6) - reset_node(1, 8) - elseif t[8].connect[3] and t[8].connect[8] and t[9].connect[8] and not t[7].connect[3] then - swap_stair(8, 2, 3) - reset_node(5, 8) - elseif t[8].connect[4] and t[8].connect[7] and t[7].connect[4] and not t[9].connect[7] then - swap_stair(8, 2, 7) - reset_node(5, 8) - end - else - if t[2].connect[5] then - reset_node(2, 3) - elseif t[8].connect[1] then - reset_node(3, 6) - elseif t[2].connect[4] and t[2].connect[7] and t[3].connect[7] and not t[1].connect[4] then - swap_stair(2, 4, 5) - reset_node(2, 3) - elseif t[2].connect[3] and t[2].connect[8] and t[1].connect[3] and not t[3].connect[8] then - swap_stair(2, 5, 8) - reset_node(2, 3) - elseif t[8].connect[3] and t[8].connect[8] and t[7].connect[3] and not t[9].connect[8] then - swap_stair(8, 1, 8) - reset_node(3, 6) - elseif t[8].connect[4] and t[8].connect[7] and t[9].connect[7] and not t[7].connect[4] then - swap_stair(8, 1, 4) - reset_node(3, 6) - end - end - end - elseif connect[2] then - if t[2].connect[4] and t[2].connect[7] and t[3].connect[7] and not t[1].connect[4] then - swap_stair(2, 4, 5) - elseif t[2].connect[3] and t[2].connect[8] and t[1].connect[3] and not t[3].connect[8] then - swap_stair(2, 5, 8) - end - if t[8].connect[3] and t[8].connect[8] and t[9].connect[8] and not t[7].connect[3] then - swap_stair(8, 2, 3) - elseif t[8].connect[4] and t[8].connect[7] and t[7].connect[4] and not t[9].connect[7] then - swap_stair(8, 2, 7) - end - if t[2].connect[5] ~= t[8].connect[2] then - if t[2].connect[5] then - if t[6].connect[8] then - reset_node(2, 3) - elseif t[4].connect[4] then - reset_node(2, 7) - elseif t[6].connect[1] and t[6].connect[6] and t[3].connect[6] and not t[9].connect[1] then - swap_stair(6, 1, 8) - reset_node(2, 3) - elseif t[6].connect[2] and t[6].connect[5] and t[9].connect[2] and not t[3].connect[5] then - swap_stair(6, 5, 8) - reset_node(2, 3) - elseif t[4].connect[2] and t[4].connect[5] and t[7].connect[2] and not t[1].connect[5] then - swap_stair(4, 4, 5) - reset_node(2, 7) - elseif t[4].connect[1] and t[4].connect[6] and t[1].connect[6] and not t[7].connect[1] then - swap_stair(4, 1, 4) - reset_node(2, 7) - end - else - if t[6].connect[7] then - reset_node(4, 5) - elseif t[4].connect[3] then - reset_node(5, 8) - elseif t[6].connect[1] and t[6].connect[6] and t[9].connect[1] and not t[3].connect[6] then - swap_stair(6, 6, 7) - reset_node(4, 5) - elseif t[6].connect[2] and t[6].connect[5] and t[3].connect[5] and not t[9].connect[2] then - swap_stair(6, 2, 7) - reset_node(4, 5) - elseif t[4].connect[2] and t[4].connect[5] and t[1].connect[5] and not t[7].connect[2] then - swap_stair(4, 2, 3) - reset_node(5, 8) - elseif t[4].connect[1] and t[4].connect[6] and t[7].connect[1] and not t[1].connect[6] then - swap_stair(4, 3, 6) - reset_node(5, 8) - end - end - end - elseif connect[4] then - if t[6].connect[1] and t[6].connect[6] and t[9].connect[1] and not t[3].connect[6] then - swap_stair(6, 6, 7) - elseif t[6].connect[2] and t[6].connect[5] and t[3].connect[5] and not t[9].connect[2] then - swap_stair(6, 2, 7) - end - if t[4].connect[2] and t[4].connect[5] and t[7].connect[2] and not t[1].connect[5] then - swap_stair(4, 4, 5) - elseif t[4].connect[1] and t[4].connect[6] and t[1].connect[6] and not t[7].connect[1] then - swap_stair(4, 1, 4) - end - if t[4].connect[4] ~= t[6].connect[7] then - if t[4].connect[4] then - if t[8].connect[1] then - reset_node(6, 7) - elseif t[2].connect[5] then - reset_node(2, 7) - elseif t[8].connect[3] and t[8].connect[8] and t[7].connect[3] and not t[9].connect[8] then - swap_stair(8, 1, 8) - reset_node(6, 7) - elseif t[8].connect[4] and t[8].connect[7] and t[9].connect[7] and not t[7].connect[4] then - swap_stair(8, 1, 4) - reset_node(6, 7) - elseif t[2].connect[4] and t[2].connect[7] and t[3].connect[7] and not t[1].connect[4] then - swap_stair(2, 4, 5) - reset_node(2, 7) - elseif t[2].connect[3] and t[2].connect[8] and t[1].connect[3] and not t[3].connect[8] then - swap_stair(2, 5, 8) - reset_node(2, 7) - end - else - if t[8].connect[2] then - reset_node(4, 5) - elseif t[2].connect[6] then - reset_node(1, 4) - elseif t[8].connect[3] and t[8].connect[8] and t[9].connect[8] and not t[7].connect[3] then - swap_stair(8, 2, 3) - reset_node(4, 5) - elseif t[8].connect[4] and t[8].connect[7] and t[7].connect[4] and not t[9].connect[7] then - swap_stair(8, 2, 7) - reset_node(4, 5) - elseif t[2].connect[4] and t[2].connect[7] and t[1].connect[4] and not t[3].connect[7] then - swap_stair(2, 6, 7) - reset_node(1, 4) - elseif t[2].connect[3] and t[2].connect[8] and t[3].connect[8] and not t[1].connect[3] then - swap_stair(2, 3, 6) - reset_node(1, 4) - end - end - end - elseif connect[1] then - if t[8].connect[3] and t[8].connect[8] and t[7].connect[3] and not t[9].connect[8] then - swap_stair(8, 1, 8) - elseif t[8].connect[4] and t[8].connect[7] and t[9].connect[7] and not t[7].connect[4] then - swap_stair(8, 1, 4) - end - if t[2].connect[4] and t[2].connect[7] and t[1].connect[4] and not t[3].connect[7] then - swap_stair(2, 6, 7) - elseif t[2].connect[3] and t[2].connect[8] and t[3].connect[8] and not t[1].connect[3] then - swap_stair(2, 3, 6) - end - if t[2].connect[6] ~= t[8].connect[1] then - if t[2].connect[6] then - if t[4].connect[3] then - reset_node(1, 8) - elseif t[6].connect[7] then - reset_node(1, 4) - elseif t[4].connect[2] and t[4].connect[5] and t[1].connect[5] and not t[7].connect[2] then - swap_stair(4, 2, 3) - reset_node(1, 8) - elseif t[4].connect[1] and t[4].connect[6] and t[7].connect[1] and not t[1].connect[6] then - swap_stair(4, 3, 6) - reset_node(1, 8) - elseif t[6].connect[1] and t[6].connect[6] and t[9].connect[1] and not t[3].connect[6] then - swap_stair(6, 6, 7) - reset_node(1, 4) - elseif t[6].connect[2] and t[6].connect[5] and t[3].connect[5] and not t[9].connect[2] then - swap_stair(6, 2, 7) - reset_node(1, 4) - end - else - if t[4].connect[4] then - reset_node(6, 7) - elseif t[6].connect[8] then - reset_node(3, 6) - elseif t[4].connect[2] and t[4].connect[5] and t[7].connect[2] and not t[1].connect[5] then - swap_stair(4, 4, 5) - reset_node(6, 7) - elseif t[4].connect[1] and t[4].connect[6] and t[1].connect[6] and not t[7].connect[1] then - swap_stair(4, 1, 4) - reset_node(6, 7) - elseif t[6].connect[1] and t[6].connect[6] and t[3].connect[6] and not t[9].connect[1] then - swap_stair(6, 1, 8) - reset_node(3, 6) - elseif t[6].connect[2] and t[6].connect[5] and t[9].connect[2] and not t[3].connect[5] then - swap_stair(6, 5, 8) - reset_node(3, 6) - end - end - end - end - minetest.swap_node(pos, node) - end - }) - minetest.register_node(":"..name.."_outer", { - description = node_def.description, - _doc_items_create_entry = false, - drawtype = "nodebox", - tiles = outer_tiles, - paramtype = "light", - paramtype2 = "facedir", - is_ground_content = false, - groups = outer_groups, - sounds = node_def.sounds, - 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} - } - }, - drop = drop, - stairs = {name, name.."_outer", name.."_inner"}, - after_dig_node = function(pos, oldnode) after_dig_node(pos, oldnode) end, - _mcl_hardness = node_def._mcl_hardness, - on_rotate = false, - }) - minetest.register_node(":"..name.."_inner", { - description = node_def.description, - _doc_items_create_entry = false, - drawtype = "nodebox", - tiles = inner_tiles, - paramtype = "light", - paramtype2 = "facedir", - is_ground_content = false, - groups = inner_groups, - sounds = node_def.sounds, - 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} - } - }, - drop = drop, - stairs = {name, name.."_outer", name.."_inner"}, - after_dig_node = function(pos, oldnode) after_dig_node(pos, oldnode) end, - _mcl_hardness = node_def._mcl_hardness, - on_rotate = false, - }) - - if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", name, "nodes", name.."_inner") - doc.add_entry_alias("nodes", name, "nodes", name.."_outer") - end -end - - diff --git a/mods/ITEMS/mcl_stairs/crafting.lua b/mods/ITEMS/mcl_stairs/crafting.lua deleted file mode 100644 index f31237eed5..0000000000 --- a/mods/ITEMS/mcl_stairs/crafting.lua +++ /dev/null @@ -1,53 +0,0 @@ -minetest.register_craft({ - output = "mcl_core:sandstonecarved", - recipe = { - {"mcl_stairs:slab_sandstone"}, - {"mcl_stairs:slab_sandstone"} - } -}) - -minetest.register_craft({ - output = "mcl_core:redsandstonecarved", - recipe = { - {"mcl_stairs:slab_redsandstone"}, - {"mcl_stairs:slab_redsandstone"} - } -}) - -minetest.register_craft({ - output = "mcl_core:stonebrickcarved", - recipe = { - {"mcl_stairs:slab_stonebrick"}, - {"mcl_stairs:slab_stonebrick"} - } -}) - -minetest.register_craft({ - output = "mcl_end:purpur_pillar", - recipe = { - {"mcl_stairs:slab_purpur_block"}, - {"mcl_stairs:slab_purpur_block"} - } -}) - -minetest.register_craft({ - output = "mcl_nether:quartz_chiseled 2", - recipe = { - {"mcl_stairs:slab_quartzblock"}, - {"mcl_stairs:slab_quartzblock"}, - } -}) - --- Fuel -minetest.register_craft({ - type = "fuel", - recipe = "group:wood_stairs", - burntime = 15, -}) -minetest.register_craft({ - type = "fuel", - recipe = "group:wood_slab", - -- Original burn time: 7.5 (PC edition) - burntime = 8, -}) - diff --git a/mods/ITEMS/mcl_stairs/init.lua b/mods/ITEMS/mcl_stairs/init.lua deleted file mode 100644 index 92f0640b3f..0000000000 --- a/mods/ITEMS/mcl_stairs/init.lua +++ /dev/null @@ -1,16 +0,0 @@ --- Minetest 0.4 mod: mcl_stairs --- See README.txt for licensing and other information. - --- Global namespace for functions - -mcl_stairs = {} - --- Load other files - -local modpath = minetest.get_modpath(minetest.get_current_modname()) - -dofile(modpath.."/api.lua") -dofile(modpath.."/cornerstair.lua") -dofile(modpath.."/register.lua") -dofile(modpath.."/crafting.lua") -dofile(modpath.."/alias.lua") diff --git a/mods/ITEMS/mcl_stairs/license.txt b/mods/ITEMS/mcl_stairs/license.txt deleted file mode 100644 index 8f16bbd7b8..0000000000 --- a/mods/ITEMS/mcl_stairs/license.txt +++ /dev/null @@ -1,51 +0,0 @@ -License of source code ----------------------- - -GNU Lesser General Public License, version 2.1 -Copyright (C) 2011-2016 Kahrl -Copyright (C) 2011-2016 celeron55, Perttu Ahola -Copyright (C) 2012-2016 Various Minetest developers and contributors - -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 - - -Licenses of media (models) --------------------------- - -Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) -Copyright (C) 2015-2016 Jean-Patrick G. (kilbith) - -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/ diff --git a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.de.tr b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.de.tr deleted file mode 100644 index 8b53d8d139..0000000000 --- a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.de.tr +++ /dev/null @@ -1,101 +0,0 @@ -# textdomain: mcl_stairs -Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down.=Treppen sind nützlich, um auf höheres Gelände nur mit Gehen zu kommen, man muss nicht springen. Wenn Treppen in einem Eckmuster platziert werden, werden Ecktreppen erzeugt. Treppen, die an die Decke oder der oberen Hälfte eines Blocks platziert werden, werden verkehrt herum platziert. -Double @1=@1 (doppelt) -Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.=Eine Platte ist halb so hoch wie ihr Vollblock-Gegenstück und belegt entweder den unteren oder unteren Teil eines Blocks, je nach dem, wie er platziert wurde. Platten können leicht betreten werden, ohne springen zu müssen. Wird eine Platte auf einer anderen gleichen Platte platziert, ergibt das eine Doppelplatte. -Upper @1=@1 (oben) -Double slabs are full blocks which are created by placing two slabs of the same kind on each other.=Doppelplatten sind ganze Blöcke, die entstehen, wenn zwei gleiche Platten aufeinander gestapelt werden. -Oak Wood Stairs=Eichenholztreppe -Oak Wood Slab=Eichenholzplatte -Double Oak Wood Slab=Doppeleichenholzplatte -Jungle Wood Stairs=Dschungelholztreppe -Jungle Wood Slab=Dschungelholzplatte -Double Jungle Wood Slab=Doppeldschungelholzplatte -Acacia Wood Stairs=Akazienholztreppe -Acacia Wood Slab=Akazienholzplatte -Double Acacia Wood Slab=Doppelakazienholzplatte -Spruce Wood Stairs=Fichtenholztreppe -Spruce Wood Slab=Fichtenholzplatte -Double Spruce Wood Slab=Doppelfichtenholzplatte -Birch Wood Stairs=Birkenholztreppe -Birch Wood Slab=Birkenholzplatte -Double Birch Wood Slab=Doppelbirkenholzplatte -Dark Oak Wood Stairs=Schwarzeichenholzstreppe -Dark Oak Wood Slab=Schwarzeichenholzplatte -Double Dark Oak Wood Slab=Doppelschwarzeichenholzplatte -Stone Stairs=Steintreppe -Stone Slab=Steinplatte -Double Stone Slab=Doppelsteinplatte -Polished Stone Slab=Polierte Steinplatte -Double Polished Stone Slab=Doppelte polierte Steinplatte -Andesite Stairs=Andesittreppe -Andesite Slab=Andesitplatte -Double Andesite Slab=Doppelandesitplatte -Granite Stairs=Granittreppe -Granite Slab=Granitplatte -Double Granite Slab=Doppelgranitplatte -Diorite Stairs=Diorittreppe -Diorite Slab=Dioritplatte -Double Diorite Slab=Doppeldioritplatte -Cobblestone Stairs=Kopfsteinpflastertreppe -Cobblestone Slab=Kopfsteinpflasterplatte -Double Cobblestone Slab=Doppelkopfsteinpflasterplatte -Mossy Cobblestone Slab=Moosige Kopfsteinpflasterplatte -Mossy Cobblestone Stairs=Moosige Kopfsteinpflastertreppe -Double Mossy Cobblestone Slab=Doppelte moosige Kopfsteinpflasterplatte -Brick Stairs=Ziegeltreppe -Brick Slab=Ziegelplatte -Double Brick Slab=Doppelziegelplatte -Sandstone Stairs=Sandsteintreppe -Sandstone Slab=Sandsteinplatte -Double Sandstone Slab=Doppelsandsteinplatte -Smooth Sandstone Stairs=Glatte Sandsteintreppe -Smooth Sandstone Slab=Glatte Sandsteinplatte -Double Smooth Sandstone Slab=Doppelte glatte Sandsteinplatte -Red Sandstone Stairs=Rote Sandsteintreppe -Red Sandstone Slab=Rote Sandsteinplatte -Double Red Sandstone Slab=Doppelte rote Sandsteinplatte -Smooth Red Sandstone Stairs=Glatte rote Sandsteintreppe -Smooth Red Sandstone Slab=Glatte rote Sandsteinplatte -Double Smooth Red Sandstone Slab=Doppelte glatte rote Sandsteinplatte -Stone Bricks Stairs=Steinziegeltreppe -Stone Bricks Slab=Steinziegelplatte -Double Stone Bricks Slab=Doppelsteinziegelplatte -Quartz Stairs=Quarztreppe -Quartz Slab=Quarzplatte -Double Quartz Slab=Doppelquarzplatte -Smooth Quartz Stairs=Glatte Quarztreppe -Smooth Quartz Slab=Glatte Quarzplatte -Double Smooth Quartz Slab=Doppelte glatte Quarzplatte -Nether Brick Stairs=Netherziegeltreppe -Nether Brick Slab=Netherziegelplatte -Double Nether Brick Slab=Doppelte Netherziegelplatte -Red Nether Brick Stairs=Rote Netherbricktreppe -Red Nether Brick Slab=Rote Netherbrickplatte -Double Red Nether Brick Slab=Doppelte rote Netherbricktreppe -End Stone Brick Stairs=Endsteinziegeltreppe -End Stone Brick Slab=Endsteinziegelplatte -Double End Stone Brick Slab=Doppelte Endsteinziegelplatte -Purpur Stairs=Purpurtreppe -Purpur Slab=Purpurplatte -Double Purpur Slab=Doppelte Purpurplatte -Prismarine Stairs=Prismarintreppe -Prismarine Slab=Prismarinplatte -Double Prismarine Slab=Doppelte Prismarinplatte -Prismarine Brick Stairs=Prismarinziegeltreppe -Prismarine Brick Slab=Prismarinziegelplatte -Double Prismarine Brick Slab=Doppelte Prismarinziegelplatte -Dark Prismarine Stairs=Dunkelprismarintreppe -Dark Prismarine Slab=Dunkelprismarinplatte -Double Dark Prismarine Slab=Doppeldunkelprismarinplatte -Polished Andesite Slab=Polierte Andesitplatte -Double Polished Andesite Slab=Doppelte polierte Andesitplatte -Polished Andesite Stairs=Polierte Andesittreppe -Polished Granite Slab=Polierte Granitplatte -Double Polished Granite Slab=Doppelte polierte Granitplatte -Polished Granite Stairs=Polierte Granittreppe -Polished Diorite Slab=Polierte Dioritplatte -Double Polished Diorite Slab=Doppelte polierte Dioritplatte -Polished Diorite Stairs=Polierte Diorittreppe -Mossy Stone Brick Stairs=Moosige Steinziegeltreppe -Mossy Stone Brick Slab=Moosige Steinziegelplatte -Double Mossy Stone Brick Slab=Doppelte moosige Steinziegelplatte diff --git a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.es.tr b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.es.tr deleted file mode 100644 index 1a17a816a3..0000000000 --- a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.es.tr +++ /dev/null @@ -1,101 +0,0 @@ -# textdomain: mcl_stairs -Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down.=Las escaleras son útiles para llegar a lugares más altos al caminar sobre ellas; No se requiere saltar. Colocar escaleras en un patrón de esquina creará escaleras de esquina. Las escaleras colocadas en el techo o en la mitad superior del lado de un bloque se colocarán boca abajo. -Double @1=@1 (Doble) -Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.=Las losas son la mitad de altas que sus contrapartes de bloque completo y ocupan la parte inferior o superior de un bloque, dependiendo de cómo se haya colocado. Las losas se pueden pisar fácilmente sin necesidad de saltar. Cuando se coloca una losa en otra losa del mismo tipo, se crea una losa doble. -Upper @1=@1 (Superior) -Double slabs are full blocks which are created by placing two slabs of the same kind on each other.=Las losas dobles son bloques completos que se crean colocando dos losas del mismo tipo entre sí -Oak Wood Stairs=Escaleras de roble -Oak Wood Slab=Losa de roble -Double Oak Wood Slab=Losa doble de roble -Jungle Wood Stairs=Escaleras de la selva -Jungle Wood Slab=Losa de la selva -Double Jungle Wood Slab=Losa doble de la selva -Acacia Wood Stairs=Escaleras de acacia -Acacia Wood Slab=Losa de acacia -Double Acacia Wood Slab=Losa doble de acacia -Spruce Wood Stairs=Escaleras de abeto -Spruce Wood Slab=Losa de abeto -Double Spruce Wood Slab=Losa doble de abeto -Birch Wood Stairs=Escaleras de abedul -Birch Wood Slab=Losa de abedul -Double Birch Wood Slab=Losa doble de abedul -Dark Oak Wood Stairs=Escaleras de roble oscuro -Dark Oak Wood Slab=Losa de roble oscuro -Double Dark Oak Wood Slab=Losa doble de roble oscuro -Stone Stairs=Escaleras de piedra -Stone Slab=Losa de piedra -Double Stone Slab=Losa doble de piedra -Polished Stone Slab=Losa de piedra pulida -Double Polished Stone Slab=Losa doble de piedra pulida -Andesite Stairs=Escaleras de andesita -Andesite Slab=Losa de andesita -Double Andesite Slab=Losa doble de andesita -Granite Stairs=Escaleras de granito -Granite Slab=Losa de granito -Double Granite Slab=Losa doble de granito -Diorite Stairs=Escaleras de diorita -Diorite Slab=Losa de diorita -Double Diorite Slab=Losa doble de diorita -Cobblestone Stairs=Escaleras de roca -Cobblestone Slab=Losa de roca -Double Cobblestone Slab=Losa doble de roca -Mossy Cobblestone Slab=Losa de roca musgosa -Mossy Cobblestone Stairs=Escaleras de roca musgosa -Double Mossy Cobblestone Slab=Losa doble de roca musgosa -Brick Stairs=Escaleras de ladrillos -Brick Slab=Losa de ladrillos -Double Brick Slab=Losa doble de ladrillos -Sandstone Stairs=Escaleras de arenisca -Sandstone Slab=Losa de arenisca -Double Sandstone Slab=Losa doble de arenisca -Smooth Sandstone Stairs=Escaleras de arenisca lisa -Smooth Sandstone Slab=Losa de arenisca lisa -Double Smooth Sandstone Slab=Losa doble de arenisca lisa -Red Sandstone Stairs=Escaleras de arenisca roja -Red Sandstone Slab=Losa de arenisca roja -Double Red Sandstone Slab=Losa doble de arenisca roja -Smooth Red Sandstone Stairs=Escaleras de arenisca roja lisa -Smooth Red Sandstone Slab=Losa de arenisca roja lisa -Double Smooth Red Sandstone Slab=Losa doble de arenisca roja lisa -Stone Bricks Stairs=Escaleras de ladrillos de piedra -Stone Bricks Slab=Losa de ladrillos de piedra -Double Stone Bricks Slab=Losa doble de ladrillos de piedra -Quartz Stairs=Escaleras de cuarzo -Quartz Slab=Losa de cuarzo -Double Quartz Slab=Losa doble de cuarzo -Smooth Quartz Stairs=Escaleras de cuarzo liso -Smooth Quartz Slab=Losa de cuarzo liso -Double Smooth Quartz Slab=Losa doble de cuarzo liso -Nether Brick Stairs=Escaleras de ladrillos del Nether -Nether Brick Slab=Losa de ladrillos del Nether -Double Nether Brick Slab=Losa doble de ladrillos del Nether -Red Nether Brick Stairs=Escaleras de ladrillos del Nether rojos -Red Nether Brick Slab=Losa de ladrillos del Nether roja -Double Red Nether Brick Slab=Losa doble de ladrillos del Nether roja -End Stone Brick Stairs=Escaleras de ladrillos de piedra del End -End Stone Brick Slab=Losa de ladrillos de piedra del End -Double End Stone Brick Slab=Losa doble de ladrillos de piedra del End -Purpur Stairs=Escaleras de púrpur -Purpur Slab=Losa de púrpur -Double Purpur Slab=Losa doble de púrpur -Prismarine Stairs=Escaleras de prismarina -Prismarine Slab=Losa de prismarina -Double Prismarine Slab=Losa doble de prismarina -Prismarine Brick Stairs=Escaleras de ladrillos de prismarina -Prismarine Brick Slab=Losa de ladrillos de prismarina -Double Prismarine Brick Slab=Losa doble de ladrillos de prismarina -Dark Prismarine Stairs=Escaleras de prismarina oscura -Dark Prismarine Slab=Losa de prismarina oscura -Double Dark Prismarine Slab=Losa doble de prismarina oscura -Polished Andesite Slab=Losa de andesita pulida -Double Polished Andesite Slab=Losa doble de andesita pulida -Polished Andesite Stairs=Escaleras de andesita pulida -Polished Granite Slab=Losa de granito pulido -Double Polished Granite Slab=Losa doble de granito pulido -Polished Granite Stairs=Escaleras de granito pulido -Polished Diorite Slab=Losa de diorita pulida -Double Polished Diorite Slab=Losa doble de diorita pulida -Polished Diorite Stairs=Escaleras de diorita pulida -Mossy Stone Brick Stairs=Escaleras de ladrillos de piedra musgosos -Mossy Stone Brick Slab=Losa de ladrillos de piedra musgosos -Double Mossy Stone Brick Slab=Losa de ladrillo de piedra doble musgo diff --git a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.fr.tr b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.fr.tr deleted file mode 100644 index 4892122f63..0000000000 --- a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.fr.tr +++ /dev/null @@ -1,101 +0,0 @@ -# textdomain: mcl_stairs -Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down.=Les escaliers sont utiles pour atteindre des endroits plus élevés en marchant dessus; le saut n'est pas obligatoire. Placer les escaliers dans un motif d'angle créera des escaliers d'angle. Les escaliers placés au plafond ou dans la moitié supérieure du côté d'un bloc seront placés à l'envers. -Double @1=Double @1 -Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.=Les dalles sont deux fois moins hautes que leurs homologues de bloc complet et occupent la partie inférieure ou supérieure d'un bloc, selon la façon dont il a été placé. Les dalles peuvent être facilement franchies sans avoir à sauter. Lorsqu'une dalle est placée sur une autre dalle du même type, une double dalle est créée. -Upper @1=@1 Supérieur -Double slabs are full blocks which are created by placing two slabs of the same kind on each other.=Les dalles doubles sont des blocs entiers qui sont créés en plaçant deux dalles du même type l'une sur l'autre. -Oak Wood Stairs=Escalier en Bois de Chêne -Oak Wood Slab=Dalle en Bois de Chêne -Double Oak Wood Slab=Double Dalle en Bois de Chêne -Jungle Wood Stairs=Escalier en Bois d'Acajou -Jungle Wood Slab=Dalle en Bois d'Acajou -Double Jungle Wood Slab=Double Dalle en Bois d'Acajou -Acacia Wood Stairs=Escalier en Bois d'Acacia -Acacia Wood Slab=Dalle en Bois d'Acacia -Double Acacia Wood Slab=Double Dalle en Bois d'Acacia -Spruce Wood Stairs=Escalier en Bois de Sapin -Spruce Wood Slab=Dalle en Bois de Sapin -Double Spruce Wood Slab=Double Dalle en Bois de Sapin -Birch Wood Stairs=Escalier en Bois de Bouleau -Birch Wood Slab=Dalle en Bois de Bouleau -Double Birch Wood Slab=Double Dalle en Bois de Bouleau -Dark Oak Wood Stairs=Escalier en Bois de Chêne Noir -Dark Oak Wood Slab=Dalle en Bois de Chêne Noir -Double Dark Oak Wood Slab=Double Dalle en Bois de Chêne Noir -Stone Stairs=Escalier en Roche -Stone Slab=Dalle en Roche -Double Stone Slab=Double Dalle en Roche -Polished Stone Slab=Dalle en Pierre Polie -Double Polished Stone Slab=Double Dalle en Pierre Polie -Andesite Stairs=Escalier en Andésite -Andesite Slab=Dalle en Andésite -Double Andesite Slab=Double Dalle en Andésite -Granite Stairs=Escalier en Granit -Granite Slab=Dalle en Granit -Double Granite Slab=Double Dalle en Granit -Diorite Stairs=Escalier en Diorite -Diorite Slab=Dalle en Diorite -Double Diorite Slab=Double Dalle en Diorite -Cobblestone Stairs=Escalier en Pierre -Cobblestone Slab=Dalle en Pierre -Double Cobblestone Slab=Double Dalle en Pierre -Mossy Cobblestone Stairs=Escalier en Pierre Moussue -Mossy Cobblestone Slab=Dalle en Pierre Moussue -Double Mossy Cobblestone Slab=Double Dalle en Pierre Moussue -Brick Stairs=Escalier de Brique -Brick Slab=Dalle en Brique -Double Brick Slab=Double Dalle en Brique -Sandstone Stairs=Escalier en Grès -Sandstone Slab=Dalle en Grès -Double Sandstone Slab=Double Dalle en Grès -Smooth Sandstone Stairs=Escalier en Grès Poli -Smooth Sandstone Slab=Dalle en Grès Poli -Double Smooth Sandstone Slab=Double Dalle en Grès Poli -Red Sandstone Stairs=Escalier en Grès Rouge -Red Sandstone Slab=Dalle en Grès Rouge -Double Red Sandstone Slab=Double Dalle en Grès Rouge -Smooth Red Sandstone Stairs=Escalier en Grès Rouge Poli -Smooth Red Sandstone Slab=Dalle en Grès Rouge Poli -Double Smooth Red Sandstone Slab=Double Dalle en Grès Rouge Poli -Stone Bricks Stairs=Escalier en Pierre Taillée -Stone Bricks Slab=Dalle en Pierre Taillée -Double Stone Bricks Slab=Double Dalle en Pierre Taillée -Quartz Stairs=Escalier en Quartz -Quartz Slab=Dalle en Quartz -Double Quartz Slab=Double Dalle en Quartz -Smooth Quartz Stairs=Escalier en Quartz Poli -Smooth Quartz Slab=Dallle en Quartz Poli -Double Smooth Quartz Slab=Double Dalle en Quartz Poli -Nether Brick Stairs=Escalier en Brique du Nether -Nether Brick Slab=Dalle en Brique du Nether -Double Nether Brick Slab=Double Dalle en Brique du Nether -Red Nether Brick Stairs=Escalier en Brique Rouge du Nether -Red Nether Brick Slab=Dalle en Brique Rouge du Nether -Double Red Nether Brick Slab=Double Dalle en Brique Rouge du Nether -End Stone Brick Stairs=Escalier en Pierre de l'End -End Stone Brick Slab=Dalle en Pierre de l'End -Double End Stone Brick Slab=Double Dalle en Pierre de l'End -Purpur Stairs=Escalier en Purpur -Purpur Slab=Dalle en Purpur -Double Purpur Slab=Double Dalle en Purpur -Prismarine Stairs=Escalier en Prismarine -Prismarine Slab=Dalle en Prismarine -Double Prismarine Slab=Double Dalle en Prismarine -Prismarine Brick Stairs=Escalier en Brique Prismarine -Prismarine Brick Slab=Dalle en Brique Prismarine -Double Prismarine Brick Slab=Double Dalle en Brique Prismarine -Dark Prismarine Stairs=Escalier en Prismarine Sombre -Dark Prismarine Slab=Dalle en Prismarine Sombre -Double Dark Prismarine Slab=Double Dalle en Prismarine Sombre -Polished Andesite Slab=Dalle en Andésite Polie -Double Polished Andesite Slab=Double Dalle en Andésite Polie -Polished Andesite Stairs=Escalier en Andésite Polie -Polished Granite Slab=Dalle en Granit Poli -Double Polished Granite Slab=Double Dalle en Granit Poli -Polished Granite Stairs=Escalier en Granit Poli -Polished Diorite Slab=Dalle en Diorite Polie -Double Polished Diorite Slab=Double Dalle en Diorite Polie -Polished Diorite Stairs=Escalier en Diorite Polie -Mossy Stone Brick Stairs=Escalier en Pierre Taillée Moussue -Mossy Stone Brick Slab=Dalle en Pierre Taillée Moussue -Double Mossy Stone Brick Slab=Double Dalle en Pierre Taillée Moussue diff --git a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.pl.tr b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.pl.tr deleted file mode 100644 index 2b2b524862..0000000000 --- a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.pl.tr +++ /dev/null @@ -1,101 +0,0 @@ -# textdomain: mcl_stairs -Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down.=Schody są użyteczne by wspiąć się do wyższych miejsc poprzez chodzenie po nich. Nie trzeba na nich skakać. Umieszczenie schodów w rogu schodów dopasuje schodu do rogu. Schody postawione na suficie lub na górnej części bloku będą postawione do góry nogami. -Double @1=Podwójna @1 -Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.=Płyty są wysokości połowy odpowiadającego im bloku i zajmują górną lub dolną część bloku w zależności od tego jak są postawione. Na płyty można łatwo wejść bez konieczności skakania. Gdy płyta jest postawiona na innej płycie tego samego typu, podwójna płyta jest tworzona. -Upper @1=Górna @1 -Double slabs are full blocks which are created by placing two slabs of the same kind on each other.=Podwójne płyty są pełnymi blokami tworzonymi przez położenie dwóch płyt tego samego typu jedna na drugiej. -Oak Wood Stairs=Dębowe schody -Oak Wood Slab=Dębowa płyta -Double Oak Wood Slab=Podwójna dębowa płyta -Jungle Wood Stairs=Tropikalne schody -Jungle Wood Slab=Tropikalna płyta -Double Jungle Wood Slab=Podwójna tropikalna płyta -Acacia Wood Stairs=Akacjowe schody -Acacia Wood Slab=Akacjowa płyta -Double Acacia Wood Slab=Podwójna akacjowa płyta -Spruce Wood Stairs=Świerkowe schody -Spruce Wood Slab=Świerkowa płyta -Double Spruce Wood Slab=Podwójna świerkowa płyta -Birch Wood Stairs=Brzozowe schody -Birch Wood Slab=Brzozowa płyta -Double Birch Wood Slab=Podwójna brzozowa płyta -Dark Oak Wood Stairs=Ciemno-dębowe schody -Dark Oak Wood Slab=Ciemno-dębowa płyta -Double Dark Oak Wood Slab=Podwójna ciemno-dębowa płyta -Stone Stairs=Kamienne schody -Stone Slab=Kamienna płyta -Double Stone Slab=Podwójna kamienna płyta -Polished Stone Slab=Polerowana kamienna płyta -Double Polished Stone Slab=Podwójna polerowana kamienna płyta -Andesite Stairs=Andezytowe schody -Andesite Slab=Andezytowa płyta -Double Andesite Slab=Podwójne andezytowa płyta -Granite Stairs=Granitowe schody -Granite Slab=Granitowa płyta -Double Granite Slab=Podwójna granitowa płyta -Diorite Stairs=Diorytowe schody -Diorite Slab=Diorytowa płyta -Double Diorite Slab=Podwójna diorytowa płyta -Cobblestone Stairs=Brukowane schody -Cobblestone Slab=Brukowana płyta -Double Cobblestone Slab=Podwójna brukowana płyta -Mossy Cobblestone Stairs=Zamszone brukowane schody -Mossy Cobblestone Slab=Zamszona brukowana płyta -Double Mossy Cobblestone Slab=Podwójna zamszona brukowana płyta -Brick Stairs=Ceglane schody -Brick Slab=Ceglana płyta -Double Brick Slab=Podwójna ceglana płyta -Sandstone Stairs=Piaskowcowe schody -Sandstone Slab=Piaskowcowa płyta -Double Sandstone Slab=Podwójna piaskowcowa płyta -Smooth Sandstone Stairs=Polerowane piaskowcowe schody -Smooth Sandstone Slab=Polerowana piaskowcowa płyta -Double Smooth Sandstone Slab=Podwójna polerowana piaskowcowa płyta -Red Sandstone Stairs=Czerwone piaskowcowe schody -Red Sandstone Slab=Czerwona piaskowcowa płyta -Double Red Sandstone Slab=Podwójna czerwona piaskowcowa płyta -Smooth Red Sandstone Stairs=Polerowane czerwone piaskowcowe schody -Smooth Red Sandstone Slab=Polerowana czerwona piaskowcowa płyta -Double Smooth Red Sandstone Slab=Podwójna polerowana czerwona piaskowcowa płyta -Stone Bricks Stairs=Ceglane kamienne schody -Stone Bricks Slab=Ceglana kamienna płyta -Double Stone Bricks Slab=Podwójna ceglana kamienna płyta -Quartz Stairs=Kwarcowe schody -Quartz Slab=Kwarcowa płyta -Double Quartz Slab=Podwójna kwarcowa płyta -Smooth Quartz Stairs=Polerowane kwarcowe schody -Smooth Quartz Slab=Polerowana kwarcowa płyta -Double Smooth Quartz Slab=Podwójna polerowana kwarcowa płyta -Nether Brick Stairs=Netherowe ceglane schody -Nether Brick Slab=Netherowa ceglana płyta -Double Nether Brick Slab=Podwójna Netherowa ceglana płyta -Red Nether Brick Stairs=Czerwone Netherowe ceglane schody -Red Nether Brick Slab=Czerwona Netherowa ceglana płyta -Double Red Nether Brick Slab=Podwójna czerwona Netherowa ceglana płyta -End Stone Brick Stairs=Kresowe ceglane kamienne schody -End Stone Brick Slab=Kresowa ceglana kamienna płyta -Double End Stone Brick Slab=Podwójna kresowa ceglana kamienna płyta -Purpur Stairs=Purpurowe schody -Purpur Slab=Purpurowa płyta -Double Purpur Slab=Podwójna purpurowe płyta -Prismarine Stairs=Pryzmarynowe schody -Prismarine Slab=Pryzmarynowa płyta -Double Prismarine Slab=Podwójna pryzmarynowa płyta -Prismarine Brick Stairs=Pryzmarynowe ceglane schody -Prismarine Brick Slab=Pryzmarynowa ceglana płyta -Double Prismarine Brick Slab=Podwójna pryzmarynowa ceglana płyta -Dark Prismarine Stairs=Ciemne pryzmarynowe schody -Dark Prismarine Slab=Ciemna pryzmarynowa płyta -Double Dark Prismarine Slab=Podwójna ciemna pryzmarynowa płyta -Polished Andesite Slab=Polerowana andezytowa płyta -Double Polished Andesite Slab=Podwójna polerowana andezytowa płyta -Polished Andesite Stairs=Polerowane andezytowe schody -Polished Granite Slab=Polerowana granitowa płyta -Double Polished Granite Slab=Podwójna polerowana granitowa płyta -Polished Granite Stairs=Polerowane granitowe schody -Polished Diorite Slab=Polerowana diorytowa płyta -Double Polished Diorite Slab=Podwójna polerowana diorytowa płyta -Polished Diorite Stairs=Polerowane diorytowe schody -Mossy Stone Brick Stairs=Zamszone kamienne ceglane schody -Mossy Stone Brick Slab=Zamszona kamienna ceglana płyta -Double Mossy Stone Brick Slab=Podwójna zamszona kamienna ceglana płyta diff --git a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.ru.tr b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.ru.tr deleted file mode 100644 index 10d470fce0..0000000000 --- a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.ru.tr +++ /dev/null @@ -1,101 +0,0 @@ -# textdomain: mcl_stairs -Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down.=Ступеньки полезны, чтобы подниматься к высоким местам, идя по ним; прыжки при этом не требуются. Размещение ступенек по углам будет создавать угловые ступеньки. Ступеньки, устанавливаемые на потолке или в верхней половине боковой части блока, будет перевёрнуты вверх ногами. -Double @1=Двойная @1 -Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.=Плиты в два раза ниже, чем их блочные аналоги, и занимают либо нижнюю, либо верхнюю часть блока, в зависимости от того, как они размещались. На плиты можно легко подниматься без необходимости прыгать. Когда плита помещается на другую плиту того же типа, создается двойная плита. -Upper @1=Верхняя @1 -Double slabs are full blocks which are created by placing two slabs of the same kind on each other.=Двойные плиты это целые блоки, которые создаются путем размещения двух плит одного вида друг на друге. -Oak Wood Stairs=Дубовые ступеньки -Oak Wood Slab=Дубовая плита -Double Oak Wood Slab=Двойная дубовая плита -Jungle Wood Stairs=Ступеньки из дерева джунглей -Jungle Wood Slab=Плита из дерева джунглей -Double Jungle Wood Slab=Двойная плита из дерева джунглей -Acacia Wood Stairs=Ступеньки из акации -Acacia Wood Slab=Плита из акации -Double Acacia Wood Slab=Двойная плита из акации -Spruce Wood Stairs=Еловые ступеньки -Spruce Wood Slab=Еловая плита -Double Spruce Wood Slab=Двойная еловая плита -Birch Wood Stairs=Берёзовые ступеньки -Birch Wood Slab=Берёзовая плита -Double Birch Wood Slab=Двойная берёзовая плита -Dark Oak Wood Stairs=Ступеньки из тёмного дуба -Dark Oak Wood Slab=Плита из тёмного дуба -Double Dark Oak Wood Slab=Двойная плита из тёмного дуба -Stone Stairs=Каменные ступеньки -Stone Slab=Каменная плита -Double Stone Slab=Двойная каменная плита -Polished Stone Slab=Плита из гладкого камня -Double Polished Stone Slab=Двойная плита из гладкого камня -Andesite Stairs=Андезитовые ступеньки -Andesite Slab=Андезитовая плита -Double Andesite Slab=Двойная андезитовая плита -Granite Stairs=Гранитные ступеньки -Granite Slab=Гранитная плита -Double Granite Slab=Двойная гранитная плита -Diorite Stairs=Диоритовые ступеньки -Diorite Slab=Диоритовая плита -Double Diorite Slab=Двойная диоритовая плита -Cobblestone Stairs=Ступеньки из булыжника -Cobblestone Slab=Плита из булыжника -Double Cobblestone Slab=Двойная плита из булыжника -Mossy Cobblestone Stairs=Ступеньки из мшистого булыжника -Mossy Cobblestone Slab=Плита из мшистого булыжника -Double Mossy Cobblestone Slab=Двойная плита из мшистого булыжника -Brick Stairs=Кирпичные ступеньки -Brick Slab=Кирпичная плита -Double Brick Slab=Двойная кирпичная плита -Sandstone Stairs=Ступеньки из песчаника -Sandstone Slab=Плита из песчаника -Double Sandstone Slab=Двойная плита из песчаника -Smooth Sandstone Stairs=Ступеньки из гладкого песчаника -Smooth Sandstone Slab=Плита из гладкого песчаника -Double Smooth Sandstone Slab=Двойная плита из гладкого песчаника -Red Sandstone Stairs=Ступеньки из красного песчаника -Red Sandstone Slab=Плита из красного песчаника -Double Red Sandstone Slab=Двойная плита из красного песчаника -Smooth Red Sandstone Stairs=Ступеньки из гладкого красного песчаника -Smooth Red Sandstone Slab=Плита из гладкого красного песчаника -Double Smooth Red Sandstone Slab=Двойная плита из гладкого красного песчаника -Stone Bricks Stairs=Ступеньки из каменных блоков -Stone Bricks Slab=Плита из каменных блоков -Double Stone Bricks Slab=Двойная плита из каменных блоков -Quartz Stairs=Кварцевые ступеньки -Quartz Slab=Кварцевая плита -Double Quartz Slab=Двойная кварцевая плита -Smooth Quartz Stairs=Ступеньки из гладкого кварца -Smooth Quartz Slab=Плита из гладкого кварца -Double Smooth Quartz Slab=Двойная плита из гладкого кварца -Nether Brick Stairs=Ступеньки из адского кирпича -Nether Brick Slab=Плита из адского кирпича -Double Nether Brick Slab=Двойная плита из адского кирпича -Red Nether Brick Stairs=Ступеньки из красного адского кирпича -Red Nether Brick Slab=Плита из красного адского кирпича -Double Red Nether Brick Slab=Двойная из красного адского кирпича -End Stone Brick Stairs=Ступеньки из камня Предела -End Stone Brick Slab=Плита из камня Предела -Double End Stone Brick Slab=Двойная плита из камня Предела -Purpur Stairs=Пурпурные ступеньки -Purpur Slab=Пурпурная плита -Double Purpur Slab=Двойная пурпурная плита -Prismarine Stairs=Призмариновые ступеньки -Prismarine Slab=Призмариновая плита -Double Prismarine Slab=Двойная призмариновая плита -Prismarine Brick Stairs=Ступеньки из призмаринового кирпича -Prismarine Brick Slab=Плита из призмаринового кирпича -Double Prismarine Brick Slab=Двойная плита из призмаринового кирпича -Dark Prismarine Stairs=Ступеньки из тёмного призмарина -Dark Prismarine Slab=Плита из тёмного призмарина -Double Dark Prismarine Slab=Двойная плита из тёмного призмарина -Polished Andesite Slab=Плита из гладкого андезита -Double Polished Andesite Slab=Двойная плита из гладкого андезита -Polished Andesite Stairs=Ступеньки из гладкого андезита -Polished Granite Slab=Плита из гладкого гранита -Double Polished Granite Slab=Двойная плита из гладкого гранита -Polished Granite Stairs=Ступеньки из гладкого гранита -Polished Diorite Slab=Плита из гладкого диорита -Double Polished Diorite Slab=Двойная плита из гладкого диорита -Polished Diorite Stairs=Ступеньки из гладкого диорита -Mossy Stone Brick Stairs=Ступеньки из мшистого каменного блока -Mossy Stone Brick Slab=Плита из мшистого каменного блока -Double Mossy Stone Brick Slab=Двойная плита из мшистого каменного блока diff --git a/mods/ITEMS/mcl_stairs/locale/template.txt b/mods/ITEMS/mcl_stairs/locale/template.txt deleted file mode 100644 index 0638af3dbc..0000000000 --- a/mods/ITEMS/mcl_stairs/locale/template.txt +++ /dev/null @@ -1,101 +0,0 @@ -# textdomain: mcl_stairs -Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down.= -Double @1= -Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.= -Upper @1= -Double slabs are full blocks which are created by placing two slabs of the same kind on each other.= -Oak Wood Stairs= -Oak Wood Slab= -Double Oak Wood Slab= -Jungle Wood Stairs= -Jungle Wood Slab= -Double Jungle Wood Slab= -Acacia Wood Stairs= -Acacia Wood Slab= -Double Acacia Wood Slab= -Spruce Wood Stairs= -Spruce Wood Slab= -Double Spruce Wood Slab= -Birch Wood Stairs= -Birch Wood Slab= -Double Birch Wood Slab= -Dark Oak Wood Stairs= -Dark Oak Wood Slab= -Double Dark Oak Wood Slab= -Stone Stairs= -Stone Slab= -Double Stone Slab= -Polished Stone Slab= -Double Polished Stone Slab= -Andesite Stairs= -Andesite Slab= -Double Andesite Slab= -Granite Stairs= -Granite Slab= -Double Granite Slab= -Diorite Stairs= -Diorite Slab= -Double Diorite Slab= -Cobblestone Stairs= -Cobblestone Slab= -Double Cobblestone Slab= -Mossy Cobblestone Stairs= -Mossy Cobblestone Slab= -Double Mossy Cobblestone Slab= -Brick Stairs= -Brick Slab= -Double Brick Slab= -Sandstone Stairs= -Sandstone Slab= -Double Sandstone Slab= -Smooth Sandstone Stairs= -Smooth Sandstone Slab= -Double Smooth Sandstone Slab= -Red Sandstone Stairs= -Red Sandstone Slab= -Double Red Sandstone Slab= -Smooth Red Sandstone Stairs= -Smooth Red Sandstone Slab= -Double Smooth Red Sandstone Slab= -Stone Bricks Stairs= -Stone Bricks Slab= -Double Stone Bricks Slab= -Quartz Stairs= -Quartz Slab= -Double Quartz Slab= -Smooth Quartz Stairs= -Smooth Quartz Slab= -Double Smooth Quartz Slab= -Nether Brick Stairs= -Nether Brick Slab= -Double Nether Brick Slab= -Red Nether Brick Stairs= -Red Nether Brick Slab= -Double Red Nether Brick Slab= -End Stone Brick Stairs= -End Stone Brick Slab= -Double End Stone Brick Slab= -Purpur Stairs= -Purpur Slab= -Double Purpur Slab= -Prismarine Stairs= -Prismarine Slab= -Double Prismarine Slab= -Prismarine Brick Stairs= -Prismarine Brick Slab= -Double Prismarine Brick Slab= -Dark Prismarine Stairs= -Dark Prismarine Slab= -Double Dark Prismarine Slab= -Polished Andesite Slab= -Double Polished Andesite Slab= -Polished Andesite Stairs= -Polished Granite Slab= -Double Polished Granite Slab= -Polished Granite Stairs= -Polished Diorite Slab= -Double Polished Diorite Slab= -Polished Diorite Stairs= -Mossy Stone Brick Stairs= -Mossy Stone Brick Slab= -Double Mossy Stone Brick Slab= diff --git a/mods/ITEMS/mcl_stairs/mod.conf b/mods/ITEMS/mcl_stairs/mod.conf deleted file mode 100644 index a357c2c791..0000000000 --- a/mods/ITEMS/mcl_stairs/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = mcl_stairs -depends = mcl_core, mcl_sounds, mcl_nether, mcl_end, mcl_ocean diff --git a/mods/ITEMS/mcl_stairs/models/stairs_stair.obj b/mods/ITEMS/mcl_stairs/models/stairs_stair.obj deleted file mode 100644 index 198edf6e35..0000000000 --- a/mods/ITEMS/mcl_stairs/models/stairs_stair.obj +++ /dev/null @@ -1,115 +0,0 @@ -# Blender v2.72 (sub 0) OBJ File: '' -# www.blender.org -mtllib stairs.mtl -o stairs_top -v -0.500000 0.000000 -0.500000 -v -0.500000 0.000000 0.000000 -v 0.500000 0.000000 0.000000 -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.500000 0.500000 -v 0.500000 0.500000 0.500000 -vt 0.000000 0.000000 -vt 1.000000 0.000000 -vt 1.000000 0.500000 -vt 0.000000 0.500000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vn 0.000000 1.000000 0.000000 -g stairs_top -usemtl None -s off -f 4/1/1 1/2/1 2/3/1 3/4/1 -f 7/5/1 8/6/1 6/4/1 5/3/1 -o stairs_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 0.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 0.000000 -vn 0.000000 -1.000000 -0.000000 -g stairs_bottom -usemtl None -s off -f 11/7/2 9/8/2 10/9/2 12/10/2 -o stairs_right -v -0.500000 0.000000 -0.500000 -v -0.500000 -0.500000 -0.500000 -v -0.500000 0.000000 0.000000 -v -0.500000 -0.500000 0.500000 -v -0.500000 0.500000 0.000000 -v -0.500000 0.500000 0.500000 -vt 0.000000 0.500000 -vt 0.000000 0.000000 -vt 0.500000 0.500000 -vt 1.000000 1.000000 -vt 0.500000 1.000000 -vt 1.000000 0.000000 -vn -1.000000 0.000000 0.000000 -g stairs_right -usemtl None -s off -f 13/11/3 14/12/3 15/13/3 -f 15/13/3 18/14/3 17/15/3 -f 14/12/3 16/16/3 15/13/3 -f 16/16/3 18/14/3 15/13/3 -o stairs_left -v 0.500000 0.000000 0.000000 -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.000000 -v 0.500000 0.500000 0.500000 -vt 0.500000 0.500000 -vt 1.000000 0.000000 -vt 1.000000 0.500000 -vt 0.500000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 0.000000 -vn 1.000000 0.000000 0.000000 -g stairs_left -usemtl None -s off -f 19/17/4 20/18/4 21/19/4 -f 19/17/4 23/20/4 24/21/4 -f 20/18/4 19/17/4 22/22/4 -f 19/17/4 24/21/4 22/22/4 -o stairs_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.000000 0.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 0.000000 -vn 0.000000 -0.000000 1.000000 -g stairs_back -usemtl None -s off -f 26/23/5 28/24/5 27/25/5 25/26/5 -o stairs_front -v -0.500000 0.000000 -0.500000 -v -0.500000 -0.500000 -0.500000 -v -0.500000 0.000000 0.000000 -v 0.500000 0.000000 0.000000 -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 -vt 1.000000 0.000000 -vt 1.000000 0.500000 -vt 0.000000 0.500000 -vt 0.000000 0.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vn 0.000000 0.000000 -1.000000 -g stairs_front -usemtl None -s off -f 30/27/6 29/28/6 34/29/6 33/30/6 -f 31/28/6 35/31/6 36/32/6 32/29/6 diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua deleted file mode 100644 index 5de3805850..0000000000 --- a/mods/ITEMS/mcl_stairs/register.lua +++ /dev/null @@ -1,196 +0,0 @@ --- Register all Minecraft stairs and slabs --- Note about hardness: For some reason, the hardness of slabs and stairs don't always match nicely, so that some --- slabs actually take slightly longer to be dug than their stair counterparts. --- Note sure if it is a good idea to preserve this oddity. - -local S = minetest.get_translator(minetest.get_current_modname()) - -local woods = { - { "wood", "default_wood.png", S("Oak Wood Stairs"), S("Oak Wood Slab"), S("Double Oak Wood Slab") }, - { "junglewood", "default_junglewood.png", S("Jungle Wood Stairs"), S("Jungle Wood Slab"), S("Double Jungle Wood Slab") }, - { "acaciawood", "default_acacia_wood.png", S("Acacia Wood Stairs"), S("Acacia Wood Slab"), S("Double Acacia Wood Slab") }, - { "sprucewood", "mcl_core_planks_spruce.png", S("Spruce Wood Stairs"), S("Spruce Wood Slab"), S("Double Spruce Wood Slab") }, - { "birchwood", "mcl_core_planks_birch.png", S("Birch Wood Stairs"), S("Birch Wood Slab"), S("Double Birch Wood Slab") }, - { "darkwood", "mcl_core_planks_big_oak.png", S("Dark Oak Wood Stairs"), S("Dark Oak Wood Slab"), S("Double Dark Oak Wood Slab") }, -} - -for w=1, #woods do - local wood = woods[w] - mcl_stairs.register_stair(wood[1], "mcl_core:"..wood[1], - {handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, - {wood[2]}, - wood[3], - mcl_sounds.node_sound_wood_defaults(), 3, 2, - "woodlike") - mcl_stairs.register_slab(wood[1], "mcl_core:"..wood[1], - {handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1, fire_encouragement=5, fire_flammability=20}, - {wood[2]}, - wood[4], - mcl_sounds.node_sound_wood_defaults(), 3, 2, - wood[5]) -end - -mcl_stairs.register_stair_and_slab_simple("stone_rough", "mcl_core:stone", S("Stone Stairs"), S("Stone Slab"), S("Double Stone Slab")) - -mcl_stairs.register_slab("stone", "mcl_core:stone_smooth", - {pickaxey=1, material_stone=1}, - {"mcl_stairs_stone_slab_top.png", "mcl_stairs_stone_slab_top.png", "mcl_stairs_stone_slab_side.png"}, - S("Polished Stone Slab"), - mcl_sounds.node_sound_stone_defaults(), 6, 2, - S("Double Polished Stone Slab")) - -mcl_stairs.register_stair_and_slab_simple("andesite", "mcl_core:andesite", S("Andesite Stairs"), S("Andesite Slab"), S("Double Andesite Slab")) -mcl_stairs.register_stair_and_slab_simple("granite", "mcl_core:granite", S("Granite Stairs"), S("Granite Slab"), S("Double Granite Slab")) -mcl_stairs.register_stair_and_slab_simple("diorite", "mcl_core:diorite", S("Diorite Stairs"), S("Diorite Slab"), S("Double Diorite Slab")) - -mcl_stairs.register_stair_and_slab_simple("cobble", "mcl_core:cobble", S("Cobblestone Stairs"), S("Cobblestone Slab"), S("Double Cobblestone Slab")) -mcl_stairs.register_stair_and_slab_simple("mossycobble", "mcl_core:mossycobble", S("Mossy Cobblestone Stairs"), S("Mossy Cobblestone Slab"), S("Double Mossy Cobblestone Slab")) - -mcl_stairs.register_stair_and_slab_simple("brick_block", "mcl_core:brick_block", S("Brick Stairs"), S("Brick Slab"), S("Double Brick Slab")) - - -mcl_stairs.register_stair("sandstone", "group:normal_sandstone", - {pickaxey=1, material_stone=1}, - {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, - S("Sandstone Stairs"), - mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, - nil, "mcl_core:sandstone") --fixme: extra parameter from previous release -mcl_stairs.register_slab("sandstone", "group:normal_sandstone", - {pickaxey=1, material_stone=1}, - {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, - S("Sandstone Slab"), - mcl_sounds.node_sound_stone_defaults(), 6, 2, - S("Double Sandstone Slab"), "mcl_core:sandstone") --fixme: extra parameter from previous release -mcl_stairs.register_stair_and_slab_simple("sandstonesmooth2", "mcl_core:sandstonesmooth2", S("Smooth Sandstone Stairs"), S("Smooth Sandstone Slab"), S("Double Smooth Sandstone Slab")) - -mcl_stairs.register_stair("redsandstone", "group:red_sandstone", - {pickaxey=1, material_stone=1}, - {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, - S("Red Sandstone Stairs"), - mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, - nil, "mcl_core:redsandstone") --fixme: extra parameter from previous release -mcl_stairs.register_slab("redsandstone", "group:red_sandstone", - {pickaxey=1, material_stone=1}, - {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, - S("Red Sandstone Slab"), - mcl_sounds.node_sound_stone_defaults(), 6, 2, - S("Double Red Sandstone Slab"), "mcl_core:redsandstone") --fixme: extra parameter from previous release -mcl_stairs.register_stair_and_slab_simple("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", S("Smooth Red Sandstone Stairs"), S("Smooth Red Sandstone Slab"), S("Double Smooth Red Sandstone Slab")) - --- Intentionally not group:stonebrick because of mclx_stairs -mcl_stairs.register_stair("stonebrick", "mcl_core:stonebrick", - {pickaxey=1, material_stone=1}, - {"default_stone_brick.png"}, - S("Stone Bricks Stairs"), - mcl_sounds.node_sound_stone_defaults(), 6, 1.5, - nil, "mcl_core:stonebrick") --fixme: extra parameter from previous release -mcl_stairs.register_slab("stonebrick", "mcl_core:stonebrick", - {pickaxey=1, material_stone=1}, - {"default_stone_brick.png"}, - S("Stone Bricks Slab"), - mcl_sounds.node_sound_stone_defaults(), 6, 2, - S("Double Stone Bricks Slab"), "mcl_core:stonebrick") --fixme: extra parameter from previous release - -mcl_stairs.register_stair("quartzblock", "group:quartz_block", - {pickaxey=1, material_stone=1}, - {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, - S("Quartz Stairs"), - mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, - nil, "mcl_nether:quartz_block") --fixme: extra parameter from previous release -mcl_stairs.register_slab("quartzblock", "group:quartz_block", - {pickaxey=1, material_stone=1}, - {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, - S("Quartz Slab"), - mcl_sounds.node_sound_stone_defaults(), 6, 2, - S("Double Quartz Slab"), "mcl_nether:quartz_block") --fixme: extra parameter from previous release - -mcl_stairs.register_stair_and_slab_simple("quartz_smooth", "mcl_nether:quartz_smooth", S("Smooth Quartz Stairs"), S("Smooth Quartz Slab"), S("Double Smooth Quartz Slab")) - -mcl_stairs.register_stair_and_slab("nether_brick", "mcl_nether:nether_brick", - {pickaxey=1, material_stone=1}, - {"mcl_nether_nether_brick.png"}, - S("Nether Brick Stairs"), - S("Nether Brick Slab"), - mcl_sounds.node_sound_stone_defaults(), 6, 2, - S("Double Nether Brick Slab"), nil) -mcl_stairs.register_stair_and_slab("red_nether_brick", "mcl_nether:red_nether_brick", - {pickaxey=1, material_stone=1}, - {"mcl_nether_red_nether_brick.png"}, - S("Red Nether Brick Stairs"), - S("Red Nether Brick Slab"), - mcl_sounds.node_sound_stone_defaults(), 6, 2, - S("Double Red Nether Brick Slab"), nil) - -mcl_stairs.register_stair_and_slab_simple("end_bricks", "mcl_end:end_bricks", S("End Stone Brick Stairs"), S("End Stone Brick Slab"), S("Double End Stone Brick Slab")) - -mcl_stairs.register_stair("purpur_block", "group:purpur_block", - {pickaxey=1, material_stone=1}, - {"mcl_end_purpur_block.png"}, - S("Purpur Stairs"), - mcl_sounds.node_sound_stone_defaults(), 6, 1.5, - nil) -mcl_stairs.register_slab("purpur_block", "group:purpur_block", - {pickaxey=1, material_stone=1}, - {"mcl_end_purpur_block.png"}, - S("Purpur Slab"), - mcl_sounds.node_sound_stone_defaults(), 6, 2, - S("Double Purpur Slab")) - -mcl_stairs.register_stair_and_slab_simple("prismarine", "mcl_ocean:prismarine", S("Prismarine Stairs"), S("Prismarine Slab"), S("Double Prismarine Slab")) - -mcl_stairs.register_stair_and_slab_simple("prismarine_brick", "mcl_ocean:prismarine_brick", S("Prismarine Brick Stairs"), S("Prismarine Brick Slab"), S("Double Prismarine Brick Slab")) -mcl_stairs.register_stair_and_slab_simple("prismarine_dark", "mcl_ocean:prismarine_dark", S("Dark Prismarine Stairs"), S("Dark Prismarine Slab"), S("Double Dark Prismarine Slab")) - -mcl_stairs.register_slab("andesite_smooth", "mcl_core:andesite_smooth", - {pickaxey=1}, - {"mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, - S("Polished Andesite Slab"), - nil, 6, nil, - S("Double Polished Andesite Slab")) -mcl_stairs.register_stair("andesite_smooth", "mcl_core:andesite_smooth", - {pickaxey=1}, - {"mcl_stairs_andesite_smooth_slab.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, - S("Polished Andesite Stairs"), - nil, 6, nil, - "woodlike") - -mcl_stairs.register_slab("granite_smooth", "mcl_core:granite_smooth", - {pickaxey=1}, - {"mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, - S("Polished Granite Slab"), - nil, 6, nil, - S("Double Polished Granite Slab")) -mcl_stairs.register_stair("granite_smooth", "mcl_core:granite_smooth", - {pickaxey=1}, - {"mcl_stairs_granite_smooth_slab.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, - S("Polished Granite Stairs"), - nil, 6, nil, - "woodlike") - -mcl_stairs.register_slab("diorite_smooth", "mcl_core:diorite_smooth", - {pickaxey=1}, - {"mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, - S("Polished Diorite Slab"), - nil, 6, nil, - S("Double Polished Diorite Slab")) -mcl_stairs.register_stair("diorite_smooth", "mcl_core:diorite_smooth", - {pickaxey=1}, - {"mcl_stairs_diorite_smooth_slab.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, - S("Polished Diorite Stairs"), - nil, 6, nil, - "woodlike") - -mcl_stairs.register_stair("stonebrickmossy", "mcl_core:stonebrickmossy", - {pickaxey=1}, - {"mcl_core_stonebrick_mossy.png"}, - S("Mossy Stone Brick Stairs"), - mcl_sounds.node_sound_stone_defaults(), 6, 1.5, - nil) - -mcl_stairs.register_slab("stonebrickmossy", "mcl_core:stonebrickmossy", - {pickaxey=1}, - {"mcl_core_stonebrick_mossy.png"}, - S("Mossy Stone Brick Slab"), - mcl_sounds.node_sound_stone_defaults(), 6, 2, - S("Double Mossy Stone Brick Slab"), "mcl_core:stonebrickmossy") --fixme: extra parameter from previous release - diff --git a/mods/ITEMS/mcl_stairs/textures/mcl_stairs_stone_slab_side.png b/mods/ITEMS/mcl_stairs/textures/mcl_stairs_stone_slab_side.png deleted file mode 100644 index a72e109122..0000000000 Binary files a/mods/ITEMS/mcl_stairs/textures/mcl_stairs_stone_slab_side.png and /dev/null differ diff --git a/mods/ITEMS/mcl_stairs/textures/mcl_stairs_stone_slab_top.png b/mods/ITEMS/mcl_stairs/textures/mcl_stairs_stone_slab_top.png deleted file mode 100644 index 8e5a355be4..0000000000 Binary files a/mods/ITEMS/mcl_stairs/textures/mcl_stairs_stone_slab_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_stairs/textures/mcl_stairs_turntexture.png b/mods/ITEMS/mcl_stairs/textures/mcl_stairs_turntexture.png deleted file mode 100644 index d59ff89242..0000000000 Binary files a/mods/ITEMS/mcl_stairs/textures/mcl_stairs_turntexture.png and /dev/null differ diff --git a/mods/ITEMS/mcl_totems/init.lua b/mods/ITEMS/mcl_totems/init.lua deleted file mode 100644 index 8e529c5d5a..0000000000 --- a/mods/ITEMS/mcl_totems/init.lua +++ /dev/null @@ -1,106 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -local hud_totem = {} - -minetest.register_on_leaveplayer(function(player) - hud_totem[player] = nil -end) - -minetest.register_craftitem("mcl_totems:totem", { - description = S("Totem of Undying"), - _tt_help = minetest.colorize(mcl_colors.GREEN, S("Protects you from death while wielding it")), - _doc_items_longdesc = S("A totem of undying is a rare artifact which may safe you from certain death."), - _doc_items_usagehelp = S("The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however."), - inventory_image = "mcl_totems_totem.png", - wield_image = "mcl_totems_totem.png", - stack_max = 1, - groups = {combat_item = 1, offhand_item = 1}, -}) -minetest.register_alias("mobs_mc:totem", "mcl_totems:totem") - -local particle_colors = {"98BF22", "C49E09", "337D0B", "B0B021", "1E9200"} -- TODO: real MC colors - --- Save the player from death when holding totem of undying in hand -mcl_damage.register_modifier(function(obj, damage, reason) - if obj:is_player() and not reason.bypasses_totem then - local hp = obj:get_hp() - if hp - damage <= 0 then - local wield = obj:get_wielded_item() - local in_offhand = false - if not (wield:get_name() == "mcl_totems:totem") then - local inv = obj:get_inventory() - if inv then - wield = obj:get_inventory():get_stack("offhand", 1) - in_offhand = true - end - end - if wield:get_name() == "mcl_totems:totem" then - local ppos = obj:get_pos() - local pnname = minetest.get_node(ppos).name - - if obj:get_breath() < 11 then - obj:set_breath(10) - end - - if not minetest.is_creative_enabled(obj:get_player_name()) then - wield:take_item() - if in_offhand then - obj:get_inventory():set_stack("offhand", 1, wield) - mcl_inventory.update_inventory_formspec(obj) - else - obj:set_wielded_item(wield) - end - end - - -- Effects - minetest.sound_play({name = "mcl_totems_totem", gain = 1}, {pos=ppos, max_hear_distance = 16}, true) - - for i = 1, 4 do - for c = 1, #particle_colors do - minetest.add_particlespawner({ - amount = math.floor(100 / (4 * #particle_colors)), - time = 1, - minpos = vector.offset(ppos, 0, -1, 0), - maxpos = vector.offset(ppos, 0, 1, 0), - minvel = vector.new(-1.5, 0, -1.5), - maxvel = vector.new(1.5, 1.5, 1.5), - minacc = vector.new(0, -0.1, 0), - maxacc = vector.new(0, -1, 0), - minexptime = 1, - maxexptime = 3, - minsize = 1, - maxsize = 2, - collisiondetection = true, - collision_removal = true, - object_collision = false, - vertical = false, - texture = "mcl_particles_totem" .. i .. ".png^[colorize:#" .. particle_colors[c], - glow = 10, - }) - end - end - - -- Big totem overlay - if not hud_totem[obj] then - hud_totem[obj] = obj:hud_add({ - hud_elem_type = "image", - text = "mcl_totems_totem.png", - position = {x = 0.5, y = 1}, - scale = {x = 17, y = 17}, - offset = {x = 0, y = -178}, - z_index = 100, - }) - minetest.after(3, function() - if obj:is_player() then - obj:hud_remove(hud_totem[obj]) - hud_totem[obj] = nil - end - end) - end - - -- Set HP to exactly 1 - return hp - 1 - end - end - end -end, 1000) diff --git a/mods/ITEMS/mcl_totems/locale/mcl_totems.de.tr b/mods/ITEMS/mcl_totems/locale/mcl_totems.de.tr deleted file mode 100644 index e0ac4f2f17..0000000000 --- a/mods/ITEMS/mcl_totems/locale/mcl_totems.de.tr +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain: mcl_totems -Totem of Undying=Totem der Unsterblichkeit -A totem of undying is a rare artifact which may safe you from certain death.=Ein Totem der Unsterblichkeit ist ein seltenes Artefakt, dass Sie vor dem sicheren Tod bewahren kann. -The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Der Totem funktioniert nur, während Sie ihn halten. Wenn Sie normalerweise tödlich hohen Schaden erhalten, werden Sie vor dem Tod bewahrt und Sie erhalten eine zweite Chance mit 1 TP. Der Totem wird dabei zerstört. -Protects you from death while wielding it=Schützt vor dem Tod, wenn es gehalten wird diff --git a/mods/ITEMS/mcl_totems/locale/mcl_totems.es.tr b/mods/ITEMS/mcl_totems/locale/mcl_totems.es.tr deleted file mode 100644 index 2b451ccb1a..0000000000 --- a/mods/ITEMS/mcl_totems/locale/mcl_totems.es.tr +++ /dev/null @@ -1,4 +0,0 @@ -# textdomain: mcl_totems -Totem of Undying=Tótem de la inmortalidad -A totem of undying is a rare artifact which may safe you from certain death.=Un tótem de la inmortalidad es un artefacto raro que puede salvarte de una muerte segura. -The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=El tótem solo funciona mientras lo sostienes en tu mano. Si recibes un daño crítico, no mueres y obtienes una segunda oportunidad con 1 HP. Sin embargo, el tótem se destruye en el proceso. diff --git a/mods/ITEMS/mcl_totems/locale/mcl_totems.fr.tr b/mods/ITEMS/mcl_totems/locale/mcl_totems.fr.tr deleted file mode 100644 index 174251f3c7..0000000000 --- a/mods/ITEMS/mcl_totems/locale/mcl_totems.fr.tr +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain: mcl_totems -Totem of Undying=Totem d'immortalité -A totem of undying is a rare artifact which may safe you from certain death.=Un totem d'immortalité est un artefact rare qui peut vous protéger d'une mort certaine. -The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Le totem ne fonctionne que lorsque vous le tenez dans votre main. Si vous recevez des dégâts mortels, vous êtes sauvé de la mort et vous obtenez une seconde chance avec 1 HP. Cependant, le totem est détruit. -Protects you from death while wielding it=Vous protège de la mort en la maniant diff --git a/mods/ITEMS/mcl_totems/locale/mcl_totems.ru.tr b/mods/ITEMS/mcl_totems/locale/mcl_totems.ru.tr deleted file mode 100644 index d293efe016..0000000000 --- a/mods/ITEMS/mcl_totems/locale/mcl_totems.ru.tr +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain: mcl_totems -Totem of Undying=Тотем бессмертия -A totem of undying is a rare artifact which may safe you from certain death.=Тотем бессмертия это редкий артефакт, способный спасти вас от смерти. -The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Тотем работает только когда вы держите его в руке. Если вы получаете смертельный урон, вы спасаетесь от смерти и получаете второй шанс с 1 HP. Однако тотем при этом уничтожается. -Protects you from death while wielding it=Защищает вас от смерти, пока вы владеете им diff --git a/mods/ITEMS/mcl_totems/locale/template.txt b/mods/ITEMS/mcl_totems/locale/template.txt deleted file mode 100644 index 7afebc44ca..0000000000 --- a/mods/ITEMS/mcl_totems/locale/template.txt +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain: mcl_totems -Totem of Undying= -A totem of undying is a rare artifact which may safe you from certain death.= -The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.= -Protects you from death while wielding it= diff --git a/mods/ITEMS/mcl_totems/mod.conf b/mods/ITEMS/mcl_totems/mod.conf deleted file mode 100644 index 4ba94defc7..0000000000 --- a/mods/ITEMS/mcl_totems/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = mcl_totems -depends = mobs_mc, mcl_damage diff --git a/mods/ITEMS/mcl_totems/textures/mcl_totems_totem.png b/mods/ITEMS/mcl_totems/textures/mcl_totems_totem.png deleted file mode 100644 index 603a867686..0000000000 Binary files a/mods/ITEMS/mcl_totems/textures/mcl_totems_totem.png and /dev/null differ diff --git a/mods/ITEMS/mcl_walls/API.md b/mods/ITEMS/mcl_walls/API.md deleted file mode 100644 index e6956ac479..0000000000 --- a/mods/ITEMS/mcl_walls/API.md +++ /dev/null @@ -1,38 +0,0 @@ -# API for MineClone 2 walls - -This API allows you to add more walls (like the cobblestone wall) to MineClone 2. - -## `mcl_walls.register_wall(nodename, description, craft_material, tiles, invtex, groups, sounds)` - -Adds a new wall type. This is optimized for stone-based walls, but other materials are theoretically possible, too. - -The current implementation registers a couple of nodes for the different nodeboxes. -All walls connect to solid nodes and all other wall nodes. - -If `craft_material` is not `nil` it also adds a crafting recipe of the following form: - - CCC - CCC - - Yields 6 walls - C = craft_material (can be group) - -### Parameters -* `nodename`: Full itemstring of the new wall node (base node only). ***Must not have an underscore!*** -* `description`: Item description of item (tooltip), visible to user -* `source`: Node on which the wall is based off, use for texture and crafting recipe (optional) -* `tiles`: Wall textures table, same syntax as for `minetest.register_node` (optional if `source` is set) -* `inventory_image`: Inventory image (optional if `source` is set) -* `groups`: Base group memberships (optional, default is `{pickaxey=1}`) -* `sounds`: Sound table (optional, by default default uses stone sounds) - -The following groups will automatically be added to the nodes (where applicable), you do not need to add them -to the `groups` table: - -* `deco_block=1` -* `not_in_creative_inventory=1` (except for the base node which the player can take) -* `wall=1` - -### Example - - mcl_walls.register_wall("mymod:granitewall", "Granite Wall", {"mymod_granite.png"}, "mymod_granite_wall_inv.png") diff --git a/mods/ITEMS/mcl_walls/init.lua b/mods/ITEMS/mcl_walls/init.lua deleted file mode 100644 index 14b512ffd7..0000000000 --- a/mods/ITEMS/mcl_walls/init.lua +++ /dev/null @@ -1,275 +0,0 @@ -local modname = minetest.get_current_modname() -local modpath = minetest.get_modpath(modname) -local S = minetest.get_translator(modname) - -mcl_walls = {} - -local function rshift(x, by) - return math.floor(x / 2 ^ by) -end - -local directions = { - {x = 1, y = 0, z = 0}, - {x = 0, y = 0, z = 1}, - {x = -1, y = 0, z = 0}, - {x = 0, y = 0, z = -1}, - {x = 0, y = -1, z = 0}, -} - -local function connectable(itemstring) - return (minetest.get_item_group(itemstring, "wall") == 1) or (minetest.get_item_group(itemstring, "solid") == 1) -end - -local function update_wall(pos) - local thisnode = minetest.get_node(pos) - - if minetest.get_item_group(thisnode.name, "wall") == 0 then - return - end - - -- Get the node's base name, including the underscore since we will need it - local colonpos = thisnode.name:find(":") - local underscorepos - local itemname, basename, modname - if colonpos then - itemname = thisnode.name:sub(colonpos+1) - modname = thisnode.name:sub(1, colonpos-1) - end - underscorepos = itemname:find("_") - if underscorepos == nil then -- New wall - basename = thisnode.name .. "_" - else -- Already placed wall - basename = modname .. ":" .. itemname:sub(1, underscorepos) - end - - local sum = 0 - - -- Neighbouring walkable nodes - for i = 1, 4 do - local dir = directions[i] - local node = minetest.get_node({x = pos.x + dir.x, y = pos.y + dir.y, z = pos.z + dir.z}) - if connectable(node.name) then - sum = sum + 2 ^ (i - 1) - end - end - - -- Torches or walkable nodes above the wall - local upnode = minetest.get_node({x = pos.x, y = pos.y+1, z = pos.z}) - if sum == 5 or sum == 10 then - if (connectable(upnode.name)) or (minetest.get_item_group(upnode.name, "torch") == 1) then - sum = sum + 11 - end - end - - --[[if sum == 0 then - sum = 15 - end]] - - minetest.add_node(pos, {name = basename..sum}) -end - -local function update_wall_global(pos) - for i = 1,5 do - local dir = directions[i] - update_wall({x = pos.x + dir.x, y = pos.y + dir.y, z = pos.z + dir.z}) - end -end - -local half_blocks = { - {4/16, -0.5, -3/16, 0.5, 5/16, 3/16}, - {-3/16, -0.5, 4/16, 3/16, 5/16, 0.5}, - {-0.5, -0.5, -3/16, -4/16, 5/16, 3/16}, - {-3/16, -0.5, -0.5, 3/16, 5/16, -4/16} -} - -local pillar = {-4/16, -0.5, -4/16, 4/16, 0.5, 4/16} - -local full_blocks = { - {-0.5, -0.5, -3/16, 0.5, 5/16, 3/16}, - {-3/16, -0.5, -0.5, 3/16, 5/16, 0.5} -} - ---[[ Adds a new wall type. -* nodename: Itemstring of base node to add. Must not contain an underscore -* description: Item description (tooltip), visible to user -* source: Source block to craft this thing, for graphics, tiles and crafting (optional) -* tiles: Wall textures table -* inventory_image: Inventory image (optional) -* groups: Base group memberships (optional, default is {pickaxey=1}) -* sounds: Sound table (optional, default is stone) -]] -function mcl_walls.register_wall(nodename, description, source, tiles, inventory_image, groups, sounds) - - local base_groups = groups - if not base_groups then - base_groups = {pickaxey=1} - end - base_groups.wall = 1 - - local internal_groups = table.copy(base_groups) - internal_groups.not_in_creative_inventory = 1 - - local main_node_groups = table.copy(base_groups) - main_node_groups.deco_block = 1 - - -- TODO: Stop hardcoding blast resistance - - if not sounds then - sounds = mcl_sounds.node_sound_stone_defaults() - end - - if (not tiles) and source then - if minetest.registered_nodes[source] then - tiles = minetest.registered_nodes[source].tiles - end - end - - for i = 0, 15 do - local need = {} - local need_pillar = false - for j = 1, 4 do - if rshift(i, j - 1) % 2 == 1 then - need[j] = true - end - end - - local take = {} - if need[1] == true and need[3] == true then - need[1] = nil - need[3] = nil - table.insert(take, full_blocks[1]) - end - if need[2] == true and need[4] == true then - need[2] = nil - need[4] = nil - table.insert(take, full_blocks[2]) - end - for k in pairs(need) do - table.insert(take, half_blocks[k]) - need_pillar = true - end - if i == 15 or i == 0 then need_pillar = true end - if need_pillar then table.insert(take, pillar) end - - minetest.register_node(nodename.."_"..i, { - collision_box = { - type = "fixed", - fixed = {-4/16, -0.5, -4/16, 4/16, 1, 4/16} - }, - drawtype = "nodebox", - is_ground_content = false, - tiles = tiles, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, - paramtype = "light", - sunlight_propagates = true, - groups = internal_groups, - drop = nodename, - node_box = { - type = "fixed", - fixed = take - }, - sounds = sounds, - _mcl_blast_resistance = 6, - _mcl_hardness = 2, - }) - - -- Add entry alias for the Help - if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", nodename, "nodes", nodename.."_"..i) - end - end - - minetest.register_node(nodename.."_16", { - drawtype = "nodebox", - collision_box = { - type = "fixed", - fixed = {-4/16, -0.5, -4/16, 4/16, 1, 4/16} - }, - tiles = tiles, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, - paramtype = "light", - sunlight_propagates = true, - is_ground_content = false, - groups = internal_groups, - drop = nodename, - node_box = { - type = "fixed", - fixed = {pillar, full_blocks[1]} - }, - sounds = sounds, - _mcl_blast_resistance = 6, - _mcl_hardness = 2, - }) - -- Add entry alias for the Help - if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", nodename, "nodes", nodename.."_16") - end - - minetest.register_node(nodename.."_21", { - drawtype = "nodebox", - collision_box = { - type = "fixed", - fixed = {-4/16, -0.5, -4/16, 4/16, 1, 4/16} - }, - tiles = tiles, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, - paramtype = "light", - sunlight_propagates = true, - is_ground_content = false, - groups = internal_groups, - drop = nodename, - node_box = { - type = "fixed", - fixed = {pillar, full_blocks[2]} - }, - sounds = sounds, - _mcl_blast_resistance = 6, - _mcl_hardness = 2, - }) - -- Add entry alias for the Help - if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", nodename, "nodes", nodename.."_21") - end - - -- Inventory item - minetest.register_node(nodename, { - description = description, - _doc_items_longdesc = S("A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure."), - paramtype = "light", - sunlight_propagates = true, - is_ground_content = false, - groups = main_node_groups, - tiles = tiles, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, - inventory_image = inventory_image, - stack_max = 64, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = pillar - }, - collision_box = { - type = "fixed", - fixed = {-4/16, -0.5, -4/16, 4/16, 1, 4/16} - }, - collisionbox = {-0.2, 0, -0.2, 0.2, 1.4, 0.2}, - on_construct = update_wall, - sounds = sounds, - _mcl_blast_resistance = 6, - _mcl_hardness = 2, - }) - if source then - minetest.register_craft({ - output = nodename .. " 6", - recipe = { - {source, source, source}, - {source, source, source}, - } - }) - end -end - -dofile(modpath.."/register.lua") - -minetest.register_on_placenode(update_wall_global) -minetest.register_on_dignode(update_wall_global) diff --git a/mods/ITEMS/mcl_walls/locale/mcl_walls.de.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.de.tr deleted file mode 100644 index d4e7a64006..0000000000 --- a/mods/ITEMS/mcl_walls/locale/mcl_walls.de.tr +++ /dev/null @@ -1,16 +0,0 @@ -# textdomain: mcl_walls -A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.=Ein Stück Mauer. Mit einem einfachen Sprung kann es nicht übersprungen werden. Wenn mehrere von diesen Blöcken nebeneinander platziert werden, werden sie automatisch ein nettes Mauerbauwerk ergeben. -Cobblestone Wall=Kopfsteinpflastermauer -Mossy Cobblestone Wall=Moosige Kopfsteinpflastermauer -Andesite Wall=Andesitmauer -Granite Wall=Granitmauer -Diorite Wall=Dioritmauer -Brick Wall=Ziegelmauer -Sandstone Wall=Sandsteinmauer -Red Sandstone Wall=Rote Sandsteinmauer -Stone Brick Wall=Steinziegelmauer -Mossy Stone Brick Wall=Moosige Steinziegelmauer -Prismarine Wall=Prismarinmauer -End Stone Brick Wall=Endsteinziegelmauer -Nether Brick Wall=Netherziegelmauer -Red Nether Brick Wall=Rote Netherziegelmauer diff --git a/mods/ITEMS/mcl_walls/locale/mcl_walls.es.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.es.tr deleted file mode 100644 index 3fb3d6adb2..0000000000 --- a/mods/ITEMS/mcl_walls/locale/mcl_walls.es.tr +++ /dev/null @@ -1,16 +0,0 @@ -# textdomain: mcl_walls -A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.=Un pedazo de pared. No se puede saltar con un simple salto. Cuando varios de estos se colocan uno al lado del otro, construirán automáticamente una bonita estructura de pared. -Cobblestone Wall=Muro de roca -Mossy Cobblestone Wall=Muro de roca musgosa -Andesite Wall=Muro de andesita -Granite Wall=Muro de granito -Diorite Wall=Muro de diorita -Brick Wall=Muro de ladrillos -Sandstone Wall=Muro de arenisca -Red Sandstone Wall=Muro de arenisca roja -Stone Brick Wall=Muro de ladrillos de piedra -Mossy Stone Brick Wall=Muro de ladrillos de piedra musgosos -Prismarine Wall=Muro de prismarina -End Stone Brick Wall=Muro de ladrillos de piedra del End -Nether Brick Wall=Muro de ladrillos del Nether -Red Nether Brick Wall=Muro de ladrillos del Nether rojos diff --git a/mods/ITEMS/mcl_walls/locale/mcl_walls.fr.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.fr.tr deleted file mode 100644 index 445c8f7b39..0000000000 --- a/mods/ITEMS/mcl_walls/locale/mcl_walls.fr.tr +++ /dev/null @@ -1,16 +0,0 @@ -# textdomain: mcl_walls -A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.=Un morceau de mur. Il ne peut pas être sauté par un simple saut. Lorsque plusieurs d'entre eux sont placés les uns à côté des autres, ils construiront automatiquement une belle structure de mur. -Cobblestone Wall=Muret de Pierres -Mossy Cobblestone Wall=Muret de Pierres Moussu -Andesite Wall=Muret d'Andésite -Granite Wall=Muret de Granit -Diorite Wall=Muret de Diorite -Brick Wall=Muret en Brique -Sandstone Wall=Muret de Grès -Red Sandstone Wall=Muret de Grès Rouge -Stone Brick Wall=Muret de Pierre Taillé -Mossy Stone Brick Wall=Muret de Pierre Taillé Moussue -Prismarine Wall=Muret de Prismarine -End Stone Brick Wall=Muret de Brique de l'End -Nether Brick Wall=Muret de Brique du Nether -Red Nether Brick Wall=Muret de Brique Rouge du Nether diff --git a/mods/ITEMS/mcl_walls/locale/mcl_walls.pl.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.pl.tr deleted file mode 100644 index 9d75eb18d6..0000000000 --- a/mods/ITEMS/mcl_walls/locale/mcl_walls.pl.tr +++ /dev/null @@ -1,17 +0,0 @@ -# textdomain: mcl_walls -A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.=Kawałek ściany. Nie może być przeskoczony pojedynczym skokiem. Gdy kilka z nich jest położonych obok siebie, automatycznie połączą się one w ścianę. -Cobblestone Wall=Ściana z brukowca -Mossy Cobblestone Wall=Ściana z zamszonego brukowca -Andesite Wall=Andezytowa ściana -Granite Wall=Granitowa ściana -Diorite Wall=Diorytowa ściana -Brick Wall=Ceglana ściana -Sandstone Wall=Ściana z piaskowca -Red Sandstone Wall=Ściana z czerwienitu -Stone Brick Wall=Ściana z ceglanego kamienia -Mossy Stone Brick Wall=Ściana z zamszonego ceglanego kamienia -Prismarine Wall=Pryzmarynowa ściana -End Stone Brick Wall=Ściana z ceglanego kamienia Kresu -Nether Brick Wall=Ściana z Netherowej cegły -Red Nether Brick Wall=Ściana z czerwonej Netherowej cegły - diff --git a/mods/ITEMS/mcl_walls/locale/mcl_walls.ru.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.ru.tr deleted file mode 100644 index deb0fa2896..0000000000 --- a/mods/ITEMS/mcl_walls/locale/mcl_walls.ru.tr +++ /dev/null @@ -1,16 +0,0 @@ -# textdomain: mcl_walls -A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.=Часть стены. Её нельзя перепрыгнуть простым прыжком. Когда несколько из них будут расположены рядом друг с другом, они автоматически создадут хорошую структуру стены. -Cobblestone Wall=Стена из булыжника -Mossy Cobblestone Wall=Стена из мшистого булыжника -Andesite Wall=Андезитовая стена -Granite Wall=Гранитная стена -Diorite Wall=Диоритовая стена -Brick Wall=Кирпичная стена -Sandstone Wall=Стена из песчаника -Red Sandstone Wall=Стена из красного песчаника -Stone Brick Wall=Стена из каменного блока -Mossy Stone Brick Wall=Стена из мшистого каменного блока -Prismarine Wall=Призмариновая стена -End Stone Brick Wall=Стена из камня Предела -Nether Brick Wall=Стена из адского кирпича -Red Nether Brick Wall=Стена из красного адского кирпича diff --git a/mods/ITEMS/mcl_walls/locale/mcl_walls.zh_TW.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.zh_TW.tr deleted file mode 100644 index 111241e04a..0000000000 --- a/mods/ITEMS/mcl_walls/locale/mcl_walls.zh_TW.tr +++ /dev/null @@ -1,16 +0,0 @@ -# textdomain: mcl_walls -A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.=一塊牆。它不能用簡單的跳躍方式跳過去。當多個這樣的東西被放在一起時,它們會自動建立一個漂亮的牆體結構。 -Cobblestone Wall=鵝卵石牆 -Mossy Cobblestone Wall=青苔鵝卵石牆 -Andesite Wall=安山岩牆 -Granite Wall=花崗岩牆 -Diorite Wall=閃長岩牆 -Brick Wall=紅磚牆 -Sandstone Wall=砂岩牆 -Red Sandstone Wall=紅砂岩牆 -Stone Brick Wall=石磚牆 -Mossy Stone Brick Wall=青苔石磚牆 -Prismarine Wall=海磷石牆 -End Stone Brick Wall=終界石磚牆 -Nether Brick Wall=地獄磚牆 -Red Nether Brick Wall=紅地獄磚牆 diff --git a/mods/ITEMS/mcl_walls/locale/template.txt b/mods/ITEMS/mcl_walls/locale/template.txt deleted file mode 100644 index 7653659971..0000000000 --- a/mods/ITEMS/mcl_walls/locale/template.txt +++ /dev/null @@ -1,16 +0,0 @@ -# textdomain: mcl_walls -A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.= -Cobblestone Wall= -Mossy Cobblestone Wall= -Andesite Wall= -Granite Wall= -Diorite Wall= -Brick Wall= -Sandstone Wall= -Red Sandstone Wall= -Stone Brick Wall= -Mossy Stone Brick Wall= -Prismarine Wall= -End Stone Brick Wall= -Nether Brick Wall= -Red Nether Brick Wall= diff --git a/mods/ITEMS/mcl_walls/mod.conf b/mods/ITEMS/mcl_walls/mod.conf deleted file mode 100644 index 8839312de5..0000000000 --- a/mods/ITEMS/mcl_walls/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = mcl_walls -depends = mcl_core, mcl_end, mcl_ocean, mcl_nether, mcl_sounds -optional_depends = doc diff --git a/mods/ITEMS/mcl_walls/register.lua b/mods/ITEMS/mcl_walls/register.lua deleted file mode 100644 index 483af493ec..0000000000 --- a/mods/ITEMS/mcl_walls/register.lua +++ /dev/null @@ -1,16 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -mcl_walls.register_wall("mcl_walls:cobble", S("Cobblestone Wall"), "mcl_core:cobble", {"mcl_walls_cobble_wall_top.png", "default_cobble.png", "mcl_walls_cobble_wall_side.png"}) -mcl_walls.register_wall("mcl_walls:mossycobble", S("Mossy Cobblestone Wall"), "mcl_core:mossycobble", {"mcl_walls_cobble_mossy_wall_top.png", "default_mossycobble.png", "mcl_walls_cobble_mossy_wall_side.png"}) -mcl_walls.register_wall("mcl_walls:andesite", S("Andesite Wall"), "mcl_core:andesite") -mcl_walls.register_wall("mcl_walls:granite", S("Granite Wall"), "mcl_core:granite") -mcl_walls.register_wall("mcl_walls:diorite", S("Diorite Wall"), "mcl_core:diorite") -mcl_walls.register_wall("mcl_walls:brick", S("Brick Wall"), "mcl_core:brick_block") -mcl_walls.register_wall("mcl_walls:sandstone", S("Sandstone Wall"), "mcl_core:sandstone") -mcl_walls.register_wall("mcl_walls:redsandstone", S("Red Sandstone Wall"), "mcl_core:redsandstone") -mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick") -mcl_walls.register_wall("mcl_walls:stonebrickmossy", S("Mossy Stone Brick Wall"), "mcl_core:stonebrickmossy") -mcl_walls.register_wall("mcl_walls:prismarine", S("Prismarine Wall"), "mcl_ocean:prismarine") -mcl_walls.register_wall("mcl_walls:endbricks", S("End Stone Brick Wall"), "mcl_end:end_bricks") -mcl_walls.register_wall("mcl_walls:netherbrick", S("Nether Brick Wall"), "mcl_nether:nether_brick") -mcl_walls.register_wall("mcl_walls:rednetherbrick", S("Red Nether Brick Wall"), "mcl_nether:red_nether_brick") diff --git a/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_mossy_wall_side.png b/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_mossy_wall_side.png deleted file mode 100644 index 69d575d986..0000000000 Binary files a/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_mossy_wall_side.png and /dev/null differ diff --git a/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_mossy_wall_top.png b/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_mossy_wall_top.png deleted file mode 100644 index c6ca4c364e..0000000000 Binary files a/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_mossy_wall_top.png and /dev/null differ diff --git a/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_wall_side.png b/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_wall_side.png deleted file mode 100644 index 01937236d1..0000000000 Binary files a/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_wall_side.png and /dev/null differ diff --git a/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_wall_top.png b/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_wall_top.png deleted file mode 100644 index bdde29c6cd..0000000000 Binary files a/mods/ITEMS/mcl_walls/textures/mcl_walls_cobble_wall_top.png and /dev/null differ diff --git a/mods/ITEMS/mclx_stairs/init.lua b/mods/ITEMS/mclx_stairs/init.lua deleted file mode 100644 index effa87f136..0000000000 --- a/mods/ITEMS/mclx_stairs/init.lua +++ /dev/null @@ -1,145 +0,0 @@ -local S = minetest.get_translator(minetest.get_current_modname()) -local doc_mod = minetest.get_modpath("doc") - - -local barks = { - { "", S("Oak Bark Stairs"), S("Oak Bark Slab"), S("Double Oak Bark Slab") }, - { "jungle", S("Jungle Bark Stairs"), S("Jungle Bark Slab"), S("Double Jungle Bark Slab") }, - { "acacia", S("Acacia Bark Stairs"), S("Acacia Bark Slab"), S("Double Acacia Bark Slab") }, - { "spruce", S("Spruce Bark Stairs"), S("Spruce Bark Slab"), S("Double Spruce Bark Slab") }, - { "birch", S("Birch Bark Stairs"), S("Birch Bark Slab"), S("Double Birch Bark Slab") }, - { "dark", S("Dark Oak Bark Stairs"), S("Dark Oak Bark Slab"), S("Double Dark Oak Bark Slab") }, -} - -for b=1, #barks do - local bark = barks[b] - local sub = bark[1].."tree_bark" - local id = "mcl_core:tree" - if bark[1] ~= "" then - id = "mcl_core:"..bark[1].."tree" - end - mcl_stairs.register_stair(sub, id, - {handy=1,axey=1, flammable=3, bark_stairs=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, - {minetest.registered_nodes[id].tiles[3]}, - bark[2], - mcl_sounds.node_sound_wood_defaults(), 3, 2, - "woodlike") - mcl_stairs.register_slab(sub, id, - {handy=1,axey=1, flammable=3, bark_slab=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, - {minetest.registered_nodes[id].tiles[3]}, - bark[3], - mcl_sounds.node_sound_wood_defaults(), 3, 2, - bark[4]) -end - -mcl_stairs.register_slab("lapisblock", "mcl_core:lapisblock", - {pickaxey=3}, - {"mcl_core_lapis_block.png", "mcl_core_lapis_block.png", "mcl_stairs_lapis_block_slab.png"}, - S("Lapis Lazuli Slab"), - nil, nil, nil, - S("Double Lapis Lazuli Slab")) -mcl_stairs.register_stair("lapisblock", "mcl_core:lapisblock", - {pickaxey=3}, - {"mcl_stairs_lapis_block_slab.png", "mcl_core_lapis_block.png", "mcl_core_lapis_block.png", "mcl_core_lapis_block.png", "mcl_core_lapis_block.png", "mcl_stairs_lapis_block_slab.png"}, - S("Lapis Lazuli Stairs"), - nil, 6, nil, - "woodlike") - -mcl_stairs.register_slab("goldblock", "mcl_core:goldblock", - {pickaxey=4}, - {"default_gold_block.png", "default_gold_block.png", "mcl_stairs_gold_block_slab.png"}, - S("Slab of Gold"), - nil, nil, nil, - S("Double Slab of Gold")) -mcl_stairs.register_stair("goldblock", "mcl_core:goldblock", - {pickaxey=4}, - {"mcl_stairs_gold_block_slab.png", "default_gold_block.png", "default_gold_block.png", "default_gold_block.png", "default_gold_block.png", "mcl_stairs_gold_block_slab.png"}, - S("Stairs of Gold"), - nil, 6, nil, - "woodlike") - -mcl_stairs.register_slab("ironblock", "mcl_core:ironblock", - {pickaxey=2}, - {"default_steel_block.png", "default_steel_block.png", "mcl_stairs_iron_block_slab.png"}, - S("Slab of Iron"), - nil, nil, nil, - S("Double Slab of Iron")) -mcl_stairs.register_stair("ironblock", "mcl_core:ironblock", - {pickaxey=2}, - {"mcl_stairs_iron_block_slab.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "mcl_stairs_iron_block_slab.png"}, - S("Stairs of Iron"), - nil, 6, nil, - "woodlike") - -mcl_stairs.register_stair("stonebrickcracked", "mcl_core:stonebrickcracked", - {pickaxey=1}, - {"mcl_core_stonebrick_cracked.png"}, - S("Cracked Stone Brick Stairs"), - mcl_sounds.node_sound_stone_defaults(), 6, 1.5, - "woodlike") - -mcl_stairs.register_slab("stonebrickcracked", "mcl_core:stonebrickcracked", - {pickaxey=1}, - {"mcl_core_stonebrick_cracked.png"}, - S("Cracked Stone Brick Slab"), - mcl_sounds.node_sound_stone_defaults(), 6, 2, - S("Double Cracked Stone Brick Slab")) - -local block = {} -block.dyes = { - {"white", S("White Concrete Stairs"), S("White Concrete Slab"), S("Double White Concrete Slab"), "white"}, - {"grey", S("Grey Concrete Stairs"), S("Grey Concrete Slab"), S("Double Grey Concrete Slab"), "dark_grey"}, - {"silver", S("Light Grey Concrete Stairs"), S("Light Grey Concrete Slab"), S("Double Light Grey Concrete Slab"), "grey"}, - {"black", S("Black Concrete Stairs"), S("Black Concrete Slab"), S("Double Black Concrete Slab"), "black"}, - {"red", S("Red Concrete Stairs"), S("Red Concrete Slab"), S("Double Red Concrete Slab"), "red"}, - {"yellow", S("Yellow Concrete Stairs"), S("Yellow Concrete Slab"), S("Double Yellow Concrete Slab"), "yellow"}, - {"green", S("Green Concrete Stairs"), S("Green Concrete Slab"), S("Double Green Concrete Slab"), "dark_green"}, - {"cyan", S("Cyan Concrete Stairs"), S("Cyan Concrete Slab"), S("Double Cyan Concrete Slab"), "cyan"}, - {"blue", S("Blue Concrete Stairs"), S("Blue Concrete Slab"), S("Double Blue Concrete Slab"), "blue"}, - {"magenta", S("Magenta Concrete Stairs"), S("Magenta Concrete Slab"), S("Double Magenta Concrete Slab"), "magenta"}, - {"orange", S("Orange Concrete Stairs"), S("Orange Concrete Slab"), S("Double Orange Concrete Slab"), "orange"}, - {"purple", S("Purple Concrete Stairs"), S("Purple Concrete Slab"), S("Double Purple Concrete Slab"), "violet"}, - {"brown", S("Brown Concrete Stairs"), S("Brown Concrete Slab"), S("Double Brown Concrete Slab"), "brown"}, - {"pink", S("Pink Concrete Stairs"), S("Pink Concrete Slab"), S("Double Pink Concrete Slab"), "pink"}, - {"lime", S("Lime Concrete Stairs"), S("Lime Concrete Slab"), S("Double Lime Concrete Slab"), "green"}, - {"light_blue", S("Light Blue Concrete Stairs"), S("Light Blue Concrete Slab"), S("Double Light Blue Concrete Slab"), "lightblue"}, -} -local canonical_color = "yellow" - -for i=1, #block.dyes do - local c = block.dyes[i][1] - local is_canonical = c == canonical_color - mcl_stairs.register_stair_and_slab_simple("concrete_"..c, "mcl_colorblocks:concrete_"..c, - block.dyes[i][2], - block.dyes[i][3], - block.dyes[i][4]) - - if doc_mod then - if not is_canonical then - doc.add_entry_alias("nodes", "mcl_stairs:slab_concrete_"..canonical_color, "nodes", "mcl_stairs:slab_concrete_"..c) - doc.add_entry_alias("nodes", "mcl_stairs:slab_concrete_"..canonical_color.."_double", "nodes", "mcl_stairs:slab_concrete_"..c.."_double") - doc.add_entry_alias("nodes", "mcl_stairs:stair_concrete_"..canonical_color, "nodes", "mcl_stairs:stair_concrete_"..c) - minetest.override_item("mcl_stairs:slab_concrete_"..c, { _doc_items_create_entry = false }) - minetest.override_item("mcl_stairs:slab_concrete_"..c.."_double", { _doc_items_create_entry = false }) - minetest.override_item("mcl_stairs:stair_concrete_"..c, { _doc_items_create_entry = false }) - else - minetest.override_item("mcl_stairs:slab_concrete_"..c, { _doc_items_entry_name = S("Concrete Slab") }) - minetest.override_item("mcl_stairs:slab_concrete_"..c.."_double", { _doc_items_entry_name = S("Double Concrete Slab") }) - minetest.override_item("mcl_stairs:stair_concrete_"..c, { _doc_items_entry_name = S("Concrete Stairs") }) - end - end -end - --- Fuel -minetest.register_craft({ - type = "fuel", - recipe = "group:bark_stairs", - -- Same as wood stairs - burntime = 15, -}) -minetest.register_craft({ - type = "fuel", - recipe = "group:bark_slab", - -- Same as wood slab - burntime = 8, -}) diff --git a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.de.tr b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.de.tr deleted file mode 100644 index c6f9f65d77..0000000000 --- a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.de.tr +++ /dev/null @@ -1,82 +0,0 @@ -# textdomain: mclx_stairs -Oak Bark Stairs=Eichenrindentreppe -Oak Bark Slab=Eichenrindenplatte -Double Oak Bark Slab=Doppeleichenrindenplatte -Acacia Bark Stairs=Akazienrindentreppe -Acacia Bark Slab=Akazienrindenplatte -Double Acacia Bark Slab=Doppelakazienrindenplatte -Spruce Bark Stairs=Fichtenrindentreppe -Spruce Bark Slab=Fichtenrindenplatte -Double Spruce Bark Slab=Doppelfichtenrindenplatte -Birch Bark Stairs=Birkenrindentreppe -Birch Bark Slab=Birkenrindenplatte -Double Birch Bark Slab=Doppelbirkenrindenplatte -Jungle Bark Stairs=Dschungelrindentreppe -Jungle Bark Slab=Dschungelrindenplatte -Double Jungle Bark Slab=Doppelschungelbirkenplatte -Dark Oak Bark Stairs=Schwarzeichenrindentreppe -Dark Oak Bark Slab=Schwarzeichenrindenplatte -Double Dark Oak Bark Slab=Doppelschwarzeichenrindenplatte -Lapis Lazuli Slab=Lapislazuliplatte -Double Lapis Lazuli Slab=Doppellapislazuliplatte -Lapis Lazuli Stairs=Lapislazulitreppe -Slab of Gold=Goldplatte -Double Slab of Gold=Doppelgoldplatte -Stairs of Gold=Goldtreppe -Slab of Iron=Eisenplatte -Double Slab of Iron=Doppeleisenplatte -Stairs of Iron=Eisentreppe -Cracked Stone Brick Stairs=Rissige Steinziegeltreppe -Cracked Stone Brick Slab=Rissige Steinziegelplatte -Double Cracked Stone Brick Slab=Doppelte rissige Steinziegelplatte -White Concrete Stairs=Weiße Betontreppe -White Concrete Slab=Weiße Betonplatte -Double White Concrete Slab=Doppelte weiße Betonplatte -Grey Concrete Stairs=Graue Betontreppe -Grey Concrete Slab=Graue Betonplatte -Double Grey Concrete Slab=Doppelte graue Betonplatte -Light Grey Concrete Stairs=Hellgraue Betontreppe -Light Grey Concrete Slab=Hellgraue Betonplatte -Double Light Grey Concrete Slab=Doppelte hellgraue Betonplatte -Black Concrete Stairs=Schwarze Betontreppe -Black Concrete Slab=Schwarze Betonplatte -Double Black Concrete Slab=Doppelte schwarze Betonplatte -Red Concrete Stairs=Rote Betontreppe -Red Concrete Slab=Rote Betonplatte -Double Red Concrete Slab=Doppelte rote Betonplatte -Yellow Concrete Stairs=Gelbe Betontreppe -Yellow Concrete Slab=Gelbe Betonplatte -Double Yellow Concrete Slab=Doppelte gelbe Betonplatte -Green Concrete Stairs=Grüne Betontreppe -Green Concrete Slab=Grüne Betonplatte -Double Green Concrete Slab=Doppelte grüne Betonplatte -Cyan Concrete Stairs=Türkise Betontreppe -Cyan Concrete Slab=Türkise Betonplatte -Double Cyan Concrete Slab=Doppelte Türkise Betonplatte -Blue Concrete Stairs=Blaue Betontreppe -Blue Concrete Slab=Blaue Betonplatte -Double Blue Concrete Slab=Doppelte blaue Betonplatte -Magenta Concrete Stairs=Magenta Betontreppe -Magenta Concrete Slab=Magenta Betonplatte -Double Magenta Concrete Slab=Doppelte magenta Betonplatte -Orange Concrete Stairs=Orange Betontreppe -Orange Concrete Slab=Orange Betonplatte -Double Orange Concrete Slab=Doppelte orange Betonplatte -Purple Concrete Stairs=Violette Betontreppe -Purple Concrete Slab=Violette Betonplatte -Double Purple Concrete Slab=Doppelte violette Betonplatte -Brown Concrete Stairs=Braune Betontreppe -Brown Concrete Slab=Braune Betonplatte -Double Brown Concrete Slab=Doppelte braune Betonplatte -Pink Concrete Stairs=Rosa Betontreppe -Pink Concrete Slab=Rosa Betonplatte -Double Pink Concrete Slab=Doppelte rosa Betonplatte -Lime Concrete Stairs=Lindgrüne Betontreppe -Lime Concrete Slab=Lindgrüne Betonplatte -Double Lime Concrete Slab=Doppelte Betonplatte -Light Blue Concrete Stairs=Hellblaue Betontreppe -Light Blue Concrete Slab=Hellblaue Betonplatte -Double Light Blue Concrete Slab=Doppelte hellblaue Betonplatte -Concrete Slab=Betonplatte -Double Concrete Slab=Doppelte Betonplatte -Concrete Stairs=Betontreppe diff --git a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.es.tr b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.es.tr deleted file mode 100644 index 302ae7f246..0000000000 --- a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.es.tr +++ /dev/null @@ -1,82 +0,0 @@ -# textdomain: mclx_stairs -Oak Bark Stairs=Escaleras de roble -Oak Bark Slab=Losa de roble -Double Oak Bark Slab=Losa doble de roble -Acacia Bark Stairs=Escaleras de acacia -Acacia Bark Slab=Losa de acacia -Double Acacia Bark Slab=Losa doble de acacia -Spruce Bark Stairs=Escaleras de abeto -Spruce Bark Slab=Losa de abeto -Double Spruce Bark Slab=Losa doble de abeto -Birch Bark Stairs=Escaleras de abedul -Birch Bark Slab=Losa de abedul -Double Birch Bark Slab=Losa doble de abedul -Jungle Bark Stairs=Escaleras de jungla -Jungle Bark Slab=Losa de jungla -Double Jungle Bark Slab=Losa doble de jungla -Dark Oak Bark Stairs=Escaleras de roble oscuro -Dark Oak Bark Slab=Losa de roble oscuro -Double Dark Oak Bark Slab=Losa doble de roble oscuro -Lapis Lazuli Slab=Losa de lapislázuli -Double Lapis Lazuli Slab=Losa doble de lapislázuli -Lapis Lazuli Stairs=Escaleras de lapislázuli -Slab of Gold=Losa de oro -Double Slab of Gold=Losa doble de oro -Stairs of Gold=Escaleras de oro -Slab of Iron=Losa de hierro -Double Slab of Iron=Losa doble de hierro -Stairs of Iron=Escaleras de hierro -Cracked Stone Brick Stairs=Escaleras de ladrillo de piedra agrietada -Cracked Stone Brick Slab=Losa de ladrillo de piedra agrietada -Double Cracked Stone Brick Slab=Losa doble de ladrillo de piedra agrietada -White Concrete Stairs=Escaleras de hormigón blanco -White Concrete Slab=Losa de hormigón blanco -Double White Concrete Slab=Losa doble de hormigón blanco -Grey Concrete Stairs=Escaleras de hormigón gris -Grey Concrete Slab=Losas de hormigón gris -Double Grey Concrete Slab=Losa doble de hormigón gris -Light Grey Concrete Stairs=Escaleras de hormigón gris claro -Light Grey Concrete Slab=Losa de hormigón gris claro -Double Light Grey Concrete Slab=Losa doble de hormigón gris claro -Black Concrete Stairs=Escaleras de hormigón negro -Black Concrete Slab=Losa de hormigón negro -Double Black Concrete Slab=Losa doble de hormigón negro -Red Concrete Stairs=Escaleras de hormigón rojo -Red Concrete Slab=Losa de hormigón rojo -Double Red Concrete Slab=Losa doble de hormigón rojo -Yellow Concrete Stairs=Escaleras de hormigón amarillo -Yellow Concrete Slab=Losa de hormigón amarillo -Double Yellow Concrete Slab=Losa doble de hormigón amarillo -Green Concrete Stairs=Escaleras de hormigón verde -Green Concrete Slab=Losa de hormigón verde -Double Green Concrete Slab=Losa doble de hormigón verde -Cyan Concrete Stairs=Escaleras de hormigón cian -Cyan Concrete Slab=Losa de hormigón cian -Double Cyan Concrete Slab=Losa doble de hormigón cian -Blue Concrete Stairs=Escaleras de hormigón azul -Blue Concrete Slab=Losa de hormigón azul -Double Blue Concrete Slab=Losa doble de hormigón azul -Magenta Concrete Stairs=Escaleras de hormigón magenta -Magenta Concrete Slab=Losa de hormigón magenta -Double Magenta Concrete Slab=Losa doble de hormigón magenta -Orange Concrete Stairs=Escaleras de hormigón naranja -Orange Concrete Slab=Losa de hormigón naranja -Double Orange Concrete Slab=Losa doble de hormigón naranja -Purple Concrete Stairs=Escaleras de hormigón morado -Purple Concrete Slab=Losa de hormigón morado -Double Purple Concrete Slab=Losa doble de hormigón morado -Brown Concrete Stairs=Escaleras de hormigón marrón -Brown Concrete Slab=Losa de hormigón marrón -Double Brown Concrete Slab=Losa doble de hormigón marrón -Pink Concrete Stairs=Escaleras de hormigón rosa -Pink Concrete Slab=Losa de hormigón rosa -Double Pink Concrete Slab=Losa doble de hormigón rosa -Lime Concrete Stairs=Escaleras de hormigón verde lima -Lime Concrete Slab=Losa de hormigón verde lima -Double Lime Concrete Slab=Losa doble de hormigón verde lima -Light Blue Concrete Stairs=Escaleras de hormigón azul claro -Light Blue Concrete Slab=Losa de hormigón azul claro -Double Light Blue Concrete Slab=Losa doble de hormigón azul claro -Concrete Slab=Losa de hormigón -Double Concrete Slab=Losa doble de hormigón -Concrete Stairs=Escaleras de hormigón diff --git a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.fr.tr b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.fr.tr deleted file mode 100644 index 98becd492f..0000000000 --- a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.fr.tr +++ /dev/null @@ -1,82 +0,0 @@ -# textdomain: mclx_stairs -Oak Bark Stairs=Escalier en écorse de Chêne -Oak Bark Slab=Plaque d'écorce de Chêne -Double Oak Bark Slab=Double Dalle d'écorce de Chêne -Acacia Bark Stairs=Escalier en écorce d'Acacia -Acacia Bark Slab=Plaque d'écorce d'Acacia -Double Acacia Bark Slab=Double Dalle d'écorce d'Acacia -Spruce Bark Stairs=Escalier en écorse de Sapin -Spruce Bark Slab=Plaque d'écorce de Sapin -Double Spruce Bark Slab=Double Dalle d'écorce de Sapin -Birch Bark Stairs=Escalier en écorse de Bouleau -Birch Bark Slab=Plaque d'écorce de Bouleau -Double Birch Bark Slab=Double Dalle d'écorce de Bouleau -Jungle Bark Stairs=Escalier en écorse d'Acajou -Jungle Bark Slab=Plaque d'écorce d'Acajou -Double Jungle Bark Slab=Double Dalle d'écorce d'Acajou -Dark Oak Bark Stairs=Escalier en écorse de Chêne Noir -Dark Oak Bark Slab=Plaque d'écorce de Chêne Noir -Double Dark Oak Bark Slab=Double Dalle d'écorce de Chêne Noir -Lapis Lazuli Slab=Dalle de Lapis Lazuli -Double Lapis Lazuli Slab=Double Dalle de Lapis Lazuli -Lapis Lazuli Stairs=Escalier de Lapis Lazuli -Slab of Gold=Dalle en Or -Double Slab of Gold=Double Dalle en Or -Stairs of Gold=Escalier en Or -Slab of Iron=Dalle en Fer -Double Slab of Iron=Double Dalle en Fer -Stairs of Iron=Escalier en Fer -Cracked Stone Brick Stairs=Escalier en Brique de Pierre Fissurée -Cracked Stone Brick Slab=Dalle de Brique de Pierre Fissurée -Double Cracked Stone Brick Slab=Double Dalle de Brique de Pierre Fissurée -White Concrete Stairs=Escalier en Béton Blanc -White Concrete Slab=Dalle en Béton Blanc -Double White Concrete Slab=Double Dalle en Béton Blanc -Grey Concrete Stairs=Escalier en Béton Gris -Grey Concrete Slab=Dalle en Béton Gris -Double Grey Concrete Slab=Double Dalle en Béton Gris -Light Grey Concrete Stairs=Escalier en Béton Gris Clair -Light Grey Concrete Slab=Dalle en Béton Gris Clair -Double Light Grey Concrete Slab=Double Dalle en Béton Gris Clair -Black Concrete Stairs=Escalier en Béton Noir -Black Concrete Slab=Dalle en Béton Noir -Double Black Concrete Slab=Double Dalle en Béton Noir -Red Concrete Stairs=Escalier en Béton Rouge -Red Concrete Slab=Dalle en Béton Rouge -Double Red Concrete Slab=Double Dalle en Béton Rouge -Yellow Concrete Stairs=Escalier en Béton Jaune -Yellow Concrete Slab=Dalle en Béton Jaune -Double Yellow Concrete Slab=Double Dalle en Béton Jaune -Green Concrete Stairs=Escalier en Béton Vert -Green Concrete Slab=Dalle en Béton Vert -Double Green Concrete Slab=Double Dalle en Béton Vert -Cyan Concrete Stairs=Escalier en Béton Cyan -Cyan Concrete Slab=Dalle en Béton Cyan -Double Cyan Concrete Slab=Double Dalle en Béton Cyan -Blue Concrete Stairs=Escalier en Béton Bleu -Blue Concrete Slab=Dalle en Béton Bleu -Double Blue Concrete Slab=Double Dalle en Béton Bleu -Magenta Concrete Stairs=Escalier en Béton Magenta -Magenta Concrete Slab=Dalle en Béton Magenta -Double Magenta Concrete Slab=Double Dalle en Béton Magenta -Orange Concrete Stairs=Escalier en Béton Orange -Orange Concrete Slab=Dalle en Béton Orange -Double Orange Concrete Slab=Double Dalle en Béton Orange -Purple Concrete Stairs=Escalier en Béton Violet -Purple Concrete Slab=Dalle en Béton Violet -Double Purple Concrete Slab=Double Dalle en Béton Violet -Brown Concrete Stairs=Escalier en Béton Marron -Brown Concrete Slab=Dalle en Béton Marron -Double Brown Concrete Slab=Double Dalle en Béton Marron -Pink Concrete Stairs=Escalier en Béton Rose -Pink Concrete Slab=Dalle en Béton Rose -Double Pink Concrete Slab=Double Dalle en Béton Rose -Lime Concrete Stairs=Escalier en Béton Vert Clair -Lime Concrete Slab=Dalle en Béton Vert Clair -Double Lime Concrete Slab=Double Dalle en Béton Vert Clair -Light Blue Concrete Stairs=Escalier en Béton Bleu Clair -Light Blue Concrete Slab=Dalle en Béton Bleu Clair -Double Light Blue Concrete Slab=Double Dalle en Béton Bleu Clair -Concrete Slab=Dalle en Béton -Double Concrete Slab=Double Dalle en Béton -Concrete Stairs=Escalier en Béton diff --git a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.pl.tr b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.pl.tr deleted file mode 100644 index 8a4c4d5e28..0000000000 --- a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.pl.tr +++ /dev/null @@ -1,82 +0,0 @@ -# textdomain: mclx_stairs -Oak Bark Stairs=Schody z dębowej kory -Oak Bark Slab=Płyta z dębowej kory -Double Oak Bark Slab=Podwójna płyta z dębowej kory -Acacia Bark Stairs=Schody z akacjowej kory -Acacia Bark Slab=Płyta z akacjowej kory -Double Acacia Bark Slab=Podwójna płyta z akacjowej kory -Spruce Bark Stairs=Schody ze świerkowej kory -Spruce Bark Slab=Płyta ze świerkowej kory -Double Spruce Bark Slab=Podwójna płyta ze świerkowej kory -Birch Bark Stairs=Schody z brzozowej kory -Birch Bark Slab=Płyta z brzozowej kory -Double Birch Bark Slab=Podwójna płyta z brzozowej kory -Jungle Bark Stairs=Schody z tropikalnej kory -Jungle Bark Slab=Płyta z tropikalnej kory -Double Jungle Bark Slab=Podwójna płyta z tropikalnej kory -Dark Oak Bark Stairs=Schody z ciemno-dębowej kory -Dark Oak Bark Slab=Płyta z ciemno-dębowej kory -Double Dark Oak Bark Slab=Podwójna płyta z ciemno-dębowej kory -Lapis Lazuli Slab=Płyta lazurytu -Double Lapis Lazuli Slab=Podwójna płyta lazurytu -Lapis Lazuli Stairs=Lazurytowe schody -Slab of Gold=Płyta złota -Double Slab of Gold=Podwójna płyta złota -Stairs of Gold=Złote schody -Slab of Iron=Płyta żelaza -Double Slab of Iron=Podwójna płyta żelaza -Stairs of Iron=Żelazne schody -Cracked Stone Brick Stairs=Schody z pękniętych ceglanych kamieni -Cracked Stone Brick Slab=Płyta z pękniętych ceglanych kamieni -Double Cracked Stone Brick Slab=Podwójna płyta z pękniętych ceglanych kamieni -White Concrete Stairs=Schody z białego cementu -White Concrete Slab=Płyta z białego cementu -Double White Concrete Slab=Podwójna płyta z białego cementu -Grey Concrete Stairs=Schody z szarego cementu -Grey Concrete Slab=Płyta z szarego cementu -Double Grey Concrete Slab=Podwójna płyta z szarego cementu -Light Grey Concrete Stairs=Schody z jasnoszarego cementu -Light Grey Concrete Slab=Płyta z jasnoszarego cementu -Double Light Grey Concrete Slab=Podwójna płyta z jasnoszarego cementu -Black Concrete Stairs=Schody z czarnego cementu -Black Concrete Slab=Płyta z czarnego cementu -Double Black Concrete Slab=Podwójna płyta z czarnego cementu -Red Concrete Stairs=Schody z czerwonego cementu -Red Concrete Slab=Płyta z czerwonego cementu -Double Red Concrete Slab=Podwójna płyta z czerwonego cementu -Yellow Concrete Stairs=Schody z żółtego cementu -Yellow Concrete Slab=Płyta z żółtego cementu -Double Yellow Concrete Slab=Podwójna płyta z żółtego cementu -Green Concrete Stairs=Schody z zielonego cementu -Green Concrete Slab=Płyta z zielonego cementu -Double Green Concrete Slab=Podwójna płyta z zielonego cementu -Cyan Concrete Stairs=Schody z błękitnego cementu -Cyan Concrete Slab=Płyta z błękitnego cementu -Double Cyan Concrete Slab=Podwójna płyta z błękitnego cementu -Blue Concrete Stairs=Schody z niebieskiego cementu -Blue Concrete Slab=Płyta z niebieskiego cementu -Double Blue Concrete Slab=Podwójna płyta z niebieskiego cementu -Magenta Concrete Stairs=Schody z karmazynowego cementu -Magenta Concrete Slab=Płyta z karmazynowego cementu -Double Magenta Concrete Slab=Podwójna płyta z karmazynowego cementu -Orange Concrete Stairs=Schody z pomarańczowego cementu -Orange Concrete Slab=Płyta z pomarańczowego cementu -Double Orange Concrete Slab=Podwójna płyta z pomarańczowego cementu -Purple Concrete Stairs=Schody z fioletowego cementu -Purple Concrete Slab=Płyta z fioletowego cementu -Double Purple Concrete Slab=Podwójna płyta z fioletowego cementu -Brown Concrete Stairs=Schody z brązowego cementu -Brown Concrete Slab=Płyta z brązowego cementu -Double Brown Concrete Slab=Podwójna płyta z brązowego cementu -Pink Concrete Stairs=Schody z różowego cementu -Pink Concrete Slab=Płyta z różowego cementu -Double Pink Concrete Slab=Podwójna płyta z różowego cementu -Lime Concrete Stairs=Schody z jasnozielonego cementu -Lime Concrete Slab=Płyta z jasnozielonego cementu -Double Lime Concrete Slab=Podwójna płyta z jasnozielonego cementu -Light Blue Concrete Stairs=Schody z jasnoniebieskiego cementu -Light Blue Concrete Slab=Płyta z jasnoniebieskiego cementu -Double Light Blue Concrete Slab=Podwójna płyta z jasnoniebieskiego cementu -Concrete Slab=płyta betonu -Double Concrete Slab=Podwójna płyta betonu -Concrete Stairs=Betonowe schody diff --git a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.ru.tr b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.ru.tr deleted file mode 100644 index 7dca54dd19..0000000000 --- a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.ru.tr +++ /dev/null @@ -1,82 +0,0 @@ -# textdomain: mclx_stairs -Oak Bark Stairs=Ступеньки из дубовой коры -Oak Bark Slab=Плита из дубовой коры -Double Oak Bark Slab=Двойная плита из дубовой коры -Acacia Bark Stairs=Ступеньки из коры акации -Acacia Bark Slab=Плита из коры акации -Double Acacia Bark Slab=Двойная плита из коры акации -Spruce Bark Stairs=Ступеньки из еловой коры -Spruce Bark Slab=Плита из еловой коры -Double Spruce Bark Slab=Двойная плита из еловой коры -Birch Bark Stairs=Ступеньки из берёзовой коры -Birch Bark Slab=Плита из берёзовой коры -Double Birch Bark Slab=Двойная плита из берёзовой коры -Jungle Bark Stairs=Ступеньки из коры дерева джунглей -Jungle Bark Slab=Плита из коры дерева джунглей -Double Jungle Bark Slab=Двойная плита из коры дерева джунглей -Dark Oak Bark Stairs=Ступеньки из коры тёмного дуба -Dark Oak Bark Slab=Плита из коры тёмного дуба -Double Dark Oak Bark Slab=Двойная плита из коры тёмного дуба -Lapis Lazuli Slab=Ляпис-лазурная плита -Double Lapis Lazuli Slab=Двойная ляпис-лазурная плита -Lapis Lazuli Stairs=Ляпис-лазурные ступеньки -Slab of Gold=Золотая плита -Double Slab of Gold=Двойная золотая плита -Stairs of Gold=Золотые ступеньки -Slab of Iron=Железная плита -Double Slab of Iron=Двойная железная плита -Stairs of Iron=Железные ступеньки -Cracked Stone Brick Stairs=Ступеньки из треснутого камня -Cracked Stone Brick Slab=Плита из треснутого камня -Double Cracked Stone Brick Slab=Двойная плита из треснутого камня -White Concrete Stairs=Белые бетонные ступеньки -White Concrete Slab=Белая бетонная панель -Double White Concrete Slab=Белая двойная бетонная панель -Grey Concrete Stairs=Серые бетонные ступеньки -Grey Concrete Slab=Серая бетонная панель -Double Grey Concrete Slab=Серая двойная бетонная панель -Light Grey Concrete Stairs=Светло-серые бетонные ступеньки -Light Grey Concrete Slab=Светло-серая бетонная панель -Double Light Grey Concrete Slab=Светло-серая двойная бетонная панель -Black Concrete Stairs=Чёрные бетонные ступеньки -Black Concrete Slab=Чёрная бетонная панель -Double Black Concrete Slab=Черная двойная бетонная панель -Red Concrete Stairs=Красные бетонные ступеньки -Red Concrete Slab=Красная бетонная панель -Double Red Concrete Slab=Красная двойная бетонная панель -Yellow Concrete Stairs=Жёлтые бетонные ступеньки -Yellow Concrete Slab=Жёлтая бетонная панель -Double Yellow Concrete Slab=Жёлтая двойная бетонная панель -Green Concrete Stairs=Зелёные бетонные ступеньки -Green Concrete Slab=Зелёная бетонная панель -Double Green Concrete Slab=Зелёная двойная бетонная панель -Cyan Concrete Stairs=Голубые бетонные ступеньки -Cyan Concrete Slab=Голубая бетонная панель -Double Cyan Concrete Slab=Голубая двойная бетонная панель -Blue Concrete Stairs=Синие бетонные ступеньки -Blue Concrete Slab=Синяя бетонная панель -Double Blue Concrete Slab=Синяя двойная бетонная панель -Magenta Concrete Stairs=Фиолетовые бетонные ступеньки -Magenta Concrete Slab=Фиолетовая бетонная панель -Double Magenta Concrete Slab=Фиолетовая двойная бетонная панель -Orange Concrete Stairs=Оранжевые бетонные ступеньки -Orange Concrete Slab=Оранжевая бетонная панель -Double Orange Concrete Slab=Оранжевая двойная бетонная панель -Purple Concrete Stairs=Пурпурные бетонные ступеньки -Purple Concrete Slab=Пурпурная бетонная панель -Double Purple Concrete Slab=Пурпурная двойная бетонная панель -Brown Concrete Stairs=Коричневые бетонные ступеньки -Brown Concrete Slab=Коричневая бетонная панель -Double Brown Concrete Slab=Коричневая двойная бетонная панель -Pink Concrete Stairs=Розовые бетонные ступеньки -Pink Concrete Slab=Розовая бетонная панель -Double Pink Concrete Slab=Розовая двойная бетонная панель -Lime Concrete Stairs=Зелёные лаймовые бетонные ступеньки -Lime Concrete Slab=Зелёная лаймовая бетонная панель -Double Lime Concrete Slab=Зелёная лаймовая двойная бетонная панель -Light Blue Concrete Stairs=Светло-голубые бетонные ступеньки -Light Blue Concrete Slab=Светло-голубая бетонная панель -Double Light Blue Concrete Slab=Светло-голубая двойная бетонная панель -Concrete Slab=Бетонная панель -Double Concrete Slab=Двойная бетонная панель -Concrete Stairs=Бетонные ступеньки diff --git a/mods/ITEMS/mclx_stairs/locale/template.txt b/mods/ITEMS/mclx_stairs/locale/template.txt deleted file mode 100644 index b6272dbcf9..0000000000 --- a/mods/ITEMS/mclx_stairs/locale/template.txt +++ /dev/null @@ -1,82 +0,0 @@ -# textdomain: mclx_stairs -Oak Bark Stairs= -Oak Bark Slab= -Double Oak Bark Slab= -Acacia Bark Stairs= -Acacia Bark Slab= -Double Acacia Bark Slab= -Spruce Bark Stairs= -Spruce Bark Slab= -Double Spruce Bark Slab= -Birch Bark Stairs= -Birch Bark Slab= -Double Birch Bark Slab= -Jungle Bark Stairs= -Jungle Bark Slab= -Double Jungle Bark Slab= -Dark Oak Bark Stairs= -Dark Oak Bark Slab= -Double Dark Oak Bark Slab= -Lapis Lazuli Slab= -Double Lapis Lazuli Slab= -Lapis Lazuli Stairs= -Slab of Gold= -Double Slab of Gold= -Stairs of Gold= -Slab of Iron= -Double Slab of Iron= -Stairs of Iron= -Cracked Stone Brick Stairs= -Cracked Stone Brick Slab= -Double Cracked Stone Brick Slab= -White Concrete Stairs= -White Concrete Slab= -Double White Concrete Slab= -Grey Concrete Stairs= -Grey Concrete Slab= -Double Grey Concrete Slab= -Light Grey Concrete Stairs= -Light Grey Concrete Slab= -Double Light Grey Concrete Slab= -Black Concrete Stairs= -Black Concrete Slab= -Double Black Concrete Slab= -Red Concrete Stairs= -Red Concrete Slab= -Double Red Concrete Slab= -Yellow Concrete Stairs= -Yellow Concrete Slab= -Double Yellow Concrete Slab= -Green Concrete Stairs= -Green Concrete Slab= -Double Green Concrete Slab= -Cyan Concrete Stairs= -Cyan Concrete Slab= -Double Cyan Concrete Slab= -Blue Concrete Stairs= -Blue Concrete Slab= -Double Blue Concrete Slab= -Magenta Concrete Stairs= -Magenta Concrete Slab= -Double Magenta Concrete Slab= -Orange Concrete Stairs= -Orange Concrete Slab= -Double Orange Concrete Slab= -Purple Concrete Stairs= -Purple Concrete Slab= -Double Purple Concrete Slab= -Brown Concrete Stairs= -Brown Concrete Slab= -Double Brown Concrete Slab= -Pink Concrete Stairs= -Pink Concrete Slab= -Double Pink Concrete Slab= -Lime Concrete Stairs= -Lime Concrete Slab= -Double Lime Concrete Slab= -Light Blue Concrete Stairs= -Light Blue Concrete Slab= -Double Light Blue Concrete Slab= -Concrete Slab= -Double Concrete Slab= -Concrete Stairs= diff --git a/mods/ITEMS/mclx_stairs/mod.conf b/mods/ITEMS/mclx_stairs/mod.conf deleted file mode 100644 index b3aecd8069..0000000000 --- a/mods/ITEMS/mclx_stairs/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = mclx_stairs -description = Additional stairs and slabs not found in Minecraft 1.11 -depends = mcl_ocean, mcl_core, mcl_sounds, mcl_nether, mcl_end, mcl_colorblocks, mcl_stairs -optional_depends = doc diff --git a/mods/ITEMS/mclx_stairs/textures/mcl_stairs_andesite_smooth_slab.png b/mods/ITEMS/mclx_stairs/textures/mcl_stairs_andesite_smooth_slab.png deleted file mode 100644 index daf6e96caf..0000000000 Binary files a/mods/ITEMS/mclx_stairs/textures/mcl_stairs_andesite_smooth_slab.png and /dev/null differ diff --git a/mods/ITEMS/mclx_stairs/textures/mcl_stairs_diorite_smooth_slab.png b/mods/ITEMS/mclx_stairs/textures/mcl_stairs_diorite_smooth_slab.png deleted file mode 100644 index 57d147bae0..0000000000 Binary files a/mods/ITEMS/mclx_stairs/textures/mcl_stairs_diorite_smooth_slab.png and /dev/null differ diff --git a/mods/ITEMS/mclx_stairs/textures/mcl_stairs_gold_block_slab.png b/mods/ITEMS/mclx_stairs/textures/mcl_stairs_gold_block_slab.png deleted file mode 100644 index 7f490e704e..0000000000 Binary files a/mods/ITEMS/mclx_stairs/textures/mcl_stairs_gold_block_slab.png and /dev/null differ diff --git a/mods/ITEMS/mclx_stairs/textures/mcl_stairs_granite_smooth_slab.png b/mods/ITEMS/mclx_stairs/textures/mcl_stairs_granite_smooth_slab.png deleted file mode 100644 index 968d8b9687..0000000000 Binary files a/mods/ITEMS/mclx_stairs/textures/mcl_stairs_granite_smooth_slab.png and /dev/null differ diff --git a/mods/ITEMS/mclx_stairs/textures/mcl_stairs_iron_block_slab.png b/mods/ITEMS/mclx_stairs/textures/mcl_stairs_iron_block_slab.png deleted file mode 100644 index 101f62c465..0000000000 Binary files a/mods/ITEMS/mclx_stairs/textures/mcl_stairs_iron_block_slab.png and /dev/null differ diff --git a/mods/ITEMS/mclx_stairs/textures/mcl_stairs_lapis_block_slab.png b/mods/ITEMS/mclx_stairs/textures/mcl_stairs_lapis_block_slab.png deleted file mode 100644 index 2690b4a020..0000000000 Binary files a/mods/ITEMS/mclx_stairs/textures/mcl_stairs_lapis_block_slab.png and /dev/null differ diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index f198e09fa2..8e46682a9b 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1,27 +1,7 @@ -local mg_name = minetest.get_mapgen_setting("mg_name") -local mg_seed = minetest.get_mapgen_setting("seed") - --- Some mapgen settings -local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" - -local generate_fallen_logs = minetest.settings:get_bool("mcl_generate_fallen_logs", false) - -local mod_mcl_structures = minetest.get_modpath("mcl_structures") -local mod_mcl_core = minetest.get_modpath("mcl_core") -local mod_mcl_mushrooms = minetest.get_modpath("mcl_mushrooms") - --- Jungle bush schematic. In PC/Java Edition it's Jungle Wood + Oak Leaves -local jungle_bush_schematic = mod_mcl_core.."/schematics/mcl_core_jungle_bush_oak_leaves.mts" - -local deco_id_chorus_plant - -- -- Register biomes -- -local OCEAN_MIN = -15 -local DEEP_OCEAN_MAX = OCEAN_MIN - 1 -local DEEP_OCEAN_MIN = -31 --[[ Special biome field: _mcl_biome_type: Rough categorization of biomes: One of "snowy", "cold", "medium" and "hot" @@ -34,9 +14,9 @@ local function register_classic_superflat_biome() node_top = "mcl_core:dirt_with_grass", depth_top = 1, node_filler = "mcl_core:dirt", - depth_filler = 3, - node_stone = "mcl_core:dirt", - y_min = mcl_vars.mg_overworld_min - 512, + depth_filler = 0, + node_stone = "mcl_core:stone", + y_min = mcl_vars.mg_overworld_min - 21, -- Gap between build limit and floor y_max = mcl_vars.mg_overworld_max, humidity_point = 50, heat_point = 50, @@ -44,3954 +24,10 @@ local function register_classic_superflat_biome() _mcl_palette_index = 0, }) end - --- All mapgens except mgv6, flat and singlenode -local function register_biomes() - --[[ OVERWORLD ]] - - --[[ These biomes try to resemble MC as good as possible. This means especially the floor cover and - the type of plants and structures (shapes might differ). The terrain itself will be of course different - and depends on the mapgen. - Important: MC also takes the terrain into account while MT biomes don't care about the terrain at all - (except height). - MC has many “M” and “Hills” variants, most of which only differ in terrain compared to their original - counterpart. - In MT, any biome can occour in any terrain, so these variants are implied and are therefore - not explicitly implmented in MCL2. “M” variants are only included if they have another unique feature, - such as a different land cover. - In MCL2, the MC Overworld biomes are split in multiple more parts (stacked by height): - * The main part, this represents the land. It begins at around sea level and usually goes all the way up - * _ocean: For the area covered by ocean water. The y_max may vary for various beach effects. - Has sand or dirt as floor. - * _deep_ocean: Like _ocean, but deeper and has gravel as floor - * _underground: - * Other modifiers: Some complex biomes require more layers to improve the landscape. - - The following naming conventions apply: - * The land biome name is equal to the MC biome name, as of Minecraft 1.11 (in camel case) - * Height modifiers and sub-biomes are appended with underscores and in lowercase. Example: “_ocean” - * Non-MC biomes are written in lowercase - * MC dimension biomes are named after their MC dimension - - Intentionally missing biomes: - * River (generated by valleys and v7) - * Frozen River (generated by valleys and v7) - * Hills biomes (shape only) - * Plateau (shape only) - * Plateau M (shape only) - * Cold Taiga M (mountain only) - * Taiga M (mountain only) - * Roofed Forest M (mountain only) - * Swampland M (mountain only) - * Extreme Hills Edge (unused in MC) - - TODO: - * Better beaches - * Improve Extreme Hills M - * Desert M - - ]] - - -- List of Overworld biomes without modifiers. - -- IMPORTANT: Don't forget to add new Overworld biomes to this list! - local overworld_biomes = { - "IcePlains", - "IcePlainsSpikes", - "ColdTaiga", - "ExtremeHills", - "ExtremeHillsM", - "ExtremeHills+", - "Taiga", - "MegaTaiga", - "MegaSpruceTaiga", - "StoneBeach", - "Plains", - "SunflowerPlains", - "Forest", - "FlowerForest", - "BirchForest", - "BirchForestM", - "RoofedForest", - "Swampland", - "Jungle", - "JungleM", - "JungleEdge", - "JungleEdgeM", - "MushroomIsland", - "Desert", - "Savanna", - "SavannaM", - "Mesa", - "MesaBryce", - "MesaPlateauF", - "MesaPlateauFM", - } - - -- Ice Plains Spikes (rare) - minetest.register_biome({ - name = "IcePlainsSpikes", - node_top = "mcl_core:snowblock", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 2, - node_water_top = "mcl_core:ice", - depth_water_top = 1, - node_river_water = "mcl_core:ice", - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 24, - heat_point = -5, - _mcl_biome_type = "snowy", - _mcl_palette_index = 2, - }) - minetest.register_biome({ - name = "IcePlainsSpikes_ocean", - node_top = "mcl_core:gravel", - depth_top = 2, - node_filler = "mcl_core:gravel", - depth_filler = 3, - node_river_water = "mcl_core:ice", - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = 0, - humidity_point = 24, - heat_point = -5, - _mcl_biome_type = "snowy", - _mcl_palette_index = 2, - }) - - -- Cold Taiga - minetest.register_biome({ - name = "ColdTaiga", - node_dust = "mcl_core:snow", - node_top = "mcl_core:dirt_with_grass_snow", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 2, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 3, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 58, - heat_point = 8, - _mcl_biome_type = "snowy", - _mcl_palette_index = 3, - }) - - -- A cold beach-like biome, implemented as low part of Cold Taiga - minetest.register_biome({ - name = "ColdTaiga_beach", - node_dust = "mcl_core:snow", - node_top = "mcl_core:sand", - depth_top = 2, - node_water_top = "mcl_core:ice", - depth_water_top = 1, - node_filler = "mcl_core:sandstone", - depth_filler = 2, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = 2, - humidity_point = 58, - heat_point = 8, - _mcl_biome_type = "snowy", - _mcl_palette_index = 3, - }) - -- Water part of the beach. Added to prevent snow being on the ice. - minetest.register_biome({ - name = "ColdTaiga_beach_water", - node_top = "mcl_core:sand", - depth_top = 2, - node_water_top = "mcl_core:ice", - depth_water_top = 1, - node_filler = "mcl_core:sandstone", - depth_filler = 2, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = -4, - y_max = 0, - humidity_point = 58, - heat_point = 8, - _mcl_biome_type = "snowy", - _mcl_palette_index = 3, - }) - minetest.register_biome({ - name = "ColdTaiga_ocean", - node_top = "mcl_core:gravel", - depth_top = 1, - node_filler = "mcl_core:gravel", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = -5, - humidity_point = 58, - heat_point = 8, - vertical_blend = 1, - _mcl_biome_type = "snowy", - _mcl_palette_index = 3, - }) - - -- Mega Taiga - minetest.register_biome({ - name = "MegaTaiga", - node_top = "mcl_core:podzol", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 76, - heat_point = 10, - _mcl_biome_type = "cold", - _mcl_palette_index = 4, - }) - minetest.register_biome({ - name = "MegaTaiga_ocean", - node_top = "mcl_core:gravel", - depth_top = 1, - node_filler = "mcl_core:gravel", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = 0, - humidity_point = 76, - heat_point = 10, - _mcl_biome_type = "cold", - _mcl_palette_index = 4, - }) - - -- Mega Spruce Taiga - minetest.register_biome({ - name = "MegaSpruceTaiga", - node_top = "mcl_core:podzol", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 100, - heat_point = 8, - _mcl_biome_type = "cold", - _mcl_palette_index = 5, - }) - minetest.register_biome({ - name = "MegaSpruceTaiga_ocean", - node_top = "mcl_core:gravel", - depth_top = 1, - node_filler = "mcl_core:gravel", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = 0, - humidity_point = 100, - heat_point = 8, - _mcl_biome_type = "cold", - _mcl_palette_index = 5, - }) - - -- Extreme Hills - -- Sparsely populated grasslands with little tallgras and trees. - minetest.register_biome({ - name = "ExtremeHills", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 4, - node_riverbed = "mcl_core:sand", - depth_riverbed = 4, - y_min = 4, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 10, - heat_point = 45, - _mcl_biome_type = "cold", - _mcl_palette_index = 6, - }) - minetest.register_biome({ - name = "ExtremeHills_beach", - node_top = "mcl_core:sand", - depth_top = 2, - depth_water_top = 1, - node_filler = "mcl_core:sandstone", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 4, - y_min = -4, - y_max = 3, - humidity_point = 10, - heat_point = 45, - _mcl_biome_type = "cold", - _mcl_palette_index = 6, - }) - minetest.register_biome({ - name = "ExtremeHills_ocean", - node_top = "mcl_core:gravel", - depth_top = 1, - node_filler = "mcl_core:gravel", - depth_filler = 4, - node_riverbed = "mcl_core:sand", - depth_riverbed = 4, - y_min = OCEAN_MIN, - y_max = -5, - vertical_blend = 1, - humidity_point = 10, - heat_point = 45, - _mcl_biome_type = "cold", - _mcl_palette_index = 6, - }) - - -- Extreme Hills M - -- Just gravel. - minetest.register_biome({ - name = "ExtremeHillsM", - node_top = "mcl_core:gravel", - depth_top = 1, - node_filler = "mcl_core:gravel", - depth_filler = 3, - node_riverbed = "mcl_core:gravel", - depth_riverbed = 3, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 0, - heat_point = 25, - _mcl_biome_type = "cold", - _mcl_palette_index = 7, - }) - minetest.register_biome({ - name = "ExtremeHillsM_ocean", - node_top = "mcl_core:gravel", - depth_top = 1, - node_filler = "mcl_core:gravel", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 3, - y_min = OCEAN_MIN, - y_max = 0, - humidity_point = 0, - heat_point = 25, - _mcl_biome_type = "cold", - _mcl_palette_index = 7, - }) - - -- Extreme Hills+ - -- This biome is near-identical to Extreme Hills on the surface but has snow-covered mountains with spruce/oak - -- forests above a certain height. - minetest.register_biome({ - name = "ExtremeHills+", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 4, - node_riverbed = "mcl_core:sand", - depth_riverbed = 4, - y_min = 1, - y_max = 41, - humidity_point = 24, - heat_point = 25, - vertical_blend = 6, - _mcl_biome_type = "cold", - _mcl_palette_index = 8, - }) - ---- Sub-biome for Extreme Hills+ for those snow forests - minetest.register_biome({ - name = "ExtremeHills+_snowtop", - node_dust = "mcl_core:snow", - node_top = "mcl_core:dirt_with_grass_snow", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 4, - node_river_water = "mcl_core:ice", - node_riverbed = "mcl_core:sand", - depth_riverbed = 4, - y_min = 42, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 24, - heat_point = 25, - _mcl_biome_type = "cold", - _mcl_palette_index = 8, - }) - minetest.register_biome({ - name = "ExtremeHills+_ocean", - node_top = "mcl_core:gravel", - depth_top = 1, - node_filler = "mcl_core:gravel", - depth_filler = 4, - node_riverbed = "mcl_core:sand", - depth_riverbed = 4, - y_min = OCEAN_MIN, - y_max = 0, - humidity_point = 24, - heat_point = 25, - _mcl_biome_type = "cold", - _mcl_palette_index = 8, - }) - - -- Stone beach - -- Just stone. - -- Not neccessarily a beach at all, only named so according to MC - minetest.register_biome({ - name = "StoneBeach", - node_riverbed = "mcl_core:sand", - depth_riverbed = 1, - y_min = -7, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 0, - heat_point = 8, - _mcl_biome_type = "cold", - _mcl_palette_index = 9, - }) - - minetest.register_biome({ - name = "StoneBeach_ocean", - node_top = "mcl_core:gravel", - depth_top = 1, - node_riverbed = "mcl_core:sand", - depth_riverbed = 1, - y_min = OCEAN_MIN, - y_max = -8, - vertical_blend = 2, - humidity_point = 0, - heat_point = 8, - _mcl_biome_type = "cold", - _mcl_palette_index = 9, - }) - - -- Ice Plains - minetest.register_biome({ - name = "IcePlains", - node_dust = "mcl_core:snow", - node_top = "mcl_core:dirt_with_grass_snow", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 2, - node_water_top = "mcl_core:ice", - depth_water_top = 2, - node_river_water = "mcl_core:ice", - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 24, - heat_point = 8, - _mcl_biome_type = "snowy", - _mcl_palette_index = 10, - }) - minetest.register_biome({ - name = "IcePlains_ocean", - node_top = "mcl_core:gravel", - depth_top = 1, - node_filler = "mcl_core:gravel", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = 0, - humidity_point = 24, - heat_point = 8, - _mcl_biome_type = "snowy", - _mcl_palette_index = 10, - }) - - -- Plains - minetest.register_biome({ - name = "Plains", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 2, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 3, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 39, - heat_point = 58, - _mcl_biome_type = "medium", - _mcl_palette_index = 0, - }) - minetest.register_biome({ - name = "Plains_beach", - node_top = "mcl_core:sand", - depth_top = 2, - node_filler = "mcl_core:sandstone", - depth_filler = 2, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 0, - y_max = 2, - humidity_point = 39, - heat_point = 58, - _mcl_biome_type = "medium", - _mcl_palette_index = 0, - }) - minetest.register_biome({ - name = "Plains_ocean", - node_top = "mcl_core:sand", - depth_top = 1, - node_filler = "mcl_core:sand", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = -1, - humidity_point = 39, - heat_point = 58, - _mcl_biome_type = "medium", - _mcl_palette_index = 0, - }) - - -- Sunflower Plains - minetest.register_biome({ - name = "SunflowerPlains", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 4, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 28, - heat_point = 45, - _mcl_biome_type = "medium", - _mcl_palette_index = 11, - }) - minetest.register_biome({ - name = "SunflowerPlains_ocean", - node_top = "mcl_core:sand", - depth_top = 1, - node_filler = "mcl_core:sand", - depth_filler = 3, - node_riverbed = "mcl_core:dirt", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = 0, - humidity_point = 28, - heat_point = 45, - _mcl_biome_type = "medium", - _mcl_palette_index = 11, - }) - - -- Taiga - minetest.register_biome({ - name = "Taiga", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 4, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 58, - heat_point = 22, - _mcl_biome_type = "cold", - _mcl_palette_index = 12, - }) - minetest.register_biome({ - name = "Taiga_beach", - node_top = "mcl_core:sand", - depth_top = 2, - node_filler = "mcl_core:sandstone", - depth_filler = 1, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = 3, - humidity_point = 58, - heat_point = 22, - _mcl_biome_type = "cold", - _mcl_palette_index = 12, - }) - minetest.register_biome({ - name = "Taiga_ocean", - node_top = "mcl_core:gravel", - depth_top = 1, - node_filler = "mcl_core:gravel", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = 0, - humidity_point = 58, - heat_point = 22, - _mcl_biome_type = "cold", - _mcl_palette_index = 12, - }) - - -- Forest - minetest.register_biome({ - name = "Forest", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 61, - heat_point = 45, - _mcl_biome_type = "medium", - _mcl_palette_index = 13, - }) - minetest.register_biome({ - name = "Forest_beach", - node_top = "mcl_core:sand", - depth_top = 2, - node_filler = "mcl_core:sandstone", - depth_filler = 1, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = -1, - y_max = 0, - humidity_point = 61, - heat_point = 45, - _mcl_biome_type = "medium", - _mcl_palette_index = 13, - }) - minetest.register_biome({ - name = "Forest_ocean", - node_top = "mcl_core:sand", - depth_top = 1, - node_filler = "mcl_core:sand", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = -2, - humidity_point = 61, - heat_point = 45, - _mcl_biome_type = "medium", - _mcl_palette_index = 13, - }) - - -- Flower Forest - minetest.register_biome({ - name = "FlowerForest", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 3, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 44, - heat_point = 32, - _mcl_biome_type = "medium", - _mcl_palette_index = 14, - }) - minetest.register_biome({ - name = "FlowerForest_beach", - node_top = "mcl_core:sand", - depth_top = 2, - node_filler = "mcl_core:sandstone", - depth_filler = 1, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = -2, - y_max = 2, - humidity_point = 44, - heat_point = 32, - _mcl_biome_type = "medium", - _mcl_palette_index = 14, - }) - minetest.register_biome({ - name = "FlowerForest_ocean", - node_top = "mcl_core:sand", - depth_top = 1, - node_filler = "mcl_core:sand", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = -3, - humidity_point = 44, - heat_point = 32, - _mcl_biome_type = "medium", - _mcl_palette_index = 14, - }) - - -- Birch Forest - minetest.register_biome({ - name = "BirchForest", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 78, - heat_point = 31, - _mcl_biome_type = "medium", - _mcl_palette_index = 15, - }) - minetest.register_biome({ - name = "BirchForest_ocean", - node_top = "mcl_core:sand", - depth_top = 1, - node_filler = "mcl_core:sand", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = 0, - humidity_point = 78, - heat_point = 31, - _mcl_biome_type = "medium", - _mcl_palette_index = 15, - }) - - -- Birch Forest M - minetest.register_biome({ - name = "BirchForestM", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 77, - heat_point = 27, - _mcl_biome_type = "medium", - _mcl_palette_index = 16, - }) - minetest.register_biome({ - name = "BirchForestM_ocean", - node_top = "mcl_core:sand", - depth_top = 1, - node_filler = "mcl_core:gravel", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = 0, - humidity_point = 77, - heat_point = 27, - _mcl_biome_type = "medium", - _mcl_palette_index = 16, - }) - - -- Desert - minetest.register_biome({ - name = "Desert", - node_top = "mcl_core:sand", - depth_top = 1, - node_filler = "mcl_core:sand", - depth_filler = 2, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - node_stone = "mcl_core:sandstone", - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 26, - heat_point = 94, - _mcl_biome_type = "hot", - _mcl_palette_index = 17, - }) - minetest.register_biome({ - name = "Desert_ocean", - node_top = "mcl_core:sand", - depth_top = 1, - node_filler = "mcl_core:sand", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = 0, - humidity_point = 26, - heat_point = 94, - _mcl_biome_type = "hot", - _mcl_palette_index = 17, - }) - - -- Roofed Forest - minetest.register_biome({ - name = "RoofedForest", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 2, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 94, - heat_point = 27, - _mcl_biome_type = "medium", - _mcl_palette_index = 18, - }) - minetest.register_biome({ - name = "RoofedForest_ocean", - node_top = "mcl_core:gravel", - depth_top = 1, - node_filler = "mcl_core:gravel", - depth_filler = 2, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = 0, - humidity_point = 94, - heat_point = 27, - _mcl_biome_type = "medium", - _mcl_palette_index = 18, - }) - - -- Mesa: Starts with a couple of sand-covered layers (the "sandlevel"), - -- followed by terracotta with colorful (but imperfect) strata - minetest.register_biome({ - name = "Mesa", - node_top = "mcl_colorblocks:hardened_clay", - depth_top = 1, - node_filler = "mcl_colorblocks:hardened_clay", - node_riverbed = "mcl_core:redsand", - depth_riverbed = 1, - node_stone = "mcl_colorblocks:hardened_clay", - y_min = 11, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 0, - heat_point = 100, - _mcl_biome_type = "hot", - _mcl_palette_index = 19, - }) - -- Helper biome for the red sand at the bottom of Mesas. - minetest.register_biome({ - name = "Mesa_sandlevel", - node_top = "mcl_core:redsand", - depth_top = 1, - node_filler = "mcl_colorblocks:hardened_clay_orange", - depth_filler = 3, - node_riverbed = "mcl_core:redsand", - depth_riverbed = 1, - node_stone = "mcl_colorblocks:hardened_clay_orange", - y_min = -4, - y_max = 10, - humidity_point = 0, - heat_point = 100, - _mcl_biome_type = "hot", - _mcl_palette_index = 19, - }) - minetest.register_biome({ - name = "Mesa_ocean", - node_top = "mcl_core:sand", - depth_top = 3, - node_filler = "mcl_core:sand", - depth_filler = 2, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = -5, - vertical_blend = 1, - humidity_point = 0, - heat_point = 100, - _mcl_biome_type = "hot", - _mcl_palette_index = 19, - }) - - -- Mesa Bryce: Variant of Mesa, but with perfect strata and a much smaller red sand desert - minetest.register_biome({ - name = "MesaBryce", - node_top = "mcl_colorblocks:hardened_clay", - depth_top = 1, - node_filler = "mcl_colorblocks:hardened_clay", - node_riverbed = "mcl_colorblocks:hardened_clay", - depth_riverbed = 1, - node_stone = "mcl_colorblocks:hardened_clay", - y_min = 4, - y_max = mcl_vars.mg_overworld_max, - humidity_point = -5, - heat_point = 100, - _mcl_biome_type = "hot", - _mcl_palette_index = 20, - }) - minetest.register_biome({ - name = "MesaBryce_sandlevel", - node_top = "mcl_core:redsand", - depth_top = 1, - node_filler = "mcl_colorblocks:hardened_clay_orange", - depth_filler = 3, - node_riverbed = "mcl_colorblocks:hardened_clay", - depth_riverbed = 1, - node_stone = "mcl_colorblocks:hardened_clay_orange", - y_min = -4, - y_max = 3, - humidity_point = -5, - heat_point = 100, - _mcl_biome_type = "hot", - _mcl_palette_index = 20, - }) - minetest.register_biome({ - name = "MesaBryce_ocean", - node_top = "mcl_core:sand", - depth_top = 3, - node_filler = "mcl_core:sand", - depth_filler = 2, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = -5, - vertical_blend = 1, - humidity_point = -5, - heat_point = 100, - _mcl_biome_type = "hot", - _mcl_palette_index = 20, - }) - - - - -- Mesa Plateau F - -- Identical to Mesa below Y=30. At Y=30 and above there is a "dry" oak forest - minetest.register_biome({ - name = "MesaPlateauF", - node_top = "mcl_colorblocks:hardened_clay", - depth_top = 1, - node_filler = "mcl_colorblocks:hardened_clay", - node_riverbed = "mcl_core:redsand", - depth_riverbed = 1, - node_stone = "mcl_colorblocks:hardened_clay", - y_min = 11, - y_max = 29, - humidity_point = 0, - heat_point = 60, - vertical_blend = 0, -- we want a sharp transition - _mcl_biome_type = "hot", - _mcl_palette_index = 21, - }) - -- The oak forest plateau of this biome. - -- This is a plateau for grass blocks, dry shrubs, tall grass, coarse dirt and oaks. - -- Strata don't generate here. - minetest.register_biome({ - name = "MesaPlateauF_grasstop", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 1, - node_riverbed = "mcl_core:redsand", - depth_riverbed = 1, - node_stone = "mcl_colorblocks:hardened_clay", - y_min = 30, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 0, - heat_point = 60, - _mcl_biome_type = "hot", - _mcl_palette_index = 21, - }) - minetest.register_biome({ - name = "MesaPlateauF_sandlevel", - node_top = "mcl_core:redsand", - depth_top = 2, - node_filler = "mcl_colorblocks:hardened_clay_orange", - depth_filler = 3, - node_riverbed = "mcl_core:redsand", - depth_riverbed = 1, - node_stone = "mcl_colorblocks:hardened_clay_orange", - y_min = -5, - y_max = 10, - humidity_point = 0, - heat_point = 60, - _mcl_biome_type = "hot", - _mcl_palette_index = 21, - }) - minetest.register_biome({ - name = "MesaPlateauF_ocean", - node_top = "mcl_core:sand", - depth_top = 3, - node_filler = "mcl_core:sand", - depth_filler = 2, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = -6, - vertical_blend = 1, - humidity_point = 0, - heat_point = 60, - _mcl_biome_type = "hot", - _mcl_palette_index = 21, - }) - - -- Mesa Plateau FM - -- Dryer and more "chaotic"/"weathered down" variant of MesaPlateauF: - -- oak forest is less dense, more coarse dirt, more erratic terrain, vertical blend, more red sand layers, - -- red sand as ores, red sandstone at sandlevel - minetest.register_biome({ - name = "MesaPlateauFM", - node_top = "mcl_colorblocks:hardened_clay", - depth_top = 1, - node_filler = "mcl_colorblocks:hardened_clay", - node_riverbed = "mcl_core:redsand", - depth_riverbed = 2, - node_stone = "mcl_colorblocks:hardened_clay", - y_min = 12, - y_max = 29, - humidity_point = -5, - heat_point = 60, - vertical_blend = 5, - _mcl_biome_type = "hot", - _mcl_palette_index = 22, - }) - -- Grass plateau - minetest.register_biome({ - name = "MesaPlateauFM_grasstop", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:coarse_dirt", - depth_filler = 2, - node_riverbed = "mcl_core:redsand", - depth_riverbed = 1, - node_stone = "mcl_colorblocks:hardened_clay", - y_min = 30, - y_max = mcl_vars.mg_overworld_max, - humidity_point = -5, - heat_point = 60, - _mcl_biome_type = "hot", - _mcl_palette_index = 22, - }) - minetest.register_biome({ - name = "MesaPlateauFM_sandlevel", - node_top = "mcl_core:redsand", - depth_top = 3, - node_filler = "mcl_colorblocks:hardened_clay_orange", - depth_filler = 3, - node_riverbed = "mcl_core:redsand", - depth_riverbed = 2, - node_stone = "mcl_colorblocks:hardened_clay", - -- red sand has wider reach than in other mesa biomes - y_min = -7, - y_max = 11, - humidity_point = -5, - heat_point = 60, - vertical_blend = 4, - _mcl_biome_type = "hot", - _mcl_palette_index = 22, - }) - minetest.register_biome({ - name = "MesaPlateauFM_ocean", - node_top = "mcl_core:sand", - depth_top = 3, - node_filler = "mcl_core:sand", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 3, - y_min = OCEAN_MIN, - y_max = -8, - vertical_blend = 2, - humidity_point = -5, - heat_point = 60, - _mcl_biome_type = "hot", - _mcl_palette_index = 22, - }) - - - -- Savanna - minetest.register_biome({ - name = "Savanna", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 2, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 36, - heat_point = 79, - _mcl_biome_type = "hot", - _mcl_palette_index = 1, - }) - minetest.register_biome({ - name = "Savanna_beach", - node_top = "mcl_core:sand", - depth_top = 3, - node_filler = "mcl_core:sandstone", - depth_filler = 2, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = -1, - y_max = 0, - humidity_point = 36, - heat_point = 79, - _mcl_biome_type = "hot", - _mcl_palette_index = 1, - }) - minetest.register_biome({ - name = "Savanna_ocean", - node_top = "mcl_core:sand", - depth_top = 1, - node_filler = "mcl_core:sand", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = -2, - humidity_point = 36, - heat_point = 79, - _mcl_biome_type = "hot", - _mcl_palette_index = 1, - }) - - -- Savanna M - -- Changes to Savanna: Coarse Dirt. No sand beach. No oaks. - -- Otherwise identical to Savanna - minetest.register_biome({ - name = "SavannaM", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:coarse_dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 48, - heat_point = 100, - _mcl_biome_type = "hot", - _mcl_palette_index = 23, - }) - minetest.register_biome({ - name = "SavannaM_ocean", - node_top = "mcl_core:sand", - depth_top = 1, - node_filler = "mcl_core:sand", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = 0, - humidity_point = 48, - heat_point = 100, - _mcl_biome_type = "hot", - _mcl_palette_index = 23, - }) - - -- Jungle - minetest.register_biome({ - name = "Jungle", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 88, - heat_point = 81, - _mcl_biome_type = "medium", - _mcl_palette_index = 24, - }) - minetest.register_biome({ - name = "Jungle_shore", - node_top = "mcl_core:dirt", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = -2, - y_max = 0, - humidity_point = 88, - heat_point = 81, - _mcl_biome_type = "medium", - _mcl_palette_index = 24, - }) - minetest.register_biome({ - name = "Jungle_ocean", - node_top = "mcl_core:sand", - depth_top = 1, - node_filler = "mcl_core:sand", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = -3, - vertical_blend = 1, - humidity_point = 88, - heat_point = 81, - _mcl_biome_type = "medium", - _mcl_palette_index = 24, - }) - - -- Jungle M - -- Like Jungle but with even more dense vegetation - minetest.register_biome({ - name = "JungleM", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 92, - heat_point = 81, - _mcl_biome_type = "medium", - _mcl_palette_index = 25, - }) - minetest.register_biome({ - name = "JungleM_shore", - node_top = "mcl_core:dirt", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = -2, - y_max = 0, - humidity_point = 92, - heat_point = 81, - _mcl_biome_type = "medium", - _mcl_palette_index = 25, - }) - minetest.register_biome({ - name = "JungleM_ocean", - node_top = "mcl_core:sand", - depth_top = 1, - node_filler = "mcl_core:sand", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = -3, - vertical_blend = 1, - humidity_point = 92, - heat_point = 81, - _mcl_biome_type = "medium", - _mcl_palette_index = 25, - }) - - -- Jungle Edge - minetest.register_biome({ - name = "JungleEdge", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 2, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 88, - heat_point = 76, - _mcl_biome_type = "medium", - _mcl_palette_index = 26, - }) - minetest.register_biome({ - name = "JungleEdge_ocean", - node_top = "mcl_core:sand", - depth_top = 1, - node_filler = "mcl_core:sand", - depth_filler = 2, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = 0, - humidity_point = 88, - heat_point = 76, - _mcl_biome_type = "medium", - _mcl_palette_index = 26, - }) - - -- Jungle Edge M (very rare). - -- Almost identical to Jungle Edge. Has deeper dirt. Melons spawn here a lot. - -- This biome occours directly between Jungle M and Jungle Edge but also has a small border to Jungle. - -- This biome is very small in general. - minetest.register_biome({ - name = "JungleEdgeM", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 4, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - humidity_point = 90, - heat_point = 79, - _mcl_biome_type = "medium", - _mcl_palette_index = 27, - }) - minetest.register_biome({ - name = "JungleEdgeM_ocean", - node_top = "mcl_core:sand", - depth_top = 1, - node_filler = "mcl_core:sand", - depth_filler = 4, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = 0, - humidity_point = 90, - heat_point = 79, - _mcl_biome_type = "medium", - _mcl_palette_index = 27, - }) - - -- Swampland - minetest.register_biome({ - name = "Swampland", - node_top = "mcl_core:dirt_with_grass", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - -- Note: Limited in height! - y_max = 23, - humidity_point = 90, - heat_point = 50, - _mcl_biome_type = "medium", - _mcl_palette_index = 28, - }) - minetest.register_biome({ - name = "Swampland_shore", - node_top = "mcl_core:dirt", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = -5, - y_max = 0, - humidity_point = 90, - heat_point = 50, - _mcl_biome_type = "medium", - _mcl_palette_index = 28, - }) - minetest.register_biome({ - name = "Swampland_ocean", - node_top = "mcl_core:sand", - depth_top = 1, - node_filler = "mcl_core:sand", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = -6, - vertical_blend = 1, - humidity_point = 90, - heat_point = 50, - _mcl_biome_type = "medium", - _mcl_palette_index = 28, - }) - - -- Mushroom Island / Mushroom Island Shore (rare) - -- Not neccessarily an island at all, only named after Minecraft's biome - minetest.register_biome({ - name = "MushroomIsland", - node_top = "mcl_core:mycelium", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 4, - -- Note: Limited in height! - y_max = 20, - vertical_blend = 1, - humidity_point = 106, - heat_point = 50, - _mcl_biome_type = "medium", - _mcl_palette_index = 29, - }) - - minetest.register_biome({ - name = "MushroomIslandShore", - node_top = "mcl_core:mycelium", - depth_top = 1, - node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = 1, - y_max = 3, - humidity_point = 106, - heat_point = 50, - _mcl_biome_type = "medium", - _mcl_palette_index = 29, - }) - minetest.register_biome({ - name = "MushroomIsland_ocean", - node_top = "mcl_core:gravel", - depth_top = 1, - node_filler = "mcl_core:gravel", - depth_filler = 3, - node_riverbed = "mcl_core:sand", - depth_riverbed = 2, - y_min = OCEAN_MIN, - y_max = 0, - humidity_point = 106, - heat_point = 50, - _mcl_biome_type = "medium", - _mcl_palette_index = 29, - }) - - -- Add deep ocean and underground biomes automatically. - for i=1, #overworld_biomes do - local biome = overworld_biomes[i] - - -- Deep Ocean - minetest.register_biome({ - name = biome .. "_deep_ocean", - heat_point = minetest.registered_biomes[biome].heat_point, - humidity_point = minetest.registered_biomes[biome].humidity_point, - y_min = DEEP_OCEAN_MIN, - y_max = DEEP_OCEAN_MAX, - node_top = minetest.registered_biomes[biome.."_ocean"].node_top, - depth_top = 2, - node_filler = minetest.registered_biomes[biome.."_ocean"].node_filler, - depth_filler = 3, - node_riverbed = minetest.registered_biomes[biome.."_ocean"].node_riverbed, - depth_riverbed = 2, - vertical_blend = 5, - _mcl_biome_type = minetest.registered_biomes[biome]._mcl_biome_type, - _mcl_palette_index = minetest.registered_biomes[biome]._mcl_palette_index, - }) - - -- Underground biomes are used to identify the underground and to prevent nodes from the surface - -- (sand, dirt) from leaking into the underground. - minetest.register_biome({ - name = biome .. "_underground", - heat_point = minetest.registered_biomes[biome].heat_point, - humidity_point = minetest.registered_biomes[biome].humidity_point, - y_min = mcl_vars.mg_overworld_min, - y_max = DEEP_OCEAN_MIN - 1, - _mcl_biome_type = minetest.registered_biomes[biome]._mcl_biome_type, - _mcl_palette_index = minetest.registered_biomes[biome]._mcl_palette_index, - }) - - end -end - --- Register biomes of non-Overworld biomes -local function register_dimension_biomes() - --[[ REALMS ]] - - --[[ THE NETHER ]] - minetest.register_biome({ - name = "Nether", - node_filler = "mcl_nether:netherrack", - node_stone = "mcl_nether:netherrack", - node_water = "air", - node_river_water = "air", - node_cave_liquid = "air", - y_min = mcl_vars.mg_nether_min, - -- FIXME: For some reason the Nether stops generating early if this constant is not added. - -- Figure out why. - y_max = mcl_vars.mg_nether_max + 80, - heat_point = 100, - humidity_point = 0, - _mcl_biome_type = "hot", - _mcl_palette_index = 17, - }) - - --[[ THE END ]] - minetest.register_biome({ - name = "End", - node_stone = "air", - node_filler = "air", - node_water = "air", - node_river_water = "air", - node_cave_liquid = "air", - -- FIXME: For some reason the End stops generating early if this constant is not added. - -- Figure out why. - y_min = mcl_vars.mg_end_min, - y_max = mcl_vars.mg_end_max + 80, - heat_point = 50, - humidity_point = 50, - _mcl_biome_type = "medium", - _mcl_palette_index = 0, - }) - -end - --- Register ores which are limited by biomes. For all mapgens except flat and singlenode. -local function register_biome_ores() - local stonelike = {"mcl_core:stone", "mcl_core:diorite", "mcl_core:andesite", "mcl_core:granite"} - - -- Emeralds - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_emerald", - wherein = stonelike, - clust_scarcity = 16384, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_worlds.layer_to_y(4), - y_max = mcl_worlds.layer_to_y(32), - biomes = { - "ExtremeHills", "ExtremeHills_beach", "ExtremeHills_ocean", "ExtremeHills_deep_ocean", "ExtremeHills_underground", - "ExtremeHills+", "ExtremeHills+_ocean", "ExtremeHills+_deep_ocean", "ExtremeHills+_underground", - "ExtremeHillsM", "ExtremeHillsM_ocean", "ExtremeHillsM_deep_ocean", "ExtremeHillsM_underground", - }, - }) - - -- Rarely replace stone with stone monster eggs. - -- In v6 this can happen anywhere, in other mapgens only in Extreme Hills. - local monster_egg_scarcity - if mg_name == "v6" then - monster_egg_scarcity = 28 * 28 * 28 - else - monster_egg_scarcity = 26 * 26 * 26 - end - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_monster_eggs:monster_egg_stone", - wherein = "mcl_core:stone", - clust_scarcity = monster_egg_scarcity, - clust_num_ores = 3, - clust_size = 2, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_worlds.layer_to_y(61), - biomes = { - "ExtremeHills", "ExtremeHills_beach", "ExtremeHills_ocean", "ExtremeHills_deep_ocean", "ExtremeHills_underground", - "ExtremeHills+", "ExtremeHills+_ocean", "ExtremeHills+_deep_ocean", "ExtremeHills+_underground", - "ExtremeHillsM", "ExtremeHillsM_ocean", "ExtremeHillsM_deep_ocean", "ExtremeHillsM_underground", - }, - }) - - -- Bonus gold spawn in Mesa - if mg_name ~= "v6" then - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_gold", - wherein = stonelike, - clust_scarcity = 3333, - clust_num_ores = 5, - clust_size = 3, - y_min = mcl_worlds.layer_to_y(32), - y_max = mcl_worlds.layer_to_y(79), - biomes = { "Mesa", "Mesa_sandlevel", "Mesa_ocean", - "MesaBryce", "MesaBryce_sandlevel", "MesaBryce_ocean", - "MesaPlateauF", "MesaPlateauF_sandlevel", "MesaPlateauF_ocean", - "MesaPlateauFM", "MesaPlateauFM_sandlevel", "MesaPlateauFM_ocean", }, - }) - end -end - --- Register “fake” ores directly related to the biomes. These are mostly low-level landscape alternations -local function register_biomelike_ores() - - -- Random coarse dirt floor in Mega Taiga and Mesa Plateau F - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_core:coarse_dirt", - wherein = {"mcl_core:podzol", "mcl_core:dirt"}, - clust_scarcity = 1, - clust_num_ores = 12, - clust_size = 10, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, - noise_threshold = 0.2, - noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70}, - biomes = { "MegaTaiga" }, - }) - - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_core:coarse_dirt", - wherein = {"mcl_core:dirt_with_grass", "mcl_core:dirt"}, - column_height_max = 1, - column_midpoint_factor = 0.0, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, - noise_threshold = 0.0, - noise_params = {offset=0, scale=15, spread={x=250, y=250, z=250}, seed=24, octaves=3, persist=0.70}, - biomes = { "MesaPlateauF_grasstop" }, - }) - minetest.register_ore({ - ore_type = "blob", - ore = "mcl_core:coarse_dirt", - wherein = {"mcl_core:dirt_with_grass", "mcl_core:dirt"}, - clust_scarcity = 1500, - clust_num_ores = 25, - clust_size = 7, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, - noise_params = { - offset = 0, - scale = 1, - spread = {x=250, y=250, z=250}, - seed = 12345, - octaves = 3, - persist = 0.6, - lacunarity = 2, - flags = "defaults", - }, - biomes = { "MesaPlateauF_grasstop" }, - }) - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_core:coarse_dirt", - wherein = {"mcl_core:dirt_with_grass", "mcl_core:dirt"}, - column_height_max = 1, - column_midpoint_factor = 0.0, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, - noise_threshold = -2.5, - noise_params = {offset=1, scale=15, spread={x=250, y=250, z=250}, seed=24, octaves=3, persist=0.80}, - biomes = { "MesaPlateauFM_grasstop" }, - }) - minetest.register_ore({ - ore_type = "blob", - ore = "mcl_core:coarse_dirt", - wherein = {"mcl_core:dirt_with_grass", "mcl_core:dirt"}, - clust_scarcity = 1800, - clust_num_ores = 65, - clust_size = 15, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, - noise_params = { - offset = 0, - scale = 1, - spread = {x=250, y=250, z=250}, - seed = 12345, - octaves = 3, - persist = 0.6, - lacunarity = 2, - flags = "defaults", - }, - biomes = { "MesaPlateauFM_grasstop" }, - }) - -- Occasionally dig out portions of MesaPlateauFM - minetest.register_ore({ - ore_type = "blob", - ore = "air", - wherein = {"group:hardened_clay", "group:sand","mcl_core:coarse_dirt"}, - clust_scarcity = 4000, - clust_size = 5, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, - noise_params = { - offset = 0, - scale = 1, - spread = {x=250, y=250, z=250}, - seed = 12345, - octaves = 3, - persist = 0.6, - lacunarity = 2, - flags = "defaults", - }, - biomes = { "MesaPlateauFM", "MesaPlateauFM_grasstop" }, - }) - minetest.register_ore({ - ore_type = "blob", - ore = "mcl_core:redsandstone", - wherein = {"mcl_colorblocks:hardened_clay_orange"}, - clust_scarcity = 300, - clust_size = 8, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, - noise_params = { - offset = 0, - scale = 1, - spread = {x=250, y=250, z=250}, - seed = 12345, - octaves = 3, - persist = 0.6, - lacunarity = 2, - flags = "defaults", - }, - biomes = { "MesaPlateauFM_sandlevel" }, - }) - -- More red sand in MesaPlateauFM - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_core:redsand", - wherein = {"group:hardened_clay"}, - clust_scarcity = 1, - clust_num_ores = 12, - clust_size = 10, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, - noise_threshold = 0.1, - noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=95, octaves=3, persist=0.70}, - biomes = { "MesaPlateauFM" }, - }) - minetest.register_ore({ - ore_type = "blob", - ore = "mcl_core:redsand", - wherein = {"group:hardened_clay"}, - clust_scarcity = 1500, - clust_size = 4, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, - noise_params = { - offset = 0, - scale = 1, - spread = {x=250, y=250, z=250}, - seed = 12345, - octaves = 3, - persist = 0.6, - lacunarity = 2, - flags = "defaults", - }, - biomes = { "MesaPlateauFM", "MesaPlateauFM_grasstop", "MesaPlateauFM_sandlevel" }, - }) - - -- Small dirt patches in Extreme Hills M - minetest.register_ore({ - ore_type = "blob", - -- TODO: Should be grass block. But generating this as ore means gras blocks will spawn undeground. :-( - ore = "mcl_core:dirt", - wherein = {"mcl_core:gravel"}, - clust_scarcity = 5000, - clust_num_ores = 12, - clust_size = 4, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, - noise_threshold = 0.2, - noise_params = {offset=0, scale=5, spread={x=250, y=250, z=250}, seed=64, octaves=3, persist=0.60}, - biomes = { "ExtremeHillsM" }, - }) - -- For a transition from stone to hardened clay in mesa biomes that is not perfectly flat - minetest.register_ore({ - ore_type = "stratum", - ore = "mcl_core:stone", - wherein = {"group:hardened_clay"}, - noise_params = {offset=-6, scale=2, spread={x=25, y=25, z=25}, octaves=1, persist=0.60}, - stratum_thickness = 8, - biomes = { - "Mesa_sandlevel", "Mesa_ocean", - "MesaBryce_sandlevel", "MesaBryce_ocean", - "MesaPlateauF_sandlevel", "MesaPlateauF_ocean", - "MesaPlateauFM_sandlevel", "MesaPlateauFM_ocean", - }, - y_min = -4, - y_max = 0, - - }) - - -- Mesa strata (registered as sheet ores) - - -- Helper function to create strata. - local function stratum(y_min, height, color, seed, is_perfect) - if not height then - height = 1 - end - if not seed then - seed = 39 - end - local y_max = y_min + height-1 - local perfect_biomes - if is_perfect then - -- "perfect" means no erosion - perfect_biomes = { "MesaBryce", "Mesa", "MesaPlateauF", "MesaPlateauFM" } - else - perfect_biomes = { "MesaBryce" } - end - -- Full, perfect stratum - minetest.register_ore({ - ore_type = "stratum", - ore = "mcl_colorblocks:hardened_clay_"..color, - -- Only paint uncolored so the biome can choose - -- a color in advance. - wherein = {"mcl_colorblocks:hardened_clay"}, - y_min = y_min, - y_max = y_max, - biomes = perfect_biomes, - }) - if not is_perfect then - -- Slightly eroded stratum, only minor imperfections - minetest.register_ore({ - ore_type = "stratum", - ore = "mcl_colorblocks:hardened_clay_"..color, - wherein = {"mcl_colorblocks:hardened_clay"}, - y_min = y_min, - y_max = y_max, - biomes = { "Mesa", "MesaPlateauF" }, - noise_params = { - offset = y_min+(y_max-y_min)/2, - scale = 0, - spread = {x = 50, y = 50, z = 50}, - seed = seed+4, - octaves = 1, - persist = 1.0 - }, - np_stratum_thickness = { - offset = 1.28, - scale = 1, - spread = {x = 18, y = 18, z = 18}, - seed = seed+4, - octaves = 3, - persist = 0.8, - }, - }) - -- Very eroded stratum, most of the color is gone - minetest.register_ore({ - ore_type = "stratum", - ore = "mcl_colorblocks:hardened_clay_"..color, - wherein = {"mcl_colorblocks:hardened_clay"}, - y_min = y_min, - y_max = y_max, - biomes = { "MesaPlateauFM" }, - noise_params = { - offset = y_min+(y_max-y_min)/2, - scale = 0, - spread = {x = 50, y = 50, z = 50}, - seed = seed+4, - octaves = 1, - persist = 1.0 - }, - np_stratum_thickness = { - offset = 0.1, - scale = 1, - spread = {x = 28, y = 28, z = 28}, - seed = seed+4, - octaves = 2, - persist = 0.6, - }, - }) - end - - end - - -- Hardcoded orange strata near sea level. - - -- For MesaBryce, since it has no sand at these heights - stratum(4, 1, "orange", nil, true) - stratum(7, 2, "orange", nil, true) - - -- 3-level stratum above the sandlevel (all mesa biomes) - stratum(11, 3, "orange", nil, true) - - -- Create random strata for up to Y = 256. - -- These strata are calculated based on the world seed and are global. - -- They are thus different per-world. - local mesapr = PcgRandom(mg_seed) - - --[[ - - ------ DANGER ZONE! ------ - - The following code is sensitive to changes; changing any number may break - mapgen consistency when the mapgen generates new mapchunks in existing - worlds because the random generator will yield different results and the strata - suddenly don't match up anymore. ]] - - -- Available Mesa colors: - local mesa_stratum_colors = { "silver", "brown", "orange", "red", "yellow", "white" } - - -- Start level - local y = 17 - - -- Generate stratas - repeat - -- Each stratum has a color (duh!) - local colorid = mesapr:next(1, #mesa_stratum_colors) - - -- … and a random thickness - local heightrandom = mesapr:next(1, 12) - local h - if heightrandom == 12 then - h = 4 - elseif heightrandom >= 10 then - h = 3 - elseif heightrandom >= 8 then - h = 2 - else - h = 1 - end - -- Small built-in bias: Only thin strata up to this Y level - if y < 45 then - h = math.min(h, 2) - end - - -- Register stratum - stratum(y, h, mesa_stratum_colors[colorid]) - - -- Skip a random amount of layers (which won't get painted) - local skiprandom = mesapr:next(1, 12) - local skip - if skiprandom == 12 then - skip = 4 - elseif skiprandom >= 10 then - skip = 3 - elseif skiprandom >= 5 then - skip = 2 - elseif skiprandom >= 2 then - skip = 1 - else - -- If this happens, the next stratum will touch the previous one without gap - skip = 0 - end - - -- Get height of next stratum or finish - y = y + h + skip - until y > 256 - - --[[ END OF DANGER ZONE ]] -end - --- Non-Overworld ores -local function register_dimension_ores() - - --[[ NETHER GENERATION ]] - - -- Soul sand - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_nether:soul_sand", - -- Note: Stone is included only for v6 mapgen support. Netherrack is not generated naturally - -- in v6, but instead set with the on_generated function in mcl_mapgen_core. - wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, - clust_scarcity = 13 * 13 * 13, - clust_size = 5, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_worlds.layer_to_y(64, "nether"), - noise_threshold = 0.0, - noise_params = { - offset = 0.5, - scale = 0.1, - spread = {x = 5, y = 5, z = 5}, - seed = 2316, - octaves = 1, - persist = 0.0 - }, - }) - - -- Magma blocks - minetest.register_ore({ - ore_type = "blob", - ore = "mcl_nether:magma", - wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, - clust_scarcity = 8*8*8, - clust_num_ores = 45, - clust_size = 6, - y_min = mcl_worlds.layer_to_y(23, "nether"), - y_max = mcl_worlds.layer_to_y(37, "nether"), - noise_params = { - offset = 0, - scale = 1, - spread = {x=250, y=250, z=250}, - seed = 12345, - octaves = 3, - persist = 0.6, - lacunarity = 2, - flags = "defaults", - }, - }) - minetest.register_ore({ - ore_type = "blob", - ore = "mcl_nether:magma", - wherein = {"mcl_nether:netherrack"}, - clust_scarcity = 10*10*10, - clust_num_ores = 65, - clust_size = 8, - y_min = mcl_worlds.layer_to_y(23, "nether"), - y_max = mcl_worlds.layer_to_y(37, "nether"), - noise_params = { - offset = 0, - scale = 1, - spread = {x=250, y=250, z=250}, - seed = 12345, - octaves = 3, - persist = 0.6, - lacunarity = 2, - flags = "defaults", - }, - }) - - -- Glowstone - minetest.register_ore({ - ore_type = "blob", - ore = "mcl_nether:glowstone", - wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, - clust_scarcity = 26 * 26 * 26, - clust_size = 5, - y_min = mcl_vars.mg_lava_nether_max + 10, - y_max = mcl_vars.mg_nether_max, - noise_threshold = 0.0, - noise_params = { - offset = 0.5, - scale = 0.1, - spread = {x = 5, y = 5, z = 5}, - seed = 17676, - octaves = 1, - persist = 0.0 - }, - }) - - -- Gravel (Nether) - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_core:gravel", - wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, - column_height_min = 1, - column_height_max = 1, - column_midpoint_factor = 0, - y_min = mcl_worlds.layer_to_y(63, "nether"), - -- This should be 65, but for some reason with this setting, the sheet ore really stops at 65. o_O - y_max = mcl_worlds.layer_to_y(65+2, "nether"), - noise_threshold = 0.2, - noise_params = { - offset = 0.0, - scale = 0.5, - spread = {x = 20, y = 20, z = 20}, - seed = 766, - octaves = 3, - persist = 0.6, - }, - }) - - -- Nether quartz - if minetest.settings:get_bool("mcl_generate_ores", true) then - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_nether:quartz_ore", - wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, - clust_scarcity = 850, - clust_num_ores = 4, -- MC cluster amount: 4-10 - clust_size = 3, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_nether:quartz_ore", - wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, - clust_scarcity = 1650, - clust_num_ores = 8, -- MC cluster amount: 4-10 - clust_size = 4, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) - end - - -- Lava springs in the Nether - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_nether:nether_lava_source", - wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, - clust_scarcity = 500, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_lava_nether_max + 1, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_nether:nether_lava_source", - wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, - clust_scarcity = 1000, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_vars.mg_lava_nether_max + 2, - y_max = mcl_vars.mg_lava_nether_max + 12, - }) - - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_nether:nether_lava_source", - wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, - clust_scarcity = 2000, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_vars.mg_lava_nether_max + 13, - y_max = mcl_vars.mg_lava_nether_max + 48, - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_nether:nether_lava_source", - wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, - clust_scarcity = 3500, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_vars.mg_lava_nether_max + 49, - y_max = mcl_vars.mg_nether_max, - }) - - --[[ THE END ]] - - -- Generate fake End - -- TODO: Remove the "ores" when there's a better End generator - -- FIXME: Broken lighting in v6 mapgen - - local end_wherein - if mg_name == "v6" then - end_wherein = {"air", "mcl_core:stone"} - else - end_wherein = {"air"} - end - - minetest.register_ore({ - ore_type = "stratum", - ore = "mcl_end:end_stone", - wherein = end_wherein, - y_min = mcl_vars.mg_end_min+64, - y_max = mcl_vars.mg_end_min+80, - - noise_params = { - offset = mcl_vars.mg_end_min+70, - scale = -1, - spread = {x=126, y=126, z=126}, - seed = mg_seed+9999, - octaves = 3, - persist = 0.5, - }, - - np_stratum_thickness = { - offset = -2, - scale = 10, - spread = {x=126, y=126, z=126}, - seed = mg_seed+9999, - octaves = 3, - persist = 0.5, - }, - clust_scarcity = 1, - }) - - minetest.register_ore({ - ore_type = "stratum", - ore = "mcl_end:end_stone", - wherein = end_wherein, - y_min = mcl_vars.mg_end_min+64, - y_max = mcl_vars.mg_end_min+80, - - noise_params = { - offset = mcl_vars.mg_end_min+72, - scale = -3, - spread = {x=84, y=84, z=84}, - seed = mg_seed+999, - octaves = 4, - persist = 0.8, - }, - - np_stratum_thickness = { - offset = -4, - scale = 10, - spread = {x=84, y=84, z=84}, - seed = mg_seed+999, - octaves = 4, - persist = 0.8, - }, - clust_scarcity = 1, - }) - minetest.register_ore({ - ore_type = "stratum", - ore = "mcl_end:end_stone", - wherein = end_wherein, - y_min = mcl_vars.mg_end_min+64, - y_max = mcl_vars.mg_end_min+80, - - noise_params = { - offset = mcl_vars.mg_end_min+70, - scale = -2, - spread = {x=84, y=84, z=84}, - seed = mg_seed+99, - octaves = 4, - persist = 0.85, - }, - - np_stratum_thickness = { - offset = -3, - scale = 5, - spread = {x=63, y=63, z=63}, - seed = mg_seed+50, - octaves = 4, - persist = 0.85, - }, - clust_scarcity = 1, - }) - -end - - --- All mapgens except mgv6 - --- Template to register a grass or fern decoration -local function register_grass_decoration(grasstype, offset, scale, biomes) - local place_on, seed, node - if grasstype == "fern" then - node = "mcl_flowers:fern" - place_on = {"group:grass_block_no_snow", "mcl_core:podzol"} - seed = 333 - elseif grasstype == "tallgrass" then - node = "mcl_flowers:tallgrass" - place_on = {"group:grass_block_no_snow"} - seed = 420 - end - local noise = { - offset = offset, - scale = scale, - spread = {x = 200, y = 200, z = 200}, - seed = seed, - octaves = 3, - persist = 0.6 - } - for b=1, #biomes do - local param2 = minetest.registered_biomes[biomes[b]]._mcl_palette_index - minetest.register_decoration({ - deco_type = "simple", - place_on = place_on, - sidelen = 16, - noise_params = noise, - biomes = { biomes[b] }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - decoration = node, - param2 = param2, - }) - end -end - -local function register_seagrass_decoration(grasstype, offset, scale, biomes) - local seed, nodes, surfaces, param2, param2_max, y_max - if grasstype == "seagrass" then - seed = 16 - surfaces = { "mcl_core:dirt", "mcl_core:sand", "mcl_core:gravel", "mcl_core:redsand" } - nodes = { "mcl_ocean:seagrass_dirt", "mcl_ocean:seagrass_sand", "mcl_ocean:seagrass_gravel", "mcl_ocean:seagrass_redsand" } - y_max = 0 - elseif grasstype == "kelp" then - seed = 32 - param2 = 16 - param2_max = 96 - surfaces = { "mcl_core:dirt", "mcl_core:sand", "mcl_core:gravel" } - nodes = { "mcl_ocean:kelp_dirt", "mcl_ocean:kelp_sand", "mcl_ocean:kelp_gravel" } - y_max = -6 - end - local noise = { - offset = offset, - scale = scale, - spread = {x = 100, y = 100, z = 100}, - seed = seed, - octaves = 3, - persist = 0.6, - } - - for s=1, #surfaces do - minetest.register_decoration({ - deco_type = "simple", - place_on = { surfaces[s] }, - sidelen = 16, - noise_params = noise, - biomes = biomes, - y_min = DEEP_OCEAN_MIN, - y_max = y_max, - decoration = nodes[s], - param2 = param2, - param2_max = param2_max, - place_offset_y = -1, - flags = "force_placement", - }) - end -end - - - -local function register_decorations() - -- Large ice spike - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"mcl_core:snowblock", "mcl_core:snow", "group:grass_block_snow"}, - sidelen = 80, - noise_params = { - offset = 0.00040, - scale = 0.001, - spread = {x = 250, y = 250, z = 250}, - seed = 1133, - octaves = 4, - persist = 0.67, - }, - biomes = {"IcePlainsSpikes"}, - y_min = 4, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_structures.."/schematics/mcl_structures_ice_spike_large.mts", - rotation = "random", - flags = "place_center_x, place_center_z", - }) - - -- Small ice spike - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"mcl_core:snowblock", "mcl_core:snow", "group:grass_block_snow"}, - sidelen = 80, - noise_params = { - offset = 0.005, - scale = 0.001, - spread = {x = 250, y = 250, z = 250}, - seed = 1133, - octaves = 4, - persist = 0.67, - }, - biomes = {"IcePlainsSpikes"}, - y_min = 4, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_structures.."/schematics/mcl_structures_ice_spike_small.mts", - rotation = "random", - flags = "place_center_x, place_center_z", - }) - - -- Oak - -- Large oaks - for i=1, 4 do - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 80, - noise_params = { - offset = 0.000545, - scale = 0.0011, - spread = {x = 250, y = 250, z = 250}, - seed = 3 + 5 * i, - octaves = 3, - persist = 0.66 - }, - biomes = {"Forest"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_oak_large_"..i..".mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block", "mcl_core:dirt", }, - sidelen = 80, - noise_params = { - offset = -0.0007, - scale = 0.001, - spread = {x = 250, y = 250, z = 250}, - seed = 3, - octaves = 3, - persist = 0.6 - }, - biomes = {"ExtremeHills", "ExtremeHillsM", "ExtremeHills+", "ExtremeHills+_snowtop"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_oak_large_"..i..".mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - end - -- Small “classic” oak (many biomes) - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 16, - noise_params = { - offset = 0.025, - scale = 0.0022, - spread = {x = 250, y = 250, z = 250}, - seed = 2, - octaves = 3, - persist = 0.66 - }, - biomes = {"Forest"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_oak_classic.mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 16, - noise_params = { - offset = 0.01, - scale = 0.0022, - spread = {x = 250, y = 250, z = 250}, - seed = 2, - octaves = 3, - persist = 0.66 - }, - biomes = {"FlowerForest"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_oak_classic.mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block", "mcl_core:dirt", }, - sidelen = 16, - noise_params = { - offset = 0.0, - scale = 0.002, - spread = {x = 250, y = 250, z = 250}, - seed = 2, - octaves = 3, - persist = 0.7 - }, - biomes = {"ExtremeHills", "ExtremeHillsM", "ExtremeHills+", "ExtremeHills+_snowtop"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_oak_classic.mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block", "mcl_core:dirt"}, - sidelen = 16, - noise_params = { - offset = 0.006, - scale = 0.002, - spread = {x = 250, y = 250, z = 250}, - seed = 2, - octaves = 3, - persist = 0.7 - }, - biomes = {"ExtremeHills+", "ExtremeHills+_snowtop"}, - y_min = 50, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_oak_classic.mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt"}, - sidelen = 16, - noise_params = { - offset = 0.015, - scale = 0.002, - spread = {x = 250, y = 250, z = 250}, - seed = 2, - octaves = 3, - persist = 0.7 - }, - biomes = {"MesaPlateauF_grasstop"}, - y_min = 30, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_oak_classic.mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt"}, - sidelen = 16, - noise_params = { - offset = 0.008, - scale = 0.002, - spread = {x = 250, y = 250, z = 250}, - seed = 2, - octaves = 3, - persist = 0.7 - }, - biomes = {"MesaPlateauFM_grasstop"}, - y_min = 30, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_oak_classic.mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block", "mcl_core:dirt", }, - sidelen = 16, - noise_params = { - offset = 0.0, - scale = 0.0002, - spread = {x = 250, y = 250, z = 250}, - seed = 2, - octaves = 3, - persist = 0.7 - }, - biomes = {"IcePlains"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_oak_classic.mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 80, - fill_ratio = 0.004, - biomes = {"Jungle", "JungleM"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_oak_classic.mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 80, - fill_ratio = 0.0004, - biomes = {"JungleEdge", "JungleEdgeM", "Savanna"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_oak_classic.mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - - - -- Rare balloon oak - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 16, - noise_params = { - offset = 0.002083, - scale = 0.0022, - spread = {x = 250, y = 250, z = 250}, - seed = 3, - octaves = 3, - persist = 0.6, - }, - biomes = {"Forest"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_oak_balloon.mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - - -- Swamp oak - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 80, - noise_params = { - offset = 0.0055, - scale = 0.0011, - spread = {x = 250, y = 250, z = 250}, - seed = 5005, - octaves = 5, - persist = 0.6, - }, - biomes = {"Swampland", "Swampland_shore"}, - y_min = 0, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_oak_swamp.mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - - -- Jungle tree - - -- Huge jungle tree (2 variants) - for i=1, 2 do - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 80, - fill_ratio = 0.00125, - biomes = {"Jungle"}, - y_min = 4, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_jungle_tree_huge_"..i..".mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 80, - fill_ratio = 0.004, - biomes = {"JungleM"}, - y_min = 4, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_jungle_tree_huge_"..i..".mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - end - - -- Common jungle tree - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 80, - fill_ratio = 0.045, - biomes = {"Jungle"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_jungle_tree.mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 80, - fill_ratio = 0.0045, - biomes = {"JungleEdge", "JungleEdgeM"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_jungle_tree.mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 80, - fill_ratio = 0.09, - biomes = {"JungleM"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_jungle_tree.mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - - -- Spruce - local function quick_spruce(seed, offset, sprucename, biomes, y) - if not y then - y = 1 - end - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block", "mcl_core:dirt", "mcl_core:podzol"}, - sidelen = 16, - noise_params = { - offset = offset, - scale = 0.0006, - spread = {x = 250, y = 250, z = 250}, - seed = seed, - octaves = 3, - persist = 0.66 - }, - biomes = biomes, - y_min = y, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/"..sprucename, - flags = "place_center_x, place_center_z", - }) - end - - -- Huge spruce - quick_spruce(3000, 0.0030, "mcl_core_spruce_huge_1.mts", {"MegaSpruceTaiga"}) - quick_spruce(4000, 0.0036, "mcl_core_spruce_huge_2.mts", {"MegaSpruceTaiga"}) - quick_spruce(6000, 0.0036, "mcl_core_spruce_huge_3.mts", {"MegaSpruceTaiga"}) - quick_spruce(6600, 0.0036, "mcl_core_spruce_huge_4.mts", {"MegaSpruceTaiga"}) - - quick_spruce(3000, 0.0008, "mcl_core_spruce_huge_up_1.mts", {"MegaTaiga"}) - quick_spruce(4000, 0.0008, "mcl_core_spruce_huge_up_2.mts", {"MegaTaiga"}) - quick_spruce(6000, 0.0008, "mcl_core_spruce_huge_up_3.mts", {"MegaTaiga"}) - - - -- Common spruce - quick_spruce(11000, 0.00150, "mcl_core_spruce_5.mts", {"Taiga", "ColdTaiga"}) - - quick_spruce(2500, 0.00325, "mcl_core_spruce_1.mts", {"MegaSpruceTaiga", "MegaTaiga", "Taiga", "ColdTaiga"}) - quick_spruce(7000, 0.00425, "mcl_core_spruce_3.mts", {"MegaSpruceTaiga", "MegaTaiga", "Taiga", "ColdTaiga"}) - quick_spruce(9000, 0.00325, "mcl_core_spruce_4.mts", {"MegaTaiga", "Taiga", "ColdTaiga"}) - - quick_spruce(9500, 0.00500, "mcl_core_spruce_tall.mts", {"MegaTaiga"}) - - quick_spruce(5000, 0.00250, "mcl_core_spruce_2.mts", {"MegaSpruceTaiga", "MegaTaiga"}) - - quick_spruce(11000, 0.000025, "mcl_core_spruce_5.mts", {"ExtremeHills", "ExtremeHillsM"}) - quick_spruce(2500, 0.00005, "mcl_core_spruce_1.mts", {"ExtremeHills", "ExtremeHillsM"}) - quick_spruce(7000, 0.00005, "mcl_core_spruce_3.mts", {"ExtremeHills", "ExtremeHillsM"}) - quick_spruce(9000, 0.00005, "mcl_core_spruce_4.mts", {"ExtremeHills", "ExtremeHillsM"}) - - quick_spruce(11000, 0.001, "mcl_core_spruce_5.mts", {"ExtremeHills+", "ExtremeHills+_snowtop"}, 50) - quick_spruce(2500, 0.002, "mcl_core_spruce_1.mts", {"ExtremeHills+", "ExtremeHills+_snowtop"}, 50) - quick_spruce(7000, 0.003, "mcl_core_spruce_3.mts", {"ExtremeHills+", "ExtremeHills+_snowtop"}, 50) - quick_spruce(9000, 0.002, "mcl_core_spruce_4.mts", {"ExtremeHills+", "ExtremeHills+_snowtop"}, 50) - - - -- Small lollipop spruce - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block", "mcl_core:podzol"}, - sidelen = 16, - noise_params = { - offset = 0.004, - scale = 0.0022, - spread = {x = 250, y = 250, z = 250}, - seed = 2500, - octaves = 3, - persist = 0.66 - }, - biomes = {"Taiga", "ColdTaiga"}, - y_min = 2, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_spruce_lollipop.mts", - flags = "place_center_x, place_center_z", - }) - - -- Matchstick spruce: Very few leaves, tall trunk - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block", "mcl_core:podzol"}, - sidelen = 80, - noise_params = { - offset = -0.025, - scale = 0.025, - spread = {x = 250, y = 250, z = 250}, - seed = 2566, - octaves = 5, - persist = 0.60, - }, - biomes = {"Taiga", "ColdTaiga"}, - y_min = 3, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_spruce_matchstick.mts", - flags = "place_center_x, place_center_z", - }) - - -- Rare spruce in Ice Plains - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block"}, - sidelen = 16, - noise_params = { - offset = -0.00075, - scale = -0.0015, - spread = {x = 250, y = 250, z = 250}, - seed = 11, - octaves = 3, - persist = 0.7 - }, - biomes = {"IcePlains"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_spruce_5.mts", - flags = "place_center_x, place_center_z", - }) - - -- Acacia (many variants) - for a=1, 7 do - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt", "mcl_core:coarse_dirt"}, - sidelen = 16, - fill_ratio = 0.0002, - biomes = {"Savanna", "SavannaM"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_acacia_"..a..".mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - end - - -- Birch - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow"}, - sidelen = 16, - noise_params = { - offset = 0.03, - scale = 0.0025, - spread = {x = 250, y = 250, z = 250}, - seed = 11, - octaves = 3, - persist = 0.66 - }, - biomes = {"BirchForest"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_birch.mts", - flags = "place_center_x, place_center_z", - }) - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow"}, - sidelen = 16, - noise_params = { - offset = 0.03, - scale = 0.0025, - spread = {x = 250, y = 250, z = 250}, - seed = 11, - octaves = 3, - persist = 0.66 - }, - biomes = {"BirchForestM"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_birch_tall.mts", - flags = "place_center_x, place_center_z", - }) - - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 16, - noise_params = { - offset = 0.000333, - scale = -0.0015, - spread = {x = 250, y = 250, z = 250}, - seed = 11, - octaves = 3, - persist = 0.66 - }, - biomes = {"Forest", "FlowerForest"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_birch.mts", - flags = "place_center_x, place_center_z", - }) - - -- Dark Oak - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow"}, - sidelen = 16, - noise_params = { - offset = 0.05, - scale = 0.0015, - spread = {x = 125, y = 125, z = 125}, - seed = 223, - octaves = 3, - persist = 0.66 - }, - biomes = {"RoofedForest"}, - y_min = 4, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_core.."/schematics/mcl_core_dark_oak.mts", - flags = "place_center_x, place_center_z", - rotation = "random", - }) - - - local ratio_mushroom = 0.0001 - local ratio_mushroom_huge = ratio_mushroom * (11/12) - local ratio_mushroom_giant = ratio_mushroom * (1/12) - local ratio_mushroom_mycelium = 0.002 - local ratio_mushroom_mycelium_huge = ratio_mushroom_mycelium * (11/12) - local ratio_mushroom_mycelium_giant = ratio_mushroom_mycelium * (1/12) - - -- Huge Brown Mushroom - minetest.register_decoration({ - deco_type = "schematic", - place_on = { "group:grass_block_no_snow", "mcl_core:dirt" }, - sidelen = 80, - fill_ratio = ratio_mushroom_huge, - biomes = { "RoofedForest" }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_mushrooms.."/schematics/mcl_mushrooms_huge_brown.mts", - flags = "place_center_x, place_center_z", - rotation = "0", - }) - minetest.register_decoration({ - deco_type = "schematic", - place_on = { "group:grass_block_no_snow", "mcl_core:dirt" }, - sidelen = 80, - fill_ratio = ratio_mushroom_giant, - biomes = { "RoofedForest" }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_mushrooms.."/schematics/mcl_mushrooms_giant_brown.mts", - flags = "place_center_x, place_center_z", - rotation = "0", - }) - - minetest.register_decoration({ - deco_type = "schematic", - place_on = { "mcl_core:mycelium" }, - sidelen = 80, - fill_ratio = ratio_mushroom_mycelium_huge, - biomes = { "MushroomIsland", "MushroomIslandShore" }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_mushrooms.."/schematics/mcl_mushrooms_huge_brown.mts", - flags = "place_center_x, place_center_z", - rotation = "0", - }) - minetest.register_decoration({ - deco_type = "schematic", - place_on = { "mcl_core:mycelium" }, - sidelen = 80, - fill_ratio = ratio_mushroom_mycelium_giant, - biomes = { "MushroomIsland", "MushroomIslandShore" }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_mushrooms.."/schematics/mcl_mushrooms_giant_brown.mts", - flags = "place_center_x, place_center_z", - rotation = "0", - }) - - -- Huge Red Mushroom - minetest.register_decoration({ - deco_type = "schematic", - place_on = { "group:grass_block_no_snow", "mcl_core:dirt" }, - sidelen = 80, - fill_ratio = ratio_mushroom_huge, - biomes = { "RoofedForest" }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_mushrooms.."/schematics/mcl_mushrooms_huge_red.mts", - flags = "place_center_x, place_center_z", - rotation = "0", - }) - minetest.register_decoration({ - deco_type = "schematic", - place_on = { "group:grass_block_no_snow", "mcl_core:dirt" }, - sidelen = 80, - fill_ratio = ratio_mushroom_giant, - biomes = { "RoofedForest" }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_mushrooms.."/schematics/mcl_mushrooms_giant_red.mts", - flags = "place_center_x, place_center_z", - rotation = "0", - }) - - minetest.register_decoration({ - deco_type = "schematic", - place_on = { "mcl_core:mycelium" }, - sidelen = 80, - fill_ratio = ratio_mushroom_mycelium_huge, - biomes = { "MushroomIsland", "MushroomIslandShore" }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_mushrooms.."/schematics/mcl_mushrooms_huge_red.mts", - flags = "place_center_x, place_center_z", - rotation = "0", - }) - minetest.register_decoration({ - deco_type = "schematic", - place_on = { "mcl_core:mycelium" }, - sidelen = 80, - fill_ratio = ratio_mushroom_mycelium_giant, - biomes = { "MushroomIsland", "MushroomIslandShore" }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_mushrooms.."/schematics/mcl_mushrooms_giant_red.mts", - flags = "place_center_x, place_center_z", - rotation = "0", - }) - - -- Mossy cobblestone boulder (3×3) - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"mcl_core:podzol", "mcl_core:dirt", "mcl_core:coarse_dirt"}, - sidelen = 80, - noise_params = { - offset = 0.00015, - scale = 0.001, - spread = {x = 300, y = 300, z = 300}, - seed = 775703, - octaves = 4, - persist = 0.63, - }, - biomes = {"MegaTaiga", "MegaSpruceTaiga"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_structures.."/schematics/mcl_structures_boulder.mts", - flags = "place_center_x, place_center_z", - }) - - -- Small mossy cobblestone boulder (2×2) - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"mcl_core:podzol", "mcl_core:dirt", "mcl_core:coarse_dirt"}, - sidelen = 80, - noise_params = { - offset = 0.001, - scale = 0.001, - spread = {x = 300, y = 300, z = 300}, - seed = 775703, - octaves = 4, - persist = 0.63, - }, - biomes = {"MegaTaiga", "MegaSpruceTaiga"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = mod_mcl_structures.."/schematics/mcl_structures_boulder_small.mts", - flags = "place_center_x, place_center_z", - }) - - -- Cacti - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:sand"}, - sidelen = 16, - noise_params = { - offset = -0.012, - scale = 0.024, - spread = {x = 100, y = 100, z = 100}, - seed = 257, - octaves = 3, - persist = 0.6 - }, - y_min = 4, - y_max = mcl_vars.mg_overworld_max, - decoration = "mcl_core:cactus", - biomes = {"Desert", - "Mesa","Mesa_sandlevel", - "MesaPlateauF","MesaPlateauF_sandlevel", - "MesaPlateauFM","MesaPlateauFM_sandlevel"}, - height = 1, - height_max = 3, - }) - - -- Sugar canes - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:dirt", "mcl_core:coarse_dirt", "group:grass_block_no_snow", "group:sand", "mcl_core:podzol", "mcl_core:reeds"}, - sidelen = 16, - noise_params = { - offset = -0.3, - scale = 0.7, - spread = {x = 200, y = 200, z = 200}, - seed = 2, - octaves = 3, - persist = 0.7 - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - decoration = "mcl_core:reeds", - height = 1, - height_max = 3, - spawn_by = { "mcl_core:water_source", "group:frosted_ice" }, - num_spawn_by = 1, - }) - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:dirt", "mcl_core:coarse_dirt", "group:grass_block_no_snow", "group:sand", "mcl_core:podzol", "mcl_core:reeds"}, - sidelen = 16, - noise_params = { - offset = 0.0, - scale = 0.5, - spread = {x = 200, y = 200, z = 200}, - seed = 2, - octaves = 3, - persist = 0.7, - }, - biomes = {"Swampland", "Swampland_shore"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - decoration = "mcl_core:reeds", - height = 1, - height_max = 3, - spawn_by = { "mcl_core:water_source", "group:frosted_ice" }, - num_spawn_by = 1, - }) - - -- Doubletall grass - local function register_doubletall_grass(offset, scale, biomes) - - for b=1, #biomes do - local param2 = minetest.registered_biomes[biomes[b]]._mcl_palette_index - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = { x=1, y=3, z=1 }, - data = { - { name = "air", prob = 0 }, - { name = "mcl_flowers:double_grass", param1=255, param2=param2 }, - { name = "mcl_flowers:double_grass_top", param1=255, param2=param2 }, - }, - }, - place_on = {"group:grass_block_no_snow"}, - sidelen = 16, - noise_params = { - offset = offset, - scale = scale, - spread = {x = 200, y = 200, z = 200}, - seed = 420, - octaves = 3, - persist = 0.6, - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - biomes = { biomes[b] }, - }) - end - end - - register_doubletall_grass(-0.01, 0.03, {"Taiga", "Forest", "FlowerForest", "BirchForest", "BirchForestM", "RoofedForest"}) - register_doubletall_grass(-0.002, 0.03, {"Plains", "SunflowerPlains"}) - register_doubletall_grass(-0.0005, -0.03, {"Savanna", "SavannaM"}) - - -- Large ferns - local function register_double_fern(offset, scale, biomes) - for b=1, #biomes do - local param2 = minetest.registered_biomes[biomes[b]]._mcl_palette_index - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = { x=1, y=3, z=1 }, - data = { - { name = "air", prob = 0 }, - { name = "mcl_flowers:double_fern", param1=255, param2=param2 }, - { name = "mcl_flowers:double_fern_top", param1=255, param2=param2 }, - }, - }, - place_on = {"group:grass_block_no_snow", "mcl_core:podzol"}, - sidelen = 16, - noise_params = { - offset = offset, - scale = scale, - spread = {x = 250, y = 250, z = 250}, - seed = 333, - octaves = 2, - persist = 0.66, - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - biomes = biomes[b], - }) - end - end - - register_double_fern(0.01, 0.03, { "Jungle", "JungleM", "JungleEdge", "JungleEdgeM", "Taiga", "ColdTaiga", "MegaTaiga", "MegaSpruceTaiga" }) - register_double_fern(0.15, 0.1, { "JungleM" }) - - -- Large flowers - local function register_large_flower(name, biomes, seed, offset, flower_forest_offset) - local maxi - if flower_forest_offset then - maxi = 2 - else - maxi = 1 - end - for i=1, maxi do - local o, b -- offset, biomes - if i == 1 then - o = offset - b = biomes - else - o = flower_forest_offset - b = { "FlowerForest" } - end - - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = { x=1, y=3, z=1 }, - data = { - { name = "air", prob = 0 }, - { name = "mcl_flowers:"..name, param1=255, }, - { name = "mcl_flowers:"..name.."_top", param1=255, }, - }, - }, - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - - sidelen = 16, - noise_params = { - offset = o, - scale = 0.01, - spread = {x = 300, y = 300, z = 300}, - seed = seed, - octaves = 5, - persist = 0.62, - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - flags = "", - biomes = b, - }) - end - end - - register_large_flower("rose_bush", {"Forest"}, 9350, -0.008, 0.003) - register_large_flower("peony", {"Forest"}, 10450, -0.008, 0.003) - register_large_flower("lilac", {"Forest"}, 10600, -0.007, 0.003) - register_large_flower("sunflower", {"SunflowerPlains"}, 2940, 0.01) - - -- Jungle bush - - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 80, - noise_params = { - offset = 0.0196, - scale = 0.025, - spread = {x = 250, y = 250, z = 250}, - seed = 2930, - octaves = 4, - persist = 0.6, - }, - biomes = {"Jungle"}, - y_min = 3, - y_max = mcl_vars.mg_overworld_max, - schematic = jungle_bush_schematic, - flags = "place_center_x, place_center_z", - }) - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 80, - noise_params = { - offset = 0.05, - scale = 0.025, - spread = {x = 250, y = 250, z = 250}, - seed = 2930, - octaves = 4, - persist = 0.6, - }, - biomes = {"JungleM"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = jungle_bush_schematic, - flags = "place_center_x, place_center_z", - }) - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 80, - noise_params = { - offset = 0.0085, - scale = 0.025, - spread = {x = 250, y = 250, z = 250}, - seed = 2930, - octaves = 4, - persist = 0.6, - }, - biomes = {"JungleEdge", "JungleEdgeM"}, - y_min = 3, - y_max = mcl_vars.mg_overworld_max, - schematic = jungle_bush_schematic, - flags = "place_center_x, place_center_z", - }) - - -- Fallen logs - -- These fallen logs are not really good yet. They must be longer and also have one upright block. - -- Note the decortion API does not like wide schematics, they are likely to overhang. - if generate_fallen_logs then - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow", "mcl_core:podzol", "mcl_core:coarse_dirt"}, - sidelen = 80, - noise_params = { - offset = 0.00018, - scale = 0.00011, - spread = {x = 250, y = 250, z = 250}, - seed = 2, - octaves = 3, - persist = 0.66 - }, - biomes = {"MegaTaiga", "MegaSpruceTaiga", "Taiga"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = { - size = {x = 3, y = 3, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "mcl_core:sprucetree", param2 = 12, prob = 127}, - {name = "mcl_core:sprucetree", param2 = 12}, - {name = "mcl_core:sprucetree", param2 = 12}, - {name = "air", prob = 0}, - {name = "mcl_mushrooms:mushroom_brown", prob = 160}, - {name = "mcl_mushrooms:mushroom_red", prob = 160}, - }, - }, - flags = "place_center_x", - rotation = "random", - }) - - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block", "mcl_core:podzol", "mcl_core:podzol_snow", "mcl_core:coarse_dirt"}, - sidelen = 80, - noise_params = { - offset = 0.00018, - scale = 0.00011, - spread = {x = 250, y = 250, z = 250}, - seed = 2, - octaves = 3, - persist = 0.66 - }, - biomes = {"ColdTaiga"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = { - size = {x = 3, y = 3, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "mcl_core:sprucetree", param2 = 12, prob = 127}, - {name = "mcl_core:sprucetree", param2 = 12}, - {name = "mcl_core:sprucetree", param2 = 12}, - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "air", prob = 0}, - }, - }, - flags = "place_center_x", - rotation = "random", - }) - - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow"}, - sidelen = 16, - noise_params = { - offset = 0.0, - scale = -0.00008, - spread = {x = 250, y = 250, z = 250}, - seed = 2, - octaves = 3, - persist = 0.66 - }, - biomes = {"BirchForest", "BirchForestM",}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = { - size = {x = 3, y = 3, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "mcl_core:birchtree", param2 = 12}, - {name = "mcl_core:birchtree", param2 = 12}, - {name = "mcl_core:birchtree", param2 = 12, prob = 127}, - {name = "mcl_mushrooms:mushroom_red", prob = 100}, - {name = "mcl_mushrooms:mushroom_brown", prob = 10}, - {name = "air", prob = 0}, - }, - }, - flags = "place_center_x", - rotation = "random", - }) - - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 80, - fill_ratio = 0.005, - biomes = {"Jungle", "JungleM"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = { - size = {x = 3, y = 3, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "mcl_core:jungletree", param2 = 12}, - {name = "mcl_core:jungletree", param2 = 12}, - {name = "mcl_core:jungletree", param2 = 12, prob = 127}, - {name = "air", prob = 0}, - {name = "mcl_mushrooms:mushroom_brown", prob = 50}, - {name = "air", prob = 0}, - }, - }, - flags = "place_center_x", - rotation = "random", - }) - - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block_no_snow"}, - sidelen = 16, - noise_params = { - offset = 0.00018, - scale = 0.00011, - spread = {x = 250, y = 250, z = 250}, - seed = 2, - octaves = 3, - persist = 0.66 - }, - biomes = {"Forest"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = { - size = {x = 3, y = 3, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "air", prob = 0}, - {name = "mcl_core:tree", param2 = 12, prob = 127}, - {name = "mcl_core:tree", param2 = 12}, - {name = "mcl_core:tree", param2 = 12}, - {name = "air", prob = 0}, - {name = "mcl_mushrooms:mushroom_brown", prob = 96}, - {name = "mcl_mushrooms:mushroom_red", prob = 96}, - }, - }, - flags = "place_center_x", - rotation = "random", - }) - end - - -- Lily pad - - local lily_schem = { - { name = "mcl_core:water_source" }, - { name = "mcl_flowers:waterlily" }, - } - - -- Spawn them in shallow water at ocean level in Swampland. - -- Tweak lilydepth to change the maximum water depth - local lilydepth = 2 - - for d=1, lilydepth do - local height = d + 2 - local y = 1 - d - table.insert(lily_schem, 1, { name = "air", prob = 0 }) - - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = { x=1, y=height, z=1 }, - data = lily_schem, - }, - place_on = "mcl_core:dirt", - sidelen = 16, - noise_params = { - offset = 0, - scale = 0.3, - spread = {x = 100, y = 100, z = 100}, - seed = 503, - octaves = 6, - persist = 0.7, - }, - y_min = y, - y_max = y, - biomes = { "Swampland_shore" }, - rotation = "random", - }) - end - - -- Melon - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow"}, - sidelen = 16, - noise_params = { - offset = -0.01, - scale = 0.006, - spread = {x = 250, y = 250, z = 250}, - seed = 333, - octaves = 3, - persist = 0.6 - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - decoration = "mcl_farming:melon", - biomes = { "Jungle" }, - }) - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow"}, - sidelen = 16, - noise_params = { - offset = 0.0, - scale = 0.006, - spread = {x = 250, y = 250, z = 250}, - seed = 333, - octaves = 3, - persist = 0.6 - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - decoration = "mcl_farming:melon", - biomes = { "JungleM" }, - }) - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow"}, - sidelen = 16, - noise_params = { - offset = -0.005, - scale = 0.006, - spread = {x = 250, y = 250, z = 250}, - seed = 333, - octaves = 3, - persist = 0.6 - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - decoration = "mcl_farming:melon", - biomes = { "JungleEdge", "JungleEdgeM" }, - }) - - -- Lots of melons in Jungle Edge M - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow"}, - sidelen = 80, - noise_params = { - offset = 0.013, - scale = 0.006, - spread = {x = 125, y = 125, z = 125}, - seed = 333, - octaves = 3, - persist = 0.6 - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - decoration = "mcl_farming:melon", - biomes = { "JungleEdgeM" }, - }) - - -- Pumpkin - minetest.register_decoration({ - deco_type = "simple", - decoration = "mcl_farming:pumpkin", - param2 = 0, - param2_max = 3, - place_on = {"group:grass_block_no_snow"}, - sidelen = 16, - noise_params = { - offset = -0.016, - scale = 0.01332, - spread = {x = 125, y = 125, z = 125}, - seed = 666, - octaves = 6, - persist = 0.666 - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - }) - - -- Grasses and ferns - local grass_forest = {"Plains", "Taiga", "Forest", "FlowerForest", "BirchForest", "BirchForestM", "RoofedForest", "Swampland", } - local grass_mpf = {"MesaPlateauF_grasstop"} - local grass_plains = {"Plains", "SunflowerPlains", "JungleEdge", "JungleEdgeM" } - local grass_savanna = {"Savanna", "SavannaM"} - local grass_sparse = {"ExtremeHills", "ExtremeHills+", "ExtremeHills+_snowtop", "ExtremeHillsM", "Jungle" } - local grass_mpfm = {"MesaPlateauFM_grasstop" } - - register_grass_decoration("tallgrass", -0.03, 0.09, grass_forest) - register_grass_decoration("tallgrass", -0.015, 0.075, grass_forest) - register_grass_decoration("tallgrass", 0, 0.06, grass_forest) - register_grass_decoration("tallgrass", 0.015, 0.045, grass_forest) - register_grass_decoration("tallgrass", 0.03, 0.03, grass_forest) - register_grass_decoration("tallgrass", -0.03, 0.09, grass_mpf) - register_grass_decoration("tallgrass", -0.015, 0.075, grass_mpf) - register_grass_decoration("tallgrass", 0, 0.06, grass_mpf) - register_grass_decoration("tallgrass", 0.01, 0.045, grass_mpf) - register_grass_decoration("tallgrass", 0.01, 0.05, grass_forest) - register_grass_decoration("tallgrass", 0.03, 0.03, grass_plains) - register_grass_decoration("tallgrass", 0.05, 0.01, grass_plains) - register_grass_decoration("tallgrass", 0.07, -0.01, grass_plains) - register_grass_decoration("tallgrass", 0.09, -0.03, grass_plains) - register_grass_decoration("tallgrass", 0.18, -0.03, grass_savanna) - register_grass_decoration("tallgrass", 0.05, -0.03, grass_sparse) - register_grass_decoration("tallgrass", 0.05, 0.05, grass_mpfm) - - local fern_minimal = { "Jungle", "JungleM", "JungleEdge", "JungleEdgeM", "Taiga", "MegaTaiga", "MegaSpruceTaiga", "ColdTaiga" } - local fern_low = { "Jungle", "JungleM", "JungleEdge", "JungleEdgeM", "Taiga", "MegaTaiga", "MegaSpruceTaiga" } - local fern_Jungle = { "Jungle", "JungleM", "JungleEdge", "JungleEdgeM" } - --local fern_JungleM = { "JungleM" }, - - register_grass_decoration("fern", -0.03, 0.09, fern_minimal) - register_grass_decoration("fern", -0.015, 0.075, fern_minimal) - register_grass_decoration("fern", 0, 0.06, fern_minimal) - register_grass_decoration("fern", 0.015, 0.045, fern_low) - register_grass_decoration("fern", 0.03, 0.03, fern_low) - register_grass_decoration("fern", 0.01, 0.05, fern_Jungle) - register_grass_decoration("fern", 0.03, 0.03, fern_Jungle) - register_grass_decoration("fern", 0.05, 0.01, fern_Jungle) - register_grass_decoration("fern", 0.07, -0.01, fern_Jungle) - register_grass_decoration("fern", 0.09, -0.03, fern_Jungle) - register_grass_decoration("fern", 0.12, -0.03, {"JungleM"}) - - local b_seagrass = {"ColdTaiga_ocean","ExtremeHills_ocean","ExtremeHillsM_ocean","ExtremeHills+_ocean","Taiga_ocean","MegaTaiga_ocean","MegaSpruceTaiga_ocean","StoneBeach_ocean","Plains_ocean","SunflowerPlains_ocean","Forest_ocean","FlowerForest_ocean","BirchForest_ocean","BirchForestM_ocean","RoofedForest_ocean","Swampland_ocean","Jungle_ocean","JungleM_ocean","JungleEdge_ocean","JungleEdgeM_ocean","MushroomIsland_ocean","Desert_ocean","Savanna_ocean","SavannaM_ocean","Mesa_ocean","MesaBryce_ocean","MesaPlateauF_ocean","MesaPlateauFM_ocean", -"ColdTaiga_deep_ocean","ExtremeHills_deep_ocean","ExtremeHillsM_deep_ocean","ExtremeHills+_deep_ocean","Taiga_deep_ocean","MegaTaiga_deep_ocean","MegaSpruceTaiga_deep_ocean","StoneBeach_deep_ocean","Plains_deep_ocean","SunflowerPlains_deep_ocean","Forest_deep_ocean","FlowerForest_deep_ocean","BirchForest_deep_ocean","BirchForestM_deep_ocean","RoofedForest_deep_ocean","Swampland_deep_ocean","Jungle_deep_ocean","JungleM_deep_ocean","JungleEdge_deep_ocean","JungleEdgeM_deep_ocean","MushroomIsland_deep_ocean","Desert_deep_ocean","Savanna_deep_ocean","SavannaM_deep_ocean","Mesa_deep_ocean","MesaBryce_deep_ocean","MesaPlateauF_deep_ocean","MesaPlateauFM_deep_ocean", -"Mesa_sandlevel","MesaBryce_sandlevel","MesaPlateauF_sandlevel","MesaPlateauFM_sandlevel","Swampland_shore","Jungle_shore","JungleM_shore","Savanna_beach","FlowerForest_beach","ColdTaiga_beach_water","ExtremeHills_beach"} - local b_kelp = {"ExtremeHillsM_ocean","ExtremeHills+_ocean","MegaTaiga_ocean","MegaSpruceTaiga_ocean","Plains_ocean","SunflowerPlains_ocean","Forest_ocean","FlowerForest_ocean","BirchForest_ocean","BirchForestM_ocean","RoofedForest_ocean","Swampland_ocean","Jungle_ocean","JungleM_ocean","JungleEdge_ocean","JungleEdgeM_ocean","MushroomIsland_ocean", -"ExtremeHillsM_deep_ocean","ExtremeHills+_deep_ocean","MegaTaiga_deep_ocean","MegaSpruceTaiga_deep_ocean","Plains_deep_ocean","SunflowerPlains_deep_ocean","Forest_deep_ocean","FlowerForest_deep_ocean","BirchForest_deep_ocean","BirchForestM_deep_ocean","RoofedForest_deep_ocean","Swampland_deep_ocean","Jungle_deep_ocean","JungleM_deep_ocean","JungleEdge_deep_ocean","JungleEdgeM_deep_ocean","MushroomIsland_deep_ocean" -} - - register_seagrass_decoration("seagrass", 0, 0.5, b_seagrass) - register_seagrass_decoration("kelp", -0.5, 1, b_kelp) - - local b_sponge = {"Plains_deep_ocean","SunflowerPlains_deep_ocean","Forest_deep_ocean","FlowerForest_deep_ocean","BirchForest_deep_ocean","BirchForestM_deep_ocean","RoofedForest_deep_ocean","Jungle_deep_ocean","JungleM_deep_ocean","JungleEdge_deep_ocean","JungleEdgeM_deep_ocean","MushroomIsland_deep_ocean","Desert_deep_ocean","Savanna_deep_ocean","SavannaM_deep_ocean","Mesa_deep_ocean","MesaBryce_deep_ocean","MesaPlateauF_deep_ocean","MesaPlateauFM_deep_ocean"} - -- Wet Sponge - -- TODO: Remove this when we got ocean monuments - minetest.register_decoration({ - deco_type = "simple", - decoration = "mcl_sponges:sponge_wet", - biomes = b_sponge, - spawn_by = {"group:water"}, - num_spawn_by = 1, - place_on = {"mcl_core:dirt","mcl_core:sand","mcl_core:gravel"}, - sidelen = 16, - noise_params = { - offset = 0.00495, - scale = 0.006, - spread = {x = 250, y = 250, z = 250}, - seed = 999, - octaves = 3, - persist = 0.666 - }, - flags = "force_placement", - y_min = mcl_vars.mg_lava_overworld_max + 5, - y_max = -20, - }) - - -- Place tall grass on snow in Ice Plains and Extreme Hills+ - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block"}, - sidelen = 16, - noise_params = { - offset = -0.08, - scale = 0.09, - spread = {x = 15, y = 15, z = 15}, - seed = 420, - octaves = 3, - persist = 0.6, - }, - biomes = {"IcePlains"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = { - size = { x=1, y=2, z=1 }, - data = { - { name = "mcl_core:dirt_with_grass", force_place=true, }, - { name = "mcl_flowers:tallgrass", param2 = minetest.registered_biomes["IcePlains"]._mcl_palette_index }, - }, - }, - }) - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"group:grass_block"}, - sidelen = 16, - noise_params = { - offset = 0.0, - scale = 0.09, - spread = {x = 15, y = 15, z = 15}, - seed = 420, - octaves = 3, - persist = 0.6, - }, - biomes = {"ExtremeHills+_snowtop"}, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - schematic = { - size = { x=1, y=2, z=1 }, - data = { - { name = "mcl_core:dirt_with_grass", force_place=true, }, - { name = "mcl_flowers:tallgrass", param2 = minetest.registered_biomes["ExtremeHills+_snowtop"]._mcl_palette_index }, - }, - }, - }) - - - -- Dead bushes - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:sand", "mcl_core:podzol", "mcl_core:dirt", "mcl_core:dirt_with_grass", "mcl_core:coarse_dirt", "group:hardened_clay"}, - sidelen = 16, - noise_params = { - offset = 0.0, - scale = 0.035, - spread = {x = 100, y = 100, z = 100}, - seed = 1972, - octaves = 3, - persist = 0.6 - }, - y_min = 4, - y_max = mcl_vars.mg_overworld_max, - biomes = {"Desert", "Mesa", "Mesa_sandlevel", "MesaPlateauF", "MesaPlateauF_sandlevel", "MesaPlateauF_grasstop","MesaBryce","Taiga", "MegaTaiga"}, - decoration = "mcl_core:deadbush", - height = 1, - }) - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:sand", "mcl_core:dirt", "mcl_core:dirt_with_grass", "mcl_core:coarse_dirt"}, - sidelen = 16, - noise_params = { - offset = 0.1, - scale = 0.035, - spread = {x = 100, y = 100, z = 100}, - seed = 1972, - octaves = 3, - persist = 0.6 - }, - y_min = 4, - y_max = mcl_vars.mg_overworld_max, - biomes = {"MesaPlateauFM_grasstop"}, - decoration = "mcl_core:deadbush", - height = 1, - }) - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:sand"}, - sidelen = 16, - noise_params = { - offset = 0.045, - scale = 0.055, - spread = {x = 100, y = 100, z = 100}, - seed = 1972, - octaves = 3, - persist = 0.6 - }, - y_min = 4, - y_max = mcl_vars.mg_overworld_max, - biomes = {"MesaPlateauFM","MesaPlateauFM_sandlevel"}, - decoration = "mcl_core:deadbush", - height = 1, - }) - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:hardened_clay"}, - sidelen = 16, - noise_params = { - offset = 0.010, - scale = 0.035, - spread = {x = 100, y = 100, z = 100}, - seed = 1972, - octaves = 3, - persist = 0.6 - }, - y_min = 4, - y_max = mcl_vars.mg_overworld_max, - biomes = {"MesaPlateauFM", "MesaPlateauFM_sandlevel", "MesaPlateauFM_grasstop"}, - decoration = "mcl_core:deadbush", - height = 1, - }) - - -- Mushrooms in mushroom biome - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:mycelium"}, - sidelen = 80, - fill_ratio = 0.009, - biomes = {"MushroomIsland", "MushroomIslandShore"}, - noise_threshold = 2.0, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, - decoration = "mcl_mushrooms:mushroom_red", - }) - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:mycelium"}, - sidelen = 80, - fill_ratio = 0.009, - biomes = {"MushroomIsland", "MushroomIslandShore"}, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, - decoration = "mcl_mushrooms:mushroom_brown", - }) - - -- Mushrooms in Taiga - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:podzol"}, - sidelen = 80, - fill_ratio = 0.003, - biomes = {"Taiga", "MegaTaiga", "MegaSpruceTaiga"}, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, - decoration = "mcl_mushrooms:mushroom_red", - }) - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:podzol"}, - sidelen = 80, - fill_ratio = 0.003, - biomes = {"Taiga", "MegaTaiga", "MegaSpruceTaiga"}, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, - decoration = "mcl_mushrooms:mushroom_brown", - }) - - - -- Mushrooms next to trees - local mushrooms = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown"} - local mseeds = { 7133, 8244 } - for m=1, #mushrooms do - -- Mushrooms next to trees - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt", "mcl_core:podzol", "mcl_core:mycelium", "mcl_core:stone", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite"}, - sidelen = 16, - noise_params = { - offset = 0, - scale = 0.003, - spread = {x = 250, y = 250, z = 250}, - seed = mseeds[m], - octaves = 3, - persist = 0.66, - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - decoration = mushrooms[m], - spawn_by = { "mcl_core:tree", "mcl_core:sprucetree", "mcl_core:darktree", "mcl_core:birchtree" }, - num_spawn_by = 1, - }) - - -- More mushrooms in Swampland - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt", "mcl_core:podzol", "mcl_core:mycelium", "mcl_core:stone", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite"}, - sidelen = 16, - noise_params = { - offset = 0.05, - scale = 0.003, - spread = {x = 250, y = 250, z = 250}, - seed = mseeds[m], - octaves = 3, - persist = 0.6, - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - decoration = mushrooms[m], - biomes = { "Swampland"}, - spawn_by = { "mcl_core:tree", "mcl_core:sprucetree", "mcl_core:darktree", "mcl_core:birchtree" }, - num_spawn_by = 1, - }) - end - local function register_flower(name, biomes, seed, is_in_flower_forest) - if is_in_flower_forest == nil then - is_in_flower_forest = true - end - if biomes then - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 16, - noise_params = { - offset = 0.0008, - scale = 0.006, - spread = {x = 100, y = 100, z = 100}, - seed = seed, - octaves = 3, - persist = 0.6 - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - biomes = biomes, - decoration = "mcl_flowers:"..name, - }) - end - if is_in_flower_forest then - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 80, - noise_params= { - offset = 0.0008*40, - scale = 0.003, - spread = {x = 100, y = 100, z = 100}, - seed = seed, - octaves = 3, - persist = 0.6, - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - biomes = {"FlowerForest"}, - decoration = "mcl_flowers:"..name, - }) - end - end - - local flower_biomes1 = {"Plains", "SunflowerPlains", "RoofedForest", "Forest", "BirchForest", "BirchForestM", "Taiga", "ColdTaiga", "Jungle", "JungleM", "JungleEdge", "JungleEdgeM", "Savanna", "SavannaM", "ExtremeHills", "ExtremeHillsM", "ExtremeHills+", "ExtremeHills+_snowtop" } - - register_flower("dandelion", flower_biomes1, 8) - register_flower("poppy", flower_biomes1, 9439) - - local flower_biomes2 = {"Plains", "SunflowerPlains"} - register_flower("tulip_red", flower_biomes2, 436) - register_flower("tulip_orange", flower_biomes2, 536) - register_flower("tulip_pink", flower_biomes2, 636) - register_flower("tulip_white", flower_biomes2, 736) - register_flower("azure_bluet", flower_biomes2, 800) - register_flower("oxeye_daisy", flower_biomes2, 3490) - - register_flower("allium", nil, 0) -- flower Forest only - register_flower("blue_orchid", {"Swampland"}, 64500, false) - -end - --- Decorations in non-Overworld dimensions -local function register_dimension_decorations() - --[[ NETHER ]] - -- TODO: Nether - - --[[ THE END ]] - - -- Chorus plant - minetest.register_decoration({ - name = "mcl_biomes:chorus_plant", - deco_type = "simple", - place_on = {"mcl_end:end_stone", "air"}, - flags = "all_floors", - sidelen = 16, - noise_params = { - offset = -0.012, - scale = 0.024, - spread = {x = 100, y = 100, z = 100}, - seed = 257, - octaves = 3, - persist = 0.6 - }, - y_min = mcl_vars.mg_end_min, - y_max = mcl_vars.mg_end_max, - decoration = "mcl_end:chorus_flower", - height = 1, - biomes = { "End" }, - }) - - deco_id_chorus_plant = minetest.get_decoration_id("mcl_biomes:chorus_plant") - minetest.set_gen_notify({decoration=true}, { deco_id_chorus_plant }) - - -- TODO: End cities - -end - - --- --- Detect mapgen to select functions --- -if mg_name ~= "singlenode" then - if not superflat then - if mg_name ~= "v6" then - register_biomes() - register_biomelike_ores() - end - register_biome_ores() - if mg_name ~= "v6" then - register_decorations() - end - else - -- Implementation of Minecraft's Superflat mapgen, classic style: - -- * Perfectly flat land, 1 grass biome, no decorations, no caves - -- * 4 layers, from top to bottom: grass block, dirt, dirt, bedrock - minetest.clear_registered_biomes() - minetest.clear_registered_decorations() - minetest.clear_registered_schematics() - register_classic_superflat_biome() - end - - -- Non-overworld stuff is registered independently - register_dimension_biomes() - register_dimension_ores() - register_dimension_decorations() - - -- Overworld decorations for v6 are handled in mcl_mapgen_core - - if deco_id_chorus_plant then - mcl_mapgen_core.register_generator("chorus_grow", nil, function(minp, maxp, blockseed) - local gennotify = minetest.get_mapgen_object("gennotify") - --local poslist = {} - local pr = PseudoRandom(blockseed + 14) - for _, pos in ipairs(gennotify["decoration#"..deco_id_chorus_plant] or {}) do - local x, y, z = pos.x, pos.y, pos.z - if x < -2 or x > 2 or z < -2 or z > 2 then - local realpos = { x = x, y = y + 1, z = z } - local node = minetest.get_node(realpos) - if node and node.name == "mcl_end:chorus_flower" then - mcl_end.grow_chorus_plant(realpos, node, pr) - end - end - end - end) - end - -end - +-- Implementation of Minecraft's Superflat mapgen, classic style: +-- * Perfectly flat land, 1 grass biome, no decorations, no caves +-- * 4 layers, from top to bottom: grass block, dirt, dirt, bedrock +minetest.clear_registered_biomes() +minetest.clear_registered_decorations() +minetest.clear_registered_schematics() +register_classic_superflat_biome() diff --git a/mods/MAPGEN/mcl_biomes/mod.conf b/mods/MAPGEN/mcl_biomes/mod.conf index 0c6095f3d7..8d83771405 100644 --- a/mods/MAPGEN/mcl_biomes/mod.conf +++ b/mods/MAPGEN/mcl_biomes/mod.conf @@ -1,4 +1,4 @@ name = mcl_biomes author = maikerumine description = Adds the various biomes and biome-related things for non-v6 map generators. -depends = mcl_init, mcl_mapgen_core, mcl_core, mcl_worlds, mcl_farming, mcl_flowers, mcl_end, mcl_ocean +depends = mcl_init, mcl_mapgen_core, mcl_core, mcl_worlds, mcl_end diff --git a/mods/MAPGEN/mcl_dungeons/init.lua b/mods/MAPGEN/mcl_dungeons/init.lua deleted file mode 100644 index 0997f51fdf..0000000000 --- a/mods/MAPGEN/mcl_dungeons/init.lua +++ /dev/null @@ -1,426 +0,0 @@ --- FIXME: Chests may appear at openings - -mcl_dungeons = {} - -local mg_name = minetest.get_mapgen_setting("mg_name") - --- Are dungeons disabled? -if mcl_vars.mg_dungeons == false or mg_name == "singlenode" then - return -end - ---lua locals ---minetest -local registered_nodes = minetest.registered_nodes -local swap_node = minetest.swap_node -local set_node = minetest.set_node -local dir_to_facedir = minetest.dir_to_facedir -local get_meta = minetest.get_meta -local emerge_area = minetest.emerge_area - ---vector -local vector_add = vector.add -local vector_subtract = vector.subtract - ---table -local table_insert = table.insert -local table_sort = table.sort - ---math -local math_min = math.min -local math_max = math.max -local math_ceil = math.ceil - ---custom mcl_vars -local get_node = mcl_vars.get_node - - -local min_y = math_max(mcl_vars.mg_overworld_min, mcl_vars.mg_bedrock_overworld_max) + 1 -local max_y = mcl_vars.mg_overworld_max - 1 --- Calculate the number of dungeon spawn attempts --- In Minecraft, there 8 dungeon spawn attempts Minecraft chunk (16*256*16 = 65536 blocks). --- Minetest chunks don't have this size, so scale the number accordingly. -local attempts = math_ceil(((mcl_vars.chunksize * mcl_vars.MAP_BLOCKSIZE) ^ 3) / 8192) -- 63 = 80*80*80/8192 - -local dungeonsizes = { - { x=5, y=4, z=5}, - { x=5, y=4, z=7}, - { x=7, y=4, z=5}, - { x=7, y=4, z=7}, -} - ---[[local dirs = { - { x= 1, y=0, z= 0 }, - { x= 0, y=0, z= 1 }, - { x=-1, y=0, z= 0 }, - { x= 0, y=0, z=-1 }, -}]] - -local surround_vectors = { - { 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 loottable = -{ - { - stacks_min = 1, - stacks_max = 3, - items = { - { itemstring = "mcl_mobs:nametag", weight = 20 }, - { itemstring = "mcl_mobitems:saddle", weight = 20 }, - { itemstring = "mcl_jukebox:record_1", weight = 15 }, - { itemstring = "mcl_jukebox:record_4", weight = 15 }, - { itemstring = "mcl_mobitems:iron_horse_armor", weight = 15 }, - { itemstring = "mcl_core:apple_gold", weight = 15 }, - { itemstring = "mcl_books:book", weight = 10, func = function(stack, pr) - mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) - end }, - { itemstring = "mcl_mobitems:gold_horse_armor", weight = 10 }, - { itemstring = "mcl_mobitems:diamond_horse_armor", weight = 5 }, - { itemstring = "mcl_core:apple_gold_enchanted", weight = 2 }, - } - }, - { - stacks_min = 1, - stacks_max = 4, - items = { - { itemstring = "mcl_farming:wheat_item", weight = 20, amount_min = 1, amount_max = 4 }, - { itemstring = "mcl_farming:bread", weight = 20 }, - { itemstring = "mcl_core:coal_lump", weight = 15, amount_min = 1, amount_max = 4 }, - { itemstring = "mesecons:redstone", weight = 15, amount_min = 1, amount_max = 4 }, - { itemstring = "mcl_farming:beetroot_seeds", weight = 10, amount_min = 2, amount_max = 4 }, - { itemstring = "mcl_farming:melon_seeds", weight = 10, amount_min = 2, amount_max = 4 }, - { itemstring = "mcl_farming:pumpkin_seeds", weight = 10, amount_min = 2, amount_max = 4 }, - { itemstring = "mcl_core:iron_ingot", weight = 10, amount_min = 1, amount_max = 4 }, - { itemstring = "mcl_buckets:bucket_empty", weight = 10 }, - { itemstring = "mcl_core:gold_ingot", weight = 5, amount_min = 1, amount_max = 4 }, - }, - }, - { - stacks_min = 3, - stacks_max = 3, - items = { - { itemstring = "mcl_mobitems:bone", weight = 10, amount_min = 1, amount_max = 8 }, - { itemstring = "mcl_mobitems:gunpowder", weight = 10, amount_min = 1, amount_max = 8 }, - { itemstring = "mcl_mobitems:rotten_flesh", weight = 10, amount_min = 1, amount_max = 8 }, - { itemstring = "mcl_mobitems:string", weight = 10, amount_min = 1, amount_max = 8 }, - }, - } -} - --- Bonus loot for v6 mapgen: Otherwise unobtainable saplings. -if mg_name == "v6" then - table.insert(loottable, { - stacks_min = 1, - stacks_max = 3, - items = { - { itemstring = "mcl_core:birchsapling", weight = 1, amount_min = 1, amount_max = 2 }, - { itemstring = "mcl_core:acaciasapling", weight = 1, amount_min = 1, amount_max = 2 }, - { itemstring = "", weight = 6 }, - }, - }) -end - -local function ecb_spawn_dungeon(blockpos, action, calls_remaining, param) - if calls_remaining >= 1 then return end - - local p1, _, dim, pr = param.p1, param.p2, param.dim, param.pr - local x, y, z = p1.x, p1.y, p1.z - local check = not (param.dontcheck or false) - - -- Check floor and ceiling: Must be *completely* solid - local y_floor = y - local y_ceiling = y + dim.y + 1 - if check then - for tx = x+1, x+dim.x do - for tz = z+1, z+dim.z do - local fdef = registered_nodes[get_node({x = tx, y = y_floor , z = tz}).name] - local cdef = registered_nodes[get_node({x = tx, y = y_ceiling, z = tz}).name] - if not fdef or not fdef.walkable or not cdef or not cdef.walkable then return false end - end - end - end - - -- Check for air openings (2 stacked air at ground level) in wall positions - local openings_counter = 0 - -- Store positions of openings; walls will not be generated here - local openings = {} - -- Corners are stored because a corner-only opening needs to be increased, - -- so entities can get through. - local corners = {} - - local x2,z2 = x+dim.x+1, z+dim.z+1 - - if get_node({x=x, y=y+1, z=z}).name == "air" and get_node({x=x, y=y+2, z=z}).name == "air" then - openings_counter = openings_counter + 1 - if not openings[x] then openings[x]={} end - openings[x][z] = true - table_insert(corners, {x=x, z=z}) - end - if get_node({x=x2, y=y+1, z=z}).name == "air" and get_node({x=x2, y=y+2, z=z}).name == "air" then - openings_counter = openings_counter + 1 - if not openings[x2] then openings[x2]={} end - openings[x2][z] = true - table_insert(corners, {x=x2, z=z}) - end - if get_node({x=x, y=y+1, z=z2}).name == "air" and get_node({x=x, y=y+2, z=z2}).name == "air" then - openings_counter = openings_counter + 1 - if not openings[x] then openings[x]={} end - openings[x][z2] = true - table_insert(corners, {x=x, z=z2}) - end - if get_node({x=x2, y=y+1, z=z2}).name == "air" and get_node({x=x2, y=y+2, z=z2}).name == "air" then - openings_counter = openings_counter + 1 - if not openings[x2] then openings[x2]={} end - openings[x2][z2] = true - table_insert(corners, {x=x2, z=z2}) - end - - for wx = x+1, x+dim.x do - if get_node({x=wx, y=y+1, z=z}).name == "air" and get_node({x=wx, y=y+2, z=z}).name == "air" then - openings_counter = openings_counter + 1 - if check and openings_counter > 5 then return end - if not openings[wx] then openings[wx]={} end - openings[wx][z] = true - end - if get_node({x=wx, y=y+1, z=z2}).name == "air" and get_node({x=wx, y=y+2, z=z2}).name == "air" then - openings_counter = openings_counter + 1 - if check and openings_counter > 5 then return end - if not openings[wx] then openings[wx]={} end - openings[wx][z2] = true - end - end - for wz = z+1, z+dim.z do - if get_node({x=x, y=y+1, z=wz}).name == "air" and get_node({x=x, y=y+2, z=wz}).name == "air" then - openings_counter = openings_counter + 1 - if check and openings_counter > 5 then return end - if not openings[x] then openings[x]={} end - openings[x][wz] = true - end - if get_node({x=x2, y=y+1, z=wz}).name == "air" and get_node({x=x2, y=y+2, z=wz}).name == "air" then - openings_counter = openings_counter + 1 - if check and openings_counter > 5 then return end - if not openings[x2] then openings[x2]={} end - openings[x2][wz] = true - end - end - - -- If all openings are only at corners, the dungeon can't be accessed yet. - -- This code extends the openings of corners so they can be entered. - if openings_counter >= 1 and openings_counter == #corners then - for c=1, #corners do - -- Prevent creating too many openings because this would lead to dungeon rejection - if openings_counter >= 5 then - break - end - -- A corner is widened by adding openings to both neighbors - local cx, cz = corners[c].x, corners[c].z - local cxn, czn = cx, cz - if x == cx then - cxn = cxn + 1 - else - cxn = cxn - 1 - end - if z == cz then - czn = czn + 1 - else - czn = czn - 1 - end - openings[cx][czn] = true - openings_counter = openings_counter + 1 - if openings_counter < 5 then - if not openings[cxn] then openings[cxn]={} end - openings[cxn][cz] = true - openings_counter = openings_counter + 1 - end - end - end - - -- Check conditions. If okay, start generating - if check and (openings_counter < 1 or openings_counter > 5) then return end - - minetest.log("action","[mcl_dungeons] Placing new dungeon at "..minetest.pos_to_string({x=x,y=y,z=z})) - -- Okay! Spawning starts! - - -- Remember spawner chest positions to set metadata later - local chests = {} - local spawner_posses = {} - - -- First prepare random chest positions. - -- Chests spawn at wall - - -- We assign each position at the wall a number and each chest gets one of these numbers randomly - local totalChests = 2 -- this code strongly relies on this number being 2 - local totalChestSlots = (dim.x + dim.z - 2) * 2 - local chestSlots = {} - -- There is a small chance that both chests have the same slot. - -- In that case, we give a 2nd chance for the 2nd chest to get spawned. - -- If it failed again, tough luck! We stick with only 1 chest spawned. - local lastRandom - local secondChance = true -- second chance is still available - for i=1, totalChests do - local r = pr:next(1, totalChestSlots) - if r == lastRandom and secondChance then - -- Oops! Same slot selected. Try again. - r = pr:next(1, totalChestSlots) - secondChance = false - end - lastRandom = r - table_insert(chestSlots, r) - end - table_sort(chestSlots) - local currentChest = 1 - - -- Calculate the mob spawner position, to be re-used for later - local sp = {x = x + math_ceil(dim.x/2), y = y+1, z = z + math_ceil(dim.z/2)} - local rn = registered_nodes[get_node(sp).name] - if rn and rn.is_ground_content then - table_insert(spawner_posses, sp) - end - - -- Generate walls and floor - local maxx, maxy, maxz = x+dim.x+1, y+dim.y, z+dim.z+1 - local chestSlotCounter = 1 - for tx = x, maxx do - for tz = z, maxz do - for ty = y, maxy do - local p = {x = tx, y=ty, z=tz} - - -- Do not overwrite nodes with is_ground_content == false (e.g. bedrock) - -- Exceptions: cobblestone and mossy cobblestone so neighborings dungeons nicely connect to each other - local name = get_node(p).name - local rn = registered_nodes[name] - if rn and rn.is_ground_content or name == "mcl_core:cobble" or name == "mcl_core:mossycobble" then - -- Floor - if ty == y then - if pr:next(1,4) == 1 then - swap_node(p, {name = "mcl_core:cobble"}) - else - swap_node(p, {name = "mcl_core:mossycobble"}) - end - - -- Generate walls - --[[ Note: No additional cobblestone ceiling is generated. This is intentional. - The solid blocks above the dungeon are considered as the “ceiling”. - It is possible (but rare) for a dungeon to generate below sand or gravel. ]] - - elseif tx == x or tz == z or tx == maxx or tz == maxz then - -- Check if it's an opening first - if (ty == maxy) or (not (openings[tx] and openings[tx][tz])) then - -- Place wall or ceiling - swap_node(p, {name = "mcl_core:cobble"}) - elseif ty < maxy - 1 then - -- Normally the openings are already clear, but not if it is a corner - -- widening. Make sure to clear at least the bottom 2 nodes of an opening. - if name ~= "air" then swap_node(p, {name = "air"}) end - elseif name ~= "air" then - -- This allows for variation between 2-node and 3-node high openings. - swap_node(p, {name = "mcl_core:cobble"}) - end - -- If it was an opening, the lower 3 blocks are not touched at all - - -- Room interiour - else - if (ty==y+1) and (tx==x+1 or tx==maxx-1 or tz==z+1 or tz==maxz-1) and (currentChest < totalChests + 1) and (chestSlots[currentChest] == chestSlotCounter) then - currentChest = currentChest + 1 - table_insert(chests, {x=tx, y=ty, z=tz}) - else - swap_node(p, {name = "air"}) - end - - local forChest = ty==y+1 and (tx==x+1 or tx==maxx-1 or tz==z+1 or tz==maxz-1) - - -- Place next chest at the wall (if it was its chosen wall slot) - if forChest and (currentChest < totalChests + 1) and (chestSlots[currentChest] == chestSlotCounter) then - currentChest = currentChest + 1 - table_insert(chests, {x=tx, y=ty, z=tz}) - -- else - --swap_node(p, {name = "air"}) - end - if forChest then - chestSlotCounter = chestSlotCounter + 1 - end - end - end - end end end - - for c=#chests, 1, -1 do - local pos = chests[c] - - local surroundings = {} - for s=1, #surround_vectors do - -- Detect the 4 horizontal neighbors - local spos = vector_add(pos, surround_vectors[s]) - local wpos = vector_subtract(pos, surround_vectors[s]) - local nodename = get_node(spos).name - local nodename2 = get_node(wpos).name - local nodedef = registered_nodes[nodename] - local nodedef2 = registered_nodes[nodename2] - -- The chest needs an open space in front of it and a walkable node (except chest) behind it - if nodedef and nodedef.walkable == false and nodedef2 and nodedef2.walkable == true and nodename2 ~= "mcl_chests:chest" then - table_insert(surroundings, spos) - end - end - -- Set param2 (=facedir) of this chest - local facedir - if #surroundings <= 0 then - -- Fallback if chest ended up in the middle of a room for some reason - facedir = pr:next(0, 0) - else - -- 1 or multiple possible open directions: Choose random facedir - local face_to = surroundings[pr:next(1, #surroundings)] - facedir = dir_to_facedir(vector_subtract(pos, face_to)) - end - - set_node(pos, {name="mcl_chests:chest", param2=facedir}) - local meta = get_meta(pos) - minetest.log("action", "[mcl_dungeons] Filling chest " .. tostring(c) .. " at " .. minetest.pos_to_string(pos)) - mcl_loot.fill_inventory(meta:get_inventory(), "main", mcl_loot.get_multi_loot(loottable, pr), pr) - end - - -- Mob spawners are placed seperately, too - -- We don't want to destroy non-ground nodes - for s=#spawner_posses, 1, -1 do - local sp = spawner_posses[s] - -- ... and place it and select a random mob - set_node(sp, {name = "mcl_mobspawners:spawner"}) - local mobs = { - "mobs_mc:zombie", - "mobs_mc:zombie", - "mobs_mc:spider", - "mobs_mc:skeleton", - } - local spawner_mob = mobs[pr:next(1, #mobs)] - - mcl_mobspawners.setup_spawner(sp, spawner_mob, 0, 7) - end -end - -local function dungeons_nodes(minp, maxp, blockseed) - local ymin, ymax = math_max(min_y, minp.y), math_min(max_y, maxp.y) - if ymax < ymin then return false end - local pr = PseudoRandom(blockseed) - for a=1, attempts do - local dim = dungeonsizes[pr:next(1, #dungeonsizes)] - local x = pr:next(minp.x, maxp.x-dim.x-1) - local y = pr:next(ymin , ymax -dim.y-1) - local z = pr:next(minp.z, maxp.z-dim.z-1) - local p1 = {x=x,y=y,z=z} - local p2 = {x = x+dim.x+1, y = y+dim.y+1, z = z+dim.z+1} - minetest.log("verbose","[mcl_dungeons] size=" ..minetest.pos_to_string(dim) .. ", emerge from "..minetest.pos_to_string(p1) .. " to " .. minetest.pos_to_string(p2)) - emerge_area(p1, p2, ecb_spawn_dungeon, {p1=p1, p2=p2, dim=dim, pr=pr}) - end -end - -function mcl_dungeons.spawn_dungeon(p1, _, pr) - if not p1 or not pr or not p1.x or not p1.y or not p1.z then return end - local dim = dungeonsizes[pr:next(1, #dungeonsizes)] - local p2 = {x = p1.x+dim.x+1, y = p1.y+dim.y+1, z = p1.z+dim.z+1} - minetest.log("verbose","[mcl_dungeons] size=" ..minetest.pos_to_string(dim) .. ", emerge from "..minetest.pos_to_string(p1) .. " to " .. minetest.pos_to_string(p2)) - emerge_area(p1, p2, ecb_spawn_dungeon, {p1=p1, p2=p2, dim=dim, pr=pr, dontcheck=true}) -end - -mcl_mapgen_core.register_generator("dungeons", nil, dungeons_nodes, 999999) diff --git a/mods/MAPGEN/mcl_dungeons/mod.conf b/mods/MAPGEN/mcl_dungeons/mod.conf deleted file mode 100644 index fe02286fab..0000000000 --- a/mods/MAPGEN/mcl_dungeons/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = mcl_dungeons -author = Wuzzy -description = Generates random dungeons in the world -depends = mcl_init, mcl_core, mcl_chests, mcl_mobs, mcl_mobspawners, mcl_mapgen_core, mobs_mc diff --git a/mods/MAPGEN/mcl_end_island/init.lua b/mods/MAPGEN/mcl_end_island/init.lua deleted file mode 100644 index 7301762572..0000000000 --- a/mods/MAPGEN/mcl_end_island/init.lua +++ /dev/null @@ -1,34 +0,0 @@ -local noisemap = PerlinNoiseMap({ - offset = 0.5, - scale = 0.5, - spread = {x = 84, y = 84, z = 84}, - seed = minetest.get_mapgen_setting("seed") + 99999, - octaves = 4, - persist = 0.85, -}, {x = 151, y = 30, z = 151}):get_3d_map({x = 0, y = 0, z = 0}) - -local c_end_stone = minetest.get_content_id("mcl_end:end_stone") -local y_offset = -2 - -minetest.register_on_generated(function(minp, maxp) - if maxp.y < (-27025 + y_offset) or minp.y > (-27000 + y_offset + 4) or maxp.x < -75 or minp.x > 75 or maxp.z < -75 or minp.z > 75 then - return - end - - local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") - local data = vm:get_data() - local area = VoxelArea:new({MinEdge = emin, MaxEdge = emax}) - - for idx in area:iter(math.max(minp.x, -75), math.max(minp.y, -27025 + y_offset + 4), math.max(minp.z, -75), math.min(maxp.x, 75), math.min(maxp.y, -27000 + y_offset), math.min(maxp.z, 75)) do - local pos = area:position(idx) - local y = 27025 + pos.y - y_offset - if noisemap[pos.x + 75 + 1][y + 1][pos.z + 75 + 1] > (math.abs(1 - y / 25) ^ 2 + math.abs(pos.x / 75) ^ 2 + math.abs(pos.z / 75) ^ 2) then - data[idx] = c_end_stone - end - end - - vm:set_data(data) - vm:calc_lighting() - vm:update_liquids() - vm:write_to_map() -end) diff --git a/mods/MAPGEN/mcl_end_island/mod.conf b/mods/MAPGEN/mcl_end_island/mod.conf deleted file mode 100644 index 90432792ca..0000000000 --- a/mods/MAPGEN/mcl_end_island/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = mcl_end_island -author = Fleckenstein -depends = mcl_mapgen_core, mcl_end -description = Generate the end main island for MCL2 diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index d9494d18b4..8f47c1c6ca 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -10,1135 +10,27 @@ local lvm_buffer = {} minetest.register_alias("mapgen_air", "air") minetest.register_alias("mapgen_stone", "mcl_core:stone") -minetest.register_alias("mapgen_tree", "mcl_core:tree") -minetest.register_alias("mapgen_leaves", "mcl_core:leaves") -minetest.register_alias("mapgen_jungletree", "mcl_core:jungletree") -minetest.register_alias("mapgen_jungleleaves", "mcl_core:jungleleaves") -minetest.register_alias("mapgen_pine_tree", "mcl_core:sprucetree") -minetest.register_alias("mapgen_pine_needles", "mcl_core:spruceleaves") - -minetest.register_alias("mapgen_apple", "mcl_core:leaves") -minetest.register_alias("mapgen_water_source", "mcl_core:water_source") -minetest.register_alias("mapgen_dirt", "mcl_core:dirt") minetest.register_alias("mapgen_dirt_with_grass", "mcl_core:dirt_with_grass") -minetest.register_alias("mapgen_dirt_with_snow", "mcl_core:dirt_with_grass_snow") -minetest.register_alias("mapgen_sand", "mcl_core:sand") -minetest.register_alias("mapgen_gravel", "mcl_core:gravel") -minetest.register_alias("mapgen_clay", "mcl_core:clay") -minetest.register_alias("mapgen_lava_source", "air") -- Built-in lava generator is too unpredictable, we generate lava on our own -minetest.register_alias("mapgen_cobble", "mcl_core:cobble") -minetest.register_alias("mapgen_mossycobble", "mcl_core:mossycobble") -minetest.register_alias("mapgen_junglegrass", "mcl_flowers:fern") -minetest.register_alias("mapgen_stone_with_coal", "mcl_core:stone_with_coal") -minetest.register_alias("mapgen_stone_with_iron", "mcl_core:stone_with_iron") -minetest.register_alias("mapgen_desert_sand", "mcl_core:sand") -minetest.register_alias("mapgen_desert_stone", "mcl_core:sandstone") -minetest.register_alias("mapgen_sandstone", "mcl_core:sandstone") -if minetest.get_modpath("mclx_core") then - minetest.register_alias("mapgen_river_water_source", "mclx_core:river_water_source") -else - minetest.register_alias("mapgen_river_water_source", "mcl_core:water_source") -end -minetest.register_alias("mapgen_snow", "mcl_core:snow") -minetest.register_alias("mapgen_snowblock", "mcl_core:snowblock") -minetest.register_alias("mapgen_ice", "mcl_core:ice") - -minetest.register_alias("mapgen_stair_cobble", "mcl_stairs:stair_cobble") -minetest.register_alias("mapgen_sandstonebrick", "mcl_core:sandstonesmooth") -minetest.register_alias("mapgen_stair_sandstonebrick", "mcl_stairs:stair_sandstone") -minetest.register_alias("mapgen_stair_sandstone_block", "mcl_stairs:stair_sandstone") -minetest.register_alias("mapgen_stair_desert_stone", "mcl_stairs:stair_sandstone") - local mg_name = minetest.get_mapgen_setting("mg_name") -local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" - -local WITCH_HUT_HEIGHT = 3 -- Exact Y level to spawn witch huts at. This height refers to the height of the floor - --- End exit portal position -local END_EXIT_PORTAL_POS = vector.new(-3, -27003, -3) -- Content IDs -local c_bedrock = minetest.get_content_id("mcl_core:bedrock") -local c_obsidian = minetest.get_content_id("mcl_core:obsidian") local c_stone = minetest.get_content_id("mcl_core:stone") -local c_dirt = minetest.get_content_id("mcl_core:dirt") -local c_dirt_with_grass = minetest.get_content_id("mcl_core:dirt_with_grass") -local c_dirt_with_grass_snow = minetest.get_content_id("mcl_core:dirt_with_grass_snow") -local c_reeds = minetest.get_content_id("mcl_core:reeds") -local c_sand = minetest.get_content_id("mcl_core:sand") ---local c_sandstone = minetest.get_content_id("mcl_core:sandstone") local c_void = minetest.get_content_id("mcl_core:void") -local c_lava = minetest.get_content_id("mcl_core:lava_source") -local c_water = minetest.get_content_id("mcl_core:water_source") -local c_soul_sand = minetest.get_content_id("mcl_nether:soul_sand") -local c_netherrack = minetest.get_content_id("mcl_nether:netherrack") -local c_nether_lava = minetest.get_content_id("mcl_nether:nether_lava_source") ---local c_end_stone = minetest.get_content_id("mcl_end:end_stone") -local c_realm_barrier = minetest.get_content_id("mcl_core:realm_barrier") -local c_top_snow = minetest.get_content_id("mcl_core:snow") -local c_snow_block = minetest.get_content_id("mcl_core:snowblock") -local c_clay = minetest.get_content_id("mcl_core:clay") -local c_leaves = minetest.get_content_id("mcl_core:leaves") -local c_jungleleaves = minetest.get_content_id("mcl_core:jungleleaves") ---local c_jungletree = minetest.get_content_id("mcl_core:jungletree") -local c_cocoa_1 = minetest.get_content_id("mcl_cocoas:cocoa_1") -local c_cocoa_2 = minetest.get_content_id("mcl_cocoas:cocoa_2") -local c_cocoa_3 = minetest.get_content_id("mcl_cocoas:cocoa_3") -local c_vine = minetest.get_content_id("mcl_core:vine") local c_air = minetest.CONTENT_AIR --- --- Ore generation --- - --- Diorite, andesite and granite -local specialstones = { "mcl_core:diorite", "mcl_core:andesite", "mcl_core:granite" } -for s=1, #specialstones do - local node = specialstones[s] - minetest.register_ore({ - ore_type = "blob", - ore = node, - wherein = {"mcl_core:stone"}, - clust_scarcity = 15*15*15, - clust_num_ores = 33, - clust_size = 5, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, - noise_params = { - offset = 0, - scale = 1, - spread = {x=250, y=250, z=250}, - seed = 12345, - octaves = 3, - persist = 0.6, - lacunarity = 2, - flags = "defaults", - } - }) - minetest.register_ore({ - ore_type = "blob", - ore = node, - wherein = {"mcl_core:stone"}, - clust_scarcity = 10*10*10, - clust_num_ores = 58, - clust_size = 7, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, - noise_params = { - offset = 0, - scale = 1, - spread = {x=250, y=250, z=250}, - seed = 12345, - octaves = 3, - persist = 0.6, - lacunarity = 2, - flags = "defaults", - } - }) -end - -local stonelike = {"mcl_core:stone", "mcl_core:diorite", "mcl_core:andesite", "mcl_core:granite"} - --- Dirt -minetest.register_ore({ - ore_type = "blob", - ore = "mcl_core:dirt", - wherein = stonelike, - clust_scarcity = 15*15*15, - clust_num_ores = 33, - clust_size = 4, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_vars.mg_overworld_max, - noise_params = { - offset = 0, - scale = 1, - spread = {x=250, y=250, z=250}, - seed = 12345, - octaves = 3, - persist = 0.6, - lacunarity = 2, - flags = "defaults", - } -}) - --- Gravel -minetest.register_ore({ - ore_type = "blob", - ore = "mcl_core:gravel", - wherein = stonelike, - clust_scarcity = 14*14*14, - clust_num_ores = 33, - clust_size = 5, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_worlds.layer_to_y(111), - noise_params = { - offset = 0, - scale = 1, - spread = {x=250, y=250, z=250}, - seed = 12345, - octaves = 3, - persist = 0.6, - lacunarity = 2, - flags = "defaults", - } -}) - -if minetest.settings:get_bool("mcl_generate_ores", true) then - -- - -- Coal - -- - - -- Common spawn - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_coal", - wherein = stonelike, - clust_scarcity = 525*3, - clust_num_ores = 5, - clust_size = 3, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_worlds.layer_to_y(50), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_coal", - wherein = stonelike, - clust_scarcity = 510*3, - clust_num_ores = 8, - clust_size = 3, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_worlds.layer_to_y(50), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_coal", - wherein = stonelike, - clust_scarcity = 500*3, - clust_num_ores = 12, - clust_size = 3, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_worlds.layer_to_y(50), - }) - - -- Medium-rare spawn - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_coal", - wherein = stonelike, - clust_scarcity = 550*3, - clust_num_ores = 4, - clust_size = 2, - y_min = mcl_worlds.layer_to_y(51), - y_max = mcl_worlds.layer_to_y(80), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_coal", - wherein = stonelike, - clust_scarcity = 525*3, - clust_num_ores = 6, - clust_size = 3, - y_min = mcl_worlds.layer_to_y(51), - y_max = mcl_worlds.layer_to_y(80), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_coal", - wherein = stonelike, - clust_scarcity = 500*3, - clust_num_ores = 8, - clust_size = 3, - y_min = mcl_worlds.layer_to_y(51), - y_max = mcl_worlds.layer_to_y(80), - }) - - -- Rare spawn - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_coal", - wherein = stonelike, - clust_scarcity = 600*3, - clust_num_ores = 3, - clust_size = 2, - y_min = mcl_worlds.layer_to_y(81), - y_max = mcl_worlds.layer_to_y(128), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_coal", - wherein = stonelike, - clust_scarcity = 550*3, - clust_num_ores = 4, - clust_size = 3, - y_min = mcl_worlds.layer_to_y(81), - y_max = mcl_worlds.layer_to_y(128), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_coal", - wherein = stonelike, - clust_scarcity = 500*3, - clust_num_ores = 5, - clust_size = 3, - y_min = mcl_worlds.layer_to_y(81), - y_max = mcl_worlds.layer_to_y(128), - }) - - -- - -- Iron - -- - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_iron", - wherein = stonelike, - clust_scarcity = 830, - clust_num_ores = 5, - clust_size = 3, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_worlds.layer_to_y(39), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_iron", - wherein = stonelike, - clust_scarcity = 1660, - clust_num_ores = 4, - clust_size = 2, - y_min = mcl_worlds.layer_to_y(40), - y_max = mcl_worlds.layer_to_y(63), - }) - - -- - -- Gold - -- - - -- Common spawn - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_gold", - wherein = stonelike, - clust_scarcity = 4775, - clust_num_ores = 5, - clust_size = 3, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_worlds.layer_to_y(30), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_gold", - wherein = stonelike, - clust_scarcity = 6560, - clust_num_ores = 7, - clust_size = 3, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_worlds.layer_to_y(30), - }) - - -- Rare spawn - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_gold", - wherein = stonelike, - clust_scarcity = 13000, - clust_num_ores = 4, - clust_size = 2, - y_min = mcl_worlds.layer_to_y(31), - y_max = mcl_worlds.layer_to_y(33), - }) - - -- - -- Diamond - -- - - -- Common spawn - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_diamond", - wherein = stonelike, - clust_scarcity = 10000, - clust_num_ores = 4, - clust_size = 3, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_worlds.layer_to_y(12), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_diamond", - wherein = stonelike, - clust_scarcity = 5000, - clust_num_ores = 2, - clust_size = 2, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_worlds.layer_to_y(12), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_diamond", - wherein = stonelike, - clust_scarcity = 10000, - clust_num_ores = 8, - clust_size = 3, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_worlds.layer_to_y(12), - }) - - -- Rare spawn - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_diamond", - wherein = stonelike, - clust_scarcity = 20000, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_worlds.layer_to_y(13), - y_max = mcl_worlds.layer_to_y(15), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_diamond", - wherein = stonelike, - clust_scarcity = 20000, - clust_num_ores = 2, - clust_size = 2, - y_min = mcl_worlds.layer_to_y(13), - y_max = mcl_worlds.layer_to_y(15), - }) - - -- - -- Redstone - -- - - -- Common spawn - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_redstone", - wherein = stonelike, - clust_scarcity = 500, - clust_num_ores = 4, - clust_size = 3, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_worlds.layer_to_y(13), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_redstone", - wherein = stonelike, - clust_scarcity = 800, - clust_num_ores = 7, - clust_size = 4, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_worlds.layer_to_y(13), - }) - - -- Rare spawn - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_redstone", - wherein = stonelike, - clust_scarcity = 1000, - clust_num_ores = 4, - clust_size = 3, - y_min = mcl_worlds.layer_to_y(13), - y_max = mcl_worlds.layer_to_y(15), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_redstone", - wherein = stonelike, - clust_scarcity = 1600, - clust_num_ores = 7, - clust_size = 4, - y_min = mcl_worlds.layer_to_y(13), - y_max = mcl_worlds.layer_to_y(15), - }) - - -- - -- Emerald - -- - - if mg_name == "v6" then - -- Generate everywhere in v6, but rarely. - - -- Common spawn - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_emerald", - wherein = stonelike, - clust_scarcity = 14340, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_vars.mg_overworld_min, - y_max = mcl_worlds.layer_to_y(29), - }) - -- Rare spawn - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_emerald", - wherein = stonelike, - clust_scarcity = 21510, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_worlds.layer_to_y(30), - y_max = mcl_worlds.layer_to_y(32), - }) - end - - -- - -- Lapis Lazuli - -- - - -- Common spawn (in the center) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_lapis", - wherein = stonelike, - clust_scarcity = 10000, - clust_num_ores = 7, - clust_size = 4, - y_min = mcl_worlds.layer_to_y(14), - y_max = mcl_worlds.layer_to_y(16), - }) - - -- Rare spawn (below center) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_lapis", - wherein = stonelike, - clust_scarcity = 12000, - clust_num_ores = 6, - clust_size = 3, - y_min = mcl_worlds.layer_to_y(10), - y_max = mcl_worlds.layer_to_y(13), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_lapis", - wherein = stonelike, - clust_scarcity = 14000, - clust_num_ores = 5, - clust_size = 3, - y_min = mcl_worlds.layer_to_y(6), - y_max = mcl_worlds.layer_to_y(9), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_lapis", - wherein = stonelike, - clust_scarcity = 16000, - clust_num_ores = 4, - clust_size = 3, - y_min = mcl_worlds.layer_to_y(2), - y_max = mcl_worlds.layer_to_y(5), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_lapis", - wherein = stonelike, - clust_scarcity = 18000, - clust_num_ores = 3, - clust_size = 2, - y_min = mcl_worlds.layer_to_y(0), - y_max = mcl_worlds.layer_to_y(2), - }) - - -- Rare spawn (above center) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_lapis", - wherein = stonelike, - clust_scarcity = 12000, - clust_num_ores = 6, - clust_size = 3, - y_min = mcl_worlds.layer_to_y(17), - y_max = mcl_worlds.layer_to_y(20), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_lapis", - wherein = stonelike, - clust_scarcity = 14000, - clust_num_ores = 5, - clust_size = 3, - y_min = mcl_worlds.layer_to_y(21), - y_max = mcl_worlds.layer_to_y(24), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_lapis", - wherein = stonelike, - clust_scarcity = 16000, - clust_num_ores = 4, - clust_size = 3, - y_min = mcl_worlds.layer_to_y(25), - y_max = mcl_worlds.layer_to_y(28), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_lapis", - wherein = stonelike, - clust_scarcity = 18000, - clust_num_ores = 3, - clust_size = 2, - y_min = mcl_worlds.layer_to_y(29), - y_max = mcl_worlds.layer_to_y(32), - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:stone_with_lapis", - wherein = stonelike, - clust_scarcity = 32000, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_worlds.layer_to_y(31), - y_max = mcl_worlds.layer_to_y(32), - }) -end - -if not superflat then --- Water and lava springs (single blocks of lava/water source) --- Water appears at nearly every height, but not near the bottom -minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:water_source", - wherein = {"mcl_core:stone", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite", "mcl_core:dirt"}, - clust_scarcity = 9000, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_worlds.layer_to_y(5), - y_max = mcl_worlds.layer_to_y(128), -}) - --- Lava springs are rather common at -31 and below -minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:lava_source", - wherein = stonelike, - clust_scarcity = 2000, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_worlds.layer_to_y(1), - y_max = mcl_worlds.layer_to_y(10), -}) - -minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:lava_source", - wherein = stonelike, - clust_scarcity = 9000, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_worlds.layer_to_y(11), - y_max = mcl_worlds.layer_to_y(31), -}) - --- Lava springs will become gradually rarer with increasing height -minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:lava_source", - wherein = stonelike, - clust_scarcity = 32000, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_worlds.layer_to_y(32), - y_max = mcl_worlds.layer_to_y(47), -}) - -minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:lava_source", - wherein = stonelike, - clust_scarcity = 72000, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_worlds.layer_to_y(48), - y_max = mcl_worlds.layer_to_y(61), -}) - --- Lava may even appear above surface, but this is very rare -minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_core:lava_source", - wherein = stonelike, - clust_scarcity = 96000, - clust_num_ores = 1, - clust_size = 1, - y_min = mcl_worlds.layer_to_y(62), - y_max = mcl_worlds.layer_to_y(127), -}) -end - -local function register_mgv6_decorations() - - -- Cacti - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:sand"}, - sidelen = 16, - noise_params = { - offset = -0.012, - scale = 0.024, - spread = {x = 100, y = 100, z = 100}, - seed = 257, - octaves = 3, - persist = 0.6 - }, - y_min = 4, - y_max = mcl_vars.mg_overworld_max, - decoration = "mcl_core:cactus", - height = 1, - height_max = 3, - }) - - -- Sugar canes - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:dirt", "mcl_core:coarse_dirt", "group:grass_block_no_snow", "group:sand", "mcl_core:podzol", "mcl_core:reeds"}, - sidelen = 16, - noise_params = { - offset = -0.3, - scale = 0.7, - spread = {x = 100, y = 100, z = 100}, - seed = 465, - octaves = 3, - persist = 0.7 - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - decoration = "mcl_core:reeds", - height = 1, - height_max = 3, - spawn_by = { "mcl_core:water_source", "group:frosted_ice" }, - num_spawn_by = 1, - }) - - -- Doubletall grass - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = { x=1, y=3, z=1 }, - data = { - { name = "air", prob = 0 }, - { name = "mcl_flowers:double_grass", param1 = 255, }, - { name = "mcl_flowers:double_grass_top", param1 = 255, }, - }, - }, - place_on = {"group:grass_block_no_snow"}, - sidelen = 8, - noise_params = { - offset = -0.0025, - scale = 0.03, - spread = {x = 100, y = 100, z = 100}, - seed = 420, - octaves = 3, - persist = 0.0, - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - }) - - -- Large ferns - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = { x=1, y=3, z=1 }, - data = { - { name = "air", prob = 0 }, - { name = "mcl_flowers:double_fern", param1=255, }, - { name = "mcl_flowers:double_fern_top", param1=255, }, - }, - }, - -- v6 hack: This makes sure large ferns only appear in jungles - spawn_by = { "mcl_core:jungletree", "mcl_flowers:fern" }, - num_spawn_by = 1, - place_on = {"group:grass_block_no_snow"}, - - sidelen = 16, - noise_params = { - offset = 0, - scale = 0.01, - spread = {x = 250, y = 250, z = 250}, - seed = 333, - octaves = 2, - persist = 0.66, - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - }) - - -- Large flowers - local function register_large_flower(name, seed, offset) - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = { x=1, y=3, z=1 }, - data = { - { name = "air", prob = 0 }, - { name = "mcl_flowers:"..name, param1=255, }, - { name = "mcl_flowers:"..name.."_top", param1=255, }, - }, - }, - place_on = {"group:grass_block_no_snow"}, - - sidelen = 16, - noise_params = { - offset = offset, - scale = 0.01, - spread = {x = 300, y = 300, z = 300}, - seed = seed, - octaves = 5, - persist = 0.62, - }, - y_min = 1, - y_max = mcl_vars.overworld_max, - flags = "", - }) - end - - register_large_flower("rose_bush", 9350, -0.008) - register_large_flower("peony", 10450, -0.008) - register_large_flower("lilac", 10600, -0.007) - register_large_flower("sunflower", 2940, -0.005) - - -- Lily pad - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = { x=1, y=3, z=1 }, - data = { - { name = "mcl_core:water_source", prob = 0 }, - { name = "mcl_core:water_source" }, - { name = "mcl_flowers:waterlily", param1 = 255 }, - }, - }, - place_on = "mcl_core:dirt", - sidelen = 16, - noise_params = { - offset = -0.12, - scale = 0.3, - spread = {x = 200, y = 200, z = 200}, - seed = 503, - octaves = 6, - persist = 0.7, - }, - y_min = 0, - y_max = 0, - rotation = "random", - }) - - -- Pumpkin - minetest.register_decoration({ - deco_type = "simple", - decoration = "mcl_farming:pumpkin", - param2 = 0, - param2_max = 3, - place_on = {"group:grass_block_no_snow"}, - sidelen = 16, - noise_params = { - offset = -0.008, - scale = 0.00666, - spread = {x = 250, y = 250, z = 250}, - seed = 666, - octaves = 6, - persist = 0.666 - }, - y_min = 1, - y_max = mcl_vars.overworld_max, - }) - - -- Melon - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow"}, - sidelen = 16, - noise_params = { - offset = 0.002, - scale = 0.006, - spread = {x = 250, y = 250, z = 250}, - seed = 333, - octaves = 3, - persist = 0.6 - }, - -- Small trick to make sure melon spawn in jungles - spawn_by = { "mcl_core:jungletree", "mcl_flowers:fern" }, - num_spawn_by = 1, - y_min = 1, - y_max = 40, - decoration = "mcl_farming:melon", - }) - - -- Tall grass - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow"}, - sidelen = 8, - noise_params = { - offset = 0.01, - scale = 0.3, - spread = {x = 100, y = 100, z = 100}, - seed = 420, - octaves = 3, - persist = 0.6 - }, - y_min = 1, - y_max = mcl_vars.overworld_max, - decoration = "mcl_flowers:tallgrass", - }) - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow"}, - sidelen = 8, - noise_params = { - offset = 0.04, - scale = 0.03, - spread = {x = 100, y = 100, z = 100}, - seed = 420, - octaves = 3, - persist = 0.6 - }, - y_min = 1, - y_max = mcl_vars.overworld_max, - decoration = "mcl_flowers:tallgrass", - }) - - -- Seagrass and kelp - local materials = {"dirt","sand"} - for i=1, #materials do - local mat = materials[i] - - minetest.register_decoration({ - deco_type = "simple", - spawn_by = {"group:water"}, - num_spawn_by = 1, - place_on = {"mcl_core:"..mat}, - sidelen = 8, - noise_params = { - offset = 0.04, - scale = 0.3, - spread = {x = 100, y = 100, z = 100}, - seed = 421, - octaves = 3, - persist = 0.6 - }, - flags = "force_placement", - place_offset_y = -1, - y_min = mcl_vars.overworld_min, - y_max = 0, - decoration = "mcl_ocean:seagrass_"..mat, - }) - minetest.register_decoration({ - deco_type = "simple", - spawn_by = {"group:water"}, - num_spawn_by = 1, - place_on = {"mcl_core:mat"}, - sidelen = 8, - noise_params = { - offset = 0.08, - scale = 0.03, - spread = {x = 100, y = 100, z = 100}, - seed = 421, - octaves = 3, - persist = 0.6 - }, - flags = "force_placement", - place_offset_y = -1, - y_min = mcl_vars.overworld_min, - y_max = -5, - decoration = "mcl_ocean:seagrass_"..mat, - }) - - minetest.register_decoration({ - deco_type = "simple", - spawn_by = {"group:water"}, - num_spawn_by = 1, - place_on = {"mcl_core:"..mat}, - sidelen = 16, - noise_params = { - offset = 0.01, - scale = 0.01, - spread = {x = 300, y = 300, z = 300}, - seed = 505, - octaves = 5, - persist = 0.62, - }, - flags = "force_placement", - place_offset_y = -1, - y_min = mcl_vars.overworld_min, - y_max = -6, - decoration = "mcl_ocean:kelp_"..mat, - param2 = 16, - param2_max = 96, - }) - minetest.register_decoration({ - deco_type = "simple", - spawn_by = {"group:water"}, - num_spawn_by = 1, - place_on = {"mcl_core:"..mat}, - sidelen = 16, - noise_params = { - offset = 0.01, - scale = 0.01, - spread = {x = 100, y = 100, z = 100}, - seed = 506, - octaves = 5, - persist = 0.62, - }, - flags = "force_placement", - place_offset_y = -1, - y_min = mcl_vars.overworld_min, - y_max = -15, - decoration = "mcl_ocean:kelp_"..mat, - param2 = 32, - param2_max = 160, - }) - - end - - -- Wet Sponge - -- TODO: Remove this when we got ocean monuments - minetest.register_decoration({ - deco_type = "simple", - decoration = "mcl_sponges:sponge_wet", - spawn_by = {"group:water"}, - num_spawn_by = 1, - place_on = {"mcl_core:dirt","mcl_core:sand"}, - sidelen = 16, - noise_params = { - offset = 0.00295, - scale = 0.006, - spread = {x = 250, y = 250, z = 250}, - seed = 999, - octaves = 3, - persist = 0.666 - }, - flags = "force_placement", - y_min = mcl_vars.mg_lava_overworld_max + 5, - y_max = -20, - }) - - -- Add a small amount of tall grass everywhere to avoid areas completely empty devoid of tall grass - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow"}, - sidelen = 8, - fill_ratio = 0.004, - y_min = 1, - y_max = mcl_vars.overworld_max, - decoration = "mcl_flowers:tallgrass", - }) - - local mushrooms = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown"} - local mseeds = { 7133, 8244 } - for m=1, #mushrooms do - -- Mushrooms next to trees - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow", "mcl_core:dirt", "mcl_core:podzol", "mcl_core:mycelium", "mcl_core:stone", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite"}, - sidelen = 16, - noise_params = { - offset = 0.04, - scale = 0.04, - spread = {x = 100, y = 100, z = 100}, - seed = mseeds[m], - octaves = 3, - persist = 0.6 - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - decoration = mushrooms[m], - spawn_by = { "mcl_core:tree", "mcl_core:sprucetree", "mcl_core:darktree", "mcl_core:birchtree", }, - num_spawn_by = 1, - }) - end - - -- Dead bushes - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:sand", "mcl_core:podzol", "mcl_core:dirt", "mcl_core:coarse_dirt", "group:hardened_clay"}, - sidelen = 16, - noise_params = { - offset = 0, - scale = 0.035, - spread = {x = 100, y = 100, z = 100}, - seed = 1972, - octaves = 3, - persist = 0.6 - }, - y_min = 4, - y_max = mcl_vars.mg_overworld_max, - decoration = "mcl_core:deadbush", - }) - - local function register_mgv6_flower(name, seed, offset, y_max) - if offset == nil then - offset = 0 - end - if y_max == nil then - y_max = mcl_vars.mg_overworld_max - end - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_no_snow"}, - sidelen = 16, - noise_params = { - offset = offset, - scale = 0.006, - spread = {x = 100, y = 100, z = 100}, - seed = seed, - octaves = 3, - persist = 0.6 - }, - y_min = 1, - y_max = y_max, - decoration = "mcl_flowers:"..name, - }) - end - - register_mgv6_flower("tulip_red", 436) - register_mgv6_flower("tulip_orange", 536) - register_mgv6_flower("tulip_pink", 636) - register_mgv6_flower("tulip_white", 736) - register_mgv6_flower("azure_bluet", 800) - register_mgv6_flower("dandelion", 8) - -- Allium is supposed to only appear in flower forest in MC. There are no flower forests in v6. - -- We compensate by making it slightly rarer in v6. - register_mgv6_flower("allium", 0, -0.001) - --[[ Blue orchid is supposed to appear in swamplands. There are no swamplands in v6. - We emulate swamplands by limiting the height to 5 levels above sea level, - which should be close to the water. ]] - register_mgv6_flower("blue_orchid", 64500, nil, mcl_worlds.layer_to_y(67)) - register_mgv6_flower("oxeye_daisy", 3490) - register_mgv6_flower("poppy", 9439) - - -- Put top snow on snowy grass blocks. The v6 mapgen does not generate the top snow on its own. - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:grass_block_snow"}, - sidelen = 16, - fill_ratio = 11.0, -- complete coverage - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - decoration = "mcl_core:snow", - }) - -end - local mg_flags = minetest.settings:get_flags("mg_flags") -- Inform other mods of dungeon setting for MCL2-style dungeons -mcl_vars.mg_dungeons = mg_flags.dungeons and not superflat +mcl_vars.mg_dungeons = false -- Disable builtin dungeons, we provide our own dungeons mg_flags.dungeons = false -- Apply mapgen-specific mapgen code -if mg_name == "v6" then - register_mgv6_decorations() -elseif superflat then - -- Enforce superflat-like mapgen: no caves, decor, lakes and hills - mg_flags.caves = false - mg_flags.decorations = false - minetest.set_mapgen_setting("mgflat_spflags", "nolakes,nohills", true) -end +-- Enforce superflat-like mapgen: no caves, decor, lakes and hills +mg_flags.caves = false +mg_flags.decorations = false +minetest.set_mapgen_setting("mgflat_spflags", "nolakes,nohills", true) local mg_flags_str = "" for k,v in pairs(mg_flags) do @@ -1152,20 +44,6 @@ if string.len(mg_flags_str) > 0 then end minetest.set_mapgen_setting("mg_flags", mg_flags_str, true) --- Helper function for converting a MC probability to MT, with --- regards to MapBlocks. --- Some MC generated structures are generated on per-chunk --- probability. --- The MC probability is 1/x per Minecraft chunk (16×16). - --- x: The MC probability is 1/x. --- minp, maxp: MapBlock limits --- returns: Probability (1/return_value) for a single MT mapblock -local function minecraft_chunk_probability(x, minp, maxp) - -- 256 is the MC chunk height - return x * (((maxp.x-minp.x+1)*(maxp.z-minp.z+1)) / 256) -end - -- Takes an index of a biomemap table (from minetest.get_mapgen_object), -- minp and maxp (from an on_generated callback) and returns the real world coordinates -- as X, Z. @@ -1178,650 +56,14 @@ end return x, z end]] --- Takes x and z coordinates and minp and maxp of a generated chunk --- (in on_generated callback) and returns a biomemap index) --- Inverse function of biomemap_to_xz -local function xz_to_biomemap_index(x, z, minp, maxp) - local xwidth = maxp.x - minp.x + 1 - local zwidth = maxp.z - minp.z + 1 - local minix = x % xwidth - local miniz = z % zwidth - - return (minix + miniz * zwidth) + 1 -end - --- Perlin noise objects -local perlin_structures -local perlin_vines, perlin_vines_fine, perlin_vines_upwards, perlin_vines_length, perlin_vines_density -local perlin_clay - -local function generate_clay(minp, maxp, blockseed, voxelmanip_data, voxelmanip_area, lvm_used) - -- TODO: Make clay generation reproducible for same seed. - if maxp.y < -5 or minp.y > 0 then - return lvm_used - end - - local pr = PseudoRandom(blockseed) - - perlin_clay = perlin_clay or minetest.get_perlin({ - offset = 0.5, - scale = 0.2, - spread = {x = 5, y = 5, z = 5}, - seed = -316, - octaves = 1, - persist = 0.0 - }) - - for y=math.max(minp.y, 0), math.min(maxp.y, -8), -1 do - -- Assume X and Z lengths are equal - local divlen = 4 - local divs = (maxp.x-minp.x)/divlen+1; - for divx=0+1,divs-2 do - for divz=0+1,divs-2 do - -- Get position and shift it a bit randomly so the clay do not obviously appear in a grid - local cx = minp.x + math.floor((divx+0.5)*divlen) + pr:next(-1,1) - local cz = minp.z + math.floor((divz+0.5)*divlen) + pr:next(-1,1) - - local water_pos = voxelmanip_area:index(cx, y+1, cz) - local waternode = voxelmanip_data[water_pos] - local surface_pos = voxelmanip_area:index(cx, y, cz) - local surfacenode = voxelmanip_data[surface_pos] - - local genrnd = pr:next(1, 20) - if genrnd == 1 and perlin_clay:get_3d({x=cx,y=y,z=cz}) > 0 and waternode == c_water and - (surfacenode == c_dirt or minetest.get_item_group(minetest.get_name_from_content_id(surfacenode), "sand") == 1) then - local diamondsize = pr:next(1, 3) - for x1 = -diamondsize, diamondsize do - for z1 = -(diamondsize - math.abs(x1)), diamondsize - math.abs(x1) do - local ccpos = voxelmanip_area:index(cx+x1, y, cz+z1) - local claycandidate = voxelmanip_data[ccpos] - if voxelmanip_data[ccpos] == c_dirt or minetest.get_item_group(minetest.get_name_from_content_id(claycandidate), "sand") == 1 then - voxelmanip_data[ccpos] = c_clay - lvm_used = true - end - end - end - end - end - end - end - return lvm_used -end - -local function generate_end_exit_portal(pos) - local obj = minetest.add_entity(vector.add(pos, vector.new(3, 11, 3)), "mobs_mc:enderdragon") - if obj then - local dragon_entity = obj:get_luaentity() - dragon_entity._initial = true - dragon_entity._portal_pos = pos - else - minetest.log("error", "[mcl_mapgen_core] ERROR! Ender dragon doesn't want to spawn") - end - mcl_structures.call_struct(pos, "end_exit_portal") -end - --- TODO: Try to use more efficient structure generating code -local function generate_structures(minp, maxp, blockseed, biomemap) - local chunk_has_desert_well = false - local chunk_has_desert_temple = false - local chunk_has_igloo = false - local struct_min, struct_max = -3, 111 --64 - - if maxp.y >= struct_min and minp.y <= struct_max then - -- Generate structures - local pr = PcgRandom(blockseed) - perlin_structures = perlin_structures or minetest.get_perlin(329, 3, 0.6, 100) - -- Assume X and Z lengths are equal - local divlen = 5 - for x0 = minp.x, maxp.x, divlen do for z0 = minp.z, maxp.z, divlen do - -- Determine amount from perlin noise - local amount = math.floor(perlin_structures:get_2d({x=x0, y=z0}) * 9) - -- Find random positions based on this random - local p, ground_y - for i=0, amount do - p = {x = pr:next(x0, x0+divlen-1), y = 0, z = pr:next(z0, z0+divlen-1)} - -- Find ground level - ground_y = nil - local nn - for y = struct_max, struct_min, -1 do - p.y = y - local checknode = minetest.get_node(p) - if checknode then - nn = checknode.name - local def = minetest.registered_nodes[nn] - if def and def.walkable then - ground_y = y - break - end - end - end - - if ground_y then - p.y = ground_y+1 - local nn0 = minetest.get_node(p).name - -- Check if the node can be replaced - if minetest.registered_nodes[nn0] and minetest.registered_nodes[nn0].buildable_to then - -- Desert temples and desert wells - if nn == "mcl_core:sand" or (nn == "mcl_core:sandstone") then - if not chunk_has_desert_temple and not chunk_has_desert_well and ground_y > 3 then - -- Spawn desert temple - -- TODO: Check surface - if pr:next(1,12000) == 1 then - mcl_structures.call_struct(p, "desert_temple", nil, pr) - chunk_has_desert_temple = true - end - end - if not chunk_has_desert_temple and not chunk_has_desert_well and ground_y > 3 then - local desert_well_prob = minecraft_chunk_probability(1000, minp, maxp) - - -- Spawn desert well - if pr:next(1, desert_well_prob) == 1 then - -- Check surface - local surface = minetest.find_nodes_in_area({x=p.x,y=p.y-1,z=p.z}, {x=p.x+5, y=p.y-1, z=p.z+5}, "mcl_core:sand") - if #surface >= 25 then - mcl_structures.call_struct(p, "desert_well", nil, pr) - chunk_has_desert_well = true - end - end - end - - -- Igloos - elseif not chunk_has_igloo and (nn == "mcl_core:snowblock" or nn == "mcl_core:snow" or (minetest.get_item_group(nn, "grass_block_snow") == 1)) then - if pr:next(1, 4400) == 1 then - -- Check surface - local floor = {x=p.x+9, y=p.y-1, z=p.z+9} - local surface = minetest.find_nodes_in_area({x=p.x,y=p.y-1,z=p.z}, floor, "mcl_core:snowblock") - local surface2 = minetest.find_nodes_in_area({x=p.x,y=p.y-1,z=p.z}, floor, "mcl_core:dirt_with_grass_snow") - if #surface + #surface2 >= 63 then - mcl_structures.call_struct(p, "igloo", nil, pr) - chunk_has_igloo = true - end - end - end - - -- Fossil - if nn == "mcl_core:sandstone" or nn == "mcl_core:sand" and not chunk_has_desert_temple and ground_y > 3 then - local fossil_prob = minecraft_chunk_probability(64, minp, maxp) - - if pr:next(1, fossil_prob) == 1 then - -- Spawn fossil below desert surface between layers 40 and 49 - local p1 = {x=p.x, y=pr:next(mcl_worlds.layer_to_y(40), mcl_worlds.layer_to_y(49)), z=p.z} - -- Very rough check of the environment (we expect to have enough stonelike nodes). - -- Fossils may still appear partially exposed in caves, but this is O.K. - local p2 = vector.add(p1, 4) - local nodes = minetest.find_nodes_in_area(p1, p2, {"mcl_core:sandstone", "mcl_core:stone", "mcl_core:diorite", "mcl_core:andesite", "mcl_core:granite", "mcl_core:stone_with_coal", "mcl_core:dirt", "mcl_core:gravel"}) - - if #nodes >= 100 then -- >= 80% - mcl_structures.call_struct(p1, "fossil", nil, pr) - end - end - end - - -- Witch hut - if ground_y <= 0 and nn == "mcl_core:dirt" then - local prob = minecraft_chunk_probability(48, minp, maxp) - if pr:next(1, prob) == 1 then - - local swampland = minetest.get_biome_id("Swampland") - local swampland_shore = minetest.get_biome_id("Swampland_shore") - - -- Where do witches live? - - local here_be_witches = false - if mg_name == "v6" then - -- v6: In Normal biome - if biomeinfo.get_v6_biome(p) == "Normal" then - here_be_witches = true - end - else - -- Other mapgens: In swampland biome - local bi = xz_to_biomemap_index(p.x, p.z, minp, maxp) - if biomemap[bi] == swampland or biomemap[bi] == swampland_shore then - here_be_witches = true - end - end - - if here_be_witches then - local r = tostring(pr:next(0, 3) * 90) -- "0", "90", "180" or 270" - local p1 = {x=p.x-1, y=WITCH_HUT_HEIGHT+2, z=p.z-1} - local size - if r == "0" or r == "180" then - size = {x=10, y=4, z=8} - else - size = {x=8, y=4, z=10} - end - local p2 = vector.add(p1, size) - - -- This checks free space at the “body” of the hut and a bit around. - -- ALL nodes must be free for the placement to succeed. - local free_nodes = minetest.find_nodes_in_area(p1, p2, {"air", "mcl_core:water_source", "mcl_flowers:waterlily"}) - if #free_nodes >= ((size.x+1)*(size.y+1)*(size.z+1)) then - local place = {x=p.x, y=WITCH_HUT_HEIGHT-1, z=p.z} - - -- FIXME: For some mysterious reason (black magic?) this - -- function does sometimes NOT spawn the witch hut. One can only see the - -- oak wood nodes in the water, but no hut. :-/ - mcl_structures.call_struct(place, "witch_hut", r, pr) - - -- TODO: Spawn witch in or around hut when the mob sucks less. - - local function place_tree_if_free(pos, prev_result) - local nn = minetest.get_node(pos).name - if nn == "mcl_flowers:waterlily" or nn == "mcl_core:water_source" or nn == "mcl_core:water_flowing" or nn == "air" then - minetest.set_node(pos, {name="mcl_core:tree", param2=0}) - return prev_result - else - return false - end - end - local offsets - if r == "0" then - offsets = { - {x=1, y=0, z=1}, - {x=1, y=0, z=5}, - {x=6, y=0, z=1}, - {x=6, y=0, z=5}, - } - elseif r == "180" then - offsets = { - {x=2, y=0, z=1}, - {x=2, y=0, z=5}, - {x=7, y=0, z=1}, - {x=7, y=0, z=5}, - } - elseif r == "270" then - offsets = { - {x=1, y=0, z=1}, - {x=5, y=0, z=1}, - {x=1, y=0, z=6}, - {x=5, y=0, z=6}, - } - elseif r == "90" then - offsets = { - {x=1, y=0, z=2}, - {x=5, y=0, z=2}, - {x=1, y=0, z=7}, - {x=5, y=0, z=7}, - } - end - for o=1, #offsets do - local ok = true - for y=place.y-1, place.y-64, -1 do - local tpos = vector.add(place, offsets[o]) - tpos.y = y - ok = place_tree_if_free(tpos, ok) - if not ok then - break - end - end - end - end - end - end - end - - -- Ice spikes in v6 - -- In other mapgens, ice spikes are generated as decorations. - if mg_name == "v6" and not chunk_has_igloo and nn == "mcl_core:snowblock" then - local spike = pr:next(1,58000) - if spike < 3 then - -- Check surface - local floor = {x=p.x+4, y=p.y-1, z=p.z+4} - local surface = minetest.find_nodes_in_area({x=p.x+1,y=p.y-1,z=p.z+1}, floor, {"mcl_core:snowblock"}) - -- Check for collision with spruce - local spruce_collisions = minetest.find_nodes_in_area({x=p.x+1,y=p.y+2,z=p.z+1}, {x=p.x+4, y=p.y+6, z=p.z+4}, {"mcl_core:sprucetree", "mcl_core:spruceleaves"}) - - if #surface >= 9 and #spruce_collisions == 0 then - mcl_structures.call_struct(p, "ice_spike_large", nil, pr) - end - elseif spike < 100 then - -- Check surface - local floor = {x=p.x+6, y=p.y-1, z=p.z+6} - local surface = minetest.find_nodes_in_area({x=p.x+1,y=p.y-1,z=p.z+1}, floor, {"mcl_core:snowblock", "mcl_core:dirt_with_grass_snow"}) - - -- Check for collision with spruce - local spruce_collisions = minetest.find_nodes_in_area({x=p.x+1,y=p.y+1,z=p.z+1}, {x=p.x+6, y=p.y+6, z=p.z+6}, {"mcl_core:sprucetree", "mcl_core:spruceleaves"}) - - if #surface >= 25 and #spruce_collisions == 0 then - mcl_structures.call_struct(p, "ice_spike_small", nil, pr) - end - end - end - end - end - - end - end end - -- End exit portal - elseif minp.y <= END_EXIT_PORTAL_POS.y and maxp.y >= END_EXIT_PORTAL_POS.y and - minp.x <= END_EXIT_PORTAL_POS.x and maxp.x >= END_EXIT_PORTAL_POS.x and - minp.z <= END_EXIT_PORTAL_POS.z and maxp.z >= END_EXIT_PORTAL_POS.z then - for y=maxp.y, minp.y, -1 do - local p = {x=END_EXIT_PORTAL_POS.x, y=y, z=END_EXIT_PORTAL_POS.z} - if minetest.get_node(p).name == "mcl_end:end_stone" then - generate_end_exit_portal(p) - return - end - end - generate_end_exit_portal(END_EXIT_PORTAL_POS) - end -end - --- Buffers for LuaVoxelManip --- local lvm_buffer = {} --- local lvm_buffer_param2 = {} - --- Generate tree decorations in the bounding box. This adds: --- * Cocoa at jungle trees --- * Jungle tree vines --- * Oak vines in swamplands -local function generate_tree_decorations(minp, maxp, seed, data, param2_data, area, biomemap, lvm_used, pr) - if maxp.y < 0 then - return lvm_used - end - - local oaktree, oakleaves, jungletree, jungleleaves = {}, {}, {}, {} - local swampland = minetest.get_biome_id("Swampland") - local swampland_shore = minetest.get_biome_id("Swampland_shore") - local jungle = minetest.get_biome_id("Jungle") - local jungle_shore = minetest.get_biome_id("Jungle_shore") - local jungle_m = minetest.get_biome_id("JungleM") - local jungle_m_shore = minetest.get_biome_id("JungleM_shore") - local jungle_edge = minetest.get_biome_id("JungleEdge") - local jungle_edge_shore = minetest.get_biome_id("JungleEdge_shore") - local jungle_edge_m = minetest.get_biome_id("JungleEdgeM") - local jungle_edge_m_shore = minetest.get_biome_id("JungleEdgeM_shore") - - -- Modifier for Jungle M biome: More vines and cocoas - local dense_vegetation = false - - if biomemap then - -- Biome map available: Check if the required biome (jungle or swampland) - -- is in this mapchunk. We are only interested in trees in the correct biome. - -- The nodes are added if the correct biome is *anywhere* in the mapchunk. - -- TODO: Strictly generate vines in the correct biomes only. - local swamp_biome_found, jungle_biome_found = false, false - for b=1, #biomemap do - local id = biomemap[b] - - if not swamp_biome_found and (id == swampland or id == swampland_shore) then - oaktree = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:tree"}) - oakleaves = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:leaves"}) - swamp_biome_found = true - end - if not jungle_biome_found and (id == jungle or id == jungle_shore or id == jungle_m or id == jungle_m_shore or id == jungle_edge or id == jungle_edge_shore or id == jungle_edge_m or id == jungle_edge_m_shore) then - jungletree = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:jungletree"}) - jungleleaves = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:jungleleaves"}) - jungle_biome_found = true - end - if not dense_vegetation and (id == jungle_m or id == jungle_m_shore) then - dense_vegetation = true - end - if swamp_biome_found and jungle_biome_found and dense_vegetation then - break - end - end - else - -- If there is no biome map, we just count all jungle things we can find. - -- Oak vines will not be generated. - jungletree = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:jungletree"}) - jungleleaves = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:jungleleaves"}) - end - - local pos, treepos, dir - - local cocoachance = 40 - if dense_vegetation then - cocoachance = 32 - end - - -- Pass 1: Generate cocoas at jungle trees - for n = 1, #jungletree do - - pos = table.copy(jungletree[n]) - treepos = table.copy(pos) - - if minetest.find_node_near(pos, 1, {"mcl_core:jungleleaves"}) then - - dir = pr:next(1, cocoachance) - - if dir == 1 then - pos.z = pos.z + 1 - elseif dir == 2 then - pos.z = pos.z - 1 - elseif dir == 3 then - pos.x = pos.x + 1 - elseif dir == 4 then - pos.x = pos.x -1 - end - - local p_pos = area:index(pos.x, pos.y, pos.z) - local l = minetest.get_node_light(pos) - - if dir < 5 - and data[p_pos] == c_air - and l and l > 12 then - local c = pr:next(1, 3) - if c == 1 then - data[p_pos] = c_cocoa_1 - elseif c == 2 then - data[p_pos] = c_cocoa_2 - else - data[p_pos] = c_cocoa_3 - end - param2_data[p_pos] = minetest.dir_to_facedir(vector.subtract(treepos, pos)) - lvm_used = true - end - - end - end - - -- Pass 2: Generate vines at jungle wood, jungle leaves in jungle and oak wood, oak leaves in swampland - perlin_vines = perlin_vines or minetest.get_perlin(555, 4, 0.6, 500) - perlin_vines_fine = perlin_vines_fine or minetest.get_perlin(43000, 3, 0.6, 1) - perlin_vines_length = perlin_vines_length or minetest.get_perlin(435, 4, 0.6, 75) - perlin_vines_upwards = perlin_vines_upwards or minetest.get_perlin(436, 3, 0.6, 10) - perlin_vines_density = perlin_vines_density or minetest.get_perlin(436, 3, 0.6, 500) - - -- Extra long vines in Jungle M - local maxvinelength = 7 - if dense_vegetation then - maxvinelength = 14 - end - local treething - for i=1, 4 do - if i==1 then - treething = jungletree - elseif i == 2 then - treething = jungleleaves - elseif i == 3 then - treething = oaktree - elseif i == 4 then - treething = oakleaves - end - - for n = 1, #treething do - pos = treething[n] - - treepos = table.copy(pos) - - local dirs = { - {x=1,y=0,z=0}, - {x=-1,y=0,z=0}, - {x=0,y=0,z=1}, - {x=0,y=0,z=-1}, - } - - for d = 1, #dirs do - local pos = vector.add(pos, dirs[d]) - local p_pos = area:index(pos.x, pos.y, pos.z) - - local vine_threshold = math.max(0.33333, perlin_vines_density:get_2d(pos)) - if dense_vegetation then - vine_threshold = vine_threshold * (2/3) - end - - if perlin_vines:get_2d(pos) > -1.0 and perlin_vines_fine:get_3d(pos) > vine_threshold and data[p_pos] == c_air then - - local rdir = {} - rdir.x = -dirs[d].x - rdir.y = dirs[d].y - rdir.z = -dirs[d].z - local param2 = minetest.dir_to_wallmounted(rdir) - - -- Determine growth direction - local grow_upwards = false - -- Only possible on the wood, not on the leaves - if i == 1 then - grow_upwards = perlin_vines_upwards:get_3d(pos) > 0.8 - end - if grow_upwards then - -- Grow vines up 1-4 nodes, even through jungleleaves. - -- This may give climbing access all the way to the top of the tree :-) - -- But this will be fairly rare. - local length = math.ceil(math.abs(perlin_vines_length:get_3d(pos)) * 4) - for l=0, length-1 do - local t_pos = area:index(treepos.x, treepos.y, treepos.z) - - if (data[p_pos] == c_air or data[p_pos] == c_jungleleaves or data[p_pos] == c_leaves) and mcl_core.supports_vines(minetest.get_name_from_content_id(data[t_pos])) then - data[p_pos] = c_vine - param2_data[p_pos] = param2 - lvm_used = true - - else - break - end - pos.y = pos.y + 1 - p_pos = area:index(pos.x, pos.y, pos.z) - treepos.y = treepos.y + 1 - end - else - -- Grow vines down, length between 1 and maxvinelength - local length = math.ceil(math.abs(perlin_vines_length:get_3d(pos)) * maxvinelength) - for l=0, length-1 do - if data[p_pos] == c_air then - data[p_pos] = c_vine - param2_data[p_pos] = param2 - lvm_used = true - - else - break - end - pos.y = pos.y - 1 - p_pos = area:index(pos.x, pos.y, pos.z) - end - end - end - end - - end - end - return lvm_used -end - --- Generate mushrooms in caves manually. --- Minetest's API does not support decorations in caves yet. :-( -local function generate_underground_mushrooms(minp, maxp, seed) - local pr_shroom = PseudoRandom(seed-24359) - -- Generate rare underground mushrooms - -- TODO: Make them appear in groups, use Perlin noise - local min, max = mcl_vars.mg_lava_overworld_max + 4, 0 - if minp.y > max or maxp.y < min then - return - end - - local bpos - local stone = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_core:stone", "mcl_core:dirt", "mcl_core:mycelium", "mcl_core:podzol", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite", "mcl_core:stone_with_coal", "mcl_core:stone_with_iron", "mcl_core:stone_with_gold"}) - - for n = 1, #stone do - bpos = {x = stone[n].x, y = stone[n].y + 1, z = stone[n].z } - - local l = minetest.get_node_light(bpos, 0.5) - if bpos.y >= min and bpos.y <= max and l and l <= 12 and pr_shroom:next(1,1000) < 4 then - if pr_shroom:next(1,2) == 1 then - minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_brown"}) - else - minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_red"}) - end - end - end -end - -local nether_wart_chance -if mg_name == "v6" then - nether_wart_chance = 85 -else - nether_wart_chance = 170 -end --- Generate Nether decorations manually: Eternal fire, mushrooms, nether wart --- Minetest's API does not support decorations in caves yet. :-( -local function generate_nether_decorations(minp, maxp, seed) - local pr_nether = PseudoRandom(seed+667) - - if minp.y > mcl_vars.mg_nether_max or maxp.y < mcl_vars.mg_nether_min then - return - end - - minetest.log("action", "[mcl_mapgen_core] Nether decorations " .. minetest.pos_to_string(minp) .. " ... " .. minetest.pos_to_string(maxp)) - - -- TODO: Generate everything based on Perlin noise instead of PseudoRandom - - local bpos - local rack = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:netherrack"}) - local magma = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:magma"}) - local ssand = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:soul_sand"}) - - -- Helper function to spawn “fake” decoration - local function special_deco(nodes, spawn_func) - for n = 1, #nodes do - bpos = {x = nodes[n].x, y = nodes[n].y + 1, z = nodes[n].z } - - spawn_func(bpos) - end - - end - - -- Eternal fire on netherrack - special_deco(rack, function(bpos) - -- Eternal fire on netherrack - if pr_nether:next(1,100) <= 3 then - minetest.set_node(bpos, {name = "mcl_fire:eternal_fire"}) - end - end) - - -- Eternal fire on magma cubes - special_deco(magma, function(bpos) - if pr_nether:next(1,150) == 1 then - minetest.set_node(bpos, {name = "mcl_fire:eternal_fire"}) - end - end) - - -- Mushrooms on netherrack - -- Note: Spawned *after* the fire because of light level checks - special_deco(rack, function(bpos) - local l = minetest.get_node_light(bpos, 0.5) - if bpos.y > mcl_vars.mg_lava_nether_max + 6 and l and l <= 12 and pr_nether:next(1,1000) <= 4 then - -- TODO: Make mushrooms appear in groups, use Perlin noise - if pr_nether:next(1,2) == 1 then - minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_brown"}) - else - minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_red"}) - end - end - end) - - -- Nether wart on soul sand - -- TODO: Spawn in Nether fortresses - special_deco(ssand, function(bpos) - if pr_nether:next(1, nether_wart_chance) == 1 then - minetest.set_node(bpos, {name = "mcl_nether:nether_wart"}) - end - end) - -end - minetest.register_on_generated(function(minp, maxp, blockseed) - minetest.log("action", "[mcl_mapgen_core] Generating chunk " .. minetest.pos_to_string(minp) .. " ... " .. minetest.pos_to_string(maxp)) + minetest.log( + "action", + "[mcl_mapgen_core] Generating chunk " .. + minetest.pos_to_string(minp) .. + " ... " .. + minetest.pos_to_string(maxp) + ) local p1, p2 = {x=minp.x, y=minp.y, z=minp.z}, {x=maxp.x, y=maxp.y, z=maxp.z} if lvm > 0 then local lvm_used, shadow = false, false @@ -1905,306 +147,3 @@ function mcl_mapgen_core.unregister_generator(id) if rec.needs_param2 then param2 = param2 - 1 end --if rec.needs_level0 then level0 = level0 - 1 end end - --- Generate basic layer-based nodes: void, bedrock, realm barrier, lava seas, etc. --- Also perform some basic node replacements. - -local bedrock_check -if mcl_vars.mg_bedrock_is_rough then - function bedrock_check(pos, _, pr) - local y = pos.y - -- Bedrock layers with increasing levels of roughness, until a perfecly flat bedrock later at the bottom layer - -- This code assumes a bedrock height of 5 layers. - - local diff = mcl_vars.mg_bedrock_overworld_max - y -- Overworld bedrock - local ndiff1 = mcl_vars.mg_bedrock_nether_bottom_max - y -- Nether bedrock, bottom - local ndiff2 = mcl_vars.mg_bedrock_nether_top_max - y -- Nether bedrock, ceiling - - local top - if diff == 0 or ndiff1 == 0 or ndiff2 == 4 then - -- 50% bedrock chance - top = 2 - elseif diff == 1 or ndiff1 == 1 or ndiff2 == 3 then - -- 66.666...% - top = 3 - elseif diff == 2 or ndiff1 == 2 or ndiff2 == 2 then - -- 75% - top = 4 - elseif diff == 3 or ndiff1 == 3 or ndiff2 == 1 then - -- 90% - top = 10 - elseif diff == 4 or ndiff1 == 4 or ndiff2 == 0 then - -- 100% - return true - else - -- Not in bedrock layer - return false - end - - return pr:next(1, top) <= top-1 - end -end - - --- Helper function to set all nodes in the layers between min and max. --- content_id: Node to set --- check: optional. --- If content_id, node will be set only if it is equal to check. --- If function(pos_to_check, content_id_at_this_pos), will set node only if returns true. --- min, max: Minimum and maximum Y levels of the layers to set --- minp, maxp: minp, maxp of the on_generated --- lvm_used: Set to true if any node in this on_generated has been set before. --- --- returns true if any node was set and lvm_used otherwise -local function set_layers(data, area, content_id, check, min, max, minp, maxp, lvm_used, pr) - if (maxp.y >= min and minp.y <= max) then - for y = math.max(min, minp.y), math.min(max, maxp.y) do - for x = minp.x, maxp.x do - for z = minp.z, maxp.z do - local p_pos = area:index(x, y, z) - if check then - if type(check) == "function" and check({x=x,y=y,z=z}, data[p_pos], pr) then - data[p_pos] = content_id - lvm_used = true - elseif check == data[p_pos] then - data[p_pos] = content_id - lvm_used = true - end - else - data[p_pos] = content_id - lvm_used = true - end - end - end - end - end - return lvm_used -end - --- Below the bedrock, generate air/void -local function basic(vm, data, data2, emin, emax, area, minp, maxp, blockseed) - local biomemap --ymin, ymax - local lvm_used = false - local pr = PseudoRandom(blockseed) - - -- The Void below the Nether: - lvm_used = set_layers(data, area, c_void , nil, mcl_vars.mapgen_edge_min , mcl_vars.mg_nether_min -1, minp, maxp, lvm_used, pr) - - -- [[ THE NETHER: mcl_vars.mg_nether_min mcl_vars.mg_nether_max ]] - - -- The Air on the Nether roof, https://git.minetest.land/MineClone2/MineClone2/issues/1186 - lvm_used = set_layers(data, area, c_air , nil, mcl_vars.mg_nether_max +1, mcl_vars.mg_nether_max + 128 , minp, maxp, lvm_used, pr) - -- The Void above the Nether below the End: - lvm_used = set_layers(data, area, c_void , nil, mcl_vars.mg_nether_max + 128 +1, mcl_vars.mg_end_min -1, minp, maxp, lvm_used, pr) - - -- [[ THE END: mcl_vars.mg_end_min mcl_vars.mg_end_max ]] - - -- The Void above the End below the Realm barrier: - lvm_used = set_layers(data, area, c_void , nil, mcl_vars.mg_end_max +1, mcl_vars.mg_realm_barrier_overworld_end_min-1, minp, maxp, lvm_used, pr) - -- Realm barrier between the Overworld void and the End - lvm_used = set_layers(data, area, c_realm_barrier, nil, mcl_vars.mg_realm_barrier_overworld_end_min , mcl_vars.mg_realm_barrier_overworld_end_max , minp, maxp, lvm_used, pr) - -- The Void above Realm barrier below the Overworld: - lvm_used = set_layers(data, area, c_void , nil, mcl_vars.mg_realm_barrier_overworld_end_max+1, mcl_vars.mg_overworld_min -1, minp, maxp, lvm_used, pr) - - - if mg_name ~= "singlenode" then - -- Bedrock - lvm_used = set_layers(data, area, c_bedrock, bedrock_check, mcl_vars.mg_bedrock_overworld_min, mcl_vars.mg_bedrock_overworld_max, minp, maxp, lvm_used, pr) - lvm_used = set_layers(data, area, c_bedrock, bedrock_check, mcl_vars.mg_bedrock_nether_bottom_min, mcl_vars.mg_bedrock_nether_bottom_max, minp, maxp, lvm_used, pr) - lvm_used = set_layers(data, area, c_bedrock, bedrock_check, mcl_vars.mg_bedrock_nether_top_min, mcl_vars.mg_bedrock_nether_top_max, minp, maxp, lvm_used, pr) - - -- Flat Nether - if mg_name == "flat" then - lvm_used = set_layers(data, area, c_air, nil, mcl_vars.mg_flat_nether_floor, mcl_vars.mg_flat_nether_ceiling, minp, maxp, lvm_used, pr) - end - - -- Big lava seas by replacing air below a certain height - if mcl_vars.mg_lava then - lvm_used = set_layers(data, area, c_lava, c_air, mcl_vars.mg_overworld_min, mcl_vars.mg_lava_overworld_max, minp, maxp, lvm_used, pr) - lvm_used = set_layers(data, area, c_nether_lava, c_air, mcl_vars.mg_nether_min, mcl_vars.mg_lava_nether_max, minp, maxp, lvm_used, pr) - end - - -- Clay, vines, cocoas - lvm_used = generate_clay(minp, maxp, blockseed, data, area, lvm_used) - - biomemap = minetest.get_mapgen_object("biomemap") - lvm_used = generate_tree_decorations(minp, maxp, blockseed, data, data2, area, biomemap, lvm_used, pr) - - ----- Interactive block fixing section ----- - ----- The section to perform basic block overrides of the core mapgen generated world. ----- - - -- Snow and sand fixes. This code implements snow consistency - -- and fixes floating sand and cut plants. - -- A snowy grass block must be below a top snow or snow block at all times. - if minp.y <= mcl_vars.mg_overworld_max and maxp.y >= mcl_vars.mg_overworld_min then - -- v6 mapgen: - if mg_name == "v6" then - - --[[ Remove broken double plants caused by v6 weirdness. - v6 might break the bottom part of double plants because of how it works. - There are 3 possibilities: - 1) Jungle: Top part is placed on top of a jungle tree or fern (=v6 jungle grass). - This is because the schematic might be placed even if some nodes of it - could not be placed because the destination was already occupied. - TODO: A better fix for this would be if schematics could abort placement - altogether if ANY of their nodes could not be placed. - 2) Cavegen: Removes the bottom part, the upper part floats - 3) Mudflow: Same as 2) ]] - local plants = minetest.find_nodes_in_area(minp, maxp, "group:double_plant") - for n = 1, #plants do - local node = vm:get_node_at(plants[n]) - local is_top = minetest.get_item_group(node.name, "double_plant") == 2 - if is_top then - local p_pos = area:index(plants[n].x, plants[n].y-1, plants[n].z) - if p_pos then - node = vm:get_node_at({x=plants[n].x, y=plants[n].y-1, z=plants[n].z}) - local is_bottom = minetest.get_item_group(node.name, "double_plant") == 1 - if not is_bottom then - p_pos = area:index(plants[n].x, plants[n].y, plants[n].z) - data[p_pos] = c_air - lvm_used = true - end - end - end - end - - - -- Non-v6 mapgens: - else - -- Set param2 (=color) of grass blocks. - -- Clear snowy grass blocks without snow above to ensure consistency. - local nodes = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:dirt_with_grass", "mcl_core:dirt_with_grass_snow"}) - - -- Flat area at y=0 to read biome 3 times faster than 5.3.0.get_biome_data(pos).biome: 43us vs 125us per iteration: - local aream = VoxelArea:new({MinEdge={x=minp.x, y=0, z=minp.z}, MaxEdge={x=maxp.x, y=0, z=maxp.z}}) - for n=1, #nodes do - local n = nodes[n] - local p_pos = area:index(n.x, n.y, n.z) - local p_pos_above = area:index(n.x, n.y+1, n.z) - --local p_pos_below = area:index(n.x, n.y-1, n.z) - local b_pos = aream:index(n.x, 0, n.z) - local bn = minetest.get_biome_name(biomemap[b_pos]) - if bn then - local biome = minetest.registered_biomes[bn] - if biome and biome._mcl_biome_type then - data2[p_pos] = biome._mcl_palette_index - lvm_used = true - end - end - if data[p_pos] == c_dirt_with_grass_snow and p_pos_above and data[p_pos_above] ~= c_top_snow and data[p_pos_above] ~= c_snow_block then - data[p_pos] = c_dirt_with_grass - lvm_used = true - end - end - - -- Set param2 (=color) of sugar cane - nodes = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:reeds"}) - for n=1, #nodes do - local n = nodes[n] - local p_pos = area:index(n.x, n.y, n.z) - local b_pos = aream:index(n.x, 0, n.z) - local bn = minetest.get_biome_name(biomemap[b_pos]) - if bn then - local biome = minetest.registered_biomes[bn] - if biome and biome._mcl_biome_type then - data2[p_pos] = biome._mcl_palette_index - lvm_used = true - end - end - end - end - - -- Nether block fixes: - -- * Replace water with Nether lava. - -- * Replace stone, sand dirt in v6 so the Nether works in v6. - elseif emin.y <= mcl_vars.mg_nether_max and emax.y >= mcl_vars.mg_nether_min then - if mg_name == "v6" then - local nodes = minetest.find_nodes_in_area(emin, emax, {"mcl_core:water_source", "mcl_core:stone", "mcl_core:sand", "mcl_core:dirt"}) - for n=1, #nodes do - local p_pos = area:index(nodes[n].x, nodes[n].y, nodes[n].z) - if data[p_pos] == c_water then - data[p_pos] = c_nether_lava - lvm_used = true - elseif data[p_pos] == c_stone then - data[p_pos] = c_netherrack - lvm_used = true - elseif data[p_pos] == c_sand or data[p_pos] == c_dirt then - data[p_pos] = c_soul_sand - lvm_used = true - end - end - else - local nodes = minetest.find_nodes_in_area(emin, emax, {"group:water"}) - for _, n in pairs(nodes) do - data[area:index(n.x, n.y, n.z)] = c_nether_lava - end - end - - -- End block fixes: - -- * Replace water with end stone or air (depending on height). - -- * Remove stone, sand, dirt in v6 so our End map generator works in v6. - -- * Generate spawn platform (End portal destination) - elseif minp.y <= mcl_vars.mg_end_max and maxp.y >= mcl_vars.mg_end_min then - local nodes - if mg_name == "v6" then - nodes = minetest.find_nodes_in_area(emin, emax, {"mcl_core:water_source", "mcl_core:stone", "mcl_core:sand", "mcl_core:dirt"}) - else - nodes = minetest.find_nodes_in_area(emin, emax, {"mcl_core:water_source"}) - end - if #nodes > 0 then - lvm_used = true - for _,n in pairs(nodes) do - data[area:index(n.x, n.y, n.z)] = c_air - end - end - - -- Obsidian spawn platform - if minp.y <= mcl_vars.mg_end_platform_pos.y and maxp.y >= mcl_vars.mg_end_platform_pos.y and - minp.x <= mcl_vars.mg_end_platform_pos.x and maxp.x >= mcl_vars.mg_end_platform_pos.z and - minp.z <= mcl_vars.mg_end_platform_pos.z and maxp.z >= mcl_vars.mg_end_platform_pos.z then - - --local pos1 = {x = math.max(minp.x, mcl_vars.mg_end_platform_pos.x-2), y = math.max(minp.y, mcl_vars.mg_end_platform_pos.y), z = math.max(minp.z, mcl_vars.mg_end_platform_pos.z-2)} - --local pos2 = {x = math.min(maxp.x, mcl_vars.mg_end_platform_pos.x+2), y = math.min(maxp.y, mcl_vars.mg_end_platform_pos.y+2), z = math.min(maxp.z, mcl_vars.mg_end_platform_pos.z+2)} - - for x=math.max(minp.x, mcl_vars.mg_end_platform_pos.x-2), math.min(maxp.x, mcl_vars.mg_end_platform_pos.x+2) do - for z=math.max(minp.z, mcl_vars.mg_end_platform_pos.z-2), math.min(maxp.z, mcl_vars.mg_end_platform_pos.z+2) do - for y=math.max(minp.y, mcl_vars.mg_end_platform_pos.y), math.min(maxp.y, mcl_vars.mg_end_platform_pos.y+2) do - local p_pos = area:index(x, y, z) - if y == mcl_vars.mg_end_platform_pos.y then - data[p_pos] = c_obsidian - else - data[p_pos] = c_air - end - end - end - end - lvm_used = true - end - end - end - - -- Final hackery: Set sun light level in the End. - -- -26912 is at a mapchunk border. - local shadow = true - if minp.y >= -26912 and maxp.y <= mcl_vars.mg_end_max then - vm:set_lighting({day=15, night=15}) - lvm_used = true - end - if minp.y >= mcl_vars.mg_end_min and maxp.y <= -26911 then - shadow = false - lvm_used = true - end - - return lvm_used, shadow -end - -local function basic_node(minp, maxp, blockseed) - if mg_name ~= "singlenode" then - -- Generate special decorations - generate_underground_mushrooms(minp, maxp, blockseed) - generate_nether_decorations(minp, maxp, blockseed) - generate_structures(minp, maxp, blockseed, minetest.get_mapgen_object("biomemap")) - end -end - -mcl_mapgen_core.register_generator("main", basic, basic_node, 1, true) diff --git a/mods/MAPGEN/mcl_mapgen_core/mod.conf b/mods/MAPGEN/mcl_mapgen_core/mod.conf index 9f7d9ebaa2..5a6bf94524 100644 --- a/mods/MAPGEN/mcl_mapgen_core/mod.conf +++ b/mods/MAPGEN/mcl_mapgen_core/mod.conf @@ -1,5 +1,5 @@ name = mcl_mapgen_core author = Wuzzy description = The core of the MCL2 mapgen -depends = mcl_init, mcl_core, biomeinfo, mcl_worlds, mcl_cocoas, mcl_sponges, mcl_ocean, mcl_stairs, mcl_monster_eggs, mcl_structures +depends = mcl_init, mcl_core, biomeinfo, mcl_worlds, mcl_cocoas, mcl_sponges, mcl_structures optional_depends = mclx_core diff --git a/mods/MAPGEN/mcl_strongholds/init.lua b/mods/MAPGEN/mcl_strongholds/init.lua deleted file mode 100644 index 083172a3cb..0000000000 --- a/mods/MAPGEN/mcl_strongholds/init.lua +++ /dev/null @@ -1,106 +0,0 @@ --- Generate strongholds. - --- A total of 128 strongholds are generated in rings around the world origin. --- This is the list of rings, starting with the innermost ring first. -local stronghold_rings = { - -- amount: Number of strongholds in ring. - -- min, max: Minimum and maximum distance from (X=0, Z=0). - { amount = 3, min = 1408, max = 2688 }, - { amount = 6, min = 4480, max = 5760 }, - { amount = 10, min = 7552, max = 8832 }, - { amount = 15, min = 10624, max = 11904 }, - { amount = 21, min = 13696, max = 14976 }, - { amount = 28, min = 16768, max = 18048 }, - { amount = 36, min = 19840, max = 21120 }, - { amount = 9, min = 22912, max = 24192 }, -} - -local strongholds = {} -local strongholds_inited = false - -local mg_name = minetest.get_mapgen_setting("mg_name") -local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" - --- Determine the stronghold positions and store them into the strongholds table. --- The stronghold positions are based on the world seed. --- The actual position might be offset by a few blocks because it might be shifted --- to make sure the end portal room is completely within the boundaries of a mapchunk. -local function init_strongholds() - if strongholds_inited then - return - end - -- Don't generate strongholds in singlenode - if mg_name == "singlenode" then - strongholds_inited = true - return - end - local seed = tonumber(minetest.get_mapgen_setting("seed")) - local pr = PseudoRandom(seed) - for s=1, #stronghold_rings do - local ring = stronghold_rings[s] - - -- Get random angle - local angle = pr:next() - -- Scale angle to 0 .. 2*math.pi - angle = (angle / 32767) * (math.pi*2) - for a=1, ring.amount do - local dist = pr:next(ring.min, ring.max) - local y - if superflat then - y = mcl_vars.mg_bedrock_overworld_max + 3 - else - y = pr:next(mcl_vars.mg_bedrock_overworld_max+1, mcl_vars.mg_overworld_min+48) - end - local pos = { x = math.cos(angle) * dist, y = y, z = math.sin(angle) * dist } - pos = vector.round(pos) - table.insert(strongholds, { pos = pos, generated = false }) - - -- Rotate angle by (360 / amount) degrees. - -- This will cause the angles to be evenly distributed in the stronghold ring - angle = math.fmod(angle + ((math.pi*2) / ring.amount), math.pi*2) - end - end - - mcl_structures.register_structures("stronghold", table.copy(strongholds)) - - strongholds_inited = true -end - --- Stronghold generation for register_on_generated. -local function generate_strongholds(minp, maxp, blockseed) - local pr = PseudoRandom(blockseed) - for s=1, #strongholds do - if not strongholds[s].generated then - local pos = strongholds[s].pos - if minp.x <= pos.x and maxp.x >= pos.x and minp.z <= pos.z and maxp.z >= pos.z and minp.y <= pos.y and maxp.y >= pos.y then - -- Make sure the end portal room is completely within the current mapchunk - -- The original pos is changed intentionally. - if pos.x - 6 < minp.x then - pos.x = minp.x + 7 - end - if pos.x + 6 > maxp.x then - pos.x = maxp.x - 7 - end - if pos.y - 4 < minp.y then - pos.y = minp.y + 5 - end - if pos.y + 4 > maxp.y then - pos.y = maxp.y - 5 - end - if pos.z - 6 < minp.z then - pos.z = minp.z + 7 - end - if pos.z + 6 > maxp.z then - pos.z = maxp.z - 7 - end - - mcl_structures.call_struct(pos, "end_portal_shrine", nil, pr) - strongholds[s].generated = true - end - end - end -end - -init_strongholds() - -mcl_mapgen_core.register_generator("strongholds", nil, generate_strongholds, 999999) diff --git a/mods/MAPGEN/mcl_strongholds/mod.conf b/mods/MAPGEN/mcl_strongholds/mod.conf deleted file mode 100644 index 8edec9a515..0000000000 --- a/mods/MAPGEN/mcl_strongholds/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = mcl_strongholds -author = Wuzzy -description = Generates strongholds with end portals in the Overworld -depends = mcl_init, mcl_structures, mcl_mapgen_core diff --git a/mods/MAPGEN/mcl_villages/README.txt b/mods/MAPGEN/mcl_villages/README.txt deleted file mode 100644 index b266a131aa..0000000000 --- a/mods/MAPGEN/mcl_villages/README.txt +++ /dev/null @@ -1,45 +0,0 @@ -MCL_Villages: -============================ -A fork of Rochambeau's "Settlements" mod converted for use in MineClone2. - --------------- -Using the mod: --------------- -This mod adds settlements on world generation. - -And, in Creative Mode; also comes with a debug tool for spawning in villages. - - -------------- -MCL2 Credits: -------------- -Code forked from: https://github.com/MysticTempest/settlements/tree/mcl_villages - Commit: e24b4be -================================================================================ -Basic conversion of Settlements mod for compatibility with MineClone2, plus new schematics: MysticTempest - -Seed-based Village Generation, multi-threading, bugfixes: kay27 - - - -========================= -version: 0.1 alpha - -License of source code: WTFPL ------------------------------ -(c) Copyright Rochambeau (2018) - -This program is free software. It comes without any warranty, to -the extent permitted by applicable law. You can redistribute it -and/or modify it under the terms of the Do What The Fuck You Want -To Public License, Version 2, as published by Sam Hocevar. See -http://sam.zoy.org/wtfpl/COPYING for more details. - - -Credits: --------------- -This mod is based on "ruins" by BlockMen - -Completely new schematics for MineClone2: -MysticTempest - CC-BY-SA 4.0 - diff --git a/mods/MAPGEN/mcl_villages/buildings.lua b/mods/MAPGEN/mcl_villages/buildings.lua deleted file mode 100644 index 67a0785ce3..0000000000 --- a/mods/MAPGEN/mcl_villages/buildings.lua +++ /dev/null @@ -1,332 +0,0 @@ ---[[ -------------------------------------------------------------------------------- --- build schematic, replace material, rotation -------------------------------------------------------------------------------- -function settlements.build_schematic(vm, data, va, pos, building, replace_wall, name) - -- get building node material for better integration to surrounding - local platform_material = mcl_vars.get_node(pos) - if not platform_material or (platform_material.name == "air" or platform_material.name == "ignore") then - return - end - platform_material = platform_material.name - -- pick random material - local material = wallmaterial[math.random(1,#wallmaterial)] - -- schematic conversion to lua - local schem_lua = minetest.serialize_schematic(building, - "lua", - {lua_use_comments = false, lua_num_indent_spaces = 0}).." return schematic" - -- replace material - if replace_wall == "y" then - schem_lua = schem_lua:gsub("mcl_core:cobble", material) - end - schem_lua = schem_lua:gsub("mcl_core:dirt_with_grass", - platform_material) - --- Disable special junglewood for now. - -- special material for spawning npcs - -- schem_lua = schem_lua:gsub("mcl_core:junglewood", - -- "settlements:junglewood") --- - - -- format schematic string - local schematic = loadstring(schem_lua)() - -- build foundation for the building an make room above - local width = schematic["size"]["x"] - local depth = schematic["size"]["z"] - local height = schematic["size"]["y"] - local possible_rotations = {"0", "90", "180", "270"} - local rotation = possible_rotations[ math.random( #possible_rotations ) ] - settlements.foundation( - pos, - width, - depth, - height, - rotation) - vm:set_data(data) - -- place schematic - - minetest.place_schematic_on_vmanip( - vm, - pos, - schematic, - rotation, - nil, - true) - vm:write_to_map(true) -end]] -------------------------------------------------------------------------------- --- initialize settlement_info -------------------------------------------------------------------------------- -function settlements.initialize_settlement_info(pr) - local count_buildings = {} - - -- count_buildings table reset - for k,v in pairs(settlements.schematic_table) do - count_buildings[v["name"]] = 0 - end - - -- randomize number of buildings - local number_of_buildings = pr:next(10, 25) - local number_built = 1 - settlements.debug("Village ".. number_of_buildings) - - return count_buildings, number_of_buildings, number_built -end -------------------------------------------------------------------------------- --- fill settlement_info --------------------------------------------------------------------------------- -function settlements.create_site_plan(maxp, minp, pr) - local settlement_info = {} - local building_all_info - local possible_rotations = {"0", "90", "180", "270"} - -- find center of chunk - local center = { - x=math.floor((minp.x+maxp.x)/2), - y=maxp.y, - z=math.floor((minp.z+maxp.z)/2) - } - -- find center_surface of chunk - local center_surface , surface_material = settlements.find_surface(center, true) - local chunks = {} - chunks[mcl_vars.get_chunk_number(center)] = true - - -- go build settlement around center - if not center_surface then return false end - - -- initialize all settlement_info table - local count_buildings, number_of_buildings, number_built = settlements.initialize_settlement_info(pr) - -- first building is townhall in the center - building_all_info = settlements.schematic_table[1] - local rotation = possible_rotations[ pr:next(1, #possible_rotations ) ] - -- add to settlement info table - local index = 1 - settlement_info[index] = { - pos = center_surface, - name = building_all_info["name"], - hsize = building_all_info["hsize"], - rotat = rotation, - surface_mat = surface_material - } - --increase index for following buildings - index = index + 1 - -- now some buildings around in a circle, radius = size of town center - local x, z, r = center_surface.x, center_surface.z, building_all_info["hsize"] - -- draw j circles around center and increase radius by math.random(2,5) - for j = 1,20 do - -- set position on imaginary circle - for j = 0, 360, 15 do - local angle = j * math.pi / 180 - local ptx, ptz = x + r * math.cos( angle ), z + r * math.sin( angle ) - ptx = settlements.round(ptx, 0) - ptz = settlements.round(ptz, 0) - local pos1 = { x=ptx, y=center_surface.y+50, z=ptz} - local chunk_number = mcl_vars.get_chunk_number(pos1) - local pos_surface, surface_material - if chunks[chunk_number] then - pos_surface, surface_material = settlements.find_surface(pos1) - else - chunks[chunk_number] = true - pos_surface, surface_material = settlements.find_surface(pos1, true) - end - if not pos_surface then break end - - local randomized_schematic_table = shuffle(settlements.schematic_table, pr) - -- pick schematic - local size = #randomized_schematic_table - for i = size, 1, -1 do - -- already enough buildings of that type? - if count_buildings[randomized_schematic_table[i]["name"]] < randomized_schematic_table[i]["max_num"]*number_of_buildings then - building_all_info = randomized_schematic_table[i] - -- check distance to other buildings - local distance_to_other_buildings_ok = settlements.check_distance(settlement_info, pos_surface, building_all_info["hsize"]) - if distance_to_other_buildings_ok then - -- count built houses - count_buildings[building_all_info["name"]] = count_buildings[building_all_info["name"]] +1 - rotation = possible_rotations[ pr:next(1, #possible_rotations ) ] - number_built = number_built + 1 - settlement_info[index] = { - pos = pos_surface, - name = building_all_info["name"], - hsize = building_all_info["hsize"], - rotat = rotation, - surface_mat = surface_material - } - index = index + 1 - break - end - end - end - if number_of_buildings == number_built then - break - end - end - if number_built >= number_of_buildings then - break - end - r = r + pr:next(2,5) - end - settlements.debug("really ".. number_built) - return settlement_info -end -------------------------------------------------------------------------------- --- evaluate settlement_info and place schematics -------------------------------------------------------------------------------- --- Initialize node -local function construct_node(p1, p2, name) - local r = minetest.registered_nodes[name] - if r then - if r.on_construct then - local nodes = minetest.find_nodes_in_area(p1, p2, name) - for p=1, #nodes do - local pos = nodes[p] - r.on_construct(pos) - end - return nodes - end - minetest.log("warning", "[mcl_villages] No on_construct defined for node name " .. name) - return - end - minetest.log("warning", "[mcl_villages] Attempt to 'construct' inexistant nodes: " .. name) -end - -local function spawn_iron_golem(pos) - local p = minetest.find_node_near(pos,50,"mcl_core:grass_path") - if p then - local l=minetest.add_entity(p,"mobs_mc:iron_golem"):get_luaentity() - if l then - l._home = p - end - end -end - -local function spawn_villagers(minp,maxp) - local beds=minetest.find_nodes_in_area(vector.offset(minp,-20,-20,-20),vector.offset(maxp,20,20,20),{"mcl_beds:bed_red_bottom"}) - for _,bed in pairs(beds) do - local m = minetest.get_meta(bed) - if m:get_string("villager") == "" then - local v=minetest.add_entity(bed,"mobs_mc:villager") - if v then - local l=v:get_luaentity() - l._bed = bed - m:set_string("villager",l._id) - end - end - end -end - -local function init_nodes(p1, p2, size, rotation, pr) - construct_node(p1, p2, "mcl_itemframes:item_frame") - construct_node(p1, p2, "mcl_furnaces:furnace") - construct_node(p1, p2, "mcl_anvils:anvil") - - construct_node(p1, p2, "mcl_smoker:smoker") - construct_node(p1, p2, "mcl_barrels:barrel_closed") - construct_node(p1, p2, "mcl_blast_furnace:blast_furnace") - construct_node(p1, p2, "mcl_brewing:stand_000") - local nodes = construct_node(p1, p2, "mcl_chests:chest") - if nodes and #nodes > 0 then - for p=1, #nodes do - local pos = nodes[p] - settlements.fill_chest(pos, pr) - end - end -end - -function settlements.place_schematics(settlement_info, pr) - local building_all_info - - --attempt to place one belltower in the center of the village - this doesn't always work out great but it's a lot better than doing it first or last. - local belltower = table.remove(settlement_info,math.floor(#settlement_info/2)) - if belltower then - mcl_structures.place_schematic( - vector.offset(belltower["pos"],0,0,0), - settlements.modpath.."/schematics/belltower.mts", - belltower["rotation"], - nil, - true, - nil, - function(p1, p2, size, rotation, pr) - spawn_iron_golem(p1) - end, - pr - ) - end - - for i, built_house in ipairs(settlement_info) do - local is_last = i == #settlement_info - - for j, schem in ipairs(settlements.schematic_table) do - if settlement_info[i]["name"] == schem["name"] then - building_all_info = schem - break - end - end - - local pos = settlement_info[i]["pos"] - local rotation = settlement_info[i]["rotat"] - -- get building node material for better integration to surrounding - local platform_material = settlement_info[i]["surface_mat"] - --platform_material_name = minetest.get_name_from_content_id(platform_material) - -- pick random material - --local material = wallmaterial[pr:next(1,#wallmaterial)] - -- - local building = building_all_info["mts"] - local replace_wall = building_all_info["rplc"] - -- schematic conversion to lua - local schem_lua = minetest.serialize_schematic(building, - "lua", - {lua_use_comments = false, lua_num_indent_spaces = 0}).." return schematic" - schem_lua = schem_lua:gsub("mcl_core:stonebrickcarved", "mcl_villages:stonebrickcarved") - -- replace material - if replace_wall then - --Note, block substitution isn't matching node names exactly; so nodes that are to be substituted that have the same prefixes cause bugs. - -- Example: Attempting to swap out 'mcl_core:stonebrick'; which has multiple, additional sub-variants: (carved, cracked, mossy). Will currently cause issues, so leaving disabled. - if platform_material == "mcl_core:snow" or platform_material == "mcl_core:dirt_with_grass_snow" or platform_material == "mcl_core:podzol" then - schem_lua = schem_lua:gsub("mcl_core:tree", "mcl_core:sprucetree") - schem_lua = schem_lua:gsub("mcl_core:wood", "mcl_core:sprucewood") - --schem_lua = schem_lua:gsub("mcl_fences:fence", "mcl_fences:spruce_fence") - --schem_lua = schem_lua:gsub("mcl_stairs:slab_wood_top", "mcl_stairs:slab_sprucewood_top") - --schem_lua = schem_lua:gsub("mcl_stairs:stair_wood", "mcl_stairs:stair_sprucewood") - --schem_lua = schem_lua:gsub("mesecons_pressureplates:pressure_plate_wood_off", "mesecons_pressureplates:pressure_plate_sprucewood_off") - elseif platform_material == "mcl_core:sand" or platform_material == "mcl_core:redsand" then - schem_lua = schem_lua:gsub("mcl_core:tree", "mcl_core:sandstonecarved") - schem_lua = schem_lua:gsub("mcl_core:cobble", "mcl_core:sandstone") - schem_lua = schem_lua:gsub("mcl_core:wood", "mcl_core:sandstonesmooth") - --schem_lua = schem_lua:gsub("mcl_fences:fence", "mcl_fences:birch_fence") - --schem_lua = schem_lua:gsub("mcl_stairs:slab_wood_top", "mcl_stairs:slab_birchwood_top") - --schem_lua = schem_lua:gsub("mcl_stairs:stair_wood", "mcl_stairs:stair_birchwood") - --schem_lua = schem_lua:gsub("mesecons_pressureplates:pressure_plate_wood_off", "mesecons_pressureplates:pressure_plate_birchwood_off") - --schem_lua = schem_lua:gsub("mcl_stairs:stair_stonebrick", "mcl_stairs:stair_redsandstone") - --schem_lua = schem_lua:gsub("mcl_core:stonebrick", "mcl_core:redsandstonesmooth") - schem_lua = schem_lua:gsub("mcl_core:brick_block", "mcl_core:redsandstone") - end - end - schem_lua = schem_lua:gsub("mcl_core:dirt_with_grass", platform_material) - - --[[ Disable special junglewood for now. - -- special material for spawning npcs - schem_lua = schem_lua:gsub("mcl_core:junglewood", "settlements:junglewood") - --]] - - schem_lua = schem_lua:gsub("mcl_stairs:stair_wood_outer", "mcl_stairs:slab_wood") - schem_lua = schem_lua:gsub("mcl_stairs:stair_stone_rough_outer", "air") - - -- format schematic string - local schematic = loadstring(schem_lua)() - -- build foundation for the building an make room above - -- place schematic - mcl_structures.place_schematic( - pos, - schematic, - rotation, - nil, - true, - nil, - function(p1, p2, size, rotation, pr) - init_nodes(p1, p2, size, rotation, pr) - spawn_villagers(p1,p2) - end, - pr - ) - end -end diff --git a/mods/MAPGEN/mcl_villages/const.lua b/mods/MAPGEN/mcl_villages/const.lua deleted file mode 100644 index 65f43f3445..0000000000 --- a/mods/MAPGEN/mcl_villages/const.lua +++ /dev/null @@ -1,76 +0,0 @@ --- switch for debugging -function settlements.debug(message) - -- minetest.chat_send_all(message) - -- minetest.log("warning", "[mcl_villages] "..message) - minetest.log("verbose", "[mcl_villages] "..message) -end - ---[[ Manually set in 'buildings.lua' --- material to replace cobblestone with -local wallmaterial = { - "mcl_core:junglewood", - "mcl_core:sprucewood", - "mcl_core:wood", - "mcl_core:birchwood", - "mcl_core:acaciawood", - "mcl_core:stonebrick", - "mcl_core:cobble", - "mcl_core:sandstonecarved", - "mcl_core:sandstone", - "mcl_core:sandstonesmooth2" -} ---]] -settlements.surface_mat = {} -------------------------------------------------------------------------------- --- Set array to list --- https://stackoverflow.com/questions/656199/search-for-an-item-in-a-lua-list -------------------------------------------------------------------------------- -function settlements.grundstellungen() - settlements.surface_mat = settlements.Set { - "mcl_core:dirt_with_grass", - --"mcl_core:dry_dirt_with_grass", - "mcl_core:dirt_with_grass_snow", - --"mcl_core:dirt_with_dry_grass", - "mcl_core:podzol", - "mcl_core:sand", - "mcl_core:redsand", - --"mcl_core:silver_sand", - "mcl_core:snow" - } -end --- --- possible surfaces where buildings can be built --- - --- --- path to schematics --- -schem_path = settlements.modpath.."/schematics/" --- --- list of schematics --- -local basic_pseudobiome_villages = minetest.settings:get_bool("basic_pseudobiome_villages", true) - -settlements.schematic_table = { - {name = "large_house", mts = schem_path.."large_house.mts", hwidth = 11, hdepth = 12, hheight = 9, hsize = 14, max_num = 0.08 , rplc = basic_pseudobiome_villages }, - {name = "blacksmith", mts = schem_path.."blacksmith.mts", hwidth = 7, hdepth = 7, hheight = 13, hsize = 13, max_num = 0.055, rplc = basic_pseudobiome_villages }, - {name = "butcher", mts = schem_path.."butcher.mts", hwidth = 11, hdepth = 8, hheight = 10, hsize = 14, max_num = 0.03 , rplc = basic_pseudobiome_villages }, - {name = "church", mts = schem_path.."church.mts", hwidth = 13, hdepth = 13, hheight = 14, hsize = 15, max_num = 0.04 , rplc = basic_pseudobiome_villages }, - {name = "farm", mts = schem_path.."farm.mts", hwidth = 7, hdepth = 7, hheight = 13, hsize = 13, max_num = 0.1 , rplc = basic_pseudobiome_villages }, - {name = "lamp", mts = schem_path.."lamp.mts", hwidth = 3, hdepth = 3, hheight = 13, hsize = 10, max_num = 0.1 , rplc = false }, - {name = "library", mts = schem_path.."library.mts", hwidth = 12, hdepth = 12, hheight = 8, hsize = 13, max_num = 0.04 , rplc = basic_pseudobiome_villages }, - {name = "medium_house", mts = schem_path.."medium_house.mts", hwidth = 8, hdepth = 12, hheight = 8, hsize = 14, max_num = 0.08 , rplc = basic_pseudobiome_villages }, - {name = "small_house", mts = schem_path.."small_house.mts", hwidth = 9, hdepth = 7, hheight = 8, hsize = 13, max_num = 0.7 , rplc = basic_pseudobiome_villages }, - {name = "tavern", mts = schem_path.."tavern.mts", hwidth = 11, hdepth = 10, hheight = 10, hsize = 13, max_num = 0.050, rplc = basic_pseudobiome_villages }, - {name = "well", mts = schem_path.."well.mts", hwidth = 6, hdepth = 8, hheight = 6, hsize = 10, max_num = 0.045, rplc = basic_pseudobiome_villages }, -} - --- --- maximum allowed difference in height for building a sttlement --- -max_height_difference = 56 --- --- --- -half_map_chunk_size = 40 ---quarter_map_chunk_size = 20 diff --git a/mods/MAPGEN/mcl_villages/foundation.lua b/mods/MAPGEN/mcl_villages/foundation.lua deleted file mode 100644 index 71c5cfdda4..0000000000 --- a/mods/MAPGEN/mcl_villages/foundation.lua +++ /dev/null @@ -1,65 +0,0 @@ -------------------------------------------------------------------------------- --- function to fill empty space below baseplate when building on a hill -------------------------------------------------------------------------------- -function settlements.ground(pos, pr) -- role model: Wendelsteinkircherl, Brannenburg - local p2 = vector.new(pos) - local cnt = 0 - local mat = "mcl_core:dirt" - p2.y = p2.y-1 - while true do - cnt = cnt+1 - if cnt > 20 then break end - if cnt>pr:next(2,4) then - mat = "mcl_core:stone" - end - minetest.swap_node(p2, {name=mat}) - p2.y = p2.y-1 - end -end -------------------------------------------------------------------------------- --- function clear space above baseplate -------------------------------------------------------------------------------- -function settlements.terraform(settlement_info, pr) - local fheight, fwidth, fdepth, schematic_data - - for i, built_house in ipairs(settlement_info) do - -- pick right schematic_info to current built_house - for j, schem in ipairs(settlements.schematic_table) do - if settlement_info[i]["name"] == schem["name"] then - schematic_data = schem - break - end - end - local pos = settlement_info[i]["pos"] - if settlement_info[i]["rotat"] == "0" or settlement_info[i]["rotat"] == "180" then - fwidth = schematic_data["hwidth"] - fdepth = schematic_data["hdepth"] - else - fwidth = schematic_data["hdepth"] - fdepth = schematic_data["hwidth"] - end - --fheight = schematic_data["hheight"] * 3 -- remove trees and leaves above - fheight = schematic_data["hheight"] -- remove trees and leaves above - -- - -- now that every info is available -> create platform and clear space above - -- - for xi = 0,fwidth-1 do - for zi = 0,fdepth-1 do - for yi = 0,fheight *3 do - if yi == 0 then - local p = {x=pos.x+xi, y=pos.y, z=pos.z+zi} - settlements.ground(p, pr) - else - -- write ground --- local p = {x=pos.x+xi, y=pos.y+yi, z=pos.z+zi} --- local node = mcl_vars.get_node(p) --- if node and node.name ~= "air" then --- minetest.swap_node(p,{name="air"}) --- end - minetest.swap_node({x=pos.x+xi, y=pos.y+yi, z=pos.z+zi},{name="air"}) - end - end - end - end - end -end diff --git a/mods/MAPGEN/mcl_villages/init.lua b/mods/MAPGEN/mcl_villages/init.lua deleted file mode 100644 index 79a6e37cf4..0000000000 --- a/mods/MAPGEN/mcl_villages/init.lua +++ /dev/null @@ -1,127 +0,0 @@ -settlements = {} -settlements.modpath = minetest.get_modpath(minetest.get_current_modname()) - -dofile(settlements.modpath.."/const.lua") -dofile(settlements.modpath.."/utils.lua") -dofile(settlements.modpath.."/foundation.lua") -dofile(settlements.modpath.."/buildings.lua") -dofile(settlements.modpath.."/paths.lua") ---dofile(settlements.modpath.."/convert_lua_mts.lua") --- --- load settlements on server --- -settlements.grundstellungen() - - -local villagegen={} --- --- register block for npc spawn --- -minetest.register_node("mcl_villages:stonebrickcarved", { - description = ("Chiseled Stone Village Bricks"), - _doc_items_longdesc = doc.sub.items.temp.build, - tiles = {"mcl_core_stonebrick_carved.png"}, - drop = "mcl_core:stonebrickcarved", - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1}, - sounds = mcl_sounds.node_sound_stone_defaults(), - is_ground_content = false, - _mcl_blast_resistance = 6, - _mcl_hardness = 1.5, -}) - -minetest.register_node("mcl_villages:structblock", {drawtype="airlike",groups = {not_in_creative_inventory=1},}) - - - ---[[ Enable for testing, but use MineClone2's own spawn code if/when merging. --- --- register inhabitants --- -if minetest.get_modpath("mobs_mc") then - mcl_mobs:register_spawn("mobs_mc:villager", --name - {"mcl_core:stonebrickcarved"}, --nodes - 15, --max_light - 0, --min_light - 20, --chance - 7, --active_object_count - 31000, --max_height - nil) --day_toggle -end ---]] - --- --- on map generation, try to build a settlement --- -local function build_a_settlement(minp, maxp, blockseed) - local pr = PseudoRandom(blockseed) - - -- fill settlement_info with buildings and their data - local settlement_info = settlements.create_site_plan(maxp, minp, pr) - if not settlement_info then return end - - -- evaluate settlement_info and prepair terrain - settlements.terraform(settlement_info, pr) - - -- evaluate settlement_info and build paths between buildings - settlements.paths(settlement_info) - - -- evaluate settlement_info and place schematics - settlements.place_schematics(settlement_info, pr) -end - -local function ecb_village(blockpos, action, calls_remaining, param) - if calls_remaining >= 1 then return end - local minp, maxp, blockseed = param.minp, param.maxp, param.blockseed - build_a_settlement(minp, maxp, blockseed) -end - --- Disable natural generation in singlenode. -local mg_name = minetest.get_mapgen_setting("mg_name") -if mg_name ~= "singlenode" then - mcl_mapgen_core.register_generator("villages", nil, function(minp, maxp, blockseed) - -- don't build settlement underground - if maxp.y < 0 then return end - -- randomly try to build settlements - if blockseed % 77 ~= 17 then return end - -- needed for manual and automated settlement building - -- don't build settlements on (too) uneven terrain - local n=minetest.get_node_or_nil(minp) - if n and n.name == "mcl_villages:structblock" then return end - if villagegen[minetest.pos_to_string(minp)] ~= nil then return end - minetest.set_node(minp,{name="mcl_villages:structblock"}) - - local height_difference = settlements.evaluate_heightmap() - if height_difference > max_height_difference then return end - - villagegen[minetest.pos_to_string(minp)]={minp=vector.new(minp), maxp=vector.new(maxp), blockseed=blockseed} - end) -end - -minetest.register_lbm({ - name = "mcl_villages:structblock", - run_at_every_load = true, - nodenames = {"mcl_villages:structblock"}, - action = function(pos, node) - minetest.set_node(pos, {name = "air"}) - if not villagegen[minetest.pos_to_string(pos)] then return end - local minp=villagegen[minetest.pos_to_string(pos)].minp - local maxp=villagegen[minetest.pos_to_string(pos)].maxp - minetest.emerge_area(minp, maxp, ecb_village, villagegen[minetest.pos_to_string(minp)]) - villagegen[minetest.pos_to_string(minp)]=nil - end -}) --- manually place villages -if minetest.is_creative_enabled("") then - minetest.register_craftitem("mcl_villages:tool", { - description = "mcl_villages build tool", - inventory_image = "default_tool_woodshovel.png", - -- build ssettlement - on_place = function(itemstack, placer, pointed_thing) - if not pointed_thing.under then return end - local minp = vector.subtract( pointed_thing.under, half_map_chunk_size) - local maxp = vector.add( pointed_thing.under, half_map_chunk_size) - build_a_settlement(minp, maxp, math.random(0,32767)) - end - }) - mcl_wip.register_experimental_item("mcl_villages:tool") -end diff --git a/mods/MAPGEN/mcl_villages/mod.conf b/mods/MAPGEN/mcl_villages/mod.conf deleted file mode 100644 index d8e2aa7d4c..0000000000 --- a/mods/MAPGEN/mcl_villages/mod.conf +++ /dev/null @@ -1,5 +0,0 @@ -name = mcl_villages -author = Rochambeau -description = This mod adds settlements on world generation. -depends = mcl_util, mcl_mapgen_core, mcl_structures, mcl_core, mcl_loot -optional_depends = mcl_farming, mobs_mc diff --git a/mods/MAPGEN/mcl_villages/paths.lua b/mods/MAPGEN/mcl_villages/paths.lua deleted file mode 100644 index 63f2ba1468..0000000000 --- a/mods/MAPGEN/mcl_villages/paths.lua +++ /dev/null @@ -1,91 +0,0 @@ -------------------------------------------------------------------------------- --- generate paths between buildings -------------------------------------------------------------------------------- -function settlements.paths(settlement_info) - local starting_point - local end_point - local distance - --for k,v in pairs(settlement_info) do - starting_point = settlement_info[1]["pos"] - for o,p in pairs(settlement_info) do - - end_point = settlement_info[o]["pos"] - if starting_point ~= end_point - then - -- loop until end_point is reched (distance == 0) - while true do - - -- define surrounding pos to starting_point - local north_p = {x=starting_point.x+1, y=starting_point.y, z=starting_point.z} - local south_p = {x=starting_point.x-1, y=starting_point.y, z=starting_point.z} - local west_p = {x=starting_point.x, y=starting_point.y, z=starting_point.z+1} - local east_p = {x=starting_point.x, y=starting_point.y, z=starting_point.z-1} - -- measure distance to end_point - local dist_north_p_to_end = math.sqrt( - ((north_p.x - end_point.x)*(north_p.x - end_point.x))+ - ((north_p.z - end_point.z)*(north_p.z - end_point.z)) - ) - local dist_south_p_to_end = math.sqrt( - ((south_p.x - end_point.x)*(south_p.x - end_point.x))+ - ((south_p.z - end_point.z)*(south_p.z - end_point.z)) - ) - local dist_west_p_to_end = math.sqrt( - ((west_p.x - end_point.x)*(west_p.x - end_point.x))+ - ((west_p.z - end_point.z)*(west_p.z - end_point.z)) - ) - local dist_east_p_to_end = math.sqrt( - ((east_p.x - end_point.x)*(east_p.x - end_point.x))+ - ((east_p.z - end_point.z)*(east_p.z - end_point.z)) - ) - -- evaluate which pos is closer to the end_point - if dist_north_p_to_end <= dist_south_p_to_end and - dist_north_p_to_end <= dist_west_p_to_end and - dist_north_p_to_end <= dist_east_p_to_end - then - starting_point = north_p - distance = dist_north_p_to_end - - elseif dist_south_p_to_end <= dist_north_p_to_end and - dist_south_p_to_end <= dist_west_p_to_end and - dist_south_p_to_end <= dist_east_p_to_end - then - starting_point = south_p - distance = dist_south_p_to_end - - elseif dist_west_p_to_end <= dist_north_p_to_end and - dist_west_p_to_end <= dist_south_p_to_end and - dist_west_p_to_end <= dist_east_p_to_end - then - starting_point = west_p - distance = dist_west_p_to_end - - elseif dist_east_p_to_end <= dist_north_p_to_end and - dist_east_p_to_end <= dist_south_p_to_end and - dist_east_p_to_end <= dist_west_p_to_end - then - starting_point = east_p - distance = dist_east_p_to_end - end - -- find surface of new starting point - local surface_point, surface_mat = settlements.find_surface(starting_point) - -- replace surface node with mcl_core:grass_path - if surface_point - then - if surface_mat == "mcl_core:sand" or surface_mat == "mcl_core:redsand" then - minetest.swap_node(surface_point,{name="mcl_core:sandstonesmooth2"}) - else - minetest.swap_node(surface_point,{name="mcl_core:grass_path"}) - end - -- don't set y coordinate, surface might be too low or high - starting_point.x = surface_point.x - starting_point.z = surface_point.z - end - if distance <= 1 or - starting_point == end_point - then - break - end - end - end - end -end diff --git a/mods/MAPGEN/mcl_villages/schematics/belltower.mts b/mods/MAPGEN/mcl_villages/schematics/belltower.mts deleted file mode 100644 index 8eb524312c..0000000000 Binary files a/mods/MAPGEN/mcl_villages/schematics/belltower.mts and /dev/null differ diff --git a/mods/MAPGEN/mcl_villages/schematics/blacksmith.mts b/mods/MAPGEN/mcl_villages/schematics/blacksmith.mts deleted file mode 100644 index dab65afa47..0000000000 Binary files a/mods/MAPGEN/mcl_villages/schematics/blacksmith.mts and /dev/null differ diff --git a/mods/MAPGEN/mcl_villages/schematics/butcher.mts b/mods/MAPGEN/mcl_villages/schematics/butcher.mts deleted file mode 100644 index 1786599dcc..0000000000 Binary files a/mods/MAPGEN/mcl_villages/schematics/butcher.mts and /dev/null differ diff --git a/mods/MAPGEN/mcl_villages/schematics/church.mts b/mods/MAPGEN/mcl_villages/schematics/church.mts deleted file mode 100644 index e59f90f1f8..0000000000 Binary files a/mods/MAPGEN/mcl_villages/schematics/church.mts and /dev/null differ diff --git a/mods/MAPGEN/mcl_villages/schematics/farm.mts b/mods/MAPGEN/mcl_villages/schematics/farm.mts deleted file mode 100644 index b45ff1d6f3..0000000000 Binary files a/mods/MAPGEN/mcl_villages/schematics/farm.mts and /dev/null differ diff --git a/mods/MAPGEN/mcl_villages/schematics/lamp.mts b/mods/MAPGEN/mcl_villages/schematics/lamp.mts deleted file mode 100644 index 8da0e83557..0000000000 Binary files a/mods/MAPGEN/mcl_villages/schematics/lamp.mts and /dev/null differ diff --git a/mods/MAPGEN/mcl_villages/schematics/large_house.mts b/mods/MAPGEN/mcl_villages/schematics/large_house.mts deleted file mode 100644 index 3939a2c434..0000000000 Binary files a/mods/MAPGEN/mcl_villages/schematics/large_house.mts and /dev/null differ diff --git a/mods/MAPGEN/mcl_villages/schematics/library.mts b/mods/MAPGEN/mcl_villages/schematics/library.mts deleted file mode 100644 index 521ee9fb60..0000000000 Binary files a/mods/MAPGEN/mcl_villages/schematics/library.mts and /dev/null differ diff --git a/mods/MAPGEN/mcl_villages/schematics/medium_house.mts b/mods/MAPGEN/mcl_villages/schematics/medium_house.mts deleted file mode 100644 index fa859ac484..0000000000 Binary files a/mods/MAPGEN/mcl_villages/schematics/medium_house.mts and /dev/null differ diff --git a/mods/MAPGEN/mcl_villages/schematics/small_house.mts b/mods/MAPGEN/mcl_villages/schematics/small_house.mts deleted file mode 100644 index a3789504ee..0000000000 Binary files a/mods/MAPGEN/mcl_villages/schematics/small_house.mts and /dev/null differ diff --git a/mods/MAPGEN/mcl_villages/schematics/tavern.mts b/mods/MAPGEN/mcl_villages/schematics/tavern.mts deleted file mode 100644 index c26c14dbcc..0000000000 Binary files a/mods/MAPGEN/mcl_villages/schematics/tavern.mts and /dev/null differ diff --git a/mods/MAPGEN/mcl_villages/schematics/well.mts b/mods/MAPGEN/mcl_villages/schematics/well.mts deleted file mode 100644 index ff8785fdee..0000000000 Binary files a/mods/MAPGEN/mcl_villages/schematics/well.mts and /dev/null differ diff --git a/mods/MAPGEN/mcl_villages/utils.lua b/mods/MAPGEN/mcl_villages/utils.lua deleted file mode 100644 index 4ee2ccfbf0..0000000000 --- a/mods/MAPGEN/mcl_villages/utils.lua +++ /dev/null @@ -1,232 +0,0 @@ -local get_node = mcl_vars.get_node - -------------------------------------------------------------------------------- --- function to copy tables -------------------------------------------------------------------------------- -function settlements.shallowCopy(original) - local copy = {} - for key, value in pairs(original) do - copy[key] = value - end - return copy -end --- --- --- -function settlements.round(num, numDecimalPlaces) - local mult = 10^(numDecimalPlaces or 0) - return math.floor(num * mult + 0.5) / mult -end - -------------------------------------------------------------------------------- --- function to find surface block y coordinate --- returns surface postion -------------------------------------------------------------------------------- -function settlements.find_surface(pos, wait) - local p6 = vector.new(pos) - local cnt = 0 - local itter = 1 -- count up or down - local cnt_max = 200 - -- check, in which direction to look for surface - local surface_node - if wait then - surface_node = get_node(p6, true, 10000000) - else - surface_node = get_node(p6) - end - if surface_node.name=="air" or surface_node.name=="ignore" then - itter = -1 - end - -- go through nodes an find surface - while cnt < cnt_max do - -- Check Surface_node and Node above - -- - if settlements.surface_mat[surface_node.name] then - local surface_node_plus_1 = get_node({ x=p6.x, y=p6.y+1, z=p6.z}) - if surface_node_plus_1 and surface_node and - (string.find(surface_node_plus_1.name,"air") or - string.find(surface_node_plus_1.name,"snow") or - string.find(surface_node_plus_1.name,"fern") or - string.find(surface_node_plus_1.name,"flower") or - string.find(surface_node_plus_1.name,"bush") or - string.find(surface_node_plus_1.name,"tree") or - string.find(surface_node_plus_1.name,"grass")) - then - settlements.debug("find_surface7: " ..surface_node.name.. " " .. surface_node_plus_1.name) - return p6, surface_node.name - else - settlements.debug("find_surface2: wrong surface+1") - end - else - settlements.debug("find_surface3: wrong surface "..surface_node.name.." at pos "..minetest.pos_to_string(p6)) - end - - p6.y = p6.y + itter - if p6.y < 0 then - settlements.debug("find_surface4: y<0") - return nil - end - cnt = cnt+1 - surface_node = get_node(p6) - end - settlements.debug("find_surface5: cnt_max overflow") - return nil -end -------------------------------------------------------------------------------- --- check distance for new building -------------------------------------------------------------------------------- -function settlements.check_distance(settlement_info, building_pos, building_size) - local distance - for i, built_house in ipairs(settlement_info) do - distance = math.sqrt( - ((building_pos.x - built_house["pos"].x)*(building_pos.x - built_house["pos"].x))+ - ((building_pos.z - built_house["pos"].z)*(building_pos.z - built_house["pos"].z))) - if distance < building_size or distance < built_house["hsize"] then - return false - end - end - return true -end -------------------------------------------------------------------------------- --- fill chests -------------------------------------------------------------------------------- -function settlements.fill_chest(pos, pr) - -- initialize chest (mts chests don't have meta) - local meta = minetest.get_meta(pos) - if meta:get_string("infotext") ~= "Chest" then - -- For MineClone2 0.70 or before - -- minetest.registered_nodes["mcl_chests:chest"].on_construct(pos) - -- - -- For MineClone2 after commit 09ab1482b5 (the new entity chests) - minetest.registered_nodes["mcl_chests:chest_small"].on_construct(pos) - end - -- fill chest - local inv = minetest.get_inventory( {type="node", pos=pos} ) - - local function get_treasures(prand) - local loottable = {{ - stacks_min = 3, - stacks_max = 8, - items = { - { itemstring = "mcl_core:diamond", weight = 3, amount_min = 1, amount_max = 3 }, - { itemstring = "mcl_core:iron_ingot", weight = 10, amount_min = 1, amount_max = 5 }, - { itemstring = "mcl_core:gold_ingot", weight = 5, amount_min = 1, amount_max = 3 }, - { itemstring = "mcl_farming:bread", weight = 15, amount_min = 1, amount_max = 3 }, - { itemstring = "mcl_core:apple", weight = 15, amount_min = 1, amount_max = 3 }, - { itemstring = "mcl_tools:pick_iron", weight = 5 }, - { itemstring = "mcl_tools:sword_iron", weight = 5 }, - { itemstring = "mcl_armor:chestplate_iron", weight = 5 }, - { itemstring = "mcl_armor:helmet_iron", weight = 5 }, - { itemstring = "mcl_armor:leggings_iron", weight = 5 }, - { itemstring = "mcl_armor:boots_iron", weight = 5 }, - { itemstring = "mcl_core:obsidian", weight = 5, amount_min = 3, amount_max = 7 }, - { itemstring = "mcl_core:sapling", weight = 5, amount_min = 3, amount_max = 7 }, - { itemstring = "mcl_mobitems:saddle", weight = 3 }, - { itemstring = "mcl_mobitems:iron_horse_armor", weight = 1 }, - { itemstring = "mcl_mobitems:gold_horse_armor", weight = 1 }, - { itemstring = "mcl_mobitems:diamond_horse_armor", weight = 1 }, - } - }} - local items = mcl_loot.get_multi_loot(loottable, prand) - return items - end - - local items = get_treasures(pr) - mcl_loot.fill_inventory(inv, "main", items, pr) -end - -------------------------------------------------------------------------------- --- initialize furnace -------------------------------------------------------------------------------- -function settlements.initialize_furnace(pos) - -- find chests within radius - local furnacepos = minetest.find_node_near(pos, - 7, --radius - {"mcl_furnaces:furnace"}) - -- initialize furnacepos (mts furnacepos don't have meta) - if furnacepos - then - local meta = minetest.get_meta(furnacepos) - if meta:get_string("infotext") ~= "furnace" - then - minetest.registered_nodes["mcl_furnaces:furnace"].on_construct(furnacepos) - end - end -end -------------------------------------------------------------------------------- --- initialize anvil -------------------------------------------------------------------------------- -function settlements.initialize_anvil(pos) - -- find chests within radius - local anvilpos = minetest.find_node_near(pos, - 7, --radius - {"mcl_anvils:anvil"}) - -- initialize anvilpos (mts anvilpos don't have meta) - if anvilpos - then - local meta = minetest.get_meta(anvilpos) - if meta:get_string("infotext") ~= "anvil" - then - minetest.registered_nodes["mcl_anvils:anvil"].on_construct(anvilpos) - end - end -end -------------------------------------------------------------------------------- --- randomize table -------------------------------------------------------------------------------- -function shuffle(tbl, pr) - local table = settlements.shallowCopy(tbl) - local size = #table - for i = size, 1, -1 do - local rand = pr:next(1, size) - table[i], table[rand] = table[rand], table[i] - end - return table -end -------------------------------------------------------------------------------- --- evaluate heightmap -------------------------------------------------------------------------------- -function settlements.evaluate_heightmap() - local heightmap = minetest.get_mapgen_object("heightmap") - -- max height and min height, initialize with impossible values for easier first time setting - local max_y = -50000 - local min_y = 50000 - -- only evaluate the center square of heightmap 40 x 40 - local square_start = 1621 - local square_end = 1661 - for j = 1 , 40, 1 do - for i = square_start, square_end, 1 do - -- skip buggy heightmaps, return high value - if heightmap[i] == -31000 or heightmap[i] == 31000 then - return max_height_difference + 1 - end - if heightmap[i] < min_y then - min_y = heightmap[i] - end - if heightmap[i] > max_y then - max_y = heightmap[i] - end - end - -- set next line - square_start = square_start + 80 - square_end = square_end + 80 - end - -- return the difference between highest and lowest pos in chunk - local height_diff = max_y - min_y - -- filter buggy heightmaps - if height_diff <= 1 then - return max_height_difference + 1 - end - -- debug info - settlements.debug("heightdiff ".. height_diff) - return height_diff -end -------------------------------------------------------------------------------- --- Set array to list --- https://stackoverflow.com/questions/656199/search-for-an-item-in-a-lua-list -------------------------------------------------------------------------------- -function settlements.Set (list) - local set = {} - for _, l in ipairs(list) do set[l] = true end - return set -end diff --git a/mods/MAPGEN/tsm_railcorridors/README.md b/mods/MAPGEN/tsm_railcorridors/README.md deleted file mode 100644 index de9df489e6..0000000000 --- a/mods/MAPGEN/tsm_railcorridors/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Railway corridors [`tsm_railcorridors`] -MineClone 2 adaption. NO TREASURER SUPPORT! - -* Current version 0.14.0 - -Minetest mod for adding underground corridors with rails and wood constructions with a few treasure chests now and then. -Optional support for the Treasurer mod is available for adding treasures from various mods. -Cobwebs are added if the `mobs_monster` mod is found. - -Use the advanced settings to finetune the railway corridors. - -* Forum thread: https://forum.minetest.net/viewtopic.php?t=10339 -* License: MIT License. - -## Info for game makers -Want to include this mod in a game, but you have problems with the dependencies? -Edit `gameconfig.lua` to fit your needs. :-) diff --git a/mods/MAPGEN/tsm_railcorridors/gameconfig.lua b/mods/MAPGEN/tsm_railcorridors/gameconfig.lua deleted file mode 100644 index de4b181199..0000000000 --- a/mods/MAPGEN/tsm_railcorridors/gameconfig.lua +++ /dev/null @@ -1,130 +0,0 @@ --- This file stores the various node types. This makes it easier to plug this mod into games --- in which you need to change the node names. - --- Adapted for MineClone 2! - --- Node names (Don't use aliases!) -tsm_railcorridors.nodes = { - dirt = "mcl_core:dirt", - chest = "mcl_chests:chest", - rail = "mcl_minecarts:rail", - torch_floor = "mcl_torches:torch", - torch_wall = "mcl_torches:torch_wall", - cobweb = "mcl_core:cobweb", - spawner = "mcl_mobspawners:spawner", -} - -local mg_name = minetest.get_mapgen_setting("mg_name") - -if mg_name == "v6" then - -- In v6, wood is chosen randomly. - --[[ Wood types for the corridors. Corridors are made out of full wood blocks - and posts. For each corridor system, a random wood type is chosen with the chance - specified in per mille. ]] - tsm_railcorridors.nodes.corridor_woods = { - { wood = "mcl_core:wood", post = "mcl_fences:fence", chance = 900}, - { wood = "mcl_core:darkwood", post = "mcl_fences:dark_oak_fence", chance = 100}, - } -else - -- This generates dark oak wood in mesa biomes and oak wood everywhere else. - function tsm_railcorridors.nodes.corridor_woods_function(pos, node) - if minetest.get_item_group(node.name, "hardened_clay") ~= 0 then - return "mcl_core:darkwood", "mcl_fences:dark_oak_fence" - else - return "mcl_core:wood", "mcl_fences:fence" - end - end -end - - --- TODO: Use minecart with chest instead of normal minecart -tsm_railcorridors.carts = { "mcl_minecarts:minecart" } - -function tsm_railcorridors.on_construct_cart(pos, cart) - -- TODO: Fill cart with treasures -end - --- Fallback function. Returns a random treasure. This function is called for chests --- only if the Treasurer mod is not found. --- pr: A PseudoRandom object -function tsm_railcorridors.get_default_treasure(pr) - -- UNUSED IN MINECLONE 2! -end - --- All spawners spawn cave spiders -function tsm_railcorridors.on_construct_spawner(pos) - mcl_mobspawners.setup_spawner(pos, "mobs_mc:cave_spider", 0, 7) -end - --- MineClone 2's treasure function. Gets all treasures for a single chest. --- Based on information from Minecraft Wiki. -function tsm_railcorridors.get_treasures(pr) - local loottable = { - { - stacks_min = 1, - stacks_max = 1, - items = { - { itemstring = "mcl_mobs:nametag", weight = 30 }, - { itemstring = "mcl_core:apple_gold", weight = 20 }, - { itemstring = "mcl_books:book", weight = 10, func = function(stack, pr) - mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) - end }, - { itemstring = "", weight = 5}, - { itemstring = "mcl_core:pick_iron", weight = 5 }, - { itemstring = "mcl_core:apple_gold_enchanted", weight = 1 }, - } - }, - { - stacks_min = 2, - stacks_max = 4, - items = { - { itemstring = "mcl_farming:bread", weight = 15, amount_min = 1, amount_max = 3 }, - { itemstring = "mcl_core:coal_lump", weight = 10, amount_min = 3, amount_max = 8 }, - { itemstring = "mcl_farming:beetroot_seeds", weight = 10, amount_min = 2, amount_max = 4 }, - { itemstring = "mcl_farming:melon_seeds", weight = 10, amount_min = 2, amount_max = 4 }, - { itemstring = "mcl_farming:pumpkin_seeds", weight = 10, amount_min = 2, amount_max = 4 }, - { itemstring = "mcl_core:iron_ingot", weight = 10, amount_min = 1, amount_max = 5 }, - { itemstring = "mcl_dye:blue", weight = 5, amount_min = 4, amount_max = 9 }, - { itemstring = "mesecons:redstone", weight = 5, amount_min = 4, amount_max = 9 }, - { itemstring = "mcl_core:gold_ingot", weight = 5, amount_min = 1, amount_max = 3 }, - { itemstring = "mcl_core:diamond", weight = 3, amount_min = 1, amount_max = 2 }, - } - }, - { - stacks_min = 3, - stacks_max = 3, - items = { - { itemstring = "mcl_minecarts:rail", weight = 20, amount_min = 4, amount_max = 8 }, - { itemstring = "mcl_torches:torch", weight = 15, amount_min = 1, amount_max = 16 }, - { itemstring = "mcl_minecarts:activator_rail", weight = 5, amount_min = 1, amount_max = 4 }, - { itemstring = "mcl_minecarts:detector_rail", weight = 5, amount_min = 1, amount_max = 4 }, - { itemstring = "mcl_minecarts:golden_rail", weight = 5, amount_min = 1, amount_max = 4 }, - } - }, - -- non-MC loot: 50% chance to add a minecart, offered as alternative to spawning minecarts on rails. - -- TODO: Remove this when minecarts spawn on rails. - { - stacks_min = 0, - stacks_max = 1, - items = { - { itemstring = "mcl_minecarts:minecart", weight = 1 }, - } - } - } - - -- Bonus loot for v6 mapgen: Otherwise unobtainable saplings. - if mg_name == "v6" then - table.insert(loottable, { - stacks_min = 1, - stacks_max = 3, - items = { - { itemstring = "mcl_core:darksapling", weight = 1, amount_min = 1, amount_max = 3 }, - { itemstring = "mcl_core:birchsapling", weight = 1, amount_min = 1, amount_max = 2 }, - { itemstring = "", weight = 6 }, - }, - }) - end - local items = mcl_loot.get_multi_loot(loottable, pr) - - return items -end diff --git a/mods/MAPGEN/tsm_railcorridors/init.lua b/mods/MAPGEN/tsm_railcorridors/init.lua deleted file mode 100644 index 4514061679..0000000000 --- a/mods/MAPGEN/tsm_railcorridors/init.lua +++ /dev/null @@ -1,1122 +0,0 @@ -local pairs = pairs -local tonumber = tonumber - -tsm_railcorridors = {} - --- Load node names -dofile(minetest.get_modpath(minetest.get_current_modname()).."/gameconfig.lua") - --- Settings -local setting - --- Probability function --- TODO: Check if this is correct -local function P(float) - return math.floor(32767 * float) -end - --- Probability for every newly generated mapchunk to get corridors -local probability_railcaves_in_mapchunk = P(0.33333) -setting = tonumber(minetest.settings:get("tsm_railcorridors_probability_railcaves_in_mapchunk")) --- Extra check to prevent mod griefing in singlenode, mcimported worlds. -local mg_name = minetest.get_mapgen_setting("mg_name") -if mg_name == "singlenode" then - probability_railcaves_in_mapchunk = P(0) -elseif setting then - probability_railcaves_in_mapchunk = P(setting) -end - --- Minimal and maximal value of path length (forks don't look up this value) -local way_min = 4; -local way_max = 7; -setting = tonumber(minetest.settings:get("tsm_railcorridors_way_min")) -if setting then - way_min = setting -end -setting = tonumber(minetest.settings:get("tsm_railcorridors_way_max")) -if setting then - way_max = setting -end - --- Probability for every horizontal part of a corridor to be with torches -local probability_torches_in_segment = P(0.5) -setting = tonumber(minetest.settings:get("tsm_railcorridors_probability_torches_in_segment")) -if setting then - probability_torches_in_segment = P(setting) -end - --- Probability for every part of a corridor to go up or down -local probability_up_or_down = P(0.2) -setting = tonumber(minetest.settings:get("tsm_railcorridors_probability_up_or_down")) -if setting then - probability_up_or_down = P(setting) -end - --- Probability for every part of a corridor to fork – caution, too high values may cause MT to hang on. -local probability_fork = P(0.04) -setting = tonumber(minetest.settings:get("tsm_railcorridors_probability_fork")) -if setting then - probability_fork = P(setting) -end - --- Probability for every part of a corridor to contain a chest -local probability_chest = P(0.05) -setting = tonumber(minetest.settings:get("tsm_railcorridors_probability_chest")) -if setting then - probability_chest = P(setting) -end - --- Probability for every part of a corridor to contain a cart -local probability_cart = P(0.05) -setting = tonumber(minetest.settings:get("tsm_railcorridors_probability_cart")) -if setting then - probability_cart = P(setting) -end - --- Probability for a rail corridor system to be damaged -local probability_damage = P(1.0) -setting = tonumber(minetest.settings:get("tsm_railcorridors_probability_damage")) -if setting then - probability_damage = P(setting) -end - --- Enable cobwebs -local place_cobwebs = true -setting = minetest.settings:get_bool("tsm_railcorridors_place_cobwebs") -if setting then - place_cobwebs = setting -end - --- Enable mob spawners -local place_mob_spawners = true -setting = minetest.settings:get_bool("tsm_railcorridors_place_mob_spawners") -if setting then - place_mob_spawners = setting -end - --- Max. and min. heights between rail corridors are generated -local height_min -if mcl_vars.mg_lava then - height_min = mcl_vars.mg_lava_overworld_max + 2 -else - height_min = mcl_vars.mg_bedrock_overworld_max + 2 -end -local height_max = mcl_worlds.layer_to_y(60) - --- Chaos Mode: If enabled, rail corridors don't stop generating when hitting obstacles -local chaos_mode = minetest.settings:get_bool("tsm_railcorridors_chaos") or false - --- End of parameters - -if not tsm_railcorridors.nodes.corridor_woods_function then - local accumulated_chance = 0 - for w=1, #tsm_railcorridors.nodes.corridor_woods do - accumulated_chance = accumulated_chance + tsm_railcorridors.nodes.corridor_woods[w].chance - end - assert(accumulated_chance == 1000, "Rail corridor wood chances add up to "..accumulated_chance.." per mille! (should be 1000 per mille)") -end - --- Random Perlin noise generators -local pr, pr_carts, pr_deco, webperlin_major, webperlin_minor ---local pr_treasures - -local function InitRandomizer(seed) - -- Mostly used for corridor gen. - pr = PseudoRandom(seed) - -- Dirt room decorations - pr_deco = PseudoRandom(seed+25) - -- Separate randomizer for carts because spawning carts is very timing-dependent - pr_carts = PseudoRandom(seed-654) - -- Chest contents randomizer - --pr_treasures = PseudoRandom(seed+777) - -- Used for cobweb generation, both noises have to reach a high value for cobwebs to appear - webperlin_major = PerlinNoise(934, 3, 0.6, 500) - webperlin_minor = PerlinNoise(834, 3, 0.6, 50) -end - -local carts_table = {} - -local dirt_room_coords - --- Returns true if pos is inside the dirt room of the current corridor system -local function IsInDirtRoom(pos) - local min = dirt_room_coords.min - local max = dirt_room_coords.max - return pos.x >= min.x and pos.x <= max.x and pos.y >= min.y and pos.y <= max.y and pos.z >= min.z and pos.z <= max.z -end - --- Checks if the mapgen is allowed to carve through this structure and only sets --- the node if it is allowed. Does never build in liquids. --- If check_above is true, don't build if the node above is attached (e.g. rail) --- or a liquid. -local function SetNodeIfCanBuild(pos, node, check_above, can_replace_rail) - if check_above then - local abovename = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}).name - local abovedef = minetest.registered_nodes[abovename] - if abovename == "unknown" or abovename == "ignore" or - (abovedef and abovedef.groups and abovedef.groups.attached_node) or - -- This is done because cobwebs are often fake liquids - (abovedef and abovedef.liquidtype ~= "none" and abovename ~= tsm_railcorridors.nodes.cobweb) then - return false - end - end - local name = minetest.get_node(pos).name - local def = minetest.registered_nodes[name] - if name ~= "unknown" and name ~= "ignore" and - ((def and def.is_ground_content and def.liquidtype == "none") or - name == tsm_railcorridors.nodes.cobweb or - name == tsm_railcorridors.nodes.torch_wall or - name == tsm_railcorridors.nodes.torch_floor or - (can_replace_rail and name == tsm_railcorridors.nodes.rail) - ) then - minetest.set_node(pos, node) - return true - else - return false - end -end - --- Tries to place a rail, taking the damage chance into account -local function PlaceRail(pos, damage_chance) - if damage_chance and damage_chance > 0 then - local x = pr:next(0,100) - if x <= damage_chance then - return false - end - end - return SetNodeIfCanBuild(pos, {name=tsm_railcorridors.nodes.rail}) -end - --- Returns true if the node as point can be considered “ground”, that is, a solid material --- in which mine shafts can be built into, e.g. stone, but not air or water -local function IsGround(pos) - local nodename = minetest.get_node(pos).name - local nodedef = minetest.registered_nodes[nodename] - return nodename ~= "unknown" and nodename ~= "ignore" and nodedef and nodedef.is_ground_content and nodedef.walkable and nodedef.liquidtype == "none" -end - --- Returns true if rails are allowed to be placed on top of this node -local function IsRailSurface(pos) - local nodename = minetest.get_node(pos).name - local nodename_above = minetest.get_node({x=pos.x,y=pos.y+2,z=pos.z}).name - local nodedef = minetest.registered_nodes[nodename] - return nodename ~= "unknown" and nodename ~= "ignore" and nodedef and nodedef.walkable and (nodedef.node_box == nil or nodedef.node_box.type == "regular") and nodename_above ~= tsm_railcorridors.nodes.rail -end - --- Checks if the node is empty space which requires to be filled by a platform -local function NeedsPlatform(pos) - local node = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) - local node2 = minetest.get_node({x=pos.x,y=pos.y-2,z=pos.z}) - local nodedef = minetest.registered_nodes[node.name] - local falling = minetest.get_item_group(node.name, "falling_node") == 1 - return - -- Node can be replaced if ground content or rail - (node.name ~= "ignore" and node.name ~= "unknown" and nodedef and nodedef.is_ground_content) and - -- Node needs platform if node below is not walkable. - -- Unless 2 nodes below there is dirt: This is a special case for the starter cube. - ((nodedef.walkable == false and node2.name ~= tsm_railcorridors.nodes.dirt) or - -- Falling nodes always need to be replaced by a platform, we want a solid and safe ground - falling), - -- second return value - falling -end - --- Create a cube filled with the specified nodes --- Specialties: --- * Avoids floating rails --- * May cut into wood structures of the corridors (alongside with their torches) --- Arguments: --- * p: Center position --- * radius: How many nodes from the center the cube will extend --- * node: Node to set --- * replace_air_only: If true, only air can be replaced --- * wood, post: Wood and post nodes of the railway corridor to cut into (optional) - --- Returns true if all nodes could be set --- Returns false if setting one or more nodes failed -local function Cube(p, radius, node, replace_air_only, wood, post) - local y_top = p.y+radius - local nodedef = minetest.registered_nodes[node.name] - local solid = nodedef.walkable and (nodedef.node_box == nil or nodedef.node_box.type == "regular") and nodedef.liquidtype == "none" - -- Check if all the nodes could be set - local built_all = true - - -- If wood has been removed, remod - local cleanup_torches = {} - for xi = p.x-radius, p.x+radius do - for zi = p.z-radius, p.z+radius do - local column_last_attached = nil - for yi = y_top, p.y-radius, -1 do - local ok = false - local thisnode = minetest.get_node({x=xi,y=yi,z=zi}) - if not solid then - if yi == y_top then - local topnode = minetest.get_node({x=xi,y=yi+1,z=zi}) - local topdef = minetest.registered_nodes[topnode.name] - if minetest.get_item_group(topnode.name, "attached_node") ~= 1 and topdef and topdef.liquidtype == "none" then - ok = true - end - elseif column_last_attached and yi == column_last_attached - 1 then - ok = false - else - ok = true - end - if minetest.get_item_group(thisnode.name, "attached_node") == 1 then - column_last_attached = yi - end - else - ok = true - end - local built = false - if ok then - if replace_air_only ~= true then - -- Cut into wood structures (post/wood) - if post and (xi == p.x or zi == p.z) and thisnode.name == post then - minetest.set_node({x=xi,y=yi,z=zi}, node) - built = true - elseif wood and (xi == p.x or zi == p.z) and thisnode.name == wood then - local topnode = minetest.get_node({x=xi,y=yi+1,z=zi}) - local topdef = minetest.registered_nodes[topnode.name] - if topdef and topdef.walkable and topnode.name ~= wood then - minetest.set_node({x=xi,y=yi,z=zi}, node) - -- Check for torches around the wood and schedule them - -- for removal - if node.name == "air" then - table.insert(cleanup_torches, {x=xi+1,y=yi,z=zi}) - table.insert(cleanup_torches, {x=xi-1,y=yi,z=zi}) - table.insert(cleanup_torches, {x=xi,y=yi,z=zi+1}) - table.insert(cleanup_torches, {x=xi,y=yi,z=zi-1}) - end - built = true - end - -- Set node normally - else - built = SetNodeIfCanBuild({x=xi,y=yi,z=zi}, node) - end - else - if minetest.get_node({x=xi,y=yi,z=zi}).name == "air" then - built = SetNodeIfCanBuild({x=xi,y=yi,z=zi}, node) - end - end - end - if not built then - built_all = false - end - end - end - end - -- Remove torches we have detected before - for c=1, #cleanup_torches do - local check = minetest.get_node(cleanup_torches[c]) - if check.name == tsm_railcorridors.nodes.torch_wall or check.name == tsm_railcorridors.nodes.torch_floor then - minetest.set_node(cleanup_torches[c], node) - end - end - return built_all -end - -local function DirtRoom(p, radius, height, dirt_mode, decorations_mode) - local y_bottom = p.y - local y_top = y_bottom + height + 1 - dirt_room_coords = { - min = { x = p.x-radius, y = y_bottom, z = p.z-radius }, - max = { x = p.x+radius, y = y_top, z = p.z+radius }, - } - local built_all = true - for xi = p.x-radius, p.x+radius do - for zi = p.z-radius, p.z+radius do - for yi = y_top, y_bottom, -1 do - local thisnode = minetest.get_node({x=xi,y=yi,z=zi}) - local built = false - if xi == p.x-radius or xi == p.x+radius or zi == p.z-radius or zi == p.z+radius or yi == y_bottom or yi == y_top then - if dirt_mode == 1 or yi == y_bottom then - built = SetNodeIfCanBuild({x=xi,y=yi,z=zi}, {name=tsm_railcorridors.nodes.dirt}) - elseif (dirt_mode == 2 or dirt_mode == 3) and yi == y_top then - if minetest.get_item_group(thisnode.name, "falling_node") == 1 then - built = SetNodeIfCanBuild({x=xi,y=yi,z=zi}, {name=tsm_railcorridors.nodes.dirt}) - end - end - else - if yi == y_bottom + 1 then - -- crazy rails - if decorations_mode == 1 then - local r = pr_deco:next(1,3) - if r == 2 then - built = SetNodeIfCanBuild({x=xi,y=yi,z=zi}, {name=tsm_railcorridors.nodes.rail}) - end - end - end - if not built then - built = SetNodeIfCanBuild({x=xi,y=yi,z=zi}, {name="air"}) - end - end - if not built then - built_all = false - end - end - end - end - return built_all -end - -local function Platform(p, radius, node, node2) - -- node2 is secondary platform material for replacing falling nodes - if not node2 then - node2 = { name = tsm_railcorridors.nodes.dirt } - end - for zi = p.z-radius, p.z+radius do - for xi = p.x-radius, p.x+radius do - local np, np2 = NeedsPlatform({x=xi,y=p.y,z=zi}) - if np then - if np2 then - minetest.set_node({x=xi,y=p.y-1,z=zi}, node2) - else - minetest.set_node({x=xi,y=p.y-1,z=zi}, node) - end - end - end - end -end - --- Chests -local function PlaceChest(pos, param2) - if SetNodeIfCanBuild(pos, {name=tsm_railcorridors.nodes.chest, param2=param2}) then - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local items = tsm_railcorridors.get_treasures(pr) - mcl_loot.fill_inventory(inv, "main", items, pr) - end -end - --- This function checks if a cart has ACTUALLY been spawned. --- To be calld by minetest.after. --- This is a workaround thanks to the fact that minetest.add_entity is unreliable as fuck --- See: https://github.com/minetest/minetest/issues/4759 --- FIXME: Kill this horrible hack with fire as soon you can. -local function RecheckCartHack(params) - local pos = params[1] - local cart_id = params[2] - -- Find cart - for _, obj in pairs(minetest.get_objects_inside_radius(pos, 1)) do - if obj and obj:get_luaentity().name == cart_id then - -- Cart found! We can now safely call the callback func. - -- (calling it earlier has the danger of failing) - minetest.log("info", "[tsm_railcorridors] Cart spawn succeeded: "..minetest.pos_to_string(pos)) - tsm_railcorridors.on_construct_cart(pos, obj) - return - end - end - minetest.log("info", "[tsm_railcorridors] Cart spawn FAILED: "..minetest.pos_to_string(pos)) -end - --- Try to place a cobweb. --- pos: Position of cobweb --- needs_check: If true, checks if any of the nodes above, below or to the side of the cobweb. --- side_vector: Required if needs_check is true. Unit vector which points towards the side of the cobweb to place. -local function TryPlaceCobweb(pos, needs_check, side_vector) - local check_passed = false - if needs_check then - -- Check for walkable nodes above, below or at the side of the cobweb. - -- If any of those nodes is walkable, we are fine. - local check_vectors = { - side_vector, - {x=0, y=1, z=0}, - {x=0, y=-1, z=0}, - } - - for c=1, #check_vectors do - - local cpos = vector.add(pos, check_vectors[c]) - local cname = minetest.get_node(cpos).name - local cdef = minetest.registered_nodes[cname] - if cname ~= "ignore" and cdef and cdef.walkable then - check_passed = true - break - end - end - - else - check_passed = true - end - - if check_passed then - return SetNodeIfCanBuild(pos, {name=tsm_railcorridors.nodes.cobweb}) - else - return false - end -end - --- 4 wooden pillars around pos at height -local function WoodBulk(pos, height, wood) - for y=0, height-1 do - SetNodeIfCanBuild({x=pos.x+1, y=pos.y+y, z=pos.z+1}, {name=wood}, false, true) - SetNodeIfCanBuild({x=pos.x-1, y=pos.y+y, z=pos.z+1}, {name=wood}, false, true) - SetNodeIfCanBuild({x=pos.x+1, y=pos.y+y, z=pos.z-1}, {name=wood}, false, true) - SetNodeIfCanBuild({x=pos.x-1, y=pos.y+y, z=pos.z-1}, {name=wood}, false, true) - end -end - --- Build a wooden support frame -local function WoodSupport(p, wood, post, torches, dir, torchdir) - local node_wood = {name=wood} - local node_fence = {name=post} - - local calc = { - p.x+dir[1], p.z+dir[2], -- X and Z, added by direction - p.x-dir[1], p.z-dir[2], -- subtracted - p.x+dir[2], p.z+dir[1], -- orthogonal - p.x-dir[2], p.z-dir[1], -- orthogonal, the other way - } - --[[ Shape: - WWW - P.P - PrP - pfp - W = wood - P = post (above floor level) - p = post (in floor level, only placed if no floor) - - From previous generation (for reference): - f = floor - r = rail - . = air - ]] - - -- Don't place those wood structs below open air - if not (minetest.get_node({x=calc[1], y=p.y+2, z=calc[2]}).name == "air" and - minetest.get_node({x=calc[3], y=p.y+2, z=calc[4]}).name == "air" and - minetest.get_node({x=p.x, y=p.y+2, z=p.z}).name == "air") then - - -- Left post and planks - local left_ok - left_ok = SetNodeIfCanBuild({x=calc[1], y=p.y-1, z=calc[2]}, node_fence) - if left_ok then left_ok = SetNodeIfCanBuild({x=calc[1], y=p.y , z=calc[2]}, node_fence) end - if left_ok then left_ok = SetNodeIfCanBuild({x=calc[1], y=p.y+1, z=calc[2]}, node_wood, false, true) end - - -- Right post and planks - local right_ok - right_ok = SetNodeIfCanBuild({x=calc[3], y=p.y-1, z=calc[4]}, node_fence) - if right_ok then right_ok = SetNodeIfCanBuild({x=calc[3], y=p.y , z=calc[4]}, node_fence) end - if right_ok then right_ok = SetNodeIfCanBuild({x=calc[3], y=p.y+1, z=calc[4]}, node_wood, false, true) end - - -- Middle planks - local top_planks_ok = false - if left_ok and right_ok then top_planks_ok = SetNodeIfCanBuild({x=p.x, y=p.y+1, z=p.z}, node_wood) end - - if minetest.get_node({x=p.x,y=p.y-2,z=p.z}).name=="air" then - if left_ok then SetNodeIfCanBuild({x=calc[1], y=p.y-2, z=calc[2]}, node_fence) end - if right_ok then SetNodeIfCanBuild({x=calc[3], y=p.y-2, z=calc[4]}, node_fence) end - end - -- Torches on the middle planks - if torches and top_planks_ok then - -- Place torches at horizontal sides - SetNodeIfCanBuild({x=calc[5], y=p.y+1, z=calc[6]}, {name=tsm_railcorridors.nodes.torch_wall, param2=torchdir[1]}, true) - SetNodeIfCanBuild({x=calc[7], y=p.y+1, z=calc[8]}, {name=tsm_railcorridors.nodes.torch_wall, param2=torchdir[2]}, true) - end - elseif torches then - -- Try to build torches instead of the wood structs - local node = {name=tsm_railcorridors.nodes.torch_floor, param2=minetest.dir_to_wallmounted({x=0,y=-1,z=0})} - - -- Try two different height levels - local pos1 = {x=calc[1], y=p.y-2, z=calc[2]} - local pos2 = {x=calc[3], y=p.y-2, z=calc[4]} - local nodedef1 = minetest.registered_nodes[minetest.get_node(pos1).name] - local nodedef2 = minetest.registered_nodes[minetest.get_node(pos2).name] - - if nodedef1 and nodedef1.walkable then - pos1.y = pos1.y + 1 - end - SetNodeIfCanBuild(pos1, node, true) - - if nodedef2 and nodedef2.walkable then - pos2.y = pos2.y + 1 - end - SetNodeIfCanBuild(pos2, node, true) - - end -end - --- Dig out a single corridor section and place wooden structures and torches - --- Returns , --- success: true if corridor could be placed entirely --- segments: Number of segments successfully placed -local function dig_corridor_section(start_point, segment_vector, segment_count, wood, post, up_or_down_prev) - local p = {x=start_point.x, y=start_point.y, z=start_point.z} - local torches = pr:next() < probability_torches_in_segment - local dir = {0, 0} - local torchdir = {1, 1} - local node_wood = {name=wood} - if segment_vector.x == 0 and segment_vector.z ~= 0 then - dir = {1, 0} - torchdir = {5, 4} - elseif segment_vector.x ~= 0 and segment_vector.z == 0 then - dir = {0, 1} - torchdir = {3, 2} - end - for segmentindex = 0, segment_count-1 do - local dug - if segment_vector.y == 0 then - dug = Cube(p, 1, {name="air"}, false, wood, post) - else - dug = Cube(p, 1, {name="air"}, false) - end - if not chaos_mode and segmentindex > 0 and not dug then return false, segmentindex end - -- Add wooden platform, if neccessary. To avoid floating rails - if segment_vector.y == 0 then - if segmentindex == 0 and up_or_down_prev then - -- Thin 1×1 platform directly after going up or down. - -- This is done to avoid placing too much wood at slopes - Platform({x=p.x-dir[2], y=p.y-1, z=p.z-dir[1]}, 0, node_wood) - Platform({x=p.x, y=p.y-1, z=p.z}, 0, node_wood) - Platform({x=p.x+dir[2], y=p.y-1, z=p.z+dir[1]}, 0, node_wood) - else - -- Normal 3×3 platform - Platform({x=p.x, y=p.y-1, z=p.z}, 1, node_wood) - end - else - -- Sloped bridge - Platform({x=p.x-dir[1], y=p.y-2, z=p.z-dir[2]}, 0, node_wood) - Platform({x=p.x, y=p.y-2, z=p.z}, 0, node_wood) - Platform({x=p.x+dir[1], y=p.y-2, z=p.z+dir[2]}, 0, node_wood) - end - if segmentindex % 2 == 1 and segment_vector.y == 0 then - WoodSupport(p, wood, post, torches, dir, torchdir) - end - - -- Next way point - p = vector.add(p, segment_vector) - end - - -- End of the corridor segment; create the final piece - local dug - if segment_vector.y == 0 then - dug = Cube(p, 1, {name="air"}, false, wood, post) - else - dug = Cube(p, 1, {name="air"}, false) - end - if not chaos_mode and not dug then return false, segment_count end - if segment_vector.y == 0 then - Platform({x=p.x, y=p.y-1, z=p.z}, 1, node_wood) - end - return true, segment_count -end - --- Generate a corridor section. Corridor sections are part of a corridor line. --- This is one short part of a corridor line. It can be one straight section or it goes up or down. --- It digs out the corridor and places wood structs and torches using the helper function dig_corridor_function, --- then it places rails, chests, and other goodies. -local function create_corridor_section(waypoint, axis, sign, up_or_down, up_or_down_next, up_or_down_prev, up, wood, post, first_or_final, damage, no_spawner) - local segamount = 3 - if up_or_down then - segamount = 1 - end - if sign then - segamount = 0-segamount - end - local vek = {x=0,y=0,z=0}; - local start = table.copy(waypoint) - if axis == "x" then - vek.x=segamount - if up_or_down and up == false then - start.x=start.x+segamount - end - elseif axis == "z" then - vek.z=segamount - if up_or_down and up == false then - start.z=start.z+segamount - end - end - if up_or_down then - if up then - vek.y = 1 - else - vek.y = -1 - end - end - local segcount = pr:next(4,6) - if up_or_down and up == false then - Cube(waypoint, 1, {name="air"}, false) - end - local corridor_dug, corridor_segments_dug = dig_corridor_section(start, vek, segcount, wood, post, up_or_down_prev) - local corridor_vek = {x=vek.x*segcount, y=vek.y*segcount, z=vek.z*segcount} - - -- After this: rails - segamount = 1 - if sign then - segamount = 0-segamount - end - if axis == "x" then - vek.x=segamount - elseif axis == "z" then - vek.z=segamount - end - if up_or_down then - if up then - vek.y = 1 - else - vek.y = -1 - end - end - -- Calculate chest and cart position - local chestplace = -1 - local cartplace = -1 - local minseg - if first_or_final == "first" then - minseg = 2 - else - minseg = 1 - end - if corridor_dug and not up_or_down then - if pr:next() < probability_chest then - chestplace = pr:next(minseg, segcount+1) - end - if tsm_railcorridors.carts and #tsm_railcorridors.carts > 0 and pr:next() < probability_cart then - cartplace = pr:next(minseg, segcount+1) - end - end - local railsegcount - if not chaos_mode and not corridor_dug then - railsegcount = corridor_segments_dug * 3 - elseif not up_or_down then - railsegcount = segcount * 3 - else - railsegcount = segcount - end - for i=1,railsegcount do - local p = {x = waypoint.x + vek.x * i, y = waypoint.y + vek.y * i-1, z = waypoint.z + vek.z * i} - - -- Randomly returns either the left or right side of the main rail. - -- Also returns offset as second return value. - local function left_or_right(pos, vek) - local off - if pr:next(1, 2) == 1 then - -- left - off = {x = -vek.z, y= 0, z = vek.x} - else - -- right - off = {x=vek.z, y= 0, z= -vek.x} - end - return vector.add(pos, off), off - end - - if (minetest.get_node({x=p.x,y=p.y-1,z=p.z}).name=="air" and minetest.get_node({x=p.x,y=p.y-3,z=p.z}).name~=tsm_railcorridors.nodes.rail) then - p.y = p.y - 1; - if i == chestplace then - chestplace = chestplace + 1 - end - if i == cartplace then - cartplace = cartplace + 1 - end - end - - -- Chest - if i == chestplace then - local cpos, offset = left_or_right(p, vek) - if minetest.get_node(cpos).name == post or IsInDirtRoom(p) then - chestplace = chestplace + 1 - else - PlaceChest(cpos, minetest.dir_to_facedir(offset)) - end - end - - -- A rail at the side of the track to put a cart on - if i == cartplace and #tsm_railcorridors.carts > 0 then - local cpos = left_or_right(p, vek) - if minetest.get_node(cpos).name == post then - cartplace = cartplace + 1 - else - local placed - if IsRailSurface({x=cpos.x, y=cpos.y-1, z=cpos.z}) then - placed = PlaceRail(cpos, damage) - else - placed = false - end - if placed then - -- We don't put on a cart yet, we put it in the carts table - -- for later placement - local cart_type = pr_carts:next(1, #tsm_railcorridors.carts) - table.insert(carts_table, {pos = cpos, cart_type = cart_type}) - end - end - end - - -- Mob spawner (at center) - if place_mob_spawners and tsm_railcorridors.nodes.spawner and not no_spawner and - webperlin_major:get_3d(p) > 0.3 and webperlin_minor:get_3d(p) > 0.5 then - -- Place spawner (if activated in gameconfig), - -- enclose in cobwebs and setup the spawner node. - local spawner_placed = SetNodeIfCanBuild(p, {name=tsm_railcorridors.nodes.spawner}) - if spawner_placed then - local size = 1 - if webperlin_major:get_3d(p) > 0.5 then - size = 2 - end - if place_cobwebs then - Cube(p, size, {name=tsm_railcorridors.nodes.cobweb}, true) - end - tsm_railcorridors.on_construct_spawner(p) - no_spawner = true - end - end - - -- Main rail; this places almost all the rails - if IsRailSurface({x=p.x,y=p.y-1,z=p.z}) then - PlaceRail(p, damage) - end - - -- Place cobwebs left and right in the corridor - if place_cobwebs and tsm_railcorridors.nodes.cobweb then - -- Helper function to place a cobweb at the side (based on chance an Perlin noise) - local function cobweb_at_side(basepos, vek) - if pr:next(1,5) == 1 then - local h = pr:next(0, 2) -- 3 possible cobweb heights - local cpos = {x=basepos.x+vek.x, y=basepos.y+h, z=basepos.z+vek.z} - if webperlin_major:get_3d(cpos) > 0.05 and webperlin_minor:get_3d(cpos) > 0.1 then - if h == 0 then - -- No check neccessary at height offset 0 since the cobweb is on the floor - return TryPlaceCobweb(cpos) - else - -- Check nessessary - return TryPlaceCobweb(cpos, true, vek) - end - end - end - return false - end - - -- Right cobweb - local rvek = {x=-vek.z, y=0, z=vek.x} - cobweb_at_side(p, rvek) - - -- Left cobweb - local lvek = {x=vek.z, y=0, z=-vek.x} - cobweb_at_side(p, lvek) - - end - end - - local offset = table.copy(corridor_vek) - local final_point = vector.add(waypoint, offset) - if up_or_down then - if up then - offset.y = offset.y - 1 - final_point = vector.add(waypoint, offset) - else - offset[axis] = offset[axis] + segamount - final_point = vector.add(waypoint, offset) - end - -- After going up or down, 1 missing rail piece must be added - Platform({x=final_point.x,y=final_point.y-1,z=final_point.z}, 0, {name=wood}) - if IsRailSurface({x=final_point.x,y=final_point.y-2,z=final_point.z}) then - PlaceRail({x=final_point.x,y=final_point.y-1,z=final_point.z}, damage) - end - end - if not corridor_dug then - return false, no_spawner - else - return final_point, no_spawner - end -end - --- Generate a line of corridors. --- The corridor can go up/down, take turns and it can branch off, creating more corridor lines. -local function create_corridor_line(waypoint, axis, sign, length, wood, post, damage, no_spawner) - local wp = waypoint - local a = axis - local s = sign - local ud = false -- Up or down - local udn = false -- Up or down is next - local udp -- Up or down was previous - local up = false -- true if going up - local upp = false -- true if was going up previously - for i=1,length do - -- Update previous up/down status - udp = ud - -- Can't go up/down if a platform is needed at waypoint - local needs_platform = NeedsPlatform({x=wp.x,y=wp.y-2,z=wp.z}) - -- Update current up/down status - if udn and not needs_platform then - ud = true - -- Force direction near the height limits - if wp.y >= height_max - 12 then - if udp then - ud = false - end - up = false - elseif wp.y <= height_min + 12 then - if udp then - ud = false - end - up = true - else - -- If previous was up/down, keep the vertical direction - if udp and not chaos_mode then - up = upp - else - -- Chose random direction - up = pr:next(1, 2) == 1 - end - end - upp = up - else - ud = false - end - -- Update next up/down status - if pr:next() < probability_up_or_down and i~=1 and not udn and not needs_platform then - udn = i < length - elseif udn and not needs_platform then - udn = false - end - -- Make corridor - local first_or_final - if i == length then - first_or_final = "final" - elseif i == 1 then - first_or_final = "first" - end - wp, no_spawner = create_corridor_section(wp,a,s, ud, udn, udp, up, wood, post, first_or_final, damage, no_spawner) - if wp == false then return end - -- Fork in the road? If so, starts 2-3 new corridor lines and terminates the current one. - if pr:next() < probability_fork then - -- 75% chance to fork off in 3 directions (making a crossing) - -- 25% chance to fork off in 2 directions (making a t-junction) - local is_crossing = pr:next(0, 3) < 3 - local forks = 2 - if is_crossing then - forks = 3 - end - local p = {x=wp.x, y=wp.y, z=wp.z} - local a2 - if a == "x" then - a2="z" - else - a2="x" - end - local fork_dirs = { - {a2, s}, -- to the side - {a2, not s}, -- to the other side - {a, s}, -- straight ahead - } - for f=1, forks do - local r = pr:next(1, #fork_dirs) - create_corridor_line(wp, fork_dirs[r][1], fork_dirs[r][2], pr:next(way_min,way_max), wood, post, damage, no_spawner) - table.remove(fork_dirs, r) - end - if is_crossing and not IsInDirtRoom(p) then - -- 4 large wooden pillars around the center rail - WoodBulk({x=p.x, y=p.y-1, z=p.z}, 4, wood) - end - return - end - -- Randomly change sign, toggle axis. - -- In other words, take a turn. - if a=="x" then - a="z" - elseif a=="z" then - a="x" - end; - s = pr:next(1, 2) == 1 - end -end - --- Spawns all carts in the carts table and clears the carts table afterwards -local function spawn_carts() - for c=1, #carts_table do - local cpos = carts_table[c].pos - local cart_type = carts_table[c].cart_type - local node = minetest.get_node(cpos) - if node.name == tsm_railcorridors.nodes.rail then - -- FIXME: The cart sometimes fails to spawn - -- See - local cart_id = tsm_railcorridors.carts[cart_type] - minetest.log("info", "[tsm_railcorridors] Cart spawn attempt: "..minetest.pos_to_string(cpos)) - minetest.add_entity(cpos, cart_id) - - -- This checks if the cart is actually spawned, it's a giant hack! - -- Note that the callback function is also called there. - -- TODO: Move callback function to this position when the - -- minetest.add_entity bug has been fixed. - minetest.after(3, RecheckCartHack, {cpos, cart_id}) - end - end - carts_table = {} -end - --- Start generation of a rail corridor system --- main_cave_coords is the center of the floor of the dirt room, from which --- all corridors expand. -local function create_corridor_system(main_cave_coords) - - -- Dirt room size - local maxsize = 6 - if chaos_mode then - maxsize = 9 - end - local size = pr:next(3, maxsize) - - --[[ Only build if starter coords are in the ground. - Prevents corridors starting in mid-air or in liquids. ]] - local check_coords = { - -- Center of the room, on the floor - {x=0,y=0,z=0}, - -- Also check near the 4 bottom corners of the dirt room - {x= size-1, y=0, z=size-1}, - {x=-size+1, y=0, z=size-1}, - {x= size-1, y=0, z=-size+1}, - {x=-size+1, y=0, z=-size+1}, - } - for c=1, #check_coords do - if not IsGround(vector.add(main_cave_coords, check_coords[c])) then - return false - end - end - - local center_node = minetest.get_node(main_cave_coords) - - local height = pr:next(4, 7) - if height > size then - height = size - end - local floor_diff = 1 - if pr:next(0, 100) < 50 then - floor_diff = 0 - end - local dirt_mode = pr:next(1,2) - local rnd = pr:next(1,1000) - -- Small chance to fill dirt room with random rails - local decorations_mode = 0 - if rnd == 1000 then - decorations_mode = 1 - end - - --[[ Starting point: A big hollow dirt cube from which the corridors will extend. - Corridor generation starts here. ]] - DirtRoom(main_cave_coords, size, height, dirt_mode, decorations_mode) - main_cave_coords.y = main_cave_coords.y + 2 + floor_diff - - -- Determine if this corridor system is “damaged” (some rails removed) and to which extent - local damage = 0 - if pr:next() < probability_damage then - damage = pr:next(10, 50) - end - - -- Get wood and fence post types, using gameconfig. - - local wood, post - if tsm_railcorridors.nodes.corridor_woods_function then - -- Get wood type by gameconfig function - wood, post = tsm_railcorridors.nodes.corridor_woods_function(main_cave_coords, center_node) - else - -- Select random wood type (found in gameconfig.lua) - local rnd = pr:next(1,1000) - local woodtype = 1 - local accumulated_chance = 0 - - for w=1, #tsm_railcorridors.nodes.corridor_woods do - local woodtable = tsm_railcorridors.nodes.corridor_woods[w] - accumulated_chance = accumulated_chance + woodtable.chance - if rnd <= accumulated_chance then - woodtype = w - break - end - end - wood = tsm_railcorridors.nodes.corridor_woods[woodtype].wood - post = tsm_railcorridors.nodes.corridor_woods[woodtype].post - end - - -- Start 2-4 corridors in each direction - local dirs = { - {axis="x", axis2="z", sign=false}, - {axis="x", axis2="z", sign=true}, - {axis="z", axis2="x", sign=false}, - {axis="z", axis2="x", sign=true}, - } - local first_corridor - local corridors = 2 - for _=1, 2 do - if pr:next(0,100) < 70 then - corridors = corridors + 1 - end - end - -- Chance for 5th corridor in Chaos Mode - if chaos_mode and size > 4 then - if pr:next(0,100) < 50 then - corridors = corridors + 1 - end - end - local centered_crossing = false - if corridors <= 4 and pr:next(1, 20) >= 11 then - centered_crossing = true - end - -- This moves the start of the corridors in the dirt room back and forth - local d_max = 3 - if floor_diff == 1 and height <= 4 then - d_max = d_max + 1 - end - local from_center_base = size - pr:next(1,d_max) - for i=1, math.min(4, corridors) do - local d = pr:next(1, #dirs) - local dir = dirs[d] - local side_offset = 0 - if not centered_crossing and size > 3 then - if i==1 and corridors == 5 then - side_offset = pr:next(2, size-2) - if pr:next(1,2) == 1 then - side_offset = -side_offset - end - else - side_offset = pr:next(-size+2, size-2) - end - end - local from_center = from_center_base - if dir.sign then - from_center = -from_center - end - if i == 1 then - first_corridor = {sign=dir.sign, axis=dir.axis, axis2=dir.axis2, side_offset=side_offset, from_center=from_center} - end - local coords = vector.add(main_cave_coords, {[dir.axis] = from_center, y=0, [dir.axis2] = side_offset}) - create_corridor_line(coords, dir.axis, dir.sign, pr:next(way_min,way_max), wood, post, damage, false) - table.remove(dirs, d) - end - if corridors == 5 then - local special_coords = vector.add(main_cave_coords, {[first_corridor.axis2] = -first_corridor.side_offset, y=0, [first_corridor.axis] = first_corridor.from_center}) - create_corridor_line(special_coords, first_corridor.axis, first_corridor.sign, pr:next(way_min,way_max), wood, post, damage, false) - end - - -- At this point, all corridors were generated and all nodes were set. - -- We spawn the carts now - spawn_carts() - - return true -end - --- The rail corridor algorithm starts here -mcl_mapgen_core.register_generator("railcorridors", nil, function(minp, maxp, blockseed, _pr) - -- We re-init the randomizer for every mapchunk as we start generating in the middle of each mapchunk. - -- We can't use the mapgen seed as this would make the algorithm depending on the order the mapchunk generate. - InitRandomizer(blockseed) - if minp.y < height_max and maxp.y > height_min and pr:next() < probability_railcaves_in_mapchunk then - -- Keep some distance from the upper/lower mapchunk limits - local buffer = 5 - - -- Do up to 10 tries to start a corridor system - for t=1,10 do - -- Get semi-random height in mapchunk - local y = pr:next(minp.y + buffer, maxp.y - buffer) - y = math.floor(math.max(height_min + buffer, math.min(height_max - buffer, y))) - - -- Mid point of the mapchunk - local p = {x=minp.x+math.floor((maxp.x-minp.x)/2), y=y, z=minp.z+math.floor((maxp.z-minp.z)/2)} - -- Start corridor system at p. Might fail if p is in open air - minetest.log("verbose", "[tsm_railcorridors] Attempting to start rail corridor system at "..minetest.pos_to_string(p)) - if create_corridor_system(p, pr) then - minetest.log("info", "[tsm_railcorridors] Generated rail corridor system at "..minetest.pos_to_string(p)) - break - else - minetest.log("info", "[tsm_railcorridors] Rail corridor system generation attempt failed at "..minetest.pos_to_string(p).. " (try "..t..")") - end - end - end -end, 10) diff --git a/mods/MAPGEN/tsm_railcorridors/mod.conf b/mods/MAPGEN/tsm_railcorridors/mod.conf deleted file mode 100644 index c846cff19e..0000000000 --- a/mods/MAPGEN/tsm_railcorridors/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = tsm_railcorridors -author = UgnilJoZ -description = Adds simple underground mines with railways and occasional treasure chests. -depends = mcl_init, mcl_worlds, mcl_core, mcl_mapgen_core, mcl_loot, mcl_tnt, mcl_farming, mcl_mobspawners, mcl_minecarts diff --git a/mods/MAPGEN/tsm_railcorridors/settingtypes.txt b/mods/MAPGEN/tsm_railcorridors/settingtypes.txt deleted file mode 100644 index a289629070..0000000000 --- a/mods/MAPGEN/tsm_railcorridors/settingtypes.txt +++ /dev/null @@ -1,41 +0,0 @@ -#Probability (0.0 to 1.0) for every newly generated mapchunk to get rail corridors. -tsm_railcorridors_probability_railcaves_in_mapchunk (Rail corridor probability) float 0.33333 0.0 1.0 - -#Minimum rail corridor path length (excludes forks). -tsm_railcorridors_way_min (Minimum rail corridor length) int 4 1 - -#Maximum rail corridor path length (excludes forks). -tsm_railcorridors_way_max (Maximum rail corridor length) int 7 1 - -#Probability (0.0 to 1.0) for every horizontal part of a rail corridor to have torches. -tsm_railcorridors_probability_torches_in_segment (Torch probability) float 0.5 0.0 1.0 - -#Probability (0.0 to 1.0) for every part of a rail corridor to go up or down. -tsm_railcorridors_probability_up_or_down (Stairway probability) float 0.2 0.0 1.0 - -#Probability (0.0 to 1.0) for every part of a rail corridor to fork. -#Caution! Too high values may cause Minetest to hang. -tsm_railcorridors_probability_fork (Fork probability) float 0.04 0.0 1.0 - -#Probability (0.0 to 1.0) for every part of a rail corridor to contain a treasure chest. -tsm_railcorridors_probability_chest (Chest probability) float 0.05 0.0 1.0 - -#Probability (0.0 to 1.0) for every part of a rail corridor to include a cart. -#Note: The rail may still be subject to rail damage, so the probability -#of finding a cart in rail corridors with high rail damage will be lower. -#NOTE: Due to a bug in Minetest -#carts often fail to spawn even if they should. -tsm_railcorridors_probability_cart (Cart probability) float 0.0 0.0 1.0 - -#If enabled, cobwebs may be placed in some corridors. -#Currently, cobwebs are only supported with the Mobs Redo mod. -tsm_railcorridors_place_cobwebs (Cobwebs) bool true - -#Probability (0.0 to 1.0) for a rail corridor system to have damaged/incomplete railways -tsm_railcorridors_probability_damage (Damaged railway probability) float 1.0 0.0 1.0 - -#If enabled, rail corridors continue to generate through obstacles such -#as other rail corridors (without destroying them, mostly). This may lead -#to pretty chaotic rail corridors, but they are also more free to spread. -#If disabled, rail corridors spread in a orderly fashion. -tsm_railcorridors_chaos (Chaos Mode) bool false diff --git a/mods/MISC/mcl_temp_helper_recipes/init.lua b/mods/MISC/mcl_temp_helper_recipes/init.lua deleted file mode 100644 index b7607946d4..0000000000 --- a/mods/MISC/mcl_temp_helper_recipes/init.lua +++ /dev/null @@ -1,83 +0,0 @@ --- Temporary helper recipes. --- These recipes are NOT part of Minecraft. They are added to make some currently unobtainable items accessible. --- TODO: Remove recipes when they become accessible by regular means - -minetest.register_craft({ - type = "shapeless", - output = "mcl_chests:trapped_chest", - recipe = {"mcl_core:iron_ingot", "mcl_core:stick", "group:wood", "mcl_chests:chest"}, -}) - -minetest.register_craft({ - output = "mcl_sponges:sponge", - recipe = { - { "mcl_farming:hay_block", "mcl_farming:hay_block", "mcl_farming:hay_block" }, - { "mcl_farming:hay_block", "mcl_core:goldblock", "mcl_farming:hay_block" }, - { "mcl_farming:hay_block", "mcl_farming:hay_block", "mcl_farming:hay_block" }, - } -}) - -minetest.register_craft({ - output = "mcl_ocean:prismarine_shard", - recipe = { - { "mcl_core:glass_cyan", }, - } -}) - -minetest.register_craft({ - type = "shapeless", - output = "mcl_ocean:prismarine_crystals", - recipe = { - "mcl_ocean:prismarine_shard", - "mcl_ocean:prismarine_shard", - "mcl_ocean:prismarine_shard", - "mcl_core:gold_ingot", - }, -}) - --- Make red sand, red sandstone and more craftable in v6 --- NOTE: When you change these, also update mcl_craftguide for the "v6" icon in --- the craft guide! -if minetest.get_mapgen_setting("mg_name") == "v6" then - minetest.register_craft({ - output = "mcl_core:redsand 8", - recipe = { - { "mcl_core:sand", "mcl_core:sand", "mcl_core:sand" }, - { "mcl_core:sand", "mcl_nether:nether_wart_item", "mcl_core:sand" }, - { "mcl_core:sand", "mcl_core:sand", "mcl_core:sand" }, - } - }) -end - - -minetest.register_craft({ - output = "mcl_nether:quartz_smooth 4", - recipe = { - { "mcl_nether:quartz_block", "mcl_nether:quartz_block" }, - { "mcl_nether:quartz_block", "mcl_nether:quartz_block" }, - }, -}) - -minetest.register_craft({ - output = "mcl_core:sandstonesmooth2 4", - recipe = { - { "mcl_core:sandstonesmooth", "mcl_core:sandstonesmooth" }, - { "mcl_core:sandstonesmooth", "mcl_core:sandstonesmooth" }, - }, -}) - -minetest.register_craft({ - output = "mcl_core:redsandstonesmooth2 4", - recipe = { - { "mcl_core:redsandstonesmooth", "mcl_core:redsandstonesmooth" }, - { "mcl_core:redsandstonesmooth", "mcl_core:redsandstonesmooth" }, - }, -}) - -minetest.register_craft({ - output = "mcl_potions:dragon_breath 3", - recipe = { - {"","mcl_end:chorus_flower",""}, - {"mcl_potions:glass_bottle","mcl_potions:glass_bottle","mcl_potions:glass_bottle"}, - } -}) diff --git a/mods/MISC/mcl_temp_helper_recipes/mod.conf b/mods/MISC/mcl_temp_helper_recipes/mod.conf deleted file mode 100644 index 8fff70ece4..0000000000 --- a/mods/MISC/mcl_temp_helper_recipes/mod.conf +++ /dev/null @@ -1,5 +0,0 @@ -name = mcl_temp_helper_recipes -author = Wuzzy -description = Temporary helper recipes. -depends = mcl_core, mcl_mobitems, mcl_end, mcl_nether, mcl_ocean, mcl_stairs, xpanes - diff --git a/mods/PLAYER/mcl_meshhand/README.md b/mods/PLAYER/mcl_meshhand/README.md deleted file mode 100644 index 2c796ff32f..0000000000 --- a/mods/PLAYER/mcl_meshhand/README.md +++ /dev/null @@ -1,9 +0,0 @@ -Mesh hand mod for MineClone 2. - -This mod uses a better-looking mesh for the wieldhand and applies the player skin texture to it. - -== Credits == -Based on 3D Hand [newhand] mod by jordan4ibanez. -https://forum.minetest.net/viewtopic.php?t=16435 - -License: CC0 diff --git a/mods/PLAYER/mcl_meshhand/init.lua b/mods/PLAYER/mcl_meshhand/init.lua deleted file mode 100644 index 93f22c3250..0000000000 --- a/mods/PLAYER/mcl_meshhand/init.lua +++ /dev/null @@ -1,79 +0,0 @@ -local has_mcl_skins = minetest.get_modpath("mcl_skins") ~= nil - -local def = minetest.registered_items[""] - -local list --- mcl_skins is enabled -if has_mcl_skins == true then - list = mcl_skins.list -else - list = { "hand" } -end - ---generate a node for every skin -for _,texture in pairs(list) do - -- This is a fake node that should never be placed in the world - minetest.register_node("mcl_meshhand:"..texture, { - description = "", - tiles = {texture..".png"}, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, - visual_scale = 1, - wield_scale = {x=1,y=1,z=1}, - paramtype = "light", - drawtype = "mesh", - mesh = "mcl_meshhand.b3d", - -- Prevent construction - node_placement_prediction = "", - on_construct = function(pos) - minetest.log("error", "[mcl_meshhand] Trying to construct mcl_meshhand:"..texture.." at "..minetest.pos_to_string(pos)) - minetest.remove_node(pos) - end, - drop = "", - on_drop = function() - return "" - end, - groups = { dig_immediate = 3, not_in_creative_inventory = 1 }, - range = def.range, - _mcl_hand_id = texture, - }) - - minetest.register_node("mcl_meshhand:"..texture.. "_female", { - description = "", - tiles = {texture..".png"}, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, - visual_scale = 1, - wield_scale = {x=1,y=1,z=1}, - paramtype = "light", - drawtype = "mesh", - mesh = "mcl_meshhand_female.b3d", - -- Prevent construction - node_placement_prediction = "", - on_construct = function(pos) - minetest.log("error", "[mcl_meshhand] Trying to construct mcl_meshhand:"..texture.." at "..minetest.pos_to_string(pos)) - minetest.remove_node(pos) - end, - drop = "", - on_drop = function() - return "" - end, - groups = { dig_immediate = 3, not_in_creative_inventory = 1 }, - range = def.range, - _mcl_hand_id = texture .. "_female", - }) -end - -if has_mcl_skins == true then - --change the player's hand to their skin - mcl_skins.register_on_set_skin(function(player, skin) - local meta = mcl_skins.meta[skin] - if meta.gender == "female" then - player:get_inventory():set_stack("hand", 1, "mcl_meshhand:"..skin.."_female") - else - player:get_inventory():set_stack("hand", 1, "mcl_meshhand:"..skin) - end - end) -else - minetest.register_on_joinplayer(function(player) - player:get_inventory():set_stack("hand", 1, "mcl_meshhand:hand") - end) -end diff --git a/mods/PLAYER/mcl_meshhand/mod.conf b/mods/PLAYER/mcl_meshhand/mod.conf deleted file mode 100644 index 6a988417f8..0000000000 --- a/mods/PLAYER/mcl_meshhand/mod.conf +++ /dev/null @@ -1,6 +0,0 @@ -name = mcl_meshhand -author = jordan4ibanez -description = Applies the player skin texture to the hand. -depends = mcl_tools -optional_depends = mcl_skins - diff --git a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand.b3d b/mods/PLAYER/mcl_meshhand/models/mcl_meshhand.b3d deleted file mode 100644 index a38124c607..0000000000 Binary files a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand.b3d and /dev/null differ diff --git a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand.blend b/mods/PLAYER/mcl_meshhand/models/mcl_meshhand.blend deleted file mode 100644 index 495e74eb58..0000000000 Binary files a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand.blend and /dev/null differ diff --git a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand_female.b3d b/mods/PLAYER/mcl_meshhand/models/mcl_meshhand_female.b3d deleted file mode 100644 index b2ec6efcf8..0000000000 Binary files a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand_female.b3d and /dev/null differ diff --git a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand_female.blend b/mods/PLAYER/mcl_meshhand/models/mcl_meshhand_female.blend deleted file mode 100644 index be642496f1..0000000000 Binary files a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand_female.blend and /dev/null differ