From 5ca5811bc8a86a38b7721b6c739ff53b3b4e8bfe Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 8 May 2018 15:58:26 +0200 Subject: [PATCH 0001/1107] Refactor how the misc creative category works --- mods/ENTITIES/mobs/api.lua | 2 +- mods/HUD/mcl_inventory/creative.lua | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs/api.lua b/mods/ENTITIES/mobs/api.lua index 6d663e15..a59f2fc0 100644 --- a/mods/ENTITIES/mobs/api.lua +++ b/mods/ENTITIES/mobs/api.lua @@ -3337,7 +3337,7 @@ function 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 creative and no_creative == true then + if no_creative == true then grp.not_in_creative_inventory = 1 end diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 41bd3bc0..d76a5c98 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -25,34 +25,46 @@ do local is_weapon_or_armor = function(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.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 - if not def.groups.building_block and not def.groups.deco_block and not is_redstone(def) and not def.groups.transport and not def.groups.food and not def.groups.eatable and not is_tool(def) and not is_weapon_or_armor(def) and not def.groups.craftitem and not def.groups.brewitem then + -- Misc. category is for everything which is not in any other category + if not nonmisc then table.insert(inventory_lists["misc"], name) end From fff3eb1ee797b0f7c71b3de95f81290f8324c135 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 8 May 2018 16:32:07 +0200 Subject: [PATCH 0002/1107] Rename mcl_autogroup to _mcl_autogroup This should fix some autogroup-related issues due to loading order. --- mods/CORE/_mcl_autogroup/README.txt | 10 ++++++++++ .../CORE/{mcl_autogroup => _mcl_autogroup}/depends.txt | 0 mods/CORE/_mcl_autogroup/description.txt | 1 + mods/CORE/{mcl_autogroup => _mcl_autogroup}/init.lua | 8 -------- mods/CORE/_mcl_autogroup/mod.conf | 1 + mods/CORE/mcl_autogroup/mod.conf | 1 - mods/HUD/mcl_inventory/creative.lua | 2 +- mods/HUD/mcl_inventory/depends.txt | 2 +- mods/ITEMS/mcl_tools/depends.txt | 2 +- 9 files changed, 15 insertions(+), 12 deletions(-) create mode 100644 mods/CORE/_mcl_autogroup/README.txt rename mods/CORE/{mcl_autogroup => _mcl_autogroup}/depends.txt (100%) create mode 100644 mods/CORE/_mcl_autogroup/description.txt rename mods/CORE/{mcl_autogroup => _mcl_autogroup}/init.lua (94%) create mode 100644 mods/CORE/_mcl_autogroup/mod.conf delete mode 100644 mods/CORE/mcl_autogroup/mod.conf diff --git a/mods/CORE/_mcl_autogroup/README.txt b/mods/CORE/_mcl_autogroup/README.txt new file mode 100644 index 00000000..b7068a0b --- /dev/null +++ b/mods/CORE/_mcl_autogroup/README.txt @@ -0,0 +1,10 @@ +This mod automatically adds groups to items based on item metadata. + +Specifically, this mod has 2 purposes: +1) Automatically adding the group “solid” for blocks considered “solid” in Minecraft. +2) Generating digging time group for all nodes based on node metadata (it's complicated) + +See init.lua for more infos. + +The leading underscore in the name “_mcl_autogroup” was added to force Minetest to load this mod as late as possible. +As of 0.4.16, Minetest loads mods in reverse alphabetical order. diff --git a/mods/CORE/mcl_autogroup/depends.txt b/mods/CORE/_mcl_autogroup/depends.txt similarity index 100% rename from mods/CORE/mcl_autogroup/depends.txt rename to mods/CORE/_mcl_autogroup/depends.txt diff --git a/mods/CORE/_mcl_autogroup/description.txt b/mods/CORE/_mcl_autogroup/description.txt new file mode 100644 index 00000000..dbc4f318 --- /dev/null +++ b/mods/CORE/_mcl_autogroup/description.txt @@ -0,0 +1 @@ +MineClone 2 core mod which automatically adds groups to all items. Very important for digging times. diff --git a/mods/CORE/mcl_autogroup/init.lua b/mods/CORE/_mcl_autogroup/init.lua similarity index 94% rename from mods/CORE/mcl_autogroup/init.lua rename to mods/CORE/_mcl_autogroup/init.lua index 78067c80..16fa14c5 100644 --- a/mods/CORE/mcl_autogroup/init.lua +++ b/mods/CORE/_mcl_autogroup/init.lua @@ -1,11 +1,3 @@ ---[[ This mod automatically adds groups to items based on item metadata. - -Specifically, this mod has 2 purposes: -1) Automatically adding the group “solid” for blocks considered “solid” in Minecraft. -2) Generating digging time group for all nodes based on node metadata (it's complicated) - -]] - --[[ Mining times. Yeah, mining times … Alright, this is going to be FUN! This mod does include a HACK to make 100% sure the digging times of all tools match Minecraft's perfectly. diff --git a/mods/CORE/_mcl_autogroup/mod.conf b/mods/CORE/_mcl_autogroup/mod.conf new file mode 100644 index 00000000..fb171b76 --- /dev/null +++ b/mods/CORE/_mcl_autogroup/mod.conf @@ -0,0 +1 @@ +name = _mcl_autogroup diff --git a/mods/CORE/mcl_autogroup/mod.conf b/mods/CORE/mcl_autogroup/mod.conf deleted file mode 100644 index ec779665..00000000 --- a/mods/CORE/mcl_autogroup/mod.conf +++ /dev/null @@ -1 +0,0 @@ -name = mcl_autogroup diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index d76a5c98..aa38dbd6 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -11,7 +11,7 @@ for _, f in pairs(builtin_filter_ids) do end --[[ Populate all the item tables. We only do this once. Note this mod must be -loaded after mcl_autogroup for this to work, because it required certain +loaded after _mcl_autogroup for this to work, because it required certain groups to be set. ]] do for name,def in pairs(minetest.registered_items) do diff --git a/mods/HUD/mcl_inventory/depends.txt b/mods/HUD/mcl_inventory/depends.txt index 9b675be0..a174c0ee 100644 --- a/mods/HUD/mcl_inventory/depends.txt +++ b/mods/HUD/mcl_inventory/depends.txt @@ -1,3 +1,3 @@ mcl_init -mcl_autogroup? +_mcl_autogroup? 3d_armor? diff --git a/mods/ITEMS/mcl_tools/depends.txt b/mods/ITEMS/mcl_tools/depends.txt index a28b023b..5ce101ed 100644 --- a/mods/ITEMS/mcl_tools/depends.txt +++ b/mods/ITEMS/mcl_tools/depends.txt @@ -1,2 +1,2 @@ mcl_sounds -mcl_autogroup +_mcl_autogroup From 0d60b5218a0a36b4f8891748497f150251682c5d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 9 May 2018 01:57:18 +0200 Subject: [PATCH 0003/1107] Destroy arrow if inside solid node --- mods/ITEMS/mcl_bows/arrow.lua | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index a7e06ae8..f375686e 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -49,11 +49,11 @@ minetest.register_node("mcl_bows:arrow_box", { -- FIXME: Arrow velocity is a bit strange. If the arrow flies VERY long, the acceleration can cause the velocity to become negative -- and the arrow flies backwards. local ARROW_ENTITY={ - physical = true, + physical = false, visual = "wielditem", visual_size = {x=0.4, y=0.4}, textures = {"mcl_bows:arrow_box"}, - collisionbox = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + collisionbox = {0,0,0,0,0,0}, collide_with_objects = false, _lastpos={}, @@ -167,21 +167,13 @@ ARROW_ENTITY.on_step = function(self, dtime) end -- Check for node collision - -- FIXME: Also collides with ignore 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 - if (math.abs(vel.x) < 0.0001) or (math.abs(vel.z) < 0.0001) or (math.abs(vel.y) < 0.00001) then - -- Arrow is stuck and no longer moves - self._stuck = true - self._stucktimer = 0 - self.object:set_velocity({x=0, y=0, z=0}) - self.object:set_acceleration({x=0, y=0, z=0}) - -- Push the button - if minetest.get_modpath("mesecons_button") and minetest.get_item_group(node.name, "button") > 0 and minetest.get_item_group(node.name, "button_push_by_arrow") == 1 then - mesecon.push_button(dpos, node) - end + -- Arrow hits solid node: remove + if (def and def.walkable) then + self.object:remove() + return elseif (def and def.liquidtype ~= "none") then -- Slow down arrow in liquids local v = def.liquid_viscosity From af8515b6e48af851bfc8d3d0d6bf515c601d1dc4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 9 May 2018 15:10:56 +0200 Subject: [PATCH 0004/1107] Stuck arrows: Deflection, check stuck state, yaw --- mods/ITEMS/mcl_bows/arrow.lua | 79 ++++++++++++++++++++++++++++++++--- 1 file changed, 74 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index a7e06ae8..596a0d9b 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -1,8 +1,15 @@ -- 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 mod_mcl_hunger = minetest.get_modpath("mcl_hunger") 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 = "Arrow", @@ -14,7 +21,7 @@ An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a _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) - math.pi/2 + local yaw = math.atan2(dropdir.z, dropdir.x) + YAW_OFFSET mcl_bows.shoot_arrow(itemstack:get_name(), shootpos, dropdir, yaw, nil, 19, 3) end, }) @@ -61,9 +68,20 @@ local ARROW_ENTITY={ _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 } +local spawn_item = function(self, pos) + if not minetest.settings:get_bool("creative_mode") then + local item = minetest.add_item(pos, "mcl_bows:arrow") + item:set_velocity({x=0, y=0, z=0}) + item:set_yaw(self.object:get_yaw()) + end + self.object:remove() +end + ARROW_ENTITY.on_step = function(self, dtime) local pos = self.object:getpos() local dpos = table.copy(pos) -- digital pos @@ -72,10 +90,24 @@ ARROW_ENTITY.on_step = function(self, dtime) 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 + 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 local objects = minetest.get_objects_inside_radius(pos, 2) for _,obj in ipairs(objects) do if obj:is_player() then @@ -171,15 +203,40 @@ ARROW_ENTITY.on_step = function(self, dtime) 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 + -- Arrow has stopped in one axis, so it probably hit something if (math.abs(vel.x) < 0.0001) or (math.abs(vel.z) < 0.0001) or (math.abs(vel.y) < 0.00001) then - -- Arrow is stuck and no longer moves + -- Check for the node to which the arrow is pointing + local dir + if vel.y >= 0 and vel.y < 0.00001 then + dir = {x=0, y=-1, z=0} + elseif vel.y <= 0 and vel.y > 0.00001 then + dir = {x=0, y=1, z=0} + 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(pos, 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 + -- Lose 1/3 of velocity on deflection + self.object:set_velocity(vector.multiply(vel, 0.6667)) + return + end + + -- 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}) - -- Push the button - if minetest.get_modpath("mesecons_button") and minetest.get_item_group(node.name, "button") > 0 and minetest.get_item_group(node.name, "button_push_by_arrow") == 1 then + + -- 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 mesecon.push_button(dpos, node) end elseif (def and def.liquidtype ~= "none") then @@ -199,6 +256,12 @@ ARROW_ENTITY.on_step = function(self, dtime) end end + -- Update yaw + if not self._stuck then + local vel = self.object:get_velocity() + self.object:set_yaw(minetest.dir_to_yaw(vel)+YAW_OFFSET) + end + -- Update internal variable self._lastpos={x=pos.x, y=pos.y, z=pos.z} end @@ -210,6 +273,7 @@ ARROW_ENTITY.get_staticdata = function(self) damage = self._damage, stuck = self._stuck, stucktimer = self._stucktimer, + stuckin = self._stuckin, } if self._shooter and self._shooter:is_player() then out.shootername = self._shooter:get_player_name() @@ -224,7 +288,12 @@ ARROW_ENTITY.on_activate = function(self, staticdata, dtime_s) self._startpos = data.startpos self._damage = data.damage self._stuck = data.stuck + if self._stuck then + -- Perform a stuck recheck on the next step + self._stuckrechecktimer = STUCK_RECHECK_TIME + end self._stucktimer = data.stucktimer + self._stuckin = data.stuckin if data.shootername then local shooter = minetest.get_player_by_name(data.shootername) if shooter and shooter:is_player() then From 763d9458bf2b1d7550819e80d4f90e14be3863fb Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 9 May 2018 15:17:19 +0200 Subject: [PATCH 0005/1107] Fix arrows not getting stuck when flying up --- mods/ITEMS/mcl_bows/arrow.lua | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 596a0d9b..0360dc00 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -199,7 +199,6 @@ ARROW_ENTITY.on_step = function(self, dtime) end -- Check for node collision - -- FIXME: Also collides with ignore if self._lastpos.x~=nil and not self._stuck then local def = minetest.registered_nodes[node.name] local vel = self.object:get_velocity() @@ -207,10 +206,12 @@ ARROW_ENTITY.on_step = function(self, dtime) 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 vel.y >= 0 and vel.y < 0.00001 then - dir = {x=0, y=-1, z=0} - elseif vel.y <= 0 and vel.y > 0.00001 then - dir = {x=0, y=1, z=0} + 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 From 50eaaa15fa6e7e2fea3334e871acc6c11b18004d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 9 May 2018 15:56:52 +0200 Subject: [PATCH 0006/1107] Rework arrow box appearance --- mods/ITEMS/mcl_bows/arrow.lua | 16 ++++++++++++---- mods/ITEMS/mcl_bows/textures/mcl_bows_arrow.png | Bin 178 -> 173 bytes .../mcl_bows/textures/mcl_bows_arrow_back.png | Bin 121 -> 132 bytes .../mcl_bows/textures/mcl_bows_arrow_front.png | Bin 111 -> 110 bytes 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 0360dc00..6f9e2fdc 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -26,6 +26,9 @@ An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 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_bows:arrow_box", { drawtype = "nodebox", is_ground_content = false, @@ -33,11 +36,13 @@ minetest.register_node("mcl_bows:arrow_box", { type = "fixed", fixed = { -- Shaft - {-6.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17}, - --Spitze + {-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}, - --Federn + -- 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}, @@ -50,7 +55,10 @@ minetest.register_node("mcl_bows:arrow_box", { } }, tiles = {"mcl_bows_arrow.png^[transformFX", "mcl_bows_arrow.png^[transformFX", "mcl_bows_arrow_back.png", "mcl_bows_arrow_front.png", "mcl_bows_arrow.png", "mcl_bows_arrow.png^[transformFX"}, - groups = {not_in_creative_inventory=1}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + groups = {not_in_creative_inventory=1, dig_immediate=3}, }) -- FIXME: Arrow velocity is a bit strange. If the arrow flies VERY long, the acceleration can cause the velocity to become negative diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_arrow.png index ba70cfbf4fa2214362b5ee8894e6f23ba17277ba..278d910f204466a5e187feaa98cf198c25a7b4ef 100644 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0y~yU{C^K7G?$ph7*}$9~l@JL<4+6Tp1V`Uc7km^vQ#h z#}5`pxu*xYOz!Kbn7D2Q0|NtNNswPKgTu2MX$%YuZk{fVAr*|t5?u}g>p7N95L(93 zrlhK>Y9g3Cqodn9BZEVreVL@R_DUz080SU~4JMYA8oL^p9E5yX&Xy_2$FeNn-^R$m X@Z|>Y;Yx`+3?Sg?>gTe~DWM4f*j+SC literal 178 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I7G?$phQ^Te;|vT8(g8jpt_%zeuOHs~|NsBf zCl5{@KbRim66uY>;-^F{^+2F8*gzhDN3XE)Lq7#LhVT^vIy7?ULqId}vz zggOLx3WPQYMs^zR5)xnFk&#hVnVF%%(LTML!PSB3sY97Yz=l1G7c+-)Pw3CeU^mNl e@(X5gcy=R=fq_BI)5S5Qf-!jke*&vgiI{Un1_PURmS~UY-+l$| jh0K?2)_l9f&cN`{hc|Y=Df=@91_lOCS3j3^P6O#WAFUFsRiBhnDhP-qXm;;4j0|ILSNd90LOb NgQu&X%Q~loCIE(nB60u# literal 111 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4kiW$h6xih%orFL*h+%@f*HUdZyEbU1_lNd zPZ!6K3dUrKya!J{HaoOvI?ZJB`S9f=vqe(}j}~tU_tHc*hVS3~7f!P{`WB?o)78&q Iol`;+03gyG>Hq)$ From b61576e529f7a0011001424f4398c523a868254b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 9 May 2018 16:37:13 +0200 Subject: [PATCH 0007/1107] Tweak arrow collisionbox --- mods/ITEMS/mcl_bows/arrow.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 6f9e2fdc..c7528f7c 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -68,7 +68,7 @@ local ARROW_ENTITY={ visual = "wielditem", visual_size = {x=0.4, y=0.4}, textures = {"mcl_bows:arrow_box"}, - collisionbox = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + collisionbox = {-0.19, -0.125, -0.19, 0.19, 0.125, 0.19}, collide_with_objects = false, _lastpos={}, From e783ab17dc78f32d56f3c94b96805f18a6f2a715 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 9 May 2018 16:49:37 +0200 Subject: [PATCH 0008/1107] Force stuck arrows to be rechecked after punch --- mods/ITEMS/mcl_bows/arrow.lua | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index c7528f7c..5bbb0bf9 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -81,6 +81,7 @@ local ARROW_ENTITY={ _shooter=nil, -- ObjectRef of player or mob who shot it } +-- Destroy arrow entity self at pos and drops it as an item local spawn_item = function(self, pos) if not minetest.settings:get_bool("creative_mode") then local item = minetest.add_item(pos, "mcl_bows:arrow") @@ -275,6 +276,14 @@ ARROW_ENTITY.on_step = function(self, dtime) self._lastpos={x=pos.x, y=pos.y, z=pos.z} end +-- Force recheck of stuck arrows when punched. +-- Otherwise, punching has no effect. +ARROW_ENTITY.on_punch = function(self) + if self._stuck then + self._stuckrechecktimer = STUCK_RECHECK_TIME + end +end + ARROW_ENTITY.get_staticdata = function(self) local out = { lastpos = self._lastpos, From f6c5117bf7dbb9b07126dced848e6f48aa4901f5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 9 May 2018 17:04:13 +0200 Subject: [PATCH 0009/1107] Update arrow help --- mods/ITEMS/mcl_bows/arrow.lua | 11 +++++++++-- mods/ITEMS/mcl_bows/depends.txt | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 5bbb0bf9..0b838a23 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -14,8 +14,9 @@ local mod_button = minetest.get_modpath("mesecons_button") minetest.register_craftitem("mcl_bows:arrow", { description = "Arrow", _doc_items_longdesc = [[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.]], - _doc_items_usagehelp = "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.", +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.]], + _doc_items_usagehelp = "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 }, _on_dispense = function(itemstack, dispenserpos, droppos, dropnode, dropdir) @@ -105,6 +106,7 @@ ARROW_ENTITY.on_step = function(self, dtime) return end -- Drop arrow as item when it is no longer stuck + -- FIXME: Arrows are a bit slot 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 @@ -333,3 +335,8 @@ if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") the } }) end + +if minetest.get_modpath("doc_identifier") ~= nil then + doc.sub.identifier.register_object("mcl_bows:arrow_entity", "craftitems", "mcl_bows:arrow") +end + diff --git a/mods/ITEMS/mcl_bows/depends.txt b/mods/ITEMS/mcl_bows/depends.txt index eb7f075a..228a1357 100644 --- a/mods/ITEMS/mcl_bows/depends.txt +++ b/mods/ITEMS/mcl_bows/depends.txt @@ -6,4 +6,5 @@ mcl_core? mcl_mobitems? mcl_playerphysics? doc? +doc_identifier? mesecons_button? From 1bef0775cea1f854191a9194388a9570d58b1973 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 9 May 2018 17:31:04 +0200 Subject: [PATCH 0010/1107] Implement stuck arrow timeout properly --- mods/ITEMS/mcl_bows/arrow.lua | 38 ++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 0b838a23..442ceb21 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -48,7 +48,7 @@ minetest.register_node("mcl_bows:arrow_box", { {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}, @@ -140,7 +140,7 @@ ARROW_ENTITY.on_step = function(self, dtime) end end end - + -- Check for object collision. Done every tick (hopefully this is not too stressing) else local objs = minetest.get_objects_inside_radius(pos, 2) @@ -292,9 +292,15 @@ ARROW_ENTITY.get_staticdata = function(self) startpos = self._startpos, damage = self._damage, stuck = self._stuck, - stucktimer = self._stucktimer, 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 @@ -304,16 +310,28 @@ end ARROW_ENTITY.on_activate = function(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 - self._stuck = data.stuck - if self._stuck then - -- Perform a stuck recheck on the next step - self._stuckrechecktimer = STUCK_RECHECK_TIME - end - self._stucktimer = data.stucktimer - self._stuckin = data.stuckin if data.shootername then local shooter = minetest.get_player_by_name(data.shootername) if shooter and shooter:is_player() then From 7ca61b718542043f066af7fb385a71211cf831c9 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 9 May 2018 18:04:34 +0200 Subject: [PATCH 0011/1107] Fix button pushed by arrows from wrong direction --- mods/ITEMS/mcl_bows/arrow.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 442ceb21..ca1ca4b5 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -226,7 +226,7 @@ ARROW_ENTITY.on_step = function(self, dtime) 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(pos, dir) + self._stuckin = vector.add(dpos, dir) local snode = minetest.get_node(self._stuckin) local sdef = minetest.registered_nodes[snode.name] @@ -249,7 +249,11 @@ ARROW_ENTITY.on_step = function(self, dtime) -- 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 - mesecon.push_button(dpos, node) + 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 elseif (def and def.liquidtype ~= "none") then -- Slow down arrow in liquids From 294be0f30261b8cd2aef807adee934df5500c664 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 9 May 2018 18:19:42 +0200 Subject: [PATCH 0012/1107] Players must be closer to grab arrows --- mods/ITEMS/mcl_bows/arrow.lua | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index ca1ca4b5..5b3652b2 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -119,11 +119,11 @@ ARROW_ENTITY.on_step = function(self, dtime) end self._stuckrechecktimer = 0 end - local objects = minetest.get_objects_inside_radius(pos, 2) + -- 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.settings:get_bool("creative_mode") then - -- Pickup arrow if player is nearby 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", { @@ -131,13 +131,10 @@ ARROW_ENTITY.on_step = function(self, dtime) max_hear_distance = 16, gain = 1.0, }) - self.object:remove() - return end - else - self.object:remove() - return end + self.object:remove() + return end end From f0b732d7e0f66bd52d3f8c27803fc693aa604d3a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 9 May 2018 18:43:07 +0200 Subject: [PATCH 0013/1107] Place boats in the placer direction --- mods/ENTITIES/mcl_boats/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index b4138ee8..fb5e19ae 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -302,6 +302,7 @@ for b=1, #boat_ids do local boat = minetest.add_entity(pointed_thing.under, "mcl_boats:boat") boat:get_luaentity()._itemstring = itemstring boat:set_properties({textures = { "mcl_boats_texture_"..images[b].."_boat.png" }}) + boat:set_yaw(placer:get_look_horizontal()) if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() end From fab5d17a5d10ac5c0019413525be300b29c99824 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 9 May 2018 19:58:22 +0200 Subject: [PATCH 0014/1107] Remove help button from furnace formspec --- mods/ITEMS/mcl_furnaces/init.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index aaecd647..e409bd30 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -17,7 +17,6 @@ local function active_formspec(fuel_percent, item_percent) "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[lowpart:".. (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. "image_button[8,0;1,1;craftguide_book.png;craftguide;]".. - "image_button[8,1;1,1;doc_button_icon_lores.png;doc;]".. "tooltip[craftguide;Recipe book]".. "tooltip[doc;Help]".. "listring[current_name;dst]".. @@ -39,7 +38,6 @@ local inactive_formspec = "size[9,8.75]".. "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]".. "image_button[8,0;1,1;craftguide_book.png;craftguide;]".. - "image_button[8,1;1,1;doc_button_icon_lores.png;doc;]".. "tooltip[craftguide;Recipe book]".. "tooltip[doc;Help]".. "listring[current_name;dst]".. From c7949bf703b7e40764abefc67c413eee092f2635 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 12 May 2018 07:00:16 +0200 Subject: [PATCH 0015/1107] Arrows: Fix reverse flying arrows after long fly --- mods/ITEMS/mcl_bows/arrow.lua | 77 ++++++++++++++++++++++++++--------- mods/ITEMS/mcl_bows/bow.lua | 4 +- 2 files changed, 60 insertions(+), 21 deletions(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 5b3652b2..1b4871fa 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -62,8 +62,6 @@ minetest.register_node("mcl_bows:arrow_box", { groups = {not_in_creative_inventory=1, dig_immediate=3}, }) --- FIXME: Arrow velocity is a bit strange. If the arrow flies VERY long, the acceleration can cause the velocity to become negative --- and the arrow flies backwards. local ARROW_ENTITY={ physical = true, visual = "wielditem", @@ -80,6 +78,9 @@ local ARROW_ENTITY={ _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 @@ -145,6 +146,10 @@ ARROW_ENTITY.on_step = function(self, dtime) local closest_distance local ok = false + 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 -- Arrows can only damage players and mobs @@ -210,7 +215,8 @@ ARROW_ENTITY.on_step = function(self, dtime) 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 + -- 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 @@ -231,25 +237,56 @@ ARROW_ENTITY.on_step = function(self, dtime) -- This causes a deflection in the engine. if not sdef or sdef.walkable == false or snode.name == "ignore" then self._stuckin = nil - -- Lose 1/3 of velocity on deflection - self.object:set_velocity(vector.multiply(vel, 0.6667)) - return - end + if self._deflection_cooloff <= 0 then + -- Lose 1/3 of velocity on deflection + self.object:set_velocity(vector.multiply(vel, 0.6667)) - -- Node was walkable, make arrow stuck - self._stuck = true - self._stucktimer = 0 - self._stuckrechecktimer = 0 + -- Just some dirty hack to make sure the arrow has a minimum direction to + -- avoid triggering the stuck detection again. + vel = self.object:get_velocity() + if math.abs(vel.x) < 0.0001 then + if pos.x < self._lastpos.x then + vel.x = 0.01 + else + vel.x = -0.01 + end + end + if math.abs(vel.z) < 0.0001 then + if pos.z < self._lastpos.z then + vel.z = 0.01 + else + vel.z = -0.01 + end + end + if math.abs(vel.y) < 0.00001 then + if pos.y < self._lastpos.y then + vel.y = 0.001 + else + vel.y = -0.001 + end + end + self.object:set_velocity(vel) + self.object:set_yaw(minetest.dir_to_yaw(vel)+YAW_OFFSET) + -- Reset deflection cooloff timer to prevent many deflections happening in quick succession + self._deflection_cooloff = 0.2 + end + else - self.object:set_velocity({x=0, y=0, z=0}) - self.object:set_acceleration({x=0, y=0, z=0}) + -- Node was walkable, make arrow stuck + self._stuck = true + self._stucktimer = 0 + self._stuckrechecktimer = 0 - -- 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) + self.object:set_velocity({x=0, y=0, z=0}) + self.object:set_acceleration({x=0, y=0, z=0}) + + -- 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 @@ -258,6 +295,8 @@ ARROW_ENTITY.on_step = function(self, dtime) 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 diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 3f8bdc7c..93d480ed 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -39,8 +39,8 @@ mcl_bows.shoot_arrow = function(arrow_item, pos, dir, yaw, shooter, power, damag if damage == nil then damage = 3 end - obj:setvelocity({x=dir.x*power, y=dir.y*power, z=dir.z*power}) - obj:setacceleration({x=dir.x*-3, y=-GRAVITY, z=dir.z*-3}) + 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:setyaw(yaw-math.pi/2) local le = obj:get_luaentity() le._shooter = shooter From 0ec411b8689641f4abeb35b66f666b0c2bdc07f4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 12 May 2018 15:10:34 +0200 Subject: [PATCH 0016/1107] Fix arrows getting stuck in impossible ways --- mods/ITEMS/mcl_bows/arrow.lua | 31 +++---------------------------- 1 file changed, 3 insertions(+), 28 deletions(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 1b4871fa..a94233ec 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -239,36 +239,11 @@ ARROW_ENTITY.on_step = function(self, dtime) self._stuckin = nil if self._deflection_cooloff <= 0 then -- Lose 1/3 of velocity on deflection - self.object:set_velocity(vector.multiply(vel, 0.6667)) + local newvel = vector.multiply(vel, 0.6667) - -- Just some dirty hack to make sure the arrow has a minimum direction to - -- avoid triggering the stuck detection again. - vel = self.object:get_velocity() - if math.abs(vel.x) < 0.0001 then - if pos.x < self._lastpos.x then - vel.x = 0.01 - else - vel.x = -0.01 - end - end - if math.abs(vel.z) < 0.0001 then - if pos.z < self._lastpos.z then - vel.z = 0.01 - else - vel.z = -0.01 - end - end - if math.abs(vel.y) < 0.00001 then - if pos.y < self._lastpos.y then - vel.y = 0.001 - else - vel.y = -0.001 - end - end - self.object:set_velocity(vel) - self.object:set_yaw(minetest.dir_to_yaw(vel)+YAW_OFFSET) + self.object:set_velocity(newvel) -- Reset deflection cooloff timer to prevent many deflections happening in quick succession - self._deflection_cooloff = 0.2 + self._deflection_cooloff = 1.0 end else From 007b1c9b5d5a7d9ea064a4af7eabf78fd1684f33 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 12 May 2018 15:21:40 +0200 Subject: [PATCH 0017/1107] Version 0.37.0 --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8ca56240..1cb611fc 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.36.3 +Version: 0.37.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore @@ -130,7 +130,7 @@ The following main features are available: The following features are incomplete: -* Generated structures +* Generated structures (especially villages) * NPCs * Some monsters and animals * Redstone-related things @@ -139,6 +139,7 @@ The following features are incomplete: * Experience * Status effects * Brewing, potions, tipped arrows +* Special minecarts * A couple of non-trivial blocks and items Bonus features (not found in Minecraft 1.11): From b0fa20df75afc90fd44c48a2a6989e7ad6274af2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 12 May 2018 17:08:01 +0200 Subject: [PATCH 0018/1107] List incomplete items in README --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1cb611fc..e6825609 100644 --- a/README.md +++ b/README.md @@ -60,11 +60,20 @@ The following items are interesting for Creative Mode and for adventure map builders. They can not be obtained in-game or in the creative inventory. * Barrier: `mcl_core:barrier` -* Minecart with Command Block (does not work yet): `mcl_minecarts:command_block_minecart` Use the `/giveme` chat command to obtain them. See the in-game help for an explanation. +#### Incomplete items +These items do not work yet, but you can get them with `/giveme` for testing: + +* Fishing Rod: `mcl_fishing:fishing_rod` +* Activator Rail: `mcl_minecarts:activator_rail` +* Minecart with Chest: `mcl_minecarts:chest_minecart` +* Minecart with Furnace: `mcl_minecarts:furnace_minecart` +* Minecart with Hopper: `mcl_minecarts:hopper_minecart` +* Minecart with Command Block: `mcl_minecarts:command_block_minecart` + ## Installation This game requires [Minetest](http://minetest.net) 0.4.16 (or later) to run, so you need to install Minetest first. Only stable versions of Minetest are From d8ff91e089d28c84135d2b6d6e3a680e3e08f571 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 12 May 2018 18:18:17 +0200 Subject: [PATCH 0019/1107] Rename itemframes mod to mcl_itemframes --- .../{itemframes => mcl_itemframes}/README.txt | 0 .../depends.txt | 0 .../{itemframes => mcl_itemframes}/init.lua | 28 ++++++++++-------- .../mcl_itemframes_itemframe1facedir.obj} | 0 .../textures/mcl_itemframes_item_frame.png} | Bin .../mcl_itemframes_itemframe_background.png} | Bin tools/Conversion_Table.csv | 4 +-- 7 files changed, 17 insertions(+), 15 deletions(-) rename mods/ITEMS/{itemframes => mcl_itemframes}/README.txt (100%) rename mods/ITEMS/{itemframes => mcl_itemframes}/depends.txt (100%) rename mods/ITEMS/{itemframes => mcl_itemframes}/init.lua (79%) rename mods/ITEMS/{itemframes/models/itemframes_itemframe1facedir.obj => mcl_itemframes/models/mcl_itemframes_itemframe1facedir.obj} (100%) rename mods/ITEMS/{itemframes/textures/itemframes_frame.png => mcl_itemframes/textures/mcl_itemframes_item_frame.png} (100%) rename mods/ITEMS/{itemframes/textures/itemframe_background.png => mcl_itemframes/textures/mcl_itemframes_itemframe_background.png} (100%) diff --git a/mods/ITEMS/itemframes/README.txt b/mods/ITEMS/mcl_itemframes/README.txt similarity index 100% rename from mods/ITEMS/itemframes/README.txt rename to mods/ITEMS/mcl_itemframes/README.txt diff --git a/mods/ITEMS/itemframes/depends.txt b/mods/ITEMS/mcl_itemframes/depends.txt similarity index 100% rename from mods/ITEMS/itemframes/depends.txt rename to mods/ITEMS/mcl_itemframes/depends.txt diff --git a/mods/ITEMS/itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua similarity index 79% rename from mods/ITEMS/itemframes/init.lua rename to mods/ITEMS/mcl_itemframes/init.lua index 4b02ce90..4e7bd496 100644 --- a/mods/ITEMS/itemframes/init.lua +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -1,6 +1,6 @@ local tmp = {} -minetest.register_entity("itemframes:item",{ +minetest.register_entity("mcl_itemframes:item",{ hp_max = 1, visual="wielditem", visual_size={x=0.3,y=0.3}, @@ -43,12 +43,12 @@ facedir[3] = {x=-1,y=0,z=0} local remove_item = function(pos, node) local objs = nil - if node.name == "itemframes:frame" then + if node.name == "mcl_itemframes:item_frame" then objs = minetest.get_objects_inside_radius(pos, .5) end if objs then for _, obj in ipairs(objs) do - if obj and obj:get_luaentity() and obj:get_luaentity().name == "itemframes:item" then + if obj and obj:get_luaentity() and obj:get_luaentity().name == "mcl_itemframes:item" then obj:remove() end end @@ -59,7 +59,7 @@ local update_item = function(pos, node) remove_item(pos, node) local meta = minetest.get_meta(pos) if meta:get_string("item") ~= "" then - if node.name == "itemframes:frame" then + if node.name == "mcl_itemframes:item_frame" then local posad = facedir[node.param2] pos.x = pos.x + posad.x*6.5/16 pos.y = pos.y + posad.y*6.5/16 @@ -67,8 +67,8 @@ local update_item = function(pos, node) end tmp.nodename = node.name tmp.texture = ItemStack(meta:get_string("item")):get_name() - local e = minetest.add_entity(pos,"itemframes:item") - if node.name == "itemframes:frame" then + local e = minetest.add_entity(pos,"mcl_itemframes:item") + if node.name == "mcl_itemframes:item_frame" then local yaw = math.pi*2 - node.param2 * math.pi/2 e:setyaw(yaw) end @@ -77,7 +77,7 @@ end local drop_item = function(pos, node, meta) if meta:get_string("item") ~= "" then - if node.name == "itemframes:frame" and not minetest.settings:get_bool("creative_mode") then + if node.name == "mcl_itemframes:item_frame" and not minetest.settings:get_bool("creative_mode") then local item = ItemStack(minetest.deserialize(meta:get_string("itemdata"))) minetest.add_item(pos, item) end @@ -92,18 +92,18 @@ if minetest.get_modpath("screwdriver") then on_rotate = screwdriver.disallow end -minetest.register_node("itemframes:frame",{ +minetest.register_node("mcl_itemframes:item_frame",{ description = "Item Frame", _doc_items_longdesc = "Item frames are decorative blocks in which items can be placed.", _doc_items_usagehelp = "Hold any item in your hand and right-click the item frame to place the item into the frame. Rightclick the item frame again to retrieve the item.", drawtype = "mesh", is_ground_content = false, - mesh = "itemframes_itemframe1facedir.obj", + 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 = {"itemframe_background.png", "itemframe_background.png", "itemframe_background.png", "itemframe_background.png", "default_wood.png", "itemframe_background.png"}, - inventory_image = "itemframes_frame.png", - wield_image = "itemframes_frame.png", + 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, @@ -135,10 +135,12 @@ minetest.register_node("itemframes:frame",{ }) minetest.register_craft({ - output = 'itemframes:frame', + 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_alias("itemframes:frame", "mcl_itemframes:item_frame") diff --git a/mods/ITEMS/itemframes/models/itemframes_itemframe1facedir.obj b/mods/ITEMS/mcl_itemframes/models/mcl_itemframes_itemframe1facedir.obj similarity index 100% rename from mods/ITEMS/itemframes/models/itemframes_itemframe1facedir.obj rename to mods/ITEMS/mcl_itemframes/models/mcl_itemframes_itemframe1facedir.obj diff --git a/mods/ITEMS/itemframes/textures/itemframes_frame.png b/mods/ITEMS/mcl_itemframes/textures/mcl_itemframes_item_frame.png similarity index 100% rename from mods/ITEMS/itemframes/textures/itemframes_frame.png rename to mods/ITEMS/mcl_itemframes/textures/mcl_itemframes_item_frame.png diff --git a/mods/ITEMS/itemframes/textures/itemframe_background.png b/mods/ITEMS/mcl_itemframes/textures/mcl_itemframes_itemframe_background.png similarity index 100% rename from mods/ITEMS/itemframes/textures/itemframe_background.png rename to mods/ITEMS/mcl_itemframes/textures/mcl_itemframes_itemframe_background.png diff --git a/tools/Conversion_Table.csv b/tools/Conversion_Table.csv index 7fb39c66..15b33075 100644 --- a/tools/Conversion_Table.csv +++ b/tools/Conversion_Table.csv @@ -11,7 +11,7 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/items,bucket_water.png,/mods/ITEMS/mcl_buckets/textures,bucket_water.png,,,,,,, /assets/minecraft/textures/items,bucket_water.png,/mods/ITEMS/mcl_buckets/textures,bucket_river_water.png,,,,,,, /assets/minecraft/textures/items,bucket_lava.png,/mods/ITEMS/mcl_buckets/textures,bucket_lava.png,,,,,,, -/assets/minecraft/textures/items,item_frame.png,/mods/ITEMS/itemframes/textures,itemframes_frame.png,,,,,,, +/assets/minecraft/textures/items,item_frame.png,/mods/ITEMS/mcl_itemframes/textures,mcl_itemframes_item_frame.png,,,,,,, /assets/minecraft/textures/blocks,anvil_base.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_base.png,,,,,,, /assets/minecraft/textures/blocks,anvil_top_damaged_0.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_top_damaged_0.png,,,,,,, /assets/minecraft/textures/blocks,anvil_top_damaged_1.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_top_damaged_1.png,,,,,,, @@ -20,7 +20,7 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/blocks,anvil_side.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_side.png,,,,,,, /assets/minecraft/textures/items,name_tag.png,/mods/ENTITIES/mobs/textures,mobs_nametag.png,,,,,,, /assets/minecraft/textures/gui,icons.png,/mods/ENTITIES/mobs/textures,mobs_blood.png,16,0,9,9,0,0,y -/assets/minecraft/textures/blocks,itemframe_background.png,/mods/ITEMS/itemframes/textures,itemframe_background.png,,,,,,, +/assets/minecraft/textures/blocks,itemframe_background.png,/mods/ITEMS/mcl_itemframes/textures,mcl_itemframes_itemframe_background.png,,,,,,, /assets/minecraft/textures/items,bed.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_red.png,,,,,,, /assets/minecraft/textures/items,acacia_boat.png,/mods/ENTITIES/mcl_boats/textures,mcl_boats_acacia_boat.png,,,,,,, /assets/minecraft/textures/items,oak_boat.png,/mods/ENTITIES/mcl_boats/textures,mcl_boats_oak_boat.png,,,,,,, From 35b1f72559474c90d57b461a98ef4e37b73efd75 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 12 May 2018 18:50:44 +0200 Subject: [PATCH 0020/1107] Add minimal itemframe LBM for compatability --- mods/ITEMS/mcl_itemframes/init.lua | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua index 4e7bd496..a4807f0e 100644 --- a/mods/ITEMS/mcl_itemframes/init.lua +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -143,4 +143,14 @@ minetest.register_craft({ } }) -minetest.register_alias("itemframes:frame", "mcl_itemframes:item_frame") +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" + minetest.swap_node(pos, node) + update_item(pos, node) + end, +}) From 1a786bc64f11e5a4f4dbc816e425bd549dadfd77 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 12 May 2018 19:06:44 +0200 Subject: [PATCH 0021/1107] Itemframes: Refactor entity --- mods/ITEMS/mcl_itemframes/init.lua | 47 +++++++++++++++--------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua index a4807f0e..344ce0f8 100644 --- a/mods/ITEMS/mcl_itemframes/init.lua +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -1,37 +1,34 @@ -local tmp = {} - minetest.register_entity("mcl_itemframes:item",{ hp_max = 1, - visual="wielditem", - visual_size={x=0.3,y=0.3}, + visual = "wielditem", + visual_size = {x=0.3,y=0.3}, collisionbox = {0,0,0,0,0,0}, - physical=false, - textures={"air"}, + physical = false, + textures = { "empty.png" }, on_activate = function(self, staticdata) - if tmp.nodename ~= nil and tmp.texture ~= nil then - self.nodename = tmp.nodename - tmp.nodename = nil - self.texture = tmp.texture - tmp.texture = nil - else - if staticdata ~= nil and staticdata ~= "" then - local data = staticdata:split(';') - if data and data[1] and data[2] then - self.nodename = data[1] - self.texture = data[2] - end + if staticdata ~= nil and staticdata ~= "" then + local data = staticdata:split(';') + if data and data[1] and data[2] then + self._nodename = data[1] + self._texture = data[2] end end - if self.texture ~= nil then - self.object:set_properties({textures={self.texture}}) + if self._texture ~= nil then + self.object:set_properties({textures={self._texture}}) end end, get_staticdata = function(self) - if self.nodename ~= nil and self.texture ~= nil then - return self.nodename .. ';' .. self.texture + if self._nodename ~= nil and self._texture ~= nil then + return self._nodename .. ';' .. self._texture end return "" end, + + _update_texture = function(self) + if self._texture ~= nil then + self.object:set_properties({textures={self._texture}}) + end + end, }) @@ -65,9 +62,11 @@ local update_item = function(pos, node) pos.y = pos.y + posad.y*6.5/16 pos.z = pos.z + posad.z*6.5/16 end - tmp.nodename = node.name - tmp.texture = ItemStack(meta:get_string("item")):get_name() local e = minetest.add_entity(pos,"mcl_itemframes:item") + local lua = e:get_luaentity() + lua._nodename = node.name + lua._texture = ItemStack(meta:get_string("item")):get_name() + lua:_update_texture() if node.name == "mcl_itemframes:item_frame" then local yaw = math.pi*2 - node.param2 * math.pi/2 e:setyaw(yaw) From 8fd20975261bc93986cdb640694f4ba6afa961ee Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 12 May 2018 19:21:41 +0200 Subject: [PATCH 0022/1107] Itemframes: Show item name as info text --- mods/ITEMS/mcl_itemframes/init.lua | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua index 344ce0f8..d04922e4 100644 --- a/mods/ITEMS/mcl_itemframes/init.lua +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -38,7 +38,7 @@ 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 = function(pos, node) +local remove_item_entity = function(pos, node) local objs = nil if node.name == "mcl_itemframes:item_frame" then objs = minetest.get_objects_inside_radius(pos, .5) @@ -52,8 +52,8 @@ local remove_item = function(pos, node) end end -local update_item = function(pos, node) - remove_item(pos, node) +local update_item_entity = function(pos, node) + remove_item_entity(pos, node) local meta = minetest.get_meta(pos) if meta:get_string("item") ~= "" then if node.name == "mcl_itemframes:item_frame" then @@ -80,10 +80,11 @@ local drop_item = function(pos, node, meta) local item = ItemStack(minetest.deserialize(meta:get_string("itemdata"))) minetest.add_item(pos, item) end - meta:set_string("item","") - meta:set_string("itemdata","") + meta:set_string("item", "") + meta:set_string("itemdata", "") + meta:set_string("infotext", "") end - remove_item(pos, node) + remove_item_entity(pos, node) end local on_rotate @@ -118,8 +119,15 @@ minetest.register_node("mcl_itemframes:item_frame",{ put_itemstack:set_count(1) local itemdata = minetest.serialize(put_itemstack:to_table()) -- itemdata holds the serialized itemstack in table form + update_item_entity(pos,node) + -- Add node infotext when item has been named meta:set_string("itemdata", itemdata) - update_item(pos,node) + local imeta = itemstack:get_meta() + local iname = imeta:get_string("name") + if iname then + meta:set_string("infotext", iname) + end + if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() end @@ -150,6 +158,6 @@ minetest.register_lbm({ -- Swap legacy node, then respawn entity node.name = "mcl_itemframes:item_frame" minetest.swap_node(pos, node) - update_item(pos, node) + update_item_entity(pos, node) end, }) From 7f24912a35d581e549b91cd192c18ce60cec998f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 12 May 2018 19:52:40 +0200 Subject: [PATCH 0023/1107] Increase arrow hit range from 2 to 3 --- mods/ITEMS/mcl_bows/arrow.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index a94233ec..bd2bee44 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -139,9 +139,13 @@ ARROW_ENTITY.on_step = function(self, dtime) end end - -- Check for object collision. Done every tick (hopefully this is not too stressing) + -- Check for object "collision". Done every tick (hopefully this is not too stressing) else - local objs = minetest.get_objects_inside_radius(pos, 2) + -- 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, 3) local closest_object local closest_distance local ok = false From a14ba4d9ffa20c1b285161ca57615b67d4f400e1 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 12 May 2018 21:04:29 +0200 Subject: [PATCH 0024/1107] Change jukebox top texture --- .../mcl_jukebox/textures/mcl_jukebox_top.png | Bin 264 -> 193 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/ITEMS/mcl_jukebox/textures/mcl_jukebox_top.png b/mods/ITEMS/mcl_jukebox/textures/mcl_jukebox_top.png index ea271cb4ce0fce0a4087015247cc9559f505878e..66c3332e62263c7faef3ad82f34fd4d042d29683 100644 GIT binary patch delta 165 zcmeBRI>OT)H*eQ3Ua-NjSAGShHh7?z^ WB@v${l`}9fFnGH9xvX|li$%b#MVG{Ra-`H zUdYMg2iLDz`t-?z$i8Kg3=9mDJzX3_Dj0c=F|si^im*NSey^uv%YPn)qk7qmR)=p% zmo%3w+~u_0bAz~tby&ldo`$2de;qjPbHe4~%|pNcw;lAEdoA_q)}Y51LW;j= Date: Sat, 12 May 2018 21:50:56 +0200 Subject: [PATCH 0025/1107] Turn jukebox into a container (part 1) --- GROUPS.md | 1 + mods/CORE/mcl_util/init.lua | 27 +++++++++++++++++--- mods/ITEMS/mcl_jukebox/init.lua | 44 ++++++++++++++++++++++----------- 3 files changed, 55 insertions(+), 17 deletions(-) diff --git a/GROUPS.md b/GROUPS.md index 9000ee3f..217d18c1 100644 --- a/GROUPS.md +++ b/GROUPS.md @@ -151,6 +151,7 @@ These groups are used mostly for informational purposes * `container=5`: Left part of a 2-part horizontal connected container. Both parts have a `"main"` inventory list. Both inventories are considered to belong together. This is used for large chests. * `container=6`: Same as above, but for the right part. + * `container=7`: Same as `container=2`, but only music discs can be inserted * `container=1`: Other/unspecified container type * `spawn_egg=1`: Spawn egg diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index ae238ab6..cb70fe75 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -149,12 +149,18 @@ function mcl_util.get_eligible_transfer_item_slot(src_inventory, src_list, dst_i return nil end --- Returns true if given itemstack is a shulker box +-- Returns true if itemstack is a shulker box local is_not_shulker_box = function(itemstack) local g = minetest.get_item_group(itemstack:get_name(), "shulker_box") return g == 0 or g == nil end +-- Returns true itemstack is music disc +local is_music_disc = function(itemstack) + local g = minetest.get_item_group(itemstack:get_name(), "music_record") + return g ~= 0 and g ~= nil +end + -- Moves a single item from one inventory to another. --- source_inventory: Inventory to take the item from --- source_list: List name of the source inventory from which to take the item @@ -235,7 +241,7 @@ function mcl_util.move_item_container(source_pos, destination_pos, source_list, -- Default source lists if not source_list then -- Main inventory for most container types - if sctype == 2 or sctype == 3 or sctype == 5 or sctype == 6 then + if sctype == 2 or sctype == 3 or sctype == 5 or sctype == 6 or sctype == 7 then source_list = "main" -- Furnace: output elseif sctype == 4 then @@ -256,6 +262,10 @@ function mcl_util.move_item_container(source_pos, destination_pos, source_list, if dctype == 3 then cond = is_not_shulker_box end + -- Music disc only + if dctype == 7 then + cond = is_music_disc + end source_stack_id = mcl_util.get_eligible_transfer_item_slot(sinv, source_list, dinv, dpos, cond) if not source_stack_id then -- Try again if source is a double container @@ -281,13 +291,20 @@ function mcl_util.move_item_container(source_pos, destination_pos, source_list, return false end end + -- Container type 7 conly allows music discs + if dctype == 7 then + local stack = sinv:get_stack(source_list, source_stack_id) + if stack and minetest.get_item_group(stack:get_name(), "music_record") == 0 then + return false + end + end -- If it's a container, put it into the container if dctype ~= 0 then -- Automatically select a destination list if omitted if not destination_list then -- Main inventory for most container types - if dctype == 2 or dctype == 3 or dctype == 5 or dctype == 6 then + if dctype == 2 or dctype == 3 or dctype == 5 or dctype == 6 or dctype == 7 then destination_list = "main" -- Furnace source slot elseif dctype == 4 then @@ -312,6 +329,10 @@ function mcl_util.move_item_container(source_pos, destination_pos, source_list, -- Start furnace's timer function, it will sort out whether furnace can burn or not. minetest.get_node_timer(dpos):start(1.0) end + -- Update jukebox + if ok and dctype == 7 then + minetest.get_node_timer(dpos):start(0.0) + end return ok end diff --git a/mods/ITEMS/mcl_jukebox/init.lua b/mods/ITEMS/mcl_jukebox/init.lua index 7b0f2397..d54a235c 100644 --- a/mods/ITEMS/mcl_jukebox/init.lua +++ b/mods/ITEMS/mcl_jukebox/init.lua @@ -103,6 +103,24 @@ minetest.register_craft({ } }) +local play_record = function(pos, itemstack, player) + local record_id = minetest.get_item_group(itemstack:get_name(), "music_record") + if record_id ~= 0 then + local cname = "singleplayer" -- player:get_player_name() + if active_tracks[cname] ~= nil then + minetest.sound_stop(active_tracks[cname]) + active_tracks[cname] = nil + end + active_tracks[cname] = minetest.sound_play("mcl_jukebox_track_"..record_id, { + --to_player = cname, + max_hear_distance = 16, + gain = 1, + }) + --now_playing(player, record_id) + return true + end + return false +end -- Jukebox minetest.register_node("mcl_jukebox:jukebox", { @@ -111,7 +129,7 @@ minetest.register_node("mcl_jukebox:jukebox", { _doc_items_usagehelp = "Place a music disc into an empty jukebox to insert the music disc and play music. If the jukebox already has a music disc, you will retrieve this music disc first. The music can only be heard by you, not by other players.", tiles = {"mcl_jukebox_top.png", "mcl_jukebox_side.png", "mcl_jukebox_side.png"}, sounds = mcl_sounds.node_sound_wood_defaults(), - groups = {handy=1,axey=1, deco_block=1, material_wood=1}, + groups = {handy=1,axey=1, container=7, deco_block=1, material_wood=1}, is_ground_content = false, on_construct = function(pos) local meta = minetest.get_meta(pos) @@ -145,23 +163,13 @@ minetest.register_node("mcl_jukebox:jukebox", { end else -- Jukebox is empty: Play track if player holds music record - local record_id = minetest.get_item_group(itemstack:get_name(), "music_record") - if record_id ~= 0 then - if active_tracks[cname] ~= nil then - minetest.sound_stop(active_tracks[cname]) - active_tracks[cname] = nil - end - active_tracks[cname] = minetest.sound_play("mcl_jukebox_track_"..record_id, { - to_player = cname, - --max_hear_distance = 16, - gain = 1, - }) - now_playing(clicker, record_id) + local playing = play_record(pos, itemstack, clicker) + if playing then inv:set_stack("main", 1, itemstack:get_name()) itemstack:take_item() - return itemstack end end + return itemstack end, after_dig_node = function(pos, oldnode, oldmetadata, digger) local name = digger:get_player_name() @@ -184,6 +192,14 @@ minetest.register_node("mcl_jukebox:jukebox", { end meta:from_table(meta2:to_table()) end, + on_timer = function(pos, elapsed) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack("main", 1) + if not stack:is_empty() then + play_record(pos, stack) + end + end, _mcl_blast_resistance = 30, _mcl_hardness = 2, }) From e38f19b5f30894b437f978c4467d3141c73a164a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 12 May 2018 22:48:49 +0200 Subject: [PATCH 0026/1107] Comparator now detects jukebox as container --- GROUPS.md | 2 +- mods/CORE/mcl_util/init.lua | 16 +++++++--------- mods/ITEMS/mcl_jukebox/init.lua | 15 +++------------ 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/GROUPS.md b/GROUPS.md index 217d18c1..cf595783 100644 --- a/GROUPS.md +++ b/GROUPS.md @@ -151,7 +151,7 @@ These groups are used mostly for informational purposes * `container=5`: Left part of a 2-part horizontal connected container. Both parts have a `"main"` inventory list. Both inventories are considered to belong together. This is used for large chests. * `container=6`: Same as above, but for the right part. - * `container=7`: Same as `container=2`, but only music discs can be inserted + * `container=7`: Has inventory list "`main`", no movement allowed * `container=1`: Other/unspecified container type * `spawn_egg=1`: Spawn egg diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index cb70fe75..fbe4989b 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -211,6 +211,11 @@ function mcl_util.move_item_container(source_pos, destination_pos, source_list, local dctype = minetest.get_item_group(dnode.name, "container") local sctype = minetest.get_item_group(snode.name, "container") + -- Container type 7 does not allow any movement + if sctype == 7 then + return false + end + -- Normalize double container by forcing to always use the left segment first local normalize_double_container = function(pos, node, ctype) if ctype == 6 then @@ -291,12 +296,9 @@ function mcl_util.move_item_container(source_pos, destination_pos, source_list, return false end end - -- Container type 7 conly allows music discs + -- Container type 7 does not allow any placement if dctype == 7 then - local stack = sinv:get_stack(source_list, source_stack_id) - if stack and minetest.get_item_group(stack:get_name(), "music_record") == 0 then - return false - end + return false end -- If it's a container, put it into the container @@ -329,10 +331,6 @@ function mcl_util.move_item_container(source_pos, destination_pos, source_list, -- Start furnace's timer function, it will sort out whether furnace can burn or not. minetest.get_node_timer(dpos):start(1.0) end - -- Update jukebox - if ok and dctype == 7 then - minetest.get_node_timer(dpos):start(0.0) - end return ok end diff --git a/mods/ITEMS/mcl_jukebox/init.lua b/mods/ITEMS/mcl_jukebox/init.lua index d54a235c..5182c70e 100644 --- a/mods/ITEMS/mcl_jukebox/init.lua +++ b/mods/ITEMS/mcl_jukebox/init.lua @@ -106,17 +106,16 @@ minetest.register_craft({ local play_record = function(pos, itemstack, player) local record_id = minetest.get_item_group(itemstack:get_name(), "music_record") if record_id ~= 0 then - local cname = "singleplayer" -- player:get_player_name() + local cname = player:get_player_name() if active_tracks[cname] ~= nil then minetest.sound_stop(active_tracks[cname]) active_tracks[cname] = nil end active_tracks[cname] = minetest.sound_play("mcl_jukebox_track_"..record_id, { - --to_player = cname, - max_hear_distance = 16, + to_player = cname, gain = 1, }) - --now_playing(player, record_id) + now_playing(player, record_id) return true end return false @@ -192,14 +191,6 @@ minetest.register_node("mcl_jukebox:jukebox", { end meta:from_table(meta2:to_table()) end, - on_timer = function(pos, elapsed) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local stack = inv:get_stack("main", 1) - if not stack:is_empty() then - play_record(pos, stack) - end - end, _mcl_blast_resistance = 30, _mcl_hardness = 2, }) From bae1fa072c9f5b01460e961e9e91fc530fa14bd6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 12 May 2018 22:53:21 +0200 Subject: [PATCH 0027/1107] Remove dead code --- mods/CORE/mcl_util/init.lua | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index fbe4989b..54d5e363 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -155,12 +155,6 @@ local is_not_shulker_box = function(itemstack) return g == 0 or g == nil end --- Returns true itemstack is music disc -local is_music_disc = function(itemstack) - local g = minetest.get_item_group(itemstack:get_name(), "music_record") - return g ~= 0 and g ~= nil -end - -- Moves a single item from one inventory to another. --- source_inventory: Inventory to take the item from --- source_list: List name of the source inventory from which to take the item @@ -267,10 +261,6 @@ function mcl_util.move_item_container(source_pos, destination_pos, source_list, if dctype == 3 then cond = is_not_shulker_box end - -- Music disc only - if dctype == 7 then - cond = is_music_disc - end source_stack_id = mcl_util.get_eligible_transfer_item_slot(sinv, source_list, dinv, dpos, cond) if not source_stack_id then -- Try again if source is a double container From 44dc8d10bbae010c2f12c86be18ecce25d0e4e7b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 12 May 2018 23:50:17 +0200 Subject: [PATCH 0028/1107] Comparators now detect itemframes as container --- mods/ITEMS/mcl_itemframes/init.lua | 61 +++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua index d04922e4..de4307fe 100644 --- a/mods/ITEMS/mcl_itemframes/init.lua +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -5,6 +5,8 @@ minetest.register_entity("mcl_itemframes:item",{ collisionbox = {0,0,0,0,0,0}, physical = false, textures = { "empty.png" }, + _texture = "empty.png", + on_activate = function(self, staticdata) if staticdata ~= nil and staticdata ~= "" then local data = staticdata:split(';') @@ -55,17 +57,23 @@ end local update_item_entity = function(pos, node) remove_item_entity(pos, node) local meta = minetest.get_meta(pos) - if meta:get_string("item") ~= "" then + local inv = meta:get_inventory() + local item = inv:get_stack("main", 1) + if not item:is_empty() then if node.name == "mcl_itemframes:item_frame" then local posad = facedir[node.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 e = minetest.add_entity(pos,"mcl_itemframes:item") + local e = minetest.add_entity(pos, "mcl_itemframes:item") local lua = e:get_luaentity() lua._nodename = node.name - lua._texture = ItemStack(meta:get_string("item")):get_name() + if item:get_name() == "" then + lua._texture = "blank.png" + else + lua._texture = item:get_name() + end lua:_update_texture() if node.name == "mcl_itemframes:item_frame" then local yaw = math.pi*2 - node.param2 * math.pi/2 @@ -75,15 +83,14 @@ local update_item_entity = function(pos, node) end local drop_item = function(pos, node, meta) - if meta:get_string("item") ~= "" then - if node.name == "mcl_itemframes:item_frame" and not minetest.settings:get_bool("creative_mode") then - local item = ItemStack(minetest.deserialize(meta:get_string("itemdata"))) + if node.name == "mcl_itemframes:item_frame" and not minetest.settings:get_bool("creative_mode") 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 - meta:set_string("item", "") - meta:set_string("itemdata", "") - meta:set_string("infotext", "") end + meta:set_string("infotext", "") remove_item_entity(pos, node) end @@ -107,21 +114,31 @@ minetest.register_node("mcl_itemframes:item_frame",{ paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, - groups = { dig_immediate=3,deco_block=1,dig_by_piston=1}, + groups = { dig_immediate=3,deco_block=1,dig_by_piston=1,container=7 }, sounds = mcl_sounds.node_sound_defaults(), + 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 + if not itemstack then + return + end local meta = minetest.get_meta(pos) drop_item(pos, node, meta) - -- item holds the itemstring - meta:set_string("item", itemstack:get_name()) + 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 itemdata = minetest.serialize(put_itemstack:to_table()) - -- itemdata holds the serialized itemstack in table form - update_item_entity(pos,node) + inv:set_stack("main", 1, put_itemstack) + update_item_entity(pos, node) -- Add node infotext when item has been named - meta:set_string("itemdata", itemdata) local imeta = itemstack:get_meta() local iname = imeta:get_string("name") if iname then @@ -157,7 +174,17 @@ minetest.register_lbm({ 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, }) From acd58f6fe5ff79af5e4fbbc221805309f1f66ec7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 12 May 2018 23:57:49 +0200 Subject: [PATCH 0029/1107] Fix jukeboxes destroying music disc metadata --- mods/ITEMS/mcl_jukebox/init.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_jukebox/init.lua b/mods/ITEMS/mcl_jukebox/init.lua index 5182c70e..6ae5dbdf 100644 --- a/mods/ITEMS/mcl_jukebox/init.lua +++ b/mods/ITEMS/mcl_jukebox/init.lua @@ -150,7 +150,7 @@ minetest.register_node("mcl_jukebox:jukebox", { local ly = pos.y+1 local lz = pos.z local record = inv:get_stack("main", 1) - local dropped_item = minetest.add_item({x=lx, y=ly, z=lz}, record:get_name()) + local dropped_item = minetest.add_item({x=lx, y=ly, z=lz}, record) -- Rotate record to match with “slot” texture dropped_item:set_yaw(math.pi/2) inv:set_stack("main", 1, "") @@ -164,7 +164,9 @@ minetest.register_node("mcl_jukebox:jukebox", { -- Jukebox is empty: Play track if player holds music record local playing = play_record(pos, itemstack, clicker) if playing then - inv:set_stack("main", 1, itemstack:get_name()) + local put_itemstack = ItemStack(itemstack) + put_itemstack:set_count(1) + inv:set_stack("main", 1, put_itemstack) itemstack:take_item() end end From a62b5de79e7464dbaca8458ccbb7715341e21c06 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 13 May 2018 00:23:34 +0200 Subject: [PATCH 0030/1107] Cake+cauldron+endportalfr. put signal 4 comparator --- GROUPS.md | 1 + mods/ITEMS/REDSTONE/mcl_comparators/init.lua | 18 +++++++++++++----- mods/ITEMS/mcl_cake/init.lua | 16 ++++++++-------- mods/ITEMS/mcl_cauldrons/init.lua | 2 +- mods/ITEMS/mcl_portals/portal_end.lua | 2 +- 5 files changed, 24 insertions(+), 15 deletions(-) diff --git a/GROUPS.md b/GROUPS.md index cf595783..57c90eb4 100644 --- a/GROUPS.md +++ b/GROUPS.md @@ -55,6 +55,7 @@ Please read to learn how digging times * `cauldron`: Cauldron. 1: Empty. 2-4: Water height * `anvil`: Anvil. 1: No damage. 2-3: Higher damage levels * `no_rename=1`: Item cannot be renamed by anvil +* `comparator_signal=X`: If set, this node outputs a constant (!) comparator signal output of strength X. #### Footnotes diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/init.lua b/mods/ITEMS/REDSTONE/mcl_comparators/init.lua index c36c2f18..c25793f3 100644 --- a/mods/ITEMS/REDSTONE/mcl_comparators/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_comparators/init.lua @@ -53,7 +53,7 @@ local comparator_deactivate = function(pos, node) end --- wether pos has an inventory that contains at least one item +-- weather pos has an inventory that contains at least one item local container_inventory_nonempty = function(pos) local invnode = minetest.get_node(pos) local invnodedef = minetest.registered_nodes[invnode.name] @@ -75,13 +75,21 @@ local container_inventory_nonempty = function(pos) return false end +-- weather pos has an constant signal output for the comparator +local static_signal_output = function(pos) + local node = minetest.get_node(pos) + local g = minetest.get_item_group(node.name, "comparator_signal") + return g > 0 +end + -- whether the comparator should be on according to its inputs local comparator_desired_on = function(pos, node) local my_input_rules = comparator_get_input_rules(node); local back_rule = my_input_rules[1] local state if back_rule then - state = mesecon.is_power_on(vector.add(pos, back_rule)) or container_inventory_nonempty(vector.add(pos, back_rule)) + local back_pos = vector.add(pos, back_rule) + state = mesecon.is_power_on(back_pos) or container_inventory_nonempty(back_pos) or static_signal_output(back_pos) end -- if back input if off, we don't need to check side inputs @@ -307,19 +315,19 @@ minetest.register_craft({ -- Register active block handlers minetest.register_abm({ - label = "Comparator check for containers", + label = "Comparator signal input check (comparator is off)", nodenames = { "mcl_comparators:comparator_off_comp", "mcl_comparators:comparator_off_sub", }, - neighbors = {"group:container"}, + neighbors = {"group:container", "group:comparator_signal"}, interval = 1, chance = 1, action = update_self, }) minetest.register_abm({ - label = "Comparator check for no containers", + label = "Comparator signal input check (comparator is on)", nodenames = { "mcl_comparators:comparator_on_comp", "mcl_comparators:comparator_on_sub", diff --git a/mods/ITEMS/mcl_cake/init.lua b/mods/ITEMS/mcl_cake/init.lua index 4683ce75..fdc11015 100644 --- a/mods/ITEMS/mcl_cake/init.lua +++ b/mods/ITEMS/mcl_cake/init.lua @@ -46,7 +46,7 @@ minetest.register_node("mcl_cake:cake", { fixed = full_cake }, stack_max = 1, - groups = {handy=1, cake=7, food=2,no_eat_delay=1, attached_node=1, dig_by_piston=1}, + groups = {handy=1, cake=7, food=2,no_eat_delay=1, attached_node=1, dig_by_piston=1, comparator_signal=14}, drop = '', on_rightclick = function(pos, node, clicker, itemstack) local newcake = minetest.do_item_eat(2, ItemStack("mcl_cake:cake_6"), ItemStack("mcl_cake:cake"), clicker, {type="nothing"}) @@ -102,7 +102,7 @@ local register_slice = function(level, nodebox, desc) type = "fixed", fixed = nodebox, }, - groups = {handy=1, cake=level, food=2,no_eat_delay=1,attached_node=1,not_in_creative_inventory=1,dig_by_piston=1}, + groups = {handy=1, cake=level, food=2,no_eat_delay=1,attached_node=1,not_in_creative_inventory=1,dig_by_piston=1,comparator_signal=level*2}, drop = '', on_rightclick = on_rightclick, sounds = mcl_sounds.node_sound_leaves_defaults(), @@ -118,9 +118,9 @@ local register_slice = function(level, nodebox, desc) end end -register_slice(6, slice_6, "Cake (6 Slices Left") -register_slice(5, slice_5, "Cake (5 Slices Left") -register_slice(4, slice_4, "Cake (4 Slices Left") -register_slice(3, slice_3, "Cake (3 Slices Left") -register_slice(2, slice_2, "Cake (2 Slices Left") -register_slice(1, slice_1, "Cake (1 Slice Left") +register_slice(6, slice_6, "Cake (6 Slices Left)") +register_slice(5, slice_5, "Cake (5 Slices Left)") +register_slice(4, slice_4, "Cake (4 Slices Left)") +register_slice(3, slice_3, "Cake (3 Slices Left)") +register_slice(2, slice_2, "Cake (2 Slices Left)") +register_slice(1, slice_1, "Cake (1 Slice Left)") diff --git a/mods/ITEMS/mcl_cauldrons/init.lua b/mods/ITEMS/mcl_cauldrons/init.lua index 8ccd6ce4..0b447155 100644 --- a/mods/ITEMS/mcl_cauldrons/init.lua +++ b/mods/ITEMS/mcl_cauldrons/init.lua @@ -79,7 +79,7 @@ local register_filled_cauldron = function(water_level, description, river_water) drawtype = "nodebox", paramtype = "light", is_ground_content = false, - groups = {pickaxey=1, not_in_creative_inventory=1, cauldron=(1+water_level)}, + groups = {pickaxey=1, not_in_creative_inventory=1, cauldron=(1+water_level), comparator_signal=water_level}, node_box = cauldron_nodeboxes[water_level], collision_box = cauldron_nodeboxes[0], selection_box = { type = "regular" }, diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index b005a240..a83b42b2 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -309,7 +309,7 @@ minetest.register_node("mcl_portals:end_portal_frame", { minetest.register_node("mcl_portals:end_portal_frame_eye", { description = "End Portal Frame with Eye of Ender", _doc_items_create_entry = false, - groups = { creative_breakable = 1, not_in_creative_inventory = 1 }, + groups = { creative_breakable = 1, not_in_creative_inventory = 1, comparator_signal = 15 }, tiles = { "mcl_portals_endframe_top.png^[lowpart:75:mcl_portals_endframe_eye.png", "mcl_portals_endframe_bottom.png", "mcl_portals_endframe_eye.png^mcl_portals_endframe_side.png" }, paramtype2 = "facedir", drawtype = "nodebox", From 91fad8072da0be0eeaf469c55f70a8e2284331e0 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 13 May 2018 00:57:32 +0200 Subject: [PATCH 0031/1107] Register itemframe alias --- mods/ITEMS/mcl_itemframes/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua index de4307fe..b674a1cd 100644 --- a/mods/ITEMS/mcl_itemframes/init.lua +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -188,3 +188,5 @@ minetest.register_lbm({ update_item_entity(pos, node) end, }) + +minetest.register_alias("itemframes:frame", "mcl_itemframes:item_frame") From bf37c06de4b3e9c0383e3750df54196decbde83d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 13 May 2018 01:52:38 +0200 Subject: [PATCH 0032/1107] Add inner nodeboxes for banner nodes --- mods/ITEMS/mcl_banners/init.lua | 24 +++++++++++++++--- .../textures/mcl_banners_fallback_wood.png | Bin 0 -> 127 bytes tools/Conversion_Table.csv | 1 + 3 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 mods/ITEMS/mcl_banners/textures/mcl_banners_fallback_wood.png diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index 69906326..610f8b71 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -117,10 +117,20 @@ minetest.register_node("mcl_banners:standing_banner", { is_ground_content = false, paramtype = "light", sunlight_propagates = true, - drawtype = "airlike", + drawtype = "nodebox", + -- Nodebox is drawn as fallback when the entity is missing, so that the + -- banner node is never truly invisible. + -- If the entity is drawn, the nodebox disappears within the real banner mesh. + node_box = { + type = "fixed", + fixed = { -1/32, -0.49, -1/32, 1/32, 1.49, 1/32 }, + }, + -- This texture is based on the banner base texture + tiles = { "mcl_banners_fallback_wood.png" }, + inventory_image = "mcl_banners_item_base.png", wield_image = "mcl_banners_item_base.png", - tiles = { "blank.png" }, + selection_box = {type = "fixed", fixed= {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} }, groups = {axey=1,handy=1, attached_node = 1, not_in_creative_inventory = 1, not_in_craft_guide = 1, material_wood=1 }, stack_max = 16, @@ -139,10 +149,16 @@ minetest.register_node("mcl_banners:hanging_banner", { paramtype = "light", paramtype2 = "wallmounted", sunlight_propagates = true, - drawtype = "airlike", + drawtype = "nodebox", inventory_image = "mcl_banners_item_base.png", wield_image = "mcl_banners_item_base.png", - tiles = { "blank.png" }, + tiles = { "mcl_banners_fallback_wood.png" }, + node_box = { + type = "wallmounted", + wall_side = { -0.49, 0.41, -0.49, -0.41, 0.49, 0.49 }, + wall_top = { -0.49, 0.41, -0.49, -0.41, 0.49, 0.49 }, + wall_bottom = { -0.49, -0.49, -0.49, -0.41, -0.41, 0.49 }, + }, selection_box = {type = "wallmounted", wall_side = {-0.5, -0.5, -0.5, -4/16, 0.5, 0.5} }, groups = {axey=1,handy=1, attached_node = 1, not_in_creative_inventory = 1, not_in_craft_guide = 1, material_wood=1 }, stack_max = 16, diff --git a/mods/ITEMS/mcl_banners/textures/mcl_banners_fallback_wood.png b/mods/ITEMS/mcl_banners/textures/mcl_banners_fallback_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..4960f4fc5da0d35df99e9df7e208514b858589ce GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRdCT0c(hNQXTpBNYzI0Jk_TqC{hQ^Gv*5(3Q_ z{(Wa)U@-J_aSW+oOioEoNJuDQ7M$#GM9E^KfQt^R;7SE0As3fM4t;@(tm?NMj<^UI dGI}sDXnbLx*1-2MkAZ=K!PC{xWt~$(695CvAKU-{ literal 0 HcmV?d00001 diff --git a/tools/Conversion_Table.csv b/tools/Conversion_Table.csv index 15b33075..44bdc62b 100644 --- a/tools/Conversion_Table.csv +++ b/tools/Conversion_Table.csv @@ -871,6 +871,7 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/entity,sign.png,/mods/ITEMS/mcl_signs/textures,mcl_signs_sign.png,,,,,,, /assets/minecraft/textures/entity,banner_base.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_banner_base.png,,,,,,, /assets/minecraft/textures/entity/banner,base.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_base.png,,,,,,, +/assets/minecraft/textures/blocks,planks_oak.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_fallback_wood.png,,,,,,, /assets/minecraft/textures/items,banner_base.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_item_base.png,,,,,,, /assets/minecraft/textures/items,banner_overlay.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_item_overlay.png,,,,,,, /assets/minecraft/textures/blocks,portal.png,/mods/ITEMS/mcl_portals/textures,mcl_portals_portal.png,,,,,,, From f62f627443b3f26f13a9855552c3449f52edd027 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 13 May 2018 05:20:41 +0200 Subject: [PATCH 0033/1107] Add end portal frame with eye into creative inv. --- mods/ITEMS/mcl_portals/portal_end.lua | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index a83b42b2..eb304586 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -309,7 +309,7 @@ minetest.register_node("mcl_portals:end_portal_frame", { minetest.register_node("mcl_portals:end_portal_frame_eye", { description = "End Portal Frame with Eye of Ender", _doc_items_create_entry = false, - groups = { creative_breakable = 1, not_in_creative_inventory = 1, comparator_signal = 15 }, + groups = { creative_breakable = 1, deco_block = 1, comparator_signal = 15 }, tiles = { "mcl_portals_endframe_top.png^[lowpart:75:mcl_portals_endframe_eye.png", "mcl_portals_endframe_bottom.png", "mcl_portals_endframe_eye.png^mcl_portals_endframe_side.png" }, paramtype2 = "facedir", drawtype = "nodebox", @@ -331,6 +331,12 @@ minetest.register_node("mcl_portals:end_portal_frame_eye", { end_portal_area(ppos, true) end end, + on_construct = function(pos) + local ok, ppos = check_end_portal_frame(pos) + if ok then + end_portal_area(ppos) + end + end, on_rotate = rotate_frame_eye, @@ -358,7 +364,7 @@ minetest.override_item("mcl_end:ender_eye", { -- Place eye of ender into end portal frame if pointed_thing.under and node.name == "mcl_portals:end_portal_frame" then - minetest.swap_node(pointed_thing.under, { name = "mcl_portals:end_portal_frame_eye", param2 = node.param2 }) + minetest.set_node(pointed_thing.under, { name = "mcl_portals:end_portal_frame_eye", param2 = node.param2 }) if minetest.get_modpath("doc") then doc.mark_entry_as_revealed(user:get_player_name(), "nodes", "mcl_portals:end_portal_frame") @@ -370,9 +376,8 @@ minetest.override_item("mcl_end:ender_eye", { itemstack:take_item() -- 1 use end - local ok, ppos = check_end_portal_frame(pointed_thing.under) + local ok = check_end_portal_frame(pointed_thing.under) if ok then - end_portal_area(ppos) if minetest.get_modpath("doc") then doc.mark_entry_as_revealed(user:get_player_name(), "nodes", "mcl_portals:portal_end") end From b992100106100f3b693481f3995851a2311a1608 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 13 May 2018 18:03:57 +0200 Subject: [PATCH 0034/1107] More variations of mega spruces and large oaks --- mods/ITEMS/mcl_core/functions.lua | 8 ++++---- .../schematics/mcl_core_oak_large_3.mts | Bin 0 -> 207 bytes .../schematics/mcl_core_oak_large_4.mts | Bin 0 -> 250 bytes .../schematics/mcl_core_spruce_huge_1.mts | Bin 256 -> 282 bytes .../schematics/mcl_core_spruce_huge_2.mts | Bin 208 -> 227 bytes .../schematics/mcl_core_spruce_huge_3.mts | Bin 281 -> 270 bytes .../schematics/mcl_core_spruce_huge_4.mts | Bin 0 -> 295 bytes mods/MAPGEN/mcl_biomes/init.lua | 15 ++++++++------- 8 files changed, 12 insertions(+), 11 deletions(-) create mode 100644 mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_3.mts create mode 100644 mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_4.mts create mode 100644 mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_4.mts diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index d8eea101..a518bd37 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -345,11 +345,11 @@ function mcl_core.generate_oak_tree(pos) offset = { x = -2, y = -1, z = -2 } else -- Large balloon oak - local t = math.random(1, 2) + local t = math.random(1, 4) path = minetest.get_modpath("mcl_core") .. "/schematics/mcl_core_oak_large_"..t..".mts" - if t == 1 then + if t == 1 or t == 3 then offset = { x = -3, y = -1, z = -3 } - elseif t == 2 then + elseif t == 2 or t == 4 then offset = { x = -4, y = -1, z = -4 } end end @@ -484,7 +484,7 @@ end mcl_core.generate_huge_spruce_tree = function(pos) local r1 = math.random(1, 2) - local r2 = math.random(1, 3) + local r2 = math.random(1, 4) local path local offset = { x = -4, y = -1, z = -5 } if r1 <= 2 then diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_3.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_3.mts new file mode 100644 index 0000000000000000000000000000000000000000..bddcaefd4b08d988359f6f1c8f8a202c8c78a258 GIT binary patch literal 207 zcmeYb3HD`RVPI$AV_>hhuLpzVWDv!`%)p$OS;WAfo17D$oL`h`m6MuSmRiif3l}IU zN=>bp^EM=!uR(z)IcAT$`(uuqO2#LGg?IHYODW3^m^+)rNHjLJbY1J-S>DxQAHhz A&j0`b literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_4.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_4.mts new file mode 100644 index 0000000000000000000000000000000000000000..d3f345ffd3e0bc46859e89327f90b8150978a691 GIT binary patch literal 250 zcmeYb3HD`RVc=xoX5g&1uZIB!W(MZO%pwN<+~l12QEF<% zoVQb7^Bq>;Xgzv=-{;DbYb95el5)gL^IoRUVlsU0@aE`F)dfoGi?@lbou|3>mz;OH z+S+-V(ck2}({+|?syc7ge|2@S<#X=ucA~emRE(^&D$mE2Jl*ViOs;y}#u)qVP5XDJ z8}{F?(f9iIP&)PF-~X(SWCNz&JJry!t0FU1p?k`8+m}xirc6F878Up0;tt;d3mFTo t&w5AmCukj7eOx5N_oE>5`A1(?RGh7-`mJfN$;MxNC5Vda4-M> literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_1.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_1.mts index c7d220deedfa737b85f080fc4f1fb6ca730aedb8..d78e2fa673fcd90d6e979078a14cc8b9ed43c18d 100644 GIT binary patch delta 235 zcmZo*n#H8#8xrixz{0@AAj!a0Z=X_MUtbR*Qc_Yt3=lC<$+CXhTfSxm9@m57_ZP1| zy=}#m{#l}ow#)0!oaNms=2WoG`A^g|yBD(mbysH9m|lwbKsC|^C_lwE3 zk8K};)TI5by7l?^Jo|iy^S=|8?2avyeVg~b_0Jq{yL$zu*H)i5Ew-C{>=Jw7jN;HZ kh7ShMe(sB}y!AZ$>vM(z_o)4fj0_A64{W$EH?z$J0Pz@dga7~l delta 209 zcmbQm)WD?V8xrixz{0@AAj!a0j}=T*vaG-Mkgr*R$L(U7{=3!ZT_ZaJ1k71yRsVX= zExJu;afk6Pu|HnVS65%X_IDHeFVE+z1E*eVHTizzmRwl=>6O)AswSKZ=TBYReff^C zcXho2HWezWU>tdZg7&wD?eT{7eD#p=I&y+)@uOB(l| zuPA-C`Jvj~yzjqEuk}Rv-CcaW`(k=ay20XAtPBhcmtX$n_?S_~Hze4XfrWvKL70K7-aa9rzP`RbKOrH%KEJ+dqLfwrL#_q|9=7dqd)&>H zyRP{1I4`f;ZeOTyMYk&>;f8-FbLkP^pQe`TbFa#Hc+M^|nRU1?EAw*PZMUfZ?`3oA za(2Cb>0e&{;K;@oOEzy>d?4`H#m5>2rq-J-MizbEzWvOb`!c7uWbO~Ute=suGV5F7 mhh^3brytKbx;p6B{mip>nK$sU?fw6ifq~(`8<|bf=js5l6;+Y| delta 159 zcmaFNc!5#MHze4XfrWvKL6Cu~9tBL4v8uVq)u6z`u)S_i{Q3^1(#cAJn|JS(eRI$` zaEWutTx-6ZM`2Yn=WH&s{jPo~Ose;J#{0nKE5j|aI{H)^RKTQg=tg^3{ z30a)9u$;^C&bNBjwESC57w^|`zcP_sd{ualw9D#EHG8h|Ffd%uT>IaHfq|i)b(W#8 F835C;MPC2_ diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_3.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_spruce_huge_3.mts index 9204f3c9dec6e6a43249c24a384687192f9eed82..d3b80b1933587caacdb131c61d64ab2106ac34b5 100644 GIT binary patch delta 225 zcmbQq)W@Xe8xrixz{0@AAjQB{Z*Om34+aVK^$8#dqbDkw*T3aEq`>1E9e>AtzHyhL zQ=)v9_MFT1r+wdN?C>?4$a!IFg5Ie!UnBSKGfsEVId#T#by$2*cK(~WiIv}d-aeF_ zYE)dSy;?s!J3nV`Vx|55@clPVo{svz);90Sx~01>I$h3+FH-mQ$=w|uH_K#eentQL z&?!3SGu}AbJ-%ow!MM+edt13)($j6}S^V!$xSZ$xqp)2soS{MMw9&iEVSm)W?q_D0 UA^HA)2m=EHL&r(plMNOU0MavK$^ZZW delta 236 zcmeBUn#rW-8xrixz{0@AAj-g1j}1&zGq1lb)U3ec;#t3E|GK>vVVfpOglu_p^0uEx z0&}0{T^7m5r@sDj+P84(o$D*kS6`2Q{h423{wtZTGbV_6h#` ztN!-936EU${QJ(D>jm?+-|IduaXjnOwIX)ATbEXPPBxiedX42-bp^LARGP_qJ$i>Lm(i)+`Gu1R6$2n)V*yni#Z=M9Er zj=74LKgjeeJTcxP^gI4`|Ki6>Ki%Pc^88wQXParhzuOim_to#+V@v-tm2v(2xpw>a zOZ%Sgta$qO#C%Vi^(ObakDJtFe7csjJT3S2i$$IhwvncdpS?c6>s-B5v Date: Sun, 13 May 2018 18:39:47 +0200 Subject: [PATCH 0035/1107] Tweaking of the new tree schematics --- .../schematics/mcl_core_oak_large_4.mts | Bin 250 -> 248 bytes mods/MAPGEN/mcl_biomes/init.lua | 10 +++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_4.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_4.mts index d3f345ffd3e0bc46859e89327f90b8150978a691..b1bc17ac11742af8b44f4f637ea778333e52d0a0 100644 GIT binary patch delta 206 zcmeyx_=8cvHze4XfrWvSftP`^-oCzmBA-e9O}YQbu6W^j@twQ2_{ml8FFuRu4b$_Qw$FXGab~(xWcc~1-yQFo?=}v~2+(+y z5q2p?uc~OePSCfU(|N~#8S5HH%z0U8^W9dr^7Qub$8!IJTdXH&ev5Mmk=*$_&LQaS zYrc;?drXfMYlQFeKKPcYr;>|ZU#|T#i%aH?eE+Wdlm8uEn7(UA*q!s0q@7+)g* delta 208 zcmeyt_=}OxHze4XfrWvSft!J|-hQHhN&RcS!wMX&NAK_ZTv>9h9qj(BO_%k)`H zhR+?|9Nnq9KuLY^HnFwyG}r!;^G;V=J5MwEo1AyL&XP@4=dJp$t}eEG&i&m^^p=*2 zk(E~E`M8p&n_Z8|Rj=C^W8b}L|L%0d{`)ohUjH6Sr+)nVpY@S!z|?!E8aj4WWTq-~ zPq}Vu`SOXvl*xz1qT-%g+~GT5A!DKSS?_561g%4>kBemZeiURr|LDt#inA3}zcuZ3 Ryg3s0%Y{8-U00G72>^I8U?>0p diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index f97cdca9..20a08664 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1763,7 +1763,7 @@ local function register_decorations() place_on = {"group:grass_block", "mcl_core:dirt", }, sidelen = 80, noise_params = { - offset = -0.0008, + offset = -0.0007, scale = 0.001, spread = {x = 250, y = 250, z = 250}, seed = 3, @@ -2057,10 +2057,10 @@ local function register_decorations() end -- Huge spruce - quick_spruce(3000, 0.00205, "mcl_core_spruce_huge_1.mts", {"MegaSpruceTaiga"}) - quick_spruce(4000, 0.00245, "mcl_core_spruce_huge_2.mts", {"MegaSpruceTaiga"}) - quick_spruce(6000, 0.00245, "mcl_core_spruce_huge_3.mts", {"MegaSpruceTaiga"}) - quick_spruce(6600, 0.00245, "mcl_core_spruce_huge_4.mts", {"MegaSpruceTaiga"}) + 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"}) From 6894721e8d8eedf3a009057f1f802fad29caf806 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 13 May 2018 18:53:42 +0200 Subject: [PATCH 0036/1107] Fix trunk of balloon oak 1 not being force-placed --- .../schematics/mcl_core_oak_large_1.mts | Bin 218 -> 233 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_1.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_oak_large_1.mts index 5da925f1be6b5344a8ba538d8773d695111c9484..4dc118964a288d8d13b8a0b69e3296c9d0b7bdae 100644 GIT binary patch delta 191 zcmcb`_>z&&Hze4XfrWvcftP{3-hLvVN&VH3Xubvop5nTSc)tsalPjz)2s*f|<%|{G zp659IsbPSS@MYDh`^=dq`3tWNoFBTcJdJ;n|Ehga)e-sHmGh2>#ICw0=XRj-;m`T= zzG~ceSNR$ccK@$g`hVwyaMo1T15@g+&AzP4yyc6q`D~E{0Z^N)wdm_>(ajSm31vhZw3G@T~RLp delta 176 zcmaFKc#DzGHze4XfrWvcftP{3zJ4N~N&VX(N4^FHp5&VH{u`H{3uzxaZci7mYv5@1Fi% z+_r!3YwIO(@2+Uf_oxsMbUhW2ZT{BPYszH#FI7zzll5MBl%1DQOOc%NW734X_kGUX jnkdXAX^|@NV%M_mHTDnIc}rI9ozU9Kc!R;9KIJ|DB`Qw9 From fcc53f4151067e5d7d2e466c85d6d2f08134d9ad Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 14 May 2018 16:31:17 +0200 Subject: [PATCH 0037/1107] Remove inventory images of some internal nodes --- mods/ITEMS/REDSTONE/mesecons_wires/init.lua | 14 ++++++++++---- mods/ITEMS/mcl_fences/init.lua | 2 -- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_wires/init.lua b/mods/ITEMS/REDSTONE/mesecons_wires/init.lua index 921caeb3..c66d04a5 100644 --- a/mods/ITEMS/REDSTONE/mesecons_wires/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_wires/init.lua @@ -215,7 +215,7 @@ local function register_wires() local tiles_off = { crossing_off, crossing_off, straight0_off, straight1_off, straight0_off, straight1_off } local tiles_on = { crossing_on, crossing_on, straight0_on, straight1_on, straight0_on, straight1_on } - local wirehelp, longdesc, usagehelp + local wirehelp, longdesc, usagehelp, img, desc_off, desc_on if nodeid == "00000000" then -- Non-connected redstone wire nodebox.fixed = {-8/16, -.5, -8/16, 8/16, -.5+1/64, 8/16} @@ -229,19 +229,21 @@ Redstone power can be received from various redstone components, such as a block usagehelp = [[Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills. An easy way to power a redstone trail is by placing a redstone torch. Read the help entries on the other redstone components to learn how redstone components interact.]] + img = "redstone_redstone_dust.png" + desc_off = "Redstone" + desc_on = "Powered Redstone Spot ("..nodeid..")" else -- Connected redstone wire table.insert(nodebox, box_center) tiles_off = { crossing_off, crossing_off, straight0_off, straight1_off, straight0_off, straight1_off, } tiles_on = { crossing_on, crossing_on, straight0_on, straight1_on, straight0_on, straight1_on, } wirehelp = false + desc_off = "Redstone Trail ("..nodeid..")" + desc_on = "Powered Redstone Trail ("..nodeid..")" end mesecon.register_node(":mesecons:wire_"..nodeid, { - description = "Redstone", drawtype = "nodebox", - inventory_image = "redstone_redstone_dust.png", - wield_image = "redstone_redstone_dust.png", paramtype = "light", sunlight_propagates = true, selection_box = selectionbox, @@ -252,6 +254,9 @@ Read the help entries on the other redstone components to learn how redstone com is_ground_content = false, mesecon_wire = true },{ + description = desc_off, + inventory_image = img, + wield_image = img, _doc_items_create_entry = wirehelp, _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, @@ -259,6 +264,7 @@ Read the help entries on the other redstone components to learn how redstone com mesecons = meseconspec_off, groups = groups_off, },{ + description = desc_on, _doc_items_create_entry = false, tiles = tiles_on, mesecons = meseconspec_on, diff --git a/mods/ITEMS/mcl_fences/init.lua b/mods/ITEMS/mcl_fences/init.lua index 6ba95bd5..90629d68 100644 --- a/mods/ITEMS/mcl_fences/init.lua +++ b/mods/ITEMS/mcl_fences/init.lua @@ -128,8 +128,6 @@ mcl_fences.register_fence_gate = function(id, fence_gate_name, texture, groups, tiles = {texture}, paramtype = "light", paramtype2 = "facedir", - inventory_image = "mcl_fences_fence_gate_mask.png^" .. texture .. "^mcl_fences_fence_gate_mask.png^[makealpha:255,126,126", - wield_image = "mcl_fences_fence_gate_mask.png^" .. texture .. "^mcl_fences_fence_gate_mask.png^[makealpha:255,126,126", is_ground_content = false, sunlight_propagates = true, walkable = false, From ad69aa20ce0a87100d3772aede57a0bbb72a10ef Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 15 May 2018 02:05:00 +0200 Subject: [PATCH 0038/1107] Release 0.38.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e6825609..5ca4fd05 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.37.0 +Version: 0.38.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 88ca7c9a7e27fd76cad42b4b80f973e3a02288b9 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 May 2018 15:53:00 +0200 Subject: [PATCH 0039/1107] Red v6 sand must now be crafted with nether wart --- mods/HELP/mcl_craftguide/init.lua | 2 +- mods/MISC/mcl_temp_helper_recipes/init.lua | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index c6ef5898..bc6a8af9 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -229,7 +229,7 @@ function craftguide:get_recipe(iY, xoffset, tooltip_raw, item, recipe_num, recip items[2] == "mcl_core:sand" and items[3] == "mcl_core:sand" and items[4] == "mcl_core:sand" and - items[5] == "mcl_dye:red" and + items[5] == "mcl_nether:nether_wart_item" and items[6] == "mcl_core:sand" and items[7] == "mcl_core:sand" and items[8] == "mcl_core:sand" and diff --git a/mods/MISC/mcl_temp_helper_recipes/init.lua b/mods/MISC/mcl_temp_helper_recipes/init.lua index f2e55810..06206372 100644 --- a/mods/MISC/mcl_temp_helper_recipes/init.lua +++ b/mods/MISC/mcl_temp_helper_recipes/init.lua @@ -109,13 +109,15 @@ minetest.register_craft({ }, }) --- Make red sand craftable in v6 +-- 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_dye:red", "mcl_core:sand" }, + { "mcl_core:sand", "mcl_nether:nether_wart_item", "mcl_core:sand" }, { "mcl_core:sand", "mcl_core:sand", "mcl_core:sand" }, } }) From 51b6d07d0c2da109255e72fa5bdbee75b09fb072 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 May 2018 16:55:52 +0200 Subject: [PATCH 0040/1107] Make cmd blocks execute cmds on behalf of placer --- .../REDSTONE/mesecons_commandblock/init.lua | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua index b7343c93..1af11a19 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua @@ -1,19 +1,15 @@ -local function initialize_data(meta) - local commands = minetest.formspec_escape(meta:get_string("commands")) -end - local function construct(pos) local meta = minetest.get_meta(pos) meta:set_string("commands", "") - initialize_data(meta) + meta:set_string("commander", "") end local function after_place(pos, placer) if placer then local meta = minetest.get_meta(pos) - initialize_data(meta) + meta:set_string("commander", placer:get_player_name()) end end @@ -93,19 +89,20 @@ local function commandblock_action_on(pos, node) local commands = resolve_commands(meta:get_string("commands"), pos) for _, command in pairs(commands:split("\n")) do - local pos = command:find(" ") + local cpos = command:find(" ") local cmd, param = command, "" - if pos then - cmd = command:sub(1, pos - 1) - param = command:sub(pos + 1) + if cpos then + cmd = command:sub(1, cpos - 1) + param = command:sub(cpos + 1) end local cmddef = minetest.chatcommands[cmd] if not cmddef then -- Invalid chat command return end - local dummy_player = "" - cmddef.func(dummy_player, param) + -- Execute command in the name of commander + local commander = meta:get_string("commander") + cmddef.func(commander, param) end end @@ -128,10 +125,18 @@ local on_rightclick = function(pos, node, player, itemstack, pointed_thing) local meta = minetest.get_meta(pos) local commands = meta:get_string("commands") + local commander = meta:get_string("commander") + local commanderstr + if commander == "" or commander == nil then + commanderstr = "Error: No commander! Block must be replaced." + else + commanderstr = "Commander: "..commander + end local formspec = "invsize[9,5;]" .. "textarea[0.5,0.5;8.5,4;commands;Commands;"..commands.."]" .. "button_exit[3.3,4.5;2,1;submit;Submit]" .. "image_button[8,4.5;1,1;doc_button_icon_lores.png;doc;]" .. + "label[0,4.5;"..minetest.formspec_escape(commanderstr).."]" .. "tooltip[doc;Help]" minetest.show_formspec(player:get_player_name(), "commandblock_"..pos.x.."_"..pos.y.."_"..pos.z, formspec) end @@ -168,6 +173,8 @@ minetest.register_node("mesecons_commandblock:commandblock_off", { To place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Rightclick the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced topics > Server Commands” to understand how they work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom. +All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block. + You can optionally use the following placeholders in your commands: • “@nearest” is replaced by the name of the player nearest to the command block • “@farthest” is replaced by the name of the player farthest away from the command block @@ -250,7 +257,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) return else meta:set_string("commands", fields.commands) - initialize_data(meta) end else minetest.chat_send_player(player:get_player_name(), "Editing the command block has failed! The command block is gone.") From a91e0cc537235a8e4634c33cdddca7c09386d2f0 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 May 2018 17:07:11 +0200 Subject: [PATCH 0041/1107] Add @commander placeholder to command blocks --- .../REDSTONE/mesecons_commandblock/init.lua | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua index 1af11a19..b41f20d9 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua @@ -16,13 +16,17 @@ end local function resolve_commands(commands, pos) local players = minetest.get_connected_players() + local meta = minetest.get_meta(pos) + local commander = meta:get_string("commander") + -- No players online: remove all commands containing - -- @nearest, @farthest and @random + -- “@” placeholders if #players == 0 then commands = commands:gsub("[^\r\n]+", function (line) if line:find("@nearest") then return "" end if line:find("@farthest") then return "" end if line:find("@random") then return "" end + if line:find("@commander") then return commander end return line end) return commands @@ -45,6 +49,7 @@ local function resolve_commands(commands, pos) commands = commands:gsub("@nearest", nearest) commands = commands:gsub("@farthest", farthest) commands = commands:gsub("@random", random) + commands = commands:gsub("@commander", commander) return commands end @@ -136,7 +141,7 @@ local on_rightclick = function(pos, node, player, itemstack, pointed_thing) "textarea[0.5,0.5;8.5,4;commands;Commands;"..commands.."]" .. "button_exit[3.3,4.5;2,1;submit;Submit]" .. "image_button[8,4.5;1,1;doc_button_icon_lores.png;doc;]" .. - "label[0,4.5;"..minetest.formspec_escape(commanderstr).."]" .. + "label[0,4;"..minetest.formspec_escape(commanderstr).."]" .. "tooltip[doc;Help]" minetest.show_formspec(player:get_player_name(), "commandblock_"..pos.x.."_"..pos.y.."_"..pos.z, formspec) end @@ -175,10 +180,11 @@ To place a command block and change the commands, you need to be in Creative Mod All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block. -You can optionally use the following placeholders in your commands: -• “@nearest” is replaced by the name of the player nearest to the command block -• “@farthest” is replaced by the name of the player farthest away from the command block -• “@random” is replaced by the name of a random player currently connected +Command blocks support placeholders, insert one of these placerholders and they will be replaced by a player name: +• “@commander”: commander of this command block +• “@nearest”: nearest player from the command block +• “@farthest” farthest player from the command block +• “@random”: random player currently in the world Example 1: time 12000 From dd380963ce60afa7c9512c0422f5d917ccc4b7bc Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 May 2018 17:31:01 +0200 Subject: [PATCH 0042/1107] =?UTF-8?q?Add=20=E2=80=9C@@=E2=80=9D=20placehol?= =?UTF-8?q?der=20to=20cmd=20blocks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua index b41f20d9..6e80d8e2 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua @@ -19,14 +19,19 @@ local function resolve_commands(commands, pos) local meta = minetest.get_meta(pos) local commander = meta:get_string("commander") + -- A non-printable character used while replacing “@@”. + local SUBSTITUTE_CHARACTER = '\26' -- ASCII SUB + -- No players online: remove all commands containing - -- “@” placeholders + -- problematic placeholders. if #players == 0 then commands = commands:gsub("[^\r\n]+", function (line) + line = line:gsub("@@", SUBSTITUTE_CHARACTER) if line:find("@nearest") then return "" end if line:find("@farthest") then return "" end if line:find("@random") then return "" end - if line:find("@commander") then return commander end + line = line:gsub("@commander", commander) + line = line:gsub(SUBSTITUTE_CHARACTER, "@") return line end) return commands @@ -46,10 +51,12 @@ local function resolve_commands(commands, pos) end end local random = players[math.random(#players)]:get_player_name() + commands = commands:gsub("@@", SUBSTITUTE_CHARACTER) commands = commands:gsub("@nearest", nearest) commands = commands:gsub("@farthest", farthest) commands = commands:gsub("@random", random) commands = commands:gsub("@commander", commander) + commands = commands:gsub(SUBSTITUTE_CHARACTER, "@") return commands end @@ -185,6 +192,7 @@ Command blocks support placeholders, insert one of these placerholders and they • “@nearest”: nearest player from the command block • “@farthest” farthest player from the command block • “@random”: random player currently in the world +• “@@”: literal “@” sign Example 1: time 12000 From b1154be71bad1633b067683bffa4ce7d1bcf7411 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 May 2018 17:58:32 +0200 Subject: [PATCH 0043/1107] Command blocks now use 2-letter placeholders --- .../REDSTONE/mesecons_commandblock/init.lua | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua index 6e80d8e2..2dfc0052 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua @@ -27,10 +27,11 @@ local function resolve_commands(commands, pos) if #players == 0 then commands = commands:gsub("[^\r\n]+", function (line) line = line:gsub("@@", SUBSTITUTE_CHARACTER) - if line:find("@nearest") then return "" end - if line:find("@farthest") then return "" end - if line:find("@random") then return "" end - line = line:gsub("@commander", commander) + if line:find("@n") then return "" end + if line:find("@p") then return "" end + if line:find("@f") then return "" end + if line:find("@r") then return "" end + line = line:gsub("@c", commander) line = line:gsub(SUBSTITUTE_CHARACTER, "@") return line end) @@ -52,10 +53,11 @@ local function resolve_commands(commands, pos) end local random = players[math.random(#players)]:get_player_name() commands = commands:gsub("@@", SUBSTITUTE_CHARACTER) - commands = commands:gsub("@nearest", nearest) - commands = commands:gsub("@farthest", farthest) - commands = commands:gsub("@random", random) - commands = commands:gsub("@commander", commander) + commands = commands:gsub("@p", nearest) + commands = commands:gsub("@n", nearest) + commands = commands:gsub("@f", farthest) + commands = commands:gsub("@r", random) + commands = commands:gsub("@c", commander) commands = commands:gsub(SUBSTITUTE_CHARACTER, "@") return commands end @@ -188,10 +190,10 @@ To place a command block and change the commands, you need to be in Creative Mod All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block. Command blocks support placeholders, insert one of these placerholders and they will be replaced by a player name: -• “@commander”: commander of this command block -• “@nearest”: nearest player from the command block -• “@farthest” farthest player from the command block -• “@random”: random player currently in the world +• “@c”: commander of this command block +• “@n” or “@p”: nearest player from the command block +• “@f” farthest player from the command block +• “@r”: random player currently in the world • “@@”: literal “@” sign Example 1: @@ -200,7 +202,7 @@ Example 1: Sets the game clock to 12:00 Example 2: - give @nearest mcl_core:apple 5 + give @n mcl_core:apple 5 → Gives the nearest player 5 apples]], From 689aa84c2823f11058bebf74281a90be4a620c3d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 May 2018 18:02:37 +0200 Subject: [PATCH 0044/1107] Make cmd block errors red --- mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua index 2dfc0052..5255d2ce 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua @@ -76,7 +76,7 @@ local function check_commands(commands, player_name) if string.sub(cmd, 1, 1) == "/" then msg = msg .. " Hint: Try to remove the trailing slash." end - return false, msg + return false, minetest.colorize("#FF0000", msg) end if player_name then local player_privs = minetest.get_player_privs(player_name) @@ -84,7 +84,7 @@ local function check_commands(commands, player_name) for cmd_priv, _ in pairs(cmddef.privs) do if player_privs[cmd_priv] ~= true then local msg = "Error: You have insufficient privileges to use the command “"..cmd.."” (missing privilege: "..cmd_priv..")! The command block has not been changed." - return false, msg + return false, minetest.colorize("#FF0000", msg) end end end From 7c434d85ed2fbffbd450a79886a440b66e208a3a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 May 2018 18:16:17 +0200 Subject: [PATCH 0045/1107] Also save cmd block on enter key --- mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua index 5255d2ce..9c3f90e4 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua @@ -245,7 +245,7 @@ minetest.register_node("mesecons_commandblock:commandblock_on", { minetest.register_on_player_receive_fields(function(player, formname, fields) if string.sub(formname, 1, 13) == "commandblock_" then - if not fields.submit and not fields.doc then + if not fields.submit and not fields.key_enter and not fields.doc then return end local privs = minetest.get_player_privs(player:get_player_name()) From fceee430b3526eff8f170abf3f7bf0fccc004be1 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 May 2018 18:27:19 +0200 Subject: [PATCH 0046/1107] Remove minetest.inventorycube call from rs lamps --- mods/ITEMS/REDSTONE/mesecons_lightstone/init.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/init.lua b/mods/ITEMS/REDSTONE/mesecons_lightstone/init.lua index d232df83..14a72acc 100644 --- a/mods/ITEMS/REDSTONE/mesecons_lightstone/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/init.lua @@ -1,6 +1,5 @@ minetest.register_node("mesecons_lightstone:lightstone_off", { tiles = {"jeija_lightstone_gray_off.png"}, - inventory_image = minetest.inventorycube("jeija_lightstone_gray_off.png"), groups = {handy=1, mesecon_effector_off = 1, mesecon = 2}, is_ground_content = false, description= "Redstone Lamp", @@ -18,7 +17,6 @@ minetest.register_node("mesecons_lightstone:lightstone_off", { minetest.register_node("mesecons_lightstone:lightstone_on", { tiles = {"jeija_lightstone_gray_on.png"}, - inventory_image = minetest.inventorycube("jeija_lightstone_gray_off.png"), groups = {handy=1, not_in_creative_inventory=1, mesecon = 2, opaque = 1}, drop = "node mesecons_lightstone:lightstone_off", is_ground_content = false, From 1082c995fea448d13b53a68e56a147cf37dc7cd3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 May 2018 19:22:55 +0200 Subject: [PATCH 0047/1107] Rework end portal node - Add 1/16 high collisionbox on bottom - Make walkable - Disable jump --- mods/ITEMS/mcl_portals/portal_end.lua | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index eb304586..8461e446 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -19,17 +19,22 @@ minetest.register_node("mcl_portals:portal_end", { length = 1.0, }, }, - "blank.png", - "blank.png", - "blank.png", - "blank.png", + { + name = "mcl_portals_end_portal.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 6.0, + }, + }, "blank.png", }, drawtype = "nodebox", paramtype = "light", sunlight_propagates = true, use_texture_alpha = true, - walkable = false, + walkable = true, diggable = false, pointable = false, buildable_to = false, @@ -39,13 +44,20 @@ minetest.register_node("mcl_portals:portal_end", { light_source = 14, post_effect_color = {a = 192, r = 0, g = 0, b = 0}, alpha = 192, + -- This prevents “falling through” + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -7/16, 0.5}, + }, + }, node_box = { type = "fixed", fixed = { {-0.5, -0.5, -0.5, 0.5, 4/16, 0.5}, }, }, - groups = {not_in_creative_inventory = 1}, + groups = {not_in_creative_inventory = 1, disable_jump = 1 }, _mcl_hardness = -1, _mcl_blast_resistance = 18000000, From da39d763107979969037b87c30dea89cfc932ad8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 May 2018 19:34:23 +0200 Subject: [PATCH 0048/1107] Implement conversion of single chests --- tools/Texture_Converter.py | 51 +++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/tools/Texture_Converter.py b/tools/Texture_Converter.py index 43525820..344bfd78 100755 --- a/tools/Texture_Converter.py +++ b/tools/Texture_Converter.py @@ -197,21 +197,48 @@ def convert_textures(): print(src_file + " → " + dst_file) # Convert chest textures (requires ImageMagick) - chest_file = tex_dir + "/entity/chest/normal.png" + chest_files = [ + [ tex_dir + "/entity/chest/normal.png", target_dir("/mods/ITEMS/mcl_chests/textures"), "default_chest_top.png", "mcl_chests_chest_bottom.png", "default_chest_front.png", "mcl_chests_chest_left.png", "mcl_chests_chest_right.png", "mcl_chests_chest_back.png" ], + [ tex_dir + "/entity/chest/trapped.png", target_dir("/mods/ITEMS/mcl_chests/textures"), "mcl_chests_chest_trapped_top.png", "mcl_chests_chest_trapped_bottom.png", "mcl_chests_chest_trapped_front.png", "mcl_chests_chest_trapped_left.png", "mcl_chests_chest_trapped_right.png", "mcl_chests_chest_trapped_back.png" ], + [ tex_dir + "/entity/chest/ender.png", target_dir("/mods/ITEMS/mcl_chests/textures"), "mcl_chests_ender_chest_top.png", "mcl_chests_ender_chest_bottom.png", "mcl_chests_ender_chest_front.png", "mcl_chests_ender_chest_left.png", "mcl_chests_ender_chest_right.png", "mcl_chests_ender_chest_back.png" ] + ] - if os.path.isfile(chest_file): - CHPX=((PXSIZE / 16 * 14)) # Chests in MC are 2/16 smaller! -# Chests are currently blacklisted + for c in chest_files: + chest_file = c[0] + if os.path.isfile(chest_file): + PPX = (PXSIZE/16) + CHPX= (PPX * 14) # Chests in MC are 2/16 smaller! + LIDPX =(PPX * 5) # Lid height + LOCKW = (PPX * 6) # Lock width + LOCKH = (PPX * 5) # Lock height -# os.system("convert " + chest_file + " \ -#\( -clone 0 -crop "+str(CHPX)+"x"+str(CHPX)+"+"+str(CHPX)+"+0 \) -geometry +0+0 -composite -extent "+str(CHPX)+"x"+str(CHPX)+" "+target_dir("/mods/ITEMS/mcl_chests/textures")+"/default_chest_top.png") + cdir = c[1] + top = cdir + "/" + c[2] + bottom = cdir + "/" + c[3] + front = cdir + "/" + c[4] + left = cdir + "/" + c[5] + right = cdir + "/" + c[6] + back = cdir + "/" + c[7] + # Top + os.system("convert " + chest_file + " \ +\( -clone 0 -crop "+str(CHPX)+"x"+str(CHPX)+"+"+str(CHPX)+"+0 \) -geometry +0+0 -composite -extent "+str(CHPX)+"x"+str(CHPX)+" "+top) + # Bottom + os.system("convert " + chest_file + " \ +\( -clone 0 -crop "+str(CHPX)+"x"+str(CHPX)+"+"+str(CHPX*2)+"+"+str(CHPX+LIDPX)+" \) -geometry +0+0 -composite -extent "+str(CHPX)+"x"+str(CHPX)+" "+bottom) + # Front + os.system("convert " + chest_file + " \ +\( -clone 0 -crop "+str(CHPX)+"x"+str(LIDPX)+"+"+str(CHPX)+"+"+str(CHPX)+" \) -geometry +0+0 -composite \ +\( -clone 0 -crop "+str(CHPX)+"x"+str(CHPX-LIDPX)+"+"+str(CHPX)+"+"+str(CHPX*2+LIDPX)+" \) -geometry +0+"+str(LIDPX)+" -composite \ +-extent "+str(CHPX)+"x"+str(CHPX)+" "+front) + # TODO: Add lock -# os.system("convert " + chest_file + " \ -#\( -clone 0 -crop "+str(CHPX)+"x"+str((PXSIZE/16)*5)+"+"+str(CHPX)+"+"+str(CHPX)+" \) -geometry +0+0 -composite \ -#\( -clone 0 -crop "+str(CHPX)+"x"+str((PXSIZE/16)*10)+"+"+str(CHPX)+"+"+str((2*CHPX) + ((PXSIZE/16)*5))+" \) -geometry +0+"+str((PXSIZE/16)*5)+" -composite \ -#-extent "+str(CHPX)+"x"+str(CHPX)+" "+target_dir("/mods/ITEMS/mcl_chests/textures")+"/default_chest_front.png") - - # TODO: Convert other chest sides + # Left, right back (use same texture, we're lazy + files = [ left, right, back ] + for f in files: + os.system("convert " + chest_file + " \ +\( -clone 0 -crop "+str(CHPX)+"x"+str(LIDPX)+"+"+str(0)+"+"+str(CHPX)+" \) -geometry +0+0 -composite \ +\( -clone 0 -crop "+str(CHPX)+"x"+str(CHPX-LIDPX)+"+"+str(0)+"+"+str(CHPX*2+LIDPX)+" \) -geometry +0+"+str(LIDPX)+" -composite \ +-extent "+str(CHPX)+"x"+str(CHPX)+" "+f) # Generate railway crossings and t-junctions. Note: They may look strange. # Note: these may be only a temporary solution, as crossings and t-junctions do not occour in MC. From b1122c5cda330df747429a184567a46f6780a68a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 May 2018 19:51:37 +0200 Subject: [PATCH 0049/1107] Fix bad side chest conversion --- tools/Texture_Converter.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tools/Texture_Converter.py b/tools/Texture_Converter.py index 344bfd78..437353d4 100755 --- a/tools/Texture_Converter.py +++ b/tools/Texture_Converter.py @@ -207,8 +207,9 @@ def convert_textures(): chest_file = c[0] if os.path.isfile(chest_file): PPX = (PXSIZE/16) - CHPX= (PPX * 14) # Chests in MC are 2/16 smaller! - LIDPX =(PPX * 5) # Lid height + CHPX = (PPX * 14) # Chest width + LIDPX = (PPX * 5) # Lid height + LIDLOW = (PPX * 10) # Lower lid section height LOCKW = (PPX * 6) # Lock width LOCKH = (PPX * 5) # Lock height @@ -228,7 +229,7 @@ def convert_textures(): # Front os.system("convert " + chest_file + " \ \( -clone 0 -crop "+str(CHPX)+"x"+str(LIDPX)+"+"+str(CHPX)+"+"+str(CHPX)+" \) -geometry +0+0 -composite \ -\( -clone 0 -crop "+str(CHPX)+"x"+str(CHPX-LIDPX)+"+"+str(CHPX)+"+"+str(CHPX*2+LIDPX)+" \) -geometry +0+"+str(LIDPX)+" -composite \ +\( -clone 0 -crop "+str(CHPX)+"x"+str(LIDLOW)+"+"+str(CHPX)+"+"+str(CHPX*2+LIDPX)+" \) -geometry +0+"+str(LIDPX-PPX)+" -composite \ -extent "+str(CHPX)+"x"+str(CHPX)+" "+front) # TODO: Add lock @@ -237,7 +238,7 @@ def convert_textures(): for f in files: os.system("convert " + chest_file + " \ \( -clone 0 -crop "+str(CHPX)+"x"+str(LIDPX)+"+"+str(0)+"+"+str(CHPX)+" \) -geometry +0+0 -composite \ -\( -clone 0 -crop "+str(CHPX)+"x"+str(CHPX-LIDPX)+"+"+str(0)+"+"+str(CHPX*2+LIDPX)+" \) -geometry +0+"+str(LIDPX)+" -composite \ +\( -clone 0 -crop "+str(CHPX)+"x"+str(LIDLOW)+"+"+str(0)+"+"+str(CHPX*2+LIDPX)+" \) -geometry +0+"+str(LIDPX-PPX)+" -composite \ -extent "+str(CHPX)+"x"+str(CHPX)+" "+f) # Generate railway crossings and t-junctions. Note: They may look strange. From d59717b5d82aea19a6b60547086b0ca670a69259 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 May 2018 20:48:39 +0200 Subject: [PATCH 0050/1107] Convert large chest textures --- tools/Texture_Converter.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/tools/Texture_Converter.py b/tools/Texture_Converter.py index 437353d4..3a5305e2 100755 --- a/tools/Texture_Converter.py +++ b/tools/Texture_Converter.py @@ -241,6 +241,43 @@ def convert_textures(): \( -clone 0 -crop "+str(CHPX)+"x"+str(LIDLOW)+"+"+str(0)+"+"+str(CHPX*2+LIDPX)+" \) -geometry +0+"+str(LIDPX-PPX)+" -composite \ -extent "+str(CHPX)+"x"+str(CHPX)+" "+f) + # Double chests + + chest_files = [ + [ tex_dir + "/entity/chest/normal_double.png", target_dir("/mods/ITEMS/mcl_chests/textures"), "default_chest_front_big.png", "default_chest_top_big.png", "default_chest_side_big.png" ], + [ tex_dir + "/entity/chest/trapped_double.png", target_dir("/mods/ITEMS/mcl_chests/textures"), "mcl_chests_chest_trapped_front_big.png", "mcl_chests_chest_trapped_top_big.png", "mcl_chests_chest_trapped_side_big.png" ] + ] + for c in chest_files: + chest_file = c[0] + if os.path.isfile(chest_file): + PPX = (PXSIZE/16) + CHPX = (PPX * 14) # Chest width (short side) + CHPX2 = (PPX * 15) # Chest width (long side) + LIDPX = (PPX * 5) # Lid height + LIDLOW = (PPX * 10) # Lower lid section height + LOCKW = (PPX * 6) # Lock width + LOCKH = (PPX * 5) # Lock height + + cdir = c[1] + front = cdir + "/" + c[2] + top = cdir + "/" + c[3] + side = cdir + "/" + c[4] + # Top + os.system("convert " + chest_file + " \ +\( -clone 0 -crop "+str(CHPX2)+"x"+str(CHPX)+"+"+str(CHPX)+"+0 \) -geometry +0+0 -composite -extent "+str(CHPX2)+"x"+str(CHPX)+" "+top) + # Front + # TODO: Add lock + os.system("convert " + chest_file + " \ +\( -clone 0 -crop "+str(CHPX2)+"x"+str(LIDPX)+"+"+str(CHPX)+"+"+str(CHPX)+" \) -geometry +0+0 -composite \ +\( -clone 0 -crop "+str(CHPX2)+"x"+str(LIDLOW)+"+"+str(CHPX)+"+"+str(CHPX*2+LIDPX)+" \) -geometry +0+"+str(LIDPX-PPX)+" -composite \ +-extent "+str(CHPX2)+"x"+str(CHPX)+" "+front) + # Side + os.system("convert " + chest_file + " \ +\( -clone 0 -crop "+str(CHPX)+"x"+str(LIDPX)+"+"+str(0)+"+"+str(CHPX)+" \) -geometry +0+0 -composite \ +\( -clone 0 -crop "+str(CHPX)+"x"+str(LIDLOW)+"+"+str(0)+"+"+str(CHPX*2+LIDPX)+" \) -geometry +0+"+str(LIDPX-PPX)+" -composite \ +-extent "+str(CHPX)+"x"+str(CHPX)+" "+side) + + # Generate railway crossings and t-junctions. Note: They may look strange. # Note: these may be only a temporary solution, as crossings and t-junctions do not occour in MC. # TODO: Curves From c882f46eb6b7b0ad2ed47006484016124698f64d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 May 2018 22:11:08 +0200 Subject: [PATCH 0051/1107] Fix head node texture bugs --- mods/ITEMS/mcl_heads/init.lua | 11 +++++------ .../textures/mcl_heads_creeper_node.png | Bin 0 -> 676 bytes .../textures/mcl_heads_skeleton_node.png | Bin 0 -> 432 bytes .../mcl_heads/textures/mcl_heads_steve_node.png | Bin 0 -> 626 bytes .../textures/mcl_heads_wither_skeleton.png | Bin 256 -> 271 bytes .../textures/mcl_heads_wither_skeleton_node.png | Bin 0 -> 432 bytes .../mcl_heads_wither_skeleton_preview.png | Bin 160 -> 156 bytes .../textures/mcl_heads_zombie_node.png | Bin 0 -> 1112 bytes 8 files changed, 5 insertions(+), 6 deletions(-) create mode 100644 mods/ITEMS/mcl_heads/textures/mcl_heads_creeper_node.png create mode 100644 mods/ITEMS/mcl_heads/textures/mcl_heads_skeleton_node.png create mode 100644 mods/ITEMS/mcl_heads/textures/mcl_heads_steve_node.png create mode 100644 mods/ITEMS/mcl_heads/textures/mcl_heads_wither_skeleton_node.png create mode 100644 mods/ITEMS/mcl_heads/textures/mcl_heads_zombie_node.png diff --git a/mods/ITEMS/mcl_heads/init.lua b/mods/ITEMS/mcl_heads/init.lua index 88ba0c64..180affe2 100644 --- a/mods/ITEMS/mcl_heads/init.lua +++ b/mods/ITEMS/mcl_heads/init.lua @@ -19,7 +19,6 @@ local function addhead(name, texture, desc, longdesc) }, groups = {handy=1, armor_head=1,non_combat_armor=1, head=1, deco_block=1, dig_by_piston=1}, -- The head textures are based off the textures of an actual mob. - -- FIXME: This code assumes 16×16 textures for the mob textures! tiles = { -- Note: bottom texture is overlaid over top texture to get rid of possible transparency. -- This is required for skeleton skull and wither skeleton skull. @@ -49,9 +48,9 @@ local function addhead(name, texture, desc, longdesc) end -- Add heads -addhead("zombie", "mobs_mc_zombie.png", "Zombie Head", "A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet for fun, but does not offer any protection.") -addhead("creeper", "mobs_mc_creeper.png", "Creeper Head", "A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet for fun, but does not offer any protection.") +addhead("zombie", "mcl_heads_zombie_node.png", "Zombie Head", "A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet for fun, but does not offer any protection.") +addhead("creeper", "mcl_heads_creeper_node.png", "Creeper Head", "A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet for fun, but does not offer any protection.") -- Original Minecraft name: “Head” -addhead("steve", "character.png", "Human Head", "A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.") -addhead("skeleton", "mobs_mc_skeleton.png", "Skeleton Skull", "A skeleton skull is a small decorative block which resembles the head of a skeleton. It can also be worn as a helmet for fun, but does not offer any protection.") -addhead("wither_skeleton", "mobs_mc_wither_skeleton.png", "Wither Skeleton Skull", "A wither skeleton skull is a small decorative block which resembles the head of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.") +addhead("steve", "mcl_heads_steve_node.png", "Human Head", "A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.") +addhead("skeleton", "mcl_heads_skeleton_node.png", "Skeleton Skull", "A skeleton skull is a small decorative block which resembles the head of a skeleton. It can also be worn as a helmet for fun, but does not offer any protection.") +addhead("wither_skeleton", "mcl_heads_wither_skeleton_node.png", "Wither Skeleton Skull", "A wither skeleton skull is a small decorative block which resembles the head of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.") diff --git a/mods/ITEMS/mcl_heads/textures/mcl_heads_creeper_node.png b/mods/ITEMS/mcl_heads/textures/mcl_heads_creeper_node.png new file mode 100644 index 0000000000000000000000000000000000000000..99b432ac67db7900cdbf4ad0075288fc59381168 GIT binary patch literal 676 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU{GLTW?*0l*qpqbfq_9Kz$e6&fq}s-!#r(f zU}%j)Mv!}XT+sjj{{!tzTXtncd)myb%Wuh!3A`Zkfq{X6y(GvlnBhMNFm%*9=#lF0S5~e#er2N5 zu^S59U+*7qeq6uq*&PMto%dfJ{N3^R<-JhpX2$7GCsyml?|$Ka{~OQD=Rf>6v>p08 z<2irq{xeseuko2x9&n-QyMyvK&&}boA7N_s2h4-^+Grha`O$ z*w5V1^!TTL*WdMfU9K`-U!XUy|K=XmRbFDaFh;a1B_fYAV1z&t!}JclkiV3V$}Q8F72+ zb|eQsE98?&$hsiV=gM!8XPnkA!F=Naui=dnx2gpk>+0FQRlH)l?PkniHs`Zkg%od` z&;7j{Pg?D<-L{@{O?5(0_ktqd`4^`f^2E386SVo(@F(8O=V{6gUK_XhHf6?T>-AE1 z6l(N0SS&lN-_&8z)TXkj;86@qW}?#+q56=>f35~~bDEu`j!oU5$E1BD=}Ak_+2&VD j2Lf9!vMd#<{lH$oYj3CD8}~B|3=9mOu6{1-oD!M<@hUbZ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_heads/textures/mcl_heads_skeleton_node.png b/mods/ITEMS/mcl_heads/textures/mcl_heads_skeleton_node.png new file mode 100644 index 0000000000000000000000000000000000000000..0af86cd6a5e79a56e21ea9fb18cc64e40cc99731 GIT binary patch literal 432 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU{GLTW?*0l*qpqbfq_9Tz$e7@|NsBBwY7bH zeI+F&$;runetz@k&$qI$m@;KbK|z7nj~!hM3=E7VL4Lsu4$p3+F)%PXc)B=-R4^`` zV0cQ}P@r}GH2b|K8f|ZF9=p6;%N>!%sX2K9cLd9B|HSwMu2IvgZ+mDzI(j&7R?V@f zikdSvY@%Hg+nKK2IJ%?$|GU@bYXrH)4E~F3bNF6==nz+^P=x+VuFf0IANMfsJn%L8 zzxQMN9J3m$X{M#3CaTE~g)i#)>2Ru88m#9Oa@D(jI#lJ9-7#5{LrM>yrwb}_DoIKu z70%Dw9`D!jntxVfQ@{zGneF=D@0U9`d(QPqzmt4SDm%nXERJ=m?XS8k+EHfi{31fB z3LCcHy>=x>tZk*3jsnY!6ux_&r`0UByJ^n(S#fUOU;al9n+@917oJ;`z_)aXbZCBq z#`pdMG3r<3ew^Nx?ey@&HMK21+$wS&M!pe3X}4Oo?`#&c`aO&Hsep!nb#iRA_63XY o6Ms}!Z*1|OVzXU*#!u#u$BtLn17$)O7#J8lUHx3vIVCg!0KUJlk^lez literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_heads/textures/mcl_heads_steve_node.png b/mods/ITEMS/mcl_heads/textures/mcl_heads_steve_node.png new file mode 100644 index 0000000000000000000000000000000000000000..8bf839e71531cf95085289defbbbed4b7dacb23a GIT binary patch literal 626 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU{K&-W?*2L>fE=Dfq}t3z$e6&fq}tLQ6j|A zz)4?uae7#skL9MSn( zJZH9MTh-hH8O2x<u;uxZJGi~6+EnZhrAhmJsGMP8~zz+>c2e3%`$6h@1mXOPHtz};@09I!R)Q>94BAk zt)NoEKJ&TTEFXoYO%=*)4x!E|92-0zZZFyta7m#h@dGEbu|xO1|C{43HUGWav_$)7 z*vE4ZLlfi;)-&FFytB}3(z!x5Lze2f`!oKj9%y{v*x+PPELZvc;-W6iqce){+@9ns zboSB4cvlk<`8)>BQy1>7yZP%sLN){3=YiFE7rNd zcBS~hiOQZi3RBnu-U^$qlQ!6W%9-J?w1auW1cj{9sdiiP8iW{LO?F@4a_hw+wI|X} zED0-C#@R9bI>FZTk*hcNOPcAYj)ECdF7-boIi2!ntXZ&lgSE|d#uvq9eHSl2EPIsp zPHLKXLHvtH=61{fGv9n6v+UmwRj21qT0MSvmuQZF6g6XMFiz+hx#WM*b&U|^u5qoby#W^HY)sHkXRVG)>HY{9_5z*rLG z7tG-B>_!>`1H&Ru7srqa#w8OB*BvqtaQR-}DYst1)Y#E`zAfX4MQzGQoV@%e#>ns9 z=6iUvj(FWI$+cSo%8&GXk+{43@w<<2xaQsL{!=UJr}Te6XHKX~XwZ^)qm*@B&gJY< zJWqAEoBp%mnUQa~%*B+;Pa*B!BMPq)Evt^=@ma(>`M{s){0|NtNNswPKgTu2M zX$%YuGd*1#Ln;{G_8;Uu=(6MIIaZa@Ft&((}yymozT zxyNK`E}rbXM%|-U*131dWKV|1-*5l0aj5HZOT3zFbA&fNRwB>f0XLkB%PBn^kixs-otM z4V!4!#CE1@H;(S8|Nri_`5HlPF@ygi+Z?{vA3DSpDioprlB@HE^T$1mI}dz~{_p+R zKF6%aYMN=OsEKOwL*a{hema~gmImuNg*I?QWWLepZ~D_m}^X!)AlF^o8dZCGag>A|0CFpz*!` zK#ckoxgV#uWjj6ma7}HC54Vb(hmmiDP};4Q?K_*rtbWhpeJY?KV4WOWt$o4b`@|pB k)f-#Plzi61A~!~k(rs9wY9aPqN0wDj&*rq5(5JRV@Z%-FoVOh8)*y- z3>Ka)jv*C{$q5MpLLp%(42+41uFeL|o)-f+4jD9g&9sFVdQ&MBb@0F5*xxc~qF delta 131 zcmbQkxPWnjN{wiMPlzi614B!&+tiHk6^;2t&X$QrTE^O%9>MK-3=9m6B|(0{3=Yq3 zq%klsSbDlRhEy;nCnN|MnT4?gIkZg@YFU`GB!?w!huX^42Fbj0YMKdd6E<$tnjx6A jM20JHv4+SYgB(VN(uZtIi|-_X3}Nte^>bP0l+XkKcmFC# diff --git a/mods/ITEMS/mcl_heads/textures/mcl_heads_zombie_node.png b/mods/ITEMS/mcl_heads/textures/mcl_heads_zombie_node.png new file mode 100644 index 0000000000000000000000000000000000000000..ef85701e8f5f965cf902bee67349bf5d1fc54a96 GIT binary patch literal 1112 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4rT@hhPm4t-!L#R+zaptaRmuxxP&)_M|VW~ zRtCm)#rl-`7=)OIH%I^f|9{K6j?HUZH>_^Vo0+|OVd<=i$rdp-zQw))6#*_;?m<;S z&gsr6lT&7H?UzxP4RAKl@-pxY*p8Y>cKV`CBWTgMJsS!(; zSUJo#vS^Q3yvW{dm3?VR+S)a#YgW6rwc3@I7{K!HvkgMb{mrxsW@cB# zc{XJP&uq=kOBSE;$B+uf zn#qlPiwp!@teH2h30U7T@5TT67rqx~-EphsoS9P)SID`NvFvXnGmrH&CW&K$@9O5H z8OjE?{AFzSW1GPclptXo9nVN z;-+P94Bvj%a5e+;W^My+CEeFcW6qrxW&5Lg;n|F7ibZdOYgg6pJ~`o>>kAHM>r)q= z&Cpu$WD0{`@Y`@_Evtms>8x4hDz{`N-=6k)TVTj#>A$RjDi?hJa^&{SoWFkKw4Xh) zYI6g-^d@|_?le2jvN=+%Axq)D_m#U|h5{;U&Kk~)U2%}>hy&k>CU-&p>Wj~2RB+v! zUwt~{r@K_-3R3|V!x`(p32fCoyfgdm{r?L+wjF=;uRLAd}>JI$xIDdVTg; zirMbh0vDpcxLujn&$Mj&mzRI;8Ej`<)%4-$e%`ZP;5D9&fz;{F=rki@sQK@vUl|Y!b7kNY_XTFsk>>6>*kj z;p}mAFm_+$ao}`=r-YxHqPD}V29vX!Y`iZ=H@Ga?&TuX90LKl6S-A{m^#=68 zw&edyn zjyuLA@)R-tWmK11FrD$-ISsZQ4ve|H1xH!gS{WC!DI7>JYxp;_bFzfPPR1JtRxolf zWNp~EvGG=FUf!ce4vadt+BY-KXwYF65q0EsDlg~f_xFE3F@s_0O92Lz%OcXp?9T51 O Date: Fri, 18 May 2018 23:51:17 +0200 Subject: [PATCH 0052/1107] Texture converter: Convert banner overlays --- tools/Texture_Converter.py | 58 ++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/tools/Texture_Converter.py b/tools/Texture_Converter.py index 3a5305e2..22a6fe6b 100755 --- a/tools/Texture_Converter.py +++ b/tools/Texture_Converter.py @@ -296,6 +296,56 @@ def convert_textures(): os.system("convert "+tex_dir+"/blocks/"+r[0]+" -rotate 90 "+tempfile1.name) os.system("composite -compose Dst_Over "+tempfile1.name+" "+tex_dir+"/blocks/"+r[0]+" "+target_dir("/mods/ENTITIES/mcl_minecarts/textures")+"/"+r[3]) + # Convert banner overlays + overlays = [ + "base", + "border", + "bricks", + "circle", + "creeper", + "cross", + "curly_border", + "diagonal_left", + "diagonal_right", + "diagonal_up_left", + "diagonal_up_right", + "flower", + "gradient", + "gradient_up", + "half_horizontal_bottom", + "half_horizontal", + "half_vertical", + "half_vertical_right", + "rhombus", + "mojang", + "skull", + "small_stripes", + "straight_cross", + "stripe_bottom", + "stripe_center", + "stripe_downleft", + "stripe_downright", + "stripe_left", + "stripe_middle", + "stripe_right", + "stripe_top", + "square_bottom_left", + "square_bottom_right", + "square_top_left", + "square_top_right", + "triangle_bottom", + "triangles_bottom", + "triangle_top", + "triangles_top", + ] + for o in overlays: + orig = tex_dir + "/entity/banner/" + o + ".png" + if os.path.isfile(orig): + if o == "mojang": + o = "thing" + dest = target_dir("/mods/ITEMS/mcl_banners/textures")+"/"+"mcl_banners_"+o+".png" + os.system("convert "+orig+" -transparent-color white -background black -alpha remove -alpha copy -channel RGB -white-threshold 0 "+dest) + # Convert grass grass_file = tex_dir + "/blocks/grass_top.png" if os.path.isfile(grass_file): @@ -335,14 +385,6 @@ def convert_textures(): colorize_alpha(GRASS, tex_dir+"/blocks/grass_side_overlay.png", o[0], str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/default_"+o[2]+"_side.png") - -# TODO: Convert banner masks -# if os.path.isdir(tex_dir + "/entity/banner"): -# These are the ImageMagick commands needed to convert the mask images -# os.system("mogrify -transparent-color "+filename) -# os.system("mogrify -clip-mask "+tex_dir+"/entity/banner/base.png"+" -alpha Copy "+filename) -# os.system("mogrify -fill white -colorize 100 "+filename) - print("Textures conversion COMPLETE!") if failed_conversions > 0: print("WARNING: Number of missing files in original resource pack: "+str(failed_conversions)) From 4db935e91e7d0db070a151d980b51c2d9c304295 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 19 May 2018 02:30:23 +0200 Subject: [PATCH 0053/1107] Update falling nodes after being moved by piston --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 61cd234e..f9e573aa 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -380,3 +380,20 @@ mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_light_blue") mesecon.register_mvps_unsticky("mcl_colorblocks:glazed_terracotta_pink") mesecon.register_on_mvps_move(mesecon.move_hot_nodes) + +-- Check for falling after moving node +mesecon.register_on_mvps_move(function(moved_nodes) + for i = 1, #moved_nodes do + local moved_node = moved_nodes[i] + mesecon.on_placenode(moved_node.pos, moved_node.node) + minetest.after(0, function() + minetest.check_for_falling(moved_node.oldpos) + minetest.check_for_falling(moved_node.pos) + end) + local node_def = minetest.registered_nodes[moved_node.node.name] + if node_def and node_def.mesecon and node_def.mesecon.on_mvps_move then + node_def.mesecon.on_mvps_move(moved_node.pos, moved_node.node, + moved_node.oldpos, moved_node.meta) + end + end +end) From b852e56df351b7c495f16eb0aee73ef0a57add2c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 20 May 2018 01:50:53 +0200 Subject: [PATCH 0054/1107] Change clock texture usage and implement conversion --- mods/ITEMS/mcl_clock/init.lua | 6 +- .../mcl_clock/textures/mcl_clock_clock.png | Bin 876 -> 0 bytes .../mcl_clock/textures/mcl_clock_clock_00.png | Bin 0 -> 218 bytes .../mcl_clock/textures/mcl_clock_clock_01.png | Bin 0 -> 218 bytes .../mcl_clock/textures/mcl_clock_clock_02.png | Bin 0 -> 219 bytes .../mcl_clock/textures/mcl_clock_clock_03.png | Bin 0 -> 222 bytes .../mcl_clock/textures/mcl_clock_clock_04.png | Bin 0 -> 222 bytes .../mcl_clock/textures/mcl_clock_clock_05.png | Bin 0 -> 226 bytes .../mcl_clock/textures/mcl_clock_clock_06.png | Bin 0 -> 219 bytes .../mcl_clock/textures/mcl_clock_clock_07.png | Bin 0 -> 239 bytes .../mcl_clock/textures/mcl_clock_clock_08.png | Bin 0 -> 226 bytes .../mcl_clock/textures/mcl_clock_clock_09.png | Bin 0 -> 224 bytes .../mcl_clock/textures/mcl_clock_clock_10.png | Bin 0 -> 236 bytes .../mcl_clock/textures/mcl_clock_clock_11.png | Bin 0 -> 240 bytes .../mcl_clock/textures/mcl_clock_clock_12.png | Bin 0 -> 227 bytes .../mcl_clock/textures/mcl_clock_clock_13.png | Bin 0 -> 234 bytes .../mcl_clock/textures/mcl_clock_clock_14.png | Bin 0 -> 241 bytes .../mcl_clock/textures/mcl_clock_clock_15.png | Bin 0 -> 244 bytes .../mcl_clock/textures/mcl_clock_clock_16.png | Bin 0 -> 244 bytes .../mcl_clock/textures/mcl_clock_clock_17.png | Bin 0 -> 234 bytes .../mcl_clock/textures/mcl_clock_clock_18.png | Bin 0 -> 241 bytes .../mcl_clock/textures/mcl_clock_clock_19.png | Bin 0 -> 232 bytes .../mcl_clock/textures/mcl_clock_clock_20.png | Bin 0 -> 233 bytes .../mcl_clock/textures/mcl_clock_clock_21.png | Bin 0 -> 229 bytes .../mcl_clock/textures/mcl_clock_clock_22.png | Bin 0 -> 240 bytes .../mcl_clock/textures/mcl_clock_clock_23.png | Bin 0 -> 239 bytes .../mcl_clock/textures/mcl_clock_clock_24.png | Bin 0 -> 226 bytes .../mcl_clock/textures/mcl_clock_clock_25.png | Bin 0 -> 225 bytes .../mcl_clock/textures/mcl_clock_clock_26.png | Bin 0 -> 222 bytes .../mcl_clock/textures/mcl_clock_clock_27.png | Bin 0 -> 222 bytes .../mcl_clock/textures/mcl_clock_clock_28.png | Bin 0 -> 218 bytes .../mcl_clock/textures/mcl_clock_clock_29.png | Bin 0 -> 220 bytes .../mcl_clock/textures/mcl_clock_clock_30.png | Bin 0 -> 223 bytes .../mcl_clock/textures/mcl_clock_clock_31.png | Bin 0 -> 218 bytes .../mcl_clock/textures/mcl_clock_clock_32.png | Bin 0 -> 218 bytes .../mcl_clock/textures/mcl_clock_clock_33.png | Bin 0 -> 218 bytes .../mcl_clock/textures/mcl_clock_clock_34.png | Bin 0 -> 220 bytes .../mcl_clock/textures/mcl_clock_clock_35.png | Bin 0 -> 223 bytes .../mcl_clock/textures/mcl_clock_clock_36.png | Bin 0 -> 222 bytes .../mcl_clock/textures/mcl_clock_clock_37.png | Bin 0 -> 226 bytes .../mcl_clock/textures/mcl_clock_clock_38.png | Bin 0 -> 220 bytes .../mcl_clock/textures/mcl_clock_clock_39.png | Bin 0 -> 226 bytes .../mcl_clock/textures/mcl_clock_clock_40.png | Bin 0 -> 236 bytes .../mcl_clock/textures/mcl_clock_clock_41.png | Bin 0 -> 224 bytes .../mcl_clock/textures/mcl_clock_clock_42.png | Bin 0 -> 224 bytes .../mcl_clock/textures/mcl_clock_clock_43.png | Bin 0 -> 240 bytes .../mcl_clock/textures/mcl_clock_clock_44.png | Bin 0 -> 228 bytes .../mcl_clock/textures/mcl_clock_clock_45.png | Bin 0 -> 247 bytes .../mcl_clock/textures/mcl_clock_clock_46.png | Bin 0 -> 240 bytes .../mcl_clock/textures/mcl_clock_clock_47.png | Bin 0 -> 227 bytes .../mcl_clock/textures/mcl_clock_clock_48.png | Bin 0 -> 243 bytes .../mcl_clock/textures/mcl_clock_clock_49.png | Bin 0 -> 226 bytes .../mcl_clock/textures/mcl_clock_clock_50.png | Bin 0 -> 226 bytes .../mcl_clock/textures/mcl_clock_clock_51.png | Bin 0 -> 244 bytes .../mcl_clock/textures/mcl_clock_clock_52.png | Bin 0 -> 224 bytes .../mcl_clock/textures/mcl_clock_clock_53.png | Bin 0 -> 224 bytes .../mcl_clock/textures/mcl_clock_clock_54.png | Bin 0 -> 223 bytes .../mcl_clock/textures/mcl_clock_clock_55.png | Bin 0 -> 223 bytes .../mcl_clock/textures/mcl_clock_clock_56.png | Bin 0 -> 225 bytes .../mcl_clock/textures/mcl_clock_clock_57.png | Bin 0 -> 226 bytes .../mcl_clock/textures/mcl_clock_clock_58.png | Bin 0 -> 221 bytes .../mcl_clock/textures/mcl_clock_clock_59.png | Bin 0 -> 223 bytes .../mcl_clock/textures/mcl_clock_clock_60.png | Bin 0 -> 219 bytes .../mcl_clock/textures/mcl_clock_clock_61.png | Bin 0 -> 225 bytes .../mcl_clock/textures/mcl_clock_clock_62.png | Bin 0 -> 224 bytes .../mcl_clock/textures/mcl_clock_clock_63.png | Bin 0 -> 218 bytes tools/Conversion_Table.csv | 67 +++++++++++++++++- 67 files changed, 70 insertions(+), 3 deletions(-) delete mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_00.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_01.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_02.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_03.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_04.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_05.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_06.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_07.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_08.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_09.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_10.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_11.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_12.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_13.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_14.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_15.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_16.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_17.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_18.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_19.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_20.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_21.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_22.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_23.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_24.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_25.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_26.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_27.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_28.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_29.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_30.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_31.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_32.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_33.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_34.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_35.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_36.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_37.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_38.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_39.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_40.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_41.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_42.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_43.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_44.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_45.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_46.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_47.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_48.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_49.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_50.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_51.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_52.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_53.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_54.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_55.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_56.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_57.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_58.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_59.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_60.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_61.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_62.png create mode 100644 mods/ITEMS/mcl_clock/textures/mcl_clock_clock_63.png diff --git a/mods/ITEMS/mcl_clock/init.lua b/mods/ITEMS/mcl_clock/init.lua index f517c42a..98b8b66e 100644 --- a/mods/ITEMS/mcl_clock/init.lua +++ b/mods/ITEMS/mcl_clock/init.lua @@ -22,7 +22,11 @@ local random_frame = math.random(0, clock_frames-1) -- Image of all possible faces watch.images = {} for frame=0, clock_frames-1 do - table.insert(watch.images, "mcl_clock_clock.png^[verticalframe:"..clock_frames..":"..frame) + local sframe = tostring(frame) + if string.len(sframe) == 1 then + sframe = "0" .. sframe + end + table.insert(watch.images, "mcl_clock_clock_"..sframe..".png") end local function round(num) diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock.png deleted file mode 100644 index 101e341fae2ebe77c9cc5a6087fe914602461239..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 876 zcmeAS@N?(olHy`uVBq!ia0y~yU=UznU}0ckW?*2DayfE~fq}swz$e6&fq~)w<5ZWL>7EsI-R(spv!(R!*EabL~xqL)r`s42&f~ ze!&b5&u*kKFfhIHba4!+U`%pg>Tx>7m(b>su|g_B!E}#_2IGkU&bKdStYS)8;Z|01 zhKI>Gt>hdJi?Q0uCdpH)#iG|5u^5?2GB=t`n7B44C#OQ{gvaeA8XC+=8*)$IEKXxS zk)gn>(IC$-Yb!IKd6Nd;1NmjW0#XaSF228Dt$b3*Vc~(5I~X)l#TUp_rWRUu>&&j1 z9`xqpnqY+;1r0{a^3u|bcTcvoJad~>?!oi-`F{-6ZPu)xH}&J1sCgHUeM*U~n6zy9 z1{<9n?Ugo*C69D|`m@gV{o!i0Tg)H(m!)6sZI6@_?fxe6_d|}3{~FuFE>+v=U)o5n zS>kRqW%-*M#gD%qx%AoN#Yx7V^i&(|s`KI3gQMoHex96ODV8$t(+kg8KV@{zmuC1s zt8%Co*z!D6B3|=+d%(Oi?;RQX)BPWu>}9__ule!G!{FjFuuZ-_S)l4#F8{0V$3HRbZGSBP zRPdPct}i*3_oV$-+P>-u)(uSbrzoj1vcl>s*Vq;zO>CCT(Go$4e+9vDSPR_qu z;lght_~>u+(F0zUL2=bBUt)x-ZgBEns@}I_-j^3E<>vLTe0prUIK<-mcH=J@^>yqoY=ze!|F?gk rZMkek+H#wfUtE^RE&8wfpYa&$0^T>vVl5aL7#KWV{an^LB{Ts5_g0%Y diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_00.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_00.png new file mode 100644 index 0000000000000000000000000000000000000000..3a8870c88344cc12eaf048a6e3af4d3e3ca3ab04 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdte8d_r6q7#RLvE`4<{>B@4` zT|HV({)?AXC|&ave$^xyReVHD)@53XN_&{lecD# T8#Xd9Ffe$!`njxgN@xNA%EC%U literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_01.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_01.png new file mode 100644 index 0000000000000000000000000000000000000000..e31b5411ff0903a3ca643ec21aafe0e0103f43bf GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdte8d_r6q7#RLvE`4<{>B@4` zT|HV({)?AXC|&ave$^xyReVHD)@53XN_&{lcx~T TQ*0R+7#KWV{an^LB{Ts5z@B@4` zT|HV({)?AXC|&avjw(L#s!38z)@53XN_&{l+my!F3=9m6B|(0{3=Yq3q%klsBzd|x zhEy;nJ23S)o#IPq^T=2s6`^3d#YBVgL;&a8IX71^rL1r(IroO6$snzSg-J3>dsfIn zo~NPRYo|#uNzU$RbdWl6BFxOp%!W5*Np6tH6h^}v+n&C$+{~C_GJ#R#01JcZQfao0 SEIA<8GI+ZBxvXB@4` zT|HV({)?AXC|&avjw(L#s!38z)0|R48kY6x^!?PP{3=9lO zo-U3d6^zLaOg&Dg_!8PYGFC`MD41?B(O^6g!1;F0%~eb(E8I%X%@JftJoAEs#b`^I z`N}5AQ>(?ITcwyJ+j|-v*iM`XG&3{X!<@22Hb`U&tKp5lr}Oq!Go+YIU=%sP!r<^s Wy5%Y7PIU$b1_n=8KbLh*2~7avjY*mS literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_04.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_04.png new file mode 100644 index 0000000000000000000000000000000000000000..0e16c349a0db293dbf639ed65fee86132dc9239d GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdte8d_r6q7#RLvE`4<{>B@4` zT|HV({)?AXC`Am}oGb2;f}%LL-#XDCDrV)ve|Rp0gi5^?h>?NWP|Y zwMf9Z@>$B|0B42d$%XACZ&#C%0^99vb8OSi8hY4_8klA literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_05.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_05.png new file mode 100644 index 0000000000000000000000000000000000000000..117034edc280f2cecc6ad70ce11bab0486d902d7 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdsSyd_r6q7#RLvE`4<{>B@4` zT|HV({)?AXC|&avjw(L#s!38z)0|R48kY6x^!?PP{3=9lu zo-U3d6^zLaOg&Dg_!8PYGFC`MD43eqXfU1#;Cws7GL-d1K<|q=mdYF_E<{~4EOt}q z*jP0=i@jsvo~(_TD-3Y3PwjO-?>+?cjDx(bX|hp!sdYyPLb&9o(2D9TB@4` zT|HV({)?AXC`Am}oGb2;kIxpApJvWODel^{r-yo=68bg&7+?w#pm{ zm}hy@B@4` zT|HV({)?AXC`ArG81&g6%6g`(K!ROFvoI=q))-biLD# q{QTwGiF19+U4Ncj(O$Qg@j#UH^EJ^o8yFZE7(8A5T-G@yGywpev0S78 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_08.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_08.png new file mode 100644 index 0000000000000000000000000000000000000000..dcd2d52b3e38106735804d0b08cf00edf4ab32ce GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdq5|d_r6q7#RLvE`4<{>B@4` zT|HV({)?AXD2d6sL=_)-)g-B+6MfBBxUh2Kv=o*0Frh7L&*?BQFff(``2{mLJiC#` zz`&5~>Eakt!IB@4` zT|HV({)?AXD2d6sL=_)-)g-B+6MfBBxUh2Kv=o*0Frh7L&*?BQFff(``2{mLJiC#` zz`&5`>Eakt!IB@4` zT|HV({)?AXD2d6sL=_)V(TRT5BzetOxUh2Kv=o*0FrhCG-)>-FU|=i>@(X5gcy=R= zfq@~{)5S5Qf-&`ABP&y)1jB{$czcc~QV&^FdIOkSwm6&>)nZua`6#R52xB1ArImUO zFKq2M?U9)HqED9N=9GUiK~Gx0du6n~;AOEgVfxB;GW%Ob{&}P0ta_ml_kK<}R9tQy m%lX>m=JcrnizR=3XPxLLy)U`ydL{z{1B0ilpUXO@geCy5!dP_x literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_11.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_11.png new file mode 100644 index 0000000000000000000000000000000000000000..8fcf0a83de9c15ca2db9527199263c43cadf554f GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdmW!d_r6q7#RLvE`4<{>B@4` zT|HV({)?AXD2d6sL=_)V(TRT5BzetOc;d{pg_RShrKq%r3B6_DT*|<}z*rLG7tG-B z>_!>`14Evti(^OyW9q?;jf{>AZ5Q+Z&3(e>z}Uc%wSkqP=!H9PK&O-lLrVisgTS8S z(!zdX2b_+ivK+dic>B;Ko?|<|3iLI3Jr`s!5wv*DSbJpa+ke$*5@MkVTLtFY-bwFx qTwr~(>Ba3!Dcc<8G`jc1`&)ZUP2ZmN&4hu0fx*+&&t;ucLK6T`QCJ@U literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_12.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_12.png new file mode 100644 index 0000000000000000000000000000000000000000..ec72273080a1654a7506aea39b0e9e858bfe8d9b GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdmW!d_r6q7#RLvE`4<{>B@4` zT|HV({)?AXD2d6ssOUsT6(4!kBw1KFapKIi*L;PirKq%r33(oRaFl_8fw3gWFPOpM z*^M*?28KjW7srqa#$*Sk9;Z`$32h!3E2JV6Y)wow7*7OfzMo?m%6cMT{fjwUjW|w4 zh;k&o$-KmBJf%F}Y;QJ4ij5H)lcj>P|IHgWKFCj)_{}3QK<-FF^|b&0{xeUw=)e}h cAk4tmdKI;Vst0Hs+@zW@LL literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_13.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_13.png new file mode 100644 index 0000000000000000000000000000000000000000..501c5fa7d5eca4a2c4a9a717d7372a7e7b50eb66 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdmW!d_r6q7#RLvE`4<{>B@4` zT|HV({)?AXD2d6ssOUsT6(4!kBw1KFapKIi*L;PirKq%r33(oRaFl_8fw3gWFPOpM z*^M*?28Ikz7srqa#$*Sk9;Z`$32h!3E2JV6_L`VzFrEm|d_TuBw6(Fbai*ZgYW5TZ zgFopBfB2JjMEE9VFnpR?p1*BxHb;t$5gU``f{^pgTe~DWM4f1#VHp literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_14.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_14.png new file mode 100644 index 0000000000000000000000000000000000000000..1f750d28cd703e5d4410da9938c7d013f6aad7aa GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdmW!d_r6q7#RLvE`4<{>B@4` zT|HW2vMx^ki_!>`14F*2i(^OyW3mHNkJBkW9v&SYoVfpv1(PhSe zV}sj_k_rkxBOVPNpPAv@b`FZVB@4` zT|HW2vMx^ki_!>`14EIgi(^OyW3mHNkJBkW9v&SYo&)M$>oqn%xxy7fkxk#WRC}!F|1~{*Cps92poG7(8A5T-G@yGywpUR8Nfn literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_16.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_16.png new file mode 100644 index 0000000000000000000000000000000000000000..7e13698a901cd21b556ebeb1860f28a53f7830f0 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdmW!d_r6q7#RLvE`4<{>B@4` zT|HW2vMx^ki_!>`14EIgi(^OyW9rGJj82IR3=e+$ vZ-1Hn)%-E9$E#%q^UlRH-KqWao#DEzjKRyLo9Y=D7#KWV{an^LB{Ts5L>^m= literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_17.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_17.png new file mode 100644 index 0000000000000000000000000000000000000000..cc6af9240d7eedfa25bc23e389d4ff8a9c0799ce GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdmW!d_r6q7#RLvE`4<{>B@4` zT|HW2vMx^ki_!>`14D+Vi(^OyW3mHNkJBl>gf@?i8CDSsOiXlFGMotDd^^L^x3#geapKIz#+!U6 z5;)Ql4F2(_Y%t33Wy}uZi_NLNE^wkEg@>icVWp+Kgv38v2BW%n_2utnJ$QeA{`LL8 jd_#o8F?%*028NDL($77Qu}Ls6Ffe$!`njxgN@xNA3Z_z7 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_18.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_18.png new file mode 100644 index 0000000000000000000000000000000000000000..beb08e6943f87c682930d7eeefd303c593d12e80 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdmW!d_r6q7#RLvE`4<{>B@4` zT|HW2vMx^ki_!>`14F*2i(^OyW3mHNkJBkW9v&SYogTe~DWM4fj&M}F literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_19.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_19.png new file mode 100644 index 0000000000000000000000000000000000000000..7d014bbbdf71cf9f70eaf844daa1f58c3ce253c1 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdmW!d_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1l$`t*tLQ{W6(5;6b8TVe#B097ubL#MrKq%r2^pTQ*ulWSz*rLG7tG-B z>_!>`14Ejpi(^OyW3mHNkJBl>gf@?i6;crjrY3td7*7OnzI`!g9aG8*x6+bxI!uOT zrDx_ua-?Lq>s;E&outv8x6Lw{BgMvujmc6$+5hH^8z1B+O#J2%7$A2fp?cc?fB%^$ hTy$UyU=U_tI2$CVuw#DNN(Kf722WQ%mvv4FO#l;CQ0D*u literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_20.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_20.png new file mode 100644 index 0000000000000000000000000000000000000000..9f54e4a239b7dc37423f11c5dcca61539b2728ad GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdmW!d_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1l$`t*tLQ{W6(5;6b8TVe#8*v{*L;PirKq%r37yI)3S?klU@Qsp3ubV5 zb|Z~}fg#<~#WAFUG1-Bs$LSPbLYqg%3Mpo0Vdi87=4OAU00-4Ai;H)0d9;K!HlE}^ zk-)(DpWX1;-&yHAmzKy#VDNPHb6Mw<&;$UFq)u4? literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_21.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_21.png new file mode 100644 index 0000000000000000000000000000000000000000..9129d556c2579deed46f00cff14f74423df58018 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdmW!d_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1l$`t*tLQ{W6(1?AoH%jj+E-1I*L;PirKq%r2{rj&2N}v(666=m;PC85 z8Uq7EvZsqzopr03R+-D*ylh literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_22.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_22.png new file mode 100644 index 0000000000000000000000000000000000000000..8db493f6e70e3ec7b86ca1149327c7fde33f16d2 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdq5|d_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1lvH%0ql%9>`7bW4oH%jj+H1bT(^6F0!-UpPndQmAz`$4%!iV4R^YHxFV^~_ZuD<-euE$v> pvHP3F<(MV+H+cP%Hb`J%2>dU*n~nWB@4` zT|HW2vMx(1lqSwxtD+O_H`$Y&uY+r}^gLHRqx= p`R>vaLQ2=%ovm!i_?;n)-`8DsrTl@AeGCi?44$rjF6*2UngDT(S<3(b literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_24.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_24.png new file mode 100644 index 0000000000000000000000000000000000000000..150974548d627a3596922586db1a66aa6e9399ff GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdq5|d_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1lnN^+PMo<`MJGC{_=uDL;%mOb(^6F0!-TGdRD(=mED7=pW^j0RBaMN9 zA=%T#F{FYq*@3CY=@ef=n@7e9sR#vA6B7-_69Js>=U9fao(Nd`Vuoe5aEIVc!{V!M z28%tV&jj%CZnMngNQp6GV~SKz4!?Qh#s}RA6U#gU1Ne?4?4DNs{x0i;iwB@4` zT|HW2vMx(1lnN^+PMo<`MJGC{_=uDL;%mOb(^6F0!-TGdRD(=mED7=pW^j0RBaMN9 zA<5IlF{FYq*@3CY=@ef=n@7e9sR#vA6B7-_69Js>XIO@^o(SlDGs7}lc!pu}vsJwb zZj;SsER>PTDZV9eVn+%O%O(f6b(=PBd>E~u{C3i!1u`86%XHu0+s&=8xRGZ8gBkB@4` zT|HW2vMx(1lnN^+PMo<`MJL+He{odtk!dL^?O{TOw>3bz7)yfuf*Bm1-AH3#U`X~u_ UuJzc?z`(%Z>FVdQ&MBb@00P=cyZ`_I literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_27.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_27.png new file mode 100644 index 0000000000000000000000000000000000000000..0acb19e27a27885d1506d61e221f7db3ffb98a27 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdsSyd_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1lnN^+PMo<`MJGC{_=uDL;%O-=?O{R--!I(6z`(#*666=m;PC858Uq7E zlBbJfNCjiE15=OFDZYd@kBk*k5ei#POf(oz1aQ8eVHwJLBA|E9MN4CjLo+P1m1h`w zR*QBll#$BWdt2ayMG6m#k%L>`ri~jP$|@+oov>(uPRGGAo$qh%GAk@@B@4` zT|HW2vMx(1lqSwxtD+O_i0v;>?j zO>Pt|Q=G8zqy)#3#-5ziB@4` zT|HW2vMx(1lnN^+PMo<`MJGC{_=uDL;%O-=?O{R--!I(6z`(#*666=m;PC858Uq7E zf~SjPNCjiE15=OFDZYd@kBk*k5elX@CK`+<0yy8kn6rv0Wrf?h7jq<8l3AK0C!2)l zvKUQqHjjR9#$v=L$=t{@VdCPPoSX{w6CTz}G&H!AHprf~t^Uq%B13^$qk)ql=&bZj UW_b@^1_lNOPgg&ebxsLQ0GHcGWB>pF literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_30.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_30.png new file mode 100644 index 0000000000000000000000000000000000000000..49c9ec98e949a4512008bcf287df6de2a55e2776 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdsSyd_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1lnN^+s^~;doVhlt_=uDL;%O-=?O{SQW?yY$U|?V@3GxeOaCmkjje&t7 z+0(@_q=GTofvLyo6kkG{N5%@N2nACc6Ai`_0i18=TwKMJvcj$8%nJ@CW2^KMmL^Hx zRk6~IJWpSoy|$aTvB&wCg93BP6Afu;>3fVum-sZfPBls794|V5&z8YR>I4H<0uzJz YP3cyLufJp&7#J8lUHx3vIVCg!0L#To8~^|S literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_31.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_31.png new file mode 100644 index 0000000000000000000000000000000000000000..499ac149e6e6563e63548e0993a893a34294d506 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdte8d_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1lnN^+s^~;doVnJ?fAO>wmG&^9>-#V9FfcGMmIV0)GdMiEk;cHlkm%{+ z7*fHQ?7-CHbc!#b%_C!lRD^=5jfn>1i2%;GGj6V8N?GAna^?*Old)BL2}_ft@2Z5h zPpgiGt>$U$@jd3Cz?+hyEiElQkIm?knI_k%28o>8Mc?M!WH6FC!N8Tk#K12vHErFz S;A#d21_n=8KbLh*2~7av<42+Z literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_32.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_32.png new file mode 100644 index 0000000000000000000000000000000000000000..f54e771a94033e3f8a4b726f07dd11421236c5c4 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdte8d_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1lnN^+s^~;doVnJ?fAO>wmG&^9>-#V9FfcGMmIV0)GdMiEk;cHlkm%{+ z7*fHQ?7-CHbc!#b%_C!lRD^=*9up1569JrWXWU%Hl(NFD|WTg}th<9p0Ofj1>ZTUuIr9-Gl6Gfl2j4H7xGi@wdd$zUXPf`Kc6i9uFgYTKXA TCsP?17#KWV{an^LB{Ts5B9BQl literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_33.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_33.png new file mode 100644 index 0000000000000000000000000000000000000000..eb89399493099ff3564a762d1f8149b6c2cd212d GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdte8d_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1lnN^+s^~;doVnJ?fAO>wmG&^9>-#V9FfcGMmIV0)GdMiEk;cHlkm%{+ z7*fHQ?7-CHbc!#b%_C!lRD^=*784D|69JrWXWU%Hl(NFD|WTg}th<9p0Ofj1>ZTUuIr9-Gl6Gfl2j4H7xGi@wdd$zUXPf`Kc6i9yCzYRlqP T2P7F77#KWV{an^LB{Ts56}Cuk literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_34.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_34.png new file mode 100644 index 0000000000000000000000000000000000000000..87093e1cd4ddffddd62f58c662a39c4d4c25821b GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdte8d_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1lnN^+s^~;doVnJ?fAO>wmG&^9>-#V9FfcGMmIV0)GdMiEk;cHlknHK= z7*fHQ?7-CHbc!#b%_C!lRD^=*784D|69JrWU*v=`8igoZrIoQXO3pR5Vrt}BE9$!{ zq3zSEqha2>jXl1{929s{QnaO|rRT93T{6?;I@KVNbGzu literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_35.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_35.png new file mode 100644 index 0000000000000000000000000000000000000000..91ba320f98298d3de3d8064c19d57259efbaeb54 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdsSyd_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1lnN^+s^~;doVnJ?e{odtk!dL^?O{S3>tm7_7#J8!g8YIR9G=}sV_;xN z_H=O!sbEZYVCr!?#h1|Lk+DK5Lcw&4i3a0|0M55BazYu6LX@qn(pefM=NelvHS(;z z>bokT?bE8GVGG+FjwvQ9OkgxBn$p|L`<_8Evt5KW)sbgg^3L@4atxBZDGaOzj10!- XrIYq0ZBAieU|{fc^>bP0l+XkK$!$lq literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_36.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_36.png new file mode 100644 index 0000000000000000000000000000000000000000..e6b070dc6ceee9c89e9b3f9c69e1cec803a0f99e GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdte8d_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1lvH%0C(c~!D7#KWV{an^LB{Ts5N_9;i literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_37.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_37.png new file mode 100644 index 0000000000000000000000000000000000000000..b85d111f8039c1cf765014b88910edb8edd78dac GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdsSyd_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1lnN^+s^~;doVnJ?e{odtk!dL^?O{S3>tm7_7#J8!g8YIR9G=}sV_;xN z^K@|xsbEZYVCr!?#h1|Lk+DK5Lc!F;MuYK00O#8mb5=2>tZ*wSImf|dv?Z+M%p5_E zq&4@J++s}9SRa)mmBo=FW5mWJsi5qB^Tv%2d=n;?c?1TC9Z9gBR{iZAh(oc4#t@CDJU|{fc^>bP0l+XkKCT2^K literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_38.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_38.png new file mode 100644 index 0000000000000000000000000000000000000000..913bbecf4a8219fd1cecb6b17d4ed4eb0b6cd1b4 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdte8d_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1lvH%0C(c~!FVdQ&MBb@0C^lrq5uE@ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_39.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_39.png new file mode 100644 index 0000000000000000000000000000000000000000..33ae73c088978662c2e10ad01978cf282f5bef5c GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdq5|d_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1lvH%0C(c~!@(X5gcy=R= zfq@~})5S5Qf-%{FsmJLQUqYKl#tNwj1yd6f4aO4zoVxn?p^Qc*%coD@&fX}o`INO4 z)4?9sTW=NGKFvA2Y+;+jG1X*+39Lp%Q+s=P?=wkeP8VT)>cF!tyYlB@4` zT|HW2vMx(1lvH%0C(c~!@(X5gcy=R= zfq@~{)5S5Qf-&`=A>Tm;5rzxb??>?n&1vX!kzw3@kk?{*;}OO=EmN2~mdtJ`x$3x9 z=>5-$Up`4n{@ux~7-<-H`pMORboDJ_ON1R)trnD!m2#48{`OO^@a}`aw%nu31@0Zc l{?_wG`sv_6F4I{n>*M3UOZ`~4R_X=F8J@0wF6*2UngFk8S>gZy literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_41.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_41.png new file mode 100644 index 0000000000000000000000000000000000000000..f4113adf470b27fa0155baf9b1801d53805e5f91 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdq5|d_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1l$`t*tLQ{W6(5;6b8TVe#B097(^6F0!-O7AW!}QTz`$4%pPExnJ`=#ri$*QrK{oa>+7?cL2_Bz1y;D}jlj YwN2(qZQ=Ff3=9kmp00i_>zopr0K(QwU;qFB literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_42.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_42.png new file mode 100644 index 0000000000000000000000000000000000000000..64ba1b49f8695fdf79ede930137aa8a38450f836 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdq5|d_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1l$`t*tLQ{W6(5;6b8TVe#B097(^6F0!-O7AW!}QTz`$4%K!uM0$BJDFfcGMc)I$ztaD0e0suBGOHKd) literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_43.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_43.png new file mode 100644 index 0000000000000000000000000000000000000000..34521c99f19451afb16ef7815bde8d61634f3b78 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdmW!d_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1l$`t*tLQ{W6(5;6b8TVe#8*v{*L;PirKq%r37yI)3S?klU@Qsp3ubV5 zb|Z~}fg#V+#WAFUG4U87-&K$qvEb6`8IIx;Iv6+f%bFN=Na|cL+3O|c zo_Qejk*)ot%$-WfVLOE;>2~k+nR$M%pOe(ii$M(5j#hKJqblT9eOxm2h1rhMhZWE7 ra`k)P|I%U=ZJw*n^F!ocEu+PAsp&QQJPjBa7#KWV{an^LB{Ts5XFFOT literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_44.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_44.png new file mode 100644 index 0000000000000000000000000000000000000000..4fb756a4772c243ed0fc5f805fb9a6260c606712 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdmW!d_r6q7#RLvE`4<{>B@4` zT|HW2vMx(1l$`t*M-?AY(TScobL}->;a5$Pg_RShrKq%r3FWPtZOFjDz*rLG7tG-B z>_!>`14ELhi(^OyW3mHNkJBl>gf@?i6;crjwk9STj3)v#-_NlOWjztF{>2B@4` zT|HW2vMx(1l$`t*M-?AY(TScobL}->;a5$Pg_RShrKq%r3FWPtZOFjDz*rLG7tG-B z>_!>`14F5&i(^OyW3mHNkJBkW9v&SYoB@4` zT|HV({)@$AU6xcRMHL@W(TTq1EBvZSvaoXE#F=ZSrKq%r3B6NfIK#lez*rLG7tG-B z>_!>`14Evti(^OyW3mHNkJBkW9v&SYoVfpv1(PhSe zV}sj_k_jK=k8oU@b!HMn$mjR}-5LLeu(`FlH#)4m-akX)SxrL1kM9gCo<09p{{3Df q&zu8N)8N literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_47.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_47.png new file mode 100644 index 0000000000000000000000000000000000000000..0b84556a661dd3848056996252e70fbf2dfbd26a GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdq5|d_r6q7#RLvE`4<{>B@4` zT|HV({)@$AU6xcRMHL@W(TTq1EBvZSvaoXEv=o*0Fd<2SE4vvO7#K@}{DK)Ap4~`e zU|>k`ba4!+U`%#k>Tx>7m(b=BG0Q4qfr*LkN`?~woNs4X`m&w~=zTH6(wOr|1aFE; zljQ7@G&vTdDdD=?ER#7>VvN|BA{7>g-Mn$*gYJaDI?uoWz9R|yB@4` zT|HV({)@$AU6xcRMHL@W(TTq1EBvZSvaoXEv=o*0Fd<2SE4vvO7#K@}{DK)Ap4~`e zU|=Zmba4!+U`%#k>Tx>7$HSw;!*i&wiCt1+hJ=K$q{JHT2BlN{J*@w~HM-1@l$i0h zfu}8DLEC=^HtptXDQzqZX3hU^&n2 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_49.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_49.png new file mode 100644 index 0000000000000000000000000000000000000000..054f7a4dc49bc96d9f30d4798351e770a9b08be2 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdq5|d_r6q7#RLvE`4<{>B@4` zT|HV({)@$AU6xcRMHL@W(TTq1EBvZSvaoXEv=o*0Fd<2SE4vvO7#K@}{DK)Ap4~`e zU|>l0ba4!+U`%#k>Tx>7m(b>sF~cfifr*LkN`?~woNs4X`m&w~=zTH6(wOr|1aFE8 zlVsFt^Op^hr&f#Io@2;jq$kPTs52pObxuys53v&(`bP0l+XkKN!?5# literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_50.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_50.png new file mode 100644 index 0000000000000000000000000000000000000000..5c33b2c4c58f3095bb25472f5b8924c3ef139f78 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdq5|d_r6q7#RLvE`4<{>B@4` zT|HV({)@$AU6xcRMHL@W(TTq1EBvZSvaoXEv=o*0Fd<2SE4vvO7#K@}{DK)Ap4~`e zU|>l0ba4!+U`%#k>Tx>7m(b>sF~cfifr*LEN`?~woNr&uS;myI!mZ@YoS7_1YuJp0 z8hO@Uon3N(=V@qnZl5HRf*s35+5K bSQsv>mwkFe%kU@z0|SGntDnm{r-UW|%8gC! literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_51.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_51.png new file mode 100644 index 0000000000000000000000000000000000000000..f2b767437b64d0f3d1982559c7180ccf5887616f GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdq5|d_r6q7#RLvE`4<{>B@4` zT|HV({)?AXD2d6sL=_)V(TRT5BzetOxUh2Kv=o*0FrhCG-)>-FU|=i>@(X5gcy=R= zfq|ja)5S5Qf-&{jQbwmlhK7UhGY?A(_P$^+VBl#m7U*otKfuM)P;T?kB<5dRtd*Td zSUO9{23N_3rYSZj6Z7MbR&sbAV=|h=Rut1BlQvJu>YGx>9F^|MJ5EV6*u%JIeqxlX uO*wb=Zbi3;b8qP{?upzVzI=YqdhV$7{IjA4=NK3m7(8A5T-G@yGywp~$60m& literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_52.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_52.png new file mode 100644 index 0000000000000000000000000000000000000000..e68f3c965582665cb8ac7c4aabf80330d94cc287 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdq5|d_r6q7#RLvE`4<{>B@4` zT|HV({)?AXD2d6sL=_)V(TRT5BzetOxUh2Kv=o*0FrhCG-)>-FU|=i>@(X5gcy=R= zfq@~>)5S5Qf-%{FsmJLQUqYKl#tNwj1yhqP8jL3bIN!dQvyLfch1=Q}b0S%i-Y^+) z9qe&^mC*L-UBc`lXNAX;3{wfVW6u`vuBIXdw%c3xRKM42=wUNzV4A_e Zu-#KO{Ply+#S9D#44$rjF6*2UngGgHQo;ZL literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_53.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_53.png new file mode 100644 index 0000000000000000000000000000000000000000..f784e09cf18c80f8bb450dda396d75e4a1c14e91 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdq5|d_r6q7#RLvE`4<{>B@4` zT|HV({)?AXD2d6sL=_)V(TTq1EBvZSvaoXEv=o*0FrnvEakt!I1Q{3@7(8A5T-G@yGywox22h*; literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_54.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_54.png new file mode 100644 index 0000000000000000000000000000000000000000..189625828c982a8e174b535afed7a678b9aa66b4 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdq5|d_r6q7#RLvE`4<{>B@4` zT|HV({)?AXC`AEakt!IL;raUSXRsuOl=!e1 zn`Jgho?3X&%$T>a$NQLr0(Z(2Eoo`#eXK^8^fb9nHA>`M|MYI}ZU!T%6AWAlObjb8 X$m;v^Jd9>wU|{fc^>bP0l+XkK7;H#< literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_55.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_55.png new file mode 100644 index 0000000000000000000000000000000000000000..b16c2a69ab9a56e17b7f3b9b9b675ead1ae88626 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdq5|d_r6q7#RLvE`4<{>B@4` zT|HV({)?AXD7|Wuj4D1NChKy|S6D?Sy0CKMv=o*0Frn(ZGKLHc42&f~e!&b5&u*kK zFfb%|x;TbZFeW=N^*Ej4OK9`RSRoamU}|Eb!FVEobM1>4A&f>L)2Elena7e?@_rsi znn-4oEq|z{IfH XM%E~Q!M0Nj3=9mOu6{1-oD!MB@4` zT|HV({)?AXC|&ave$^xyReVHD)B@4` zT|HV({)?AXC|&ave$^xyReVH6Ct6I_rLc11v=o*0Frn;r{Tc=a2F8*gzhDN3XE)Lq z7#Na0T^vIy7?T~CdYn%2CA4{DtdNROFf}pJU_24P`F@6FDC>!U-WM}0vxPeXFB%qK zb=%-E*=)u_8L6Djw*^k@Na11GS@+@Fb bV_;aOEvxop@_tJO1_lOCS3j3^P6B@4` zT|HV({)?AXC|&ave$^xyReVHD)O~ks@Qn#w4kr?0)mcjSqYiCYE^w28bO=u%1@^?H%KUiwB@4` zT|HV({)?AXC|&ave$^xyReVH6Ct6I_Wm<|#dzg^8*pufB3=E7VL4Lsu4$p3+F)%PB zd%8G=R4^txF!eZ{;!9}r$XFp2p|I7&M1%1}0O$J|mZ7XC0(xJ(m?O!OcxKL4!6O}W zmh9y^62Qm1?OrZNii{B(lca*O`^_6SKJZPLSmqHJAa*3ddRq0jcZ?G*I literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_60.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_60.png new file mode 100644 index 0000000000000000000000000000000000000000..c44fca9342a08ac2f8dfdc0f21ebedb774242415 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdte8d_r6q7#RLvE`4<{>B@4` zT|HV({)?AXD7|Wuj4D1NChMZ26Fn_Or9DjOg!yr21_lPkk|4ie28U-i(ij*Rl001; zLn;`P9hiEYPVptQd1S1Ricl~$G0|W=5x}XtJ|mRTDCF>IZL21Qp1!_L1vi(;&$I-b zElq9|EmNGZ@uURDlE$8#)a2yDmmS=0sku5z3N+_NpPOea?cl~N>A>j2z;IVw^7n_( Tlh+v-7#KWV{an^LB{Ts5mi9-o literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_61.png b/mods/ITEMS/mcl_clock/textures/mcl_clock_clock_61.png new file mode 100644 index 0000000000000000000000000000000000000000..b607c06c6a70ca22d43c8327b19719ebf9d74ebe GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdsSyd_r6q7#RLvE`4<{>B@4` zT|HV({)?AXC|&ave$^xyReVH6Ct6I_Wm<|#dzg^8*pufB3=E7VL4Lsu4$p3+F)%Qs zdb&7B@4` zT|HV({)?AXC|&ave$^xyReVH6Ct6I_Wm<|#dzg^8*pufB3=E7VL4Lsu4$p3+F)%Qs zc)B=-R4^txF!eZ{;!9}r$XFp2pB@4` zT|HV({)?AXC|&ave$^xyReVHD)@53XN_&{l1i2%;GFJ`P_N?GAnR&s`i$vCa#91n}J+R7%$ zQ>(?I*BY@HnMpD?noO9uHYX>iLh6La?Iju-%t;$^Pv0y~V?L3gz^u{0$so@qb;@$n SibMtm1_n=8KbLh*2~7Zt|47LI literal 0 HcmV?d00001 diff --git a/tools/Conversion_Table.csv b/tools/Conversion_Table.csv index 44bdc62b..9c44106f 100644 --- a/tools/Conversion_Table.csv +++ b/tools/Conversion_Table.csv @@ -50,7 +50,6 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/blocks,cauldron_top.png,/mods/ITEMS/mcl_cauldrons/textures,mcl_cauldrons_cauldron_top.png,,,,,,, /assets/minecraft/textures/blocks,cauldron_side.png,/mods/ITEMS/mcl_cauldrons/textures,mcl_cauldrons_cauldron_side.png,,,,,,, /assets/minecraft/textures/blocks,cauldron_inner.png,/mods/ITEMS/mcl_cauldrons/textures,mcl_cauldrons_cauldron_inner.png,,,,,,, -/assets/minecraft/textures/items,clock.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock.png,,,,,,, /assets/minecraft/textures/blocks,cocoa_stage_0.png,/mods/ITEMS/mcl_cocoas/textures,mcl_cocoas_cocoa_stage_0.png,,,,,,,y /assets/minecraft/textures/blocks,cocoa_stage_1.png,/mods/ITEMS/mcl_cocoas/textures,mcl_cocoas_cocoa_stage_1.png,,,,,,,y /assets/minecraft/textures/blocks,cocoa_stage_2.png,/mods/ITEMS/mcl_cocoas/textures,mcl_cocoas_cocoa_stage_2.png,,,,,,,y @@ -622,7 +621,7 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/blocks,observer_top.png,/mods/ITEMS/REDSTONE/mcl_observers/textures,mcl_observers_observer_top.png,,,,,,, /assets/minecraft/textures/items,redstone_dust.png,/mods/ITEMS/REDSTONE/mesecons_wires/textures,redstone_redstone_dust.png,,,,,,, /assets/minecraft/textures/items,repeater.png,/mods/ITEMS/REDSTONE/mesecons_delayer/textures,mesecons_delayer_item.png,,,,,,, -/assets/minecraft/textures/items,comparator.png,/mods/ITEMS/REDSTONE/mesecons_comparators/textures,mcl_comparators_item.png,,,,,,, +/assets/minecraft/textures/items,comparator.png,/mods/ITEMS/REDSTONE/mcl_comparators/textures,mcl_comparators_item.png,,,,,,, /assets/minecraft/textures/blocks,repeater_off.png,/mods/ITEMS/REDSTONE/mesecons_delayer/textures,mesecons_delayer_off.png,,,,,,, /assets/minecraft/textures/blocks,repeater_on.png,/mods/ITEMS/REDSTONE/mesecons_delayer/textures,mesecons_delayer_on.png,,,,,,, /assets/minecraft/textures/blocks,noteblock.png,/mods/ITEMS/REDSTONE/mesecons_noteblock/textures,mesecons_noteblock.png,,,,,,, @@ -829,6 +828,70 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/items,compass_29.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_29.png,,,,,,, /assets/minecraft/textures/items,compass_30.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_30.png,,,,,,, /assets/minecraft/textures/items,compass_31.png,/mods/ITEMS/mcl_compass/textures,mcl_compass_compass_31.png,,,,,,, +/assets/minecraft/textures/items,clock_00.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_00.png,,,,,,, +/assets/minecraft/textures/items,clock_01.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_01.png,,,,,,, +/assets/minecraft/textures/items,clock_02.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_02.png,,,,,,, +/assets/minecraft/textures/items,clock_03.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_03.png,,,,,,, +/assets/minecraft/textures/items,clock_04.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_04.png,,,,,,, +/assets/minecraft/textures/items,clock_05.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_05.png,,,,,,, +/assets/minecraft/textures/items,clock_06.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_06.png,,,,,,, +/assets/minecraft/textures/items,clock_07.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_07.png,,,,,,, +/assets/minecraft/textures/items,clock_08.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_08.png,,,,,,, +/assets/minecraft/textures/items,clock_09.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_09.png,,,,,,, +/assets/minecraft/textures/items,clock_10.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_10.png,,,,,,, +/assets/minecraft/textures/items,clock_11.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_11.png,,,,,,, +/assets/minecraft/textures/items,clock_12.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_12.png,,,,,,, +/assets/minecraft/textures/items,clock_13.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_13.png,,,,,,, +/assets/minecraft/textures/items,clock_14.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_14.png,,,,,,, +/assets/minecraft/textures/items,clock_15.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_15.png,,,,,,, +/assets/minecraft/textures/items,clock_16.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_16.png,,,,,,, +/assets/minecraft/textures/items,clock_17.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_17.png,,,,,,, +/assets/minecraft/textures/items,clock_18.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_18.png,,,,,,, +/assets/minecraft/textures/items,clock_19.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_19.png,,,,,,, +/assets/minecraft/textures/items,clock_20.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_20.png,,,,,,, +/assets/minecraft/textures/items,clock_21.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_21.png,,,,,,, +/assets/minecraft/textures/items,clock_22.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_22.png,,,,,,, +/assets/minecraft/textures/items,clock_23.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_23.png,,,,,,, +/assets/minecraft/textures/items,clock_24.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_24.png,,,,,,, +/assets/minecraft/textures/items,clock_25.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_25.png,,,,,,, +/assets/minecraft/textures/items,clock_26.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_26.png,,,,,,, +/assets/minecraft/textures/items,clock_27.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_27.png,,,,,,, +/assets/minecraft/textures/items,clock_28.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_28.png,,,,,,, +/assets/minecraft/textures/items,clock_29.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_29.png,,,,,,, +/assets/minecraft/textures/items,clock_30.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_30.png,,,,,,, +/assets/minecraft/textures/items,clock_31.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_31.png,,,,,,, +/assets/minecraft/textures/items,clock_32.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_32.png,,,,,,, +/assets/minecraft/textures/items,clock_33.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_33.png,,,,,,, +/assets/minecraft/textures/items,clock_34.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_34.png,,,,,,, +/assets/minecraft/textures/items,clock_35.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_35.png,,,,,,, +/assets/minecraft/textures/items,clock_36.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_36.png,,,,,,, +/assets/minecraft/textures/items,clock_37.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_37.png,,,,,,, +/assets/minecraft/textures/items,clock_38.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_38.png,,,,,,, +/assets/minecraft/textures/items,clock_39.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_39.png,,,,,,, +/assets/minecraft/textures/items,clock_40.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_40.png,,,,,,, +/assets/minecraft/textures/items,clock_41.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_41.png,,,,,,, +/assets/minecraft/textures/items,clock_42.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_42.png,,,,,,, +/assets/minecraft/textures/items,clock_43.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_43.png,,,,,,, +/assets/minecraft/textures/items,clock_44.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_44.png,,,,,,, +/assets/minecraft/textures/items,clock_45.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_45.png,,,,,,, +/assets/minecraft/textures/items,clock_46.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_46.png,,,,,,, +/assets/minecraft/textures/items,clock_47.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_47.png,,,,,,, +/assets/minecraft/textures/items,clock_48.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_48.png,,,,,,, +/assets/minecraft/textures/items,clock_49.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_49.png,,,,,,, +/assets/minecraft/textures/items,clock_50.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_50.png,,,,,,, +/assets/minecraft/textures/items,clock_51.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_51.png,,,,,,, +/assets/minecraft/textures/items,clock_52.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_52.png,,,,,,, +/assets/minecraft/textures/items,clock_53.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_53.png,,,,,,, +/assets/minecraft/textures/items,clock_54.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_54.png,,,,,,, +/assets/minecraft/textures/items,clock_55.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_55.png,,,,,,, +/assets/minecraft/textures/items,clock_56.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_56.png,,,,,,, +/assets/minecraft/textures/items,clock_57.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_57.png,,,,,,, +/assets/minecraft/textures/items,clock_58.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_58.png,,,,,,, +/assets/minecraft/textures/items,clock_59.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_59.png,,,,,,, +/assets/minecraft/textures/items,clock_60.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_60.png,,,,,,, +/assets/minecraft/textures/items,clock_61.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_61.png,,,,,,, +/assets/minecraft/textures/items,clock_62.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_62.png,,,,,,, +/assets/minecraft/textures/items,clock_63.png,/mods/ITEMS/mcl_clock/textures,mcl_clock_clock_63.png,,,,,,, /assets/minecraft/textures/items,empty_armor_slot_boots.png,/mods/HUD/mcl_inventory/textures,mcl_inventory_empty_armor_slot_boots.png,,,,,,, /assets/minecraft/textures/items,empty_armor_slot_chestplate.png,/mods/HUD/mcl_inventory/textures,mcl_inventory_empty_armor_slot_chestplate.png,,,,,,, /assets/minecraft/textures/items,empty_armor_slot_helmet.png,/mods/HUD/mcl_inventory/textures,mcl_inventory_empty_armor_slot_helmet.png,,,,,,, From ab38d55646de3c967cc303d9d76abe632f33267c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 20 May 2018 03:02:31 +0200 Subject: [PATCH 0055/1107] Dispenser craft no longer needs bow to be intact --- mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 22 --------------------- 1 file changed, 22 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 7d459cd8..0642f7f1 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -325,28 +325,6 @@ minetest.register_craft({ } }) --- Only allow crafting if the bow is intact -local check_craft = function(itemstack, player, old_craft_grid, craft_inv) - if itemstack:get_name() == "mcl_dispensers:dispenser" then - local bow, id - for i=1, craft_inv:get_size("craft") do - local item = craft_inv:get_stack("craft", i) - if item:get_name() == "mcl_bows:bow" then - bow = item - id = i - break - end - end - if bow and bow:get_wear() ~= 0 then - return "" - end - end - return nil -end - -minetest.register_on_craft(check_craft) -minetest.register_craft_predict(check_craft) - -- Add entry aliases for the Help if minetest.get_modpath("doc") then doc.add_entry_alias("nodes", "mcl_dispensers:dispenser", "nodes", "mcl_dispensers:dispenser_down") From 12b0954523c4bc254bb3b9114f66d18e85ba3453 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 20 May 2018 15:25:57 +0200 Subject: [PATCH 0056/1107] Fix possible crash in mcl_mapgen_core --- mods/MAPGEN/mcl_mapgen_core/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index e7500b7b..8eee6b13 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1092,8 +1092,8 @@ local function generate_structures(minp, maxp, seed, biomemap) -- Find ground level local ground_y = nil for y = struct_max, struct_min, -1 do - local checknode = minetest.get_node({x=x,y=y,z=z}).name - if minetest.registered_nodes[checknode].walkable then + local checknode = minetest.get_node_or_nil({x=x,y=y,z=z}) + if checknode and minetest.registered_nodes[checknode.name].walkable then ground_y = y break end From 48b7191af2dbda2e0782074ae17786b6b3a5f6b4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 25 May 2018 13:45:41 +0200 Subject: [PATCH 0057/1107] Regularily damage and delete entities in void --- mods/ENTITIES/mcl_void_damage/depends.txt | 2 + mods/ENTITIES/mcl_void_damage/description.txt | 1 + mods/ENTITIES/mcl_void_damage/init.lua | 43 +++++++++++++++++++ mods/ENTITIES/mcl_void_damage/mod.conf | 1 + mods/PLAYER/mcl_death_drop/init.lua | 6 ++- mods/PLAYER/mcl_playerplus/depends.txt | 1 - mods/PLAYER/mcl_playerplus/init.lua | 19 -------- 7 files changed, 51 insertions(+), 22 deletions(-) create mode 100644 mods/ENTITIES/mcl_void_damage/depends.txt create mode 100644 mods/ENTITIES/mcl_void_damage/description.txt create mode 100644 mods/ENTITIES/mcl_void_damage/init.lua create mode 100644 mods/ENTITIES/mcl_void_damage/mod.conf diff --git a/mods/ENTITIES/mcl_void_damage/depends.txt b/mods/ENTITIES/mcl_void_damage/depends.txt new file mode 100644 index 00000000..e134aeef --- /dev/null +++ b/mods/ENTITIES/mcl_void_damage/depends.txt @@ -0,0 +1,2 @@ +mcl_worlds +mcl_death_messages diff --git a/mods/ENTITIES/mcl_void_damage/description.txt b/mods/ENTITIES/mcl_void_damage/description.txt new file mode 100644 index 00000000..ac7e3d8c --- /dev/null +++ b/mods/ENTITIES/mcl_void_damage/description.txt @@ -0,0 +1 @@ +Deal damage to entities stuck in the deep void diff --git a/mods/ENTITIES/mcl_void_damage/init.lua b/mods/ENTITIES/mcl_void_damage/init.lua new file mode 100644 index 00000000..f8f4578f --- /dev/null +++ b/mods/ENTITIES/mcl_void_damage/init.lua @@ -0,0 +1,43 @@ +local voidtimer = 0 + +minetest.register_globalstep(function(dtime) + voidtimer = voidtimer + dtime + if voidtimer > 0.5 then + voidtimer = 0 + local objs = minetest.object_refs + local enable_damage = minetest.settings:get_bool("enable_damage") + for id, obj in pairs(objs) do + local pos = obj:get_pos() + local void, void_deadly = mcl_worlds.is_in_void(pos) + if void_deadly then + local is_player = obj:is_player() + local ent = obj:get_luaentity() + local immortal_val = obj:get_armor_groups().immortal + local is_immortal = false + if immortal_val and immortal_val > 0 then + is_immortal = true + end + if is_immortal or not enable_damage then + if is_player then + -- If damage is disabled, we can't kill players. + -- So we just teleport the player back to spawn. + local spawn = mcl_spawn.get_spawn_pos(obj) + obj:set_pos(spawn) + mcl_worlds.dimension_change(obj, mcl_worlds.pos_to_dimension(spawn)) + minetest.chat_send_player(obj:get_player_name(), "The void is off-limits to you!") + else + obj:remove() + end + elseif enable_damage and not is_immortal then + -- Damage enabled, not immortal: Deal void damage (4 HP / 0.5 seconds) + if obj:get_hp() > 0 then + if is_player then + mcl_death_messages.player_damage(obj, string.format("%s fell into the endless void.", obj:get_player_name())) + end + obj:set_hp(obj:get_hp() - 4) + end + end + end + end + end +end) diff --git a/mods/ENTITIES/mcl_void_damage/mod.conf b/mods/ENTITIES/mcl_void_damage/mod.conf new file mode 100644 index 00000000..7e0ea4ba --- /dev/null +++ b/mods/ENTITIES/mcl_void_damage/mod.conf @@ -0,0 +1 @@ +name = mcl_void_damage diff --git a/mods/PLAYER/mcl_death_drop/init.lua b/mods/PLAYER/mcl_death_drop/init.lua index 6d0947e2..1b033bae 100644 --- a/mods/PLAYER/mcl_death_drop/init.lua +++ b/mods/PLAYER/mcl_death_drop/init.lua @@ -3,8 +3,10 @@ minetest.register_on_dieplayer(function(player) if keep == false then -- Drop inventory, crafting grid and armor local inv = player:get_inventory() - local pos = player:getpos() + local pos = player:get_pos() local name, player_armor_inv, armor_armor_inv, pos = armor:get_valid_player(player, "[on_dieplayer]") + -- No item drop if in deep void + local void, void_deadly = mcl_worlds.is_in_void(pos) local lists = { { inv = inv, listname = "main", drop = true }, { inv = inv, listname = "craft", drop = true }, @@ -21,7 +23,7 @@ minetest.register_on_dieplayer(function(player) local z = math.random(0, 9)/3 pos.x = pos.x + x pos.z = pos.z + z - if drop then + if not void_deadly and drop then minetest.add_item(pos, stack) end stack:clear() diff --git a/mods/PLAYER/mcl_playerplus/depends.txt b/mods/PLAYER/mcl_playerplus/depends.txt index 8ff8b857..9eb53eaf 100644 --- a/mods/PLAYER/mcl_playerplus/depends.txt +++ b/mods/PLAYER/mcl_playerplus/depends.txt @@ -1,5 +1,4 @@ mcl_init -mcl_worlds mcl_core mcl_particles mcl_hunger diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index a07b63be..4a454adb 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -141,25 +141,6 @@ minetest.register_globalstep(function(dtime) end end - -- Deal Void damage - local void, void_deadly = mcl_worlds.is_in_void(pos) - if void_deadly then - -- Player is deep into the void, deal void damage - if minetest.settings:get_bool("enable_damage") then - if player:get_hp() > 0 then - mcl_death_messages.player_damage(player, string.format("%s fell into the endless void.", name)) - player:set_hp(player:get_hp() - 4) - end - else - -- If damge is disabled, we can't kill the player. - -- So we just teleport the player back to spawn. - local spawn = mcl_spawn.get_spawn_pos(player) - player:set_pos(spawn) - mcl_worlds.dimension_change(player, mcl_worlds.pos_to_dimension(spawn)) - minetest.chat_send_player(name, "The void is off-limits to you!") - end - end - --[[ Swimming: Cause exhaustion. NOTE: As of 0.4.15, it only counts as swimming when you are with the feet inside the liquid! Head alone does not count. We respect that for now. ]] From fc94f50e6a3b30da225ae0b35fe82624b70b6942 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 27 May 2018 10:33:49 +0200 Subject: [PATCH 0058/1107] Fix another logic fail in arrow mob detect code --- mods/ITEMS/mcl_bows/arrow.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index bd2bee44..71375263 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -148,7 +148,6 @@ ARROW_ENTITY.on_step = function(self, dtime) local objs = minetest.get_objects_inside_radius(pos, 3) local closest_object local closest_distance - local ok = false if self._deflection_cooloff > 0 then self._deflection_cooloff = self._deflection_cooloff - dtime @@ -156,6 +155,7 @@ ARROW_ENTITY.on_step = function(self, dtime) -- 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 From 187e6b7e589b5afb948546c58574095153ff88e2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 27 May 2018 10:41:50 +0200 Subject: [PATCH 0059/1107] Remove water damage from creeper --- mods/ENTITIES/mobs_mc/creeper.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 40b02d16..b131bf09 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -119,7 +119,6 @@ mobs:register_mob("mobs_mc:creeper", { }, floats = 1, fear_height = 4, - water_damage = 1, lava_damage = 4, light_damage = 0, view_range = 16, From c4ced1fbdfd55fef3fbb997323ffc568866b6a48 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 28 May 2018 15:49:04 +0200 Subject: [PATCH 0060/1107] Fix arrows being punchable to death --- mods/ITEMS/mcl_bows/arrow.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 71375263..132918d1 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -358,6 +358,7 @@ ARROW_ENTITY.on_activate = function(self, staticdata, dtime_s) end end end + self.object:set_armor_groups({ immortal = 1 }) end minetest.register_entity("mcl_bows:arrow_entity", ARROW_ENTITY) From f8362e798fb6574ec2aec2870e0ae8ea5a3aecdf Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 28 May 2018 16:32:15 +0200 Subject: [PATCH 0061/1107] Make v6 ice spikes much rarer --- mods/MAPGEN/mcl_mapgen_core/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 8eee6b13..2266e886 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1268,7 +1268,7 @@ local function generate_structures(minp, maxp, seed, biomemap) -- 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 = math.random(1, 3000) + local spike = math.random(1, 58000) if spike < 3 then -- Check surface local floor = {x=p.x+4, y=p.y-1, z=p.z+4} From eb02e9f3e1e6e55675bd7564dfa73526e7916a1d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 28 May 2018 19:18:12 +0200 Subject: [PATCH 0062/1107] Version 0.39.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5ca4fd05..0c7a9d5f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.38.0 +Version: 0.39.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From cf8415f87ae1414d0f6ec313e99fd6ba3c817d58 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 29 May 2018 13:25:25 +0200 Subject: [PATCH 0063/1107] Merge mcstair into mcl_stairs --- API.md | 2 +- mods/ITEMS/mcl_stairs/README.txt | 1 + mods/ITEMS/mcl_stairs/alias.lua | 2 +- mods/ITEMS/mcl_stairs/api.lua | 8 +- .../init.lua => mcl_stairs/cornerstair.lua} | 58 +++---- mods/ITEMS/mcl_stairs/init.lua | 1 + mods/ITEMS/mcl_stairs/register.lua | 146 ++++++++---------- .../textures/mcl_stairs_turntexture.png | Bin 0 -> 126 bytes mods/ITEMS/mclx_stairs/depends.txt | 1 - mods/ITEMS/mclx_stairs/init.lua | 18 --- mods/ITEMS/mcstair/README.md | 49 ------ mods/ITEMS/mcstair/depends.txt | 3 - mods/ITEMS/mcstair/description.txt | 1 - mods/ITEMS/mcstair/mod.conf | 1 - .../mcstair/textures/mcstair_turntexture.png | Bin 170 -> 0 bytes 15 files changed, 92 insertions(+), 199 deletions(-) rename mods/ITEMS/{mcstair/init.lua => mcl_stairs/cornerstair.lua} (95%) create mode 100644 mods/ITEMS/mcl_stairs/textures/mcl_stairs_turntexture.png delete mode 100644 mods/ITEMS/mcstair/README.md delete mode 100644 mods/ITEMS/mcstair/depends.txt delete mode 100644 mods/ITEMS/mcstair/description.txt delete mode 100644 mods/ITEMS/mcstair/mod.conf delete mode 100644 mods/ITEMS/mcstair/textures/mcstair_turntexture.png diff --git a/API.md b/API.md index c4e3b229..e4e31278 100644 --- a/API.md +++ b/API.md @@ -62,7 +62,7 @@ API documnetation is included in `ENTITIES/mobs/api.txt`. The following APIs may be subject to change in future. You could already use these APIs but there will probably be breaking changes in the future, or the API is not as fleshed out as it should be. Use at your own risk! * Panes (like glass panes and iron bars): `ITEMS/xpanes` -* Slabs and stairs: `ITEM/mcl_stairs` **and** `ITEMS/mcstair` +* Slabs and stairs: `ITEM/mcl_stairs` * `_on_ignite` callback: `ITEMS/mcl_fire` * Farming: `ITEMS/mcl_farming` * Anything related to redstone: Don't touch (yet) diff --git a/mods/ITEMS/mcl_stairs/README.txt b/mods/ITEMS/mcl_stairs/README.txt index d336e4a2..9607b5d0 100644 --- a/mods/ITEMS/mcl_stairs/README.txt +++ b/mods/ITEMS/mcl_stairs/README.txt @@ -15,3 +15,4 @@ 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 index 1b2d9384..1865b577 100644 --- a/mods/ITEMS/mcl_stairs/alias.lua +++ b/mods/ITEMS/mcl_stairs/alias.lua @@ -11,7 +11,7 @@ for m=1, #materials do minetest.register_alias("stairs:slab_"..mat, "mcl_stairs:slab_"..mat) minetest.register_alias("stairs:stair_"..mat, "mcl_stairs:stair_"..mat) - -- mcstair + -- 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 diff --git a/mods/ITEMS/mcl_stairs/api.lua b/mods/ITEMS/mcl_stairs/api.lua index 8dc65cc4..03d88d48 100644 --- a/mods/ITEMS/mcl_stairs/api.lua +++ b/mods/ITEMS/mcl_stairs/api.lua @@ -1,3 +1,5 @@ +-- Core mcl_stairs API + -- Wrapper around mintest.pointed_thing_to_face_pos. local function get_fpos(placer, pointed_thing) local fpos @@ -74,10 +76,10 @@ local function place_stair(itemstack, placer, pointed_thing) return minetest.item_place(itemstack, placer, pointed_thing, param2) end --- Register mcl_stairs. +-- Register stairs. -- Node will be called mcl_stairs:stair_ -function mcl_stairs.register_stair(subname, recipeitem, groups, images, description, sounds, hardness) +function mcl_stairs.register_stair(subname, recipeitem, groups, images, description, sounds, hardness, corner_texture_override) groups.stair = 1 groups.building_block = 1 @@ -151,6 +153,8 @@ function mcl_stairs.register_stair(subname, recipeitem, groups, images, descript }, }) end + + mcl_stairs.cornerstair.add("mcl_stairs:stair_"..subname, corner_texture_override) end diff --git a/mods/ITEMS/mcstair/init.lua b/mods/ITEMS/mcl_stairs/cornerstair.lua similarity index 95% rename from mods/ITEMS/mcstair/init.lua rename to mods/ITEMS/mcl_stairs/cornerstair.lua index 2bf8f41f..100657ca 100644 --- a/mods/ITEMS/mcstair/init.lua +++ b/mods/ITEMS/mcl_stairs/cornerstair.lua @@ -1,4 +1,9 @@ -mcstair = {} +-- 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 get_stair_param = function(node) local stair = minetest.get_item_group(node.name, "stair") @@ -179,7 +184,19 @@ local stair_connect_to_param = function(connect, ceiling) return param end -function mcstair.add(name, stairtiles) +--[[ +mcl_stairs.cornerstair.add(name, stairtiles) + +* "name" is the name of the node to make corner stairs for. +* "stairtiles" is an optional table of tiles to override textures for inner and outer stairs. +* "stairtiles" format is: + + {tiles_def_for_outer_stair, tiles_def_for_inner_stair} + +Note: This function is called when you register a stair, no need to call it again! +]] + +function mcl_stairs.cornerstair.add(name, stairtiles) local node_def = minetest.registered_nodes[name] local outer_tiles local inner_tiles @@ -653,41 +670,4 @@ function mcstair.add(name, stairtiles) end end -for _,v in ipairs({ - "wood", - "junglewood", - "sprucewood", - "acaciawood", - "birchwood", - "darkwood" -}) do - local t = minetest.registered_nodes["mcl_core:"..v].tiles[1] - mcstair.add("mcl_stairs:stair_"..v, { - { - t.."^("..t.."^[transformR90^mcstair_turntexture.png^[makealpha:255,0,255)", - t.."^("..t.."^mcstair_turntexture.png^[transformR270^[makealpha:255,0,255)", - t - }, - { - t.."^("..t.."^[transformR90^(mcstair_turntexture.png^[transformR180)^[makealpha:255,0,255)", - t.."^("..t.."^[transformR270^(mcstair_turntexture.png^[transformR90)^[makealpha:255,0,255)", - t - } - }) -end -for _,v in ipairs({ - "cobble", - "brick_block", - "sandstone", - "redsandstone", - "stonebrick", - "quartzblock", - "purpur_block", - "nether_brick", - "prismarine", - "prismarine_brick", - "prismarine_dark", -}) do - mcstair.add("mcl_stairs:stair_"..v) -end diff --git a/mods/ITEMS/mcl_stairs/init.lua b/mods/ITEMS/mcl_stairs/init.lua index ca6f5755..a5ca820b 100644 --- a/mods/ITEMS/mcl_stairs/init.lua +++ b/mods/ITEMS/mcl_stairs/init.lua @@ -8,6 +8,7 @@ mcl_stairs = {} -- Load other files dofile(minetest.get_modpath("mcl_stairs").."/api.lua") +dofile(minetest.get_modpath("mcl_stairs").."/cornerstair.lua") dofile(minetest.get_modpath("mcl_stairs").."/register.lua") dofile(minetest.get_modpath("mcl_stairs").."/crafting.lua") dofile(minetest.get_modpath("mcl_stairs").."/alias.lua") diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua index e61b4c12..472afc3c 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -3,90 +3,47 @@ -- slabs actually take slightly longer to be dug than their stair counterparts. -- Note sure if it is a good idea to preserve this oddity. -mcl_stairs.register_stair("wood", "mcl_core:wood", - {handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1}, - {"default_wood.png"}, - "Oak Wood Stairs", - mcl_sounds.node_sound_wood_defaults(), - 2) -mcl_stairs.register_slab("wood", "mcl_core:wood", - {handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1}, - {"default_wood.png"}, - "Oak Wood Slab", - mcl_sounds.node_sound_wood_defaults(), - 2, - "Double Oak Wood Slab") +local function make_wood_corner_texture(subname) + local t = minetest.registered_nodes["mcl_core:"..subname].tiles[1] + return { + { + t.."^("..t.."^[transformR90^mcl_stairs_turntexture.png^[makealpha:255,0,255)", + t.."^("..t.."^mcl_stairs_turntexture.png^[transformR270^[makealpha:255,0,255)", + t + }, + { + t.."^("..t.."^[transformR90^(mcl_stairs_turntexture.png^[transformR180)^[makealpha:255,0,255)", + t.."^("..t.."^[transformR270^(mcl_stairs_turntexture.png^[transformR90)^[makealpha:255,0,255)", + t + } + } +end +local woods = { + { "wood", "default_wood.png", "Oak Wood Stairs", "Oak Wood Slab", "Double Oak Wood Slab" }, + { "junglewood", "default_junglewood.png", "Jungle Wood Stairs", "Jungle Wood Slab", "Double Jungle Wood Slab" }, + { "acaciawood", "default_acacia_wood.png", "Acacia Wood Stairs", "Acacia Wood Slab", "Double Acacia Wood Slab" }, + { "sprucewood", "mcl_core_planks_spruce.png", "Spruce Wood Stairs", "Spruce Wood Slab", "Double Spruce Wood Slab" }, + { "birchwood", "mcl_core_planks_birch.png", "Birch Wood Stairs", "Birch Wood Slab", "Double Birch Wood Slab" }, + { "darkwood", "mcl_core_planks_big_oak.png", "Dark Oak Wood Stairs", "Dark Oak Wood Slab", "Double Dark Oak Wood Slab" }, +} -mcl_stairs.register_stair("junglewood", "mcl_core:junglewood", - {handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1}, - {"default_junglewood.png"}, - "Jungle Wood Stairs", - mcl_sounds.node_sound_wood_defaults(), - 2) -mcl_stairs.register_slab("junglewood", "mcl_core:junglewood", - {handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1}, - {"default_junglewood.png"}, - "Jungle Wood Slab", - mcl_sounds.node_sound_wood_defaults(), - 2, - "Double Jungle Wood Slab") - -mcl_stairs.register_stair("acaciawood", "mcl_core:acaciawood", - {handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1}, - {"default_acacia_wood.png"}, - "Acacia Wood Stairs", - mcl_sounds.node_sound_wood_defaults(), - 2) - -mcl_stairs.register_slab("acaciawood", "mcl_core:acaciawood", - {handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1}, - {"default_acacia_wood.png"}, - "Acacia Wood Slab", - mcl_sounds.node_sound_wood_defaults(), - 2, - "Double Acacia Wood Slab") - -mcl_stairs.register_stair("sprucewood", "mcl_core:sprucewood", - {handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1}, - {"mcl_core_planks_spruce.png"}, - "Spruce Wood Stairs", - mcl_sounds.node_sound_wood_defaults(), - 2) -mcl_stairs.register_slab("sprucewood", "mcl_core:sprucewood", - {handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1}, - {"mcl_core_planks_spruce.png"}, - "Spruce Wood Slab", - mcl_sounds.node_sound_wood_defaults(), - 2, - "Double Spruce Wood Slab") - -mcl_stairs.register_stair("birchwood", "mcl_core:birchwood", - {handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1}, - {"mcl_core_planks_birch.png"}, - "Birch Wood Stairs", - mcl_sounds.node_sound_wood_defaults(), - 2) -mcl_stairs.register_slab("birchwood", "mcl_core:birchwood", - {handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1}, - {"mcl_core_planks_birch.png"}, - "Birch Wood Slab", - mcl_sounds.node_sound_wood_defaults(), - 2, - "Double Birch Wood Slab") - -mcl_stairs.register_stair("darkwood", "mcl_core:darkwood", - {handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1}, - {"mcl_core_planks_big_oak.png"}, - "Dark Oak Wood Stairs", - mcl_sounds.node_sound_wood_defaults(), - 2) -mcl_stairs.register_slab("darkwood", "mcl_core:darkwood", - {handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1}, - {"mcl_core_planks_big_oak.png"}, - "Dark Oak Wood Slab", - mcl_sounds.node_sound_wood_defaults(), - 2, - "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}, + {wood[2]}, + wood[3], + mcl_sounds.node_sound_wood_defaults(), + 2, + make_wood_corner_texture(wood[1])) + mcl_stairs.register_slab(wood[1], "mcl_core:"..wood[1], + {handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1}, + {wood[2]}, + wood[4], + mcl_sounds.node_sound_wood_defaults(), + 2, + wood[5]) +end mcl_stairs.register_slab("stone", "mcl_core:stone", {pickaxey=1, material_stone=1}, @@ -171,3 +128,26 @@ mcl_stairs.register_stair_and_slab_simple("prismarine", "mcl_ocean:prismarine", mcl_stairs.register_stair_and_slab_simple("prismarine_brick", "mcl_ocean:prismarine_brick", "Prismarine Brick Stairs", "Prismarine Brick Slab", "Double Prismarine Brick Slab") mcl_stairs.register_stair_and_slab_simple("prismarine_dark", "mcl_ocean:prismarine_dark", "Dark Prismarine Stairs", "Dark Prismarine Slab", "Double Dark Prismarine Slab") + +for _,v in ipairs({ + "wood", + "junglewood", + "sprucewood", + "acaciawood", + "birchwood", + "darkwood" +}) do + local t = minetest.registered_nodes["mcl_core:"..v].tiles[1] + mcl_stairs.cornerstair.add("mcl_stairs:stair_"..v, { + { + t.."^("..t.."^[transformR90^mcl_stairs_turntexture.png^[makealpha:255,0,255)", + t.."^("..t.."^mcl_stairs_turntexture.png^[transformR270^[makealpha:255,0,255)", + t + }, + { + t.."^("..t.."^[transformR90^(mcl_stairs_turntexture.png^[transformR180)^[makealpha:255,0,255)", + t.."^("..t.."^[transformR270^(mcl_stairs_turntexture.png^[transformR90)^[makealpha:255,0,255)", + t + } + }) +end diff --git a/mods/ITEMS/mcl_stairs/textures/mcl_stairs_turntexture.png b/mods/ITEMS/mcl_stairs/textures/mcl_stairs_turntexture.png new file mode 100644 index 0000000000000000000000000000000000000000..d59ff892427ea2015a775f9b7561b56f81ce4493 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRdMrH;E236Z!B?bltwg8_H*Z&Ov85kJmFBAF1 zz`(#%666>BpW*3t122#=PZ!6K3dZDh_6N>PIB+K5z?p!9X95nN2{?Wx;QW~j2hJR5 c5M^XoeV=7xjeA!h0|Nttr>mdKI;Vst0QKo8lmGw# literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mclx_stairs/depends.txt b/mods/ITEMS/mclx_stairs/depends.txt index ade2a1d4..89eb864a 100644 --- a/mods/ITEMS/mclx_stairs/depends.txt +++ b/mods/ITEMS/mclx_stairs/depends.txt @@ -5,4 +5,3 @@ mcl_nether mcl_end mcl_colorblocks mcl_stairs -mcstair diff --git a/mods/ITEMS/mclx_stairs/init.lua b/mods/ITEMS/mclx_stairs/init.lua index 3c6a7fd5..05dfb27c 100644 --- a/mods/ITEMS/mclx_stairs/init.lua +++ b/mods/ITEMS/mclx_stairs/init.lua @@ -1,55 +1,39 @@ mcl_stairs.register_stair_and_slab_simple("end_bricks", "mcl_end:end_bricks", "End Stone Brick Stairs", "End Stone Brick Slab", "Double End Stone Brick Slab") -mcstair.add("mcl_stairs:stair_end_bricks") mcl_stairs.register_stair_and_slab_simple("red_nether_brick", "mcl_nether:red_nether_brick", "Red Nether Brick Stairs", "Red Nether Brick Slab", "Double Red Nether Brick Slab") -mcstair.add("mcl_stairs:stair_red_nether_brick") mcl_stairs.register_stair_and_slab_simple("mossycobble", "mcl_core:mossycobble", "Moss Stone Stairs", "Moss Stone Slab", "Double Moss Stone Slab") -mcstair.add("mcl_stairs:stair_mossycobble") mcl_stairs.register_stair_and_slab_simple("tree_bark", "mcl_core:tree_bark", "Oak Bark Stairs", "Oak Bark Slab", "Double Oak Bark Slab") -mcstair.add("mcl_stairs:stair_tree_bark") mcl_stairs.register_stair_and_slab_simple("acaciatree_bark", "mcl_core:acaciatree_bark", "Acacia Bark Stairs", "Acacia Bark Slab", "Double Acacia Bark Slab") -mcstair.add("mcl_stairs:stair_acaciatree_bark") mcl_stairs.register_stair_and_slab_simple("sprucetree_bark", "mcl_core:sprucetree_bark", "Spruce Bark Stairs", "Spruce Bark Slab", "Double Spruce Bark Slab") -mcstair.add("mcl_stairs:stair_sprucetree_bark") mcl_stairs.register_stair_and_slab_simple("birchtree_bark", "mcl_core:birchtree_bark", "Birch Bark Stairs", "Birch Bark Slab", "Double Birch Bark Slab") -mcstair.add("mcl_stairs:stair_birchtree_bark") mcl_stairs.register_stair_and_slab_simple("jungletree_bark", "mcl_core:jungletree_bark", "Jungle Bark Stairs", "Jungle Bark Slab", "Double Jungle Bark Slab") -mcstair.add("mcl_stairs:stair_jungletree_bark") mcl_stairs.register_stair_and_slab_simple("darktree_bark", "mcl_core:darktree_bark", "Dark Oak Bark Stairs", "Dark Oak Bark Slab", "Double Dark Oak Bark Slab") -mcstair.add("mcl_stairs:stair_darktree_bark") 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"}, "Lapis Lazuli Slab", nil, nil, "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"}, "Lapis Lazuli Stair") -mcstair.add("mcl_stairs:stair_lapisblock") mcl_stairs.register_slab("goldblock", "mcl_core:goldblock", {pickaxey=4}, {"default_gold_block.png", "default_gold_block.png", "mcl_stairs_gold_block_slab.png"}, "Slab of Gold", nil, nil, "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"}, "Stair of Gold") -mcstair.add("mcl_stairs:stair_goldblock") mcl_stairs.register_slab("ironblock", "mcl_core:ironblock", {pickaxey=2}, {"default_steel_block.png", "default_steel_block.png", "mcl_stairs_iron_block_slab.png"}, "Slab of Iron", nil, nil, "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"}, "Stair of Iron") -mcstair.add("mcl_stairs:stair_ironblock") 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"}, "Polished Andesite Slab", nil, nil, "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"}, "Polished Andesite Stair") -mcstair.add("mcl_stairs:stair_andesite_smooth") 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"}, "Polished Granite Slab", nil, nil, "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"}, "Polished Granite Stair") -mcstair.add("mcl_stairs:stair_granite_smooth") 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"}, "Polished Diorite Slab", nil, nil, "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"}, "Polished Diorite Stair") -mcstair.add("mcl_stairs:stair_diorite_smooth") mcl_stairs.register_stair("stonebrickmossy", "mcl_core:stonebrickmossy", {pickaxey=1}, {"mcl_core_stonebrick_mossy.png"}, "Mossy Stone Brick Stairs", mcl_sounds.node_sound_stone_defaults(), 1.5, nil, "mcl_core:stonebrickmossy") -mcstair.add("mcl_stairs:stair_stonebrickmossy") mcl_stairs.register_slab("stonebrickmossy", "mcl_core:stonebrickmossy", {pickaxey=1}, @@ -62,7 +46,6 @@ mcl_stairs.register_stair("stonebrickcracked", "mcl_core:stonebrickcracked", {"mcl_core_stonebrick_cracked.png"}, "Cracked Stone Brick Stairs", mcl_sounds.node_sound_stone_defaults(), 1.5, nil, "mcl_core:stonebrickcracked") -mcstair.add("mcl_stairs:stair_stonebrickcracked") mcl_stairs.register_slab("stonebrickcracked", "mcl_core:stonebrickcracked", {pickaxey=1}, @@ -96,6 +79,5 @@ for i=1, #block.dyes do block.dyes[i][2].." Concrete Stairs", block.dyes[i][2].." Concrete Slab", "Double "..block.dyes[i][2].." Concrete Slab") - mcstair.add("mcl_stairs:stair_concrete_"..c) end diff --git a/mods/ITEMS/mcstair/README.md b/mods/ITEMS/mcstair/README.md deleted file mode 100644 index f2b28439..00000000 --- a/mods/ITEMS/mcstair/README.md +++ /dev/null @@ -1,49 +0,0 @@ -mcstair v1.0 - -Minecraft like corner stairs. - -License for all of this mod is "CC0", see below. - -```txt -CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER. - -Statement of Purpose -The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). -Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others. -For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: - i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; - ii. moral rights retained by the original author(s) and/or performer(s); - iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; - iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; - v. rights protecting the extraction, dissemination, use and reuse of data in a Work; - vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and - vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. - -4. Limitations and Disclaimers. - a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. - b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. - c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. - d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. -``` - -mod api: - -```lua -mcstair.add(name, stairtiles) -``` - -"name" is the name of the node to make corner stairs for. - -"stairtiles" is an optional table of tiles to override textures for inner and outer stairs. - -"stairtiles" format is... - -```lua -{tiles_def_for_outer_stair, tiles_def_for_inner_stair} -``` diff --git a/mods/ITEMS/mcstair/depends.txt b/mods/ITEMS/mcstair/depends.txt deleted file mode 100644 index dd0b3ab4..00000000 --- a/mods/ITEMS/mcstair/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -mcl_core -mcl_stairs -doc? diff --git a/mods/ITEMS/mcstair/description.txt b/mods/ITEMS/mcstair/description.txt deleted file mode 100644 index 382c4807..00000000 --- a/mods/ITEMS/mcstair/description.txt +++ /dev/null @@ -1 +0,0 @@ -Minecraft like corner stairs. \ No newline at end of file diff --git a/mods/ITEMS/mcstair/mod.conf b/mods/ITEMS/mcstair/mod.conf deleted file mode 100644 index c0546d6d..00000000 --- a/mods/ITEMS/mcstair/mod.conf +++ /dev/null @@ -1 +0,0 @@ -name = mcstair diff --git a/mods/ITEMS/mcstair/textures/mcstair_turntexture.png b/mods/ITEMS/mcstair/textures/mcstair_turntexture.png deleted file mode 100644 index 6a2e8db131e211493efdba742269ff2244a1e47d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRdMrH;E236Z!B?bltwg8_HR|W=#{|x`l{wA$w zU|?V@3GxeOaCmkjje&uIv%n*=n1O*?7=#%aX3ddcU|?V`@$_|Nf5^xqAjPCoe};pB zfkDgD#W95AI`1Jv!2=2m3>!V%rGh3LIC0=(t{&Uuqt6N|zsS#ux@EPi>J{^nSE9dp U?~7J3FfcH9y85}Sb4q9e054-L;s5{u From 644387c0ad1fb0b6a5b1e8216204a9584b0969c7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 29 May 2018 13:30:23 +0200 Subject: [PATCH 0064/1107] Remove redundant wood stair register --- mods/ITEMS/mcl_stairs/register.lua | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua index 472afc3c..1830a455 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -3,7 +3,7 @@ -- 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 function make_wood_corner_texture(subname) +local function make_corner_texture(subname) local t = minetest.registered_nodes["mcl_core:"..subname].tiles[1] return { { @@ -35,7 +35,7 @@ for w=1, #woods do wood[3], mcl_sounds.node_sound_wood_defaults(), 2, - make_wood_corner_texture(wood[1])) + make_corner_texture(wood[1])) mcl_stairs.register_slab(wood[1], "mcl_core:"..wood[1], {handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1}, {wood[2]}, @@ -129,25 +129,3 @@ mcl_stairs.register_stair_and_slab_simple("prismarine", "mcl_ocean:prismarine", mcl_stairs.register_stair_and_slab_simple("prismarine_brick", "mcl_ocean:prismarine_brick", "Prismarine Brick Stairs", "Prismarine Brick Slab", "Double Prismarine Brick Slab") mcl_stairs.register_stair_and_slab_simple("prismarine_dark", "mcl_ocean:prismarine_dark", "Dark Prismarine Stairs", "Dark Prismarine Slab", "Double Dark Prismarine Slab") -for _,v in ipairs({ - "wood", - "junglewood", - "sprucewood", - "acaciawood", - "birchwood", - "darkwood" -}) do - local t = minetest.registered_nodes["mcl_core:"..v].tiles[1] - mcl_stairs.cornerstair.add("mcl_stairs:stair_"..v, { - { - t.."^("..t.."^[transformR90^mcl_stairs_turntexture.png^[makealpha:255,0,255)", - t.."^("..t.."^mcl_stairs_turntexture.png^[transformR270^[makealpha:255,0,255)", - t - }, - { - t.."^("..t.."^[transformR90^(mcl_stairs_turntexture.png^[transformR180)^[makealpha:255,0,255)", - t.."^("..t.."^[transformR270^(mcl_stairs_turntexture.png^[transformR90)^[makealpha:255,0,255)", - t - } - }) -end From 85975a2d2651f06a1039d0e25c56af1031d5fc2b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 29 May 2018 13:46:39 +0200 Subject: [PATCH 0065/1107] mcl_stairs: Add woodlike cornerstair mode --- mods/ITEMS/mcl_stairs/cornerstair.lua | 39 ++++++++++++++++++++------- mods/ITEMS/mcl_stairs/register.lua | 17 +----------- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/mods/ITEMS/mcl_stairs/cornerstair.lua b/mods/ITEMS/mcl_stairs/cornerstair.lua index 100657ca..ab937775 100644 --- a/mods/ITEMS/mcl_stairs/cornerstair.lua +++ b/mods/ITEMS/mcl_stairs/cornerstair.lua @@ -187,25 +187,44 @@ end --[[ mcl_stairs.cornerstair.add(name, stairtiles) -* "name" is the name of the node to make corner stairs for. -* "stairtiles" is an optional table of tiles to override textures for inner and outer stairs. -* "stairtiles" format is: +NOTE: This function is used internally. If you register a stair, this function is already called, no +need to call it again! - {tiles_def_for_outer_stair, tiles_def_for_inner_stair} - -Note: This function is called when you register a stair, 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 then - outer_tiles = stairtiles[1] - inner_tiles = stairtiles[2] - else + if stairtiles == "woodlike" then + local t = node_def.tiles[1] + outer_tiles = { + t.."^("..t.."^[transformR90^mcl_stairs_turntexture.png^[makealpha:255,0,255)", + t.."^("..t.."^mcl_stairs_turntexture.png^[transformR270^[makealpha:255,0,255)", + t + } + inner_tiles = { + t.."^("..t.."^[transformR90^(mcl_stairs_turntexture.png^[transformR180)^[makealpha:255,0,255)", + t.."^("..t.."^[transformR270^(mcl_stairs_turntexture.png^[transformR90)^[makealpha:255,0,255)", + 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 diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua index 1830a455..8311d14b 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -3,21 +3,6 @@ -- 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 function make_corner_texture(subname) - local t = minetest.registered_nodes["mcl_core:"..subname].tiles[1] - return { - { - t.."^("..t.."^[transformR90^mcl_stairs_turntexture.png^[makealpha:255,0,255)", - t.."^("..t.."^mcl_stairs_turntexture.png^[transformR270^[makealpha:255,0,255)", - t - }, - { - t.."^("..t.."^[transformR90^(mcl_stairs_turntexture.png^[transformR180)^[makealpha:255,0,255)", - t.."^("..t.."^[transformR270^(mcl_stairs_turntexture.png^[transformR90)^[makealpha:255,0,255)", - t - } - } -end local woods = { { "wood", "default_wood.png", "Oak Wood Stairs", "Oak Wood Slab", "Double Oak Wood Slab" }, { "junglewood", "default_junglewood.png", "Jungle Wood Stairs", "Jungle Wood Slab", "Double Jungle Wood Slab" }, @@ -35,7 +20,7 @@ for w=1, #woods do wood[3], mcl_sounds.node_sound_wood_defaults(), 2, - make_corner_texture(wood[1])) + "woodlike") mcl_stairs.register_slab(wood[1], "mcl_core:"..wood[1], {handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1}, {wood[2]}, From d3f5942d7dc2f947a759ebd8f0eab08c7d90b81f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 29 May 2018 14:28:26 +0200 Subject: [PATCH 0066/1107] Improve corner stair texturing --- mods/ITEMS/mcl_stairs/api.lua | 8 ++++---- mods/ITEMS/mcl_stairs/cornerstair.lua | 28 +++++++++++++++++---------- mods/ITEMS/mclx_stairs/init.lua | 24 +++++++++++------------ 3 files changed, 34 insertions(+), 26 deletions(-) diff --git a/mods/ITEMS/mcl_stairs/api.lua b/mods/ITEMS/mcl_stairs/api.lua index 03d88d48..470e9d11 100644 --- a/mods/ITEMS/mcl_stairs/api.lua +++ b/mods/ITEMS/mcl_stairs/api.lua @@ -314,14 +314,14 @@ end function mcl_stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds, hardness, - double_description) - mcl_stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds, hardness) + double_description, corner_stair_texture_override) + mcl_stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds, hardness, corner_stair_texture_override) mcl_stairs.register_slab(subname, recipeitem, groups, images, desc_slab, sounds, 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) +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 @@ -331,6 +331,6 @@ function mcl_stairs.register_stair_and_slab_simple(subname, sourcenode, desc_sta 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_hardness, desc_double_slab) + mcl_stairs.register_stair_and_slab(subname, sourcenode, groups, def.tiles, desc_stair, desc_slab, def.sounds, 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 index ab937775..964eef1e 100644 --- a/mods/ITEMS/mcl_stairs/cornerstair.lua +++ b/mods/ITEMS/mcl_stairs/cornerstair.lua @@ -208,17 +208,25 @@ function mcl_stairs.cornerstair.add(name, stairtiles) 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 = { - t.."^("..t.."^[transformR90^mcl_stairs_turntexture.png^[makealpha:255,0,255)", - t.."^("..t.."^mcl_stairs_turntexture.png^[transformR270^[makealpha:255,0,255)", - t - } - inner_tiles = { - t.."^("..t.."^[transformR90^(mcl_stairs_turntexture.png^[transformR180)^[makealpha:255,0,255)", - t.."^("..t.."^[transformR270^(mcl_stairs_turntexture.png^[transformR90)^[makealpha:255,0,255)", - t - } + 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)" + 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)" + for i=3,6 do + -- outer_tiles[i] = t + -- inner_tiles[i] = t + end elseif stairtiles == nil or stairtiles == "default" then outer_tiles = node_def.tiles inner_tiles = node_def.tiles diff --git a/mods/ITEMS/mclx_stairs/init.lua b/mods/ITEMS/mclx_stairs/init.lua index 05dfb27c..4ff68507 100644 --- a/mods/ITEMS/mclx_stairs/init.lua +++ b/mods/ITEMS/mclx_stairs/init.lua @@ -4,30 +4,30 @@ mcl_stairs.register_stair_and_slab_simple("red_nether_brick", "mcl_nether:red_ne mcl_stairs.register_stair_and_slab_simple("mossycobble", "mcl_core:mossycobble", "Moss Stone Stairs", "Moss Stone Slab", "Double Moss Stone Slab") -mcl_stairs.register_stair_and_slab_simple("tree_bark", "mcl_core:tree_bark", "Oak Bark Stairs", "Oak Bark Slab", "Double Oak Bark Slab") -mcl_stairs.register_stair_and_slab_simple("acaciatree_bark", "mcl_core:acaciatree_bark", "Acacia Bark Stairs", "Acacia Bark Slab", "Double Acacia Bark Slab") -mcl_stairs.register_stair_and_slab_simple("sprucetree_bark", "mcl_core:sprucetree_bark", "Spruce Bark Stairs", "Spruce Bark Slab", "Double Spruce Bark Slab") -mcl_stairs.register_stair_and_slab_simple("birchtree_bark", "mcl_core:birchtree_bark", "Birch Bark Stairs", "Birch Bark Slab", "Double Birch Bark Slab") -mcl_stairs.register_stair_and_slab_simple("jungletree_bark", "mcl_core:jungletree_bark", "Jungle Bark Stairs", "Jungle Bark Slab", "Double Jungle Bark Slab") -mcl_stairs.register_stair_and_slab_simple("darktree_bark", "mcl_core:darktree_bark", "Dark Oak Bark Stairs", "Dark Oak Bark Slab", "Double Dark Oak Bark Slab") +mcl_stairs.register_stair_and_slab_simple("tree_bark", "mcl_core:tree_bark", "Oak Bark Stairs", "Oak Bark Slab", "Double Oak Bark Slab", "woodlike") +mcl_stairs.register_stair_and_slab_simple("acaciatree_bark", "mcl_core:acaciatree_bark", "Acacia Bark Stairs", "Acacia Bark Slab", "Double Acacia Bark Slab", "woodlike") +mcl_stairs.register_stair_and_slab_simple("sprucetree_bark", "mcl_core:sprucetree_bark", "Spruce Bark Stairs", "Spruce Bark Slab", "Double Spruce Bark Slab", "woodlike") +mcl_stairs.register_stair_and_slab_simple("birchtree_bark", "mcl_core:birchtree_bark", "Birch Bark Stairs", "Birch Bark Slab", "Double Birch Bark Slab", "woodlike") +mcl_stairs.register_stair_and_slab_simple("jungletree_bark", "mcl_core:jungletree_bark", "Jungle Bark Stairs", "Jungle Bark Slab", "Double Jungle Bark Slab", "woodlike") +mcl_stairs.register_stair_and_slab_simple("darktree_bark", "mcl_core:darktree_bark", "Dark Oak Bark Stairs", "Dark Oak Bark Slab", "Double Dark Oak Bark Slab", "woodlike") 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"}, "Lapis Lazuli Slab", nil, nil, "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"}, "Lapis Lazuli Stair") +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"}, "Lapis Lazuli Stair", nil, 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"}, "Slab of Gold", nil, nil, "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"}, "Stair 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"}, "Stair of Gold", nil, 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"}, "Slab of Iron", nil, nil, "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"}, "Stair 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"}, "Stair of Iron", nil, nil, "woodlike") 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"}, "Polished Andesite Slab", nil, nil, "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"}, "Polished Andesite Stair") +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"}, "Polished Andesite Stair", nil, 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"}, "Polished Granite Slab", nil, nil, "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"}, "Polished Granite Stair") +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"}, "Polished Granite Stair", nil, 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"}, "Polished Diorite Slab", nil, nil, "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"}, "Polished Diorite Stair") +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"}, "Polished Diorite Stair", nil, nil, "woodlike") mcl_stairs.register_stair("stonebrickmossy", "mcl_core:stonebrickmossy", {pickaxey=1}, From f3b0cf6f3e26998b7d7fb2a5c25254fdafe0b00e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 29 May 2018 15:17:15 +0200 Subject: [PATCH 0067/1107] Document API mcl_stairs, declare mcl_stairs usable --- API.md | 2 +- mods/ITEMS/mcl_stairs/API.md | 83 +++++++++++++++++++++++++++++++++++ mods/ITEMS/mcl_stairs/api.lua | 4 +- 3 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 mods/ITEMS/mcl_stairs/API.md diff --git a/API.md b/API.md index e4e31278..36773444 100644 --- a/API.md +++ b/API.md @@ -31,6 +31,7 @@ A lot of things are possible by using one of the APIs in the mods. Note that not ### Items * Doors: `ITEMS/mcl_doors` * Fences and fence gates: `ITEMS/mcl_fences` +* Stairs and slabs: `ITEM/mcl_stairs` * Walls: `ITEMS/mcl_walls` * Beds: `ITEMS/mcl_beds` * Buckets: `ITEMS/mcl_buckets` @@ -62,7 +63,6 @@ API documnetation is included in `ENTITIES/mobs/api.txt`. The following APIs may be subject to change in future. You could already use these APIs but there will probably be breaking changes in the future, or the API is not as fleshed out as it should be. Use at your own risk! * Panes (like glass panes and iron bars): `ITEMS/xpanes` -* Slabs and stairs: `ITEM/mcl_stairs` * `_on_ignite` callback: `ITEMS/mcl_fire` * Farming: `ITEMS/mcl_farming` * Anything related to redstone: Don't touch (yet) diff --git a/mods/ITEMS/mcl_stairs/API.md b/mods/ITEMS/mcl_stairs/API.md new file mode 100644 index 00000000..6c91754b --- /dev/null +++ b/mods/ITEMS/mcl_stairs/API.md @@ -0,0 +1,83 @@ +# 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/api.lua b/mods/ITEMS/mcl_stairs/api.lua index 470e9d11..613d66af 100644 --- a/mods/ITEMS/mcl_stairs/api.lua +++ b/mods/ITEMS/mcl_stairs/api.lua @@ -79,7 +79,7 @@ end -- Register stairs. -- Node will be called mcl_stairs:stair_ -function mcl_stairs.register_stair(subname, recipeitem, groups, images, description, sounds, hardness, corner_texture_override) +function mcl_stairs.register_stair(subname, recipeitem, groups, images, description, sounds, hardness, corner_stair_texture_override) groups.stair = 1 groups.building_block = 1 @@ -154,7 +154,7 @@ function mcl_stairs.register_stair(subname, recipeitem, groups, images, descript }) end - mcl_stairs.cornerstair.add("mcl_stairs:stair_"..subname, corner_texture_override) + mcl_stairs.cornerstair.add("mcl_stairs:stair_"..subname, corner_stair_texture_override) end From 34292ece10fd1d3f95bcd3cdba83df72e3a77255 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 29 May 2018 16:03:10 +0200 Subject: [PATCH 0068/1107] Fix minor texture fail for woodlike corner stair --- mods/ITEMS/mcl_stairs/cornerstair.lua | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_stairs/cornerstair.lua b/mods/ITEMS/mcl_stairs/cornerstair.lua index 964eef1e..33d52e98 100644 --- a/mods/ITEMS/mcl_stairs/cornerstair.lua +++ b/mods/ITEMS/mcl_stairs/cornerstair.lua @@ -221,12 +221,10 @@ function mcl_stairs.cornerstair.add(name, stairtiles) 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)" - for i=3,6 do - -- outer_tiles[i] = t - -- inner_tiles[i] = t - end + inner_tiles[3] = t elseif stairtiles == nil or stairtiles == "default" then outer_tiles = node_def.tiles inner_tiles = node_def.tiles From c1cc790d9dc18f50ae01c67392218d4a17317982 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 29 May 2018 17:00:30 +0200 Subject: [PATCH 0069/1107] Update Mobs Redo (1.41) --- mods/ENTITIES/mobs/api.lua | 313 ++++++++++++++++++++++++----------- mods/ENTITIES/mobs/api.txt | 6 +- mods/ENTITIES/mobs/readme.MD | 1 + 3 files changed, 221 insertions(+), 99 deletions(-) diff --git a/mods/ENTITIES/mobs/api.lua b/mods/ENTITIES/mobs/api.lua index a59f2fc0..708e10c0 100644 --- a/mods/ENTITIES/mobs/api.lua +++ b/mods/ENTITIES/mobs/api.lua @@ -3,7 +3,7 @@ mobs = {} mobs.mod = "redo" -mobs.version = "20180328" +mobs.version = "20180523" local MAX_MOB_NAME_LENGTH = 30 @@ -61,9 +61,9 @@ local mobs_drop_items = minetest.settings:get_bool("mobs_drop_items") ~= false local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false local creative = minetest.settings:get_bool("creative_mode") local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false -local remove_far = minetest.settings:get_bool("remove_far_mobs") +local remove_far = false local difficulty = tonumber(minetest.settings:get("mob_difficulty")) or 1.0 -local show_health = false --minetest.settings:get_bool("mob_show_health") ~= false +local show_health = false local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 99) local mob_chance_multiplier = tonumber(minetest.settings:get("mob_chance_multiplier") or 1) @@ -126,6 +126,12 @@ end -- move mob in facing direction local set_velocity = function(self, v) + -- do not move if mob has been ordered to stay + if self.order == "stand" then + self.object:setvelocity({x = 0, y = 0, z = 0}) + return + end + local yaw = (self.object:get_yaw() or 0) + self.rotate self.object:setvelocity({ @@ -146,15 +152,28 @@ end -- set and return valid yaw -local set_yaw = function(self, yaw) +local set_yaw = function(self, yaw, delay) if not yaw or yaw ~= yaw then yaw = 0 end - self:setyaw(yaw) + delay = delay or 0 - return yaw + if delay == 0 then + self.object:set_yaw(yaw) + return yaw + end + + self.target_yaw = yaw + self.delay = delay + + return self.target_yaw +end + +-- global function to set mob yaw +function mobs:yaw(self, yaw, delay) + set_yaw(self, yaw, delay) end @@ -332,9 +351,8 @@ end local update_tag = function(self) - --DISABLED IN MCL2 - --[[ + --[=[ local col = "#00FF00" local qua = self.hp_max / 4 @@ -349,11 +367,10 @@ local update_tag = function(self) if self.health <= floor(qua) then col = "#FF0000" end - ]] + ]=] self.object:set_properties({ nametag = self.nametag, - -- No nametag coloring }) end @@ -566,7 +583,7 @@ local node_ok = function(pos, fallback) return node end - return minetest.registered_nodes[fallback] -- {name = fallback} + return minetest.registered_nodes[fallback] end @@ -694,7 +711,8 @@ local do_jump = function(self) if not self.jump or self.jump_height == 0 or self.fly - or self.child then + or self.child + or self.order == "stand" then return false end @@ -753,9 +771,19 @@ local do_jump = function(self) self.object:setvelocity(v) -if get_velocity(self) > 0 then - mob_sound(self, self.sounds.jump) -end + -- when in air move forward + minetest.after(0.3, function(self, v) +-- self.object:setvelocity({ + self.object:set_acceleration({ + x = v.x * 2,--1.5, + y = 0, + z = v.z * 2,--1.5 + }) + end, self, v) + + if get_velocity(self) > 0 then + mob_sound(self, self.sounds.jump) + end else self.facing_fence = true end @@ -1058,13 +1086,18 @@ local day_docile = function(self) end --- path finding and smart mob routine by rnd +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) < 1.5 then + 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 @@ -1072,12 +1105,64 @@ local smart_mobs = function(self, s, p, dist, dtime) self.path.lastpos = {x = s.x, y = s.y, z = s.z} - -- im stuck, search for path - if (self.path.stuck_timer > stuck_timeout and not self.path.following) - or (self.path.stuck_timer > stuck_path_timeout and self.path.following) then + 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 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 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 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] @@ -1105,17 +1190,25 @@ local smart_mobs = function(self, s, p, dist, dtime) local dropheight = 6 if self.fear_height ~= 0 then dropheight = self.fear_height end --- self.path.way = minetest.find_path(s, p1, 16, 2, 6, "Dijkstra") self.path.way = minetest.find_path(s, p1, 16, self.stepheight, dropheight, "A*_noprefetch") - - -- attempt to unstick mob that is "daydreaming" - --[[ BUT NOT IN MINECLONE2, SILLY! - self.object:setpos({ - x = s.x + 0.1 * (random() * 2 - 1), - y = s.y + 1, - z = s.z + 0.1 * (random() * 2 - 1) - }) - ]] +--[[ + -- show path using particles + if self.path.way and #self.path.way > 0 then + print ("-- path length:" .. tonumber(#self.path.way)) + for _,pos in pairs(self.path.way) do + minetest.add_particle({ + pos = pos, + velocity = {x=0, y=0, z=0}, + acceleration = {x=0, y=0, z=0}, + expirationtime = 1, + size = 4, + collisiondetection = false, + vertical = false, + texture = "heart.png", + }) + end + end +]] self.state = "" do_attack(self, self.attack) @@ -1184,11 +1277,11 @@ local smart_mobs = function(self, s, p, dist, dtime) 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 + 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"}) @@ -1221,7 +1314,6 @@ local smart_mobs = function(self, s, p, dist, dtime) else -- yay i found path mob_sound(self, self.sounds.war_cry) - set_velocity(self, self.walk_velocity) -- follow path now that it has it @@ -1296,25 +1388,21 @@ local monster_attack = function(self) and (type == "player" or type == "npc" or (type == "animal" and self.attack_animals == true)) then - s = self.object:get_pos() p = player:get_pos() sp = s + dist = get_distance(p, s) + -- aim higher to make looking up hills more realistic p.y = p.y + 1 sp.y = sp.y + 1 - dist = get_distance(p, s) - if dist < self.view_range then - -- field of view check goes here - - -- choose closest player to attack - if line_of_sight(self, sp, p, 2) == true - and dist < min_dist then - min_dist = dist - min_player = player - end + -- 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 @@ -1347,10 +1435,16 @@ local npc_attack = function(self) if obj and obj.type == "monster" then p = obj.object:get_pos() + sp = s dist = get_distance(p, s) - if dist < min_dist then + -- 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 @@ -1374,7 +1468,7 @@ local specific_runaway = function(list, what) -- found entity on list to attack? for no = 1, #list do - if list[no] == what or list[no] == "player" then + if list[no] == what then return true end end @@ -1424,7 +1518,6 @@ local runaway_from = function(self) if name ~= "" and name ~= self.name and specific_runaway(self.runaway_from, name) then - s = self.object:get_pos() p = player:get_pos() sp = s @@ -1434,15 +1527,12 @@ local runaway_from = function(self) dist = get_distance(p, s) - if dist < self.view_range then - -- field of view check goes here - -- choose closest player/mpb to runaway from - if line_of_sight(self, sp, p, 2) == true - and dist < min_dist then - min_dist = dist - min_player = player - end + -- 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 @@ -1462,7 +1552,7 @@ local runaway_from = function(self) yaw = yaw + pi end - yaw = set_yaw(self.object, yaw) + yaw = set_yaw(self, yaw, 4) self.state = "runaway" self.runaway_timer = 3 self.following = nil @@ -1548,7 +1638,7 @@ local follow_flop = function(self) if p.x > s.x then yaw = yaw + pi end - yaw = set_yaw(self.object, yaw) + yaw = set_yaw(self, yaw, 6) -- anyone but standing npc's can move along if dist > self.reach @@ -1652,7 +1742,7 @@ local do_states = function(self, dtime) yaw = yaw + random(-0.5, 0.5) end - yaw = set_yaw(self.object, yaw) + yaw = set_yaw(self, yaw, 8) end set_velocity(self, 0) @@ -1671,14 +1761,14 @@ local do_states = function(self, dtime) self.state = "walk" set_animation(self, "walk") - -- fly up/down randomly for flying mobs + --[[ fly up/down randomly for flying mobs if self.fly and random(1, 100) <= self.walk_chance then local v = self.object:getvelocity() local ud = random(-1, 2) / 9 self.object:setvelocity({x = v.x, y = ud, z = v.z}) - end + end--]] end end @@ -1726,7 +1816,7 @@ local do_states = function(self, dtime) if lp.x > s.x then yaw = yaw + pi end -- look towards land and jump/move in that direction - yaw = set_yaw(self.object, yaw) + yaw = set_yaw(self, yaw, 6) do_jump(self) set_velocity(self, self.walk_velocity) else @@ -1745,14 +1835,14 @@ local do_states = function(self, dtime) if lp.x > s.x then yaw = yaw + pi end end - yaw = set_yaw(self.object, yaw) + 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.object, yaw) + yaw = set_yaw(self, yaw, 8) end -- stand for great fall in front @@ -1818,6 +1908,7 @@ local do_states = function(self, dtime) self.v_start = false self.timer = 0 self.blinktimer = 0 + self.path.way = nil return end @@ -1833,7 +1924,7 @@ local do_states = function(self, dtime) if p.x > s.x then yaw = yaw + pi end - yaw = set_yaw(self.object, yaw) + yaw = set_yaw(self, yaw) local node_break_radius = self.explosion_radius or 1 local entity_damage_radius = self.explosion_damage_radius @@ -1903,7 +1994,7 @@ local do_states = function(self, dtime) if minetest.find_node_near(pos, 1, {"group:water"}) or minetest.is_protected(pos, "") then - node_break_radius = 0 + node_break_radius = 1 end self.object:remove() @@ -2021,7 +2112,7 @@ local do_states = function(self, dtime) if p.x > s.x then yaw = yaw + pi end - yaw = set_yaw(self.object, yaw) + yaw = set_yaw(self, yaw) -- move towards enemy if beyond mob reach if dist > self.reach then @@ -2124,7 +2215,7 @@ local do_states = function(self, dtime) if p.x > s.x then yaw = yaw + pi end - yaw = set_yaw(self.object, yaw) + yaw = set_yaw(self, yaw) set_velocity(self, 0) @@ -2199,7 +2290,6 @@ local falling = function(self, pos) end -- in water then float up --- if minetest.registered_nodes[node_ok(pos).name].groups.liquid then if minetest.registered_nodes[node_ok(pos).name].groups.water then if self.floats == 1 then @@ -2400,7 +2490,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) end) ]] -- knock back effect (only on full punch) - if self.knock_back > 0 + if self.knock_back and tflp >= punch_interval then local v = self.object:getvelocity() @@ -2451,7 +2541,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) yaw = yaw + pi end - yaw = set_yaw(self.object, yaw) + yaw = set_yaw(self, yaw, 6) self.state = "runaway" self.runaway_timer = 0 self.following = nil @@ -2671,7 +2761,7 @@ local mob_activate = function(self, staticdata, def, dtime) -- set anything changed above self.object:set_properties(self) - set_yaw(self.object, (random(0, 360) - 180) / 180 * pi) + set_yaw(self, (random(0, 360) - 180) / 180 * pi, 6) update_tag(self) set_animation(self, "stand") @@ -2741,6 +2831,46 @@ local mob_step = function(self, dtime) falling(self, pos) + -- smooth rotation by ThomasMonroe314 + + if self.delay and self.delay > 0 then + + local yaw = self.object:get_yaw() + + 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 + self.object:set_yaw(yaw) + end + + -- end rotation + -- knockback timer if self.pause_timer > 0 then @@ -2775,9 +2905,6 @@ local mob_step = function(self, dtime) self.timer = 1 end - -- node replace check (cow eats grass etc.) - replace(self, pos) - -- mob plays random sound at times if random(1, 100) == 1 then mob_sound(self, self.sounds.random) @@ -2791,7 +2918,11 @@ local mob_step = function(self, dtime) self.env_damage_timer = 0 + -- check for environmental damage (water, fire, lava etc.) do_env_damage(self) + + -- node replace check (cow eats grass etc.) + replace(self, pos) end monster_attack(self) @@ -2851,7 +2982,7 @@ minetest.register_entity(name, { hp_min = max(1, (def.hp_min or 5) * difficulty), hp_max = max(1, (def.hp_max or 10) * difficulty), physical = true, - collisionbox = def.collisionbox, + collisionbox = def.collisionbox or {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, selectionbox = def.selectionbox or def.collisionbox, visual = def.visual, visual_size = def.visual_size or {x = 1, y = 1}, @@ -2880,7 +3011,7 @@ minetest.register_entity(name, { attacks_monsters = def.attacks_monsters or false, group_attack = def.group_attack or false, passive = def.passive or false, - knock_back = def.knock_back or 3, + knock_back = def.knock_back ~= false, blood_amount = def.blood_amount or 5, blood_texture = def.blood_texture or "mobs_blood.png", shoot_offset = def.shoot_offset or 0, @@ -3337,7 +3468,7 @@ function 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 + if creative and no_creative == true then grp.not_in_creative_inventory = 1 end @@ -3401,7 +3532,6 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) minetest.register_craftitem(mob, { description = desc, - inventory_image = invimg, groups = grp, @@ -3438,7 +3568,7 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) end if not minetest.registered_entities[mob] then - return + return itemstack end pos.y = pos.y + 1 @@ -3452,6 +3582,7 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) ent.owner = placer:get_player_name() ent.tamed = true end + -- set nametag local nametag = itemstack:get_meta():get_string("name") if nametag ~= "" then @@ -3478,8 +3609,7 @@ end -- capture critter (thanks to blert2112 for idea) function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, force_take, replacewith) return false --- DISABLED IN MCL2 ---[=[ +--[=[ DISABLED IN MCL2 if self.child or not clicker:is_player() or not clicker:get_inventory() then @@ -3588,8 +3718,7 @@ function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, mob_sound(self, "default_place_node_hard") - - else + elseif chance ~= 0 then minetest.chat_send_player(name, S("Missed!")) mob_sound(self, "mobs_swing") @@ -3603,7 +3732,6 @@ end -- protect tamed mob with rune item function mobs:protect(self, clicker) - local name = clicker:get_player_name() local tool = clicker:get_wielded_item() @@ -3644,7 +3772,6 @@ local mob_sta = {} -- feeding, taming and breeding (thanks blert2112) function mobs:feed_tame(self, clicker, feed_count, breed, tame) - if not self.follow then return false end @@ -3670,14 +3797,12 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) self.health = self.hp_max if self.htimer < 1 then - -- DISABLED IN MCL2 --[=[ minetest.chat_send_player(clicker:get_player_name(), S("@1 at full health (@2)", self.name:split(":")[2], tostring(self.health))) ]=] - self.htimer = 5 end end @@ -3751,9 +3876,9 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) end return false - end + -- DISABLED IN MCL2 --[=[ -- inspired by blockmen's nametag mod @@ -3799,11 +3924,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) -- reset external variables mob_obj[name] = nil mob_sta[name] = nil - end end) ]=] + -- compatibility function for old entities to new modpack entities function mobs:alias_mob(old_name, new_name) @@ -3817,10 +3942,8 @@ function mobs:alias_mob(old_name, new_name) on_step = function(self) - local pos = self.object:get_pos() - if minetest.registered_entities[new_name] then - minetest.add_entity(pos, new_name) + minetest.add_entity(self.object:get_pos(), new_name) end self.object:remove() diff --git a/mods/ENTITIES/mobs/api.txt b/mods/ENTITIES/mobs/api.txt index f5bc3653..324ae90a 100644 --- a/mods/ENTITIES/mobs/api.txt +++ b/mods/ENTITIES/mobs/api.txt @@ -46,8 +46,6 @@ functions needed for the mob to work properly which contains the following: in e.g. "air" or "default:water_source". '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. - 'reach' how many nodes in distance a mob can attack a player while - standing. '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 @@ -565,8 +563,8 @@ External Settings for "minetest.conf" is false) 'mobs_spawn_protected' if set to false then mobs will not spawn in protected areas (default is true) - 'remove_far_mobs' if true then mobs that are outside players visual - range will be removed (default is false) + 'remove_far_mobs' if true then untamed mobs that are outside players + visual range will be removed (default is true) 'mobname' can change specific mob chance rate (0 to disable) and spawn number e.g. mobs_animal:cow = 1000,5 'mob_difficulty' sets difficulty level (health and hit damage diff --git a/mods/ENTITIES/mobs/readme.MD b/mods/ENTITIES/mobs/readme.MD index 92ae3ba6..68b03e70 100644 --- a/mods/ENTITIES/mobs/readme.MD +++ b/mods/ENTITIES/mobs/readme.MD @@ -22,6 +22,7 @@ Lucky Blocks: 9 Changelog: +- 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 From d0cdb0f390bd8824f62e6ee4e3cf9848a6edf8ac Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 29 May 2018 20:11:27 +0200 Subject: [PATCH 0070/1107] Add fake_liquid group to cobweb --- mods/ITEMS/mcl_core/nodes_misc.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/nodes_misc.lua b/mods/ITEMS/mcl_core/nodes_misc.lua index 9c85b701..26b25618 100644 --- a/mods/ITEMS/mcl_core/nodes_misc.lua +++ b/mods/ITEMS/mcl_core/nodes_misc.lua @@ -63,7 +63,7 @@ minetest.register_node("mcl_core:cobweb", { liquid_renewable = false, liquid_range = 0, walkable = false, - groups = {swordy_cobweb=1,shearsy=1, deco_block=1, dig_by_piston=1, dig_by_water=1,destroy_by_lava_flow=1,}, + groups = {swordy_cobweb=1,shearsy=1, fake_liquid=1, deco_block=1, dig_by_piston=1, dig_by_water=1,destroy_by_lava_flow=1,}, drop = "mcl_mobitems:string", _mcl_shears_drop = true, sounds = mcl_sounds.node_sound_leaves_defaults(), From 69b3e19c1bd46aca6b80d0ad05662bc6f6dc9242 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 May 2018 11:34:17 +0200 Subject: [PATCH 0071/1107] Name tags now name all mobs (except ender dragon) --- mods/ENTITIES/mobs/api.lua | 63 ++++++++++++++++---------- mods/ENTITIES/mobs/api.txt | 5 ++ mods/ENTITIES/mobs/crafts.lua | 4 +- mods/ENTITIES/mobs_mc/ender_dragon.lua | 2 + 4 files changed, 49 insertions(+), 25 deletions(-) diff --git a/mods/ENTITIES/mobs/api.lua b/mods/ENTITIES/mobs/api.lua index 708e10c0..d126c0db 100644 --- a/mods/ENTITIES/mobs/api.lua +++ b/mods/ENTITIES/mobs/api.lua @@ -2958,6 +2958,42 @@ end 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() == "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 mobs.is_creative(name) then + item:take_item() + player: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 mobs:register_mob(name, def) @@ -3000,7 +3036,7 @@ minetest.register_entity(name, { fall_speed = def.fall_speed or -10, -- must be lower than -2 (default: -10) drops = def.drops or {}, armor = def.armor or 100, - on_rightclick = def.on_rightclick, + on_rightclick = create_mob_on_rightclick(def.on_rightclick), arrow = def.arrow, shoot_interval = def.shoot_interval, sounds = def.sounds or {}, @@ -3059,6 +3095,9 @@ minetest.register_entity(name, { facing_fence = false, _cmi_is_mob = true, + -- MCL2 extensions + ignores_nametag = def.ignores_nametag or false, + on_spawn = def.on_spawn, on_blast = def.on_blast or do_tnt, @@ -3853,28 +3892,6 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) return true end - local item = clicker:get_wielded_item() - - -- Name mob with nametag - if item:get_name() == "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 mobs.is_creative(name) then - item:take_item() - player:set_wielded_item(item) - end - end - - end - return false end diff --git a/mods/ENTITIES/mobs/api.txt b/mods/ENTITIES/mobs/api.txt index 324ae90a..c2cd3273 100644 --- a/mods/ENTITIES/mobs/api.txt +++ b/mods/ENTITIES/mobs/api.txt @@ -205,6 +205,11 @@ functions needed for the mob to work properly which contains the following: older mobs. + MineClone 2 extensions: + + 'ignores_nametag' if true, mob cannot be named by nametag + + Node Replacement ---------------- diff --git a/mods/ENTITIES/mobs/crafts.lua b/mods/ENTITIES/mobs/crafts.lua index e3bcadce..cb0c9da6 100644 --- a/mods/ENTITIES/mobs/crafts.lua +++ b/mods/ENTITIES/mobs/crafts.lua @@ -4,8 +4,8 @@ local S = mobs.intllib -- name tag minetest.register_craftitem("mobs:nametag", { description = S("Name Tag"), - _doc_items_longdesc = S("A name tag is an item to name an animal."), - _doc_items_usagehelp = S("Before you use the name tag, you need to set a name at an anvil. Now you can use the name tag to name an animal with a rightclick. This uses up the name tag."), + _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. Now you can use the name tag to name a mob with a rightclick. This uses up the name tag."), inventory_image = "mobs_nametag.png", wield_image = "mobs_nametag.png", stack_max = 64, diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index 552dffd5..183b0781 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -93,6 +93,8 @@ mobs:register_mob("mobs_mc:enderdragon", { run_start = 0, run_end = 20, }, blood_amount = 0, + + ignores_nametag = true, }) From d575cf07b72498e26a00971bf610caa14b7d6453 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 May 2018 12:01:53 +0200 Subject: [PATCH 0072/1107] Kill snow golems in rain --- mods/ENTITIES/mobs/api.lua | 12 ++++++++++++ mods/ENTITIES/mobs/api.txt | 1 + mods/ENTITIES/mobs/depends.txt | 1 + mods/ENTITIES/mobs_mc/snowman.lua | 2 ++ 4 files changed, 16 insertions(+) diff --git a/mods/ENTITIES/mobs/api.lua b/mods/ENTITIES/mobs/api.lua index d126c0db..b284216f 100644 --- a/mods/ENTITIES/mobs/api.lua +++ b/mods/ENTITIES/mobs/api.lua @@ -646,6 +646,17 @@ local do_env_damage = function(self) local nodef = minetest.registered_nodes[self.standing_in] + -- rain + if self.rain_damage and minetest.get_modpath("mcl_weather") 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 end + end + end + pos.y = pos.y + 1 -- for particle effect position -- water @@ -3097,6 +3108,7 @@ minetest.register_entity(name, { -- MCL2 extensions ignores_nametag = def.ignores_nametag or false, + rain_damage = def.rain_damage or 0, on_spawn = def.on_spawn, diff --git a/mods/ENTITIES/mobs/api.txt b/mods/ENTITIES/mobs/api.txt index c2cd3273..6d9ecc7c 100644 --- a/mods/ENTITIES/mobs/api.txt +++ b/mods/ENTITIES/mobs/api.txt @@ -208,6 +208,7 @@ functions needed for the mob to work properly which contains the following: MineClone 2 extensions: 'ignores_nametag' if true, mob cannot be named by nametag + 'rain_damage' damage per second if mob is standing in rain (default: 0) Node Replacement diff --git a/mods/ENTITIES/mobs/depends.txt b/mods/ENTITIES/mobs/depends.txt index da5ffd9b..91d5a207 100644 --- a/mods/ENTITIES/mobs/depends.txt +++ b/mods/ENTITIES/mobs/depends.txt @@ -1,4 +1,5 @@ mcl_core +mcl_weather? mcl_tnt? invisibility? intllib? diff --git a/mods/ENTITIES/mobs_mc/snowman.lua b/mods/ENTITIES/mobs_mc/snowman.lua index 0f07a861..c9d9a9ce 100644 --- a/mods/ENTITIES/mobs_mc/snowman.lua +++ b/mods/ENTITIES/mobs_mc/snowman.lua @@ -101,6 +101,8 @@ mobs:register_mob("mobs_mc:snowman", { end end end, + + rain_damage = 4, }) -- This is to be called when a pumpkin or jack'o lantern has been placed. Recommended: In the on_construct function From 806e392d31b387c312cd57a626f9cb7d188f4dbb Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 May 2018 12:25:10 +0200 Subject: [PATCH 0073/1107] Fix child of saddled pigs getting saddle, too --- mods/ENTITIES/mobs_mc/pig.lua | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index 7074c3af..4ec55097 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -168,6 +168,41 @@ mobs:register_mob("mobs_mc:pig", { mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) end end, + + on_breed = function(parent1, parent2) + local pos = parent1.object:get_pos() + local mob = minetest.add_entity(pos, parent1.name) + + -- resize to half height + mob:set_properties({ + visual_size = { + x = parent1.base_size.x * .5, + y = parent1.base_size.y * .5, + }, + collisionbox = { + parent1.base_colbox[1] * .5, + parent1.base_colbox[2] * .5, + parent1.base_colbox[3] * .5, + parent1.base_colbox[4] * .5, + parent1.base_colbox[5] * .5, + parent1.base_colbox[6] * .5, + }, + selectionbox = { + parent1.base_selbox[1] * .5, + parent1.base_selbox[2] * .5, + parent1.base_selbox[3] * .5, + parent1.base_selbox[4] * .5, + parent1.base_selbox[5] * .5, + parent1.base_selbox[6] * .5, + }, + }) + local ent = mob:get_luaentity() + -- tamed and owned by parents' owner + ent.child = true + ent.tamed = true + ent.owner = parent1.owner + return false + end, }) mobs:spawn_specific("mobs_mc:pig", mobs_mc.spawn.grassland, {"air"}, 9, minetest.LIGHT_MAX+1, 30, 15000, 30, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) From 940b3748fbd663c9c5e4bb0aff62f6b35993cbf6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 May 2018 12:34:16 +0200 Subject: [PATCH 0074/1107] Fix horse child keeping horse armor of parent --- mods/ENTITIES/mobs_mc/horse.lua | 37 ++++++++++++++++++++++++++++++++- mods/ENTITIES/mobs_mc/pig.lua | 1 + 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 7672eb66..60f8738d 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -249,7 +249,42 @@ local horse = { mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) end end - end + end, + + on_breed = function(parent1, parent2) + local pos = parent1.object:get_pos() + local mob = minetest.add_entity(pos, parent1.name) + + -- resize to half height + mob:set_properties({ + visual_size = { + x = parent1.base_size.x * .5, + y = parent1.base_size.y * .5, + }, + collisionbox = { + parent1.base_colbox[1] * .5, + parent1.base_colbox[2] * .5, + parent1.base_colbox[3] * .5, + parent1.base_colbox[4] * .5, + parent1.base_colbox[5] * .5, + parent1.base_colbox[6] * .5, + }, + selectionbox = { + parent1.base_selbox[1] * .5, + parent1.base_selbox[2] * .5, + parent1.base_selbox[3] * .5, + parent1.base_selbox[4] * .5, + parent1.base_selbox[5] * .5, + parent1.base_selbox[6] * .5, + }, + }) + local ent = mob:get_luaentity() + -- tamed and owned by parents' owner + ent.child = true + ent.tamed = true + ent.owner = parent1.owner + return false + end, } mobs:register_mob("mobs_mc:horse", horse) diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index 4ec55097..d8b80ed0 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -197,6 +197,7 @@ mobs:register_mob("mobs_mc:pig", { }, }) local ent = mob:get_luaentity() + -- tamed and owned by parents' owner ent.child = true ent.tamed = true From b2d9c119acfe531865e10b5e3e1457e43904c7f5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 May 2018 12:56:39 +0200 Subject: [PATCH 0075/1107] Add mobs:spawn_child --- mods/ENTITIES/mobs/api.lua | 93 ++++++++++++++++++++------------- mods/ENTITIES/mobs/api.txt | 10 ++++ mods/ENTITIES/mobs_mc/horse.lua | 34 ++---------- mods/ENTITIES/mobs_mc/pig.lua | 35 ++----------- 4 files changed, 72 insertions(+), 100 deletions(-) diff --git a/mods/ENTITIES/mobs/api.lua b/mods/ENTITIES/mobs/api.lua index b284216f..209ad79a 100644 --- a/mods/ENTITIES/mobs/api.lua +++ b/mods/ENTITIES/mobs/api.lua @@ -969,52 +969,25 @@ local breed = function(self) -- custom breed function if self.on_breed then - -- when false skip going any further if self.on_breed(self, ent) == false then - return + return end - else - effect(pos, 15, "tnt_smoke.png", 1, 2, 2, 15, 5) end - local mob = minetest.add_entity(pos, self.name) - local ent2 = mob:get_luaentity() + local child = mobs:spawn_child(pos, self.name) + + local ent_c = child:get_luaentity() + + -- Use parent's texture local textures = self.base_texture - - -- using specific child texture (if found) - if self.child_texture then - textures = self.child_texture[1] - end - - -- and resize to half height - mob:set_properties({ + child:set_properties({ textures = textures, - visual_size = { - x = self.base_size.x * .5, - y = self.base_size.y * .5, - }, - collisionbox = { - 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, - }, - selectionbox = { - 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, - }, }) + -- tamed and owned by parents' owner - ent2.child = true - ent2.tamed = true - ent2.owner = self.owner + ent_c.tamed = true + ent_c.owner = self.owner end) num = 0 @@ -3907,6 +3880,52 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) return false end +-- Spawn a child +function 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, "tnt_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 + -- DISABLED IN MCL2 --[=[ diff --git a/mods/ENTITIES/mobs/api.txt b/mods/ENTITIES/mobs/api.txt index 6d9ecc7c..75b2b98a 100644 --- a/mods/ENTITIES/mobs/api.txt +++ b/mods/ENTITIES/mobs/api.txt @@ -361,6 +361,16 @@ true the mob will not spawn. '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. + + Making Arrows ------------- diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 60f8738d..4d27299f 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -253,37 +253,9 @@ local horse = { on_breed = function(parent1, parent2) local pos = parent1.object:get_pos() - local mob = minetest.add_entity(pos, parent1.name) - - -- resize to half height - mob:set_properties({ - visual_size = { - x = parent1.base_size.x * .5, - y = parent1.base_size.y * .5, - }, - collisionbox = { - parent1.base_colbox[1] * .5, - parent1.base_colbox[2] * .5, - parent1.base_colbox[3] * .5, - parent1.base_colbox[4] * .5, - parent1.base_colbox[5] * .5, - parent1.base_colbox[6] * .5, - }, - selectionbox = { - parent1.base_selbox[1] * .5, - parent1.base_selbox[2] * .5, - parent1.base_selbox[3] * .5, - parent1.base_selbox[4] * .5, - parent1.base_selbox[5] * .5, - parent1.base_selbox[6] * .5, - }, - }) - local ent = mob:get_luaentity() - -- tamed and owned by parents' owner - ent.child = true - ent.tamed = true - ent.owner = parent1.owner - return false + if mobs:spawn_child(pos, parent1.name) then + return false + end end, } diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index d8b80ed0..fede3f11 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -171,38 +171,9 @@ mobs:register_mob("mobs_mc:pig", { on_breed = function(parent1, parent2) local pos = parent1.object:get_pos() - local mob = minetest.add_entity(pos, parent1.name) - - -- resize to half height - mob:set_properties({ - visual_size = { - x = parent1.base_size.x * .5, - y = parent1.base_size.y * .5, - }, - collisionbox = { - parent1.base_colbox[1] * .5, - parent1.base_colbox[2] * .5, - parent1.base_colbox[3] * .5, - parent1.base_colbox[4] * .5, - parent1.base_colbox[5] * .5, - parent1.base_colbox[6] * .5, - }, - selectionbox = { - parent1.base_selbox[1] * .5, - parent1.base_selbox[2] * .5, - parent1.base_selbox[3] * .5, - parent1.base_selbox[4] * .5, - parent1.base_selbox[5] * .5, - parent1.base_selbox[6] * .5, - }, - }) - local ent = mob:get_luaentity() - - -- tamed and owned by parents' owner - ent.child = true - ent.tamed = true - ent.owner = parent1.owner - return false + if mobs:spawn_child(pos, parent1.name) then + return false + end end, }) From 17b9bd27de25a7fa6461efc56a6f89cf552820b6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 May 2018 13:28:22 +0200 Subject: [PATCH 0076/1107] Redo snowman texturing (thanks, 22i!) --- .../mobs_mc/models/mobs_mc_snowman.b3d | Bin 23009 -> 93376 bytes mods/ENTITIES/mobs_mc/snowman.lua | 22 +++++++++++++++--- .../textures/mobs_mc_snowman_pumpkin.png | Bin 944 -> 0 bytes 3 files changed, 19 insertions(+), 3 deletions(-) delete mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_snowman_pumpkin.png diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_snowman.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_snowman.b3d index 4cc5a5909bb3fc958675cb50e2d69b102f28e3b8..d399ff7220fa6fc9d0bfe225beb681170e6b7208 100644 GIT binary patch delta 12862 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 diff --git a/mods/ENTITIES/mobs_mc/snowman.lua b/mods/ENTITIES/mobs_mc/snowman.lua index c9d9a9ce..2d6ae7fe 100644 --- a/mods/ENTITIES/mobs_mc/snowman.lua +++ b/mods/ENTITIES/mobs_mc/snowman.lua @@ -10,6 +10,16 @@ local snow_trail_frequency = 0.5 -- Time in seconds for checking to add a new sn local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false +local gotten_texture = { + "mobs_mc_snowman.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", +} + mobs:register_mob("mobs_mc:snowman", { type = "npc", passive = true, @@ -25,9 +35,15 @@ mobs:register_mob("mobs_mc:snowman", { visual = "mesh", mesh = "mobs_mc_snowman.b3d", textures = { - {"mobs_mc_snowman.png^mobs_mc_snowman_pumpkin.png"}, + "mobs_mc_snowman.png", --snowman texture + "farming_pumpkin_top.png", --top + "farming_pumpkin_top.png", --down + "farming_pumpkin_face.png", --front + "farming_pumpkin_side.png", --left + "farming_pumpkin_side.png", --right + "farming_pumpkin_side.png", --left }, - gotten_texture = { "mobs_mc_snowman.png" }, + gotten_texture = gotten_texture, drops = {{ name = mobs_mc.items.snowball, chance = 1, min = 0, max = 15 }}, visual_size = {x=3, y=3}, walk_velocity = 0.6, @@ -88,7 +104,7 @@ mobs:register_mob("mobs_mc:snowman", { -- Remove pumpkin self.gotten = true self.object:set_properties({ - textures = {"mobs_mc_snowman.png"}, + textures = gotten_texture, }) local pos = self.object:getpos() diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_snowman_pumpkin.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_snowman_pumpkin.png deleted file mode 100644 index e9db35addbc124ee066254032e155772c4a33e47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 944 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4rT@hhPm4t-!L#R*a!H8xH2#>{Qv*|-T(ic z>FODNa*scMo?xf3*h6D;sM^j1onyHwm+Ez|O)z(HaryoKf26$7#EBD&bY-fdt)pFZ zT#S?==DvTzz`!6_666=m00#ddfPvvZL&f!o{|pSw{GKk3Ar*{MroOG)qQ!HhF#4qQ zwXJu5@4sdoWEr^0=HD!>pYW-I#YF3YUC^8Cch|37~GIqMkK*hG1yEs@LcVG=RT&ilw}@!x-0%a4=MiO zETF;Kzfn|d&%OW0dw3?^P-9Ind~~Zo1?j? zPndCjxmSJ1GY*yIw;P4}0^TpZEYHTp@=fZ<^*3MEHy$coP-3^Dbn@lfW=2=T*1h)f zx>(O##28X!824S{&d>KdO{6L(v6Mz@?#W#p@$g)|cb3T~mCm)&EGf>WC5!&EmB?xA z`O7B~#a;fdTCaDJdM$eik4RLn^?%)!7f(z+vTfZSp~T4W#Siu~&Sl-U^=R4^kda;U zN*d!^c^6*!neW-VNd0c->|73=RU&`Q7o2twG!_#5*m%kJ=r61Lyi+Vhvzh0$ybs>L;^m7nB4G%G(#42e{18l-E>z6yh?mSp9&?Dzzi4>@FP&aVdMp z5^_T!Vc8UCalZQt&+HTy&~2US$^E;2S)Eqh!RB+~j7r;-?%P*R-{8k!8vOeIOns&^ zE`NU231(|v^w6;R^Y{+u3a!6;>Wl=Bo5`JZ7;A^Y}= wEC1I&Sy`k1?r(ju{=2{b?{hrmW|3fJxYcO*d+(m3LZIy8>FVdQ&MBb@08 Date: Wed, 30 May 2018 13:33:19 +0200 Subject: [PATCH 0077/1107] Tweak snowman animation params --- mods/ENTITIES/mobs_mc/snowman.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/snowman.lua b/mods/ENTITIES/mobs_mc/snowman.lua index 2d6ae7fe..b73dd763 100644 --- a/mods/ENTITIES/mobs_mc/snowman.lua +++ b/mods/ENTITIES/mobs_mc/snowman.lua @@ -55,8 +55,9 @@ mobs:register_mob("mobs_mc:snowman", { shoot_interval = 1, shoot_offset = 1, animation = { - speed_normal = 25, - speed_run = 50, + stand_speed = 25, + walk_speed = 25, + run_speed = 50, stand_start = 20, stand_end = 40, walk_start = 0, @@ -65,7 +66,8 @@ mobs:register_mob("mobs_mc:snowman", { run_end = 20, die_start = 40, die_end = 50, - die_loop = false, + die_speed = 25, + die_loop = false, }, blood_amount = 0, do_custom = function(self, dtime) From 222f6880cb30edcefdfd0ceefe2f8ee55ce38ae9 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 May 2018 14:24:37 +0200 Subject: [PATCH 0078/1107] Protect doors from screwdriver rotation --- mods/ITEMS/mcl_doors/api_doors.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mods/ITEMS/mcl_doors/api_doors.lua b/mods/ITEMS/mcl_doors/api_doors.lua index 2ac01227..fd5171ed 100644 --- a/mods/ITEMS/mcl_doors/api_doors.lua +++ b/mods/ITEMS/mcl_doors/api_doors.lua @@ -274,6 +274,8 @@ function mcl_doors:register_door(name, def) action_on = on_mesecons_signal_open, }}, + on_rotate = false, + can_dig = check_player_priv, }) @@ -321,6 +323,8 @@ function mcl_doors:register_door(name, def) action_on = on_mesecons_signal_open_top, }}, + on_rotate = false, + can_dig = check_player_priv, }) @@ -368,6 +372,8 @@ function mcl_doors:register_door(name, def) action_off = on_mesecons_signal_close, }}, + on_rotate = false, + can_dig = check_player_priv, }) @@ -415,6 +421,8 @@ function mcl_doors:register_door(name, def) action_off = on_mesecons_signal_close_top, }}, + on_rotate = false, + can_dig = check_player_priv, }) From 635a9c45bdb21b9eecfeda60a4983644f49eea8f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 May 2018 16:16:44 +0200 Subject: [PATCH 0079/1107] Enable wolf-on-sheep attack --- mods/ENTITIES/mobs_mc/wolf.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua index 7f22ce90..056f3437 100644 --- a/mods/ENTITIES/mobs_mc/wolf.lua +++ b/mods/ENTITIES/mobs_mc/wolf.lua @@ -84,6 +84,8 @@ local wolf = { }, jump = true, attacks_monsters = true, + attack_animals = true, + specific_attack = { "player", "mobs_mc:sheep" }, } mobs:register_mob("mobs_mc:wolf", wolf) @@ -133,6 +135,8 @@ dog.owner_loyal = true -- Automatically teleport dog to owner dog.do_custom = mobs_mc.make_owner_teleport_function(12) dog.follow = mobs_mc.follow.dog +dog.attack_animals = nil +dog.specific_attack = nil dog.on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() From 6619cf159f52400633b358b0c6c7ed4d633d0606 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 May 2018 16:41:28 +0200 Subject: [PATCH 0080/1107] New zombie pigman mesh by 22i --- .../mobs_mc/models/mobs_mc_zombie_pigman.b3d | Bin 102523 -> 148574 bytes mods/ENTITIES/mobs_mc/zombiepig.lua | 28 +++++++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_zombie_pigman.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_zombie_pigman.b3d index 7ddfa2c7f220ee7fe0d2accb1ee811cc1172326b..0b9f4f7c911e9ac0c66152807697aec01213b214 100644 GIT binary patch delta 34711 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 pCBJ7*or1l1jJrK(4I;8ykQ$iUD1~J Date: Wed, 30 May 2018 16:59:27 +0200 Subject: [PATCH 0081/1107] Redo skeleton stray vex zombiepig meshes/textures Thanks, 22i! --- .../mobs_mc/models/mobs_mc_skeleton.b3d | Bin 155364 -> 221065 bytes .../ENTITIES/mobs_mc/models/mobs_mc_stray.b3d | Bin 182442 -> 301461 bytes mods/ENTITIES/mobs_mc/models/mobs_mc_vex.b3d | Bin 121164 -> 146831 bytes mods/ENTITIES/mobs_mc/skeleton+stray.lua | 13 +++++--- .../mobs_mc/textures/mobs_mc_skeleton_bow.png | Bin 676 -> 0 bytes .../mobs_mc/textures/mobs_mc_stray.png | Bin 1035 -> 847 bytes .../mobs_mc/textures/mobs_mc_stray_bow.png | Bin 1144 -> 0 bytes .../textures/mobs_mc_stray_overlay.png | Bin 0 -> 790 bytes .../mobs_mc/textures/mobs_mc_vex_sword.png | Bin 1628 -> 0 bytes .../textures/mobs_mc_zombie_pigman_sword.png | Bin 1241 -> 0 bytes mods/ENTITIES/mobs_mc/vex.lua | 30 ++++++++++-------- mods/ENTITIES/mobs_mc/zombiepig.lua | 14 ++++---- 12 files changed, 33 insertions(+), 24 deletions(-) delete mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_skeleton_bow.png delete mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_stray_bow.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_stray_overlay.png delete mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_vex_sword.png delete mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_pigman_sword.png diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_skeleton.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_skeleton.b3d index a5f007cf15fcc0dfbf8877b953c8807c86a88fcb..be4094c1bc93d27acc18def22cae0ab655dc9a9c 100644 GIT binary patch literal 221065 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 +rK?C?w~1XZIaCdNch6i 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 zhE)az$c9x02FQk01_sE6RR(y)581HFzyR5>%D@2Gu*$#y*|5sM0NJq0zyR5>%D@2G zu*$#y*|5sM0NJq0zyR5>%D@2Gu*$#y*|5sM0NJq0zyR5>%D@2Gu*$#y*|5sM0NJq0 zzyR5>%D@2Gu*$#y*|5sM0NJq0zyR5>%D@2Gu*$#y*|5sM0NJq0zyR5>%D@2Gu*$#y z*|5sMAPZWJ#=yV;*|5sM0NJq0zyR5>%D@2Gu*$#y*|5sM0NJq0zyR5>%D@2Gu*$#y z*|5sM0NJq0zyR5>%D@2Gu*$#y*|5sM0NJq0zyR5>%D@2Gu*$#y*|5sM0NJq0zyR5> z%D@2Gu*$#y*|5sM0NJq0zyR5>%D@2Gu*$#y*|5sM0NJq0zyR5>%D@2Gu*$#y*|5sM z0NJq0zyR5>%D@2Gu*$#y*|5sM0NJq0zyR5>%D@2Gu*$#y*|5sM0NJq0zyR5>%D@2G zu*$#y*|5sM0NJq0zyR5>%D~_W4PVHHRR#vghE)az$c9x02FQk01_sE6RR#vghE)az z$c9x02FQk01_sE6RR#vghE)az$c9x02FQk01_sE6RR#vghE)az$c9x02FQk01_sE6 zRR#vghE)az$c9x02FQk01_sE6RR#vghE)az$c9x02FQk01_sE6RR#vghE)az$c9x0 z2FQk01_sE6RR#vghE)az$c9x02FQk01_sE6RR#vghE)cJ9B8;eHmou*KsKy0FhDk} zGB7|ktTHe_Hmou*KsKy0FhDk}GB7|ktTHe_Hmou*KsKy0FhDk}GB7|ktTHe_Hmou* zKsKy0FhDk}GB7|ktTHe_Hmou*KsKy0FhDk}GB7|ktTHe_Hmou*KsKy0FhDk}GB7|k ztTHe_Hmou*KsKy0FhDk}GB7|ktTHe_Hmou*KsKy0Fmyxx4cV~DzyR5>%D@2Gu*$#y z*|5sM0NJq0zyR5>%D@2Gu*$#y*|5sM0NJq0zyR5>%D@2Gu*$#y*|5sM0NJq0zyR5> z%D@2Gu*$#y*|5sM0NJq0zyR5>%D@2Gu*$#y*|5sM0NJq0zyR5>%D@2Gu*$#y*|5sM z0NJq0zyR5>%D@2Gu*$#y*|5sM0NJq0zyR5>%D@2Gu*$#y*|5sM0NJq0zyR5>%D@2G zu*$#y*|5sM0NJq0zyR5>%D@2Gu*v{BNfTTHKsKy0FhDk}GB7|ktTHe_Hmou*KsKy0 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

wziRPfw&Do)R5F2!QIp`#F(5dF26U;$; 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 literal 155364 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 S8NJ13^cEY=Rk&`k(FOoE398Bf literal 182442 zcmZ>AGIm*Xf{B5Vfq}s(C^T4)fdRrUDlN{?GcYh@U|?vlN5v2o3=9km|NsC0@8|F0 zns9=NAz3f6C|55hHLV1s2P6x_nEGKdzOKO@Dfc1fgaw5J^X!3`4RQ?=0|SFxaEASX zdV2@nO*ia|(=GO=u^Za&V2s(zz))e&z`$X@e`&t`-tXoP3#?w)@6V6hFBsdiZ`t2V z`ylcx_6~w6_QmG*4lkE|w|~a^abIlXJljLR6ZSJO)YvmHu-MPv7h_+x-_0RZ?uC8K z!`1t4F3z&w8yL3_BF|y3-rQlo#yZF$_S}vAtf>wAK5s3zKjQdk&tC^8djN z`&FC098S8P+%KdCtsJPJjVhnU|yXNi6EDOQJ-*+1^&ZL+b{gg=@8Da)h^`WYP*Yzv-a-| zjDyS1=;^ngo6Y2~Qt7kZ-;@Ts*IUc?A8~wS1JTc8FY%+t z{vC`lwhRn0VEflb*VrG_l5pUV4nvbq0L!aiZ?xaHNWj5Jr_?^ba;M$p^z8i>2c`Eh zFo5Ja>@ya&+jAsyIxGqfLz4%Y&tZSUufd+TSi-^2P{RI`AtL@D_6ykabC%j4-X!mE zkJB72{6OXl*b{OeA^(ZhPqtsO*xF&9$tsle1xkA&$4%|8Z|Sva8x>42c(!q?qp!63dA!nbmHOv0z27iZjrr+(5 z^9Lw>f#mz9I@sF;`8ce9^T7@|eZ%B=wS4T`gj^kZtT)?zGp(_=ZdBcO>0pK}%>0%) zwe}7#9ULAk`;L-=Gd zTE2kNmx#SEPoMq8hguFF({`bSA4p!pex>*ndxt&F4)2zI->>&ybpOi6Berw?`r0!v z*w{x&IN4|V_St{??d7n{>cxK4^1%Tt|Glcn-g2(H!?QCl_oL>2hPqx1&7+gM~fEf~oc&Ut2rWXrA2v zO}}dY1jm4Vj~om4E_)7=x3QO<&|q)WYvHhG_o@Adb06CsQ%~J*bWp+;CZB8BVz19? z=%8-Adp~OV0Mc(^pX8KkFA(7FFwfDJ!<-cn2#_1MUIQ&jX#ilz>h+E;bwJ* zkFs0P(tnISNdA0Jt$nPsg2UXKId-V|F9IyT;?o@a*SB>Xf+SY$M=gIr;bUS?D1Hcq z@9szK_PVv24wF``-j7=TLd-vLwcmcZwzGrr-ktmXcdG3#_qMdZ?3uX_l=eVr5LfvG zk+-nNRldOFw{@4=zdU2_Q0%{Zf5cxM`-0z=`~N5Y-wTnq!CAh&weSL`zc%hJ``BzR zht~nC_9Lech`f!x`S(ow1w8H!T8~%nM~+{ZJg)K)B5z@Tw7t<@%gfW@>erq7kj)3> zf9CzV_H04z_9a|S4&Rr3--jGO3=ARmAbF#f6#H$f?Hs7f()tS@Z4JDTzA#JF02@%@9$(Ffasw%U>0d z#rCUb@j5hJ|7(jH{vde~`=_3B?GtZ_II#Ft*`ewWv1ecqv7fSFrhQ71jKemeKenjl zH%MN>-c(|S{T3q?2lGdz`%ue&kogMsZ3k!DZ(JqgAaDJ7FRFf!yo|le_o?>juaq5T zL_V@Y)ekaX#{Qe{B>U_lZHHI?zwAXVzd-T|_S0Uq+Y2arIq=1Fqoi*J1|Rz<2{ZdJ zg(mxBNr4XC_sdb*r=aiw$zN88vgc&+bKqjBMrmKd;=g^!~|(OJBao?v%lP#WiRH~ZfEK_Yac|O!`|I>iT#t)vJRT; z-Dvf{gT2UcO?&q0dG@ooRUP)5mhX@GtFyo2x2666#Q(OC_MxV|batox-8G61c2QOP zy?3hF=X+c3zwDW52a}I6?YCFYm2$|K*@IU9L(Iojzy5V7vj^q>MutTD!|d)3<(en$ zk<&Lsp2vRq12cQJmCg?4(~qOHpJDR2>Su_&fc^55t@ej+c{(JVi$F{N0rt%MP3@me z?zZQh?d0%rSvgAm2ui;o`ETsG_5n8b4h5&HQ0h0Bd~tE2JzI^N!~IXuXz3qfKECpY zdB3E+nCVjcACGt)BFaAQMJ<1P>_PHcsuS$3TDTl^d|A=Te~A3cs4n}DhXoxf*U9Zc zZXbd2CrCf8`kjHn0bKv#Y9B!4P3+S(rrR%&HgVuuGYh4C28w?M1`~T+^*2P`!hYws ziS}QLogIWW-Pn(s|3LOT;B5av?6^gbaJSDP@)GvA+E*}nBdap|gwyH{?=&CUB9}i9c^UiZ@0Qy?bQW_^`&)+6{)PBY z!~Vte)%N#y^Ev!^9gam_#eVtOrS?;Qi#lWpTcU-Zi#-E_iha1sBKzshvJO*JBCyD7 z*n23fweNq;=AiTFD@yxf*>hKL`SrbQrTwI0J_iRTsr|_18$@2go-2Kd{S^^zhXZP| zXzg#1eg*qzff@D}dzc+`wEv)_Pl$dQdwk;qp#0B^XM6!9zuG9(UU!w6gXptPwEi`u zeV}{1z`i_7-eK0~5_{zKAFO>cYh#=J7jH?2etoumsQrIP{Tlha!G2Y@g2T}(I(tyt z&!GBK#(w357W?JQk`CM6J+ejB50aO#$Cv*={kxmhJ@$4yLJqG^H0(popP>3d#-5P- z2$_$sd;r;xt9|*_0+jxB?69FjH6iWFBkvFiPWEg9|)7Z^HjZ+S#e1pm3 zYM(;nb?kAK@1XIuCwneQgXGnHwC(r2@N%eQzK+)ag2*q& zQ9r=Ux7KX6ca~9fn8f>cA8P*<6#gpqpZC_;|BTjfD2UmQ(tZGypP>BZ$3z21kGzCh+H*yC%zGVkZL$JhP^$>U4^AbFj6k@ins z>N>;)&9p~NUpe+5`6kT@`|u76ho=FnQ0i9(h5~z$;p1w9NuZ|ut%-`A@VCY{p@FHnmR1ow*sYphM7+&dIz+|GqKqGd#_vGs zn^68B6o04Z^x1cX2sy;h`Gc1JLG5P+oc-@82{&;2Lp^SyeR#CB!y)_b{mA265P1{( z(m56OGyj-7FkR}|kKDe6$>ZvOL*y-RjxYXo0FD1C*t2jH*?-gUa9~;^g)%+_k(aU8 ze&KF!dCJA1sa+gpdG|yg$i`OBwPud>2{s)a8fcp2$95d}tc#1fDOS3{79{`On^4M>Qn`(dh zqO`-=P-(RC1tc$kvw!*50hIqNaJJ7O@+S7U+Sf37T>VpsyoEik{{6D&f#Ci-uJ$=Z z9(Vl?lec8)vwvsJ<gXHnm zA0T-`<3srBXHfX!t3N^VkFFKiM+rDM1e};}Iws~JTcHU(6mjejM8x{==2NAo3!3+drW23+iaKpLamh!6njgc}zk!6W0p9U<1_m9RUWs@nqV9I_nbZsLJ4Ll?E{Fs49@ZUD2XKS_&Kif2_ny7kE?uv$>ZvOL*#kv@r_@L z9GAp7J_8CrkUXyO6_`A}{yRuNuKp!te3Xaa_$;CERb2g3nECj|A3^<(uSK2q2ZEd& z%=TKMjX#3=mj*cd=dkp9>R-KmrBtB9`LC8}|G3g8L|(=oSNej<<7%HkFzs(t%V*S~=JcQQD~{~-NS8JzuR(D*rM{vTKS9Wwr6fwTP&kvFl&)&GW=Z-R6E z0HptIV~=b87~*~#ob%5Rc?)}7^WzZnE$s2Fp8%PGYyB2T4uo;7{{qQ@?3i)3(%wwe z!6C@y7TWj$sQ>R^k8gbj$P7a6BV<1B#wPpvs}>HkHoQa|->|U5_a}x zNp1ECp938lZ|+1ZzdY^!Gfbvs*n}afc0P#QW z@g0c&Ozg$p*V|7kF>ts(sS0KM2O@7^fBImn{R0zChb>!s(Ci1fkFY!;^Y1KZwx9e) z!(m-xG#2}H@Xn8d!Vg#f=B-5@c>Whx{}Uq5V~=Zm7bbt^LxTN-L^X%cw^rCAk3T@< zIqaY1O|jpxOWUD9cqhvIdz1ud{6z(4{~RK(V2`VR4U@+;eh!gW!8yJLS-&TRvwh6K zkYgVuA!U!NeG8MvH9iM3fBD%u`@4*u4t1SB_M)!80gX>-*sBOM+uy2mboef}c?)X) z6C|%s`W1#vKB#&!+ z3nu@|vcrB!wV(sbo?JWB`3KPYB~kkeYeVc67P~s^yT*aGJ_!`Q8uosYp7z%s`8ce0 z58s14e+mn~_t^pVm!n)Aq8Hq?{f4r>6B7P~3^Dey(smBeFIf9qsLVW3tAt8YyAsE zUdJBS{2Ro5I`+8wm!SLuS|6}9s?z?;0tW}}y_RU{F9W>(;Ea{Oy_u7(!|EAkXz33k zkE?$QGapy|{?`FC{_kLqYyBNW9{2h?m^`lf6C&?GaD6$h`~g`%E@F=>eZ%AltxtFR zo@ej&)8C=+NEyod+`kT>{^o=qI20OXp{x&u$g9}nDqog8 zj|A60xW@k>@;vqthdS*;R&zQ$&6GgtU%}*Yl}`|P4xH;-mOTfpL6*R|z6v5QV~=Zo z49-QTpd2yA-RY% z+w8-Q1sy6je!^nD0M7IS$)6$w-ABlLT(sz z^TVL=QGD~uAbEWKd(i$JeB%Qkd0g!$Q27KhpOE_qnUAae1u>t)9^d>NX#5@5{0VIQ z9M}8{L|(w2XSJI4f@U-AQTJzn#>WNhyS;<#pBI`soIKfyw!Z{4zD`&_q3|IT zzJ%P5YyBQ<{tDmv4p96NNlJZ~Y~x z|8RW64Eq3Y9S8l`2$cD8NdHI2zKngUeeh*thlsp#Eb;~f*Y6Q>A0hK`&EG@ZXJYS} zHQU~DjfunIsW(u@HD zeF%}4uvfF3WzSfx;xOsRw|%Jli+t=wjw|BqpMv@qAbDK;@D* zxY8#?-iF}%R6^@p@$J6?je!tyA0hMc?cV~KPe`7S`GnFhuKlebyFnP&`cjY_^L|Bp zbI0}ew~g5yF5R*~DIY*_1CqzLz6m6cZ+sghk86J!$b3*76IvflXnixG{EKh@Pn3j~ zJy&(P{e#W`hxE=0l<^r*`x7K@5bbNPr0wglrMC%f{X>jBNFHDR5G0SQe1q(t)4*9i zLgaPqag86sDc@cYD{X>{MuKk%1c?rDjFVOxHeETmz^0@X_g32$DJihUD zkUYNe%P0vYdtBoap!Gu_d0gWQFnN6Ab0Gb=_E&@SgUV;)_YL;FhK>$bmzAUJ&jyYE zf#m!5h1*}aWb1HEBpYRaHB27Y{%n}}_{P7YB*g3&8z$K&D)>A2=9QzY&w#9-6th1i zXkowTptr+0&k~gN6)<^x<6j{2anr6{R4=+ z3C{T&m^`le7l^!pJ+A%>WPPrVy?E3dd*8z<4y-)@=PAo3bG$FE`Xxawz!ypBDt^!?TXH2$Z6bAACLuVRlY zf5GH&u}3T3hjIi z(E11!dqVPr%qO(J6kq=ew7wr#`x??dP{6tW3?i?BbN>QN9#{JuBCmk6eEsVHn*Wr* zxjr5uFM@OY3?`4Oe1^zN;PfA;{=^qP5P1cALg|B0`XW@m;YuHn@=FEh{tcKsq4E*e z_zXn93C{5&h`a&L`FEH+q5T=S#*bk73DpmT%6DAz_b~GbtuMnhKMxwe1TeJ0d)QnzVj16^7!^og5>d?9|V%emA*jbKWKaeU-44L`v{qjYkdW%{|7Rk(EdJr=WBrW@8Mcs3u)i-+7sFzh_C(6 zyk8aX`Uj9azWH^KJg)W$q3ZC9!Mxwl9^d+RkUYNiH6VF>>uW&rgyI+9`Yh1=F~0p-AbCRRgOEHS^KtFZ0G0nB z`w5jF_{LvA{V!bS<3Y@q!8tz!T3-k1pW!>d4`e>B@!hu;p#HZ8&iyqIdEDp!z~pg_ z4@2ZNaQ1KiI)KjqvcWk%36aOW{~IQctA7lUx3MQQzKE-Qf{Y&u;9P$KlP5GjiEsQp zN`2WuKE#F|AE?1gxp8Sd|dGZF&}sQ!Q=^<|Dx5^o?)hmL*j~O zX#1Z){$sJn75@Qmp!x^b`ag*I95~N!gUIXH;~GC@0H4pR zgLC{9BClbOtNe$UuR(BqKCbZvQ2!XTJ_OhJ3PfJRp3wdXeDe>W^Lg;Kzd`H6@U`DT z^7!U2K;{#2A0hwY>)(UQS3>8P;2R$X&A;QSKSAXuNFLYuD-d}LdtB##K;j4Y`Js^U zWy1P#jc-BB$2~s+G2aB|{y|v(5a0e*Q2Pqk`D2juEkW>nDnjR15i+09`dM7-qapqi zvB#CZA^THAaIQ~>$m8Ds43o#zKZVGP;N3qD8ehS;{~jcdZ+$CB9^d*ukUXyQWnk@R zT{|1xCH9iHASHao8d}{$(|6qXg{27Qm?(=70^0@k^5P1WF<43smAHebtq4N{) zoi7baAB4uI2%TR`$b4MqD?-XA8Jyz_Z!JLQ&j{e0|AENkp8tW#<7%HmC8prvT zp!yvoPpE&0Z~Y-Ce(aD1G3X--pDH2F~^usQdu+FA2Gikomag&ms2f;2huk>i}wh zY2aLc1d+$R{s<-Z}2cYpqeDk*;^YN{30m-;lF_;T3e zJO2taK1yhO1=sp<$oQrN&h_UIdBXdL35_ok8ehlPzX9EUhp+t)lE*jx0ct1aqnM-$>ZvOLgWQ-&Tm5c$2xfTzc4W1-#-JA z$G3k7)V{zs{~jfwhxhzKkUYNgDM0f0=HEf``1YTH?r6fde+(p#?|dwfJiha*K=QcG zH-Lmc56<%uAo3h|&u;YbEyaU=} zZV#0|dB$fSlKg&9-wq^i+3L41ty|IoCa-c4qX zg|7kFeB9v!ktgJSLjK1c{~BQX--k%rL(>=5^#2wre+x(Y2g!rdA50z^|M2t=G9M&= z0Ghv`^6>Nz(hss9rXP{MLFu!?UV4|e9Z3Enj`Rqn0~1J z`xzJ*>_GOn+mwRc_Xs2X9{{@#Bo8tlCJ!}#KLZ0u9%4R79%ep59%R0UJxD*uewcoQ z{UH4n_MK4scVMLd2C)4gd64-qd8qlI`@F$-0E5g2$-~Tt%ER3U(hss9rXOlQRDT6H z{6O-s@I%Oh!Ve-3G9M-nH6I?nAoD@;F!K@eAooMU2V_1he4yq--G?uIfWpUvK=|Mb zUy%I{;P3~z4>Noq@`T(EO1~iexcrYNecFP?uPp7V_JjQY2uJ$2hRW~2k^VvQAp2qR z(C`JNUk1<^BglM^Jj{HkJUo6t`a$-?^drI_ls+r$1A{hz-M1b``UlB_%!kQC&42DkkLf;;`3vj_ znLpVWZa-T4AC!L>>_PG%^Ut0+1D1!{56a(m3=9zSq4Hq&L*?P_1L=qQ53C=WKA`#; z>_OoNl81#KLLL%7AbF7aFnOr?@bCqh50b~_KHT9C3cm(${9(5rB)`B8WIjk9WVCL9$b6_gIDDY;(C{HHeS!32iGN#={nNu3 zt)cG2n*Pm$;PP10KS&;AJ}CWx`o~cBf!xmkihq##PJ{M>8LkJ{jz* zy?yqB?AbDKw1L+6Z57UosJ}CS^@}Tqu3SWdgB>jWrLFU8c5%z=R7ubQ!2g$?C zN616cCn$WN=A(r_D1A5Bfy{@>gX0fjKS&;8K1d#BK0+R1KJM@Z$v1$*ALKsF@PWt^ zazDs@ApN-f5Aq*W9_&A;|Dp9ugWY3C@BM0>lA!V%&3~Z&2ZQ}{s65DhNZ}9d-$LXQ zCeCz#$s^2Hum`1okoh2aQ22oKL*=3UqXl-j%?F)d%wQkIeg^EmJs9a9bbc^I9%MdD z9%}x6$ov_^e2_e*`#|O|up?xC1l0a}80jC>e`c@;$%D*?$wTc2k1c@w4>BJlkIQ`^ z{h;uN=|`j=i20!K1Ifd}4TY z(D1{TK0x6QF(0HKWKCJ0K7b<@bqx}O)-wgI3d64-qd4%~O`2}F}LGpW`?JKA}JpF_8 zgY1XtM}!Y3eKOedobv&@4^)34jXy%;2O9)chv|p2UNCbeSIy2H9R6ax92d%#w z?508G=g*AXk0cLm-$3NIC7p4A$s^1M_Ydqq=7Z#6=0oM7<}=_kA6!0w%!RsdKT`Sw z_0PcVN02K;rn!pE@&gKS+N5%t(7A`@wDlg&#;B zYCc#VYCcq+!470TNFJmPq#r5|cOOU`pZTEh1Ifd}4?TWB@=)`^@dq^@>^IOD8pwQ* zJk0$Fc~JWg5F57c~^`xrpxgXA&oKLF}~*@4Ul$-~Tt>PPWENFJmPmH!Js^7b>K@&#$n!0jhA_k-oH&7bK2lSh~j3f~2GAoD@;F!Q1E z;I3)Ur_t)85kab!v`b}H6JVwwI3=EF&`u!m-Y;+`#}0Z{=;QHDEvV3u<%3J z4~ZX;Jk)$}{2}ZI$uF=2nGceOnU9bMxqpEjD11QX!@>t@{(jKf8c_ZQnGcf3v|j)m zz992K@-XwE`ceE3l85;pD!(5RehuL82e}U>4|N}09%Md99%epN9&SF!eIR+5`w;RF z|AYJol85;ZD!(6;_CWr-bjHVCLVPA@{uW$*K-~u|KOF2&LFF%=@xfC5L*%`@&N#s2 z5#}>AfaZun=7Z!_PHS^TF~^`=Rm*1l!{ib6gX9$mx(|2!g3EWX`Pl6T$wSNs$zu;6i2p(IAb(;h z|M7$msQhFg=zc=}2l)>aKA?C;i+^zW1sXpEjn9I{k3sH(h99W>1kdk)$bQiHHAo(6 zKUBT~JU&lI9%MgEKf3vZ;s+!TG9MOy2>U_v1Ng!p6h4sgd60gX|DpOp`5Qcbj^BSC zDDwxP^a0fmDxbjN1BxGz|6t}r{RcN6PyB=J2l)@AALc)(et7x>xep|dEBuhxcc8it zG=E-!vVI37k1!u3kGj4FNgiCbg3>4Q`Vx>l)c;WV3Y7IfsPdrki3*hUJ0N+e{ouL* zWIpox5m5R<$V2Amk=GA_2LkTLXFte%)b&vy^P%AfHy?TZ z4wC<%>t`GYrcXlQ2U-BBoB2TJbaPYS0Kql(>Ln+5|BL9 ze5iZ{%K8&jc}V)lZ9YgIvc3egz5}#=1U391;R{-S1M(kC9$`O79(8>YNIy1teC8vs zPXXyigb!$Z4YK|QWIt&A3P>JmK0N({^b?W?*$>l?ZaygfK=QEoL&$^T&jV%s4pR6+ z;}2i>gTe>0J_qDJ%C=b%0t^X5P6XKp!Fpn{m}4% z%0t!<;gAQne~{O2fb=7o4{rY;ude~6FN8d({zhGY0+L7A50b9{uRj6V4_beMOCIDu zm^`}q$m>%;`l0gB_6_R#7?3>FeyBX^`XXHNAp1ew`e@p#B4>e}!hg9jJec z+`mAQ2c>Ut{}&_=G9T3c0Leqc2PDq`G9QmTxQzpn2iXtP4|P9CKe!G7iG$=p{VSyO zVb8z->7Rk*LH5Js5%z=RA^m4U^7zaLnG2E!_5YCU2Zb*<9IaA>$Vyc~Cf^#t$fb7{L8gkUYpAApb%2gVHCs{|FKX$z%7Q z0!sfG$$U`z9~?d)dqMsKnFBH(5xDHbQ1b)um=7ACY_LCn#%Dj&eaQ6-$bXu|AFEcVLwQ|0VVx{FN}ssoLH5Js(alGWf28n%j&BE`q+gIc z!hTTv;R}CI`i7)Wko!RC6Ulwh^zDF>{*mON{=;WK$b3lt0QnDQKGc73^O4gp$o&X; zkoz47rcXlg1DZdB&d-7C4@CHY>c<9@`CBCWLFF%~{sGV5!sgeICfB7DI0H&`BIK4=~hB#*EkB;P=kJji~S zesuFe;vjj@{3OVHs64d(V?dc71<6D0hsrk)C6CX1Q2c@9LGz!W@I}}Uia!Q${6YPX zHGV$H?nzLGnoYZ9#1$(E3@> z`Z`ei2uU8~KJfZakUVsKAh`VkH6JPuSwD?k9@IXA$YVDjBoA3%3zCPe?}WM!)OUcd zKL(i(lSkMOTEB?8z8W=t5%T!VM_!)`(hs#CT0Wqz4+hCY?T5-k)=xv-2X232lZV<5 zmPa?AQ2c=8LFR+npP=|bm=9VX3JG73JS_g8^3d>utWO5XV}>6ne>I@2f5!A5WPLJ7 zKc@Yl@WmH@5c5Il2jqX4`=I^@*yTa( zABa45^Fi{c>kB~P4|N|Xe}VfL$m<(G@(BAu?H|eo%@cIm>|H0)aBK$$_Z$MdJ zgOvWD=@%0IQ2pTWhw6vB?SQ37ZK~LVe(M>q4JRR+o1K4xa0|$Pbhu} z#V_vg2Zc|A9q#Y}&A&8&*DvFC{{lPQ_JhpF7k?1*amPO>{WaJT@;{;Q1FatgxgWHC z7LU_d4_QA=NFJa0$m?^F?1!fB1$H2L zkolnc86*$2A1V)7KTSv;WIs$l)c;WZsO!r?;fs(5#UDf-WIinZ5cY%QA>j*>hlMXx z9vXfPDC@(K+z)CWf$MPm{=;WKDE#roA0+)FuU|&;A9Q{gvOXIWJ~02G`yb>!kUXyN z1MQyywa-BNXF%pd{SR$FG1!CTLG3G;Ji>fX`*DFC^8Ol-eyBXC{Q++OgXE#+gX=G- z`A~TVd))G%_B})%YCl*%!hDcC>i#NF{2=5Z?MvkSM<98G{UCYN{bji1LH2{{FOWRC z`N;c|kmRB5d({0=AbF_$PQ`LyAp2qRQ2U|!7l8L?f#h+;4=DaX=ELL> z_JiUN624G*aQH&yLFpU3z8rV>LE7ga|AX|y+y~W<;y#c(rv0Gs#}|JP^FiqY>OZji zp#BHtJ#hOU+3=9mM3=9k$3=9n13=9k)K8Vf7z`(%Ez`(%6 zz`(%Iz`y|FgV;h03=Dz{3=9Gc3=F~y3=AMXh%Lszz#z)Nz#ziFz#z`RzyRWd*isA( z43Z2C3=#|s4AKk?3?M#;EyuvXAj`nOAj81GAkVAPiVO@43JeSkATNRV zAhsF<1A{691A__!1A{sP0|ST;VrwxlFlaI`FlaC^FlaL{Fo5_VwjKimgDwLDgAM}& zgFXWT1Bee|8!<327&0(07%(s}7&9<1fcPM`83O}@DFXw82?GOzIRgU&h!0|0F)%P# zGB7Y$FfcG!GcYiK_#ifD;0!dlU;`Rp04>sIU|;~TofsGx96_^!3=9m;3=9k)z5@dT zgBt?_gDV3Ag9`%#gFBQDVtX+#FnEGi88R?1cr!3CfcPE^3=Dn@3=F;u3=BRD3=IBI zK8PK}z`zj5z`zi|z`zj9z`y|FgVfdRw^v5zq@ zFdSuIU^v3Sz;K*_fdRw^u}?8DFq~vyU^v0Rz;K#@fdRw^vClCuFq~yzU^v6Tz;K>{ zfdRw^u`e+&FkEC{V7S1*z;Ky?fdRw^v9B>OFkEF|V7S7-z;K;`fdRw^v2QUjFx+Hd zV7S4+z;K&^fdRw^vF|Z3Fx+KeV7SA;z;K^|fdRw^u^%xoFg#>nV0gg5!0?!XfdRw^ zv7a$8Fg#^oV0gm7!0?=bfdRw^v0pJTFuY`7V0gj6!0?)ZfdRw^vEMN;FuY}8V0gp8 z!0?`dfdRw^u|F{|FnnZSVEDkm!0?%YfdRw^vA;1eFnncTVEDqo!0?@cfdRw^v41fz zF#Kd-VEDnn!0?-afdRw^vHvkJF#Kg;VEDtp!0?}efdRw^v6&bd7#Kkn03!nfGa~~7 zh!3g|*ccfYSQ!}@SQr@?*cllZKztCJi;;nWlaYaegOP!On~{M5#0RnY7#SFN85tOO z7#SG&85tNrd=OiRk%2*wk%2*gk%2*&k%0lk2eHK%85l$v85l$u85qPF85lr(5L=3o zfkBdyfkA?ifkB#)fdRw^vE>*U7-Sh47-Se37~~ll7(jdwTZxf@L6MPxL4lEhL79<( z0mKKf)fgEVR2dl85tNrd=UE(BLl-hMh1oh zj0_Bi85tNrd=UE>BLl-xMh1o>j0_CN85tNrd=UE-BLl-pMh1oxj0_B?85tNrd=UE_ zBLl-(Mh1p6j0_Ct85tNrd=UE*BLl-lMh1opj0_By85tNrd=UE@BLl-#Mh1o}j0_Cd z85tNrd=UEU|?oqU;yz!odPx{1_o9p1_l-;1_pK}1_lrx#O7jRVBln8VBlb4VBltA zU;yz!Y(6Fi23{rx1|B8`27V?61`r>_7Gh#x5M*Lt5MW|p5N2Xv0P#U=F(w8EQ6>fk z5hex(aV7=^5Ff;rVq##BWMW{DU}9j9W@2Cf@j+}kCI$vsCI$u>CI$w1CI$u&AH-H- zVqj2YVqj2UVqj2aVqgIAL2NZ91_o6o1_l)-1_pH|1_lrx#MWYBV9;b@V9;P_HezC6Fl1t2FkoU}FlJ(40P#U=GbRQGQzixm z6D9@*b0!7`5Ff<0Vq##hWMW{jU}9jfW@2Cf@j+}mCI$vuCI$u@CI$w3CI$u&AH;TI zVqkD&VqkD!VqkD)VqgIAL2NfB1_oCq1_l=<1_pN~1_lrx#P(uhVDMyOVDMmKVDM&Q zU;yz!Y(FLj245xy1|KE{27e|71`r>_4q{?p2xMYl2w-Ah2xekn0P#WWFeV0uP$mY3 z5GDqOa3%%@5Ff;jVq##3WMW{5U}9j1W@2Cf@j>i3CI*IBCI*HWCI*IhCI$u&AH+^# zVqi#QVqi#MVqi#SVqgIALF_ap28L8728I+S28MJd1_lrx#Li-3V8~=*V8~!%V8~`- zU;yz!>^vq0hFm5Fh8!jahI}Rl1`r>_E@EO}C}d(_C}3h>C}v_{0P#WWGA0IwQYHq5 z5+(+QawY}_5Ff;@Vq##ZWMW{bU}9jXW@2Cf@j>i5CI*IDCI*HYCI*IjCI$u&AH;5A zVqj=wVqj=sVqj=yVqgIALF_gr28LE928I?U28MPf1_lrx#O`8ZVCZCGVCZ0CVCZII zU;yz!>^>$2hF&HHh8`vchJGdn1`r>_p2Wn!Fp-IYVFD8a!(=7~1`r>_p2oz$FqMgc zVG0ui!*nJF1`r>_p2ft#Fq4UaVFnWe!)zu71`r>_p2x(%FqeseVGa`m!+a(N1`r>_ zUc|(}u#ky?VF42Z!(t`|1`r>_UdF`0u#|~`VF?oh!*V7D1`r>_Ud6<~u#$;^VFeQd z!)hi51`r>_UdP11u$GB|VGR=l!+ItL1`r>_-o(Vfu#t&@VFMEb!)7K11`r>_-p0hh zu$75{VG9!j!*(VH1`r>_-o?bgu#<^_VFwcf!)_)91`r>_-p9niu$PH}VGk1n!+s_P z1`r>_KE%YpaFB_C;Q$i@!(k={1`r>_KE}kraFmIG;Rq80!*M1C1`r>_KE=eqaFU6E z;RF){!)Yc41`r>_KF7qsaF&UI;S3W4!+9nK1`r>_zQn}9aFL0D;Q|u_!(}E01`r>_ zzQ)ABaFvOH;R+K2!*wPG1`r>_zQx4AaFdCF;RX`}!)+!81`r>_zQ@GCaF>aJ;SLi6 z!+j_e#FGU@Q{gt;Q_e#XSW@RW&x;RzE1!*eDE1`r>_e#OMV z@REsv;RO=|!)qo61`r>_e#gYX@Ro^z;SCc5!+RzM1`r>_{=~$<@R5mu;R6!`!)GQ2 z1`r>_{>H?>@Rf;y;R_Q3!*?bI1`r>_{>8+=@RNyw;Rh1~!*3=A1`r>_{>Q|?@Rx~! z;SUo7!+$0Q1`r>_W@2VwU<3{PFf%YPGcz!N_@IFxHf9C}R%QkU7G?$pc4h_!5Ff_R$^vgP-JFcP+(?YP-bRe0P#U=HD(3|Rb~bT6=ntob!G+z5Ff_c4B5=aAam+aA0O&aAsy;0P#U=H)aL~S7rtV7iI^NoyhFE3> zh8SiBhInQM1`r>_PGV+YNMvSUNML4QNM>eW0P#WWG-d{dRAvT-6lMm7bY=zy5Ffi7W(I~_W(I~FW(J0QW(EcjAH*(VW?(2}W?(2_W?(30 zW?%sELF_VS28L2*28I%528MEG1_lrx#I9myV5nqfV5nebV5nwhU;yz!>^f!!hFWF@ zh8kuDhI(cO1`r>_ZenI&Xk=z!XkcbwXl7<$0P#WWHf9EfR%Ql<7G?&9c4h_!5Ffi9W(I~{W(I~HW(J0SW(EcjAH<%-%)l^_nSo&fGXuk9 zW(EcjAH<%<%)l^}nSo&nGXukPW(EcjAH<%;%)l^{nSo&jGXukHW(EcjAH<%=%)l_0 znSo&rGXukXW(EcjAH-h7%)qdanSo&eGXuk7W(EcjAH-h9%)qdenSo&mGXukNW(Ecj zAH-h8%)qdcnSo&iGXukFW(EcjAH-hA%)qdgnSo&qGXukVW(EcjAH?3o%)qdbnSo&g zGXukBW(EcjAH?3q%)qdfnSo&oGXukRW(EcjAH?3p%)qddnSo&kGXukJW(EcjAH?3r z%)qdhnSo&sGXukZW(EcjAH+Vy%)oGvnStQ|GXuk6W(EcjAH+V!%)oGznStR5GXukM zW(EcjAH+Vz%)oGxnStR1GXukEW(EcjAH+V#%)oG#nStR9GXukUW(EcjAH=@I%)oGw znStQ~GXukAW(EcjAH=@K%)oG!nStR7GXukQW(EcjAH=@J%)oGynStR3GXukIW(Ecj zAH=@L%)oG$nStRBGXukYW(EcjAH;sd%)s!FnStQ}GXuk8W(EcjAH;sf%)s!JnStR6 zGXukOW(EcjAH;se%)s!HnStR2GXukGW(EcjAH;sg%)s!LnStRAGXukWW(EcjAH@E| z%)s!GnStR0GXukCW(EcjAH@E~%)s!KnStR8GXukSW(EcjAH@E}%)s!InStR4GXukK zW(EcjAH@F0%)s!MnStRCGXukaW(EcjAH-&2VPIec4eYZpFfg+)Fo5`=L4P(D1_o9Z z1_l-u1_pK(1_lrx#O7jQVBln7VBlb3VBlt9U;yz!Y(5qS23{5h1|Aj$27VR>1`r>_ z7Ghyw5M*Is5MW_o5N2Uu0P#U=F%|{}Q5FUU5f%mpaTW#!5Ff;rVqsvAWMN>CU}0d8 zW?^6e@j+}k76t}c76t|x76t}+76t|oAH-H-VPH^XVPH^TVPH^ZVPF99L2NY^1_o6Y z1_l)t1_pH&1_lrx#MWYAV9;b?V9;P;V9;h^U;yz!Y&{kR23-~g1|1d#27ML=1`r>_ zHez95Fl1q1FkoR|FlJ$30P#U=GZqF0Qx*mW6BY&ra~1{$5Ff<0VqsvgWMN>iU}0de zW?^6e@j+}m76t}e76t|z76t};76t|oAH;TIVPJ4%VPJ4zVPJ4(VPF99L2Ne`1_oCa z1_l=v1_pN)1_lrx#P(ugVDMyNVDMmJVDM&PU;yz!Y(EwT245Bi1|Jp%27eX?1`r>_ z4q{4U}0d0 zW?^6e@j>i376yh`76yhG76yiR76t|oAH+^#VPHsPVPHsLVPHsRVPF99LF_aZ28L7? z28I+C28MJN1_lrx#Li-2V8~=)V8~!$V8~`+U;yz!>^v3*hFlf~h8z|KhI|$V1`r>_ zE@EL|C}d$^C}3e=C}v?`0P#WWG8P7gQWge=5*7xAaux;#5Ff;@VqsvYWMN>aU}0dW zW?^6e@j>i576yh|76yhI76yiT76t|oAH;5AVPI%vVPI%rVPI%xVPF99LF_gb28LD^ z28I?E28MPP1_lrx#O`8YVCZCFVCZ0BVCZIHU;yz!>^>F-hF%s1h8`9MhJF?X1`r>_ zp2WhyFp-6UVFC*S!(_p2ot!FqMUYVG0Wa!*mt~1`r>_p2fnzFq4IWVFn8W z!)z7?1`r>_p2xz#FqegaVGaue!+aJ71`r>_Uc|z{u#km;VF3#R!(tW&1`r>_UdF<} zu#|;?VF?QZ!*Uh|1`r>_Ud6(|u#$y=VFe2V!)g`=1`r>_UdO_~u$F~^VGRod!+I75 z1`r>_-o(Pdu#tsT!)6u+1`r>_-p0bfu$6^@VG9cb!*&)11`r>_-o?Veu#<&> zVFwEX!)_J^1`r>_-p9hgu$P5_VGj!f!+sV91`r>_KE%SnaFB(8;Q$K*!(kQ%1`r>_ zKE}epaFm6C;Rp)@!*Lb{1`r>_KE=YoaFT_A;RFi_KF7kqaF&IE;S37{ z!+9141`r>_zQn@7aFK<9;Q|W-!(|o*1`r>_zQ)49aFvCD;R*`_!*v!01`r>_zQw}8 zaFd0B;RXu>!)+D@1`r>_zQ@AAaF>OF;SLJ}!+jP81`r>_e#FAS@Q{Up;Q_e#XMU@RWst;Ry=^!*dn}1`r>_e#OGT@REgr;ROo=!)q1>1`r>_e#gSV@Ro&v z;SCD|!+RD61`r>_{=~w-@R5aq;R6c;!)F!-1`r>_{>H+<@Rfyu;R_1`!*>=21`r>_ z{>8$;@RNms;Rg!?!*3P_1`r>_{>Q?=@Rx;w;SUP~!+#bA1`r>_W@2SvU<6I{vNA9* zvobJ%_@IejHdY1(R#pZE7FGrZc2))k5Ff_R$^sfP-JCbP+(_c4B2^N2ihFDexh8R``hIm#61`r>_PGV(XNMvPTNML1P zNM>bV0P#WWG*$+NR8|It6jla?bXEoi5Ffi7RtAP# zRtAO~RtAQARt5$TAH*(VWnd^|Wnd^^Wnd^~WncjDLF_VC28L2r28I$=28ME01_lrx z#I9mxV5nqeV5neaV5nwgU;yz!>^fEkhFVqzh8k7|hI&>81`r>_ZenF%Xk=wzXkcYv zXl7+#0P#WWHdY3PR#pav7FGs^c2))k5Ffi9RtAP% zRtAP1RtAQCRt5$TAH<%-%D^y@m4RUbD+9x1Rt5$TAH<%<%D^y{m4RUjD+9xHRt5$T zAH<%;%D^y_m4RUfD+9x9Rt5$TAH<%=%D^y}m4RUnD+9xPRt5$TAH-h7%D}LYm4RUa zD+9w~Rt5$TAH-h9%D}Lcm4RUiD+9xFRt5$TAH-h8%D}Lam4RUeD+9x7Rt5$TAH-hA z%D}Lem4RUmD+9xNRt5$TAH?3o%D}LZm4RUcD+9x3Rt5$TAH?3q%D}Ldm4RUkD+9xJ zRt5$TAH?3p%D}Lbm4RUgD+9xBRt5$TAH?3r%D}Lfm4RUoD+9xRRt5$TAH+Vy%D`}t zm4V>^D+9w}Rt5$TAH+V!%D`}xm4V?1D+9xERt5$TAH+Vz%D`}vm4V>|D+9x6Rt5$T zAH+V#%D`}zm4V?5D+9xMRt5$TAH=@I%D`}um4V>`D+9x2Rt5$TAH=@K%D`}ym4V?3 zD+9xIRt5$TAH=@J%D`}wm4V>~D+9xARt5$TAH=@L%D`}!m4V?7D+9xQRt5$TAH;U_ z^YjI+a{;ZH0j(WiU?_0%^LKGw@`8~eDL)0Y6oG+ZlddFaO$TV1fjt950}^In@OiHX znm1=~^7nHEuRH;ngtRCJG&TXz>n+1})M7(V)dU zAX*GWKo{|Vn4rZvAR4rY2SkGw@PKI0Vjd6;TC@YAL5q1nG-x3Yhz2d{0nwnvJ0Kdg zs0T!Y7W9B<(Bd8t4O+wlqCty$Ks0D!4~PaW@&VDH#XKMyw8#fUgBJLJXwYIG5Um3u zpo@J#Owd9f5Di-N1EN8Tdq6a3(GQ3QE%*V^pv6BR8nnm%1O%c% zi+w;eXb}*I1}y*r(V)dZAle2*KyJbTvp@@jKn!~j0bK|LVmg8d=z<^+6SO!8M1vLq zfoRa;AP@~&CS~vuvL5qe! zG-z=Uhz2bh0@0uaLm(QocnCy;772l9(BdHw4O%z^qCty@Ks0Ev5QqjXA_CE%1wM1vMHfoRYoClC!<-~^&U zi=99;Xi*c01}%01(V&G+AR4sj2}FYyH-Tu-q9+gyTJQv-L5rV2G`O&aE`9>>K?|Qi z^mY&dUHAlIf)+u6XwU*E5Di)k1)@QVoXmJ#X1}%&N(V#_AAR4q73PghzNr7n40x1v;S}X;kL5re5G-$CD zhz2c`0@0vFQy?0&I0{6A7EOU@(1Ixt4O%<}qCtzKKs0Fa6o>{boC49HMN}Xfv{(v6 zgBDSNXwU*G5Di*P1)@QVra&}kF%^ggEu;d`_dx`7Ar*)TT2uw1K?|xtG-z=Zhz2d9 z0@0wwRUjI)unI(j7FmI4&|)eO4O(OcqCpF+Ks0Ev6^I5csshoV#a191w9pDfgBD$Z zXwc#+5Di*%1)@OCXmJ*Z1})kG z(VzueAR4rI3q*q!X@O|a;w=yjTDS$GL5sLRG-$CFhz2d<0@0uaTp${>mH^WA1zjK-w73gIgBEdtXwc#=5Di+`1)@QVyg)Q) zF&BsiE%E}v^WezgBF2-Xwc#?5Di)w2BJZW#6UD?F&KyjEfNFK zpao(e8njppM1vNEfoRZTF%S(}Cb1}z!`(VzumAR4rI3`Bz#iGgU) z;xP~nS~v!xL5s*hG-$CHhz2bp1JR%bWFQ)}m<&XN7L9>u&|)$W4O&PBqCtzwKs0Fa z7>EWfDg)7=1!W)_w73jJgBFp2Xwc#^5Di*b2BJZW%s@0~F&T&kEiwbqS&7O8<~&;m6O4O*-QqCtz&Ks0Ev8i)oh zR0GkVMQb1$v^Wh!gBGoUXwZT+5Di+q2BJZW)Ic<7@fwH*EnEZ9phavT8njpqM1vNw zfoRYIHV_S3%m$)Ci`GCiXfYdz1}$U*(V#_bAR4rI4Mc+$wSj2Rf;JEhTHFSrL5tWx zG-z=fhz2ce1JR&GZXg=8m<>dO7P*0F&;mCQ4O;95qCtz=Ks0Ev8;AxibOX_#MQuW_d{vW;x~{w(4sgH4O$QfqCtz}Ks0C(9Eb)jjswx4g>fJnv`7v_ zgBHVqXwV`#5Di)&2ckiXt6FbASR zi|0TzXptO<1}&Zg(V&HMAR4rY4n%_%%YkUnB03NaT0jS)L5t}?G-%Nrhz2dD1JR&` zbRZhEs18Jf7SDlb(4smJ4O&nKqCt!6Ks0C(9f$@kt^?7ag>@hrw8#!bgBH_)XwV`% z5Di*j2ckiX?LahWQ5}c|Ew%&EpoMlI8noyRM1vOBfoRa8I}i<8a0jA6i|;@*XptR= z{tAsR(84cpw_IC=Wz~7Te~iGvp5foRa;JP-|9m^*}Ue(H@8fEzSecphbHi8nj>!M1vOZfoRYoJrE6Aya%E|3->@YXb~TX z1})YD(V#_qAR4rQ4@83&^MPp4qCF4|TFeKcK@0gnG-y#Dhz2d*1JR&GeIOdNpbtcY z7WaW@&>}t%4O-j>qCpG$Ks0EPABYAm<^$27MSdU}w7?HUgBJUNXwafQ5Di-F2ckg> z{XjHm(I1EgE$#!+phbTm8noaKM1vOpfoRYoKM)OC{0E{z3;#egXb~WY1}*jj(V#_u zAR4p)5JZC(1A=JKqCXG~S_}xHK??yvG-y#Ehz2eG1JR&Gfgl>RAP_`@76*c8&>}z( z4O$!sqCpD-K{RNQAczJn1_aTdMS>t2v_KF#M1vL&f@shpK@bgEJP4ve3kN|oXb~ZZ1}zo@(V#_yAR4rQ5JZC( z6M|^aqCpT1T1*I{K??~%G-y#Fhz2bl1ks>Hg&-QVpb$iZ78inO&>}(*4O(0XqCpD_ zK{RNQA&3SoCIr!-MTQ_6w7?KVgBBZtXwafU5Di*v2%G-#0`hz2c2 z1ks>HiXa-aKoLZP7Au129;o@C#fl(4XrUsA1}$0y(G#HZphb%yK4`%rhz2cQ1kqEV z@}R|wAUsR zphb-!K4?KBhz2cg1kp>N@}R|yAUHjvyMe_z^^d7CwS#&>~0>4O;97 zqCtxwK{RLqB!~trh6K@|MUNmFv=|aZgBC)9Xwafa5Di-V2%Hk{}wicoIZ|7EXd_&>~6@4O%P-qCtx&K{RLq zC5Q$srUcQTMUx;Jw3re^gBDVPXwafc5Di*938F!ZDnT@8K_!R=Ev^L7phc7*8nn0) zM1vMqf@shpOArlOObMbvi!4DjXn`e&1}(M((V#_@AR4sT5=4U*T7qcMqDv4BT3iXD zL5nUyG-$ykhz2db1ks>HmLM9m_!2~e7G8pA&>~C_4O(moqCtx=K{RLqCWr?RoNE1YZ7HEQKZm2n+MVTNzXt5@U1})SC(V#_}AR4qd6GVd+ZGvdff=v(& zTD%FOL5nm&G-&ZAhz2d(1ks>HoFE#sSQA8p7IA`T&;m{n4O+|zqCtx`K{RMFCx`|u z6MV%lTw0ILlgBEpyXwZUA5Di+~38F!ZI6*XMaVLldE$jr*phcb_8nl=bM1vN2 zf@shJPY?}S>_)TKoy3L5n;= zG-&ZBhz2eE1ks>HpdcEw*b_v97J-6j&;n2p4O$EeqCty3K{RMFD2N6v1O?HcMWG-X zwD=Q5gBFE?XwZUC5Di)!3Zg-aKtVKUaVUreEer+Gphcn}8nhS`M1vNIf@shJQ4kGU zEDEAQi$Xy(Xt5}W1}zi?(V#`6AR4qd6hwm-je=;96+T09D(L5oB|G-&ZChz2bj z1<{~Iq#zo!SQJEq7LkHz&;n8r4O&bJqCtyBK{RMFDToFwBn8o+MWrAbw0IOmgBF#7 zXwZUE5Di*f3Zg-aNI^7caVdxfEi47mphc!28nl=cM1vNYf@shJQxFYWYzm@5i%LN> zXt61X1}!uN(V#`AAR4r|6hwm-oq}l4f>RI;T6_wkL5oa5G-&ZDhz2b@1<{~Is301& z*c3#A7NLUZDrmj~Ek*_LL5og7G-xp@hz2c01<{~IsURA(_!LBg7Nvq{(1KJD4O*NE zqCtyLK{RM_Du@OxOa;-PMXDegv=|jcgBGcRXwU*x5Di+a3Zg-aQb9Cmu_}lLEmQ^3 zphc@78nieSM1vNsf@si!RS*qYyb7X0i&Q~0Xz?nD1}$6#(V#`FAR4q-6-0v;v4UvO z0#*S(BfAR4O$cnqCpE{K{RM_EQkgzf(6l_#jzk7v@jM#gBHnx zXwYI<5Di)+3!*^_WI;4&u`GxNEs6!vpvAHv8njRrM1vO1f@sjG-xp`hz2d11<|0zv>+O^ zkQPLP7S)1i(BfGT4O&zSqCpF4K{RM_ErXwYI>5Di*n z3!*^_Y(X?=u`P%OEvg04pvATz8nn~8nh@EM1vOJ zf@tufTu}WFo$v=O&IO5s7U6=@`7m4qFxXUTD%LQL5q4pG-yFD zhz2e01<{~IydWC1xEDl&7WRT@&>~+D4O+|#qCty%K{RNAFNg*$_650)uGKqF@jWTKo&5L5qSxG-yFEhz2bV2GO8J zz#tm5I2c5O76yZ8&>~?F4O$EgqCty5`$>aqGAvYT09J*L5qq(G-yFFhz2b#2GO8J#2^~9xEMr( z78ZkO&>~|H4O&bLqCty{K{RNAF^C2&HU`n4Ma3W*wAdI#gBBWtXwaf#5Di*f45C4c zjzKhN!7+#iEj|X(phdXwV{N5Di+a45C4cm_amX0W*jOEoKJMphe3d8nl=h zM1vMGgJ{sAW)KZpybPj2i<&_+XhAcG1}$y|(V#`lAR4r|8AO8?HiKx;B4-c{TFeZh zL5rM0G-!b{hz2co2GO8J%^(`I*cn8F7CM7y(4uD$4O-j`qCtzEK{RN=Gl&K)eg@H? zMb01^wD=iBgBCu6XwV{P5Di-F45C4cpg}Zf0W^pPErtfspheFh8nhT1M1vMWgJ{sA zXb=rr{0yQ&i=sg^XhAfH1}%;T(V#`pAR4qd8bpH@MuTY3B54o}S_}=ML5rk8G-!b| zhz2c|2GO8J(I6VMSQ8T*o(9pNMbaP|w0Igs zgBDJMXwV{R5Di)^4WdDds6jMn0X2vQEv5$1pheRl8nl=iM1vMmgJ{sAY7h-tJPo2j zi>g61XhAiI1}&}z(V#`tAR4r|8bpH@R)c8JB5M#0T1*Y1L5r+GG-!b}hz2dT2GO8J z)gT(Q*cwEG7FvU7(4uP)4O(0cqCtzUK{RN=HHZc+z6Q~tMb;o1wD=lCgBD(cXwV{T z5Di*v4WdDdut79v0XB#REyf1Xphedp8nhT2M1vM$gJ{sAY!D4vd<~+(i?TuWKXjoV zXmK`39JB}ITuE1>GPTw745YgBEdv zXwc$r5Di+`4WdDdyg@W*F*k??E%FA@patF_8noCOM1vM}gJ{rVZx9Vy=nbMli@rfL zXmK})1}*vq(Vzw2AR4sz8$^Q^d4p)s;%^WQTKEm3L5sjaG-$Cmhz2bJ2hpGf;2;{b z7#u`{7JY+g&|+{94O$2eqCtzoK{RObH;4u;3J1}k1>qnXv^X3@gBF2# z8nl=kM1vNRgJ{sAau5w#JPx8ki^@SXXhAuM1}!cJ(V#`-AR4r|97KZ_mV;=}B6AQ8 zT1*b2L5s{mG-!c2hz2b-2hpHK$j2k}9R(?K+75ju!&h022#ri1vPMd~0Lv=|*kgBGcS zXwU+65Di+a4x&Me(m^z6u{wwbEmQ~5phfE-8nieaM1vNsgJ{r#br20&ybhv4i_}3h zXz@CT1}$6%(V#`_AR4q-9pn$tB6biBTEGsXL5tZzG-%N}hz2cY2hpH~>>wJns2xOu z7O#V7(4uw_4O-9+qCtz>K{RL)JBS7?ZU@nzh3z03w8$MqgBG)cXwV{e5Di-34x&Me z-9a>HQ9FnREp`XdpoQ)r8noygM1vN$gJ{sAcMuI)@D8Fui{C*sXpuXJ1}%OE(V&Iz zAR4p?9z=r{yMt)ZB6tuDS^y8CL5tx*G-%N~hz2c&2hpH~@E{trC>}(E7QcgN(4u${ z4O$QnqCtz}K{RL)JctG@jt9}8h4CO7v`8LAgBHVsXwV{g5Di)&528Vf ze!js6x_%xyZ9|k=XxE)6wczGB0|QZN!C8_>wa|6@M41a++fS5Q==y)6)I#?N5TzEn zkANt((7gsksfBKyAWAKC&jL|uq5B$$QVZStK$KeO{s^MfLibP*r53u+f+)4ny%)k61GHN@`WBd8X-_o{&ybD{gQh;lD<4;NA40Nv+BRQN*of)N#O(EVZ! zf2R?Ij!+(EV!-{1v z3*9S6R5(EQ(-9TEwx9+kk?k|+zC5gP{N`UhXuDnmtL7f?wjK}%lrON=Z~gBeYIFYX z0dM_*1u9JK|NkKQ273_QuoA>(XjqgG1l}G5-2(`B14s?1j|HON|EmL8+n`~w6|5F? za5yeEgq*JhtKGbU6};UDx|a~ExeeMiV71Z}24J<&{f2P0Ap2psKdK6>mg8Y4SS@r< zB388tdn>?dy;X|9YN7iUv8r`hUJh29y`~YY7P_|)t`_8fkQ+esE4Om{cg-#0Uz%I? zyiE=M=?rderVab1Ldr>e@dn+C+92Kq zDJSu%h3;2vU|R?&C-JF;?rCj^p9(1_@u`LGdu^E904XQ&sfF&1CCXgr{#l~j3*BQ& zR5(EQ;Sv?T(7n1u#T#@#FI+7sufZ@VAG6JE5zk%IxUc1%X%BSIFIKgn^5Nsd7I9Gd zAf;^D1Kk&lRV}F8>9%PVXMY&FPxFUy4|MM^R<(`VHTHa6t>SVO2K&O-81+E+7h_cm zDkoR0XcY&QlV#H^d!T!e;cAiN7*zg(%+=y)4|Gp7R<$6r zLG=S{yac*$x?$BnWpKFzkw-b30N$R2?yYVpd23HlEp-2N!#%4Qf@-0Av>V=ks>V>e zz8F#$YJX}4*Kg2$+zoP{+c4CE;tk}tt4*Jt#Rt+8TP6@4#^Z-3#AfVkZMO7dc<>?S-gaCvY097P?;^Ynn8)fyA+e z(LAtP=$?AGT4Zy-E`+FE5)}w~#Q5P3*`d+@E^ z{>e3~jr=e5w!GWgu?KWkz{5nnefO&b90Y>%jFHv8Pph|or*FS$bDQ3l@F(4SLFWnZ z&pNp8vJ0!jI&T&eWVO|IYwRP!Z*6*UN@vUFL-PATXATIZsO^7b`qo}5JsCx^DKy0{N?cEJ?( zMf-OhUS)4lco#+OOYI1IqwL+AUu_rOQl!MWA9TKf)a4`lzvTDYm)EnIGBPySgD}Y5 zryjW4U;24>^8s`AE$!J#`$1|<^#n}X5~2!qtm_t3TXIl{1I&80V+c?)dzgD!fRYx#9QkEf@7 z(j;{hbJJwC?5FQ!+H#SFebZuJ`~9H9T&8t1FeDb`>J??CXOu8l-Ke+!w42-EblIy- zN(_*eJIEI4^DS2YSWWHSkGEJ|U^cZMJ<$cy-GYudfv;%-i9kn+z}Gc__|Op^@O4cf zK6GRTd~Fkm4;@hfU)u!YLq|fu*EfOq&=Cyq^-Ul?bmRekm=1Kr0DO%TNFLhL2Vds| z;zN7r;Om?~d}z-ae616R5A6|yuXO_Pp*>mf^-dr@vo!?nW#Fr!KzwLx3VcNrh!1TAfv<=H@u963@KsSDKD5;VzA6gDhqe~L zS4M&O&{`gRWfX`Ht)0PFM}hdzS`~bC6o?P44Z&APf%wo`419$Yh!3rOz*k9u_|RGd ze3cZ44=wG%S4x5Spi&w{gGyi!4JuthG^peR(V$WhM1x8^5DhBLKs2bN0@0vS2t<#b z=mH7_2Jm%NAlB%KE}&3=Tzds#jh^TN3I)iuSs>Qvi7uc}fLy-?VvU~Y0tyAl^<5y= z=!q_%P=H(m24an#=mH7_$Teah*64{YpiqEZM+Rbzp6CJ!1;}+~AlB%KE}&3=T#E)` zjh^TN3I)iuY9Q9=i7uc}fLzZ8VvU~Y0tyAl^==^6=!q_%P=H($2V#w$=mH7_$Tf2y z*64{YpiqEZR|jH^p6CJ!1;}-GAlB%KE}&3=T$=}Cjh^TN3I)iudmz^6i7uc}fLz}P zVvU~Y0tyAl^?xAN=!q_%P=H(`2x5(%=mH7_$Tfr@*64{YpiqEZX9!}Aj1yfN>>($* zG}uE{4L!5(s=OM^Y+M3)A8$cZiu_K*`@8tfq_x-{5BPIPIohn(or zU=KObrNJI@qDzB4*1}27AbfE)DjhC%S-ADdgHk5Nq^A7f>ibu5SdfM#hOQ4fc=|T^j5mC%QD)Lr!#Q zu!o%J(qIoc(WSv2a-vIvJ>*1}27AbfE)DjO6I~kYAt$;t*h5ZqX|RW!=+a;hInkxT z9&(~fgFWO#mj-*ti7pNHkP}@R>>($*G}uE{4L!5(s=OM^Y+M3)Bp z;c=o1d0=Zri#D|>d0=Z@q#D|>d0=Z@q#D|>d0=aGy#D|>d z0=aGy#D|>d0=ae)#D|>d0=ae)#D|>d0=a$?#D|>d!T`R062ym`=mNQh62u=p(FGI= zkZUYKtkDx)K%oG+4im&087I0l*h5ZqX|RW!=+a;hInkxT9&(~fgZ)?VR__LT$cZiu z_K*`@8tfq_x-{5BPIPIohn(orU=KObrNJI@qDzB4C_t_e1+fO^L>I_4qagbsC%Qnc8wK$p zC%Qnc8wK$pC%Qnc9R=|rC%Qnc9R=|rC%Qnc9|iFtC%Qnc9|iFtC%QncAqDXvC%Qnc zAqDXvC%QncBL(pxC%Q0zuOkKVAt$;(t|bNWhsTL74fc=|T^j5mC%QD)Lr!#Qu!o%J z(qIoc(WSv2a-vIvJ>*1}27AbfE)DjO6I~kYAt$;t*h5ZqX|RW!=+a;hInkxT9&(~f zgFWO#mj-*ti7pNHkP}@R>>($*G}uE{4L!5(s=OM^Y+M3)Bp;dY`6 zX#M<0EbHfG&bRFP&uY5g<9N%ii_E6r1M$(-{`+4K-YI+QT+1$QHq-qg6E^MI&1?!j zJQtT*#&a#Z)Ywe-b63dkE?_nVAGC+A7PeDh`I(koW^AVW8%tVtKVmWkM?mcm`W!FDe)BT(&uXk56n(hak=z^{m=7yBg{9PwlP4{2z z=H9b|!E`_9L>F9YF9#X!s$n(Ve|xF&o}>Rw_JdAz!KGHwfMJ(7tLgsp@2&P6`Dd~p zbfOC`wX^$0cP(Qv-9Pi9@18e*P4XI+u7=h1(Y{h$+Fkku+e_i2FKkSx64TJXP#z2D9ln_CQ~_Mj78kkx|rbb!(s z$PG@>udSp0nb_Yv9cA-`!PH)mfdRb#16%sNsll_y(baVS;givO&hIeU4?58W-CU6U zAagTJRc-Qk&Fodz#@Wn%YitiX(FI*C%ng4h+1l*mF}FWAC&5Pdg^@kzL>F9Y6D$L5 z7GE;AmoJaAnJaB%4?58WT`kNFx}|Y8J0&da6W@i|?7w7a4?58WSuH5cU~XW|PqmS~ zWNtsz-OEN=#>gIYq6@NGRJ(FI*C%nkeRCfdB>FtcCB ztYjno$=Durq6;pyHNRqPltk-gy+JjDX zL01bh6NJ@7l5G}$GqGo!;bi@p)6^bxq6@NGkb6PuK=|3SM4Qv!Ozc%;-&(10nc9O+ zbU{`Nasx;mDDB+b9%ZBY-NfGJT8mXNm#IBye+{x)WOE&5oo&2-nAjiNHs9(ym#IDI zL>FYW$mRwK3)_7CX<~mq*53L8x2Zj7pANEGkh!4r0CGo7!3JxdKPL9Uzt>n>aGTnL zPIN(5i)`-WDGJt;{+igI-1@}&G^eROXul7-T9Cg$SgxYQ>is_x`!6N0tvfhO?LjBH zpsNMh55n1YODx+NOzqjDE?XC}o7#i+4I!%qxfi4kWbWRzM|LJLncACw+GwrDW@-;Q z(FIv8%)KD>n?C66(qJ*Q7dY2u{gK7g9<=`mT`epe4%nw#7O}H#AUB}bZ=iilAhp=`l6`b+w9)--V!tXVaZk=K6MN8!F34&@egl~aGTXc~-ZsC+ z#D1N2_+F1@6MN8pD3IFE&^lJ0p~0RBdh7Tn#w)g}!p8RN9-rS^t88o!I?)BB7FM3g zGBnt;K-IE_3D|k27}_g&^X>ayZDt`vcyK>^rYwxF58C4Wt(4H<((Gx&OCH+cBIn z*srilcHhHQ2KzxLx`5Qe%tcNQ%)ESdLM?{-GlT{9tw}Q6584L@QVa7ND4j7w>)HF7 z=WHF#jQ1aRytH?gfbo9Ni7v=$L16~k^$Bu=`uady>6s?`Pkf5pd%D<8_+1F41i4W`l)an3 z_qy0{7@O=*bpNxv>x}7s(D5T6wI6nKJ1{Uj0ILO=33Bt7ZK1ZGnhp2w`Sg5G(iQXl zp#6Q8aB~?pgTeun-#}%=AC+&mCE_~!ua-6L-QsVxA9SJ%%)JZ@44b7G8tmDjX*hUd zq@C~`rTr#ZkM`;vvfdBcCkRptaRUQ`5JQ7KA2cruEL&t(-5|PuR*}ZOr(IV2K_|L^ z)I$8mu$hyg!5*X@l$Uueuh~s#WZl2nKXxCdn%REPenW)XhRq-~641PCcjLcZ+3wf- z7X57A_x+ase$a_7Ahn=42K5C&{ugIxu;*ZCu>WGnXU}r^(!Sf%ChZG4tGOSvZxIn@ z44Xk}LFRHXG}wC>irFV7AKn*mY}UTcRjT_zC%Pb+yBQQ#AagG`+sC)663))9XtXj}sOORS(+yFY!1*Dc3H-PqRg47aY zt{=4RNsPImy`La+iBStW(S=yGpgp9-ss)|sLabWQUR01;V!{D*q6X$7ez z#$3>eF2t$@?TsZ?E$BoSkXmBg3)*7~QcH|`K_|L^)DmMZXs<4@YC$KufYid=0L#aq zyjg81X0MZWcwgJGS^KJ2s_qBv`30#3xxx8!j|5CDsC-yq#ApBe?xlTGr%&3ab5e6Z z=tLKoT2R>sDtAD6o{gcwe)X;YcH);`?|bp9dEe`c`ujn9he2ft$PEi;_Dg`u5D{qG zmm6%CEHE4?58WWG=`JAot2c%>>m0OVqyE zJ}}bRf26!|Z=jjge$ZZKkb6OHK&~%9=5p-_wf#2JaQ}<1&-Y00H{TCB(FLRyV(y1c zpt=xLrh&{AKICF^$KGVWjrE`17x$a)2knW5xdHvW0rdI}bfODLEhsJssRiw=CRQ!z zL>FS!g7#>G{00dJhRxXOV^8S#4(LP|n7IrL4d6N!6kZ@Ki#8Sn+UrfMTF{9u#Ht1D z87EdP=tLKgT2Q-$kb6OU&p~P-ag5(@pc7p{YC-Wv$Xw7Kc92?#x!A)OHhu;=(FLTI z825tq!h_U8+<@O)(1|XfIEJ}F8QSIprC;w6 z1L&*(P?#aB1=$b6{7|)aP_>}*1aO)A=p1B>R1m5bbmo8s+Ib`(GeOt}YVNjUknvQ| zxdb+7YC&!VVVJo&P;)_N7oeL9E2E}C&4sB2oo|3{E=VoNTy(#I&Oks92aq}tmWG<^ z0(ArEoCJ_s^tb@2g@rFH%s^);fYgH0`USLeSyZ9s!rTiw(dCFM14B}NIYaHX$n656 zC+v4m>fHwlGZ@zGsJH(yxqNS8>;CQUv=5u2p5+2Mu?Ex{2KB2UG~`5aP~REChnxi7 zU=JD-2AK&O?*-AIv0M-h8m9%(pfOkw4H{ns(V($Y5Dgj^1<{}}PY?|n&jit+u}TmP z8ixeYpfN@e4H`cL(V($G5Dgml1JR%{JrE5VuLIGbu{aP78fOF1pfNNM4H_Q<(V(#} z5DgmF0@0u`D-aDDj{?!4u_h1=8b<=rpfMs44I2Le(V(#%5Dgl)0nwl_84wK`ZvoMu zu@n#u8YcnKpfL~-4I1A7(V(#l5Dgla0MVc^2M`S!PXN)Nu>uec8V3N;pgul`2KC=T zG^lS5qCx#`5Dn^6gJ@8H8AOBn!XO&d&jrz-J}ig^^-n=GsP74)LH$Y)4eB$3Xi$F; zM1%TzAR5$<1JR&98i)qJx!zP=5zRgZeTc8q`k#(V#vEhz9j9 zKs2cD0HQ(t0uT*q^MhzmdmcoC+Ug)0)D8#Hpf)y$2DP6-G^lM1qCxFm5DjY6f@n~C z6-0yDq97X7&IHk*HYA7!wGTlwsO<-$LG3ya4QjK2Xi$3$M1$H|AR5$;0@0v05{L%1 ze?T;-Z3Ch~?G_LXYLkFyPIZWfX`8l|LXFa+XVjeJiLKU}&&!gVOC# zx&umgLg_9j-3_ICpmZ;k?t{|(PFH2<29%x&rDs9u z*-&~8l%5Nv=RxWDPhw@iI>6K7=6_j2LrPn~| zwNQE;lwJ>|H$dr)P77t|7nBAc=f==r4?Y5pp}`(} zY#c*_J@{xmh6elnP<02O^g$?n2udG@(np~5Q7C;3N*{;Pkh5GG>`y}Zr=av{D18P> zpM}!rp!9hteE~{egwmIw^kpc01xjCq($}E$btruUO5cRix1jWGD18S?--Ximp!9tx z{Qycogwl_o^kXRf1WG@J($Apub13}+O235Ckh5GG>|aCqZ=m#BDE$sfzlYKvp!7#5 z{Rv8chSFc4^j9eT4N8B9(m$Z|PbmEhO8=~gn6O?9# z(kxJ#6-u)~X?7^h0i`*iG#8ZShSHF;TpH|op?p3l%@3soptK;A7J|~kP+9~^i$ZBJ zC@l`9C7`q;u=!=Q9Hl#YPXkx)7cN=HNK7$_YJrQ@JJabUKvIfYO;zItxl?L+KnSoeQP&pmaWzE`ZX7P#SWUOM`telwSg+OQCcb zlrD$T6;QeoN>@SYYA9U;rE8&d9h9zz(hX3$5lS~f>1HV10;OA_bQ_dzhteHTx)Vxw zLFsNN-2!XV?uXJ7p!7s2Jqb!rhSHF;TpH}BLiy96^mHga14_??(zBrSY$!bk zO3#JT^Pu#6D7^qmFND&Ip!8xWy#z`xh0@EQ^l~V@0!puh(yO5KYAC%1O0R{|>!9>{ zD7^tnZ-mmDp!8-ay#-2dh0>6-TpH}RL-{+P^iC+f3rg>X(tDuvUMRf}O7Dl#2cYyp zD18V@ABNILp!88FeGEz;htemY^hqdv3QC`b(r2LbStxxDN}q?)7ohY-D18Y^Uxw0G zp!8KJeGN)qhtiOn21>t$((j=3dno+@N`HjXpP=+-DE$RWe}&TDp!9br{R2w> zgwl|+TpH|uL-~K8^j|3b4@&=s(hN+XhCqWoBa~)>(#%kr1xm9*X*MX$4y8GuG$)ki zg3{bjng>erLTNrI%@3soptK;A7J|~kP+9~^i$ZBJC@l`9C7`q=Z zER-(?rRAZt0+d#S(n?TT8A_`_X;mn#2Bp=Zv<8&cgwk42S{q91Kxthltp}y`p|k;% zHiXhfP}&$un?Pw(C~XF%&7rgfl(vM@R#4g+O4~qbTPO`V%ca5I9?Exs(vDEt2}(Od zX%{H%3Z>nkv^$jcfYP2&+6zj1Lunr;u=!=Q9H zl#YPXkx)7cN=HNK7$_YJrQ@J0~IK0;N--bQ+XShte5PIulA~ zLFsHLodczFp>!UU&WF+kP`VIG7eVP_C|v@jOQCcblrD$T6;QeoN>@SYYA9U;rE8&d z9h9zz(hX3$5lTbOa%r${hVomWbSso@gVOC#x&umgLg_9j-3_ICpmZ;k?t{|(PFH2<29%x&rDs9u*-&~8l%5Nv=RxWDPE%#*1(aS1rB^}e)lhm3lwJ#^*Fov^PFrQ@2bA6krFTK;-B5ZDl->)a_d#j!Vq}H}`vXw^K`4C)N*{*ON1*gkC=EHwrNRC< zlz#$BpM=tZ7!zlPFp zp!8cP{SHdMhteOQ^hYTD2}*y4(qEwTS1A1rN`HsaKcMtaDE$jc|Ax|kp!8oT{SQk2 zhtdq-f&K=2Mkvh$rJ12L3zTMs(ri$g9ZGXRX-+5&Im@NNo*T;NfzrHCnh#3zLummh zEeNHBptLZQ7J<^DP+AO1i$iG%C@l%4rJ%Gll$L?gvQSzMO3OoO1t_furInzxGL%+< z(yCBe4N9v+X$>f?38l55v^JE6oaNGBuM6etL1}#`Z2+YWp|lZ{HiptBP}&qqn?Y%F zC~X0yEupj(l(vS_Hc;9YO4~tcdnoMyr5&NP6O?v_(k@Wi6-v87X?G~?0i`{mv=@~2 zhSEMz+80Vg&T?t6_lNQWpmZRV4uaCbP&x!kheGKvC>;)^BcOC7l#YVZ(NH=DO2EEfg_$XPB745Mec zfW{9-&vMZO@3m)O(1Oz1Pq3xiBz5&T?U3 zfSl#RzyLYRg@FNbmJ0&| zEEfg_$XPB745MecK+>xwWPv2Z=vgk1@bHF)$LLuuknqTbhDRQh&WF+kP`VIGkDlcM z39re}@E93qxiBz5&T?U3fSl#RzyLYRg@FNbmJ0&|EEfg_$XPB743M*27#N1zSuWMvBDeDqv3?#jeEw%^9v`!IOucFyL=?VMQD>UGrH|DIgF7o?V3@31MTx|di6al;-Q=0>&d-(IAB z*c6mSLKa7EXA?bPzjIRWKF~e_5C*N=1+Dl0Ik|jqcI*D_xw?leGL((Am;9Zss-5(QV&uK z+Ivyhx_`Tw%3)K`-iL%k5WgYs(*T7p%)KqG`?s?z95w~*k5JeQ2{UZr01C6t*8SV3 zi61rv@1fWdxm^fP`USZm*6^??c%KDQ_=4OC!XP)p+_0x*|8@!0!=~W97;7T8bBms^ z$CV!BTlQ~{(K&1i-mkGEayysk344%xL4Jbmoq?IF*0O*51H;3npgkQ2RzTbf%0n>w zVQ%;{xqPot^ZxCtwGW$u_kC=EgxMja@P(-brH6kl`?tsH9ySH-4FQ=8%Eur#fYgB8 z0ir>10a7d4x_|o}-NUBf{UgU9?nO>JAoVc!?r+(@UBT$EDR_^`rpWDr(EJ864~9YJ zg5o%^b^mr*!^5VaeJBSuLEO84Qtv)wzrobTw(j44Q1!4WXs=4c0Z2H2@-a*;h=#c# zu66(RT?&UyLHk)Y?1SXvEok8YGuO3s|MoEb!=|7;FBc|5(l01Yg3JTC7es^9g3@nI z>;COY5{FGe`(ifijoi+ICGCLR07_@ct^2n(svI^2?VVZB4G9OB-#})9%m$eY3J1s5 z{o4zb4x57Z*K9ZlaW5#2L26(aWG*OvUTCuqkLSkHJ<*9)h_66u%%0QVTLS zwRQjYU)qOFLHm6ktc9cpkhvi9U>M{EP&k0hjn+JD3fdD?Z~&4oK=~MC-e2hXSTJ)z z<<2~(!=|8pLj`Lg) zF;mdqt3SL^;Bpccz92I}7-TNUZ_KUxw?EZBWD44!^~4F1k6~^AnF~@2Gnb`f|Mshr zhfP6yxL(YN0+*AZv;&J{kb020Aom8h?cW~y`=BXkpI6VW$nC;7>MW2Oj9T_@XO22- z3fc=sY`lT?i?Jj}ZWlqy#~}NW-3zJ%Wab|-1??&O(h?1B?|{M#qy~mTe)~STe6LmW z{_U@8kC=k?ovGZ80hbTxbvH;YD4jL7?cbgmchD5HH_c`OBz$3M9Tpa_aOiH`zunIF zh$(3Q+Lncoya@_3kXvCGW^Pl*{_R07`%FQ5+&WYvz-|Dg9gtf=YC$wiZDRZW?Yhbb zO+owM4rE7z;{p_KFm=dk8C&;nzu$bs6tq{aAqQeEt~|7~W&ie8^TVc~{d5VHki2;S z+SY)X4Rgcw*8SVtZyz!R?YSd1-oX3vRzT7jEKP#U1!0i6ptNJ&x_|pE@583xy?X^w z;Cum73-T8TgVciJBBf>jc3%F&rr`a35#ivrCrB;GJW##_l~bU&0F}QQt^2oUq#QK` z?*VKG0jmXt8OS^k2I+yBTiCXL`}eRzrr>>o3!=gK4OuNnJ;+>;dzZKE-_Ez}h$(n4 zVM8c5-azRAqy~mTYC&mzY2*IwUwsalg7+I1#KF@fEZu5_ zBjUm4g2D`BHw=T^0197FebG>R*c80~5vmsE23%@AL0wy@T0-W6_fZn57QELIsun$b z(cKH)j~S6pl;6O6Hi7@ z;X>6C3SaPEU8q_@X$QQY*T5fK?!f8`PwFV1;;anF@+yY-*Qx?%)15<&Y_O@9={du({}dgSkPq zdH?ojfk#Zi`->OEg53+sn;>&x7^D_d?mTVYzrCyXuqk*CazZS)`~{U!pmGf4RuG1{ z*Su^0_5iWNrr>?bJHo*E7}lSMsRyYArAf8+{oDU09x?^*W!8uSyBFj)ka-}rAPiCq z3bWR>{oBp&9Wn*)cb<%B_kqe&5C*9Qxfi4s)b?zXIcy5r6HRRW2HH1WN95QFXm525 zR4uOb0BVDS&M^S(zXq8L>ht0%e_?7td$a`~Lh4xLc!T*36c>Go`?uGK9X18+BOh1t{%+%!6TAIDpiC)IMwqI&+{3dL9XAoB*Z{ zM1#!z0zHoeWG?7jf-Y#D$2P73Q~O%`uqo*5f)1!!P`rW6gM}N&4WPUU8c+SAeb^Lq zz5&Q@pmADk=7QoFopTTk>Ue`_P^TJ1 zgF4J08q^sE(V&hlhz50HK{Tj?3Zg-sPY@02Sb}J9r;&ky0o);EU|;|x6p%Q$BgeqN z0PdtQFff2SU%fP?@Zqza`Fn}AZ3=9n5#wY^=1Gu5dz`y`*L^3cifE$Pm3=H7L9|Hpe zxM9b@zyNNvF)%QI8)OU&4B*BV0|NuNA;rMJ0B$5PFff1{Knx5F;2g!kzyNBvfWisX zC;`!+1_y`+H6}nbsG$I&L5%u1z(6#pasttyiU&l4Dish7sxUw_s4@W2pn@Jmg9>pF4Jx2PG^p?e(V&7AM1u-V z5Dh92K{Tka1JR&@3`BzpDG&`RfIu|lFc$^}$YCxF43NWI7#JXjxiBz54s&5(fE?z+ zzyLYSg@FNbmFc$^}$YCxF43NWI7#JXjxiBz5 z4s&5(fE?z+zyLYSg@FNbmFc$^}$YCxF43NWI7#JXjxiBz54s&5(fE?z+ zzyLYSg@FNbmFc$^}$YCxF43NWI7#JXjxiBz5 z4s&5(fE?z+zyLYSg@FNbm2Jc=I{~1LQCl1_sDsE({Ei!(12`AcwgyFhCA- zVPJq9=EA@LIn0HD0dklN0|VqR7X}8%VJ-{|ki%RU7$AqaFfc$4b75eB9OlBn06ENs zfdO)u3j+h>Fc$^}$YCxF43NWI7#JXjxiBz54s&5(fE?z+zyLYSg@FNbmFc$`fZm7Q@hq*8?Kn`Fc$^}$YCxF43NWI7#JXjxiBz54s&5(fE?z+zyLYS zg@FNbmFc$^}$YCxF43NWI7#JXjxiBz54s&5(fE?z+zyLYSg@FNbmFc$^}$YCxF43NWI7#JXjxiBz54s&5(fE?z+zyLYSg@FNbmFc$^}$YCxF43NWI7#JXjxiBz5 z4s&5(fE?z+zyLYSg@FNbmFc$^}$YCxF43NWI7#JXjxiBz54s&5( zfE?z+zyLYSg@FNbmQD0XfWtfdO)u3j+h>Fc$^}$YCxF43NWI7#JXjxiBz54s&5(fE?z+ zzyLYSg@FNbmFc$^} z$YCxF43NWI7#J2n^)H0dki%RU7$AqaFfc$4b75eB9OlBn06ENsfdO)u3j+h>Fc$^} z$YCxF43NWI7#JXjxiBz54s&5(fE?z+zyLYSg@FNbmFc$^}$YCxF43NWI7#JXjxiBz54s&5(fE?z+zyLYSg@FNbm%!Ppga+nJP1LQCl1_sDsE({Ei!(12` zAcwgyFhCA-VPJq9=EA@L-VwmSzyLYSg@FNbm zFc$^}$YCxF43NWI7#JXjxiBzFc$^}$YCxF43NWI7#JXjxiBz54s&5(fE?z+zyLYSg@FNbm2px}Je0lwrAH5QfyBcnXn1^v z(qEwTS1A1rN`HsaKcMtaDE$jc|Ax|kp!8oT{SQk2htjYKen#j-KNFN@hSDrhniWd3 zL1}g<%>ku3p)?ni=7!QdP?{G?^Fe8TC@lb`1);PMlop24B2ZcsN{c~haVRYTr6r-X z6qJ^R(lSt57D~%OX?ZBE0Hqb7v=Wq7hSDlfS`|vGL1}d;tpTM+4|9Q}-=TS!OM`tP zI3649lc01mlum)tsZcr%N~c5V3@DumrL&-PHk8hR(z#GN4@&1l=>jNS2&IdlbTO1J zfzqW=x(rH}L+J`I&A?CzrK_NHHI%M_(zQ^!4ocTU=>{l0u!p%c*iQtzqrrX>l%5Qw zr$FhcPA6sP9+aLBr58Zyg;07Cl!hGU(qIoc%%#B| za+phlJ>)Q#27Ab1E)Djhhq*xV{Yh}RF)*Bh(x;*H87O@gN}q$$=b`ikD18x1UxL!3 zhq*w)b!Z&s(qPXCULe?D&jqEqp)?Pa=7rLHP?{e~3qWZ>C@ln~g`u?43w6I(sEE*9!e{KX$A&GD6Isgm7%l>lvah(YEW7oN^3yr(ZgII z>D3Dw9;6-S(qJD5*4JPk1f_$abO@9Vh0zzCj)l^3P&yt; zCqU^$D4hhQlc979lum`xX;3;HN@sv+28K*1odu<{p>z(E9zDzjl0N#N;n5GJCqU_m zPHk5%oD|Mj5d)nK*9>uX^{vT(JaO%fms zGP4Ou?KinPYiRQatJ+C_5$382^V&eY09Ok#4~8%OK&Vw~DzbsD+sCRl;{!si{MJo2 zps)aW9u^KDw}LRp>?2PQYTv89v4O7t$7=3{>j77P^lB zt`=lJ2!q@Za|EH*aI2mzbguziEl3RvFE|KMdp+*tM*CGpw$S|uSk;CfhNzW@Ke_RP zv4Jgg&jMDpwI?8I@5P_o_^nsN7P_witJ)nG>g`vEGc0CHJh^dFzqBoM?*mq~+_xd- z8YG?E$kNMc3*8@qRqe;85ViM`PHxQk|I7xuhXSq^6kZ?<3X2=>A!?5&o!mI-?N%G` zVJ@KMU(mD;QU}5ywSC{~?JZdvlqL}V z9Z(_yO*=u$9f-X!GeI=M4bVMPM7bBbud0EW2y>x(uZS`ix<893bD?{G{07~ZhgI#He~`L+x%wWkQ$dYOP=;i{lGgj*LDY)=-2-+ibblXKbDLH| z)RrX#ft?E70|-|OE1y90`+s#HYa4_twu03{_X#$@+yGJo%F7@+^n5K??TQtwU~fV9 z62i>|se|DL?HaIJfeHh#TIha5tZFAjRe{z1eGm#(3*D25HQo~UR)E#os}zCNLia7g z-3zlHM7u682dhn6(+E}z+1uE_1KCHrfCr=ohTpiA+rMvanf|`H#qND`OBZziBhSq{PJ=be}0vaSYju+CWq|K=-Q>?t3LlEp%@zQEH+4XNhtz zWRERz;Q-x-OH}wm_UaNBZ;<`GFgG-y>Y-=p`sV04u+q8tF|}HYn{GF%GB;M4^uZ}f3ZUkq?~l&g&jHoqF>IawP)yQogVp} z+it_fgI$n4$OpI~`M4X!T>Hy)_PWKb)9?N|Y#Yzauvl~slWC1 zB6C`%8!AcJoM)=&g6@fimVKax9jN_=j1g@)=)P%ao<~)?8#)Fe>q6)rZLD>`-h+_(jbZvpaQ&7Aaw2GXG?qFx3|haf zhSqP;z1~>eV0Q~r7q&*Tfa@0MesH*2)7T38wb(QbMW_s-w> z8SGx@zH+SX5}87X+Ff%Wg4O0j{RWO>1_lOXH}LI+sGTZs8mtz&KOOD{WVH{uAnk{m z?;F5sp?lcj=>b`7OfW?4`o1Y(wa|U;aQ7msT{QusHh*~@SS@rfJXSYU?1!j*xeI)D z9s_j0JlqYSu!7;h`w+El5sYASp?m7Fsx|)vQG14E1vu?M_uXSvJM}k2ZGoj7SS@sK zK3wfzaGGtf2hoaPHba9K!%A>l4!VCI?l+iQLG&l6+NuARgPXI^J^pZWL26JjBELb; z0l;c5L=QqOgIPx*Xp9pgyXCNqSX2Fu@(bYoFN!Uz`dqHO@uroAlhJ^2d z6%ezq`weuM%Sl%ThQy*=y`0pv5{Bq+4f};0c^qzRe6UH70img;IKl+f!JoIX#p>tu zYeu67x_}Z50|Ruxi2*v8!~h*AVt@_;F+c}+7@&hU4A6lY2I!y*19U)z0XkU1038Tn zfDUpnKnE}wpo0?((18aA=%4}vbijZCIvBtJ?dUT=JMj$A4mtz0^UVP5STjI7%?!{E zF$1)-%K*;#3=9n5(t?430bIf`Fff2iFa`!lO)+|)%jkhFkmL_9%^-yt0|T_6VgMCF zASI&*x`0Aq^gx%<16?5LVDvy2NH~lh=mH6c(F0u|;V^oj3nUz}p!s9;Ko>}Oj2`F$ z35U@GT_E8wdY}s=97YdxfrP{8fi9467(LJh5)PvWxagfV)c3nV;7 z4|IWq!{~u7kZ>41&;=3>qX)V`!U48>VDvy2NO+7M=mH6c(F0u|;V^oj3nU!&Ll5*g z0HsF{bb*A+BWQR$hSE=<^iwGP3`#$T(l5YtgZ)b={R&FIhSG1K^jj$X4obg=(jTDo zM<@+B(51m1a-d6tJ>)=_27AbXE)DjO16>;IAqToN*h3C>&rbG}wKoB)fE?(;zyLYWg@FNbpbG;7B)fE?(;zyLYWg@FNbpbG;7#x zAP2fIFhCA;VPJq9=)%ANInafH0dk-V0|Vqh7X}8%fi4UTkON&97$66_Ffc$4bZM|( z2~PhF_N$=uYAC%1O0R{|>!9>{D7^tnZ-mmDp!8-ay#-2dh0@!g^mZt{14{3N(z~Ga zZYaG6O7Dfz`=IoGD187-GcX*4(ubh*VJLkBN*{&N$Ds6aD18D-j~?g(sYhNx!{arS zegmc7Lg{x<`aP8X0Hr@d=}%DlGn5`02f8pYKn`?aV1OLx!oUDI(1n2ka-a(X1LQy# z1_sE1E({Ei16>#xAP2fIFhCA;VPJq9=)%ANInafH0dk-V0|Vqh7X}8%fi4UTkON&9 z7$66_Ffc$4bYWnSg6?vM9O%Np06EZwfdO)$3j+h>Ko%vG~Aq^ zv@?`;fzqx}+6_v(Lun5v?FpsHJJ5xJ0dk-V0|Vqh7X}8%fi4UTkON&97$66_Ffc$4 zbYWnC9O%Np06EZwfdO)$3j+h>KoB)fE?(;zyLYW zg@FNbpbG;7!9>{D7^tpGcas~(wm_4W+**+pbI2@(d$4L(E52n zEbHg%izBxD{9nI+!OE6hf2LmppSzE)7PLtVv{?WAtj3+c|JU!&o9wZRyDA)f7B{+D zkU9{ays~-MkN@@iZ}GMK$~MG zc1Q0n`Cq?3z*y4S>V>sA=s*{AwIKUJc>3?Y-7Np>_y3s}ZGGlZi8<&%7hGz+4L9tr z_*cLGRC<^7gm=@-K?l0vQhV~q_1$~^*6){OSZ;mp;SO`qfiCE3LGA^);Su-W-4FlN z?+=)9*gEje4Rg?eF34&HpnDlWep7tMwMXtx{r*gY2iEIV-VE23of;MY}a>7{;uEO}H1L3q#KzTGo_)$eD%?`p#>(YOP2pbIXw)w|PoKmJ+2Kd>Uq#?S1= zF3^E4=xSkZNUk>Cedl}q{?GPVHovYN-3>a>1z9aDEzlTd>uvph{^e~pzaI7P z0UhXqO)bb=4MA6{-|y=8zggH~!(!XK2Xvqdx>}H#ApA;>)q3XV`u*jU5G_XpW!*|6vw-wis@1((`FmNx5sKkN4=m4?};bhI?x4OEhv0J z=E{BSvj)Z6)myGM0(|;AK?k~^s|C3ggfD&Qvv&PmzyEumxlPP_wVj{?U2v&g_@U4G z;qUtWkDN4ZVm~PD1Rdytt`_75kh!5B`mBrp)bHQ&P0A*&R&gijKo?wUm%s0`{`RMS z|D07kHcw{D?*tv_f=g}tyFTmuzxDeU@BL%lB__QSw7&*jEy#WlUc{1Z&HJx@|3$S2 z)}`}Ac7pcc;8LrxWV_YTfA#z4O*m|=`jTfSXrB%?wV?1_CbDCf*#G+dslS$4{}Eu` z3EInpt`-&!(bn0!8UEMrKakvI-O~Ja2WY}H1LFP{2=-*Z0x5@wd{rmJKt(o|C?Evi?!lo8v_PWZp-5LMu_b(EjViogX)eg|!B3x>F z>tc5=_+P*OjR?#3r7;tCXfQB<_k1DOSunqyY+%}b>wo?JRg*n-*?uwE0otR4%UtyO z4YZF5q!xKE8O+=u!PPeFKGyG_wyD0Vy^&L}7(4HxfTA1HJytX>XrC7@weuzXY`?Cl-#@3WWmi*1s0C;*7)UL$dqL?2gwf*- zv|kLQ7TLWZbs&5mVy^w1x)v*=g`pOpJ!K%Z$nFKH1I5P*sYkYv`E~aHZ#G*+#=o)v z?K?wP3-T98?ZoF=c84-*>^;vmS*5EPT7vebfz%?q0i+fbZmvdwc4uZ**{9uYv`W4f zVF}v522zXcH<;R_MX`2`?<(zGTN4Z1{VHcyK@ay_JS80t#&`n zwFK>h1F1#!8^~OcT7NG?I|rp2`=}L7Ry;)&mY}_I*wli;BH90&t*c6%{pwB4Rvd9D zmZ1G~AhpPD0I36+E7n(Fd#kVBz9X;2N;Fj1613+Iq!!t4AhjTj9&ex>+%ex8_JhGLv%Xxr4-YE#?-2X7M}t|%26UhcLaoDQP`&_} z`}=>reK6lDyCmMi{fj?^?u~7lYy&#b1*8_@1_rQNkhy>U*V}tuzGJtSJ#D`Z&)mH; zDsI?-4s-#jg}8xXGbkT})Pl;?k~1v!jarfW`!=54tGXb3?Mgv{00i&q*ogDD^qOt*9i&lJFe+v3p&sRq!yHRgdBS$U}{0`aN*Ln&-Sz0 zAMsgq-!5@KThM_nAhjUB2@+5XI?x5AmKbwE2f7fe7IdHsNG&mL03GN8QcH{*KnJ>j z)DmMZ=s*{cT4Kxv9q2-=TF`+m#Hs}y=t8Vo(19+*ss$bB0#Zv%IDigx0jVV>96$%U zfYcIWF6clPV%35UbRkwP=s*{cT4LM_I?x5AmKgVf4s-#jCB|IPfiA?V1s&)D%JU#M zAm@2dK9051uvh+JvwvZ$@IL9CUbdhET|jCtG8y z&;{lOkXlfl2jzEAdDb|G-`>qLaKDeupS>*Hy0)MLT|jDKZUCtTnF}f>)6GBHt>sVH zUv7D2Z%(kFE$BcOkXmTDgHleOWZq%-^lk3`Jq3&Q`s})E13J(Jq!ydGom{SsNa8lLHBM^xye?b16@Go zg4~OK-T-?220G9Mq!ttxgw%o#bRkwP=s*`@)q)Om0jY(A1EhWf`3;0Kkj8g@|KGm} zbf61JEy%sF^Z-%^3Wv1Ph%KNooB1nScK!VSe-r3H7h=_d4s;<_E$BcOV%35UbOEUa zwMz)O7j&QtNG&Md2&n}f=mJtpOgMlJbOGfzh`9~mwgxE7KsciiF@E;z|Nl*(16@Go zVs&pJB78w{0XonHq!!`^{P6}l&;_Ix;s!{&1Y|!5qsKAmKo^8sH20Pu-240g{Y{_) zT@Y#&!1)+tCJ3XNdw&z?Ko^AC2b)0U14tbx?JO&X_-)?GmR-O9U)}^d&;_Ix;x|No z1F5forpbk%F~|ScHh~Uw0jUM~jZhu}9q0mz3y`_!YU`lp&IOq}{o1B#Xde=r+6E-G zf2UvD1Uk@#kh!)iTXy}Ler*%zKo?M10*Ygp8$jg_$ZxRn;m^vJT|cH@+XOn$1(&%n zwR@rN1s&*utQHo&AaiS=;kyTvH>Y3Q1Uk?Kq!wS8!OR7nfdC3$eBrPZ>ITp`3Aogv zySEuBd|zyQ0B+mE!T}Z+J z0)s}z8$g`_2ED!3#-k^?fWl++L>Ewx4-^uh-W-Sq_0&K#s22vJK|L%G4eC9CXi(1x zM1y)gAR5%80nwn|3Wx^vL_jpCmjR+dJqQpD>K%Y+P|F`ggIe_<8q{J3(V*5ihz7N^ zK{Tip4WdCUWDpH%{eoyv%N9g~TCE@&)FK7Zpw=dc2DKzXG^mvbqCqV{5DjYGfoM?6 z4Mc-lWgr^V;sVj2))a^awUj_Ks1*dFK`k5*4QjoBXi&=pM1xu#AR5%70MVe<0*D5+ z1VA*XmIu+G8XQD}YG)7)s(C>)s8$8hpc)fIgK9$%4XWutG^iE>(V!X%M1yJ{5DltX zKs2b<0MVct0YrmJdk_sO$w4%zlm^kD5*S2-N>>mKDmg(ks8j^epb`&6gGw_H4JxTX zG^i8;(W582fI?yPM3>PMT_EXT^h6g(IEEXnjGpKM35U@WT_E8wdZG&?97a!cfrP{8i7t?E7(LMi5)NCT zC)bb*A!JZQR@ z52Y7C>4i{w5tLpGrI$eIrBHeqlwJ;{S3v2NP5Wi& z6O`TzrME!otx$R!l->@dcYx^z`<+mF7nI%&rT0MTy-<1|l!lz>(qIoc(WSv2a-vIv z{UNCQVJLkBN*{&N$Ds6aD18D-pM=tp!8)Z zeFaKih0@oc^mQnG14`e7(zl@WZ76*QO5cUj_n`EBDE$CRKZMfco#?{A06EcxfdO)& z3j+h>L>C4I$cZit43HCD7#JWYx-c+6PIO^lfSl;UzyLYXg@FNbq6-59ASb#o zFhEXpVPJrq=+a=%2;M>7V9x}lnV~cblxBs}Y*3mVN^?MIPAJUw zA4&^AX+bD01f_+cvNhmD^rKO>?43w6I(sEE*9!e`f>481b zg@FNbq6-59L>C4I$cZit43HCD7#JWYx-c+6PIO^lfSl;UzyLYXg@FNbq6-59H5o1yZk!p6CJzhc0M->W0!iP`VdN_d)4?C_Mp65A73O z7#JWYx-c+6PIO^lfSl;UzyLYXg@FNbq6-59ASb#oFhEXpVPF^@C%QD)-vozSgZ(WieH%*Ofzo%O^gSqjA4)%f(hs5ZBPjhC zN>($*G}uE3g3`rMx&%s>Lg_Ln zT@IxypmZgau7c9lP`U<6*Fxz!C|wVw8^AOJLnD-Kg3`@Ux&=zNLg_Xr-43NYp!C3= z=)%ANInjlI0dk@X0|Vql7X}8%i7pHbkP}@P7$7IQFfc$)bYWnCoan;906EcxfdO)& z3j+h>L>C4I$cZit43HCD7#JWYx-c+6PIO^lfSl;UzyLYXg@FNbq6-59H5o1(NSBLetSDD18}9UxCu}I?;u|`uY7J*Xr%H-VBFS!f=+ZHR;?llaREBfg;;YzC%O=;7IdNuv1&mlx)7@tbfOEfYC$Ku5UUn+ zq6@KVK_|Kps}^*k3of;HmR+^k_OgC|>$*7xSJzl?2A$}FOKpheS=+E}b^EWCOf$?r zZM7M6q6;py8&0^}%@V2J@7ye8G(*v1Gw4JYTxzG@@36bDu5ACC10F_ypPOvf!;^OQ zY@BMBa-n4Zo4)8xDxJogK_|N4GS@7p*Di*uZ2t?Xj7`b;CYwPgy5Lf)vozgKA+~bA zqG$Uizx!sJK_|MPs|D@i1Yw8ul6G4qYxnE@S-k1o9Lvq16J2nrZEfwb?M;`3{Hd|m zJ@(WvqutUNbfOC`wYySt?V8vs?e|LP86BT*W(+#f1(({6(1~^d6{YqEHA9U&SWJvT zC%WKLEA?%r-5IqKd&!H5n~v}p8-q@C!KL=!*&aJ?#WH)Qi)EYG8cd8qC%T}k1;qmh zZA;?_N9##g16?ojxuo<)`5oGQHa5&&Lmyw}iGicu; z$Xtkf7i@v;sD;poaQOG%eluuqBS^!+4lURI(q@**~S9K(#D{Dl(^LHho;|#1bJf+2JN-P zrWO>>uzX>=%^t@#JKVYO%!|$lUb!`u)q-r)Vx; zpRyUW7ZsaYP`qu3leH`VTC<1{igAPE{mr1gvAEPi)5Ctt9WRV;xxL;D+CPh~ z7UVC`2};`_>1_WYf%nG#)|WSf_Shn;1-TQ3q2=U$KI7TOyxj*jgZAO#QVT67!DY#3 z&ZnC}dv!r-iHSGReqKGY*CYoKUq4pt2gYPZ^=3mL?Vx%Hv?m&-7RPx5;BWwqmw@(76RQ@qx0+bBp#9gx zss-)QMuY>ty2W8LXdgGoTu8j3#s#RhfP@1BI4(eYy>Y1(51(yg@ueOd4%0paZ3gWJ z2dPDlV_1HRdQfb;x4VA-ikLRzbDz~WgZ7MLQwvgmf87GxU#9i@d)|5*w`6K<2JI_H zR|`qI4fa=sqHOsV*Y8($o~D`eiElG#?>RQLAafm7{ST)c<<(MEO#hs~h<>A2L+ z&A(>T{j%OZ?VN;3l}wZ|Xb(HGT9Ex9GeKpE{lOhJVejkhOCth1Y2NNnwXtY8e<3lCBY3p1FxAocpzxw|L*uiwvE%VHS9;IJ9AUml@$ z6B~nhV;Sk1%&R&h`!?gUx2p{(VrIgoFb= zb8R+*_V~lxKq$X~&H=!!wm}7!enEK?bXEY!4g0X38`7{8SuN;10g$C`$@YkM5qOwfdKLwD4h`sU(h)T zAUELfn<{dcfzDF+>VDF04OTZasDsry}9_WiH7H#=*-dpS?%rqKgkK#6bkKo?Ml4-^uh&K!sab<{vK zs1pXFK^-g*4eC6BXi&!pM1wj#AR5%60nwn&3Wx@EL_jpClL4YZ9S9H&>KuS*P{SWY zgBtZ98q{D1(V)gShz2#ZK{Til4WdB}WDpH%{DNpu!xlt?8m%B2)F1`XpvESM1~nu> zG^mjXqCpKn5DjYFfoM>}4Mc+)Wgr^V-~!R0#uSJKHIzU!s1XFBK@A)b4QjlAXi&oh zM1vX~AR5%50MVev0*D4R1VA*Xk_XYC3LHd(DrXQ4s(3*(s8R*dpb8U2gDOK14XWrs zG^i2-(Vz+nM1v|H5DltWKs2b*0MVcd0Yrledk_sO$U!uykOtA90vJSt3Re&fDmXzj zs89sapaKs>g9gv028 zE|72-J|jTm!A7W?*0#J|jj2`F$35U@G zT_E951KLf(z`!tipbI2Cupj8sU=KOarNJI@pi6^2)=_27AbXE)DjO16>;IAqToN*h3C>&rbG}uE9bZM}M9O%Np06EZwfdO)$3j+h> zKoB)fE?(;zyLYWg@FNbpbG;7#xAP2fIFhCA; zVPF_N&;^n%2lhZ01_sE1E({Ei16>#xAP2fIFhCA;VPJq9=)%ANInafH0dk-V0|Vqh z7X}8%fi4UTkON&97$66_Ffc$4bYWnC9O%Np06EZwfdO)$3j+h>KoB)fE?(;zyLYWg@FNbpbG;7)=_27AbXE)DidpdED#4fe`VS_Mk0LTNQ9tq!F%ptL5G z)`HU7P+A8{>q2QgD6J2r4Z!s1fi8j2a0r6Z!B9E`N{2$}Fen`kr6ZtpB$SSV($P>l z21>_5={P7I52X{JbRv{ag3`%QIt5CnLg_Rpoerflp!Dd0E|79;^gtI#I1H@=T^j5U zg41z>{UIoQ7)l?3(nq26F(`c;N}qtzC!zEyD191ApMlb6q4YT@eI80*fYKMC^d%^L z8A@M)(pRDMH7I=@O5Xs}3=EJ1T^JZ32f8pY+=hxn4s>B)fE?(;zyLYWg@FNbpbG;7 z#xAP2fIFhCA;VPJq9=)%ANInafH0dk-V1HitC>;x>#xAP2fIFhCA; zVPJq9=)%ANInafH0dk-V0|Vqh7X}8%fi4UTkON&97$66_Ffc$4bYWnC9O%Np06EZw zfdO)$3j+h>KoB)fE?(;zyLYWg@FNbpbG;7~n0{eH8v=GM!3I*mZn5X7nl4Z#ts z7SwDZRxQX2#Hs}y=t8VoP*@PF7IdHsv1&mFx)7@tbf62dYC#9O5UUn+pbN2TK?k}J zs}^*i3$bcJ2f7fe7IdHsv1&mFx)7@tbf62dYC#9O5UUn+pbN2TK?k}Js}^*i3$bcJ z2f7fe7IdHsv1&mFx)7@tbf62dYC#9O5UUn+pbN2TK?k}Js}^*i3$bcJ2f7fe7IdHs zv1&mFx)7@tbf62dYC#9O5UUn+pbN2TK?k}Js}^*i3$bcJ2f7fe7IdHsv1&mFx)7@t zbf62m+F$?c?Lm9V8qVCdQGQWx|JdDnH^a5xJ3$A!psR)LI}1>{Y}>i0&b}XVB2dM?&8)tj$jw_Ve z|5G&C?dBJ{OOJtp0h`)C|Lg6)ew}I8sa9gYdA-r@!ld+FpaWg7sRg-tTIxi*6{V&2 zhn5)cwwM{c3v{3hvRY^8o;r}Z{nv8s8va+-U>Kv9cClvSTOcKo@kiXztx#sbFc%^qzSa=s*`_wXkpi z#YOkET)W2q75l@j&8$0CnC}7|=z^>k7H=T`O--F>x4g7;|Ia1H)*{oRcYzLc!KN1E z4rsjXf4knu+9@G@7wAA2bhRLLAbb;&9`>6lnOKYZgzf?z=z^>k78js&);rVJPV;2d zexELL>y;5oyFdrJpsNMB6%@YE^t*pgl$G_##Pd5r2fCoEh2@I^NWR#A(8Jo=?c(p9 zpaWgd)xyk0k2lbPE-($PMrRG#G;R5`xr%_N6i~pqe{tvJlu@)3fH*Aag%umSE~P+FgjWbXSv3`U@Riy*&2!VKYF(19*6b3uMy$^AE! zO{}N+h3*3F$Hb-YeqF3{djWVNuo2?~cvkaBYWK6y*)!1v6%K>I_{)q>0gsfCu4 z`|mxnvIdotpgp7@wZz05XrC!aEpoiU%!QVd_RF4F?S8Oy$4<~*RCKi={={R)=5XMJSe1=_EQtQHg(Aag-+0WBx(uUne!-nH6%7ido_x>}Grka}o2Y0tjI zcz5pX=v|KlcY*fCBC7?JzaVuWb3y6hq(Yg!fr82IY5t+R zK>KHr)xy#l$Q_fR_3_gV^WAyTO1nUNY?0N1;tgabC@$=kF57l5s0kkg|WG=)FxXUO|xdYle3{nem19r8bvIJC~f%X@J)S{O=Aorq|lb}7wAhj@a zL16|8Uu3l)b3tV_XrD4d?KYG$YW8GExef~l&|YScT8JC)*B7Au&LFiAH=xx+!ic&B zR1bmnM8ni#Id1@5PJ-ME8ZQCunz`_hv zXMySf&^~TZ+JS@v>RAfN@dk=x&|Yt3wXi%7iZ_Fp**5P#*V{Y$Tkk%pq_PXN9~@aN zC=Y@11t<@NJSes;@2z-+xcrDgk0(4KK*wXpO6Qfs?@f$dh)di#i@R=eLP@7W33 zSB|U}*<7_+HQPxi>+R3zS?~TVdSWMN?>Vwskb6OH0J+z{4y<;+tAVxkcYzZ-LHpB@ z)q>20rOA)$7T9hvt>52t!pizc%$}W~J?xUoG8Ho@Z<l}$CSs>uN2`V2zc@uP2z_074_XQ!T1=SazFsp?2FJhqMo}lvtK;|O50Tgc_wKY(+ zwotX8GY4RC0dg-W-eBhDL)F?q)q>6?KvoM%XXxg_+yFYe0OSS}sCz;222)!BH5cTD z6+E3rpz{qtVdjEGZ5dRp>{)Z`l{}qBpfeCaYGHl@xfhlmVC{8Sn1Rko0J*^rYA#4E j%x^F^fcyq>1L!P;|JP6Nv%;b_2kHisv*y-Ic{+^%_?0f0 diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_vex.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_vex.b3d index b6f79b45c82f69f5f6dd4e0bc385f5105f2f845f..f52772dd6dc676522d41379b9785a18d6f049b95 100644 GIT binary patch delta 35215 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 bL%v{JPcThS4Prbn+35Q&h^aNgj4yZr(l(3v literal 121164 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 b-3G#-^{u$nqStSrHL$qUg7O*&!}1#dAh((X diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index 7632adcd..195e8338 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -25,9 +25,10 @@ local skeleton = { group_attack = true, visual = "mesh", mesh = "mobs_mc_skeleton.b3d", - textures = { - {"mobs_mc_skeleton.png^mobs_mc_skeleton_bow.png"}, - }, + textures = { { + "mcl_bows_bow_0.png", -- bow + "mobs_mc_skeleton.png", -- skeleton + } }, visual_size = {x=3, y=3}, makes_footstep_sound = true, sounds = { @@ -104,7 +105,11 @@ mobs:register_mob("mobs_mc:skeleton", skeleton) local stray = table.copy(skeleton) stray.mesh = "mobs_mc_stray.b3d" stray.textures = { - {"mobs_mc_stray.png"}, + { + "mcl_bows_bow_0.png", + "mobs_mc_stray.png", + "mobs_mc_stray_overlay.png", + }, } -- TODO: different sound (w/ echo) -- TODO: stray's arrow inflicts slowness status diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_skeleton_bow.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_skeleton_bow.png deleted file mode 100644 index 1dfcc18d6721eb34587450e7d2af4e6ccb6ebe54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 676 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU{K&-W?*2L>fE=Dfq@|*z$e6&fq~)7=4p@4 zuloM##JtYRn)KM*5Ib8vl|WkqHCgfPD<+-TziL`pXnUIX-D}5eO$`43|Lwm3=E8yJzX3_Dj4Smvrl?#z@wa?wfFnH|NlQ3#8s_1vGIMLVNxXb z0*$O>-UD6=HVOZ^!%RC;Jh}g?NcG;{!_^{GAK0f>H2LF}=!T0IHpE@(?3;g6pWEei z@y+$?HbnIKM1189^pLnV{rU6r91|M&&*-1iZ>jxw`cKy1H=9eXl33*AXK8;uvwm*< zg@aqzu60f@X&0U0)BXGSixXQX?^833IdJUgAJ3PpmHEXp_atpUuw;h4=Z@;AW!_reT5A1G+l^M7==Zol;m=Dr&eJDd(qj!IgnxHY&yLC&ACK&Jo6$BrKL zznSsf=T9+~bBHy(DN;Om+Er7=NVkD!-k0l>o4zmw8p`)K+uOfZW0)tS64B_e(p-GA z%p=#_)nC2;aP})Qnda|4|E2A=?1V@L7VSfO`CKkHS}du!l>KGxy&pS-`E#FG{0cnH z^kL3&Holqne$)t_55LC9IsL~Yh1+~h;<8(+L@Tl$bG~NZ^R#lM`JVezctsV8=H*Rz zeO7kD({P4_uctmc#5(+{b4Xz7JYv)TR^lMT1HOP~F7vkc`2Uq>J}mP7_1^8= L^>bP0l+XkKch)Y^ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray.png index d97b8065e89c0c1db5b09d583c247cbf9fb01289..21f15614dbc364fd08f713582d58f3c2cbcb2a24 100644 GIT binary patch delta 837 zcmeC?IL|ggyk3EWje&t-(cHQg1_lPk;vjb?hIQv;UNSH+u%tWsIx;Y9?C1WI$jZRL zz**oCS-vrr&U^OZ@$d7G*I&PX+`j(* zUd8GseicId>;4t}`SIyf+WUury!w+qCt5PRsD9sj*?Z>$tsfig_PjWJ?=Y`K5yRf- z2ZzJ~h|;pPIw-X>;32E&h`WUtZ04s<3mzM){~?3+~D7e|x_Duw~nt zo5j3qvd$WUl!nNiVQ;e%IC?2;>oWz-NzgpzHY0sZ;H^q64qN#RP#r@sV zFS3%1?zf3;O7r7iaX0ydp2NAnN57R_5N%gpulBVx;MMcO6M6<`ZLyi4IZ$Mw%$c5`X1+Wy!#Wf}X-C&gC;Lfiku`2GF! zpZRJ?oavTp>4%OLT{z>bCFZ=1!$|6(&V^_5ZuYZ<%WQhOV8*`XTJH)^%yO7~e^OGt z`P|~4oU5e|1lM&eOe#uDwk%@qzi#qjd-2)Xi^Q)iJo@eCKm%Y~U=4of|%a`3}|7K15y!K$l vzECNjk6V9bZ07u8>{HA4<7a`zKlXQTk{*8StT$$0U|{fc^>bP0l+XkKJ+P38 delta 1026 zcmX@l*3B_NyxxI>nSp^}?)Jtv3=9kv0X`wF3=9lf>bf?T_WoY}HbKFOW#!>Hxp(j0 z-M4R_S3=_5SFcV!ez*C`KT4=8gks(_1W1jE-uriOngW_YuKQ9!{U&ha;smqWtyFk_?rwWm+0UibgnVR7#r_r~Rid&~B6RXc9VU*Xiqk)kYvZ}vx)9=4dWiNPzq=5Ba3=ihIkIp(Ze-r9e$Rxol7<@I3x^WydYqI+^% z9?Nv)Da<$>zclh?l;YR-FZSNJS$reo;$o=)*?NA3uz6P--W^P1^a|YkS#-a4Xsq+e zdI>2FPi4Or?%;`jCGY&7o}SVq6&Rc}L8)4EVUKOCxO=Ibb zD&gse5}W^8MnSrzJN=cKm2vgv=&f!Foi77{#rb}{5VaG3IB(gMZ4XU6~S zTN9a237_c~TJB*T;hwOjWwC9#SVPGTRTVuQg}Kk|x7mM}SkAzCRV%Tf{YmYF8=}i6 z7@YOiHdo498FtIaf5NsPZNH1RE3`gedj=!956yFyAd%CvzG`rmU48^LjwQ{?e zgILPv%Rg9qnti|6p)M8`#dh`F-7Z(85`KN+obzArhte7gwqM^~p08P88r6~9aqqeL zi_eOTV!Of_1a80hK6&kdpUDXkj*B+k?^mfmWH^B#O6k|%{NwBYI9&b6u5rw{Xw3x1 Q`=G4j>FVdQ&MBb@06`4jF8}}l diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray_bow.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray_bow.png deleted file mode 100644 index 6116fe2a79b09e52136c9e7be5d000e22cd9de83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1144 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4rT@hhPm4t-!L#ROb+k~ab;j&&{Eg6v9$O1 z^0x^JPAn@A&&j=e_wK%Z`@9ko@4k9<^6|UPR~}EEG;{feP5V!s>0h|0s-!Y4Dk?X` z&Q?z)(AGdrR($)4NhkKNnpPItp5}e`+A$YP%jW4bHtgBEV%zqaD_1Suyd|!naQ?b= z-E-%4&6zuU^_mHb7SC9*($h?|GhIEyPfkOQJ3Bku#l>aXv}ubrY}C5FngW_YuKQ9!{U z&ha;smqWtyFk_?rwWm+0UibgnVR7#r_r~Rid&~B6RXc9VU*#V=N-fJcE=^}x) zpG-m)sa16|epT=M|MFVm$u`yfy>fh-lMIv=7z^C1Ui(IAKWi+D?@Fzr`HpvezAx+L zTXyBuGRN5MWtp?v&nRpam}<_mXv@~8@~ZD2Y;(N%Yw{VMis=VGd+WAcuk0w$;njOR z|JiX5_a80VKbL;({=DC0{z?5;^8fAYwPILI_9k#Wb*c;g*U1-_e<0d*hDp0fhWw_# z{%i`qIch5Fq&=DB#$yNme$#dh*% zeOMS@a^axHwKEHB{tNut@WTG@_3hse{@3~Y{LqE=2jNj`Yi5{!&`@<~ox>_*6!%xb zSl|LTn_1hg1JTkhCJ(1Is-?U-TekaVClgob-i@tI=~=?kZkMJsF}?hf%OrAIb!Uvy z!GX}4r=pW_E*nd6vuJgMvnFI{X0N*E|t%@Qj1Yozck_3$p_!#44A z4*Slykj90ZbQvaCeEQvzk?`wuL!+oi$eH)5in51NkCbIBb*ZyA{P$9JYt?V&S?PYR TDj|C|fbyZItDnm{r-UW|rKtyG diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray_overlay.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_stray_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..ab00032b22e66672f41c26e6beef1f357ca3ed4d GIT binary patch literal 790 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU{K&-V_;xdG`FsWfq{XsILO_JVcj{ImkbOH zEa{HEjtmSN`?>!lvNA9*a29w(7BevL9Ry*<9TT(PGB7Z(mw5WRvOi#9;nWs5k`iXl zz`!6`;u=vBoS#-wo>-L1P>`6JSE84fTB2a0XP{?jZM&HBjAy4y(G)@JBTdE(><^+iQ-8X;o@~qa_{2FSXt^D)F7nV-7)vI~&$JFL2>je9! ztQG%E#6NtgXE9Zo{$NR5>VJI+jr#`qJFg4xogZ~A@_gM^L;0v@QEzyeqW4~ti`QOn z_RRTw#k&3oi|F5zF1;{5DOLUck#Ldoj3nPH2bc~|-p%$a?&5jxyRk70Yzw7Z_Hr*+ zZ(PJ*YHxpj-)!!J$tR1|qJQs@IM=!^acxBZEPkUN&!U;i>o@5I`Kz2awS0Y3QP|ec zHT!+YxxQ&D1-}`Dnsfav`V+kB>FbGZ?l%vI+|`hnXTNM~jqRlu8r3saNgq8NcOc~N z-C8E2i8*t%w`_T&x|jb=cHpk7S)pIL?oFPydDn;bIA@+jzHKGXBi{aDE1f&{f6C8U z53j#2?YyafwAf?u;wO$XRQ>1jKlvzQxxSpSYgVJTz>38ypW1)N$+p`%xcPe;ICDKyo?Fz0f z$v9bDpj55@QEdyK%u+Vx>4ovuoBw@$?fvmV^Y2uq^ZzXjin&cYl%D@wFmG{lgZJs} z|NI~D?`hNhv0zW?mMf9mFZMkDyTASDBk@ly%m1jA_t`KoFfe$!`njxgN@xNAVjOEJ literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_vex_sword.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_vex_sword.png deleted file mode 100644 index 340ca52a8315757e1f3c960ced30fcaf33ed9fc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1628 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4rT@hhPm4t-!L#R#sv6;xH>pEly%Rmny@6P zxH%%dG$Px{KRpm2}Q2YMYT--rhTN zMRG|?YFXQ&wR^H^`|}#7#O2o|m$s&scVyR1xbgJk*WdpOny2M9PEM=n%&DJP&@w%< zx;MSDE3>-i#oLc*L#zK=vh$GG27EjG{aA> zGhJOnj=QjB`r5r`mTcO$V*8O}7jGTEeD~;unA}J|(U|{j|ba4!+V63^^I_r^v2lCup1;6xg))hi#_|Q?StoPgl-I3wkH&F`PURaGmiBqsqi!hg(K*Y#kFn zGnlbXh+(|(zdc#u?94UC6c-oHC{CQgz1H=kh=S0AC-NzImn2I}84MogO5A(;L&ibQ zVrS=f{v)$WcxJd4S2HHqaoeP5tX~>`LRh@?G* zwhAo>TQxiAFT;fTzRsn(9rvePTkiW_p2WKJbFc2eR@OK>#tXLUcYYM_wS46oKk!LeAL?aZL2sg{QUWnr)t@C zSviJ_=O_M_sZH7vcw4_?<<%^Xh7v3L$BysI3|`1Ey{SLtu>ucG|(RVE(5AYz+SnYZ}a-&oJZL@0Ib}UP-;& zD8a#0u+w?jlLZHP5iHyWu|fs>^{cbA|8n4C!nB6bcGf=06aZnD62( z`C&Z+>$`SsgN`55+Rc71J#5i*fb+|F&KHY%o;=)oK|R4H^Lur8q6tTXU_qL4kJ|}` zf1B^yFe(I?d@WS(TW&1Zxq5>3(we~H*XJF2b^mzo>tr)$JnQlxk@wcylREo%<{hc2 zo0}%fu_5MM|E;8*QESa-e@)sMkz4-zt?UEE3Lb-9TVgWpq|Sc+{io0|vG|5;*qOrW z8ipM&&T~He==@bxUT+!K=c_TYuU&YU9VM2{I_~*)TKdMh7SAmTKKv8 z|IZlT%wR6@?Ebz_wzy$!cIo}?$$SegZZDjyUv`GE<-y+k<1!AvProQS)@OO(U)6Q9 yC*6|84S(P2y}YY=!|?j$1@C#M>s~Pbt0}*#OnPpv(v?I|>E-F_=d#Wzp$P!}-{>&_ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_pigman_sword.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_zombie_pigman_sword.png deleted file mode 100644 index 976d3abf4679145cd9c4fc1ec5edefb49a20c726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1241 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4rT@hhPm4t-!L#R{15O6ab;j&NDg%?NRO$n z$ndc-33Ic3Gkf-%X*1sL-|}YOf)C4<+Q!PbWvaeiIQR3}!;dCUDxV%5Q)~PG$=#pV z&p(;e^LFWy$K9Q`o07Ao(5heC?)trJ!VUN4&PiCb?)mT1hZhk#;YEYTc zhmC9QHrBkFJo)ylzRP{Bw~I@jG}azzu60*Yxl~i}>+|P_>o$Bid^Dugbb5GrK)$hE zs#r>!i%Y6FOGC+^-HMeY#w^t4Hg~a?>RhO4CwQs#3frHpJ%!+Qc~;G@N^* z$H2hgT@vIM%s@S`NpDdo0|T?2r;B4q1>=;7tVu@|1X#@(#ngY@eP4faUsZRAnx3)C zi@EE>7rb8*;^1{EAuYG3^u||37OjT=K@(Onui`nvQlY@LxOnQJ+4uMU&kOl5VF7yg2vzuyW6g+u|=p zk{lkca53GK&b@c#t#8}1A3XgL;qP~4`}VbS>_Rz1yqEOkZ&Xa2b)@L@xx)#nA2Q{VY$YsWE2Fu9|W@T^t7p%A@WjXQtbO*)FK0zD@RvlQa&oN~MZ&jtK z-Gopl;fiGu zF?B8N?Jos6m|_f{1$Xb9z4gYct!dou6>0~a)omGB-(}47U+el}E%zo}?tjzl#oc%g zI|#V0H#scjD*j^s)CBf_Tve{l`R?JCxwnn(f7SgGyW3yiFkg!0|N20Fe=a#W(~cjR z*DN@Gq?%?HH=C?KU;g_~o6^ZusxC*8J6=w@vfV|M>Y0i%K_$&?TZI+(d hGjYk|n*p1Q>sfb2EnrH}7EK1_OHWrnmvv4FO#n%4C653A diff --git a/mods/ENTITIES/mobs_mc/vex.lua b/mods/ENTITIES/mobs_mc/vex.lua index 74136c09..b7d1570d 100644 --- a/mods/ENTITIES/mobs_mc/vex.lua +++ b/mods/ENTITIES/mobs_mc/vex.lua @@ -7,14 +7,10 @@ local MP = minetest.get_modpath(minetest.get_current_modname()) local S, NS = dofile(MP.."/intllib.lua") - ---dofile(minetest.get_modpath("mobs").."/api.lua") --################### --################### VEX --################### - - mobs:register_mob("mobs_mc:vex", { type = "monster", pathfinding = 1, @@ -27,7 +23,10 @@ mobs:register_mob("mobs_mc:vex", { visual = "mesh", mesh = "mobs_mc_vex.b3d", textures = { - {"mobs_mc_vex.png^mobs_mc_vex_sword.png"}, + { + "default_tool_steelsword.png", + "mobs_mc_vex.png", + }, }, visual_size = {x=1.25, y=1.25}, damage = 9, @@ -42,21 +41,26 @@ mobs:register_mob("mobs_mc:vex", { 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, + 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 if self.state == "attack" then - if self.base_texture[1] ~= "mobs_mc_vex_charging.png^mobs_mc_vex_sword.png" then - self.base_texture = {"mobs_mc_vex_charging.png^mobs_mc_vex_sword.png"} + 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] ~= "mobs_mc_vex.png^mobs_mc_vex_sword.png" then - self.base_texture = {"mobs_mc_vex.png^mobs_mc_vex_sword.png"} + 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 diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mobs_mc/zombiepig.lua index d84c68db..a21f1873 100644 --- a/mods/ENTITIES/mobs_mc/zombiepig.lua +++ b/mods/ENTITIES/mobs_mc/zombiepig.lua @@ -27,11 +27,11 @@ local pigman = { collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3}, visual = "mesh", mesh = "mobs_mc_zombie_pigman.b3d", - textures = { + 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_zombie_idle", @@ -91,11 +91,11 @@ mobs:register_mob("mobs_mc:pigman", pigman) local baby_pigman = table.copy(pigman) baby_pigman.collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.94, 0.25} 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.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 From 5d92c04a36ba7bbc2fdbfc3351d22b502d3602ad Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 May 2018 17:02:28 +0200 Subject: [PATCH 0082/1107] Update Conversion Table --- tools/Conversion_Table.csv | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/Conversion_Table.csv b/tools/Conversion_Table.csv index 9c44106f..e4302273 100644 --- a/tools/Conversion_Table.csv +++ b/tools/Conversion_Table.csv @@ -744,12 +744,15 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/entity/spider,spider.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_spider.png,,,,,,, /assets/minecraft/textures/entity,squid.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_squid.png,,,,,,, /assets/minecraft/textures/entity/skeleton,stray.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_stray.png,,,,,,, +/assets/minecraft/textures/entity/skeleton,stray_overlay.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_stray_overlay.png,,,,,,, /assets/minecraft/textures/entity/villager,butcher.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager_butcher.png,,,,,,, /assets/minecraft/textures/entity/villager,farmer.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager_farmer.png,,,,,,, /assets/minecraft/textures/entity/villager,librarian.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager_librarian.png,,,,,,, /assets/minecraft/textures/entity/villager,villager.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager.png,,,,,,, /assets/minecraft/textures/entity/villager,priest.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager_priest.png,,,,,,, /assets/minecraft/textures/entity/villager,smith.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager_smith.png,,,,,,, +/assets/minecraft/textures/entity/illager,vex.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_vex.png,,,,,,, +/assets/minecraft/textures/entity/illager,vex_charging.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_vex_charging.png,,,,,,, /assets/minecraft/textures/entity,witch.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_witch.png,,,,,,, /assets/minecraft/textures/entity/wither,wither.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_wither.png,,,,,,, /assets/minecraft/textures/entity/skeleton,wither_skeleton.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_wither_skeleton.png,,,,,,, From 895d06d28a50b0b9d2ac4a46e95508ca1b77d452 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 May 2018 17:11:07 +0200 Subject: [PATCH 0083/1107] Update (wither) skeleton mesh and anim (thx 2 22i) --- .../mobs_mc/models/mobs_mc_witherskeleton.b3d | Bin 120023 -> 185727 bytes mods/ENTITIES/mobs_mc/skeleton+stray.lua | 20 +++++------- mods/ENTITIES/mobs_mc/skeleton_wither.lua | 29 ++++++++---------- .../mobs_mc_wither_skeleton_sword.png | Bin 690 -> 0 bytes 4 files changed, 20 insertions(+), 29 deletions(-) delete mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_skeleton_sword.png diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_witherskeleton.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_witherskeleton.b3d index 2ca3646deb083a1a04fae99a918154aab769e6b7..6f78392fe7f72ba73073636789d4c1bff443ee07 100644 GIT binary patch delta 63869 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 literal 120023 zcmZ>AGIlwCg^_`gfq}s(C^T4)fdRrUDlN{?GcYh@U|?vlN5v2o3=9km|NsC0@8|F0 z+IxkOAtN<0MGvGLBmu*iT46H2uE8ExY9L001%(9jWI~JuIfRLUfuSv^)86uys)LlE zl*9Sn^!;0XZ|#HVEwPtiYqo0*>a=hDE9;PEBIJ<8Y`UM}-~WAJ%uoQ9f8L&sEN>5% z1F3<^zi3ZKHs2oI{HCBz`?uS49rkFogS@{VVmF9PuxDU+UqBwcDTXO^5prSsrA*>XT{q8fS&=(ao=ey8q($skRIZ z4Pd(=?hCMIU=XmchsKZQaSuCW`xzKO@*H4!Q23d6F1AC}A7anI0FejzA4xyd{~&n* zdqVLGk_WkeQ#h9ca`-SXxkw=Pui2QYE`sjn04-X%RegXT2piX;G z{BZu&2c;iS{)5I(jQyRm-*$~bo%W#xwhlM*{Xyvmls>_JWMD`D%in8H2g~1r$b-zs zkO!I11u-AwJ{0po@e4{n|Eic^`5!7@V9&s?0G$6p`41HTsObwNKLIQc(hrJXX!t<& zm)J8fK;%L8gY-kg7wSHc`~tfcX!)Ym{1oPYaQ{X^wp`D-5o z1414YK2Y<)aSzF35c6@R?<%`^kXn0C`40-em5=gJ;s+xC!R~&0IynEVg2;pX2M&Lj zJg)o!k!P?6`41HS=iVxU{SR>)1B0hhsXYTj0^I-T^&>>S!46mb29tjY4S%Tl@c4nq zCxGK06n{wh0~~*zO1Yr)29^i84;p`<@&O!w5cvsqxZ)Qk52~M$%tx{xVm_$;1ep)2 zKcV>-Y(A)b0o8vXd651uVcXF1UxGaY!v=8v0qIA|KT!Rk`V}G%%0D3esQC{he*j#6 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 diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index 195e8338..bd091319 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -63,23 +63,19 @@ local skeleton = { max = 1,}, }, animation = { + stand_speed = 15, stand_start = 0, stand_end = 40, - stand_speed = 5, + walk_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 = 70, - punch_end = 90, - -- TODO: Implement and fix death animation - --die_start = 120, - --die_end = 130, - --die_loop = false, + shoot_start = 70, + shoot_end = 90, + die_start = 160, + die_end = 170, + die_speed = 15, + die_loop = false, }, water_damage = 1, lava_damage = 4, diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mobs_mc/skeleton_wither.lua index 400fa509..144d37cf 100644 --- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua +++ b/mods/ENTITIES/mobs_mc/skeleton_wither.lua @@ -7,15 +7,10 @@ local MP = minetest.get_modpath(minetest.get_current_modname()) local S, NS = dofile(MP.."/intllib.lua") ---dofile(minetest.get_modpath("mobs").."/api.lua") - - --################### --################### WITHER SKELETON --################### - - mobs:register_mob("mobs_mc:witherskeleton", { type = "monster", hp_min = 20, @@ -26,7 +21,10 @@ mobs:register_mob("mobs_mc:witherskeleton", { visual = "mesh", mesh = "mobs_mc_witherskeleton.b3d", textures = { - {"mobs_mc_wither_skeleton.png^mobs_mc_wither_skeleton_sword.png"}, + { + "default_tool_stonesword.png", -- sword + "mobs_mc_wither_skeleton.png", -- wither skeleton + } }, visual_size = {x=3.6, y=3.6}, makes_footstep_sound = true, @@ -59,7 +57,7 @@ mobs:register_mob("mobs_mc:witherskeleton", { animation = { stand_start = 0, stand_end = 40, - stand_speed = 5, + stand_speed = 15, walk_start = 40, walk_end = 60, walk_speed = 15, @@ -68,16 +66,13 @@ mobs:register_mob("mobs_mc:witherskeleton", { run_speed = 30, shoot_start = 70, shoot_end = 90, - punch_start = 70, - punch_end = 90, - -- TODO: Implement and fix death animation - --die_start = 120, - --die_end = 130, - --die_loop = false, - - -- Not supported yet - hurt_start = 100, - hurt_end = 120, + 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, diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_skeleton_sword.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_wither_skeleton_sword.png deleted file mode 100644 index 43bbec991318b3a91aacf93eb17bce455371c749..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 690 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU{K&-W?*2L>fE=Dfq@}2z$e6&fq|hV*llV? z_=?8-B4^7)BdvLJruX%9v@|vuYipL56zAq;WhX>lJGb-b_IWQJU-9(x40JG!^|aYC zqj}b>S)HAo=|L`zrrO5F#!5;`GBPqYHa1aFQ2`3FIXO9=W}+E>a-Hew8gkqoPZe%4 zFfb^W1o;IsfWiO&{~7*+0f=H?`2Qa)3?Wh<%(Z4t0*zKI5WZ$Z~VAhQN_U0b8K|j5j7yY@o;Lq8H zrP6<1x|h6BXRFV6eAHF^(F30cQ~rEfG~JJtIYaIU%cquqt6r%dKB%VjYQ~kXFaO+S z2-&T+-nTPPp!@MJX-=iJi?2s@@s});FzZkLHG6f;MaC;@IM0YA?AY=!;@|4q_x5om zgk7GsROW;~Ur}+XdZ(7sY$?WB$Jkaq%m4dC;QRKK{0`QW*iYu&IsCYp#oyoGPH2NN z+dn0>na6DR?^*Wm?O#tF%k%}EukG!2|2xaeaM-X}g@>Va)w@^5CqgDA%Cr@Vq|30k z{}I<`3az|(joU-u7O#M>WT)XRM&*S|wpzH{3DLiq_l0YY;jU9F9C-hwRV%-HoxMtY zk-!_#C#F*_6i(>cw%R@MLYBdAuiAuTMsJx;{-{2mtmN@xPoLwFTHSq4_ZiM|I4tXN z`Z2*ld0mUQu}5thi|kCJD_m@xQLIiI8n`m~;%&uTB63O>1}y1gS-~VaH!gAKuc$M- zoZr7M?5JZ6y}sW3Ugx_5E|b=(%0KU$@@sa53g*Zf{%lphVa4PP`wJaf8)7( Date: Wed, 30 May 2018 17:34:38 +0200 Subject: [PATCH 0084/1107] Update death animations of some mobs --- mods/ENTITIES/mobs_mc/bat.lua | 19 ++++++++++++++---- .../mobs_mc/textures/mobs_mc_iron_axe.png | Bin 360 -> 0 bytes mods/ENTITIES/mobs_mc/villager.lua | 17 ++++++++++++---- mods/ENTITIES/mobs_mc/villager_evoker.lua | 17 ++++++++-------- mods/ENTITIES/mobs_mc/villager_illusioner.lua | 14 ++++++------- mods/ENTITIES/mobs_mc/villager_vindicator.lua | 16 +++++++-------- 6 files changed, 51 insertions(+), 32 deletions(-) delete mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_iron_axe.png diff --git a/mods/ENTITIES/mobs_mc/bat.lua b/mods/ENTITIES/mobs_mc/bat.lua index 5e6b9aa9..64e0e349 100644 --- a/mods/ENTITIES/mobs_mc/bat.lua +++ b/mods/ENTITIES/mobs_mc/bat.lua @@ -24,10 +24,21 @@ mobs:register_mob("mobs_mc:bat", { run_velocity = 6.0, -- TODO: Hang upside down animation = { - walk_speed = 80, stand_speed = 80, run_speed = 80, - stand_start = 0, stand_end = 40, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, + 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, + -- TODO: Less ugly death animation +--[[ die_speed = 60, + die_start = 40, + die_end = 80, + die_loop = false, +]] }, water_damage = 1, diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_iron_axe.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_iron_axe.png deleted file mode 100644 index 2fd16d0919456edf70812d6563e82bd0cfc8f2a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 360 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^xl_H+M9WMyDr z;4JWnEM{QfI|Ravq8eTe3=9lXC9V-A!TD(=<%vb93;~Imc_n&&t|1C##(JiDh6V;- ziWV|3Fg)>eaSXBWpE}8qi^)*HwOD@p-E$313YuF*wrsrNq@#1>+^IvSjv3$JoOjS` zPiyPE-az&~qc#d`n!|oY&K3qYu>;F3c4_)^#VzF4-tkA=YCeck=sttWU)ryv~T; zbwDo7lUcBB>nxt1Z!MUG4u>^o*(68=uMeJo?ulezYk~)lO4Fomvo~mDUSM+$WOiuy zIQh!T1x;)_4Zb8ZNI0KvR6OsH{a2i)lI@s;R+o}=+dj4>_muu;YlRm~xyr!6z~JfX K=d#Wzp$Pz#Vu(@z diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index d4fdfcd8..5cb9783c 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -59,10 +59,19 @@ mobs:register_mob("mobs_mc:villager", { distance = 16, }, animation = { - stand_speed = 25, walk_speed = 25, run_speed = 50, - stand_start = 40, stand_end = 59, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, + 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, + die_speed = 15, + die_start = 210, + die_end = 220, + die_loop = false, }, water_damage = 0, lava_damage = 4, diff --git a/mods/ENTITIES/mobs_mc/villager_evoker.lua b/mods/ENTITIES/mobs_mc/villager_evoker.lua index 05ac68d4..45b50d05 100644 --- a/mods/ENTITIES/mobs_mc/villager_evoker.lua +++ b/mods/ENTITIES/mobs_mc/villager_evoker.lua @@ -69,20 +69,19 @@ mobs:register_mob("mobs_mc:evoker", { distance = 16, }, animation = { - walk_speed = 25, - run_speed = 25, + stand_speed = 25, stand_start = 40, stand_end = 59, - stand_speed = 5, + walk_speed = 25, walk_start = 0, walk_end = 40, - shoot_start = 120, + run_speed = 25, + shoot_start = 120, --magic arm swinging shoot_end = 140, - -- TODO: Implement and fix death animation - --die_start = 190, - --die_end = 200, - --die_speed = 15, - --die_loop = false, + die_speed = 15, + die_start = 190, + die_end = 200, + die_loop = false, }, water_damage = 0, lava_damage = 4, diff --git a/mods/ENTITIES/mobs_mc/villager_illusioner.lua b/mods/ENTITIES/mobs_mc/villager_illusioner.lua index 52d84c6d..7d50ecd2 100644 --- a/mods/ENTITIES/mobs_mc/villager_illusioner.lua +++ b/mods/ENTITIES/mobs_mc/villager_illusioner.lua @@ -28,19 +28,19 @@ mobs:register_mob("mobs_mc:illusioner", { run_velocity = 2, jump = true, animation = { - walk_speed = 25, - run_speed = 25, + 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, - -- TODO: Implement and fix death animation - --die_start = 170, - --die_end = 180, - --die_speed = 15, - --die_loop = false, + 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, diff --git a/mods/ENTITIES/mobs_mc/villager_vindicator.lua b/mods/ENTITIES/mobs_mc/villager_vindicator.lua index 821e4e0d..15983f71 100644 --- a/mods/ENTITIES/mobs_mc/villager_vindicator.lua +++ b/mods/ENTITIES/mobs_mc/villager_vindicator.lua @@ -26,7 +26,7 @@ mobs:register_mob("mobs_mc:vindicator", { { "mobs_mc_vindicator_base.png", "blank.png", --no hat - "mobs_mc_iron_axe.png", + "default_tool_steelaxe.png", -- TODO: Glow when attacking (mobs_mc_vindicator.png) }, }, @@ -54,19 +54,19 @@ mobs:register_mob("mobs_mc:vindicator", { }, animation = { stand_speed = 25, - walk_speed = 25, - run_speed = 25, - punch_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, - -- TODO: Implement and fix death animation - --die_start = 170, - --die_end = 180, - --die_loop = false, + die_speed = 25, + die_start = 170, + die_end = 180, + die_loop = false, }, water_damage = 1, lava_damage = 4, From 8b6f5d3dec55f30ed0ffdca25f689147f861b975 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 May 2018 18:05:49 +0200 Subject: [PATCH 0085/1107] Redo sheep texturing Thanks to 22i --- .../ENTITIES/mobs_mc/models/mobs_mc_sheep.b3d | Bin 34189 -> 0 bytes .../mobs_mc/models/mobs_mc_sheepfur.b3d | Bin 34189 -> 47765 bytes .../mobs_mc/models/mobs_mc_sheepnaked.b3d | Bin 23869 -> 0 bytes mods/ENTITIES/mobs_mc/sheep.lua | 31 ++++++++++-------- .../mobs_mc/textures/mobs_mc_sheep.png | Bin 914 -> 1723 bytes .../mobs_mc/textures/mobs_mc_sheep_fur.png | Bin 773 -> 1688 bytes tools/Conversion_Table.csv | 4 +-- 7 files changed, 19 insertions(+), 16 deletions(-) delete mode 100644 mods/ENTITIES/mobs_mc/models/mobs_mc_sheep.b3d delete mode 100644 mods/ENTITIES/mobs_mc/models/mobs_mc_sheepnaked.b3d diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_sheep.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_sheep.b3d deleted file mode 100644 index 34dd9d532fe9dc08088dd17c385313b1ffcfccaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34189 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 gFWOxxCVR3fp87>kOScw>>&rj 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 gFWOxxCVR3fp87>kOScw>>&rj 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

b`0? zy5b(xBpNI$?jgJEK`w%08{2)GL%pS6XAH;`@*+X{ngZPj!d&o|H z5FavT582TV;zP#lAv^j(e8`wRWM@B!4;izE?Cb~eA!GKC9sVFbWXvA2!ym+ljM+nW z`h)n8F?$9ENTa^N9|`tht~86JphZ233f418CrdSaU&xGsKz;8o(h|EvQjXtXj}O5V7tB4Hgk=E@(iB zSaU&xPQV75bIvh+6H3P rg4RC}>juyo31ZC!t)n2;T+mtzV$B7u#~{{R(3%Zm)q>V_5UUmdM@d5( diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index bfc8ac0f..8f56f7b4 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -32,9 +32,14 @@ if minetest.get_modpath("mcl_wool") ~= nil then end local sheep_texture = function(color_group) - return {"mobs_mc_sheep.png^(mobs_mc_sheep_fur.png^[colorize:"..colors[color_group][2]..")"} + 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 mobs:register_mob("mobs_mc:sheep", { type = "animal", @@ -46,8 +51,8 @@ mobs:register_mob("mobs_mc:sheep", { visual = "mesh", visual_size = {x=3, y=3}, mesh = "mobs_mc_sheepfur.b3d", - gotten_mesh = "mobs_mc_sheepnaked.b3d", textures = { sheep_texture("unicolor_white") }, + gotten_texture = gotten_texture, color = "unicolor_white", makes_footstep_sound = true, walk_velocity = 1, @@ -90,18 +95,15 @@ mobs:register_mob("mobs_mc:sheep", { end self.gotten = false self.drops = { - {name = mobs_mc.items.mutton_raw, - chance = 1, - min = 1, - max = 2,}, - {name = colors[self.color][1], - chance = 1, - min = 1, - max = 1,}, + {name = mobs_mc.items.mutton_raw, + chance = 1, + min = 1, + max = 2,}, + {name = colors[self.color][1], + chance = 1, + min = 1, + max = 1,}, } - self.object:set_properties({ - mesh = "mobs_mc_sheepfur.b3d", - }) end, -- Set random color on spawn @@ -159,8 +161,9 @@ mobs:register_mob("mobs_mc:sheep", { 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({ - mesh = "mobs_mc_sheepnaked.b3d", + textures = self.base_texture, }) if not minetest.settings:get_bool("creative_mode") then item:add_wear(mobs_mc.misc.shears_wear) diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep.png index 50b0e18ab7c6268b20f6e9f6b1885ece4a365e65..13496a3c510690d4b67a1ff2250c16140e8af352 100644 GIT binary patch literal 1723 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU{K&-W?*2L>fE=Dfq{V~-O<;Pfnj4`&F{d; zAjxEpAYTTCc76ti9)1Rfzd;NPjSdV9wUrDEFS{8SY@RYONS-OSX)R}9U}gyL32|j$ zV9?UiigYl`4sfZ8@oOnepIMeMyS-+6SNYbt{bzQre>At};l(3wA6)+bGxA5!3H$$luH^yB~k z-2C#%VPEE4yvV=(n$eLbnQ<#liy6JXyT&uI%G=zboxx(hJ=P^ z{s?c#`oZ*}RM=il`O%F!;}8Rni|hEeEZN;%dW}_DzVY9(XY0NZRvSInV zOUw@}|FQN2dcP|>b>U={-c(D2`L@i-$p!8vMKu}|8t$!%JjpseGB?g8Ta2OKHG563 zc3$4yqjCnDubp}t^gyIKP4=YHF-E&Z?hN%;&TBqzQ7vO>(QZ!Zyt;OGpP`*_q{`c( zJ=!sGOfEkfMf@A0N@lk*oZ(6K+2j+HKkJcWfKAfzsox7Y8Dy@{36E4Ol$hAC{J`V` zV)Dv$tPaPF8(3egkXv4&w{VKO>V_uf15&>nIDM334BW2mtY5gn`$zjO{e>Hut<=pM z%B-q=-v3*2*&_Xco=(E4hQ&n;>sDHd=&Vs>SjFJ6C+&n%42Qtfp#DR8l}y2$1rvVT zv|jD&&r6(sVh-a!gVIE%2ci+edOZ`fZ!Aq$eeiOXdCWG}#+k}b4t>{rBecBW$^t_z z<}Ha@iq9tnujTA^NSuCS>SG0kd;CIj_TL#CEw6L=dG|Fow;*qU$`)9Y;ynS%_|Cblr zyUMczTp}IJW|n1C#rSDyX+4_T(^8oJW_pk`0|NtNNswPKgTu2MX$%a^!k#XUAr*{E zuNd|}b`fF!aQd0wqY~eHXQUVcE8_B|H9b>1?{Q(lQ=_e0C12L>Z1X7N_f=W7nETeV zb;`0K9-SF07VUVHePPnA`45jhE?j4!9{wg;bK0c)zxM85Yu@kF+cL>TUvBPN!9{1D zi60Q%y>jbxhok(gRt@Ytm4?qaBpW6FxQe8{+Fy|u&$Y1N()Z(6&(F^@+h4cSDRxTv zKW=^pjY6hBr|sjfeBB@a_h|izJNF!;lpPOu3(xrXkZ{&(&L*yV$ih%iY)+z+uDkz^dUr<5umHQoHUeFjIg+>*+UZS~6?nnz!Xgme z;PmF-%a`f7dn-R%-BVm9@S^>N!{6J#zE^GTdvJy6=1K;;Ro`#_u8Q5?rFr66?itA} z4d#ln8|&Yd|ITGmFy?>8Ccs)=e&gEes@;9{2`pFk>M-`A8{A^CP}_?W$Ke#%9YlZP}HF}QKbX4Gu|*BR`q{KYBtGoOwO_cc#`x6PVQ+&|2} z_D$j7%d_>@Z6%~L8J7I-dEmA2!0T73Ro_4%odY>QEpPhA=(;+SYzP0>@h_IKxA8@YT!`jrnO6PK; zSXAp-A;0ON6OYYzE`4&+sZG-7QGVbbfq82(`Ta803|s%LW3AUaI9v5TD}x0y^JbG} z4+JJhTCe#f?4}W*#8f)B{PlY6b?mLd6DHIAmqBwJPP`NG#FXzffifmdunhf0) zEOWJ%aU6dzQ7G+gG*1r0HqB=zDh}H))GRYlY0{WxC0lhjvf^&>!Y@XA{|;1fD_&5y WlePWp%D}+D;OXk;vd)Pqp$P!m7Olzv diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep_fur.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_sheep_fur.png index 0c25e27218082b1c0265d4e6cad9886c8baa689a..fa447031d0f06b299c20108eeec9e9c68ec426ab 100644 GIT binary patch literal 1688 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU{K&-W?*2L>fE=Dfq{V~-O<;Pfnj4`&F{d; zAjxEpAYTTCc76ti9)1Rfzd;NPjSdV9wUrDEFS{8SY@RYONS-OSX)R}9U}gyL32|j$ zU}z~!pWR-wb#DKeo$DW7Jo5Iz<^Nw^FpPrH5Eua=F#q#WIR*wshLRw^;Qu2VFa&>R zS7l&e;4JWnEM{Qf<_BTMNk5sFGB7Yml(rIsj|=o#o4 z{eHOo7y|?2B~KT}5D)LAQ#vO#8}K-LpZov+(Ywhxr#4z&$h9@_6j8dp>G0#s?7jUL zSLseD*X8^*C;3a%w52sZ2JX*ocpCR)YajeEtAS^qqQjAUx80=*w)9Rj+wv%L@6&&4 z9Sv^1@ZDD|C9|_Wn_p_dMW$16%3eEU%UD_tyK{NZPJhMD$zk5O+cRhib7RKVgY7=& zS=N4wi(azf+(zR@r`KE0|LShY=(IFB^Ru(z$CLRB&qP-FTj-vyNd4rKU|_xdzp#kx zTB|oFS6FXx(+3D)Es?8%6XrTe+;5e3(Sz6s2xT-hbJ5JZWXz zr=SVOjE}sll&yog^k;MiUD*5d)BYuUR3;c(sfbMpd-t>O%)zVtAM{vDKg??Sqg~PW zIfun=&*me!U(SbZZ&kVw*w<+8z!6n4U+b-5q4cKjf!DRJtVJvd{BuZFG&x68GCA{V3=a0<9PT1&{}y>w z75ZbEdg1Km+b%rZ-AdO(^fJVV%U z%CWstItO-hEICj%w^sbfg8jjDMZO>UYCS*H{A0-0d(v2D!c_?>2|Qi>T-G@yGywqi C5FKU! delta 762 zcmbQi+sZaUyxxI@nSp^J!ae6L0|SFZfKP}k0|UdEo$DW7JhF9e|Lpdfw+}A=|MH@x zFkS4g(s>332F8*gzhDN3XE)Lq7?@^zx;TbZFs{Agxc;^o55t2SneWxU?%C`b{ywHv zuB>)7>kldJ1?Qs~e)H=z{Qsxo>c@P>vvF&U!xw>iLr=~}imvsIQHJ%lHoZ+ArGL2t zy7K2%vx@zUOfdSf-*sQ!W(7ro#tjcl%pZ2^zms0HEbFv?yV0L`6LzD^HGJ_b3@bkJ zr7$}wedIkA$;!6xo@2C2z}%K8ybn0SHqLs(#-;S&aHHaybD@kY7;b!I>k|uMDfF!V z*!ej5S^wX83yKY^xD{8`+b+1XAx<{hV4jhMT}~k9owcuT8Bh2*dlt_F#uw*UA5>jo z*~I=px6!__Xa4NDB3;4>*=JaVEtrn)?>S|*++rrTBhykhMTJ#GyjqOiF24h$=n zo>VAr{I&gO5wnLPgK@(gCX>K_fuf5wwwV=+do1i=k$Y^&+IhWtL8|!?vwHuOgnP^j zb}>|OyJ%Q1VAv-s#^QLj`*B;%o&6eILP!5J@3xMKZ~A$9SKS_l%l!>M#1-!Udu}Qc z;@mOuQte&lW!Daiy7$j2bIg2I82kES_A?ePUpb!I{r|RJf8CXKCAOYerY@+QZt*_Fp=8%fe#n+9L61{TwyE@5L?E8A_PA zm#Y<*E3Whve4KexjVJ5EjK;cdg_!!yCyMsv+9q}DhVJZ+S#rW?b~KmT=@lh%NehA} za+o|7Ea|_)x;ujTx>B0u`@0NXv0qfa=xt)=S`ebb=qJ9}dhxE3JGNQH3*(LC|FIT@ Xu35$sYSYNTz`)??>gTe~DWM4fGDlLH diff --git a/tools/Conversion_Table.csv b/tools/Conversion_Table.csv index e4302273..7de853b7 100644 --- a/tools/Conversion_Table.csv +++ b/tools/Conversion_Table.csv @@ -718,8 +718,8 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/entity/rabbit,toast.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_toast.png,,,,,,, /assets/minecraft/textures/entity/rabbit,white.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_white.png,,,,,,, /assets/minecraft/textures/entity/rabbit,white_splotched.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_rabbit_white_splotched.png,,,,,,, -/assets/minecraft/textures/entity/sheep,sheep_fur.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_sheep_fur.png,,,,,,,y -/assets/minecraft/textures/entity/sheep,sheep.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_sheep.png,,,,,,,y +/assets/minecraft/textures/entity/sheep,sheep_fur.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_sheep_fur.png,,,,,,, +/assets/minecraft/textures/entity/sheep,sheep.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_sheep.png,,,,,,, /assets/minecraft/textures/entity/shulker,shulker_black.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_black.png,,,,,,,y /assets/minecraft/textures/entity/shulker,shulker_blue.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_blue.png,,,,,,,y /assets/minecraft/textures/entity/shulker,shulker_brown.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_shulker_brown.png,,,,,,,y From 050987bead5a5d7db2f16958f04544c2b18d83b4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 May 2018 18:48:07 +0200 Subject: [PATCH 0086/1107] Add illagers to Conversion Table --- .../{mobs_mc_evoker_base.png => mobs_mc_evoker.png} | Bin ...c_vindicator_base.png => mobs_mc_vindicator.png} | Bin mods/ENTITIES/mobs_mc/villager_evoker.lua | 2 +- mods/ENTITIES/mobs_mc/villager_vindicator.lua | 2 +- tools/Conversion_Table.csv | 3 +++ 5 files changed, 5 insertions(+), 2 deletions(-) rename mods/ENTITIES/mobs_mc/textures/{mobs_mc_evoker_base.png => mobs_mc_evoker.png} (100%) rename mods/ENTITIES/mobs_mc/textures/{mobs_mc_vindicator_base.png => mobs_mc_vindicator.png} (100%) diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_evoker_base.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_evoker.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_evoker_base.png rename to mods/ENTITIES/mobs_mc/textures/mobs_mc_evoker.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_vindicator_base.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_vindicator.png similarity index 100% rename from mods/ENTITIES/mobs_mc/textures/mobs_mc_vindicator_base.png rename to mods/ENTITIES/mobs_mc/textures/mobs_mc_vindicator.png diff --git a/mods/ENTITIES/mobs_mc/villager_evoker.lua b/mods/ENTITIES/mobs_mc/villager_evoker.lua index 45b50d05..1e7fa9ec 100644 --- a/mods/ENTITIES/mobs_mc/villager_evoker.lua +++ b/mods/ENTITIES/mobs_mc/villager_evoker.lua @@ -24,7 +24,7 @@ mobs:register_mob("mobs_mc:evoker", { visual = "mesh", mesh = "mobs_mc_villager.b3d", textures = { { - "mobs_mc_evoker_base.png", + "mobs_mc_evoker.png", "blank.png", --no hat -- TODO: Attack glow } }, diff --git a/mods/ENTITIES/mobs_mc/villager_vindicator.lua b/mods/ENTITIES/mobs_mc/villager_vindicator.lua index 15983f71..aafd083b 100644 --- a/mods/ENTITIES/mobs_mc/villager_vindicator.lua +++ b/mods/ENTITIES/mobs_mc/villager_vindicator.lua @@ -24,7 +24,7 @@ mobs:register_mob("mobs_mc:vindicator", { mesh = "mobs_mc_vindicator.b3d", textures = { { - "mobs_mc_vindicator_base.png", + "mobs_mc_vindicator.png", "blank.png", --no hat "default_tool_steelaxe.png", -- TODO: Glow when attacking (mobs_mc_vindicator.png) diff --git a/tools/Conversion_Table.csv b/tools/Conversion_Table.csv index 7de853b7..4422a1a8 100644 --- a/tools/Conversion_Table.csv +++ b/tools/Conversion_Table.csv @@ -753,6 +753,9 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/entity/villager,smith.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_villager_smith.png,,,,,,, /assets/minecraft/textures/entity/illager,vex.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_vex.png,,,,,,, /assets/minecraft/textures/entity/illager,vex_charging.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_vex_charging.png,,,,,,, +/assets/minecraft/textures/entity/illager,vindicator.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_vindicator.png,,,,,,, +/assets/minecraft/textures/entity/illager,evoker.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_evoker.png,,,,,,, +/assets/minecraft/textures/entity/illager,illusionist.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_illusionist.png,,,,,,, /assets/minecraft/textures/entity,witch.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_witch.png,,,,,,, /assets/minecraft/textures/entity/wither,wither.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_wither.png,,,,,,, /assets/minecraft/textures/entity/skeleton,wither_skeleton.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_wither_skeleton.png,,,,,,, From 293caa511fd2979fa9ec00d2661774adbc7c15d6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 May 2018 18:55:37 +0200 Subject: [PATCH 0087/1107] Fix broken zombie villager texture conversion --- tools/Conversion_Table.csv | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/Conversion_Table.csv b/tools/Conversion_Table.csv index 4422a1a8..de78a256 100644 --- a/tools/Conversion_Table.csv +++ b/tools/Conversion_Table.csv @@ -766,11 +766,11 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/entity/zombie_villager,zombie_butcher.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_butcher.png,,,,,,, /assets/minecraft/textures/entity/zombie_villager,zombie_farmer.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_farmer.png,,,,,,, /assets/minecraft/textures/entity/zombie_villager,zombie_librarian.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_librarian.png,,,,,,, -/assets/minecraft/textures/entity,zombie_pigman.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_pigman.png,,,,,,, -/assets/minecraft/textures/entity/zombie,zombie.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie.png,,,,,,, /assets/minecraft/textures/entity/zombie_villager,zombie_priest.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_priest.png,,,,,,, /assets/minecraft/textures/entity/zombie_villager,zombie_smith.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_smith.png,,,,,,, -/assets/minecraft/textures/entity/zombie,zombie_villager.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_villager.png,,,,,,, +/assets/minecraft/textures/entity/zombie_villager,zombie_villager.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_villager.png,,,,,,, +/assets/minecraft/textures/entity,zombie_pigman.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie_pigman.png,,,,,,, +/assets/minecraft/textures/entity/zombie,zombie.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_zombie.png,,,,,,, /assets/minecraft/textures/gui,icons.png,/mods/PLAYER/mcl_hunger/textures,hbhunger_bgicon.png,16,27,9,9,0,0,y /assets/minecraft/textures/gui,icons.png,/mods/PLAYER/mcl_hunger/textures,hbhunger_icon_health_poison.png,88,0,9,9,0,0,y /assets/minecraft/textures/gui,icons.png,/mods/PLAYER/mcl_hunger/textures,hbhunger_icon.png,52,27,9,9,0,0,y From eefd06572675a7d87a244b89cee516d388498891 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 May 2018 19:51:40 +0200 Subject: [PATCH 0088/1107] New horse texturing (thanks to 22i) --- mods/ENTITIES/mobs_mc/horse.lua | 62 ++++++++++-------- .../ENTITIES/mobs_mc/models/mobs_mc_horse.b3d | Bin 352667 -> 443384 bytes .../mobs_mc/textures/mobs_mc_donkey.png | Bin 1271 -> 3085 bytes .../mobs_mc/textures/mobs_mc_horse_black.png | Bin 1247 -> 2975 bytes .../mobs_mc/textures/mobs_mc_horse_brown.png | Bin 1279 -> 2994 bytes .../mobs_mc/textures/mobs_mc_horse_chest.png | Bin 273 -> 0 bytes .../textures/mobs_mc_horse_chestnut.png | Bin 1274 -> 2993 bytes .../textures/mobs_mc_horse_darkbrown.png | Bin 1266 -> 2999 bytes .../mobs_mc/textures/mobs_mc_horse_gray.png | Bin 1246 -> 2974 bytes .../mobs_mc/textures/mobs_mc_horse_saddle.png | Bin 355 -> 0 bytes .../textures/mobs_mc_horse_skeleton.png | Bin 1041 -> 5972 bytes .../mobs_mc/textures/mobs_mc_horse_white.png | Bin 1188 -> 2904 bytes .../mobs_mc/textures/mobs_mc_horse_zombie.png | Bin 5640 -> 11350 bytes .../mobs_mc/textures/mobs_mc_mule.png | Bin 1260 -> 3094 bytes 14 files changed, 35 insertions(+), 27 deletions(-) delete mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_chest.png delete mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_saddle.png diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 4d27299f..9aa5a161 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -7,8 +7,6 @@ local MP = minetest.get_modpath(minetest.get_current_modname()) local S, NS = dofile(MP.."/intllib.lua") ---dofile(minetest.get_modpath("mobs").."/api.lua") - --################### --################### HORSE --################### @@ -19,18 +17,23 @@ local horse_extra_texture = function(horse) local saddle = horse._saddle local chest = horse._chest local armor = horse._horse_armor - if armor then - if minetest.get_item_group(armor, "horse_armor") > 0 then - base = base .. "^" .. minetest.registered_items[armor]._horse_overlay_image - end + 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 - base = base .. "^mobs_mc_horse_saddle.png" + textures[3] = base + else + textures[3] = "blank.png" end if chest then - base = base .. "^mobs_mc_horse_chest.png" + textures[1] = base + else + textures[1] = "blank.png" end - return base + return textures end -- Helper functions to determine equipment rules @@ -46,7 +49,7 @@ end --[[ Generate all possible horse textures. Horse textures are a combination of a base texture and an optional marking overlay. ]] --- The base horse textures +-- The base horse textures (fur) (fur) local horse_base = { "mobs_mc_horse_brown.png", "mobs_mc_horse_darkbrown.png", @@ -67,7 +70,11 @@ local horse_markings = { local horse_textures = {} for b=1, #horse_base do for m=1, #horse_markings do - table.insert(horse_textures, { horse_base[b] .. horse_markings[m] }) + table.insert(horse_textures, { + "blank.png", -- chest + horse_base[b] .. horse_markings[m], -- base texture + markings and optional armor + "blank.png", -- saddle + }) end end @@ -79,10 +86,15 @@ local horse = { 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, walk_speed = 25, run_speed = 50, - stand_start = 0, stand_end = 0, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, + stand_speed = 25, + stand_start = 0, + stand_end = 0, + walk_speed = 25, + walk_start = 0, + walk_end = 40, + run_speed = 50, + run_start = 0, + run_end = 40, }, textures = horse_textures, fear_height = 4, @@ -198,10 +210,10 @@ local horse = { -- Update texture if not self._naked_texture then -- Base horse texture without chest or saddle - self._naked_texture = self.base_texture[1] + self._naked_texture = self.base_texture[2] end local tex = horse_extra_texture(self) - self.base_texture = { tex } + self.base_texture = tex self.object:set_properties({textures = self.base_texture}) -- Put on horse armor if tamed @@ -219,10 +231,6 @@ local horse = { end -- Set horse armor strength - --[[ WARNING: This goes deep into the entity data structure and depends on - how Mobs Redo works internally. This code assumes that Mobs Redo uses - the fleshy group for armor. ]] - -- TODO: Change this code as soon Mobs Redo officially allows to change armor afterwards self.armor = armor local agroups = self.object:get_armor_groups() agroups.fleshy = self.armor @@ -231,10 +239,10 @@ local horse = { -- Update texture if not self._naked_texture then -- Base horse texture without chest or saddle - self._naked_texture = self.base_texture[1] + self._naked_texture = self.base_texture[2] end local tex = horse_extra_texture(self) - self.base_texture = { tex } + self.base_texture = tex self.object:set_properties({textures = self.base_texture}) @@ -263,7 +271,7 @@ mobs:register_mob("mobs_mc:horse", horse) -- Skeleton horse local skeleton_horse = table.copy(horse) -skeleton_horse.textures = {{"mobs_mc_horse_skeleton.png"}} +skeleton_horse.textures = {{"blank.png", "mobs_mc_horse_skeleton.png", "blank.png"}} skeleton_horse.drops = { {name = mobs_mc.items.bone, chance = 1, @@ -281,7 +289,7 @@ mobs:register_mob("mobs_mc:skeleton_horse", skeleton_horse) -- Zombie horse local zombie_horse = table.copy(horse) -zombie_horse.textures = {{"mobs_mc_horse_zombie.png"}} +zombie_horse.textures = {{"blank.png", "mobs_mc_horse_zombie.png", "blank.png"}} zombie_horse.drops = { {name = mobs_mc.items.rotten_flesh, chance = 1, @@ -300,7 +308,7 @@ mobs:register_mob("mobs_mc:zombie_horse", zombie_horse) -- Donkey local d = 0.86 -- donkey scale local donkey = table.copy(horse) -donkey.textures = {{"mobs_mc_donkey.png"}} +donkey.textures = {{"blank.png", "mobs_mc_donkey.png", "blank.png"}} donkey.animation = { speed_normal = 25, stand_start = 0, stand_end = 0, @@ -323,7 +331,7 @@ mobs:register_mob("mobs_mc:donkey", donkey) -- Mule local m = 0.94 local mule = table.copy(donkey) -mule.textures = {{"mobs_mc_mule.png"}} +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.collisionbox = { horse.collisionbox[1] * m, diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_horse.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_horse.b3d index 1154298e64286936af8e3a904b3da9f4135fd314..613cb5eddcc55ece80257b3676079cbd15d4225c 100644 GIT binary patch literal 443384 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

hd?xF z5(q?tCWk;YXkrLNgC>bUG-xsiM1v-YKs0EA2t

iUye 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 UxAeh>!^#h?JZzV*`{BX>08biqp#T5? literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/vex.lua b/mods/ENTITIES/mobs_mc/vex.lua index ec881dcd..01f7af70 100644 --- a/mods/ENTITIES/mobs_mc/vex.lua +++ b/mods/ENTITIES/mobs_mc/vex.lua @@ -36,9 +36,9 @@ mobs:register_mob("mobs_mc:vex", { run_velocity = 5.9, attack_type = "dogfight", sounds = { - random = "mobs_rat", - death = "green_slime_death", - -- TODO: Sounds: random (better), death (better), damage + -- TODO: random + death = "mobs_mc_vex_death", + damage = "mobs_mc_vex_hurt", distance = 16, }, animation = { From 5d6d1cf7904eecb41a7fe5a343004e052e377314 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 18 Sep 2018 19:46:44 +0200 Subject: [PATCH 0179/1107] Add bat sound --- mods/ENTITIES/mobs_mc/LICENSE-media.md | 3 +++ mods/ENTITIES/mobs_mc/bat.lua | 3 +-- .../mobs_mc/sounds/mobs_mc_bat_idle.ogg | Bin 0 -> 10889 bytes 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_idle.ogg diff --git a/mods/ENTITIES/mobs_mc/LICENSE-media.md b/mods/ENTITIES/mobs_mc/LICENSE-media.md index 65124094..6a8457bb 100644 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ b/mods/ENTITIES/mobs_mc/LICENSE-media.md @@ -155,5 +155,8 @@ Origin of those models: * Source: * `mobs_mc_vex_death.ogg` (CC0) * Source: +* [suonho](https://freesound.org/people/suonho/) + * `mobs_mc_bat_idle.ogg` (CC BY 3.0) + * Source: Note: Many of these sounds have been more or less modified to fit the game. diff --git a/mods/ENTITIES/mobs_mc/bat.lua b/mods/ENTITIES/mobs_mc/bat.lua index 27a0d23c..6021b424 100644 --- a/mods/ENTITIES/mobs_mc/bat.lua +++ b/mods/ENTITIES/mobs_mc/bat.lua @@ -18,8 +18,7 @@ mobs:register_mob("mobs_mc:bat", { }, visual_size = {x=1, y=1}, sounds = { - random = "mobs_rat", -- TODO: This sound is supposed to be very high-pitched and scary - -- TODO: more sounds? + random = "mobs_mc_bat_idle", distance = 16, }, walk_velocity = 4.5, diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_idle.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_bat_idle.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e56b90802a21dea3d1f29e3562a0d960b1138cfc GIT binary patch literal 10889 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

YoCXBVG5>G}AV ztnNkOQC6hx7$o}?+Uhhzw%>E{@AxlP*;At_9?$#Rx3+IvZ(ZJ}7aDr@*3X!o>%M(c@$-EaXIxn&$)|6vv2yPX z(apzKTrR0E?$=UI)Qy@{bbM$3dxz~tWxoQe(xyZnKWe*i%?b5|J3c>Mxb5oJU7gIA z>bQUZ`c`!Q<;U9CgiWCtiQX?l9tG73{ycH0>FLbW)vwEqH(!l&^y2*7a6*XL_voY= z`PXwYrGBxUG>MxzIed+uVv?nIA-9BYfc4+p`4jgaS$c2pmU-qDe|n~0nWx*b`k6z~ zyJxFzeZQNnl9yTizQUrK>&N~_ZQHhLA9p)txN@G{I?G1=u)q5s?_VUJ)A9SytA-eD zYnzH)=MOIMJC-*~dwz}1vbU$d-0%Bv)Ao*B+{@VKU(z(rhQ3n^{r1mxSHJwf9rCB| z|EtK^@A}Zx;%vLfyY&xF_Ux80S^ zi9WM(*2>AAJNIR$s64Vhe*2K`hRu^Jw%58Jj^Cqm;m5kjwpY6kZB+ZN|2)Aj`|`IV zdEK}AR-c^Nq>=UG+`Oazp2kehRPVcT`6*9BSN}SmeGz|l_IBPXyB&L5&i=loh1l<4 zW6KPdMNBCVdS|{rD=v}C;tA|?(C}Y1mk$VK%<+1 z@k!g=E>u}A6k2%WoU>2K;#Ys~>N0M;ZFYTIf2iHO%ew*<61bRL-31?8{4F@D|M1z7 z!=Gk8)0^MhvuyDezDxZZj15Cx&Ez>g$t#>!)_CLeCuM!y>aQ->#0oFFvVA_*UplOY_g7-n({a-o2Y`9)2px zb3%u95Z`0QmruTK)7))sZGF_&`Zi;Y-lntCObr72f~()XWnR_DbWUW6gQu`xLl6T) zErWHg&8>S(eK&)J_ow;(bl{nh+*4i~@@{cTU_0|pn+e4y>Ys0~oS66jZtWzo$SDcj zOY>8TcFKO?-~47-`FlTmlLt#;i#8qTUbbmhyz=b%*AIlb7VMGL$UIeI?ft)my~~K9 LfSKXPE`B}$GCW7Y literal 0 HcmV?d00001 From a3d798ca13c85f427c6529a65f5dc6049be44527 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 18 Sep 2018 20:08:03 +0200 Subject: [PATCH 0180/1107] Fix mobs playing damage sound when they healed --- mods/ENTITIES/mcl_mobs/api.lua | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 846a86c2..cf72c795 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -421,18 +421,22 @@ local check_for_death = function(self, cause, cmi_cause) return end + local damaged = self.health < self.old_health self.old_health = self.health - -- still got some health? play hurt sound + -- still got some health? if self.health > 0 then - mob_sound(self, self.sounds.damage) - -- 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 + if damaged then + mob_sound(self, self.sounds.damage) + end + -- backup nametag so we can show health stats if not self.nametag2 then self.nametag2 = self.nametag or "" From 92dca4850a2591df0ef8983187b8701e1c2cb07a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 18 Sep 2018 21:21:05 +0200 Subject: [PATCH 0181/1107] Add new cat/ocelot sounds --- mods/ENTITIES/mobs_mc/LICENSE-media.md | 11 ++++++++- mods/ENTITIES/mobs_mc/ocelot.lua | 22 +++++++++++++----- mods/ENTITIES/mobs_mc/sounds/mobs_kitten.ogg | Bin 14929 -> 0 bytes .../mobs_mc/sounds/mobs_mc_cat_hiss.ogg | Bin 0 -> 25733 bytes .../mobs_mc/sounds/mobs_mc_cat_idle.1.ogg | Bin 0 -> 20747 bytes .../mobs_mc/sounds/mobs_mc_cat_idle.2.ogg | Bin 0 -> 56858 bytes .../mobs_mc/sounds/mobs_mc_ocelot_hurt.ogg | Bin 0 -> 17396 bytes 7 files changed, 26 insertions(+), 7 deletions(-) delete mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_kitten.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_hiss.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_idle.1.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_idle.2.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_ocelot_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/LICENSE-media.md b/mods/ENTITIES/mobs_mc/LICENSE-media.md index 6a8457bb..b3a72847 100644 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ b/mods/ENTITIES/mobs_mc/LICENSE-media.md @@ -107,7 +107,7 @@ Origin of those models: * TenPlus1, from `mobs_monster` or `mobs_animal` mod (MIT License) * `mobs_chicken.ogg` * `mobs_fireball.ogg` - * `mobs_kitten.ogg` + * `mobs_mc_cat_idle.1.ogg` * `mobs_mc_llama.ogg` * `mobs_pig.ogg` * `mobs_pig_angry.ogg` @@ -158,5 +158,14 @@ Origin of those models: * [suonho](https://freesound.org/people/suonho/) * `mobs_mc_bat_idle.ogg` (CC BY 3.0) * 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: Note: Many of these sounds have been more or less modified to fit the game. diff --git a/mods/ENTITIES/mobs_mc/ocelot.lua b/mods/ENTITIES/mobs_mc/ocelot.lua index e6c385cf..17461127 100644 --- a/mods/ENTITIES/mobs_mc/ocelot.lua +++ b/mods/ENTITIES/mobs_mc/ocelot.lua @@ -50,15 +50,19 @@ local ocelot = { fall_damage = 0, fear_height = 4, sounds = { - random = "mobs_kitten", - -- TODO: more sounds + damage = "mobs_mc_ocelot_hurt", + death = "mobs_mc_ocelot_hurt", 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, + speed_normal = 25, + speed_run = 50, + stand_start = 0, + stand_end = 0, + walk_start = 0, + walk_end = 40, + run_start = 0, + run_end = 40, }, follow = mobs_mc.follow.ocelot, view_range = 12, @@ -107,6 +111,12 @@ cat.tamed = true cat.runaway = false -- 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", + distance = 16, +} cat.on_rightclick = function(self, clicker) if mobs:feed_tame(self, clicker, 1, true, false) then return end if mobs:capture_mob(self, clicker, 0, 60, 5, false, nil) then return end diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_kitten.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_kitten.ogg deleted file mode 100644 index c2cdec59dc928357921cbedb71fecb326ae60026..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14929 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 O*3k4U|69N68wLPF>cN5l diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_hiss.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cat_hiss.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a51db0fe9da0ccd4b581fca022f266b7b06c367c GIT binary patch literal 25733 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%0AI&hlMX!8oob&dHG70 zx#u75J2vC=Y`$~qYvWeUUmWXsU$Xn*GkbZh>&K6sa4w$z#{c<>%Ir0timaBuUXc7- zZslZ$?s>a*-~X^;pYgMY9qs<#mfIeyo1LPbe$r0=z5iV)%l|>O_HRBHKYRWo#=8FF zjHCOK_kBF<+x*Zb>tIY-{f|!@=N8qiw%`1@KE+}8M&*~<2_0Xz?X!EeHt#U=`!36* z>C=igT7QZWTEF8KN7m$Apl@pm8gU-i<@T9+~T z-S?Dv`|R5FZoc35)=WpbQ*zhq)Ozof3XSjQ_X${?IBIUb`rGsPt(Nz4mPb$iI&=B- zk}Q^w8`iAQo);UiP4UyS+{u5EG|KZWZf=*@RmA_ilkMAfU7xp;`gU(hd0k{0$}q1v z`t+A#FXjejp~ZQY`(87fpY_^(&hf`x!P_^J9MzXkn{0PgN5(c+zC=H3)3z-|URFlUpi-AD;A7_I@MWp1aYr`$^n4MUOke z+Evp^jAaUA!!Eby?=x8!VsCuoR&=zf?_BA{DO#B+$)_ehzv=MI=IcWb)1qewr_T9p z{%J|r>&0n*e|0|9er>r+<$CxVX+cgFog0UQ=7sHkwY9EpBI{?~&p{q18>_6Y?YP@N z#pp-5%=e`;wm)jRE%M$w`_`YPf3}sM4ZK#KyglFd^R38FH5Xb7i@bV6pX;vLdY$Xb z&1&|X&UJI{-d^}tN^;|7leO``7cIVAXPo@5<;>2`9;qLimJ{7F-@V$nr?zP4_3y>J z%aaQ4t~)UE`uBw&f0RvGvi(myosxOGtTk>#~s>IL2;(PkL z?tb0OGxO^1xx4pQdOWWD5LQyOkCvh@478}m;NE|?;1CT^3Q2LKG6xLsb8`K>=$pdm#y_bGmT~Mt1p?~)M~8n z?{e^9t9frd`+fLE8<8b1w$BYrc*Qg?x%$mtUOtTnYq*aki1qKWus(Af)K-nfNTa;l(@98^#`}z3i|8w1VcdJ2B_}Tfv`JsO<&iOEF zSLzY}l>2f&#rd8uDoEO~@uWcVzx5vz`5ym0yfyWru|#*y%FiwbUmV*}V(lNF`rxvD zwzKD~GI9$IwiAcTE^NQNa{ku4{3n-{*Pc6^Xx(z)#Ee}R?;m)dqVVs*BUwiZ2Unf>+?XG^WbN%7J|L-op?SFr7?$^(6_Z1kJ`|Wf(#e6WY*8J(J Y?Z2m*Yj3!$E5g|K-uc`^J4OaR062TcPXGV_ literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..48e9977ed89811e7fb38c19be95dc1ec9f5fde91 GIT binary patch literal 20747 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 z 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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..7e73248334cea88fc2bd5b0ce03bcc3032be0d6b GIT binary patch literal 56858 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 I$H2e<0Q(a|MF0Q* literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_ocelot_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_ocelot_hurt.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d2c6d97aaa7f73cda3404e3db201b58ec0359bfa GIT binary patch literal 17396 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 Date: Tue, 18 Sep 2018 21:39:03 +0200 Subject: [PATCH 0182/1107] Fix mobs_mc_vex_death.ogg being stereo --- .../mobs_mc/sounds/mobs_mc_vex_death.ogg | Bin 15955 -> 11574 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_death.ogg index 9d56297ebc8576b73e5f700fcdd5809e708f29f4..561893726f88eeffb233fbc38852c91aa65069c1 100644 GIT binary patch delta 10003 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 From 26838fb2d6cb96c9b422533b5c1e07ca4641b3dc Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 18 Sep 2018 22:27:24 +0200 Subject: [PATCH 0183/1107] Version 0.42.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 911a845d..6434f260 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.41.3 +Version: 0.42.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From d1fb01c2ff8ec19c2c1f18104a2a74fc19f41e1e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 23 Oct 2018 17:03:42 +0200 Subject: [PATCH 0184/1107] Fix crash if trading with cleric in non-v6 mapgen --- mods/ENTITIES/mobs_mc/villager.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 892afadf..330250f3 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -52,6 +52,7 @@ 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 } } @@ -322,9 +323,9 @@ local professions = { }, { - TRADE_V6_RED_SANDSTONE, { E1, { "mcl_nether:glowstone", 1, 3 } }, { { "mcl_core:emerald", 4, 7 }, { "mcl_throwing:ender_pearl", 1, 1 } }, + TRADE_V6_RED_SANDSTONE, }, -- TODO: Bottle 'o enchanting From 22f0cf18668176a9abd9f765b432ced9d4e37c80 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 23 Oct 2018 17:04:37 +0200 Subject: [PATCH 0185/1107] Version 0.42.1 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6434f260..7b2c865e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.42.0 +Version: 0.42.1 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From a88429a78e9be36ba172df522662cb60b7db1c59 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 23 Oct 2018 17:13:22 +0200 Subject: [PATCH 0186/1107] Fix missing zombie growl --- mods/ENTITIES/mobs_mc/LICENSE-media.md | 2 +- mods/ENTITIES/mobs_mc/zombie.lua | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/LICENSE-media.md b/mods/ENTITIES/mobs_mc/LICENSE-media.md index b3a72847..4cb4a800 100644 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ b/mods/ENTITIES/mobs_mc/LICENSE-media.md @@ -117,7 +117,7 @@ Origin of those models: * BrandonReese (LGPL v2.1) * `mobs_eerie.ogg` * [Under7dude](https://freesound.org/people/Under7dude/) (CC0) - * `mobs_mc_zombie_idle.ogg` + * `mobs_mc_zombie_growl.ogg` * Source: * [haratman](https://freesound.org/people/haratman/) (CC0) * `mobs_mc_zombie_death.ogg` diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index eb99c18a..72c76b32 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -57,8 +57,8 @@ local zombie = { visual_size = {x=3, y=3}, makes_footstep_sound = true, sounds = { - random = "mobs_mc_zombie_idle", - war_cry = "mobs_mc_zombie_idle", + random = "mobs_mc_zombie_growl", + war_cry = "mobs_mc_zombie_growl", death = "mobs_mc_zombie_death", damage = "mobs_mc_zombie_hurt", distance = 16, From e0fe5b2c66e042ef904175de792561eff53fb4fe Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 23 Oct 2018 17:34:01 +0200 Subject: [PATCH 0187/1107] Disable zombie war_cry sound for now --- mods/ENTITIES/mobs_mc/zombie.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index 72c76b32..0eb33f58 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -58,7 +58,8 @@ local zombie = { makes_footstep_sound = true, sounds = { random = "mobs_mc_zombie_growl", - war_cry = "mobs_mc_zombie_growl", + --TODO: war_cry = "mobs_mc_zombie_growl", + -- Problem: The war_cry sound plays too often death = "mobs_mc_zombie_death", damage = "mobs_mc_zombie_hurt", distance = 16, From b076bafaa7419bd5445f4c560502272dd4c8b5d3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 23 Oct 2018 18:51:19 +0200 Subject: [PATCH 0188/1107] Rename mcl_playerphysics to playerphysics --- mods/ITEMS/mcl_beds/depends.txt | 2 +- mods/ITEMS/mcl_beds/functions.lua | 8 ++++---- mods/ITEMS/mcl_bows/bow.lua | 8 ++++---- mods/ITEMS/mcl_bows/depends.txt | 2 +- mods/PLAYER/mcl_playerphysics/mod.conf | 1 - mods/PLAYER/mcl_playerplus/depends.txt | 2 +- mods/PLAYER/mcl_playerplus/init.lua | 6 +++--- mods/PLAYER/mcl_sprint/depends.txt | 2 +- mods/PLAYER/mcl_sprint/init.lua | 4 ++-- .../README.md | 16 ++++++++-------- .../init.lua | 16 ++++++++-------- mods/PLAYER/playerphysics/mod.conf | 1 + 12 files changed, 34 insertions(+), 34 deletions(-) delete mode 100644 mods/PLAYER/mcl_playerphysics/mod.conf rename mods/PLAYER/{mcl_playerphysics => playerphysics}/README.md (80%) rename mods/PLAYER/{mcl_playerphysics => playerphysics}/init.lua (58%) create mode 100644 mods/PLAYER/playerphysics/mod.conf diff --git a/mods/ITEMS/mcl_beds/depends.txt b/mods/ITEMS/mcl_beds/depends.txt index ad8c41c0..3285e591 100644 --- a/mods/ITEMS/mcl_beds/depends.txt +++ b/mods/ITEMS/mcl_beds/depends.txt @@ -1,4 +1,4 @@ -mcl_playerphysics +playerphysics mcl_sounds? mcl_worlds? mcl_wool? diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 702a1d0c..480240ee 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -110,8 +110,8 @@ local function lay_down(player, pos, bed_pos, state, skip) player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) player:set_look_horizontal(math.random(1, 180) / 100) mcl_player.player_attached[name] = false - mcl_playerphysics.remove_physics_factor(player, "speed", "mcl_beds:sleeping") - mcl_playerphysics.remove_physics_factor(player, "jump", "mcl_beds:sleeping") + playerphysics.remove_physics_factor(player, "speed", "mcl_beds:sleeping") + playerphysics.remove_physics_factor(player, "jump", "mcl_beds:sleeping") player:set_attribute("mcl_beds:sleeping", "false") hud_flags.wielditem = true mcl_player.player_set_animation(player, "stand" , 30) @@ -129,8 +129,8 @@ local function lay_down(player, pos, bed_pos, state, skip) local dir = minetest.facedir_to_dir(param2) local p = {x = bed_pos.x + dir.x / 2, y = bed_pos.y, z = bed_pos.z + dir.z / 2} player:set_attribute("mcl_beds:sleeping", "true") - mcl_playerphysics.add_physics_factor(player, "speed", "mcl_beds:sleeping", 0) - mcl_playerphysics.add_physics_factor(player, "jump", "mcl_beds:sleeping", 0) + playerphysics.add_physics_factor(player, "speed", "mcl_beds:sleeping", 0) + playerphysics.add_physics_factor(player, "jump", "mcl_beds:sleeping", 0) player:setpos(p) mcl_player.player_attached[name] = true hud_flags.wielditem = false diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 7e7d27e3..857ccda3 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -127,8 +127,8 @@ end local reset_bow_state = function(player, also_reset_bows) bow_load[player:get_player_name()] = nil bow_index[player:get_player_name()] = nil - if minetest.get_modpath("mcl_playerphysics") then - mcl_playerphysics.remove_physics_factor(player, "speed", "mcl_bows:use_bow") + 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) @@ -222,9 +222,9 @@ controls.register_on_hold(function(player, key, time) if bow_load[name] == nil and wielditem:get_name()=="mcl_bows:bow" and (minetest.settings:get_bool("creative_mode") or inv:contains_item("main", "mcl_bows:arrow")) then wielditem:set_name("mcl_bows:bow_0") player:set_wielded_item(wielditem) - if minetest.get_modpath("mcl_playerphysics") then + if minetest.get_modpath("playerphysics") then -- Slow player down when using bow - mcl_playerphysics.add_physics_factor(player, "speed", "mcl_bows:use_bow", PLAYER_USE_BOW_SPEED) + 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() diff --git a/mods/ITEMS/mcl_bows/depends.txt b/mods/ITEMS/mcl_bows/depends.txt index 228a1357..736cd117 100644 --- a/mods/ITEMS/mcl_bows/depends.txt +++ b/mods/ITEMS/mcl_bows/depends.txt @@ -4,7 +4,7 @@ mcl_achievements? mcl_hunger? mcl_core? mcl_mobitems? -mcl_playerphysics? +playerphysics? doc? doc_identifier? mesecons_button? diff --git a/mods/PLAYER/mcl_playerphysics/mod.conf b/mods/PLAYER/mcl_playerphysics/mod.conf deleted file mode 100644 index ff2bed37..00000000 --- a/mods/PLAYER/mcl_playerphysics/mod.conf +++ /dev/null @@ -1 +0,0 @@ -name=mcl_playerphysics diff --git a/mods/PLAYER/mcl_playerplus/depends.txt b/mods/PLAYER/mcl_playerplus/depends.txt index 9eb53eaf..3e89821c 100644 --- a/mods/PLAYER/mcl_playerplus/depends.txt +++ b/mods/PLAYER/mcl_playerplus/depends.txt @@ -3,7 +3,7 @@ mcl_core mcl_particles mcl_hunger mcl_death_messages -mcl_playerphysics +playerphysics mcl_playerinfo 3d_armor? mcl_weather diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 4a454adb..1320028a 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -96,13 +96,13 @@ minetest.register_globalstep(function(dtime) -- TODO: Also slow down mobs -- Slow down even more when soul sand is above certain block if node_stand_below == "mcl_core:ice" or node_stand_below == "mcl_core:packed_ice" or node_stand_below == "mcl_core:slimeblock" or node_stand_below == "mcl_core:water_source" then - mcl_playerphysics.add_physics_factor(player, "speed", "mcl_playerplus:surface", 0.1) + playerphysics.add_physics_factor(player, "speed", "mcl_playerplus:surface", 0.1) else - mcl_playerphysics.add_physics_factor(player, "speed", "mcl_playerplus:surface", 0.4) + playerphysics.add_physics_factor(player, "speed", "mcl_playerplus:surface", 0.4) end else -- Reset speed decrease - mcl_playerphysics.remove_physics_factor(player, "speed", "mcl_playerplus:surface") + playerphysics.remove_physics_factor(player, "speed", "mcl_playerplus:surface") end -- Is player suffocating inside node? (Only for solid full opaque cube type nodes diff --git a/mods/PLAYER/mcl_sprint/depends.txt b/mods/PLAYER/mcl_sprint/depends.txt index 3f814ad1..aa6711ef 100644 --- a/mods/PLAYER/mcl_sprint/depends.txt +++ b/mods/PLAYER/mcl_sprint/depends.txt @@ -1,3 +1,3 @@ mcl_playerinfo -mcl_playerphysics +playerphysics mcl_hunger diff --git a/mods/PLAYER/mcl_sprint/init.lua b/mods/PLAYER/mcl_sprint/init.lua index c97ca801..e1224bb7 100644 --- a/mods/PLAYER/mcl_sprint/init.lua +++ b/mods/PLAYER/mcl_sprint/init.lua @@ -45,9 +45,9 @@ local function setSprinting(playerName, sprinting) --Sets the state of a player if players[playerName] then players[playerName]["sprinting"] = sprinting if sprinting == true then - mcl_playerphysics.add_physics_factor(player, "speed", "mcl_sprint:sprint", mcl_sprint.SPEED) + playerphysics.add_physics_factor(player, "speed", "mcl_sprint:sprint", mcl_sprint.SPEED) elseif sprinting == false then - mcl_playerphysics.remove_physics_factor(player, "speed", "mcl_sprint:sprint") + playerphysics.remove_physics_factor(player, "speed", "mcl_sprint:sprint") end return true end diff --git a/mods/PLAYER/mcl_playerphysics/README.md b/mods/PLAYER/playerphysics/README.md similarity index 80% rename from mods/PLAYER/mcl_playerphysics/README.md rename to mods/PLAYER/playerphysics/README.md index 909c6fba..8356d370 100644 --- a/mods/PLAYER/mcl_playerphysics/README.md +++ b/mods/PLAYER/playerphysics/README.md @@ -13,7 +13,7 @@ There is only one precondition to using this mod, but it is important: Mods *MUST NOT* call `set_physics_override` directly! Instead, to modify player physics, use this API. ## Functions -### `mcl_playerphysics.add_physics_factor(player, physic, id, value)` +### `playerphysics.add_physics_factor(player, physic, id, value)` Adds a factor for a player physic and updates the player physics immeiately. #### Parameters @@ -22,7 +22,7 @@ Adds a factor for a player physic and updates the player physics immeiately. * `id`: Unique identifier for this factor. Identifiers are stored on a per-player per-physics type basis * `value`: The factor to add to the list of products -### `mcl_playerphysics.remove_physics_factor(player, physic, id)` +### `playerphysics.remove_physics_factor(player, physic, id)` Removes the physics factor of the given ID and updates the player's physics. #### Parameters @@ -37,17 +37,17 @@ Here's what it could look like: Potions mod: ``` -mcl_playerphysics.add_physics_factor(player, "speed", "run_potion", 2) +playerphysics.add_physics_factor(player, "speed", "run_potion", 2) ``` Exhaustion mod: ``` -mcl_playerphysics.add_physics_factor(player, "jump", "exhausted", 0.75) +playerphysics.add_physics_factor(player, "jump", "exhausted", 0.75) ``` Electrocution mod: ``` -mcl_playerphysics.add_physics_factor(player, "jump", "shocked", 0.9) +playerphysics.add_physics_factor(player, "jump", "shocked", 0.9) ``` When the 3 mods have done their change, the real player speed is simply the product of all factors, that is: @@ -62,7 +62,7 @@ Let's take the example above. Now if the Electrocution mod is done with shocking the player, it just needs to call: ``` -mcl_playerphysics.remove_physics_factor(player, "jump", "shocked") +playerphysics.remove_physics_factor(player, "jump", "shocked") ``` The effect is now gone, so the new player speed will be: @@ -73,8 +73,8 @@ The effect is now gone, so the new player speed will be: To simulate sleeping by preventing all player movement, this can be done with this easy trick: ``` -mcl_playerphysics.add_physics_factor(player, "speed", "sleeping", 0) -mcl_playerphysics.add_physics_factor(player, "jump", "sleeping", 0) +playerphysics.add_physics_factor(player, "speed", "sleeping", 0) +playerphysics.add_physics_factor(player, "jump", "sleeping", 0) ``` This works regardless of the other factors because mathematics tell us that the factor 0 forces the product to be 0. diff --git a/mods/PLAYER/mcl_playerphysics/init.lua b/mods/PLAYER/playerphysics/init.lua similarity index 58% rename from mods/PLAYER/mcl_playerphysics/init.lua rename to mods/PLAYER/playerphysics/init.lua index b7b7d451..0b9420b1 100644 --- a/mods/PLAYER/mcl_playerphysics/init.lua +++ b/mods/PLAYER/playerphysics/init.lua @@ -1,7 +1,7 @@ -mcl_playerphysics = {} +playerphysics = {} local function calculate_physic_product(player, physic) - local a = minetest.deserialize(player:get_attribute("mcl_playerphysics:physics")) + local a = minetest.deserialize(player:get_attribute("playerphysics:physics")) local product = 1 if a == nil or a[physic] == nil then return product @@ -15,8 +15,8 @@ local function calculate_physic_product(player, physic) return product end -function mcl_playerphysics.add_physics_factor(player, physic, id, value) - local a = minetest.deserialize(player:get_attribute("mcl_playerphysics:physics")) +function playerphysics.add_physics_factor(player, physic, id, value) + local a = minetest.deserialize(player:get_attribute("playerphysics:physics")) if a == nil then a = { [physic] = { [id] = value } } elseif a[physic] == nil then @@ -24,20 +24,20 @@ function mcl_playerphysics.add_physics_factor(player, physic, id, value) else a[physic][id] = value end - player:set_attribute("mcl_playerphysics:physics", minetest.serialize(a)) + player:set_attribute("playerphysics:physics", minetest.serialize(a)) local raw_value = calculate_physic_product(player, physic) player:set_physics_override({[physic] = raw_value}) end -function mcl_playerphysics.remove_physics_factor(player, physic, id) - local a = minetest.deserialize(player:get_attribute("mcl_playerphysics:physics")) +function playerphysics.remove_physics_factor(player, physic, id) + local a = minetest.deserialize(player:get_attribute("playerphysics:physics")) if a == nil or a[physic] == nil then -- Nothing to remove return else a[physic][id] = nil end - player:set_attribute("mcl_playerphysics:physics", minetest.serialize(a)) + player:set_attribute("playerphysics:physics", minetest.serialize(a)) local raw_value = calculate_physic_product(player, physic) player:set_physics_override({[physic] = raw_value}) end diff --git a/mods/PLAYER/playerphysics/mod.conf b/mods/PLAYER/playerphysics/mod.conf new file mode 100644 index 00000000..da01bf07 --- /dev/null +++ b/mods/PLAYER/playerphysics/mod.conf @@ -0,0 +1 @@ +name = playerphysics From 2ff543a7bcca047900752f6205094b5e52ab0697 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 23 Oct 2018 18:53:36 +0200 Subject: [PATCH 0189/1107] Add playerphysics version number --- mods/PLAYER/playerphysics/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/PLAYER/playerphysics/README.md b/mods/PLAYER/playerphysics/README.md index 8356d370..d631a155 100644 --- a/mods/PLAYER/playerphysics/README.md +++ b/mods/PLAYER/playerphysics/README.md @@ -1,5 +1,7 @@ # Player Physics API. +Version: 1.0.0 + This mod simplifies the setting of player physics (speed, jumping height, gravity). The problem with `set_physics_override` is that is sets a raw value. @@ -18,7 +20,7 @@ Adds a factor for a player physic and updates the player physics immeiately. #### Parameters * `player`: Player object -* `physic`: Type of player physic to change. Any of the numeric values of `set_physics_override` (e.g. `speed`, `jump`, `gravity`) +* `physic`: Type of player physic to change. Any of the numeric values of `set_physics_override` (e.g. `"speed"`, `"jump"`, `"gravity"`) * `id`: Unique identifier for this factor. Identifiers are stored on a per-player per-physics type basis * `value`: The factor to add to the list of products @@ -27,7 +29,7 @@ Removes the physics factor of the given ID and updates the player's physics. #### Parameters * `player`: Player object -* `physic`: Type of player physic to change. Any of the numeric values of `set_physics_override` (e.g. `speed`, `jump`, `gravity`) +* `physic`: Type of player physic to change. Any of the numeric values of `set_physics_override` (e.g. `"speed"`, `"jump"`, `"gravity"`) * `id`: Unique identifier for the factor to remove ## Examples From 45ce08b1471bae615ce6c1ec635456f5ac24f7e5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 23 Oct 2018 18:56:10 +0200 Subject: [PATCH 0190/1107] Mention playerphysics in API.md --- API.md | 1 + 1 file changed, 1 insertion(+) diff --git a/API.md b/API.md index 354a99f6..7611ce44 100644 --- a/API.md +++ b/API.md @@ -61,6 +61,7 @@ chances are good that it works out of the box. * Statbars: `HUD/hudbars` ### Utility APIs +* Change player physics: `PLAYER/playerphysics` * Select random treasures: `CORE/mcl_loot` * Get flowing direction of liquids: `CORE/flowlib` * `on_walk_over` callback for nodes: `CORE/walkover` From e09955f0fb8e96f79e0fbfcc1fc7b742cd238a5a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 23 Oct 2018 18:58:23 +0200 Subject: [PATCH 0191/1107] Add description.txt for playerphysics --- mods/PLAYER/playerphysics/README.md | 2 +- mods/PLAYER/playerphysics/description.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 mods/PLAYER/playerphysics/description.txt diff --git a/mods/PLAYER/playerphysics/README.md b/mods/PLAYER/playerphysics/README.md index d631a155..5a522878 100644 --- a/mods/PLAYER/playerphysics/README.md +++ b/mods/PLAYER/playerphysics/README.md @@ -2,7 +2,7 @@ Version: 1.0.0 -This mod simplifies the setting of player physics (speed, jumping height, gravity). +This mod simplifies the modification of player physics (speed, jumping height, gravity). The problem with `set_physics_override` is that is sets a raw value. As soon as two independent mods want to mess with player physics, this is a problem. diff --git a/mods/PLAYER/playerphysics/description.txt b/mods/PLAYER/playerphysics/description.txt new file mode 100644 index 00000000..57ee96ff --- /dev/null +++ b/mods/PLAYER/playerphysics/description.txt @@ -0,0 +1 @@ +This mod simplifies the modification of player physics (speed, jumping height, gravity) by adding factors to the base values. From 001b0cc49f371295389fe1c2f1502f91ac6d0004 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 24 Oct 2018 01:46:43 +0200 Subject: [PATCH 0192/1107] Update doc_items (fake items) --- mods/HELP/doc/doc_items/API.md | 7 +++++++ mods/HELP/doc/doc_items/init.lua | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/mods/HELP/doc/doc_items/API.md b/mods/HELP/doc/doc_items/API.md index 26cb1186..f8d3b87c 100644 --- a/mods/HELP/doc/doc_items/API.md +++ b/mods/HELP/doc/doc_items/API.md @@ -351,6 +351,13 @@ definitions are already automatically added to this factoid. * `dig_immediate`: This group is already covered by the default factoids of this mod + +## Groups interpretations +Nodes which are technically a liquid will not be considered liquids by this mod +if the group `fake_liquid=1` is used. Useful for stuff like cobwebs. + + + ## Dependencies If you only add the custom fields to your items, you do *not* need to depend on this mod. If you use anything else from this mod (e.g. a function), you diff --git a/mods/HELP/doc/doc_items/init.lua b/mods/HELP/doc/doc_items/init.lua index ec1bbf9f..bdbba21a 100644 --- a/mods/HELP/doc/doc_items/init.lua +++ b/mods/HELP/doc/doc_items/init.lua @@ -592,7 +592,7 @@ doc.add_category("nodes", { formstring = entry_image(data) datastring = factoids_header(data, "nodes") - local liquid = data.def.liquidtype ~= "none" + local liquid = data.def.liquidtype ~= "none" and minetest.get_item_group(data.itemstring, "fake_liquid") == 0 if not forbidden_core_factoids.basics then datastring = datastring .. S("Collidable: @1", yesno(data.def.walkable)) .. "\n" if data.def.pointable == true then From b5f9a755b32b3dada753553f2341570f48a0b2b9 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 24 Oct 2018 18:16:39 +0200 Subject: [PATCH 0193/1107] Tweak item names and images of farming plants --- mods/ITEMS/mcl_farming/beetroot.lua | 6 +++--- mods/ITEMS/mcl_farming/melon.lua | 7 ++++++- mods/ITEMS/mcl_farming/potatoes.lua | 4 ++++ mods/ITEMS/mcl_farming/pumpkin.lua | 7 ++++++- mods/ITEMS/mcl_nether/nether_wart.lua | 10 +++++++++- 5 files changed, 28 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_farming/beetroot.lua b/mods/ITEMS/mcl_farming/beetroot.lua index 1776ce03..d88633d9 100644 --- a/mods/ITEMS/mcl_farming/beetroot.lua +++ b/mods/ITEMS/mcl_farming/beetroot.lua @@ -11,7 +11,7 @@ minetest.register_craftitem("mcl_farming:beetroot_seeds", { }) minetest.register_node("mcl_farming:beetroot_0", { - description = "Premature Beetroot Plant (First Stage)", + description = "Premature Beetroot Plant (Stage 1)", _doc_items_longdesc = "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 = "Premature Beetroot Plant", paramtype = "light", @@ -36,7 +36,7 @@ minetest.register_node("mcl_farming:beetroot_0", { }) minetest.register_node("mcl_farming:beetroot_1", { - description = "Premature Beetroot Plant (Second Stage)", + description = "Premature Beetroot Plant (Stage 2)", _doc_items_create_entry = false, paramtype = "light", paramtype2 = "meshoptions", @@ -60,7 +60,7 @@ minetest.register_node("mcl_farming:beetroot_1", { }) minetest.register_node("mcl_farming:beetroot_2", { - description = "Premature Beetroot Plant (Third Stage)", + description = "Premature Beetroot Plant (Stage 3)", _doc_items_create_entry = false, paramtype = "light", paramtype2 = "meshoptions", diff --git a/mods/ITEMS/mcl_farming/melon.lua b/mods/ITEMS/mcl_farming/melon.lua index 5e557d32..72e27a22 100644 --- a/mods/ITEMS/mcl_farming/melon.lua +++ b/mods/ITEMS/mcl_farming/melon.lua @@ -72,6 +72,7 @@ for s=1,7 do longdesc = "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 = string.format("Premature Melon Stem (Stage %d)", s), _doc_items_create_entry = doc, @@ -82,7 +83,9 @@ for s=1,7 do drawtype = "plantlike", sunlight_propagates = true, drop = stem_drop, - tiles = {"([combine:16x16:0,"..((8-s)*2).."=mcl_farming_melon_stem_disconnected.png)^[colorize:"..colorstring..":127"}, + tiles = {texture}, + wield_image = texture, + inventory_image = texture, selection_box = { type = "fixed", fixed = { @@ -101,6 +104,8 @@ local stem_def = { _doc_items_create_entry = true, _doc_items_longdesc = "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 diff --git a/mods/ITEMS/mcl_farming/potatoes.lua b/mods/ITEMS/mcl_farming/potatoes.lua index db9a963e..7294275a 100644 --- a/mods/ITEMS/mcl_farming/potatoes.lua +++ b/mods/ITEMS/mcl_farming/potatoes.lua @@ -38,6 +38,8 @@ for i=1, 7 do drawtype = "plantlike", drop = "mcl_farming:potato_item", tiles = { texture }, + inventory_image = texture, + wield_image = texture, selection_box = { type = "fixed", fixed = { selbox }, @@ -59,6 +61,8 @@ minetest.register_node("mcl_farming:potato", { 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'} }, diff --git a/mods/ITEMS/mcl_farming/pumpkin.lua b/mods/ITEMS/mcl_farming/pumpkin.lua index e598f344..5df24e82 100644 --- a/mods/ITEMS/mcl_farming/pumpkin.lua +++ b/mods/ITEMS/mcl_farming/pumpkin.lua @@ -46,6 +46,7 @@ for s=1,7 do longdesc = "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 = string.format("Premature Pumpkin Stem (Stage %d)", s), _doc_items_entry_name = entry_name, @@ -56,7 +57,9 @@ for s=1,7 do drawtype = "plantlike", sunlight_propagates = true, drop = stem_drop, - tiles = {"([combine:16x16:0,"..((8-s)*2).."=mcl_farming_pumpkin_stem_disconnected.png)^[colorize:"..colorstring..":127"}, + tiles = {texture}, + inventory_image = texture, + wield_image = texture, selection_box = { type = "fixed", fixed = { @@ -74,6 +77,8 @@ local stem_def = { description = "Mature Pumpkin Stem", _doc_items_longdesc = "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 diff --git a/mods/ITEMS/mcl_nether/nether_wart.lua b/mods/ITEMS/mcl_nether/nether_wart.lua index 705fd059..fbe6653a 100644 --- a/mods/ITEMS/mcl_nether/nether_wart.lua +++ b/mods/ITEMS/mcl_nether/nether_wart.lua @@ -1,5 +1,5 @@ minetest.register_node("mcl_nether:nether_wart_0", { - description = "Premature Nether Wart", + description = "Premature Nether Wart (Stage 1)", _doc_items_longdesc = "A premature nether wart has just recently been planted on soul sand. Nether wart slowly grows on soul sand in 4 stages (the second and third stages look identical). Although nether wart is home to the Nether, it grows in any dimension.", paramtype = "light", paramtype2 = "meshoptions", @@ -8,6 +8,8 @@ minetest.register_node("mcl_nether:nether_wart_0", { drawtype = "plantlike", drop = "mcl_nether:nether_wart_item", tiles = {"mcl_nether_nether_wart_stage_0.png"}, + wield_image = "mcl_nether_nether_wart_stage_0.png", + inventory_image = "mcl_nether_nether_wart_stage_0.png", selection_box = { type = "fixed", fixed = { @@ -28,6 +30,8 @@ minetest.register_node("mcl_nether:nether_wart_1", { drawtype = "plantlike", drop = "mcl_nether:nether_wart_item", tiles = {"mcl_nether_nether_wart_stage_1.png"}, + wield_image = "mcl_nether_nether_wart_stage_1.png", + inventory_image = "mcl_nether_nether_wart_stage_1.png", selection_box = { type = "fixed", fixed = { @@ -48,6 +52,8 @@ minetest.register_node("mcl_nether:nether_wart_2", { drawtype = "plantlike", drop = "mcl_nether:nether_wart_item", tiles = {"mcl_nether_nether_wart_stage_1.png"}, + wield_image = "mcl_nether_nether_wart_stage_1.png", + inventory_image = "mcl_nether_nether_wart_stage_1.png", selection_box = { type = "fixed", fixed = { @@ -75,6 +81,8 @@ minetest.register_node("mcl_nether:nether_wart", { }, }, tiles = {"mcl_nether_nether_wart_stage_2.png"}, + wield_image = "mcl_nether_nether_wart_stage_2.png", + inventory_image = "mcl_nether_nether_wart_stage_2.png", selection_box = { type = "fixed", fixed = { From 4703ca9ae6ca3c6d3f9458331ffd607eed12021b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 24 Oct 2018 18:22:48 +0200 Subject: [PATCH 0194/1107] Tweak inventory image of internal comparator items --- mods/ITEMS/REDSTONE/mcl_comparators/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/init.lua b/mods/ITEMS/REDSTONE/mcl_comparators/init.lua index c25793f3..58097213 100644 --- a/mods/ITEMS/REDSTONE/mcl_comparators/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_comparators/init.lua @@ -287,9 +287,11 @@ for _, state in pairs{mesecon.state.on, mesecon.state.off} do local extra_desc = {} if mode == "sub" then table.insert(extra_desc, "Subtract") + nodedef.inventory_image = nil end if state == mesecon.state.on then table.insert(extra_desc, "Powered") + nodedef.inventory_image = nil end nodedef.description = nodedef.description.. " ("..table.concat(extra_desc, ", ")..")" From 25b65e4b7d65431c9032db54c3db496e66bdb1e8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 17 Nov 2018 15:59:01 +0100 Subject: [PATCH 0195/1107] Remove tsm_railcorridors_probability_cart for now --- mods/MAPGEN/tsm_railcorridors/init.lua | 2 ++ mods/MAPGEN/tsm_railcorridors/settingtypes.txt | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/mods/MAPGEN/tsm_railcorridors/init.lua b/mods/MAPGEN/tsm_railcorridors/init.lua index b95144b2..358b6521 100644 --- a/mods/MAPGEN/tsm_railcorridors/init.lua +++ b/mods/MAPGEN/tsm_railcorridors/init.lua @@ -70,10 +70,12 @@ end -- “m_static_exists=true but static data doesn't actually exist in (x,y,z) -- TODO: Set back to 0.05 if this is fixedd. local probability_cart = P(0) +--[[ 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) diff --git a/mods/MAPGEN/tsm_railcorridors/settingtypes.txt b/mods/MAPGEN/tsm_railcorridors/settingtypes.txt index 36d8365a..b21662c6 100644 --- a/mods/MAPGEN/tsm_railcorridors/settingtypes.txt +++ b/mods/MAPGEN/tsm_railcorridors/settingtypes.txt @@ -20,9 +20,6 @@ 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. -tsm_railcorridors_probability_cart (Cart probability) float 0.05 0.0 1.0 - #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 From ec8d43b4a3702de273955be156ab92512cd0e48a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 3 Dec 2018 16:06:22 +0100 Subject: [PATCH 0196/1107] Make packed ice craftable --- mods/ITEMS/mcl_core/crafting.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mods/ITEMS/mcl_core/crafting.lua b/mods/ITEMS/mcl_core/crafting.lua index 6f4443ae..62716c83 100644 --- a/mods/ITEMS/mcl_core/crafting.lua +++ b/mods/ITEMS/mcl_core/crafting.lua @@ -399,6 +399,14 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = 'mcl_core:packed_ice', + recipe = { + {'mcl_core:ice', 'mcl_core:ice', 'mcl_core:ice'}, + {'mcl_core:ice', 'mcl_core:ice', 'mcl_core:ice'}, + {'mcl_core:ice', 'mcl_core:ice', 'mcl_core:ice'}, + } +}) -- -- Crafting (tool repair) From e4c5a785928243780f38325726412f41ed074237 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 3 Dec 2018 16:15:22 +0100 Subject: [PATCH 0197/1107] Use group:purpur to craft purpur stair/slab --- mods/HELP/mcl_craftguide/init.lua | 1 + mods/ITEMS/mcl_end/building.lua | 4 ++-- mods/ITEMS/mcl_stairs/register.lua | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index bc6a8af9..80d167ae 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -58,6 +58,7 @@ local group_stereotypes = { quartz_block = "mcl_nether:quartz_block", banner = "mcl_banners:banner_item_white", mesecon_conductor_craftable = "mesecons:wire_00000000_off", + purpur = "mcl_end:purpur_block", compass = mcl_compass.stereotype, clock = mcl_clock.sterotype, } diff --git a/mods/ITEMS/mcl_end/building.lua b/mods/ITEMS/mcl_end/building.lua index 2e7c4252..c3da88b1 100644 --- a/mods/ITEMS/mcl_end/building.lua +++ b/mods/ITEMS/mcl_end/building.lua @@ -29,7 +29,7 @@ minetest.register_node("mcl_end:purpur_block", { tiles = {"mcl_end_purpur_block.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, purpur=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 30, _mcl_hardness = 1.5, @@ -43,7 +43,7 @@ minetest.register_node("mcl_end:purpur_pillar", { is_ground_content = false, on_place = mcl_util.rotate_axis, tiles = {"mcl_end_purpur_pillar_top.png", "mcl_end_purpur_pillar_top.png", "mcl_end_purpur_pillar.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, purpur=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 30, _mcl_hardness = 1.5, diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua index 8311d14b..bc9cd2c8 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -95,13 +95,13 @@ mcl_stairs.register_stair_and_slab("nether_brick", "mcl_nether:nether_brick", 2, "Double Nether Brick Slab") -mcl_stairs.register_stair("purpur_block", "mcl_end:purpur_block", +mcl_stairs.register_stair("purpur_block", "group:purpur", {pickaxey=1, material_stone=1}, {"mcl_end_purpur_block.png"}, "Purpur Stairs", mcl_sounds.node_sound_stone_defaults(), 1.5) -mcl_stairs.register_slab("purpur_block", "mcl_end:purpur_block", +mcl_stairs.register_slab("purpur_block", "group:purpur", {pickaxey=1, material_stone=1}, {"mcl_end_purpur_block.png"}, "Purpur Slab", From b60c762ac3a199c8c4366a56f7db87d7fa237c9a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 3 Dec 2018 16:43:23 +0100 Subject: [PATCH 0198/1107] Add more stairs/slabs - andesite/diorite/granite - stone (real stone texture) - smooth sandstone/red sandstone/quartz --- mods/ITEMS/mcl_stairs/register.lua | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua index bc9cd2c8..ef04e6de 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -30,11 +30,17 @@ for w=1, #woods do wood[5]) end -mcl_stairs.register_slab("stone", "mcl_core:stone", +mcl_stairs.register_stair_and_slab_simple("stone_rough", "mcl_core:stone", "Stone Stairs", "Stone Slab", "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"}, - "Stone Slab", - mcl_sounds.node_sound_stone_defaults(), 2, "Double Stone Slab") + "Polished Stone Slab", + mcl_sounds.node_sound_stone_defaults(), 2, "Double Polished Stone Slab") + +mcl_stairs.register_stair_and_slab_simple("andesite", "mcl_core:andesite", "Andesite Stairs", "Andesite Slab", "Double Andesite Slab") +mcl_stairs.register_stair_and_slab_simple("granite", "mcl_core:granite", "Granite Stairs", "Granite Slab", "Double Granite Slab") +mcl_stairs.register_stair_and_slab_simple("diorite", "mcl_core:diorite", "Diorite Stairs", "Diorite Slab", "Double Diorite Slab") mcl_stairs.register_stair_and_slab_simple("cobble", "mcl_core:cobble", "Cobblestone Stairs", "Cobblestone Slab", "Double Cobblestone Slab") @@ -51,6 +57,7 @@ mcl_stairs.register_slab("sandstone", "group:sandstone", {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, "Sandstone Slab", mcl_sounds.node_sound_stone_defaults(), 2, "Double Sandstone Slab", "mcl_core:sandstone") +mcl_stairs.register_stair_and_slab_simple("sandstonesmooth2", "mcl_core:sandstonesmooth2", "Smooth Sandstone Stairs", "Smooth Sandstone Slab", "Double Smooth Sandstone Slab") mcl_stairs.register_stair("redsandstone", "group:redsandstone", {pickaxey=1, material_stone=1}, @@ -62,6 +69,7 @@ mcl_stairs.register_slab("redsandstone", "group:redsandstone", {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, "Red Sandstone Slab", mcl_sounds.node_sound_stone_defaults(), 2, "Double Red Sandstone Slab", "mcl_core:redsandstone") +mcl_stairs.register_stair_and_slab_simple("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", "Smooth Red Sandstone Stairs", "Smooth Red Sandstone Slab", "Double Smooth Red Sandstone Slab") -- Intentionally not group:stonebrick because of mclx_stairs mcl_stairs.register_stair("stonebrick", "mcl_core:stonebrick", @@ -86,6 +94,8 @@ mcl_stairs.register_slab("quartzblock", "group:quartz_block", "Quartz Slab", mcl_sounds.node_sound_stone_defaults(), 2, "Double Quarzt Slab", "mcl_nether:quartz_block") +mcl_stairs.register_stair_and_slab_simple("quartz_smooth", "mcl_nether:quartz_smooth", "Smooth Quartz Stairs", "Smooth Quartz Slab", "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"}, From 5b6ae370e2339232451010064bffdaea43cc397a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 3 Dec 2018 16:47:11 +0100 Subject: [PATCH 0199/1107] Make smooth stone cookable --- mods/ITEMS/mcl_core/crafting.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mods/ITEMS/mcl_core/crafting.lua b/mods/ITEMS/mcl_core/crafting.lua index 62716c83..52d2b1c4 100644 --- a/mods/ITEMS/mcl_core/crafting.lua +++ b/mods/ITEMS/mcl_core/crafting.lua @@ -434,6 +434,13 @@ minetest.register_craft({ cooktime = 10, }) +minetest.register_craft({ + type = "cooking", + output = "mcl_core:stone_smooth", + recipe = "mcl_core:stone", + cooktime = 10, +}) + minetest.register_craft({ type = "cooking", output = "mcl_core:stonebrickcracked", From c988665b5c77d435ab5763634c0ffe061755e7f0 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 3 Dec 2018 16:50:12 +0100 Subject: [PATCH 0200/1107] Use word "Stairs" instead of "Stair" consistently --- mods/ITEMS/mclx_stairs/init.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mclx_stairs/init.lua b/mods/ITEMS/mclx_stairs/init.lua index 4ff68507..b5c14b17 100644 --- a/mods/ITEMS/mclx_stairs/init.lua +++ b/mods/ITEMS/mclx_stairs/init.lua @@ -12,22 +12,22 @@ mcl_stairs.register_stair_and_slab_simple("jungletree_bark", "mcl_core:jungletre mcl_stairs.register_stair_and_slab_simple("darktree_bark", "mcl_core:darktree_bark", "Dark Oak Bark Stairs", "Dark Oak Bark Slab", "Double Dark Oak Bark Slab", "woodlike") 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"}, "Lapis Lazuli Slab", nil, nil, "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"}, "Lapis Lazuli Stair", nil, nil, "woodlike") +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"}, "Lapis Lazuli Stairs", nil, 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"}, "Slab of Gold", nil, nil, "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"}, "Stair of Gold", nil, nil, "woodlike") +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"}, "Stairs of Gold", nil, 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"}, "Slab of Iron", nil, nil, "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"}, "Stair of Iron", nil, nil, "woodlike") +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"}, "Stairs of Iron", nil, nil, "woodlike") 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"}, "Polished Andesite Slab", nil, nil, "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"}, "Polished Andesite Stair", nil, nil, "woodlike") +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"}, "Polished Andesite Stairs", nil, 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"}, "Polished Granite Slab", nil, nil, "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"}, "Polished Granite Stair", nil, nil, "woodlike") +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"}, "Polished Granite Stairs", nil, 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"}, "Polished Diorite Slab", nil, nil, "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"}, "Polished Diorite Stair", nil, nil, "woodlike") +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"}, "Polished Diorite Stairs", nil, nil, "woodlike") mcl_stairs.register_stair("stonebrickmossy", "mcl_core:stonebrickmossy", {pickaxey=1}, From ff9032754a0a5cf86a1d2f8f51213e5e3b858129 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 3 Dec 2018 17:15:16 +0100 Subject: [PATCH 0201/1107] Add many more walls --- mods/ITEMS/mcl_walls/depends.txt | 3 +++ mods/ITEMS/mcl_walls/init.lua | 7 +------ mods/ITEMS/mcl_walls/register.lua | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 mods/ITEMS/mcl_walls/register.lua diff --git a/mods/ITEMS/mcl_walls/depends.txt b/mods/ITEMS/mcl_walls/depends.txt index cbc0405c..de1f8a39 100644 --- a/mods/ITEMS/mcl_walls/depends.txt +++ b/mods/ITEMS/mcl_walls/depends.txt @@ -1,3 +1,6 @@ mcl_core +mcl_end +mcl_ocean +mcl_nether mcl_sounds doc? diff --git a/mods/ITEMS/mcl_walls/init.lua b/mods/ITEMS/mcl_walls/init.lua index c8aea25d..b8e3756c 100644 --- a/mods/ITEMS/mcl_walls/init.lua +++ b/mods/ITEMS/mcl_walls/init.lua @@ -253,12 +253,7 @@ function mcl_walls.register_wall(nodename, description, craft_material, tiles, i end end --- Cobblestone wall -mcl_walls.register_wall("mcl_walls:cobble", "Cobblestone Wall", "mcl_core:cobble", {"default_cobble.png"}) - --- Mossy wall - -mcl_walls.register_wall("mcl_walls:mossycobble", "Mossy Cobblestone Wall", "mcl_core:mossycobble", {"default_mossycobble.png"}) +dofile(minetest.get_modpath("mcl_walls") .. "/register.lua") minetest.register_on_placenode(update_wall_global) minetest.register_on_dignode(update_wall_global) diff --git a/mods/ITEMS/mcl_walls/register.lua b/mods/ITEMS/mcl_walls/register.lua new file mode 100644 index 00000000..88a67c04 --- /dev/null +++ b/mods/ITEMS/mcl_walls/register.lua @@ -0,0 +1,14 @@ +mcl_walls.register_wall("mcl_walls:cobble", "Cobblestone Wall", "mcl_core:cobble", {"default_cobble.png"}) +mcl_walls.register_wall("mcl_walls:mossycobble", "Mossy Cobblestone Wall", "mcl_core:mossycobble", {"default_mossycobble.png"}) +mcl_walls.register_wall("mcl_walls:andesite", "Andesite Wall", "mcl_core:andesite", {"mcl_core_andesite.png"}) +mcl_walls.register_wall("mcl_walls:granite", "Granite Wall", "mcl_core:granite", {"mcl_core_granite.png"}) +mcl_walls.register_wall("mcl_walls:diorite", "Diorite Wall", "mcl_core:diorite", {"mcl_core_diorite.png"}) +mcl_walls.register_wall("mcl_walls:brick", "Brick Wall", "mcl_core:brick_block", {"default_brick.png"}) +mcl_walls.register_wall("mcl_walls:sandstone", "Sandstone Wall", "mcl_core:sandstone", {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}) +mcl_walls.register_wall("mcl_walls:redsandstone", "Red Sandstone Wall", "mcl_core:redsandstone", {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}) +mcl_walls.register_wall("mcl_walls:stonebrick", "Stone Brick Wall", "mcl_core:stonebrick", {"default_stone_brick.png"}) +mcl_walls.register_wall("mcl_walls:stonebrickmossy", "Mossy Stone Brick Wall", "mcl_core:stonebrickmossy", {"mcl_core_stonebrick_mossy.png"}) +mcl_walls.register_wall("mcl_walls:prismarine", "Prismarine Wall", "mcl_ocean:prismarine", {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}) +mcl_walls.register_wall("mcl_walls:endbricks", "End Stone Brick Wall", "mcl_end:end_bricks", {"mcl_end_end_bricks.png"}) +mcl_walls.register_wall("mcl_walls:netherbrick", "Nether Brick Wall", "mcl_nether:nether_brick", {"mcl_nether_nether_brick.png"}) +mcl_walls.register_wall("mcl_walls:rednetherbrick", "Red Nether Brick Wall", "mcl_nether:red_nether_brick", {"mcl_nether_red_nether_brick.png"}) From 6fdf57d44fa0a1f449c7c8dd93a4943c3f78ee4b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 3 Dec 2018 17:24:44 +0100 Subject: [PATCH 0202/1107] Move stuff from mclx_stairs to mcl_stairs --- mods/ITEMS/mcl_stairs/register.lua | 37 +++++++++++++++++++++++++++++- mods/ITEMS/mclx_stairs/init.lua | 27 ---------------------- 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua index ef04e6de..1875eff7 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -43,6 +43,7 @@ mcl_stairs.register_stair_and_slab_simple("granite", "mcl_core:granite", "Granit mcl_stairs.register_stair_and_slab_simple("diorite", "mcl_core:diorite", "Diorite Stairs", "Diorite Slab", "Double Diorite Slab") mcl_stairs.register_stair_and_slab_simple("cobble", "mcl_core:cobble", "Cobblestone Stairs", "Cobblestone Slab", "Double Cobblestone Slab") +mcl_stairs.register_stair_and_slab_simple("mossycobble", "mcl_core:mossycobble", "Moss Stone Stairs", "Moss Stone Slab", "Double Moss Stone Slab") mcl_stairs.register_stair_and_slab_simple("brick_block", "mcl_core:brick_block", "Brick Stairs", "Brick Slab", "Double Brick Slab") @@ -92,7 +93,7 @@ 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"}, "Quartz Slab", - mcl_sounds.node_sound_stone_defaults(), 2, "Double Quarzt Slab", "mcl_nether:quartz_block") + mcl_sounds.node_sound_stone_defaults(), 2, "Double Quartz Slab", "mcl_nether:quartz_block") mcl_stairs.register_stair_and_slab_simple("quartz_smooth", "mcl_nether:quartz_smooth", "Smooth Quartz Stairs", "Smooth Quartz Slab", "Double Smooth Quartz Slab") @@ -104,6 +105,16 @@ mcl_stairs.register_stair_and_slab("nether_brick", "mcl_nether:nether_brick", mcl_sounds.node_sound_stone_defaults(), 2, "Double Nether Brick Slab") +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"}, + "Red Nether Brick Stairs", + "Red Nether Brick Slab", + mcl_sounds.node_sound_stone_defaults(), + 2, + "Double Red Nether Brick Slab") + +mcl_stairs.register_stair_and_slab_simple("end_bricks", "mcl_end:end_bricks", "End Stone Brick Stairs", "End Stone Brick Slab", "Double End Stone Brick Slab") mcl_stairs.register_stair("purpur_block", "group:purpur", {pickaxey=1, material_stone=1}, @@ -124,3 +135,27 @@ mcl_stairs.register_stair_and_slab_simple("prismarine", "mcl_ocean:prismarine", mcl_stairs.register_stair_and_slab_simple("prismarine_brick", "mcl_ocean:prismarine_brick", "Prismarine Brick Stairs", "Prismarine Brick Slab", "Double Prismarine Brick Slab") mcl_stairs.register_stair_and_slab_simple("prismarine_dark", "mcl_ocean:prismarine_dark", "Dark Prismarine Stairs", "Dark Prismarine Slab", "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"}, "Polished Andesite Slab", nil, nil, "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"}, "Polished Andesite Stairs", nil, 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"}, "Polished Granite Slab", nil, nil, "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"}, "Polished Granite Stairs", nil, 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"}, "Polished Diorite Slab", nil, nil, "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"}, "Polished Diorite Stairs", nil, nil, "woodlike") + +mcl_stairs.register_stair("stonebrickmossy", "mcl_core:stonebrickmossy", + {pickaxey=1}, + {"mcl_core_stonebrick_mossy.png"}, + "Mossy Stone Brick Stairs", + mcl_sounds.node_sound_stone_defaults(), 1.5, nil, "mcl_core:stonebrickmossy") + +mcl_stairs.register_slab("stonebrickmossy", "mcl_core:stonebrickmossy", + {pickaxey=1}, + {"mcl_core_stonebrick_mossy.png"}, + "Mossy Stone Brick Slab", + mcl_sounds.node_sound_stone_defaults(), 2, "Double Mossy Stone Brick Slab", "mcl_core:stonebrickmossy") + + + + diff --git a/mods/ITEMS/mclx_stairs/init.lua b/mods/ITEMS/mclx_stairs/init.lua index b5c14b17..29f45f2b 100644 --- a/mods/ITEMS/mclx_stairs/init.lua +++ b/mods/ITEMS/mclx_stairs/init.lua @@ -1,9 +1,3 @@ -mcl_stairs.register_stair_and_slab_simple("end_bricks", "mcl_end:end_bricks", "End Stone Brick Stairs", "End Stone Brick Slab", "Double End Stone Brick Slab") - -mcl_stairs.register_stair_and_slab_simple("red_nether_brick", "mcl_nether:red_nether_brick", "Red Nether Brick Stairs", "Red Nether Brick Slab", "Double Red Nether Brick Slab") - -mcl_stairs.register_stair_and_slab_simple("mossycobble", "mcl_core:mossycobble", "Moss Stone Stairs", "Moss Stone Slab", "Double Moss Stone Slab") - mcl_stairs.register_stair_and_slab_simple("tree_bark", "mcl_core:tree_bark", "Oak Bark Stairs", "Oak Bark Slab", "Double Oak Bark Slab", "woodlike") mcl_stairs.register_stair_and_slab_simple("acaciatree_bark", "mcl_core:acaciatree_bark", "Acacia Bark Stairs", "Acacia Bark Slab", "Double Acacia Bark Slab", "woodlike") mcl_stairs.register_stair_and_slab_simple("sprucetree_bark", "mcl_core:sprucetree_bark", "Spruce Bark Stairs", "Spruce Bark Slab", "Double Spruce Bark Slab", "woodlike") @@ -20,27 +14,6 @@ mcl_stairs.register_stair("goldblock", "mcl_core:goldblock", {pickaxey=4}, {"mcl mcl_stairs.register_slab("ironblock", "mcl_core:ironblock", {pickaxey=2}, {"default_steel_block.png", "default_steel_block.png", "mcl_stairs_iron_block_slab.png"}, "Slab of Iron", nil, nil, "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"}, "Stairs of Iron", nil, nil, "woodlike") -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"}, "Polished Andesite Slab", nil, nil, "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"}, "Polished Andesite Stairs", nil, 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"}, "Polished Granite Slab", nil, nil, "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"}, "Polished Granite Stairs", nil, 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"}, "Polished Diorite Slab", nil, nil, "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"}, "Polished Diorite Stairs", nil, nil, "woodlike") - -mcl_stairs.register_stair("stonebrickmossy", "mcl_core:stonebrickmossy", - {pickaxey=1}, - {"mcl_core_stonebrick_mossy.png"}, - "Mossy Stone Brick Stairs", - mcl_sounds.node_sound_stone_defaults(), 1.5, nil, "mcl_core:stonebrickmossy") - -mcl_stairs.register_slab("stonebrickmossy", "mcl_core:stonebrickmossy", - {pickaxey=1}, - {"mcl_core_stonebrick_mossy.png"}, - "Mossy Stone Brick Slab", - mcl_sounds.node_sound_stone_defaults(), 2, "Double Mossy Stone Brick Slab", "mcl_core:stonebrickmossy") - mcl_stairs.register_stair("stonebrickcracked", "mcl_core:stonebrickcracked", {pickaxey=1}, {"mcl_core_stonebrick_cracked.png"}, From 367469cf90d09b2e66d090b5e8fedb84ced75009 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 3 Dec 2018 17:30:09 +0100 Subject: [PATCH 0203/1107] Simplify wall registration --- mods/ITEMS/mcl_walls/init.lua | 16 +++++++++++----- mods/ITEMS/mcl_walls/register.lua | 28 ++++++++++++++-------------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/mods/ITEMS/mcl_walls/init.lua b/mods/ITEMS/mcl_walls/init.lua index b8e3756c..fb68f167 100644 --- a/mods/ITEMS/mcl_walls/init.lua +++ b/mods/ITEMS/mcl_walls/init.lua @@ -86,13 +86,13 @@ local full_blocks = { --[[ Adds a new wall type. * nodename: Itemstring of base node to add. Must not contain an underscore * description: Item description (tooltip), visible to user -* craft_material: Material for the default crafting recipe (optional) +* 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, craft_material, tiles, inventory_image, groups, sounds) +function mcl_walls.register_wall(nodename, description, source, tiles, inventory_image, groups, sounds) local base_groups = groups if not base_groups then @@ -112,6 +112,12 @@ function mcl_walls.register_wall(nodename, description, craft_material, tiles, i 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 @@ -242,12 +248,12 @@ function mcl_walls.register_wall(nodename, description, craft_material, tiles, i _mcl_blast_resistance = 30, _mcl_hardness = 2, }) - if craft_material then + if source then minetest.register_craft({ output = nodename .. " 6", recipe = { - {craft_material, craft_material, craft_material}, - {craft_material, craft_material, craft_material}, + {source, source, source}, + {source, source, source}, } }) end diff --git a/mods/ITEMS/mcl_walls/register.lua b/mods/ITEMS/mcl_walls/register.lua index 88a67c04..5c6df791 100644 --- a/mods/ITEMS/mcl_walls/register.lua +++ b/mods/ITEMS/mcl_walls/register.lua @@ -1,14 +1,14 @@ -mcl_walls.register_wall("mcl_walls:cobble", "Cobblestone Wall", "mcl_core:cobble", {"default_cobble.png"}) -mcl_walls.register_wall("mcl_walls:mossycobble", "Mossy Cobblestone Wall", "mcl_core:mossycobble", {"default_mossycobble.png"}) -mcl_walls.register_wall("mcl_walls:andesite", "Andesite Wall", "mcl_core:andesite", {"mcl_core_andesite.png"}) -mcl_walls.register_wall("mcl_walls:granite", "Granite Wall", "mcl_core:granite", {"mcl_core_granite.png"}) -mcl_walls.register_wall("mcl_walls:diorite", "Diorite Wall", "mcl_core:diorite", {"mcl_core_diorite.png"}) -mcl_walls.register_wall("mcl_walls:brick", "Brick Wall", "mcl_core:brick_block", {"default_brick.png"}) -mcl_walls.register_wall("mcl_walls:sandstone", "Sandstone Wall", "mcl_core:sandstone", {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}) -mcl_walls.register_wall("mcl_walls:redsandstone", "Red Sandstone Wall", "mcl_core:redsandstone", {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}) -mcl_walls.register_wall("mcl_walls:stonebrick", "Stone Brick Wall", "mcl_core:stonebrick", {"default_stone_brick.png"}) -mcl_walls.register_wall("mcl_walls:stonebrickmossy", "Mossy Stone Brick Wall", "mcl_core:stonebrickmossy", {"mcl_core_stonebrick_mossy.png"}) -mcl_walls.register_wall("mcl_walls:prismarine", "Prismarine Wall", "mcl_ocean:prismarine", {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}) -mcl_walls.register_wall("mcl_walls:endbricks", "End Stone Brick Wall", "mcl_end:end_bricks", {"mcl_end_end_bricks.png"}) -mcl_walls.register_wall("mcl_walls:netherbrick", "Nether Brick Wall", "mcl_nether:nether_brick", {"mcl_nether_nether_brick.png"}) -mcl_walls.register_wall("mcl_walls:rednetherbrick", "Red Nether Brick Wall", "mcl_nether:red_nether_brick", {"mcl_nether_red_nether_brick.png"}) +mcl_walls.register_wall("mcl_walls:cobble", "Cobblestone Wall", "mcl_core:cobble") +mcl_walls.register_wall("mcl_walls:mossycobble", "Mossy Cobblestone Wall", "mcl_core:mossycobble") +mcl_walls.register_wall("mcl_walls:andesite", "Andesite Wall", "mcl_core:andesite") +mcl_walls.register_wall("mcl_walls:granite", "Granite Wall", "mcl_core:granite") +mcl_walls.register_wall("mcl_walls:diorite", "Diorite Wall", "mcl_core:diorite") +mcl_walls.register_wall("mcl_walls:brick", "Brick Wall", "mcl_core:brick_block") +mcl_walls.register_wall("mcl_walls:sandstone", "Sandstone Wall", "mcl_core:sandstone") +mcl_walls.register_wall("mcl_walls:redsandstone", "Red Sandstone Wall", "mcl_core:redsandstone") +mcl_walls.register_wall("mcl_walls:stonebrick", "Stone Brick Wall", "mcl_core:stonebrick") +mcl_walls.register_wall("mcl_walls:stonebrickmossy", "Mossy Stone Brick Wall", "mcl_core:stonebrickmossy") +mcl_walls.register_wall("mcl_walls:prismarine", "Prismarine Wall", "mcl_ocean:prismarine") +mcl_walls.register_wall("mcl_walls:endbricks", "End Stone Brick Wall", "mcl_end:end_bricks") +mcl_walls.register_wall("mcl_walls:netherbrick", "Nether Brick Wall", "mcl_nether:nether_brick") +mcl_walls.register_wall("mcl_walls:rednetherbrick", "Red Nether Brick Wall", "mcl_nether:red_nether_brick") From 2ff1372b1e9a60301e40156f023b9023fe07ec95 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 3 Dec 2018 17:38:32 +0100 Subject: [PATCH 0204/1107] Fix nether brick fence crafting --- mods/ITEMS/mcl_fences/init.lua | 4 ++-- mods/ITEMS/mclx_fences/init.lua | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_fences/init.lua b/mods/ITEMS/mcl_fences/init.lua index 90629d68..2f4c9952 100644 --- a/mods/ITEMS/mcl_fences/init.lua +++ b/mods/ITEMS/mcl_fences/init.lua @@ -293,8 +293,8 @@ mcl_fences.register_fence("nether_brick_fence", "Nether Brick Fence", "mcl_fence minetest.register_craft({ output = 'mcl_fences:nether_brick_fence 6', recipe = { - {"mcl_nether:nether_brick", "mcl_nether:nether_brick", "mcl_nether:nether_brick"}, - {"mcl_nether:nether_brick", "mcl_nether:nether_brick", "mcl_nether:nether_brick"}, + {"mcl_nether:nether_brick", "mcl_nether:netherbrick", "mcl_nether:nether_brick"}, + {"mcl_nether:nether_brick", "mcl_nether:netherbrick", "mcl_nether:nether_brick"}, } }) diff --git a/mods/ITEMS/mclx_fences/init.lua b/mods/ITEMS/mclx_fences/init.lua index 1ef60620..60f0c299 100644 --- a/mods/ITEMS/mclx_fences/init.lua +++ b/mods/ITEMS/mclx_fences/init.lua @@ -25,8 +25,8 @@ mcl_fences.register_fence_gate( minetest.register_craft({ output = 'mclx_fences:red_nether_brick_fence 6', recipe = { - {"mcl_nether:red_nether_brick", "mcl_nether:red_nether_brick", "mcl_nether:red_nether_brick"}, - {"mcl_nether:red_nether_brick", "mcl_nether:red_nether_brick", "mcl_nether:red_nether_brick"}, + {"mcl_nether:red_nether_brick", "mcl_nether:netherbrick", "mcl_nether:red_nether_brick"}, + {"mcl_nether:red_nether_brick", "mcl_nether:netherbrick", "mcl_nether:red_nether_brick"}, } }) From af3785021bc7d0f69560a4b87696aeca02f0a60d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 7 Dec 2018 21:20:15 +0100 Subject: [PATCH 0205/1107] Describe purpur_block group --- mods/HELP/mcl_craftguide/init.lua | 3 ++- mods/ITEMS/mcl_end/building.lua | 4 ++-- mods/ITEMS/mcl_stairs/register.lua | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index 80d167ae..0ee29397 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -58,7 +58,7 @@ local group_stereotypes = { quartz_block = "mcl_nether:quartz_block", banner = "mcl_banners:banner_item_white", mesecon_conductor_craftable = "mesecons:wire_00000000_off", - purpur = "mcl_end:purpur_block", + purpur_block = "mcl_end:purpur_block", compass = mcl_compass.stereotype, clock = mcl_clock.sterotype, } @@ -80,6 +80,7 @@ local group_names = { wood_stairs = "Any wooden stairs", coal = "Any coal", quartz_block = "Any kind of quartz block", + purpur_block = "Any kind of purpur block", stonebrick = "Any stone bricks", } diff --git a/mods/ITEMS/mcl_end/building.lua b/mods/ITEMS/mcl_end/building.lua index c3da88b1..0caa2bc4 100644 --- a/mods/ITEMS/mcl_end/building.lua +++ b/mods/ITEMS/mcl_end/building.lua @@ -29,7 +29,7 @@ minetest.register_node("mcl_end:purpur_block", { tiles = {"mcl_end_purpur_block.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, purpur=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 30, _mcl_hardness = 1.5, @@ -43,7 +43,7 @@ minetest.register_node("mcl_end:purpur_pillar", { is_ground_content = false, on_place = mcl_util.rotate_axis, tiles = {"mcl_end_purpur_pillar_top.png", "mcl_end_purpur_pillar_top.png", "mcl_end_purpur_pillar.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1, purpur=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 30, _mcl_hardness = 1.5, diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua index 1875eff7..700852fd 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -116,13 +116,13 @@ mcl_stairs.register_stair_and_slab("red_nether_brick", "mcl_nether:red_nether_br mcl_stairs.register_stair_and_slab_simple("end_bricks", "mcl_end:end_bricks", "End Stone Brick Stairs", "End Stone Brick Slab", "Double End Stone Brick Slab") -mcl_stairs.register_stair("purpur_block", "group:purpur", +mcl_stairs.register_stair("purpur_block", "group:purpur_block", {pickaxey=1, material_stone=1}, {"mcl_end_purpur_block.png"}, "Purpur Stairs", mcl_sounds.node_sound_stone_defaults(), 1.5) -mcl_stairs.register_slab("purpur_block", "group:purpur", +mcl_stairs.register_slab("purpur_block", "group:purpur_block", {pickaxey=1, material_stone=1}, {"mcl_end_purpur_block.png"}, "Purpur Slab", From 502be105acde53ca586ff807b13917d5e30b505e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 7 Dec 2018 21:23:39 +0100 Subject: [PATCH 0206/1107] Apply disable_repair group --- mods/HELP/doc/doc_identifier/init.lua | 3 ++- mods/ITEMS/mcl_clock/init.lua | 2 +- mods/ITEMS/mcl_compass/init.lua | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/mods/HELP/doc/doc_identifier/init.lua b/mods/HELP/doc/doc_identifier/init.lua index 8ba005f3..b326a395 100644 --- a/mods/HELP/doc/doc_identifier/init.lua +++ b/mods/HELP/doc/doc_identifier/init.lua @@ -169,6 +169,7 @@ minetest.register_tool("doc_identifier:identifier_solid", { _doc_items_hidden = false, tool_capabilities = {}, range = 10, + groups = { disable_repair = 1 }, wield_image = "doc_identifier_identifier.png", inventory_image = "doc_identifier_identifier.png", liquids_pointable = false, @@ -181,7 +182,7 @@ minetest.register_tool("doc_identifier:identifier_liquid", { _doc_items_create_entry = false, tool_capabilities = {}, range = 10, - groups = { not_in_creative_inventory = 1, not_in_craft_guide = 1 }, + groups = { not_in_creative_inventory = 1, not_in_craft_guide = 1, disable_repair=1 }, wield_image = "doc_identifier_identifier_liquid.png", inventory_image = "doc_identifier_identifier_liquid.png", liquids_pointable = true, diff --git a/mods/ITEMS/mcl_clock/init.lua b/mods/ITEMS/mcl_clock/init.lua index 98b8b66e..c5a87e5b 100644 --- a/mods/ITEMS/mcl_clock/init.lua +++ b/mods/ITEMS/mcl_clock/init.lua @@ -63,7 +63,7 @@ function watch.register_item(name, image, creative, frame) _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, inventory_image = image, - groups = {not_in_creative_inventory=g, tool=1, clock=frame}, + groups = {not_in_creative_inventory=g, tool=1, clock=frame, disable_repair=1}, wield_image = "", stack_max = 64, }) diff --git a/mods/ITEMS/mcl_compass/init.lua b/mods/ITEMS/mcl_compass/init.lua index ce0dac69..a07d58ff 100644 --- a/mods/ITEMS/mcl_compass/init.lua +++ b/mods/ITEMS/mcl_compass/init.lua @@ -90,7 +90,7 @@ for i,img in ipairs(images) do inventory_image = img, wield_image = img, stack_max = 64, - groups = {not_in_creative_inventory=inv, compass=i, tool=1} + groups = {not_in_creative_inventory=inv, compass=i, tool=1, disable_repair=1} }) -- Help aliases. Makes sure the lookup tool works correctly From e38fadd86385b691f3f5523ce07a958d03a0edd8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 7 Dec 2018 21:37:52 +0100 Subject: [PATCH 0207/1107] Remove packed ice crafting recipe for now Ice cannot be obtained legally yet (missing silk touch). --- mods/ITEMS/mcl_core/crafting.lua | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/mods/ITEMS/mcl_core/crafting.lua b/mods/ITEMS/mcl_core/crafting.lua index 52d2b1c4..382c136f 100644 --- a/mods/ITEMS/mcl_core/crafting.lua +++ b/mods/ITEMS/mcl_core/crafting.lua @@ -399,14 +399,8 @@ minetest.register_craft({ } }) -minetest.register_craft({ - output = 'mcl_core:packed_ice', - recipe = { - {'mcl_core:ice', 'mcl_core:ice', 'mcl_core:ice'}, - {'mcl_core:ice', 'mcl_core:ice', 'mcl_core:ice'}, - {'mcl_core:ice', 'mcl_core:ice', 'mcl_core:ice'}, - } -}) +-- TODO: Add crafting recipe: 9 ice → 1 packed ice +-- Add it when silk touch tools work. -- -- Crafting (tool repair) From 68eea105976c2d10dea1889f6f836becbd751a49 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 7 Dec 2018 21:43:12 +0100 Subject: [PATCH 0208/1107] Update mcl_walls API docs --- mods/ITEMS/mcl_walls/API.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_walls/API.md b/mods/ITEMS/mcl_walls/API.md index 9efb8ce2..e6956ac4 100644 --- a/mods/ITEMS/mcl_walls/API.md +++ b/mods/ITEMS/mcl_walls/API.md @@ -20,9 +20,9 @@ If `craft_material` is not `nil` it also adds a crafting recipe of the following ### 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 -* `craft_material`: Item to be used in the crafting recipe. If `nil`, no crafting recipe will be added -* `tiles`: Wall textures table, same syntax as for `minetest.register_node` -* `inventory_image`: Inventory image (optional, default is an ugly 3D image) +* `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) From 037a8333a030cbd0a1f7503d8c123d5ed0779c15 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 7 Dec 2018 21:46:28 +0100 Subject: [PATCH 0209/1107] Version 0.43.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7b2c865e..c16c38f8 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.42.1 +Version: 0.43.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From e1870c2808fca15656424fc0632210dded2f3612 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 17 Dec 2018 01:57:25 +0100 Subject: [PATCH 0210/1107] Fix typo: Diamond Leggins --- mods/ITEMS/minetest-3d_armor/3d_armor/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/init.lua b/mods/ITEMS/minetest-3d_armor/3d_armor/init.lua index f9677ec2..acd63327 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor/init.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor/init.lua @@ -140,7 +140,7 @@ minetest.register_tool("3d_armor:leggings_gold", { }) minetest.register_tool("3d_armor:leggings_diamond",{ - description = "Diamond Leggins", + description = "Diamond Leggings", _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "3d_armor_inv_leggings_diamond.png", From fa3fd68c8c93bb3c76a9aee4359256e6d521a5d5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 22 Dec 2018 14:29:45 +0100 Subject: [PATCH 0211/1107] Turn enderman to monster, but reduce view range --- mods/ENTITIES/mobs_mc/enderman.lua | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua index 459c1a4a..49e3c9a8 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mobs_mc/enderman.lua @@ -3,6 +3,13 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes +-- ENDERMAN BEHAVIOUR: +-- 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. +-- TODO: Implement MC behaviour. + -- intllib local MP = minetest.get_modpath(minetest.get_current_modname()) local S, NS = dofile(MP.."/intllib.lua") @@ -164,8 +171,8 @@ end local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false mobs:register_mob("mobs_mc:enderman", { - -- TODO: Make endermen attack when looked at - type = "animal", + -- TODO: Endermen should be classified as passive + type = "monster", passive = false, pathfinding = 1, stepheight = 1.2, @@ -320,7 +327,9 @@ mobs:register_mob("mobs_mc:enderman", { water_damage = 8, lava_damage = 4, light_damage = 0, - view_range = 16, + -- TODO: Increase view range when it detects being seen + -- Low view range to emulate that behaviour somehow + view_range = 4, fear_height = 4, attack_type = "dogfight", blood_amount = 0, From 907476fa8680a01b8c550ce71746a751d1ee97d1 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 7 Jan 2019 00:44:26 +0100 Subject: [PATCH 0212/1107] Add game description --- game.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/game.conf b/game.conf index 799ed84b..db735770 100644 --- a/game.conf +++ b/game.conf @@ -1 +1,2 @@ name = MineClone 2 +description = A survival sandbox game. Survive, gather, hunt, build, explore, and do much more. From 68c373d2b80f122141c6d96e90f853450751ba93 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 7 Jan 2019 00:52:05 +0100 Subject: [PATCH 0213/1107] Add a couple of modpack.conf files --- mods/CORE/modpack.conf | 2 ++ mods/ENTITIES/modpack.conf | 2 ++ mods/HELP/modpack.conf | 2 ++ mods/HUD/modpack.conf | 2 ++ mods/ITEMS/REDSTONE/modpack.conf | 2 ++ mods/ITEMS/minetest-3d_armor/modpack.conf | 2 ++ mods/ITEMS/modpack.conf | 2 ++ mods/MAPGEN/modpack.conf | 2 ++ mods/MISC/modpack.conf | 2 ++ mods/PLAYER/modpack.conf | 2 ++ 10 files changed, 20 insertions(+) create mode 100644 mods/CORE/modpack.conf create mode 100644 mods/ENTITIES/modpack.conf create mode 100644 mods/HELP/modpack.conf create mode 100644 mods/HUD/modpack.conf create mode 100644 mods/ITEMS/REDSTONE/modpack.conf create mode 100644 mods/ITEMS/minetest-3d_armor/modpack.conf create mode 100644 mods/ITEMS/modpack.conf create mode 100644 mods/MAPGEN/modpack.conf create mode 100644 mods/MISC/modpack.conf create mode 100644 mods/PLAYER/modpack.conf diff --git a/mods/CORE/modpack.conf b/mods/CORE/modpack.conf new file mode 100644 index 00000000..7cbf0f67 --- /dev/null +++ b/mods/CORE/modpack.conf @@ -0,0 +1,2 @@ +name = CORE +description = Meta-modpack containing the core mods for MineClone 2 for core APIs, variables and definitions diff --git a/mods/ENTITIES/modpack.conf b/mods/ENTITIES/modpack.conf new file mode 100644 index 00000000..07731c77 --- /dev/null +++ b/mods/ENTITIES/modpack.conf @@ -0,0 +1,2 @@ +name = ENTITIES +description = Meta-modpack containing entity-related mods for MineClone 2 diff --git a/mods/HELP/modpack.conf b/mods/HELP/modpack.conf new file mode 100644 index 00000000..b53ceb61 --- /dev/null +++ b/mods/HELP/modpack.conf @@ -0,0 +1,2 @@ +name = HELP +description = Meta-modpack containing help-related mods for MineClone 2 diff --git a/mods/HUD/modpack.conf b/mods/HUD/modpack.conf new file mode 100644 index 00000000..97471a43 --- /dev/null +++ b/mods/HUD/modpack.conf @@ -0,0 +1,2 @@ +name = HUD +description = Meta-modpack containing HUD-related mods for MineClone 2 diff --git a/mods/ITEMS/REDSTONE/modpack.conf b/mods/ITEMS/REDSTONE/modpack.conf new file mode 100644 index 00000000..245aa906 --- /dev/null +++ b/mods/ITEMS/REDSTONE/modpack.conf @@ -0,0 +1,2 @@ +name = REDSTONE +description = Redstone modpack, adds redstone and various interactive mechanims to build complex electronic machinery diff --git a/mods/ITEMS/minetest-3d_armor/modpack.conf b/mods/ITEMS/minetest-3d_armor/modpack.conf new file mode 100644 index 00000000..a3ba1c4a --- /dev/null +++ b/mods/ITEMS/minetest-3d_armor/modpack.conf @@ -0,0 +1,2 @@ +name = minetest-3d_armor +description = Armor-related mods diff --git a/mods/ITEMS/modpack.conf b/mods/ITEMS/modpack.conf new file mode 100644 index 00000000..b37dc302 --- /dev/null +++ b/mods/ITEMS/modpack.conf @@ -0,0 +1,2 @@ +name = ITEMS +description = Meta-modpack containing items-related mods for MineClone 2 diff --git a/mods/MAPGEN/modpack.conf b/mods/MAPGEN/modpack.conf new file mode 100644 index 00000000..eb9c54ab --- /dev/null +++ b/mods/MAPGEN/modpack.conf @@ -0,0 +1,2 @@ +name = MAPGEN +description = Meta-modpack containing map generating mods for MineClone 2 diff --git a/mods/MISC/modpack.conf b/mods/MISC/modpack.conf new file mode 100644 index 00000000..dad106d9 --- /dev/null +++ b/mods/MISC/modpack.conf @@ -0,0 +1,2 @@ +name = MISC +description = Meta-modpack containing miscellaneous mods for MineClone 2 diff --git a/mods/PLAYER/modpack.conf b/mods/PLAYER/modpack.conf new file mode 100644 index 00000000..52814db1 --- /dev/null +++ b/mods/PLAYER/modpack.conf @@ -0,0 +1,2 @@ +name = PLAYER +description = Meta-modpack that contains player-related mods for MineClone 2 From 56ff8fbad5bb4948dd734fdf4f456e3e1138698b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 12 Jan 2019 05:41:36 +0100 Subject: [PATCH 0214/1107] Hide repair recipes if disable_repair=1 is set --- mods/HELP/mcl_craftguide/init.lua | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index 0ee29397..6b3d4132 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -26,14 +26,16 @@ local get_recipes = function(query_item) if recipes == nil then recipes = {} end - table.insert(recipes, { - type = "normal", - width = 0, - items = { [1] = query_item, [2] = query_item }, - output = query_item, - -- Special marker for repairing recipes - _is_toolrepair = true, - }) + if minetest.get_item_group(query_item, "disable_repair") ~= 1 then + table.insert(recipes, { + type = "normal", + width = 0, + items = { [1] = query_item, [2] = query_item }, + output = query_item, + -- Special marker for repairing recipes + _is_toolrepair = true, + }) + end end end return recipes From 240250780894a04359008b63d4dab5360fd45d79 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 20 Jan 2019 20:53:26 +0100 Subject: [PATCH 0215/1107] Restructure settingtypes.txt, add mob settings --- settingtypes.txt | 149 +++++++++++++++++++++++++++-------------------- 1 file changed, 85 insertions(+), 64 deletions(-) diff --git a/settingtypes.txt b/settingtypes.txt index 153c34fa..7409690d 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -1,6 +1,7 @@ # This file contains settings of MineClone 2that can be changed in # minetest.conf +[World] # In creative mode, players are able to dig all kind of blocks # instantly, and have access to unlimited resources. # Items are not used up, and blocks do not drop. @@ -10,70 +11,6 @@ # per-player Creative Mode. creative_mode (Creative mode) bool false -# Fire spreads and flammable nodes will be ignited by nearby fire. -# Spreading fire may cause severe destruction. -# Spreading fire blocks will disappear when fire is disabled, but -# eternal fire is unaffected. -enable_fire (Fire) bool true - -# Enable flame sound. -flame_sound (Flame sound) bool true - -# If enabled, breaking blocks will cause them to drop as item. -# Note that blocks never have drops when in Creative Mode. -mcl_doTileDrops (Blocks have drops) bool true - -# Normally, players drop all their items when they die. Enable this -# setting, so players always keep their inventory on death. -mcl_keepInventory (Keep inventory on death) bool false - -# If enabled, chat messages are shown to everyone when a player dies. -mcl_showDeathMessages (Show death messages) bool true - -# If enabled, the weather will change naturally over time. -mcl_doWeatherCycle (Change weather) bool true - -# If enabled, mobs will spawn naturally. This does not affect -# affect mob spawners. -# This setting is only read at startup. -mobs_spawn (Spawn mobs naturally) bool true - -# If enabled, only peaceful mobs will appear naturally. This does not -# affect mob spawners. -# This setting is only read at startup. -only_peaceful_mobs (Spawn only peaceful mobs) bool false - -# If enabled, mobs might drop items when they die. -mobs_drop_items (Mobs drop items) bool true - -# If enabled, mobs can take, place, change and destroy blocks around them. -mobs_griefing (Mobs change blocks) bool true - -# If enabled, players respawn at the bed they last lay on instead of normal -# spawn. -# This setting is only read at startup. -enable_bed_respawn (Respawn at bed) bool true - -# If enabled, the night can be skipped if all players are in bed. -# This setting is only read at startup. -enable_bed_night_skip (Skip night when sleeping) bool true - -# If enabled, the recipe book will only show recipes which require one -# item which you have already discovered. -# If disabled, the recipe book shows all crafting recipes. -# This setting is experimental and may be changed in later versions. -# Feedback is appreciated. -craftguide_progressive_mode (EXPERIMENTAL: Enable recipe book progressive mode) bool false - -# If enabled, the “flat” map generator generates a “classic” superflat map: -# Completely flat, 1 layer of grass blocks on top of 2 layers of dirt on -# top of a final layer of bedrock. -# Note if this is enabled, the setting “mgflat_flags” is ignored. To -# customize the “flat” map generator, you must disable this setting. -# Warning: Disabling this setting is currently EXPERIMENTAL! The generated map -# may not be that pretty. -mcl_superflat_classic (Classic superflat map generation) bool true - # Which edition of Minecraft to imitate. This currently only affects two map # generation aspects. # This setting might be removed in a later version. @@ -88,3 +25,87 @@ mcl_superflat_classic (Classic superflat map generation) bool true # Jungle bushes have jungle leaves. mcl_imitation_mode (Imitated Minecraft edition) enum pc_edition pc_edition,pocket_edition +# Fire spreads and flammable nodes will be ignited by nearby fire. +# Spreading fire may cause severe destruction. +# Spreading fire blocks will disappear when fire is disabled, but +# eternal fire is unaffected. +enable_fire (Fire) bool true + +# If enabled, the weather will change naturally over time. +mcl_doWeatherCycle (Change weather) bool true + +# If enabled, breaking blocks will cause them to drop as item. +# Note that blocks never have drops when in Creative Mode. +mcl_doTileDrops (Blocks have drops) bool true + +[Players] +# If enabled, players respawn at the bed they last lay on instead of normal +# spawn. +# This setting is only read at startup. +enable_bed_respawn (Respawn at bed) bool true + +# If enabled, the night can be skipped if all players are in bed. +# This setting is only read at startup. +enable_bed_night_skip (Skip night when sleeping) bool true +# Normally, players drop all their items when they die. Enable this +# setting, so players always keep their inventory on death. +mcl_keepInventory (Keep inventory on death) bool false + +# If enabled, chat messages are shown to everyone when a player dies. +mcl_showDeathMessages (Show death messages) bool true + +[Mobs] +# If enabled, mobs will spawn naturally. This does not affect +# affect mob spawners. +# This setting is only read at startup. +mobs_spawn (Spawn mobs naturally) bool true + +# Controls the overall amount of mobs that spawn. The higher the number, +# the less often mobs will spawn. This does not affect mob spawners. +mob_chance_multiplier (Mob spawn multiplier) float 1.0 0.0 + +# If enabled, only peaceful mobs will appear naturally. This does not +# affect mob spawners. +# This setting is only read at startup. +only_peaceful_mobs (Spawn only peaceful mobs) bool false + +# Allow mobs to spawn in protected areas. This does not affect +# mob spawners. +mobs_spawn_protected (Mobs spawn in protected areas) bool false + +# If enabled, mobs might drop items when they die. +mobs_drop_items (Mobs drop items) bool true + +# If enabled, mobs can take, place, change and destroy blocks around them. +mobs_griefing (Mobs change blocks) bool true + +# If enable, mobs won't bleed or emit other damage particles when +# they got hurt. +mobs_disable_blood (Disable mob blood) bool false + +[Audio] +# Enable flame sound. +flame_sound (Flame sound) bool true + +[Experimental] +# If enabled, the recipe book will only show recipes which require one +# item which you have already discovered. +# If disabled, the recipe book shows all crafting recipes. +# This setting is EXPERIMENTAL and may be changed in later versions. +# Feedback is appreciated. +craftguide_progressive_mode (Enable recipe book progressive mode) bool false + +# If enabled, the “flat” map generator generates a “classic” superflat map: +# Completely flat, 1 layer of grass blocks on top of 2 layers of dirt on +# top of a final layer of bedrock. +# Note if this is enabled, the setting “mgflat_flags” is ignored. To +# customize the “flat” map generator, you must disable this setting. +# Warning: Disabling this setting is currently EXPERIMENTAL! The generated map +# may not be that pretty. +mcl_superflat_classic (Classic superflat map generation) bool true + +# Mobs difficulty. This is a number that will affect the initial and maximum +# health and the amount of damage that mobs deal. Health and damage will +# be multiplied with this number. +# This feature is not finished yet! +mob_difficulty (Mob difficulty factor) float 1.0 0.0 From 8f7303d540048f7649054355b4c8adff374c89f0 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 28 Jan 2019 00:04:12 +0100 Subject: [PATCH 0216/1107] Lookup tool opens help page when using it on mobs --- mods/ENTITIES/mcl_mobs/api.lua | 5 +++++ mods/ENTITIES/mcl_mobs/depends.txt | 1 + 2 files changed, 6 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index cf72c795..590ba8cc 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -3073,6 +3073,10 @@ minetest.register_entity(name, { }) +if minetest.get_modpath("doc_identifier") ~= nil then + doc.sub.identifier.register_object(name, "basics", "mobs") +end + end -- END mobs:register_mob function @@ -3727,4 +3731,5 @@ function mobs:alias_mob(old_name, new_name) self.object:remove() end }) + end diff --git a/mods/ENTITIES/mcl_mobs/depends.txt b/mods/ENTITIES/mcl_mobs/depends.txt index 91d5a207..a1d9c9aa 100644 --- a/mods/ENTITIES/mcl_mobs/depends.txt +++ b/mods/ENTITIES/mcl_mobs/depends.txt @@ -5,3 +5,4 @@ invisibility? intllib? lucky_block? cmi? +doc_identifier? From 3bcc2c2693fce34a1b49373b413c8434f4be121d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 28 Jan 2019 00:55:41 +0100 Subject: [PATCH 0217/1107] Make mob knockback weaker --- mods/ENTITIES/mcl_mobs/api.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 590ba8cc..1ee20492 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -2444,7 +2444,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) local v = self.object:getvelocity() local r = 1.4 - min(punch_interval, 1.4) - local kb = r * 5 + local kb = r * 2.0 local up = 2 -- if already in air then dont go up anymore when hit From c40cd5dbb7a3c5dd482a7a50e7b3acf740acf874 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 28 Jan 2019 21:06:56 +0100 Subject: [PATCH 0218/1107] Clarify official version support --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c16c38f8..e9d95d2d 100644 --- a/README.md +++ b/README.md @@ -75,10 +75,11 @@ These items do not work yet, but you can get them with `/giveme` for testing: * Minecart with Command Block: `mcl_minecarts:command_block_minecart` ## Installation -This game requires [Minetest](http://minetest.net) 0.4.16 (or later) to run, -so you need to install Minetest first. Only stable versions of Minetest are -officially supported. There is no support whatsoever for running MineClone 2 -in development versions of Minetest. +This game requires [Minetest](http://minetest.net) to run +(version 0.4.16 or 0.4.17). +So you need to install Minetest first. Only stable versions of Minetest are +officially supported. Minetest 5.0.0 (when released) will NOT be supported (yet). +There is no support whatsoever for running MineClone 2 in development versions of Minetest. To install MineClone 2, move this directory into the “games” directory of your Minetest data directory. Consult the help of Minetest to learn more. From b23b9a93959ba68038f0e80918c75ff4a0aa7128 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 28 Jan 2019 22:13:35 +0100 Subject: [PATCH 0219/1107] Add silverfish sounds (thanks, Inocodum!) --- mods/ENTITIES/mobs_mc/LICENSE-media.md | 5 +++++ mods/ENTITIES/mobs_mc/silverfish.lua | 7 ++++++- .../mobs_mc/sounds/mobs_mc_silverfish_death.ogg | Bin 0 -> 36304 bytes .../mobs_mc/sounds/mobs_mc_silverfish_hurt.ogg | Bin 0 -> 20848 bytes .../mobs_mc/sounds/mobs_mc_silverfish_idle.ogg | Bin 0 -> 14053 bytes 5 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_death.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_hurt.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_idle.ogg diff --git a/mods/ENTITIES/mobs_mc/LICENSE-media.md b/mods/ENTITIES/mobs_mc/LICENSE-media.md index 4cb4a800..0abced56 100644 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ b/mods/ENTITIES/mobs_mc/LICENSE-media.md @@ -167,5 +167,10 @@ Origin of those models: * [ebcrosby](https://freesound.org/people/ebcrosby/) * `mobs_mc_ocelot_hurt.ogg` (CC BY 3.0) * 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: Note: Many of these sounds have been more or less modified to fit the game. diff --git a/mods/ENTITIES/mobs_mc/silverfish.lua b/mods/ENTITIES/mobs_mc/silverfish.lua index 7c9157cc..dc2a9c92 100644 --- a/mods/ENTITIES/mobs_mc/silverfish.lua +++ b/mods/ENTITIES/mobs_mc/silverfish.lua @@ -21,7 +21,12 @@ mobs:register_mob("mobs_mc:silverfish", { }, pathfinding = 1, visual_size = {x=3, y=3}, - -- TODO: sounds + 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, diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_death.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1930b4e423661d837fe9507590e3808ad5eb3061 GIT binary patch literal 36304 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 literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_hurt.ogg new file mode 100644 index 0000000000000000000000000000000000000000..bc6279a6cb51ca8239c3113e908ec345117493a0 GIT binary patch literal 20848 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"i^6 zW0wqv`+A-*$<@!7Hmw$2_C9F;vN*qaZ$3X2{(b4@uWw$7XLfJBo^j((SWn+CZ`H%G zJJvM&PV#+MdzZ_oL}TSimE69?dSTJMH$6hwU1i_R+_hKHo7HpO!fy%RPc903&2#nY z&hA%%{*-u%6OI*P&>gK}PLRFJueo9|4E_GSy@$LS`BJpJM8>xGqt zGF3{mzXcf=-z$1EJw|)kSEYO3uWYM6)@?bLW%iGo%gUg@-TJXx|@2Of2Tdxo_zGz-;Itt4q7eOuG`b;9bclQTm9@6r>d?_#OFl+ z(}(ZglfCzCo26c5w#_+DN4?Jn1`sSR<)zrJ1B`S`7x&L*e+ zKpyk&uU}3UY6VzCT6v`Vsm-CD$crT)RZ2XeZ*grwVc&Q)?T z*PfrXa`xrjv%j;kYUm0cJZAsoTj=uh|F@pmyd!F7!|Tj?_KWsU`Ho3%{8sL$hMl=0VI@4Ow!e%j`7uIu*RmGA$l&UqZ_lYi^Y z*Uf!$FE6*xu)JD&P>tH*@v;nbC80yzge( zxmc?-(dVi8GF%=Pe@zv5rrV@f7DF7{!K*>kaTVY1uYLw`+mzxvXX7v93fC+`N_SsblByK>F> z@AumMmYQ$ZIUI6+Wvuw@yjgEv%`MH{eP_y+eBP@I+tmHfPxp%vTl42`ePP+YEk6#f zuATgTxB7E$`E_zur=l(&^s5TrpK`NwO=qn7l?#Oj5)1Yoj6Pjdv~{(i->dF*U7?rS z?Q>_4TJ=+eQ(HH&vxC4?luF}R;Q{n|wr^WKt= z(tDHNwb$E~Y`)UK~H(C!;%E{&nRu&wOoBJE~fBoF<7PK)|^|ics{lrg?I``&;&aaJdpQ8A{L5v}~`pU$#gkF*S z$uj45O?GjA%U}EPzzOr5P1D})`BkU1`1%j==f{(F_jQ>@D_QKmfBsRUwff~(`aYFP zwth^8PcB^xE#W1rhK7|tJQI0Am3ewtVOw;2y=#HW`V!95 zWm6X<_v=?}Uu>VGd*5~&<5us7?R(>!{CQxL)c2CBW%o8$G99R!#Vl*I-FS)N0b!2X z_+n3ZPU>EG+Vc|;<)=j`RpLfQKb zZT{DU9x6!PxJo;+?!($t)6$(aBF}ff;hG*`$!`9=Wns#JxSa6VLdCU-YkwW9@Lgtm z&2yKz|2O}%G8HX`nTzJ>eU9PEn@gPLIu4EPUA_Dc-boG%KB$;1-y0Mrd;g>2oi6d?MF%)<$3OP|qVaFSoTqhg701b`G0ncjiRlO ziCoZ3f11LWbLGXnWAZK!C;py!N#c@6)1SF#bniXhoV)h>_Z7=HpGj1F{JH9#Ztvx) eFV`#}Q#uR`_kycs-*R(lJn#X>w!?oORt5kGztr6T literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_idle.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_silverfish_idle.ogg new file mode 100644 index 0000000000000000000000000000000000000000..dbfc41b4dac61b4064aa7552131756676b8e4b2c GIT binary patch literal 14053 zcmeZIPY-5bVt|5<(6f>trdZ7R4~%k*W%)%(nZ+OhMwc}pih;pkB{P_@gAuF~%mxu4 zos0|&3?e;z=7O&OQNdMah)Jdl3=9#O1sQt&Md=DTnMq+_^A$W5j0_Ad42%uU6g2$u z%M}a_3{(};Qp;0|6pAxab8?C`K{hb5LJZM%at>o;;9y{2F!WJ4+Hhe)CVPtB!M7HU+^nBoCq9X05jF{SgUL~@VeF&Lp>k|N5$z{1d=!P&R?nP=8H%XA6# zzM=(|nSK__71+B1A6Rl8`l^Ta86RvoV3_;Sz6Y*%-P#AR&UEa zy-DZvCLXX721W)JkZTwgWX@WKfzl$Ur4mLC87H(D9GDm!ju*-tFH~_2QaN6v!wwGN z6ATO-3=Tm$M~h6{i%pIf+Z->paW8Q>ImPGf7axAG5(Xx4v@^!f zD9pMr>+@MlzFAKftQ47j`Cw)DE(BD0InbxxVBzIA5^ z#5}N}#phPW%{h0_^5LA~bDg(lXYb^Uol|`7XUd#+XE{M)=*h={fq^CQhQzVCO$xPr zY)K-D%M>TemGtvXUSN1abBSDUpPSdp=71nc^`#|EV4o{6FtiAOQ!$JHCuK+~UNWgm z>y*akGe)O%K*XBE=d50DI4t1IW4Ps#myYSxu;kvY&*l}cv-HSby7gL=_R=XqUYbk6 z;Rnhf3MmsD*(AZ4q-{pgDb3{znz$gr35mE5D(3}dFCwAyA7uiCR0D-nFB<6v8{3A4 zgoc;pMouriy}dQ|M(O?QwfC?0#*4S1CoFi*VQ}J5Yys!VDM>ws$LBQrIdMWF7?yJi zMUGFDIXO|qdy|UqC7rXMO#DBaToiTSA$Hi2I+=|*y7JI zp`oEyO?)q#G+vl6m4QK$f#Jnb4#gIMNsFgN3G53$WvOBMJV0zs=JnkQJQs}}QlX{at0@bVH(7BG6Ql5)jn2|*f5mj-xcX)cur_R=jA2;y40M8qpobE`i4VPU@;sG1A zcFC2bEX{4#qSk;dUjnimB;l!B?B~U^VxShB`au;ojy zMP+Z@2C{rhNKht7N7mY7*P_;}Tq+TqZMf}PR=`0>e1aMlf1^X z9PD#3FHhaABFS00#{#^vz^>BWb}h?i?NKQ&uu+~Xw_c0tUAt8(*voL)wJe{NMU@&A;JT}LeL-VLa%Q1ze z63qgdM`siZC@qyJ=5snWqgcS}B#5Oc+ad&t7XdF#O;HAhfCmf=0twB_jyz&$ZCk^_ z;Kalr(K03JjOBBMDU*U)CIt0ZK9^|;3hELF>N0#jr#ZmOYif{>;WLm}*2*9+!((8v zm8m@-F##{nm0Np2VggQ@np>|~K9?yG^734|^oG^*In4rInyO2$MLm~k5deu@OL{%0 zS-?qCb?KF;ZpD@$FHhB_(~`OkTY^C9rbKlcP74Y0TDkOEQuoGVL0(>(ORq(B8y=e# zl(ll}wWOYn$D)G0K*7~*cq}TLk%57okAZ>F?SiMJ$vuW`Q-Zn-kI6WDX@c4~noB`#oaa-5dJK=vDDE*lCR2RQ z@|Z;O8O!G~$!83o&nfORJO*lg90y4}pOXw}jBqkAXcaIpaBK)nDQ=p$z{xp`iD4xJ zLyMsoC=7$7S|y6lS#m5j@i2Tgr&z#iC4@UA2*TA=1<5K-nG^()b<$8>dd`vq6ntKD ziv^rC7EYPs#IbZrP>|QkRsk=~rBgzpw3bep6y&vXYZxS4v(_>&d|+W`SimG5=5C=W z#jOMOBO}8BiRKB8Y>LUCmQjm<69*>)g9ON(1`Byaq&5jLc(5`s@C0=kvM*gC0!~|A zo|>Rk0ZJ*Lqy~!oE<X7Hfh=hfT+Kdf03=AHc;D+T=P;4BV0g4S! z9Dv1^!C7D~f_Mg%I0K5D9?NGkpyuhEVm}6kfJSBphlXCI*}^?6q98wVuro09B!ZLw z1h2(YKq0C+HB4&hoMs_Vik@bvuDUcRC`)(S8B0ygsgr`Tb<2c;vUHbTOIowBc|uV3 z%B^C_y|OJqQC+&nq>A4vOqmpw4N9LHOPAhATC?%mEN4xSlC`GKV}i1Dk40sl-THh| z5Ln6Doy$R{T#G4wZwoSI>$5r4=U5qL*jO+)sNS$R>~$&fVMYNs9PThMxM?1nQ_Kgd zjs=`Jrb4nQB;vG|f)k7)C<+x*K>4=>BH?rbNuuQfC}V>q0-Q9L7N4_Zhv;Yt@B-yf zkjX+`8cU~uQ4DM1Vj z7r^l;I8`iZxn#IpqcWGI8YF)`WME)`sm)RWX$4uUtO{d+JwzJuO8XL2PM9G}aTc&)t_m3_{ZU9slF&aDyIXHB2qYv#A& zxSzG!^m$D7d)x2xn)3{=#S~vS2vXv>Ln8aU<#(ADKC2&cJPap#3m6K0e06z@TQqz`zo5aNU_pt9lv|;EVDK~ zpQ6|_XUiP#lRS=oQQ5jFCp6Rzw}}|Fh-|qP^>Rv3Ptxj*B|V0oE00d|dal60z|h3N zz$|Da%pu~?*vP|R;ovcWiGhooNA|F*gM*&p;sXl`d@R)GnlUgqcAOFD>^Q1mxKK(% zYZ-IHQP#E^h7%WVc#H1+oX! zuYSPDpm38xY0=D?k6(QF!N4gfsiF62A3GNFjF#KR(@Ca+@$Vhu;VP#|I;N;@w z;pO8O5EKF*RA^`bb*>l~92giF8X6$O1`Wbs?F^t{1CYXpOND;P6_u3N)E1Z5RpsXw z7A6%G{QtlI|Nngzr3FQK1qCH7C!Ny1TPLbsF!=lYRm~?$IqM5AYyO`*`siO)<@@zV z<@Z)al)u~jXJes#ZvT~<>giRL|99T|Yx&DOR-*I{gL$0X_0V@e!si*QNV)CZcI=+# z4Et-J9H(mP+HI9yzUe{bU8cQDuitZ1K3EmAYi{(PnRhc8S}v};^JPlsRbKS)Vq=SM|Yo@ zemDK@`hB|9_iK~?hx_Z!{`EULywp#;tLytbtBU>mmoGMcb?m*^=4W>|mR1~^vvIjq z-3K9eeWgXR^D?&N@u(jp2JDGv!HxObz>oy?qid^W*JX_wIaqZJMRY<(m`gY|d`G z)}pQ}l(*ycO#hD)cYnFXaP0B7&-0HSUv4e4?WY}c%iXxzO+MSUYzQiDDEU0u>EW@k zJH1Qq{`h^e_k+x#+5?Pl9=4WO<%1XZ|i9+3wW_WWnIZu=fR`N)3{s@`edx1asFwoFo7=2~&n4O^?7S9~uSm_#sgDNoxh_5Qf& zz3u;!Q~4%)?ESu|^+;zM*PcgfcXG0{9?{=772)7KkJiPeMzBJ_I~xzjgnozIi$Or`h#&QrB&_U;g?j ze`l5a_1B_z?fGhKcYpmgt-iuUk6$zHe(B5T_47`1{O!w1YhX;`Q&)O>kum?SjE&c) z$nHNb|DB#X%|BIO6UujaG0RR%ncfXPH6K<5zmj}6M>hUB!;?r`-(?rJFq~z4cK_SH zoNwQ{e%;^q&tmPqt?%obk9*tOE%Dd+ebLrV#Qv?wv7PPLJwJ;FbXu;NaP5%ld$Xv; z2X87JQn=!JSzfEp?A|6*pK$pfS9(7Cp3UE{|9*;%(eJ?NnqRDIxZ8Fa?*G16hNt*U zWM*sH@&Q2&$NF*>*eM>dH3V-;oqM)oMmf2 zT=4!qce>7xtD-;VR{6FX8@-L$scqQt=0Nzfvyze01^<_>4f>*>k$C*t&*QV}*F8S8 zLc>+kewuaB&z2ACH_u}_lUUm4V;$t@cy=SN_7T_f$!5oY*r#Wn6tMsB^jp0B$=gfM z2j8ln{^-%uXVpr%{Hom>AD#Z`5_$RQ_WL`Yh9+LV?q2im+y5EU?@TbB)qe5gwngPO zo>NjjH~zmL#OTXEMf@B~vECD|HIBV+wbP!y+nCMt#I<|PNsW?EhurE5d#t7&E1e%H(S062a-0cjoSrdU#VPLAvGeZ;R$9*7Mi!W<8Ru z+g6jx$-{DV%SxTUeDX!V^B(`%+97k~kK{kj);@+Kw%luU=Eca!EZtvQ_pQLlHrigS zzjnub?(?&fHe1^*{J&)W*6=&w`5XU4UrPNR^Za-Boze^K%zwTen&!TJ?W~C=k&!x^ zt7dF|y`P&oz5jLlu`TPg*Sv_IarN;!z3bPyx$pc5o^k#<_uZsVN?bQx*%|(Xt}I}S zT!W8&wZ~~m-+wC)eSX&%VPI^e^t5bUi}ol$h@5=F29S|@&4Jzyu9;P zv+i4q^UI6ZpH+GE<<;`lGx+{(I#O_;Li=!I_K(~c?eDMKVk{B@w{uX&v8Ge0Fn#)qXmGN}OHNl-P-@iO0@#^;Gq~||_Puf{Ma($F|MRU3M9NA-+ z#O>O3xcb*w-}TQotNdrUzQ1h!+&Rxh>#v@P-0k}~Q@;Mo%=2~@`*mFZp81z?+wynG zN9WuB_DH{;SNyl6I_{qR{ipKPwsT(3E9F1-@m1E-NrfK{Tc`ghvOPV!>d3tBCmO$B ze*53#c>C+Gr+0l0VNpuK#eS%=Wl^U*Fks{(se;&v5(uCR#Rb`TEscIL}w?E1Z6L z8>h+XV##XZ}-@STm_0Gd9HZiW5^wh|MHOac%nSR(g@9JKAw~WL79-dbY&75g{oN?AiZ=H8HIF9SjWT}2< zuJ^rNJlgivf5Z5DbMDTbSaL00#5kxh$7;8I^W}b*-zmx4cRv3fZL!bfd-&2VvSQ!W zO;k^R5WniH_)th?Q^oOo3l)<`)PiT7d}Ned{p@~ z<9#bHlS<>gvOjs%HZnV!CR#N)``s?iNmU7{j+<<6r^sM(qE%xS6T`fk&j#0@YQ!E4 zU}xCC@!&;~zu`;Omm0hWnolfUvjEgGEPH+{eqn%AgNu_QLrwc>I~ybJSpKVr|Hf8? zt+`+Gul`3)2yXyaL&x_FdI^VzcTYA;6+%2VbQmy*~w{4#tePwR{&!4mZU-i_*^!gBrhuU=i-b}{DH{P%C<=PZ`>uP)zke8xQM?iG`hMW^pJ zK0STb7yX}kS47WGo&NTsqHX5?H}-#4*`3;b`OFNpLQNa<=kNUbkA40UQg6O3D){!d zWoN&BS?|`iHnF7K;%dwHIU8GqbszWr7D>8dlKACJR{!npx_7JI&i;1fcji3rmqxP^ z_iroSoGup~W%uU)^zAyG><`YUpZ__>{Z`+v4UBe^cDxX0{=DJ+7HdN#!)4){UKuky zcwzs4`+JoPJ4^rhx94ZhT4q`E;(w&VZYF`PT&pL3x@&#P@8yjpZ!h_jM#%3=k^Fw` z(Op#?BX_OmAG7utuHUV*;_jt;{Mnpt$7iT`Zu&o?x;jL!&3}*L`CC(uuCcwe``2Zy zSNmpnm9Brn{=#KRmHFceSg}TpN;M~7k)OP;mRgD|-XU|_yU|eMg;Cw06h6>Qjlo{@pww zvVNKCtH<|d95MY^ajmU$OIOt7SC*Tz*MHi5&7PNW!L)6vi+vZrQdYbqbo9-M++2|c z4ue?1Wv>%uG-KTv*7Qs_=bf=>M~Ln9_be|M_tz^k$dp`gWS1=wVCZ=&a8c{nytrn* znBs==>HGIpTK`|N(dNG2cl%!(_06x>6&_i$y*%OT+G}O`3BT^Ho?q|xsQ1@>?_=9{ z7XR{p_50_~urJOra-Y?GjhtO?>A7ghMlj!2$e(5(`tqjqcX^Hfxf;1ER~~QPxNjcg zhrIfv8?XL;f3a$FPmZW`cT3B zKR<2lXYg;nFaGS!Ve5S}^fs;ckKb3jKRRynyV70%u9?WP-(Gk8|BLtMShzH5^Ume& z+>||k+Kt5DxA?7!_q5k`g-&{IyvTRLOCFj1J?H-I`j)h2-zMjqA#1mPsw$IV$ceOF zG2dVcw}#ZE53e6C<39TPoyL(64c%{%_3r*3Ke%>&{rJBAPvj-f_usaiDAVlD_xJek zX1l$0ULOlf#jI{irb+F3-!G?q64@HDW4X=VbvqYcKc9QiwtbGlf8J}S7As{5>n{76 z^yF{izGEia{|h~R$kgNOdeA-X>ruDVfcpNQW}n}@v6*ML_rJfn_LuXkgFnhGKJ!_B zzUH1Ix9x3?HU{nbTlW9-J&PZ6J|7o36Taq#t6QSU)hM0KPuEUccyFWmG}#5~R%Be? zn=LT$^YqJ856FM170ugKu{rC^>I2iBhcGbYc>X;wb!~}m!SB;|&gVUPQ?>ij;^qFk zUc~)BnScJd^ZR+>X1;~*=k~v!Yrn(Dc74g8eb+aZoi9|gUFspfdzH}<$)9x@CMl^A zM;r{K<^*{^#Yf>+hmQxpz78S7cuCM9I8P{G)R`(!yf@nU8(aR)RUcUz_~J%)%_s zI$iFMp2OXGdyZWG{ruJI%WBhq_N85{>3h3;>x$n$1@Axl`L1mH#=TSJs*6wW5wERN zJ<)CJkg_1FxO(fKoGT1`8YVmDZGS6uWxf4}ueVu?bK+fGlXv7gzRQ~Ax6YyF=5og8 z|6EcWYZCWzOlYZj-r4$ouJ+n}bF%y1_1gOF zZ{+Lz{%j1odF$S1w#QzN#hzDQUqAn^Q>p3i1G|3e#)ds*eww^@Zl3Mobq`)d%knQS z`7|y1#NrF58s9#zh&lGV;?J9N>kmKXgbqGvBL*Kps~JwOICNh8|NjU7|EK={U-19` z^2Fr${KDM-{|~1mNwHnM$F_0qgT%uxex7-*b9LL^vi)`Se+&Np>-;_cU95f8|AG_g zv&{d;mj37LzP)?-kH5Wto@&XTUHyCZeXFJO+k0Ow{l97Y-J%Egubcn-{3++=*}GBS zzv}q0&;D0YlcRcclX-HLu{Zx+_xrZ-ukQUjd%o(&o%-MXQ4z;ZOzVDm*f7@be)*-_ z%C<`1c4vMy`^4Y9wQS4oH*dcs)bB5TdHBa$?*CSgJ{(AqsJm%h+oGJ zi;nMmwq?z?v*8!N%vmYgy5~b+X5sg@a@WisRX_Y2eKr)-~iv_$UvF_X3#_pbK-e*CNbS7uH5k1g-~{g)L>F)%b(t^XdZ zxHb3A-G4X!YRsSiY*yB6iE0y}KmYDZ@3Q+eVU~(@dGu|jiu+-U7d^`epFQ#I<9A7! zezz8Ow!fP&`<4=O@ri$XwjBsyP@A|y_1WRMwKZ=|xr0}-eLm(F!&UpR$hzX=(n!|4 z?Pdq>yM-OqRVthoRQyY;&2HQJy+vQAh44SAXFE+;WvT{?LU%c6R*&C(5BA9HSo{k@;j@vhS3k?YRxz5f;l|5*8cZ`QX*dHw!Z zcZmJ_ccgsLZoTQ#FQngDFIDvL@v|J|dr9w{Rex*B;+ju& zUtj7SmJYg~)SZ9Y{w{~pZi$zUT=i?}UWs1!*=bw7`?K*ozuQ;MPHaE=+4t|9zniD- zwvjr2Gs7uWwp@L~GmSlx{_67nyG1&E7w`7i!mWPvLt3@KO)j||{{#1?W?o*eqQB~| zDGvh!gB9;1Pv>Z0$rt?v5{=bmw_&QCZdf;yBZ+ z?&P5Jffo|)B@yXVgP z*%a^mn|5(pZ*5OY`W&6TbG`pQijp%wb?H{x(-TY2=Inc4a@OSZrt^N!^}b!=Zj)V;`*Fe%tZ)uha69 za(8!J*83H<#5=E6twt{9ebX{_)3D8)4y9bJ{QGZvE67 zy6)SRu=OvWhaPzs6@O1l&_RHaVFB0Cdec_(s)qL;w!ghHZ!On%WmX1@#YY|5DtS-t z{PJ+qN#P}1XMNthid*67l(?m9_TSmy{!YQE$=l4UR*zw8ulJr>9Tw+sGxiBV|GqDE z|Mm9gv`t%0jFjb1J_jW!gF7=zTz)mwml)S5fEI+=JzG;3z`YjUMJPbd+?b>GPO@>d;e!Mex-R~Kd;p@&{$Tf|8wM+KuyQz+Y+TwuRo_BBj7+&dzA2)nvBKJKw=<>W< z%PKYZCCMGve6@VKS|Te0!vhml##z(n-Oe@IrTuQ#j*0u;Wu0(*%b;*`2Ma^rvG`jo zn>uv=3x@XY3Vr`SUESd8sZDkJ4)gsySY}mtPiEJ0i8Fgw6}@=j);Q0y^rOV(%-3c9 zr-KS*r~lb|ri9VcfA!*JU+=lCIxO=m>PFGK%lU6~k`DJ-Uz^YI(_GJHz>y8Bx6p~3!*>)zkaXVU(CfvHV0@W|`1Ga|0rcG*d!e_x?zkh}W0&EvbbqkQgc z%Q|hC`g5*}^))vSqbP;qwe@wWi3|*j&ot&7OleG7VrFT6FZq;Uw@IMa&FA{{^Ujnu zI3>DEn>&T@xu^)4y)q3dQ~tYKa>sVd@ZH%l%Kwh0TfDpdbiMk!>89D&(la`DZR}+M zB?$(G1x5E27#IrdW1p@3(qkqep8BoDag(Fk6~|9XqQ=ea4M(?SGeiiKT>1TZ%XcF; z*H`Z93$%A_V&_|TJwzt@%Lf{a>@m;PIyXL$Z&Gdp32YH~$e{bB`9!9v3_x7ho}CRq_qF=OR}Qe~^ji zzZ-x2>W(AJ^Ukbo|5&i^*mv!^nE$WB{^x&-kenaKzHT{luKKJuyXvmTZod_K>d}Vw z{}+1y{S2>P{NbZzMa-)upO!i$&nW8!a6`NNxxqP?GlY4!zxm^32>H6T7`xho3 zI{8^Xj+bw8^9R{$kA;)3@2xL*{=;Z%=_=i1n`N_OA5Y^wIlFx3<=?u`-&}0p?@ReV%{&`I|PcS01%?`qxX7gMN*PIc4*ncMIsyB0U^v}NO+gYM=qqC%K z4LsAiUw_fRaC=A9687hwI|Ms4&UU%GiJYxo+c<~Vfp@q`^L-BJJk4vg@oj!zlNn) zpIf}TVs8cCzuAU)k?SU1%Xhf2tozT2e*%%9B*VaPVD2rMwUfX630+!}!QRu5pCz=n zZoBB+1$(L)bkTl)`leShkH z)~-z9()9Dm$x=U4Y8S^u3xKsXwpY-v9rtBm`6>`W(%f`Tvf# zp4B-aFx#^`{$adi&qndu-H?*EV>3;iprUh~}F0+r`ptwk|ODG*pRZ zV@-b7x8I;g=H0v6+kvmE{Uaa$?%na%(`50w$+s%Y-k7r=e&k;GuKG{hv02*>e-yQU z@x*DV9h;NIr{BH%o4443OTob%iMtV-{G`gCPDf4gz|nSaGH$!|03yk0~f+MsKato2#=-`f=r_SNP7 zommsIYx!&4*|9H=zq)++-uB}2UA?90(M-H)vUBgH@vha0?bFHTIP%27GSZIyA|tQ; z^WcZGzMieIdcROUI(H`D;`_xlC32Hx?RKBI_vLz0jQH-ieLB8TpLlKWzFJ>i&da*x zv8nFI3C}~^#qarT_;g|R>z%LnbX$j1dS{hY&la@jy&1}9Z&jSk+b^m(eG>oQ(o50p zj4Glt^)<~nTTAkP=1)8Szj(i`Oi+Bj$ooK>j0pbV@6Y9m+H>RUe|?LU{GE6z@7lzz z`RgXnv)i$wzIKY8{@YYOTtH3F6EQBA!c+_w1d>HUG-~C7B`L<@SY&o8SApfBui};oGzJzcz3G z5SH#L_kYj(`&y+YyY#>Pf9t7vx3GHsa_O%(Z?kN8rmkCg_T2U4fE!IE+*Q4@Im!C( zdXDx9#aiq;S7aC@%eQ~e&bhbNs_*?$K5_eg@mnuHhyQ(U zaou0)az^=0t=6ZrGv#)>rkkJB=TDWNeQ(S6`xd{Gn$}d=_8Ti#o_zFmTGEob)wBx{kSYrf72VS{kv`6$ew??{WJ6B zRmY#6$(ZMKjAzdE@|*91R;9@PE!kcCcbBc%tG|=K&bfb2Z%^i_n&Q3nK6BSr6z3Ku z*T2($|L;%P>+au|d9KB%m`~+iuLif5puBDOC7j)q#7e{Y$;8ZpOW? zeD^&1yV%Ll?xSrA984k%4liz9y1KN>!Rz=!28-LvW*&dJW~TY}jhoVD`ORKwnlbC< znu6-+))TLHx<0zX!62t3vygMY+vGF%zi<7i*}6RXTW0mw`N2GrDa+6NPnWs$Bg=2! z(>l2&a}s$M2;JDfS#I@?ivNXsqf*|>sZRCm^3{)x{dW0Be7R$d*UnEy+YBrBgq7@! zpTx>jzy0=<_T%-pDqr95lsS8IXXkgZ6=oNe=bqJH)YnGz&Voh!G!U6t7&ruX{Sp;Gz!Klzh&{dXFA*Rjod z_+j~7<797h#si=CWFIlz|L+s?v?Xhk%_8J#Pi)e?n%86^_gY}@TFvs+q7sk(-HM%i zanVgTwq#$a^S^EuZl8bj{0GN#cjNN=u0Hz4l$v(>W?{>OAgz}dlv|tpmYuo1cK7-l zS8wX}Fd3!Zn_VZe|LZmFol&LD7uyu0iy5_9j>PHcG&^c?{HRg4(04t&_Lar-+T=gZ zq1rvB$BL#MWZyl-yO-=Zi0YU2*gA))kHmb_M%~8to}N4BAv6n>_P2 z52I1ou0#{|6QA?;YHyDH|FHJ&-npCAvTw~(oBRIU4k6Rax6B)lxqSSalezcyC$)*H z&S?UlZ``ZniE%vpkK?!DnkJJKU*AS2{!F|6yn6fHw$BQ6dw+h7PX9Ff=d$x63^pfU zX-_mccm-t^R@q|}n!r2qe=7#Vqvp3$q96qg$ym(dD z@+*JW8CI5-XE{9!ExV(AaOU+(+2#xVXFg=OUG?tFWdB3bJWLEGjE)<PF|?L z_i$UXk) z!Gk3N!AI6#dUhZ$JyZPc@ppH=J@Z^q(#G`gEWiBxx8Lt%XnNmj_Wp8kveKUWQ?KU# z>z*$u{NuiGD&ODl?S~Fu-}Ldt55Bfi%fwYz4Ez2)N#C+blZ8Qq_wLjP9>!f z2{Yq)^VeoAgUH!$=F{y}Pju)??TdeZ;$gw@E7QNMczAPDP3`gC?P6cQZ_4@dXX*CS ztyxtmt2ceo|9oT7^3{UIww?<9;=fJT{I2qqkdeLDeWf{Twf(jaHnSfVE~tMcZ233$ zY2L%Nx85wc@Osz!_b;EU$uP-(RljG&Gg-dlagHqiec8X;7jM|>e|-PN{6B3|>Zb4V zUvobAL%^EM)5YwoJ(t{=JcGZ-{%qB*>?svJPxSSBxo7s~nuxtW|8#%MkG*S*i;pR< zH@#~AaQ>6McYUjiul@V2ebXcO8PhE1-S1!Y8V4x*X=;CD(Pf*_ciH6T+xPG7>*~K9 zy!I~P_O{>s_1}c~muc!Aj(s@m&i^kvpMSIeey8|!_PI){nV(CFivIt5{%twyR^Mfh zFK@4VA#1+OL-*gm4~O}uzc-hkr(rtxjO2;RPcQ9ef15b50JNvbz3kYz_&-0}8-DzL z*e-vpAn^9K+}qbmzFvzC55H_z`Rh*cdE4@`N~3hfW%hqQIP;o>pIdLF_WtvE`}&RF z59{nt-Z9DI|DPuy;`4cXc_s!;jzckZ!dGGp%bK4}`qBB%>EW}m4Y_YJmAM!_w?2`$ z|9Z;y43+3PiJhM9@|X9y<+m$peVh<|p5NJFW!2~Ji*xhS?C;yltew^$bo|(ZJ)&Vt zc0XRU?U%qx=_lGZZ_L-Qn=-*o7;#;5Kh7k)3U+*V<8_P8kr!*RoN@ph+=|F(adIOU(sf8o9j$FgR4 z^UsfJeX_9hXMJwEl>5C+5B|&9uib9eeDJ}i9n$Bn9dhI={Qfh9nIq%x Date: Wed, 30 Jan 2019 01:58:26 +0100 Subject: [PATCH 0220/1107] Minecarts: Init _railtype on placement --- mods/ENTITIES/mcl_minecarts/init.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index 33014228..5aac4f0a 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -323,6 +323,10 @@ mcl_minecarts.place_minecart = function(itemstack, pointed_thing) 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 ~= nil then + le._railtype = railtype + end local cart_dir = mcl_minecarts:get_rail_direction(railpos, {x=1, y=0, z=0}, nil, nil, railtype) cart:setyaw(minetest.dir_to_yaw(cart_dir)) From 5a1cafa5ddc72702377ed44c28977deb87e908b8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 Jan 2019 02:04:12 +0100 Subject: [PATCH 0221/1107] Minecarts: Save _railtype in staticdata --- mods/ENTITIES/mcl_minecarts/init.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index 5aac4f0a..25e2183f 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -31,6 +31,10 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) } function cart:on_activate(staticdata, dtime_s) + local data = minetest.deserialize(staticdata) + if type(data) == "table" then + self._railtype = data._railtype + end self.object:set_armor_groups({immortal=1}) end @@ -290,7 +294,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) end function cart:get_staticdata() - return "" + return minetest.serialize({_railtype = self._railtype}) end minetest.register_entity(entity_id, cart) From e42945a4e14d9d76463ba0e35b329ad89534da99 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 Jan 2019 02:41:24 +0100 Subject: [PATCH 0222/1107] Minecarts: Reset eye offset when detaching player --- mods/ENTITIES/mcl_minecarts/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index 25e2183f..2d48a28c 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -65,6 +65,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) local player = minetest.get_player_by_name(self._driver) if player then player:set_detach() + player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) end end @@ -434,8 +435,7 @@ register_minecart( self._driver = nil self._start_pos = nil clicker:set_detach() - local player = minetest.get_player_by_name(name) - player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) + clicker:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) elseif not self._driver then self._driver = player_name self._start_pos = self.object:getpos() From 1966d1858659f7c40158775dc1643e361c5dc3f4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 Jan 2019 03:16:59 +0100 Subject: [PATCH 0223/1107] Drop minecart as item if its not on a rail anymore --- mods/ENTITIES/mcl_minecarts/init.lua | 57 +++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index 2d48a28c..cdc140f3 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -1,6 +1,7 @@ mcl_minecarts = {} mcl_minecarts.modpath = minetest.get_modpath("mcl_minecarts") mcl_minecarts.speed_max = 10 +mcl_minecarts.check_float_time = 10 dofile(mcl_minecarts.modpath.."/functions.lua") dofile(mcl_minecarts.modpath.."/rails.lua") @@ -23,6 +24,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) _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 _old_dir = {x=0, y=0, z=0}, _old_pos = nil, _old_vel = {x=0, y=0, z=0}, @@ -114,6 +116,45 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) function cart:on_step(dtime) local vel = self.object:getvelocity() 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 + -- Drop minecart if it isn't on a rail anymore + if self._last_float_check >= mcl_minecarts.check_float_time then + pos = self.object:getpos() + 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 ~= nil then + -- Detach driver + if self._driver then + if self._old_pos then + self.object:setpos(self._old_pos) + end + mcl_player.player_attached[self._driver] = nil + local player = minetest.get_player_by_name(self._driver) + if player then + player:set_detach() + player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) + end + end + + -- Drop items and remove cart entity + if not minetest.settings:get_bool("creative_mode") then + for d=1, #drop do + minetest.add_item(self.object:getpos(), drop[d]) + end + end + + self.object:remove() + return + end + self._last_float_check = 0 + end + if self._punched then vel = vector.add(vel, self._velocity) self.object:setvelocity(vel) @@ -123,7 +164,9 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) end local dir, last_switch = nil, nil - local pos = self.object:getpos() + if not pos then + pos = self.object:getpos() + end if self._old_pos and not self._punched then local flo_pos = vector.floor(pos) local flo_old = vector.floor(self._old_pos) @@ -132,12 +175,16 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) -- Prevent querying the same node over and over again end - -- Update detector rails - local rou_pos = vector.round(pos) - local rou_old = vector.round(self._old_pos) - local node = minetest.get_node(rou_pos) + if not rou_pos then + rou_pos = vector.round(pos) + end + 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) From 6748576f8e65a73905734d9a9d438158ba282d21 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 Jan 2019 03:36:36 +0100 Subject: [PATCH 0224/1107] Increase minecart floating check timer --- mods/ENTITIES/mcl_minecarts/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index cdc140f3..8e9a088f 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -1,7 +1,7 @@ mcl_minecarts = {} mcl_minecarts.modpath = minetest.get_modpath("mcl_minecarts") mcl_minecarts.speed_max = 10 -mcl_minecarts.check_float_time = 10 +mcl_minecarts.check_float_time = 15 dofile(mcl_minecarts.modpath.."/functions.lua") dofile(mcl_minecarts.modpath.."/rails.lua") From d34c48cb59d0b1e7a1763bee24ffb746dc495fcd Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 Jan 2019 03:37:47 +0100 Subject: [PATCH 0225/1107] Insta-drop minecart when its rail is destroyed --- mods/ENTITIES/mcl_minecarts/rails.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mods/ENTITIES/mcl_minecarts/rails.lua b/mods/ENTITIES/mcl_minecarts/rails.lua index 05e0855c..1058ba35 100644 --- a/mods/ENTITIES/mcl_minecarts/rails.lua +++ b/mods/ENTITIES/mcl_minecarts/rails.lua @@ -21,6 +21,20 @@ local register_rail = function(itemstring, tiles, def_extras, creative) 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 From 7465d7a10758c8f6241fb35af626e3d75e727baf Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 30 Jan 2019 04:54:30 +0100 Subject: [PATCH 0226/1107] Fix stained glass not propagating sunlight --- mods/ITEMS/mcl_core/nodes_glass.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/nodes_glass.lua b/mods/ITEMS/mcl_core/nodes_glass.lua index 595d4c8d..6bd8a924 100644 --- a/mods/ITEMS/mcl_core/nodes_glass.lua +++ b/mods/ITEMS/mcl_core/nodes_glass.lua @@ -28,7 +28,7 @@ function mcl_core.add_glass(desc, recipeitem, colorgroup, color) is_ground_content = false, tiles = {"mcl_core_glass_"..color..".png"}, paramtype = "light", - sunlight_propagates = "true", + sunlight_propagates = true, use_texture_alpha = true, stack_max = 64, -- TODO: Add color to groups From a2b39ed94341895195cc4eb0dea7a2c52d72b44a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 Jan 2019 02:44:05 +0100 Subject: [PATCH 0227/1107] Mobs: Prevent jump sound spam --- mods/ENTITIES/mcl_mobs/api.lua | 9 ++++++++- mods/ENTITIES/mcl_mobs/api.txt | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 1ee20492..60b6a5ba 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -787,7 +787,10 @@ local do_jump = function(self) end, self, v) if get_velocity(self) > 0 then - mob_sound(self, self.sounds.jump) + if self.jump_sound_cooloff <= 0 then + mob_sound(self, self.sounds.jump) + self.jump_sound_cooloff = 0.5 + end end else self.facing_fence = true @@ -2698,6 +2701,7 @@ local mob_activate = function(self, staticdata, def, dtime) self.selectionbox = selbox self.visual_size = vis_size self.standing_in = "" + self.jump_sound_cooloff = 0 -- used to prevent jump sound from being played too often in short time -- check existing nametag if not self.nametag then @@ -2769,6 +2773,9 @@ local mob_step = function(self, dtime) end end + if self.jump_sound_cooloff > 0 then + self.jump_sound_cooloff = self.jump_sound_cooloff - dtime + end falling(self, pos) -- smooth rotation by ThomasMonroe314 diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 814b28ad..599ee9cf 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -137,7 +137,7 @@ functions needed for the mob to work properly which contains the following: '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. + 'jump' played when mob jumps. There's a built-in cooloff timer to avoid sound spam 'fuse' sound played when mob explode timer starts. 'explode' sound played when mob explodes. From 626f7f6e97764c9b0f88f7779b250fc3f1e098ac Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 Jan 2019 05:32:10 +0100 Subject: [PATCH 0228/1107] Delete senseless argument in minetest.remove_node --- mods/ITEMS/mcl_core/functions.lua | 32 +++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index a518bd37..58182053 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -785,31 +785,31 @@ local sapling_grow_action = function(tree_id, soil_needed, one_by_one, two_by_tw -- In a 9×9 field there are 4 possible 2×2 squares. We check them all. if s2 and s3 and s4 then -- Success: Remove saplings and place tree - minetest.remove_node(pos, {name="air"}) - minetest.remove_node(p2, {name="air"}) - minetest.remove_node(p3, {name="air"}) - minetest.remove_node(p4, {name="air"}) + minetest.remove_node(pos) + minetest.remove_node(p2) + minetest.remove_node(p3) + minetest.remove_node(p4) mcl_core.generate_tree(pos, tree_id, true) return elseif s3 and s5 and s6 then - minetest.remove_node(pos, {name="air"}) - minetest.remove_node(p3, {name="air"}) - minetest.remove_node(p5, {name="air"}) - minetest.remove_node(p6, {name="air"}) + minetest.remove_node(pos) + minetest.remove_node(p3) + minetest.remove_node(p5) + minetest.remove_node(p6) mcl_core.generate_tree(p6, tree_id, true) return elseif s6 and s7 and s8 then - minetest.remove_node(pos, {name="air"}) - minetest.remove_node(p6, {name="air"}) - minetest.remove_node(p7, {name="air"}) - minetest.remove_node(p8, {name="air"}) + minetest.remove_node(pos) + minetest.remove_node(p6) + minetest.remove_node(p7) + minetest.remove_node(p8) mcl_core.generate_tree(p7, tree_id, true) return elseif s2 and s8 and s9 then - minetest.remove_node(pos, {name="air"}) - minetest.remove_node(p2, {name="air"}) - minetest.remove_node(p8, {name="air"}) - minetest.remove_node(p9, {name="air"}) + minetest.remove_node(pos) + minetest.remove_node(p2) + minetest.remove_node(p8) + minetest.remove_node(p9) mcl_core.generate_tree(p8, tree_id, true) return end From e1e7d5215ed2c4baa088f3626f6b0a41becc8220 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 Jan 2019 06:31:04 +0100 Subject: [PATCH 0229/1107] Add more mob sound cooloffs --- mods/ENTITIES/mcl_mobs/api.lua | 20 ++++++++++++++------ mods/ENTITIES/mcl_mobs/api.txt | 4 +++- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 60b6a5ba..562184d1 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -98,14 +98,18 @@ local mod_tnt = minetest.get_modpath("mcl_tnt") ~= nil local mod_mobspawners = minetest.get_modpath("mcl_mobspawners") ~= nil -- play sound -local mob_sound = function(self, sound) +local mob_sound = function(self, sound, is_opinion) if sound then + if is_opinion and self.opinion_sound_cooloff > 0 then + return + end minetest.sound_play(sound, { object = self.object, gain = 1.0, max_hear_distance = self.sounds.distance }) + self.opinion_sound_cooloff = 1 end end @@ -121,7 +125,7 @@ local do_attack = function(self, player) self.state = "attack" if random(0, 100) < 90 then - mob_sound(self, self.sounds.war_cry) + mob_sound(self, self.sounds.war_cry, true) end end @@ -1291,10 +1295,10 @@ local smart_mobs = function(self, s, p, dist, dtime) self.path.stuck_timer = stuck_timeout - 2 -- frustration! cant find the damn path :( - mob_sound(self, self.sounds.random) + mob_sound(self, self.sounds.random, true) else -- yay i found path - mob_sound(self, self.sounds.war_cry) + mob_sound(self, self.sounds.war_cry, true) set_velocity(self, self.walk_velocity) -- follow path now that it has it @@ -2702,6 +2706,7 @@ local mob_activate = function(self, staticdata, def, dtime) self.visual_size = vis_size self.standing_in = "" 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 -- check existing nametag if not self.nametag then @@ -2776,6 +2781,9 @@ local mob_step = function(self, dtime) 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 falling(self, pos) -- smooth rotation by ThomasMonroe314 @@ -2854,7 +2862,7 @@ local mob_step = function(self, dtime) -- mob plays random sound at times if random(1, 100) == 1 then - mob_sound(self, self.sounds.random) + mob_sound(self, self.sounds.random, true) end -- environmental damage timer (every 1 second) @@ -3662,7 +3670,7 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) end -- make sound when fed so many times - mob_sound(self, self.sounds.random) + mob_sound(self, self.sounds.random, true) end return true diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 599ee9cf..fdc798d8 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -131,7 +131,9 @@ functions needed for the mob to work properly which contains the following: '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. - 'random' random sound that plays during gameplay. + 'random' played randomly from time to time. + also played when mob is frustrated for not finding the path. + also played for overfeeding animal. 'war_cry' what you hear when mob starts to attack player. 'attack' what you hear when being attacked. 'shoot_attack' sound played when mob shoots. From c9fb060ea0a678d66f238ab8195ccd145b759b8d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 Jan 2019 06:56:03 +0100 Subject: [PATCH 0230/1107] Tweak zombie growl sound occurence --- mods/ENTITIES/mobs_mc/horse.lua | 3 +-- mods/ENTITIES/mobs_mc/villager_zombie.lua | 4 ++-- mods/ENTITIES/mobs_mc/zombie.lua | 3 +-- mods/ENTITIES/mobs_mc/zombiepig.lua | 4 ++-- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 4b8cb90a..45ff5ee8 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -352,8 +352,7 @@ zombie_horse.drops = { max = 2,}, } zombie_horse.sounds = { - random = "mobs_mc_zombie_idle", - war_cry = "mobs_mc_zombie_idle", + random = "mobs_mc_zombie_growl", death = "mobs_mc_zombie_death", damage = "mobs_mc_zombie_hurt", distance = 16, diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mobs_mc/villager_zombie.lua index 4abb6b6e..f340c043 100644 --- a/mods/ENTITIES/mobs_mc/villager_zombie.lua +++ b/mods/ENTITIES/mobs_mc/villager_zombie.lua @@ -57,8 +57,8 @@ mobs:register_mob("mobs_mc:villager_zombie", { max = 1,}, }, sounds = { - random = "mobs_mc_zombie_idle", - war_cry = "mobs_mc_zombie_idle", + random = "mobs_mc_zombie_growl", + war_cry = "mobs_mc_zombie_growl", death = "mobs_mc_zombie_death", damage = "mobs_mc_zombie_hurt", distance = 16, diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index 0eb33f58..72c76b32 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -58,8 +58,7 @@ local zombie = { makes_footstep_sound = true, sounds = { random = "mobs_mc_zombie_growl", - --TODO: war_cry = "mobs_mc_zombie_growl", - -- Problem: The war_cry sound plays too often + war_cry = "mobs_mc_zombie_growl", death = "mobs_mc_zombie_death", damage = "mobs_mc_zombie_hurt", distance = 16, diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mobs_mc/zombiepig.lua index a21f1873..d85c2ceb 100644 --- a/mods/ENTITIES/mobs_mc/zombiepig.lua +++ b/mods/ENTITIES/mobs_mc/zombiepig.lua @@ -34,8 +34,8 @@ local pigman = { } }, visual_size = {x=3, y=3}, sounds = { - random = "mobs_mc_zombie_idle", - war_cry = "mobs_mc_zombie_idle", + random = "mobs_mc_zombie_growl", + war_cry = "mobs_mc_zombie_growl", death = "mobs_mc_zombie_death", damage = "mobs_mc_zombie_hurt", distance = 16, From 139b1000ffd6d739e765f4cba5bd4d9d474b79e7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 Jan 2019 07:23:35 +0100 Subject: [PATCH 0231/1107] Implement mob suffocation --- mods/ENTITIES/mcl_mobs/api.lua | 23 ++++++++++++++--------- mods/ENTITIES/mcl_mobs/api.txt | 2 +- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 562184d1..0d7cc4e1 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -699,19 +699,24 @@ local do_env_damage = function(self) if check_for_death(self, "dps", {type = "environment", pos = pos, node = self.standing_in}) then return end end ---[[ - --- suffocation inside solid node - if self.suffocation ~= 0 - and nodef.walkable == true - and nodef.groups.disable_suffocation ~= 1 - and nodef.drawtype == "normal" then - self.health = self.health - self.suffocation + --- 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 + + -- 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 end end -]] + check_for_death(self, "", {type = "unknown"}) end @@ -2995,7 +3000,7 @@ minetest.register_entity(name, { sunlight_damage = def.sunlight_damage or 0, water_damage = def.water_damage or 0, lava_damage = def.lava_damage or 0, - suffocation = def.suffocation or 2, + suffocation = def.suffocation or true, fall_damage = def.fall_damage or 1, fall_speed = def.fall_speed or -10, -- must be lower than -2 (default: -10) drops = def.drops or {}, diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index fdc798d8..aa9dc5e1 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -61,7 +61,7 @@ functions needed for the mob to work properly which contains the following: in lava or fire. '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. + '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 From 27823dbbb3c26ae69cb242f2389607f4d919c6c2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 Jan 2019 07:45:42 +0100 Subject: [PATCH 0232/1107] Remove frustration mob sound --- mods/ENTITIES/mcl_mobs/api.lua | 3 --- mods/ENTITIES/mcl_mobs/api.txt | 1 - 2 files changed, 4 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 0d7cc4e1..bd3d1984 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -1298,9 +1298,6 @@ local smart_mobs = function(self, s, p, dist, dtime) -- will try again in 2 second self.path.stuck_timer = stuck_timeout - 2 - - -- frustration! cant find the damn path :( - mob_sound(self, self.sounds.random, true) else -- yay i found path mob_sound(self, self.sounds.war_cry, true) diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index aa9dc5e1..b00d1a71 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -132,7 +132,6 @@ functions needed for the mob to work properly which contains the following: 'sounds' this is a table with sounds of the mob 'distance' maximum distance sounds can be heard, default is 10. 'random' played randomly from time to time. - also played when mob is frustrated for not finding the path. also played for overfeeding animal. 'war_cry' what you hear when mob starts to attack player. 'attack' what you hear when being attacked. From 0a803400fe3ee0f8f63f82e371ba525d525f86da Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 Jan 2019 07:57:03 +0100 Subject: [PATCH 0233/1107] Mobs: Disable war_cry sound for now --- mods/ENTITIES/mcl_mobs/api.lua | 10 ++++++---- mods/ENTITIES/mcl_mobs/api.txt | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index bd3d1984..2ec6657f 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -124,9 +124,10 @@ local do_attack = function(self, player) self.attack = player self.state = "attack" - if random(0, 100) < 90 then - mob_sound(self, self.sounds.war_cry, true) - end + -- TODO: Implement war_cry sound without being annoying + --if random(0, 100) < 90 then + --mob_sound(self, self.sounds.war_cry, true) + --end end @@ -1300,7 +1301,8 @@ local smart_mobs = function(self, s, p, dist, dtime) self.path.stuck_timer = stuck_timeout - 2 else -- yay i found path - mob_sound(self, self.sounds.war_cry, true) + -- TODO: Implement war_cry sound without being annoying + --mob_sound(self, self.sounds.war_cry, true) set_velocity(self, self.walk_velocity) -- follow path now that it has it diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index b00d1a71..2c0db0ef 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -133,7 +133,7 @@ functions needed for the mob to work properly which contains the following: 'distance' maximum distance sounds can be heard, default is 10. 'random' played randomly from time to time. also played for overfeeding animal. - 'war_cry' what you hear when mob starts to attack player. + '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. From 8ff69dda0c5480082abaa6e4291f5f91582e6e98 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 Jan 2019 22:00:43 +0100 Subject: [PATCH 0234/1107] Despawn animals, too --- mods/ENTITIES/mcl_mobs/api.lua | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 2ec6657f..7ff966e2 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -2558,6 +2558,7 @@ local mob_staticdata = function(self) 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())) self.object:remove() return ""-- nil @@ -2776,6 +2777,7 @@ local mob_step = function(self, dtime) end end + minetest.log("action", "Mob "..name.." despawns in mob_step at "..minetest.pos_to_string(pos)) self.object:remove() return @@ -2960,11 +2962,7 @@ local can_despawn if def.can_despawn ~= nil then can_despawn = def.can_despawn else - if def.type == "monster" then - can_despawn = true - else - can_despawn = false - end + can_despawn = true end minetest.register_entity(name, { @@ -3223,6 +3221,7 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, if objs[n]:is_player() then -- player too close + minetest.log("info", "Mob spawn of ".. name .. " failed, player too close") return end end From e64518dd24d23f32e87feaa8bdd58d8f232dd351 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Feb 2019 01:21:08 +0100 Subject: [PATCH 0235/1107] Fix crash when creating Nether portal --- mods/ITEMS/mcl_portals/portal_nether.lua | 32 ++++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index 0ed0ddcb..eb4803e3 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -374,22 +374,22 @@ minetest.register_abm({ interval = 1, chance = 2, action = function(pos, node) - minetest.add_particlespawner( - 32, --amount - 4, --time - {x = pos.x - 0.25, y = pos.y - 0.25, z = pos.z - 0.25}, --minpos - {x = pos.x + 0.25, y = pos.y + 0.25, z = pos.z + 0.25}, --maxpos - {x = -0.8, y = -0.8, z = -0.8}, --minvel - {x = 0.8, y = 0.8, z = 0.8}, --maxvel - {x = 0, y = 0, z = 0}, --minacc - {x = 0, y = 0, z = 0}, --maxacc - 0.5, --minexptime - 1, --maxexptime - 1, --minsize - 2, --maxsize - false, --collisiondetection - "mcl_particles_teleport.png" --texture - ) + minetest.add_particlespawner({ + amount = 32, + time = 4, + minpos = {x = pos.x - 0.25, y = pos.y - 0.25, z = pos.z - 0.25}, + maxpos = {x = pos.x + 0.25, y = pos.y + 0.25, z = pos.z + 0.25}, + minvel = {x = -0.8, y = -0.8, z = -0.8}, + maxvel = {x = 0.8, y = 0.8, z = 0.8}, + minacc = {x = 0, y = 0, z = 0}, + maxacc = {x = 0, y = 0, z = 0}, + minexptime = 0.5, + maxexptime = 1, + minsize = 1, + maxsize = 2, + collisiondetection = false, + texture = "mcl_particles_teleport.png", + }) for _,obj in ipairs(minetest.get_objects_inside_radius(pos,1)) do --maikerumine added for objects to travel local lua_entity = obj:get_luaentity() --maikerumine added for objects to travel if obj:is_player() or lua_entity then From 1f1361d179decb62395fa6638faf58dcf16ed4b8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Feb 2019 06:23:12 +0100 Subject: [PATCH 0236/1107] Add paramtype="light" to lava ... --- mods/ITEMS/mcl_core/nodes_liquid.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ITEMS/mcl_core/nodes_liquid.lua b/mods/ITEMS/mcl_core/nodes_liquid.lua index 4efea58d..40de3aeb 100644 --- a/mods/ITEMS/mcl_core/nodes_liquid.lua +++ b/mods/ITEMS/mcl_core/nodes_liquid.lua @@ -106,6 +106,7 @@ minetest.register_node("mcl_core:lava_flowing", { animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=6.6} }, }, + paramtype = "light", paramtype2 = "flowingliquid", -- Real light level: 15 (but Minetest caps at 14) light_source = 14, @@ -156,6 +157,7 @@ Lava interacts with water various ways: } }, -- Real light level: 15 (but Minetest caps at 14) + paramtype = "light", light_source = 14, sounds = mcl_sounds.node_sound_lava_defaults(), walkable = false, From e789801662cda97713c6c8bd571fe5f5d30d49b6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Feb 2019 06:33:07 +0100 Subject: [PATCH 0237/1107] Replace getpos() with get_pos() --- mods/CORE/walkover/init.lua | 2 +- mods/ENTITIES/drippingwater/init.lua | 4 ++-- mods/ENTITIES/mcl_boats/init.lua | 16 ++++++++-------- mods/ENTITIES/mcl_item_entity/init.lua | 12 ++++++------ mods/ENTITIES/mcl_minecarts/init.lua | 12 ++++++------ mods/ENTITIES/mcl_mobs/api.txt | 2 +- mods/ENTITIES/mobs_mc/2_throwing.lua | 8 ++++---- mods/ENTITIES/mobs_mc/3_shared.lua | 4 ++-- mods/ENTITIES/mobs_mc/chicken.lua | 2 +- mods/ENTITIES/mobs_mc/cow+mooshroom.lua | 8 ++++---- mods/ENTITIES/mobs_mc/creeper.lua | 6 +++--- mods/ENTITIES/mobs_mc/ender_dragon.lua | 6 +++--- mods/ENTITIES/mobs_mc/enderman.lua | 6 +++--- mods/ENTITIES/mobs_mc/ocelot.lua | 2 +- mods/ENTITIES/mobs_mc/pig.lua | 2 +- mods/ENTITIES/mobs_mc/sheep.lua | 2 +- mods/ENTITIES/mobs_mc/snowman.lua | 4 ++-- mods/ENTITIES/mobs_mc/villager_evoker.lua | 2 +- mods/ENTITIES/mobs_mc/wither.lua | 2 +- mods/ENTITIES/mobs_mc/wolf.lua | 2 +- mods/ENVIRONMENT/lightning/init.lua | 2 +- mods/ENVIRONMENT/mcl_weather/rain.lua | 2 +- mods/ENVIRONMENT/mcl_weather/skycolor.lua | 2 +- mods/ENVIRONMENT/mcl_weather/snow.lua | 4 ++-- mods/ENVIRONMENT/mcl_weather/weather_core.lua | 2 +- mods/HUD/mcl_death_messages/init.lua | 2 +- mods/HUD/mcl_inventory/init.lua | 2 +- .../REDSTONE/mesecons_commandblock/init.lua | 2 +- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 2 +- .../REDSTONE/mesecons_pressureplates/init.lua | 2 +- mods/ITEMS/mcl_banners/init.lua | 2 +- mods/ITEMS/mcl_beds/functions.lua | 2 +- mods/ITEMS/mcl_bows/arrow.lua | 4 ++-- mods/ITEMS/mcl_bows/bow.lua | 2 +- mods/ITEMS/mcl_buckets/init.lua | 4 ++-- mods/ITEMS/mcl_clock/init.lua | 2 +- mods/ITEMS/mcl_compass/init.lua | 2 +- mods/ITEMS/mcl_doors/api_trapdoors.lua | 2 +- mods/ITEMS/mcl_end/building.lua | 2 +- mods/ITEMS/mcl_fire/flint_and_steel.lua | 2 +- mods/ITEMS/mcl_fire/init.lua | 2 +- mods/ITEMS/mcl_hoppers/init.lua | 2 +- mods/ITEMS/mcl_maps/init.lua | 2 +- mods/ITEMS/mcl_mobspawners/init.lua | 2 +- mods/ITEMS/mcl_portals/portal_end.lua | 2 +- mods/ITEMS/mcl_portals/portal_nether.lua | 2 +- mods/ITEMS/mcl_potions/init.lua | 2 +- mods/ITEMS/mcl_signs/init.lua | 4 ++-- mods/ITEMS/mcl_stairs/api.lua | 4 ++-- mods/ITEMS/mcl_throwing/init.lua | 8 ++++---- mods/ITEMS/mcl_tnt/init.lua | 6 +++--- mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua | 4 ++-- .../minetest-3d_armor/3d_armor_stand/init.lua | 4 ++-- mods/MAPGEN/mcl_structures/init.lua | 2 +- mods/PLAYER/mcl_hunger/hunger.lua | 2 +- mods/PLAYER/mcl_playerinfo/init.lua | 2 +- mods/PLAYER/mcl_playerplus/init.lua | 6 +++--- mods/PLAYER/mcl_sprint/init.lua | 4 ++-- 58 files changed, 105 insertions(+), 105 deletions(-) diff --git a/mods/CORE/walkover/init.lua b/mods/CORE/walkover/init.lua index 2d170cb6..1e2749ff 100644 --- a/mods/CORE/walkover/init.lua +++ b/mods/CORE/walkover/init.lua @@ -4,7 +4,7 @@ minetest.register_globalstep(function(dtime) timer = timer + dtime; if timer >= 0.3 then for _,player in pairs(minetest.get_connected_players()) do - local pp = player:getpos() + local pp = player:get_pos() pp.y = math.ceil(pp.y) local loc = vector.add(pp, {x=0,y=-1,z=0}) if loc ~= nil then diff --git a/mods/ENTITIES/drippingwater/init.lua b/mods/ENTITIES/drippingwater/init.lua index 8e3ef4c1..5cd74cd5 100644 --- a/mods/ENTITIES/drippingwater/init.lua +++ b/mods/ENTITIES/drippingwater/init.lua @@ -25,7 +25,7 @@ minetest.register_entity("drippingwater:drop_water", { on_step = function(self, dtime) local k = math.random(1,222) - local ownpos = self.object:getpos() + local ownpos = self.object:get_pos() if k==1 then self.object:setacceleration({x=0, y=-5, z=0}) @@ -63,7 +63,7 @@ minetest.register_entity("drippingwater:drop_lava", { on_step = function(self, dtime) local k = math.random(1,222) - local ownpos = self.object:getpos() + local ownpos = self.object:get_pos() if k==1 then self.object:setacceleration({x=0, y=-5, z=0}) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index 01457c4b..c347efb0 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -67,7 +67,7 @@ function boat.on_rightclick(self, clicker) clicker:set_properties({visual_size = {x=1, y=1}}) mcl_player.player_attached[name] = false mcl_player.player_set_animation(clicker, "stand" , 30) - local pos = clicker:getpos() + local pos = clicker:get_pos() pos = {x = pos.x, y = pos.y + 0.2, z = pos.z} clicker:setpos(pos) elseif not self._driver then @@ -131,7 +131,7 @@ function boat.on_punch(self, puncher) self._removed = true -- Drop boat as item on the ground after punching if not minetest.settings:get_bool("creative_mode") then - minetest.add_item(self.object:getpos(), self._itemstring) + minetest.add_item(self.object:get_pos(), self._itemstring) end self.object:remove() end @@ -189,7 +189,7 @@ function boat.on_step(self, dtime) end local velo = self.object:getvelocity() if self._v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then - self.object:setpos(self.object:getpos()) + self.object:setpos(self.object:get_pos()) return end local s = get_sign(self._v) @@ -203,7 +203,7 @@ function boat.on_step(self, dtime) self._v = 5 * get_sign(self._v) end - local p = self.object:getpos() + local p = self.object:get_pos() p.y = p.y - boat_y_offset local new_velo local new_acce = {x = 0, y = 0, z = 0} @@ -217,7 +217,7 @@ function boat.on_step(self, dtime) end new_velo = get_velocity(self._v, self.object:getyaw(), self.object:getvelocity().y) - self.object:setpos(self.object:getpos()) + self.object:setpos(self.object:get_pos()) else p.y = p.y + 1 if is_water(p) then @@ -230,18 +230,18 @@ function boat.on_step(self, dtime) new_acce = {x = 0, y = 5, z = 0} end new_velo = get_velocity(self._v, self.object:getyaw(), y) - self.object:setpos(self.object:getpos()) + self.object:setpos(self.object:get_pos()) else new_acce = {x = 0, y = 0, z = 0} if math.abs(self.object:getvelocity().y) < 1 then - local pos = self.object:getpos() + local pos = self.object:get_pos() pos.y = math.floor(pos.y) + boat_y_offset self.object:setpos(pos) new_velo = get_velocity(self._v, self.object:getyaw(), 0) else new_velo = get_velocity(self._v, self.object:getyaw(), self.object:getvelocity().y) - self.object:setpos(self.object:getpos()) + self.object:setpos(self.object:get_pos()) end end end diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index fa587bf2..63bb07b6 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -55,7 +55,7 @@ end minetest.register_globalstep(function(dtime) for _,player in ipairs(minetest.get_connected_players()) do if player:get_hp() > 0 or not minetest.settings:get_bool("enable_damage") then - local pos = player:getpos() + local pos = player:get_pos() local inv = player:get_inventory() local checkpos = {x=pos.x,y=pos.y + item_drop_settings.player_collect_height,z=pos.z} @@ -67,7 +67,7 @@ minetest.register_globalstep(function(dtime) 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 vector.distance(checkpos, object:getpos()) <= item_drop_settings.radius_collect and not object:get_luaentity()._removed then + if vector.distance(checkpos, object:get_pos()) <= item_drop_settings.radius_collect and 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)) @@ -95,7 +95,7 @@ minetest.register_globalstep(function(dtime) -- Move object to player disable_physics(object, object:get_luaentity()) - local opos = object:getpos() + local opos = object:get_pos() local vec = vector.subtract(checkpos, opos) vec = vector.add(opos, vector.divide(vec, 2)) object:moveto(vec) @@ -503,12 +503,12 @@ core.register_entity(":__builtin:item", { -- 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:getpos()).. "! Deleting it now.") + 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() end - local p = self.object:getpos() + local p = self.object:get_pos() local node = core.get_node_or_nil(p) local in_unloaded = (node == nil) @@ -530,7 +530,7 @@ core.register_entity(":__builtin:item", { if (def and def.groups and (def.groups.lava or def.groups.destroys_items == 1)) then -- Special effect for lava if def.groups.lava then - minetest.sound_play("builtin_item_lava", {pos = self.object:getpos(), gain = 0.5}) + minetest.sound_play("builtin_item_lava", {pos = self.object:get_pos(), gain = 0.5}) end self._removed = true self.object:remove() diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index 8e9a088f..e5afcedf 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -41,7 +41,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) end function cart:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) - local pos = self.object:getpos() + 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") @@ -83,7 +83,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) -- Drop items and remove cart entity if not minetest.settings:get_bool("creative_mode") then for d=1, #drop do - minetest.add_item(self.object:getpos(), drop[d]) + minetest.add_item(self.object:get_pos(), drop[d]) end end @@ -124,7 +124,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) local pos, rou_pos, node -- Drop minecart if it isn't on a rail anymore if self._last_float_check >= mcl_minecarts.check_float_time then - pos = self.object:getpos() + 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") @@ -145,7 +145,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) -- Drop items and remove cart entity if not minetest.settings:get_bool("creative_mode") then for d=1, #drop do - minetest.add_item(self.object:getpos(), drop[d]) + minetest.add_item(self.object:get_pos(), drop[d]) end end @@ -165,7 +165,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) local dir, last_switch = nil, nil if not pos then - pos = self.object:getpos() + pos = self.object:get_pos() end if self._old_pos and not self._punched then local flo_pos = vector.floor(pos) @@ -485,7 +485,7 @@ register_minecart( clicker:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) elseif not self._driver then self._driver = player_name - self._start_pos = self.object:getpos() + self._start_pos = self.object:get_pos() mcl_player.player_attached[player_name] = true clicker:set_attach(self.object, "", {x=0, y=8.25, z=-2}, {x=0, y=0, z=0}) mcl_player.player_attached[name] = true diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 2c0db0ef..9e30ca5c 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -710,7 +710,7 @@ mobs:register_mob("mob_horse:horse", { if inv:room_for_item("main", "mobs:saddle") then inv:add_item("main", "mobs:saddle") else - minetest.add_item(clicker.getpos(), "mobs:saddle") + minetest.add_item(clicker.get_pos(), "mobs:saddle") end -- attach player to horse diff --git a/mods/ENTITIES/mobs_mc/2_throwing.lua b/mods/ENTITIES/mobs_mc/2_throwing.lua index 09595803..810c63f2 100644 --- a/mods/ENTITIES/mobs_mc/2_throwing.lua +++ b/mods/ENTITIES/mobs_mc/2_throwing.lua @@ -52,7 +52,7 @@ local THROWING_ARROW_ENTITY={ --ARROW CODE THROWING_ARROW_ENTITY.on_step = function(self, dtime) self.timer=self.timer+dtime - local pos = self.object:getpos() + local pos = self.object:get_pos() local node = minetest.get_node(pos) minetest.add_particle({ @@ -113,7 +113,7 @@ local throwing_shoot_arrow = function(itemstack, player) if not minetest.settings:get_bool("creative_mode") then player:get_inventory():remove_item("main", arrow[1]) end - local playerpos = player:getpos() + local playerpos = player:get_pos() local obj = minetest.add_entity({x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, arrow[2]) --mc local dir = player:get_look_dir() obj:setvelocity({x=dir.x*22, y=dir.y*22, z=dir.z*22}) @@ -247,7 +247,7 @@ if c("egg") then -- shoot egg local mobs_shoot_egg = function (item, player, pointed_thing) - local playerpos = player:getpos() + local playerpos = player:get_pos() minetest.sound_play("default_place_node_hard", { pos = playerpos, @@ -337,7 +337,7 @@ if c("snowball") then -- shoot snowball local mobs_shoot_snowball = function (item, player, pointed_thing) - local playerpos = player:getpos() + local playerpos = player:get_pos() local obj = minetest.add_entity({ x = playerpos.x, diff --git a/mods/ENTITIES/mobs_mc/3_shared.lua b/mods/ENTITIES/mobs_mc/3_shared.lua index 84a43dfe..41103359 100644 --- a/mods/ENTITIES/mobs_mc/3_shared.lua +++ b/mods/ENTITIES/mobs_mc/3_shared.lua @@ -32,13 +32,13 @@ mobs_mc.make_owner_teleport_function = function(dist, teleport_check_interval) self._teleport_timer = self._teleport_timer - dtime if self._teleport_timer <= 0 then self._teleport_timer = teleport_check_interval - local mob_pos = self.object:getpos() + 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:getpos() + 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 diff --git a/mods/ENTITIES/mobs_mc/chicken.lua b/mods/ENTITIES/mobs_mc/chicken.lua index a29311b6..0c3d0510 100644 --- a/mods/ENTITIES/mobs_mc/chicken.lua +++ b/mods/ENTITIES/mobs_mc/chicken.lua @@ -80,7 +80,7 @@ mobs:register_mob("mobs_mc:chicken", { return end - local pos = self.object:getpos() + local pos = self.object:get_pos() minetest.add_item(pos, mobs_mc.items.egg) diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua index 6dbae97e..bf1f9c1d 100644 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua @@ -61,7 +61,7 @@ local cow_def = { if inv:room_for_item("main", {name=mobs_mc.items.milk}) then clicker:get_inventory():add_item("main", mobs_mc.items.milk) else - local pos = self.object:getpos() + local pos = self.object:get_pos() pos.y = pos.y + 0.5 minetest.add_item(pos, {name = mobs_mc.items.milk}) end @@ -91,7 +91,7 @@ mooshroom_def.on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() -- Use shears to get mushrooms and turn mooshroom into cow if item:get_name() == mobs_mc.items.shears then - local pos = self.object:getpos() + local pos = self.object:get_pos() minetest.sound_play("shears", {pos = pos}) minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, mobs_mc.items.mushroom_red .. " 5") @@ -112,7 +112,7 @@ mooshroom_def.on_rightclick = function(self, clicker) if inv:room_for_item("main", {name=mobs_mc.items.milk}) then clicker:get_inventory():add_item("main", mobs_mc.items.milk) else - local pos = self.object:getpos() + local pos = self.object:get_pos() pos.y = pos.y + 0.5 minetest.add_item(pos, {name = mobs_mc.items.milk}) end @@ -124,7 +124,7 @@ mooshroom_def.on_rightclick = function(self, clicker) if inv:room_for_item("main", {name=mobs_mc.items.mushroom_stew}) then clicker:get_inventory():add_item("main", mobs_mc.items.mushroom_stew) else - local pos = self.object:getpos() + local pos = self.object:get_pos() pos.y = pos.y + 0.5 minetest.add_item(pos, {name = mobs_mc.items.mushroom_stew}) end diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index ee105662..77fd06ac 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -62,19 +62,19 @@ mobs:register_mob("mobs_mc:creeper", { 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:getpos(), gain = 0.5}) + minetest.sound_play(wdef.sound.breaks, {pos = clicker:get_pos(), gain = 0.5}) end clicker:set_wielded_item(item) end self._forced_explosion_countdown_timer = self.explosion_timer - minetest.sound_play(self.sounds.attack, {pos = self.object:getpos(), gain = 1, max_hear_distance = 16}) + minetest.sound_play(self.sounds.attack, {pos = self.object:get_pos(), gain = 1, max_hear_distance = 16}) 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 - mobs:explosion(self.object:getpos(), self.explosion_radius, 0, 1, self.sounds.explode) + mobs:explosion(self.object:get_pos(), self.explosion_radius, 0, 1, self.sounds.explode) self.object:remove() end end diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index c6e99f47..1492fde5 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -110,7 +110,7 @@ mobs:register_arrow("mobs_mc:roar_of_the_dragon2", { on_step = function(self, dtime) - local pos = self.object:getpos() + local pos = self.object:get_pos() local n = minetest.get_node(pos).name @@ -158,7 +158,7 @@ mobs:register_arrow(":mobs_mc:fireball2", { -- direct hit, no fire... just plenty of pain hit_player = function(self, player) - minetest.sound_play("tnt_explode", {pos = player:getpos(), gain = 1.5, max_hear_distance = 2*64}) + minetest.sound_play("tnt_explode", {pos = player:get_pos(), gain = 1.5, max_hear_distance = 2*64}) player:punch(self.object, 1.0, { full_punch_interval = 0.5, damage_groups = {fleshy = 6}, @@ -167,7 +167,7 @@ mobs:register_arrow(":mobs_mc:fireball2", { end, hit_mob = function(self, mob) - minetest.sound_play("tnt_explode", {pos = mob:getpos(), gain = 1.5, max_hear_distance = 2*64}) + minetest.sound_play("tnt_explode", {pos = mob:get_pos(), gain = 1.5, max_hear_distance = 2*64}) mob:punch(self.object, 1.0, { full_punch_interval = 0.5, damage_groups = {fleshy = 12}, diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua index 49e3c9a8..06998175 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mobs_mc/enderman.lua @@ -217,7 +217,7 @@ mobs:register_mob("mobs_mc:enderman", { -- 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:getpos() + local pos = self.object:get_pos() local takable_nodes = minetest.find_nodes_in_area({x=pos.x-2, y=pos.y-1, z=pos.z-2}, {x=pos.x+2, y=pos.y+1, z=pos.z+2}, mobs_mc.enderman_takable) if #takable_nodes >= 1 then local r = pr:next(1, #takable_nodes) @@ -268,7 +268,7 @@ mobs:register_mob("mobs_mc:enderman", { -- 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:getpos() + 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)))) @@ -291,7 +291,7 @@ mobs:register_mob("mobs_mc:enderman", { -- TODO: Teleport enderman on damage, etc. _do_teleport = function(self) -- Attempt to randomly teleport enderman - local pos = self.object:getpos() + local pos = self.object:get_pos() -- Find all solid nodes below air in a 65×65×65 cuboid centered on the enderman local nodes = minetest.find_nodes_in_area_under_air(vector.subtract(pos, 32), vector.add(pos, 32), {"group:solid", "group:cracky", "group:crumbly"}) local telepos diff --git a/mods/ENTITIES/mobs_mc/ocelot.lua b/mods/ENTITIES/mobs_mc/ocelot.lua index 17461127..58a7d94f 100644 --- a/mods/ENTITIES/mobs_mc/ocelot.lua +++ b/mods/ENTITIES/mobs_mc/ocelot.lua @@ -85,7 +85,7 @@ local ocelot = { -- 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:getpos(), "mobs_mc:cat") + 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() diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index d5228a2b..cb6bf6a1 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -153,7 +153,7 @@ mobs:register_mob("mobs_mc:pig", { -- 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:getpos(), max_hear_distance = 8, gain = 0.5}) + minetest.sound_play(def.sounds.breaks, {pos = clicker:get_pos(), max_hear_distance = 8, gain = 0.5}) end wielditem = {name = mobs_mc.items.fishing_rod, count = 1} else diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index 331d80c2..9ddf9e03 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -156,7 +156,7 @@ mobs:register_mob("mobs_mc:sheep", { if item:get_name() == mobs_mc.items.shears and not self.gotten and not self.child then self.gotten = true - local pos = self.object:getpos() + local pos = self.object:get_pos() minetest.sound_play("shears", {pos = pos}) pos.y = pos.y + 0.5 if not self.color then diff --git a/mods/ENTITIES/mobs_mc/snowman.lua b/mods/ENTITIES/mobs_mc/snowman.lua index c5e56045..1c1ad686 100644 --- a/mods/ENTITIES/mobs_mc/snowman.lua +++ b/mods/ENTITIES/mobs_mc/snowman.lua @@ -85,7 +85,7 @@ mobs:register_mob("mobs_mc:snowman", { self._snowtimer = self._snowtimer + dtime if self.health > 0 and self._snowtimer > snow_trail_frequency then self._snowtimer = 0 - local pos = self.object:getpos() + 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 @@ -110,7 +110,7 @@ mobs:register_mob("mobs_mc:snowman", { textures = gotten_texture, }) - local pos = self.object:getpos() + local pos = self.object:get_pos() minetest.sound_play("shears", {pos = pos}) -- Wear out diff --git a/mods/ENTITIES/mobs_mc/villager_evoker.lua b/mods/ENTITIES/mobs_mc/villager_evoker.lua index 9c96e7ee..6d9fc87a 100644 --- a/mods/ENTITIES/mobs_mc/villager_evoker.lua +++ b/mods/ENTITIES/mobs_mc/villager_evoker.lua @@ -38,7 +38,7 @@ mobs:register_mob("mobs_mc:evoker", { -- Summon vexes custom_attack = function(self, to_attack) local r = pr:next(2,4) - local basepos = self.object:getpos() + 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))) diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 4c85390e..a52fbdf6 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -84,7 +84,7 @@ mobs:register_arrow("mobs_mc:roar_of_the_dragon", { on_step = function(self, dtime) - local pos = self.object:getpos() + local pos = self.object:get_pos() local n = minetest.get_node(pos).name diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua index 1884b6de..fc73e834 100644 --- a/mods/ENTITIES/mobs_mc/wolf.lua +++ b/mods/ENTITIES/mobs_mc/wolf.lua @@ -65,7 +65,7 @@ local wolf = { -- 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:getpos(), "mobs_mc:dog") + 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() diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index 625934fb..dfcfe014 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -54,7 +54,7 @@ local function choose_pos(pos) local r = rng:next(1, playercount) local randomplayer = playerlist[r] - pos = randomplayer:getpos() + pos = randomplayer:get_pos() -- avoid striking underground if pos.y < -20 then diff --git a/mods/ENVIRONMENT/mcl_weather/rain.lua b/mods/ENVIRONMENT/mcl_weather/rain.lua index 9b41b7b6..8a4cff08 100644 --- a/mods/ENVIRONMENT/mcl_weather/rain.lua +++ b/mods/ENVIRONMENT/mcl_weather/rain.lua @@ -178,7 +178,7 @@ mcl_weather.rain.make_weather = function() end for _, player in ipairs(minetest.get_connected_players()) do - if (mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:getpos())) then + if (mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:get_pos())) then mcl_weather.rain.remove_sound(player) return false end diff --git a/mods/ENVIRONMENT/mcl_weather/skycolor.lua b/mods/ENVIRONMENT/mcl_weather/skycolor.lua index ab8ab5a6..180a3f87 100644 --- a/mods/ENVIRONMENT/mcl_weather/skycolor.lua +++ b/mods/ENVIRONMENT/mcl_weather/skycolor.lua @@ -140,7 +140,7 @@ mcl_weather.skycolor = { local players = mcl_weather.skycolor.utils.get_players(nil) for _, player in ipairs(players) do - local pos = player:getpos() + local pos = player:get_pos() local dim = mcl_worlds.pos_to_dimension(pos) if dim == "overworld" then player:set_sky(color, "plain", nil, true) diff --git a/mods/ENVIRONMENT/mcl_weather/snow.lua b/mods/ENVIRONMENT/mcl_weather/snow.lua index ee98c200..c1812a1b 100644 --- a/mods/ENVIRONMENT/mcl_weather/snow.lua +++ b/mods/ENVIRONMENT/mcl_weather/snow.lua @@ -8,7 +8,7 @@ mcl_weather.snow.add_snow_particles = function(player) mcl_weather.rain.last_rp_count = 0 for i=mcl_weather.snow.particles_count, 1,-1 do local random_pos_x, random_pos_y, random_pos_z = mcl_weather.get_random_pos_by_player_look_dir(player) - random_pos_y = math.random() + math.random(player:getpos().y - 1, player:getpos().y + 7) + random_pos_y = math.random() + math.random(player:get_pos().y - 1, player:get_pos().y + 7) if minetest.get_node_light({x=random_pos_x, y=random_pos_y, z=random_pos_z}, 0.5) == 15 then mcl_weather.rain.last_rp_count = mcl_weather.rain.last_rp_count + 1 minetest.add_particle({ @@ -78,7 +78,7 @@ minetest.register_globalstep(function(dtime) end for _, player in ipairs(minetest.get_connected_players()) do - if (mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:getpos())) then + if (mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:get_pos())) then return false end mcl_weather.snow.add_snow_particles(player) diff --git a/mods/ENVIRONMENT/mcl_weather/weather_core.lua b/mods/ENVIRONMENT/mcl_weather/weather_core.lua index ec162117..bec9606d 100644 --- a/mods/ENVIRONMENT/mcl_weather/weather_core.lua +++ b/mods/ENVIRONMENT/mcl_weather/weather_core.lua @@ -75,7 +75,7 @@ end -- checks if player is undewater. This is needed in order to -- turn off weather particles generation. mcl_weather.is_underwater = function(player) - local ppos = player:getpos() + local ppos = player:get_pos() local offset = player:get_eye_offset() local player_eye_pos = {x = ppos.x + offset.x, y = ppos.y + offset.y + 1.5, diff --git a/mods/HUD/mcl_death_messages/init.lua b/mods/HUD/mcl_death_messages/init.lua index 8c1642a8..00f39ac4 100644 --- a/mods/HUD/mcl_death_messages/init.lua +++ b/mods/HUD/mcl_death_messages/init.lua @@ -125,7 +125,7 @@ minetest.register_on_dieplayer(function(player) return end - local node = minetest.registered_nodes[minetest.get_node(player:getpos()).name] + local node = minetest.registered_nodes[minetest.get_node(player:get_pos()).name] local msg -- Lava if minetest.get_item_group(node.name, "lava") ~= 0 then diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 34a0e3f1..2833c3ac 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -36,7 +36,7 @@ end local function return_fields(player, name) local inv = player:get_inventory() for i,stack in ipairs(inv:get_list(name)) do - return_item(stack, player, player:getpos(), inv) + return_item(stack, player, player:get_pos(), inv) stack:clear() inv:set_stack(name, i, stack) end diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua index 9c3f90e4..4047a926 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua @@ -41,7 +41,7 @@ local function resolve_commands(commands, pos) local nearest, farthest = nil, nil local min_distance, max_distance = math.huge, -1 for index, player in pairs(players) do - local distance = vector.distance(pos, player:getpos()) + local distance = vector.distance(pos, player:get_pos()) if distance < min_distance then min_distance = distance nearest = player:get_player_name() diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index f9e573aa..2e2d0fd6 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -304,7 +304,7 @@ function mesecon.mvps_move_objects(pos, dir, nodestack) for _, obj in ipairs(objects_to_move) do local entity = obj:get_luaentity() if not entity or not mesecon.is_mvps_unmov(entity.name) then - local np = vector.add(obj:getpos(), dir) + local np = vector.add(obj:get_pos(), dir) --move only if destination is not solid local nn = minetest.get_node(np) diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua b/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua index a57e7ba7..395c5130 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua @@ -56,7 +56,7 @@ local function pp_on_timer(pos, elapsed) end elseif node.name == basename .. "_off" then for k, obj in pairs(objs) do - local objpos = obj:getpos() + local objpos = obj:get_pos() if obj_does_activate(obj, activated_by) then if objpos.y > pos.y-1 and objpos.y < pos.y then minetest.set_node(pos, {name = basename .. "_on"}) diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index 610f8b71..71f0ac02 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -394,7 +394,7 @@ local entity_standing = { -- This is a custom function which causes the banner to be dropped as item and destroys the entity. _drop = function(self) - local pos = self.object:getpos() + local pos = self.object:get_pos() pos.y = pos.y + 1 if not minetest.settings:get_bool("creative_mode") and self._base_color then diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 480240ee..2843bdd4 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -212,7 +212,7 @@ function mcl_beds.on_rightclick(pos, player) end end local name = player:get_player_name() - local ppos = player:getpos() + local ppos = player:get_pos() local tod = minetest.get_timeofday() * 24000 -- Values taken from Minecraft Wiki with offset of +6000 diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 132918d1..52a857a0 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -94,7 +94,7 @@ local spawn_item = function(self, pos) end ARROW_ENTITY.on_step = function(self, dtime) - local pos = self.object:getpos() + local pos = self.object:get_pos() local dpos = table.copy(pos) -- digital pos dpos = vector.round(dpos) local node = minetest.get_node(dpos) @@ -166,7 +166,7 @@ ARROW_ENTITY.on_step = function(self, dtime) end if ok then - local dist = vector.distance(pos, obj:getpos()) + local dist = vector.distance(pos, obj:get_pos()) if not closest_object or not closest_distance then closest_object = obj closest_distance = dist diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 857ccda3..55a4e0b1 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -82,7 +82,7 @@ local player_shoot_arrow = function(itemstack, player, power, damage) local inv = player:get_inventory() inv:set_stack("main", arrow_stack_id, arrow_stack) end - local playerpos = player:getpos() + local playerpos = player:get_pos() local dir = player:get_look_dir() local yaw = player:get_look_horizontal() diff --git a/mods/ITEMS/mcl_buckets/init.lua b/mods/ITEMS/mcl_buckets/init.lua index 43260aba..5eac32ef 100644 --- a/mods/ITEMS/mcl_buckets/init.lua +++ b/mods/ITEMS/mcl_buckets/init.lua @@ -146,7 +146,7 @@ function mcl_buckets.register_liquid(source_place, source_take, itemname, invent if inv:room_for_item("main", new_bucket) then inv:add_item("main", new_bucket) else - minetest.add_item(user:getpos(), new_bucket) + minetest.add_item(user:get_pos(), new_bucket) end itemstack:take_item() return itemstack @@ -247,7 +247,7 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", { if inv:room_for_item("main", new_bucket) then inv:add_item("main", new_bucket) else - minetest.add_item(user:getpos(), new_bucket) + minetest.add_item(user:get_pos(), new_bucket) end if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() diff --git a/mods/ITEMS/mcl_clock/init.lua b/mods/ITEMS/mcl_clock/init.lua index c5a87e5b..0f0b8461 100644 --- a/mods/ITEMS/mcl_clock/init.lua +++ b/mods/ITEMS/mcl_clock/init.lua @@ -96,7 +96,7 @@ minetest.register_globalstep(function(dtime) local dim = mcl_worlds.pos_to_dimension(player:get_pos()) local frame -- Clocks do not work in certain zones - if not mcl_worlds.clock_works(player:getpos()) then + if not mcl_worlds.clock_works(player:get_pos()) then frame = random_frame else frame = now diff --git a/mods/ITEMS/mcl_compass/init.lua b/mods/ITEMS/mcl_compass/init.lua index a07d58ff..a8d557e8 100644 --- a/mods/ITEMS/mcl_compass/init.lua +++ b/mods/ITEMS/mcl_compass/init.lua @@ -28,7 +28,7 @@ minetest.register_globalstep(function(dtime) return false end if has_compass(player) then - local pos = player:getpos() + local pos = player:get_pos() local dim = mcl_worlds.pos_to_dimension(pos) local compass_image -- Compasses do not work in certain zones diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index db118da4..89a4bef5 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -121,7 +121,7 @@ function mcl_doors:register_trapdoor(name, def) local p1 = pointed_thing.above local param2 = 0 - local placer_pos = placer:getpos() + local placer_pos = placer:get_pos() if placer_pos then param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) end diff --git a/mods/ITEMS/mcl_end/building.lua b/mods/ITEMS/mcl_end/building.lua index 0caa2bc4..f4eff3e1 100644 --- a/mods/ITEMS/mcl_end/building.lua +++ b/mods/ITEMS/mcl_end/building.lua @@ -95,7 +95,7 @@ minetest.register_node("mcl_end:end_rod", { local p1 = pointed_thing.above local param2 = 0 - local placer_pos = placer:getpos() + local placer_pos = placer:get_pos() if placer_pos then local dir = { x = p1.x - placer_pos.x, diff --git a/mods/ITEMS/mcl_fire/flint_and_steel.lua b/mods/ITEMS/mcl_fire/flint_and_steel.lua index d074f31a..3b6861f5 100644 --- a/mods/ITEMS/mcl_fire/flint_and_steel.lua +++ b/mods/ITEMS/mcl_fire/flint_and_steel.lua @@ -35,7 +35,7 @@ minetest.register_tool("mcl_fire:flint_and_steel", { used = true end if itemstack:get_count() == 0 and idef.sound and idef.sound.breaks then - minetest.sound_play(idef.sound.breaks, {pos=user:getpos(), gain=0.5}) + minetest.sound_play(idef.sound.breaks, {pos=user:get_pos(), gain=0.5}) end if not minetest.settings:get_bool("creative_mode") and used == true then itemstack:add_wear(65535/65) -- 65 uses diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index 2a7a8119..c8c12ea3 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -203,7 +203,7 @@ if flame_sound then function mcl_fire.update_player_sound(player) local player_name = player:get_player_name() -- Search for flame nodes in radius around player - local ppos = player:getpos() + local ppos = player:get_pos() local areamin = vector.subtract(ppos, radius) local areamax = vector.add(ppos, radius) local fpos, num = minetest.find_nodes_in_area( diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index dd9a63a5..a05646b7 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -297,7 +297,7 @@ minetest.register_abm({ -- Item must get sucked in when the item just TOUCHES the block above the hopper -- This is the reason for the Y calculation. -- Test: Items on farmland and slabs get sucked, but items on full blocks don't - local posob = object:getpos() + local posob = object:get_pos() local posob_miny = posob.y + object:get_properties().collisionbox[2] if math.abs(posob.x-pos.x) <= 0.5 and (posob_miny-pos.y < 1.5 and posob.y-pos.y >= 0.3) then inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) diff --git a/mods/ITEMS/mcl_maps/init.lua b/mods/ITEMS/mcl_maps/init.lua index 9f762a7f..300e1d35 100644 --- a/mods/ITEMS/mcl_maps/init.lua +++ b/mods/ITEMS/mcl_maps/init.lua @@ -9,7 +9,7 @@ local make_filled_map = function(itemstack, placer, pointed_thing) if inv:room_for_item("main", new_map) then inv:add_item("main", new_map) else - minetest.add_item(placer:getpos(), new_map) + minetest.add_item(placer:get_pos(), new_map) end return itemstack end diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index 99c266f9..1eb9005a 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -365,7 +365,7 @@ end doll_def.on_step = function(self, dtime) -- Check if spawner is still present. If not, delete the entity self.timer = self.timer + 0.01 - local n = minetest.get_node_or_nil(self.object:getpos()) + local n = minetest.get_node_or_nil(self.object:get_pos()) if self.timer > 1 then if n and n.name and n.name ~= "mcl_mobspawners:spawner" then self.object:remove() diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index 8461e446..c172eacf 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -223,7 +223,7 @@ minetest.register_abm({ if obj:is_player() or lua_entity then local dim = mcl_worlds.pos_to_dimension(pos) - local objpos = obj:getpos() + local objpos = obj:get_pos() if objpos == nil then return end diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index eb4803e3..d08bddef 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -415,7 +415,7 @@ minetest.register_abm({ if portal_cooloff[obj] then return end - local objpos = obj:getpos() + local objpos = obj:get_pos() if objpos == nil then return end diff --git a/mods/ITEMS/mcl_potions/init.lua b/mods/ITEMS/mcl_potions/init.lua index c8b1f73c..277267b0 100644 --- a/mods/ITEMS/mcl_potions/init.lua +++ b/mods/ITEMS/mcl_potions/init.lua @@ -84,7 +84,7 @@ minetest.register_craftitem("mcl_potions:glass_bottle", { if inv:room_for_item("main", water_bottle) then inv:add_item("main", water_bottle) else - minetest.add_item(placer:getpos(), water_bottle) + minetest.add_item(placer:get_pos(), water_bottle) end itemstack:take_item() end diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index 978f73fd..29c23f52 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -283,7 +283,7 @@ minetest.register_node("mcl_signs:wall_sign", { local wdir = minetest.dir_to_wallmounted(dir) - local placer_pos = placer:getpos() + local placer_pos = placer:get_pos() local fdir = minetest.dir_to_facedir(dir) @@ -443,7 +443,7 @@ minetest.register_entity("mcl_signs:text", { self._signnodename = des._signnodename end end - local meta = minetest.get_meta(self.object:getpos()) + local meta = minetest.get_meta(self.object:get_pos()) local text = meta:get_string("text") self.object:set_properties({ textures={generate_texture(create_lines(text), self._signnodename)}, diff --git a/mods/ITEMS/mcl_stairs/api.lua b/mods/ITEMS/mcl_stairs/api.lua index 613d66af..d90bc845 100644 --- a/mods/ITEMS/mcl_stairs/api.lua +++ b/mods/ITEMS/mcl_stairs/api.lua @@ -29,7 +29,7 @@ local function place_slab_normal(itemstack, placer, pointed_thing) local p0 = pointed_thing.under local p1 = pointed_thing.above - local placer_pos = placer:getpos() + local placer_pos = placer:get_pos() local fpos = get_fpos(placer, pointed_thing) @@ -57,7 +57,7 @@ local function place_stair(itemstack, placer, pointed_thing) local p1 = pointed_thing.above local param2 = 0 - local placer_pos = placer:getpos() + local placer_pos = placer:get_pos() if placer_pos then param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) end diff --git a/mods/ITEMS/mcl_throwing/init.lua b/mods/ITEMS/mcl_throwing/init.lua index 4f572973..731e9ce8 100644 --- a/mods/ITEMS/mcl_throwing/init.lua +++ b/mods/ITEMS/mcl_throwing/init.lua @@ -114,7 +114,7 @@ local pearl_ENTITY={ -- Snowball on_step()--> called when snowball is moving. local snowball_on_step = function(self, dtime) self.timer=self.timer+dtime - local pos = self.object:getpos() + local pos = self.object:get_pos() local node = minetest.get_node(pos) local def = minetest.registered_nodes[node.name] @@ -131,7 +131,7 @@ end -- Movement function of egg local egg_on_step = function(self, dtime) self.timer=self.timer+dtime - local pos = self.object:getpos() + local pos = self.object:get_pos() local node = minetest.get_node(pos) local def = minetest.registered_nodes[node.name] @@ -185,7 +185,7 @@ end -- Movement function of ender pearl local pearl_on_step = function(self, dtime) self.timer=self.timer+dtime - local pos = self.object:getpos() + local pos = self.object:get_pos() pos.y = math.floor(pos.y) local node = minetest.get_node(pos) local nn = node.name @@ -259,7 +259,7 @@ local pearl_on_step = function(self, dtime) end end - local oldpos = player:getpos() + local oldpos = player:get_pos() -- Teleport and hurt player player:setpos(telepos) player:set_hp(player:get_hp() - 5) diff --git a/mods/ITEMS/mcl_tnt/init.lua b/mods/ITEMS/mcl_tnt/init.lua index 306c6298..39df3848 100644 --- a/mods/ITEMS/mcl_tnt/init.lua +++ b/mods/ITEMS/mcl_tnt/init.lua @@ -20,7 +20,7 @@ local function do_tnt_physics(tnt_np,tntr) for k, obj in pairs(objs) do local ent = obj:get_luaentity() local v = obj:getvelocity() - local p = obj:getpos() + local p = obj:get_pos() if ent and ent.name == "mcl_tnt:tnt" then obj:setvelocity({x=(p.x - tnt_np.x) + (tntr / 2) + v.x, y=(p.y - tnt_np.y) + tntr + v.y, z=(p.z - tnt_np.z) + (tntr / 2) + v.z}) else @@ -159,7 +159,7 @@ local function add_effects(pos, radius, drops) end function TNT:on_step(dtime) - local pos = self.object:getpos() + local pos = self.object:get_pos() minetest.add_particle({ pos = {x=pos.x,y=pos.y+0.5,z=pos.z}, velocity = vector.new(math.random() * 0.2 - 0.1, 1.0 + math.random(), math.random() * 0.2 - 0.1), @@ -181,7 +181,7 @@ function TNT:on_step(dtime) self.blinkstatus = not self.blinkstatus end if self.timer > 4 then - tnt.boom(self.object:getpos()) + tnt.boom(self.object:get_pos()) self.object:remove() end end diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua b/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua index 4dfa92e8..0b07fb14 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua @@ -245,7 +245,7 @@ armor.get_valid_player = function(self, player, msg) minetest.log("error", "3d_armor: Player name is nil "..msg) return end - local pos = player:getpos() + local pos = player:get_pos() local player_inv = player:get_inventory() local armor_inv = minetest.get_inventory({type="detached", name=name.."_armor"}) if not pos then @@ -539,7 +539,7 @@ minetest.register_globalstep(function(dtime) end for _,player in pairs(minetest.get_connected_players()) do local name = player:get_player_name() - local pos = player:getpos() + local pos = player:get_pos() local hp = player:get_hp() -- water breathing if name and armor.def[name].water > 0 then diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua index 1a25dc68..d6212e37 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua @@ -219,7 +219,7 @@ minetest.register_entity("3d_armor_stand:armor_entity", { pos = nil, timer = 0, on_activate = function(self) - local pos = self.object:getpos() + local pos = self.object:get_pos() self.object:set_armor_groups({immortal=1}) if pos then self.pos = vector.round(pos) @@ -233,7 +233,7 @@ minetest.register_entity("3d_armor_stand:armor_entity", { self.timer = self.timer + dtime if self.timer > 1 then self.timer = 0 - local pos = self.object:getpos() + local pos = self.object:get_pos() if pos then if vector.equals(vector.round(pos), self.pos) then return diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index 25f51e09..93889604 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -334,7 +334,7 @@ minetest.register_chatcommand("spawnstruct", { description = "Generate a pre-defined structure near your position.", privs = {debug = true}, func = function(name, param) - local pos= minetest.get_player_by_name(name):getpos() + local pos= minetest.get_player_by_name(name):get_pos() if not pos then return end diff --git a/mods/PLAYER/mcl_hunger/hunger.lua b/mods/PLAYER/mcl_hunger/hunger.lua index d77a7b18..875d1be3 100644 --- a/mods/PLAYER/mcl_hunger/hunger.lua +++ b/mods/PLAYER/mcl_hunger/hunger.lua @@ -141,7 +141,7 @@ function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poiso local name = user:get_player_name() local hp = user:get_hp() - local pos = user:getpos() + local pos = user:get_pos() -- player height pos.y = pos.y + 1.5 local foodtype = minetest.get_item_group(itemname, "food") diff --git a/mods/PLAYER/mcl_playerinfo/init.lua b/mods/PLAYER/mcl_playerinfo/init.lua index 8fa615da..31dad39a 100644 --- a/mods/PLAYER/mcl_playerinfo/init.lua +++ b/mods/PLAYER/mcl_playerinfo/init.lua @@ -57,7 +57,7 @@ minetest.register_globalstep(function(dtime) local name = player:get_player_name() -- where am I? - local pos = player:getpos() + local pos = player:get_pos() -- what is around me? local node_stand, node_stand_below, node_head, node_feet = get_player_nodes(pos) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 1320028a..f9022a3b 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -18,7 +18,7 @@ minetest.register_globalstep(function(dtime) end if player:get_player_control().jump and mcl_playerplus_internal[name].jump_cooldown <= 0 then - local pos = player:getpos() + local pos = player:get_pos() local node_stand = mcl_playerinfo[name].node_stand local node_stand_below = mcl_playerinfo[name].node_stand_below @@ -76,7 +76,7 @@ minetest.register_globalstep(function(dtime) local name = player:get_player_name() -- where am I? - local pos = player:getpos() + local pos = player:get_pos() -- what is around me? local node_stand = mcl_playerinfo[name].node_stand @@ -183,7 +183,7 @@ minetest.register_globalstep(function(dtime) -- Show positions of barriers when player is wielding a barrier local wi = player:get_wielded_item():get_name() if wi == "mcl_core:barrier" or wi == "mcl_core:realm_barrier" then - local pos = vector.round(player:getpos()) + local pos = vector.round(player:get_pos()) local r = 8 local vm = minetest.get_voxel_manip() local emin, emax = vm:read_from_map({x=pos.x-r, y=pos.y-r, z=pos.z-r}, {x=pos.x+r, y=pos.y+r, z=pos.z+r}) diff --git a/mods/PLAYER/mcl_sprint/init.lua b/mods/PLAYER/mcl_sprint/init.lua index e1224bb7..123809a8 100644 --- a/mods/PLAYER/mcl_sprint/init.lua +++ b/mods/PLAYER/mcl_sprint/init.lua @@ -31,7 +31,7 @@ minetest.register_on_joinplayer(function(player) sprinting = false, timeOut = 0, shouldSprint = false, - lastPos = player:getpos(), + lastPos = player:get_pos(), sprintDistance = 0, } end) @@ -69,7 +69,7 @@ minetest.register_globalstep(function(dtime) players[playerName]["shouldSprint"] = false end - local playerPos = player:getpos() + local playerPos = player:get_pos() --If the player is sprinting, create particles behind and cause exhaustion if playerInfo["sprinting"] == true and gameTime % 0.1 == 0 then From 29040f935220cfcc7c0a9b31f23202e3310a82d2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Feb 2019 08:13:45 +0100 Subject: [PATCH 0238/1107] Add magma cube sounds --- mods/ENTITIES/mobs_mc/LICENSE-media.md | 10 ++++++++++ mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 11 +++++++---- .../sounds/mobs_mc_magma_cube_attack.ogg | Bin 0 -> 11115 bytes .../mobs_mc/sounds/mobs_mc_magma_cube_big.ogg | Bin 0 -> 50534 bytes .../mobs_mc/sounds/mobs_mc_magma_cube_small.ogg | Bin 0 -> 36205 bytes 5 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_attack.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_big.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_magma_cube_small.ogg diff --git a/mods/ENTITIES/mobs_mc/LICENSE-media.md b/mods/ENTITIES/mobs_mc/LICENSE-media.md index 0abced56..fe5c41e7 100644 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ b/mods/ENTITIES/mobs_mc/LICENSE-media.md @@ -172,5 +172,15 @@ Origin of those models: * `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: Note: Many of these sounds have been more or less modified to fit the game. + +Sounds not mentioned here are licensed under CC0. diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index e0c9d58a..59ed07fa 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -138,10 +138,9 @@ local magma_cube_big = { blood_texture = "mobs_mc_magmacube_blood.png", makes_footstep_sound = true, sounds = { - jump = "green_slime_jump", - death = "green_slime_death", - damage = "green_slime_damage", - attack = "green_slime_attack", + jump = "mobs_mc_magma_cube_big", + death = "mobs_mc_magma_cube_big", + attack = "mobs_mc_magma_cube_attack", distance = 16, }, walk_velocity = 4, @@ -198,6 +197,8 @@ local magma_cube_big = { 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.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51} @@ -225,6 +226,8 @@ end 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.hp_min = 1 magma_cube_tiny.hp_max = 1 magma_cube_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505} 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 new file mode 100644 index 0000000000000000000000000000000000000000..380ea612afe4ff66f1f15fe46d4bcdf720c7fdaa GIT binary patch literal 11115 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 OIg6B6-_328;R666r?_AM literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..cd166daf7097202dc0549a2a4028503080fbbdfb GIT binary patch literal 50534 zcmeZIPY-5bVt|6c9kKEt=A|$eXGS^3vizc?%wmuLqstl)#lT>&k{Qg{!3fp~W`hWj zPDTa>2KNq@t%9!qQNdMah)Jdl3=9#O1sQt&Md=DTnMq+_^A$W5j0_Ad42%uU6g2$u z%M}a_3{(};Qp;0|6pAxab8?C`K{hb5LJZM%at>o;;9y{2F!WJ4+Hhe)CVPtB!M7HU+^nBoCq9X05jF{SgUL~@VeF&Lp>k|N5$z{1d=!P&R?nP=8H%XA6# zzM=(|nSK__71+B1A6Rl8`l^Ta86RvoV3_;Sz6Y*%-P#AR&UEa zy-DZvCLXX721W)JkZTwgWX@WKfzl$Ur4mLC87H(D9GDm!ju*-tFH~_2QaN6v!wwGN z6ATO-3=Tm$M~h6{i%pIf+Z->paW8Q>ImPGf7axAG5(Xx4v@^!f zD9pMr>+@MlzFAKftQ47j`Cw)DE(BD0InbxxVBzIA5^ z#5}N}#phPW%{h0_^5LA~bDg(lXYb^Uol|`7XUd#+XE{M)=*h={fq^CQhQzVCO$xPr zY)K-D%M>TemGtvXUSN1abBSDUpPSdp=71nc^`#|EV4o{6FtiAOQ!$JHCuK+~UNWgm z>y*akGe)O%K*XBE=d50DI4t1IW4Ps#myYSxu;kvY&*l}cv-HSby7gL=_R=XqUYbk6 z;Rnhf3MmsD*(AZ4q-{pgDb3{znz$gr35mE5D(3}dFCwAyA7uiCR0D-nFB<6v8{3A4 zgoc;pMouriy}dQ|M(O?QwfC?0#*4S1CoFi*VQ}J5Yys!VDM>ws$LBQrIdMWF7?yJi zMUGFDIXO|qdy|UqC7rXMO#DBaToiTSA$Hi2I+=|*y7JI zp`oEyO?)q#G+vl6m4QK$f#Jnb4#gIMNsFgN3G53$WvOBMJV0zs=JnkQJQs}}QlX{at0@bVH(7BG6Ql5)jn2|*f5mj-xcX)cur_R=jA2;y40M8qpobE`i4VPU@;sG1A zcFC2bEX{4#qSk;dUjnimB;l!B?B~U^VxShB`au;ojy zMP+Z@2C{rhNKht7N7mY7*P_;}Tq+TqZMf}PR=`0>e1aMlf1^X z9PD#3FHhaABFS00#{#^vz^>BWb}h?i?NKQ&uu+~Xw_c0tUAt8(*voL)wJe{NMU@&A;JT}LeL-VLa%Q1ze z63qgdM`siZC@qyJ=5snWqgcS}B#5Oc+ad&t7XdF#O;HAhfCmf=0twB_jyz&$ZCk^_ z;Kalr(K03JjOBBMDU*U)CIt0ZK9^|;3hELF>N0#jr#ZmOYif{>;WLm}*2*9+!((8v zm8m@-F##{nm0Np2VggQ@np>|~K9?yG^734|^oG^*In4rInyO2$MLm~k5deu@OL{%0 zS-?qCb?KF;ZpD@$FHhB_(~`OkTY^C9rbKlcP74Y0TDkOEQuoGVL0(>(ORq(B8y=e# zl(ll}wWOYn$D)G0K*7~*cq}TLk%57okAZ>F?SiMJ$vuW`Q-Zn-kI6WDX@c4~noB`#oaa-5dJK=vDDE*lCR2RQ z@|Z;O8O!G~$!83o&nfORJO*lg90y4}pOXw}jBqkAXcaIpaBK)nDQ=p$z{xp`iD4xJ zLyMsoC=7$7S|y6lS#m5j@i2Tgr&z#iC4@UA2*TA=1<5K-nG^()b<$8>dd`vq6ntKD ziv^rC7EYPs#IbZrP>|QkRsk=~rBgzpw3bep6y&vXYZxS4v(_>&d|+W`SimG5=5C=W z#jOMOBO}8BiRKB8Y>LUCmQjm<69*>)g9ON(1`Byaq&5jLc(5`s@C0=kvM*gC0!~|A zo|>Rk0ZJ*Lqy~!oE<X7Hfh=hfT+Kdf03=AHc;D+T=P;4BV0g4S! z9Dv1^!C7D~f_Mg%I0K5D9?NGkpyuhEVm}6kfJSBphlXCI*}^?6q98wVuro09B!ZLw z1h2(YKq0C+HB4&hoMs_Vik@bvuDUcRC`)(S8B0ygsgr`Tb<2c;vUHbTOIowBc|uV3 z%B^C_y|OJqQC+&nq>A4vOqmpw4N9LHOPAhATC?%mEN4xSlC`GKV}i1Dk40sl-THh| z5Ln6Doy$R{T#G4wZwoSI>$5r4=U5qL*jO+)sNS$R>~$&fVMYNs9PThMxM?1nQ_Kgd zjs=`Jrb4nQB;vG|f)k7)C<+x*K>4=>BH?rbNuuQfC}V>q0-Q9L7N4_Zhv;Yt@B-yf zkjX+`8cU~uQ4DM1Vj z7r^l;I8`iZxn#IpqcWGI8YF)`WME)`sm)RWX$4uUtO{d+JwzJuO8XL2PM9G}aTc&)t_m3_{ZU9slF&aDyIXHB2qYv#A& zxSzG!^m$D7d)x2xn)3{=#S~vS2vXv>Ln8aU<#(ADKC2&cJPap#3m6K0e06z@TQqz`zo5aNU_pt9lv|;EVDK~ zpQ6|_XUiP#lRS=oQQ5jFCp6Rzw}}|Fh-|qP^>Rv3Ptxj*B|V0oE00d|dal60z|h3N zz$|Da%pu~?*vP|R;ovcWiGhooNA|F*gM*&p;sXl`d@R)GnlUgqcAOFD>^Q1mxKK(% zYZ-IHQP#E^h7%WVc#H1+oX! zuYSPDpm38xY0=D?k6(QF!N4gfsiF62A3GNFjF#KR(@Ca+@$Vhu;VP#|I;N;@w z;pO8O5EKF*RA^`bb*>l~92giF8X6$O1_#8!+8IE@1|WscySF8)M*aU^{{MedW=2{} zRBTdKMrK@MbXf(RSuej!1&Y!;ba9-ZuLx;uX-Uaxl zSL^y6{`}`-W!yfW)A7|YQ~zyxdh?#l>(Bp+wi=(?^W)3SrPDWh`^)zlzAC+TxxV7p zg!xZx{jYB~IX(H^)yt;!-#5+-vXU#$T_&-9>(@JP@BLVMBYyqkjq0ZBr+@4DX>~TT zdTsCN7pC!->csATnI!(Z+ThZ(BTs^icNI@s@Q72tZNA;Cy-V8Ui|SwQa*N!zEK_zS zZ~vS6&oPV2j$c}yzJFW#f5rWU+h6q0^4}`^cb5M}+wRWr)zgx5tZzo_=Q#9v%9F*7 zUp?9;zj`?N-A1dG$)UDw*UkmL>d?#YuikK{F#l$jTI!r<_iSz*J9p`yZ@WbF=T8A2 z3;NIfyVTwzn0n7okhM&I^7l0xOFOgw|BjXOn(ft>y83zT-TnvGpXIkR|95Y``u53^ z+fHgxwi}zB)n==_ymHsuz|{7o*mDn^?F+ZA$&j$P7<1XHfQ|gm0*Tr2wE0ccf>;J#2CcQDNjx4xVYL|9o z_NV5%wI6N&ljGUa83_tRz1pE}i4KUOYDuJCIwxxVM{!wnjXmx!D^ zbBohB>{42{g9_uc?Z54B8|uztY_Ml&`2FqMLa~+qAKP!g`}DVbiJWcx^w(j(tKVHK zpMN#-jr{Vx%)6PNu71xq_1nB{n&+Nh+BxrjU9o-dmXdlKgZ2Gq7YTRoUAEYaU9Wrh z@+H-MU*4a#|8cF>);_rC#M@`b=T`1pQt|!JVUuIG+yCcZi@9a{af@h9{YsmCdp_RH zDZeeg`~BYfth36c`|LKa{<24Xbxvy3!tH7sV!V0%9&dkn%^==bxaP~Jo^^Atop{%} zb=ID&Ea@xTDEQ z7MuO85S(E)dyDC^+1*>#&U?4yaJGMb3vY4UtM~EevpI#P71by0{aR5dlf~N?)hl`H zVYRWo(^`cK$DGrwzHRJw`h4u}opU#iw`htuHlCO3nPPqZv(5R>yWTTJ&pUs7!}N^A zuV>oMEny3bco^$`v-q9wggbH^9>H0@&5j{gCSGMd?pYdmDzo^t{d>;6<=&aaPu_JV z{+hP$?*t$9%^~ZjTmN-lS&$twAv&YKck{pFTRIx|*S_5!DKMpb;m{KXc!9ccO9n{<-EMFp8lOTv&QP8RK@n(ZfO~{1GkcYyP7`T9czEu z*Ya_KJ1cK%kl{DA`!mkY?c_2( zzPDC|*Vk9*gZXFGcf0Mce6(Ao)snTZt=OF1;>S(>n+JE5N3Ku%zdJ83`*hWxc;k|1 zt()f+eEfG||L?-CNQ*E}e7kuk-0{x3cf}&3DbeaZ&AGRo7(m|LS`p zb6;+p|8@KBw#zT?PCc8o&q7#R;UEJK+keG8ozt$n_djC@u3r7=UG(q2d;iwG`~P`+ zS?(JCZ|^6r)82UM#Px+$uMJ%%h5cIlCg!VS_Gax<(?ai_+3@A**Pf-FISngb8NIiT z7S+C&H6iH`fBH+l-H#9RJYOHa+V%CXQ|FdA2r#Jd{r8&BJ?;0yinEMyby=T7&plsV zGxJko{_Cu{K_^zNoawJ$eC_zsKil3W$(gU48dvvy=UWrAFqe{^DQc!y&x=iaefVeW zmkYCu@5COwlJ|<+pfIM^%V!fa0^&|mC6(;-D@eFx0W-;bO=B~^6b}uHaKRbBPuRd?iQDcx{+n=8AuM?MimnUJ<MsVBc*JwLuwZXK`O zAF-xQo-t2jbG6KPTsKZ+k7k~tacrO7qIdTnZ)$#=aaJjz@aBy_Hak~bk$z)aSJ(b| z#=QSltIMRV7v&nT@%*zZW?Otr^v4UwyZg;0w`Q;1Q&139HO8;jJ6URpK)Au zPGXs@*8M_S=DCQKu*j(@j>t1pKW?@Bs&D-2_PzE=cds7)y!O+%DOdAL-rf$oe{SuU z?tA(ES0_C#E?mE4fn?0RogOJCID%H*GJfeC{U-X@$-8&YtzP**eYU(t&bFo64_Cf! zt@$7QEqjl++UNIwi(Y*{_`F%ghna!rRhqQml!n#j>@R*U{_}n1;_$c|e=Hwf@i04n z*`BZe^3(Nmk3Qti7FU}4-hI3JUG6@SO{QI5H{ErQP7nF^c+-|$ZTokvDmc{q^!eFa zj@>N`a}QMN=b3VLpT6b)IOu=#@g48BRj<_%Wcc$nFJ?aTi~{kqjB=%Y_Ftaatqb4x z>2jG}-?L*YGH=h~S*su0FZk+jbI!Dx8cTQYbGzE=o5Z?st;d6VY`pF!Sx>xrw3Axr z=ekXnJYOnpo!7G_+xO+y!xQc&-_D8JTVJ%klArs$IS&Ja&Nne(Chg^wUuH4BiBa1V zcXfVUT;Z8xTb9aHT)4Q+KHc!#+sj<}clu`YZgP!Arv?k;|9h3UznBa=@5K9uCrS{)j$2ZSHInww8?*>-0jd!>o?WfEWVzr(l~{|leqW!!e_&hm`eIkk`fl}%3l z@XW$de)=t==%&l5`^D_H9}1KzT=OfTL^e*wL7r>ss#R8%<@ym@+lxPkIzKZGvd#?q zoAG@9E~BSk?NcNF?wBuHHR%jnj^6j+ODRhG&PAKBXNWKL&D|AqX?@+_T?;3>uQa!A zU3}_y!1I~?{W=c|vS;xz9Phd)y=Rw=%`27jzgK_#+j?Q@Yys|*bB?}UpVm@XvUb_j z{GWBtKbPCh*#1oN(uK-nE5(zoDFEt}U)US=Q{o?YGkB#U*iXq_$@s zzasd2>uojvSF!s~W>4-7Uz_jTT<9lSct7RO*NzRBQ_crF=;+@TnfS;y>)G;cWxA^C z^;*279K;xGr1memZ8mj%%kB)m3y~$??S3w=JnEHl_jQu-xny;<8+_}RzD}`dJAA$A zbzR}Etj%^0jy>De=@@&qF<`t7DSI&|s|goQk8-!*kp&xVz|ChNVPfB(mR{okL; z=E`sHe^zN6u_bt}2rq+;)c0%ltEKkO@_3rb_aSxHRn_>wJ7)4~Vt}E&IME+8Zdmn#1S;gnLtnTcRQpx+9 zufD!sw0iP_ZMR?iK7F!psmbvqYa6BzrTd{Rflv1@3}4sCcy9f2!pdor=`|17mTIi?>E%f;*nJ9I3<$=J71&o)J#cg3SR*Rq1t_21j?8GJgo@OQT>$7VA`%^j8>o&WFhr#G87y+7^Q zpL;*+bJWrDZ~M-4Ti^V$C&%a2(?xfge5CA?m#lipZF-OA!Mm^0>go4BE`70m@6xTm z9!2l1F*zDiIBnar-H!G#`p2su^NC*KDRa4=yZzw1gKWQ#G^g>-k8JzK;1%yaxw&mu zOTgVjuXk9jk?7w%SB#Y>p@EIThR=Rd_0D6~i8*Wu)i>)V-77z0_F6?<-OIw@T}{ao zpE&|wXWQ?ev+Ze!O_S`Z)yg-`6wlpkWO?TGRA2mc(Y4!i)}GycKk#ue@Bf#9cmCbZ z{Hgoud%=N|e5dXvGnlZ=pWPpDB;{Bd!{zzgCVzYWuzm65X(gY|tyXxry6)|{fOgB` z8~6P`9~WO8*YhoXEZ%=b&_G7WwTj%z#V?TWRbG2;z zO+C5zpO;^0CGTL6`S$ME^Gi~GZ=aYld;F_WD}3_tq*vaOZQHK<&CA?tK4Z;;LQ%fn z(%TlcmcfxL)T>plnQ@#*lr@;Wd-aPeeOCW^rs-7N+!X(nU%kHj(nf3BuAA$A$UfRW zwXQ(#HuC`nop0~-G^b6R+!Ol$(W>Q--d2iVyPYokLS)*sqTj!CAODN_d~~LnY4pOD zyQQxu^`*^|dZ|A>Z~f7p$Jc)@Jp0a{Rn<>7s)u_GcRtIW%=oOt9j89Toj+?Svfe^| zd4$i!)4Vy6d0GsA_NJ{clUSr|^~V1E@|PhpA3t8N-*Ybh`#I4|p>MbUE?k?O;&Z%p zeZJ8d&G?J)Ex$$F4cA()H=LAiclG|xvYN%4=L>1Ju40=NvbBFpe;s~6W~?|GLkb}pGb zdGo?cwJDKnMDzc@UjO^;;r^>fbMo4sZT0)<@%2i_!30-}#7nbO?&{<)zumrG^7!lH z)0C`Pb52c(}9^G$Ua_!o$s?Jic ziMs_1AAC9FoKf=r!nOi0ug-6;mdKyuo)cU@EwW;w^PLB}8&?a?ne+2X#)`Gv!ZQv= z|J1v-_@$xHXLTqp03{&_w?t)$+KxwyyjwYc`={rpleQeSShv5Vzy9{^%gJ-!q#ikX zHA4P}`R$i`Vr=#GGjr~Kvxu{suY2}sxcUEQ*4?{zZoXf(Zhh>!Yv=Ep+7WfeKhIpcfThJy4cMD&e zb+|Y$?!?5o%cfRI>V`WPZ&`LG=-9HU1*S@`_4Ds1PnJG;EzH+#+F|!sOE+yQs8H8! zzxiEWCujPO4@)zhdS5BFAN_o-BAK&cdiiD9QrXDao_9Aq6#6+Od){2$+mW4?TlTo_ zO{kr3yrF&CX%9WgCHv3)zM(g1iu$S#4Zm!@D6y0;xjFyOQ+rweu+G4nd_OmHZ=U=^ zC)($%u;jP1!ngO$U2xK5|0R2ut&g`d6~4jzAT=Geqv+o+U!=4<9X^4G5fZ&od>{9EvT%h$?BHk(DiE;SA4+Fz4e%y_c6C{#*n z>NCG^zj<%j&+c@~?Ok(j+Q&=poc{LiTvuObnc$uL{jq|?=W_>Z-_;mbu)VPPzO5o= zrO>;So_Xni=Gd4{t6ZFZU-oN8!loYcymQ{BKWh5sUr#ox{dWBLZ#mVx{mbvKIY0gX zlBEyN-n_Q_cK?ir43^qGk8|!ZKm6su!>+XG@V=+toft!;?x&eY3Qo55s}Fx@u*p5| zxxKtyS^wYW?Dx~^`~4m+NxuBZ(?;_q=XyUf+^F5T&wCjTSYH*;3?C*Z^^!C+X@9vU+7bjl1_IrF}kd3^BYx$QHS(_sz%a_%dh4)t4 zo|$r9zt-2@z!Jm#+A6ZPcj8Uu)`R6gYu=|Ni}~;V`S9q;BQgvj z|MX7kGZyu3tS+n#xW4f#Z>H6&iXZ<@JWu>J5wK@$uh7)v5y- ze7NMpSR>hD&whC<7iV`j^VUmM`+_}|wUJNPKdaPvr}FZF-upAluN{37DDqxx_ddIF z)`iEeX6^g%xYYa2-Chl8qx`Mq88RykuVo7zI4Yj?GJ4qfA{Z4_teX+D|FV{c=HCof9)AvH|d&i?%A^JRq44&NtYJP z{=M|;ou0MX!9PyVthsBu^W>^$$Iq`#oWHMp6Ytv{-?#0&EyMQd<`A-j8?$EQof6x1X`(pLD zJ0@R$ms`fX|Nh-4FSByCz7azR*ZX4=4+Ukp>$?;;9KZbOcj zH`(NlOxACsU2*XhvFF;#DrLI132%1{n^{(Ud*e5+usPbZ)vWgaTwLE&$R#GhvHi&F zsO;O9E_!uYZ1{10_mA?G{tt#az@`B9utU4L!sUR^Jgv%}8pmh`O|2?o4B-^P`moP1n6LP2!B=4UtG z{|}^am;_?@3IU(etxh_pH; zEMNOS^Ixf5cJlYN7I*Dt_HLhcEH<^~W?WB*)t#feHOs!;*^~K{Pn1n^_Vu^yhgLXE zFOLn>+7y`e`1#aTTI=7w*E~{L_RZQfbH~%)r`Mm&`nglYtM5(5*l3ud1gt zCNbQ|mo*(W+(J$rja z-{ZB%etqgcbnUL#?$4hV_s=i+-M=aM=h^Fj=Izgy`d%6r6Li(&?B5OlKebx^s(iin zajgCE#}E99eP6Gf**h~cQbD(f)ijrNr!vR0(itJOPSRE$6-lzSN!5#2&fR(TUdilC z`^i@Me)hXc&UN@tFWaTpb})GA$%iHG@^*1s>(5llIDdS?HTCJ^uNS|mPoE^ca_I%7 z8DFz@Wy~sgaVFsV$GJbURZ6PvS_pIPi<*CBVtAyja{7Z~3fqmZ^*xK&%O9^3p7f>g zx~`xgpU+*NjN4PscCJXD_)d6!vT5hf((mt1Ene2@d3;u4>#ulottIBoveS;t_5OP& zZH52I8P5zBFU{rgpKmFYwCHw!$zh1Vt8hdX~|D<;NaOFy;mc7p>sJ_k&n}6}$i^*Sp@=Gth zW_fVqBhR?o^L%4}e#psa-~B;AG%oSo>w+b6ZxgTCCEA8RdvyNo&9uxrv*(oOUY)MJ zRz3C4*(oMAPq~$U&M0MG-g!Lv)V6JN?swgHJM?H{hULL`cj`=9>fdkj%zFENV<}I0 zUanDj+15>W)|i%07QA_*=+0sB>Bqzv&nceq2`Jg{(LL|}ew))83f{^72||2te)4fM zTAVDH%^b7-_TP=WcHaA+y0z!&!yn;qi|j)yXWY1W=ao&tCqB6x-E89(F|Th*f4Sz`kh)|L0#r^gV&mw$4* z(Tsxlvy5W@BT~!fbM623`Lz0Px!tvTWs1EKddWM5?CbAU7B7vCuUe}7tH5oW=CNlh zpZ{u-o+G--qv$<*4By)+hc~a=_Wb#j2WPTdw)XYQZ+>2S&-UBfJvA}r=dV`(PS$)_ zz$l}pFQziRa^XSu&rGjoKk6;qV|S(M+4sACHeIV7cO~zC=jqY9%j9{$W`ld*m-MtA zeX>ex)%MunmlfCUT+aQ=@=^1vwC{>WuAS*`lES2XuQsM1USs9`&2m2f`IrChY+bbI z_rDu%ZQB`IjHY*gfAzp*S+yBEM{C-vFWYZy`Ddc`taI0j)y8hGOBQ`jknvNyd->}> zyM%r*^F?1T-`|yaF}FTP>woRjZ#LV0zt}PNU(L<8Zu;r{=9fP|-f$=9+cQhE<7b`r z^Doaz;bmB26z}$;A?9(zSw_CCB|C5Ky?^^{RiORO`JZObF;3L3-z9X^WrfMtyY>lZma6>tCAm2Fdu+$`L*28= z|9_YIP@S55Wn-1;d*9OKj^smsS4j|GKkoM(MR{&%Q1?J@4j|8w^wQraxz0eb)AsFJopMomredjcxj|$?s?0UU=L%N_Oei!*gE!ogOv)-4B*E?uy@5cg(Nr zepbi-MKD{`$xP&(-752iJ2EdN{MeiSeft}$HEGAU?8raNKSfXe(vcHN51P+1mi3oK zu3!IOb9U|SeShD*UV8c8oz!fDq`S7qBPMS7ySXl{F5P&~+RwYS?@WA==(?Hf*|hDx zK2NVr*G~Vu)%KaKw_p3K=*8C`MBPnmuFR6Z`f^i@-sI1FtiN68=VrEMxa4`K#x$i@ zoWbZ{cxI|y?Q3_LZyyfJ)n%`?+)(9NIqSQp&6Cu4ySYKJXVh(L(#jv-4qboz_xGxA zmo4VawSM_jHqy+hxG-z}`86dvJ&*bKes%V>{d@KAp8YFcE&lfL(OpB|@_zem>dV4z z)xV5){h#{s^V9Pm!+PF+tepKiZ~OfF&(^rsZrMNo+wFN-?`9l6yl-;xhmSwk-{NO; zug$S~HaB&X+BD6}8`2INyUWiqv&o-nS2<@@rs=N@_mirW|E_Z}+IeTroNsn@|DSAm z&Xx3S_ItJU>h0>6mF?aw)8A`l;A0}qzu5T0KIP(l@=eagw=FNcw(_1ludSn}c6ecAX6oXHkG4ld*cEI&e9}T--QhhNWg8x@ zb*^T5FH&2vOgM}CcF}#eRY_+$i(j9*U&DXRTSm#Jm1oxDv*IU)EnP_ zyK-C3=exfpgP*-Aty(Sa;r`G!Q|i6^%(?6ARA-h=uhMr3e!Em^`?{IeO80Lx4mMK` z-Ti)H6}N2u%Aaq)-&gcot_f;p9*zy68WNA&zZlCl24+_Y6MZ9Et6tUVsH{dk-EHZS4& z$L#OhUklH@Z#(rj|Nh$b(XUstyscXOEi^YkPx18ff{E7!VsGz0a^ghIxpvQjbCwJR zjaOM9!!8W&h+!Ad29c!NhjNPPnMs-11=*ST|NpN`P0lJw|NnnlW@=h`W>!{ea$HVs zT8x?eSy{g;+YfKEJdo^t|JvM7+n=AkzJ14g{aXRAUo2m8%^*adEqi*nTl3+&-;ZoP z6&4yDYkMH)_H4!H;_J-W@{XUG+_^GZI<#5*MhaQIi*R}VAYOGH!nu0J{6?|NY6ujy;@pYL3!r?dV2zcU`Y{jb&6-rQCxXD0R5 z|AKE;&&jY4w~Dsd-Ampx`Dj1$U8W$th~kof#k1RFuPoneSo~+Q{M9yhk6Y2aB{y$a z%Kv}KxpQ0gcB_j!OIc3OjZi&$oQ37oj*#}ehYElHPq|h*N&o$wM`u5!m(Q9s{kfOl zk8(a;{kiAv?UB^%Wx4t)E5ECyRQ~JJE0J<%9v@%F^Z3V}_Ir!tZH$t3$ZOVQzPcWg z?qlv{#n#VPsHw#^#iJHQGVcjQz&$)c+SleSUt5 z{~9y>`jj`b{;qa$KKr8f)3rT+-$iR5f4=M5lbL3-JH=)#>O1+`tu1TvF^fru{~uf% z7_OPhyJzRmqWit`zP#;!QS$XZldHRzeA9M0bf^CB7H<9f=YOVUtZtf^d5ZV5{tnKK z@7CnV->SQQRp*zCUw`D886Tggu1sUvl}ezpg$n zt6Iij^D69$V}x46t!)n<+pg)Z?X~27y8HW8_V+a&-ha(vpS)ZeJzH@7oI06ub2a&+ zkDu(fT@!CMk>^kO+k0>QXJ5K`(fZYi?WeT$Z#w@^UM?GQu;(#fNcO+|jQ3yXtcj1_ z^la^djBSAzpBFRSxw|MqEQBRMI*V^Z()&vLc{Tq(MeO@sX?)(-#(b`#(5Ez8Ma`VI z*UeUMdt3SF+LHcm1#Ms5XRB_P=uX?uI;Xz$ef4)u=can|ntA09u6>`Z{o&Xz-6QSR zoAuubmz>^I^|m{Bcf9VUm(!2^+FQZGuxUlLFNb5vGp@!v-}xB|Y6bqTc~f)6(ck&q z!OJ}}?B0HLzMp$^&+h+W|J}A_>xFyYozb`3uzsf9@16Us?U$Utp8UPvpRewlRqp4F zzQ2>_&ib`AU+dfarQ!Zd-`0SEpgub74zoL z5juF7*D>PK!O)UaHS3*Q`gm@-{%Za_rTE@f)swa7V-x>)$gD8jbd5i{X7jq{`b7*c zo^~arrJeh{XQrFbv6?+k#s9GvuubE?dt~OUYs)2XvF1Jz7qMWyeYRl1-M{;%OZZ#c zn??PXU)B&B^;Ib^fBLiEM{iV1-ru|V^VD|h7su0DXO>K!dCWIJ{vhjtublI8Dh{;O z&GK>n9dUn%*1v7CB!wN7|WpU=moTlN0E)V#mVEb&JyhoF7G zWdGbbKjPN?JGO5_)Vu6AziwFe?S6mJ?{)me^L5e3uD{d$wzSVYaljR>-n>pN?jU`F%YdJp1lu|8lFR*H3Fr$rP>ozWSJ6u4LVB zyWN$V|NcClbZxPqwa4@Z<}KcLzsoYDFwKuyrWPE+@#x)0`EK1j@0$NlzN$|*OZL>1 zk;>0`H#zFMn0?Q4qmpGW&*rR=;_Uor{rJbT?XlH=Tf;p+t-p0E(fWIRZ?WEMtz%-V z_E-5`_4+$kFX7$u4g20cs}p**QNf0R0W{1wt!l;JyG z>}O-Y9lcdlBL44v|FJrUXy0Fc%?Yk73@VTKp7Ai~JHPp#a@nKy_@56&*XJDFo4kG1 z>!0sUqPM$?Z?p|hetX7yU&Wt??^a*@P?<7!H=lov;=CA(Es0NmtE~Q0abRVRNVZmU zW^&Go2vPG*qG5~rOJ5$|^=ei1-X+TRuB_I1;( zpDi_>vAalX{R+9Qfm*_5oNBYGPwrK)U2OeYID=$T4>H-hFyc{eSJ`xBKPmKmDHk zo%%1Y-pT1-Q_U_n&)yd%oGCNH+_K&8KQ# zNt9fE^lI&!#O=FJ+wYxUQBZeMX{o2x;&;1h?|7>Gp5d9cZmn&4`t=Oj<2F)9c##^V`4t`Q>W(C$#49$>mGVrk~GL zVeg+aA?cmAyV4(%Kl{Ah#UD3ae)K8k?<(n(-RGyLDThtbSh;(NZ^`ej-C^PHPyS;O zKAn2Pu6ncOJxWb?o(<4`o%vrvJKG3?)LEA+0TW7 zR^@*U*Kg%*SJs~@J?Z+ftcwr+wFo(cC-a_9wpZt2ead-Ha{sgZDN{au-D>{!^A^>c z|K6?i_kVxS>!|RhYgW%a3WV=YdCkMX;K9Ja5Wq0S?f=TUA54a(_hcSC`}6J5+1F>^ zO&7PfS*|(vbIspxUz7YeZ$DXj?)bBa@4sG@eeZ3_`xc;hR$|t)?`p@*eoLHL`s-}f z9o|F}p*EjIKNb}&Tx#5-{9)Df?$f5;hjVt?+5PXH{nnX}iIJhjX#eJNuF!jD41cYU zsjYUrrfes(N$=~2g4h^yv3@UG+2DIoYj3~0c1&`*@HMUK^-(oHQj2Y`Wj^`8JZgUF zeXi+yLX8UVGX|Ms_nPgw zjDGy>?(6)SV0A|NV(=bY`(5Sk>r1PzW_Gp9RC%1fyuKsXTC;e|{j+L%@lvllgQTt- zb?@0I-npQ1_aZM}p+Z*MxHTu1XV3gK>)y2eQ@f(C&0l&>o#(<~&z9?RR#k_`GBB9@ zlQT4PyCD7Uip+zpzi0ebPnrMbWDmc8N3On$^D&{XI?wH&cV3?AIDv1M`q!eewTmpH zmh5Z#_co-&vTSqdq-&`iE591^Z!V0T;jrrB?A~Y&(eIMVySjD7dNzrHl(_&hPcyLtXcUT=RJ<-cW{QN{gsm0Lev^GD9o zd;dM*!ouAPc4fSJ+fkjyaa-sA;e%ah%EZoCa$v{Giq z++EMLt@q{3lV1|ACuzYDB6fe1eA}$%3C6RTYs!BImVfNqaeI^KYv*add~aX$?E30# zKP@co@~;0;Q?#F@r94@&rPwg+O|ReO_~mvldj79`WqvYWPxjrPb>;$>%kGzGM#P_b z$r;pIJHg`ri4!c zu`~Z2J1(@`I&OLpGV+n%#`>QT=xrEB@Mx}SB*FffSxk~2LMnKaeVj9FrD?jPgn(~G8@ z{j=!pnN6mDDk|n!=55+Mxguvym*J1U2|QnZv`%|*KexN~-LBPzTh~X1+}>CI|94Z^ z$F|$ob~OEuU)%mV@7+>4IoHJE{EuZN8MAK4yfwCb#`E|G-}|TMviltOec58J&*Aykf;&2${riKh z9CaKye)^5;7AL-$w@>ao^Ohw^(y!mX+VV?(-TUiL=XG9VV34^sZ;iKwcCmB8uWHTx zGhZD}dT0A`vD|#yS>MC>-&MI?U;6u!r|+b>=8kWZ4E}xPe9y5)Ir;W6r=?l%mg$_* z?2|j`m$@T6%zOEbRVl~qb5?xcc=+2P{!g2~FXfk(h#P7(%4} zv$#*~zP#{uF5d@@se5l}TfRx2|G9Z`mE2~{cUQLUS}1k%bmfb4TGcyl+>|V;K9XDe zq2<7|l1+ya(&rnWIR3NC`iR!%_Ok*a=Xj_8SB*dR-*Vo!{pEM~`r1uwOWyuwlAFA> z0eS#QLo{Oeft7)Qq1r5>QzbhsB`P{I@BjbV30WCwDQQL7xw*M9ap^f3**W?7Mfru< zIcZbO_Rp4H{*6DlxM64I_qTfu_y3*!R(<~0mUAYTDt^Cp^={gc`|b9<`#VZ^KRt8$ zc8qk};iJ25%ymvoF+I;SQSE%x@mqF3_WZE#Sm*HZIA752;*?m{buT_0j9|R@rR-aE z-Tlp%KZ?}7j}2vEnBum7_DipwQhrxu9%LP@{Q6>ZJa^{)|Bs4(cF&#rFz55C$10_^ z?X873SiUV`e^adaG2_w`H~q40UsgVv@qcpnGJ)z>I^NIbr*oX>_R;U?n7x|!=+|v> z^EPiecUIy3uTN>NcPmmG=L>;z{aVvGZ?MzPmX& zLfv9nSwGL~XZnSAP3?{x>$-98M)Jv@-mg|1Fpm9wHCZTqYFqsF_y&8^zRz#m*?->s z5|X!X{_)akkDm%Tk}-a)r3PtBy#Bwevq-GJu>Gp-Kjl}wy)p77TlMSXTgv*JgKVvR zk6%n)l_6&(-dL)d!}&JCKIQO&Ws$-Atdn2a%kxcZ$QPNdzItM`-k;M8x0qTkES_8znS;rsa(|Cjpw&zA4}Gppxo+0Q?o@#@59p5S}YldhIkzp411yyxYT ziC?Zen$307j!5Da&Y$<`#P|4^SoVXv7Oh--cY3AsyV~&i1;$@W-ks68=chFH)T$^I zF9wr$a=K0joo3wre|e?d*N3@j^Oa-Io7=ys-J`kA-jH8xH?yGT#_c~&+<0YuZ_dVd za#M|uJv=P&OY+g)+vXqZt{>i~CAZ_W^p-QuM?{#d-+pzr`_TLOb4B+29jAlWs_)7d z{yyp8%uI7RLxvD0`ID*>XUa}_#?U`+pYwn7xAWtxcGZ7Ky}RY|6-$Zdp+!L^l@q4l z&$~PS^Db%a&c>93?yWH|@0V%5yKZ>IXx*ht_nX~oem!4pW6u1`MzZ2|RCM=;lXf4r z_Jq4tTg#UHc3)>NyT<(JFC+6XLFP}Mf9k8IL~+h@g<*5&+pwLgA& zyhE~dM|9x%mzA&W4Y$~JsCZUS@;7mE6Yx1z)5ms3aog6M95!{kS?!r~bJS)(OSsx< z*LU+>sQ2=I|7R=Bink|5@K`D<%?q@CD6%m%$~V`0zCyEO!P`yNi4wPB!lo5vn|wZW zi2VYK!@q9vTJeKd^}fEF|1r|1t90t;z1E?<7pi}x?0kL5slNYu&6ctmQ>EgTbWey9 zU$&G@$uFs~JuiCV;%%V@k2kN8d-bU2&z!QC{{2S(Uq5F~Wxbl|SIU0-Y>AItWsxOQ z{Pkb^C&cW@`E;d|_jg#-%Q)7=(mQsKwe>l#FFtV4H#Fn;fmZpHP)|=juVd!5Po_m( zzRtC@Ct}f=Ew{?QFFiDSzqf>Yd2Z>=T`w->_Y~gJ?VP%{Br>#AyLQ8tnzc`#M((L` ziur(e0A`7g-(dHqMzXIXzl zqt^e}_2={Ka~g~7Z@M>{)$jhjqYKXTd7X5|ck(Lca1dnB?URlg}^R* z(|F^hW&x(J_wC9OKj&k5`urvPo-1|BAJ;LpSwFk@^uuh%=P$2%-dvMXTylN#UWQ> zZ+6a#njiXxHAd>YZLHp-FB{&)M};bXHkssqx_aKe_nz-#iWj)8uPe8$`&~5KoHN?e ztK;%%{oPyZe`MY{Cq8AGgqP^a$$b@@U+Mq7^>~ZgyRaqPs;jfFS3KRxulDku{a+)w zSv$gATa+4?nQ|~QxCrIny>I+5|M9xt)5GqzZhl>`t>Wdo{}X*rSASk`t>*8R_*<86 z?=LLcvb*coA1Rgnb+!K{K5jdDOWZhQS3=)|&1N?g`s?kzujI@ro8JH6PG)swj$&Q1 zzLE^*&CYDSy6wqkGHxQT{GJLazA*K>w?Bnv>GH&O(W9T5^W(baiZ0i?+41k;_cC+# z+m5&7@}8Ymw%+}zpnmylZ{ar?QxAOInZ7wp{9kYVid4gY0Z-*`+zP$wa-HplMXlVN z&HMk|c@$;nmiy&MkP~0!8vZ9IcbJyH+8)dYYC7qsmd1aZpSRz#{>oPyu{rW2o^#D7s5uN|4T@X?bM-H9c$_D#REG*Z=-sz5OAB$tkldxmt}H z2lIcVe%9n}ePt&zv;Fe3*|s0Q-jEM|;u#+O{7p{TOwQ{^o~xDaHqDjt)L(UX)~@`h zj0wj(?EZ%QVAeYJ;l&EJ<)`gj{7$MI{`~$h(>{g$}ToQhNZ~p$h<=5xi$e+pDW>@Zi-L(Hq-HluKQ?Fn4t$uX! zn*4S766e{kc3$uLa-_6e^J-9Mep3RE%M}m5Jm<-Gk8gS*ZPhnDGxpgR^H%dG4?h%f zicju;T2mgO6aM*W&p!s6XKK&#`#so$E*)SvJbPk^XW{(6q4sxc_IZ2m%C|aeGkw`N zpW`axTejNWth~beaO-6qQ?ty~N0#1Nwn($F(L3#Iyk=RJa_p&agUWMx_D_B9q&|Pq zT2%0I`yAbz57luqoVQx@#?L;QU>-4P1w#qn{2Y#i#_O@mE?V;L{CLzR@3+Pct0(by zm!DtfcIIH_ht_SS(Mf(OSLaNbbxTIaT$I<{WP6VGeGBc|VaA&a|Ao((Fnjs7_w(bD zXZ{d8rak%cx@AiZm;ax1`l1y>iC+Ay?OF$wuAH3BsAF#__wJT?jjns)`^md+PfxS! zJXzKo*8RO*JN?o+c{6#7x`R`kxYiZ1g|GeMc0JtIEBeLte!raMA6IPFd$BrLsjhs_ z6zQ!0CI;2hlZ&c(nHhV`{wLIHmxoJke_daYIFEn%?7e?)oc_A!*0;R(*FQeK`dw+4 z^Xr>C#N<|rRR8+DzOV26-kmOH{UUDy-mY6&d1&2yw+Bm?FZ!=r?7Gyja?<@qhbPD4 zB~ME(-kVghNHF%w`Nx;}PfHji#C+0IITn?s^g`&b_|e1J4|8sun`~14|KBB>ZGLj? zI?ukoTmJF=2HW}-epym-=ASBG1|Hk-vnHnVoyD%US&Hr%_ilE(J0HI=@2z~G`kCd* z-=184{#*XX7e6V%NEwcj-XD+LZ$>WndB5ua{W=C6KJj;I2O6Wz*mqP$mW!S5u2?Al z*D8CK{^v9qchxo%!=HDv{o~JVetcWjpcKmc`(N#mE&C7Q_J^L?gufT_= z#?|FLHA}74R>_{sS+wKpW%2G~eBu3a2h=lVKi>R1+crFE&8Fke4^-P)M6ksCVtZC0N(2V^q8*lTfwj|IJtFPqX7@eZQM2UGr+uz7yBAE${3tDVbfq_wA7% zyM7+ppMUN8Wz~Q?H~zLbg~#e%at&nr^5EgEe$nuy_pfc;|9zAFFNPc8&q`(%?OFZn z=uVycM_=!boily4^Tyv{%=!};7|v{EVGCi^c@bZ>YW~gwi~lcupTFO|m-*R(8`1VI zw_f<~mulO6{hR3K$6LR-*xKdVo0sNo+-MV`aXjEv)$wn4pU1twS0DfE|KBvuyUbbK zvjt7Aw?$i3-FzE%^`|{gPN?jxo9FqyT>D^RVKLddgoEMFUIER=Tx^a$f0w^b{Q59J zhU?jjRI z$StkHR;VE`_1;Bi_g7Vc>R*~t-Ag7GsAzY&fq^XxhkW$+DiBTvCD;3 zJ5Jp`yHmnwY0_0G&p(=*UGD!p@!h^_v#a!`GndZWREq78F8BMM-GA|3Jm=9n9);4( zw!Pt|+jMuR+E%Oh8+-8FxlZ$3SjH*0&6oq6(+6TR%w z$<~Hjj(^J8vDG?d|6M7r-maw=79YK_F5jwd!-8d>>m0qW%$~JuspN$RiJpH>*uLgp zd1Q5H()Cr5MVE?qTzqP3edg5L?=jn5zgar8Gce@Hsmtw3eU`K0(OE{Zr?21ZRfq5X zYI9Am>+S0jLz(i!y-!cyIx|1@^{b*k_kv=6wd!QPUZLlwXB=r>8Sh%YqGZOosQ>j7 z_DQ+4~bq?Qf*k&0wfe)4w!*Q*KdFJuOrgGcfEXlPhRyO{k_wD+#Tt{9v zp2bJJrf58RU4Q74*_5A8N*fqMHnI7Cshst*>i^xh_L;jY-_1H3E?L(o6(*p;kRrDI z4ZniIUsLuSv!+d-6*}K+x2+0#so?xKvmAx?-;(ey z%}lEiIdT5byyjHzv#b21CBD4QmMUMT-S412Ki{B~;T?N$%LBFOcTdY~%euG4*P2U0 zmNgv6M~o}5F)%Q!EZj0fHY+RV|NlcNDM<;1c?B6cxutn|IobJz|No!*|G(0QYjY_h zN5vw`1E2o(Hf!gV9jn_H`2A4QzlVGOut)FmsM^zV@VEcdWS^g}iaG9X+Hro}C5z;j zw|;mgmY=xu-Tr^O>E6qW3#{|cedatDW3bKqVOE3M`J|IJzYT0!ZojU#yeI$i=lW~M zi%l41?pbV{RN%tVZ1Adn!Oy1by+{AtKa(diyYPkW!kNeZ-n+3*aNhOj-H-RIei-d2 zAhlVRSO4hAYw3&m&WCR~75%-`_3ec-8q3aE{kW(7@|wcZU)hz3b>H3;?w-DL$0pOF z((fx)G~Y@1ROrvjta6U$^J4A04rYHJ2TSZcduXr!<@R6io~Ql4pS`KO@bJ>#mGzf% z=g0S}#5(Tp_w{%_m?zyH+o4voxh|W62y64Z{^FH}!&u5!A z844yl|6MqHxzxd?sWRpV>-XoBy-;Qlik!2(Pr)wW3B!;7j12eoudIrDak|=W|Jr?f zZrS;D4{L;+XuPg1l)$bpB^d>H7 znuEuD4Zn|80N!`|yxn~X2zyDhOo3HxV)KWqJJoCDWBp$Z(ZDO1LUZ|Mx zPI%T2uO*p+b!UyW$~UH-)Y82bRh#kYbz@Xc@(ZIa2^XI(*;_p!x9R4Yr1((A|t;~th_MI&d4)6AX)LO^1`DfwR^W6=1#u;!N%Nxcl8%->u`6g zGfLjq7O3~PHJ#)$ot;?4wokge{m!1L+r-?bM~0g$zI^II<|Ox*J2f}gOG zh!Nj6_xjn(ilolB{a*Xkx__!%g-qs`pQq+e&W}GM_VMNZ#dp#!mqyz7E_T@;J8gE6 zS%l-pbtcR!=j27kP5Wy7)zzY@je$*_Cf7>LvWTo9z z?kA=Cdzg$cd>g%o@IXENe^t(S|%;zlv zYKq-Oz9^kge_#CNgXiRDtr6Xm)K5HKy1hDVS*Yp`jl0+G`S~nQ)1AxQzt>mh`|;>@ z!@u{1`TrKJ?{}RNsJh|sjnH%6k92-Z%Fise`j;I3JH>iey8nIKw?1*dEn<9Y`_BhN zzY=2jKI7H4*xcVfua*{^-kawBgZJr;J+C!BDi;`5fgb zapSdqW6W&zIDh@d<(pP;96q*wZ_%13r2(_v{B3>GHuuCcweCl=_HBMkRp$9?w^|w>O%mCkjX zCSg{&ZTIVMrTw|Zx3)gE+owNg`CpIOo0r<{u*-{Cz4hi(<#J_?m&@h27l)hFwCtb! z^XH|V2djg4pG@AS@a1|}`Mva1+ttqVj>e0xXD^P(c|1!(>%HOa)IU;U3^hW#J6~;D zduC$wS%xpQkL~x(oNOgC`&wAl_4fOAw%h-ftT5gwIscs8m8-w|g=)80Y+W`jJROc+2P7@}8UfeYL+!Rm$ZZmlyy2e*R5q?0%lj+^=t%oIToqdyeSQFvc3W@Yg~O z83nVMYwB~#?&gNCxK%c9?U$D?mVDYM8@%dw)Q>AMyWX!@$z!&Vp*HZEaM3ciw3UB5 zc1B#?F7|@C`JTVn?)lRbirLJ6?Y?%j_~3u(U$6FZYtNk~lhff|d`*Hu<&{jB@1_a7 znYnx)J|6pe`uG2vapjvs{yw?=Y5Su`CkxC@RjsIOO_wc7PMv-Ei`BD~uT%H6HL~Yl z+5S3ANl?4$rPhbZyYiHq#OJvExqiEP>E4p+M=1pfAKMS}Zr6JEyqtZlesDR*^`EvO z@7u$8bS)TcUI}HbR9V$@zd!k5hu!JyX@4%p8`jpH`lYVlXO(Ia8|*Lp(Z2WOld75< zQihw?nwH+4=PbNDbn5&Ymic=*#P3w>k995Uwk%}!&B-*VIBtI4=I`J8uJ7KJRXzOd zw`&f6_Ezps7nT9vWAYQJ~Nn+u7V(hp^A{;bedNv{vP@cdHap_h_LU)-P9E?QW`;vFM=;Wjn|Ajl$_!x998Ejs`bkz6LSw^wr8?Uw> zz40)2_v`eH+Bc#J(M&v@an3N_y1qLOL^>bG@~ad($MIs$&(G+w)y zzplf}L-{D*tGtcP%*%6ne>NS>bh~IZuca=n`1AAApWg+)313)KZ+HIi7i)9d&zuY) z_d2f5pC)9)kofa?%-$c7{iWxkr^d^zt=s(b{n;h=w)}qfeDTu6?9D%4CKf%I?YHRJ z>D;xy-+foPVbq?^@$%oHJ~iH#!93hEy=Kmtz9Vz;-LmUH%=VqxX>Yi#)nn~d&NRWm z?kTQORdWU23bHYnJQGNM*UZznu4cnXl@?O52AHQw4{u&E8{$=m)_m`Po`aOHA zy!&kVi2YA4=F2~SyKM8%pU>8X@|As`VDfK{b||;=txHKF*)x3ty}#VNv3knV$nbz! zx%_!*Y-g1>_`c$2|2=E=w%B#o zT+sU2)l0us)m*t<)AOmj*iHUPUhmhVyVH7?PgZ{R?ufYiu2b)_axOJiPyGKi^Wiex z>z`j)#u+U(Z=2V1fB$QXeVU=++hkVGI&<~?l-o-mehmMnB=*B-5pRztgUdG__6QaY zUY-vILQeyGVpo2CWxP8p{kYMlNz>=~OC|! zy|0dVa%0O2)1=V7=lNs1o==rtetWj&H+8!gz5(mgDvYleeX-m9{L}8Umo9AkT%6Xo zdxzU^E`}T?X9h`)AGJrDtKCn^e%MC+imsIQj zHeH{WY+Eh5?6ZNz@uXSJf z?{yW=Jh84-Kih1rf9Acud2w5z+T)ta-~O97etfyoi21OvYV?PFA^z(hZvEKJceMNa zS%1Fv#WSxiy7hn6UHiyKZ!#2#r zY}Jn$ch4`DyngN0fBs6<$#kTU!C0MbZOp(Cn{HBX9eu)zpZDpVXaHSrL!jr zXFamJVcyfz^Ks4Z<;_>pW225wY`RBqCz1+DedE4%p z&l5MR)n+=ZshB>m;&hsH$XW)Yb$_ha{5&eRd_B*r*VPRH){k}kavvs}eR*Oiv-Of% z+(u@Gs+o7(H$Ua`W!PuW(C}@2_y7C-lXPSI=9jIxeeUb#Pcf&erO!uxzEV?K{q=EZ z)s^1c>2LVH^(_6HR3*39{z+1ug}}|Uz4m9r*~JZGP4|>|>DJD)Iv=|-r|SR9-;>+iQaelW>DE6@L{yU4H4c^kVQU#;2{Gd-;|Hn;c6#Fw8+uKrLCvOYiYRg%=#z`1@^ zt8c4(2^C+t_HXyu9jCAT-Td^M=i=KkdB?B1i7lLX`TH(=$HV64)|`_kU(QyK-aTvb z$s6~!?qAh@bk5f!y01;9w{}x~zPFuMAVc>LM zW4pcUK3w>|`1BOc>v@;oo?ATAJ#*i$1-o-3sedFf`I9cv!_)9o!jdOYy$o9Tx8-(F2wR{TO!_R#kSyveh_uKM`R z{~RqObN}VOv)}(A_RUje(H;FCm8wPeFW>pLcuTJ6om0;q8=h8AE}i+`f3{exwV2NJ zwA(q0*Gm3by|_ZB?2KQNOl6r(H0N{nm!>yjr+53NKEJyCjMn|5Uv_wG&bVIocXim` zFo)>}7O&jD?Zk|jI*T*aSC;pAJ05e`f3P@*Rl|gdAuh|NJU-8X*`xRUzd3VP&&ck! zSa)0Gk^P&jrkfdMxBKR>Og{bmecc*c(h3}`1#kVyZ6d3=L=W;Q}V`Zv7waXyv?&uEABUEt1hWZHQV|7 z#R-jXDL;HChfQmqDC?Or>%;n*H^)zX&p-0w&#ki?Zr8o}vFcy)$<140ixcAFx17Jm za{KgQucp!qYQNVlk-KNpv-#rM-R{lHZvH6jHHzJJV|}7=qHSf}S*0h}zNRI=k}0b< zh|qid`Ihbcss68}ljYuJ%(Jas=0E+(W_`V98>-^2{mC&td}I64#}k`Zh87f_zqE^Q z?Snbf10Kvc@i{N!_opfMFY{L_uc%mA&bwc*;*R~>-%EG&oYuNo`aRQnid6m0ir=NB z?(SQkGyR(D?tE1Kr<c>rYXX$jOrTZ|3ndE&v{7&V- zB=5WNc^?^bjQA_Q2bSvkJ@`BKL;P0G6Klf@C%oRNK3R9-g3S$gPIoN*sXOEU>->o) zH#Rrlv3(ly;z}(`_QZG2;TMgbiRHFGZb(~P`1QsOms73L>uut)nU6BRy}#`8efht- z?H=W~8hu~cNKbNpWvCY&_5Y>ZFaAfbZ@tJa+F|ifW_Q&zd(Iom(l5W2alhW+e&Nyj zBlY`d%e&`oUv$c)dqvNTt>FicXM6ANiMnq*`LfNjy~-_5Cr@ubxQ6q?T~npss>>2v zio;L;KBv5@XL}OYAv2?ZOxw4CQ(PGsHV8tGxnSr<3{0>yFfc4}=DQ;G|9|!W|FQr7 zr~m)&`~QDhd{j(iLSkfUc6!FYo7MB|m@hCs*#E!AeWjY~g1N^+ebye`XU<$|TXk7V z&pYG&=jSKx>gKEYe@Zxi_*YB%_w}1RQ#L#;)C~WT@t{pG^L8bEA~ES@#Z)_&aM9 z44jt^JyjQvA;UzWO=$h0Q%WlFu%8N7?i7DSma1X*qOk-C>9RL_c$_v;X!! zeRcBbs*@WXX1@8D>>aOoY4gOm@5OODcgZd5t76i6KQn!a-!unp3$wgm1%hu*DhGdb zF7G-y`*-=HCntJJ?Q`b7DC)W5@x@_gcJYEcYr784J<}0#=8^ixj0IP%w)5MSU%%)3 zd^`$*V-mr_1@++NEu?adxnhwnyLR&QSUb?X_I-g$d1`_5hd|J$PZ zQT9Lcs5;y5eAn-KXRnHxZ=WYrzmxT0)}y)WPJMIYG})CZ=ljQA>ECmwWy`~R-#;<% z=yBM6EIPF?^FU+!`q~*_4zruaf{H-eve)a@~?rH3vzi&@#d+j;7 z{c(YO(d*4Gubg)*DhTAi9D6Z3IQ!9wwCOW#a(=b)xc8~^S5~RLn=kR?LV}+@)8Z7@ zo|jJ&W3L%5uimvi*W%v6Mg7UW{TEHyn9u3_I{WlN^VA~C&r?%fu9?i*$31f$kAa1k zd1b&PgA*#-+#Y>gc$N9E+vSh9f>szl57@P=eM9~tlVg7me10i^?e1}%<&Hbnd|!P0 z_I&0OH|N~>xOHQy-nO(GtEO(UIipjjKlOIvv;FNa*5)mEAzzo`cW2*1yUP31UqxP# ziI!JcWFWGUdFDO|qpH2%<_`M>~?%9*|&t~LLOZoHham%+4F@M#fzRBm5 z`zhXeTebJ7?N{~m<=>*e-T3ML+P9~yM5rYC$iX9a4>qRPKhB!IHgwwMrvhgGqSjc| zGS4_W_v^>QSN?m6`Q6*JaL%vam-sZ8W_9%=3vD^$=jSrCvp7pQ?GIPa zoERN5drj@%zO4aGS8b*}k+@bERd;9Z)voPj;yNBt0Xep-3rY+O=gsX2<4EmocsluX z#V1AH`OR;?e4E5ywqwoTJ@S)xP5P)&QE`~R@yXA(3X^(Rm6tmPO55%H_2@c_`bo~z zDSMU7?85999E)AO;a_8O^M=mc?Cfb5GIicE%#*zHCon13g5ll8=f6Tvh(*ofy{pbQ zpVhkja_)CUWj{T6KkYeL{^dm#8}=Trl1Ncr%YAp_=1njC`foqJsZ!g2_prq4&HJx@ z4k>^8sdlZbCy%Oa4=>xb%Uk9tBu=d7@(*3L|4!!91IxP;cK$;-FtKPb-y#C&S-Lv@SKEC{`?(Lqfmsj#X zQJp*cVO!|bl2b98wwC<*qQcfI9bZkCU~ z`aDm_ICk;p4t~q6;=3lgIm^s86XUEdUe;c-e%17u5*ZB*kM_>Dd2(;r#)5a&&5Ouj8D{f29I3s>7;p8nhU(DQbeu6OI}!>2DaysLDt>&M>z zKIiien|f6*eSfw*v*^mx+3SAC>aU&kHB{E$e13iOP0a_ZCnf)idG^iO#-g^blb=Jz zy=T+rW0NHF&&DtFcynuBSDDk!y*2x5Is0CJ7PD7h$rjQW@nZM8xtHend#n6wb$GVt z>-B|!H_xr?olqXR|H!vj58wUCzrW&%-F|V)M{L^XPo?ah^6#0p*G#JqZBlQ{ns=@$ z%htVhy?EAk1FielpU)K0@%>!+YyT;EpMv?;kFd_2>#eoVXNkQ|N#E_ieO}Ko*YM<9-_AYxl0G{v0)eE6H*tz7d@er{gA zg@sC$+?{z6z1g3`4_~fKx5_YnyYp7PcG;^uvF>Y2=2RPu6q zcs&XC*=egAO`cDksJmOnR^V)Z$(@-;S02-IUUqkF*#fO~rdD||MO9lb*S?k8Z#6|& zuJiQqiaiDEBHwzPc3!bMbe*x=tp0NAK;^2;Vyl=p z*+v^fBwrl~eKNzxk9+a$i77u<h}TD#%-?9Z<6 zFIqIKAF;UR^lJa#3A-n8KHRM&c;l7x&nuSEMGZ3@TJ9N~R9mI_HfF2e-qc_p`AI5F z+cN*m&po?j218#x1H=A~tNC|sW$}gNPyKey)#h{WC+XB{-@Z>@|FOmJeO>bE`A2WF zU)r-`dh(ask3ZGU>D!%b{Qmpp!u_|;o&UZ3^-IU+Y5tD4XC7sPJ3Tow`KQjanAtyV?a!8^Z!c9UD?axbu3UM4oBEoS z<;8yfyT0vSu_Y{<-HkaZblS@&CK7z*xo?@Q%|F!s`-MRQZ75TX*B|Nz9)KzZ# zYy&#ZyI5`F%L>D7)mC!dC&j|u@4IT8{_=Oz)Ynh5JdbRB7<5reI>bn1_1~?rIpo_rtAGFN1@EoMdoTO;-|eI-C3&Vr z+~w0e`xJK``{QwO^Yy*1`z9@aeeCP%I~L!6wb}V8{aO2I-{Jdj_r&%7>JKcRnX&KF zU#*wDL)>aSorqN)_t9vsejLGc(o{U!?#cK9__O|_TlF5_)O!3Rq~wYc@Ka3 z{`LICJAb0Tb5E|n^jvb;=fG!YbtD;T%;xt`*=gEx>xKOPjS@)`i|(G@#dZ0j?ADw4 zCHZ{w_vaZ&vV`ZJy>w|t=**)Ge(S8KpRaM3^D*u7y?#%5`|Z)beXiCbGI zS6eQg_~NRTzV7S$|D+glwB~OwNpt$A9di2JUb(_;hZTaBoO^q^?7Yvjm+v+|?p^a^ zOLyHFH8bm3zdr=!t@rH}?i9UtsBX#s>^((~-Nb|Qj`Xd#^l+Y$w*GM`?Vf4f+)AAb zw^Rjd+;L-Ia1nbi{@>!v52v-ePFt;czC$p5pPxmzfB(AlM_*5#K9aI~;af99=C#Vp z&mDQf7G?kT(g8jBt#_s_%HFT|@WYw3(pJ67`u~qT*FNT3yJN>&zdTm$-}@!=kCZZ~ zaOqEe&v9ta*}k)k&whCdm+n1xXYciklPV*kYE|ccxx2$$@yg-+WB)AH#UENRt@$du zwKRXTTiL@+cFW7BU0!|e&ea)SMYBX-KFc@qog6zgG1#W={~Wd`9m4JNI^-uMK~H=3#Q5dTq%bd*^Em3?WkT z(N@~C@AIwxXDj}C;=47E?`U7ESYf$lmY&|NH+-+wvB$@6KN4Z~*JF=%)!t<;P6zV; zEDu>{bT41Iu-Y#~)MG>aQFTps(|gnI`+R%$j3eZv^*{Oh`;6DJ+?%%~o|VPss?3A5 z;BVWuKQ}(EeK-H4!Iyv5wFTzOSNnACEO~aO{Q1_k@24i{HJvS4s2aD}ysXGfz59=Q z%7kr~?^T_C^7p=evCf0+LWbDf@XIC*QVdP?mZ!E|Kfcpq%{}><@eDHG;snZh53T2O zee;ar{=JPMt8P!0-={YF^zvs3CZ5XGQNQm@Gx;9$JNwbaeZo&y{C@UTcdb=Yh~r(C z8vj0}{s%>m?epO)3>PdD1WS=Y>^ z!}p*4&-A;!!XNpk=kR^7+g~`pYG3p{?}tGry3&_i;aOYhXORho)@7uN? zKb$r5-k+y-Q|-mR9aJQT zJK0?YOa0H=TkEq!7B?^~L5v}QZc=^oZ7+vh>i_=<|NmS6|6dp#85x(Dk@5fkr0B?~ zxR`{vlNIGK^M{f9m_TJuWG5VEq0)wXfQa=Ws#Y!&dQo|67%v>nkHq?VDCv^Z8TC zXZNS`|E~TVef%kF>AZ7pg^6~N7gK&8KV&#-_WXDEzKd+H{{M5$&pYdP-uxGN?-OdA}DaZ@m2A!<`wo9;cSid7O3YzW%Z;XW!afefRkHUGL4WPtHAk_-p*8lPAUV z4;|ERR;#hd!UGiwCeg)8nv?@)cY*h2p3Ys)P*@7FJXxy}D|a+Tz~GwM+` zH(%WHlG(|xI_K)d%nKhXB+3l0mLyyHl6?^BrG5Eu$?)5p%R9DJI|Uy)wq&c2&(>eBS5Ka%uJZP!^X>M#7w_)d zW3i&QmbX=U@hX?FS1xipH!3okUulIv(5$T@;JRe7v9gey2;?2GfTBRo6yI;3(mZd~R&g+VJ9P~`) zTN%UeTa|T-?AG75DzXk0H*b#2v{}EP`_wTzp`{1*U&?bRy(Xf)#Ylg$a_H*v8Q#m* z*^2G;y}iOz@%YWX@B58|%T_f%%wBj&YoEc^ZIw^&@tbWiyC=EQ{cfV?r>LWKM^EPb zoBHpZP-(r4O7hM0YEk*gJ6#@cd~{o0wB9FM^xrt(Y;{E}h;TC?;I(T)SuWOwF^iWK=d~y!QHGd4J`~>A~}t zZ?3o{UKSg?E7_j`#*)qqp30|IF25!g9n3H<^3Q*}sK#7rt~)jR}jL z_;0-|IkED8$vg2)$tBTc?LEg#`cqG)9p5phE$ZdUO*7twY)Dt0Q+rqFa^XbwI^ReC z_SF`hd7u6JoZU&X;?GMB|H?2-;!Pn-AXUhDPCV%Bed-_tl!QMdEhr*l!umRFtXP*Hsy{C7&U zSK6xTHT&0XKW?gL-hR#a4%7N|Md#+NWokdRVdcN@qeaL5yyh)gbtKoiZ@QRVe(d_a zj1R7_-<9<@*#Cd6LG|0#u1n{OydER7 zty3LlZr2XHfA}r^!y1j;v%jrBh{`^x@>x*Jw6VHeeDdy>FAqP}7eBps$EMG(Q#60< zc<|0y{LzsuH&~yqc`Cbae^+j7W$8J)y;pBHZ=d+T^V;p_@1E&DvnlcT({(2>{8_!; z;+^T7YzsX1U)(>x;qtS0xAJFmbx57PS9VXVe}B2ohL;B7jq8^^cim#wc<5vjkJiaq z_tz?hFJpYmVW-4!&EwDh`^k{gtW)~$#+CoN-aR$m?TgKsx0}DTe0ukHdST_B_%p|Z zYcj6=ogKYj@6`S`e?Q)AEjRoA_4v}i=RW^B``3H++iOQ}m%ra|-=BT%6KA#hxqfr4 zXWgFKXI8y;-K~vZRhPUwRr&$%B`1m!?E6mu6O1{jQDOLW)Hu_kEpGjWPp)K<#2cO^n zyKss0VylyieaC#W>U%a!yj&@Kyl&&&%Mr^fHTFh`AKv{l@qdld^1^rf%&%V+yZ=7* zYl-Id_;=@yZn?zMzu82%yvO$7Oz*w3)^66$Ik~6r{J%oK^1o9Zr485Kol<@6+nM@n zz9$>5XPQM92jwq(X*k>Nt_ht29Thu| zBz&@5x30fx&END&d+~ec?d8p$%zS?Mj8*gM<)1!9&ypR6bO* zOgLNVm(1<>ZKt0fTvu>+@{HW||JTR=zvOM3Q{Gki_(Szu-ShnHd!2K#pUt+0RC_-r8i<xA-~M@e zGFC9_x83y?O}68hIqy8H8KpQ= zvvv;cXSaV#tlhgv-tnqa?3YcN^Vq_#9Jwgg<~P@;!)2cLECvQ2rT@{jPbN>>l)+Z; z_Er0lckRD@XZ2gpzr1Cd{;ui2rfyG_dA~4uHS_o7EXTVJ8tsXCvFc}8pz&F!D4tsH ze{~Tn&L=;KpMLOquY01s?6>0wZOx-=YhS69GP+3pSDU~2`XZIu3YRwm1rbNR8EGO}ym&zhkspufSpd2-i?;+W)0a&j0q#S@-lk|18g& z56w8_+vhhYug>#Y`TEuB%dv%DHkVDb zm^q;)Cu;7ycaQg3{{D7K@%qZ*Qf=$Im$n{}DT!S9GWy9pF7_EyKL2>W%I@*{PZ#Hw z_xz3B)oZ%f&q=LN$G3yw&E9thGyRb9~q=bRMot@UA)UG@5lU%^(()d{^aOf^(WhXUix3L@ZCkr ze=u*}S9j%G9o zU;a>i-BWq7{odcJzpBn$n*93u?(KOo+iY+CQk{Eu>(PYY`o$fkS6t8kX?w|6xLd6M zu54m5^kzqF_>$A1Um{Pc&v{=O!hdP`@0cWK6^0M&3?IH0>-~B<-(-66 z%7~cbOMlN@^)~nVWApCi^Pbneh`d+!cIUnOwsn6jboW>8-P-r<@WJ2hnKgC$J_g+m z*7bfgabWdLLC^+Qn_r3kXrQq&Iho$u9mfR0HVr6t`-i0|ny~eV?5~e+w zCMCV?*>ka(v#VaDJZY?4^7gOmCrKTjm(g#{iuqQZylcpARbyt%I-h$V?e>3%LQ zE8wg1iB>+i{p;ho|F!=Fz1?hC`#09FW>wREz2dX?uAaUB+_-M1Wc%BVQtyAo+tn@=)dl|N=bGUIggUbo{DW{3Qc z@ITl;Ip@ve^19yJwW;jFH#hE@^80gkLCv*)-C9$fC2zm@{9asi=F87be z?Ds`de^XktZmbKg{3dvEox$?*`wiOVJaT(m37VUTUR`&iQUd&i9CmYZ?L zrHM}t?TOm8sr)q0vitJ$R3d_lvvSTlzH-iA<2Bt(R!;kgb`SPPK-;lbdCt>n? z$8=x2HT@6oeAwpuYSI0#!4uz1JQQ<%#jbB>zwUhg`^z(D-pl3BCN?Sfr~0p0DsRD- z`7JMR`oGM#`SCHEHr(2AMTz0dTf5292U;qP8@^r5&6%|~==P+0cO*=2iPgkiP5QfU z>l2pCj|&QNO&<1ay|h7VYw)2|vH4o!f5SRg{{5Ej;JYSIZtDCRj=Q?z#+!7{)|j2m zi@ccLUE3ZMeYuB)<(u6iYZk{V&!(JZ)Z6BiD|_PXpC#4%R=t~8`ua#(p6;CE`^6(> zyS)A-bK_5^*4FR^iSjvzn>YOB_Z54wJIs5(h2fOvTlXHmTlBLf{?AOdDSSciOf6-@E0H zpS}FsdCaXTp+M!v#9w*~r}lO)H{}i9f9|-(jFzs$zr!!H*#G-Ky>|0`^Y>4_*R9_F zH(*wXcRGX0zkgHX)~Lq4IP~rP-l}!ae|`9twZ49t^nbhb`&0JW$_YO!>5ct8_vzo{ zop&N?sy-e)_wt(uyQA@E=3aS0wd8C5*H@P>%xpi%{q5O~c(Yl30t+;MeD?VknsN2C zwfDzdN6>Aldv;cou5eH~@cRAMeYR(~U!Bdb@6&(3r`qXB_4;px_Icm`Tq^iJasAvs zdWP>+rhNM99sPcPs?7Q`vp?$eouBE*;453om~9(=b7u1{-I>`{%W_s1AIhEDb+Y`t zx=2OsO-Y|ik#l)(e>0T4Dsts$QCY6+JD~^j&NA}lz31QguKrH$)?(dnr-LQl=T$DA z{%}j5I$KP0*}vcGq2`&nemc`{>D}%PkzY2^SMyg{|GTcwzcTmN zKc0E5v_R&y;OWm-)^EK#?~CI7E&bna&yH4)%`-C>^EG~-WY|07@Wb4aS$1V%oTrz) z%Q?Dn?UQb^K3A{iXO~a9c+U5zw7VR9I#A}<%mu$}vwSl=PYU>7xFMe=y;!d=wI^k( zniPA!*?G5ld|_<6RC8HGn-_1p@Z|5z8Z#eX|LfT|V!t#@e;-aCRtU;`2#-6hH zTHa;X*_~fi}x4r-+EkLZB|0$)AM=z3wyGYr_XcTa^o$3uF5Oo@E%KmS z8c~s5t*`R)F2bN4#u?f7jPnA2*!D_UjN^ z{e`37+4Xc)_Ix@1N1j*Vt(}<^dyc*3lT}4_ca0)4_bUI;UvsK=X{N-ThI@A`+#c?_ zbFfh5**>XwKfC_mMK4bFZ>-Sg^687-Tp$s3BQyWsHH)tg&VFCqee<2q!)4Z67k=1o zqs5+kM*qz8b7GgnZ^*oj|9)fLk%FYx^EMakE^euPv{&Sf=<2!^S8~Mr^PbL+4L_9B zJ9)q1wHw>wZp_qS=2kWLf0(9Xweiw_F{|7R;dwR{U*7hukB+}m6@BgGsmfXV)frDu z-}-T7y}&#LuLFlOUni|L{F>u9x1#v0q2dp`fTaj5s@qNSzpF1x+GA3JYP={%94{ z*z2vE-<8i#3$pe-zw5WjEzK;i)U43 zebcIZ*=_o5-@K#0e_VYbd$#kY&ocjBStrTGZ@G;FgO~4=vf0ZyzsEc0eQ(L+T4P?X zV_BQ{Po}+D8CY&^Uw`zBLgU5NLWx}$E|vxtp0%$EuhA)6U&~eNB4875VZMrOgIM+v zjrH}y70Fl5JXT06pBHR1@8@Dm>#RPldvo(^x2qP~*C$>7BzxoHGM_ISLR_D&)2i;c zyCPxb?c~dkliT-spW{_FKXmQ7VYT1Zj(TR@gP(<^%6E5MTPv#nEyIv+^Yz#K&w92M zw}!gZO=zE(=iM{ic5Bf49clae^jGeFY;1Yl?P_NJ?||tmr#^f5S4;j-YW3NbM>jKk z_|SXn#k<`qA7ABI=dG>Vc<5)U$d1$Z*SoJge0q6mT#W4gIUf%j_Pmw3UHZ+OU(~f@Eo2`B_ zH@PU~K((bXSL?)dh9d{xo#WT`IUaKQ@7mOLHTz!m?GEo(eEmcG_4k?O|FVxiIu>|H zVZ$D$&7Up%_n7jEPirsB;XIx>twD0(glHp{dtAF7eAU?1WA#GreSD>V`rk!8(mA}x z-t9N>lQ~ppRX=6forLew(Y4oXZI?wq@lACgnL((2iT%4^>b z-{$XIyI}sY-b4AC>t^S&J=i99u}|ga*64EIyxX0zJ?rjfP4Ot1Gbi=`mYV^cZ&|;5 z)tkIM-9T{X;WP&E-EOypgw|MlmYZAG`j?)#*L*|6aAnC&s;6+x_&qyu`aTnacy`_nYp$^V>D6Dal26AIT5f-dkGt=8eeSof`H@=t<4UU!ojU*eN@r!<|J+N{_088yeqHkR)8FdQ z%WLGVC#>W(*{Em8EA_7Cj{D@r`!|M~-(B|M(zCTcwrq(hi~4x>eBss2v(|4>QQ}eVOo#3{l9SY)9USYx4-_nwsy;G*2nr^ivRve62IHKbY}3Hx0PJM zb>IJgk^gmX@d|^@Cw19xJ^x**={ujB>wrDOf#t6fQ}l(Z|JjJ>>CCx*|ET_T@ALbA z9+Z#!_#^Vt-ZxfpX7WqV{tjRN#q&A$V*h$&qxQ?KpG}GitR5}Cr=#1SmwW8p_3~ib z{Q9c;|6knx=ahcBRa+ae@7CMOTeBaRg*|?r*Z5r`mq| z>6w$&yLZ(~a=!7?@A(@)??Ug}%VGMzEoaBAGPlosol){!Zu^<;#P!eS?a^I!aeGwZ ziiaELP5oJWzpVU=^WTKjbyxhqAJ>ywBXf7p?y0X#<;$*!TvG1-F<}-jr_)RK;v46` zKdbuwXnp5v%ZQ!)`F$?Qt8%kv6$_OG%@B%+77x94Y zm(u#OgUv7B`xn3UDCd~CeEW|lmdz(_%T_N9tzG+JVV3=hs5Sq;xs)ICetOG1;oX|B z3ZbMj;~v?T&HhF&qip}4G-Y5BtKWVhDDLLEHiplo_f6gRZ7*C@pd4jxw(YxNh5Ljk z*GHz|CDM9v=k>eWU;nJRw&Rz4{qw`$%5Kh|*Dw8TYsTS+aW$K7IIg~Kee6omf>cEV z_Iy5$u!Sy6>?{elTlZgHV63&4XSEM-<0ku%am1o?BeIjf+F)fxg3Sd zquiU1)}4?4lk@#uT$wzx{OW^GmKw%f`}%IFQ1s%*65SIs4Q5K1yk4H~+gHmq&0Q_q z^5P=ig%8sfe&o5lJNo^pOY2td%y3SBpS|e_$C~eFf7!IFlsvoKow=>Ym+y~BW{TCN zAJcAfx!oz+DA6LevU75=$*+v7x6etNL}^x8pME&kOxE-DGP7bI^>@}i%iNBgFPw9} zEobh$g{5aMILJ@$H*^1-V0h=r>gx|#k4^sj{SucipWj>yBi>Ed(^ee(nqkT{OG&0~ z2mj1#f7SbQd@oOOU$u1dv%nuKYBWnPHA_sH@o}Z#o4zlL`f}CoZVs3c6ecJou}0O6u!-*|L1w)?B$6@w)b$V7AE-1H<>#o04z*b$Jj!$;<5b z#Hll<9KE*eI@eaFuP;4b#{b_FR@!-P+tN+YFF#oL2#85V2u72I8X zp-${_#kGT*virsVO*a*{4&ln0^EUVJy1QSr^!}^XEVzBL@)=ubtswK!>9sjW#9q93 z?O|R0>++3Y)=cf!vged`*DQ9}reQ5O>))xPdeNnPcU}d(oP5XhZ;0-dQ+)`-+FGoU2#Rhwmt2BSxM&l ze!Fkeo=%`yo@P9J_h+`S--+g}-JjXE z-k5cG`btsV?(WG)%Q94RE(fXI?(5w;bwadir{$JOi;qms$@R?N5VHRH`NJn4o}BM? z>5>=w+7lnI<>*zt&D&+W?AEgxCvx~M7ryKJxAd%)Pxc~JH)S?6?c398)%yH=Ei+YK zE2LE2`duo2Z$SskwmL&U55aTWd;`4BwiX^9HPPvJ-IIRDyVP&c5iH$Ye@U5bMv2(x#4XRm zwp>qq(48xvw145py9xV#nJcf{eoyfB)k(|sm!7@BQvLmUK{E3rfuQ9-}Q6~zlN^oJa+Ngc3DYg%31JmDu+B-z5KDQhKupK-Se(*uUefF z|9g7GrhTzdHeBk*PKmP3OMi8_|8u1LneGOMB<1}wmOoCGN@t`5dwlcYq&bsrE}!k2_Bo{>@7J##yExlEFGyW8|BK8=SDt4xHcZ*@dB@u9=*Z>w zp1ez!n-^8=G0Qk#YlGi0wO;SbI`{wFs5a|;Wje)Xr`4gA3LDw3h45xDZCzt>@K?#+ zl@(PhgGDo6ts`(roEqk|X7)c@lBzg*h8y!vIr+w0SR-t1RyS^Pcw z;SU>ar~fx^S*>R<%M1G!r_#@@-JSjRwdUfl7RLi(U&vV8wf$6bcMb2Jk2cTmTS_v$ z|FyJy8{2CCErESo>*sN29!;O!b1<{+6d%tG;F#&t6y8->tdRu3rxn4bI;6 zX5HiRb;ip~Z)EmK=oweq?tT{WW#gr(*QVUkKYlm#b)x;OTrn^6m8uOU!BTsK?`1Wt zW4F^YJII~%?p+c8vZ4on=FS&4D&M+q1zeOxv( zV@v4tYR5%A|BndOJ-Ri8XUD!Ne_y1{-9B@lt2OIeuY)~o*yAo@ z*n^9KfkF9n`%a1f|26*qw*#Z-|Nkxj|9ANR-{Sv&^|}?m?_W1midK=*jI-0PPG&3? z__Y10*0u#3ExmsCSz7#^5!aKmUC3^NT%yzy-(&;c>mEtFY8@(kUd!qKjkSu4jb*)M z7HG6h+pv4`|E=#&-h5!v%k^{YIa?YfzT=6gm)WlH=cNT{JT(+{5k*MFFFH` zotgb{`R(Ld9j%(S>avXo4ks%Y+uyx3L%LV+>@-iyi4*r`=k1zpc=dDqZySNF`EQ@q z6n;x7ic~vXye?`U&)qd_2hEqwG=5Q#5+yGZerZm5NwNN{muk|t-uSp)u1%U}|L(l| z9?Lgd-~aj2Yb*7+%4){l`_j+-)<$PZ@?6kMJo#&pg`&>CAGeG){(3!Se!*wg{0OnH z?{9K{lz(q)(|hd5y9MtzWiEYS`P=dE&X<ZjXUn%36irAm~ zZ)Uzdyui=S>fSux!>Nl67q!(*{Ca)f{qjo-_I$kkd)pMg3)`e^O=c#ouQ%H!kQ}`C zn)T_bKl2@*dA)bjzkDZN>hiuuqu8p~Dl>{7SJ@Y@%$fB+edWsQ54kI*KiT`5b?r5- zJ(l*yspoh8WvFjE5_yw zZTnZT#V{`8(XFF_+2tBrL&Ep0JWvs1Y7n-yHCg*cgx&n@a#nnPFFbG8L~ISYl(u!r z^Dx~j&$h7LeRnzYsh5n*?46v;LEG_n6+XL@kT>y`Sj02Y$(Ijoic2d_m?7|P`n%aZ z`}jPyciVUBoUOfna0{ob{#ysX-v>_$uU>sEh}SLL{_5xBi#IvDDN7u8TdEhbnPq=i z+LcdN%O`htA3jx>F-_{`m#W#e!}51^OY7GDT=0aw>m&De!@b*2@AqD{^@~Q$QJcOKj$POHsct!DrJTF` zR!nqsZr|;xwm+Y(owmvCRkUwnVBwNnv&@opGMbr{68q%&9_L>2)_I-U+rN6UOLx!3 z;u+O@U#`9P?&AFCXDYXUx-Pi3IGZm>_xjfQ1i7$pd%sER|9mrdOP$j3)-2mKJA;ns z|BM%Z5q$R5?1(=WL2I^JY&iSJ^j^Mfxa!UoPZ#mN_vQ1bTVn5a_pMa-Z|NZUYubwJ zvp%1e@wC?H@!tR9;pd7s!iN^G4X%&6@KQ}T+FoRqow}W zw=Z`5O`DwRm6&gBbLm`nVD+L7X>oJ@d+oo!@AR3mRgv-C`*`=uX2o-#SsgR@njXA; z)`!B`7gko+Uyz*>-uce@VEwLH$xHN}Jt>giYh5$t`B8;AYr4~(>c}eTayA`Jy!!lc z29Mj@{OX*(R{@eWm3E~wcJ&vTRsX2!|6%apZK2`sSG{RRIOb3K^e*lHlb{WfcPd1e zL^Yjuyp(oaChG9oR`$2a_xc|;TD!l#wEq9e z=5@8@_Z6p94!peoBqnQj`)P}+ht-mEbT|^0&bl+X-^Ko3@dr!2Wp3Ov-n}>{I{*Fe z^CzmN&-|m#{AR~3hGXpJpEKSvT!dWAEzdPg}tLKt=UA=DEw#OH_%{~8Y=JspLw=KRJRcm{& z_|VF!HFwIN8$0G0Utc!w&e_5%e%oT)cimaKx%cFg3EPi4-u*sl-wvyd=eGCGf7`rT zM$&rUwO>zf%((b@=CRaOk|rEYQct38az%A3=qK5M}ppOm76suyZHac)3@BO z>qhOI{aePFL+HZ`ai_;JDon@!F89+?|J(C8nrB0tC!gQ%dmD?DpFW8W)%w12`>|*0 zMXFy*=l0g!O4{Rko2~i-@0`0)E5C^rKD0ffY2&c%({pR%+%w(smR41_G+Dcr=&x3I zutsQW)^Eif(_Nj;@7-OiIBVU9NAaI(>TXJ(Sfv~KsNZ;VXrVqs`}~-drt0?j3ae|U zx6a)%=kfBWNv7Igz0UvLw*IxkKhM=ii?im48{hTIpL6Ga-kwK)ukV@cA-A_wb)JuO zapzCp74M~^zHf{dt=`raJimVDy8gO9d`sWm{OY&-o_l(J)W-6dJx|T6-!FcBLUn`H zy1y-c->+_a^yppjqUq;rIm04f|BjV@_&eyD)60hU%}x9GtWL{o+9n^f-SyAYKkZU; z_Erzk35(vFEccw$G}cd+}cAY|HZaSo>!$w%krSwM(ioBP;*+ zrH_CA1xvq^df1oV{PpWg=a`U;Y=b>H*1Y+=5~e-smqXXEM+P|T6_j1}ef7~!zI(5hUFG_@NPgbFOUt5ms+icENzilBzAWWE z=Xze5?y_>>e*Ygz0l6hAvH?`1BtuFb5RB{9!tR`k>5 zQ-kAwyi5t=zCG1#Gh=hcG)1-Ojc!+FIBT_+%-#AbV0Tc|i9jE3ht|t&{%b=an z(8-YFNB3MZeCoUGzUJzEG2d&8-|JZz21!^JM+N9VFbZ@&eRakA;wSP!oGF)X^={Mt za%|zl|LikgO3N>s{&a)NuTtZh;49{R%f4lWzkYFShrk#2`MI;QQ#L4HnC_bUKQLJG zM*aQp1?SJD*8jV6_wB)8r*GG*Uf0)O3Re%Cbt`Y0iFE74`Nz2oUArQDd8XaJp7!)I z_rKnmMVm@m<_7w&Jnwpwx9`sXNVAjs_>P}5yYzb7f4_%isNc5cK2opQkC873WIZI~-QnG^_1|l~_|!X7K674ap4u z+JFDEh+6e`A>$qPFr7&|J=r!ro+2P+o%i;-&6Za+D!4TG}d|EPs6Mj;u<=*Be!zUfjve;j78& zz4-R-5;I@zJsaQLJ7>9V7MHB4(DQ4VljC;ZjGJy{+b$`!jE}8z`Pqfnue989o6MJe zA;y1Cd}7bK{JUZK>v?3WQ>x{6eRz4oDQolV71gZ=PwxzWUHPH!Sf4U~@2tYjCf{x} z_r4B{QIa{AUakJz_)O#OpBWQBD5a=9o5o)}ZSKxUzjYh%B0K?Lk=b{nx%VTMW-@9iCemWy>C6os;}B^(Swft*@m0Z4>=D_n)o2W%F;g(8|sC zpDv!l^863y$Cq>8&-{M=iq4x&(GNoW3Njl1%lOUNnsdsOhppmqN_~EbtB>&Uqtkd- z{R=Klu=O%}mG$rEOMB_W-|Q_x#|t0S%t;8@amBIl&#{HauYBvhCXi6n_d?@Pfnu|3 zebW3TZT7vQ|MUuuU7rzH^u*Nl@7m*%lY8dZ-wxCAw7zx9xOq<5>u={LU;i1@nql+W z>s{MhqfMJ{-&=UWC@FF3vUm4GmNqWr|EFkC7x3fx%bK4noOI*4``<2H{M$6@?(6oN z<<;BDioa#??LQDzo!n>M;j`d#^0mBI>pH4G+>FeQ)%d{}SN^*~PxYdjlGu+wE8Q3_ zM!J9cFQ?Nx?{?iL)rY>huTSziR#Yi{x_T?ksxaF>cd!1T z_Dy|lV*0*z%e1ZEAKp6k!1mROM|l_5Yr2%@9Ibj`^|u9w=p=h$2yx1Nm4 zFJy{Z&o?(OzPvW!(;_F)C07qGTm5?Ctjlp}yUgdiZJwNWwexdB)S8h#^|`O&3th9+Qo!Bb7EaZPL!kyPmNE0y3nWc^5m|# zdY)xTnv1VXZM%Madv$J| z@1`HDsww?ablXd9d&sTBFW2g8P5u9K`yGqdm!tCZx4&d>YBOkiy1M$|0){rQ55IPx17Qf3~66y6(+%+n{fU zU#+>RA78U>$u`R)ZP)v2c895ie16}n@wKtiexB3ALq{&RY5jY5XZ4jAo6WDb_PNi? zpI)uIHez{D?!Daw<^Eqw_GSG4l(Hw~cY6Qs)<1;}^S=45XLqi>GvBm$$`rM!jT@tL zRyS7cEVXMre`EubUHk9fanXxpS#%2iN3G9vGKzff^VvowR?9eUa-F*21xt(k{5?|@ zPFpWea`&~Y{-e-b_tM~2afz0h{jZCXzSm85|9o{dLdUROJ?+h1hrVe}smb%^@toUw zcv4{V=lQQ*lw6vz%)j5s#q94{^W@Xk+DD(6gg+KK{bk05o->E1F10fiDbIO!`NFSl zy?nQ$9zOnj@D;yzc!? z@>fp1UbI`0ZkL{H6|sBGH9zy!*TZ@HEOgzuZ{Jydik;bd zTLtS;)~qH+CB%z37%7OYQVTBQJ^q(N@AbET{3q?#=Ka_9xw`AB_nK!~ zWl!%tyCHM$V$ZXSo83BiG>;6zHF`CH9zxL4`!Ku9G?k)?d zSSMv^qZsd(x#sRoejVeL7I6|HTI!Dyt|qOEvfSix{NJgrWj8vq=O5Fum0i1d=|GoX?V^{NTXVuQ{Uz79m z)cUto|K4uQJ3HI_?)UTWHeM-PAHUhGc58+0`dNB93y-cY*?*;Kvcvr?<@bYo#kba; zeU!7ztpBn9%PZSHrq7rESAF}`$E?%kvRm8T=bFU({{1*-=Cl`Swk^9Nd~QjXJN>+q zu~pX8>f__-)@nFJFHDYvLp|8Nb6`Jl`98ez=7hZoe(F z^m&p_`<1gdtT#~wV-46UAIQ}R4*sf%vz``90q*)o4Ga`lUIOJ;1lJAr%i z`V*Uemu?L{xb&IOp40mOBEsL5TkxsZp8XR0bn~<1XJ;!`?2`Y;da2gOu;j-6{P%a~ zq#f72^{;zFp+onC4L7^FAEm~xU&HLJUduNvROZk7+n=}Iou2BmF#6{iOaJw2wEZ&N zzvTz57QfF~chM%bxP+zDdABRGACLCCvpWwTxjc6%AH$Ke|4jBLch)?X-+g+Wm3Z6T zhla7!V&6s^En9>mQCs5WsFNM+POtEpVJof-&Ohj$F=QS&+Lh*Gy1M? zJwveagtKW4qWlzpY)+@i)VmIglyjqTEgGo)6(=JhK^Z$iLiHS9SkH#=2k6-%UQ9#JTP7 z664QBc@i%tZt-4adP5>nJ4td%QwU>CyC~*W~(E?mhl$!=~5wb)x01jVrD{ z|IV0lb>AfWyC>b5^nckuF*v?wlkwGU({+Puryb3U_m8q#?%#J?rbuZr|K(M(_ZqH0 z)%liu{c?G!INOC!wrjS`kGp?EDvM_k&ohg-%KoWG*-s|_>n|`87qPjjceg&ZQ#}1f z@8chjP9(bdNxe<3-q82-gwMIG%pTHpU+{vvF=G;{~P0pFLww2 zNqY0U@al{Y;pOuGACwE`+b^BtQvXkR;_YxfS>?I~3_b^aKBRA)Cw;5t%l;=f=Plcl zFz0_#C$~ zcKsgRllkv{+@Bj}{;d1upR3FJKmXf#M$`ZBWXBil=3f3May27aiGO+H47Q+M>(86a zy5ttRaZC8$7yFI%{2t~p^2W{BXS+GNx1Bp_PSTt9rzQV+-#`9n^G5alR+eT4hMuEo zubBdx3%)*MIRF0M|KuRy7%{za{vp-f&kny;{IdHSdwO0L zcL!7Pn^dMLJ7;~}srp-WX;iu7=Tg0EMtfg>*jT;u?R$>Z$2Na^cr^63`0MSO%I8`Q zO>)`ILbvAJ>8{lc_kEUnJiL8!#g}cfHmr2Fe?85|Ak1shx}dnoYL=5{wv_}gRp{%? zXHGe~qj*M2%!vm{jf?BoSU+30FCprE?X||8`gcC1xu&gu9B=Pjvtgr8|9R76NrLfJ zD?5Mextx08 z@fXuSX>YxC`0v^JXEIf;(#s=qz1$7d)%8F4-rpbhh-2C3*>m+uYX52cf3$gvx5w_SzFn~Kj%g~t|E~LacjIk8emq~f!8g;EbJFtP z_J8i&{9E)rwQ@)C=G@Eg0=L(dmGh|`H~#qI<)`M>0Go+(kE}JE>o-4op2+$)i|$nv zU#hg)Y0vRLYrd|cx9g?Jr(dp2z0v+y$GZ2uHFuh&5A1j{waS|`<&|Q61>TIU#xe( ze3idg)1>0&#xv}Re?`Cg1os`sn^al}M;^;i9!QTqBjOn={a9?EpUXHm1wwo7GoE}9jeotA&> znpY+#X%WqsXA!M*PrJHkWy7oIf&2e9$nEW8J@erCn#u^al%3m;Dfs*md~9QQ^KZ%H zgL1zg2mHJd_j&u9U3bh<_MH_zxQ%zly-w#vJxZpT+`47e#+GfLC+im<`c@#YN#&+z?jpUC z2Onq2zjxR2p1E!9(xb-34EyT~{`1wpE!lOQFXpC751$j~r7rQscV9=pKKN+8vDA#P z^+zqkjNe?FYH@Aa4&zPPoA2%3ZZhHLf_c%aIhHbC>$i-%)qeBiso$Bi^ykaWPbm}g zoSxO=xXSl|Z>b%}_ph4YuW_?Kov?^!PN8u@e*KLL$?{6ydKNS?8hLO281$Y=AWZO| z%l*{rtx=yCA9L=qe-v7|nM0KO+P_^_xqU9Zd?B*!>Y9L`t>I}~rrLRVeLh(KVOp=y zE}Ppo!r!phoy&0lbUD{<-6@U*9&7)7TC%0^Q^9>E``5|4%YUD`y=RA^oBG`~Q_G)z zw|nsSaqS<&`nUT`j$OC+jx9^RCiydK`?Y^hz2EDF^2|SXs$<@U*4V$1>=A2LEeme3 zdDL!h{p?bR-&E#zr+M$6Ui)HeaaFAJBe$6vvn1CFA71t2cS_gh*w2qAzSk3bAL5t% z%=(7Wi#V@KyZ_vcn7xX#`FpyU&|le;o%unB9Q`-E3H-77x9CiRZIkD|IPt_~$9;Y_ zzKx5@W7YRb9aP@%BI3Pk^TZe1HoocQJGbt&z!TY(ekX+^P3Te zq?}EpRF{b|#FgESJ3j03zFC$lTFV(3c!ZYu2Wy`{zOsGuw>iuF?L2%Jo7`%VtClym zHM;X>-nFG0v$6%>xrbeDwqEx4+M|1){&>D}X}cVg?VCIG)!oG@cInHbqYKkxk}oEP zBpqR2+nQ+USz{e>BS$6jFM#tBEXEUp6?xx=SUGe_ZlO;VZ;*w2< zw@udTzup{X<~w1Y>f3dxCO_X??kwN-?F|2Hqsa3|q=or4J}598xM%gl>hQ|AP&u~w zSI<~v%iqkEduK5Fs^PYG@%F#I-j8Ls+quLjA^zL?qwO)f+pbyuy5DEL<@&mtMSpx> z3Y*2;yKO7>u=T^)(9I1@r5zuSM_(5X-E?!h&UHD_KDRAX(%+xo_F>xQ?Rk4|wi~Ox z6MlR-$&B}8hrj65Pr<8mQf8koU0rWKyJ-5aB~lyqaO`-&JkdAS_=0t8&+?Mhk(+0# z{{FvPdTI)9x>?X)tMeb%l^xMLRaE|}W5pMNWOI$YZQHiz zYp?!$e`#|^l5clm>2r}~(d=_he#pJH;LeMsY*n}Sd|UNs-G@cr>s%gvc$V9_yyzCk z^T}U-Oz@4~oIGR2;es_gP5oCz@i?u{pLuxO%cnQK`t~e)vcatK#O-al!lf=&Kg7;| zdbsnXN0*x1H0EVHD(AcVd2_UuyZW~0`Ss3{lU!)GvF&-7^~19T?7#GP!uH9}_Pjl>I(JI#f02#L`>pDy+b;dl@zVcmHGkbS zt%Y-EZE!u=tiNk*`tH!>?)jx5bIx^!E;j6GJG(m}x_pjI>FcEI52tFbrrz$!t&Psm zyRQ?u&TOud<=T>{m&HZzyr#YVFFW^~z3~5vZyy-~gPpG>e@(pnBKg<^S&^ciWz!X- ztnPcAj61`Z!trbNfo{IJiv%L?Lq-)?y7?Hv!wP{rV&!=l7#O%b{3h}L|1SqZumAt~ z|DWxDs9f3a>i3OCj!bstQ#LDYIjECu&9PM2;%@on_i`IcXYY-D*yj5C=()%4ufO={ zKHvC$#ixVs3+EjPn;G4Hv_Pup%AD=C>z)hAUTkkWn7X0)Wb*BRUGM8+1WMy}9A1}s zpJ(l_<@Q%YpWnLhd4{_D;fph-hb(jZDcQoY%vb-T(cVX#-S>i;-z{DHa#iW#ty4?V zHuo1xc%HDDExvH-+6zJl3ptAxTov1DdVX!)7aexDZx=!$x9Dxxwpe#N*t%`ezJ2rd z^OZgS;CUg+Xm@T@ZINZ{Id^qGu#kAdH@|*<`lsXX?4>puh-c?GbvI88=X{`S z{I~eG&7=0Y-~U-?2Map^7Tmo0Dr_RxZjZ-&3m) z{5`rqtZ##x-6!6kT(2cXCthEE@14Y#)kfC?#aG-&U;niKZq|fL5wkUVY94CKPk%6J zo8`Mm%}bZh{(2D`$L{R%HF1{foc70OqtEVI)f_If_wd}_lPh-XKKid^)4g|7fB2MO z_L`zU$>k@e)Loz0^ZH%oZX3<@dGc>wPi%dq7xne!HL1rtwz@r@+Pher_axusrOovr zbC0{Q=T1C$>W$>S>cf9LP8Y8{Vf1kZ3v1=+pzQ6FPHFDVTO__~dFr7R#vci(twb>GfqCccX#*O$)i zc=ZQe48vQ?w940q~D%D5LK8GUi5A4(#r_~(y_az zc*MrvI(hhjL6rCM+dWxQ_f}^vmVKB|uu&s<<);ni(Jd(lU%X9T-M?=3xogLt2gK&3 z_Qh(xk9KQhcR#$n^6=twlgw5Jd_Q*YA)oH?ty}kZN9L^5c`@1R)gmT?I_~I_pQlpP zpZ*E1HczNIs@rojwc-6<^GaR)?2QuoPwqvRuQ|i~xaHh#MFFq-_xNKP#C_-bzyG>; z*SF7H|MvZva%_sdOQLsn+S6ARyJ|n)>-kbYch#lMi^9^c79X;!f4NO{f1M`oVceBl0D;ktRB{C<}Iy!q8aQufvJQ=5t!^JM0kt=Rmk`l+YQMXSI6 zHa_OgxZb=q)@X(EybFIl%+Gzj7RUSLa9Z@UjK^Dlx^G^|bw;sOLD{RzYs$H^uOz4X z?2C3^wc;nET>0<+_k#~Gu+BNp{$}UrX)hGcH(z*VSJ5%MZ^MZ>(=1cWbInUn+>|Pm zFA#O_b51S`KAO7orJa!EjK_Oe?L7L|#fbHX-?OweFJ4+Y!}gnpocXcyyLNpJ@Up%3 z{`~C4);C4$T~1E(`O0B#dQJU(^}RXsi+`F{pUw*3dt}Go61D1*uZdSe+!xo$$2-40 zb?~o4TFty$jPL97MZPu`tk~nPwT*|dK}KV_;MKx<>nUE95^sNVPo8>vPujkX?`mHx zT%pO9-P*>!ql0tv*0{3=9(lVYW~YCsfB8Z|ChODkEx88WNe{hW|0sHTy~axCP1Fwa z-u=IGUMx00vU0ymREodNZ<&gTGY-2OZPYOPyYTkRU*{| z8h1Ca?>kqf$i3FI?i>G6=h|u9zmFexsG53m`_%Z;@0$+oe6p=*N6HcVl>bNl>ykh2 zU1htbV$%Gp^L=*J>hS(w@~t}X^9z=^{XZ>Eyu6|OGx%PT^S9JJu63vTkGLE-m?0mR z5-!%XXKCrm};6qtFd6eii-*s-Z>VM1e1iuOXy zyTK(=aD6+11mPx{cFJvw$4F`Z`F?R&N@mo(r0>wr_A@b<%}@9tk) zTBf@Hru9k{R-3TL+T}fJafaJmU75n?@BSda@qMAW!rDE2@kr{N^=pd1 z-7PEcv%l-Sbzj}IM4@Y~ZBsWa3+i03ZB6Qj+dL&t1+q-Pb>_FI_(iMz>pyeLdhtc4 zy(?Md&1PHc{3tvg-n;DF)tL1uYA^m6I{fhAUvcGTm4TA&|HGPWahnyZBrLXS{d7Di zH1qrW!z%y8qsuHJ&9<2})w&%j=i2X`>oTuKGV1$8uWW{!TlOEg7Zp^Le)IL`18YpJ zzt{giYLq&C?bQ|H$DQVP+rCVnda3M#2h+i&$pOC}99y~JlezKyL;KIx{Qdv@!Tj5~ z>eEimv#Vc}X}K}M)A??Na?SUtQ+^jz3a(hU=C`$MNp*$Z-Z@#HTl{bS>6@;SFlFYX zk3FZfW-)jqWxc*MTjunc0>LQ^40f%*x6YL+;1wy@$N%^H#HeDEOfl2m2U@P*64zu- zsG0ID_IUcIWv0uIA1m2ZeMDXVSf7sa$CO3GQnGIce$xs#gh*)S>LUa zV|MN_KI(o<=;X~C^J`PG*I3S+^FHtGudDa?&(~UbsE1i)Ki;@(tDELa_Z``nkGp!_ zNlvrBKi5a%n1xBr$15A=UDUt2Z{}sWYaQp+g_ghgx%T?C)z|+P@Pv0J&Q00G|9g+& z=ZkX;rK-x+-t!%MYsvTi){}yKzqIw4>)lpgI{tW4mfQ5FPm8T)*_l|*(n+qcEzF#i zFEeGfccmlKhx)fpKhCW<;r~1DZeD04>oUEq_kaH@-QLM~QK&;}#nBt5Z?*oPcFcI* zN_oEjyL4(-%zSX0?Om!=y?*!66-SKomOPynAGT?B`%6%a5k;3yYJnD;%s^072S#;c9ewvX}w4sO4y1KRH`+xkn zGv&h<&sN^Zrsb4-S}X( z^7g$42g4^u3Vw9jJUcys>j?Lu;LW1i9Y*)Gj@o1f*PS=)e;9Bre##oRjMb+Y{+0fo zU+tgRz;y2Si#HFJ&1`>`l5ZF5ZzEZgQ}ZQhON7(P+P=9{rfv$-WoKACPkxPv(7bZ( z|Fw(cT+((g{v0vYPuqEy_OJgu$L_JLTz&RG`$7JD|128hneyk=d`^>JuH$UuANzFS z`E|cPx9GNHP7e2HRk<<6yG4g%`?Fs2$G*R#BkKQ`+ndyJAAec$YWMBPZ5InKN}RZG zXYKw@`66!Flvzn0dAn4%Us$Y}JjZYO=AMi3-=8ZUT=dU(C#&HZsqC*W-sv#+O}xGE zf5gxCdo0;!@E1$Q)$6?9erMM8%MrD&{Fmp=Nji`kta17B6zS?v?~A_0+kbz5`R!f* z``-U`B^9%;@2>8>SE8N&|I($GYD^O}=b0@I+|(Czxwd-V;q)4tn|oWU?ucoo3ac(& wtf^P3(r(_Xm>awJpYG#1u0lEAr^PH*W|(*5vY!6-*&@^YUHa2HZz-_?0CVb*?f?J) literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..1dec6141f1a8f43f0a05d3036de25eb40e715813 GIT binary patch literal 36205 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 Date: Fri, 1 Feb 2019 08:31:17 +0100 Subject: [PATCH 0239/1107] Destroy items in fire --- mods/ENTITIES/mcl_item_entity/init.lua | 10 ++++++---- mods/ITEMS/mcl_fire/init.lua | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 63bb07b6..d1c502fc 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -524,12 +524,14 @@ core.register_entity(":__builtin:item", { return end - -- Destroy item in lava or special nodes + -- Destroy item in lava, fire or special nodes local nn = node.name local def = minetest.registered_nodes[nn] - if (def and def.groups and (def.groups.lava or def.groups.destroys_items == 1)) then - -- Special effect for lava - if def.groups.lava then + 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 + if dg ~= 2 then minetest.sound_play("builtin_item_lava", {pos = self.object:get_pos(), gain = 0.5}) end self._removed = true diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index c8c12ea3..665b13de 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -35,7 +35,7 @@ minetest.register_node("mcl_fire:fire", { buildable_to = true, sunlight_propagates = true, damage_per_second = 1, - groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston=1}, + groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston=1, destroys_items=1 }, floodable = true, on_flood = function(pos, oldnode, newnode) if minetest.get_item_group(newnode.name, "water") ~= 0 then @@ -114,7 +114,7 @@ minetest.register_node("mcl_fire:eternal_fire", { buildable_to = true, sunlight_propagates = true, damage_per_second = 1, - groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston = 1}, + groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston = 1, destroys_items = 1}, floodable = true, on_flood = function(pos, oldnode, newnode) if minetest.get_item_group(newnode.name, "water") ~= 0 then From 954125f6e2a3128d29161eb834494e948fb57ee9 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Feb 2019 08:42:23 +0100 Subject: [PATCH 0240/1107] Update fire help --- mods/ITEMS/mcl_fire/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index 665b13de..ab336fa8 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -9,8 +9,8 @@ mcl_fire = {} -- Flame nodes -local fire_help = "Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire." -local eternal_fire_help = "Eternal fire is a damaging and destructive block. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside." +local fire_help = "Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It also destroys items that fall into it. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire." +local eternal_fire_help = "Eternal fire is a damaging and destructive block. Items that fall into it will be destroyed. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside." minetest.register_node("mcl_fire:fire", { description = "Fire", From a918696509a4ea5411eed72174422a5fcaa3f837 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Feb 2019 22:17:42 +0100 Subject: [PATCH 0241/1107] Revert "Update fire help" This reverts commit 954125f6e2a3128d29161eb834494e948fb57ee9. --- mods/ITEMS/mcl_fire/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index ab336fa8..665b13de 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -9,8 +9,8 @@ mcl_fire = {} -- Flame nodes -local fire_help = "Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It also destroys items that fall into it. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire." -local eternal_fire_help = "Eternal fire is a damaging and destructive block. Items that fall into it will be destroyed. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside." +local fire_help = "Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire." +local eternal_fire_help = "Eternal fire is a damaging and destructive block. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside." minetest.register_node("mcl_fire:fire", { description = "Fire", From 6fbefaef09532a1057a33c506f79a5488279ca6b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Feb 2019 22:18:47 +0100 Subject: [PATCH 0242/1107] Version 0.44.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e9d95d2d..06df675b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.43.0 +Version: 0.44.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From f23fa236dd3ebfa7bf926583797579e5121fb2d7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 2 Feb 2019 00:12:57 +0100 Subject: [PATCH 0243/1107] Update deprecated function call in mesecons_mvps --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 2e2d0fd6..5e7da9d2 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -290,7 +290,7 @@ function mesecon.mvps_move_objects(pos, dir, nodestack) end -- Move objects lying/standing on the stack (before it was pushed - oldstack) - if tonumber(minetest.setting_get("movement_gravity")) > 0 and dir.y == 0 then + if tonumber(minetest.settings:get("movement_gravity")) > 0 and dir.y == 0 then -- If gravity positive and dir horizontal, push players standing on the stack for _, n in ipairs(nodestack) do local p_above = vector.add(n.pos, {x=0, y=1, z=0}) From 4f2cd559da3999cea19ba90699e3c1374768e1f6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Feb 2019 12:21:58 +0100 Subject: [PATCH 0244/1107] Rename textures that clash with MTG cactus, hotbar, some wools --- mods/HUD/mcl_inventory/init.lua | 4 +- ...ui_hotbar.png => mcl_inventory_hotbar.png} | Bin ....png => mcl_inventory_hotbar_selected.png} | Bin mods/ITEMS/mcl_core/nodes_cactuscane.lua | 2 +- ...ctus_side.png => mcl_core_cactus_side.png} | Bin ...cactus_top.png => mcl_core_cactus_top.png} | Bin mods/ITEMS/mcl_wool/init.lua | 50 +++++++++--------- ...light_blue.png => mcl_wool_light_blue.png} | Bin .../{wool_lime.png => mcl_wool_lime.png} | Bin .../{wool_green.png => wool_dark_green.png} | Bin tools/Conversion_Table.csv | 14 ++--- 11 files changed, 36 insertions(+), 34 deletions(-) rename mods/HUD/mcl_inventory/textures/{gui_hotbar.png => mcl_inventory_hotbar.png} (100%) rename mods/HUD/mcl_inventory/textures/{gui_hotbar_selected.png => mcl_inventory_hotbar_selected.png} (100%) rename mods/ITEMS/mcl_core/textures/{default_cactus_side.png => mcl_core_cactus_side.png} (100%) rename mods/ITEMS/mcl_core/textures/{default_cactus_top.png => mcl_core_cactus_top.png} (100%) rename mods/ITEMS/mcl_wool/textures/{wool_light_blue.png => mcl_wool_light_blue.png} (100%) rename mods/ITEMS/mcl_wool/textures/{wool_lime.png => mcl_wool_lime.png} (100%) rename mods/ITEMS/mcl_wool/textures/{wool_green.png => wool_dark_green.png} (100%) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 2833c3ac..4bd2ef80 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -135,8 +135,8 @@ minetest.register_on_joinplayer(function(player) --set hotbar size player:hud_set_hotbar_itemcount(9) --add hotbar images - player:hud_set_hotbar_image("gui_hotbar.png") - player:hud_set_hotbar_selected_image("gui_hotbar_selected.png") + player:hud_set_hotbar_image("mcl_inventory_hotbar.png") + player:hud_set_hotbar_selected_image("mcl_inventory_hotbar_selected.png") if show_armor then local set_player_armor_original = armor.set_player_armor diff --git a/mods/HUD/mcl_inventory/textures/gui_hotbar.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_hotbar.png similarity index 100% rename from mods/HUD/mcl_inventory/textures/gui_hotbar.png rename to mods/HUD/mcl_inventory/textures/mcl_inventory_hotbar.png diff --git a/mods/HUD/mcl_inventory/textures/gui_hotbar_selected.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_hotbar_selected.png similarity index 100% rename from mods/HUD/mcl_inventory/textures/gui_hotbar_selected.png rename to mods/HUD/mcl_inventory/textures/mcl_inventory_hotbar_selected.png diff --git a/mods/ITEMS/mcl_core/nodes_cactuscane.lua b/mods/ITEMS/mcl_core/nodes_cactuscane.lua index 3ae5807c..9b87ae6f 100644 --- a/mods/ITEMS/mcl_core/nodes_cactuscane.lua +++ b/mods/ITEMS/mcl_core/nodes_cactuscane.lua @@ -5,7 +5,7 @@ minetest.register_node("mcl_core:cactus", { _doc_items_longdesc = "This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.", _doc_items_usagehelp = "A cactus can only be placed on top of another cactus or any sand.", drawtype = "nodebox", - tiles = {"default_cactus_top.png", "mcl_core_cactus_bottom.png", "default_cactus_side.png","default_cactus_side.png","default_cactus_side.png","default_cactus_side.png"}, + tiles = {"mcl_core_cactus_top.png", "mcl_core_cactus_bottom.png", "mcl_core_cactus_side.png"}, is_ground_content = true, stack_max = 64, groups = {handy=1, attached_node=1, plant=1, deco_block=1, dig_by_piston=1, enderman_takable=1}, diff --git a/mods/ITEMS/mcl_core/textures/default_cactus_side.png b/mods/ITEMS/mcl_core/textures/mcl_core_cactus_side.png similarity index 100% rename from mods/ITEMS/mcl_core/textures/default_cactus_side.png rename to mods/ITEMS/mcl_core/textures/mcl_core_cactus_side.png diff --git a/mods/ITEMS/mcl_core/textures/default_cactus_top.png b/mods/ITEMS/mcl_core/textures/mcl_core_cactus_top.png similarity index 100% rename from mods/ITEMS/mcl_core/textures/default_cactus_top.png rename to mods/ITEMS/mcl_core/textures/mcl_core_cactus_top.png diff --git a/mods/ITEMS/mcl_wool/init.lua b/mods/ITEMS/mcl_wool/init.lua index e0d0e849..14e7d204 100644 --- a/mods/ITEMS/mcl_wool/init.lua +++ b/mods/ITEMS/mcl_wool/init.lua @@ -9,49 +9,51 @@ local wool = {} -- colors, and then some recipes using more specific colors for a few non-base -- colors available. When crafting, the last recipes will be checked first. wool.dyes = { - {"white", "white", "White", nil, "basecolor_white"}, - {"grey", "dark_grey", "Grey", "dark_grey", "unicolor_darkgrey"}, - {"silver", "grey", "Light Grey", "grey", "basecolor_grey"}, - {"black", "black", "Black", "black", "basecolor_black"}, - {"red", "red", "Red", "red", "basecolor_red"}, - {"yellow", "yellow", "Yellow", "yellow", "basecolor_yellow"}, - {"green", "green", "Green", "dark_green", "unicolor_dark_green"}, - {"cyan", "cyan", "Cyan", "cyan", "basecolor_cyan"}, - {"blue", "blue", "Blue", "blue", "basecolor_blue"}, - {"magenta", "magenta", "Magenta", "magenta", "basecolor_magenta"}, - {"orange", "orange", "Orange", "orange", "excolor_orange"}, - {"purple", "violet", "Purple", "violet", "excolor_violet"}, - {"brown", "brown", "Brown", "brown", "unicolor_dark_orange"}, - {"pink", "pink", "Pink", "pink", "unicolor_light_red"}, - {"lime", "lime", "Lime", "green", "basecolor_green"}, - {"light_blue", "light_blue", "Light Blue", "lightblue", "unicolor_light_blue"}, + -- name, texture, wool desc., carpet desc., dye, color_group + {"white", "wool_white", "White Wool", "White Carpet", nil, "basecolor_white"}, + {"grey", "wool_dark_grey", "Grey Wool", "Grey Carpet", "dark_grey", "unicolor_darkgrey"}, + {"silver", "wool_grey", "Light Grey Wool", "Light Grey Carpet", "grey", "basecolor_grey"}, + {"black", "wool_black", "Black Wool", "Black Carpet", "black", "basecolor_black"}, + {"red", "wool_red", "Red Wool", "Red Carpet", "red", "basecolor_red"}, + {"yellow", "wool_yellow", "Yellow Wool", "Yellow Carpet", "yellow", "basecolor_yellow"}, + {"green", "wool_dark_green", "Green Wool", "Green Carpet", "dark_green", "unicolor_dark_green"}, + {"cyan", "wool_cyan", "Cyan Wool", "Cyan Carpet", "cyan", "basecolor_cyan"}, + {"blue", "wool_blue", "Blue Wool", "Blue Carpet", "blue", "basecolor_blue"}, + {"magenta", "wool_magenta", "Magenta Wool", "Magenta Carpet", "magenta", "basecolor_magenta"}, + {"orange", "wool_orange", "Orange Wool", "Orange Carpet", "orange", "excolor_orange"}, + {"purple", "wool_violet", "Purple Wool", "Purple Carpet", "violet", "excolor_violet"}, + {"brown", "wool_brown", "Brown Wool", "Brown Carpet", "brown", "unicolor_dark_orange"}, + {"pink", "wool_pink", "Pink Wool", "Pink Carpet", "pink", "unicolor_light_red"}, + {"lime", "mcl_wool_lime", "Lime Wool", "Lime Carpet", "green", "basecolor_green"}, + {"light_blue", "mcl_wool_light_blue", "Light Blue Wool", "Light Blue Carpet", "lightblue", "unicolor_light_blue"}, } for _, row in ipairs(wool.dyes) do local name = row[1] local texture = row[2] - local desc = row[3] - local dye = row[4] - local color_group = row[5] + local desc_wool = row[3] + local desc_carpet = row[4] + local dye = row[5] + local color_group = row[6] -- Node Definition minetest.register_node("mcl_wool:"..name, { - description = desc.." Wool", + description = desc_wool, _doc_items_longdesc = "Wool is a decorational block which comes in many different colors.", stack_max = 64, is_ground_content = false, - tiles = {"wool_"..texture..".png"}, + tiles = {texture..".png"}, groups = {handy=1,shearsy_wool=1, flammable=1,wool=1,building_block=1}, sounds = mcl_sounds.node_sound_defaults(), _mcl_hardness = 0.8, _mcl_blast_resistance = 4, }) minetest.register_node("mcl_wool:"..name.."_carpet", { - description = desc.." Carpet", + description = desc_carpet, _doc_items_longdesc = "Carpets are thin floor covers which come in many different colors.", walkable = false, -- See is_ground_content = false, - tiles = {"wool_"..texture..".png"}, - wield_image = "wool_"..texture..".png", + tiles = {texture..".png"}, + wield_image = texture..".png", wield_scale = { x=1, y=1, z=0.5 }, groups = {handy=1, carpet=1,attached_node=1,dig_by_water=1,deco_block=1}, sounds = mcl_sounds.node_sound_defaults(), diff --git a/mods/ITEMS/mcl_wool/textures/wool_light_blue.png b/mods/ITEMS/mcl_wool/textures/mcl_wool_light_blue.png similarity index 100% rename from mods/ITEMS/mcl_wool/textures/wool_light_blue.png rename to mods/ITEMS/mcl_wool/textures/mcl_wool_light_blue.png diff --git a/mods/ITEMS/mcl_wool/textures/wool_lime.png b/mods/ITEMS/mcl_wool/textures/mcl_wool_lime.png similarity index 100% rename from mods/ITEMS/mcl_wool/textures/wool_lime.png rename to mods/ITEMS/mcl_wool/textures/mcl_wool_lime.png diff --git a/mods/ITEMS/mcl_wool/textures/wool_green.png b/mods/ITEMS/mcl_wool/textures/wool_dark_green.png similarity index 100% rename from mods/ITEMS/mcl_wool/textures/wool_green.png rename to mods/ITEMS/mcl_wool/textures/wool_dark_green.png diff --git a/tools/Conversion_Table.csv b/tools/Conversion_Table.csv index ad12753e..4f1992a2 100644 --- a/tools/Conversion_Table.csv +++ b/tools/Conversion_Table.csv @@ -127,8 +127,8 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/items,apple.png,/mods/ITEMS/mcl_core/textures,default_apple.png,,,,,,, /assets/minecraft/textures/items,apple_golden.png,/mods/ITEMS/mcl_core/textures,mcl_core_apple_golden.png,,,,,,, /assets/minecraft/textures/blocks,brick.png,/mods/ITEMS/mcl_core/textures,default_brick.png,,,,,,, -/assets/minecraft/textures/blocks,cactus_side.png,/mods/ITEMS/mcl_core/textures,default_cactus_side.png,,,,,,, -/assets/minecraft/textures/blocks,cactus_top.png,/mods/ITEMS/mcl_core/textures,default_cactus_top.png,,,,,,, +/assets/minecraft/textures/blocks,cactus_side.png,/mods/ITEMS/mcl_core/textures,mcl_core_cactus_side.png,,,,,,, +/assets/minecraft/textures/blocks,cactus_top.png,/mods/ITEMS/mcl_core/textures,mcl_core_cactus_top.png,,,,,,, /assets/minecraft/textures/blocks,cactus_bottom.png,/mods/ITEMS/mcl_core/textures,mcl_core_cactus_bottom.png,,,,,,, /assets/minecraft/textures/items,brick.png,/mods/ITEMS/mcl_core/textures,default_clay_brick.png,,,,,,, /assets/minecraft/textures/items,clay_ball.png,/mods/ITEMS/mcl_core/textures,default_clay_lump.png,,,,,,, @@ -578,10 +578,10 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/blocks,wool_colored_brown.png,/mods/ITEMS/mcl_wool/textures,wool_brown.png,,,,,,, /assets/minecraft/textures/blocks,wool_colored_cyan.png,/mods/ITEMS/mcl_wool/textures,wool_cyan.png,,,,,,, /assets/minecraft/textures/blocks,wool_colored_gray.png,/mods/ITEMS/mcl_wool/textures,wool_dark_grey.png,,,,,,, -/assets/minecraft/textures/blocks,wool_colored_green.png,/mods/ITEMS/mcl_wool/textures,wool_green.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_green.png,/mods/ITEMS/mcl_wool/textures,wool_dark_green.png,,,,,,, /assets/minecraft/textures/blocks,wool_colored_silver.png,/mods/ITEMS/mcl_wool/textures,wool_grey.png,,,,,,, -/assets/minecraft/textures/blocks,wool_colored_light_blue.png,/mods/ITEMS/mcl_wool/textures,wool_light_blue.png,,,,,,, -/assets/minecraft/textures/blocks,wool_colored_lime.png,/mods/ITEMS/mcl_wool/textures,wool_lime.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_light_blue.png,/mods/ITEMS/mcl_wool/textures,mcl_wool_light_blue.png,,,,,,, +/assets/minecraft/textures/blocks,wool_colored_lime.png,/mods/ITEMS/mcl_wool/textures,mcl_wool_lime.png,,,,,,, /assets/minecraft/textures/blocks,wool_colored_magenta.png,/mods/ITEMS/mcl_wool/textures,wool_magenta.png,,,,,,, /assets/minecraft/textures/blocks,wool_colored_orange.png,/mods/ITEMS/mcl_wool/textures,wool_orange.png,,,,,,, /assets/minecraft/textures/blocks,wool_colored_pink.png,/mods/ITEMS/mcl_wool/textures,wool_pink.png,,,,,,, @@ -795,8 +795,8 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/blocks,shulker_top_yellow.png,/mods/ITEMS/mcl_chests/textures,mcl_chests_yellow_shulker_box_top.png,,,,,,,y /assets/minecraft/textures/items,flower_pot.png,/mods/ITEMS/mcl_flowerpots/textures,mcl_flowerpots_flowerpot_inventory.png,,,,,,, /assets/minecraft/textures/blocks,flower_pot.png,/mods/ITEMS/mcl_flowerpots/textures,mcl_flowerpots_flowerpot.png,,,,,,,y -/assets/minecraft/textures/gui,widgets.png,/mods/HUD/mcl_inventory/textures,gui_hotbar.png,0,0,182,22,0,0,y -/assets/minecraft/textures/gui,widgets.png,/mods/HUD/mcl_inventory/textures,gui_hotbar_selected.png,0,22,24,24,0,0,y +/assets/minecraft/textures/gui,widgets.png,/mods/HUD/mcl_inventory/textures,mcl_inventory_hotbar.png,0,0,182,22,0,0,y +/assets/minecraft/textures/gui,widgets.png,/mods/HUD/mcl_inventory/textures,mcl_inventory_hotbar_selected.png,0,22,24,24,0,0,y /assets/minecraft/textures/blocks,bed_feet_end.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_side_bottom_red.png,,,,,,, /assets/minecraft/textures/blocks,bed_feet_side.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_side_bottom_r_red.png,,,,,,, /assets/minecraft/textures/blocks,bed_feet_top.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_top_bottom_red.png,,,,,,, From a28582798027de31f42df463d8d31aa85d914565 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Feb 2019 12:38:36 +0100 Subject: [PATCH 0245/1107] Change powered rail texture names to fix MTG clash --- mods/ENTITIES/mcl_minecarts/rails.lua | 2 +- ...s_rail_pwr.png => mcl_minecarts_rail_golden.png} | Bin ...r.png => mcl_minecarts_rail_golden_crossing.png} | Bin ...pwr.png => mcl_minecarts_rail_golden_curved.png} | Bin ...png => mcl_minecarts_rail_golden_t_junction.png} | Bin tools/Conversion_Table.csv | 2 +- 6 files changed, 2 insertions(+), 2 deletions(-) rename mods/ENTITIES/mcl_minecarts/textures/{carts_rail_pwr.png => mcl_minecarts_rail_golden.png} (100%) rename mods/ENTITIES/mcl_minecarts/textures/{carts_rail_crossing_pwr.png => mcl_minecarts_rail_golden_crossing.png} (100%) rename mods/ENTITIES/mcl_minecarts/textures/{carts_rail_curved_pwr.png => mcl_minecarts_rail_golden_curved.png} (100%) rename mods/ENTITIES/mcl_minecarts/textures/{carts_rail_t_junction_pwr.png => mcl_minecarts_rail_golden_t_junction.png} (100%) diff --git a/mods/ENTITIES/mcl_minecarts/rails.lua b/mods/ENTITIES/mcl_minecarts/rails.lua index 1058ba35..04f420f8 100644 --- a/mods/ENTITIES/mcl_minecarts/rails.lua +++ b/mods/ENTITIES/mcl_minecarts/rails.lua @@ -78,7 +78,7 @@ register_rail("mcl_minecarts:rail", -- Powered rail (off = brake mode) register_rail("mcl_minecarts:golden_rail", - {"carts_rail_pwr.png", "carts_rail_curved_pwr.png", "carts_rail_t_junction_pwr.png", "carts_rail_crossing_pwr.png"}, + {"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 = "Powered Rail", _doc_items_longdesc = "Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.", diff --git a/mods/ENTITIES/mcl_minecarts/textures/carts_rail_pwr.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden.png similarity index 100% rename from mods/ENTITIES/mcl_minecarts/textures/carts_rail_pwr.png rename to mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden.png diff --git a/mods/ENTITIES/mcl_minecarts/textures/carts_rail_crossing_pwr.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_crossing.png similarity index 100% rename from mods/ENTITIES/mcl_minecarts/textures/carts_rail_crossing_pwr.png rename to mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_crossing.png diff --git a/mods/ENTITIES/mcl_minecarts/textures/carts_rail_curved_pwr.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_curved.png similarity index 100% rename from mods/ENTITIES/mcl_minecarts/textures/carts_rail_curved_pwr.png rename to mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_curved.png diff --git a/mods/ENTITIES/mcl_minecarts/textures/carts_rail_t_junction_pwr.png b/mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_t_junction.png similarity index 100% rename from mods/ENTITIES/mcl_minecarts/textures/carts_rail_t_junction_pwr.png rename to mods/ENTITIES/mcl_minecarts/textures/mcl_minecarts_rail_golden_t_junction.png diff --git a/tools/Conversion_Table.csv b/tools/Conversion_Table.csv index 4f1992a2..5567b27f 100644 --- a/tools/Conversion_Table.csv +++ b/tools/Conversion_Table.csv @@ -448,7 +448,7 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/items,map_empty.png,/mods/ITEMS/mcl_maps/textures,mcl_maps_map_empty.png,,,,,,, /assets/minecraft/textures/items,map_filled_markings.png,/mods/ITEMS/mcl_maps/textures,mcl_maps_map_filled_markings.png,,,,,,, /assets/minecraft/textures/items,map_filled.png,/mods/ITEMS/mcl_maps/textures,mcl_maps_map_filled.png,,,,,,, -/assets/minecraft/textures/blocks,rail_golden.png,/mods/ENTITIES/mcl_minecarts/textures,carts_rail_pwr.png,,,,,,, +/assets/minecraft/textures/blocks,rail_golden.png,/mods/ENTITIES/mcl_minecarts/textures,mcl_minecarts_rail_golden.png,,,,,,, /assets/minecraft/textures/blocks,rail_golden_powered.png,/mods/ENTITIES/mcl_minecarts/textures,mcl_minecarts_rail_golden_powered.png,,,,,,, /assets/minecraft/textures/blocks,rail_normal_turned.png,/mods/ENTITIES/mcl_minecarts/textures,default_rail_curved.png,,,,,,, /assets/minecraft/textures/blocks,rail_normal.png,/mods/ENTITIES/mcl_minecarts/textures,default_rail.png,,,,,,, From a11f6ffaacf7d4607a03107a0da5ee8c1e2ca561 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Feb 2019 16:53:06 +0100 Subject: [PATCH 0246/1107] Don't respawn on bed if bed is missing or blocked --- mods/ITEMS/mcl_beds/functions.lua | 4 +++- mods/PLAYER/mcl_spawn/init.lua | 19 +++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 2843bdd4..bb45a063 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -228,7 +228,9 @@ function mcl_beds.on_rightclick(pos, player) if not mcl_beds.player[name] then lay_down(player, ppos, pos) if minetest.get_modpath("mcl_spawn") then - mcl_spawn.set_spawn_pos(player, player:get_pos()) -- save respawn position when entering bed + local spos = table.copy(pos) + spos.y = spos.y + 0.1 + mcl_spawn.set_spawn_pos(player, spos) -- save respawn position when entering bed end else lay_down(player, nil, nil, false) diff --git a/mods/PLAYER/mcl_spawn/init.lua b/mods/PLAYER/mcl_spawn/init.lua index cc8463c3..65853028 100644 --- a/mods/PLAYER/mcl_spawn/init.lua +++ b/mods/PLAYER/mcl_spawn/init.lua @@ -33,8 +33,23 @@ end minetest.register_on_respawnplayer(function(player) local pos = mcl_spawn.get_spawn_pos(player) if pos then - player:set_pos(pos) - return true + -- Check if bed is still there + -- and the spawning position is free of solid or damaging blocks. + local node_bed = minetest.get_node(pos) + local node_up1 = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) + local node_up2 = minetest.get_node({x=pos.x,y=pos.y+2,z=pos.z}) + local bgroup = minetest.get_item_group(node_bed.name, "bed") + local def1 = minetest.registered_nodes[node_up1.name] + local def2 = minetest.registered_nodes[node_up2.name] + if (bgroup == 1 or bgroup == 2) and + (not def1.walkable) and (not def2.walkable) and + (def1.damage_per_second == nil or def2.damage_per_second <= 0) and + (def1.damage_per_second == nil or def2.damage_per_second <= 0) then + player:set_pos(pos) + return true + else + minetest.chat_send_player(player:get_player_name(), "Your spawn bed was missing or blocked.") + end end end) From 6faac04f0de564a55097b4bec076ca879d7dade4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Feb 2019 17:53:30 +0100 Subject: [PATCH 0247/1107] Prevent sleeping if solid or damage block over bed --- mods/ITEMS/mcl_beds/functions.lua | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index bb45a063..b1eaa85a 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -118,16 +118,28 @@ local function lay_down(player, pos, bed_pos, state, skip) -- lay down else + local yaw, param2 = get_look_yaw(bed_pos) + local dir = minetest.facedir_to_dir(param2) + local p = {x = bed_pos.x + dir.x / 4, y = bed_pos.y, z = bed_pos.z + dir.z / 4} + 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_pos.x, y=bed_pos.y+2, z=bed_pos.z}) + local def1 = minetest.registered_nodes[n1.name] + local def2 = minetest.registered_nodes[n2.name] + if def1.walkable or def2.walkable then + minetest.chat_send_player(name, "You can't sleep, the bed is obstructed!") + return + elseif (def1.damage_per_second ~= nil and def1.damage_per_second > 0) or (def2.damage_per_second ~= nil and def2.damage_per_second > 0) then + minetest.chat_send_player(name, "It's too dangerous to sleep here!") + return + end + mcl_beds.player[name] = 1 mcl_beds.pos[name] = pos 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}) - local yaw, param2 = get_look_yaw(bed_pos) player:set_look_horizontal(yaw) - local dir = minetest.facedir_to_dir(param2) - local p = {x = bed_pos.x + dir.x / 2, y = bed_pos.y, z = bed_pos.z + dir.z / 2} + player:set_attribute("mcl_beds:sleeping", "true") playerphysics.add_physics_factor(player, "speed", "mcl_beds:sleeping", 0) playerphysics.add_physics_factor(player, "jump", "mcl_beds:sleeping", 0) From 7437d3945be215ee27c6724b6a9fe707d4158483 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Feb 2019 00:07:39 +0100 Subject: [PATCH 0248/1107] Forget spawn if bed was destroyed --- mods/PLAYER/mcl_spawn/init.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/PLAYER/mcl_spawn/init.lua b/mods/PLAYER/mcl_spawn/init.lua index 65853028..0413219b 100644 --- a/mods/PLAYER/mcl_spawn/init.lua +++ b/mods/PLAYER/mcl_spawn/init.lua @@ -48,6 +48,10 @@ minetest.register_on_respawnplayer(function(player) player:set_pos(pos) return true else + -- Forget spawn if bed was missing + if (bgroup ~= 1 and bgroup ~= 2) then + mcl_spawn.set_spawn_pos(player, nil) + end minetest.chat_send_player(player:get_player_name(), "Your spawn bed was missing or blocked.") end end From f63342ec723929769579e736bfc3f0a0ec2f81f7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Feb 2019 04:06:28 +0100 Subject: [PATCH 0249/1107] Rename seed textures --- mods/ITEMS/mcl_farming/melon.lua | 2 +- mods/ITEMS/mcl_farming/pumpkin.lua | 2 +- ...g_melon_seed.png => mcl_farming_melon_seeds.png} | Bin ...mpkin_seed.png => mcl_farming_pumpkin_seeds.png} | Bin ...g_wheat_seed.png => mcl_farming_wheat_seeds.png} | Bin mods/ITEMS/mcl_farming/wheat.lua | 2 +- tools/Conversion_Table.csv | 6 +++--- 7 files changed, 6 insertions(+), 6 deletions(-) rename mods/ITEMS/mcl_farming/textures/{farming_melon_seed.png => mcl_farming_melon_seeds.png} (100%) rename mods/ITEMS/mcl_farming/textures/{farming_pumpkin_seed.png => mcl_farming_pumpkin_seeds.png} (100%) rename mods/ITEMS/mcl_farming/textures/{farming_wheat_seed.png => mcl_farming_wheat_seeds.png} (100%) diff --git a/mods/ITEMS/mcl_farming/melon.lua b/mods/ITEMS/mcl_farming/melon.lua index 72e27a22..7e3cfa1d 100644 --- a/mods/ITEMS/mcl_farming/melon.lua +++ b/mods/ITEMS/mcl_farming/melon.lua @@ -5,7 +5,7 @@ minetest.register_craftitem("mcl_farming:melon_seeds", { _doc_items_usagehelp = "Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melons grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it melon seeds.", stack_max = 64, groups = { craftitem=1 }, - inventory_image = "farming_melon_seed.png", + 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, diff --git a/mods/ITEMS/mcl_farming/pumpkin.lua b/mods/ITEMS/mcl_farming/pumpkin.lua index 5df24e82..6b0d3181 100644 --- a/mods/ITEMS/mcl_farming/pumpkin.lua +++ b/mods/ITEMS/mcl_farming/pumpkin.lua @@ -4,7 +4,7 @@ minetest.register_craftitem("mcl_farming:pumpkin_seeds", { _doc_items_longdesc = "Grows into a pumpkin. Chickens like pumpkin seeds.", _doc_items_usagehelp = "Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkins grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it pumpkin seeds.", stack_max = 64, - inventory_image = "farming_pumpkin_seed.png", + inventory_image = "mcl_farming_pumpkin_seeds.png", groups = { craftitem=1 }, on_place = function(itemstack, placer, pointed_thing) return mcl_farming:place_seed(itemstack, placer, pointed_thing, "mcl_farming:pumpkin_1") diff --git a/mods/ITEMS/mcl_farming/textures/farming_melon_seed.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_melon_seeds.png similarity index 100% rename from mods/ITEMS/mcl_farming/textures/farming_melon_seed.png rename to mods/ITEMS/mcl_farming/textures/mcl_farming_melon_seeds.png diff --git a/mods/ITEMS/mcl_farming/textures/farming_pumpkin_seed.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_seeds.png similarity index 100% rename from mods/ITEMS/mcl_farming/textures/farming_pumpkin_seed.png rename to mods/ITEMS/mcl_farming/textures/mcl_farming_pumpkin_seeds.png diff --git a/mods/ITEMS/mcl_farming/textures/farming_wheat_seed.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_seeds.png similarity index 100% rename from mods/ITEMS/mcl_farming/textures/farming_wheat_seed.png rename to mods/ITEMS/mcl_farming/textures/mcl_farming_wheat_seeds.png diff --git a/mods/ITEMS/mcl_farming/wheat.lua b/mods/ITEMS/mcl_farming/wheat.lua index 7c38c06a..f7521d26 100644 --- a/mods/ITEMS/mcl_farming/wheat.lua +++ b/mods/ITEMS/mcl_farming/wheat.lua @@ -4,7 +4,7 @@ minetest.register_craftitem("mcl_farming:wheat_seeds", { _doc_items_longdesc = "Grows into a wheat plant. Chickens like wheat seeds.", _doc_items_usagehelp = "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 }, - inventory_image = "farming_wheat_seed.png", + 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 diff --git a/tools/Conversion_Table.csv b/tools/Conversion_Table.csv index 5567b27f..7d2e8612 100644 --- a/tools/Conversion_Table.csv +++ b/tools/Conversion_Table.csv @@ -348,7 +348,7 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/items,carrot.png,/mods/ITEMS/mcl_farming/textures,farming_carrot.png,,,,,,, /assets/minecraft/textures/items,cookie.png,/mods/ITEMS/mcl_farming/textures,farming_cookie.png,,,,,,, /assets/minecraft/textures/items,melon.png,/mods/ITEMS/mcl_farming/textures,farming_melon.png,,,,,,, -/assets/minecraft/textures/items,seeds_melon.png,/mods/ITEMS/mcl_farming/textures,farming_melon_seed.png,,,,,,, +/assets/minecraft/textures/items,seeds_melon.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_melon_seeds.png,,,,,,, /assets/minecraft/textures/blocks,melon_side.png,/mods/ITEMS/mcl_farming/textures,farming_melon_side.png,,,,,,, /assets/minecraft/textures/blocks,melon_top.png,/mods/ITEMS/mcl_farming/textures,farming_melon_top.png,,,,,,, /assets/minecraft/textures/items,potato_baked.png,/mods/ITEMS/mcl_farming/textures,farming_potato_baked.png,,,,,,, @@ -356,7 +356,7 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/items,potato_poisonous.png,/mods/ITEMS/mcl_farming/textures,farming_potato_poison.png,,,,,,, /assets/minecraft/textures/blocks,pumpkin_face_on.png,/mods/ITEMS/mcl_farming/textures,farming_pumpkin_face_light.png,,,,,,, /assets/minecraft/textures/blocks,pumpkin_face_off.png,/mods/ITEMS/mcl_farming/textures,farming_pumpkin_face.png,,,,,,, -/assets/minecraft/textures/items,seeds_pumpkin.png,/mods/ITEMS/mcl_farming/textures,farming_pumpkin_seed.png,,,,,,, +/assets/minecraft/textures/items,seeds_pumpkin.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_pumpkin_seeds.png,,,,,,, /assets/minecraft/textures/blocks,pumpkin_side.png,/mods/ITEMS/mcl_farming/textures,farming_pumpkin_side.png,,,,,,, /assets/minecraft/textures/blocks,pumpkin_top.png,/mods/ITEMS/mcl_farming/textures,farming_pumpkin_top.png,,,,,,, /assets/minecraft/textures/blocks,farmland_dry.png,/mods/ITEMS/mcl_farming/textures,farming_soil.png,,,,,,, @@ -367,7 +367,7 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/items,stone_hoe.png,/mods/ITEMS/mcl_farming/textures,farming_tool_stonehoe.png,,,,,,, /assets/minecraft/textures/items,wood_hoe.png,/mods/ITEMS/mcl_farming/textures,farming_tool_woodhoe.png,,,,,,, /assets/minecraft/textures/items,wheat.png,/mods/ITEMS/mcl_farming/textures,farming_wheat_harvested.png,,,,,,, -/assets/minecraft/textures/items,seeds_wheat.png,/mods/ITEMS/mcl_farming/textures,farming_wheat_seed.png,,,,,,, +/assets/minecraft/textures/items,seeds_wheat.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_wheat_seeds.png,,,,,,, /assets/minecraft/textures/blocks,beetroots_stage_0.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_beetroot_0.png,,,,,,, /assets/minecraft/textures/blocks,beetroots_stage_1.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_beetroot_1.png,,,,,,, /assets/minecraft/textures/blocks,beetroots_stage_2.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_beetroot_2.png,,,,,,, From 64457b151cb9258d28873fa728a0c3eb8155f832 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Feb 2019 17:05:40 +0100 Subject: [PATCH 0250/1107] Improve free space checks on mob spawn --- mods/ENTITIES/mcl_mobs/api.lua | 58 ++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 7ff966e2..08f5f8a9 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -3176,11 +3176,13 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, -- is mob actually registered? if not mobs.spawning_mobs[name] or not minetest.registered_entities[name] then + minetest.log("warning", "Mob spawn of "..name.." failed, unknown entity or mob is not registered for spawning!") return end -- additional custom checks for spawning mob if mobs:spawn_abm_check(pos, node, name) == true then + minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, ABM check rejected!") return end @@ -3188,6 +3190,7 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, if active_object_count_wider >= max_per_block or count_mobs(pos, name) >= aoc then -- too many entities + minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, too crowded!") return end @@ -3200,12 +3203,14 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, -- daylight, but mob wants night if day_toggle == false then -- mob needs night + minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, mob needs light!") return end else -- night time but mob wants day if day_toggle == true then -- mob needs day + minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, mob needs daylight!") return end end @@ -3221,7 +3226,7 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, if objs[n]:is_player() then -- player too close - minetest.log("info", "Mob spawn of ".. name .. " failed, player too close") + minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, player too close!") return end end @@ -3229,12 +3234,14 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, -- mobs cannot spawn in protected areas when enabled if not spawn_protected and minetest.is_protected(pos, "") then + minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, position is protected!") return end -- are we spawning within height limits? if pos.y > max_height or pos.y < min_height then + minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, out of height limit!") return end @@ -3243,27 +3250,58 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, if not light or light > max_light or light < min_light then + minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, bad light!") return end - -- do we have enough height clearance to spawn mob? + -- do we have enough space to spawn mob? local ent = minetest.registered_entities[name] - local height = max(0, math.ceil(ent.collisionbox[5] - ent.collisionbox[2]) - 1) + local width_x = max(1, math.ceil(ent.collisionbox[4] - ent.collisionbox[1])) + local min_x, max_x + if width_x % 2 == 0 then + max_x = math.floor(width_x/2) + min_x = -(max_x-1) + else + max_x = math.floor(width_x/2) + min_x = -max_x + end - for n = 0, height do + local width_z = max(1, math.ceil(ent.collisionbox[6] - ent.collisionbox[3])) + local min_z, max_z + if width_z % 2 == 0 then + max_z = math.floor(width_z/2) + min_z = -(max_z-1) + else + max_z = math.floor(width_z/2) + min_z = -max_z + end - local pos2 = {x = pos.x, y = pos.y + n, z = pos.z} + local max_y = max(0, math.ceil(ent.collisionbox[5] - ent.collisionbox[2]) - 1) - if minetest.registered_nodes[node_ok(pos2).name].walkable == true then - -- inside block - return + for y = 0, max_y do + for x = min_x, max_x do + for z = min_z, max_z do + local pos2 = {x = pos.x+x, y = pos.y+y, z = pos.z+z} + if minetest.registered_nodes[node_ok(pos2).name].walkable == true then + -- inside block + minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, too little space!") + return + end + end end end - -- spawn mob half block higher than ground - pos.y = pos.y + 0.5 + -- spawn mob with half of its height above ground + pos.y = pos.y + ((ent.collisionbox[2] - ent.collisionbox[5]) / 2) + if width_x % 2 == 0 then + pos.x = pos.x + 0.5 + end + if width_z % 2 == 0 then + pos.z = pos.z + 0.5 + end local mob = minetest.add_entity(pos, name) + minetest.log("action", "Mob spawned: "..name.." at "..minetest.pos_to_string(pos)) if on_spawn then From b7a2fba1ce9568d1ba6e54f9617d2cb627a088f2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Feb 2019 17:43:18 +0100 Subject: [PATCH 0251/1107] Fix spawn ABM check that prevented squid spawn --- mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua b/mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua index 35a3c344..303feb1a 100644 --- a/mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua +++ b/mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua @@ -1,10 +1,11 @@ function mobs:spawn_abm_check(pos, node, name) - if (node.name == "air") then + -- 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 - elseif (node.name == "mcl_core:mycelium" or node.name == "mcl_core:mycelium_snow") and minetest.registered_entities[name].type == "monster" then - return false - elseif minetest.get_item_group(node.name, "opaque") ~= 0 then + -- Spawn on opaque or liquid nodes + elseif minetest.get_item_group(node.name, "opaque") ~= 0 or minetest.registered_nodes[node.name].liquidtype ~= "none" then return false end + -- Reject everything else return true end From cfd561554858a695c99b8b2704504b16d0b12731 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Feb 2019 19:12:28 +0100 Subject: [PATCH 0252/1107] Spawn smaller slime/magmacube if it doesn't fit --- mods/ENTITIES/mcl_mobs/api.lua | 33 ++++++++++++++-------- mods/ENTITIES/mcl_mobs/api.txt | 2 ++ mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 6 ++++ 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 08f5f8a9..8d493cd5 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -2975,6 +2975,7 @@ minetest.register_entity(name, { 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 drawtype = def.drawtype, -- DEPRECATED, use rotate instead @@ -3162,17 +3163,10 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, end - minetest.register_abm({ - - label = name .. " spawning", - nodenames = nodes, - neighbors = neighbors, - interval = interval, - chance = max(1, (chance * mob_chance_multiplier)), - catch_up = false, - - action = function(pos, node, active_object_count, active_object_count_wider) + local spawn_action + spawn_action = function(pos, node, active_object_count, active_object_count_wider, name) + local orig_pos = table.copy(pos) -- is mob actually registered? if not mobs.spawning_mobs[name] or not minetest.registered_entities[name] then @@ -3285,6 +3279,10 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, if minetest.registered_nodes[node_ok(pos2).name].walkable == true then -- inside block minetest.log("info", "Mob spawn of "..name.." at "..minetest.pos_to_string(pos).." failed, too little space!") + if ent.spawn_small_alternative ~= nil and (not minetest.registered_nodes[node_ok(pos).name].walkable) then + minetest.log("info", "Trying to spawn smaller alternative mob: "..ent.spawn_small_alternative) + spawn_action(orig_pos, node, active_object_count, active_object_count_wider, ent.spawn_small_alternative) + end return end end @@ -3309,7 +3307,20 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, on_spawn(ent, pos) end - end + end + + local function spawn_abm_action(pos, node, active_object_count, active_object_count_wider) + spawn_action(pos, node, active_object_count, active_object_count_wider, name) + end + + minetest.register_abm({ + label = name .. " spawning", + nodenames = nodes, + neighbors = neighbors, + interval = interval, + chance = max(1, (chance * mob_chance_multiplier)), + catch_up = false, + action = spawn_abm_action, }) end diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 9e30ca5c..c09151e9 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -213,6 +213,8 @@ functions needed for the mob to work properly which contains the following: '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 Node Replacement ---------------- diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 59ed07fa..35374444 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -58,6 +58,7 @@ local slime_big = { jump_height = 5.2, jump_chance = 100, fear_height = 60, + spawn_small_alternative = "mobs_mc:slime_small", on_die = function(self, pos) local angle, posadd angle = math.random(0, math.pi*2) @@ -83,6 +84,7 @@ 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 = function(self, pos) local angle, posadd, dir angle = math.random(0, math.pi*2) @@ -114,6 +116,7 @@ slime_tiny.drops = { 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 mobs:register_mob("mobs_mc:slime_tiny", slime_tiny) @@ -181,6 +184,7 @@ local magma_cube_big = { walk_chance = 0, jump_chance = 100, fear_height = 100000, + spawn_small_alternative = "mobs_mc:magma_cube_small", on_die = function(self, pos) local angle, posadd angle = math.random(0, math.pi*2) @@ -211,6 +215,7 @@ magma_cube_small.jump_height = 6 magma_cube_small.damage = 4 magma_cube_small.reach = 2.75 magma_cube_small.armor = 70 +magma_cube_small.spawn_small_alternative = "mobs_mc:magma_cube_tiny" magma_cube_small.on_die = function(self, pos) local angle, posadd, dir angle = math.random(0, math.pi*2) @@ -239,6 +244,7 @@ magma_cube_tiny.damage = 3 magma_cube_tiny.reach = 2.5 magma_cube_tiny.armor = 85 magma_cube_tiny.drops = {} +magma_cube_tiny.spawn_small_alternative = nil magma_cube_tiny.on_die = nil mobs:register_mob("mobs_mc:magma_cube_tiny", magma_cube_tiny) From 1c35828fa2b5852328319c46e4bb0fd9727109c3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Feb 2019 19:24:02 +0100 Subject: [PATCH 0253/1107] Fix stupid mob spawn height --- mods/ENTITIES/mcl_mobs/api.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 8d493cd5..9fddda4d 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -3289,8 +3289,9 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, end end - -- spawn mob with half of its height above ground - pos.y = pos.y + ((ent.collisionbox[2] - ent.collisionbox[5]) / 2) + -- spawn mob 1/2 node above ground + pos.y = pos.y + 0.5 + -- tweak X/Z spawn pos if width_x % 2 == 0 then pos.x = pos.x + 0.5 end From ca484cfa1adcbe41bd0e9614564ba8854596a0dd Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Feb 2019 20:19:06 +0100 Subject: [PATCH 0254/1107] Improve child spawn on slime/magmacube death No longer do children spawn in walls --- mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 87 ++++++++++------------ 1 file changed, 39 insertions(+), 48 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 35374444..c419ec67 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -4,6 +4,41 @@ local MP = minetest.get_modpath(minetest.get_current_modname()) local S, NS = dofile(MP.."/intllib.lua") +-- 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(self, pos, 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 mother_stuck = minetest.registered_nodes[minetest.get_node(pos).name].walkable + angle = math.random(0, math.pi*2) + 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 + if (not mother_stuck) and minetest.registered_nodes[minetest.get_node(newpos).name].walkable then + newpos = pos + speed_penalty = 0.5 + end + local mob = minetest.add_entity(newpos, child_mob) + mob:set_velocity(vector.multiply(dir, eject_speed * speed_penalty)) + mob:set_yaw(angle - math.pi/2) + angle = angle + (math.pi*2)/children_count + end + end +end + -- Slime local slime_big = { type = "monster", @@ -59,18 +94,7 @@ local slime_big = { jump_chance = 100, fear_height = 60, spawn_small_alternative = "mobs_mc:slime_small", - on_die = function(self, pos) - local angle, posadd - angle = math.random(0, math.pi*2) - for i=1,4 do - posadd = {x=math.cos(angle),y=0,z=math.sin(angle)} - posadd = vector.normalize(posadd) - local slime = minetest.add_entity(vector.add(pos, posadd), "mobs_mc:slime_small") - slime:setvelocity(vector.multiply(posadd, 1.5)) - slime:setyaw(angle-math.pi/2) - angle = angle + math.pi/2 - end - end, + on_die = spawn_children_on_die(self, pos, "mobs_mc:slime_small", 4, 1.0, 1.5) } mobs:register_mob("mobs_mc:slime_big", slime_big) @@ -85,18 +109,7 @@ 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 = function(self, pos) - local angle, posadd, dir - angle = math.random(0, math.pi*2) - for i=1,4 do - dir = {x=math.cos(angle),y=0,z=math.sin(angle)} - posadd = vector.multiply(vector.normalize(dir), 0.6) - local slime = minetest.add_entity(vector.add(pos, posadd), "mobs_mc:slime_tiny") - slime:setvelocity(dir) - slime:setyaw(angle-math.pi/2) - angle = angle + math.pi/2 - end -end +slime_small.on_die = spawn_children_on_die(self, pos, "mobs_mc:slime_tiny", 4, 0.6, 1.0) mobs:register_mob("mobs_mc:slime_small", slime_small) local slime_tiny = table.copy(slime_big) @@ -185,18 +198,7 @@ local magma_cube_big = { jump_chance = 100, fear_height = 100000, spawn_small_alternative = "mobs_mc:magma_cube_small", - on_die = function(self, pos) - local angle, posadd - angle = math.random(0, math.pi*2) - for i=1,3 do - posadd = {x=math.cos(angle),y=0,z=math.sin(angle)} - posadd = vector.normalize(posadd) - local mob = minetest.add_entity(vector.add(pos, posadd), "mobs_mc:magma_cube_small") - mob:setvelocity(vector.multiply(posadd, 1.5)) - mob:setyaw(angle-math.pi/2) - angle = angle + (math.pi*2) / 3 - end - end, + on_die = spawn_children_on_die(self, pos, "mobs_mc:magma_cube_small", 3, 0.8, 1.5) } mobs:register_mob("mobs_mc:magma_cube_big", magma_cube_big) @@ -216,18 +218,7 @@ magma_cube_small.damage = 4 magma_cube_small.reach = 2.75 magma_cube_small.armor = 70 magma_cube_small.spawn_small_alternative = "mobs_mc:magma_cube_tiny" -magma_cube_small.on_die = function(self, pos) - local angle, posadd, dir - angle = math.random(0, math.pi*2) - for i=1,4 do - dir = vector.normalize({x=math.cos(angle),y=0,z=math.sin(angle)}) - posadd = vector.multiply(dir, 0.6) - local mob = minetest.add_entity(vector.add(pos, posadd), "mobs_mc:magma_cube_tiny") - mob:setvelocity(dir) - mob:setyaw(angle-math.pi/2) - angle = angle + math.pi/2 - end -end +magma_cube_small.on_die = spawn_children_on_die(self, pos, "mobs_mc:magma_cube_tiny", 4, 0.6, 1.0) mobs:register_mob("mobs_mc:magma_cube_small", magma_cube_small) local magma_cube_tiny = table.copy(magma_cube_big) From 958989c80d8149a86c67d4ea2ddcd99ee70faf0c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Feb 2019 20:49:34 +0100 Subject: [PATCH 0255/1107] If slime/mcube was killd, smaller m. att. attacker Previously, if you killed a big slime, the smaller slimes that spawn are neutral. --- mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index c419ec67..5b031bbd 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -20,6 +20,7 @@ local spawn_children_on_die = function(self, pos, child_mob, children_count, spa end local mother_stuck = minetest.registered_nodes[minetest.get_node(pos).name].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) @@ -34,8 +35,22 @@ local spawn_children_on_die = function(self, pos, child_mob, children_count, spa local mob = minetest.add_entity(newpos, child_mob) mob:set_velocity(vector.multiply(dir, eject_speed * speed_penalty)) 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 From 3563b5448c18ba8125fcac66c792b45c4d988c8d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Feb 2019 21:02:36 +0100 Subject: [PATCH 0256/1107] Slime: Don't add speed if mother was stuck --- mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 5b031bbd..b23a693f 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -33,7 +33,9 @@ local spawn_children_on_die = function(self, pos, child_mob, children_count, spa speed_penalty = 0.5 end local mob = minetest.add_entity(newpos, child_mob) - mob:set_velocity(vector.multiply(dir, eject_speed * speed_penalty)) + 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 From 006850896862c3d737f467cfabdb3b2af469f758 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Feb 2019 21:11:37 +0100 Subject: [PATCH 0257/1107] Don't add weapon wear in Creative Mode --- mods/ENTITIES/mcl_mobs/api.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 9fddda4d..969d4f0c 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -2383,12 +2383,13 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) if cancel then return end end - -- add weapon wear if tool_capabilities then punch_interval = tool_capabilities.full_punch_interval or 1.4 end - if weapon:get_definition() + -- add weapon wear + if minetest.settings:get_bool("creative_mode") ~= true + and weapon:get_definition() and weapon:get_definition().tool_capabilities then weapon:add_wear(floor((punch_interval / 75) * 9000)) From d9b6bae320b33a60d9fac462befd3af6116f1349 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Feb 2019 21:14:28 +0100 Subject: [PATCH 0258/1107] =?UTF-8?q?mcl=5Fhunger:=20core.*=20=E2=86=92=20?= =?UTF-8?q?minetest.*?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mods/PLAYER/mcl_hunger/hunger.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/PLAYER/mcl_hunger/hunger.lua b/mods/PLAYER/mcl_hunger/hunger.lua index 875d1be3..508b8b9f 100644 --- a/mods/PLAYER/mcl_hunger/hunger.lua +++ b/mods/PLAYER/mcl_hunger/hunger.lua @@ -1,6 +1,6 @@ -- wrapper for minetest.item_eat (this way we make sure other mods can't break this one) -local org_eat = core.do_item_eat -core.do_item_eat = function(hp_change, replace_with_item, itemstack, user, pointed_thing) +local org_eat = minetest.do_item_eat +minetest.do_item_eat = function(hp_change, replace_with_item, 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) @@ -28,7 +28,7 @@ core.do_item_eat = function(hp_change, replace_with_item, itemstack, user, point -- Don't allow eating when player has full hunger bar (some exceptional items apply) if can_eat_when_full or (mcl_hunger.get_hunger(user) < 20) then itemstack = mcl_hunger.eat(hp_change, replace_with_item, itemstack, user, pointed_thing) - for _, callback in pairs(core.registered_on_item_eats) do + for _, callback in pairs(minetest.registered_on_item_eats) do local result = callback(hp_change, replace_with_item, itemstack, user, pointed_thing, old_itemstack) if result then return result @@ -63,7 +63,7 @@ function mcl_hunger.eat(hp_change, replace_with_item, itemstack, user, pointed_t def = {} if type(hp_change) ~= "number" then hp_change = 1 - core.log("error", "Wrong on_use() definition for item '" .. item .. "'") + minetest.log("error", "Wrong on_use() definition for item '" .. item .. "'") end def.saturation = hp_change def.replace = replace_with_item From 9ed83bd1961260cf5b391cda8f702550804104ea Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Feb 2019 21:51:40 +0100 Subject: [PATCH 0259/1107] Drop food eating limits in Creative Mode --- mods/HELP/mcl_doc_basics/init.lua | 3 ++- mods/ITEMS/mcl_cake/init.lua | 6 +++--- mods/ITEMS/mcl_end/chorus_plant.lua | 2 +- mods/ITEMS/mcl_mobitems/init.lua | 2 +- mods/PLAYER/mcl_hunger/hunger.lua | 17 ++++++++++++----- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/mods/HELP/mcl_doc_basics/init.lua b/mods/HELP/mcl_doc_basics/init.lua index 3e367d6a..f4980bfe 100644 --- a/mods/HELP/mcl_doc_basics/init.lua +++ b/mods/HELP/mcl_doc_basics/init.lua @@ -770,8 +770,9 @@ S("• Creative inventory is available to obtain most items easily").."\n".. S("• Hand breaks all default blocks instantly").."\n".. S("• Greatly increased hand pointing range").."\n".. S("• Mined blocks don't drop items").."\n".. +S("• Items don't get used up").."\n".. S("• Tools don't wear off").."\n".. -S("• Bows have infinite arrows").."\n".. +S("• You can eat food whenever you want").."\n".. S("• You can always use the minimap").."\n\n".. S("Damage is not affected by Creative Mode, it needs to be disabled seperately.") diff --git a/mods/ITEMS/mcl_cake/init.lua b/mods/ITEMS/mcl_cake/init.lua index fdc11015..75542fb9 100644 --- a/mods/ITEMS/mcl_cake/init.lua +++ b/mods/ITEMS/mcl_cake/init.lua @@ -51,7 +51,7 @@ minetest.register_node("mcl_cake:cake", { on_rightclick = function(pos, node, clicker, itemstack) 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" then + if newcake:get_name() ~= "mcl_cake:cake" or minetest.settings:get_bool("creative_mode") == true then minetest.add_node(pos,{type="node",name="mcl_cake:cake_6",param2=0}) end end, @@ -71,7 +71,7 @@ local register_slice = function(level, nodebox, desc) on_rightclick = function(pos, node, clicker, itemstack) local newcake = minetest.do_item_eat(2, ItemStack(after_eat), ItemStack(this), clicker, {type="nothing"}) -- Check if we were allowed to eat - if newcake:get_name() ~= this then + if newcake:get_name() ~= this or minetest.settings:get_bool("creative_mode") == true then minetest.add_node(pos,{type="node",name=after_eat,param2=0}) end end @@ -80,7 +80,7 @@ local register_slice = function(level, nodebox, desc) on_rightclick = function(pos, node, clicker, itemstack) local newcake = minetest.do_item_eat(2, 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 then + if newcake:get_name() ~= this or minetest.settings:get_bool("creative_mode") == true then minetest.remove_node(pos) core.check_for_falling(pos) end diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index 882971f1..9793862e 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -339,7 +339,7 @@ local eat_chorus_fruit = function(itemstack, player, pointed_thing) local count = itemstack:get_count() local new_itemstack = minetest.do_item_eat(0, nil, itemstack, player, pointed_thing) local new_count = new_itemstack:get_count() - if count ~= new_count or new_itemstack:get_name() ~= "mcl_end:chorus_fruit" then + if count ~= new_count or new_itemstack:get_name() ~= "mcl_end:chorus_fruit" or (minetest.settings:get_bool("creative_mode") == true) then random_teleport(player) end return new_itemstack diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index d2c4f2b1..86fe54d1 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -135,7 +135,7 @@ minetest.register_craftitem("mcl_mobitems:cooked_rabbit", { local drink_milk = function(itemstack, player, pointed_thing) local bucket = minetest.do_item_eat(0, "mcl_buckets:bucket_empty", itemstack, player, pointed_thing) -- Check if we were allowed to drink this (eat delay check) - if bucket:get_name() ~= "mcl_mobitems:milk_bucket" and mcl_hunger.active then + if (bucket:get_name() ~= "mcl_mobitems:milk_bucket" and mcl_hunger.active) or minetest.settings:get_bool("creative_mode") == true then mcl_hunger.stop_poison(player) end return bucket diff --git a/mods/PLAYER/mcl_hunger/hunger.lua b/mods/PLAYER/mcl_hunger/hunger.lua index 508b8b9f..461c5f67 100644 --- a/mods/PLAYER/mcl_hunger/hunger.lua +++ b/mods/PLAYER/mcl_hunger/hunger.lua @@ -15,8 +15,10 @@ minetest.do_item_eat = function(hp_change, replace_with_item, itemstack, user, p local name = user:get_player_name() + local creative = minetest.settings:get_bool("creative_mode") == true + -- Special foodstuffs like the cake may disable the eating delay - local no_eat_delay = minetest.get_item_group(itemstack:get_name(), "no_eat_delay") == 1 + local no_eat_delay = creative or (minetest.get_item_group(itemstack:get_name(), "no_eat_delay") == 1) -- Allow eating only after a delay of 2 seconds. This prevents eating as an excessive speed. -- FIXME: time() is not a precise timer, so the actual delay may be +- 1 second, depending on which fraction @@ -24,7 +26,7 @@ minetest.do_item_eat = function(hp_change, replace_with_item, itemstack, user, p -- FIXME: In singleplayer, there's a cheat to circumvent this, simply by pausing the game between eats. -- This is because os.time() obviously does not care about the pause. A fix needs a different timer mechanism. if no_eat_delay or (mcl_hunger.last_eat[name] < 0) or (os.difftime(os.time(), mcl_hunger.last_eat[name]) >= 2) then - local can_eat_when_full = minetest.get_item_group(itemstack:get_name(), "can_eat_when_full") == 1 + local can_eat_when_full = creative or minetest.get_item_group(itemstack:get_name(), "can_eat_when_full") == 1 -- Don't allow eating when player has full hunger bar (some exceptional items apply) if can_eat_when_full or (mcl_hunger.get_hunger(user) < 20) then itemstack = mcl_hunger.eat(hp_change, replace_with_item, itemstack, user, pointed_thing) @@ -136,8 +138,11 @@ local poisonrandomizer = PseudoRandom(os.time()) function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poison, exhaust, poisonchance, sound) return function(itemstack, user, pointed_thing) local itemname = itemstack:get_name() - - if itemstack:take_item() ~= nil and user ~= nil then + local creative = minetest.settings:get_bool("creative_mode") == true + if itemstack:peek_item() ~= nil and user ~= nil then + if not creative then + itemstack:take_item() + end local name = user:get_player_name() local hp = user:get_hp() @@ -242,7 +247,9 @@ function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poiso end --sound:eat - itemstack:add_item(replace_with_item) + if not creative then + itemstack:add_item(replace_with_item) + end end return itemstack end From 0876e76b40100dc67f536e2090f1dcf131868d38 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Feb 2019 22:05:56 +0100 Subject: [PATCH 0260/1107] Fix crash when using chorus fruit on cake --- mods/ITEMS/mcl_end/chorus_plant.lua | 2 +- mods/PLAYER/mcl_hunger/hunger.lua | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index 9793862e..41a91a47 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -333,7 +333,7 @@ local eat_chorus_fruit = function(itemstack, player, pointed_thing) local node_under = minetest.get_node(pointed_thing.under) -- Use pointed node's on_rightclick function first, if present if minetest.registered_nodes[node_under.name] and minetest.registered_nodes[node_under.name].on_rightclick then - return minetest.registered_nodes[node_under.name].on_rightclick(pointed_thing.under, node_under, placer, itemstack) or itemstack + return minetest.registered_nodes[node_under.name].on_rightclick(pointed_thing.under, node_under, player, itemstack) or itemstack end end local count = itemstack:get_count() diff --git a/mods/PLAYER/mcl_hunger/hunger.lua b/mods/PLAYER/mcl_hunger/hunger.lua index 461c5f67..fc200f00 100644 --- a/mods/PLAYER/mcl_hunger/hunger.lua +++ b/mods/PLAYER/mcl_hunger/hunger.lua @@ -1,6 +1,11 @@ -- wrapper for minetest.item_eat (this way we make sure other mods can't break this one) local org_eat = minetest.do_item_eat minetest.do_item_eat = function(hp_change, replace_with_item, itemstack, user, pointed_thing) + + if not user or user:is_player() == false then + return itemstack + end + -- Call on_rightclick if the pointed node defines it if pointed_thing.type == "node" then local node = minetest.get_node(pointed_thing.under) From 6ff637ec69fae824f869dc7af97b257d65a7ecdf Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Feb 2019 02:02:18 +0100 Subject: [PATCH 0261/1107] Add more igloo generation code --- mods/MAPGEN/mcl_structures/init.lua | 124 +++++++++++++++++++++++++++- 1 file changed, 122 insertions(+), 2 deletions(-) diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index 93889604..9beb588f 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -59,18 +59,138 @@ mcl_structures.generate_desert_well = function(pos) return minetest.place_schematic(newpos, path, "0", nil, true) end +mcl_structures.generate_igloo = function(pos) + -- TODO: Check if we're allowed to destroy nodes + -- FIXME: Some nodes (water, ice) don't get overwritten by ladder + -- FIXME: Nodes at Y=0 don't get overwritten by ladder + -- TODO: Check if basement generation would not be too obvious + -- TODO: Generate basement with 50% chance only + local success, rotation = mcl_structures.generate_igloo_top(pos) + if success then + local buffer = pos.y - (mcl_vars.mg_bedrock_overworld_max + 1) + if buffer <= 19 then + return + end + local depth = math.random(19, buffer) + local bpos = {x=pos.x, y=pos.y-depth, z=pos.z} + -- trapdoor position + local tpos + local dir, tdir + if rotation == "0" then + dir = {x=-1, y=0, z=0} + tdir = {x=1, y=0, z=0} + tpos = {x=pos.x+7, y=pos.y-1, z=pos.z+3} + elseif rotation == "90" then + dir = {x=0, y=0, z=-1} + tdir = {x=0, y=0, z=-1} + tpos = {x=pos.x+3, y=pos.y-1, z=pos.z+1} + elseif rotation == "180" then + dir = {x=1, y=0, z=0} + tdir = {x=-1, y=0, z=0} + tpos = {x=pos.x+1, y=pos.y-1, z=pos.z+3} + elseif rotation == "270" then + dir = {x=0, y=0, z=1} + tdir = {x=0, y=0, z=1} + tpos = {x=pos.x+3, y=pos.y-1, z=pos.z+7} + else + return success + end + -- TODO: more reliable param2 + minetest.set_node(tpos, {name="mcl_doors:trapdoor", param2=20+minetest.dir_to_facedir(dir)}) + local set_brick = function(pos) + local c = math.random(1, 3) -- cracked chance + local m = math.random(1, 10) -- chance for monster egg + local brick + if m == 1 then + if c == 1 then + brick = "mcl_monster_eggs:monster_egg_stonebrickcracked" + else + brick = "mcl_monster_eggs:monster_egg_stonebrick" + end + else + if c == 1 then + brick = "mcl_core:stonebrickcracked" + else + brick = "mcl_core:stonebrick" + end + end + minetest.set_node(pos, {name=brick}) + end + local ladder_param2 = minetest.dir_to_wallmounted(tdir) + for y=1, depth-5 do + set_brick({x=tpos.x-1,y=tpos.y-y,z=tpos.z }) + set_brick({x=tpos.x+1,y=tpos.y-y,z=tpos.z }) + set_brick({x=tpos.x ,y=tpos.y-y,z=tpos.z-1}) + set_brick({x=tpos.x ,y=tpos.y-y,z=tpos.z+1}) + minetest.set_node({x=tpos.x,y=tpos.y-y,z=tpos.z}, {name="mcl_core:ladder", param2=ladder_param2}) + end + mcl_structures.generate_igloo_basement(bpos, rotation) + end + return success +end + mcl_structures.generate_igloo_top = function(pos) -- FIXME: This spawns bookshelf instead of furnace. Fix this! -- Furnace does ot work atm because apparently meta is not set. :-( local newpos = {x=pos.x,y=pos.y-1,z=pos.z} local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_igloo_top.mts" - return minetest.place_schematic(newpos, path, "random", nil, true) + local rotation = tostring(math.random(0,3)*90) + return minetest.place_schematic(newpos, path, rotation, nil, true), rotation end mcl_structures.generate_igloo_basement = function(pos, orientation) -- TODO: Add brewing stand + -- TODO: Spawn villager and zombie villager local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_igloo_basement.mts" - return minetest.place_schematic(pos, path, orientation, nil, true) + + local success = minetest.place_schematic(pos, path, orientation, nil, true) + if success then + local chest_offset + if orientation == "0" then + chest_offset = {x=5, y=1, z=5} + elseif orientation == "90" then + chest_offset = {x=5, y=1, z=3} + elseif orientation == "180" then + chest_offset = {x=3, y=1, z=1} + elseif orientation == "270" then + chest_offset = {x=1, y=1, z=5} + else + return success + end + -- FIXME: Use better seeding + local pr = PseudoRandom(math.random(0, 4294967295)) + local size = {x=9,y=5,z=7} + local lootitems = mcl_loot.get_multi_loot({ + { + stacks_min = 1, + stacks_max = 1, + items = { + { itemstring = "mcl_core:apple_gold", weight = 1 }, + } + }, + { + stacks_min = 2, + stacks_max = 8, + items = { + { itemstring = "mcl_core:coal_lump", weight = 15, amount_min = 1, amount_max = 4 }, + { itemstring = "mcl_core:apple", weight = 15, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_farming:wheat_item", weight = 10, amount_min = 2, amount_max = 3 }, + { itemstring = "mcl_core:gold_nugget", weight = 10, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_mobitems:rotten_flesh", weight = 10 }, + { itemstring = "mcl_tools:axe_stone", weight = 2 }, + { itemstring = "mcl_core:emerald", weight = 1 }, + } + }}, pr) + + local chest_pos = vector.add(pos, chest_offset) + local meta = minetest.get_meta(chest_pos) + local inv = meta:get_inventory() + inv:set_size("main", 9*3) + for i=1, #lootitems do + inv:add_item("main", lootitems[i]) + end + end + return success end mcl_structures.generate_boulder = function(pos) From 9105f248b40417169e695951e30526a9f5d2ca2e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Feb 2019 02:23:51 +0100 Subject: [PATCH 0262/1107] More secure igloo generation --- mods/MAPGEN/mcl_structures/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index 9beb588f..552691bf 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -63,11 +63,12 @@ mcl_structures.generate_igloo = function(pos) -- TODO: Check if we're allowed to destroy nodes -- FIXME: Some nodes (water, ice) don't get overwritten by ladder -- FIXME: Nodes at Y=0 don't get overwritten by ladder + -- FIXME: Apply basement height limit in other dimensions -- TODO: Check if basement generation would not be too obvious -- TODO: Generate basement with 50% chance only local success, rotation = mcl_structures.generate_igloo_top(pos) if success then - local buffer = pos.y - (mcl_vars.mg_bedrock_overworld_max + 1) + local buffer = pos.y - (mcl_vars.mg_lava_overworld_max + 10) if buffer <= 19 then return end @@ -140,6 +141,7 @@ end mcl_structures.generate_igloo_basement = function(pos, orientation) -- TODO: Add brewing stand + -- TODO: Add monster eggs -- TODO: Spawn villager and zombie villager local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_igloo_basement.mts" From da625b569ac26f6d09bd3e9458913bb96d1f8651 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Feb 2019 03:00:45 +0100 Subject: [PATCH 0263/1107] Spawn minecarts in railcorridor chests --- mods/MAPGEN/tsm_railcorridors/gameconfig.lua | 9 +++++++++ mods/MAPGEN/tsm_railcorridors/init.lua | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/mods/MAPGEN/tsm_railcorridors/gameconfig.lua b/mods/MAPGEN/tsm_railcorridors/gameconfig.lua index df86f587..b0c255ba 100644 --- a/mods/MAPGEN/tsm_railcorridors/gameconfig.lua +++ b/mods/MAPGEN/tsm_railcorridors/gameconfig.lua @@ -98,6 +98,15 @@ function tsm_railcorridors.get_treasures(pr) { 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 }, + } } } diff --git a/mods/MAPGEN/tsm_railcorridors/init.lua b/mods/MAPGEN/tsm_railcorridors/init.lua index 358b6521..57c18379 100644 --- a/mods/MAPGEN/tsm_railcorridors/init.lua +++ b/mods/MAPGEN/tsm_railcorridors/init.lua @@ -68,7 +68,8 @@ end -- Probability for every part of a corridor to contain a cart -- Disabled because cart spawning creates error message spam: -- “m_static_exists=true but static data doesn't actually exist in (x,y,z) --- TODO: Set back to 0.05 if this is fixedd. +-- TODO: Set back to 0.05 when this is fixed. +-- TODO: Remove minecarts from loot table when minecarts spawn on rails. local probability_cart = P(0) --[[ setting = tonumber(minetest.settings:get("tsm_railcorridors_probability_cart")) From 62159b0aa02bc804a96b09ad458d8fe592175d96 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Feb 2019 04:32:20 +0100 Subject: [PATCH 0264/1107] Core mapgen: Extend some stuff to emin,emax --- mods/MAPGEN/mcl_mapgen_core/init.lua | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 2266e886..02645d0c 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1736,8 +1736,8 @@ minetest.register_on_generated(function(minp, maxp, seed) -- Big lava seas by replacing air below a certain height if mcl_vars.mg_lava then - lvm_used = set_layers(c_lava, c_air, mcl_vars.mg_overworld_min, mcl_vars.mg_lava_overworld_max, minp, maxp, lvm_used) - lvm_used = set_layers(c_nether_lava, c_air, mcl_vars.mg_nether_min, mcl_vars.mg_lava_nether_max, minp, maxp, lvm_used) + lvm_used = set_layers(c_lava, c_air, mcl_vars.mg_overworld_min, mcl_vars.mg_lava_overworld_max, emin, emax, lvm_used) + lvm_used = set_layers(c_nether_lava, c_air, mcl_vars.mg_nether_min, mcl_vars.mg_lava_nether_max, emin, emax, lvm_used) end -- Clay, vines, cocoas @@ -1797,12 +1797,12 @@ minetest.register_on_generated(function(minp, maxp, seed) -- Nether block fixes: -- * Replace water with Nether lava. -- * Replace stone, sand dirt in v6 so the Nether works in v6. - elseif minp.y <= mcl_vars.mg_nether_max and maxp.y >= mcl_vars.mg_nether_min then + elseif emin.y <= mcl_vars.mg_nether_max and emax.y >= mcl_vars.mg_nether_min then local nodes if mg_name == "v6" then - nodes = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:water_source", "mcl_core:stone", "mcl_core:sand", "mcl_core:dirt"}) + 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(minp, maxp, {"mcl_core:water_source"}) + nodes = minetest.find_nodes_in_area(emin, emax, {"mcl_core:water_source"}) end for n=1, #nodes do local p_pos = area:index(nodes[n].x, nodes[n].y, nodes[n].z) @@ -1822,12 +1822,12 @@ minetest.register_on_generated(function(minp, maxp, seed) -- * 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 + elseif emin.y <= mcl_vars.mg_end_max and emax.y >= mcl_vars.mg_end_min then local nodes if mg_name == "v6" then - nodes = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:water_source", "mcl_core:stone", "mcl_core:sand", "mcl_core:dirt"}) + 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(minp, maxp, {"mcl_core:water_source"}) + nodes = minetest.find_nodes_in_area(emin, emax, {"mcl_core:water_source"}) end for n=1, #nodes do local y = nodes[n].y From b6c21ee841bcae712c7f4ba2954b0c1c31842a97 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Feb 2019 08:08:51 +0100 Subject: [PATCH 0265/1107] Make in-water color less opaque --- mods/ITEMS/mcl_core/nodes_liquid.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_liquid.lua b/mods/ITEMS/mcl_core/nodes_liquid.lua index 40de3aeb..7d738690 100644 --- a/mods/ITEMS/mcl_core/nodes_liquid.lua +++ b/mods/ITEMS/mcl_core/nodes_liquid.lua @@ -37,7 +37,7 @@ minetest.register_node("mcl_core:water_flowing", { liquid_alternative_source = "mcl_core:water_source", liquid_viscosity = WATER_VISC, liquid_range = 7, - post_effect_color = {a=240, r=0x03, g=0x3C, b=0x5C}, + post_effect_color = {a=209, r=0x03, g=0x3C, b=0x5C}, groups = { water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1, freezes=1, melt_around=1, dig_by_piston=1}, _mcl_blast_resistance = 500, -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode @@ -80,7 +80,7 @@ Water interacts with lava in various ways: liquid_alternative_source = "mcl_core:water_source", liquid_viscosity = WATER_VISC, liquid_range = 7, - post_effect_color = {a=240, r=0x03, g=0x3C, b=0x5C}, + post_effect_color = {a=209, r=0x03, g=0x3C, b=0x5C}, stack_max = 64, groups = { water=3, liquid=3, puts_out_fire=1, freezes=1, not_in_creative_inventory=1, dig_by_piston=1}, _mcl_blast_resistance = 500, From d4fe313077b1deb73975d440f51512fba4290ce4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Feb 2019 08:26:52 +0100 Subject: [PATCH 0266/1107] Mobs: Fix line-of-sight handling (thanks, chon!) --- mods/ENTITIES/mcl_mobs/api.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 969d4f0c..b508b23a 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -256,8 +256,7 @@ local line_of_sight = function(self, pos1, pos2, stepsize) -- 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 - or minetest.registered_nodes[nn].drawtype == "nodebox") do + and minetest.registered_nodes[nn].walkable == false do -- Check if you can still move forward if td < ad + stepsize then From 37b9b6fbfc18ffeb2c2b871aa610461aac8daa9b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Feb 2019 08:51:09 +0100 Subject: [PATCH 0267/1107] If mob jumped against wall 4 times, turn around --- mods/ENTITIES/mcl_mobs/api.lua | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index b508b23a..3f1eeeb0 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -805,6 +805,22 @@ local do_jump = function(self) 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 From 66c99efb2ff0d70a74fc12bfaa6fc636eb447c7f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Feb 2019 10:57:23 +0100 Subject: [PATCH 0268/1107] Hide "useless" items from creative and craft guide --- mods/ENTITIES/mobs_mc/ghast.lua | 5 ++++- mods/ENTITIES/mobs_mc/rabbit.lua | 3 ++- mods/HUD/mcl_inventory/creative.lua | 26 ++++++++++++++++---------- mods/ITEMS/mcl_mobitems/init.lua | 19 +++++++++++-------- mods/ITEMS/mcl_potions/init.lua | 22 ++++++++++++++-------- 5 files changed, 47 insertions(+), 28 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index 5cb0080f..26912f43 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -43,7 +43,10 @@ mobs:register_mob("mobs_mc:ghast", { chance = 1, min = 0, max = 2,}, - {name = mobs_mc.items.ghast_tear, + -- TODO: drop tear when it's useful + -- ghast tear replaced with gunpowder + --{name = mobs_mc.items.ghast_tear, + {name = mobs_mc.items.gunpowder, chance = 1, min = 0, max = 1,}, diff --git a/mods/ENTITIES/mobs_mc/rabbit.lua b/mods/ENTITIES/mobs_mc/rabbit.lua index d0a8d849..a92c93f9 100644 --- a/mods/ENTITIES/mobs_mc/rabbit.lua +++ b/mods/ENTITIES/mobs_mc/rabbit.lua @@ -34,7 +34,8 @@ local rabbit = { drops = { {name = mobs_mc.items.rabbit_raw, chance = 1, min = 0, max = 1}, {name = mobs_mc.items.rabbit_hide, chance = 1, min = 0, max = 1}, - {name = mobs_mc.items.rabbit_foot, chance = 10, min = 1, max = 1}, + -- TODO: Drop rabbit's foot when it's useful + --{name = mobs_mc.items.rabbit_foot, chance = 10, min = 1, max = 1}, }, water_damage = 1, lava_damage = 4, diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index aa38dbd6..65c977df 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -4,8 +4,10 @@ local players = {} -- Containing all the items for each Creative Mode tab local inventory_lists = {} +-- TODO: Brewing is disabled. Add brewing (uncommented code) when it is implemented properly + -- Create tables -local builtin_filter_ids = {"blocks","deco","redstone","rail","food","tools","combat","brew","matr","misc","all"} +local builtin_filter_ids = {"blocks","deco","redstone","rail","food","tools","combat",--[["brew",]]"matr","misc","all"} for _, f in pairs(builtin_filter_ids) do inventory_lists[f] = {} end @@ -55,10 +57,11 @@ do table.insert(inventory_lists["combat"], name) nonmisc = true end - if def.groups.brewitem then - table.insert(inventory_lists["brew"], name) - nonmisc = true - end + -- TODO: add brew + --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 @@ -178,7 +181,7 @@ noffset_y = 8.12 next_noffset("food") next_noffset("tools") next_noffset("combat") -next_noffset("brew") +--next_noffset("brew") -- TODO: add brew next_noffset("matr") next_noffset("inv", true) @@ -197,7 +200,7 @@ hoch["default"] = "" hoch["food"] = "^[transformfy" hoch["tools"] = "^[transformfy" hoch["combat"] = "^[transformfy" -hoch["brew"] = "^[transformfy" +--hoch["brew"] = "^[transformfy" -- TODO: add brew hoch["matr"] = "^[transformfy" hoch["inv"] = "^[transformfy" @@ -213,7 +216,7 @@ local function reset_menu_item_bg() bg["food"] = dark_bg bg["tools"] = dark_bg bg["combat"] = dark_bg - bg["brew"] = dark_bg + --bg["brew"] = dark_bg -- TODO: add brew bg["matr"] = dark_bg bg["inv"] = dark_bg bg["default"] = dark_bg @@ -380,8 +383,9 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz "tooltip[tools;Tools]".. tab(name, "combat") .. "tooltip[combat;Combat]".. - tab(name, "brew") .. - "tooltip[brew;Brewing]".. + -- TODO: Add brew + --tab(name, "brew") .. + --"tooltip[brew;Brewing]".. tab(name, "matr") .. "tooltip[matr;Materials]".. tab(name, "inv") .. @@ -450,10 +454,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if players[name].page == "combat" then return end set_inv_page("combat",player) page = "combat" + --[[ TODO: add brew 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) diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index 86fe54d1..0bb5ea9c 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -198,7 +198,7 @@ minetest.register_craftitem("mcl_mobitems:blaze_powder", { _doc_items_longdesc = "This item is mainly used for crafting.", wield_image = "mcl_mobitems_blaze_powder.png", inventory_image = "mcl_mobitems_blaze_powder.png", - groups = { brewitem = 1 }, + groups = { craftitem = 1, brewitem = 1 }, stack_max = 64, }) @@ -207,25 +207,27 @@ minetest.register_craftitem("mcl_mobitems:magma_cream", { _doc_items_longdesc = "Magma cream is a crafting component.", wield_image = "mcl_mobitems_magma_cream.png", inventory_image = "mcl_mobitems_magma_cream.png", - groups = { brewitem = 1 }, + groups = { craftitem = 1, brewitem = 1 }, stack_max = 64, }) minetest.register_craftitem("mcl_mobitems:ghast_tear", { description = "Ghast Tear", - _doc_items_longdesc = "A ghast tear is dropped from dead ghasts. It has no purpose yet.", + _doc_items_longdesc = "Place this item in an item frame as decoration.", wield_image = "mcl_mobitems_ghast_tear.png", inventory_image = "mcl_mobitems_ghast_tear.png", - groups = { brewitem = 1 }, + -- TODO: Reveal item when it's useful + groups = { brewitem = 1, not_in_creative_inventory = 1 }, stack_max = 64, }) minetest.register_craftitem("mcl_mobitems:nether_star", { description = "Nether Star", - _doc_items_longdesc = "A nether star is a crafting component. It is dropped from the Wither.", + _doc_items_longdesc = "A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration.", wield_image = "mcl_mobitems_nether_star.png", inventory_image = "mcl_mobitems_nether_star.png", - groups = { craftitem = 1 }, + -- TODO: Reveal item when it's useful + groups = { craftitem = 1, not_in_creative_inventory = 1 }, stack_max = 64, }) @@ -258,10 +260,11 @@ minetest.register_craftitem("mcl_mobitems:rabbit_hide", { minetest.register_craftitem("mcl_mobitems:rabbit_foot", { description = "Rabbit's Foot", - _doc_items_longdesc = "This item currently has no purpose.", + _doc_items_longdesc = "Must be your lucky day! Place this item in an item frame for decoration.", wield_image = "mcl_mobitems_rabbit_foot.png", inventory_image = "mcl_mobitems_rabbit_foot.png", - groups = { brewitem = 1 }, + -- TODO: Reveal item when it's useful + groups = { brewitem = 1, not_in_creative_inventory = 1 }, stack_max = 64, }) diff --git a/mods/ITEMS/mcl_potions/init.lua b/mods/ITEMS/mcl_potions/init.lua index 277267b0..fa4349c0 100644 --- a/mods/ITEMS/mcl_potions/init.lua +++ b/mods/ITEMS/mcl_potions/init.lua @@ -1,11 +1,12 @@ -local brewhelp = "This item currently has no purpose." +local brewhelp = "Put this item in an item frame for decoration. It's useless otherwise." minetest.register_craftitem("mcl_potions:fermented_spider_eye", { description = "Fermented Spider Eye", _doc_items_longdesc = brewhelp, wield_image = "mcl_potions_spider_eye_fermented.png", inventory_image = "mcl_potions_spider_eye_fermented.png", - groups = { brewitem = 1 }, + -- TODO: Reveal item when it's actually useful + groups = { brewitem = 1, not_in_creative_inventory = 1, not_in_craft_guide = 1 }, stack_max = 64, }) @@ -218,7 +219,8 @@ minetest.register_craftitem("mcl_potions:potion_awkward", { stack_max = 1, inventory_image = potion_image("#0000FF"), wield_image = potion_image("#0000FF"), - groups = {brewitem=1, food=3, can_eat_when_full=1}, + -- TODO: Reveal item when it's actually useful + groups = {brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=1}, on_place = minetest.item_eat(0, "mcl_potions:glass_bottle"), on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), }) @@ -229,7 +231,8 @@ minetest.register_craftitem("mcl_potions:potion_mundane", { stack_max = 1, inventory_image = potion_image("#0000FF"), wield_image = potion_image("#0000FF"), - groups = {brewitem=1, food=3, can_eat_when_full=1}, + -- TODO: Reveal item when it's actually useful + groups = {brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=1 }, on_place = minetest.item_eat(0, "mcl_potions:glass_bottle"), on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), }) @@ -240,16 +243,18 @@ minetest.register_craftitem("mcl_potions:potion_thick", { stack_max = 1, inventory_image = potion_image("#0000FF"), wield_image = potion_image("#0000FF"), - groups = {brewitem=1, food=3, can_eat_when_full=1}, + -- TODO: Reveal item when it's actually useful + groups = {brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=1 }, on_place = minetest.item_eat(0, "mcl_potions:glass_bottle"), on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), }) minetest.register_craftitem("mcl_potions:speckled_melon", { description = "Glistering Melon", - _doc_items_longdesc = brewhelp, + _doc_items_longdesc = "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 }, + -- TODO: Reveal item when it's actually useful + groups = { brewitem = 1, not_in_creative_inventory = 1, not_in_craft_guide = 1 }, inventory_image = "mcl_potions_melon_speckled.png", }) @@ -267,6 +272,7 @@ minetest.register_craftitem("mcl_potions:dragon_breath", { _doc_items_longdesc = brewhelp, wield_image = "mcl_potions_dragon_breath.png", inventory_image = "mcl_potions_dragon_breath.png", - groups = { brewitem = 1 }, + -- TODO: Reveal item when it's actually useful + groups = { brewitem = 1, not_in_creative_inventory = 1 }, stack_max = 64, }) From 27fa2c2e664cebd2e1e5445613b68d9d6c4a9a8d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Feb 2019 11:15:53 +0100 Subject: [PATCH 0269/1107] Clean up item categorization in creative inv. --- mods/ITEMS/REDSTONE/mesecons_wires/init.lua | 2 +- mods/ITEMS/mcl_beds/api.lua | 4 ++-- mods/ITEMS/mcl_core/nodes_cactuscane.lua | 2 +- mods/ITEMS/mcl_maps/init.lua | 1 + mods/ITEMS/mcl_mobitems/init.lua | 1 + mods/ITEMS/mcl_throwing/init.lua | 1 + 6 files changed, 7 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_wires/init.lua b/mods/ITEMS/REDSTONE/mesecons_wires/init.lua index c66d04a5..01bf6bbb 100644 --- a/mods/ITEMS/REDSTONE/mesecons_wires/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_wires/init.lua @@ -195,7 +195,7 @@ local function register_wires() local groups_on = {dig_immediate = 3, mesecon_conductor_craftable = 1, not_in_creative_inventory = 1, attached_node = 1, dig_by_water = 1,destroy_by_lava_flow=1, dig_by_piston = 1} local groups_off = {dig_immediate = 3, mesecon_conductor_craftable = 1, - attached_node = 1, dig_by_water = 1,destroy_by_lava_flow=1, dig_by_piston = 1} + attached_node = 1, dig_by_water = 1,destroy_by_lava_flow=1, dig_by_piston = 1, craftitem = 1} if nodeid ~= "00000000" then groups_off["not_in_creative_inventory"] = 1 end diff --git a/mods/ITEMS/mcl_beds/api.lua b/mods/ITEMS/mcl_beds/api.lua index 407aea97..074d847d 100644 --- a/mods/ITEMS/mcl_beds/api.lua +++ b/mods/ITEMS/mcl_beds/api.lua @@ -63,7 +63,7 @@ function mcl_beds.register_bed(name, def) paramtype2 = "facedir", is_ground_content = false, stack_max = 1, - groups = {handy=1, flammable = 3, bed = 1, dig_by_piston=1, bouncy=66, fall_damage_add_percent=-50}, + groups = {handy=1, flammable = 3, bed = 1, dig_by_piston=1, bouncy=66, fall_damage_add_percent=-50, deco_block = 1}, _mcl_hardness = 0.2, _mcl_blast_resistance = 1, sounds = def.sounds or default_sounds, @@ -184,7 +184,7 @@ function mcl_beds.register_bed(name, def) 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 = 3, bed = 2, dig_by_piston=1, bouncy=33, fall_damage_add_percent=-50}, + groups = {handy = 1, flammable = 3, 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, diff --git a/mods/ITEMS/mcl_core/nodes_cactuscane.lua b/mods/ITEMS/mcl_core/nodes_cactuscane.lua index 9b87ae6f..d0c00654 100644 --- a/mods/ITEMS/mcl_core/nodes_cactuscane.lua +++ b/mods/ITEMS/mcl_core/nodes_cactuscane.lua @@ -71,7 +71,7 @@ minetest.register_node("mcl_core:reeds", { }, }, stack_max = 64, - groups = {dig_immediate=3, craftitem=1, plant=1, non_mycelium_plant=1, dig_by_piston=1}, + groups = {dig_immediate=3, craftitem=1, deco_block=1, plant=1, non_mycelium_plant=1, dig_by_piston=1}, sounds = mcl_sounds.node_sound_leaves_defaults(), node_placement_prediction = "", on_place = mcl_util.generate_on_place_plant_function(function(place_pos, place_node) diff --git a/mods/ITEMS/mcl_maps/init.lua b/mods/ITEMS/mcl_maps/init.lua index 300e1d35..2c7037bf 100644 --- a/mods/ITEMS/mcl_maps/init.lua +++ b/mods/ITEMS/mcl_maps/init.lua @@ -34,6 +34,7 @@ minetest.register_craftitem("mcl_maps:filled_map", { description = "Map", _doc_items_longdesc = "Maps show your surroundings as you explore the world. They can even show you the world like a radar. MAGIC!\nNote: Maps are subject to change in future versions of MineClone 2.", _doc_items_usagehelp = "Hold the map in any of the hotbar slots. This allows you to access the minimap by pressing the minimap key ([F9] by default).\nIn Creative Mode, you don't need this item; the minimap is always available.", + groups = { tool = 1 }, inventory_image = "mcl_maps_map_filled.png^(mcl_maps_map_filled_markings.png^[colorize:#000000)", stack_max = 1, }) diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index 0bb5ea9c..29259d5d 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -274,6 +274,7 @@ minetest.register_craftitem("mcl_mobitems:saddle", { _doc_items_usagehelp = "Rightclick an animal (with the saddle in your hand) to try put on the saddle. Saddles fit on horses, mules, donkeys and pigs. Horses, mules and donkeys need to be tamed first, otherwise they'll reject the saddle. Saddled animals can be mounted by rightclicking them again.", wield_image = "mcl_mobitems_saddle.png", inventory_image = "mcl_mobitems_saddle.png", + groups = { transport = 1 }, stack_max = 1, }) diff --git a/mods/ITEMS/mcl_throwing/init.lua b/mods/ITEMS/mcl_throwing/init.lua index 731e9ce8..cd0356b7 100644 --- a/mods/ITEMS/mcl_throwing/init.lua +++ b/mods/ITEMS/mcl_throwing/init.lua @@ -295,6 +295,7 @@ minetest.register_craftitem("mcl_throwing:snowball", { _doc_items_usagehelp = how_to_throw, inventory_image = "mcl_throwing_snowball.png", stack_max = 16, + groups = { weapon_ranged = 1 }, on_use = throw_function("mcl_throwing:snowball_entity"), _on_dispense = dispense_function, }) From 069f3591e250173564e293ea1c47e91d49c213d7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Feb 2019 11:31:04 +0100 Subject: [PATCH 0270/1107] Add mobs page in creative inventory --- mods/HUD/mcl_inventory/creative.lua | 16 +++++++++++++++- .../textures/mcl_inventory_fnt_mobs.png | Bin 0 -> 158 bytes 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_mobs.png diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 65c977df..7125dcb6 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -7,7 +7,7 @@ local inventory_lists = {} -- TODO: Brewing is disabled. Add brewing (uncommented code) when it is implemented properly -- Create tables -local builtin_filter_ids = {"blocks","deco","redstone","rail","food","tools","combat",--[["brew",]]"matr","misc","all"} +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 @@ -57,6 +57,10 @@ do 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 -- TODO: add brew --if def.groups.brewitem then --table.insert(inventory_lists["brew"], name) @@ -181,6 +185,7 @@ noffset_y = 8.12 next_noffset("food") next_noffset("tools") next_noffset("combat") +next_noffset("mobs") --next_noffset("brew") -- TODO: add brew next_noffset("matr") next_noffset("inv", true) @@ -200,6 +205,7 @@ hoch["default"] = "" hoch["food"] = "^[transformfy" hoch["tools"] = "^[transformfy" hoch["combat"] = "^[transformfy" +hoch["mobs"] = "^[transformfy" --hoch["brew"] = "^[transformfy" -- TODO: add brew hoch["matr"] = "^[transformfy" hoch["inv"] = "^[transformfy" @@ -216,6 +222,7 @@ local function reset_menu_item_bg() bg["food"] = dark_bg bg["tools"] = dark_bg bg["combat"] = dark_bg + bg["mobs"] = dark_bg --bg["brew"] = dark_bg -- TODO: add brew bg["matr"] = dark_bg bg["inv"] = dark_bg @@ -337,6 +344,7 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz food = "mcl_core:apple", tools = "mcl_core:axe_iron", combat = "mcl_core:sword_gold", + mobs = "mobs_mc:cow", brew = "mcl_potions:potion_water", matr = "mcl_core:stick", inv = "mcl_chests:chest", @@ -383,6 +391,8 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz "tooltip[tools;Tools]".. tab(name, "combat") .. "tooltip[combat;Combat]".. + tab(name, "mobs") .. + "tooltip[mobs;Mobs]".. -- TODO: Add brew --tab(name, "brew") .. --"tooltip[brew;Brewing]".. @@ -454,6 +464,10 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) 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" --[[ TODO: add brew elseif fields.brew then if players[name].page == "brew" then return end diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_mobs.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_fnt_mobs.png new file mode 100644 index 0000000000000000000000000000000000000000..26308b6163c30b129c7c81cd56531138db75cbf1 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0y~yU~Fe#U@&K7W?*2rn=A5%fq{W7z$e7@MVpzSp&{EI zF9!w&2F8*gzhDN3XE)Lq7#Q3cArulW>tT_k62660iBWG*yE|JNs3rji{RkH6b4`Yo<$JA3Lv$1N46=?n}E N44$rjF6*2UngHfYGxGod literal 0 HcmV?d00001 From 3976c7c4b921e4a2ca6823b1410f80061d23372d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Feb 2019 11:40:51 +0100 Subject: [PATCH 0271/1107] Add doors and trapdoors to decoration blocks --- mods/ITEMS/mcl_doors/api_doors.lua | 2 +- mods/ITEMS/mcl_doors/api_trapdoors.lua | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_doors/api_doors.lua b/mods/ITEMS/mcl_doors/api_doors.lua index f17e85c8..e3e88279 100644 --- a/mods/ITEMS/mcl_doors/api_doors.lua +++ b/mods/ITEMS/mcl_doors/api_doors.lua @@ -90,7 +90,7 @@ function mcl_doors:register_door(name, def) _doc_items_usagehelp = usagehelp, inventory_image = def.inventory_image, stack_max = 64, - groups = { mesecon_conductor_craftable = 1 }, + groups = { mesecon_conductor_craftable = 1, deco_block = 1 }, on_place = function(itemstack, placer, pointed_thing) if not pointed_thing.type == "node" or not placer or not placer:is_player() then return itemstack diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index 89a4bef5..9e69a552 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -89,6 +89,7 @@ function mcl_doors:register_trapdoor(name, def) local groups_closed = groups groups_closed.trapdoor = 1 + groups_closed.deco_block = 1 minetest.register_node(name, { description = def.description, _doc_items_longdesc = longdesc, @@ -158,6 +159,7 @@ function mcl_doors:register_trapdoor(name, def) } groups_open.trapdoor = 2 + groups_open.not_in_creative_inventory = 1 minetest.register_node(name.."_open", { drawtype = "nodebox", tiles = tiles_open, From 371bc0cb7631c997423fabf00037add675e1fc0a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Feb 2019 12:04:58 +0100 Subject: [PATCH 0272/1107] Creative categories: book, chorusfruit, endpearl --- mods/ITEMS/mcl_books/init.lua | 2 +- mods/ITEMS/mcl_end/chorus_plant.lua | 2 +- mods/ITEMS/mcl_throwing/init.lua | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index 29ae2a02..de96e9e3 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -4,7 +4,7 @@ minetest.register_craftitem("mcl_books:book", { _doc_items_longdesc = "Books are used to make bookshelves and book and quills.", inventory_image = "default_book.png", stack_max = 64, - groups = { book=1 }, + groups = { book=1, craftitem = 1 }, }) if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index 41a91a47..58832b42 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -352,7 +352,7 @@ minetest.register_craftitem("mcl_end:chorus_fruit", { inventory_image = "mcl_end_chorus_fruit.png", on_place = eat_chorus_fruit, on_secondary_use = eat_chorus_fruit, - groups = { food = 2, eatable = 4, can_eat_when_full = 1 }, + groups = { food = 2, transport = 1, eatable = 4, can_eat_when_full = 1 }, _mcl_saturation = 2.4, stack_max = 64, }) diff --git a/mods/ITEMS/mcl_throwing/init.lua b/mods/ITEMS/mcl_throwing/init.lua index cd0356b7..ee0b4fcb 100644 --- a/mods/ITEMS/mcl_throwing/init.lua +++ b/mods/ITEMS/mcl_throwing/init.lua @@ -321,5 +321,6 @@ minetest.register_craftitem("mcl_throwing:ender_pearl", { inventory_image = "mcl_throwing_ender_pearl.png", stack_max = 16, on_use = throw_function("mcl_throwing:ender_pearl_entity"), + groups = { transport = 1 }, }) From 93c86207d9f336cf0459435565baae126fae845e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Feb 2019 20:04:45 +0100 Subject: [PATCH 0273/1107] Fix crash when using milk if damage is disabled --- mods/ITEMS/mcl_mobitems/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index 29259d5d..c070c8a8 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -135,7 +135,7 @@ minetest.register_craftitem("mcl_mobitems:cooked_rabbit", { local drink_milk = function(itemstack, player, pointed_thing) local bucket = minetest.do_item_eat(0, "mcl_buckets:bucket_empty", itemstack, player, pointed_thing) -- Check if we were allowed to drink this (eat delay check) - if (bucket:get_name() ~= "mcl_mobitems:milk_bucket" and mcl_hunger.active) or minetest.settings:get_bool("creative_mode") == true then + if mcl_hunger.active and (bucket:get_name() ~= "mcl_mobitems:milk_bucket" or minetest.settings:get_bool("creative_mode") == true) then mcl_hunger.stop_poison(player) end return bucket From 4bd9be22e01dd1010fb5920b9fcc5717d843fe1f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Feb 2019 21:23:05 +0100 Subject: [PATCH 0274/1107] Apply eat effect when hunger disabled --- mods/PLAYER/mcl_hunger/API.md | 39 +++++- mods/PLAYER/mcl_hunger/api.lua | 148 ++++++++++++++++++++++ mods/PLAYER/mcl_hunger/hunger.lua | 75 ++++------- mods/PLAYER/mcl_hunger/init.lua | 131 +++++-------------- mods/PLAYER/mcl_hunger/register_foods.lua | 11 ++ mods/PLAYER/mcl_playerinfo/depends.txt | 1 - 6 files changed, 247 insertions(+), 158 deletions(-) create mode 100644 mods/PLAYER/mcl_hunger/api.lua create mode 100644 mods/PLAYER/mcl_hunger/register_foods.lua diff --git a/mods/PLAYER/mcl_hunger/API.md b/mods/PLAYER/mcl_hunger/API.md index eb7710fc..3daa6351 100644 --- a/mods/PLAYER/mcl_hunger/API.md +++ b/mods/PLAYER/mcl_hunger/API.md @@ -1,19 +1,35 @@ # API information (WIP) -This API information is WIP. The mod API is still pretty much unofficial; -this mod is mostly seen as standalone for now. +This API information is not complete yet. +The mod API is still pretty much unofficial; this mod is mostly seen +as standalone for now. + This may change in the future development of MineClone 2. Hopefully. -## Before using this mod -This mod is a no-op when the game is started with damage disabled. -Before using any of the functions, first check if global variable -“`mcl_hunger`” is present. +## Mod state +The hunger mechanic is disabled when damage is disabled +(setting `enable_damage=false`). +You can check the hunger state with `mcl_hunger.active`. If it's true, +then hunger is active. -## Hunger level +If the hunger is disabled, most of the functions are no-ops or return +default values. + +## Player values +### Hunger level The hunger level of the player is a whole number between 0 and 20 inclusive. 0 is starving and 20 is full. The hunger level is represented in the HUD by a statbar with 20 half-icons. +### Saturation +To be written ... + +### Exhaustion +To be written ... + ## Functions +This API documentation is not complete yet, more documentation will +come. + ### `mcl_hunger.get_hunger(player)` Returns the current hunger level of `player` (ObjectRef). @@ -21,6 +37,15 @@ Returns the current hunger level of `player` (ObjectRef). Sets the hunger level of `player` (ObjectRef) to `hunger` immediately. `hunger` ***must*** be between 0 and 20 inclusive. +### `mcl_hunger.exhaust(player, exhaust)` +Increase exhaustion of player by `exhaust`. + +### `mcl_hunger.stop_poison(player)` +Immediately stops all poisonings for player. + +### More functions ... +There are more functions (of less importance) available, see `api.lua`. + ## Groups Items in group `food=3` will make a drinking sound and no particles. Items in group `food` with any other rating will make an eating sound and particles, diff --git a/mods/PLAYER/mcl_hunger/api.lua b/mods/PLAYER/mcl_hunger/api.lua new file mode 100644 index 00000000..04c384f9 --- /dev/null +++ b/mods/PLAYER/mcl_hunger/api.lua @@ -0,0 +1,148 @@ +mcl_hunger.registered_foods = {} + +if mcl_hunger.active then + function mcl_hunger.get_hunger(player) + local hunger = player:get_attribute("mcl_hunger:hunger") or 20 + return tonumber(hunger) + end + + function mcl_hunger.get_saturation(player) + local saturation = player:get_attribute("mcl_hunger:saturation") or mcl_hunger.SATURATION_INIT + return tonumber(saturation) + end + + function mcl_hunger.get_exhaustion(player) + local exhaustion = player:get_attribute("mcl_hunger:exhaustion") or 0 + return tonumber(exhaustion) + end + + function mcl_hunger.set_hunger(player, hunger, update_hudbars) + hunger = math.min(20, math.max(0, hunger)) + player:set_attribute("mcl_hunger:hunger", tostring(hunger)) + if update_hudbars ~= false then + hb.change_hudbar(player, "hunger", hunger) + mcl_hunger.update_saturation_hud(player, nil, hunger) + end + return true + end + + function mcl_hunger.set_saturation(player, saturation, update_hudbar) + saturation = math.min(mcl_hunger.get_hunger(player), math.max(0, saturation)) + player:set_attribute("mcl_hunger:saturation", tostring(saturation)) + if update_hudbar ~= false then + mcl_hunger.update_saturation_hud(player, saturation) + end + return true + end + + function mcl_hunger.set_exhaustion(player, exhaustion, update_hudbar) + exhaustion = math.min(mcl_hunger.EXHAUST_LVL, math.max(0.0, exhaustion)) + player:set_attribute("mcl_hunger:exhaustion", tostring(exhaustion)) + if update_hudbar ~= false then + mcl_hunger.update_exhaustion_hud(player, exhaustion) + end + return true + end + + function mcl_hunger.exhaust(playername, increase) + local player = minetest.get_player_by_name(playername) + if not player then return false end + mcl_hunger.set_exhaustion(player, mcl_hunger.get_exhaustion(player) + increase) + if mcl_hunger.get_exhaustion(player) >= mcl_hunger.EXHAUST_LVL then + mcl_hunger.set_exhaustion(player, 0.0) + local h = nil + local satuchanged = false + local s = mcl_hunger.get_saturation(player) + if s > 0 then + mcl_hunger.set_saturation(player, math.max(s - 1.0, 0)) + satuchanged = true + elseif s <= 0.0001 then + h = mcl_hunger.get_hunger(player) + h = math.max(h-1, 0) + mcl_hunger.set_hunger(player, h) + satuchanged = true + end + if satuchanged then + if h ~= nil then h = h end + mcl_hunger.update_saturation_hud(player, mcl_hunger.get_saturation(player), h) + end + end + mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) + return true + end + + function mcl_hunger.saturate(playername, increase, update_hudbar) + local player = minetest.get_player_by_name(playername) + local ok = mcl_hunger.set_saturation(player, math.min(mcl_hunger.get_saturation(player) + increase, mcl_hunger.get_hunger(player))) + if update_hudbar ~= false then + mcl_hunger.update_saturation_hud(player, mcl_hunger.get_saturation(player), mcl_hunger.get_hunger(player)) + end + return ok + end + + function mcl_hunger.register_food(name, hunger_change, replace_with_item, poisontime, poison, exhaust, poisonchance, sound) + if not mcl_hunger.active then + return + end + local food = mcl_hunger.registered_foods + food[name] = {} + food[name].saturation = hunger_change -- hunger points added + food[name].replace = replace_with_item -- what item is given back after eating + food[name].poisontime = poisontime -- time it is poisoning. If this is set, this item is considered poisonous, + -- otherwise the following poison/exhaust fields are ignored + food[name].poison = poison -- poison damage per tick for poisonous food + food[name].exhaust = exhaust -- exhaustion per tick for poisonous food + food[name].poisonchance = poisonchance -- chance percentage that this item poisons the player (default: 100% if poisoning is enabled) + food[name].sound = sound -- special sound that is played when eating + end + + function mcl_hunger.stop_poison(player) + if not mcl_hunger.active then + return + end + mcl_hunger.poison_damage[player:get_player_name()] = 0 + mcl_hunger.poison_hunger[player:get_player_name()] = 0 + mcl_hunger.reset_bars_poison_damage(player) + mcl_hunger.reset_bars_poison_hunger(player) + end + +else + -- When hunger is disabled, the functions are basically no-ops + + function mcl_hunger.get_hunger() + return 20 + end + + function mcl_hunger.get_saturation() + return mcl_hunger.SATURATION_INIT + end + + function mcl_hunger.get_exhaustion() + return 0 + end + + function mcl_hunger.set_hunger() + return false + end + + function mcl_hunger.set_saturation() + return false + end + + function mcl_hunger.set_exhaustion() + return false + end + + function mcl_hunger.exhaust() + return false + end + + function mcl_hunger.saturate() + return false + end + + function mcl_hunger.register_food() end + + function mcl_hunger.stop_poison() end + +end diff --git a/mods/PLAYER/mcl_hunger/hunger.lua b/mods/PLAYER/mcl_hunger/hunger.lua index fc200f00..939aeed9 100644 --- a/mods/PLAYER/mcl_hunger/hunger.lua +++ b/mods/PLAYER/mcl_hunger/hunger.lua @@ -31,7 +31,7 @@ minetest.do_item_eat = function(hp_change, replace_with_item, itemstack, user, p -- FIXME: In singleplayer, there's a cheat to circumvent this, simply by pausing the game between eats. -- This is because os.time() obviously does not care about the pause. A fix needs a different timer mechanism. if no_eat_delay or (mcl_hunger.last_eat[name] < 0) or (os.difftime(os.time(), mcl_hunger.last_eat[name]) >= 2) then - local can_eat_when_full = creative or minetest.get_item_group(itemstack:get_name(), "can_eat_when_full") == 1 + local can_eat_when_full = creative or (mcl_hunger.active == false) or minetest.get_item_group(itemstack:get_name(), "can_eat_when_full") == 1 -- Don't allow eating when player has full hunger bar (some exceptional items apply) if can_eat_when_full or (mcl_hunger.get_hunger(user) < 20) then itemstack = mcl_hunger.eat(hp_change, replace_with_item, itemstack, user, pointed_thing) @@ -48,24 +48,9 @@ minetest.do_item_eat = function(hp_change, replace_with_item, itemstack, user, p return itemstack end --- food functions -local food = {} - -function mcl_hunger.register_food(name, hunger_change, replace_with_item, poisontime, poison, exhaust, poisonchance, sound) - food[name] = {} - food[name].saturation = hunger_change -- hunger points added - food[name].replace = replace_with_item -- what item is given back after eating - food[name].poisontime = poisontime -- time it is poisoning. If this is set, this item is considered poisonous, - -- otherwise the following poison/exhaust fields are ignored - food[name].poison = poison -- poison damage per tick for poisonous food - food[name].exhaust = exhaust -- exhaustion per tick for poisonous food - food[name].poisonchance = poisonchance -- chance percentage that this item poisons the player (default: 100% if poisoning is enabled) - food[name].sound = sound -- special sound that is played when eating -end - function mcl_hunger.eat(hp_change, replace_with_item, itemstack, user, pointed_thing) local item = itemstack:get_name() - local def = food[item] + local def = mcl_hunger.registered_foods[item] if not def then def = {} if type(hp_change) ~= "number" then @@ -80,11 +65,11 @@ function mcl_hunger.eat(hp_change, replace_with_item, itemstack, user, pointed_t end -- Reset HUD bars after poisoning -local function reset_bars_poison_damage(player) +function mcl_hunger.reset_bars_poison_damage(player) hb.change_hudbar(player, "health", nil, nil, "hudbars_icon_health.png", nil, "hudbars_bar_health.png") end -local function reset_bars_poison_hunger(player) +function mcl_hunger.reset_bars_poison_hunger(player) hb.change_hudbar(player, "hunger", nil, nil, "hbhunger_icon.png", nil, "hbhunger_bar.png") if mcl_hunger.debug then hb.change_hudbar(player, "exhaustion", nil, nil, nil, nil, "mcl_hunger_bar_exhaustion.png") @@ -93,6 +78,9 @@ end -- Poison player local function poisonp(tick, time, time_left, damage, exhaustion, name) + if not mcl_hunger.active then + return + end local player = minetest.get_player_by_name(name) -- First check if player is still there if not player then @@ -114,10 +102,10 @@ local function poisonp(tick, time, time_left, damage, exhaustion, name) mcl_hunger.poison_hunger [name] = mcl_hunger.poison_hunger[name] - 1 end if mcl_hunger.poison_damage[name] <= 0 then - reset_bars_poison_damage(player) + mcl_hunger.reset_bars_poison_damage(player) end if mcl_hunger.poison_hunger[name] <= 0 then - reset_bars_poison_hunger(player) + mcl_hunger.reset_bars_poison_hunger(player) end end @@ -130,14 +118,6 @@ local function poisonp(tick, time, time_left, damage, exhaustion, name) end --- Immediately stop all poisonings for this player -function mcl_hunger.stop_poison(player) - mcl_hunger.poison_damage[player:get_player_name()] = 0 - mcl_hunger.poison_hunger[player:get_player_name()] = 0 - reset_bars_poison_damage(player) - reset_bars_poison_hunger(player) -end - local poisonrandomizer = PseudoRandom(os.time()) function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poison, exhaust, poisonchance, sound) @@ -202,7 +182,7 @@ function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poiso }) end - if hunger_change then + if mcl_hunger.active and hunger_change then -- Add saturation (must be defined in item table) local _mcl_saturation = minetest.registered_items[itemname]._mcl_saturation local saturation @@ -225,7 +205,7 @@ function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poiso mcl_hunger.update_saturation_hud(user, mcl_hunger.get_saturation(user), h) end -- Poison - if poisontime then + if mcl_hunger.active and poisontime then local do_poison = false if poisonchance then if poisonrandomizer:next(0,100) < poisonchance then @@ -251,7 +231,6 @@ function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poiso end end - --sound:eat if not creative then itemstack:add_item(replace_with_item) end @@ -260,24 +239,16 @@ function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poiso end end --- player-action based hunger changes -minetest.register_on_dignode(function(pos, oldnode, player) - -- is_fake_player comes from the pipeworks, we are not interested in those - if not player or not player:is_player() or player.is_fake_player == true then - return - end - local name = player:get_player_name() - -- dig event - mcl_hunger.exhaust(name, mcl_hunger.EXHAUST_DIG) -end) +if mcl_hunger.active then + -- player-action based hunger changes + minetest.register_on_dignode(function(pos, oldnode, player) + -- is_fake_player comes from the pipeworks, we are not interested in those + if not player or not player:is_player() or player.is_fake_player == true then + return + end + local name = player:get_player_name() + -- dig event + mcl_hunger.exhaust(name, mcl_hunger.EXHAUST_DIG) + end) +end --- Apply simple poison effect as long there are no real status effect --- TODO: Remove this when status effects are in place - -mcl_hunger.register_food("mcl_farming:potato_item_poison", 2, "", 4, 1, 0, 60) - -mcl_hunger.register_food("mcl_mobitems:rotten_flesh", 4, "", 30, 0, 100, 80) -mcl_hunger.register_food("mcl_mobitems:chicken", 2, "", 30, 0, 100, 30) -mcl_hunger.register_food("mcl_mobitems:spider_eye", 2, "", 4, 1, 0) - -mcl_hunger.register_food("mcl_fishing:pufferfish_raw", 1, "", 60, 1, 300) diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index 6fa973f7..f71dc121 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -8,13 +8,17 @@ end mcl_hunger = {} --- This variable tells you if the hunger gameplay mechanic is active. --- IMPORTANT: If damage is disabled on load time, most of the functions are NOT --- available! Check if mcl_hunger is active before using the API. -mcl_hunger.active = false - - -mcl_hunger.exhaust = function() end +--[[ This variable tells you if the hunger gameplay mechanic is active. +The state of the hunger mechanic will be determined at game start. +Hunger is enabled when damage is enabled. +If the damage setting is changed within the game, this does NOT +update the hunger mechanic, so the game must be restarted for this +to take effect. ]] +if minetest.settings:get_bool("enable_damage") == true then + mcl_hunger.active = true +else + mcl_hunger.active = false +end mcl_hunger.HUD_TICK = 0.1 @@ -31,11 +35,22 @@ mcl_hunger.EXHAUST_LVL = 4000 -- at what exhaustion player saturation gets lower mcl_hunger.SATURATION_INIT = 5 -- Initial saturation for new/respawning players -if minetest.settings:get_bool("enable_damage") then -mcl_hunger.active = true - -- Debug Mode. If enabled, saturation and exhaustion are shown as well. --- NOTE: Read-only. The setting should only be read at the beginning, this mod is not +-- NOTE: Only updated when settings are loaded. +mcl_hunger.debug = false + +-- Cooldown timers for each player, to force a short delay between consuming 2 food items +mcl_hunger.last_eat = {} + +dofile(minetest.get_modpath("mcl_hunger").."/api.lua") +dofile(minetest.get_modpath("mcl_hunger").."/hunger.lua") +dofile(minetest.get_modpath("mcl_hunger").."/register_foods.lua") + +--[[ IF HUNGER IS ENABLED ]] +if mcl_hunger.active == true then + +-- Read debug mode setting +-- The setting should only be read at the beginning, this mod is not -- prepared to change this setting later. mcl_hunger.debug = minetest.settings:get_bool("mcl_hunger_debug") if mcl_hunger.debug == nil then @@ -56,9 +71,6 @@ end mcl_hunger.poison_damage = {} -- damaging poison mcl_hunger.poison_hunger = {} -- food poisoning, increasing hunger --- Cooldown timers for each player, to force a short delay between consuming 2 food items -mcl_hunger.last_eat = {} - -- HUD item ids local hunger_hud = {} @@ -82,8 +94,6 @@ function mcl_hunger.update_exhaustion_hud(player, exhaustion) end end -dofile(minetest.get_modpath("mcl_hunger").."/hunger.lua") - -- register saturation hudbar hb.register_hudbar("hunger", 0xFFFFFF, S("Food"), { icon = "hbhunger_icon.png", bgicon = "hbhunger_bgicon.png", bar = "hbhunger_bar.png" }, 20, 20, false) if mcl_hunger.debug then @@ -91,53 +101,6 @@ if mcl_hunger.debug then hb.register_hudbar("exhaustion", 0xFFFFFF, S("Exhaust."), { icon = "mcl_hunger_icon_exhaustion.png", bgicon = "mcl_hunger_bgicon_exhaustion.png", bar = "mcl_hunger_bar_exhaustion.png" }, 0, mcl_hunger.EXHAUST_LVL, false, S("%s: %d/%d")) end --- API START -- -mcl_hunger.get_hunger = function(player) - local hunger = player:get_attribute("mcl_hunger:hunger") or 20 - return tonumber(hunger) -end - -mcl_hunger.get_saturation = function(player) - local saturation = player:get_attribute("mcl_hunger:saturation") or mcl_hunger.SATURATION_INIT - return tonumber(saturation) -end - -mcl_hunger.get_exhaustion = function(player) - local exhaustion = player:get_attribute("mcl_hunger:exhaustion") or 0 - return tonumber(exhaustion) -end - -mcl_hunger.set_hunger = function(player, hunger, update_hudbars) - hunger = math.min(20, math.max(0, hunger)) - player:set_attribute("mcl_hunger:hunger", tostring(hunger)) - if update_hudbars ~= false then - hb.change_hudbar(player, "hunger", hunger) - mcl_hunger.update_saturation_hud(player, nil, hunger) - end - return true -end - -mcl_hunger.set_saturation = function(player, saturation, update_hudbar) - saturation = math.min(mcl_hunger.get_hunger(player), math.max(0, saturation)) - player:set_attribute("mcl_hunger:saturation", tostring(saturation)) - if update_hudbar ~= false then - mcl_hunger.update_saturation_hud(player, saturation) - end - return true -end - -mcl_hunger.set_exhaustion = function(player, exhaustion, update_hudbar) - exhaustion = math.min(mcl_hunger.EXHAUST_LVL, math.max(0.0, exhaustion)) - player:set_attribute("mcl_hunger:exhaustion", tostring(exhaustion)) - if update_hudbar ~= false then - mcl_hunger.update_exhaustion_hud(player, exhaustion) - end - return true -end - - - --- END OF API -- minetest.register_on_newplayer(function(player) local name = player:get_player_name() mcl_hunger.set_hunger(player, 20, false) @@ -177,41 +140,6 @@ minetest.register_on_punchplayer(function(victim, puncher, time_from_last_punch, end end) -function mcl_hunger.exhaust(playername, increase) - local player = minetest.get_player_by_name(playername) - if not player then return false end - mcl_hunger.set_exhaustion(player, mcl_hunger.get_exhaustion(player) + increase) - if mcl_hunger.get_exhaustion(player) >= mcl_hunger.EXHAUST_LVL then - mcl_hunger.set_exhaustion(player, 0.0) - local h = nil - local satuchanged = false - local s = mcl_hunger.get_saturation(player) - if s > 0 then - mcl_hunger.set_saturation(player, math.max(s - 1.0, 0)) - satuchanged = true - elseif s <= 0.0001 then - h = mcl_hunger.get_hunger(player) - h = math.max(h-1, 0) - mcl_hunger.set_hunger(player, h) - satuchanged = true - end - if satuchanged then - if h ~= nil then h = h end - mcl_hunger.update_saturation_hud(player, mcl_hunger.get_saturation(player), h) - end - end - mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) - return true -end - -function mcl_hunger.saturate(playername, increase, update_hudbar) - local player = minetest.get_player_by_name(playername) - mcl_hunger.set_saturation(player, math.min(mcl_hunger.get_saturation(player) + increase, mcl_hunger.get_hunger(player))) - if update_hudbar ~= false then - mcl_hunger.update_saturation_hud(player, mcl_hunger.get_saturation(player), mcl_hunger.get_hunger(player)) - end -end - local main_timer = 0 local timer = 0 -- Half second timer local timerMult = 1 -- Cycles from 0 to 7, each time when timer hits half a second @@ -255,4 +183,11 @@ minetest.register_globalstep(function(dtime) end end) +--[[ IF HUNGER IS NOT ENABLED ]] +else + +minetest.register_on_joinplayer(function(player) + mcl_hunger.last_eat[player:get_player_name()] = -1 +end) + end diff --git a/mods/PLAYER/mcl_hunger/register_foods.lua b/mods/PLAYER/mcl_hunger/register_foods.lua new file mode 100644 index 00000000..449c1c4f --- /dev/null +++ b/mods/PLAYER/mcl_hunger/register_foods.lua @@ -0,0 +1,11 @@ +-- Apply simple poison effect as long there are no real status effect +-- TODO: Remove this when status effects are in place +-- TODO: Consider moving these to the respective mods + +mcl_hunger.register_food("mcl_farming:potato_item_poison", 2, "", 4, 1, 0, 60) + +mcl_hunger.register_food("mcl_mobitems:rotten_flesh", 4, "", 30, 0, 100, 80) +mcl_hunger.register_food("mcl_mobitems:chicken", 2, "", 30, 0, 100, 30) +mcl_hunger.register_food("mcl_mobitems:spider_eye", 2, "", 4, 1, 0) + +mcl_hunger.register_food("mcl_fishing:pufferfish_raw", 1, "", 60, 1, 300) diff --git a/mods/PLAYER/mcl_playerinfo/depends.txt b/mods/PLAYER/mcl_playerinfo/depends.txt index 29155726..3fb37201 100644 --- a/mods/PLAYER/mcl_playerinfo/depends.txt +++ b/mods/PLAYER/mcl_playerinfo/depends.txt @@ -1,6 +1,5 @@ mcl_init mcl_core mcl_particles -mcl_hunger mcl_death_messages 3d_armor? From d59d789c80950d60d3a1ace79b8aecf6caefc74e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Feb 2019 21:56:52 +0100 Subject: [PATCH 0275/1107] Put boat/minecart in inv when punched in creative --- mods/ENTITIES/mcl_boats/init.lua | 5 +++++ mods/ENTITIES/mcl_minecarts/init.lua | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index c347efb0..a583a078 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -132,6 +132,11 @@ function boat.on_punch(self, puncher) -- Drop boat as item on the ground after punching if not minetest.settings:get_bool("creative_mode") then minetest.add_item(self.object:get_pos(), self._itemstring) + else + local inv = puncher:get_inventory() + if not inv:contains_item("main", self._itemstring) then + inv:add_item("main", self._itemstring) + end end self.object:remove() end diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index e5afcedf..6454c3ed 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -85,6 +85,13 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick) 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() From 77709c80761fff42b1339295dfad2e23ffb4570f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Feb 2019 06:35:32 +0100 Subject: [PATCH 0276/1107] Disable fish achievement --- mods/HUD/mcl_achievements/init.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/HUD/mcl_achievements/init.lua b/mods/HUD/mcl_achievements/init.lua index 83665270..fed23ee3 100644 --- a/mods/HUD/mcl_achievements/init.lua +++ b/mods/HUD/mcl_achievements/init.lua @@ -137,11 +137,14 @@ awards.register_achievement("mcl:acquireIron", { 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", }) +--[[ +-- TODO: Re-enable when fishing rod is available 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 From cfdcd63f3c8662d92be0bf1882a4ba2a3d962c69 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Feb 2019 07:10:10 +0100 Subject: [PATCH 0277/1107] Change dye texture names of "special" dyes --- mods/ITEMS/mcl_dye/init.lua | 49 +++++++++--------- .../{dye_black.png => mcl_dye_black.png} | Bin .../{dye_blue.png => mcl_dye_blue.png} | Bin .../{dye_brown.png => mcl_dye_brown.png} | Bin ...e_lightblue.png => mcl_dye_light_blue.png} | Bin .../{dye_green.png => mcl_dye_lime.png} | Bin .../{dye_white.png => mcl_dye_white.png} | Bin tools/Conversion_Table.csv | 12 ++--- 8 files changed, 31 insertions(+), 30 deletions(-) rename mods/ITEMS/mcl_dye/textures/{dye_black.png => mcl_dye_black.png} (100%) rename mods/ITEMS/mcl_dye/textures/{dye_blue.png => mcl_dye_blue.png} (100%) rename mods/ITEMS/mcl_dye/textures/{dye_brown.png => mcl_dye_brown.png} (100%) rename mods/ITEMS/mcl_dye/textures/{dye_lightblue.png => mcl_dye_light_blue.png} (100%) rename mods/ITEMS/mcl_dye/textures/{dye_green.png => mcl_dye_lime.png} (100%) rename mods/ITEMS/mcl_dye/textures/{dye_white.png => mcl_dye_white.png} (100%) diff --git a/mods/ITEMS/mcl_dye/init.lua b/mods/ITEMS/mcl_dye/init.lua index 5d0f871e..f95aa874 100644 --- a/mods/ITEMS/mcl_dye/init.lua +++ b/mods/ITEMS/mcl_dye/init.lua @@ -64,27 +64,27 @@ local dyelocal = {} -- This collection of colors is partly a historic thing, partly something else. dyelocal.dyes = { - {"white", "Bone Meal", {dye=1, craftitem=1, basecolor_white=1, excolor_white=1, unicolor_white=1}}, - {"grey", "Light Grey Dye", {dye=1, craftitem=1, basecolor_grey=1, excolor_grey=1, unicolor_grey=1}}, - {"dark_grey", "Grey Dye", {dye=1, craftitem=1, basecolor_grey=1, excolor_darkgrey=1, unicolor_darkgrey=1}}, - {"black", "Ink Sac", {dye=1, craftitem=1, basecolor_black=1, excolor_black=1, unicolor_black=1}}, - {"violet", "Purple Dye", {dye=1, craftitem=1, basecolor_magenta=1, excolor_violet=1, unicolor_violet=1}}, - {"blue", "Lapis Lazuli", {dye=1, craftitem=1, basecolor_blue=1, excolor_blue=1, unicolor_blue=1}}, - {"lightblue", "Light Blue Dye", {dye=1, craftitem=1, basecolor_blue=1, excolor_blue=1, unicolor_light_blue=1}}, - {"cyan", "Cyan Dye", {dye=1, craftitem=1, basecolor_cyan=1, excolor_cyan=1, unicolor_cyan=1}}, - {"dark_green", "Cactus Green",{dye=1, craftitem=1, basecolor_green=1, excolor_green=1, unicolor_dark_green=1}}, - {"green", "Lime Dye", {dye=1, craftitem=1, basecolor_green=1, excolor_green=1, unicolor_green=1}}, - {"yellow", "Dandelion Yellow", {dye=1, craftitem=1, basecolor_yellow=1, excolor_yellow=1, unicolor_yellow=1}}, - {"brown", "Cocoa Beans", {dye=1, craftitem=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1}}, - {"orange", "Orange Dye", {dye=1, craftitem=1, basecolor_orange=1, excolor_orange=1, unicolor_orange=1}}, - {"red", "Rose Red", {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_red=1}}, - {"magenta", "Magenta Dye", {dye=1, craftitem=1, basecolor_magenta=1, excolor_red_violet=1,unicolor_red_violet=1}}, - {"pink", "Pink Dye", {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_light_red=1}}, + {"white", "mcl_dye_white", "Bone Meal", {dye=1, craftitem=1, basecolor_white=1, excolor_white=1, unicolor_white=1}}, + {"grey", "dye_grey", "Light Grey Dye", {dye=1, craftitem=1, basecolor_grey=1, excolor_grey=1, unicolor_grey=1}}, + {"dark_grey", "dye_dark_grey", "Grey Dye", {dye=1, craftitem=1, basecolor_grey=1, excolor_darkgrey=1, unicolor_darkgrey=1}}, + {"black", "mcl_dye_black", "Ink Sac", {dye=1, craftitem=1, basecolor_black=1, excolor_black=1, unicolor_black=1}}, + {"violet", "dye_violet", "Purple Dye", {dye=1, craftitem=1, basecolor_magenta=1, excolor_violet=1, unicolor_violet=1}}, + {"blue", "mcl_dye_blue", "Lapis Lazuli", {dye=1, craftitem=1, basecolor_blue=1, excolor_blue=1, unicolor_blue=1}}, + {"lightblue", "mcl_dye_light_blue", "Light Blue Dye", {dye=1, craftitem=1, basecolor_blue=1, excolor_blue=1, unicolor_light_blue=1}}, + {"cyan", "dye_cyan", "Cyan Dye", {dye=1, craftitem=1, basecolor_cyan=1, excolor_cyan=1, unicolor_cyan=1}}, + {"dark_green", "dye_dark_green", "Cactus Green",{dye=1, craftitem=1, basecolor_green=1, excolor_green=1, unicolor_dark_green=1}}, + {"green", "mcl_dye_lime", "Lime Dye", {dye=1, craftitem=1, basecolor_green=1, excolor_green=1, unicolor_green=1}}, + {"yellow", "dye_yellow", "Dandelion Yellow", {dye=1, craftitem=1, basecolor_yellow=1, excolor_yellow=1, unicolor_yellow=1}}, + {"brown", "mcl_dye_brown", "Cocoa Beans", {dye=1, craftitem=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1}}, + {"orange", "dye_orange", "Orange Dye", {dye=1, craftitem=1, basecolor_orange=1, excolor_orange=1, unicolor_orange=1}}, + {"red", "dye_red", "Rose Red", {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_red=1}}, + {"magenta", "dye_magenta", "Magenta Dye", {dye=1, craftitem=1, basecolor_magenta=1, excolor_red_violet=1,unicolor_red_violet=1}}, + {"pink", "dye_pink", "Pink Dye", {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_light_red=1}}, } dyelocal.unicolor_to_dye_id = {} for d=1, #dyelocal.dyes do - for k, _ in pairs(dyelocal.dyes[d][3]) 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 @@ -101,10 +101,11 @@ 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 description = row[2] - local groups = row[3] + local img = row[2] + local description = row[3] + local groups = row[4] local item_name = "mcl_dye:"..name - local item_image = "dye_"..name..".png" + local item_image = img..".png" minetest.register_craftitem(item_name, { inventory_image = item_image, description = description, @@ -293,12 +294,12 @@ mcl_dye.apply_bone_meal = function(pointed_thing) end minetest.register_craftitem("mcl_dye:white", { - inventory_image = "dye_white.png", + inventory_image = "mcl_dye_white.png", description = "Bone Meal", _doc_items_longdesc = "Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.", _doc_items_usagehelp = "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][3], + 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) @@ -331,12 +332,12 @@ minetest.register_craftitem("mcl_dye:white", { }) minetest.register_craftitem("mcl_dye:brown", { - inventory_image = "dye_brown.png", + inventory_image = "mcl_dye_brown.png", _doc_items_longdesc = "Cocoa beans are a brown dye and can be used to plant cocoas.", _doc_items_usagehelp = "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 = "Cocoa Beans", stack_max = 64, - groups = dyelocal.dyes[12][3], + 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, diff --git a/mods/ITEMS/mcl_dye/textures/dye_black.png b/mods/ITEMS/mcl_dye/textures/mcl_dye_black.png similarity index 100% rename from mods/ITEMS/mcl_dye/textures/dye_black.png rename to mods/ITEMS/mcl_dye/textures/mcl_dye_black.png diff --git a/mods/ITEMS/mcl_dye/textures/dye_blue.png b/mods/ITEMS/mcl_dye/textures/mcl_dye_blue.png similarity index 100% rename from mods/ITEMS/mcl_dye/textures/dye_blue.png rename to mods/ITEMS/mcl_dye/textures/mcl_dye_blue.png diff --git a/mods/ITEMS/mcl_dye/textures/dye_brown.png b/mods/ITEMS/mcl_dye/textures/mcl_dye_brown.png similarity index 100% rename from mods/ITEMS/mcl_dye/textures/dye_brown.png rename to mods/ITEMS/mcl_dye/textures/mcl_dye_brown.png diff --git a/mods/ITEMS/mcl_dye/textures/dye_lightblue.png b/mods/ITEMS/mcl_dye/textures/mcl_dye_light_blue.png similarity index 100% rename from mods/ITEMS/mcl_dye/textures/dye_lightblue.png rename to mods/ITEMS/mcl_dye/textures/mcl_dye_light_blue.png diff --git a/mods/ITEMS/mcl_dye/textures/dye_green.png b/mods/ITEMS/mcl_dye/textures/mcl_dye_lime.png similarity index 100% rename from mods/ITEMS/mcl_dye/textures/dye_green.png rename to mods/ITEMS/mcl_dye/textures/mcl_dye_lime.png diff --git a/mods/ITEMS/mcl_dye/textures/dye_white.png b/mods/ITEMS/mcl_dye/textures/mcl_dye_white.png similarity index 100% rename from mods/ITEMS/mcl_dye/textures/dye_white.png rename to mods/ITEMS/mcl_dye/textures/mcl_dye_white.png diff --git a/tools/Conversion_Table.csv b/tools/Conversion_Table.csv index 7d2e8612..4871c7d2 100644 --- a/tools/Conversion_Table.csv +++ b/tools/Conversion_Table.csv @@ -303,21 +303,21 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/items,door_spruce.png,/mods/ITEMS/mcl_doors/textures,mcl_doors_door_spruce.png,,,,,,, /assets/minecraft/textures/items,door_wood.png,/mods/ITEMS/mcl_doors/textures,doors_item_wood.png,,,,,,, /assets/minecraft/textures/items,door_iron.png,/mods/ITEMS/mcl_doors/textures,doors_item_steel.png,,,,,,, -/assets/minecraft/textures/items,dye_powder_black.png,/mods/ITEMS/mcl_dye/textures,dye_black.png,,,,,,, -/assets/minecraft/textures/items,dye_powder_blue.png,/mods/ITEMS/mcl_dye/textures,dye_blue.png,,,,,,, -/assets/minecraft/textures/items,dye_powder_brown.png,/mods/ITEMS/mcl_dye/textures,dye_brown.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_black.png,/mods/ITEMS/mcl_dye/textures,mcl_dye_black.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_blue.png,/mods/ITEMS/mcl_dye/textures,mcl_dye_blue.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_brown.png,/mods/ITEMS/mcl_dye/textures,mcl_dye_brown.png,,,,,,, /assets/minecraft/textures/items,dye_powder_cyan.png,/mods/ITEMS/mcl_dye/textures,dye_cyan.png,,,,,,, /assets/minecraft/textures/items,dye_powder_gray.png,/mods/ITEMS/mcl_dye/textures,dye_dark_grey.png,,,,,,, /assets/minecraft/textures/items,dye_powder_green.png,/mods/ITEMS/mcl_dye/textures,dye_dark_green.png,,,,,,, -/assets/minecraft/textures/items,dye_powder_light_blue.png,/mods/ITEMS/mcl_dye/textures,dye_lightblue.png,,,,,,, -/assets/minecraft/textures/items,dye_powder_lime.png,/mods/ITEMS/mcl_dye/textures,dye_green.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_light_blue.png,/mods/ITEMS/mcl_dye/textures,mcl_dye_light_blue.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_lime.png,/mods/ITEMS/mcl_dye/textures,mcl_dye_lime.png,,,,,,, /assets/minecraft/textures/items,dye_powder_magenta.png,/mods/ITEMS/mcl_dye/textures,dye_magenta.png,,,,,,, /assets/minecraft/textures/items,dye_powder_orange.png,/mods/ITEMS/mcl_dye/textures,dye_orange.png,,,,,,, /assets/minecraft/textures/items,dye_powder_pink.png,/mods/ITEMS/mcl_dye/textures,dye_pink.png,,,,,,, /assets/minecraft/textures/items,dye_powder_purple.png,/mods/ITEMS/mcl_dye/textures,dye_violet.png,,,,,,, /assets/minecraft/textures/items,dye_powder_red.png,/mods/ITEMS/mcl_dye/textures,dye_red.png,,,,,,, /assets/minecraft/textures/items,dye_powder_silver.png,/mods/ITEMS/mcl_dye/textures,dye_grey.png,,,,,,, -/assets/minecraft/textures/items,dye_powder_white.png,/mods/ITEMS/mcl_dye/textures,dye_white.png,,,,,,, +/assets/minecraft/textures/items,dye_powder_white.png,/mods/ITEMS/mcl_dye/textures,mcl_dye_white.png,,,,,,, /assets/minecraft/textures/items,dye_powder_yellow.png,/mods/ITEMS/mcl_dye/textures,dye_yellow.png,,,,,,, /assets/minecraft/textures/blocks,chorus_flower_dead.png,/mods/ITEMS/mcl_end/textures,mcl_end_chorus_flower_dead.png,,,,,,, /assets/minecraft/textures/blocks,chorus_flower.png,/mods/ITEMS/mcl_end/textures,mcl_end_chorus_flower.png,,,,,,, From 5897d0743533674566b882e8eb580a1732c599c3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Feb 2019 19:54:12 +0100 Subject: [PATCH 0278/1107] Don't show bed msg if player respawns w/o bed --- mods/PLAYER/mcl_spawn/init.lua | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/mods/PLAYER/mcl_spawn/init.lua b/mods/PLAYER/mcl_spawn/init.lua index 0413219b..9c9079b9 100644 --- a/mods/PLAYER/mcl_spawn/init.lua +++ b/mods/PLAYER/mcl_spawn/init.lua @@ -2,21 +2,26 @@ mcl_spawn = {} -- Returns current spawn position of player. -- If player is nil or not a player, the default spawn point is returned. +-- The second return value is true if spawn point is player-chosen, +-- false otherwise. mcl_spawn.get_spawn_pos = function(player) - local spawn + local spawn, custom_spawn if player ~= nil and player:is_player() then spawn = minetest.string_to_pos(player:get_attribute("mcl_beds:spawn")) + custom_spawn = true end if not spawn or spawn == "" then spawn = minetest.setting_get_pos("static_spawnpoint") + custom_spawn = false end if not spawn then spawn = { x=0, y=0, z=0 } if mg_name == "flat" then spawn.y = mcl_vars.mg_bedrock_overworld_max + 5 end + custom_spawn = false end - return spawn + return spawn, custom_spawn end -- Sets the player's spawn position to pos. @@ -31,8 +36,8 @@ end -- Respawn player at specified respawn position minetest.register_on_respawnplayer(function(player) - local pos = mcl_spawn.get_spawn_pos(player) - if pos then + local pos, custom_spawn = mcl_spawn.get_spawn_pos(player) + if custom_spawn then -- Check if bed is still there -- and the spawning position is free of solid or damaging blocks. local node_bed = minetest.get_node(pos) From 058cb2f1eed3eff36ad34723677c4ce8031f2012 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Feb 2019 20:06:02 +0100 Subject: [PATCH 0279/1107] Rename farmland textures because of MTG clash --- mods/ITEMS/mcl_farming/soil.lua | 4 ++-- ...arming_soil.png => mcl_farming_farmland_dry.png} | Bin ...ng_soil_wet.png => mcl_farming_farmland_wet.png} | Bin tools/Conversion_Table.csv | 4 ++-- 4 files changed, 4 insertions(+), 4 deletions(-) rename mods/ITEMS/mcl_farming/textures/{farming_soil.png => mcl_farming_farmland_dry.png} (100%) rename mods/ITEMS/mcl_farming/textures/{farming_soil_wet.png => mcl_farming_farmland_wet.png} (100%) diff --git a/mods/ITEMS/mcl_farming/soil.lua b/mods/ITEMS/mcl_farming/soil.lua index b89ae402..0b38a5ed 100644 --- a/mods/ITEMS/mcl_farming/soil.lua +++ b/mods/ITEMS/mcl_farming/soil.lua @@ -1,5 +1,5 @@ minetest.register_node("mcl_farming:soil", { - tiles = {"farming_soil.png", "default_dirt.png", "default_dirt.png", "default_dirt.png", "default_dirt.png", "default_dirt.png"}, + tiles = {"mcl_farming_farmland_dry.png", "default_dirt.png"}, description = "Farmland", _doc_items_longdesc = "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", @@ -23,7 +23,7 @@ minetest.register_node("mcl_farming:soil", { }) minetest.register_node("mcl_farming:soil_wet", { - tiles = {"farming_soil_wet.png", "default_dirt.png", "default_dirt.png", "default_dirt.png", "default_dirt.png", "default_dirt.png"}, + tiles = {"mcl_farming_farmland_wet.png", "default_dirt.png"}, description = "Hydrated Farmland", _doc_items_longdesc = "Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmlands 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", diff --git a/mods/ITEMS/mcl_farming/textures/farming_soil.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_farmland_dry.png similarity index 100% rename from mods/ITEMS/mcl_farming/textures/farming_soil.png rename to mods/ITEMS/mcl_farming/textures/mcl_farming_farmland_dry.png diff --git a/mods/ITEMS/mcl_farming/textures/farming_soil_wet.png b/mods/ITEMS/mcl_farming/textures/mcl_farming_farmland_wet.png similarity index 100% rename from mods/ITEMS/mcl_farming/textures/farming_soil_wet.png rename to mods/ITEMS/mcl_farming/textures/mcl_farming_farmland_wet.png diff --git a/tools/Conversion_Table.csv b/tools/Conversion_Table.csv index 4871c7d2..a01d38f2 100644 --- a/tools/Conversion_Table.csv +++ b/tools/Conversion_Table.csv @@ -359,8 +359,8 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/items,seeds_pumpkin.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_pumpkin_seeds.png,,,,,,, /assets/minecraft/textures/blocks,pumpkin_side.png,/mods/ITEMS/mcl_farming/textures,farming_pumpkin_side.png,,,,,,, /assets/minecraft/textures/blocks,pumpkin_top.png,/mods/ITEMS/mcl_farming/textures,farming_pumpkin_top.png,,,,,,, -/assets/minecraft/textures/blocks,farmland_dry.png,/mods/ITEMS/mcl_farming/textures,farming_soil.png,,,,,,, -/assets/minecraft/textures/blocks,farmland_wet.png,/mods/ITEMS/mcl_farming/textures,farming_soil_wet.png,,,,,,, +/assets/minecraft/textures/blocks,farmland_dry.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_farmland_dry.png,,,,,,, +/assets/minecraft/textures/blocks,farmland_wet.png,/mods/ITEMS/mcl_farming/textures,mcl_farming_farmland_wet.png,,,,,,, /assets/minecraft/textures/items,diamond_hoe.png,/mods/ITEMS/mcl_farming/textures,farming_tool_diamondhoe.png,,,,,,, /assets/minecraft/textures/items,gold_hoe.png,/mods/ITEMS/mcl_farming/textures,farming_tool_goldhoe.png,,,,,,, /assets/minecraft/textures/items,iron_hoe.png,/mods/ITEMS/mcl_farming/textures,farming_tool_steelhoe.png,,,,,,, From 729c176ff499ee1c749d54bd38de214eafb511d9 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Feb 2019 21:24:19 +0100 Subject: [PATCH 0280/1107] Texture Converter: Add description.txt --- tools/Texture_Converter.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/Texture_Converter.py b/tools/Texture_Converter.py index 6cb6cdb4..d89a5718 100755 --- a/tools/Texture_Converter.py +++ b/tools/Texture_Converter.py @@ -375,6 +375,11 @@ def convert_textures(): colorize(GRASS, tex_dir+"/blocks/grass_top.png", o[0], str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/default_"+o[2]+".png") colorize_alpha(GRASS, tex_dir+"/blocks/grass_side_overlay.png", o[0], str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/default_"+o[2]+"_side.png") + # Create description file + description = "Automatically converted Minecraft texture pack from MineClone 2 Texture Converter.\nSize: "+str(PXSIZE)+"px×"+str(PXSIZE)+"px" + description_file = open(target_dir("/") + "/description.txt", "w") + description_file.write(description) + description_file.close() print("Textures conversion COMPLETE!") if failed_conversions > 0: From 36060dfb6a5009cd397eba11784e9b491fd37f89 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 7 Feb 2019 22:22:07 +0100 Subject: [PATCH 0281/1107] Converter: Add preview image, use proper folder name --- tools/Texture_Converter.py | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/tools/Texture_Converter.py b/tools/Texture_Converter.py index d89a5718..257e9389 100755 --- a/tools/Texture_Converter.py +++ b/tools/Texture_Converter.py @@ -14,7 +14,6 @@ import shutil, csv, os, tempfile, sys, getopt home = os.environ["HOME"] mineclone2_path = home + "/.minetest/games/mineclone2" working_dir = os.getcwd() -output_dir_name = "New_MineClone_2_Texture_Pack" appname = "Texture_Converter.py" ### SETTINGS ### @@ -100,6 +99,16 @@ For the full help, use: tex_dir = base_dir + "/assets/minecraft/textures" +# Get texture pack name (from directory name) +bdir_split = base_dir.split("/") +output_dir_name = bdir_split[-1] +if len(output_dir_name) == 0: + if len(bdir_split) >= 2: + output_dir_name = base_dir.split("/")[-2] + else: + # Fallback + output_dir_name = "New_MineClone_2_Texture_Pack" + # FUNCTION DEFINITIONS def colorize(colormap, source, colormap_pixel, texture_size, destination): os.system("convert "+colormap+" -crop 1x1+"+colormap_pixel+" -depth 8 -resize "+texture_size+"x"+texture_size+" "+tempfile1.name) @@ -375,11 +384,17 @@ def convert_textures(): colorize(GRASS, tex_dir+"/blocks/grass_top.png", o[0], str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/default_"+o[2]+".png") colorize_alpha(GRASS, tex_dir+"/blocks/grass_side_overlay.png", o[0], str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/default_"+o[2]+"_side.png") - # Create description file - description = "Automatically converted Minecraft texture pack from MineClone 2 Texture Converter.\nSize: "+str(PXSIZE)+"px×"+str(PXSIZE)+"px" - description_file = open(target_dir("/") + "/description.txt", "w") - description_file.write(description) - description_file.close() + # Metadata + if make_texture_pack: + # Create description file + description = "Texture pack for MineClone 2. Automatically converted from a Minecraft resource pack by the MineClone 2 Texture Converter. Size: "+str(PXSIZE)+"×"+str(PXSIZE) + description_file = open(target_dir("/") + "/description.txt", "w") + description_file.write(description) + description_file.close() + + # Create preview image (screenshot.png) + os.system("convert -size 300x200 canvas:transparent "+target_dir("/") + "/screenshot.png") + os.system("composite "+base_dir+"/pack.png "+target_dir("/") + "/screenshot.png -gravity center "+target_dir("/") + "/screenshot.png") print("Textures conversion COMPLETE!") if failed_conversions > 0: From 7d0c647e8b2c1d9e57773e1eed3805a936227d38 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Feb 2019 05:30:05 +0100 Subject: [PATCH 0282/1107] Comment on beetroot seed probability --- mods/ITEMS/mcl_farming/beetroot.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mods/ITEMS/mcl_farming/beetroot.lua b/mods/ITEMS/mcl_farming/beetroot.lua index d88633d9..8fe69358 100644 --- a/mods/ITEMS/mcl_farming/beetroot.lua +++ b/mods/ITEMS/mcl_farming/beetroot.lua @@ -94,6 +94,12 @@ minetest.register_node("mcl_farming:beetroot", { 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 }, From cb8e3fcf82af500bcea04f1e0f7be1c6f9b7adee Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Feb 2019 05:36:43 +0100 Subject: [PATCH 0283/1107] Fix bone meal failing to grow crops when it's dark --- mods/ITEMS/mcl_dye/init.lua | 12 ++++++------ mods/ITEMS/mcl_farming/shared_functions.lua | 7 ++++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/mods/ITEMS/mcl_dye/init.lua b/mods/ITEMS/mcl_dye/init.lua index f95aa874..c347a900 100644 --- a/mods/ITEMS/mcl_dye/init.lua +++ b/mods/ITEMS/mcl_dye/init.lua @@ -203,24 +203,24 @@ mcl_dye.apply_bone_meal = function(pointed_thing) -- Wheat, Potato, Carrot, Pumpkin Stem, Melon Stem: Advance by 2-5 stages elseif string.find(n.name, "mcl_farming:wheat_") ~= nil then local stages = math.random(2, 5) - return mcl_farming:grow_plant("plant_wheat", pos, n, stages) + return mcl_farming:grow_plant("plant_wheat", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:potato_") ~= nil then local stages = math.random(2, 5) - return mcl_farming:grow_plant("plant_potato", pos, n, stages) + return mcl_farming:grow_plant("plant_potato", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:carrot_") ~= nil then local stages = math.random(2, 5) - return mcl_farming:grow_plant("plant_carrot", pos, n, stages) + return mcl_farming:grow_plant("plant_carrot", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:pumpkin_") ~= nil then local stages = math.random(2, 5) - return mcl_farming:grow_plant("plant_pumpkin_stem", pos, n, stages) + return mcl_farming:grow_plant("plant_pumpkin_stem", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:melontige_") ~= nil then local stages = math.random(2, 5) - return mcl_farming:grow_plant("plant_melon_stem", pos, n, stages) + return mcl_farming:grow_plant("plant_melon_stem", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:beetroot_") ~= nil then -- Beetroot: 75% chance to advance to next stage if math.random(1,100) <= 75 then - return mcl_farming:grow_plant("plant_beetroot", pos, n) + 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 -- Cocoa: Advance by 1 stage diff --git a/mods/ITEMS/mcl_farming/shared_functions.lua b/mods/ITEMS/mcl_farming/shared_functions.lua index 0b201ca6..9844dd43 100644 --- a/mods/ITEMS/mcl_farming/shared_functions.lua +++ b/mods/ITEMS/mcl_farming/shared_functions.lua @@ -24,14 +24,15 @@ end -- 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) - if not minetest.get_node_light(pos) then +function mcl_farming:grow_plant(identifier, pos, node, stages, ignore_light) + if not minetest.get_node_light(pos) and not ignore_light then return false end - if minetest.get_node_light(pos) < 10 then + if minetest.get_node_light(pos) < 10 and not ignore_light then return false end From bcf7125f9da75895e3fc284c0489a29852c7110a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Feb 2019 17:55:14 +0100 Subject: [PATCH 0284/1107] Fix mob items not working without maphack priv --- mods/ENTITIES/mcl_mobs/api.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 3f1eeeb0..ebe977e9 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -3576,11 +3576,11 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) local name = placer:get_player_name() local privs = minetest.get_player_privs(name) - if not privs.maphack then - minetest.chat_send_player(name, "You need the “maphack” privilege to change the mob spawner.") - return itemstack - end if mod_mobspawners and under.name == "mcl_mobspawners:spawner" then + if not privs.maphack then + minetest.chat_send_player(name, "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.settings:get_bool("creative_mode") then itemstack:take_item() From 312b17a958ff93c6e398ee922c8c33da0a279181 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Feb 2019 21:59:01 +0100 Subject: [PATCH 0285/1107] Check protection for most nodes --- mods/ITEMS/REDSTONE/mcl_comparators/init.lua | 7 ++- mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 27 ++++++++++ mods/ITEMS/REDSTONE/mcl_droppers/init.lua | 27 ++++++++++ .../REDSTONE/mesecons_commandblock/init.lua | 11 ++-- mods/ITEMS/REDSTONE/mesecons_delayer/init.lua | 14 ++++- .../REDSTONE/mesecons_noteblock/init.lua | 7 ++- .../REDSTONE/mesecons_solarpanel/init.lua | 20 +++++++ mods/ITEMS/mcl_anvils/init.lua | 21 +++++++- mods/ITEMS/mcl_buckets/init.lua | 39 +++++++++++--- mods/ITEMS/mcl_cake/init.lua | 16 ++++++ mods/ITEMS/mcl_chests/init.lua | 54 ++++++++++++++++--- mods/ITEMS/mcl_flowerpots/init.lua | 18 +++++++ mods/ITEMS/mcl_furnaces/init.lua | 8 ++- mods/ITEMS/mcl_hoppers/init.lua | 54 +++++++++++++++++++ mods/ITEMS/mcl_itemframes/init.lua | 32 +++++++++++ mods/ITEMS/mcl_jukebox/init.lua | 32 ++++++++++- mods/ITEMS/mcl_portals/portal_end.lua | 5 ++ .../minetest-3d_armor/3d_armor_stand/init.lua | 23 +++++++- 18 files changed, 389 insertions(+), 26 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/init.lua b/mods/ITEMS/REDSTONE/mcl_comparators/init.lua index 58097213..1feb8889 100644 --- a/mods/ITEMS/REDSTONE/mcl_comparators/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_comparators/init.lua @@ -153,7 +153,12 @@ end local make_rightclick_handler = function(state, mode) local newnodename = "mcl_comparators:comparator_"..state.."_"..flipmode(mode) - return function (pos, node) + return function (pos, node, clicker) + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.record_protection_violation(pos, protname) + return + end minetest.swap_node(pos, {name = newnodename, param2 = node.param2 }) end end diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 0642f7f1..2c3c6b78 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -50,6 +50,33 @@ end local dispenserdef = { is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), + 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, after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) local meta2 = meta diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua index f67cfc4b..be42e79a 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua @@ -63,6 +63,33 @@ local dropperdef = { end meta:from_table(meta2:to_table()) 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, _mcl_blast_resistance = 17.5, _mcl_hardness = 3.5, mesecons = {effector = { diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua index 4047a926..acb1a9d0 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua @@ -131,9 +131,14 @@ local on_rightclick = function(pos, node, player, itemstack, pointed_thing) if not minetest.settings:get_bool("creative_mode") then return end - local privs = minetest.get_player_privs(player:get_player_name()) + local pname = player:get_player_name() + if minetest.is_protected(pos, pname) then + minetest.record_protection_violation(pos, pname) + return + end + local privs = minetest.get_player_privs(pname) if not privs.maphack then - minetest.chat_send_player(player:get_player_name(), "Access denied. You need the “maphack” privilege to edit command blocks.") + minetest.chat_send_player(pname, "Access denied. You need the “maphack” privilege to edit command blocks.") return end @@ -152,7 +157,7 @@ local on_rightclick = function(pos, node, player, itemstack, pointed_thing) "image_button[8,4.5;1,1;doc_button_icon_lores.png;doc;]" .. "label[0,4;"..minetest.formspec_escape(commanderstr).."]" .. "tooltip[doc;Help]" - minetest.show_formspec(player:get_player_name(), "commandblock_"..pos.x.."_"..pos.y.."_"..pos.z, formspec) + minetest.show_formspec(pname, "commandblock_"..pos.x.."_"..pos.y.."_"..pos.z, formspec) end local on_place = function(itemstack, placer, pointed_thing) diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua b/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua index d6c1f95b..ea463844 100644 --- a/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua @@ -254,7 +254,12 @@ minetest.register_node("mesecons_delayer:delayer_off_"..tostring(i), { sunlight_propagates = false, is_ground_content = false, drop = 'mesecons_delayer:delayer_off_1', - on_rightclick = function (pos, node) + on_rightclick = function (pos, node, clicker) + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.report_protection_violation(pos, protname) + return + end if node.name=="mesecons_delayer:delayer_off_1" then minetest.set_node(pos, {name="mesecons_delayer:delayer_off_2", param2=node.param2}) elseif node.name=="mesecons_delayer:delayer_off_2" then @@ -317,7 +322,12 @@ minetest.register_node("mesecons_delayer:delayer_on_"..tostring(i), { sunlight_propagates = false, is_ground_content = false, drop = 'mesecons_delayer:delayer_off_1', - on_rightclick = function (pos, node) + on_rightclick = function (pos, node, clicker) + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.report_protection_violation(pos, protname) + return + end if node.name=="mesecons_delayer:delayer_on_1" then minetest.set_node(pos, {name="mesecons_delayer:delayer_on_2",param2=node.param2}) elseif node.name=="mesecons_delayer:delayer_on_2" then diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua index 191c4436..9d1737ac 100644 --- a/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua @@ -14,7 +14,12 @@ The note block will only play a note when it is below air, otherwise, it stays s groups = {handy=1,axey=1, material_wood=1}, is_ground_content = false, place_param2 = 0, - on_rightclick = function (pos, node) -- change sound when rightclicked + on_rightclick = function (pos, node, clicker) -- change sound when rightclicked + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.record_protection_violation(pos, protname) + return + end node.param2 = (node.param2+1)%24 mesecon.noteblock_play(pos, node.param2) minetest.set_node(pos, node) diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua index 1c66b619..0bd0b737 100644 --- a/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua @@ -27,6 +27,11 @@ minetest.register_node("mesecons_solarpanel:solar_panel_on", { rules = mesecon.rules.pplate, }}, on_rightclick = function(pos, node, clicker, pointed_thing) + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.record_protection_violation(pos, protname) + return + end minetest.swap_node(pos, {name = "mesecons_solarpanel:solar_panel_inverted_off"}) mesecon.receptor_off(pos, mesecon.rules.pplate) end, @@ -60,6 +65,11 @@ minetest.register_node("mesecons_solarpanel:solar_panel_off", { rules = mesecon.rules.pplate, }}, on_rightclick = function(pos, node, clicker, pointed_thing) + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.record_protection_violation(pos, protname) + return + end minetest.swap_node(pos, {name = "mesecons_solarpanel:solar_panel_inverted_on"}) mesecon.receptor_on(pos, mesecon.rules.pplate) end, @@ -134,6 +144,11 @@ minetest.register_node("mesecons_solarpanel:solar_panel_inverted_on", { rules = mesecon.rules.pplate, }}, on_rightclick = function(pos, node, clicker, pointed_thing) + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.record_protection_violation(pos, protname) + return + end minetest.swap_node(pos, {name = "mesecons_solarpanel:solar_panel_off"}) mesecon.receptor_off(pos, mesecon.rules.pplate) end, @@ -168,6 +183,11 @@ minetest.register_node("mesecons_solarpanel:solar_panel_inverted_off", { rules = mesecon.rules.pplate, }}, on_rightclick = function(pos, node, clicker, pointed_thing) + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.record_protection_violation(pos, protname) + return + end minetest.swap_node(pos, {name = "mesecons_solarpanel:solar_panel_on"}) mesecon.receptor_on(pos, mesecon.rules.pplate) end, diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index 78db3ba9..3863583f 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -277,15 +277,32 @@ local anvildef = { drop_anvil_items(pos, meta) meta:from_table(meta2:to_table()) 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) - if listname == "output" then + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + elseif listname == "output" then return 0 else return stack:get_count() end end, allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - if to_list == "output" then + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + elseif to_list == "output" then return 0 elseif from_list == "output" and to_list == "input" then local meta = minetest.get_meta(pos) diff --git a/mods/ITEMS/mcl_buckets/init.lua b/mods/ITEMS/mcl_buckets/init.lua index 5eac32ef..f53cad4c 100644 --- a/mods/ITEMS/mcl_buckets/init.lua +++ b/mods/ITEMS/mcl_buckets/init.lua @@ -53,7 +53,8 @@ end -- name = user-visible bucket description -- longdesc = long explanatory description (for help) -- usagehelp = short usage explanation (for help) --- extra_check = optional function(pos) which can returns false to avoid placing the liquid +-- extra_check(pos, placer) = optional function(pos) which can returns false to avoid placing the liquid. +-- placer is object/player who is placing the liquid, can be nil -- groups = optional list of item groups -- -- This function can be called from any mod (which depends on this one) @@ -103,12 +104,13 @@ function mcl_buckets.register_liquid(source_place, source_take, itemname, invent -- Check if pointing to a buildable node local item = itemstack:get_name() - if extra_check and extra_check(place_pos) == false then + if extra_check and extra_check(place_pos, user) == false then -- Fail placement of liquid elseif minetest.registered_nodes[nn] and minetest.registered_nodes[nn].buildable_to then -- buildable; replace the node local pns = user:get_player_name() if minetest.is_protected(place_pos, pns) then + minetest.record_protection_violation(place_pos, pns) return itemstack end place_liquid(place_pos, node_place) @@ -122,6 +124,7 @@ function mcl_buckets.register_liquid(source_place, source_take, itemname, invent if minetest.registered_nodes[abovenode.name] and minetest.registered_nodes[abovenode.name].buildable_to then local pn = user:get_player_name() if minetest.is_protected(pointed_thing.above, pn) then + minetest.record_protection_violation(pointed_thing.above, pn) return itemstack end place_liquid(pointed_thing.above, node_place) @@ -159,11 +162,12 @@ function mcl_buckets.register_liquid(source_place, source_take, itemname, invent local iname = stack:get_name() local buildable = minetest.registered_nodes[dropnode.name].buildable_to - if extra_check and extra_check(droppos) == false then + if extra_check and extra_check(droppos, nil) == false then -- Fail placement of liquid elseif buildable then -- buildable; replace the node if minetest.is_protected(droppos, "") then + minetest.record_protection_violation(droppos, "") return stack end local node_place @@ -192,7 +196,7 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", { on_place = function(itemstack, user, pointed_thing) -- Must be pointing to node if pointed_thing.type ~= "node" then - return + return itemstack end -- Call on_rightclick if the pointed node defines it @@ -204,6 +208,12 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", { end end + -- Can't steal liquids + if minetest.is_protected(pointed_thing.above, pointed_thing.under) then + minetest.record_protection_violation(pointed_thing.under, user:get_player_name()) + return itemstack + end + -- Check if pointing to a liquid source local liquiddef = mcl_buckets.liquids[nn] local new_bucket @@ -257,6 +267,11 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", { end end, _on_dispense = function(stack, pos, droppos, dropnode, dropdir) + if minetest.is_protected(droppos, "") then + minetest.record_protection_violation(droppos, "") + return stack + end + -- Fill empty bucket with liquid or drop bucket if no liquid local collect_liquid = false @@ -310,7 +325,13 @@ if mod_mcl_core then "Water Bucket", "A bucket can be used to collect and release liquids. This one is filled with water.", "Right-click on any block to empty the bucket and put a water source on this spot.", - function(pos) + function(pos, placer) + -- Check protection + local placer_name = placer:get_player_name() + if minetest.is_protected(pos, placer_name) then + minetest.record_protection_violation(pos, placer_name) + return false + end local nn = minetest.get_node(pos).name -- Pour water into cauldron if minetest.get_item_group(nn, "cauldron") ~= 0 then @@ -343,7 +364,13 @@ if mod_mclx_core then "River Water Bucket", "A bucket can be used to collect and release liquids. This one is filled with river water.", "Right-click on any block to empty the bucket and put a river water source on this spot.", - function(pos) + function(pos, placer) + -- Check protection + local placer_name = placer:get_player_name() + if minetest.is_protected(pos, placer_name) then + minetest.record_protection_violation(pos, placer_name) + return false + end local nn = minetest.get_node(pos).name -- Pour into cauldron if minetest.get_item_group(nn, "cauldron") ~= 0 then diff --git a/mods/ITEMS/mcl_cake/init.lua b/mods/ITEMS/mcl_cake/init.lua index 75542fb9..ca6f7a55 100644 --- a/mods/ITEMS/mcl_cake/init.lua +++ b/mods/ITEMS/mcl_cake/init.lua @@ -49,6 +49,12 @@ minetest.register_node("mcl_cake:cake", { groups = {handy=1, cake=7, food=2,no_eat_delay=1, attached_node=1, dig_by_piston=1, comparator_signal=14}, 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.settings:get_bool("creative_mode") == true then @@ -69,6 +75,11 @@ local register_slice = function(level, nodebox, desc) 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(2, ItemStack(after_eat), ItemStack(this), clicker, {type="nothing"}) -- Check if we were allowed to eat if newcake:get_name() ~= this or minetest.settings:get_bool("creative_mode") == true then @@ -78,6 +89,11 @@ local register_slice = function(level, nodebox, desc) 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(2, 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.settings:get_bool("creative_mode") == true then diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index e17dcd59..57c991ce 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -15,6 +15,26 @@ local player_chest_open = function(player, pos) open_chests[player:get_player_name()] = { pos = pos } end +-- Simple protection checking functions +local protection_check_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 +local protection_check_put_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 + local trapped_chest_mesecons_rules = mesecon.rules.pplate -- To be called if a player closed a chest @@ -122,6 +142,9 @@ minetest.register_node("mcl_chests:"..basename, { end meta:from_table(meta2:to_table()) end, + allow_metadata_inventory_move = protection_check_move, + allow_metadata_inventory_take = protection_check_put_take, + allow_metadata_inventory_put = protection_check_put_take, on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) minetest.log("action", player:get_player_name().. " moves stuff in chest at "..minetest.pos_to_string(pos)) @@ -211,9 +234,15 @@ minetest.register_node("mcl_chests:"..basename.."_left", { end meta:from_table(meta2:to_table()) end, - -- BEGIN OF LISTRING WORKAROUND + allow_metadata_inventory_move = protection_check_move, + allow_metadata_inventory_take = protection_check_put_take, allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if listname == "input" then + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + -- BEGIN OF LISTRING WORKAROUND + elseif listname == "input" then local inv = minetest.get_inventory({type="node", pos=pos}) if inv:room_for_item("main", stack) then return -1 @@ -226,11 +255,11 @@ minetest.register_node("mcl_chests:"..basename.."_left", { return 0 end end + -- END OF LISTRING WORKAROUND else return stack:get_count() end end, - -- END OF LISTRING WORKAROUND on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) minetest.log("action", player:get_player_name().. " moves stuff in chest at "..minetest.pos_to_string(pos)) @@ -326,9 +355,15 @@ minetest.register_node("mcl_chests:"..basename.."_right", { end meta:from_table(meta2:to_table()) end, - -- BEGIN OF LISTRING WORKAROUND + allow_metadata_inventory_move = protection_check_move, + allow_metadata_inventory_take = protection_check_put_take, allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if listname == "input" then + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + -- BEGIN OF LISTRING WORKAROUND + elseif listname == "input" then local other_pos = mcl_util.get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "right") local other_inv = minetest.get_inventory({type="node", pos=other_pos}) if other_inv:room_for_item("main", stack) then @@ -341,11 +376,11 @@ minetest.register_node("mcl_chests:"..basename.."_right", { return 0 end end + -- END OF LISTRING WORKAROUND else return stack:get_count() end end, - -- END OF LISTRING WORKAROUND on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) minetest.log("action", player:get_player_name().. " moves stuff in chest at "..minetest.pos_to_string(pos)) @@ -738,7 +773,14 @@ for color, desc in pairs(boxtypes) do minetest.add_item(pos, boxitem) end end, + allow_metadata_inventory_move = protection_check_move, + allow_metadata_inventory_take = protection_check_put_take, 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 + end -- Do not allow to place shulker boxes into shulker boxes local group = minetest.get_item_group(stack:get_name(), "shulker_box") if group == 0 or group == nil then diff --git a/mods/ITEMS/mcl_flowerpots/init.lua b/mods/ITEMS/mcl_flowerpots/init.lua index c9187eed..e4df4459 100644 --- a/mods/ITEMS/mcl_flowerpots/init.lua +++ b/mods/ITEMS/mcl_flowerpots/init.lua @@ -53,6 +53,11 @@ minetest.register_node("mcl_flowerpots:flower_pot", { 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() for _, row in ipairs(flowers) do local flower = row[1] @@ -120,6 +125,11 @@ minetest.register_node("mcl_flowerpots:flower_pot_"..flower, { 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 name = clicker:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return + end minetest.add_item({x=pos.x, y=pos.y+0.5, z=pos.z}, flower_node) minetest.set_node(pos, {name="mcl_flowerpots:flower_pot"}) end, @@ -163,6 +173,14 @@ minetest.register_node("mcl_flowerpots:flower_pot_"..flower, { 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 name = "" + if clicker:is_player() then + name = clicker:get_player_name() + end + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return + end minetest.add_item({x=pos.x, y=pos.y+0.5, z=pos.z}, flower_node) minetest.set_node(pos, {name="mcl_flowerpots:flower_pot"}) end, diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index e409bd30..9a8804fd 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -60,7 +60,9 @@ end -- local function allow_metadata_inventory_put(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then + 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) @@ -111,7 +113,9 @@ local function allow_metadata_inventory_move(pos, from_list, from_index, to_list end local function allow_metadata_inventory_take(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then + 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() diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index a05646b7..c7f7b0b9 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -71,6 +71,33 @@ local def_hopper = { end meta:from_table(meta2:to_table()) 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_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) minetest.log("action", player:get_player_name().. " moves stuff in mcl_hoppers at "..minetest.pos_to_string(pos)) @@ -230,6 +257,33 @@ local def_hopper_side = { end meta:from_table(meta2:to_table()) 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_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) minetest.log("action", player:get_player_name().. " moves stuff in mcl_hoppers at "..minetest.pos_to_string(pos)) diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua index b674a1cd..14170e3b 100644 --- a/mods/ITEMS/mcl_itemframes/init.lua +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -125,6 +125,11 @@ minetest.register_node("mcl_itemframes:item_frame",{ 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) local inv = meta:get_inventory() @@ -150,6 +155,33 @@ minetest.register_node("mcl_itemframes:item_frame",{ 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) diff --git a/mods/ITEMS/mcl_jukebox/init.lua b/mods/ITEMS/mcl_jukebox/init.lua index 2ee8f8c1..efa29399 100644 --- a/mods/ITEMS/mcl_jukebox/init.lua +++ b/mods/ITEMS/mcl_jukebox/init.lua @@ -138,7 +138,10 @@ minetest.register_node("mcl_jukebox:jukebox", { on_rightclick= function(pos, node, clicker, itemstack, pointed_thing) if not clicker then return end local cname = clicker:get_player_name() - + if minetest.is_protected(pos, cname) then + minetest.record_protection_violation(pos, cname) + return + end local meta = minetest.get_meta(pos) local inv = meta:get_inventory() if not inv:is_empty("main") then @@ -172,6 +175,33 @@ minetest.register_node("mcl_jukebox:jukebox", { 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, after_dig_node = function(pos, oldnode, oldmetadata, digger) local name = digger:get_player_name() local meta = minetest.get_meta(pos) diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index c172eacf..bca803dc 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -376,6 +376,11 @@ minetest.override_item("mcl_end:ender_eye", { -- Place eye of ender into end portal frame if pointed_thing.under and node.name == "mcl_portals:end_portal_frame" then + local protname = user:get_player_name() + if minetest.is_protected(pointed_thing.under, protname) then + minetest.record_protection_violation(pointed_thing.under, protname) + return itemstack + end minetest.set_node(pointed_thing.under, { name = "mcl_portals:end_portal_frame_eye", param2 = node.param2 }) if minetest.get_modpath("doc") then diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua index d6212e37..75a050e7 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua @@ -120,6 +120,11 @@ minetest.register_node("3d_armor_stand:armor_stand", { on_destruct = drop_armor, -- Put piece of armor on armor stand, or take one away 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 + end -- Check if player wields armor local name = itemstack:get_name() local list @@ -177,7 +182,21 @@ minetest.register_node("3d_armor_stand:armor_stand", { after_place_node = function(pos) minetest.add_entity(pos, "3d_armor_stand:armor_entity") end, - allow_metadata_inventory_put = function(pos, listname, index, stack) + 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 + end local def = stack:get_definition() or {} local groups = def.groups or {} if groups[listname] then @@ -185,7 +204,7 @@ minetest.register_node("3d_armor_stand:armor_stand", { end return 0 end, - allow_metadata_inventory_move = function(pos) + allow_metadata_inventory_move = function() return 0 end, on_metadata_inventory_put = function(pos) From 9a3c6a3fd7b88f1f65b208b1b1c4f2b5f95e708d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Feb 2019 22:17:51 +0100 Subject: [PATCH 0286/1107] Protect: add bottles, mobspawner, fix repeater --- mods/ENTITIES/mcl_mobs/api.lua | 4 ++ mods/ITEMS/REDSTONE/mesecons_delayer/init.lua | 4 +- mods/ITEMS/mcl_potions/init.lua | 63 ++++++++++++------- 3 files changed, 46 insertions(+), 25 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index ebe977e9..a75a6e39 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -3577,6 +3577,10 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) local name = placer:get_player_name() local privs = minetest.get_player_privs(name) if mod_mobspawners and 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, "You need the “maphack” privilege to change the mob spawner.") return itemstack diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua b/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua index ea463844..a17dd7f5 100644 --- a/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua @@ -257,7 +257,7 @@ minetest.register_node("mesecons_delayer:delayer_off_"..tostring(i), { on_rightclick = function (pos, node, clicker) local protname = clicker:get_player_name() if minetest.is_protected(pos, protname) then - minetest.report_protection_violation(pos, protname) + minetest.record_protection_violation(pos, protname) return end if node.name=="mesecons_delayer:delayer_off_1" then @@ -325,7 +325,7 @@ minetest.register_node("mesecons_delayer:delayer_on_"..tostring(i), { on_rightclick = function (pos, node, clicker) local protname = clicker:get_player_name() if minetest.is_protected(pos, protname) then - minetest.report_protection_violation(pos, protname) + minetest.record_protection_violation(pos, protname) return end if node.name=="mesecons_delayer:delayer_on_1" then diff --git a/mods/ITEMS/mcl_potions/init.lua b/mods/ITEMS/mcl_potions/init.lua index fa4349c0..2920cfdd 100644 --- a/mods/ITEMS/mcl_potions/init.lua +++ b/mods/ITEMS/mcl_potions/init.lua @@ -46,27 +46,34 @@ minetest.register_craftitem("mcl_potions:glass_bottle", { get_water = true river_water = node.name == "mclx_core:river_water_source" -- Or reduce water level of cauldron by 1 - elseif 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"}) + 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 -- Replace with water bottle, if possible, otherwise @@ -160,7 +167,12 @@ minetest.register_craftitem("mcl_potions:potion_water", { local cauldron = fill_cauldron(node.name, "mcl_core:water_source") if cauldron then - -- Increase water level of cauldron by 1 + 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}) return "mcl_potions:glass_bottle" @@ -195,7 +207,12 @@ minetest.register_craftitem("mcl_potions:potion_river_water", { local cauldron = fill_cauldron(node.name, "mclx_core:river_water_source") if cauldron then - -- Increase water level of cauldron by 1 + 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}) return "mcl_potions:glass_bottle" From c141f4ece57fee557de1fe88450e057d5f1be9fb Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Feb 2019 22:20:58 +0100 Subject: [PATCH 0287/1107] Mobspawners: Remove unused function --- mods/ITEMS/mcl_mobspawners/init.lua | 36 ----------------------------- 1 file changed, 36 deletions(-) diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index 1eb9005a..46cf74c7 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -290,42 +290,6 @@ minetest.register_node("mcl_mobspawners:spawner", { on_timer = spawn_mobs, - on_receive_fields = function(pos, formname, fields, sender) - - if not fields.text or fields.text == "" then - return - end - - local meta = minetest.get_meta(pos) - local comm = fields.text:split(" ") - local name = sender:get_player_name() - - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return - end - - local mob = comm[1] -- mob to spawn - local mlig = tonumber(comm[2]) -- min light - local xlig = tonumber(comm[3]) -- max light - local num = tonumber(comm[4]) -- total mobs in area - local pla = tonumber(comm[5]) -- player distance (0 to disable) - local yof = tonumber(comm[6]) or 0 -- Y offset to spawn mob - - if mob and mob ~= "" and mobs.spawning_mobs[mob] == true - and num and num >= 0 and num <= 10 - and mlig and mlig >= 0 and mlig <= 15 - and xlig and xlig >= 0 and xlig <= 15 - and pla and pla >=0 and pla <= 20 - and yof and yof > -10 and yof < 10 then - - mcl_mobspawners.setup_spawner(pos, mob, mlig, xlig, num, pla, yof) - else - minetest.chat_send_player(name, S("Mob Spawner settings failed!")) - minetest.chat_send_player(name, - S("Syntax: name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] distance[1-20] y_offset[-10 to 10]")) - end - end, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 25, From 79e5a6dfa3895c762a7a6317e788003069126079 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Feb 2019 22:23:26 +0100 Subject: [PATCH 0288/1107] Fix typo in 3d_armor_stand --- mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua index 75a050e7..76dcec55 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua @@ -123,7 +123,7 @@ minetest.register_node("3d_armor_stand:armor_stand", { local protname = clicker:get_player_name() if minetest.is_protected(pos, protname) then minetest.record_protection_violation(pos, protname) - return + return itemstack end -- Check if player wields armor local name = itemstack:get_name() @@ -139,7 +139,7 @@ minetest.register_node("3d_armor_stand:armor_stand", { -- If player wields armor, put it on armor stand local inv = minetest.get_inventory({type = "node", pos = pos}) local wielditem = clicker:get_wielded_item() - if not inv then return end + if not inv then return itemstack end if list then -- ... but only if the slot is free local single_item = ItemStack(itemstack) @@ -148,7 +148,7 @@ minetest.register_node("3d_armor_stand:armor_stand", { inv:add_item(list, single_item) update_entity(pos) itemstack:take_item() - return itmstack + return itemstack end end From fb3db5077c23307c9b0367bd8a3ca34ab7a76f3e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Feb 2019 22:27:45 +0100 Subject: [PATCH 0289/1107] Fix slime code using nil arguments --- mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index b23a693f..2c21dcfa 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -12,7 +12,7 @@ local S, NS = dofile(MP.."/intllib.lua") -- 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(self, pos, child_mob, children_count, spawn_distance, eject_speed) +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 @@ -111,7 +111,7 @@ local slime_big = { jump_chance = 100, fear_height = 60, spawn_small_alternative = "mobs_mc:slime_small", - on_die = spawn_children_on_die(self, pos, "mobs_mc:slime_small", 4, 1.0, 1.5) + on_die = spawn_children_on_die("mobs_mc:slime_small", 4, 1.0, 1.5) } mobs:register_mob("mobs_mc:slime_big", slime_big) @@ -126,7 +126,7 @@ 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(self, pos, "mobs_mc:slime_tiny", 4, 0.6, 1.0) +slime_small.on_die = spawn_children_on_die("mobs_mc:slime_tiny", 4, 0.6, 1.0) mobs:register_mob("mobs_mc:slime_small", slime_small) local slime_tiny = table.copy(slime_big) @@ -215,7 +215,7 @@ local magma_cube_big = { jump_chance = 100, fear_height = 100000, spawn_small_alternative = "mobs_mc:magma_cube_small", - on_die = spawn_children_on_die(self, pos, "mobs_mc:magma_cube_small", 3, 0.8, 1.5) + on_die = spawn_children_on_die("mobs_mc:magma_cube_small", 3, 0.8, 1.5) } mobs:register_mob("mobs_mc:magma_cube_big", magma_cube_big) @@ -235,7 +235,7 @@ magma_cube_small.damage = 4 magma_cube_small.reach = 2.75 magma_cube_small.armor = 70 magma_cube_small.spawn_small_alternative = "mobs_mc:magma_cube_tiny" -magma_cube_small.on_die = spawn_children_on_die(self, pos, "mobs_mc:magma_cube_tiny", 4, 0.6, 1.0) +magma_cube_small.on_die = spawn_children_on_die("mobs_mc:magma_cube_tiny", 4, 0.6, 1.0) mobs:register_mob("mobs_mc:magma_cube_small", magma_cube_small) local magma_cube_tiny = table.copy(magma_cube_big) From a7d429a017570a3c55de25360614f6cdc4f1c2d7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Feb 2019 22:44:26 +0100 Subject: [PATCH 0290/1107] Fix several "undeclared global" errors --- mods/ENTITIES/mcl_mobs/api.txt | 2 +- mods/ENTITIES/mobs_mc/wither.lua | 6 +++--- mods/ITEMS/mcl_flowers/init.lua | 3 +-- mods/PLAYER/mcl_spawn/init.lua | 2 ++ 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index c09151e9..157370d0 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -395,7 +395,7 @@ This function registers a arrow for mobs with the attack type shoot. (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, player) + (self, mob) '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 diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index a52fbdf6..9602d5a5 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -132,7 +132,7 @@ mobs:register_arrow(":mobs_mc:fireball", { -- direct hit, no fire... just plenty of pain hit_player = function(self, player) - minetest.sound_play("tnt_explode", {pos = pos, gain = 1.5, max_hear_distance = 16}) + minetest.sound_play("tnt_explode", {pos = player:get_pos(), gain = 1.5, max_hear_distance = 16}) player:punch(self.object, 1.0, { full_punch_interval = 0.5, damage_groups = {fleshy = 8}, @@ -140,8 +140,8 @@ mobs:register_arrow(":mobs_mc:fireball", { end, - hit_mob = function(self, player) - minetest.sound_play("tnt_explode", {pos = pos, gain = 1.5,max_hear_distance = 16}) + hit_mob = function(self, mob) + minetest.sound_play("tnt_explode", {pos = mob:get_pos(), gain = 1.5,max_hear_distance = 16}) player:punch(self.object, 1.0, { full_punch_interval = 0.5, damage_groups = {fleshy = 8}, diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index 337a5495..ac575e12 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -398,14 +398,13 @@ minetest.register_node("mcl_flowers:waterlily", { local idef = itemstack:get_definition() if idef.sounds and idef.sounds.place then - minetest.sound_play(idef.sounds.place, {pos=above, gain=1}) + minetest.sound_play(idef.sounds.place, {pos=pointed_thing.above, gain=1}) end if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() end else - minetest.chat_send_player(player_name, "Node is protected") minetest.record_protection_violation(pos, player_name) end end diff --git a/mods/PLAYER/mcl_spawn/init.lua b/mods/PLAYER/mcl_spawn/init.lua index 9c9079b9..d5391f7d 100644 --- a/mods/PLAYER/mcl_spawn/init.lua +++ b/mods/PLAYER/mcl_spawn/init.lua @@ -1,5 +1,7 @@ mcl_spawn = {} +local mg_name = minetest.get_mapgen_setting("mg_name") + -- Returns current spawn position of player. -- If player is nil or not a player, the default spawn point is returned. -- The second return value is true if spawn point is player-chosen, From 9817b389045d83f1353bebb77a4ba1dfa2907cba Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Feb 2019 23:17:08 +0100 Subject: [PATCH 0291/1107] Fix bucket crash --- mods/ITEMS/mcl_buckets/init.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_buckets/init.lua b/mods/ITEMS/mcl_buckets/init.lua index f53cad4c..5840346b 100644 --- a/mods/ITEMS/mcl_buckets/init.lua +++ b/mods/ITEMS/mcl_buckets/init.lua @@ -327,7 +327,10 @@ if mod_mcl_core then "Right-click on any block to empty the bucket and put a water source on this spot.", function(pos, placer) -- Check protection - local placer_name = placer:get_player_name() + local placer_name = "" + if placer ~= nil then + placer_name = placer:get_player_name() + end if minetest.is_protected(pos, placer_name) then minetest.record_protection_violation(pos, placer_name) return false @@ -366,7 +369,10 @@ if mod_mclx_core then "Right-click on any block to empty the bucket and put a river water source on this spot.", function(pos, placer) -- Check protection - local placer_name = placer:get_player_name() + local placer_name = "" + if placer ~= nil then + placer_name = placer:get_player_name() + end if minetest.is_protected(pos, placer_name) then minetest.record_protection_violation(pos, placer_name) return false From b729ffc604e350b22ef75e0a6e501315ded37543 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Feb 2019 23:17:20 +0100 Subject: [PATCH 0292/1107] Spawning fire now respects protection --- mods/ITEMS/mcl_fire/fire_charge.lua | 7 +++++++ mods/ITEMS/mcl_fire/flint_and_steel.lua | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/mods/ITEMS/mcl_fire/fire_charge.lua b/mods/ITEMS/mcl_fire/fire_charge.lua index 144d1959..26259e04 100644 --- a/mods/ITEMS/mcl_fire/fire_charge.lua +++ b/mods/ITEMS/mcl_fire/fire_charge.lua @@ -15,6 +15,13 @@ minetest.register_craftitem("mcl_fire:fire_charge", { end end + -- Check protection + local protname = user:get_player_name() + if minetest.is_protected(pointed_thing.under, protname) then + minetest.record_protection_violation(pointed_thing.under, protname) + return itemstack + end + -- Ignite/light fire if pointed_thing.type == "node" then local nodedef = minetest.registered_nodes[node.name] diff --git a/mods/ITEMS/mcl_fire/flint_and_steel.lua b/mods/ITEMS/mcl_fire/flint_and_steel.lua index 3b6861f5..0ab4043f 100644 --- a/mods/ITEMS/mcl_fire/flint_and_steel.lua +++ b/mods/ITEMS/mcl_fire/flint_and_steel.lua @@ -15,6 +15,12 @@ minetest.register_tool("mcl_fire:flint_and_steel", { return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack end end + -- Check protection + local protname = user:get_player_name() + if minetest.is_protected(pointed_thing.under, protname) then + minetest.record_protection_violation(pointed_thing.under, protname) + return itemstack + end local idef = itemstack:get_definition() minetest.sound_play( @@ -44,11 +50,13 @@ minetest.register_tool("mcl_fire:flint_and_steel", { end, _dispense_into_walkable = true, _on_dispense = function(stack, pos, droppos, dropnode, dropdir) + -- Ignite air if dropnode.name == "air" then minetest.add_node(droppos, {name="mcl_fire:fire"}) if not minetest.settings:get_bool("creative_mode") then stack:add_wear(65535/65) -- 65 uses end + -- Ignite TNT elseif dropnode.name == "mcl_tnt:tnt" then tnt.ignite(droppos) if not minetest.settings:get_bool("creative_mode") then From 46c7413337204ef03db5fcf5833fb0f36cbc2f4a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Feb 2019 23:29:12 +0100 Subject: [PATCH 0293/1107] Bucket dispensers now ignore protection Otherwise, it bucket dispensers would not work on your own property. --- mods/ITEMS/mcl_buckets/init.lua | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/mods/ITEMS/mcl_buckets/init.lua b/mods/ITEMS/mcl_buckets/init.lua index 5840346b..f05d725c 100644 --- a/mods/ITEMS/mcl_buckets/init.lua +++ b/mods/ITEMS/mcl_buckets/init.lua @@ -166,10 +166,6 @@ function mcl_buckets.register_liquid(source_place, source_take, itemname, invent -- Fail placement of liquid elseif buildable then -- buildable; replace the node - if minetest.is_protected(droppos, "") then - minetest.record_protection_violation(droppos, "") - return stack - end local node_place if type(source_place) == "function" then node_place = source_place(droppos) @@ -267,11 +263,6 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", { end end, _on_dispense = function(stack, pos, droppos, dropnode, dropdir) - if minetest.is_protected(droppos, "") then - minetest.record_protection_violation(droppos, "") - return stack - end - -- Fill empty bucket with liquid or drop bucket if no liquid local collect_liquid = false @@ -331,7 +322,7 @@ if mod_mcl_core then if placer ~= nil then placer_name = placer:get_player_name() end - if minetest.is_protected(pos, placer_name) then + if placer and minetest.is_protected(pos, placer_name) then minetest.record_protection_violation(pos, placer_name) return false end @@ -373,7 +364,7 @@ if mod_mclx_core then if placer ~= nil then placer_name = placer:get_player_name() end - if minetest.is_protected(pos, placer_name) then + if placer and minetest.is_protected(pos, placer_name) then minetest.record_protection_violation(pos, placer_name) return false end From 5b0945b88c159df529e72cd67774c5c921a551e9 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 8 Feb 2019 23:55:49 +0100 Subject: [PATCH 0294/1107] Don't change water bottles when using in creative --- mods/ITEMS/mcl_potions/init.lua | 50 ++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/mods/ITEMS/mcl_potions/init.lua b/mods/ITEMS/mcl_potions/init.lua index 2920cfdd..9932ed93 100644 --- a/mods/ITEMS/mcl_potions/init.lua +++ b/mods/ITEMS/mcl_potions/init.lua @@ -76,26 +76,28 @@ minetest.register_craftitem("mcl_potions:glass_bottle", { end end if get_water then - -- Replace with water bottle, if possible, otherwise - -- place the water potion at a place where's space - local water_bottle - if river_water then - water_bottle = ItemStack("mcl_potions:potion_river_water") - else - water_bottle = ItemStack("mcl_potions:potion_water") + if minetest.settings:get_bool("creative_mode") ~= true then + -- Replace with water bottle, if possible, otherwise + -- place the water potion at a place where's space + local water_bottle + if river_water then + water_bottle = ItemStack("mcl_potions:potion_river_water") + else + water_bottle = ItemStack("mcl_potions:potion_water") + end + if itemstack:get_count() == 1 then + return water_bottle + else + local inv = placer:get_inventory() + 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 minetest.sound_play("mcl_potions_bottle_fill", {pos=pointed_thing.under, gain=0.5, max_hear_range=16}) - if itemstack:get_count() == 1 then - return water_bottle - else - local inv = placer:get_inventory() - 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 @@ -175,7 +177,11 @@ minetest.register_craftitem("mcl_potions:potion_water", { -- 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}) - return "mcl_potions:glass_bottle" + if minetest.settings:get_bool("creative_mode") == true then + return itemstack + else + return "mcl_potions:glass_bottle" + end end end @@ -215,7 +221,11 @@ minetest.register_craftitem("mcl_potions:potion_river_water", { -- 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}) - return "mcl_potions:glass_bottle" + if minetest.settings:get_bool("creative_mode") == true then + return itemstack + else + return "mcl_potions:glass_bottle" + end end end From 986871f2b55d7da3ec7a562b0f3dd2c2ffa617eb Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Feb 2019 00:05:00 +0100 Subject: [PATCH 0295/1107] No replace empty bottle if used on src in creative --- mods/ITEMS/mcl_potions/init.lua | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_potions/init.lua b/mods/ITEMS/mcl_potions/init.lua index 9932ed93..ea859127 100644 --- a/mods/ITEMS/mcl_potions/init.lua +++ b/mods/ITEMS/mcl_potions/init.lua @@ -38,12 +38,14 @@ minetest.register_craftitem("mcl_potions:glass_bottle", { -- Try to fill glass bottle with water local get_water = false + local from_liquid_source = false local river_water = false if not def then -- Unknown node: no-op elseif 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 @@ -76,7 +78,8 @@ minetest.register_craftitem("mcl_potions:glass_bottle", { end end if get_water then - if minetest.settings:get_bool("creative_mode") ~= true then + local creative = minetest.settings:get_bool("creative_mode") == true + if from_liquid_source or creative then -- Replace with water bottle, if possible, otherwise -- place the water potion at a place where's space local water_bottle @@ -85,10 +88,15 @@ minetest.register_craftitem("mcl_potions:glass_bottle", { else water_bottle = ItemStack("mcl_potions:potion_water") end - if itemstack:get_count() == 1 then + local inv = placer:get_inventory() + if creative 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 - local inv = placer:get_inventory() if inv:room_for_item("main", water_bottle) then inv:add_item("main", water_bottle) else From 3ba4aabbcff6c4682a88df0cf099e55fc26d5844 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Feb 2019 00:17:25 +0100 Subject: [PATCH 0296/1107] Check for protection when using anvil formspec --- mods/ITEMS/mcl_anvils/init.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index 3863583f..8b3717a3 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -407,6 +407,11 @@ local anvildef = { 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 if fields.name_button or fields.name then local set_name if fields.name == nil then From 3ec79149626a3a39d4593d95faefef3696ad5159 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Feb 2019 02:42:11 +0100 Subject: [PATCH 0297/1107] Allow to use Minetest's original flat mapgen again --- mods/CORE/mcl_init/init.lua | 29 ++++++++++++++++-------- mods/ITEMS/mcl_portals/portal_nether.lua | 12 ++++++++-- mods/MAPGEN/mcl_biomes/init.lua | 7 ++++-- mods/MAPGEN/mcl_mapgen_core/init.lua | 29 ++++++------------------ settingtypes.txt | 25 ++++++++++++-------- 5 files changed, 57 insertions(+), 45 deletions(-) diff --git a/mods/CORE/mcl_init/init.lua b/mods/CORE/mcl_init/init.lua index d239c8d9..de50bf00 100644 --- a/mods/CORE/mcl_init/init.lua +++ b/mods/CORE/mcl_init/init.lua @@ -11,7 +11,10 @@ mcl_vars.inventory_header = mcl_vars.gui_slots .. mcl_vars.gui_bg -- Mapgen variables local mg_name = minetest.get_mapgen_setting("mg_name") local minecraft_height_limit = 256 -if mg_name ~= "flat" then +local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" + +if not superflat then + -- Normal mode --[[ Realm stacking (h is for height) - Overworld (h>=256) - Void (h>=1000) @@ -32,17 +35,13 @@ if mg_name ~= "flat" then mcl_vars.mg_bedrock_is_rough = true else + -- Classic superflat local ground = minetest.get_mapgen_setting("mgflat_ground_level") ground = tonumber(ground) if not ground then ground = 8 end - -- 1 perfectly flat bedrock layer - if minetest.get_mapgen_setting("mcl_superflat_classic") == "false" then - mcl_vars.mg_overworld_min = -30912 - else - mcl_vars.mg_overworld_min = ground - 3 - end + mcl_vars.mg_overworld_min = ground - 3 mcl_vars.mg_overworld_max_official = mcl_vars.mg_overworld_min + minecraft_height_limit mcl_vars.mg_bedrock_overworld_min = mcl_vars.mg_overworld_min mcl_vars.mg_bedrock_overworld_max = mcl_vars.mg_bedrock_overworld_min @@ -58,14 +57,24 @@ mcl_vars.mg_nether_min = -29067 -- Carefully chosen to be at a mapchunk border mcl_vars.mg_nether_max = mcl_vars.mg_nether_min + 128 mcl_vars.mg_bedrock_nether_bottom_min = mcl_vars.mg_nether_min mcl_vars.mg_bedrock_nether_top_max = mcl_vars.mg_nether_max -mcl_vars.mg_lava_nether_max = mcl_vars.mg_nether_min + 31 -if mg_name ~= "flat" then +if not superflat then mcl_vars.mg_bedrock_nether_bottom_max = mcl_vars.mg_bedrock_nether_bottom_min + 4 mcl_vars.mg_bedrock_nether_top_min = mcl_vars.mg_bedrock_nether_top_max - 4 + mcl_vars.mg_lava_nether_max = mcl_vars.mg_nether_min + 31 else - -- Thin bedrock in flat mapgen + -- Thin bedrock in classic superflat mapgen mcl_vars.mg_bedrock_nether_bottom_max = mcl_vars.mg_bedrock_nether_bottom_min mcl_vars.mg_bedrock_nether_top_min = mcl_vars.mg_bedrock_nether_top_max + mcl_vars.mg_lava_nether_max = mcl_vars.mg_nether_min + 2 +end +if mg_name == "flat" then + if superflat then + mcl_vars.mg_flat_nether_floor = mcl_vars.mg_bedrock_nether_bottom_max + 4 + mcl_vars.mg_flat_nether_ceiling = mcl_vars.mg_bedrock_nether_bottom_max + 52 + else + mcl_vars.mg_flat_nether_floor = mcl_vars.mg_lava_nether_max + 4 + mcl_vars.mg_flat_nether_ceiling = mcl_vars.mg_lava_nether_max + 52 + end end -- The End (surface at ca. Y = -27000) diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index d08bddef..64de52ba 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -13,6 +13,7 @@ local TELEPORT_DELAY = 3 -- seconds before teleporting in Nether portal local TELEPORT_COOLOFF = 4 -- after object was teleported, for this many seconds it won't teleported again local mg_name = minetest.get_mapgen_setting("mg_name") +local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" -- 3D noise local np_cave = { @@ -187,7 +188,7 @@ end local function find_nether_target_y(target_x, target_z) if mg_name == "flat" then - return mcl_vars.mg_bedrock_nether_bottom_max + 5 + return mcl_vars.mg_flat_nether_floor + 1 end local start_y = math.random(mcl_vars.mg_lava_nether_max + 1, mcl_vars.mg_bedrock_nether_top_min - 5) -- Search start if not nobj_cave then @@ -330,8 +331,15 @@ function mcl_portals.light_nether_portal(pos) local target = {x = p1.x, y = p1.y, z = p1.z} target.x = target.x + 1 if target.y < mcl_vars.mg_nether_max and target.y > mcl_vars.mg_nether_min then - if mg_name == "flat" then + if superflat then target.y = mcl_vars.mg_bedrock_overworld_max + 5 + elseif mg_name == "flat" then + local ground = minetest.get_mapgen_setting("mgflat_ground_level") + ground = tonumber(ground) + if not ground then + ground = 8 + end + target.y = ground + 2 else target.y = math.random(mcl_vars.mg_overworld_min + 40, mcl_vars.mg_overworld_min + 96) end diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 20a08664..f37929c4 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -2,6 +2,7 @@ local mg_name = minetest.get_mapgen_setting("mg_name") -- Some mapgen settings local imitate = minetest.settings:get("mcl_imitation_mode") +local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" local generate_fallen_logs = false @@ -3209,7 +3210,7 @@ end -- Detect mapgen to select functions -- if mg_name ~= "singlenode" then - if mg_name ~= "flat" then + if not superflat then if mg_name ~= "v6" then register_biomes() register_biomelike_ores() @@ -3219,7 +3220,9 @@ if mg_name ~= "singlenode" then register_decorations() end else - -- Implementation of Minecraft's Superflat mapgen, classic style + -- 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() diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 02645d0c..0586404d 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -44,6 +44,7 @@ minetest.register_alias("mapgen_stair_sandstone_block", "mcl_stairs:stair_sandst 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 @@ -550,8 +551,7 @@ minetest.register_ore({ y_max = mcl_worlds.layer_to_y(32), }) -if mg_name ~= "flat" then - +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({ @@ -622,13 +622,8 @@ minetest.register_ore({ y_min = mcl_worlds.layer_to_y(62), y_max = mcl_worlds.layer_to_y(127), }) - end - - - - local function register_mgv6_decorations() -- Cacti @@ -951,20 +946,10 @@ end if mg_name == "v6" then register_mgv6_decorations() minetest.set_mapgen_setting("mg_flags", "caves,nodungeons,decorations,light", true) -elseif mg_name == "flat" then - local classic = minetest.get_mapgen_setting("mcl_superflat_classic") - if classic == nil then - classic = minetest.settings:get_bool("mcl_superflat_classic") - minetest.set_mapgen_setting("mcl_superflat_classic", "true", true) - end - if classic ~= "false" then - -- Enforce superflat-like mapgen: No hills, lakes or caves - minetest.set_mapgen_setting("mg_flags", "nocaves,nodungeons,nodecorations,light", true) - minetest.set_mapgen_setting("mgflat_spflags", "nolakes,nohills", true) - else - -- If superflat mode is disabled, mapgen is way more liberal - minetest.set_mapgen_setting("mg_flags", "caves,nodungeons,nodecorations,light", true) - end +elseif superflat then + -- Enforce superflat-like mapgen: No hills, lakes or caves + minetest.set_mapgen_setting("mg_flags", "nocaves,nodungeons,nodecorations,light", true) + minetest.set_mapgen_setting("mgflat_spflags", "nolakes,nohills", true) else minetest.set_mapgen_setting("mg_flags", "caves,nodungeons,decorations,light", true) end @@ -1731,7 +1716,7 @@ minetest.register_on_generated(function(minp, maxp, seed) -- Flat Nether if mg_name == "flat" then - lvm_used = set_layers(c_air, nil, mcl_vars.mg_bedrock_nether_bottom_max + 4, mcl_vars.mg_bedrock_nether_bottom_max + 52, minp, maxp, lvm_used) + lvm_used = set_layers(c_air, nil, mcl_vars.mg_flat_nether_floor, mcl_vars.mg_flat_nether_ceiling, minp, maxp, lvm_used) end -- Big lava seas by replacing air below a certain height diff --git a/settingtypes.txt b/settingtypes.txt index 7409690d..1290c25c 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -95,17 +95,24 @@ flame_sound (Flame sound) bool true # Feedback is appreciated. craftguide_progressive_mode (Enable recipe book progressive mode) bool false -# If enabled, the “flat” map generator generates a “classic” superflat map: -# Completely flat, 1 layer of grass blocks on top of 2 layers of dirt on -# top of a final layer of bedrock. -# Note if this is enabled, the setting “mgflat_flags” is ignored. To -# customize the “flat” map generator, you must disable this setting. -# Warning: Disabling this setting is currently EXPERIMENTAL! The generated map -# may not be that pretty. -mcl_superflat_classic (Classic superflat map generation) bool true - # Mobs difficulty. This is a number that will affect the initial and maximum # health and the amount of damage that mobs deal. Health and damage will # be multiplied with this number. # This feature is not finished yet! mob_difficulty (Mob difficulty factor) float 1.0 0.0 + +# If enabled, the “flat” map generator generates a Classic Superflat world: +# Completely flat, 1 layer of grass blocks on top of 2 layers of dirt on +# top of a final layer of bedrock. No caves, trees or plants. +# Also, if enabled, the setting “mgflat_flags” is ignored. +# If disabled, Minetest's default flat map generator is used, that is, trees, +# caves, and a deeper underground can be generated. +# +# Caution: Change this setting with care! +# If you change this setting, then play on an existing flat world +# that started with a different setting (e.g. you changed from superflat +# from “enabled” to “disabled”), there will be continuity errors when players +# reach new areas. Most importantly, the void is much higher in Superflat than +# in “normal” Flat. +# But creating new flat worlds after changing this setting should be safe. +mcl_superflat_classic (Classic superflat map generation) bool true From d50ff261182be04c61be52062b108810e9a5ae26 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Feb 2019 03:11:15 +0100 Subject: [PATCH 0298/1107] =?UTF-8?q?Rename=20setting:=20mob=5Fspawn=5Fmul?= =?UTF-8?q?tiplier=20=E2=86=92=20mobs=5Fspawn=5Fchance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mods/ENTITIES/mcl_mobs/api.lua | 4 ++-- settingtypes.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index a75a6e39..0f7057df 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -65,7 +65,7 @@ local remove_far = false 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 99) -local mob_chance_multiplier = tonumber(minetest.settings:get("mob_chance_multiplier") or 1) +local mobs_spawn_chance = tonumber(minetest.settings:get("mobs_spawn_chance") or 1) -- Peaceful mode message so players will know there are no monsters if peaceful_only then @@ -3335,7 +3335,7 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, nodenames = nodes, neighbors = neighbors, interval = interval, - chance = max(1, (chance * mob_chance_multiplier)), + chance = max(1, (chance * mobs_spawn_chance)), catch_up = false, action = spawn_abm_action, }) diff --git a/settingtypes.txt b/settingtypes.txt index 1290c25c..69a51081 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -62,7 +62,7 @@ mobs_spawn (Spawn mobs naturally) bool true # Controls the overall amount of mobs that spawn. The higher the number, # the less often mobs will spawn. This does not affect mob spawners. -mob_chance_multiplier (Mob spawn multiplier) float 1.0 0.0 +mobs_spawn_chance (Mob spawn chance) float 1.0 0.0 # If enabled, only peaceful mobs will appear naturally. This does not # affect mob spawners. From e89a01630bb673365d182ebcebd1b947d01dfa12 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Feb 2019 04:32:55 +0100 Subject: [PATCH 0299/1107] Remove misunderstood replacements from decorations I thought it would replace nodes on the map, but it turned it it replaces nodes from the schematic definition. --- mods/MAPGEN/mcl_biomes/init.lua | 6 ------ mods/MAPGEN/mcl_mapgen_core/init.lua | 6 ------ 2 files changed, 12 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index f37929c4..93945354 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -2473,9 +2473,6 @@ local function register_decorations() { name = "mcl_flowers:double_grass_top", param1=255, param2=param2 }, }, }, - replacements = { - ["mcl_flowers:tallgrass"] = "mcl_flowers:double_grass", - }, place_on = {"group:grass_block_no_snow"}, sidelen = 16, noise_params = { @@ -2508,9 +2505,6 @@ local function register_decorations() { name = "mcl_flowers:double_fern_top", param1=255, }, }, }, - replacements = { - ["mcl_flowers:fern"] = "mcl_flowers:double_fern" - }, place_on = {"group:grass_block_no_snow", "mcl_core:podzol"}, sidelen = 16, noise_params = { diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 0586404d..eb9caa63 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -679,9 +679,6 @@ local function register_mgv6_decorations() { name = "mcl_flowers:double_grass_top", param1 = 255, }, }, }, - replacements = { - ["mcl_flowers:tallgrass"] = "mcl_flowers:double_grass" - }, place_on = {"group:grass_block_no_snow"}, sidelen = 8, noise_params = { @@ -707,9 +704,6 @@ local function register_mgv6_decorations() { name = "mcl_flowers:double_fern_top", param1=255, }, }, }, - replacements = { - ["mcl_flowers:fern"] = "mcl_flowers:double_fern" - }, -- v6 hack: This makes sure large ferns only appear in jungles spawn_by = { "mcl_core:jungletree", "mcl_flowers:fern" }, num_spawn_by = 1, From e28f213f9aff61e51ff5fa9d7932d540d8a90d3f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Feb 2019 05:58:40 +0100 Subject: [PATCH 0300/1107] Add workaround to fix broken double plants in v6 --- mods/MAPGEN/mcl_mapgen_core/init.lua | 35 +++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index eb9caa63..9a979d43 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1729,12 +1729,13 @@ minetest.register_on_generated(function(minp, maxp, seed) ----- 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 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 + if emin.y <= mcl_vars.mg_overworld_max and emax.y >= mcl_vars.mg_overworld_min then -- v6 mapgen: -- Put top snow on snowy grass blocks. The mapgen does not generate the top snow on its own. if mg_name == "v6" then + -- FIXME: Cavegen and mudflow might screw this up and cause floating top snow to appear local snowdirt = minetest.find_nodes_in_area_under_air(minp, maxp, "mcl_core:dirt_with_grass_snow") for n = 1, #snowdirt do -- CHECKME: What happens at chunk borders? @@ -1743,10 +1744,38 @@ minetest.register_on_generated(function(minp, maxp, seed) data[p_pos] = c_top_snow end end - if #snowdirt > 1 then + if #snowdirt > 0 then lvm_used = true end + --[[ 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(emin, emax, "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: -- Clear snowy grass blocks without snow above to ensure consistency. From 9e578289585c4911bfabfcc62c8b8d2fb1de84fc Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 9 Feb 2019 21:28:53 +0100 Subject: [PATCH 0301/1107] Add tileable_vertical to covered dirt nodes --- mods/ITEMS/mcl_core/functions.lua | 2 +- mods/ITEMS/mcl_core/nodes_base.lua | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index 58182053..c040ce7e 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -1226,7 +1226,7 @@ mcl_core.register_snowed_node = function(itemstring_snowed, itemstring_clear, ti -- Note: _mcl_snowed must be added to the clear node manually! if not tiles then - def.tiles = {"default_snow.png", "default_dirt.png", "mcl_core_grass_side_snowed.png"} + def.tiles = {"default_snow.png", "default_dirt.png", {name="mcl_core_grass_side_snowed.png", tileable_vertical=false}} else def.tiles = tiles end diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index 10739109..f2299e07 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -310,7 +310,7 @@ minetest.register_node("mcl_core:dirt_with_grass", { description = "Grass Block", _doc_items_longdesc = "A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.", _doc_items_hidden = false, - tiles = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, + tiles = {"default_grass.png", "default_dirt.png", {name="default_dirt.png^default_grass_side.png", tileable_vertical=false}}, is_ground_content = true, stack_max = 64, groups = {handy=1,shovely=1, grass_block=1, grass_block_no_snow=1, soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, spreading_dirt_type=1, enderman_takable=1, building_block=1}, @@ -344,7 +344,7 @@ mcl_core.register_snowed_node("mcl_core:dirt_with_grass_snow", "mcl_core:dirt_wi -- Grass Block variant for dry biomes minetest.register_node("mcl_core:dirt_with_dry_grass", { _doc_items_create_entry = false, - tiles = {"default_dry_grass.png", "default_dirt.png", "default_dirt.png^default_dry_grass_side.png"}, + tiles = {"default_dry_grass.png", "default_dirt.png", {name="default_dirt.png^default_dry_grass_side.png", tileable_vertical=false}}, is_ground_content = true, stack_max = 64, groups = {handy=1,shovely=1, grass_block=1, grass_block_no_snow=1, soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, spreading_dirt_type=1, enderman_takable=1, building_block=1, not_in_creative_inventory=1}, @@ -392,7 +392,7 @@ minetest.register_node("mcl_core:grass_path", { minetest.register_node("mcl_core:mycelium", { description = "Mycelium", _doc_items_longdesc = "Mycelium is a type of dirt and the ideal soil for mushrooms. Unlike other dirt-type blocks, it can not be turned into farmland with a hoe. In light, mycelium slowly spreads over nearby dirt. Under an opaque block or a liquid, it eventually turns back into dirt.", - tiles = {"mcl_core_mycelium_top.png", "default_dirt.png", "mcl_core_mycelium_side.png"}, + tiles = {"mcl_core_mycelium_top.png", "default_dirt.png", {name="mcl_core_mycelium_side.png", tileable_vertical=false}}, is_ground_content = true, stack_max = 64, groups = {handy=1,shovely=1, spreading_dirt_type=1, building_block=1}, @@ -411,7 +411,7 @@ mcl_core.register_snowed_node("mcl_core:mycelium_snow", "mcl_core:mycelium") minetest.register_node("mcl_core:podzol", { description = "Podzol", _doc_items_longdesc = "Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.", - tiles = {"mcl_core_dirt_podzol_top.png", "default_dirt.png", "mcl_core_dirt_podzol_side.png"}, + tiles = {"mcl_core_dirt_podzol_top.png", "default_dirt.png", {name="mcl_core_dirt_podzol_side.png", tileable_vertical=false}}, is_ground_content = true, stack_max = 64, groups = {handy=1,shovely=3, soil=1, soil_sapling=2, soil_sugarcane=1, enderman_takable=1, building_block=1}, From 5a7952bf9251bdf549863a1e5731ab728ab2e3d8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Feb 2019 15:49:36 +0100 Subject: [PATCH 0302/1107] Set mob spawn chance to 2.5 and fix player respawn msg --- mods/ENTITIES/mcl_mobs/api.lua | 4 ++-- mods/PLAYER/mcl_spawn/init.lua | 30 ++++++++++++++++++------------ settingtypes.txt | 2 +- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 0f7057df..30b8a582 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -65,7 +65,7 @@ local remove_far = false 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 99) -local mobs_spawn_chance = tonumber(minetest.settings:get("mobs_spawn_chance") or 1) +local mobs_spawn_chance = tonumber(minetest.settings:get("mobs_spawn_chance") or 2.5) -- Peaceful mode message so players will know there are no monsters if peaceful_only then @@ -3335,7 +3335,7 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, nodenames = nodes, neighbors = neighbors, interval = interval, - chance = max(1, (chance * mobs_spawn_chance)), + chance = floor(max(1, chance * mobs_spawn_chance)), catch_up = false, action = spawn_abm_action, }) diff --git a/mods/PLAYER/mcl_spawn/init.lua b/mods/PLAYER/mcl_spawn/init.lua index d5391f7d..f97f1700 100644 --- a/mods/PLAYER/mcl_spawn/init.lua +++ b/mods/PLAYER/mcl_spawn/init.lua @@ -2,33 +2,37 @@ mcl_spawn = {} local mg_name = minetest.get_mapgen_setting("mg_name") --- Returns current spawn position of player. +-- Returns current custom spawn position of player. +-- Returns nil if player has no custom spawn position. -- If player is nil or not a player, the default spawn point is returned. -- The second return value is true if spawn point is player-chosen, -- false otherwise. mcl_spawn.get_spawn_pos = function(player) - local spawn, custom_spawn + local spawn, custom_spawn = nil, false if player ~= nil and player:is_player() then - spawn = minetest.string_to_pos(player:get_attribute("mcl_beds:spawn")) - custom_spawn = true + local attr = player:get_attribute("mcl_beds:spawn") + if attr ~= nil and attr ~= "" then + spawn = minetest.string_to_pos(attr) + custom_spawn = true + end end if not spawn or spawn == "" then spawn = minetest.setting_get_pos("static_spawnpoint") custom_spawn = false end - if not spawn then - spawn = { x=0, y=0, z=0 } - if mg_name == "flat" then - spawn.y = mcl_vars.mg_bedrock_overworld_max + 5 + if not spawn or spawn == "" then + local attr = player:get_attribute("mcl_spawn:first_spawn") + if attr ~= nil and attr ~= "" then + spawn = minetest.string_to_pos(attr) + custom_spawn = false end - custom_spawn = false end return spawn, custom_spawn end -- Sets the player's spawn position to pos. -- Set pos to nil to clear the spawn position. -mcl_spawn.set_spawn_pos = function(player, pos) +mcl_spawn.set_spawn_pos = function(player, pos, type) if pos == nil then player:set_attribute("mcl_beds:spawn", "") else @@ -39,7 +43,7 @@ end -- Respawn player at specified respawn position minetest.register_on_respawnplayer(function(player) local pos, custom_spawn = mcl_spawn.get_spawn_pos(player) - if custom_spawn then + if pos and custom_spawn then -- Check if bed is still there -- and the spawning position is free of solid or damaging blocks. local node_bed = minetest.get_node(pos) @@ -65,5 +69,7 @@ minetest.register_on_respawnplayer(function(player) end) minetest.register_on_newplayer(function(player) - mcl_spawn.set_spawn_pos(player, player:get_pos()) + -- Remember where the player spawned first + player:set_attribute("mcl_spawn:first_spawn", minetest.pos_to_string(player:get_pos())) end) + diff --git a/settingtypes.txt b/settingtypes.txt index 69a51081..1adfec3f 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -62,7 +62,7 @@ mobs_spawn (Spawn mobs naturally) bool true # Controls the overall amount of mobs that spawn. The higher the number, # the less often mobs will spawn. This does not affect mob spawners. -mobs_spawn_chance (Mob spawn chance) float 1.0 0.0 +mobs_spawn_chance (Mob spawn chance) float 2.5 0.0 # If enabled, only peaceful mobs will appear naturally. This does not # affect mob spawners. From 49949e2f36b8eff7d50aecd79e919e2d24d92837 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Feb 2019 16:14:08 +0100 Subject: [PATCH 0303/1107] Don't allow to go to bed while player moves --- mods/ITEMS/mcl_beds/functions.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index b1eaa85a..f763a23c 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -71,6 +71,14 @@ local function lay_down(player, pos, bed_pos, state, skip) return end + -- No sleeping while moving. This is a workaround. + -- TODO: Ideally, the player speed should be force-set to 0, + -- but this is not possible in Minetest 0.4.17. + if vector.length(player:get_player_velocity()) > 0.001 then + minetest.chat_send_player(name, "You have to stop moving before going to bed!") + return + end + -- No sleeping if monsters nearby. -- The exceptions above apply. -- Zombie pigmen only prevent sleep while they are hostle. From 1cbbe8f4b13c7782dc6fca6f9def5e2364ce3c26 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Feb 2019 17:45:42 +0100 Subject: [PATCH 0304/1107] Refactor playerphysics init --- mods/PLAYER/playerphysics/init.lua | 32 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/mods/PLAYER/playerphysics/init.lua b/mods/PLAYER/playerphysics/init.lua index 0b9420b1..2b7d7df0 100644 --- a/mods/PLAYER/playerphysics/init.lua +++ b/mods/PLAYER/playerphysics/init.lua @@ -1,43 +1,43 @@ playerphysics = {} -local function calculate_physic_product(player, physic) +local function calculate_attribute_product(player, attribute) local a = minetest.deserialize(player:get_attribute("playerphysics:physics")) local product = 1 - if a == nil or a[physic] == nil then + if a == nil or a[attribute] == nil then return product end - local factors = a[physic] + local factors = a[attribute] if type(factors) == "table" then - for id, factor in pairs(factors) do + for _, factor in pairs(factors) do product = product * factor end end return product end -function playerphysics.add_physics_factor(player, physic, id, value) +function playerphysics.add_physics_factor(player, attribute, id, value) local a = minetest.deserialize(player:get_attribute("playerphysics:physics")) if a == nil then - a = { [physic] = { [id] = value } } - elseif a[physic] == nil then - a[physic] = { [id] = value } + a = { [attribute] = { [id] = value } } + elseif a[attribute] == nil then + a[attribute] = { [id] = value } else - a[physic][id] = value + a[attribute][id] = value end player:set_attribute("playerphysics:physics", minetest.serialize(a)) - local raw_value = calculate_physic_product(player, physic) - player:set_physics_override({[physic] = raw_value}) + local raw_value = calculate_attribute_product(player, attribute) + player:set_physics_override({[attribute] = raw_value}) end -function playerphysics.remove_physics_factor(player, physic, id) +function playerphysics.remove_physics_factor(player, attribute, id) local a = minetest.deserialize(player:get_attribute("playerphysics:physics")) - if a == nil or a[physic] == nil then + if a == nil or a[attribute] == nil then -- Nothing to remove return else - a[physic][id] = nil + a[attribute][id] = nil end player:set_attribute("playerphysics:physics", minetest.serialize(a)) - local raw_value = calculate_physic_product(player, physic) - player:set_physics_override({[physic] = raw_value}) + local raw_value = calculate_attribute_product(player, attribute) + player:set_physics_override({[attribute] = raw_value}) end From 2ffd16377bc9a5f05d15beee81f080d519785952 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Feb 2019 17:48:49 +0100 Subject: [PATCH 0305/1107] Update playerphysics README --- mods/PLAYER/playerphysics/README.md | 68 +++++++++---- mods/PLAYER/playerphysics/README.md.bak | 116 ++++++++++++++++++++++ mods/PLAYER/playerphysics/description.txt | 2 +- 3 files changed, 168 insertions(+), 18 deletions(-) create mode 100644 mods/PLAYER/playerphysics/README.md.bak diff --git a/mods/PLAYER/playerphysics/README.md b/mods/PLAYER/playerphysics/README.md index 5a522878..303213fb 100644 --- a/mods/PLAYER/playerphysics/README.md +++ b/mods/PLAYER/playerphysics/README.md @@ -2,39 +2,73 @@ Version: 1.0.0 -This mod simplifies the modification of player physics (speed, jumping height, gravity). +This mod makes it possible for multiple mods to modify player physics (speed, jumping strength, gravity) without conflict. -The problem with `set_physics_override` is that is sets a raw value. -As soon as two independent mods want to mess with player physics, this is a problem. +## Introduction +### For players +Mods and games in Minetest can set physical attributes of players, such as speed and jump strength. For example, player speed could be set to 200%. But the way this works makes it difficult for multiple mods to *modify* physical attributes without leading to conflicts, problems and hilarious bugs, like speed that changes often to nonsense values. -This has a different approach in that you add and remove an arbitrary number of factors for each attribute. -The actual player attribute will be the product of all factors which have been added. +The Player Physics API aims to resolve this conflict by providing a “common ground” for mods to work together in this regard. -## Preconditions +This mod does nothing on its own, you will only need to install it as dependency of other mods. + +When you browse for mods that somehow mess with player physics (namely: speed, jump strength or gravity) and want to use more than one of them, check out if they support the Player Physics API. If they don't, it's very likely these mods will break as soon you activate more than one of them, for example, if two mods try to set the player speed. If you found such a “hilarious bug”, please report it to the developers of the mods (or games) and point them to the Player Physics API. + +Of course, not all mods need the Player Physics API. Mods that don't touch player physics at all won't need this mod. + +The rest of this document is directed at developers. + +### For developers +The function `set_physics_override` from the Minetest Lua API allows mod authors to override physical attributes of players, such as speed or jump strength. + +This function works fine as long there is only one mod that sets a particular physical attribute at a time. However, as soon as at least two different mods (that do not know each other) try to change the same player physics attribute using only this function, there will be conflicts as each mod will undo the change of the other mod, as the function sets a raw value. A classic race condition occurs. This is the case because the mods fail to communicate with each other. + +This mod solves the problem of conflicts. It bans the concept of “setting the raw value directly” and replaces it with the concept of factors that mods can add and remove for each attribute. The real physical player attribute will be the product of all active factors. + +## Quick start +Let's say you have a mod `example` and want to double the speed of the player (i.e. multiply it by a factor of 2), but you also don't want to break other mods that might touch the speed. + +Previously, you might have written something like this: + +`player:set_physics_override({speed=2})` + +However, your mod broke down as soon the mod `example2` came along, which wanted to increase the speed by 50%. In the real game, the player speed randomly switched from 50% and 200% which was a very annoying bug. + +In your `example` mod, you can replace the code with this: + +`playerphysics.add_physics_factor(player, "speed", "my_double_speed", 2)` + +Where `"my_double_speed` is an unique ID for your speed factor. + +Now your `example` mod is interoperable! And now, of course, the `example2` mod has to be updated in a similar fashion. + +## Precondition There is only one precondition to using this mod, but it is important: -Mods *MUST NOT* call `set_physics_override` directly! Instead, to modify player physics, use this API. + +Mods *MUST NOT* call `set_physics_override` directly for numerical values. Instead, to modify player physics, all mods that touch player physics have to use this API. ## Functions -### `playerphysics.add_physics_factor(player, physic, id, value)` -Adds a factor for a player physic and updates the player physics immeiately. +### `playerphysics.add_physics_factor(player, attribute, id, value)` +Adds a factor for a player physic and updates the player physics immediately. #### Parameters * `player`: Player object -* `physic`: Type of player physic to change. Any of the numeric values of `set_physics_override` (e.g. `"speed"`, `"jump"`, `"gravity"`) -* `id`: Unique identifier for this factor. Identifiers are stored on a per-player per-physics type basis +* `attribute`: Which of the physical attributes to change. Any of the numeric values of `set_physics_override` (e.g. `"speed"`, `"jump"`, `"gravity"`) +* `id`: Unique identifier for this factor. Identifiers are stored on a per-player per-attribute type basis * `value`: The factor to add to the list of products -### `playerphysics.remove_physics_factor(player, physic, id)` +If a factor for the same player, attribute and `id` already existed, it will be overwritten. + +### `playerphysics.remove_physics_factor(player, attribute, id)` Removes the physics factor of the given ID and updates the player's physics. #### Parameters -* `player`: Player object -* `physic`: Type of player physic to change. Any of the numeric values of `set_physics_override` (e.g. `"speed"`, `"jump"`, `"gravity"`) -* `id`: Unique identifier for the factor to remove +Same as in `playerphysics.add_physics_factor`, except there is no `value` argument. ## Examples ### Speed changes -Let's assume this mod is used by multiple different mods all trying to change the speed. +Let's assume this mod is used by 3 different mods all trying to change the speed: +Potions, Exhaustion and Electrocution. Here's what it could look like: Potions mod: @@ -79,4 +113,4 @@ playerphysics.add_physics_factor(player, "speed", "sleeping", 0) playerphysics.add_physics_factor(player, "jump", "sleeping", 0) ``` -This works regardless of the other factors because mathematics tell us that the factor 0 forces the product to be 0. +This works regardless of the other factors because 0 times anything equals 0. diff --git a/mods/PLAYER/playerphysics/README.md.bak b/mods/PLAYER/playerphysics/README.md.bak new file mode 100644 index 00000000..abd48bb6 --- /dev/null +++ b/mods/PLAYER/playerphysics/README.md.bak @@ -0,0 +1,116 @@ +# Player Physics API. + +Version: 1.0.0 + +This mod makes it possible for multiple mods to modify player physics (speed, jumping strength, gravity) without conflict. + +## Introduction +### For players +Mods and games in Minetest can set physical attributes of players, such as speed and jump strength. For example, player speed could be set to 200%. But the way this works makes it difficult for multiple mods to *modify* physical attributes without leading to conflicts, problems and hilarious bugs, like speed that changes often to nonsense values. + +The Player Physics API aims to resolve this conflict by providing a “common ground” for mods to work together in this regard. + +This mod does nothing on its own, you will only need to install it as dependency of other mods. + +When you browse for mods that somehow mess with player physics (namely: speed, jump strength or gravity) and want to use more than one of them, check out if they support the Player Physics API. If they don't, it's very likely these mods will break as soon you activate more than one of them, for example, if two mods try to set the player speed. If you found such a “hilarious bug”, please report it to the developers of the mods (or games) and point them to the Player Physics API. + +Of course, not all mods need the Player Physics API. Mods that don't touch player physics at all won't need this mod. + +The rest of this document is directed at developers. + +### For developers +The function `set_physics_override` from the Minetest Lua API allows mod authors to override physical attributes of players, such as speed or jump strength. + +This function works fine as long there is only one mod that sets a particular physical attribute at a time. However, as soon as at least two different mods (that do not know each other) try to change the same player physics attribute using only this function, there will be conflicts as each mod will undo the change of the other mod, as the function sets a raw value. A classic race condition occurs. This is the case because the mods fail to communicate with each other. + +This mod solves the problem of conflicts. It bans the concept of “setting the raw value directly” and replaces it with the concept of factors that mods can add and remove for each attribute. The real phyisical player attribute will be the product of all active factors. + +## Quick start +Let's say you have a mod `example` and want to double the speed of the player (i.e. multiply it by a factor of 2), but you also don't want to break other mods that might touch the speed. + +Previously, you might have written something like this: + +`player:set_physics_override({speed=2})` + +However, your mod broke down as soon the mod `example2` came along, which wanted to increase the speed by 50%. In the real game, the player speed randomly switched from 50% and 200% which was a very annoying bug. + +In your `example` mod, you can replace the code with this: + +`playerphysics.add_physics_factor(player, "speed", "my_double_speed", 2)` + +Where `"my_double_speed` is an unique ID for your speed factor. + +Now your `example` mod is interoperable! And now, of course, the `example2` mod has to be updated in a similar fashion. + +## Precondition +There is only one precondition to using this mod, but it is important: + +Mods *MUST NOT* call `set_physics_override` directly for numerical values. Instead, to modify player physics, all mods that touch player physics have to use this API. + +## Functions +### `playerphysics.add_physics_factor(player, attribute, id, value)` +Adds a factor for a player physic and updates the player physics immediately. + +#### Parameters +* `player`: Player object +* `attribute`: Which of the physical attributes to change. Any of the numeric values of `set_physics_override` (e.g. `"speed"`, `"jump"`, `"gravity"`) +* `id`: Unique identifier for this factor. Identifiers are stored on a per-player per-attribute type basis +* `value`: The factor to add to the list of products + +If a factor for the same player, attribute and `id` already existed, it will be overwritten. + +### `playerphysics.remove_physics_factor(player, attribute, id)` +Removes the physics factor of the given ID and updates the player's physics. + +#### Parameters +Same as in `playerphysics.add_physics_factor`, except there is no `value` argument. + +## Examples +### Speed changes +Let's assume this mod is used by 3 different mods all trying to change the speed: +Potions, Exhaustion and Electrocution. +Here's what it could look like: + +Potions mod: +``` +playerphysics.add_physics_factor(player, "speed", "run_potion", 2) +``` + +Exhaustion mod: +``` +playerphysics.add_physics_factor(player, "jump", "exhausted", 0.75) +``` + +Electrocution mod: +``` +playerphysics.add_physics_factor(player, "jump", "shocked", 0.9) +``` + +When the 3 mods have done their change, the real player speed is simply the product of all factors, that is: + +2 * 0.75 * 0.9 = 1.35 + +The final player speed is thus 135%. + +### Speed changes, part 2 + +Let's take the example above. +Now if the Electrocution mod is done with shocking the player, it just needs to call: + +``` +playerphysics.remove_physics_factor(player, "jump", "shocked") +``` + +The effect is now gone, so the new player speed will be: + +2 * 0.75 = 1.5 + +### Sleeping +To simulate sleeping by preventing all player movement, this can be done with this easy trick: + +``` +playerphysics.add_physics_factor(player, "speed", "sleeping", 0) +playerphysics.add_physics_factor(player, "jump", "sleeping", 0) +``` + +This works regardless of the other factors because 0 times anything equals 0. diff --git a/mods/PLAYER/playerphysics/description.txt b/mods/PLAYER/playerphysics/description.txt index 57ee96ff..c692c5cd 100644 --- a/mods/PLAYER/playerphysics/description.txt +++ b/mods/PLAYER/playerphysics/description.txt @@ -1 +1 @@ -This mod simplifies the modification of player physics (speed, jumping height, gravity) by adding factors to the base values. +This mod makes it possible for multiple mods to modify player physics (speed, jumping strength, gravity) without conflict. From 2d721a98cb7a31db699b258d8d0de81bcc80e606 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Feb 2019 18:55:48 +0100 Subject: [PATCH 0306/1107] Call on_drop for dropped items on player death Fixes charged bow dropping on death --- mods/PLAYER/mcl_death_drop/init.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mods/PLAYER/mcl_death_drop/init.lua b/mods/PLAYER/mcl_death_drop/init.lua index 1b033bae..5f4b1ddb 100644 --- a/mods/PLAYER/mcl_death_drop/init.lua +++ b/mods/PLAYER/mcl_death_drop/init.lua @@ -24,13 +24,16 @@ minetest.register_on_dieplayer(function(player) pos.x = pos.x + x pos.z = pos.z + z if not void_deadly and drop then + local def = minetest.registered_items[stack:get_name()] + if def and def.on_drop then + stack = def.on_drop(stack, player, pos) + end minetest.add_item(pos, stack) end - stack:clear() - inv:set_stack(listname, i, stack) pos.x = pos.x - x pos.z = pos.z - z end + inv:set_list(listname, {}) end end armor:set_player_armor(player) From f985aab19136f3e5fb47fc24d9352e6f668c0fd1 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Feb 2019 18:58:14 +0100 Subject: [PATCH 0307/1107] Version 0.45.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 06df675b..f3e4b05c 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.44.0 +Version: 0.45.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 0f134426e85520bc96efed3068279490f3aff0aa Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Feb 2019 20:03:56 +0100 Subject: [PATCH 0308/1107] Fix protection-related crash when taking liquid --- mods/ITEMS/mcl_buckets/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_buckets/init.lua b/mods/ITEMS/mcl_buckets/init.lua index f05d725c..c5b45c4d 100644 --- a/mods/ITEMS/mcl_buckets/init.lua +++ b/mods/ITEMS/mcl_buckets/init.lua @@ -205,7 +205,7 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", { end -- Can't steal liquids - if minetest.is_protected(pointed_thing.above, pointed_thing.under) then + if minetest.is_protected(pointed_thing.above, user:get_player_name()) then minetest.record_protection_violation(pointed_thing.under, user:get_player_name()) return itemstack end From dee5f3bda6c15fa2646c476129a6e8527cde1111 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Feb 2019 20:04:30 +0100 Subject: [PATCH 0309/1107] Version 0.45.1 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f3e4b05c..10aa7bcf 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.45.0 +Version: 0.45.1 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From aa3739528b638bb8e6544119714a8a620bd9e889 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Feb 2019 21:27:17 +0100 Subject: [PATCH 0310/1107] Fix weird arguments given to is_protected --- mods/ITEMS/mcl_core/nodes_base.lua | 6 +++++- mods/ITEMS/mcl_fire/fire_charge.lua | 4 ++-- mods/ITEMS/mcl_fire/flint_and_steel.lua | 4 ++-- mods/ITEMS/mcl_fire/init.lua | 18 +++++++++++++++--- mods/ITEMS/mcl_nether/init.lua | 7 ++++++- mods/ITEMS/mcl_tnt/init.lua | 2 +- 6 files changed, 31 insertions(+), 10 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index f2299e07..237eff39 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -652,7 +652,11 @@ minetest.register_node("mcl_core:bedrock", { local dim = mcl_worlds.pos_to_dimension(pos) local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z} local fn = minetest.get_node(flame_pos) - if dim == "end" and fn.name == "air" and not minetest.is_protected(flame_pos, "fire") and pointed_thing.under.y < pointed_thing.above.y then + local pname = player:get_player_name() + if minetest.is_protected(flame_pos, pname) then + return minetest.record_protection_violation(flame_pos, pname) + end + if dim == "end" and fn.name == "air" and pointed_thing.under.y < pointed_thing.above.y then minetest.set_node(flame_pos, {name = "mcl_fire:eternal_fire"}) return true else diff --git a/mods/ITEMS/mcl_fire/fire_charge.lua b/mods/ITEMS/mcl_fire/fire_charge.lua index 26259e04..d35ffae9 100644 --- a/mods/ITEMS/mcl_fire/fire_charge.lua +++ b/mods/ITEMS/mcl_fire/fire_charge.lua @@ -28,10 +28,10 @@ minetest.register_craftitem("mcl_fire:fire_charge", { if nodedef and nodedef._on_ignite then local overwrite = nodedef._on_ignite(user, pointed_thing) if not overwrite then - mcl_fire.set_fire(pointed_thing) + mcl_fire.set_fire(pointed_thing, user) end else - mcl_fire.set_fire(pointed_thing) + mcl_fire.set_fire(pointed_thing, user) end if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() diff --git a/mods/ITEMS/mcl_fire/flint_and_steel.lua b/mods/ITEMS/mcl_fire/flint_and_steel.lua index 0ab4043f..7cb114ad 100644 --- a/mods/ITEMS/mcl_fire/flint_and_steel.lua +++ b/mods/ITEMS/mcl_fire/flint_and_steel.lua @@ -33,10 +33,10 @@ minetest.register_tool("mcl_fire:flint_and_steel", { if nodedef and nodedef._on_ignite then local overwrite = nodedef._on_ignite(user, pointed_thing) if not overwrite then - mcl_fire.set_fire(pointed_thing) + mcl_fire.set_fire(pointed_thing, user) end else - mcl_fire.set_fire(pointed_thing) + mcl_fire.set_fire(pointed_thing, user) end used = true end diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index 665b13de..7743d30d 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -393,10 +393,22 @@ else -- Fire enabled end --- Set pointed_thing on (normal) fire -mcl_fire.set_fire = function(pointed_thing) +-- Set pointed_thing on (normal) fire. +-- * pointed_thing: Pointed thing to ignite +-- * player: Player who sets fire or nil if nobody +mcl_fire.set_fire = function(pointed_thing, player) + local pname + if player == nil then + pname = "" + else + pname = player:get_player_name() + end local n = minetest.get_node(pointed_thing.above) - if n.name == "air" and not minetest.is_protected(pointed_thing.above, "fire") then + if minetest.is_protected(pointed_thing.above, pname) then + minetest.record_protection_violation(pointed_thing.above, pname) + return + end + if n.name == "air" then minetest.add_node(pointed_thing.above, {name="mcl_fire:fire"}) end end diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index b0bb771a..4fc36a8b 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -46,7 +46,12 @@ local eternal_on_ignite = function(player, pointed_thing) local pos = pointed_thing.under local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z} local fn = minetest.get_node(flame_pos) - if fn.name == "air" and not minetest.is_protected(flame_pos, "fire") and pointed_thing.under.y < pointed_thing.above.y then + local pname = player:get_player_name() + if minetest.is_protected(flame_pos, pname) then + minetest.record_protection_violation(flame_pos, pname) + return + end + if fn.name == "air" and pointed_thing.under.y < pointed_thing.above.y then minetest.set_node(flame_pos, {name = "mcl_fire:eternal_fire"}) return true else diff --git a/mods/ITEMS/mcl_tnt/init.lua b/mods/ITEMS/mcl_tnt/init.lua index 39df3848..dd6ebc66 100644 --- a/mods/ITEMS/mcl_tnt/init.lua +++ b/mods/ITEMS/mcl_tnt/init.lua @@ -204,7 +204,7 @@ tnt.boom = function(pos, info) end minetest.sound_play(sound, {pos = pos,gain = 1.0,max_hear_distance = 16,}) local node = minetest.get_node(pos) - if minetest.get_item_group("water") == 1 or minetest.get_item_group("lava") == 1 or minetest.is_protected(pos, "tnt") then + if minetest.get_item_group("water") == 1 or minetest.get_item_group("lava") == 1 then -- Cancel the Explosion return end From 46a6d9bb8e616ddeae42c6ccc0dc30fb1ed1df11 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Feb 2019 20:14:30 +0100 Subject: [PATCH 0311/1107] Signs: Remove dead code --- mods/ITEMS/mcl_signs/init.lua | 6 ------ 1 file changed, 6 deletions(-) diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index 29c23f52..541e8114 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -361,9 +361,6 @@ minetest.register_node("mcl_signs:wall_sign", { return itemstack end, on_destruct = destruct_sign, - on_receive_fields = function(pos, formname, fields, sender) - update_sign(pos, fields, sender) - end, on_punch = function(pos, node, puncher) update_sign(pos) end, @@ -398,9 +395,6 @@ local ssign = { sounds = node_sounds, on_destruct = destruct_sign, - on_receive_fields = function(pos, formname, fields, sender) - update_sign(pos, fields, sender) - end, on_punch = function(pos, node, puncher) update_sign(pos) end, From d0e38623562b56cfa7913ea78eb39b372700bc92 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Feb 2019 20:52:44 +0100 Subject: [PATCH 0312/1107] Fix bad wall sign text update after punch --- mods/ITEMS/mcl_signs/init.lua | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index 541e8114..608d1922 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -157,6 +157,19 @@ local function get_rotation_level(facedir, nodename) return rl end +local function get_wall_signtext_info(param2, nodename) + local dir = minetest.wallmounted_to_dir(param2) + if dir.x > 0 then + return 2 + elseif dir.z > 0 then + return 1 + elseif dir.x < 0 then + return 4 + else + return 3 + end +end + local sign_groups = {handy=1,axey=1, flammable=1, deco_block=1, material_wood=1, attached_node=1} local destruct_sign = function(pos) @@ -186,7 +199,7 @@ local update_sign = function(pos, fields, sender) for _, v in ipairs(objects) do local ent = v:get_luaentity() if ent and ent.name == "mcl_signs:text" then - v:set_properties({textures={generate_texture(create_lines(text), v:get_luaentity()._signnodename)}}) + v:set_properties({textures={generate_texture(create_lines(text), ent._signnodename)}}) return end end @@ -198,7 +211,7 @@ local update_sign = function(pos, fields, sender) if nn == "mcl_signs:standing_sign" or nn == "mcl_signs:standing_sign22_5" or nn == "mcl_signs:standing_sign45" or nn == "mcl_signs:standing_sign67_5" then sign_info = signtext_info_standing[get_rotation_level(n.param2, nn) + 1] elseif nn == "mcl_signs:wall_sign" then - sign_info = signtext_info_wall[n.param2 + 1] + sign_info = signtext_info_wall[get_wall_signtext_info(n.param2)] end if sign_info == nil then return @@ -215,6 +228,7 @@ local update_sign = function(pos, fields, sender) sign_info.yaw = sign_info.yaw + 3 * (math.pi / 8) end text_entity:get_luaentity()._signnodename = nn + text_entity:set_properties({textures={generate_texture(create_lines(text), nn)}}) text_entity:setyaw(sign_info.yaw) end From 37b9a8f6bf70ab3fad990b02e468530726c7262b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Feb 2019 20:59:25 +0100 Subject: [PATCH 0313/1107] Fix incorrect text rotation when sign text updates --- mods/ITEMS/mcl_signs/init.lua | 7 ------- 1 file changed, 7 deletions(-) diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index 608d1922..1b1ede29 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -220,13 +220,6 @@ local update_sign = function(pos, fields, sender) x = pos.x + sign_info.delta.x, y = pos.y + sign_info.delta.y, z = pos.z + sign_info.delta.z}, "mcl_signs:text") - if nn == "mcl_signs:standing_sign22_5" then - sign_info.yaw = sign_info.yaw + math.pi / 8 - elseif nn == "mcl_signs:standing_sign45" then - sign_info.yaw = sign_info.yaw + 2 * (math.pi / 8) - elseif nn == "mcl_signs:standing_sign67_5" then - sign_info.yaw = sign_info.yaw + 3 * (math.pi / 8) - end text_entity:get_luaentity()._signnodename = nn text_entity:set_properties({textures={generate_texture(create_lines(text), nn)}}) From 198adcc7404725138d19c7f1f20889392abc8f36 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Feb 2019 21:29:11 +0100 Subject: [PATCH 0314/1107] Respawn sign text on load --- mods/ITEMS/mcl_signs/init.lua | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index 1b1ede29..c9763379 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -427,7 +427,7 @@ local ssign67 = table.copy(ssign) ssign67.mesh = "mcl_signs_sign67.5.obj" minetest.register_node("mcl_signs:standing_sign67_5", ssign67) - +-- FIXME: Prevent entity destruction by /clearobjects minetest.register_entity("mcl_signs:text", { collisionbox = { 0, 0, 0, 0, 0, 0 }, visual = "upright_sprite", @@ -484,6 +484,15 @@ end minetest.register_alias("signs:sign_wall", "mcl_signs:wall_sign") minetest.register_alias("signs:sign_yard", "mcl_signs:standing_sign") +minetest.register_lbm({ + name = "mcl_signs:respawn_entities", + label = "Respawn sign text entities", + run_at_every_load = true, + nodenames = { "mcl_signs:wall_sign", "mcl_signs:standing_sign", "mcl_signs:standing_sign22_5", "mcl_signs:standing_sign45", "mcl_signs:standing_sign67_5" }, + action = function(pos, node) + update_sign(pos) + end, +}) if minetest.settings:get_bool("log_mods") then minetest.log("action", "[mcl_signs] loaded") From eb7c8371ac07c8c3de3bb4abea1f1910e8f873e5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Feb 2019 21:58:31 +0100 Subject: [PATCH 0315/1107] Respawn itemframe entities on load --- mods/ITEMS/mcl_itemframes/init.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua index 14170e3b..d4d39ab8 100644 --- a/mods/ITEMS/mcl_itemframes/init.lua +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -221,4 +221,14 @@ minetest.register_lbm({ end, }) +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") From 267a697fab032188d2ff7f9947a1da5e95b117da Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Feb 2019 23:32:18 +0100 Subject: [PATCH 0316/1107] Banners: Respawn entity if it got lost Entity is respawned on load (in an LBM) or when the banner node is punched. Also, the banner drop is now handled in the node instead of the entity. --- mods/ITEMS/mcl_banners/init.lua | 192 ++++++++++++++++++++++---------- 1 file changed, 134 insertions(+), 58 deletions(-) diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index 71f0ac02..5bab2ed7 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -32,6 +32,11 @@ mcl_banners.colors = { ["unicolor_light_blue"] = {"light_blue", "Light Blue Banner", "mcl_wool:light_blue", "#4040CF", "mcl_dye:lightblue", "Light Blue" }, } +local colors_reverse = {} +for k,v in pairs(mcl_banners.colors) do + colors_reverse["mcl_banners:banner_item_"..v[1]] = k +end + -- Add pattern/emblazoning crafting recipes dofile(minetest.get_modpath("mcl_banners").."/patterncraft.lua") @@ -42,28 +47,40 @@ local layer_ratio = 255 local standing_banner_entity_offset = { x=0, y=-0.499, z=0 } local hanging_banner_entity_offset = { x=0, y=-1.7, z=0 } -local on_destruct_standing_banner = function(pos) +local on_destruct_banner = function(pos, hanging) + local offset, nodename + if hanging then + offset = hanging_banner_entity_offset + nodename = "mcl_banners:hanging_banner" + else + offset = standing_banner_entity_offset + nodename = "mcl_banners:standing_banner" + end -- Find this node's banner entity and make it drop as an item - local checkpos = vector.add(pos, standing_banner_entity_offset) + local checkpos = vector.add(pos, offset) local objects = minetest.get_objects_inside_radius(checkpos, 0.5) for _, v in ipairs(objects) do local ent = v:get_luaentity() - if ent and ent.name == "mcl_banners:standing_banner" then - v:get_luaentity():_drop() + if ent and ent.name == nodename then + v:remove() end end + -- Drop item + local meta = minetest.get_meta(pos) + local item = meta:get_inventory():get_stack("banner", 1) + if not item:is_empty() then + minetest.add_item(pos, item) + else + minetest.add_item(pos, "mcl_banners:banner_item_white") + end +end + +local on_destruct_standing_banner = function(pos) + return on_destruct_banner(pos, false) end local on_destruct_hanging_banner = function(pos) - -- Find this node's banner entity and make it drop as an item - local checkpos = vector.add(pos, hanging_banner_entity_offset) - local objects = minetest.get_objects_inside_radius(checkpos, 0.5) - for _, v in ipairs(objects) do - local ent = v:get_luaentity() - if ent and ent.name == "mcl_banners:hanging_banner" then - v:get_luaentity():_drop() - end - end + return on_destruct_banner(pos, true) end local make_banner_texture = function(base_color, layers) @@ -96,6 +113,59 @@ local make_banner_texture = function(base_color, layers) end end +local spawn_banner_entity = function(pos, hanging, itemstack) + local banner + if hanging then + banner = minetest.add_entity(pos, "mcl_banners:hanging_banner") + else + banner = minetest.add_entity(pos, "mcl_banners:standing_banner") + end + if banner == nil then + return banner + end + local imeta = itemstack:get_meta() + local layers_raw = imeta:get_string("layers") + local layers = minetest.deserialize(layers_raw) + local colorid = colors_reverse[itemstack:get_name()] + banner:get_luaentity():_set_textures(colorid, layers) + local mname = imeta:get_string("name") + if mname ~= nil and mname ~= "" then + banner:get_luaentity()._item_name = mname + banner:get_luaentity()._item_description = imeta:get_string("description") + end + + return banner +end + +local respawn_banner_entity = function(pos, node) + local hanging = node.name == "mcl_banners:hanging_banner" + local offset + if hanging then + offset = hanging_banner_entity_offset + else + offset = standing_banner_entity_offset + end + -- Check if a banner entity already exists + local bpos = vector.add(pos, offset) + local objects = minetest.get_objects_inside_radius(bpos, 0.5) + for _, v in ipairs(objects) do + local ent = v:get_luaentity() + if ent and (ent.name == "mcl_banners:standing_banner" or ent.name == "mcl_banners:hanging_banner") then + return + end + end + -- Spawn new entity + local meta = minetest.get_meta(pos) + local banner_item = meta:get_inventory():get_stack("banner", 1) + local banner_entity = spawn_banner_entity(bpos, hanging, banner_item) + + -- Set rotation + local final_yaw + local rotation_level = meta:get_int("rotation_level") + final_yaw = (rotation_level * (math.pi/8)) + math.pi + banner_entity:set_yaw(final_yaw) +end + local on_rotate if minetest.get_modpath("screwdriver") then on_rotate = screwdriver.disallow @@ -138,6 +208,9 @@ minetest.register_node("mcl_banners:standing_banner", { drop = "", -- Item drops are handled in entity code on_destruct = on_destruct_standing_banner, + on_punch = function(pos, node) + respawn_banner_entity(pos, node) + end, _mcl_hardness = 1, _mcl_blast_resistance = 5, }) @@ -166,6 +239,9 @@ minetest.register_node("mcl_banners:hanging_banner", { drop = "", -- Item drops are handled in entity code on_destruct = on_destruct_hanging_banner, + on_punch = function(pos, node) + respawn_banner_entity(pos, node) + end, _mcl_hardness = 1, _mcl_blast_resistance = 5, on_rotate = on_rotate, @@ -269,48 +345,61 @@ for colorid, colortab in pairs(mcl_banners.colors) do end hanging = true end - local place_pos if minetest.registered_nodes[node_under.name].buildable_to then place_pos = under else place_pos = above end - if hanging then - place_pos = vector.add(place_pos, hanging_banner_entity_offset) - else - place_pos = vector.add(place_pos, standing_banner_entity_offset) + local bnode = minetest.get_node(place_pos) + if bnode.name ~= "mcl_banners:standing_banner" and bnode.name ~= "mcl_banners:hanging_banner" then + minetest.log("error", "[mcl_banners] The placed banner node is not what the mod expected!") + return itemstack end + local meta = minetest.get_meta(place_pos) + local inv = meta:get_inventory() + inv:set_size("banner", 1) + local store_stack = ItemStack(itemstack) + store_stack:set_count(1) + inv:set_stack("banner", 1, store_stack) - local banner + -- Spawn entity + local entity_place_pos if hanging then - banner = minetest.add_entity(place_pos, "mcl_banners:hanging_banner") + entity_place_pos = vector.add(place_pos, hanging_banner_entity_offset) else - banner = minetest.add_entity(place_pos, "mcl_banners:standing_banner") + entity_place_pos = vector.add(place_pos, standing_banner_entity_offset) end - local imeta = itemstack:get_meta() - local layers_raw = imeta:get_string("layers") - local layers = minetest.deserialize(layers_raw) - banner:get_luaentity():_set_textures(colorid, layers) - local mname = imeta:get_string("name") - if mname ~= nil and mname ~= "" then - banner:get_luaentity()._item_name = mname - banner:get_luaentity()._item_description = imeta:get_string("description") - end - + local banner_entity = spawn_banner_entity(entity_place_pos, hanging, itemstack) -- Set rotation - local final_yaw + local final_yaw, rotation_level if hanging then local pdir = vector.direction(pointed_thing.under, pointed_thing.above) final_yaw = minetest.dir_to_yaw(pdir) + if pdir.x > 0 then + rotation_level = 4 + elseif pdir.z > 0 then + rotation_level = 8 + elseif pdir.x < 0 then + rotation_level = 12 + else + rotation_level = 0 + end else -- Determine the rotation based on player's yaw local yaw = placer:get_look_horizontal() -- Select one of 16 possible rotations (0-15) - local rotation_level = round((yaw / (math.pi*2)) * 16) + rotation_level = round((yaw / (math.pi*2)) * 16) + if rotation_level >= 16 then + rotation_level = 0 + end final_yaw = (rotation_level * (math.pi/8)) + math.pi end - banner:set_yaw(final_yaw) + meta:set_int("rotation_level", rotation_level) + + if banner_entity ~= nil then + banner_entity:set_yaw(final_yaw) + end if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() @@ -392,30 +481,6 @@ local entity_standing = { self.object:set_armor_groups({immortal=1}) end, - -- This is a custom function which causes the banner to be dropped as item and destroys the entity. - _drop = function(self) - local pos = self.object:get_pos() - pos.y = pos.y + 1 - - if not minetest.settings:get_bool("creative_mode") and self._base_color then - -- Spawn item - local banner = ItemStack("mcl_banners:banner_item_"..mcl_banners.colors[self._base_color][1]) - local meta = banner:get_meta() - meta:set_string("layers", minetest.serialize(self._layers)) - if self._item_name ~= nil and self._item_name ~= "" then - meta:set_string("description", self._item_description) - meta:set_string("name", self._item_name) - else - meta:set_string("description", mcl_banners.make_advanced_banner_description(banner:get_definition().description, self._layers)) - end - - minetest.add_item(pos, banner) - end - - -- Destroy entity - self.object:remove() - end, - -- Set the banner textures. This function can be used by external mods. -- Meaning of parameters: -- * self: Lua entity reference to entity. @@ -436,6 +501,17 @@ local entity_hanging = table.copy(entity_standing) entity_hanging.mesh = "amc_banner_hanging.b3d" minetest.register_entity("mcl_banners:hanging_banner", entity_hanging) +-- FIXME: Prevent entity destruction by /clearobjects +minetest.register_lbm({ + label = "Respawn banner entities", + name = "mcl_banners:respawn_entities", + run_at_every_load = true, + nodenames = {"mcl_banners:standing_banner", "mcl_banners:hanging_banner"}, + action = function(pos, node) + respawn_banner_entity(pos, node) + end, +}) + minetest.register_craft({ type = "fuel", recipe = "group:banner", From e332c64d2ada9aa5c09f8bb591c7adf17b1632c6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Feb 2019 23:55:18 +0100 Subject: [PATCH 0317/1107] Respawn armor entity of armor stand on load --- .../minetest-3d_armor/3d_armor_stand/init.lua | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua index 76dcec55..02eb0bcb 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor_stand/init.lua @@ -125,6 +125,12 @@ minetest.register_node("3d_armor_stand:armor_stand", { minetest.record_protection_violation(pos, protname) return itemstack end + + local inv = minetest.get_inventory({type = "node", pos = pos}) + if not inv then + return itemstack + end + -- Check if player wields armor local name = itemstack:get_name() local list @@ -135,11 +141,8 @@ minetest.register_node("3d_armor_stand:armor_stand", { break end end - -- If player wields armor, put it on armor stand - local inv = minetest.get_inventory({type = "node", pos = pos}) local wielditem = clicker:get_wielded_item() - if not inv then return itemstack end if list then -- ... but only if the slot is free local single_item = ItemStack(itemstack) @@ -172,11 +175,12 @@ minetest.register_node("3d_armor_stand:armor_stand", { if taken then stand_armor:take_item() inv:set_stack("armor_" .. elements[e], 1, stand_armor) - update_entity(pos) end + update_entity(pos) return clicker:get_wielded_item() end end + update_entity(pos) return itemstack end, after_place_node = function(pos) @@ -264,6 +268,17 @@ minetest.register_entity("3d_armor_stand:armor_entity", { end, }) +-- FIXME: Armor helper entity can get destroyed by /clearobjects +minetest.register_lbm({ + label = "Respawn armor stand entities", + name = "3d_armor_stand:respawn_entities", + nodenames = {"3d_armor_stand:armor_stand"}, + run_at_every_load = true, + action = function(pos, node) + update_entity(pos, node) + end, +}) + if minetest.get_modpath("doc_identifier") ~= nil then doc.sub.identifier.register_object("3d_armor_stand:armor_entity", "nodes", "3d_armor_stand:armor_stand") end From e5c78973b008e7f35323b4039546d36102352f7d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 19 Feb 2019 00:06:14 +0100 Subject: [PATCH 0318/1107] Respawn mobspawner doll on load, if gone mobspawner doll on load, if gone mobspawner doll on load, if gone mobspawner doll on load, if gone --- mods/ITEMS/mcl_mobspawners/init.lua | 31 +++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index 46cf74c7..58ec364c 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -66,6 +66,20 @@ local function set_doll_properties(doll, mob) doll:get_luaentity()._mob = mob end +local function respawn_doll(pos) + local meta = minetest.get_meta(pos) + local mob = meta:get_string("Mob") + local doll + if mob and mob ~= "" then + doll = find_doll(pos) + if not doll then + doll = spawn_doll(pos) + set_doll_properties(doll, mob) + end + end + return doll +end + --[[ Public function: Setup the spawner at pos. This function blindly assumes there's actually a spawner at pos. If not, then the results are undefined. @@ -288,6 +302,10 @@ minetest.register_node("mcl_mobspawners:spawner", { end end, + on_punch = function(pos) + respawn_doll(pos) + end, + on_timer = spawn_mobs, sounds = mcl_sounds.node_sound_metal_defaults(), @@ -328,7 +346,7 @@ end doll_def.on_step = function(self, dtime) -- Check if spawner is still present. If not, delete the entity - self.timer = self.timer + 0.01 + self.timer = self.timer + dtime local n = minetest.get_node_or_nil(self.object:get_pos()) if self.timer > 1 then if n and n.name and n.name ~= "mcl_mobspawners:spawner" then @@ -341,5 +359,14 @@ doll_def.on_punch = function(self, hitter) end minetest.register_entity("mcl_mobspawners:doll", doll_def) - +-- FIXME: Doll can get destroyed by /clearobjects +minetest.register_lbm({ + label = "Respawn mob spawner dolls", + name = "mcl_mobspawners:respawn_entities", + nodenames = { "mcl_mobspawners:spawner" }, + run_at_every_load = true, + action = function(pos, node) + respawn_doll(pos) + end, +}) From a1ce94eee5eefec7af84c79b1f6f4bcb7a4833b1 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 19 Feb 2019 00:06:47 +0100 Subject: [PATCH 0319/1107] Add comment to mcl_itemframes --- mods/ITEMS/mcl_itemframes/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua index d4d39ab8..2d2fffb3 100644 --- a/mods/ITEMS/mcl_itemframes/init.lua +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -221,6 +221,7 @@ minetest.register_lbm({ end, }) +-- FIXME: Item entities can get destroyed by /clearobjects minetest.register_lbm({ label = "Respawn item frame item entities", name = "mcl_itemframes:respawn_entities", From c1bc7a8fae9ff108021e6b0ca076f7d978459d4d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 19 Feb 2019 03:42:50 +0100 Subject: [PATCH 0320/1107] Chorus fruit keeps u safe from damaging blocks --- mods/ITEMS/mcl_end/chorus_plant.lua | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index 58832b42..5c48654d 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -17,6 +17,12 @@ local chorus_flower_box = { } } +-- Helper function +local function round(num, idp) + local mult = 10^(idp or 0) + return math.floor(num * mult + 0.5) / mult +end + minetest.register_node("mcl_end:chorus_flower", { description = "Chorus Flower", _doc_items_longdesc = "A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow.", @@ -282,16 +288,16 @@ local random_teleport = function(player) for a=1, 16 do -- Teleportation box local x,y,z - x = math.random(pos.x-8, pos.x+8) + x = math.random(round(pos.x)-8, round(pos.x)+8) y = math.random(math.ceil(pos.y)-8, math.ceil(pos.y)+8) - z = math.random(pos.z-8, pos.z+8) + z = math.random(round(pos.z)-8, round(pos.z)+8) local node_cache = {} local ground_level = false -- Scan nodes from selected position until we hit ground for t=0, 16 do local tpos = {x=x, y=y-t, z=z} local tnode = minetest.get_node(tpos) - if tnode.name == "mcl_core:void" then + if tnode.name == "mcl_core:void" or tnode.name == "ignore" then break end local tdef = minetest.registered_nodes[tnode.name] @@ -304,16 +310,20 @@ local random_teleport = function(player) -- Ground found? Then let's check if the player has enough room if ground_level and #node_cache >= 1 then local streak = 0 + local last_was_walkable = true for c=#node_cache, 1, -1 do local tpos = node_cache[c].pos local tnode = node_cache[c].node local tdef = minetest.registered_nodes[tnode.name] - -- Player needs a space of 2 nodes on top of each other - if not tdef.walkable and tdef.liquidtype == "none" then - streak = streak + 1 + -- Player needs a space of 2 safe non-liquid nodes on top of a walkable node + if not tdef.walkable and tdef.liquidtype == "none" and tdef.damage_per_second <= 0 then + if (streak == 0 and last_was_walkable) or (streak > 0) then + streak = streak + 1 + end else streak = 0 end + last_was_walkable = tdef.walkable if streak >= 2 then -- JACKPOT! Now we can teleport. local goal = {x=tpos.x, y=tpos.y-1.5, z=tpos.z} @@ -347,7 +357,7 @@ end minetest.register_craftitem("mcl_end:chorus_fruit", { description = "Chorus Fruit", - _doc_items_longdesc = "A chorus fruit is an edible fruit from the chorus plant which is home to the End. Eating it teleports you to the top of a random solid block nearby, provided you won't end up inside a liquid or some solid blocks. Teleportation might fail if there are very few or no places to teleport to.", + _doc_items_longdesc = "A chorus fruit is an edible fruit from the chorus plant which is home to the End. Eating it teleports you to the top of a random solid block nearby, provided you won't end up inside a liquid, solid or harmful blocks. Teleportation might fail if there are very few or no places to teleport to.", wield_image = "mcl_end_chorus_fruit.png", inventory_image = "mcl_end_chorus_fruit.png", on_place = eat_chorus_fruit, From 38f6804a799b23706fd525a1dbd9c6e96e3317d2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 19 Feb 2019 20:16:12 +0100 Subject: [PATCH 0321/1107] Update tsm_railcorridors to 0.14.0 --- mods/MAPGEN/tsm_railcorridors/README.md | 13 +- mods/MAPGEN/tsm_railcorridors/init.lua | 789 ++++++++++++------ .../MAPGEN/tsm_railcorridors/settingtypes.txt | 19 +- 3 files changed, 557 insertions(+), 264 deletions(-) diff --git a/mods/MAPGEN/tsm_railcorridors/README.md b/mods/MAPGEN/tsm_railcorridors/README.md index 9b2b745b..de9df489 100644 --- a/mods/MAPGEN/tsm_railcorridors/README.md +++ b/mods/MAPGEN/tsm_railcorridors/README.md @@ -1,11 +1,10 @@ # Railway corridors [`tsm_railcorridors`] MineClone 2 adaption. NO TREASURER SUPPORT! -* Current version 0.12.0 +* 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 Treasurer support is available for adding -treasures from various mods. +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. @@ -13,6 +12,6 @@ Use the advanced settings to finetune the railway corridors. * Forum thread: https://forum.minetest.net/viewtopic.php?t=10339 * License: MIT License. -## Info for modders -Want to include this mod in a game, but you hate the dependencies? -You can edit the node names in gameconfig.lua to fit your needs. :-) +## 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/init.lua b/mods/MAPGEN/tsm_railcorridors/init.lua index 57c18379..d6de8198 100644 --- a/mods/MAPGEN/tsm_railcorridors/init.lua +++ b/mods/MAPGEN/tsm_railcorridors/init.lua @@ -12,15 +12,13 @@ local P = function (float) return math.floor(32767 * float) end --- Wahrscheinlichkeit für jeden Chunk, solche Gänge mit Schienen zu bekommen --- Probability for every newly generated chunk to get corridors -local probability_railcaves_in_chunk = P(0.3) -setting = tonumber(minetest.settings:get("tsm_railcorridors_probability_railcaves_in_chunk")) +-- 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")) if setting then - probability_railcaves_in_chunk = P(setting) + probability_railcaves_in_mapchunk = P(setting) end --- Innerhalb welcher Parameter soll sich die Pfadlänge bewegen? (Forks heben den Maximalwert auf) -- Minimal and maximal value of path length (forks don't look up this value) local way_min = 4; local way_max = 7; @@ -33,7 +31,6 @@ if setting then way_max = setting end --- Wahrsch. für jeden geraden Teil eines Korridors, Fackeln zu bekommen -- 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")) @@ -41,7 +38,6 @@ if setting then probability_torches_in_segment = P(setting) end --- Wahrsch. für jeden Teil eines Korridors, nach oben oder nach unten zu gehen -- 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")) @@ -49,7 +45,6 @@ if setting then probability_up_or_down = P(setting) end --- Wahrscheinlichkeit für jeden Teil eines Korridors, sich zu verzweigen – vorsicht, wenn fast jeder Gang sich verzweigt, kann der Algorithums unlösbar werden und MT hängt sich auf -- 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")) @@ -57,7 +52,6 @@ if setting then probability_fork = P(setting) end --- Wahrscheinlichkeit für jeden geraden Teil eines Korridors eine Kiste zu enthalten -- 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")) @@ -66,17 +60,11 @@ if setting then end -- Probability for every part of a corridor to contain a cart --- Disabled because cart spawning creates error message spam: --- “m_static_exists=true but static data doesn't actually exist in (x,y,z) --- TODO: Set back to 0.05 when this is fixed. --- TODO: Remove minecarts from loot table when minecarts spawn on rails. -local probability_cart = P(0) ---[[ +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) @@ -111,27 +99,50 @@ 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 --- Parameter Ende +-- End of parameters --- Random generators -local pr, webperlin_major, webperlin_minor -local pr_initialized = false +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_treasures, pr_deco, webperlin_major, webperlin_minor 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) - pr_initialized = true + pr_inited = true 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) +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] @@ -144,8 +155,13 @@ local function SetNodeIfCanBuild(pos, node, check_above) end local name = minetest.get_node(pos).name local def = minetest.registered_nodes[name] - if name ~= "unknown" and name ~= "ignore" and def.is_ground_content and - (def.liquidtype == "none" or name == tsm_railcorridors.nodes.cobweb) then + if name ~= "unknown" and name ~= "ignore" 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 @@ -175,8 +191,9 @@ 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.walkable and (nodedef.node_box == nil or nodedef.node_box.type == "regular") + return nodename ~= "unknown" and nodename ~= "ignore" 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 @@ -184,36 +201,91 @@ 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] - return node.name ~= "ignore" and node.name ~= "unknown" and nodedef.is_ground_content and ((nodedef.walkable == false and node2.name ~= tsm_railcorridors.nodes.dirt) or (nodedef.groups and nodedef.groups.falling_node)) + 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.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 for non-solid nodes like air +-- * 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) +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 - for zi = p.z-radius, p.z+radius do - for yi = y_top, p.y-radius, -1 do - for xi = p.x-radius, p.x+radius do + + -- 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 - if not solid and yi == y_top then - local topdef = minetest.registered_nodes[minetest.get_node({x=xi,y=yi+1,z=zi}).name] - if not (topdef.groups and topdef.groups.attached_node) and topdef.liquidtype == "none" then + 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.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 - built = SetNodeIfCanBuild({x=xi,y=yi,z=zi}, node) + -- 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.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) @@ -226,15 +298,74 @@ local function Cube(p, radius, node, replace_air_only) 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 Platform(p, radius, node) +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 = NeedsPlatform({x=xi,y=p.y,z=zi}) + local np, np2 = NeedsPlatform({x=xi,y=p.y,z=zi}) if np then - minetest.set_node({x=xi,y=p.y-1,z=zi}, node) + 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 @@ -253,36 +384,24 @@ local function PlaceChest(pos, param2) end -- This function checks if a cart has ACTUALLY been spawned. --- If not, it tries to spawn it again, and again, until it succeeded or --- it failed too often. -- To be calld by minetest.after. --- This is a HORRIBLE workaround thanks to the fact that minetest.add_entity is unreliable as fuck +-- 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] - local tries = params[3] - tries = tries - 1 -- Find cart for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do if obj ~= nil 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 - if tries <= 0 then - -- Abort if too many tries to avoid excessive function calls - return - end - -- No cart found! :-( Try again … - if minetest.get_node(pos).name == tsm_railcorridors.nodes.rail then - minetest.add_entity(pos, cart_id) - minetest.after(5, RecheckCartHack, {pos, cart_id, tries}) - end - -- The rail may have been destroyed in the meantime, that's why the node is checked. + minetest.log("info", "[tsm_railcorridors] Cart spawn FAILED: "..minetest.pos_to_string(pos)) end -- Try to place a cobweb. @@ -321,27 +440,108 @@ local function TryPlaceCobweb(pos, needs_check, side_vector) return false end end - -local function WoodBulk(pos, wood) - SetNodeIfCanBuild({x=pos.x+1, y=pos.y, z=pos.z+1}, {name=wood}) - SetNodeIfCanBuild({x=pos.x-1, y=pos.y, z=pos.z+1}, {name=wood}) - SetNodeIfCanBuild({x=pos.x+1, y=pos.y, z=pos.z-1}, {name=wood}) - SetNodeIfCanBuild({x=pos.x-1, y=pos.y, z=pos.z-1}, {name=wood}) + +-- 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 --- Gänge mit Schienen --- Corridors with rails +-- 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.walkable then + pos1.y = pos1.y + 1 + end + SetNodeIfCanBuild(pos1, node, true) + + if 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 corridor_part(start_point, segment_vector, segment_count, wood, post, first_or_final, up_or_down_prev) +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} - local node_fence = {name=post} if segment_vector.x == 0 and segment_vector.z ~= 0 then dir = {1, 0} torchdir = {5, 4} @@ -350,7 +550,12 @@ local function corridor_part(start_point, segment_vector, segment_count, wood, p torchdir = {3, 2} end for segmentindex = 0, segment_count-1 do - local dug = Cube(p, 1, {name="air"}) + 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 @@ -364,92 +569,27 @@ local function corridor_part(start_point, segment_vector, segment_count, wood, p -- 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 - -- Diese komischen Holz-Konstruktionen - -- These strange wood structs if segmentindex % 2 == 1 and segment_vector.y == 0 then - 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 = true - 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) end - - -- Right post and planks - local right_ok = true - 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) 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.walkable then - pos1.y = pos1.y + 1 - end - SetNodeIfCanBuild(pos1, node, true) - - if nodedef2.walkable then - pos2.y = pos2.y + 1 - end - SetNodeIfCanBuild(pos2, node, true) - - end + WoodSupport(p, wood, post, torches, dir, torchdir) end - - -- nächster Punkt durch Vektoraddition - -- next way point + + -- Next way point p = vector.add(p, segment_vector) end -- End of the corridor segment; create the final piece - local dug = Cube(p, 1, {name="air"}) + 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) @@ -457,7 +597,11 @@ local function corridor_part(start_point, segment_vector, segment_count, wood, p return true, segment_count end -local function corridor_func(waypoint, coord, sign, up_or_down, up_or_down_next, up_or_down_prev, up, wood, post, first_or_final, damage, no_spawner) +-- 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 @@ -467,12 +611,12 @@ local function corridor_func(waypoint, coord, sign, up_or_down, up_or_down_next, end local vek = {x=0,y=0,z=0}; local start = table.copy(waypoint) - if coord == "x" then + if axis == "x" then vek.x=segamount if up_or_down and up == false then start.x=start.x+segamount end - elseif coord == "z" then + elseif axis == "z" then vek.z=segamount if up_or_down and up == false then start.z=start.z+segamount @@ -487,20 +631,19 @@ local function corridor_func(waypoint, coord, sign, up_or_down, up_or_down_next, end local segcount = pr:next(4,6) if up_or_down and up == false then - Cube(waypoint, 1, {name="air"}) + Cube(waypoint, 1, {name="air"}, false) end - local corridor_dug, corridor_segments_dug = corridor_part(start, vek, segcount, wood, post, first_or_final, up_or_down_prev) + 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} - -- nachträglich Schienen legen - -- after this: rails + -- After this: rails segamount = 1 if sign then segamount = 0-segamount end - if coord == "x" then + if axis == "x" then vek.x=segamount - elseif coord == "z" then + elseif axis == "z" then vek.z=segamount end if up_or_down then @@ -541,7 +684,7 @@ local function corridor_func(waypoint, coord, sign, up_or_down, up_or_down_next, -- Randomly returns either the left or right side of the main rail. -- Also returns offset as second return value. local left_or_right = function(pos, vek) - local off, facedir + local off if pr:next(1, 2) == 1 then -- left off = {x = -vek.z, y= 0, z = vek.x} @@ -565,32 +708,30 @@ local function corridor_func(waypoint, coord, sign, up_or_down, up_or_down_next, -- Chest if i == chestplace then local cpos, offset = left_or_right(p, vek) - if minetest.get_node(cpos).name == post then + if minetest.get_node(cpos).name == post or IsInDirtRoom(p) then chestplace = chestplace + 1 else PlaceChest(cpos, minetest.dir_to_facedir(offset)) end end - -- Rail and cart - if i == cartplace then + -- 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 = PlaceRail(cpos, damage) + 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 - local cart_type = pr:next(1, #tsm_railcorridors.carts) - -- FIXME: The cart sometimes fails to spawn - -- See - local cart_id = tsm_railcorridors.carts[cart_type] - local cart = 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(2, RecheckCartHack, {cpos, cart_id, 10}) + -- 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 @@ -649,7 +790,7 @@ local function corridor_func(waypoint, coord, sign, up_or_down, up_or_down_next, end end - + local offset = table.copy(corridor_vek) local final_point = vector.add(waypoint, offset) if up_or_down then @@ -657,12 +798,13 @@ local function corridor_func(waypoint, coord, sign, up_or_down, up_or_down_next, offset.y = offset.y - 1 final_point = vector.add(waypoint, offset) else - offset[coord] = offset[coord] + segamount + offset[axis] = offset[axis] + segamount final_point = vector.add(waypoint, offset) - -- After going up or down, 1 missing rail piece must be added - 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 + -- 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 @@ -672,34 +814,46 @@ local function corridor_func(waypoint, coord, sign, up_or_down, up_or_down_next, end end -local function start_corridor(waypoint, coord, sign, length, psra, wood, post, damage, no_spawner) +-- 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 c = coord + local a = axis local s = sign - local ud = false -- up or down - local udn = false -- up or down is next - local udp = false -- up or down was previous - local up + local ud = false -- Up or down + local udn = false -- Up or down is next + local udp = false -- 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 - local needs_platform -- 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 then - needs_platform = NeedsPlatform(wp) - if needs_platform then - ud = false - end + 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 - -- Chose random direction in between - up = pr:next(0, 2) < 1 + -- 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 @@ -709,71 +863,141 @@ local function start_corridor(waypoint, coord, sign, length, psra, wood, post, d elseif udn and not needs_platform then udn = false end - -- Make corridor / Korridor graben + -- 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 = corridor_func(wp,c,s, ud, udn, udp, up, wood, post, first_or_final, damage, no_spawner) + 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 - -- Verzweigung? - -- Fork? + -- 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} - start_corridor(wp, c, s, pr:next(way_min,way_max), psra, wood, post, damage, no_spawner) - if c == "x" then c="z" else c="x" end - start_corridor(wp, c, s, pr:next(way_min,way_max), psra, wood, post, damage, no_spawner) - start_corridor(wp, c, not s, pr:next(way_min,way_max), psra, wood, post, damage, no_spawner) - WoodBulk({x=p.x, y=p.y-1, z=p.z}, wood) - WoodBulk({x=p.x, y=p.y, z=p.z}, wood) - WoodBulk({x=p.x, y=p.y+1, z=p.z}, wood) - WoodBulk({x=p.x, y=p.y+2, z=p.z}, wood) + 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 - -- coord und sign verändern - -- randomly change sign and coord - if c=="x" then - c="z" - elseif c=="z" then - c="x" + -- 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(0, 2) < 1 + s = pr:next(1, 2) == 1 end end -local function place_corridors(main_cave_coords, psra) - --[[ ALWAYS start building in the ground. Prevents corridors starting - in mid-air or in liquids. ]] - if not IsGround(main_cave_coords) then - return +-- 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 - --[[ Starter cube: A big hollow dirt cube from which the corridors will extend. - Corridor generation starts here. ]] - if pr:next(0, 100) < 50 then - Cube(main_cave_coords, 4, {name=tsm_railcorridors.nodes.dirt}) - Cube(main_cave_coords, 3, {name="air"}) - -- Center rail - PlaceRail({x=main_cave_coords.x, y=main_cave_coords.y-3, z=main_cave_coords.z}, damage) - main_cave_coords.y =main_cave_coords.y - 1 - else - Cube(main_cave_coords, 3, {name=tsm_railcorridors.nodes.dirt}) - Cube(main_cave_coords, 2, {name="air"}) - -- Center rail - PlaceRail({x=main_cave_coords.x, y=main_cave_coords.y-2, z=main_cave_coords.z}, damage) - end - local xs = pr:next(0, 2) < 1 - local zs = pr:next(0, 2) < 1; -- 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 @@ -787,10 +1011,6 @@ local function place_corridors(main_cave_coords, psra) for w=1, #tsm_railcorridors.nodes.corridor_woods do local woodtable = tsm_railcorridors.nodes.corridor_woods[w] accumulated_chance = accumulated_chance + woodtable.chance - if accumulated_chance > 1000 then - minetest.log("warning", "[tsm_railcorridors] Warning: Wood chances add up to over 100%!") - break - end if rnd <= accumulated_chance then woodtype = w break @@ -800,31 +1020,98 @@ local function place_corridors(main_cave_coords, psra) post = tsm_railcorridors.nodes.corridor_woods[woodtype].post end - start_corridor(main_cave_coords, "x", xs, pr:next(way_min,way_max), psra, wood, post, damage, false) - start_corridor(main_cave_coords, "z", zs, pr:next(way_min,way_max), psra, wood, post, damage, false) - -- Auch mal die andere Richtung? - -- Try the other direction? - if pr:next(0, 100) < 70 then - start_corridor(main_cave_coords, "x", not xs, pr:next(way_min,way_max), psra, wood, post, damage, false) + -- 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 - if pr:next(0, 100) < 70 then - start_corridor(main_cave_coords, "z", not zs, pr:next(way_min,way_max), psra, wood, post, damage, false) + -- 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 minetest.register_on_generated(function(minp, maxp, blockseed) + -- 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_chunk then - -- Get semi-random height in chunk - + 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 - 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 chunk - local p = {x=minp.x+math.floor((maxp.x-minp.x)/2), y=y, z=minp.z+math.floor((maxp.z-minp.z)/2)} - -- Haupthöhle und alle weiteren - -- Corridors; starting with main cave out of dirt - place_corridors(p, pr) + -- 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) diff --git a/mods/MAPGEN/tsm_railcorridors/settingtypes.txt b/mods/MAPGEN/tsm_railcorridors/settingtypes.txt index b21662c6..a2896290 100644 --- a/mods/MAPGEN/tsm_railcorridors/settingtypes.txt +++ b/mods/MAPGEN/tsm_railcorridors/settingtypes.txt @@ -1,5 +1,5 @@ -#Probability (0.0 to 1.0) for every newly generated chunk to get rail corridors. -tsm_railcorridors_probability_railcaves_in_chunk (Rail corridor probability) float 0.3 0.0 1.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 @@ -20,6 +20,17 @@ 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 @@ -28,7 +39,3 @@ tsm_railcorridors_probability_damage (Damaged railway probability) float 1.0 0.0 #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 - -#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 From 8982e368ecb1e4146a74d75508eea5c593388f60 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 20 Feb 2019 16:09:39 +0100 Subject: [PATCH 0322/1107] Abort sleep if taking damage --- mods/ITEMS/mcl_beds/functions.lua | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index f763a23c..495927a1 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -194,6 +194,7 @@ function mcl_beds.sleep() 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) @@ -201,6 +202,14 @@ function mcl_beds.kick_players() end end +-- Throw a player out of bed +function mcl_beds.kick_player(player) + local name = player:get_player_name() + if mcl_beds.player[name] ~= nil then + lay_down(player, nil, nil, false) + end +end + function mcl_beds.skip_night() minetest.set_timeofday(0.25) -- tod = 6000 end @@ -305,3 +314,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) 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) From 3b8fe6039e8238b0c5d5a335fbfcfbe7d21c9743 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 20 Feb 2019 16:18:13 +0100 Subject: [PATCH 0323/1107] Don't skip night if not all players are asleep --- mods/ITEMS/mcl_beds/functions.lua | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 495927a1..e57d5822 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -161,15 +161,18 @@ local function lay_down(player, pos, bed_pos, state, skip) end local function update_formspecs(finished) + if is_sp then + return + end local ges = #minetest.get_connected_players() local form_n local all_in_bed = ges == player_in_bed if finished then - form_n = mcl_beds.formspec .. "label[2.7,11; Good morning.]" + form_n = mcl_beds.formspec .. "label[2.7,11;Good morning.]" else form_n = mcl_beds.formspec .. "label[2.2,11;" .. tostring(player_in_bed) .. - " of " .. tostring(ges) .. " players are in bed]" + " of " .. tostring(ges) .. " players are in bed]" end for name,_ in pairs(mcl_beds.player) do @@ -272,10 +275,10 @@ function mcl_beds.on_rightclick(pos, player) -- skip the night and let all players stand up if check_in_beds() then minetest.after(5, function() - if not is_sp then + if check_in_beds() then update_formspecs(is_night_skip_enabled()) + mcl_beds.sleep() end - mcl_beds.sleep() end) end end @@ -294,8 +297,10 @@ minetest.register_on_leaveplayer(function(player) mcl_beds.player[name] = nil if check_in_beds() then minetest.after(5, function() - update_formspecs(is_night_skip_enabled()) - mcl_beds.sleep() + if check_in_beds() then + update_formspecs(is_night_skip_enabled()) + mcl_beds.sleep() + end end) end end) From cb2978470cea010bc7b96d2eacff7e34432d5308 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 20 Feb 2019 17:04:38 +0100 Subject: [PATCH 0324/1107] Improve bed formspec --- mods/ITEMS/mcl_beds/functions.lua | 35 ++++++++++++++++++++++--------- mods/ITEMS/mcl_beds/init.lua | 4 ---- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index e57d5822..357d8bd2 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -161,18 +161,32 @@ local function lay_down(player, pos, bed_pos, state, skip) end local function update_formspecs(finished) - if is_sp then - return - end local ges = #minetest.get_connected_players() - local form_n + local form_n = "size[8,15;true]" + local all_in_bed = ges == player_in_bed if finished then - form_n = mcl_beds.formspec .. "label[2.7,11;Good morning.]" + for name,_ in pairs(mcl_beds.player) do + minetest.close_formspec(name, "mcl_beds_form") + end + return + elseif not is_sp then + local text = string.format("%d of %d player(s) are in bed.", player_in_bed, ges) + if all_in_bed then + text = text .. "\n" .. "You're sleeping." + form_n = form_n .. "bgcolor[#000000FF; true]" + form_n = form_n .. "button_exit[2,12;4,0.75;leave;Abort sleep]" + else + text = text .. "\n" .. "Sleep will commence when all players are in bed." + form_n = form_n .. "bgcolor[#808080BB; true]" + form_n = form_n .. "button_exit[2,12;4,0.75;leave;Leave bed]" + end + form_n = form_n .. "label[2.2,7.5;"..minetest.formspec_escape(text).."]" else - form_n = mcl_beds.formspec .. "label[2.2,11;" .. tostring(player_in_bed) .. - " of " .. tostring(ges) .. " players are in bed]" + form_n = form_n .. "label[2.2,7.5;You're sleeping.]" + form_n = form_n .. "button_exit[2,12;4,0.75;leave;Abort sleep]" + form_n = form_n .. "bgcolor[#000000FF; true]" end for name,_ in pairs(mcl_beds.player) do @@ -203,6 +217,7 @@ function mcl_beds.kick_players() 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 @@ -210,6 +225,8 @@ function mcl_beds.kick_player(player) local name = player:get_player_name() if mcl_beds.player[name] ~= nil then lay_down(player, nil, nil, false) + update_formspecs(false) + minetest.close_formspec(name, "mcl_beds_form") end end @@ -268,9 +285,7 @@ function mcl_beds.on_rightclick(pos, player) lay_down(player, nil, nil, false) end - if not is_sp then - update_formspecs(false) - end + update_formspecs(false) -- skip the night and let all players stand up if check_in_beds() then diff --git a/mods/ITEMS/mcl_beds/init.lua b/mods/ITEMS/mcl_beds/init.lua index 72bfb347..8f60cb54 100644 --- a/mods/ITEMS/mcl_beds/init.lua +++ b/mods/ITEMS/mcl_beds/init.lua @@ -2,10 +2,6 @@ mcl_beds = {} mcl_beds.player = {} mcl_beds.pos = {} -mcl_beds.formspec = "size[8,15;true]" .. - "bgcolor[#080808BB; true]" .. - "button_exit[2,12;4,0.75;leave;Leave Bed]" - local modpath = minetest.get_modpath("mcl_beds") -- Load files From b481eadafd08d3dcc79a0619db36a546edc0fd25 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 20 Feb 2019 17:32:22 +0100 Subject: [PATCH 0325/1107] Beds: Show message when night skip is disabled --- mods/ITEMS/mcl_beds/functions.lua | 34 +++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 357d8bd2..6b35000b 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -163,8 +163,12 @@ end local function update_formspecs(finished) local ges = #minetest.get_connected_players() local form_n = "size[8,15;true]" - local all_in_bed = ges == player_in_bed + local night_skip = is_night_skip_enabled() + local button_leave = "button_exit[2,12;4,0.75;leave;Leave bed]" + local button_abort = "button_exit[2,12;4,0.75;leave;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 @@ -173,20 +177,32 @@ local function update_formspecs(finished) return elseif not is_sp then local text = string.format("%d of %d player(s) are in bed.", player_in_bed, ges) - if all_in_bed then + if not night_skip then + text = text .. "\n" .. "You're in bed." .. "\n" .. "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" .. "You're sleeping." - form_n = form_n .. "bgcolor[#000000FF; true]" - form_n = form_n .. "button_exit[2,12;4,0.75;leave;Abort sleep]" + form_n = form_n .. bg_sleep + form_n = form_n .. button_abort else text = text .. "\n" .. "Sleep will commence when all players are in bed." - form_n = form_n .. "bgcolor[#808080BB; true]" - form_n = form_n .. "button_exit[2,12;4,0.75;leave;Leave bed]" + form_n = form_n .. bg_presleep + form_n = form_n .. button_leave end form_n = form_n .. "label[2.2,7.5;"..minetest.formspec_escape(text).."]" else - form_n = form_n .. "label[2.2,7.5;You're sleeping.]" - form_n = form_n .. "button_exit[2,12;4,0.75;leave;Abort sleep]" - form_n = form_n .. "bgcolor[#000000FF; true]" + local text + if night_skip then + text = "You're sleeping." + form_n = form_n .. bg_sleep + form_n = form_n .. button_abort + else + text = "You're in bed." .. "\n" .. "Note: Night skip is disabled." + form_n = form_n .. bg_presleep + form_n = form_n .. button_leave + end + form_n = form_n .. "label[2.2,7.5;"..minetest.formspec_escape(text).."]" end for name,_ in pairs(mcl_beds.player) do From 942b9468ffadb7f3451583b909b096e8a8c8c9c2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 20 Feb 2019 17:38:19 +0100 Subject: [PATCH 0326/1107] Simplify bed help a bit --- mods/ITEMS/mcl_beds/api.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_beds/api.lua b/mods/ITEMS/mcl_beds/api.lua index 074d847d..5d473245 100644 --- a/mods/ITEMS/mcl_beds/api.lua +++ b/mods/ITEMS/mcl_beds/api.lua @@ -23,16 +23,16 @@ local function destruct_bed(pos, n) end local beddesc = "Beds allow you to sleep at night and make the time pass faster." -local beduse = "Right-click on the bed to sleep in it. This only works when the sun sets, at night or during a thunderstorm." +local beduse = "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" .. "In local folklore, legends are told of other worlds where setting the start point for your next would be possible. But this world is not one of them." + beddesc = beddesc .. "\n" .. "In local folklore, legends are told of other worlds where setting the start point for your next life would be possible. But this world is not one of them." else - beddesc = beddesc .. "\n" .. "By sleeping in a bed, you set the starting point for your next life." + beddesc = beddesc .. "\n" .. "By sleeping in 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" .. "In this strange world, going to bed won't skip the night, but you can skip thunderstorms." else - beddesc = beddesc .. "\n" .. "Sleeping allows you to skip the night if you're the only player in this world. If you're not alone, the night is skipped when all players in this world went to sleep. Thunderstorms can be skipped in the same manner." + beddesc = beddesc .. "\n" .. "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 From f18b1bd52ae158f05e096324f33df44d2956b1c4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 20 Feb 2019 18:01:21 +0100 Subject: [PATCH 0327/1107] Kick player out of bed when bed destroyed --- mods/ITEMS/mcl_beds/api.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mods/ITEMS/mcl_beds/api.lua b/mods/ITEMS/mcl_beds/api.lua index 5d473245..5675b50a 100644 --- a/mods/ITEMS/mcl_beds/api.lua +++ b/mods/ITEMS/mcl_beds/api.lua @@ -22,6 +22,18 @@ local function destruct_bed(pos, n) end end +local function kick_player_after_destruct(pos) + for name, _ in pairs(mcl_beds.pos) do + if vector.equals(pos, mcl_beds.pos) 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 = "Beds allow you to sleep at night and make the time pass faster." local beduse = "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 @@ -125,6 +137,7 @@ function mcl_beds.register_bed(name, def) on_destruct = function(pos) destruct_bed(pos, 1) + kick_player_after_destruct(pos) end, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) @@ -199,6 +212,7 @@ function mcl_beds.register_bed(name, def) on_rotate = false, on_destruct = function(pos) destruct_bed(pos, 2) + kick_player_after_destruct(pos) end, }) From 0cc8962258a522ce787fb5b2df0c16e3e412d82e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 20 Feb 2019 18:17:44 +0100 Subject: [PATCH 0328/1107] Fix stuck player if server shuts down during sleep --- mods/ITEMS/mcl_beds/functions.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 6b35000b..27faef23 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -318,8 +318,11 @@ end -- Callbacks minetest.register_on_joinplayer(function(player) if player:get_attribute("mcl_beds:sleeping") == "true" then + -- Make player awake on joining server player:set_attribute("mcl_beds:sleeping", "false") end + playerphysics.remove_physics_factor(player, "speed", "mcl_beds:sleeping") + playerphysics.remove_physics_factor(player, "jump", "mcl_beds:sleeping") end) minetest.register_on_leaveplayer(function(player) From ec53db93529de46cfc14692701bfdd9b9554c908 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 20 Feb 2019 19:22:24 +0100 Subject: [PATCH 0329/1107] Beds can save spawn pos at daytime, too --- mods/ITEMS/mcl_beds/api.lua | 18 +++++----- mods/ITEMS/mcl_beds/functions.lua | 58 ++++++++++++++++++------------- 2 files changed, 42 insertions(+), 34 deletions(-) diff --git a/mods/ITEMS/mcl_beds/api.lua b/mods/ITEMS/mcl_beds/api.lua index 5675b50a..708f529c 100644 --- a/mods/ITEMS/mcl_beds/api.lua +++ b/mods/ITEMS/mcl_beds/api.lua @@ -1,15 +1,13 @@ local reverse = true -local function destruct_bed(pos, n) +local function destruct_bed(pos, is_top) local node = minetest.get_node(pos) local other - - if n == 2 then - local dir = minetest.facedir_to_dir(node.param2) + local dir = minetest.facedir_to_dir(node.param2) + if is_top then other = vector.subtract(pos, dir) - elseif n == 1 then - local dir = minetest.facedir_to_dir(node.param2) + else other = vector.add(pos, dir) end @@ -136,12 +134,12 @@ function mcl_beds.register_bed(name, def) end, on_destruct = function(pos) - destruct_bed(pos, 1) + destruct_bed(pos, false) kick_player_after_destruct(pos) end, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - mcl_beds.on_rightclick(pos, clicker) + mcl_beds.on_rightclick(pos, clicker, false) return itemstack end, @@ -206,12 +204,12 @@ function mcl_beds.register_bed(name, def) 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) + mcl_beds.on_rightclick(pos, clicker, true) return itemstack end, on_rotate = false, on_destruct = function(pos) - destruct_bed(pos, 2) + destruct_bed(pos, true) kick_player_after_destruct(pos) end, }) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 27faef23..2232f6da 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -61,14 +61,14 @@ local function lay_down(player, pos, bed_pos, state, skip) local hud_flags = player:hud_get_flags() if not player or not name then - return + return false end if bed_pos then -- No sleeping if too far away if vector.distance(bed_pos, pos) > 2 then minetest.chat_send_player(name, "You can't sleep, the bed's too far away!") - return + return false end -- No sleeping while moving. This is a workaround. @@ -76,7 +76,7 @@ local function lay_down(player, pos, bed_pos, state, skip) -- but this is not possible in Minetest 0.4.17. if vector.length(player:get_player_velocity()) > 0.001 then minetest.chat_send_player(name, "You have to stop moving before going to bed!") - return + return false end -- No sleeping if monsters nearby. @@ -93,7 +93,7 @@ local function lay_down(player, pos, bed_pos, state, skip) if math.abs(bed_pos.y - obj:get_pos().y) <= 5 then minetest.chat_send_player(name, "You can't sleep now, monsters are nearby!") end - return + return false end end end @@ -108,7 +108,7 @@ local function lay_down(player, pos, bed_pos, state, skip) end -- skip here to prevent sending player specific changes (used for leaving players) if skip then - return + return false end if p then player:setpos(p) @@ -116,7 +116,9 @@ local function lay_down(player, pos, bed_pos, state, skip) -- physics, eye_offset, etc player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) - player:set_look_horizontal(math.random(1, 180) / 100) + 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") @@ -135,10 +137,24 @@ local function lay_down(player, pos, bed_pos, state, skip) local def2 = minetest.registered_nodes[n2.name] if def1.walkable or def2.walkable then minetest.chat_send_player(name, "You can't sleep, the bed is obstructed!") - return + return false elseif (def1.damage_per_second ~= nil and def1.damage_per_second > 0) or (def2.damage_per_second ~= nil and def2.damage_per_second > 0) then minetest.chat_send_player(name, "It's too dangerous to sleep here!") - return + return false + end + + if minetest.get_modpath("mcl_spawn") then + local spos = table.copy(bed_pos) + spos.y = spos.y + 0.1 + mcl_spawn.set_spawn_pos(player, spos) -- save respawn position when entering bed + 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 + minetest.chat_send_player(name, "You can only sleep at night or during a thunderstorm.") + return false end mcl_beds.player[name] = 1 @@ -147,6 +163,7 @@ local function lay_down(player, pos, bed_pos, state, skip) -- 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) + player:set_look_vertical(0) player:set_attribute("mcl_beds:sleeping", "true") playerphysics.add_physics_factor(player, "speed", "mcl_beds:sleeping", 0) @@ -158,6 +175,7 @@ local function lay_down(player, pos, bed_pos, state, skip) end player:hud_set_flags(hud_flags) + return true end local function update_formspecs(finished) @@ -260,7 +278,7 @@ function mcl_beds.skip_thunderstorm() return false end -function mcl_beds.on_rightclick(pos, player) +function mcl_beds.on_rightclick(pos, player, is_top) -- Anti-Inception: Don't allow to sleep while you're sleeping if player:get_attribute("mcl_beds:sleeping") == "true" then return @@ -278,24 +296,16 @@ function mcl_beds.on_rightclick(pos, player) end local name = player:get_player_name() local ppos = player:get_pos() - 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 - if mcl_beds.player[name] then - lay_down(player, nil, nil, false) - end - minetest.chat_send_player(name, "You can only sleep at night or during a thunderstorm.") - return - end -- move to bed if not mcl_beds.player[name] then - lay_down(player, ppos, pos) - if minetest.get_modpath("mcl_spawn") then - local spos = table.copy(pos) - spos.y = spos.y + 0.1 - mcl_spawn.set_spawn_pos(player, spos) -- save respawn position when entering bed + if is_top then + 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) + lay_down(player, ppos, other) end else lay_down(player, nil, nil, false) From 079b09c80f1a01d8ac0a4041c9c83e3963be4c2e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 20 Feb 2019 19:39:12 +0100 Subject: [PATCH 0330/1107] Explicit msgs when respawn pos changed due to bed --- mods/ITEMS/mcl_beds/api.lua | 2 +- mods/ITEMS/mcl_beds/functions.lua | 12 ++++++++++-- mods/PLAYER/mcl_spawn/init.lua | 22 +++++++++++++++++++++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_beds/api.lua b/mods/ITEMS/mcl_beds/api.lua index 708f529c..b6f18ea4 100644 --- a/mods/ITEMS/mcl_beds/api.lua +++ b/mods/ITEMS/mcl_beds/api.lua @@ -37,7 +37,7 @@ local beduse = "To use a bed, stand close to it and right-click the bed to sleep if minetest.settings:get_bool("enable_bed_respawn") == false then beddesc = beddesc .. "\n" .. "In local folklore, legends are told of other worlds where setting the start point for your next life would be possible. But this world is not one of them." else - beddesc = beddesc .. "\n" .. "By sleeping in 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." + beddesc = beddesc .. "\n" .. "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" .. "In this strange world, going to bed won't skip the night, but you can skip thunderstorms." diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 2232f6da..e20bb8c5 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -143,19 +143,27 @@ local function lay_down(player, pos, bed_pos, state, skip) return false end + local spawn_changed = false if minetest.get_modpath("mcl_spawn") then local spos = table.copy(bed_pos) spos.y = spos.y + 0.1 - mcl_spawn.set_spawn_pos(player, spos) -- save respawn position when entering bed + spawn_changed = mcl_spawn.set_spawn_pos(player, spos) -- save respawn position when entering bed 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 - minetest.chat_send_player(name, "You can only sleep at night or during a thunderstorm.") + if spawn_changed then + minetest.chat_send_player(name, "New respawn position set! But you can only sleep at night or during a thunderstorm.") + else + minetest.chat_send_player(name, "You can only sleep at night or during a thunderstorm.") + end return false end + if spawn_changed then + minetest.chat_send_player(name, "New respawn position set!") + end mcl_beds.player[name] = 1 mcl_beds.pos[name] = pos diff --git a/mods/PLAYER/mcl_spawn/init.lua b/mods/PLAYER/mcl_spawn/init.lua index f97f1700..5c8a797e 100644 --- a/mods/PLAYER/mcl_spawn/init.lua +++ b/mods/PLAYER/mcl_spawn/init.lua @@ -32,12 +32,32 @@ end -- Sets the player's spawn position to pos. -- Set pos to nil to clear the spawn position. -mcl_spawn.set_spawn_pos = function(player, pos, type) +-- If message is set, informs the player with a chat message when the spawn position +-- changed. +mcl_spawn.set_spawn_pos = function(player, pos, message) + local spawn_changed = false if pos == nil then + if player:get_attribute("mcl_beds:spawn") ~= "" then + spawn_changed = true + if message then + minetest.chat_send_player(player:get_player_name(), "Respawn position cleared!") + end + end player:set_attribute("mcl_beds:spawn", "") else + local oldpos = minetest.string_to_pos(player:get_attribute("mcl_beds:spawn")) + if oldpos then + -- We don't bother sending a message if the new spawn pos is basically the same + if vector.distance(pos, oldpos) > 0.1 then + spawn_changed = true + if message then + minetest.chat_send_player(player:get_player_name(), "New respawn position set!") + end + end + end player:set_attribute("mcl_beds:spawn", minetest.pos_to_string(pos)) end + return spawn_changed end -- Respawn player at specified respawn position From 88872c8ce253f49f73222a469f3daa056c377f46 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 20 Feb 2019 20:40:06 +0100 Subject: [PATCH 0331/1107] Can't sleep in occupied beds --- mods/ITEMS/mcl_beds/functions.lua | 14 ++++++++++++-- mods/ITEMS/mcl_beds/init.lua | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index e20bb8c5..5f24f7ba 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -71,6 +71,13 @@ local function lay_down(player, pos, bed_pos, state, skip) return false end + for _, other_pos in pairs(mcl_beds.bed_pos) do + if vector.distance(bed_pos, other_pos) < 0.1 then + minetest.chat_send_player(name, "This bed is already occupied!") + return false + end + end + -- No sleeping while moving. This is a workaround. -- TODO: Ideally, the player speed should be force-set to 0, -- but this is not possible in Minetest 0.4.17. @@ -111,7 +118,7 @@ local function lay_down(player, pos, bed_pos, state, skip) return false end if p then - player:setpos(p) + player:set_pos(p) end -- physics, eye_offset, etc @@ -125,6 +132,8 @@ local function lay_down(player, pos, bed_pos, state, skip) player:set_attribute("mcl_beds:sleeping", "false") hud_flags.wielditem = true mcl_player.player_set_animation(player, "stand" , 30) + mcl_beds.pos[name] = nil + mcl_beds.bed_pos[name] = nil -- lay down else @@ -167,6 +176,7 @@ local function lay_down(player, pos, bed_pos, state, skip) mcl_beds.player[name] = 1 mcl_beds.pos[name] = pos + mcl_beds.bed_pos[name] = bed_pos 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}) @@ -176,7 +186,7 @@ local function lay_down(player, pos, bed_pos, state, skip) player:set_attribute("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:setpos(p) + player:set_pos(p) mcl_player.player_attached[name] = true hud_flags.wielditem = false mcl_player.player_set_animation(player, "lay" , 0) diff --git a/mods/ITEMS/mcl_beds/init.lua b/mods/ITEMS/mcl_beds/init.lua index 8f60cb54..4c25b539 100644 --- a/mods/ITEMS/mcl_beds/init.lua +++ b/mods/ITEMS/mcl_beds/init.lua @@ -1,6 +1,7 @@ mcl_beds = {} mcl_beds.player = {} mcl_beds.pos = {} +mcl_beds.bed_pos = {} local modpath = minetest.get_modpath("mcl_beds") From 8c672fa3b22a686e07b6b15a75c1bb3b90e3cb86 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 20 Feb 2019 20:45:55 +0100 Subject: [PATCH 0332/1107] Tweak messages in mcl_beds --- mods/ITEMS/mcl_beds/functions.lua | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 5f24f7ba..67382dfb 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -78,9 +78,7 @@ local function lay_down(player, pos, bed_pos, state, skip) end end - -- No sleeping while moving. This is a workaround. - -- TODO: Ideally, the player speed should be force-set to 0, - -- but this is not possible in Minetest 0.4.17. + -- No sleeping while moving. Slightly different behaviour than in MC. if vector.length(player:get_player_velocity()) > 0.001 then minetest.chat_send_player(name, "You have to stop moving before going to bed!") return false @@ -214,7 +212,7 @@ local function update_formspecs(finished) elseif not is_sp then local text = string.format("%d of %d player(s) are in bed.", player_in_bed, ges) if not night_skip then - text = text .. "\n" .. "You're in bed." .. "\n" .. "Note: Night skip is disabled." + text = text .. "\n" .. "Note: Night skip is disabled." form_n = form_n .. bg_presleep form_n = form_n .. button_leave elseif all_in_bed then @@ -222,7 +220,7 @@ local function update_formspecs(finished) form_n = form_n .. bg_sleep form_n = form_n .. button_abort else - text = text .. "\n" .. "Sleep will commence when all players are in bed." + text = text .. "\n" .. "You will fall asleep when all players are in bed." form_n = form_n .. bg_presleep form_n = form_n .. button_leave end From 7678a1a95fefdf742f39bd39ff11aa249ac12ad5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 20 Feb 2019 20:52:06 +0100 Subject: [PATCH 0333/1107] Beds: Fix kick_players_afeter_destruct --- mods/ITEMS/mcl_beds/api.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_beds/api.lua b/mods/ITEMS/mcl_beds/api.lua index b6f18ea4..4fbbe55e 100644 --- a/mods/ITEMS/mcl_beds/api.lua +++ b/mods/ITEMS/mcl_beds/api.lua @@ -20,9 +20,9 @@ local function destruct_bed(pos, is_top) end end -local function kick_player_after_destruct(pos) - for name, _ in pairs(mcl_beds.pos) do - if vector.equals(pos, mcl_beds.pos) then +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) From 686b575f81f36471e6ccb6b5e845b0b9300409e7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 20 Feb 2019 20:59:01 +0100 Subject: [PATCH 0334/1107] Beds: Fix player model offset when laying down --- mods/ITEMS/mcl_beds/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 67382dfb..6824cabe 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -137,7 +137,7 @@ local function lay_down(player, pos, bed_pos, state, skip) else local yaw, param2 = get_look_yaw(bed_pos) local dir = minetest.facedir_to_dir(param2) - local p = {x = bed_pos.x + dir.x / 4, y = bed_pos.y, z = bed_pos.z + dir.z / 4} + local p = {x = bed_pos.x - dir.x/2, y = bed_pos.y, z = bed_pos.z - dir.z/2} 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_pos.x, y=bed_pos.y+2, z=bed_pos.z}) local def1 = minetest.registered_nodes[n1.name] From 99741f3d2a7b2a0a0323b55ab53d5d4033242291 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 20 Feb 2019 21:03:25 +0100 Subject: [PATCH 0335/1107] Beds: Update formspecs when player leaves/joins --- mods/ITEMS/mcl_beds/functions.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 6824cabe..018cf74f 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -349,6 +349,7 @@ minetest.register_on_joinplayer(function(player) 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) @@ -363,6 +364,7 @@ minetest.register_on_leaveplayer(function(player) end end) end + update_formspecs(false) end) minetest.register_on_player_receive_fields(function(player, formname, fields) From 00851220287becbd83186f2a2ea3b2aac76eb85a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 20 Feb 2019 21:09:04 +0100 Subject: [PATCH 0336/1107] Slightly rewrite a bed formspec string --- mods/ITEMS/mcl_beds/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 018cf74f..02f72ff5 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -210,7 +210,7 @@ local function update_formspecs(finished) end return elseif not is_sp then - local text = string.format("%d of %d player(s) are in bed.", player_in_bed, ges) + local text = string.format("Players in bed: %d/%d", player_in_bed, ges) if not night_skip then text = text .. "\n" .. "Note: Night skip is disabled." form_n = form_n .. bg_presleep From 31668cdde516a955bea9e49cfbd6a287fa11f61c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 21 Feb 2019 02:37:13 +0100 Subject: [PATCH 0337/1107] Add brown mooshroom --- mods/ENTITIES/mobs_mc/LICENSE-media.md | 5 ++++- mods/ENTITIES/mobs_mc/cow+mooshroom.lua | 9 +++++++-- .../mobs_mc/textures/mobs_mc_mooshroom_brown.png | Bin 0 -> 1048 bytes .../mobs_mc/textures/mobs_mc_mushroom_brown.png | Bin 0 -> 374 bytes mods/ENTITIES/mobs_mc_gameconfig/init.lua | 1 + mods/ENVIRONMENT/lightning/init.lua | 8 ++++++++ 6 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom_brown.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_brown.png diff --git a/mods/ENTITIES/mobs_mc/LICENSE-media.md b/mods/ENTITIES/mobs_mc/LICENSE-media.md index fe5c41e7..7cad2241 100644 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ b/mods/ENTITIES/mobs_mc/LICENSE-media.md @@ -70,6 +70,9 @@ Origin of those models: * `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 * Any other texture not mentioned here are licensed under the MIT License @@ -183,4 +186,4 @@ Origin of those models: Note: Many of these sounds have been more or less modified to fit the game. -Sounds not mentioned here are licensed under CC0. +Sounds not mentioned hre are licensed under CC0. diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua index bf1f9c1d..48a6aac7 100644 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua @@ -80,7 +80,7 @@ mobs:register_mob("mobs_mc:cow", cow_def) local mooshroom_def = table.copy(cow_def) mooshroom_def.mesh = "mobs_mc_cow.b3d" -mooshroom_def.textures = { {"mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png"}, } +mooshroom_def.textures = { {"mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png"}, {"mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } } mooshroom_def.on_rightclick = function(self, clicker) if mobs:feed_tame(self, clicker, 1, true, true) then return end if mobs:protect(self, clicker) then return end @@ -93,7 +93,12 @@ mooshroom_def.on_rightclick = function(self, clicker) if item:get_name() == mobs_mc.items.shears then local pos = self.object:get_pos() minetest.sound_play("shears", {pos = pos}) - minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, mobs_mc.items.mushroom_red .. " 5") + + 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}, mobs_mc.items.mushroom_brown .. " 5") + else + minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, mobs_mc.items.mushroom_red .. " 5") + end local oldyaw = self.object:getyaw() self.object:remove() diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom_brown.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_mooshroom_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..115416a53c8a5e525b8f245dac8f40f6f8be1f19 GIT binary patch literal 1048 zcmeAS@N?(olHy`uVBq!ia0y~yU~phyU{K&-V_;xdG`FsWfq{V~-O<;Pfnj4m_n$;o z1_lPs0*}aI1_r)EAj~ML;nl#vz#viL8c`CQpH@<#W5tq`R@_NM(i(&pCYze_Muk^5os`_25V-z{ezIdb(%Re8-8!R7k%-ZlI`yZN|y z*`gUH`)V!kcC3BCczyZx^^#z*VO&bYM-?C+tcY{bF}x=tlUxE@JGbw*2 zH+}P`E!ICSoTykd=MCq}Z%vB{KpmvtJpm8#rE5dr&RA* zx3xxbS?u(J!iC)be*H-7&goC>{kEpu=)KXNWAY5UPp{3^jh`!EXLsut7x&HJ`9d{$ z*7LUWU)jaiKcVhz>Ds5lfAy12P}Q) z^RuKy$L9S@FVIvip1^)$$9It@ojs|0j_sSrE-=qIIH&*YL(|yUZz}qK`7BM#{xhhQ zZd{Vm#xC$=$GxCfu#_@b>f2A|2S=7Q{=V~m%9(@m3tqd=d-15LqWACj`j$P4ydNyz zO^!9%{)o{gF8RCt*Ubl#Jx|_Q!TuttX~&9&t-WRVcnd*;~tlJo_{kQRO>%*Uu-DfXu|IWU@ zh}G%e@rnFw_qKf2P4v@#DW@3NS9E@P+}b+k+mahu4|}iHU|?Wi@O1TaS?83{1OTaz B0l)wN literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_brown.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_mushroom_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..fac0f56ef0c934a782294a77e9a780e77c75ca6b GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s77>k44ofy`glX=O&z`&C3 z=y_ah~ zEDEYF<7H!Dh^m-1D|X)9olI9w+Oa7(g&khkYPj_sYryiF$#xE0#z&31&+fTy#`W6o z-Vt{v28NewKB#0#mdoE`@MUKxdHC6CvaeKRz}u^JQ%)$pzb)XvgTe~DWM4fnB$Ju literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc_gameconfig/init.lua b/mods/ENTITIES/mobs_mc_gameconfig/init.lua index ff02ccfd..f24952e9 100644 --- a/mods/ENTITIES/mobs_mc_gameconfig/init.lua +++ b/mods/ENTITIES/mobs_mc_gameconfig/init.lua @@ -44,6 +44,7 @@ mobs_mc.override.items = { shears = "mcl_tools:shears", mushroom_red = "mcl_mushrooms:mushroom_red", + mushroom_brown = "mcl_mushrooms:mushroom_brown", bucket = "mcl_buckets:bucket_empty", grass_block = "mcl_core:dirt_with_grass", string = "mcl_mobitems:string", diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index dfcfe014..207c4d1a 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -189,6 +189,14 @@ lightning.strike = function(pos) obj:remove() obj = minetest.add_entity(pos2, "mobs_mc:pigman") obj:set_yaw(rot) + -- mooshroom: toggle color red/brown + elseif lua.name == "mobs_mc:mooshroom" then + if lua.base_texture[1] == "mobs_mc_mooshroom.png" then + lua.base_texture = { "mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } + else + lua.base_texture = { "mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png" } + end + obj:set_properties({textures = lua.base_texture}) -- villager → witch elseif lua.name == "mobs_mc:villager" then -- Witches are incomplete, this code is unused From 93c087997fe4140aee12c4c42232669008bce45f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 21 Feb 2019 03:36:02 +0100 Subject: [PATCH 0338/1107] Add /lightning command --- mods/ENVIRONMENT/lightning/init.lua | 30 +++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index 207c4d1a..e3792f7e 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -230,3 +230,33 @@ minetest.after(5, function(dtime) lightning.interval_high), lightning.strike) end end) + +minetest.register_chatcommand("lightning", { + params = "[ ]", + description = "Let lightning strike at the specified position or yourself", + privs = { maphack = true }, + func = function(name, param) + local pos = {} + pos.x, pos.y, pos.z = string.match(param, "^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$") + pos.x = tonumber(pos.x) + pos.y = tonumber(pos.y) + pos.z = tonumber(pos.z) + if not (pos.x and pos.y and pos.z) then + pos = nil + end + if name == "" and pos == nil then + return false, "No position specified and unknown player" + end + if pos then + lightning.strike(pos) + else + local player = minetest.get_player_by_name(name) + if player then + lightning.strike(player:get_pos()) + else + return false, "No position specified and unknown player" + end + end + return true + end, +}) From 236ef99359ee930f1c1604d006efcd9288200668 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 21 Feb 2019 18:08:30 +0100 Subject: [PATCH 0339/1107] Add hard limits to book title and book text length --- mods/ITEMS/mcl_books/init.lua | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index de96e9e3..a2627c77 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -1,3 +1,6 @@ +local max_text_length = 4500 -- TODO: Increase to 12800 when scroll bar was added to written book +local max_title_length = 64 + -- Book minetest.register_craftitem("mcl_books:book", { description = "Book", @@ -59,6 +62,10 @@ local make_description = function(title, author, generation) return desc end +local cap_text_length = function(text, max_length) + return string.sub(text, 1, max_length) +end + local write = function(itemstack, user, pointed_thing) -- Call on_rightclick if the pointed node defines it if pointed_thing.type == "node" then @@ -102,7 +109,8 @@ end minetest.register_craftitem("mcl_books:writable_book", { description = "Book and Quill", _doc_items_longdesc = "This item can be used to write down some notes.", - _doc_items_usagehelp = "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.", + _doc_items_usagehelp = "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".. + "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, @@ -115,11 +123,12 @@ minetest.register_on_player_receive_fields(function ( player, formname, fields ) 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", fields.text) + meta:set_string("text", text) player:set_wielded_item(stack) elseif fields.sign then - meta:set_string("text", fields.text) + meta:set_string("text", text) player:set_wielded_item(stack) local name = player:get_player_name() @@ -138,15 +147,17 @@ minetest.register_on_player_receive_fields(function ( player, formname, fields ) local book = player:get_wielded_item() local name = player:get_player_name() if book:get_name() == "mcl_books:writable_book" then - if fields.title == "" then - fields.title = "Nameless Book" + local title = fields.title + if string.len(title) == 0 then + title = "Nameless Book" end + title = cap_text_length(title, max_title_length) local meta = newbook:get_meta() - local text = get_text(book) - meta:set_string("title", fields.title) + 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(fields.title, name, 0)) + 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) @@ -235,7 +246,7 @@ minetest.register_craft_predict(function(itemstack, player, old_craft_grid, craf -- 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 = ometa:get_string("title") + local title = cap_text_length(ometa:get_string("title"), max_title_length) local author = ometa:get_string("author") -- Increase book generation and update description @@ -283,11 +294,11 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv -- Copy metadata local imeta = itemstack:get_meta() - local title = ometa:get_string("title") + 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", text) + imeta:set_string("text", cap_text_length(text, max_text_length)) -- Increase book generation and update description generation = generation + 1 From e614f9228a806184a5132cf998fe437daa9abcf3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 21 Feb 2019 23:08:51 +0100 Subject: [PATCH 0340/1107] Version 0.46.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 10aa7bcf..9654821f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.45.1 +Version: 0.46.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 2028ef40cb61d0e6e1fa99d50f6e803b1ed40720 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 22 Feb 2019 05:29:17 +0100 Subject: [PATCH 0341/1107] Add screwdriver --- mods/ITEMS/screwdriver/README.txt | 13 ++ mods/ITEMS/screwdriver/init.lua | 170 ++++++++++++++++++ mods/ITEMS/screwdriver/license.txt | 50 ++++++ .../screwdriver/textures/screwdriver.png | Bin 0 -> 182 bytes 4 files changed, 233 insertions(+) create mode 100644 mods/ITEMS/screwdriver/README.txt create mode 100644 mods/ITEMS/screwdriver/init.lua create mode 100644 mods/ITEMS/screwdriver/license.txt create mode 100644 mods/ITEMS/screwdriver/textures/screwdriver.png diff --git a/mods/ITEMS/screwdriver/README.txt b/mods/ITEMS/screwdriver/README.txt new file mode 100644 index 00000000..9d39c58c --- /dev/null +++ b/mods/ITEMS/screwdriver/README.txt @@ -0,0 +1,13 @@ +Minetest Game mod: screwdriver +============================== +See license.txt for license information. + +License of source code +---------------------- +Originally by RealBadAngel, Maciej Kasatkin (LGPL 2.1) +Various Minetest developers and contributors (LGPL 2.1) + +License of media (textures) +--------------------------- +Created by Gambit (CC BY-SA 3.0): + screwdriver.png diff --git a/mods/ITEMS/screwdriver/init.lua b/mods/ITEMS/screwdriver/init.lua new file mode 100644 index 00000000..4d38bbc2 --- /dev/null +++ b/mods/ITEMS/screwdriver/init.lua @@ -0,0 +1,170 @@ +screwdriver = {} + +screwdriver.ROTATE_FACE = 1 +screwdriver.ROTATE_AXIS = 2 +screwdriver.disallow = function(pos, node, user, mode, new_param2) + return false +end +screwdriver.rotate_simple = function(pos, node, user, mode, new_param2) + if mode ~= screwdriver.ROTATE_FACE then + return false + end +end + +-- For attached wallmounted nodes: returns true if rotation is valid +-- simplified version of minetest:builtin/game/falling.lua#L148. +local function check_attached_node(pos, rotation) + local d = minetest.wallmounted_to_dir(rotation) + local p2 = vector.add(pos, d) + local n = minetest.get_node(p2).name + local def2 = minetest.registered_nodes[n] + if def2 and not def2.walkable then + return false + end + return true +end + +screwdriver.rotate = {} + +local facedir_tbl = { + [screwdriver.ROTATE_FACE] = { + [0] = 1, [1] = 2, [2] = 3, [3] = 0, + [4] = 5, [5] = 6, [6] = 7, [7] = 4, + [8] = 9, [9] = 10, [10] = 11, [11] = 8, + [12] = 13, [13] = 14, [14] = 15, [15] = 12, + [16] = 17, [17] = 18, [18] = 19, [19] = 16, + [20] = 21, [21] = 22, [22] = 23, [23] = 20, + }, + [screwdriver.ROTATE_AXIS] = { + [0] = 4, [1] = 4, [2] = 4, [3] = 4, + [4] = 8, [5] = 8, [6] = 8, [7] = 8, + [8] = 12, [9] = 12, [10] = 12, [11] = 12, + [12] = 16, [13] = 16, [14] = 16, [15] = 16, + [16] = 20, [17] = 20, [18] = 20, [19] = 20, + [20] = 0, [21] = 0, [22] = 0, [23] = 0, + }, +} + +screwdriver.rotate.facedir = function(pos, node, mode) + local rotation = node.param2 % 32 -- get first 5 bits + local other = node.param2 - rotation + rotation = facedir_tbl[mode][rotation] or 0 + return rotation + other +end + +screwdriver.rotate.colorfacedir = screwdriver.rotate.facedir + +local wallmounted_tbl = { + [screwdriver.ROTATE_FACE] = {[2] = 5, [3] = 4, [4] = 2, [5] = 3, [1] = 0, [0] = 1}, + [screwdriver.ROTATE_AXIS] = {[2] = 5, [3] = 4, [4] = 2, [5] = 1, [1] = 0, [0] = 3} +} + +screwdriver.rotate.wallmounted = function(pos, node, mode) + local rotation = node.param2 % 8 -- get first 3 bits + local other = node.param2 - rotation + rotation = wallmounted_tbl[mode][rotation] or 0 + if minetest.get_item_group(node.name, "attached_node") ~= 0 then + -- find an acceptable orientation + for i = 1, 5 do + if not check_attached_node(pos, rotation) then + rotation = wallmounted_tbl[mode][rotation] or 0 + else + break + end + end + end + return rotation + other +end + +screwdriver.rotate.colorwallmounted = screwdriver.rotate.wallmounted + +-- Handles rotation +screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) + if pointed_thing.type ~= "node" then + return + end + + local pos = pointed_thing.under + local player_name = user and user:get_player_name() or "" + + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) + return + end + + local node = minetest.get_node(pos) + local ndef = minetest.registered_nodes[node.name] + if not ndef then + return itemstack + end + -- can we rotate this paramtype2? + local fn = screwdriver.rotate[ndef.paramtype2] + if not fn and not ndef.on_rotate then + return itemstack + end + + local should_rotate = true + local new_param2 + if fn then + new_param2 = fn(pos, node, mode) + else + new_param2 = node.param2 + end + + -- Node provides a handler, so let the handler decide instead if the node can be rotated + if ndef.on_rotate then + -- Copy pos and node because callback can modify it + local result = ndef.on_rotate(vector.new(pos), + {name = node.name, param1 = node.param1, param2 = node.param2}, + user, mode, new_param2) + if result == false then -- Disallow rotation + return itemstack + elseif result == true then + should_rotate = false + end + elseif ndef.on_rotate == false then + return itemstack + elseif ndef.can_dig and not ndef.can_dig(pos, user) then + return itemstack + end + + if should_rotate and new_param2 ~= node.param2 then + node.param2 = new_param2 + minetest.swap_node(pos, node) + minetest.check_for_falling(pos) + end + + if not (minetest.settings:get_bool("creative_mode")) then + itemstack:add_wear(65535 / ((uses or 200) - 1)) + end + + return itemstack +end + +-- Screwdriver +minetest.register_tool("screwdriver:screwdriver", { + description = "Screwdriver", + inventory_image = "screwdriver.png", + on_use = function(itemstack, user, pointed_thing) + screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_FACE, 200) + return itemstack + end, + on_place = function(itemstack, user, pointed_thing) + screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_AXIS, 200) + return itemstack + end, +}) + + +minetest.register_craft({ + output = "screwdriver:screwdriver", + recipe = { + {"mcl_core:iron_ingot"}, + {"mcl_core:stick"} + } +}) + +minetest.register_alias("screwdriver:screwdriver1", "screwdriver:screwdriver") +minetest.register_alias("screwdriver:screwdriver2", "screwdriver:screwdriver") +minetest.register_alias("screwdriver:screwdriver3", "screwdriver:screwdriver") +minetest.register_alias("screwdriver:screwdriver4", "screwdriver:screwdriver") diff --git a/mods/ITEMS/screwdriver/license.txt b/mods/ITEMS/screwdriver/license.txt new file mode 100644 index 00000000..d9b721bb --- /dev/null +++ b/mods/ITEMS/screwdriver/license.txt @@ -0,0 +1,50 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2013-2016 RealBadAngel, Maciej Kasatkin +Copyright (C) 2013-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 (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2013-2016 Gambit + +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/screwdriver/textures/screwdriver.png b/mods/ITEMS/screwdriver/textures/screwdriver.png new file mode 100644 index 0000000000000000000000000000000000000000..b2a56d558b34392a3275da443c0ba32a3b4db340 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdq5|d_r7(G7EiF`7$#yc628s z7z)39`EqWWSx=l*xtH3CQum7&FUG~i<>uyAR#xuYw{K^Hk@fK_H)R%)Y32O5POM=Q-*yMdNzVclr=>h< gNl@c3I>5*vUczopr0RG23A^-pY literal 0 HcmV?d00001 From 6e8be2a2c386b79b984927217e120fc50fcf4dae Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 22 Feb 2019 06:08:48 +0100 Subject: [PATCH 0342/1107] Fix vine not dropping all vines when dug w/ shears --- mods/ITEMS/mcl_core/nodes_climb.lua | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index 52818695..25f8cdb5 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -141,13 +141,14 @@ minetest.register_node("mcl_core:vine", { return itemstack end, - -- If destroyed, also a “dependant” vine below it. + -- If dug, also dig a “dependant” vine below it. -- A vine is dependant if it hangs from this node and has no supporting block. - after_destruct = function(pos, oldnode) + on_dig = function(pos, node, digger) local below = {x=pos.x, y=pos.y-1, z=pos.z} local belownode = minetest.get_node(below) - if belownode.name == oldnode.name and (not mcl_core.check_vines_supported(below, belownode)) then - minetest.remove_node(below) + minetest.node_dig(pos, node, digger) + if belownode.name == node.name and (not mcl_core.check_vines_supported(below, belownode)) then + minetest.registered_nodes[node.name].on_dig(below, node, digger) end end, From 1556e6cb3e046a28ac3f29cf54418cf4e6943042 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 22 Feb 2019 06:13:31 +0100 Subject: [PATCH 0343/1107] Ice: Use after_dig_node instead of after_destruct --- mods/ITEMS/mcl_core/nodes_base.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index 237eff39..81395010 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -786,7 +786,7 @@ minetest.register_node("mcl_core:ice", { groups = {handy=1,pickaxey=1, slippery=3, building_block=1}, drop = "", sounds = mcl_sounds.node_sound_glass_defaults(), - after_destruct = function(pos, oldnode) + after_dig_node = function(pos, oldnode) -- Create a water source if ice is destroyed and there was something below it local below = {x=pos.x, y=pos.y-1, z=pos.z} local belownode = minetest.get_node(below) From 1044e9690954ac5c45b0878303d8d0eb639e6f4e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 25 Feb 2019 17:46:13 +0100 Subject: [PATCH 0344/1107] Add tool groups (pickaxe, shovel, ...) --- GROUPS.md | 7 +++++++ mods/ITEMS/mcl_farming/hoes.lua | 10 +++++----- mods/ITEMS/mcl_tools/init.lua | 32 ++++++++++++++++---------------- 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/GROUPS.md b/GROUPS.md index 57c90eb4..70f61247 100644 --- a/GROUPS.md +++ b/GROUPS.md @@ -166,6 +166,13 @@ These groups are used mostly for informational purposes * `plant=1`: Plant or part of a plant * `double_plant`: Part of a double-sized plant. 1 = lower part, 2 = upper part +* `pickaxe=1`: Pickaxe +* `shovel=1`: Shovel +* `axe=1`: Axe +* `sword=1`: Sword +* `hoe=1`: Hoe (farming tool) +* `shears=1`: Shears + * `weapon=1`: Item is primarily (!) a weapon * `tool=1`: Item is primarily (!) a tool * `craftitem=1`: Item is primarily (!) used for crafting diff --git a/mods/ITEMS/mcl_farming/hoes.lua b/mods/ITEMS/mcl_farming/hoes.lua index bc048f57..1d8e9411 100644 --- a/mods/ITEMS/mcl_farming/hoes.lua +++ b/mods/ITEMS/mcl_farming/hoes.lua @@ -48,7 +48,7 @@ minetest.register_tool("mcl_farming:hoe_wood", { return itemstack end end, - groups = { tool=1 }, + groups = { tool=1, hoe=1 }, tool_capabilities = { full_punch_interval = 1, damage_groups = { fleshy = 1, } @@ -99,7 +99,7 @@ minetest.register_tool("mcl_farming:hoe_stone", { return itemstack end end, - groups = { tool=1 }, + groups = { tool=1, hoe=1 }, tool_capabilities = { full_punch_interval = 0.5, damage_groups = { fleshy = 1, } @@ -145,7 +145,7 @@ minetest.register_tool("mcl_farming:hoe_iron", { return itemstack end end, - groups = { tool=1 }, + groups = { tool=1, hoe=1 }, tool_capabilities = { -- 1/3 full_punch_interval = 0.33333333, @@ -199,7 +199,7 @@ minetest.register_tool("mcl_farming:hoe_gold", { return itemstack end end, - groups = { tool=1 }, + groups = { tool=1, hoe=1 }, tool_capabilities = { full_punch_interval = 1, damage_groups = { fleshy = 1, } @@ -254,7 +254,7 @@ minetest.register_tool("mcl_farming:hoe_diamond", { return itemstack end end, - groups = { tool=1 }, + groups = { tool=1, hoe=1 }, tool_capabilities = { full_punch_interval = 0.25, damage_groups = { fleshy = 1, } diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index c60aafe1..b5f8b303 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -64,7 +64,7 @@ minetest.register_tool("mcl_tools:pick_wood", { _doc_items_longdesc = pickaxe_longdesc, _doc_items_hidden = false, inventory_image = "default_tool_woodpick.png", - groups = { tool=1 }, + groups = { tool=1, pickaxe=1 }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -81,7 +81,7 @@ minetest.register_tool("mcl_tools:pick_stone", { description = "Stone Pickaxe", _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_stonepick.png", - groups = { tool=1 }, + groups = { tool=1, pickaxe=1 }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -98,7 +98,7 @@ minetest.register_tool("mcl_tools:pick_iron", { description = "Iron Pickaxe", _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_steelpick.png", - groups = { tool=1 }, + groups = { tool=1, pickaxe=1 }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -115,7 +115,7 @@ minetest.register_tool("mcl_tools:pick_gold", { description = "Golden Pickaxe", _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_goldpick.png", - groups = { tool=1 }, + groups = { tool=1, pickaxe=1 }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -132,7 +132,7 @@ minetest.register_tool("mcl_tools:pick_diamond", { description = "Diamond Pickaxe", _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_diamondpick.png", - groups = { tool=1 }, + groups = { tool=1, pickaxe=1 }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -244,7 +244,7 @@ minetest.register_tool("mcl_tools:shovel_wood", { _doc_items_hidden = false, inventory_image = "default_tool_woodshovel.png", wield_image = "default_tool_woodshovel.png^[transformR90", - groups = { tool=1 }, + groups = { tool=1, shovel=1 }, tool_capabilities = { full_punch_interval = 1, max_drop_level=1, @@ -263,7 +263,7 @@ minetest.register_tool("mcl_tools:shovel_stone", { _doc_items_usagehelp = shovel_use, inventory_image = "default_tool_stoneshovel.png", wield_image = "default_tool_stoneshovel.png^[transformR90", - groups = { tool=1 }, + groups = { tool=1, shovel=1 }, tool_capabilities = { full_punch_interval = 1, max_drop_level=3, @@ -282,7 +282,7 @@ minetest.register_tool("mcl_tools:shovel_iron", { _doc_items_usagehelp = shovel_use, inventory_image = "default_tool_steelshovel.png", wield_image = "default_tool_steelshovel.png^[transformR90", - groups = { tool=1 }, + groups = { tool=1, shovel=1 }, tool_capabilities = { full_punch_interval = 1, max_drop_level=4, @@ -301,7 +301,7 @@ minetest.register_tool("mcl_tools:shovel_gold", { _doc_items_usagehelp = shovel_use, inventory_image = "default_tool_goldshovel.png", wield_image = "default_tool_goldshovel.png^[transformR90", - groups = { tool=1 }, + groups = { tool=1, shovel=1 }, tool_capabilities = { full_punch_interval = 1, max_drop_level=2, @@ -320,7 +320,7 @@ minetest.register_tool("mcl_tools:shovel_diamond", { _doc_items_usagehelp = shovel_use, inventory_image = "default_tool_diamondshovel.png", wield_image = "default_tool_diamondshovel.png^[transformR90", - groups = { tool=1 }, + groups = { tool=1, shovel=1 }, tool_capabilities = { full_punch_interval = 1, max_drop_level=5, @@ -340,7 +340,7 @@ minetest.register_tool("mcl_tools:axe_wood", { _doc_items_longdesc = axe_longdesc, _doc_items_hidden = false, inventory_image = "default_tool_woodaxe.png", - groups = { tool=1 }, + groups = { tool=1, axe=1 }, tool_capabilities = { full_punch_interval = 1.25, max_drop_level=1, @@ -356,7 +356,7 @@ minetest.register_tool("mcl_tools:axe_stone", { description = "Stone Axe", _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_stoneaxe.png", - groups = { tool=1 }, + groups = { tool=1, axe=1 }, tool_capabilities = { full_punch_interval = 1.25, max_drop_level=3, @@ -372,7 +372,7 @@ minetest.register_tool("mcl_tools:axe_iron", { description = "Iron Axe", _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_steelaxe.png", - groups = { tool=1 }, + groups = { tool=1, axe=1 }, tool_capabilities = { -- 1/0.9 full_punch_interval = 1.11111111, @@ -389,7 +389,7 @@ minetest.register_tool("mcl_tools:axe_gold", { description = "Golden Axe", _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_goldaxe.png", - groups = { tool=1 }, + groups = { tool=1, axe=1 }, tool_capabilities = { full_punch_interval = 1.0, max_drop_level=2, @@ -405,7 +405,7 @@ minetest.register_tool("mcl_tools:axe_diamond", { description = "Diamond Axe", _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_diamondaxe.png", - groups = { tool=1 }, + groups = { tool=1, axe=1 }, tool_capabilities = { full_punch_interval = 1.0, max_drop_level=5, @@ -514,7 +514,7 @@ minetest.register_tool("mcl_tools:shears", { inventory_image = "default_tool_shears.png", wield_image = "default_tool_shears.png", stack_max = 1, - groups = { tool=1 }, + groups = { tool=1, shears=1 }, tool_capabilities = { full_punch_interval = 0.5, max_drop_level=1, From 6497916adec46519df18230acaca52b196980ed0 Mon Sep 17 00:00:00 2001 From: nickolas360 Date: Thu, 28 Feb 2019 15:35:18 +0100 Subject: [PATCH 0345/1107] Fix spawning at bed when chunk is unloaded --- mods/PLAYER/mcl_spawn/init.lua | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/mods/PLAYER/mcl_spawn/init.lua b/mods/PLAYER/mcl_spawn/init.lua index 5c8a797e..bf8c1344 100644 --- a/mods/PLAYER/mcl_spawn/init.lua +++ b/mods/PLAYER/mcl_spawn/init.lua @@ -60,15 +60,24 @@ mcl_spawn.set_spawn_pos = function(player, pos, message) return spawn_changed end +local function get_far_node(pos) + local node = minetest.get_node(pos) + if node.name ~= "ignore" then + return node + end + minetest.get_voxel_manip():read_from_map(pos, pos) + return minetest.get_node(pos) +end + -- Respawn player at specified respawn position minetest.register_on_respawnplayer(function(player) local pos, custom_spawn = mcl_spawn.get_spawn_pos(player) if pos and custom_spawn then -- Check if bed is still there -- and the spawning position is free of solid or damaging blocks. - local node_bed = minetest.get_node(pos) - local node_up1 = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) - local node_up2 = minetest.get_node({x=pos.x,y=pos.y+2,z=pos.z}) + local node_bed = get_far_node(pos) + local node_up1 = get_far_node({x=pos.x,y=pos.y+1,z=pos.z}) + local node_up2 = get_far_node({x=pos.x,y=pos.y+2,z=pos.z}) local bgroup = minetest.get_item_group(node_bed.name, "bed") local def1 = minetest.registered_nodes[node_up1.name] local def2 = minetest.registered_nodes[node_up2.name] From 7851cee45e639294b5dc35beb731b28a0310d3a7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 28 Feb 2019 16:43:52 +0100 Subject: [PATCH 0346/1107] Fix exhauston for attacking and taking dmg --- mods/ENTITIES/mcl_falling_nodes/init.lua | 4 ---- mods/ENTITIES/mcl_mobs/api.lua | 8 +++++++- mods/ENTITIES/mcl_mobs/depends.txt | 1 + mods/ITEMS/mcl_bows/arrow.lua | 4 ---- mods/ITEMS/mcl_bows/depends.txt | 1 - mods/ITEMS/mcl_tnt/depends.txt | 1 - mods/ITEMS/mcl_tnt/init.lua | 4 ---- mods/PLAYER/mcl_hunger/init.lua | 13 ++++++++++--- mods/PLAYER/mcl_playerplus/init.lua | 1 - 9 files changed, 18 insertions(+), 19 deletions(-) diff --git a/mods/ENTITIES/mcl_falling_nodes/init.lua b/mods/ENTITIES/mcl_falling_nodes/init.lua index 92cca703..5f54f58d 100644 --- a/mods/ENTITIES/mcl_falling_nodes/init.lua +++ b/mods/ENTITIES/mcl_falling_nodes/init.lua @@ -1,5 +1,4 @@ local dmes = minetest.get_modpath("mcl_death_messages") ~= nil -local hung = minetest.get_modpath("mcl_hunger") ~= nil local get_falling_depth = function(self) if not self._startpos then @@ -56,9 +55,6 @@ local deal_falling_damage = function(self, dtime) if dmes then mcl_death_messages.player_damage(v, string.format(msg, v:get_player_name())) end - if hung then - mcl_hunger.exhaust(v:get_player_name(), mcl_hunger.EXHAUST_DAMAGE) - end end v:set_hp(hp) end diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 30b8a582..337deeb0 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -96,6 +96,7 @@ mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "mcl_core:dir local mod_weather = minetest.get_modpath("mcl_weather") ~= nil local mod_tnt = minetest.get_modpath("mcl_tnt") ~= nil local mod_mobspawners = minetest.get_modpath("mcl_mobspawners") ~= nil +local mod_hunger = minetest.get_modpath("mcl_hunger") ~= nil -- play sound local mob_sound = function(self, sound, is_opinion) @@ -2342,10 +2343,15 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) end - -- weapon wear + -- punch interval local weapon = hitter:get_wielded_item() local punch_interval = 1.4 + -- exhaust attacker + if mod_hunger and hitter: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 {} diff --git a/mods/ENTITIES/mcl_mobs/depends.txt b/mods/ENTITIES/mcl_mobs/depends.txt index a1d9c9aa..eb3eb2aa 100644 --- a/mods/ENTITIES/mcl_mobs/depends.txt +++ b/mods/ENTITIES/mcl_mobs/depends.txt @@ -1,6 +1,7 @@ mcl_core mcl_weather? mcl_tnt? +mcl_hunger? invisibility? intllib? lucky_block? diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 52a857a0..a3c8fb4a 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -7,7 +7,6 @@ local GRAVITY = 9.81 local YAW_OFFSET = -math.pi/2 -local mod_mcl_hunger = minetest.get_modpath("mcl_hunger") local mod_awards = minetest.get_modpath("awards") and minetest.get_modpath("mcl_achievements") local mod_button = minetest.get_modpath("mesecons_button") @@ -193,9 +192,6 @@ ARROW_ENTITY.on_step = function(self, dtime) -- “Ding” sound for hitting another player minetest.sound_play({name="mcl_bows_hit_player", gain=0.1}, {to_player=self._shooter}) end - if mod_mcl_hunger then - mcl_hunger.exhaust(obj:get_player_name(), mcl_hunger.EXHAUST_DAMAGE) - end end if lua then diff --git a/mods/ITEMS/mcl_bows/depends.txt b/mods/ITEMS/mcl_bows/depends.txt index 736cd117..08132ddb 100644 --- a/mods/ITEMS/mcl_bows/depends.txt +++ b/mods/ITEMS/mcl_bows/depends.txt @@ -1,7 +1,6 @@ controls awards? mcl_achievements? -mcl_hunger? mcl_core? mcl_mobitems? playerphysics? diff --git a/mods/ITEMS/mcl_tnt/depends.txt b/mods/ITEMS/mcl_tnt/depends.txt index 0f49dddd..f02d2b05 100644 --- a/mods/ITEMS/mcl_tnt/depends.txt +++ b/mods/ITEMS/mcl_tnt/depends.txt @@ -1,5 +1,4 @@ mcl_sounds? mcl_mobitems? -mcl_hunger? mcl_death_messages? doc_identifier? diff --git a/mods/ITEMS/mcl_tnt/init.lua b/mods/ITEMS/mcl_tnt/init.lua index dd6ebc66..fbe82c1c 100644 --- a/mods/ITEMS/mcl_tnt/init.lua +++ b/mods/ITEMS/mcl_tnt/init.lua @@ -1,5 +1,4 @@ local mod_death_messages = minetest.get_modpath("mcl_death_messages") -local mod_hunger = minetest.get_modpath("mcl_hunger") local function spawn_tnt(pos, entname) minetest.sound_play("tnt_ignite", {pos = pos,gain = 1.0,max_hear_distance = 15,}) @@ -33,9 +32,6 @@ local function do_tnt_physics(tnt_np,tntr) if mod_death_messages then mcl_death_messages.player_damage(obj, string.format("%s was caught in an explosion.", obj:get_player_name())) end - if mod_hunger then - mcl_hunger.exhaust(obj:get_player_name(), mcl_hunger.EXHAUST_DAMAGE) - end end obj:set_hp(obj:get_hp() - damage) end diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index f71dc121..5df787e7 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -29,7 +29,7 @@ mcl_hunger.EXHAUST_SPRINT_JUMP = 200 -- jump while sprinting mcl_hunger.EXHAUST_ATTACK = 100 -- hit an enemy mcl_hunger.EXHAUST_SWIM = 10 -- player movement in water mcl_hunger.EXHAUST_SPRINT = 100 -- sprint (per node) -mcl_hunger.EXHAUST_DAMAGE = 100 -- TODO (mostly done): taking damage (protected by armor) +mcl_hunger.EXHAUST_DAMAGE = 100 -- taking damage (protected by armor) mcl_hunger.EXHAUST_REGEN = 6000 -- Regenerate 1 HP mcl_hunger.EXHAUST_LVL = 4000 -- at what exhaustion player saturation gets lowered @@ -134,12 +134,19 @@ end) -- PvP combat exhaustion minetest.register_on_punchplayer(function(victim, puncher, time_from_last_punch, tool_capabilities, dir, damage) - if victim:is_player() and puncher:is_player() then - mcl_hunger.exhaust(victim:get_player_name(), mcl_hunger.EXHAUST_DAMAGE) + if puncher:is_player() then mcl_hunger.exhaust(puncher:get_player_name(), mcl_hunger.EXHAUST_ATTACK) end end) +-- Exhaust on taking damage +minetest.register_on_player_hpchange(function(player, hp_change) + if hp_change < 0 then + local name = player:get_player_name() + mcl_hunger.exhaust(name, mcl_hunger.EXHAUST_DAMAGE) + end +end) + local main_timer = 0 local timer = 0 -- Half second timer local timerMult = 1 -- Cycles from 0 to 7, each time when timer hits half a second diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index f9022a3b..17074ea9 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -135,7 +135,6 @@ minetest.register_globalstep(function(dtime) if dist < 1.1 or dist_feet < 1.1 then if player:get_hp() > 0 then mcl_death_messages.player_damage(player, string.format("%s was prickled by a cactus.", name)) - mcl_hunger.exhaust(name, mcl_hunger.EXHAUST_DAMAGE) player:set_hp(player:get_hp() - 1) end end From 1daf9b7a590c905f932eef020924152178278015 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 28 Feb 2019 18:00:17 +0100 Subject: [PATCH 0347/1107] Put treasure loot into random inventory slots --- mods/CORE/mcl_loot/init.lua | 54 ++++++++++++++++++++++++++ mods/MAPGEN/mcl_dungeons/init.lua | 4 +- mods/MAPGEN/mcl_structures/init.lua | 8 +--- mods/MAPGEN/tsm_railcorridors/init.lua | 4 +- 4 files changed, 58 insertions(+), 12 deletions(-) diff --git a/mods/CORE/mcl_loot/init.lua b/mods/CORE/mcl_loot/init.lua index f7eff3f6..3b52e365 100644 --- a/mods/CORE/mcl_loot/init.lua +++ b/mods/CORE/mcl_loot/init.lua @@ -98,3 +98,57 @@ function mcl_loot.get_multi_loot(multi_loot_definitions, pr) end return items end + +--[[ +Returns a table of length `max_slot` and all natural numbers between 1 and `max_slot` +in a random order. +]] +local function get_random_slots(max_slot) + local slots = {} + for s=1, max_slot do + slots[s] = s + end + local slots_out = {} + while #slots > 0 do + local r = math.random(1, #slots) + table.insert(slots_out, slots[r]) + table.remove(slots, r) + end + for s=1, #slots_out do + print(slots_out[s]) + end + return slots_out +end + +--[[ +Puts items in an inventory list into random slots. +* inv: InvRef +* listname: Inventory list name +* items: table of items to add + +Items will be added from start of the table to end. +If the inventory already has occupied slots, or is +too small, placement of some items might fail. +]] +function mcl_loot.fill_inventory(inv, listname, items) + local size = inv:get_size(listname) + local slots = get_random_slots(size) + local leftovers = {} + -- 1st pass: Add items into random slots + for i=1, math.min(#items, size) do + local item = items[i] + local slot = slots[i] + local old_item = inv:get_stack(listname, slot) + local leftover = old_item:add_item(item) + inv:set_stack(listname, slot, old_item) + if not leftover:is_empty() then + table.insert(leftovers, item) + end + end + -- 2nd pass: If some items couldn't be added in first pass, + -- try again in a non-random fashion + for l=1, math.min(#leftovers, size) do + inv:add_item(listname, leftovers[l]) + end + -- If there are still items left, tough luck! +end diff --git a/mods/MAPGEN/mcl_dungeons/init.lua b/mods/MAPGEN/mcl_dungeons/init.lua index f23c33bf..dc19a6e1 100644 --- a/mods/MAPGEN/mcl_dungeons/init.lua +++ b/mods/MAPGEN/mcl_dungeons/init.lua @@ -366,9 +366,7 @@ minetest.register_on_generated(function(minp, maxp) local meta = minetest.get_meta(cpos) local inv = meta:get_inventory() local items = get_loot() - for i=1, math.min(#items, inv:get_size("main")) do - inv:set_stack("main", i, ItemStack(items[i])) - end + mcl_loot.fill_inventory(inv, "main", items) end -- Mob spawners are placed seperately, too diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index 552691bf..e98dedda 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -188,9 +188,7 @@ mcl_structures.generate_igloo_basement = function(pos, orientation) local meta = minetest.get_meta(chest_pos) local inv = meta:get_inventory() inv:set_size("main", 9*3) - for i=1, #lootitems do - inv:add_item("main", lootitems[i]) - end + mcl_loot.fill_inventory(inv, "main", lootitems) end return success end @@ -401,9 +399,7 @@ mcl_structures.generate_desert_temple = function(pos) local meta = minetest.get_meta(chests[c]) local inv = meta:get_inventory() inv:set_size("main", 9*3) - for i=1, #lootitems do - inv:add_item("main", lootitems[i]) - end + mcl_loot.fill_inventory(inv, "main", lootitems) end -- Initialize pressure plates and randomly remove up to 5 plates diff --git a/mods/MAPGEN/tsm_railcorridors/init.lua b/mods/MAPGEN/tsm_railcorridors/init.lua index d6de8198..6812125e 100644 --- a/mods/MAPGEN/tsm_railcorridors/init.lua +++ b/mods/MAPGEN/tsm_railcorridors/init.lua @@ -377,9 +377,7 @@ local function PlaceChest(pos, param2) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local items = tsm_railcorridors.get_treasures(pr) - for i=1, math.min(#items, inv:get_size("main")) do - inv:set_stack("main", i, ItemStack(items[i])) - end + mcl_loot.fill_inventory(inv, "main", items) end end From 19b1cf5986916d4e2c75a9acd88f1a2ba3cfd322 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 28 Feb 2019 18:19:57 +0100 Subject: [PATCH 0348/1107] More robust initialization of chests of structs --- mods/MAPGEN/mcl_structures/init.lua | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index e98dedda..fa233682 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -15,6 +15,18 @@ mcl_structures.get_struct = function(file) return allnode end +-- Call on_construct on pos. +-- Useful to init chests from formspec. +local init_node_construct = function(pos) + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + if def and def.on_construct then + def.on_construct(pos) + return true + end + return false +end + -- The call of Struct mcl_structures.call_struct = function(pos, struct_style, rotation) if not rotation then @@ -185,9 +197,9 @@ mcl_structures.generate_igloo_basement = function(pos, orientation) }}, pr) local chest_pos = vector.add(pos, chest_offset) + init_node_construct(chest_pos) local meta = minetest.get_meta(chest_pos) local inv = meta:get_inventory() - inv:set_size("main", 9*3) mcl_loot.fill_inventory(inv, "main", lootitems) end return success @@ -396,9 +408,10 @@ mcl_structures.generate_desert_temple = function(pos) } }}, pr) + local meta = minetest.get_meta(chests[c]) + init_node_construct(chests[c]) local meta = minetest.get_meta(chests[c]) local inv = meta:get_inventory() - inv:set_size("main", 9*3) mcl_loot.fill_inventory(inv, "main", lootitems) end From a711c7bdb7b8ac006d5d71b5a64f753a132745fb Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Mar 2019 17:30:21 +0100 Subject: [PATCH 0349/1107] handle_node_drops no longer destroys metadata --- mods/ENTITIES/mcl_item_entity/init.lua | 10 +++++----- mods/HUD/mcl_inventory/creative.lua | 3 +-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index d1c502fc..4b10cdac 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -245,16 +245,16 @@ function minetest.handle_node_drops(pos, drops, digger) end for _,item in ipairs(drops) do - local count, name + local count if type(item) == "string" then - count = 1 - name = item + count = ItemStack(item):get_count() else count = item:get_count() - name = item:get_name() end + local drop_item = ItemStack(item) + drop_item:set_count(1) for i=1,count do - local obj = core.add_item(pos, name) + local obj = core.add_item(pos, drop_item) if obj ~= nil then local x = math.random(1, 5) if math.random(1,2) == 1 then diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 7125dcb6..dd5d0bd8 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -555,8 +555,7 @@ if minetest.settings:get_bool("creative_mode") then local inv = digger:get_inventory() if inv then for _,item in ipairs(drops) do - item = ItemStack(item):get_name() - if not inv:contains_item("main", item) then + if not inv:contains_item("main", item, true) then inv:add_item("main", item) end end From c6111039ab18f17537d037594fd1f5f62860a491 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Mar 2019 17:31:31 +0100 Subject: [PATCH 0350/1107] Fix annoying drops when digging banner in creative --- mods/ITEMS/mcl_banners/init.lua | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index 5bab2ed7..541a69c9 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -47,6 +47,25 @@ local layer_ratio = 255 local standing_banner_entity_offset = { x=0, y=-0.499, z=0 } local hanging_banner_entity_offset = { x=0, y=-1.7, z=0 } +local on_dig_banner = function(pos, node, digger) + -- Check protection + local name = digger:get_player_name() + if minetest.is_protected(pos, name) then + minetest.register_protection_violation(pos, name) + return + end + -- Drop item + local meta = minetest.get_meta(pos) + local item = meta:get_inventory():get_stack("banner", 1) + if not item:is_empty() then + minetest.handle_node_drops(pos, {item:to_string()}, digger) + else + minetest.handle_node_drops(pos, {"mcl_bannes:banner_item_white"}, digger) + end + -- Remove node + minetest.remove_node(pos) +end + local on_destruct_banner = function(pos, hanging) local offset, nodename if hanging then @@ -56,7 +75,7 @@ local on_destruct_banner = function(pos, hanging) offset = standing_banner_entity_offset nodename = "mcl_banners:standing_banner" end - -- Find this node's banner entity and make it drop as an item + -- Find this node's banner entity and remove it local checkpos = vector.add(pos, offset) local objects = minetest.get_objects_inside_radius(checkpos, 0.5) for _, v in ipairs(objects) do @@ -65,14 +84,6 @@ local on_destruct_banner = function(pos, hanging) v:remove() end end - -- Drop item - local meta = minetest.get_meta(pos) - local item = meta:get_inventory():get_stack("banner", 1) - if not item:is_empty() then - minetest.add_item(pos, item) - else - minetest.add_item(pos, "mcl_banners:banner_item_white") - end end local on_destruct_standing_banner = function(pos) @@ -207,6 +218,7 @@ minetest.register_node("mcl_banners:standing_banner", { sounds = node_sounds, drop = "", -- Item drops are handled in entity code + on_dig = on_dig_banner, on_destruct = on_destruct_standing_banner, on_punch = function(pos, node) respawn_banner_entity(pos, node) @@ -238,6 +250,7 @@ minetest.register_node("mcl_banners:hanging_banner", { sounds = node_sounds, drop = "", -- Item drops are handled in entity code + on_dig = on_dig_banner, on_destruct = on_destruct_hanging_banner, on_punch = function(pos, node) respawn_banner_entity(pos, node) From dca095171c573bd8b4ecae91b09fd32f3310a610 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Mar 2019 17:48:00 +0100 Subject: [PATCH 0351/1107] Restrict banner layers to 3 if has a gradient --- mods/ITEMS/mcl_banners/init.lua | 3 ++- mods/ITEMS/mcl_banners/patterncraft.lua | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index 541a69c9..49af2de6 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -193,7 +193,8 @@ minetest.register_node("mcl_banners:standing_banner", { _doc_items_entry_name = "Banner", _doc_items_image = "mcl_banners_item_base.png^mcl_banners_item_overlay.png", _doc_items_longdesc = "Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.", - _doc_items_usagehelp = "Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 6 layers on a banner that way. You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.", + _doc_items_usagehelp = [[Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 6 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible. +You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.]], walkable = false, is_ground_content = false, paramtype = "light", diff --git a/mods/ITEMS/mcl_banners/patterncraft.lua b/mods/ITEMS/mcl_banners/patterncraft.lua index 8d202c78..2858b3d2 100644 --- a/mods/ITEMS/mcl_banners/patterncraft.lua +++ b/mods/ITEMS/mcl_banners/patterncraft.lua @@ -5,6 +5,9 @@ -- Maximum number of layers which can be put on a banner by crafting. local max_layers_crafting = 6 +-- Maximum number of layers when banner includes a gradient (workaround, see below). +local max_layers_gradient = 3 + -- Max. number lines in the descriptions for the banner layers. -- This is done to avoid huge tooltips. local max_layer_lines = 6 @@ -386,6 +389,16 @@ local banner_pattern_craft = function(itemstack, player, old_craft_grid, craft_i if #layers >= max_layers_crafting then return ItemStack("") end + -- Lower layer limit when banner includes any gradient. + -- Workaround to circumvent bug #340 (gradients are likely to cause transparent pixels). + -- FIXME: Remove this restriction when bug #340 is fixed. + if #layers >= max_layers_gradient then + for l=1, #layers do + if layers[l].pattern == "gradient" or layers[l].pattern == "gradient_up" then + return ItemStack("") + end + end + end local matching_pattern local max_i = player:get_inventory():get_size("craft") From ab919713985fddf90e502bdec4f958cdb3606417 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Mar 2019 17:53:21 +0100 Subject: [PATCH 0352/1107] Increase pattern layer limit to 12 --- mods/ITEMS/mcl_banners/init.lua | 2 +- mods/ITEMS/mcl_banners/patterncraft.lua | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index 49af2de6..bfe7832a 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -193,7 +193,7 @@ minetest.register_node("mcl_banners:standing_banner", { _doc_items_entry_name = "Banner", _doc_items_image = "mcl_banners_item_base.png^mcl_banners_item_overlay.png", _doc_items_longdesc = "Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.", - _doc_items_usagehelp = [[Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 6 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible. + _doc_items_usagehelp = [[Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible. You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.]], walkable = false, is_ground_content = false, diff --git a/mods/ITEMS/mcl_banners/patterncraft.lua b/mods/ITEMS/mcl_banners/patterncraft.lua index 2858b3d2..4639b7a9 100644 --- a/mods/ITEMS/mcl_banners/patterncraft.lua +++ b/mods/ITEMS/mcl_banners/patterncraft.lua @@ -1,9 +1,9 @@ -- Pattern crafting. This file contains the code for crafting all the -- emblazonings you can put on the banners. It's quite complicated; --- normal 08/15 crafting won't work here. +-- run-of-the-mill crafting won't work here. -- Maximum number of layers which can be put on a banner by crafting. -local max_layers_crafting = 6 +local max_layers_crafting = 12 -- Maximum number of layers when banner includes a gradient (workaround, see below). local max_layers_gradient = 3 From 03c6beb9718bceb7be1cebb58293c251f72faaf2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Mar 2019 18:01:29 +0100 Subject: [PATCH 0353/1107] Remove mcl_imitation_mode --- .../mcl_core_jungle_bush_jungle_leaves.mts | Bin 129 -> 0 bytes mods/MAPGEN/mcl_biomes/init.lua | 8 +------- settingtypes.txt | 14 -------------- 3 files changed, 1 insertion(+), 21 deletions(-) delete mode 100644 mods/ITEMS/mcl_core/schematics/mcl_core_jungle_bush_jungle_leaves.mts diff --git a/mods/ITEMS/mcl_core/schematics/mcl_core_jungle_bush_jungle_leaves.mts b/mods/ITEMS/mcl_core/schematics/mcl_core_jungle_bush_jungle_leaves.mts deleted file mode 100644 index d2df30e888e54a2658c9c97456acb35442e8eaa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129 zcmeYb3HD`RVPFN}dgl6i24)84#LOZF(cI*m_~iVeRI9Agy!4#ZoYcg!)M5r z)YOVO$q5IzBo0mxNN929;Afk0AwogaC!q9)&#_dw%y+BTuRpHDBE-_&-1%Q&<9`Rk TkfSGFeVFNP&A_l Date: Fri, 1 Mar 2019 18:08:28 +0100 Subject: [PATCH 0354/1107] Add experimental setting: fallen logs --- mods/MAPGEN/mcl_biomes/init.lua | 3 +-- settingtypes.txt | 4 ++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index a046c174..26efcee6 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1,10 +1,9 @@ local mg_name = minetest.get_mapgen_setting("mg_name") -- Some mapgen settings -local imitate = minetest.settings:get("mcl_imitation_mode") local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superflat_classic") == "true" -local generate_fallen_logs = false +local generate_fallen_logs = minetest.settings:get_bool("mcl_generate_fallen_logs") or false -- Jungle bush schematic. In PC/Java Edition it's Jungle Wood + Oak Leaves local jungle_bush_schematic = minetest.get_modpath("mcl_core").."/schematics/mcl_core_jungle_bush_oak_leaves.mts" diff --git a/settingtypes.txt b/settingtypes.txt index 3d65971e..ba0db568 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -87,6 +87,10 @@ craftguide_progressive_mode (Enable recipe book progressive mode) bool false # This feature is not finished yet! mob_difficulty (Mob difficulty factor) float 1.0 0.0 +# Whether to generate fallen logs in some biomes. +# They might not always look pretty and have strange overhangs. +mcl_generate_fallen_logs (Generate fallen logs) bool false + # If enabled, the “flat” map generator generates a Classic Superflat world: # Completely flat, 1 layer of grass blocks on top of 2 layers of dirt on # top of a final layer of bedrock. No caves, trees or plants. From d367a8dbad79befe9e0e3d5d01ee5b14a839a40a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Mar 2019 18:32:10 +0100 Subject: [PATCH 0355/1107] Update banner comment --- mods/ITEMS/mcl_banners/patterncraft.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_banners/patterncraft.lua b/mods/ITEMS/mcl_banners/patterncraft.lua index 4639b7a9..f60d5678 100644 --- a/mods/ITEMS/mcl_banners/patterncraft.lua +++ b/mods/ITEMS/mcl_banners/patterncraft.lua @@ -390,8 +390,8 @@ local banner_pattern_craft = function(itemstack, player, old_craft_grid, craft_i return ItemStack("") end -- Lower layer limit when banner includes any gradient. - -- Workaround to circumvent bug #340 (gradients are likely to cause transparent pixels). - -- FIXME: Remove this restriction when bug #340 is fixed. + -- Workaround to circumvent Minetest bug (https://github.com/minetest/minetest/issues/6210) + -- TODO: Remove this restriction when bug #6210 is fixed. if #layers >= max_layers_gradient then for l=1, #layers do if layers[l].pattern == "gradient" or layers[l].pattern == "gradient_up" then From 47389902bc76cd798a9d29b10ac191bdff2dbb88 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 1 Mar 2019 18:33:56 +0100 Subject: [PATCH 0356/1107] Version 0.47.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9654821f..ed7be27b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.46.0 +Version: 0.47.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 94591c8b527eb60b46ae13c9c891f34da9eac96b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Mar 2019 06:07:44 +0100 Subject: [PATCH 0357/1107] Fix crash when dig banner in protected area --- mods/ITEMS/mcl_banners/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index bfe7832a..a04d88ed 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -51,7 +51,7 @@ local on_dig_banner = function(pos, node, digger) -- Check protection local name = digger:get_player_name() if minetest.is_protected(pos, name) then - minetest.register_protection_violation(pos, name) + minetest.record_protection_violation(pos, name) return end -- Drop item From c19e3f455cd4c1e29e37d3e4d031953e8f107baa Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Mar 2019 06:08:44 +0100 Subject: [PATCH 0358/1107] Version 0.47.1 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ed7be27b..9a35de3e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.47.0 +Version: 0.47.1 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 62e3a8b9ff665a46ec2160d9b0cf72f7d4f2fdfa Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 00:11:43 +0100 Subject: [PATCH 0359/1107] Add player skin support, add female skin --- mods/PLAYER/simple_skins/depends.txt | 3 + mods/PLAYER/simple_skins/description.txt | 1 + mods/PLAYER/simple_skins/init.lua | 148 ++++++++++++++++++ mods/PLAYER/simple_skins/intllib.lua | 45 ++++++ mods/PLAYER/simple_skins/license.txt | 21 +++ mods/PLAYER/simple_skins/locale/fr.po | 51 ++++++ mods/PLAYER/simple_skins/locale/it.po | 52 ++++++ mods/PLAYER/simple_skins/locale/ms.po | 51 ++++++ mods/PLAYER/simple_skins/locale/template.pot | 50 ++++++ mods/PLAYER/simple_skins/meta/character.txt | 3 + mods/PLAYER/simple_skins/meta/character_1.txt | 3 + mods/PLAYER/simple_skins/mod.conf | 1 + mods/PLAYER/simple_skins/readme.md | 7 + .../simple_skins/textures/character_1.png | Bin 0 -> 5505 bytes .../textures/inventory_plus_skins.png | Bin 0 -> 2182 bytes 15 files changed, 436 insertions(+) create mode 100644 mods/PLAYER/simple_skins/depends.txt create mode 100644 mods/PLAYER/simple_skins/description.txt create mode 100644 mods/PLAYER/simple_skins/init.lua create mode 100644 mods/PLAYER/simple_skins/intllib.lua create mode 100644 mods/PLAYER/simple_skins/license.txt create mode 100644 mods/PLAYER/simple_skins/locale/fr.po create mode 100644 mods/PLAYER/simple_skins/locale/it.po create mode 100644 mods/PLAYER/simple_skins/locale/ms.po create mode 100644 mods/PLAYER/simple_skins/locale/template.pot create mode 100644 mods/PLAYER/simple_skins/meta/character.txt create mode 100644 mods/PLAYER/simple_skins/meta/character_1.txt create mode 100644 mods/PLAYER/simple_skins/mod.conf create mode 100644 mods/PLAYER/simple_skins/readme.md create mode 100644 mods/PLAYER/simple_skins/textures/character_1.png create mode 100644 mods/PLAYER/simple_skins/textures/inventory_plus_skins.png diff --git a/mods/PLAYER/simple_skins/depends.txt b/mods/PLAYER/simple_skins/depends.txt new file mode 100644 index 00000000..1927ce89 --- /dev/null +++ b/mods/PLAYER/simple_skins/depends.txt @@ -0,0 +1,3 @@ +mcl_player +intllib? +3d_armor? diff --git a/mods/PLAYER/simple_skins/description.txt b/mods/PLAYER/simple_skins/description.txt new file mode 100644 index 00000000..61c7bff6 --- /dev/null +++ b/mods/PLAYER/simple_skins/description.txt @@ -0,0 +1 @@ +Mod that allows players to set their individual skins. \ No newline at end of file diff --git a/mods/PLAYER/simple_skins/init.lua b/mods/PLAYER/simple_skins/init.lua new file mode 100644 index 00000000..3a41490f --- /dev/null +++ b/mods/PLAYER/simple_skins/init.lua @@ -0,0 +1,148 @@ +-- Simple Skins mod for Minetest (MineClone 2 Edition) + +-- Released by TenPlus1 and based on Zeg9's code under MIT license + +skins = { + skins = {}, meta = {}, + modpath = minetest.get_modpath("simple_skins"), + skin_count = 0, -- counter of _custom_ skins (all skins except character.png) +} + + +-- Load support for intllib. +local S, NS = dofile(skins.modpath .. "/intllib.lua") + + +-- load skin list and metadata +local id, f, data, skin = 1 + +while true do + + skin = "character_" .. id + + -- does skin file exist ? + f = io.open(skins.modpath .. "/textures/" .. skin .. ".png") + + -- escape loop if not found and remove last entry + if not f then + id = id - 1 + break + end + + f:close() + + -- does metadata exist for that skin file ? + f = io.open(skins.modpath .. "/meta/" .. skin .. ".txt") + + if f then + data = minetest.deserialize("return {" .. f:read('*all') .. "}") + f:close() + end + + -- add metadata to list + skins.meta[skin] = { + name = data and data.name or "", + author = data and data.author or "", + } + + id = id + 1 + skins.skin_count = skins.skin_count + 1 +end + +skins.set_player_skin = function(player, skin) + if not player then + return + end + local playername = player:get_player_name() + skins.skins[playername] = skin + player:set_attribute("simple_skins:skin", skins.skins[playername]) + skins.update_player_skin(player) + if minetest.get_modpath("3d_armor") then + armor.textures[playername].skin = skin .. ".png" + armor:update_player_visuals(player) + end +end + +skins.update_player_skin = function(player) + if not player then + return + end + local playername = player:get_player_name() + mcl_player.player_set_textures(player, { skins.skins[playername] .. ".png" }) +end + +-- load player skin on join +minetest.register_on_joinplayer(function(player) + + local name = player:get_player_name() + local skin = player:get_attribute("simple_skins:skin") + local set_skin + -- do we already have a skin in player attributes? + if skin then + set_skin = skin + + -- otherwise use random skin if not set + else + local r = math.random(0, skins.skin_count) + if r == 0 then + set_skin = "character" + else + set_skin = "character_" .. r + end + end + if set_skin then + skins.set_player_skin(player, set_skin) + end +end) + +-- command to set player skin (usually for custom skins) +minetest.register_chatcommand("setskin", { + params = "[] ", + description = S("Select player skin of yourself or another player"), + privs = {}, + func = function(name, param) + + local playername, skin_id = string.match(param, "([^ ]+) (%d+)") + if not playername or not skin_id then + skin_id = string.match(param, "(%d+)") + if not skin_id then + return false, S("Insufficient or wrong parameters") + end + playername = name + end + skin_id = tonumber(skin_id) + + local player = minetest.get_player_by_name(playername) + + if not player then + return false, S("Player @1 not online!", playername) + end + if name ~= playername then + local privs = minetest.get_player_privs(name) + if not privs.server then + return false, S("You need the “server” privilege to change the skin of other players!") + end + end + + local skin + if skin_id == nil or skin_id > skins.skin_count or skin_id < 0 then + return false, S("Invalid skin number! Valid numbers: 0 to @1", skins.skin_count) + elseif skin_id == 0 then + skin = "character" + else + skin = "character_" .. tostring(skin_id) + end + + skins.set_player_skin(player, skin) + local skinfile = skin..".png" + + local your_msg = S("Your skin has been set to: @1", skinfile) + if name == playername then + return true, your_msg + else + minetest.chat_send_player(playername, your_msg) + return true, S("Skin of @1 set to: @2", playername, skinfile) + end + + end, +}) diff --git a/mods/PLAYER/simple_skins/intllib.lua b/mods/PLAYER/simple_skins/intllib.lua new file mode 100644 index 00000000..6669d720 --- /dev/null +++ b/mods/PLAYER/simple_skins/intllib.lua @@ -0,0 +1,45 @@ + +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext diff --git a/mods/PLAYER/simple_skins/license.txt b/mods/PLAYER/simple_skins/license.txt new file mode 100644 index 00000000..fec6f6aa --- /dev/null +++ b/mods/PLAYER/simple_skins/license.txt @@ -0,0 +1,21 @@ +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/PLAYER/simple_skins/locale/fr.po b/mods/PLAYER/simple_skins/locale/fr.po new file mode 100644 index 00000000..30d8e36e --- /dev/null +++ b/mods/PLAYER/simple_skins/locale/fr.po @@ -0,0 +1,51 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-29 07:11+0200\n" +"PO-Revision-Date: 2017-07-29 07:17+0200\n" +"Last-Translator: fat115 \n" +"Language-Team: \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.12\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: init.lua +msgid "Select Player Skin:" +msgstr "Sélectionner l'apparence du joueur :" + +#: init.lua +msgid "Name: " +msgstr "Nom : " + +#: init.lua +msgid "Author: " +msgstr "Auteur : " + +#: init.lua +msgid "Admin command to set player skin" +msgstr "Commande admin pour définir l'apparence du joueur" + +#: init.lua +msgid "'s skin set to" +msgstr ", apparence définie pour" + +#: init.lua +msgid "Set player skin" +msgstr "Définir l'apparence du joueur" + +#: init.lua +msgid "Close" +msgstr "Fermer" + +#: init.lua +msgid "[MOD] Simple Skins loaded" +msgstr "[MOD] Simple Skins chargé" diff --git a/mods/PLAYER/simple_skins/locale/it.po b/mods/PLAYER/simple_skins/locale/it.po new file mode 100644 index 00000000..d4701316 --- /dev/null +++ b/mods/PLAYER/simple_skins/locale/it.po @@ -0,0 +1,52 @@ +# simple_skin . +# Copyright (C) 2018 +# This file is distributed under the same license as the PACKAGE package. +# Stefano Peris , 2018. +# Github: +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-02-21 07:29+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Stefano Peris \n" +"Language-Team: \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.12\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: init.lua +msgid "Select Player Skin:" +msgstr "Seleziona la skin del giocatore" + +#: init.lua +msgid "Name: " +msgstr "Nome" + +#: init.lua +msgid "Author: " +msgstr "Autore" + +#: init.lua +msgid "Admin command to set player skin" +msgstr "Comando di admin per impostare la skin del giocatore" + +#: init.lua +msgid "'s skin set to" +msgstr ", la skin è impostata su" + +#: init.lua +msgid "Set player skin" +msgstr "Imposta la skin del giocatore" + +#: init.lua +msgid "Close" +msgstr "Chiudi" + +#: init.lua +msgid "[MOD] Simple Skins loaded" +msgstr "[MOD] Skins semplici caricate" diff --git a/mods/PLAYER/simple_skins/locale/ms.po b/mods/PLAYER/simple_skins/locale/ms.po new file mode 100644 index 00000000..bba5982d --- /dev/null +++ b/mods/PLAYER/simple_skins/locale/ms.po @@ -0,0 +1,51 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-29 07:11+0200\n" +"PO-Revision-Date: 2018-02-14 01:23+0800\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.6\n" +"Last-Translator: MuhdNurHidayat (MNH48) \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Language: ms\n" + +#: init.lua +msgid "Select Player Skin:" +msgstr "Pilih Kulit Pemain:" + +#: init.lua +msgid "Name: " +msgstr "Nama: " + +#: init.lua +msgid "Author: " +msgstr "Pencipta: " + +#: init.lua +msgid "Admin command to set player skin" +msgstr "Perintah pentadbir untuk menetapkan kulit pemain" + +#: init.lua +msgid "'s skin set to" +msgstr " telah ditukarkan kulitnya kepada" + +#: init.lua +msgid "Set player skin" +msgstr "Tetapkan kulit pemain" + +#: init.lua +msgid "Close" +msgstr "Tutup" + +#: init.lua +msgid "[MOD] Simple Skins loaded" +msgstr "[MODS] Simple Skins telah dimuatkan" diff --git a/mods/PLAYER/simple_skins/locale/template.pot b/mods/PLAYER/simple_skins/locale/template.pot new file mode 100644 index 00000000..36282e43 --- /dev/null +++ b/mods/PLAYER/simple_skins/locale/template.pot @@ -0,0 +1,50 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-29 07:11+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: init.lua +msgid "Select Player Skin:" +msgstr "" + +#: init.lua +msgid "Name: " +msgstr "" + +#: init.lua +msgid "Author: " +msgstr "" + +#: init.lua +msgid "Admin command to set player skin" +msgstr "" + +#: init.lua +msgid "'s skin set to" +msgstr "" + +#: init.lua +msgid "Set player skin" +msgstr "" + +#: init.lua +msgid "Close" +msgstr "" + +#: init.lua +msgid "[MOD] Simple Skins loaded" +msgstr "" diff --git a/mods/PLAYER/simple_skins/meta/character.txt b/mods/PLAYER/simple_skins/meta/character.txt new file mode 100644 index 00000000..5a07db19 --- /dev/null +++ b/mods/PLAYER/simple_skins/meta/character.txt @@ -0,0 +1,3 @@ +name = "Steve", +author = "(Texture pack author)", +description = "The default male skin.", diff --git a/mods/PLAYER/simple_skins/meta/character_1.txt b/mods/PLAYER/simple_skins/meta/character_1.txt new file mode 100644 index 00000000..ec438955 --- /dev/null +++ b/mods/PLAYER/simple_skins/meta/character_1.txt @@ -0,0 +1,3 @@ +name = "Alex", +author = "(Texture pack author)", +description = "The default female skin.", diff --git a/mods/PLAYER/simple_skins/mod.conf b/mods/PLAYER/simple_skins/mod.conf new file mode 100644 index 00000000..aff90aab --- /dev/null +++ b/mods/PLAYER/simple_skins/mod.conf @@ -0,0 +1 @@ +name = simple_skins diff --git a/mods/PLAYER/simple_skins/readme.md b/mods/PLAYER/simple_skins/readme.md new file mode 100644 index 00000000..0c6980bb --- /dev/null +++ b/mods/PLAYER/simple_skins/readme.md @@ -0,0 +1,7 @@ +Simple Skins, MineClone 2 Edition + +Simple Skins mod to allow players to select a skin. +Use the chat command /setskin to change skin. + +Original mod: +https://forum.minetest.net/viewtopic.php?id=9100 diff --git a/mods/PLAYER/simple_skins/textures/character_1.png b/mods/PLAYER/simple_skins/textures/character_1.png new file mode 100644 index 0000000000000000000000000000000000000000..71f02471dc622249681a511a66087b803e97dbdf GIT binary patch literal 5505 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 CAYT6f literal 0 HcmV?d00001 diff --git a/mods/PLAYER/simple_skins/textures/inventory_plus_skins.png b/mods/PLAYER/simple_skins/textures/inventory_plus_skins.png new file mode 100644 index 0000000000000000000000000000000000000000..7cc97759cd8c906632a0ff2712b647c23abc2278 GIT binary patch literal 2182 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4kiW$h6xih%orHh?5jc|N`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsHU}kKDwp&hzKFh$U0f^}>kNMa?qyyq9{Wr|9qC+Ba>{QZr0&+m7<*3nnr#V<54%WVJB zHu09`zMFq-d#lsm&ieV3HGKBl&(Aq`Z*_~zKJ_Zg!$C_j_R7{N#qE8(0l$oO9-jK) zcISDq;kqW(G6S;%X@{@!8d@&ct8rn0SNF3_>(Um9J0+59i|_tS*0!@Q`#VACo9pS+ z3&uVA35%Oe_gC&rUTCa8|EHDc85<5;*@KdaNBU3K82y|6x@^lezgVT{yfp&TZ(H^n zm=*sP-|N7kd(=d(=6veBPsi*8Umr}cF%Z|;a7#@uYKeQ^&%>MD_h&S3++?c3U&_#7 zQ0`*zOklt+d1fiMtA$5A=TLd?K>_`LP*3%hz}NotYpe zAXxiJ@=5}8;~D{_PwMSWGOI2gPe|&~d={Z}d{zyY=CUb8x1>ThpI1CSr|6t&@w%ha z1Cl&drw8o_DSM-sI8iwLaO=$Mqf12BX}g7gS+RBJv*?VCOQ%I=-pO+R_2ojczwP%+ zJFh=%lfUs#xi`m6(&p8Y&X8G&$7ZI@OZ~Kld*`-4T-xileA4O;-y0bm79Y9T{8?Rk z@06`)BP{-YYBrrwyf5a$w8=XxnUnPdB+k!fRM~QS&P^x99cS-6JM(GU>K6y3j{2Tk za8^QsXL3wTN%8lDcj5PZc>Z^pfA6*2yz;mG4CC2WsqfVD*}=EQRNMKCr0`?IqJ`I%$hVxi z`q;>_Kk+x8(bD96`F^`+@4logDRDP_+}Y**K5o&WX?Z%ERo}n0iETG+>?^$f!atee z!A2$1yB4+!?`}Tj<8xCcRvkZc>8isEIYrx6`=$r^>*w9K`c~G{!BO#Y$x^3B=W=gLX&$U~GE_ykl0>fATbuk}cCU&!8obd;b^7V=w(e6czgZ^F%8r@x_5I{2A7*^GJ$=z3 zy>qiC$zObvaOU%_d2hG^--g9SS2ur?o3TaBX5mkdh)9KZZWC|6{PSbtjq__OPySdJ zbN=DPsey8{_P#S%nfCttwLMZIt1i6la=vzRx%|8B5lc+x$N#WPdA^pRltbKa|CVQu zxjQE1sJ)&Ru;pr$1kbtii)L?R@lk2sCigKYW!d}Jk3Bm1J|%<)$;+hu=lXV@HSR%p z{4cIGD|8n;+r8`lW#?Sq>9&TM`_~x7el)+l&qK-Sa%I)YCvz&)nwTp$+00z#x#_pj zxp^_0FRyX?xnnBB#1mP&T?2RgI9uB>@RGV?>#s#a*8c~yR!9p!KV|mpR`_X z%lf;bU+6=yTb$9OY4(4Z1FABYebVdu#Fv?0sAchp-!S%L(AwCo`&XS?8gwJ`tln;u z!1O1w8*U1S>6}*u@f4~+MCeTg@8{v!7Ys})7w$X;K6)>{1Ijud7FyK|y9Un#D7P``8)&p(-X#kM6| zjh?S?wK{t|Qe{Q(_U2IE?2gb?k)`fL2$v|<&zm07&r?&B8wRq^pruEv0|xx z83O|Ydx@v7EBj++7BMaM+N2du3=E7XJY5_^G|uNva`X@hlsH~*%pP*K4J*O_S`~I#AyqUF1diuGi zm&&pwj_RLQeeiDbbEj(V=koU??H|so-kYR1MeUGAoQAK;-H=PZw){$`V^3&B$xG*p Date: Tue, 5 Mar 2019 00:15:20 +0100 Subject: [PATCH 0360/1107] Replace damage sound to something gender-neutral --- mods/CORE/mcl_sounds/README.txt | 5 ++++- mods/CORE/mcl_sounds/sounds/player_damage.ogg | Bin 5775 -> 6176 bytes 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/mods/CORE/mcl_sounds/README.txt b/mods/CORE/mcl_sounds/README.txt index 54eeab60..43e6cf30 100644 --- a/mods/CORE/mcl_sounds/README.txt +++ b/mods/CORE/mcl_sounds/README.txt @@ -67,10 +67,13 @@ blukotek (CC0 1.0) https://www.freesound.org/people/blukotek/sounds/251660/ default_dig_snappy.ogg +sonictechtonic (CC BY 3.0) +https://www.freesound.org/people/sonictechtonic/sounds/241872/ + player_damage.ogg + Voxelands project (CC BY-SA 3.0) mcl_sounds_place_node_water.ogg mcl_sounds_dug_water.ogg - player_damage.ogg (Note: Artists from the Voxelands project include: sdzen, darkrose, sapier, Tom Peter, Telaron, juskiddink) diff --git a/mods/CORE/mcl_sounds/sounds/player_damage.ogg b/mods/CORE/mcl_sounds/sounds/player_damage.ogg index 063e6c08c4da5cd7600b06c9f19edf7592537da3..788808710c1923c9ae797b7534b66a97dd18dd6d 100644 GIT binary patch literal 6176 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 z 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 From 2c5038ad058cff4219b09ce5b6c7c113e7d43fe7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 01:50:51 +0100 Subject: [PATCH 0361/1107] Player skins: Adjust inventory preview image, too --- mods/HUD/mcl_inventory/creative.lua | 14 ++++-- mods/HUD/mcl_inventory/depends.txt | 1 + mods/HUD/mcl_inventory/init.lua | 15 ++++-- mods/PLAYER/mcl_player/init.lua | 14 +++++- mods/PLAYER/simple_skins/init.lua | 47 +++++++++--------- .../PLAYER/simple_skins/textures/player_1.png | Bin 0 -> 2625 bytes 6 files changed, 59 insertions(+), 32 deletions(-) create mode 100644 mods/PLAYER/simple_skins/textures/player_1.png diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index dd5d0bd8..f2afb964 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -4,6 +4,9 @@ local players = {} -- Containing all the items for each Creative Mode tab local inventory_lists = {} +local show_armor = minetest.get_modpath("3d_armor") ~= nil +local mod_player = minetest.get_modpath("mcl_player") ~= nil + -- TODO: Brewing is disabled. Add brewing (uncommented code) when it is implemented properly -- Create tables @@ -271,15 +274,20 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz inv_bg = "crafting_inventory_creative_survival.png" -- Show armor and player image - local show_armor = minetest.get_modpath("3d_armor") - local img = "player.png" + local img, img_player + if mod_player then + img_player = mcl_player.player_get_preview(player) + else + img_player = "player.png" + end + img = img_player local player_preview = "image[3.9,1.4;1.2333,2.4666;"..img.."]" if show_armor and armor.textures[playername] and armor.textures[playername].preview then img = armor.textures[playername].preview local s1 = img:find("character_preview") if s1 ~= nil then s1 = img:sub(s1+21) - img = "player.png"..s1 + img = img_player..s1 end player_preview = "image[3.9,1.4;1.2333,2.4666;"..img.."]" end diff --git a/mods/HUD/mcl_inventory/depends.txt b/mods/HUD/mcl_inventory/depends.txt index a174c0ee..46d93c42 100644 --- a/mods/HUD/mcl_inventory/depends.txt +++ b/mods/HUD/mcl_inventory/depends.txt @@ -1,3 +1,4 @@ mcl_init +mcl_player? _mcl_autogroup? 3d_armor? diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 4bd2ef80..3989af19 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -1,8 +1,7 @@ mcl_inventory = {} -local show_armor = false -if minetest.get_modpath("3d_armor") ~= nil then show_armor = true end - +local show_armor = minetest.get_modpath("3d_armor") ~= nil +local mod_player = minetest.get_modpath("mcl_player") ~= nil -- Returns a single itemstack in the given inventory to the main inventory, or drop it when there's no space left local function return_item(itemstack, dropper, pos, inv) @@ -59,14 +58,20 @@ local function set_inventory(player, armor_change_only) local player_name = player:get_player_name() -- Show armor and player image - local img = "player.png" + local img, img_player + if mod_player then + img_player = mcl_player.player_get_preview(player) + else + img_player = "player.png" + end + img = img_player local player_preview = "image[0.6,0.2;2,4;"..img.."]" if show_armor and armor.textures[player_name] and armor.textures[player_name].preview then img = armor.textures[player_name].preview local s1 = img:find("character_preview") if s1 ~= nil then s1 = img:sub(s1+21) - img = "player.png"..s1 + img = img_player..s1 end player_preview = "image[1.1,0.2;2,4;"..img.."]" end diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 599acd65..b01c0b4d 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -70,10 +70,22 @@ function mcl_player.player_set_model(player, model_name) player_model[name] = model_name end -function mcl_player.player_set_textures(player, textures) +function mcl_player.player_set_textures(player, textures, preview) local name = player:get_player_name() player_textures[name] = textures player:set_properties({textures = textures,}) + if preview then + player:set_attribute("mcl_player:preview", preview) + end +end + +function mcl_player.player_get_preview(player) + local preview = player:get_attribute("mcl_player:preview") + if not preview then + return "player.png" + else + return preview + end end function mcl_player.player_set_animation(player, anim_name, speed) diff --git a/mods/PLAYER/simple_skins/init.lua b/mods/PLAYER/simple_skins/init.lua index 3a41490f..077278b7 100644 --- a/mods/PLAYER/simple_skins/init.lua +++ b/mods/PLAYER/simple_skins/init.lua @@ -3,7 +3,7 @@ -- Released by TenPlus1 and based on Zeg9's code under MIT license skins = { - skins = {}, meta = {}, + skins = {}, previews = {}, meta = {}, modpath = minetest.get_modpath("simple_skins"), skin_count = 0, -- counter of _custom_ skins (all skins except character.png) } @@ -49,18 +49,30 @@ while true do skins.skin_count = skins.skin_count + 1 end -skins.set_player_skin = function(player, skin) +skins.set_player_skin = function(player, skin_id) if not player then - return + return false end local playername = player:get_player_name() + local skin, preview + if skin_id == nil or type(skin_id) ~= "number" or skin_id < 0 or skin_id > skins.skin_count then + return false + elseif skin_id == 0 then + skin = "character" + preview = "player" + else + skin = "character_" .. tostring(skin_id) + preview = "player_" .. tostring(skin_id) + end skins.skins[playername] = skin - player:set_attribute("simple_skins:skin", skins.skins[playername]) + skins.previews[playername] = preview + player:set_attribute("simple_skins:skin_id", skin_id) skins.update_player_skin(player) if minetest.get_modpath("3d_armor") then armor.textures[playername].skin = skin .. ".png" armor:update_player_visuals(player) end + return true end skins.update_player_skin = function(player) @@ -68,27 +80,21 @@ skins.update_player_skin = function(player) return end local playername = player:get_player_name() - mcl_player.player_set_textures(player, { skins.skins[playername] .. ".png" }) + mcl_player.player_set_textures(player, { skins.skins[playername] .. ".png" }, skins.previews[playername] .. ".png" ) end -- load player skin on join minetest.register_on_joinplayer(function(player) local name = player:get_player_name() - local skin = player:get_attribute("simple_skins:skin") + local skin_id = player:get_attribute("simple_skins:skin_id") local set_skin -- do we already have a skin in player attributes? - if skin then - set_skin = skin - + if skin_id then + set_skin = tonumber(skin_id) -- otherwise use random skin if not set else - local r = math.random(0, skins.skin_count) - if r == 0 then - set_skin = "character" - else - set_skin = "character_" .. r - end + set_skin = math.random(0, skins.skin_count) end if set_skin then skins.set_player_skin(player, set_skin) @@ -125,16 +131,11 @@ minetest.register_chatcommand("setskin", { end local skin - if skin_id == nil or skin_id > skins.skin_count or skin_id < 0 then + local ok = skins.set_player_skin(player, skin_id) + if not ok then return false, S("Invalid skin number! Valid numbers: 0 to @1", skins.skin_count) - elseif skin_id == 0 then - skin = "character" - else - skin = "character_" .. tostring(skin_id) end - - skins.set_player_skin(player, skin) - local skinfile = skin..".png" + local skinfile = "Skin #"..skin_id local your_msg = S("Your skin has been set to: @1", skinfile) if name == playername then diff --git a/mods/PLAYER/simple_skins/textures/player_1.png b/mods/PLAYER/simple_skins/textures/player_1.png new file mode 100644 index 0000000000000000000000000000000000000000..3d7af2a980c2412be1f72e39fd6d7ffeda8f7fb3 GIT binary patch literal 2625 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 K=d#Wzp$Pz}JO2~_ literal 0 HcmV?d00001 From e47bd634d4a35a087d342c10629fc7af9cb90612 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 10:29:49 +0100 Subject: [PATCH 0362/1107] Player skins: Update inventory preview (part 2) --- mods/HUD/mcl_inventory/creative.lua | 32 ++++++++++++++++++++++++++++ mods/HUD/mcl_inventory/init.lua | 6 ++++++ mods/PLAYER/simple_skins/depends.txt | 1 + mods/PLAYER/simple_skins/init.lua | 3 +++ 4 files changed, 42 insertions(+) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index f2afb964..d9ad2e94 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -570,6 +570,38 @@ if minetest.settings:get_bool("creative_mode") then end end + mcl_inventory.update_inventory_formspec = function(player) + local page = nil + + 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 ~= nil 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) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 3989af19..415c3075 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -127,6 +127,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end) +if not minetest.settings:get_bool("creative_mode") then + mcl_inventory.update_inventory_formspec = function(player) + set_inventory(player) + end +end + -- Drop crafting grid items on leaving minetest.register_on_leaveplayer(function(player) return_fields(player, "craft") diff --git a/mods/PLAYER/simple_skins/depends.txt b/mods/PLAYER/simple_skins/depends.txt index 1927ce89..e0804a6f 100644 --- a/mods/PLAYER/simple_skins/depends.txt +++ b/mods/PLAYER/simple_skins/depends.txt @@ -1,3 +1,4 @@ mcl_player +mcl_inventory? intllib? 3d_armor? diff --git a/mods/PLAYER/simple_skins/init.lua b/mods/PLAYER/simple_skins/init.lua index 077278b7..98d3e7e8 100644 --- a/mods/PLAYER/simple_skins/init.lua +++ b/mods/PLAYER/simple_skins/init.lua @@ -72,6 +72,9 @@ skins.set_player_skin = function(player, skin_id) armor.textures[playername].skin = skin .. ".png" armor:update_player_visuals(player) end + if minetest.get_modpath("mcl_inventory") then + mcl_inventory.update_inventory_formspec(player) + end return true end From aae30bba3964437830a0793aac64df5eda4743a7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 10:36:53 +0100 Subject: [PATCH 0363/1107] Rename simple_skins to mcl_skins --- .../minetest-3d_armor/3d_armor/armor.lua | 15 ++++++-- .../{simple_skins => mcl_skins}/depends.txt | 0 .../description.txt | 0 .../{simple_skins => mcl_skins}/init.lua | 36 +++++++++--------- .../{simple_skins => mcl_skins}/intllib.lua | 0 .../{simple_skins => mcl_skins}/license.txt | 0 .../{simple_skins => mcl_skins}/locale/fr.po | 0 .../{simple_skins => mcl_skins}/locale/it.po | 0 .../{simple_skins => mcl_skins}/locale/ms.po | 0 .../locale/template.pot | 0 .../meta/character.txt | 0 .../meta/character_1.txt | 0 mods/PLAYER/mcl_skins/mod.conf | 1 + .../{simple_skins => mcl_skins}/readme.md | 0 .../textures/character_1.png | Bin .../textures/inventory_plus_skins.png | Bin .../textures/player_1.png | Bin mods/PLAYER/simple_skins/mod.conf | 1 - 18 files changed, 31 insertions(+), 22 deletions(-) rename mods/PLAYER/{simple_skins => mcl_skins}/depends.txt (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/description.txt (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/init.lua (78%) rename mods/PLAYER/{simple_skins => mcl_skins}/intllib.lua (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/license.txt (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/locale/fr.po (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/locale/it.po (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/locale/ms.po (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/locale/template.pot (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/meta/character.txt (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/meta/character_1.txt (100%) create mode 100644 mods/PLAYER/mcl_skins/mod.conf rename mods/PLAYER/{simple_skins => mcl_skins}/readme.md (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/textures/character_1.png (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/textures/inventory_plus_skins.png (100%) rename mods/PLAYER/{simple_skins => mcl_skins}/textures/player_1.png (100%) delete mode 100644 mods/PLAYER/simple_skins/mod.conf diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua b/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua index 0b07fb14..ae9799f9 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua @@ -66,7 +66,9 @@ armor = { version = "0.4.6", } -if minetest.get_modpath("skins") then +if minetest.get_modpath("mcl_skins") then + skin_mod = "mcl_skins" +elseif minetest.get_modpath("skins") then skin_mod = "skins" elseif minetest.get_modpath("simple_skins") then skin_mod = "simple_skins" @@ -197,7 +199,9 @@ end armor.get_player_skin = function(self, name) local skin = nil - if skin_mod == "skins" or skin_mod == "simple_skins" then + if skin_mod == "mcl_skins" then + skin = mcl_skins.skins[name] + elseif skin_mod == "skins" or skin_mod == "simple_skins" then skin = skins.skins[name] elseif skin_mod == "u_skins" then skin = u_skins.u_skins[name] @@ -380,7 +384,12 @@ minetest.register_on_joinplayer(function(player) wielditem = "3d_armor_trans.png", preview = armor.default_skin.."_preview.png", } - if skin_mod == "skins" then + if skin_mod == "mcl_skins" then + local skin = mcl_skins.skins[name] + if skin then + armor.textures[name].skin = skin..".png" + end + elseif skin_mod == "skins" then local skin = skins.skins[name] if skin and skins.get_type(skin) == skins.type.MODEL then armor.textures[name].skin = skin..".png" diff --git a/mods/PLAYER/simple_skins/depends.txt b/mods/PLAYER/mcl_skins/depends.txt similarity index 100% rename from mods/PLAYER/simple_skins/depends.txt rename to mods/PLAYER/mcl_skins/depends.txt diff --git a/mods/PLAYER/simple_skins/description.txt b/mods/PLAYER/mcl_skins/description.txt similarity index 100% rename from mods/PLAYER/simple_skins/description.txt rename to mods/PLAYER/mcl_skins/description.txt diff --git a/mods/PLAYER/simple_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua similarity index 78% rename from mods/PLAYER/simple_skins/init.lua rename to mods/PLAYER/mcl_skins/init.lua index 98d3e7e8..fc892471 100644 --- a/mods/PLAYER/simple_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -2,15 +2,15 @@ -- Released by TenPlus1 and based on Zeg9's code under MIT license -skins = { +mcl_skins = { skins = {}, previews = {}, meta = {}, - modpath = minetest.get_modpath("simple_skins"), + modpath = minetest.get_modpath("mcl_skins"), skin_count = 0, -- counter of _custom_ skins (all skins except character.png) } -- Load support for intllib. -local S, NS = dofile(skins.modpath .. "/intllib.lua") +local S, NS = dofile(mcl_skins.modpath .. "/intllib.lua") -- load skin list and metadata @@ -21,7 +21,7 @@ while true do skin = "character_" .. id -- does skin file exist ? - f = io.open(skins.modpath .. "/textures/" .. skin .. ".png") + f = io.open(mcl_skins.modpath .. "/textures/" .. skin .. ".png") -- escape loop if not found and remove last entry if not f then @@ -32,7 +32,7 @@ while true do f:close() -- does metadata exist for that skin file ? - f = io.open(skins.modpath .. "/meta/" .. skin .. ".txt") + f = io.open(mcl_skins.modpath .. "/meta/" .. skin .. ".txt") if f then data = minetest.deserialize("return {" .. f:read('*all') .. "}") @@ -40,22 +40,22 @@ while true do end -- add metadata to list - skins.meta[skin] = { + mcl_skins.meta[skin] = { name = data and data.name or "", author = data and data.author or "", } id = id + 1 - skins.skin_count = skins.skin_count + 1 + mcl_skins.skin_count = mcl_skins.skin_count + 1 end -skins.set_player_skin = function(player, skin_id) +mcl_skins.set_player_skin = function(player, skin_id) if not player then return false end local playername = player:get_player_name() local skin, preview - if skin_id == nil or type(skin_id) ~= "number" or skin_id < 0 or skin_id > skins.skin_count then + if skin_id == nil or type(skin_id) ~= "number" or skin_id < 0 or skin_id > mcl_skins.skin_count then return false elseif skin_id == 0 then skin = "character" @@ -64,10 +64,10 @@ skins.set_player_skin = function(player, skin_id) skin = "character_" .. tostring(skin_id) preview = "player_" .. tostring(skin_id) end - skins.skins[playername] = skin - skins.previews[playername] = preview + mcl_skins.skins[playername] = skin + mcl_skins.previews[playername] = preview player:set_attribute("simple_skins:skin_id", skin_id) - skins.update_player_skin(player) + mcl_skins.update_player_skin(player) if minetest.get_modpath("3d_armor") then armor.textures[playername].skin = skin .. ".png" armor:update_player_visuals(player) @@ -78,12 +78,12 @@ skins.set_player_skin = function(player, skin_id) return true end -skins.update_player_skin = function(player) +mcl_skins.update_player_skin = function(player) if not player then return end local playername = player:get_player_name() - mcl_player.player_set_textures(player, { skins.skins[playername] .. ".png" }, skins.previews[playername] .. ".png" ) + mcl_player.player_set_textures(player, { mcl_skins.skins[playername] .. ".png" }, mcl_skins.previews[playername] .. ".png" ) end -- load player skin on join @@ -97,10 +97,10 @@ minetest.register_on_joinplayer(function(player) set_skin = tonumber(skin_id) -- otherwise use random skin if not set else - set_skin = math.random(0, skins.skin_count) + set_skin = math.random(0, mcl_skins.skin_count) end if set_skin then - skins.set_player_skin(player, set_skin) + mcl_skins.set_player_skin(player, set_skin) end end) @@ -134,9 +134,9 @@ minetest.register_chatcommand("setskin", { end local skin - local ok = skins.set_player_skin(player, skin_id) + local ok = mcl_skins.set_player_skin(player, skin_id) if not ok then - return false, S("Invalid skin number! Valid numbers: 0 to @1", skins.skin_count) + return false, S("Invalid skin number! Valid numbers: 0 to @1", mcl_skins.skin_count) end local skinfile = "Skin #"..skin_id diff --git a/mods/PLAYER/simple_skins/intllib.lua b/mods/PLAYER/mcl_skins/intllib.lua similarity index 100% rename from mods/PLAYER/simple_skins/intllib.lua rename to mods/PLAYER/mcl_skins/intllib.lua diff --git a/mods/PLAYER/simple_skins/license.txt b/mods/PLAYER/mcl_skins/license.txt similarity index 100% rename from mods/PLAYER/simple_skins/license.txt rename to mods/PLAYER/mcl_skins/license.txt diff --git a/mods/PLAYER/simple_skins/locale/fr.po b/mods/PLAYER/mcl_skins/locale/fr.po similarity index 100% rename from mods/PLAYER/simple_skins/locale/fr.po rename to mods/PLAYER/mcl_skins/locale/fr.po diff --git a/mods/PLAYER/simple_skins/locale/it.po b/mods/PLAYER/mcl_skins/locale/it.po similarity index 100% rename from mods/PLAYER/simple_skins/locale/it.po rename to mods/PLAYER/mcl_skins/locale/it.po diff --git a/mods/PLAYER/simple_skins/locale/ms.po b/mods/PLAYER/mcl_skins/locale/ms.po similarity index 100% rename from mods/PLAYER/simple_skins/locale/ms.po rename to mods/PLAYER/mcl_skins/locale/ms.po diff --git a/mods/PLAYER/simple_skins/locale/template.pot b/mods/PLAYER/mcl_skins/locale/template.pot similarity index 100% rename from mods/PLAYER/simple_skins/locale/template.pot rename to mods/PLAYER/mcl_skins/locale/template.pot diff --git a/mods/PLAYER/simple_skins/meta/character.txt b/mods/PLAYER/mcl_skins/meta/character.txt similarity index 100% rename from mods/PLAYER/simple_skins/meta/character.txt rename to mods/PLAYER/mcl_skins/meta/character.txt diff --git a/mods/PLAYER/simple_skins/meta/character_1.txt b/mods/PLAYER/mcl_skins/meta/character_1.txt similarity index 100% rename from mods/PLAYER/simple_skins/meta/character_1.txt rename to mods/PLAYER/mcl_skins/meta/character_1.txt diff --git a/mods/PLAYER/mcl_skins/mod.conf b/mods/PLAYER/mcl_skins/mod.conf new file mode 100644 index 00000000..96f82764 --- /dev/null +++ b/mods/PLAYER/mcl_skins/mod.conf @@ -0,0 +1 @@ +name = mcl_skins diff --git a/mods/PLAYER/simple_skins/readme.md b/mods/PLAYER/mcl_skins/readme.md similarity index 100% rename from mods/PLAYER/simple_skins/readme.md rename to mods/PLAYER/mcl_skins/readme.md diff --git a/mods/PLAYER/simple_skins/textures/character_1.png b/mods/PLAYER/mcl_skins/textures/character_1.png similarity index 100% rename from mods/PLAYER/simple_skins/textures/character_1.png rename to mods/PLAYER/mcl_skins/textures/character_1.png diff --git a/mods/PLAYER/simple_skins/textures/inventory_plus_skins.png b/mods/PLAYER/mcl_skins/textures/inventory_plus_skins.png similarity index 100% rename from mods/PLAYER/simple_skins/textures/inventory_plus_skins.png rename to mods/PLAYER/mcl_skins/textures/inventory_plus_skins.png diff --git a/mods/PLAYER/simple_skins/textures/player_1.png b/mods/PLAYER/mcl_skins/textures/player_1.png similarity index 100% rename from mods/PLAYER/simple_skins/textures/player_1.png rename to mods/PLAYER/mcl_skins/textures/player_1.png diff --git a/mods/PLAYER/simple_skins/mod.conf b/mods/PLAYER/simple_skins/mod.conf deleted file mode 100644 index aff90aab..00000000 --- a/mods/PLAYER/simple_skins/mod.conf +++ /dev/null @@ -1 +0,0 @@ -name = simple_skins From 788ecbf178fc471ae310c9086f07750205224800 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 10:40:37 +0100 Subject: [PATCH 0364/1107] Update mcl_skins readme --- mods/PLAYER/mcl_skins/init.lua | 4 +--- mods/PLAYER/mcl_skins/readme.md | 12 +++++++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index fc892471..99228f58 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -1,6 +1,4 @@ --- Simple Skins mod for Minetest (MineClone 2 Edition) - --- Released by TenPlus1 and based on Zeg9's code under MIT license +-- Skins for MineClone 2 mcl_skins = { skins = {}, previews = {}, meta = {}, diff --git a/mods/PLAYER/mcl_skins/readme.md b/mods/PLAYER/mcl_skins/readme.md index 0c6980bb..bbe5309a 100644 --- a/mods/PLAYER/mcl_skins/readme.md +++ b/mods/PLAYER/mcl_skins/readme.md @@ -1,7 +1,13 @@ -Simple Skins, MineClone 2 Edition += Skins for MineClone 2 = -Simple Skins mod to allow players to select a skin. +Simple mod to allow players to select a skin. Use the chat command /setskin to change skin. -Original mod: +Forked from Simple Skins by TenPlus1. https://forum.minetest.net/viewtopic.php?id=9100 + +== License == +Code under MIT license +Origial authors: +- TenPlus1 +- Zeg9 From b2c19d9ec60ee1e9c88b89685922b3decdf2e326 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 10:41:57 +0100 Subject: [PATCH 0365/1107] mcl_skins: Fix attribute name --- mods/PLAYER/mcl_skins/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index 99228f58..b584130c 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -64,7 +64,7 @@ mcl_skins.set_player_skin = function(player, skin_id) end mcl_skins.skins[playername] = skin mcl_skins.previews[playername] = preview - player:set_attribute("simple_skins:skin_id", skin_id) + player:set_attribute("mcl_skins:skin_id", tostring(skin_id)) mcl_skins.update_player_skin(player) if minetest.get_modpath("3d_armor") then armor.textures[playername].skin = skin .. ".png" @@ -88,7 +88,7 @@ end minetest.register_on_joinplayer(function(player) local name = player:get_player_name() - local skin_id = player:get_attribute("simple_skins:skin_id") + local skin_id = player:get_attribute("mcl_skins:skin_id") local set_skin -- do we already have a skin in player attributes? if skin_id then From 5601f8e0b79fab373b871bde2f5413b2cfd11fad Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 10:45:14 +0100 Subject: [PATCH 0366/1107] Rename some files --- mods/PLAYER/mcl_skins/{license.txt => LICENSE.txt} | 0 mods/PLAYER/mcl_skins/{readme.md => README.md} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename mods/PLAYER/mcl_skins/{license.txt => LICENSE.txt} (100%) rename mods/PLAYER/mcl_skins/{readme.md => README.md} (100%) diff --git a/mods/PLAYER/mcl_skins/license.txt b/mods/PLAYER/mcl_skins/LICENSE.txt similarity index 100% rename from mods/PLAYER/mcl_skins/license.txt rename to mods/PLAYER/mcl_skins/LICENSE.txt diff --git a/mods/PLAYER/mcl_skins/readme.md b/mods/PLAYER/mcl_skins/README.md similarity index 100% rename from mods/PLAYER/mcl_skins/readme.md rename to mods/PLAYER/mcl_skins/README.md From 62eaf60938e4b1f7c28db6b76143498911b82ea0 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 10:57:57 +0100 Subject: [PATCH 0367/1107] mcl_skins: Add fallback code if skin was missing --- mods/PLAYER/mcl_skins/init.lua | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index b584130c..a822218d 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -73,6 +73,7 @@ mcl_skins.set_player_skin = function(player, skin_id) if minetest.get_modpath("mcl_inventory") then mcl_inventory.update_inventory_formspec(player) end + minetest.log("action", "[mcl_skins] Player skin for "..playername.." set to skin #"..skin_id) return true end @@ -98,7 +99,12 @@ minetest.register_on_joinplayer(function(player) set_skin = math.random(0, mcl_skins.skin_count) end if set_skin then - mcl_skins.set_player_skin(player, set_skin) + local ok = mcl_skins.set_player_skin(player, set_skin) + if not ok then + set_skin = math.random(0, mcl_skins.skin_count) + minetest.log("warning", "[mcl_skins] Player skin for "..name.." not found, falling back to skin #"..set_skin) + mcl_skins.set_player_skin(player, set_skin) + end end end) @@ -148,3 +154,5 @@ minetest.register_chatcommand("setskin", { end, }) + +minetest.log("action", "[mcl_skins] Mod initialized with "..mcl_skins.skin_count.." custom skin(s)") From 9a54383a23e50580d2cca242b27e8d8864067b6f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Mar 2019 11:43:09 +0100 Subject: [PATCH 0368/1107] Add mesh hand --- mods/PLAYER/mcl_meshhand/README.md | 9 ++++ mods/PLAYER/mcl_meshhand/depends.txt | 1 + mods/PLAYER/mcl_meshhand/description.txt | 1 + mods/PLAYER/mcl_meshhand/init.lua | 47 ++++++++++++++++++ mods/PLAYER/mcl_meshhand/mod.conf | 1 + .../mcl_meshhand/models/mcl_meshhand.b3d | Bin 0 -> 1023 bytes .../mcl_meshhand/models/mcl_meshhand.blend | Bin 0 -> 554856 bytes mods/PLAYER/mcl_skins/init.lua | 20 ++++++-- 8 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 mods/PLAYER/mcl_meshhand/README.md create mode 100644 mods/PLAYER/mcl_meshhand/depends.txt create mode 100644 mods/PLAYER/mcl_meshhand/description.txt create mode 100644 mods/PLAYER/mcl_meshhand/init.lua create mode 100644 mods/PLAYER/mcl_meshhand/mod.conf create mode 100644 mods/PLAYER/mcl_meshhand/models/mcl_meshhand.b3d create mode 100644 mods/PLAYER/mcl_meshhand/models/mcl_meshhand.blend diff --git a/mods/PLAYER/mcl_meshhand/README.md b/mods/PLAYER/mcl_meshhand/README.md new file mode 100644 index 00000000..2c796ff3 --- /dev/null +++ b/mods/PLAYER/mcl_meshhand/README.md @@ -0,0 +1,9 @@ +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/depends.txt b/mods/PLAYER/mcl_meshhand/depends.txt new file mode 100644 index 00000000..f8be59ba --- /dev/null +++ b/mods/PLAYER/mcl_meshhand/depends.txt @@ -0,0 +1 @@ +mcl_skins? diff --git a/mods/PLAYER/mcl_meshhand/description.txt b/mods/PLAYER/mcl_meshhand/description.txt new file mode 100644 index 00000000..7a4daae5 --- /dev/null +++ b/mods/PLAYER/mcl_meshhand/description.txt @@ -0,0 +1 @@ +Applies the player skin texture to the hand. diff --git a/mods/PLAYER/mcl_meshhand/init.lua b/mods/PLAYER/mcl_meshhand/init.lua new file mode 100644 index 00000000..1e318a5b --- /dev/null +++ b/mods/PLAYER/mcl_meshhand/init.lua @@ -0,0 +1,47 @@ +local has_mcl_skins = minetest.get_modpath("mcl_skins") ~= nil + +-- mcl_skins is enabled +if has_mcl_skins == true then + --generate a node for every skin + for _,texture in pairs(mcl_skins.list) do + minetest.register_node("mcl_meshhand:"..texture, { + description = "", + tiles = {texture..".png"}, + inventory_image = "blank.png", + visual_scale = 1, + wield_scale = {x=1,y=1,z=1}, + paramtype = "light", + drawtype = "mesh", + mesh = "mcl_meshhand.b3d", + node_placement_prediction = "", + }) + end + --change the player's hand to their skin + minetest.register_on_joinplayer(function(player) + local skin = mcl_skins.skins[player:get_player_name()] + player:get_inventory():set_stack("hand", 1, "mcl_meshhand:"..skin) + end) + + mcl_skins.register_on_set_skin(function(player, skin) + local name = player:get_player_name() + player:get_inventory():set_stack("hand", 1, "mcl_meshhand:"..skin) + end) + +--do default skin if no skin mod installed +else + minetest.register_node("mcl_meshhand:hand", { + description = "", + tiles = {"character.png"}, + inventory_image = "blank.png", + visual_scale = 1, + wield_scale = {x=1,y=1,z=1}, + paramtype = "light", + drawtype = "mesh", + mesh = "mcl_meshhand.b3d", + node_placement_prediction = "", + }) + + 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 new file mode 100644 index 00000000..6b57f4a4 --- /dev/null +++ b/mods/PLAYER/mcl_meshhand/mod.conf @@ -0,0 +1 @@ +name = mcl_meshhand diff --git a/mods/PLAYER/mcl_meshhand/models/mcl_meshhand.b3d b/mods/PLAYER/mcl_meshhand/models/mcl_meshhand.b3d new file mode 100644 index 0000000000000000000000000000000000000000..a38124c60799c4b19b9260a94c712be38bfd7628 GIT binary patch literal 1023 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 z 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

lw zEG$7&1?GZX1ZD+8#tmT(0E;nzNr=VZXmkND!v%|mq~;dn7bWJvG~{OHp&5~znTM_@ z8|qzf)=SDP0n>@4DVg~YGeHwoU~VvI+CCK_?UY#pu^TK4??gj*Am2kA3FbQ?n;Q={ zn4v5)B{e@jDYFEe(ZI^kc)6JsNOGXvHF>Ey#S9Ropm2n+AO$N!dVT?<30{;8nv;kJ zYXz|rE8uL<0>soJh_c+$iueN1Hl7j$AFKyvEqJa8k{9y9E!?~mhLrq*f}GSMQ04&j zY(cpXR2PD)b?|UwNjzvIwg|N3K?}Ur55WfwU{!%TP#{)nMRE>k2}Dj}C8%M+07}m;%mo)^1v!bJ4KRh!vKqEblOeUD2pZhU znR%)CdEjAK1}M8cBeNtG#!1RaOwNXJ(i3xY6B)7!j3DYk3|OS4mV*W?AzKBNv$nv(+>-%rhBr~tKE7%IUesE-6@fGWPsB(RaG@!%=})N)RR z6t^jvxv6;|e}k42LY5R&Wafg)`+~$2Glq)dC||5;|wNHTvAk;44$>l zPX;aD2QBo3EH4CW%r8!4NGk#j8bU$?v>3QJF)g*Ek^wrX3vvdi=mrfmfto0Z$t9re z0J%vyrA6Sv8&m{WBo-GiRDuYoVe#OhwDiQ%V$e8BPJU5*Zh8qMRTbnHmp~F4hy~iR z0HTW%OBhlz!DTyhKoup(Ct!V`LI%tLE%JsA8iV--i7AE*1)0gvUL$ymAE;8#Er

i$FAJQV2wYCW}BcXrc&2gC>nY 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�FgS`fLQB#AxCY08K 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 q*0h7vg2I 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 L)z4*}Q$iB}xW6Em diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_black.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_black.png index a2b0bde56c4149c2962c4fc712f97b4d15ed6c20..91159c9d8ecb379971caba945c578c4df2e38721 100644 GIT binary patch literal 2975 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4rT@hhA$5${$yZaU@Q)DcVbv~PUa;80|QIC zqpu?a!^VE@KZ&di49pAxJ|V6kaRvrfW)^-127YcHaSjeKK|vV_2?b$64OwYTB{^d? zNi{_UU1cR54RvE(9dlg`QyncU6JuL5GY<<5CreXjTdOd8ja)goq5$1?4UNTib}e<~ zllwaMtn6ODX6fZ)8yQByXb23}5SZfE62id1$WRjG7yN%@1BT%5?5Ye544efXk;M!Q ze1}1p@p%4<6b1$csS?+SlHmNblJdl&REB`W%)AmkKi3e2GGjecJwrqH&raqH3~b*# zT^vIy;@-}Doiy7*pmlDU=YnTK1=rS1UiR|$eihsFG?fWEZk^5h|Dv0D7Gq|gn|MLd zi{0yVe(ziTde;8ZyXz;3-wfBDw9V*q)scsf+qJ*`?SB4ZBDY|>-woXbTAR*vEiw4q z;ZXbk-?;-)Cyw703Yf0C_?=ilt!(;&Q&*QXe3yU!!+~MRm%mSc6fthlv07mNOpUQ} z-uBRm&m;5rDoQv6oi11uRY(2Rc8$NOx5nsVEY_k+;H-^ z#FPiSB2tg0aO~i6mvl&37H_1lF7l?!;^*pZkHQ?|?Q9kG9PAb4)C5kiNL~jfld@1ic+UW{T=~oUwhNU@ax;RRoChd zPGk7+`Rm)|QLkh4!gg?~FNhTU@cMcagU#bLM|6Lz`w{10tG^&;)+fOgrbp#AOT3tx z7?)beapU{CpUV%rcU_*olr_Y2MxW*U#^np`{%v5{!F9!i@x{KHcLD}Iyn**~Ch=XW zQGU;mn#;!e;IBeL^nuXkEc?Uv&i&-sH(`z|gOwj+y2gj%hH8P``p2f+^!(v0|2s>f zAa=d}#mzyD4aFJ^*Ay74FLW_{i`piYB=mVRmaX!yCsnI&F)5XEG*9Z*Y^y zd-X9vw4m-bpMq;F>z4xVs+y9zwF2xtxdy!EUn}moi7+v)X^xp6Q4M4`L%np$@@r=gwhKwuIx7i5+A!KOmm86@kkI{G%>PhWpaJ`x$4n{s3hgZ4V5v(?vF=9FkI z>f>yXKAvFfZg$4^O;~a+hX%uBhSGnN82A{M>AiX*#_+AeZ4KvxDZFhCQisfZEBte~ zH4dk@8GP-D5Nr^f!6EU$HcVuRkmJu{mI6Mf0~LH8o_@FHmG3xiZo?t^B;^(7O_`<) z$viHJh)*p#+y|zex|^-z@GI$qoHkcb=R>B>VkPHoEG&{6ytQ{^%vWS^c3`|{bmzb& zMV(5gFqRLBhf)Q&5}eQ9-)DQ;S7F=tO15vQ2R?b#-?_2nqwT!LT1kT!{nE3|_8m9g zpusTFlzDNu(XXY33g(SB?md@`5KNGi;Jl#}^EKt1@FtCh`t8r%RQ}t3uu+`ou`Dk~ zVT)wmZQ)Hi2jUjyL~>`m_!-|Y*-YwY?f&D!i|+HPd)zPla#Zu4{QjqRk1e#`ef`Gg zmp$u`J!#25u_5t8_&!77m}8=@`3KF_Wd8Xym~^?6^WNHC5uo(2jrp+YhhT>5ZFidZ zUp>soz01mC;MP2EL4lRI?Cd4n?BDKkE^u1LVeV1J!YAZ+?OLn_;~yg~#uqOX8a%^9 zUsx3T+TY{13ukZ>HgsWN7nPpR_NjxRaJO`c$&qIlj@~cLdwhUR!$I1;QsZVMNB#z* z`_n46ZF}eRzqsq@IaB=)@$E6m9EU8|sph!ra8ww1s_yvup1pn>*A10N_6s9*cRH1P zs4Lg*+T{K)CHHRYZ|=^$W=xtNSPz)4Z+*B+zjDpm-4S=X{_9U_P*LFYU?PRuue0EN ZJ#&z4VbUcdcN0(}$J5o%Wt~$(69DkSTkHS; delta 1227 zcmbO)exGxKO1)ozPlzi61A~=`v6`ZSj)uB|u%L#lv^WO`KLdlQj+U;nlCiE13j+fy zGmDIbM6R4%yN1SMJG(tAyDuNxC?+V#&&}g(Yh`O@X0EHDsU+uQX?j)h<^=`@2F8*g zzhDN3XE)Lq7+CB*T^vIy823zinD^L#r&)ORl@legzyJByR~HFvzd6gAr=U1qfbo-j zt(dLv=NPYRQQ7}ae(^u>aUjDb(&42cc3`UIy zJ}+@MIJM`>(})8Z+eeXvCv)}pI@TYNVq9a`_-kfrM@O8o}YCXOIEffZZ%-#vc4jZw(KCHO^n$p=-Y zhG!;zJL9~QUqvJ_sfqob{714eH|o7W#*!mn8XR2K*#EG&#hD|hVd+|*&@Zjxae738O;Tfn4nt&Bd+?o%uo@|MoFX;xL(G&|%6XG3i`I%l(M=zHHH|0v!vYSOoLC z9?aUqb>_5D{oTCy%Zx&cTp5C%bKQC0&U8mf;N-_Q&(#7>yX~@J&HMgaKIu%s@`(~` zhvxmb?;#qH$Nc@De$}@Xvo|jit@pZ`_wz>H0;ypzf68>JTbeQU5=-(WY6AQK3Gr{}rPVci&`5rWH&Mf+vh$h%znlK2V<; zz`E}GXVw>L;3A7m{$k7$mgV z{6IC!f^e>i1>3uBhOjSAo_S?YoT!3BSr}uz?y*}rtC-pJEM`m&ZERrqEil7y_NxVN zJ|CQ-!!4jvFyA3MA$GxJhOUN{&VOsyeZ9;&fobl3jRuheyAD)s(m22n>cFp6f9UEj zmPR{Ho~{N9&jule_6CW`H(2k4dL_&|Sy=Sk{la?@2^sa*3!2}hi0%;4nei$iY>w)C zaR<>2^Xn@&F(@$JQ7zDvQ9sS#!+4Hq`h(ZMf1h?)dwue6^#zLiViJ5D_QW*&W~opR zn6ct()h3qjoEvnLw@uP{#K3$Y`k_#BPhwnO_U5T6g5_NLOdl7l-|x8R<-+3JZ4=H2 zxKFrJtCQ~KcS||pwZf#e`M2AaL=ZUOs;`WX#!UgZVeSJtmC-Gv(PCkA_>Hcp8@pmWME|5H|L2)R?mMIoE=8 zeog_;W+`3`!zsL13_^CN|CqthD5BsJ%h;UBtk`j_!JSp;`?0ytB+@6m*S^C0Znr{o z)kV37WjA7GS#P~1e%Zyh@~+o;gXHb*KmOZKl#Z$h67PC_u50bb^|lrQ3=9km0#EYy h9^eq=2C*3!8W=3(VtEUmulx?;d%F6$taD0e0sy%(|6c$A diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_brown.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_brown.png index 052df7452ff7ce024a8e0033ae1d13136e8aa465..2d1733af9a407fc20b97be919ef4cf31468a3ae4 100644 GIT binary patch literal 2994 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 Pvmm~wtDnm{r-UW|5L*~} diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_chest.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_chest.png deleted file mode 100644 index 400d8a1eb242b8b3a8838eb07897e9756b44b3c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg7G?$p219|G9}El(5&=FTt_%ze9u^u_I%Z~|-%AtZ9ajJ3`e8bKVtq$PN5>1#Q0|831qaS_tvbeh zx;%|>*KYqi9v$DZl3$&+d@mHVyY`k$C&LHU6eg~zt6 zp-ZPMmrqR$Q(bbO`SLwG9nk}?%~h7%V_rPXtf+D8WXA6a4%`jP%$;1Ip#K&7npU+P VZvT!3FfcGMc)I$ztaD0e0szIRXORE^ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_chestnut.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_chestnut.png index 4c646d861f458ad14afc12a8f150f56f1547cfd4..ef051a00971988055670e3d4ac825ac36afc0115 100644 GIT binary patch literal 2993 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 Kb6Mw<&;$VAU3ypm delta 1254 zcmdle{)=;hN_|LxPlzi614E~qZnTC}hM~gt>Zn6~d23QV7lzthUD0)NMtQxZdXKx2 zvXqRctZ=TJT)T$GVmrG%E4wcr+i0MoGA+cs&&TAn&??&&T z)|oqVZ70vy{HkZhD8SEHANA++7E^=Y(v5rk7u2{&9yfgD{!@`*@xd}i8P+YX2jm(h zqCe?Pa8CH67cl=a?~ZWUX6u{k0w#?K;tOI_&MK^&JF|}|LfJq$R+edLPV@JVxy&jI zn^!q3Q#-JngQ08X{F?pGy>3mgW;U2mY<+URpvR&=vP_OsJ*-*IaR;{|F=MZK)oom9Zl&c%7 zg_&e__%TGNB&apAPH^CS#Mcz8*Ag+QVVBB>Z{IdE6|(a(IsB=%ePi8m#?sG?LxG#Y zvtHrdf^d!rX+jem#dh3XC%%9+bj1=DrAl$z{T>VYo^*F?eU{A;aQ%;BfY+8Bfg@86 z*r>2Xmd`r2a3l8#)`liK&%K{wXJ|fO)3B|dY3>S@2~3;~cLVZVroXd{n(2I7HMZQt zsoq61S-fimv9XL$>EnskB z_{{YAxoIK2aPOf~`qT_^t57_t85RB8Mw?KRU=&9H$lAu{1} z^OwVS!VJGHJ)<&tMqq@{2l3i}MSq<2Wq${$O%i;>F)6CrvVKzWra6q>%z`?(kzy>l zohPLK3Un?0sOxZx$(Z3e%a@>8jou3?eK&s=dc4DgbH?56Ka#~>doucN{T)BSfH&l{ zN`g?wnH3rgTc1iYg}UFFz`DS*$A)E3VAy=^1~Fq52bMU`1fEdw?-gE)>f~?GJ0TUPlfEO~?0>lNs#ixhXq=DE6m-jZ z%2QvbUgX}&x-(!-dD-7RUeq diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_darkbrown.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_darkbrown.png index f1377f3f54b33f7a0ce26de694e430ad1407e4ee..5fa6dd45ad014b60fb9240b0f6e9954a92abca47 100644 GIT binary patch literal 2999 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 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_gray.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_gray.png index c2e0450fd19dac99104949e29b680958e73c9a8b..fb6c1c6b6560daba1c7b324ad44c2d946bab36bd 100644 GIT binary patch literal 2974 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4rT@hhA$5${$yZaU@Q)DcVbv~PUa;80|QIC zqpu?a!^VE@KZ&di49pAxJ|V6Q3=E=NtV-fS%2G0#N^-hNGRA6>1}ZA%x*8Vx8Wsk6 z9u^u-mZr|urY<%XVfGria&n%|HbnutzOIfTejd^O-YHR`S#i;Y>GACv8jJ1hTI$Lt z_jT-9*}Z)d4)ijf6|;?~o*z5hSujis@2qPDvWpX+%Q)0TxjeOnGDZt8FJE3yax821iy8 zPu7G(;jHGfWNdS{^k0o&n5NLCaC!p6em{!cLf2%8+wf5(yrX4jp5-&`J8ZPA&Q!v& zfNA>KQubyBCc!kOyvi50^~JB1Vw4%pSR&fg9OT@TQ=WM)KWlintHJPvdex~Cg@>0i zbC_nxSh2L8Wz2KgzA3mtrFrLrN9kc36b!#l;P(rVRk+*nGl}m~jrMzn z)Lb^!2Y(e3q7OtiXW1XVckU<8z6mj|3|4-O;Tj)`8>$6%>mQqP)APr|{#sL>9p|23 ze-XLT;ee?KL$*MJZH6mDwQe-8VgFZSpYLHO;C6$l#qzT(!Ts*{ zIo+8uDjDxIzYuh86x}Yn{ft!Nj+MuinJkXFG@L!;$nZ@eOw9S>vNH@Dc_Wm0%)eG_ z;Ii1C%RXVzI;N@}thTn6`@=ezkD1MAn_Xp-r_9yJaLrNAOH$-E>w^V_2iaL~SZv$i zVZEgDSsi29yaksTd7WDxFM23&m!(7Oo(p@nr|4D9LrVlh9&>)U#XlOTpO%14lQEN>Dcg5*}!|DE|bazj*BOBcHSttui&ui zbAE&o=UbBt-@^>HOzU2;Vc+4YODoTBVkldfD#peb*EHp)n(VDf!m*(d-pmW#XMJCj z(!eysZOhqTLMdlHXszFH?SqbMvZOCps({!(v=#eP6@5<3*5* ztT2Ol-@&TBoEfuktUY#1Ab>%Q@zozyMj0lb*ef@68Qy&Ci4Z=ZDb3Sp(vmyt!@L_} z0d41b5?@JfRANvz5HvVYy+*@BwdvD!jt4R=4IgDDOq#RB_I*KreuaS6iIZ1^H(9b= zG`b^Vu;B@3q*#OQ)ZN!38onHTU>hc~MCdT9&~ulz98M0Sgy~@g7xy_av^6j-O5M@8 z)H&i)%NmXc&Ml`EL=Lpg+h1QlZMH+s`_DXYPB%QA`fta^%*WL>%)gBiF36jk<<|74 zCj>GmWwW`hPx<1V?2yN_aqoHK4N3=$41_kg?s#=_j(SQU!~eYVy&nInA5=OjP4u~Y z!y&`?&NlUw$cDX6H#do0xbWGYK|R-G)9<=|b(j6peiQaRe$gGg$G-0L?q28e()Am! zpB9bpJ;{21LgL{E>uZwLcJyd>-D}GCvG_BSAycIDUDTHRj|*H5@v^sNKU~hRj&~=k z{FTEOZ|&mdNazu>b$nQqYi;H!&i7`wutTelVBUl`95O0%)~wxK!1NzK>%ZqB-E*_!9_;7ac}$?CIL7-%UxdJilu2F%ukZ8!%Msn+d8FQPb5v35 ziwA$-g^8s0A3Aw!7x#B@q3T?gpaT*5OXEL9M3-;eA^JaFh0)VNXaWlnmL}XelF{r5}E*Z!f?<4 delta 1226 zcmbOyevfm4O1*c0Plzi614BwwsEdt-udAblzJ{~4sjiZYlDJTapNFTjO|-waC>N`; zl#GReUap*6yN1SMJG(tAyDuNxXrQ7}m>!=M7j3Sqp{XS2WN8}5C3HlG@7~NT>nSD?U2uk>=cVXXQ zUJqY&g^9^bp5h+67<4E1G`xK~vr@mow231~PGH4W{&$aGZ(|g4a0z}9Uh+Yeso|N4 z-_AJiIOYW-KGw6*8<-- z)@P|R_vdY2|B`|8q7uW(V%B%xof-24JDya0D;8dnsvJ9yY5VWLW`7lr@s!_gOH_Cx z{9jgVjqlpB_y3m&^G|dWa670|U-;{6>B;7Vx@2SK*OnqIZ14Bqzjt2zfjQIl*W4^` zA{I=1oBV;rGa&xwAgx?$R)Afart z1Jx`G^u;$c?sMIy`?cBBFh}cpC?iu!x=6sr`d7K$e;b&EW1cM0GEg|Uk3~p`!$V=t zW>>FMOeKtW)Gu&dVco^8z>(q9{eNEa{}RR>4$t|y4zLD@uTXbo0opX=ov_Xj5w&bi{qe)fb$0q2jISNJz2P1_UC z5SZ|Lo_amE1Cv9n!uux{E4eSQ&S2GRKEHmw|N7#1|95vAru`^t+{*Z|i18fn2Zw|Q zrSG^sWzX?$xH=(0ab*$%d&AZPsX9eEpC|n`T{l6*aPbBO1Gz6h(+&2$T)6Z8Hm6C7 zeF`goYZ)u5Z+Aa%&(Wg#{`c6>`?gZO`#6r?dlP%ripiLvzn=5OLKEh4_s_f1j?eCY zd`~r@%-TrLc)z{If|X^zxrLTBW=XP~VVxo=s=2h!#(6>JQQ1I-SuW>e87?W_DrUV< z+s4AN+_70~io_wtEXh}AZEAcP8n^|N!Xgx8AJ|-!`mmxQ`I<#$+gH9#k&1E#vzv0> z9c^dH)1U2aym(dQlG)CmDyBSJc>LRh1N-lH-U&$b(-B!dxqI!g``;coFfcGMI8508 hl}R~72gGJzU|{kRh@N?N5^FGs@9FC2vd$@?2>@;k2ax~( diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_saddle.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_saddle.png deleted file mode 100644 index 873df1786befefa4b70eba1c625b3444fd784d5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 355 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 V%=;hG$-uzC;OXk;vd$@?2>?jPC*S}8 delta 1030 zcmcbjH<4q4WIZzj1H+dG6Mr%=F!%-dgt#&=Fg&|{_|oB3t7ou0T<*_sd@TqGwq&&jDxOKazfDchHHoIkKK*w?2pJL&zCD|Xg;W+rOE zo-WQd=BGAKmtbIEU@Qsp3ubV5b|Z~}fw|Dr#WAFU@yaFENkO^5~uUeZFl9@8gA=)~#naZKIzW zZ_ThZcjorbjOBZ#-=1{KK)_}9*K1kxre)~=|Gzjc%>QHirEseC)u*0bia zya{{o_%Scj%Y6qTt^V&USaZN)!@&nKOzCX-f47NADmcU{eyD472v4e=(cqDz@O5_M zE_T`Ohz$!(nC{Ab`R3hF$e(2JP5PbR4sV5T3zAvoQWEYo=j0ulA@tUgQ8mXSiY4fr z!?~|Bm{?A}V|inuT2QXs<$Zu{4U-hhCHs1oH&u5gGfMBf`-^Q?`5nJEehE_(L_0*w z7ChBbiTK+&H%jroz5UAB4Q1Rn%JdU<@8-^tS87OEy2LJ#r+K6Nif{#k@0=1Gj0f`E z9<*M`I>w;0tEUY;a)8jZ_EAQl^XFw}kC|ki+&%{LSxEZV#49 z29%%8uJ2%&q*-|0ZbI|6o3k5L3eVd;Sdbexld-0*w$@GY#qZ;jZ}Obs_W7?{G5vxoC3gel&Zu_e!#j9G`*TKlxaP(=Y2we%T#W>^u0FvF&8ff%E0I zXP>@&t}fQkE}<^FEpd}>6PHYXgF@z()aXY|Es{RF_7yaGuVhl?;bBNT5X9N*4 lGa~~71B1f<>uv#|5WrA;+uJ>L4_^*Q!qe5yWt~$(69Ax^$u9r^ diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_white.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_white.png index 8d67a79fbfce807f871e2bf6760c3d4706844473..264fffd26ff72c383c0a848945eba3a81595863c 100644 GIT binary patch literal 2904 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4rT@hhA$5${$yZaU@Q)DcVbv~PUa;80|QIC zqpu?a!^VE@KZ&di49pAxJ|V6Q3=GC1}dyZ{gczoB&%f~ie zJGu42@%axfA9;EI(xV!a29w( z7BevL9R^{>u zu&wuWaSW-5dpq-W(rgQX*0;w>H|^Xq!Q_Eh!M*>QH;dEUoP^4k@BX=1f8)iT#Ag{L zjOy+Gs`keG`ghBOH{SQMeo)v^|LjTI%s$r~x&52}`m5j8=PxSDtH`W7l*U*ZDsoL_ z>P&Z)SHG`^t6g)kdq1n;SyAG(vrMn%C$hc@^5v@d`>`vYqhZQEd)fDX4AWBCzbth>xl#(<#xd#(h8UcHrnj?wGka)AQ2<&SS}V*V9;jU}Wudh1k4!`$d#29>RA`)r;w zeDYqjUv+`ouT$YRi*#Rqdb(8O*0!}0anBi!&zZmI(;VjGp^Uq@lniwB{M=*1ei$xZ z&-LZ!QOVT67XnvwbLTRD5=`)&@jow@&)^~Ry7O&zQ-nK0e zV&qDbi5s84kbcG{ zAaJvViA7XFSG0jMKKxFG*Ox6jEr9f3s)H(wlJAdqbU1q zVHm^YeoKvmr5p8DT@)w~WfOHsn-;I7&u;QYxbV}`ZI8kn>np3B3Ai^S% z{&i|2gDlgE1IM53YIJ01Q`PGOBmz!q%}PS>UU0yF`hp^ndwVhgEV7S(mIxRyH~Gn@H{w`X$LcBol($%%b!0_ zj{47<&2(V>^5^kcy2VzJ$>M$v+Z7(1pD)R{<9K9u^atOcdmGZC4!mFY`!B~8spRdE zJYNnO=o?wHy!pMg`o#zBvmXy%;#sAlcYMnE19t=R>m!(AShHp^l*HHN3mEk92HsDZ z$S1UKa(aVzG8^lIp9)E_2O=kD*+0JL_mjtNLQMxl$s8uT1qaSEzH@xDPa;`O{UQI} zx2qEml-k`_{qDueWS7LafsOG-vlz>U>zl3$e2%bxT;%_=CzbI|vk>D3gNU?-D{On3 zl(W<%s%?JxNN_B8%38p`$eo8ZOv<|VjP|3F%~K{FF#)VsdAiUu=OBFs!%$RhvkFRl}Ad=NxKm0zHV?6kQDVNID#I)X!9`eZj-|+WVpo?BiH04>yMd`W~A%W3On0sDZ)r&PZVf)*Y8vJmPu4I+AvIJeqQ1My%+DezAg^`+ORv zI?wogM2F*nuZkSgFUc4GZf~!)XC57n4O}ct*E+&&XMQ?zhU-DEz=OV&aISm}m9CZ2(jB?W zqQ4(G!@a>>Bl;Q>)7}5f1s4`{-u)hJWBBWCLCY7}_xmi5{l2_>Pp!<8*Be-VDO_9B z%@+TuH}dW~mhvt;!y3N^7T1OA=N?VBlUr=QtXRDu*Moci4!-wduhl{rL?YOCYdc?3 zZOc}i%6Wh@NVc)LrTOSCPW6WP-6}~64X$RQA`ko?d=K4qDmSTlRZ-LC)on;LW!xKA*VLg|ZL`2L?sr{bH0?$7QTPy@x&)z4*}Q$iB}7iDRr delta 1168 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 HoD!M<>MeCz diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_mule.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_mule.png index 7b33b535e97f02cee4e56186ebee43a1ab63d21e..328018f5d49fed0c9b2e91a82182e965d0514821 100644 GIT binary patch literal 3094 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 Date: Thu, 31 May 2018 02:47:37 +0200 Subject: [PATCH 0089/1107] Fix light_damage damaging mobs in rain/snow --- mods/ENTITIES/mobs/api.lua | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/mods/ENTITIES/mobs/api.lua b/mods/ENTITIES/mobs/api.lua index 209ad79a..dfbf4205 100644 --- a/mods/ENTITIES/mobs/api.lua +++ b/mods/ENTITIES/mobs/api.lua @@ -93,6 +93,9 @@ local node_snowblock = "mcl_core:snowblock" local node_snow = "mcl_core:snow" mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "mcl_core:dirt" +local mod_weather = minetest.get_modpath("mcl_weather") ~= nil +local mod_tnt = minetest.get_modpath("mcl_tnt") ~= nil +local mod_mobspawners = minetest.get_modpath("mcl_mobspawners") ~= nil -- play sound local mob_sound = function(self, sound) @@ -616,16 +619,17 @@ local do_env_damage = function(self) -- bright light harms mob if self.light_damage ~= 0 --- and pos.y > 0 --- and self.time_of_day > 0.2 --- and self.time_of_day < 0.8 and (minetest.get_node_light(pos) or 0) > 12 then - self.health = self.health - self.light_damage + if not (mod_weather and (mcl_weather.rain.raining or mcl_weather.state == "snow") and mcl_weather.is_outdoor(pos)) then - effect(pos, 5, "tnt_smoke.png") + self.health = self.health - self.light_damage - if check_for_death(self, "light", {type = "light"}) then return end + effect(pos, 5, "tnt_smoke.png") + + if check_for_death(self, "light", {type = "light"}) then return end + + end end local y_level = self.collisionbox[2] @@ -647,7 +651,7 @@ local do_env_damage = function(self) local nodef = minetest.registered_nodes[self.standing_in] -- rain - if self.rain_damage and minetest.get_modpath("mcl_weather") then + if self.rain_damage and mod_weather then if mcl_weather.rain.raining and mcl_weather.is_outdoor(pos) then self.health = self.health - self.rain_damage @@ -1983,7 +1987,7 @@ local do_states = function(self, dtime) self.object:remove() - if minetest.get_modpath("mcl_tnt") and tnt and tnt.boom + if mod_tnt and tnt and tnt.boom and not minetest.is_protected(pos, "") then tnt.boom(pos, { @@ -3467,7 +3471,7 @@ end function mobs:boom(self, pos, radius) if mobs_griefing - and minetest.get_modpath("mcl_tnt") and tnt and tnt.boom + and mod_tnt and tnt and tnt.boom and not minetest.is_protected(pos, "") then tnt.boom(pos, { @@ -3583,7 +3587,7 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) minetest.chat_send_player(name, "You need the “maphack” privilege to change the mob spawner.") return itemstack end - if minetest.get_modpath("mcl_mobspawners") and under.name == "mcl_mobspawners:spawner" then + if mod_mobspawners and under.name == "mcl_mobspawners:spawner" then mcl_mobspawners.setup_spawner(pointed_thing.under, itemstack:get_name()) if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() @@ -3858,9 +3862,11 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) if tame then if self.tamed == false then + --[[ DISABLED IN MCL2 minetest.chat_send_player(clicker:get_player_name(), S("@1 has been tamed!", self.name:split(":")[2])) + ]] end self.tamed = true From 4513c6c35d2f992608db2f54f1b8a324a3bdbc63 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 May 2018 03:09:27 +0200 Subject: [PATCH 0090/1107] Undead mobs take light damage only in sunlight --- mods/ENTITIES/mobs/api.lua | 18 ++++++++++++------ mods/ENTITIES/mobs/api.txt | 3 ++- mods/ENTITIES/mobs_mc/skeleton+stray.lua | 2 +- mods/ENTITIES/mobs_mc/villager_zombie.lua | 2 +- mods/ENTITIES/mobs_mc/zombie.lua | 6 +++--- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/mods/ENTITIES/mobs/api.lua b/mods/ENTITIES/mobs/api.lua index dfbf4205..9cbfad4b 100644 --- a/mods/ENTITIES/mobs/api.lua +++ b/mods/ENTITIES/mobs/api.lua @@ -617,21 +617,26 @@ local do_env_damage = function(self) return end - -- bright light harms mob - if self.light_damage ~= 0 - and (minetest.get_node_light(pos) or 0) > 12 then + local deal_light_damage = function(self, pos, damage) if not (mod_weather and (mcl_weather.rain.raining or mcl_weather.state == "snow") and mcl_weather.is_outdoor(pos)) then - - self.health = self.health - self.light_damage + self.health = self.health - damage effect(pos, 5, "tnt_smoke.png") if check_for_death(self, "light", {type = "light"}) then return end - end end + -- bright light harms mob + if self.light_damage ~= 0 and (minetest.get_node_light(pos) or 0) > 12 then + deal_light_damage(self, pos, self.light_damage) + end + local _, dim = mcl_worlds.y_to_layer(pos.y) + if self.sunlight_damage ~= 0 and (minetest.get_node_light(pos) or 0) >= minetest.LIGHT_MAX and dim == "overworld" then + deal_light_damage(self, pos, self.sunlight_damage) + end + local y_level = self.collisionbox[2] if self.child then @@ -3017,6 +3022,7 @@ minetest.register_entity(name, { run_velocity = def.run_velocity or 2, damage = max(0, (def.damage or 0) * difficulty), 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 0, suffocation = def.suffocation or 2, diff --git a/mods/ENTITIES/mobs/api.txt b/mods/ENTITIES/mobs/api.txt index 75b2b98a..127cfcc1 100644 --- a/mods/ENTITIES/mobs/api.txt +++ b/mods/ENTITIES/mobs/api.txt @@ -209,7 +209,8 @@ functions needed for the mob to work properly which contains the following: '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 Node Replacement ---------------- diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index bd091319..dec08907 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -79,7 +79,7 @@ local skeleton = { }, water_damage = 1, lava_damage = 4, - light_damage = 1, + sunlight_damage = 1, view_range = 16, fear_height = 4, attack_type = "dogshoot", diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mobs_mc/villager_zombie.lua index 8d46c7eb..22e082c7 100644 --- a/mods/ENTITIES/mobs_mc/villager_zombie.lua +++ b/mods/ENTITIES/mobs_mc/villager_zombie.lua @@ -75,7 +75,7 @@ mobs:register_mob("mobs_mc:villager_zombie", { }, water_damage = 1, lava_damage = 5, - light_damage = 1, + sunlight_damage = 1, view_range = 16, fear_height = 5, diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index 9221ea90..eb99c18a 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -81,7 +81,7 @@ local zombie = { }, lava_damage = 4, -- TODO: Burn mob only when in direct sunlight - light_damage = 2, + sunlight_damage = 2, view_range = 16, attack_type = "dogfight", } @@ -96,7 +96,7 @@ baby_zombie.collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.94, 0.25} 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.light_damage = 0 +baby_zombie.sunlight_damage = 0 mobs:register_mob("mobs_mc:baby_zombie", baby_zombie) @@ -104,7 +104,7 @@ mobs:register_mob("mobs_mc:baby_zombie", baby_zombie) -- Desert variant of the zombie local husk = table.copy(zombie) husk.textures = {{"mobs_mc_husk.png"}} -husk.light_damage = 0 +husk.sunlight_damage = 0 husk.water_damage = 3 husk.drops = drops_common -- TODO: Husks avoid water From 91b41885d572c24548652fae89ea18662e6e05f4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 May 2018 03:17:41 +0200 Subject: [PATCH 0091/1107] Tweak blaze animation --- mods/ENTITIES/mobs_mc/blaze.lua | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index 3c68126d..0f847635 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -43,14 +43,15 @@ mobs:register_mob("mobs_mc:blaze", { max = 1,}, }, animation = { - stand_start = 1, - stand_end = 40, - walk_start = 1, - walk_end = 40, - run_start = 1, - run_end = 40, - shoot_start = 1, - shoot_end = 40, + 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, From 55beefa6c7638a3a0039cd4782ff7134e753cb86 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 May 2018 03:43:48 +0200 Subject: [PATCH 0092/1107] Fix wool regrow for sheep --- mods/ENTITIES/mobs_mc/sheep.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index 8f56f7b4..b7857f82 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -94,6 +94,8 @@ mobs:register_mob("mobs_mc:sheep", { 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 = mobs_mc.items.mutton_raw, chance = 1, From 97e550bb9fc56649bc6b91f41dc4a4182003f77e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 May 2018 03:45:38 +0200 Subject: [PATCH 0093/1107] Can't shear lambs --- mods/ENTITIES/mobs_mc/sheep.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index b7857f82..96734fd5 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -154,7 +154,7 @@ mobs:register_mob("mobs_mc:sheep", { if mobs:feed_tame(self, clicker, 1, true, true) then return end if mobs:protect(self, clicker) then return end - if item:get_name() == mobs_mc.items.shears and not self.gotten then + if item:get_name() == mobs_mc.items.shears and not self.gotten and not self.child then self.gotten = true local pos = self.object:getpos() minetest.sound_play("shears", {pos = pos}) From e246b5d0bba3489051351c692aee2b575a7d0311 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 May 2018 04:38:37 +0200 Subject: [PATCH 0094/1107] Fix breeding giving weird childs --- mods/ENTITIES/mobs/api.lua | 12 +++++++++--- mods/ENTITIES/mobs_mc/horse.lua | 11 ++++++++++- mods/ENTITIES/mobs_mc/sheep.lua | 16 ++++++++++++++++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mobs/api.lua b/mods/ENTITIES/mobs/api.lua index 9cbfad4b..95ef5d47 100644 --- a/mods/ENTITIES/mobs/api.lua +++ b/mods/ENTITIES/mobs/api.lua @@ -988,10 +988,16 @@ local breed = function(self) local ent_c = child:get_luaentity() - -- Use parent's texture - local textures = self.base_texture + + -- Use texture of one of the parents + local p = math.random(1, 2) + if p == 1 then + ent_c.base_texture = self.base_texture + else + ent_c.base_texture = ent.base_texture + end child:set_properties({ - textures = textures, + textures = ent_c.base_texture }) -- tamed and owned by parents' owner diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 9aa5a161..32f010c9 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -261,7 +261,16 @@ local horse = { on_breed = function(parent1, parent2) local pos = parent1.object:get_pos() - if mobs:spawn_child(pos, parent1.name) then + local child = mobs:spawn_child(pos, parent1.name) + if child then + local ent_c = child:get_luaentity() + 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}) return false end end, diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index 96734fd5..fa419737 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -206,6 +206,22 @@ mobs:register_mob("mobs_mc:sheep", { end if mobs:capture_mob(self, clicker, 0, 5, 70, false, nil) then return end end, + on_breed = function(parent1, parent2) + local pos = parent1.object:get_pos() + local child = mobs:spawn_child(pos, parent1.name) + if child then + local ent_c = child:get_luaentity() + local p = math.random(1, 2) + if p == 1 then + ent_c.base_texture = sheep_texture(parent1.color) + else + ent_c.base_texture = sheep_texture(parent2.color) + end + child:set_properties({textures = ent_c.base_texture}) + ent_c.initial_color_set = true + return false + end + end, }) mobs:spawn_specific("mobs_mc:sheep", mobs_mc.spawn.grassland, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15000, 3, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) From aeee941b2c33968790819fac18c7d4c198222a77 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 May 2018 05:45:57 +0200 Subject: [PATCH 0095/1107] Breeding sheep now mixes wool colors like dyes --- mods/ENTITIES/mobs_mc/sheep.lua | 39 ++++++++++++++++++++++++++++----- mods/ITEMS/mcl_dye/init.lua | 22 +++++++++++++++---- 2 files changed, 52 insertions(+), 9 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index fa419737..9f6d95e8 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -207,15 +207,44 @@ mobs:register_mob("mobs_mc:sheep", { if 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 = mobs:spawn_child(pos, parent1.name) if child then local ent_c = child:get_luaentity() - local p = math.random(1, 2) - if p == 1 then - ent_c.base_texture = sheep_texture(parent1.color) - else - ent_c.base_texture = sheep_texture(parent2.color) + 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.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 then + ent_c.base_texture = sheep_texture(color1) + else + ent_c.base_texture = sheep_texture(color2) + end end child:set_properties({textures = ent_c.base_texture}) ent_c.initial_color_set = true diff --git a/mods/ITEMS/mcl_dye/init.lua b/mods/ITEMS/mcl_dye/init.lua index 1c78cbae..5d0f871e 100644 --- a/mods/ITEMS/mcl_dye/init.lua +++ b/mods/ITEMS/mcl_dye/init.lua @@ -13,11 +13,11 @@ -- recipe = {':item_no_color', 'group:basecolor_yellow'}, -- }) --- Other mods can use these for looping through available colors mcl_dye = {} -local dye = {} -dye.basecolors = {"white", "grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta"} -dye.excolors = {"white", "lightgrey", "grey", "darkgrey", "black", "red", "orange", "yellow", "lime", "green", "aqua", "cyan", "sky_blue", "blue", "violet", "magenta", "red_violet"} + +-- 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 @@ -82,6 +82,20 @@ dyelocal.dyes = { {"pink", "Pink Dye", {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_light_red=1}}, } +dyelocal.unicolor_to_dye_id = {} +for d=1, #dyelocal.dyes do + for k, _ in pairs(dyelocal.dyes[d][3]) 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. +mcl_dye.unicolor_to_dye = function(unicolor_group) + return "mcl_dye:" .. dyelocal.unicolor_to_dye_id[unicolor_group] +end + -- Define items for _, row in ipairs(dyelocal.dyes) do local name = row[1] From 73dcf1e6970389b0aba306aab30c0cf6a567e83d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 May 2018 14:05:45 +0200 Subject: [PATCH 0096/1107] Randomly mutate foal fur/mark with 1/9 chance each --- mods/ENTITIES/mobs_mc/horse.lua | 52 ++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 32f010c9..82d45520 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -61,18 +61,22 @@ local horse_base = { -- 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 + "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 - horse_base[b] .. horse_markings[m], -- base texture + markings and optional armor + fur, -- base texture + markings and optional armor "blank.png", -- saddle }) end @@ -265,11 +269,45 @@ local horse = { 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 - ent_c.base_texture = parent1.base_texture + if parent1._naked_texture then + child_texture = parent1._naked_texture + else + child_texture = parent1.base_texture[2] + end else - ent_c.base_texture = parent2.base_texture + 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 From d5729b8a325102a839869d04cdd2491ff2327cff Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 May 2018 14:34:19 +0200 Subject: [PATCH 0097/1107] Fix load-crash if _magnet_timer of item entity is uninizialized --- mods/ENTITIES/mcl_item_entity/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index ef3f6c17..f3e02a0c 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -61,7 +61,7 @@ minetest.register_globalstep(function(dtime) --magnet and collection for _,object in ipairs(minetest.get_objects_inside_radius(checkpos, item_drop_settings.radius_magnet)) do - if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" and (object:get_luaentity()._insta_collect or (object:get_luaentity().age > item_drop_settings.age)) then + if not object:is_player() 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 object:get_luaentity()._magnet_timer = object:get_luaentity()._magnet_timer + dtime local collected = false 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 From 2f0987b52988a7d1cd0b29d475a6e6a55e003d62 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 May 2018 15:13:16 +0200 Subject: [PATCH 0098/1107] Move mcl_void_damage to ENVIRONMENT --- mods/{ENTITIES => ENVIRONMENT}/mcl_void_damage/depends.txt | 0 mods/{ENTITIES => ENVIRONMENT}/mcl_void_damage/description.txt | 0 mods/{ENTITIES => ENVIRONMENT}/mcl_void_damage/init.lua | 0 mods/{ENTITIES => ENVIRONMENT}/mcl_void_damage/mod.conf | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename mods/{ENTITIES => ENVIRONMENT}/mcl_void_damage/depends.txt (100%) rename mods/{ENTITIES => ENVIRONMENT}/mcl_void_damage/description.txt (100%) rename mods/{ENTITIES => ENVIRONMENT}/mcl_void_damage/init.lua (100%) rename mods/{ENTITIES => ENVIRONMENT}/mcl_void_damage/mod.conf (100%) diff --git a/mods/ENTITIES/mcl_void_damage/depends.txt b/mods/ENVIRONMENT/mcl_void_damage/depends.txt similarity index 100% rename from mods/ENTITIES/mcl_void_damage/depends.txt rename to mods/ENVIRONMENT/mcl_void_damage/depends.txt diff --git a/mods/ENTITIES/mcl_void_damage/description.txt b/mods/ENVIRONMENT/mcl_void_damage/description.txt similarity index 100% rename from mods/ENTITIES/mcl_void_damage/description.txt rename to mods/ENVIRONMENT/mcl_void_damage/description.txt diff --git a/mods/ENTITIES/mcl_void_damage/init.lua b/mods/ENVIRONMENT/mcl_void_damage/init.lua similarity index 100% rename from mods/ENTITIES/mcl_void_damage/init.lua rename to mods/ENVIRONMENT/mcl_void_damage/init.lua diff --git a/mods/ENTITIES/mcl_void_damage/mod.conf b/mods/ENVIRONMENT/mcl_void_damage/mod.conf similarity index 100% rename from mods/ENTITIES/mcl_void_damage/mod.conf rename to mods/ENVIRONMENT/mcl_void_damage/mod.conf From c55714ea0cfd91b5163a7066644ef6cb3c4a82f9 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 May 2018 15:18:48 +0200 Subject: [PATCH 0099/1107] Reduce dependencies of mcl_anvils --- mods/ITEMS/mcl_anvils/depends.txt | 4 +--- mods/ITEMS/mcl_anvils/init.lua | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/mods/ITEMS/mcl_anvils/depends.txt b/mods/ITEMS/mcl_anvils/depends.txt index 2e713259..021df7cb 100644 --- a/mods/ITEMS/mcl_anvils/depends.txt +++ b/mods/ITEMS/mcl_anvils/depends.txt @@ -1,6 +1,4 @@ mcl_init mcl_sounds -mcl_core -mcl_hunger -mcl_death_messages +mcl_core? screwdriver? diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index f27ee247..78db3ba9 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -443,14 +443,16 @@ minetest.register_node("mcl_anvils:anvil", anvildef0) minetest.register_node("mcl_anvils:anvil_damage_1", anvildef1) minetest.register_node("mcl_anvils:anvil_damage_2", anvildef2) -minetest.register_craft({ - output = "mcl_anvils:anvil", - recipe = { - { "mcl_core:ironblock", "mcl_core:ironblock", "mcl_core:ironblock" }, - { "", "mcl_core:iron_ingot", "" }, - { "mcl_core:iron_ingot", "mcl_core:iron_ingot", "mcl_core:iron_ingot" }, - } -}) +if minetest.get_modpath("mcl_core") then + minetest.register_craft({ + output = "mcl_anvils:anvil", + recipe = { + { "mcl_core:ironblock", "mcl_core:ironblock", "mcl_core:ironblock" }, + { "", "mcl_core:iron_ingot", "" }, + { "mcl_core:iron_ingot", "mcl_core:iron_ingot", "mcl_core:iron_ingot" }, + } + }) +end if minetest.get_modpath("doc") then doc.add_entry_alias("nodes", "mcl_anvils:anvil", "nodes", "mcl_anvils:anvil_damage_1") From 9afe5da7b4bdc588bc2151bfab3f0e111bcd5906 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 May 2018 17:32:13 +0200 Subject: [PATCH 0100/1107] Make sure bred pig and sheep stay tamed and owned --- mods/ENTITIES/mobs_mc/pig.lua | 6 +++++- mods/ENTITIES/mobs_mc/sheep.lua | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index fede3f11..d5228a2b 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -171,7 +171,11 @@ mobs:register_mob("mobs_mc:pig", { on_breed = function(parent1, parent2) local pos = parent1.object:get_pos() - if mobs:spawn_child(pos, parent1.name) then + local child = 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, diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index 9f6d95e8..331d80c2 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -248,6 +248,8 @@ mobs:register_mob("mobs_mc:sheep", { 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, From 4be664ab49a2d7285de2eece257b0f952a24fd4d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 May 2018 17:54:35 +0200 Subject: [PATCH 0101/1107] Rebranding of the mobs redo mod --- mods/ENTITIES/mobs/api.lua | 258 +---------------------------------- mods/ENTITIES/mobs/api.txt | 34 ++--- mods/ENTITIES/mobs/readme.MD | 13 +- 3 files changed, 24 insertions(+), 281 deletions(-) diff --git a/mods/ENTITIES/mobs/api.lua b/mods/ENTITIES/mobs/api.lua index 95ef5d47..ec2dfb1f 100644 --- a/mods/ENTITIES/mobs/api.lua +++ b/mods/ENTITIES/mobs/api.lua @@ -1,9 +1,9 @@ --- Mobs Api +-- API for Mobs Redo: MineClone 2 Edition (MRM) mobs = {} -mobs.mod = "redo" -mobs.version = "20180523" +mobs.mod = "mrm" +mobs.version = "20180531" -- don't rely too much on this, rarely updated, if ever local MAX_MOB_NAME_LENGTH = 30 @@ -354,24 +354,6 @@ end local update_tag = function(self) - --DISABLED IN MCL2 - --[=[ - local col = "#00FF00" - local qua = self.hp_max / 4 - - if self.health <= floor(qua * 3) then - col = "#FFFF00" - end - - if self.health <= floor(qua * 2) then - col = "#FF6600" - end - - if self.health <= floor(qua) then - col = "#FF0000" - end - ]=] - self.object:set_properties({ nametag = self.nametag, }) @@ -3519,55 +3501,6 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) "^[mask:mobs_chicken_egg_overlay.png)" end - -- register new spawn egg containing mob information - --[=[ DISABLED IN MCL2 - minetest.register_craftitem(mob .. "_set", { - - description = S("@1 (Tamed)", desc), - inventory_image = invimg, - groups = {spawn_egg = 2, not_in_creative_inventory = 1}, - stack_max = 1, - - 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 - - if not minetest.registered_entities[mob] then - return - end - - pos.y = pos.y + 1 - - local data = itemstack:get_metadata() - local mob = minetest.add_entity(pos, mob, data) - local ent = mob:get_luaentity() - - -- set owner if not a monster - if ent.type ~= "monster" then - ent.owner = placer:get_player_name() - ent.tamed = true - end - - -- since mob is unique we remove egg once spawned - itemstack:take_item() - end - - return itemstack - end, - }) - ]=] - -- register old stackable mob egg minetest.register_craftitem(mob, { @@ -3646,127 +3579,10 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) end --- capture critter (thanks to blert2112 for idea) +-- No-op in MCL2 (capturing mobs is not possible). +-- Provided for compability with Mobs Redo function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, force_take, replacewith) return false ---[=[ DISABLED IN MCL2 - if self.child - or not clicker:is_player() - or not clicker:get_inventory() then - return false - end - - -- get name of clicked mob - local mobname = self.name - - -- if not nil change what will be added to inventory - if replacewith then - mobname = replacewith - end - - local name = clicker:get_player_name() - local tool = clicker:get_wielded_item() - - -- are we using hand, net or lasso to pick up mob? - if tool:get_name() ~= "" - and tool:get_name() ~= "mobs:net" - and tool:get_name() ~= "mobs:lasso" then - return false - end - - -- is mob tamed? - if self.tamed == false - and force_take == false then - - minetest.chat_send_player(name, S("Not tamed!")) - - return true -- false - end - - -- cannot pick up if not owner - if self.owner ~= name - and force_take == false then - - minetest.chat_send_player(name, S("@1 is owner!", self.owner)) - - return true -- false - end - - if clicker:get_inventory():room_for_item("main", mobname) then - - -- was mob clicked with hand, net, or lasso? - local chance = 0 - - if tool:get_name() == "" then - chance = chance_hand - - elseif tool:get_name() == "mobs:net" then - - chance = chance_net - - tool:add_wear(4000) -- 17 uses - - clicker:set_wielded_item(tool) - - elseif tool:get_name() == "mobs:lasso" then - - chance = chance_lasso - - tool:add_wear(650) -- 100 uses - - clicker:set_wielded_item(tool) - - end - - -- calculate chance.. add to inventory if successful? - if chance > 0 and random(1, 100) <= chance then - - -- default mob egg - local new_stack = ItemStack(mobname) - - -- add special mob egg with all mob information - -- unless 'replacewith' contains new item to use - if not replacewith then - - new_stack = ItemStack(mobname .. "_set") - - local tmp = {} - - for _,stat in pairs(self) do - local t = type(stat) - if t ~= "function" - and t ~= "nil" - and t ~= "userdata" then - tmp[_] = self[_] - end - end - - local data_str = minetest.serialize(tmp) - - new_stack:set_metadata(data_str) - end - - local inv = clicker:get_inventory() - - if inv:room_for_item("main", new_stack) then - inv:add_item("main", new_stack) - else - minetest.add_item(clicker:get_pos(), new_stack) - end - - self.object:remove() - - mob_sound(self, "default_place_node_hard") - - elseif chance ~= 0 then - minetest.chat_send_player(name, S("Missed!")) - - mob_sound(self, "mobs_swing") - end - end - - return true -]=] end @@ -3837,12 +3653,6 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) self.health = self.hp_max if self.htimer < 1 then - -- DISABLED IN MCL2 - --[=[ - minetest.chat_send_player(clicker:get_player_name(), - S("@1 at full health (@2)", - self.name:split(":")[2], tostring(self.health))) - ]=] self.htimer = 5 end end @@ -3873,14 +3683,6 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) if tame then - if self.tamed == false then - --[[ DISABLED IN MCL2 - minetest.chat_send_player(clicker:get_player_name(), - S("@1 has been tamed!", - self.name:split(":")[2])) - ]] - end - self.tamed = true if not self.owner or self.owner == "" then @@ -3945,56 +3747,6 @@ function mobs:spawn_child(pos, mob_type) end --- DISABLED IN MCL2 ---[=[ --- inspired by blockmen's nametag mod -minetest.register_on_player_receive_fields(function(player, formname, fields) - - -- right-clicked with nametag and name entered? - if formname == "mobs_nametag" - and fields.name - and fields.name ~= "" then - - local name = player:get_player_name() - - if not mob_obj[name] - or not mob_obj[name].object then - return - end - - -- make sure nametag is being used to name mob - local item = player:get_wielded_item() - - if item:get_name() ~= "mobs:nametag" then - return - end - - -- limit name entered to 64 characters long - if string.len(fields.name) > 64 then - fields.name = string.sub(fields.name, 1, 64) - end - - -- update nametag - mob_obj[name].nametag = fields.name - - update_tag(mob_obj[name]) - - -- if not in creative then take item - if not mobs.is_creative(name) then - - mob_sta[name]:take_item() - - player:set_wielded_item(mob_sta[name]) - end - - -- reset external variables - mob_obj[name] = nil - mob_sta[name] = nil - end -end) -]=] - - -- compatibility function for old entities to new modpack entities function mobs:alias_mob(old_name, new_name) diff --git a/mods/ENTITIES/mobs/api.txt b/mods/ENTITIES/mobs/api.txt index 127cfcc1..814b28ad 100644 --- a/mods/ENTITIES/mobs/api.txt +++ b/mods/ENTITIES/mobs/api.txt @@ -1,8 +1,9 @@ -Mobs Redo API -============= +Mobs Redo: MineClone 2 Edition +API documentation +============================== -Welcome to the world of mobs in minetest and hopefully an easy guide to defining +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. @@ -437,27 +438,20 @@ and damages any entity caught inside the blast radius. Protection will limit node destruction but not entity damage. -Capturing Mobs --------------- +mobs:capture_mob +---------------- -mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, - force_take, replacewith) +mobs:capture_mob(...) -This function is generally called inside the on_rightclick section of the mob -api code, it provides a chance of capturing the mob by hand, using the net or -lasso items, and can also have the player take the mob by force if tamed and -replace with another item entirely. +Does nothing and returns false. - 'self' mob information - 'clicker' player information - 'chance_hand' chance of capturing mob by hand (1 to 100) 0 to disable - 'chance_net' chance of capturing mob using net (1 to 100) 0 to disable - 'chance_lasso' chance of capturing mob using magic lasso (1 to 100) 0 to - disable - 'force_take' take mob by force, even if tamed (true or false) - 'replacewith' once captured replace mob with this item instead (overrides - new mob eggs with saved information) +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 --------------------------- diff --git a/mods/ENTITIES/mobs/readme.MD b/mods/ENTITIES/mobs/readme.MD index 68b03e70..5296f4c1 100644 --- a/mods/ENTITIES/mobs/readme.MD +++ b/mods/ENTITIES/mobs/readme.MD @@ -1,6 +1,7 @@ -MOBS REDO for MINETEST +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. @@ -10,18 +11,14 @@ This mod contains the API only for adding your own mobs into the world, so pleas https://forum.minetest.net/viewtopic.php?f=11&t=9917 -Crafts: +Items: - - Nametag (paper, black dye, string) can be used right-click on a tamed mob to give them a name. - - Nets can be used to right-click tamed mobs to pick them up and place inside inventory as a spawn egg. - - Magic Lasso is similar to nets but with a better chance of picking up larger mobs. - - Shears are used to right-click sheep and return 1-3 wool. - - Protection Rune lets you protect tamed mobs from harm by other players +- Nametag (paper, black dye, string) can be used right-click on a tamed mob to give them a name. Lucky Blocks: 9 -Changelog: +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 From dafba9a07c4d7549709a3826f706fe123d6832a0 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 May 2018 18:04:07 +0200 Subject: [PATCH 0102/1107] Update global API.md wrt MRM --- API.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/API.md b/API.md index 36773444..0a06eb80 100644 --- a/API.md +++ b/API.md @@ -40,11 +40,18 @@ A lot of things are possible by using one of the APIs in the mods. Note that not ## Mobs * Mobs: `ENTITIES/mods` -MineClone 2 uses Mobs Redo [`mobs`] by TenPlus1, a very powerful mod for adding mods of various types. -There are modificiations from the original mod for MineClone 2 compability. Some items have been removed or moved to other mods, but the API is identical. +MineClone 2 uses its own mobs framework, called “Mobs Redo: MineClone 2 Edition” or “MRM” for short. +This is a fork of Mobs Redo [`mobs`] by TenPlus1. + You can add your own mobs, spawn eggs and spawning rules with this mod. API documnetation is included in `ENTITIES/mobs/api.txt`. +This mod includes modificiations from the original Mobs Redo. Some items have been removed or moved to other mods. +The API is mostly identical, but a few features have been added. Compability is not really a goal, +but function and attribute names of Mobs Redo 1.41 are kept. +If you have code for a mod which works fine under Mobs Redo, it should be easy to make it work in MineClone 2, +chances are good that it works out of the box. + ### Help * Item help texts: `HELP/doc/doc_items` * Low-level help entry and category framework: `HELP/doc/doc` From 34e92a361b6b3c876b12fe038beeb1221c4f1f45 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 May 2018 18:32:26 +0200 Subject: [PATCH 0103/1107] Rename mobs mod to mcl_mobs --- API.md | 4 ++-- mods/ENTITIES/{mobs => mcl_mobs}/api.lua | 2 +- mods/ENTITIES/{mobs => mcl_mobs}/api.txt | 0 mods/ENTITIES/{mobs => mcl_mobs}/crafts.lua | 2 +- mods/ENTITIES/{mobs => mcl_mobs}/depends.txt | 0 mods/ENTITIES/mcl_mobs/description.txt | 1 + mods/ENTITIES/mcl_mobs/init.lua | 13 +++++++++++++ mods/ENTITIES/{mobs => mcl_mobs}/intllib.lua | 0 mods/ENTITIES/{mobs => mcl_mobs}/license.txt | 0 mods/ENTITIES/{mobs => mcl_mobs}/locale/de_DE.po | 0 mods/ENTITIES/{mobs => mcl_mobs}/locale/es.po | 0 mods/ENTITIES/{mobs => mcl_mobs}/locale/fr.po | 0 mods/ENTITIES/{mobs => mcl_mobs}/locale/it.po | 0 mods/ENTITIES/{mobs => mcl_mobs}/locale/ms.po | 0 mods/ENTITIES/{mobs => mcl_mobs}/locale/pt.po | 0 mods/ENTITIES/{mobs => mcl_mobs}/locale/ru.po | 0 .../{mobs => mcl_mobs}/locale/template.pot | 0 mods/ENTITIES/{mobs => mcl_mobs}/locale/tr.po | 0 mods/ENTITIES/mcl_mobs/lucky_block.lua | 8 ++++++++ mods/ENTITIES/mcl_mobs/mod.conf | 1 + mods/ENTITIES/{mobs => mcl_mobs}/mount.lua | 0 mods/ENTITIES/{mobs => mcl_mobs}/readme.MD | 2 +- .../{mobs => mcl_mobs}/sounds/default_punch.ogg | Bin .../{mobs => mcl_mobs}/textures/mobs_blood.png | Bin .../{mobs => mcl_mobs}/textures/mobs_nametag.png | Bin mods/ENTITIES/mobs/description.txt | 1 - mods/ENTITIES/mobs/init.lua | 13 ------------- mods/ENTITIES/mobs/lucky_block.lua | 15 --------------- mods/ENTITIES/mobs/mod.conf | 1 - mods/ENTITIES/mobs_mc/depends.txt | 6 +++--- mods/ENTITIES/mobs_mc/description.txt | 2 +- mods/ENTITIES/mobs_mc/init.lua | 2 +- mods/ITEMS/mcl_fishing/depends.txt | 1 + mods/ITEMS/mcl_fishing/init.lua | 2 +- mods/ITEMS/mcl_mobspawners/depends.txt | 2 +- mods/MAPGEN/mcl_dungeons/depends.txt | 1 + mods/MAPGEN/mcl_dungeons/init.lua | 2 +- mods/MAPGEN/tsm_railcorridors/gameconfig.lua | 2 +- 38 files changed, 39 insertions(+), 44 deletions(-) rename mods/ENTITIES/{mobs => mcl_mobs}/api.lua (99%) rename mods/ENTITIES/{mobs => mcl_mobs}/api.txt (100%) rename mods/ENTITIES/{mobs => mcl_mobs}/crafts.lua (89%) rename mods/ENTITIES/{mobs => mcl_mobs}/depends.txt (100%) create mode 100644 mods/ENTITIES/mcl_mobs/description.txt create mode 100644 mods/ENTITIES/mcl_mobs/init.lua rename mods/ENTITIES/{mobs => mcl_mobs}/intllib.lua (100%) rename mods/ENTITIES/{mobs => mcl_mobs}/license.txt (100%) rename mods/ENTITIES/{mobs => mcl_mobs}/locale/de_DE.po (100%) rename mods/ENTITIES/{mobs => mcl_mobs}/locale/es.po (100%) rename mods/ENTITIES/{mobs => mcl_mobs}/locale/fr.po (100%) rename mods/ENTITIES/{mobs => mcl_mobs}/locale/it.po (100%) rename mods/ENTITIES/{mobs => mcl_mobs}/locale/ms.po (100%) rename mods/ENTITIES/{mobs => mcl_mobs}/locale/pt.po (100%) rename mods/ENTITIES/{mobs => mcl_mobs}/locale/ru.po (100%) rename mods/ENTITIES/{mobs => mcl_mobs}/locale/template.pot (100%) rename mods/ENTITIES/{mobs => mcl_mobs}/locale/tr.po (100%) create mode 100644 mods/ENTITIES/mcl_mobs/lucky_block.lua create mode 100644 mods/ENTITIES/mcl_mobs/mod.conf rename mods/ENTITIES/{mobs => mcl_mobs}/mount.lua (100%) rename mods/ENTITIES/{mobs => mcl_mobs}/readme.MD (98%) rename mods/ENTITIES/{mobs => mcl_mobs}/sounds/default_punch.ogg (100%) rename mods/ENTITIES/{mobs => mcl_mobs}/textures/mobs_blood.png (100%) rename mods/ENTITIES/{mobs => mcl_mobs}/textures/mobs_nametag.png (100%) delete mode 100644 mods/ENTITIES/mobs/description.txt delete mode 100644 mods/ENTITIES/mobs/init.lua delete mode 100644 mods/ENTITIES/mobs/lucky_block.lua delete mode 100644 mods/ENTITIES/mobs/mod.conf diff --git a/API.md b/API.md index 0a06eb80..354a99f6 100644 --- a/API.md +++ b/API.md @@ -38,13 +38,13 @@ A lot of things are possible by using one of the APIs in the mods. Note that not * Dispenser support: `ITEMS/REDSTONE/mcl_dispensers` ## Mobs -* Mobs: `ENTITIES/mods` +* Mobs: `ENTITIES/mcl_mods` MineClone 2 uses its own mobs framework, called “Mobs Redo: MineClone 2 Edition” or “MRM” for short. This is a fork of Mobs Redo [`mobs`] by TenPlus1. You can add your own mobs, spawn eggs and spawning rules with this mod. -API documnetation is included in `ENTITIES/mobs/api.txt`. +API documnetation is included in `ENTITIES/mcl_mobs/api.txt`. This mod includes modificiations from the original Mobs Redo. Some items have been removed or moved to other mods. The API is mostly identical, but a few features have been added. Compability is not really a goal, diff --git a/mods/ENTITIES/mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua similarity index 99% rename from mods/ENTITIES/mobs/api.lua rename to mods/ENTITIES/mcl_mobs/api.lua index ec2dfb1f..d4fd8924 100644 --- a/mods/ENTITIES/mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -2944,7 +2944,7 @@ 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() == "mobs:nametag" then + if not self.ignores_nametag and item:get_name() == "mcl_mobs:nametag" then local tag = item:get_meta():get_string("name") if tag ~= "" then diff --git a/mods/ENTITIES/mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt similarity index 100% rename from mods/ENTITIES/mobs/api.txt rename to mods/ENTITIES/mcl_mobs/api.txt diff --git a/mods/ENTITIES/mobs/crafts.lua b/mods/ENTITIES/mcl_mobs/crafts.lua similarity index 89% rename from mods/ENTITIES/mobs/crafts.lua rename to mods/ENTITIES/mcl_mobs/crafts.lua index cb0c9da6..3422f382 100644 --- a/mods/ENTITIES/mobs/crafts.lua +++ b/mods/ENTITIES/mcl_mobs/crafts.lua @@ -2,7 +2,7 @@ local S = mobs.intllib -- name tag -minetest.register_craftitem("mobs:nametag", { +minetest.register_craftitem("mcl_mobs:nametag", { description = S("Name Tag"), _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. Now you can use the name tag to name a mob with a rightclick. This uses up the name tag."), diff --git a/mods/ENTITIES/mobs/depends.txt b/mods/ENTITIES/mcl_mobs/depends.txt similarity index 100% rename from mods/ENTITIES/mobs/depends.txt rename to mods/ENTITIES/mcl_mobs/depends.txt diff --git a/mods/ENTITIES/mcl_mobs/description.txt b/mods/ENTITIES/mcl_mobs/description.txt new file mode 100644 index 00000000..a426a100 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/description.txt @@ -0,0 +1 @@ +Adds a mob API for mods to add animals or monsters, etc. diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua new file mode 100644 index 00000000..87e7c19b --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -0,0 +1,13 @@ + +local path = minetest.get_modpath(minetest.get_current_modname()) + +-- Mob API +dofile(path .. "/api.lua") + +-- Rideable Mobs +dofile(path .. "/mount.lua") + +-- Mob Items +dofile(path .. "/crafts.lua") + +minetest.log("action", "[MOD] Mobs Redo: MineClone 2 Edition loaded") diff --git a/mods/ENTITIES/mobs/intllib.lua b/mods/ENTITIES/mcl_mobs/intllib.lua similarity index 100% rename from mods/ENTITIES/mobs/intllib.lua rename to mods/ENTITIES/mcl_mobs/intllib.lua diff --git a/mods/ENTITIES/mobs/license.txt b/mods/ENTITIES/mcl_mobs/license.txt similarity index 100% rename from mods/ENTITIES/mobs/license.txt rename to mods/ENTITIES/mcl_mobs/license.txt diff --git a/mods/ENTITIES/mobs/locale/de_DE.po b/mods/ENTITIES/mcl_mobs/locale/de_DE.po similarity index 100% rename from mods/ENTITIES/mobs/locale/de_DE.po rename to mods/ENTITIES/mcl_mobs/locale/de_DE.po diff --git a/mods/ENTITIES/mobs/locale/es.po b/mods/ENTITIES/mcl_mobs/locale/es.po similarity index 100% rename from mods/ENTITIES/mobs/locale/es.po rename to mods/ENTITIES/mcl_mobs/locale/es.po diff --git a/mods/ENTITIES/mobs/locale/fr.po b/mods/ENTITIES/mcl_mobs/locale/fr.po similarity index 100% rename from mods/ENTITIES/mobs/locale/fr.po rename to mods/ENTITIES/mcl_mobs/locale/fr.po diff --git a/mods/ENTITIES/mobs/locale/it.po b/mods/ENTITIES/mcl_mobs/locale/it.po similarity index 100% rename from mods/ENTITIES/mobs/locale/it.po rename to mods/ENTITIES/mcl_mobs/locale/it.po diff --git a/mods/ENTITIES/mobs/locale/ms.po b/mods/ENTITIES/mcl_mobs/locale/ms.po similarity index 100% rename from mods/ENTITIES/mobs/locale/ms.po rename to mods/ENTITIES/mcl_mobs/locale/ms.po diff --git a/mods/ENTITIES/mobs/locale/pt.po b/mods/ENTITIES/mcl_mobs/locale/pt.po similarity index 100% rename from mods/ENTITIES/mobs/locale/pt.po rename to mods/ENTITIES/mcl_mobs/locale/pt.po diff --git a/mods/ENTITIES/mobs/locale/ru.po b/mods/ENTITIES/mcl_mobs/locale/ru.po similarity index 100% rename from mods/ENTITIES/mobs/locale/ru.po rename to mods/ENTITIES/mcl_mobs/locale/ru.po diff --git a/mods/ENTITIES/mobs/locale/template.pot b/mods/ENTITIES/mcl_mobs/locale/template.pot similarity index 100% rename from mods/ENTITIES/mobs/locale/template.pot rename to mods/ENTITIES/mcl_mobs/locale/template.pot diff --git a/mods/ENTITIES/mobs/locale/tr.po b/mods/ENTITIES/mcl_mobs/locale/tr.po similarity index 100% rename from mods/ENTITIES/mobs/locale/tr.po rename to mods/ENTITIES/mcl_mobs/locale/tr.po diff --git a/mods/ENTITIES/mcl_mobs/lucky_block.lua b/mods/ENTITIES/mcl_mobs/lucky_block.lua new file mode 100644 index 00000000..ea90de74 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/lucky_block.lua @@ -0,0 +1,8 @@ + +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 new file mode 100644 index 00000000..bfad5550 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/mod.conf @@ -0,0 +1 @@ +name = mcl_mobs diff --git a/mods/ENTITIES/mobs/mount.lua b/mods/ENTITIES/mcl_mobs/mount.lua similarity index 100% rename from mods/ENTITIES/mobs/mount.lua rename to mods/ENTITIES/mcl_mobs/mount.lua diff --git a/mods/ENTITIES/mobs/readme.MD b/mods/ENTITIES/mcl_mobs/readme.MD similarity index 98% rename from mods/ENTITIES/mobs/readme.MD rename to mods/ENTITIES/mcl_mobs/readme.MD index 5296f4c1..0d332f85 100644 --- a/mods/ENTITIES/mobs/readme.MD +++ b/mods/ENTITIES/mcl_mobs/readme.MD @@ -15,7 +15,7 @@ Items: - Nametag (paper, black dye, string) can be used right-click on a tamed mob to give them a name. -Lucky Blocks: 9 +Lucky Block items: 1 Changelog from original Mobs Redo mod: diff --git a/mods/ENTITIES/mobs/sounds/default_punch.ogg b/mods/ENTITIES/mcl_mobs/sounds/default_punch.ogg similarity index 100% rename from mods/ENTITIES/mobs/sounds/default_punch.ogg rename to mods/ENTITIES/mcl_mobs/sounds/default_punch.ogg diff --git a/mods/ENTITIES/mobs/textures/mobs_blood.png b/mods/ENTITIES/mcl_mobs/textures/mobs_blood.png similarity index 100% rename from mods/ENTITIES/mobs/textures/mobs_blood.png rename to mods/ENTITIES/mcl_mobs/textures/mobs_blood.png diff --git a/mods/ENTITIES/mobs/textures/mobs_nametag.png b/mods/ENTITIES/mcl_mobs/textures/mobs_nametag.png similarity index 100% rename from mods/ENTITIES/mobs/textures/mobs_nametag.png rename to mods/ENTITIES/mcl_mobs/textures/mobs_nametag.png diff --git a/mods/ENTITIES/mobs/description.txt b/mods/ENTITIES/mobs/description.txt deleted file mode 100644 index 919852a1..00000000 --- a/mods/ENTITIES/mobs/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds a mob api for mods to add animals or monsters etc. \ No newline at end of file diff --git a/mods/ENTITIES/mobs/init.lua b/mods/ENTITIES/mobs/init.lua deleted file mode 100644 index 0e3620ab..00000000 --- a/mods/ENTITIES/mobs/init.lua +++ /dev/null @@ -1,13 +0,0 @@ - -local path = minetest.get_modpath("mobs") - --- Mob API -dofile(path .. "/api.lua") - --- Rideable Mobs -dofile(path .. "/mount.lua") - --- Mob Items -dofile(path .. "/crafts.lua") - -minetest.log("action", "[MOD] Mobs Redo loaded") diff --git a/mods/ENTITIES/mobs/lucky_block.lua b/mods/ENTITIES/mobs/lucky_block.lua deleted file mode 100644 index 7da0040f..00000000 --- a/mods/ENTITIES/mobs/lucky_block.lua +++ /dev/null @@ -1,15 +0,0 @@ - -if minetest.get_modpath("lucky_block") then - - lucky_block:add_blocks({ - {"dro", {"mobs:meat_raw"}, 5}, - {"dro", {"mobs:meat"}, 5}, - {"dro", {"mobs:nametag"}, 1}, - {"dro", {"mobs:leather"}, 5}, - {"dro", {"mobs:net"}, 1}, - {"dro", {"mobs:lasso"}, 1}, - {"dro", {"mobs:shears"}, 1}, - {"dro", {"mobs:protector"}, 1}, - {"lig"}, - }) -end diff --git a/mods/ENTITIES/mobs/mod.conf b/mods/ENTITIES/mobs/mod.conf deleted file mode 100644 index f3a3ad74..00000000 --- a/mods/ENTITIES/mobs/mod.conf +++ /dev/null @@ -1 +0,0 @@ -name = mobs diff --git a/mods/ENTITIES/mobs_mc/depends.txt b/mods/ENTITIES/mobs_mc/depends.txt index ea2df6db..da8ac70d 100644 --- a/mods/ENTITIES/mobs_mc/depends.txt +++ b/mods/ENTITIES/mobs_mc/depends.txt @@ -1,9 +1,9 @@ default? -mobs -tnt? +mcl_mobs +mcl_tnt? mcl_bows? mcl_throwing? -fishing? +mcl_fishing? bones? mesecons_materials? mobs_mc_gameconfig? diff --git a/mods/ENTITIES/mobs_mc/description.txt b/mods/ENTITIES/mobs_mc/description.txt index ac5a6406..c57195fe 100644 --- a/mods/ENTITIES/mobs_mc/description.txt +++ b/mods/ENTITIES/mobs_mc/description.txt @@ -1 +1 @@ -Adds MC like monsters and animals. \ No newline at end of file +Adds Minecraft-like monsters and animals. diff --git a/mods/ENTITIES/mobs_mc/init.lua b/mods/ENTITIES/mobs_mc/init.lua index 094fd399..e2ec3400 100644 --- a/mods/ENTITIES/mobs_mc/init.lua +++ b/mods/ENTITIES/mobs_mc/init.lua @@ -98,5 +98,5 @@ COLISIONBOX in minetest press f5 to see where you are looking at then put these -- if minetest.settings:get_bool("log_mods") then - minetest.log("action", "[MOD] Mobs Redo 'MC' loaded") + minetest.log("action", "[MOD] mobs_mc loaded") end diff --git a/mods/ITEMS/mcl_fishing/depends.txt b/mods/ITEMS/mcl_fishing/depends.txt index f910e230..93ef0bf5 100644 --- a/mods/ITEMS/mcl_fishing/depends.txt +++ b/mods/ITEMS/mcl_fishing/depends.txt @@ -1,3 +1,4 @@ mcl_core mcl_sounds mcl_loot +mcl_mobs diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index ed6aadcc..ab2519b9 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -52,7 +52,7 @@ local go_fishing = function(itemstack, user, pointed_thing) { itemstring = "mcl_books:book" }, -- TODO: Enchanted Fishing Rod { itemstring = "mcl_fishing:fishing_rod", wear_min = 49144, wear_max = 65535 }, -- 75%-100% damage - { itemstring = "mobs:nametag", }, + { itemstring = "mcl_mobs:nametag", }, { itemstring = "mcl_mobitems:saddle", }, { itemstring = "mcl_flowers:waterlily", }, } diff --git a/mods/ITEMS/mcl_mobspawners/depends.txt b/mods/ITEMS/mcl_mobspawners/depends.txt index 72e19e86..dc1a03b8 100644 --- a/mods/ITEMS/mcl_mobspawners/depends.txt +++ b/mods/ITEMS/mcl_mobspawners/depends.txt @@ -1,2 +1,2 @@ mcl_sounds -mobs +mcl_mobs diff --git a/mods/MAPGEN/mcl_dungeons/depends.txt b/mods/MAPGEN/mcl_dungeons/depends.txt index 9f3c4e9f..2c8ce78b 100644 --- a/mods/MAPGEN/mcl_dungeons/depends.txt +++ b/mods/MAPGEN/mcl_dungeons/depends.txt @@ -1,5 +1,6 @@ mcl_init mcl_core mcl_chests +mcl_mobs mcl_mobspawners mobs_mc diff --git a/mods/MAPGEN/mcl_dungeons/init.lua b/mods/MAPGEN/mcl_dungeons/init.lua index 7bd2af28..f23c33bf 100644 --- a/mods/MAPGEN/mcl_dungeons/init.lua +++ b/mods/MAPGEN/mcl_dungeons/init.lua @@ -10,7 +10,7 @@ local get_loot = function() stacks_min = 1, stacks_max = 3, items = { - { itemstring = "mobs:nametag", weight = 20 }, + { 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 }, diff --git a/mods/MAPGEN/tsm_railcorridors/gameconfig.lua b/mods/MAPGEN/tsm_railcorridors/gameconfig.lua index aa6aba4d..df86f587 100644 --- a/mods/MAPGEN/tsm_railcorridors/gameconfig.lua +++ b/mods/MAPGEN/tsm_railcorridors/gameconfig.lua @@ -64,7 +64,7 @@ function tsm_railcorridors.get_treasures(pr) stacks_min = 1, stacks_max = 1, items = { - { itemstring = "mobs:nametag", weight = 30 }, + { itemstring = "mcl_mobs:nametag", weight = 30 }, { itemstring = "mcl_core:apple_gold", weight = 20 }, { itemstring = "mcl_books:book", weight = 10 }, -- TODO: Enchanted Book { itemstring = "", weight = 5}, From 1d04b52b5ab97272997e46799de81d915c821ac3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 May 2018 18:40:02 +0200 Subject: [PATCH 0104/1107] Name tag: Update texture conversion and add alias --- mods/ENTITIES/mcl_mobs/crafts.lua | 1 + tools/Conversion_Table.csv | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/crafts.lua b/mods/ENTITIES/mcl_mobs/crafts.lua index 3422f382..41243bf5 100644 --- a/mods/ENTITIES/mcl_mobs/crafts.lua +++ b/mods/ENTITIES/mcl_mobs/crafts.lua @@ -12,3 +12,4 @@ minetest.register_craftitem("mcl_mobs:nametag", { groups = { tool=1 }, }) +minetest.register_alias("mobs:nametag", "mcl_mobs:nametag") diff --git a/tools/Conversion_Table.csv b/tools/Conversion_Table.csv index de78a256..92a9f09c 100644 --- a/tools/Conversion_Table.csv +++ b/tools/Conversion_Table.csv @@ -18,7 +18,7 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/blocks,anvil_top_damaged_2.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_top_damaged_2.png,,,,,,, /assets/minecraft/textures/blocks,anvil_base.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_side.png,,,,,,, /assets/minecraft/textures/blocks,anvil_side.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_side.png,,,,,,, -/assets/minecraft/textures/items,name_tag.png,/mods/ENTITIES/mobs/textures,mobs_nametag.png,,,,,,, +/assets/minecraft/textures/items,name_tag.png,/mods/ENTITIES/mcl_mobs/textures,mobs_nametag.png,,,,,,, /assets/minecraft/textures/gui,icons.png,/mods/ENTITIES/mobs/textures,mobs_blood.png,16,0,9,9,0,0,y /assets/minecraft/textures/blocks,itemframe_background.png,/mods/ITEMS/mcl_itemframes/textures,mcl_itemframes_itemframe_background.png,,,,,,, /assets/minecraft/textures/items,bed.png,/mods/ITEMS/mcl_beds/textures,mcl_beds_bed_red.png,,,,,,, From 9c6f5b35739798e6732dacd67524ec61c2e930d6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 3 Jun 2018 00:56:29 +0200 Subject: [PATCH 0105/1107] Remove dead code in mcl_mobs --- mods/ENTITIES/mcl_mobs/api.lua | 97 ++++---------------------------- mods/ENTITIES/mcl_mobs/mount.lua | 5 -- 2 files changed, 12 insertions(+), 90 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index d4fd8924..b2acbb8d 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -44,7 +44,6 @@ local random = math.random local floor = math.floor local atan = function(x) if not x or x ~= x then - --error("atan bassed NaN") return 0 else return atann(x) @@ -628,7 +627,6 @@ local do_env_damage = function(self) -- what is mob standing in? pos.y = pos.y + y_level + 0.25 -- foot level self.standing_in = node_ok(pos, "air").name --- print ("standing in " .. self.standing_in) -- don't fall when on ignore, just stand still if self.standing_in == "ignore" then @@ -735,8 +733,6 @@ local do_jump = function(self) local nod = node_ok(pos) ---print ("standing on:", nod.name, pos.y) - if minetest.registered_nodes[nod.name].walkable == false then return false end @@ -757,8 +753,6 @@ local do_jump = function(self) return false end ---print ("in front:", nod.name, pos.y + 0.5) - if self.walk_chance == 0 or minetest.registered_items[nod.name].walkable then @@ -775,11 +769,10 @@ local do_jump = function(self) -- when in air move forward minetest.after(0.3, function(self, v) --- self.object:setvelocity({ self.object:set_acceleration({ - x = v.x * 2,--1.5, + x = v.x * 2, y = 0, - z = v.z * 2,--1.5 + z = v.z * 2, }) end, self, v) @@ -1027,8 +1020,6 @@ local replace = function(self, pos) if #minetest.find_nodes_in_area(pos, pos, what) > 0 then --- print ("replace node = ".. minetest.get_node(pos).name, pos.y) - local oldnode = {name = what} local newnode = {name = with} local on_replace_return @@ -1151,7 +1142,6 @@ local smart_mobs = function(self, s, p, dist, dtime) -- 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.y = floor(s.y + 0.5) - sheight s.z = floor(s.z + 0.5) local ssight, sground = minetest.line_of_sight(s, { @@ -1172,24 +1162,6 @@ local smart_mobs = function(self, s, p, dist, dtime) if self.fear_height ~= 0 then dropheight = self.fear_height end self.path.way = minetest.find_path(s, p1, 16, self.stepheight, dropheight, "A*_noprefetch") ---[[ - -- show path using particles - if self.path.way and #self.path.way > 0 then - print ("-- path length:" .. tonumber(#self.path.way)) - for _,pos in pairs(self.path.way) do - minetest.add_particle({ - pos = pos, - velocity = {x=0, y=0, z=0}, - acceleration = {x=0, y=0, z=0}, - expirationtime = 1, - size = 4, - collisiondetection = false, - vertical = false, - texture = "heart.png", - }) - end - end -]] self.state = "" do_attack(self, self.attack) @@ -1741,15 +1713,6 @@ local do_states = function(self, dtime) set_velocity(self, self.walk_velocity) self.state = "walk" set_animation(self, "walk") - - --[[ fly up/down randomly for flying mobs - if self.fly and random(1, 100) <= self.walk_chance then - - local v = self.object:getvelocity() - local ud = random(-1, 2) / 9 - - self.object:setvelocity({x = v.x, y = ud, z = v.z}) - end--]] end end @@ -1881,7 +1844,6 @@ local do_states = function(self, dtime) or self.attack:get_hp() <= 0 or (self.attack:is_player() and mobs.invis[ self.attack:get_player_name() ]) then --- print(" ** stop attacking **", dist, self.view_range) self.state = "stand" set_velocity(self, 0) set_animation(self, "stand") @@ -1920,7 +1882,6 @@ local do_states = function(self, dtime) self.timer = 0 self.blinktimer = 0 mob_sound(self, self.sounds.fuse) --- print ("=== explosion timer started", self.explosion_timer) -- stop timer if out of reach or direct line of sight elseif self.allow_fuse_reset @@ -1965,8 +1926,6 @@ local do_states = function(self, dtime) self.blinkstatus = not self.blinkstatus end --- print ("=== explosion timer", self.timer) - if self.timer > self.explosion_timer then local pos = self.object:get_pos() @@ -2318,11 +2277,6 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) end end - -- mob health check --- if self.health <= 0 then --- return --- end - -- error checking when mod profiling is enabled if not tool_capabilities then minetest.log("warning", "[mobs] Mod profiling enabled, damage not enabled") @@ -2386,8 +2340,6 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) return end --- print ("Mob Damage is", damage) - if use_cmi then local cancel = cmi.notify_punch(self.object, hitter, tflp, tool_capabilities, dir, damage) @@ -2461,15 +2413,6 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) end end - --[[ add healthy afterglow when hit (can cause hit lag with larger textures) - core.after(0.1, function() - self.object:settexturemod("^[colorize:#c9900070") - - core.after(0.3, function() - self.object:settexturemod("") - end) - end) ]] - -- knock back effect (only on full punch) if self.knock_back and tflp >= punch_interval then @@ -2580,8 +2523,6 @@ local mob_staticdata = function(self) and not self.tamed and self.lifetimer < 20000 then - --print ("REMOVED " .. self.name) - self.object:remove() return ""-- nil @@ -2616,7 +2557,6 @@ local mob_staticdata = function(self) end end - --print('===== '..self.name..'\n'.. dump(tmp)..'\n=====\n') return minetest.serialize(tmp) end @@ -2799,9 +2739,6 @@ local mob_step = function(self, dtime) end end --- minetest.log("action", --- S("lifetimer expired, removed @1", self.name)) - effect(pos, 15, "tnt_smoke.png", 2, 4, 2, 0) self.object:remove() @@ -2926,8 +2863,6 @@ end -- default function when mobs are blown up with TNT local do_tnt = function(obj, damage) - --print ("----- Damage", damage) - obj.object:punch(obj.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = damage}, @@ -3187,7 +3122,6 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, -- is mob actually registered? if not mobs.spawning_mobs[name] or not minetest.registered_entities[name] then ---print ("--- mob doesn't exist", name) return end @@ -3199,7 +3133,7 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, -- do not spawn if too many of same mob in area if active_object_count_wider >= max_per_block or count_mobs(pos, name) >= aoc then ---print ("--- too many entities", name, aoc, active_object_count_wider) + -- too many entities return end @@ -3211,13 +3145,13 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, if tod > 4500 and tod < 19500 then -- daylight, but mob wants night if day_toggle == false then ---print ("--- mob needs night", name) + -- mob needs night return end else -- night time but mob wants day if day_toggle == true then ---print ("--- mob needs day", name) + -- mob needs day return end end @@ -3232,7 +3166,7 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, for n = 1, #objs do if objs[n]:is_player() then ---print ("--- player too close", name) + -- player too close return end end @@ -3240,14 +3174,12 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, -- mobs cannot spawn in protected areas when enabled if not spawn_protected and minetest.is_protected(pos, "") then ---print ("--- inside protected area", name) return end -- are we spawning within height limits? if pos.y > max_height or pos.y < min_height then ---print ("--- height limits not met", name, pos.y) return end @@ -3256,7 +3188,6 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, if not light or light > max_light or light < min_light then ---print ("--- light limits not met", name, light) return end @@ -3269,7 +3200,7 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, local pos2 = {x = pos.x, y = pos.y + n, z = pos.z} if minetest.registered_nodes[node_ok(pos2).name].walkable == true then ---print ("--- inside block", name, node_ok(pos2).name) + -- inside block return end end @@ -3278,11 +3209,7 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, pos.y = pos.y + 0.5 local mob = minetest.add_entity(pos, name) ---[[ - print ("[mobs] Spawned " .. name .. " at " - .. minetest.pos_to_string(pos) .. " on " - .. node.name .. " near " .. neighbors[1]) -]] + if on_spawn then local ent = mob:get_luaentity() @@ -3359,7 +3286,7 @@ function mobs:register_arrow(name, def) or self.timer > 150 or not within_limits(pos, 0) then - self.object:remove() ; -- print ("removed arrow") + self.object:remove(); return end @@ -3398,7 +3325,7 @@ function mobs:register_arrow(name, def) minetest.add_item(self.lastpos, self.object:get_luaentity().name) end - self.object:remove() ; -- print ("hit node") + self.object:remove(); return end @@ -3412,7 +3339,7 @@ function mobs:register_arrow(name, def) and player:is_player() then self.hit_player(self, player) - self.object:remove() ; -- print ("hit player") + self.object:remove(); return end @@ -3426,7 +3353,7 @@ function mobs:register_arrow(name, def) self.hit_mob(self, player) - self.object:remove() ; --print ("hit mob") + self.object:remove(); return end diff --git a/mods/ENTITIES/mcl_mobs/mount.lua b/mods/ENTITIES/mcl_mobs/mount.lua index 09df1587..ae578503 100644 --- a/mods/ENTITIES/mcl_mobs/mount.lua +++ b/mods/ENTITIES/mcl_mobs/mount.lua @@ -155,7 +155,6 @@ function mobs.attach(entity, player) mcl_player.player_set_animation(player, "sit" , 30) end) - --player:set_look_yaw(entity.object:get_yaw() - rot_view) player:set_look_horizontal(entity.object:get_yaw() - rot_view) end @@ -192,8 +191,6 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) -- process controls if entity.driver then ---print ("---velo", get_v(velo)) - local ctrl = entity.driver:get_player_control() -- move forwards @@ -367,8 +364,6 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) if intensity >= crash_threshold then ---print("----------- crash", intensity) - entity.object:punch(entity.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = intensity} From 201c2bf170555b0ae767ca05ad707cccf6cb30a3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 3 Jun 2018 16:13:46 +0200 Subject: [PATCH 0106/1107] Fix minetest.after crashes in mcl_mobs --- mods/ENTITIES/mcl_mobs/api.lua | 42 +++++++++++++++++++++++--------- mods/ENTITIES/mcl_mobs/mount.lua | 16 +++++++----- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index b2acbb8d..2df48634 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -493,8 +493,10 @@ local check_for_death = function(self, cause, cmi_cause) set_animation(self, "die") minetest.after(length, function(self) - - if use_cmi then + if not self.object:get_luaentity() then + return + end + if use_cmi then cmi.notify_die(self.object, cmi_cause) end @@ -769,6 +771,9 @@ local do_jump = function(self) -- when in air move forward minetest.after(0.3, function(self, v) + if not self.object:get_luaentity() then + return + end self.object:set_acceleration({ x = v.x * 2, y = 0, @@ -949,17 +954,23 @@ local breed = function(self) ent.hornytimer = 41 -- spawn baby - minetest.after(5, function() + 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 -- custom breed function - if self.on_breed then - -- when false skip going any further - if self.on_breed(self, ent) == false then + if parent1.on_breed then + -- when false, skip going any further + if parent1.on_breed(parent1, parent2) == false then return end end - local child = mobs:spawn_child(pos, self.name) + local child = mobs:spawn_child(pos, parent1.name) local ent_c = child:get_luaentity() @@ -967,9 +978,9 @@ local breed = function(self) -- Use texture of one of the parents local p = math.random(1, 2) if p == 1 then - ent_c.base_texture = self.base_texture + ent_c.base_texture = parent1.base_texture else - ent_c.base_texture = ent.base_texture + ent_c.base_texture = parent2.base_texture end child:set_properties({ textures = ent_c.base_texture @@ -977,8 +988,8 @@ local breed = function(self) -- tamed and owned by parents' owner ent_c.tamed = true - ent_c.owner = self.owner - end) + ent_c.owner = parent1.owner + end, self, ent, pos) num = 0 @@ -1096,6 +1107,9 @@ local smart_mobs = function(self, s, p, dist, dtime) 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! @@ -1107,6 +1121,9 @@ local smart_mobs = function(self, s, p, dist, dtime) 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 @@ -1117,6 +1134,9 @@ local smart_mobs = function(self, s, p, dist, dtime) 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 diff --git a/mods/ENTITIES/mcl_mobs/mount.lua b/mods/ENTITIES/mcl_mobs/mount.lua index ae578503..b12c074d 100644 --- a/mods/ENTITIES/mcl_mobs/mount.lua +++ b/mods/ENTITIES/mcl_mobs/mount.lua @@ -151,9 +151,11 @@ function mobs.attach(entity, player) } }) - minetest.after(0.2, function() - mcl_player.player_set_animation(player, "sit" , 30) - end) + minetest.after(0.2, function(player) + if player:is_player() then + mcl_player.player_set_animation(player, "sit" , 30) + end + end, player) player:set_look_horizontal(entity.object:get_yaw() - rot_view) end @@ -169,9 +171,11 @@ function mobs.detach(player, offset) pos = {x = pos.x + offset.x, y = pos.y + 0.2 + offset.y, z = pos.z + offset.z} - minetest.after(0.1, function() - player:setpos(pos) - end) + minetest.after(0.1, function(player, pos) + if player:is_player() then + player:set_pos(pos) + end + end, player, pos) end From 2132cdacc529422acd9061c990c0b2bd3a5bdf80 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 3 Jun 2018 16:17:55 +0200 Subject: [PATCH 0107/1107] Improve minetest.after checks --- mods/ENTITIES/mcl_mobs/mount.lua | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/mount.lua b/mods/ENTITIES/mcl_mobs/mount.lua index b12c074d..04050eb0 100644 --- a/mods/ENTITIES/mcl_mobs/mount.lua +++ b/mods/ENTITIES/mcl_mobs/mount.lua @@ -151,11 +151,12 @@ function mobs.attach(entity, player) } }) - minetest.after(0.2, function(player) - if player:is_player() then + 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) end - end, player) + end, player:get_player_name()) player:set_look_horizontal(entity.object:get_yaw() - rot_view) end @@ -171,11 +172,12 @@ function mobs.detach(player, offset) pos = {x = pos.x + offset.x, y = pos.y + 0.2 + offset.y, z = pos.z + offset.z} - minetest.after(0.1, function(player, pos) - if player:is_player() then + 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, pos) + end, player:get_player_name(), pos) end From f022b747b06006dd178373bd45f8ac455182acc3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 3 Jun 2018 16:44:37 +0200 Subject: [PATCH 0108/1107] Harden a number of minetest.after player checks --- mods/ENTITIES/mcl_boats/init.lua | 9 +++++---- mods/ENTITIES/mcl_item_entity/init.lua | 5 +++-- mods/ENTITIES/mobs_mc/1_items_default.lua | 5 +++-- mods/HUD/awards/api.lua | 8 ++++++-- mods/ITEMS/mcl_jukebox/init.lua | 6 +++--- mods/ITEMS/mcl_portals/portal_nether.lua | 3 +++ .../minetest-3d_armor/3d_armor/armor.lua | 20 +++++++++++++------ mods/PLAYER/mcl_hunger/hunger.lua | 9 +++++---- 8 files changed, 42 insertions(+), 23 deletions(-) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index fb5e19ae..01457c4b 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -85,11 +85,12 @@ function boat.on_rightclick(self, clicker) {x = 0, y = 3.75, z = -1}, {x = 0, y = 0, z = 0}) clicker:set_properties({ visual_size = driver_visual_size }) mcl_player.player_attached[name] = true - minetest.after(0.2, function(clicker) - if clicker:is_player() then - mcl_player.player_set_animation(clicker, "sit" , 30) + 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) end - end, clicker) + end, name) clicker:set_look_horizontal(self.object:getyaw()) end end diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index f3e02a0c..4c956af2 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -115,7 +115,8 @@ minetest.register_globalstep(function(dtime) if object:get_luaentity().init ~= true then object:get_luaentity().init = true minetest.after(1, function(args) - local player = args[1] + local playername = args[1] + local player = minetest.get_player_by_name(playername) local object = args[2] local lua = object:get_luaentity() if player == nil or not player:is_player() or object == nil or lua == nil or lua.itemstring == nil then @@ -136,7 +137,7 @@ minetest.register_globalstep(function(dtime) else enable_physics(object, object:get_luaentity()) end - end, {player, object}) + end, {player:get_player_name(), object}) end end end diff --git a/mods/ENTITIES/mobs_mc/1_items_default.lua b/mods/ENTITIES/mobs_mc/1_items_default.lua index f7f7c2c0..f705b782 100644 --- a/mods/ENTITIES/mobs_mc/1_items_default.lua +++ b/mods/ENTITIES/mobs_mc/1_items_default.lua @@ -570,7 +570,8 @@ if c("totem") then scale = { x=17, y=17 }, offset = { x=0, y=-178 }, }) - minetest.after(3, function(player) + minetest.after(3, function(name) + local player = minetest.get_player_by_name(name) if player and player:is_player() then local name = player:get_player_name() if hud_totem[name] then @@ -578,7 +579,7 @@ if c("totem") then hud_totem[name] = nil end end - end, player) + end, player:get_player_name()) end -- Set HP to exactly 1 diff --git a/mods/HUD/awards/api.lua b/mods/HUD/awards/api.lua index 4fdab6fb..09f92917 100644 --- a/mods/HUD/awards/api.lua +++ b/mods/HUD/awards/api.lua @@ -338,12 +338,16 @@ function awards.unlock(name, award) alignment = {x = 0, y = 0}, direction = 0, }) - minetest.after(3, function() + 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) + end, player:get_player_name()) end end diff --git a/mods/ITEMS/mcl_jukebox/init.lua b/mods/ITEMS/mcl_jukebox/init.lua index 6ae5dbdf..2ee8f8c1 100644 --- a/mods/ITEMS/mcl_jukebox/init.lua +++ b/mods/ITEMS/mcl_jukebox/init.lua @@ -72,8 +72,8 @@ local function now_playing(player, track_id) active_huds[playername] = id end minetest.after(5, function(tab) - local player = tab[1] - local playername = player:get_player_name() + local playername = tab[1] + local player = minetest.get_player_by_name(playername) local id = tab[2] local seq = tab[3] if not player or not player:is_player() or not active_huds[playername] or not hud_sequence_numbers[playername] or seq ~= hud_sequence_numbers[playername] then @@ -83,7 +83,7 @@ local function now_playing(player, track_id) player:hud_remove(active_huds[playername]) active_huds[playername] = nil end - end, {player, id, hud_sequence_numbers[playername]}) + end, {playername, id, hud_sequence_numbers[playername]}) end diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index 637c0e85..1c1f6774 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -404,6 +404,9 @@ minetest.register_abm({ end -- teleport the object minetest.after(3, function(obj, pos, target) + if not obj:get_luaentity() then + return + end -- Prevent quick back-and-forth teleportation if portal_cooloff[obj] then return diff --git a/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua b/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua index b7658205..4dfa92e8 100644 --- a/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua +++ b/mods/ITEMS/minetest-3d_armor/3d_armor/armor.lua @@ -292,11 +292,15 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end for field, _ in pairs(fields) do if string.find(field, "skins_set") then - minetest.after(0, function(player) + minetest.after(0, function(name) + local player = minetest.get_player_by_name(name) + if not player then + return + end local skin = armor:get_player_skin(name) armor.textures[name].skin = skin..".png" armor:set_player_armor(player) - end, player) + end, player:get_player_name()) end end end) @@ -406,9 +410,13 @@ minetest.register_on_joinplayer(function(player) end end for i=1, ARMOR_INIT_TIMES do - minetest.after(ARMOR_INIT_DELAY * i, function(player) + minetest.after(ARMOR_INIT_DELAY * i, function(name) + local player = minetest.get_player_by_name(name) + if not player then + return + end armor:set_player_armor(player) - end, player) + end, player:get_player_name()) end end) @@ -435,7 +443,7 @@ if ARMOR_DROP == true or ARMOR_DESTROY == true then end armor:set_player_armor(player) if ARMOR_DESTROY == false then - minetest.after(ARMOR_BONES_DELAY, function() + minetest.after(ARMOR_BONES_DELAY, function(pos, drop) local node = minetest.get_node(vector.round(pos)) if node then if node.name ~= "bones:bones" then @@ -461,7 +469,7 @@ if ARMOR_DROP == true or ARMOR_DESTROY == true then armor.drop_armor(pos, stack) end end - end) + end, pos, drop) end end) end diff --git a/mods/PLAYER/mcl_hunger/hunger.lua b/mods/PLAYER/mcl_hunger/hunger.lua index 72464320..d77a7b18 100644 --- a/mods/PLAYER/mcl_hunger/hunger.lua +++ b/mods/PLAYER/mcl_hunger/hunger.lua @@ -85,9 +85,10 @@ local function reset_bars_poison_hunger(player) end -- Poison player -local function poisonp(tick, time, time_left, damage, exhaustion, player) +local function poisonp(tick, time, time_left, damage, exhaustion, name) + local player = minetest.get_player_by_name(name) -- First check if player is still there - if not player:is_player() then + if not player then return end local name = player:get_player_name() @@ -97,7 +98,7 @@ local function poisonp(tick, time, time_left, damage, exhaustion, player) end time_left = time_left + tick if time_left < time then - minetest.after(tick, poisonp, tick, time, time_left, damage, exhaustion, player) + minetest.after(tick, poisonp, tick, time, time_left, damage, exhaustion, name) else if damage > 0 then mcl_hunger.poison_damage[name] = mcl_hunger.poison_damage[name] - 1 @@ -236,7 +237,7 @@ function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poiso end mcl_hunger.poison_hunger[name] = mcl_hunger.poison_hunger[name] + 1 end - poisonp(1, poisontime, 0, poison, exhaust, user) + poisonp(1, poisontime, 0, poison, exhaust, user:get_player_name()) end end From 2dbda44a93e91973001066170d3bd024e7fe4bd4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 3 Jun 2018 17:48:32 +0200 Subject: [PATCH 0109/1107] Add some global spawn restrictions - no monsters on mycelium - nothing on non-opaque blocks, except air --- mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua | 10 ++++++++++ mods/ENTITIES/mobs_mc/init.lua | 2 ++ 2 files changed, 12 insertions(+) create mode 100644 mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua diff --git a/mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua b/mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua new file mode 100644 index 00000000..35a3c344 --- /dev/null +++ b/mods/ENTITIES/mobs_mc/5_spawn_abm_check.lua @@ -0,0 +1,10 @@ +function mobs:spawn_abm_check(pos, node, name) + if (node.name == "air") then + return true + elseif (node.name == "mcl_core:mycelium" or node.name == "mcl_core:mycelium_snow") and minetest.registered_entities[name].type == "monster" then + return false + elseif minetest.get_item_group(node.name, "opaque") ~= 0 then + return false + end + return true +end diff --git a/mods/ENTITIES/mobs_mc/init.lua b/mods/ENTITIES/mobs_mc/init.lua index e2ec3400..3206c0ba 100644 --- a/mods/ENTITIES/mobs_mc/init.lua +++ b/mods/ENTITIES/mobs_mc/init.lua @@ -38,6 +38,8 @@ dofile(path .. "/3_shared.lua") --Mob heads dofile(path .. "/4_heads.lua") +dofile(path .. "/5_spawn_abm_check.lua") + -- Animals dofile(path .. "/bat.lua") -- Mesh and animation by toby109tt / https://github.com/22i dofile(path .. "/rabbit.lua") -- Mesh and animation byExeterDad From 883568add4548d46f3f4df1d58168621a8a2fe80 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 3 Jun 2018 18:37:53 +0200 Subject: [PATCH 0110/1107] Implement basic villager trading formspec --- mods/ENTITIES/mobs_mc/depends.txt | 1 + .../textures/mobs_mc_trading_formspec_bg.png | Bin 2494 -> 2015 bytes mods/ENTITIES/mobs_mc/villager.lua | 109 ++++++++---------- 3 files changed, 51 insertions(+), 59 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/depends.txt b/mods/ENTITIES/mobs_mc/depends.txt index da8ac70d..2b399cc6 100644 --- a/mods/ENTITIES/mobs_mc/depends.txt +++ b/mods/ENTITIES/mobs_mc/depends.txt @@ -1,3 +1,4 @@ +mcl_init default? mcl_mobs mcl_tnt? 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 index a95b09780a4d8dcad60089291441d6b90cdab82f..cfc64aeaa25a5c43a6a1bffed14f5276c105f45d 100644 GIT binary patch literal 2015 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 Jvd$@?2>{y^7u)~< diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 5cb9783c..021e2da5 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -53,9 +53,9 @@ mobs:register_mob("mobs_mc:villager", { run_velocity = 2.4, drops = {}, sounds = { - random = "Villager1", - death = "Villagerdead", - damage = "Villagerhurt1", + random = "mobs_mc_villager_noise", + death = "mobs_mc_villager_death", + damage = "mobs_mc_villager_damage", distance = 16, }, animation = { @@ -78,7 +78,6 @@ mobs:register_mob("mobs_mc:villager", { light_damage = 0, view_range = 16, fear_height = 4, - --[[ on_rightclick = function(self, clicker) local inv inv = minetest.get_inventory({type="detached", name="trading_inv"}) @@ -87,10 +86,9 @@ mobs:register_mob("mobs_mc:villager", { allow_take = function(inv, listname, index, stack, player) if listname == "output" then inv:remove_item("input", inv:get_stack("wanted", 1)) - minetest.sound_play("Villageraccept", {to_player = player:get_player_name()}) + minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name()}) end if listname == "input" or listname == "output" then - --return 1000 return 0 else return 0 @@ -106,72 +104,68 @@ mobs:register_mob("mobs_mc:villager", { on_put = function(inv, listname, index, stack, player) if inv:contains_item("input", inv:get_stack("wanted", 1)) then inv:set_stack("output", 1, inv:get_stack("offered", 1)) - minetest.sound_play("Villageraccept", {to_player = player:get_player_name()}) + minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name()}) else inv:set_stack("output", 1, ItemStack("")) - minetest.sound_play("Villagerdeny", {to_player = player:get_player_name()}) + minetest.sound_play("mobs_mc_villager_deny", {to_player = player:get_player_name()}) end end, on_move = function(inv, from_list, from_index, to_list, to_index, count, player) if inv:contains_item("input", inv:get_stack("wanted", 1)) then inv:set_stack("output", 1, inv:get_stack("offered", 1)) - minetest.sound_play("Villageraccept", {to_player = player:get_player_name()}) + minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name()}) else inv:set_stack("output", 1, ItemStack("")) - minetest.sound_play("Villagerdeny", {to_player = player:get_player_name()}) + minetest.sound_play("mobs_mc_villager_deny", {to_player = player:get_player_name()}) end end, on_take = function(inv, listname, index, stack, player) if inv:contains_item("input", inv:get_stack("wanted", 1)) then inv:set_stack("output", 1, inv:get_stack("offered", 1)) - minetest.sound_play("Villageraccept", {to_player = player:get_player_name()}) + minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name()}) else inv:set_stack("output", 1, ItemStack("")) - minetest.sound_play("Villagerdeny", {to_player = player:get_player_name()}) + minetest.sound_play("mobs_mc_villager_deny", {to_player = player:get_player_name()}) end end, }) end - inv:set_size("input", 1) - inv:set_size("output", 1) - inv:set_size("wanted", 1) - inv:set_size("offered", 1) + inv:set_size("input", 2) + inv:set_size("output", 1) + inv:set_size("wanted", 2) + inv:set_size("offered", 1) local trades = { - {"default:apple 12", "default:clay_lump 1"}, - {"default:coal_lump 20", "default:clay_lump 1"}, - {"default:paper 30", "default:clay_lump 1"}, - {"mobs:leather 10", "default:clay_lump 1"}, - {"default:book 2", "default:clay_lump 1"}, - {"default:clay_lump 3", "default:clay_lump 1"}, - {"farming:potato 15", "default:clay_lump 1"}, - {"farming:wheat 20", "default:clay_lump 1"}, - {"farming:carrot 15", "default:clay_lump 1"}, - {"farming:melon_8 8", "default:clay_lump 1"}, - {"mobs:rotten_flesh 40", "default:clay_lump 1"}, - {"default:gold_ingot 10", "default:clay_lump 1"}, - {"farming:cotton 10", "default:clay_lump 1"}, - {"wool:white 15", "default:clay_lump 1"}, - {"farming:pumpkin 8", "default:clay_lump 1"}, + {"mcl_core:apple 12", "mcl_core:emerald 1"}, + {"mcl_core:coal_lump 20", "mcl_core:emerald 1"}, + {"mcl_core:paper 30", "mcl_core:emerald 1"}, + {"mcl_mobitems:leather 10", "mcl_core:emerald 1"}, + {"mcl_books:book 2", "mcl_core:emerald 1"}, + {"mcl_core:emerald 3", "mcl_core:emerald 1"}, + {"mcl_farming:potato_item 15", "mcl_core:emerald 1"}, + {"mcl_farming:wheat_item 20", "mcl_core:emerald 1"}, + {"mcl_farming:carrot_item 15", "mcl_core:emerald 1"}, + {"mcl_farming:melon_item 8", "mcl_core:emerald 1"}, + {"mcl_mobitems:rotten_flesh 40","mcl_core:emerald 1"}, + {"mcl_core:gold_ingot 10", "mcl_core:emerald 1"}, + {"mcl_wool:white 15", "mcl_core:emerald 1"}, + {"mcl_farming:pumpkin 8", "mcl_core:emerald 1"}, - {"default:clay_lump 1", "mobs:beef_cooked 5"}, - {"default:clay_lump 1", "mobs:chicken_cooked 7"}, - {"default:clay_lump 1", "farming:cookie 6"}, - {"default:clay_lump 1", "farming:pumpkin_bread 3"}, - {"default:clay_lump 1", "mobs:arrow 10"}, - {"default:clay_lump 3", "mobs:bow_wood 1"}, - {"default:clay_lump 8", "fishing:pole_wood 1"}, - --{"default:clay_lump 4", "potionspack:healthii 1"}, - {"default:clay_lump 1", "cake:cake 1"}, - {"default:clay_lump 10", "mobs:saddle 1"}, - {"default:clay_lump 10", "clock:1 1"}, - {"default:clay_lumpd 10", "compass:0 1"}, - {"default:clay_lump 1", "default:glass 5"}, - {"default:clay_lump 1", "nether:glowstone 3"}, - {"default:clay_lump 3", "mobs:shears 1"}, - {"default:clay_lump 10", "default:sword_diamond 1"}, - {"default:clay_lump 20", "3d_armor:chestplate_diamond 1"}, + {"mcl_core:emerald 1", "mcl_mobitems:beef_cooked 5"}, + {"mcl_core:emerald 1", "mcl_mobitems:chicken_cooked 7"}, + {"mcl_core:emerald 1", "mcl_farming:cookie 6"}, + {"mcl_core:emerald 1", "mcl_bows:arrow 10"}, + {"mcl_core:emerald 3", "mcl_bows:bow_0 1"}, + {"mcl_core:emerald 1", "mcl_cake:cake 1"}, + {"mcl_core:emerald 10", "mcl_mobitems:saddle 1"}, + {"mcl_core:emerald 10", "mcl_clock:clock_1 1"}, + {"mcl_core:emerald 10", "mcl_compass:compass 1"}, + {"mcl_core:emerald 1", "mcl_core:glass 5"}, + {"mcl_core:emerald 1", "mcl_nether:glowstone 3"}, + {"mcl_core:emerald 3", "mcl_tools:shears 1"}, + {"mcl_core:emerald 10", "mcl_tools:sword_diamond 1"}, + {"mcl_core:emerald 20", "3d_armor:chestplate_diamond 1"}, } local tradenum = math.random(#trades) inv:set_stack("wanted", 1, ItemStack(trades[tradenum][1])) @@ -179,20 +173,17 @@ mobs:register_mob("mobs_mc:villager", { local formspec = "size[9,8.75]".. - "background[-0.19,-0.25;9.41,9.49;trading_formspec_bg.png]".. - "bgcolor[#080808BB;true]".. - "listcolors[#9990;#FFF7;#FFF0;#160816;#D4D2FF]".. + "background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]".. + mcl_vars.inventory_header.. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]" - .."list[detached:trading_inv;wanted;2,1;1,1;]" - .."list[detached:trading_inv;offered;5.75,1;1,1;]" - .."list[detached:trading_inv;input;2,2.5;1,1;]" - .."list[detached:trading_inv;output;5.75,2.5;1,1;]" - minetest.sound_play("Villagertrade", {to_player = clicker:get_player_name()}) - minetest.show_formspec(clicker:get_player_name(), "tradespec", formspec) + .."list[detached:trading_inv;wanted;2,1;2,1;]" + .."list[detached:trading_inv;offered;5.76,1;1,1;]" + .."list[detached:trading_inv;input;2,2.5;2,1;]" + .."list[detached:trading_inv;output;5.76,2.55;1,1;]" + minetest.sound_play("mobs_mc_villager_trade", {to_player = clicker:get_player_name()}) + minetest.show_formspec(clicker:get_player_name(), "mobs_mc:trade", formspec) end, - - ]] }) mobs:spawn_specific("mobs_mc:villager", mobs_mc.spawn.village, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 8000, 4, mobs_mc.spawn_height.water+1, mobs_mc.spawn_height.overworld_max) From e5c7e5020276f4075cb3e36e4c55f785b5d33eff Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Jun 2018 01:19:23 +0200 Subject: [PATCH 0111/1107] More villager fixing --- mods/ENTITIES/mobs_mc/villager.lua | 45 +++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 021e2da5..631c2088 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -7,7 +7,6 @@ local MP = minetest.get_modpath(minetest.get_current_modname()) local S, NS = dofile(MP.."/intllib.lua") ---dofile(minetest.get_modpath("mobs").."/api.lua") --################### --################### VILLAGER --################### @@ -84,19 +83,26 @@ mobs:register_mob("mobs_mc:villager", { if not inv then inv = minetest.create_detached_inventory("trading_inv", { allow_take = function(inv, listname, index, stack, player) - if listname == "output" then - inv:remove_item("input", inv:get_stack("wanted", 1)) - minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name()}) - end if listname == "input" or listname == "output" then + return stack:get_count() + else return 0 + end + end, + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + if from_list == "wanted" or from_list == "offered" or to_list == "wanted" or to_list == "offered" then + return 0 + elseif from_list == "output" and inv:get_stack(to_list, to_index):is_empty() then + return count + elseif from_list == "input" then + return count else return 0 end end, allow_put = function(inv, listname, index, stack, player) if listname == "input" then - return 1000 + return stack:get_count() else return 0 end @@ -120,13 +126,22 @@ mobs:register_mob("mobs_mc:villager", { end end, on_take = function(inv, listname, index, stack, player) + local accept + if listname == "output" then + inv:remove_item("input", inv:get_stack("wanted", 1)) + accept = true + end if inv:contains_item("input", inv:get_stack("wanted", 1)) then inv:set_stack("output", 1, inv:get_stack("offered", 1)) - minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name()}) + accept = true else inv:set_stack("output", 1, ItemStack("")) + accept = false + end + if accept then + minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name()}) + else minetest.sound_play("mobs_mc_villager_deny", {to_player = player:get_player_name()}) - end end, }) @@ -150,16 +165,16 @@ mobs:register_mob("mobs_mc:villager", { {"mcl_mobitems:rotten_flesh 40","mcl_core:emerald 1"}, {"mcl_core:gold_ingot 10", "mcl_core:emerald 1"}, {"mcl_wool:white 15", "mcl_core:emerald 1"}, - {"mcl_farming:pumpkin 8", "mcl_core:emerald 1"}, + {"mcl_farming:pumpkin_face 8", "mcl_core:emerald 1"}, - {"mcl_core:emerald 1", "mcl_mobitems:beef_cooked 5"}, - {"mcl_core:emerald 1", "mcl_mobitems:chicken_cooked 7"}, + {"mcl_core:emerald 1", "mcl_mobitems:cooked_beef 5"}, + {"mcl_core:emerald 1", "mcl_mobitems:cooked_chicken 7"}, {"mcl_core:emerald 1", "mcl_farming:cookie 6"}, {"mcl_core:emerald 1", "mcl_bows:arrow 10"}, - {"mcl_core:emerald 3", "mcl_bows:bow_0 1"}, + {"mcl_core:emerald 3", "mcl_bows:bow 1"}, {"mcl_core:emerald 1", "mcl_cake:cake 1"}, {"mcl_core:emerald 10", "mcl_mobitems:saddle 1"}, - {"mcl_core:emerald 10", "mcl_clock:clock_1 1"}, + {"mcl_core:emerald 10", "mcl_clock:clock 1"}, {"mcl_core:emerald 10", "mcl_compass:compass 1"}, {"mcl_core:emerald 1", "mcl_core:glass 5"}, {"mcl_core:emerald 1", "mcl_nether:glowstone 3"}, @@ -181,6 +196,10 @@ mobs:register_mob("mobs_mc:villager", { .."list[detached:trading_inv;offered;5.76,1;1,1;]" .."list[detached:trading_inv;input;2,2.5;2,1;]" .."list[detached:trading_inv;output;5.76,2.55;1,1;]" + .."listring[detached:trading_inv;output]" + .."listring[current_player;main]" + .."listring[detached:trading_inv;input]" + .."listring[current_player;main]" minetest.sound_play("mobs_mc_villager_trade", {to_player = clicker:get_player_name()}) minetest.show_formspec(clicker:get_player_name(), "mobs_mc:trade", formspec) end, From a9cf744c0b8e20f7f8a00b0cb106cfb04976c40e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Jun 2018 01:20:24 +0200 Subject: [PATCH 0112/1107] Disable villager trading again --- mods/ENTITIES/mobs_mc/villager.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 631c2088..41fd7441 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -77,6 +77,7 @@ mobs:register_mob("mobs_mc:villager", { light_damage = 0, view_range = 16, fear_height = 4, +--[[ on_rightclick = function(self, clicker) local inv inv = minetest.get_inventory({type="detached", name="trading_inv"}) @@ -203,6 +204,7 @@ mobs:register_mob("mobs_mc:villager", { minetest.sound_play("mobs_mc_villager_trade", {to_player = clicker:get_player_name()}) minetest.show_formspec(clicker:get_player_name(), "mobs_mc:trade", formspec) end, +]] }) mobs:spawn_specific("mobs_mc:villager", mobs_mc.spawn.village, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 8000, 4, mobs_mc.spawn_height.water+1, mobs_mc.spawn_height.overworld_max) From 7109db24c29eef21dd027641f1b0bbd1433aea54 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Jun 2018 12:50:31 +0200 Subject: [PATCH 0113/1107] Trading: Reset inventory when closing formspec --- mods/ENTITIES/mobs_mc/villager.lua | 74 +++++++++++++++++++++++++----- 1 file changed, 63 insertions(+), 11 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 41fd7441..c1637a15 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -77,12 +77,12 @@ mobs:register_mob("mobs_mc:villager", { light_damage = 0, view_range = 16, fear_height = 4, ---[[ on_rightclick = function(self, clicker) local inv - inv = minetest.get_inventory({type="detached", name="trading_inv"}) + inv = minetest.get_inventory({type="detached", name="mobs_mc:trade"}) + if not inv then - inv = minetest.create_detached_inventory("trading_inv", { + inv = minetest.create_detached_inventory("mobs_mc:trade", { allow_take = function(inv, listname, index, stack, player) if listname == "input" or listname == "output" then return stack:get_count() @@ -158,7 +158,6 @@ mobs:register_mob("mobs_mc:villager", { {"mcl_core:paper 30", "mcl_core:emerald 1"}, {"mcl_mobitems:leather 10", "mcl_core:emerald 1"}, {"mcl_books:book 2", "mcl_core:emerald 1"}, - {"mcl_core:emerald 3", "mcl_core:emerald 1"}, {"mcl_farming:potato_item 15", "mcl_core:emerald 1"}, {"mcl_farming:wheat_item 20", "mcl_core:emerald 1"}, {"mcl_farming:carrot_item 15", "mcl_core:emerald 1"}, @@ -193,20 +192,73 @@ mobs:register_mob("mobs_mc:villager", { mcl_vars.inventory_header.. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]" - .."list[detached:trading_inv;wanted;2,1;2,1;]" - .."list[detached:trading_inv;offered;5.76,1;1,1;]" - .."list[detached:trading_inv;input;2,2.5;2,1;]" - .."list[detached:trading_inv;output;5.76,2.55;1,1;]" - .."listring[detached:trading_inv;output]" + .."list[detached:mobs_mc:trade;wanted;2,1;2,1;]" + .."list[detached:mobs_mc:trade;offered;5.76,1;1,1;]" + .."list[detached:mobs_mc:trade;input;2,2.5;2,1;]" + .."list[detached:mobs_mc:trade;output;5.76,2.55;1,1;]" + .."listring[detached:mobs_mc:trade;output]" .."listring[current_player;main]" - .."listring[detached:trading_inv;input]" + .."listring[detached:mobs_mc:trade;input]" .."listring[current_player;main]" minetest.sound_play("mobs_mc_villager_trade", {to_player = clicker:get_player_name()}) minetest.show_formspec(clicker:get_player_name(), "mobs_mc:trade", formspec) 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:setvelocity(v) + obj:get_luaentity()._insta_collect = false + end + end + else + -- Fallback for unexpected cases + minetest.add_item(pos, itemstack) + end + return itemstack +end + +local return_fields = function(player) + local inv_t = minetest.get_inventory({type="detached", name = "mobs_mc:trade"}) + local inv_p = player:get_inventory() + for i, stack in ipairs(inv_t:get_list("input")) do + return_item(stack, player, player:get_pos(), inv_p) + stack:clear() + inv_t:set_stack("input", i, stack) + end + for i, stack in ipairs(inv_t:get_list("output")) do + stack:clear() + inv_t:set_stack("output", i, stack) + end +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "mobs_mc:trade" then + if fields.quit then + return_fields(player) + end + end +end) + +minetest.register_on_leaveplayer(function(player) + return_fields(player) +end) + mobs:spawn_specific("mobs_mc:villager", mobs_mc.spawn.village, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 8000, 4, mobs_mc.spawn_height.water+1, mobs_mc.spawn_height.overworld_max) -- compatibility From f1dc75f097cf5f5aeaae273515055960955eaf8d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Jun 2018 14:36:06 +0200 Subject: [PATCH 0114/1107] Add lots of random trades for villagers --- mods/ENTITIES/mobs_mc/villager.lua | 331 +++++++++++++++++++++++++---- 1 file changed, 289 insertions(+), 42 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index c1637a15..53b9aca7 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -11,6 +11,261 @@ local S, NS = dofile(MP.."/intllib.lua") --################### VILLAGER --################### +local E1 = { "mcl_core:emerald", 1, 1 } -- one emerald +local professions = { + { + name = "Farmer", + trades = { + { + { { "mcl_farming:wheat_item", 18, 22, }, E1 }, + { { "mcl_farming:potato_item", 15, 15, }, E1 }, + { { "mcl_farming:carrot_item", 15, 19, }, E1 }, + { E1, { "mcl_core:bread", 2, 4 } }, + }, + + { + { { "mcl_farming:pumpkin_face", 8, 13 }, E1 }, + { E1, { "mcl_farming:pumpkin_pie", 2, 3} }, + }, + + { + { { "mcl_farming:melon", 7, 12 }, E1 }, + { E1, { "mcl_core:apple", 5, 7 }, }, + }, + + { + { E1, { "mcl_farming:cookie", 6, 10 } }, + { E1, { "mcl_cake:cake", 1, 1 } }, + }, + } + }, + { + name = "Fisherman", + 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", 16, 24 }, E1 }, + }, + -- TODO: enchanted fishing rod + }, + }, + { + name = "Fletcher", + 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:emerald", 2, 3 }, { "mcl_bows:bow", 1, 1 } }, + }, + } + }, + { + name = "Shepherd", + 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:yellow", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:red", 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:light_blue", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:brown", 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:magenta", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:black", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:cyan", 1, 1 } }, + { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:pink", 1, 1 } }, + }, + }, + }, + { + name = "Librarian", + trades = { + { + { { "mcl_core:paper", 24, 36 }, E1 }, + -- TODO: enchanted book + { { "mcl_books:book", 8, 10 }, E1 }, + { { "mcl_core:emerald", 10, 12 }, { "mcl_compass:compass", 1 ,1 }}, + { { "mcl_core:emerald", 3, 4 }, { "mcl_books:bookshelf", 1 ,1 }}, + }, + + { + { { "mcl_books:written_book", 2, 2 }, E1 }, + { { "mcl_core:emerald", 10, 12 }, { "mcl_clock:clock", 1, 1 } }, + { E1, { "mcl_core:glass", 3, 5 } }, + }, + + { + { E1, { "mcl_core:glass", 3, 5 } }, + }, + + -- TODO: 2 enchanted book tiers + + { + { { "mcl_core:emerald", 20, 22 }, { "mcl_mobs:nametag", 1, 1 } }, + } + }, + }, + { + name = "Cartographer", + trades = { + { + { { "mcl_core:paper", 24, 36 }, E1 }, + }, + + { + { { "mcl_compass:compass", 1, 1 }, E1 }, + }, + + { + -- TODO: replace with empty map + { { "mcl_core:emerald", 7, 11}, { "mcl_maps:filled_map", 1, 1 } }, + }, + + -- TODO: special maps + }, + }, + { + name = "Armorer", + trades = { + { + { { "mcl_core:coal_lump", 16, 24 }, E1 }, + { { "mcl_core:emerald", 6, 8 }, { "3d_armor:helmet_iron", 1, 1 } }, + }, + + { + { { "mcl_core:iron_ingot", 7, 9 }, E1 }, + { { "mcl_core:emerald", 10, 14 }, { "3d_armor:chestplate_iron", 1, 1 } }, + }, + + { + { { "mcl_core:diamond", 3, 4 }, E1 }, + -- TODO: enchant + { { "mcl_core:emerald", 16, 19 }, { "3d_armor:chestplate_diamond", 1, 1 } }, + }, + + { + { { "mcl_core:emerald", 5, 7 }, { "3d_armor:boots_chain", 1, 1 } }, + { { "mcl_core:emerald", 9, 11 }, { "3d_armor:leggings_chain", 1, 1 } }, + { { "mcl_core:emerald", 5, 7 }, { "3d_armor:helmet_chain", 1, 1 } }, + { { "mcl_core:emerald", 11, 15 }, { "3d_armor:chestplate_chain", 1, 1 } }, + }, + }, + }, + { + name = "Leatherworker", + trades = { + { + { { "mcl_mobitems:leather", 9, 12 }, E1 }, + { { "mcl_core:emerald", 2, 4 }, { "3d_armor:leggings_leather", 2, 4 } }, + }, + + { + -- TODO: enchant + { { "mcl_core:emerald", 7, 12 }, { "3d_armor:chestplate_leather", 1, 1 } }, + }, + + { + { { "mcl_core:emerald", 8, 10 }, { "mcl_mobitems:saddle", 1, 1 } }, + }, + }, + }, + { + name = "Butcher", + trades = { + { + { { "mcl_mobitems:beef", 14, 18 }, E1 }, + { { "mcl_mobitems:chicken", 14, 18 }, E1 }, + }, + + { + { { "mcl_core:coal_lump", 16, 24 }, E1 }, + { E1, { "mcl_mobitems:cooked_beef", 5, 7 } }, + { E1, { "mcl_mobitems:cooked_chicken", 6, 8 } }, + }, + }, + }, + { + name = "Weapon Smith", + trades = { + { + { { "mcl_core:coal_lump", 16, 24 }, E1 }, + { { "mcl_core:emerald", 6, 8 }, { "mcl_tools:axe_iron", 1, 1 } }, + }, + + { + { { "mcl_core:iron_ingot", 7, 9 }, E1 }, + -- TODO: enchant + { { "mcl_core:emerald", 9, 10 }, { "mcl_tools:sword_iron", 1, 1 } }, + }, + + { + { { "mcl_core:diamond", 3, 4 }, E1 }, + -- TODO: enchant + { { "mcl_core:emerald", 12, 15 }, { "mcl_tools:sword_diamond", 1, 1 } }, + -- TODO: enchant + { { "mcl_core:emerald", 9, 12 }, { "mcl_tools:axe_diamond", 1, 1 } }, + }, + }, + }, + { + name = "Tool Smith", + trades = { + { + { { "mcl_core:coal_lump", 16, 24 }, E1 }, + -- TODO: enchant + { { "mcl_core:emerald", 5, 7 }, { "mcl_tools:shovel_iron", 1, 1 } }, + }, + + { + { { "mcl_core:iron_ingot", 7, 9 }, E1 }, + -- TODO: enchant + { { "mcl_core:emerald", 9, 11 }, { "mcl_tools:pick_iron", 1, 1 } }, + }, + + { + { { "mcl_core:diamond", 3, 4 }, E1 }, + -- TODO: enchant + { { "mcl_core:emerald", 12, 15 }, { "mcl_tools:pick_diamond", 1, 1 } }, + }, + }, + }, + { + name = "Cleric", + trades = { + { + { { "mcl_mobitems:rotten_flesh", 36, 40 }, E1 }, + { { "mcl_core:gold_ingot", 8, 10 }, E1 }, + }, + + { + { E1, { "mesecons:redstone", 1, 4 } }, + { E1, { "mcl_dye:blue", 1, 2 } }, + }, + + { + { E1, { "mcl_nether:glowstone", 1, 3 } }, + { { "mcl_core:emerald", 4, 7 }, { "mcl_throwing:ender_pearl", 1, 1 } }, + }, + + -- TODO: Bottle 'o enchanting + }, + }, + -- TODO: Nitwit +} mobs:register_mob("mobs_mc:villager", { @@ -146,45 +401,39 @@ mobs:register_mob("mobs_mc:villager", { end end, }) - end - inv:set_size("input", 2) - inv:set_size("output", 1) - inv:set_size("wanted", 2) - inv:set_size("offered", 1) + end + inv:set_size("input", 2) + inv:set_size("output", 1) + inv:set_size("wanted", 2) + inv:set_size("offered", 1) - local trades = { - {"mcl_core:apple 12", "mcl_core:emerald 1"}, - {"mcl_core:coal_lump 20", "mcl_core:emerald 1"}, - {"mcl_core:paper 30", "mcl_core:emerald 1"}, - {"mcl_mobitems:leather 10", "mcl_core:emerald 1"}, - {"mcl_books:book 2", "mcl_core:emerald 1"}, - {"mcl_farming:potato_item 15", "mcl_core:emerald 1"}, - {"mcl_farming:wheat_item 20", "mcl_core:emerald 1"}, - {"mcl_farming:carrot_item 15", "mcl_core:emerald 1"}, - {"mcl_farming:melon_item 8", "mcl_core:emerald 1"}, - {"mcl_mobitems:rotten_flesh 40","mcl_core:emerald 1"}, - {"mcl_core:gold_ingot 10", "mcl_core:emerald 1"}, - {"mcl_wool:white 15", "mcl_core:emerald 1"}, - {"mcl_farming:pumpkin_face 8", "mcl_core:emerald 1"}, + for i=1, inv:get_size("wanted") do + inv:set_stack("wanted", i, "") + end + for i=1, inv:get_size("offered") do + inv:set_stack("offered", i, "") + end - {"mcl_core:emerald 1", "mcl_mobitems:cooked_beef 5"}, - {"mcl_core:emerald 1", "mcl_mobitems:cooked_chicken 7"}, - {"mcl_core:emerald 1", "mcl_farming:cookie 6"}, - {"mcl_core:emerald 1", "mcl_bows:arrow 10"}, - {"mcl_core:emerald 3", "mcl_bows:bow 1"}, - {"mcl_core:emerald 1", "mcl_cake:cake 1"}, - {"mcl_core:emerald 10", "mcl_mobitems:saddle 1"}, - {"mcl_core:emerald 10", "mcl_clock:clock 1"}, - {"mcl_core:emerald 10", "mcl_compass:compass 1"}, - {"mcl_core:emerald 1", "mcl_core:glass 5"}, - {"mcl_core:emerald 1", "mcl_nether:glowstone 3"}, - {"mcl_core:emerald 3", "mcl_tools:shears 1"}, - {"mcl_core:emerald 10", "mcl_tools:sword_diamond 1"}, - {"mcl_core:emerald 20", "3d_armor:chestplate_diamond 1"}, - } - local tradenum = math.random(#trades) - inv:set_stack("wanted", 1, ItemStack(trades[tradenum][1])) - inv:set_stack("offered", 1, ItemStack(trades[tradenum][2])) + local profession = professions[math.random(1, #professions)] + local trade_tiers = profession.trades + if trade_tiers == nil then + return + end + local tier = trade_tiers[math.random(1, #trade_tiers)] + local tradenum = math.random(1, #tier) + local trade = tier[tradenum] + local wanted = ItemStack(trade[1][1]) + wanted:set_count(math.random(trade[1][2], trade[1][3])) + local offered = ItemStack(trade[2][1]) + offered:set_count(math.random(trade[2][2], trade[2][3])) + inv:set_stack("wanted", 1, wanted) + inv:set_stack("offered", 1, offered) + -- Second wanted item + if trade[1][4] then + local wanted2 = ItemStack(trade[1][4]) + wanted2:set_count(math.random(trade[1][5], trade[1][6])) + inv:set_stack("wanted", 2, wanted2) + end local formspec = "size[9,8.75]".. @@ -236,15 +485,13 @@ end local return_fields = function(player) local inv_t = minetest.get_inventory({type="detached", name = "mobs_mc:trade"}) local inv_p = player:get_inventory() - for i, stack in ipairs(inv_t:get_list("input")) do + 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 - for i, stack in ipairs(inv_t:get_list("output")) do - stack:clear() - inv_t:set_stack("output", i, stack) - end + inv_t:set_stack("output", 1, "") end minetest.register_on_player_receive_fields(function(player, formname, fields) From 10e2c174d42a74b48cd57b525cc5facd8f954c32 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Jun 2018 14:59:10 +0200 Subject: [PATCH 0115/1107] Pick random villager profession on spawn --- mods/ENTITIES/mobs_mc/villager.lua | 55 +++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 53b9aca7..faa86b12 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -11,9 +11,11 @@ local S, NS = dofile(MP.."/intllib.lua") --################### VILLAGER --################### +-- LIST OF VILLAGES PROFESSIONS AND TRADES local E1 = { "mcl_core:emerald", 1, 1 } -- one emerald local professions = { - { + farmer = { + id = "farmer", name = "Farmer", trades = { { @@ -39,7 +41,8 @@ local professions = { }, } }, - { + fisherman = { + id = "fisherman", name = "Fisherman", trades = { { @@ -50,7 +53,8 @@ local professions = { -- TODO: enchanted fishing rod }, }, - { + fletcher = { + id = "fletcher", name = "Fletcher", trades = { { @@ -64,7 +68,8 @@ local professions = { }, } }, - { + shepherd ={ + id = "shepherd", name = "Shepherd", trades = { { @@ -91,7 +96,8 @@ local professions = { }, }, }, - { + librarian = { + id = "librarian", name = "Librarian", trades = { { @@ -119,7 +125,8 @@ local professions = { } }, }, - { + cartographer = { + id = "cartographer", name = "Cartographer", trades = { { @@ -138,7 +145,8 @@ local professions = { -- TODO: special maps }, }, - { + armorer = { + id = "armorer", name = "Armorer", trades = { { @@ -165,7 +173,7 @@ local professions = { }, }, }, - { + leatherworker = { name = "Leatherworker", trades = { { @@ -183,7 +191,7 @@ local professions = { }, }, }, - { + butcher = { name = "Butcher", trades = { { @@ -198,7 +206,7 @@ local professions = { }, }, }, - { + weapon_smith = { name = "Weapon Smith", trades = { { @@ -221,7 +229,7 @@ local professions = { }, }, }, - { + tool_smith = { name = "Tool Smith", trades = { { @@ -243,7 +251,7 @@ local professions = { }, }, }, - { + cleric = { name = "Cleric", trades = { { @@ -267,6 +275,21 @@ local professions = { -- TODO: Nitwit } +local profession_names = {} +for id, _ in pairs(professions) do + table.insert(profession_names, id) +end + +local init_profession = function(self) + if not self._profession then + local p = math.random(1, #profession_names) + self._profession = profession_names[p] + end + if not self._max_trade_tier then + -- TODO: Randomize + self._max_trade_tier = 10 + end +end mobs:register_mob("mobs_mc:villager", { type = "npc", @@ -414,7 +437,9 @@ mobs:register_mob("mobs_mc:villager", { inv:set_stack("offered", i, "") end - local profession = professions[math.random(1, #professions)] + init_profession(self) + local profession = professions[self._profession] + local trade_tiers = profession.trades if trade_tiers == nil then return @@ -452,6 +477,10 @@ mobs:register_mob("mobs_mc:villager", { minetest.sound_play("mobs_mc_villager_trade", {to_player = clicker:get_player_name()}) minetest.show_formspec(clicker:get_player_name(), "mobs_mc:trade", formspec) end, + + on_spawn = function(self) + init_profession(self) + end, }) -- Returns a single itemstack in the given inventory to the player's main inventory, or drop it when there's no space left From cc1fe2f14f36ebeaf26438eed02607aa964a6724 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Jun 2018 15:21:59 +0200 Subject: [PATCH 0116/1107] Fix bread trade --- mods/ENTITIES/mobs_mc/villager.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index faa86b12..75dde688 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -22,7 +22,7 @@ local professions = { { { "mcl_farming:wheat_item", 18, 22, }, E1 }, { { "mcl_farming:potato_item", 15, 15, }, E1 }, { { "mcl_farming:carrot_item", 15, 19, }, E1 }, - { E1, { "mcl_core:bread", 2, 4 } }, + { E1, { "mcl_farming:bread", 2, 4 } }, }, { From e9bcbe1eadaa54a10000d39820cfd28238a40691 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Jun 2018 21:07:12 +0200 Subject: [PATCH 0117/1107] Store available trades in villager entity --- mods/ENTITIES/mobs_mc/villager.lua | 151 +++++++++++++++++++---------- 1 file changed, 99 insertions(+), 52 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 75dde688..6611393a 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -291,6 +291,67 @@ local init_profession = function(self) end end +local update_trades = function(self, inv) + local profession = professions[self._profession] + local trade_tiers = profession.trades + if trade_tiers == nil then + return + end + + local max_tier = math.min(#trade_tiers, self._max_trade_tier) + 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 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_item .. " " .. offered_count, + tier = tiernum, + }) + end + end + self._trades = minetest.serialize(trades) +end + +local set_trade = function(self, inv, concrete_tradenum) + local trades = minetest.deserialize(self._trades) + if not trades then + update_trades(self) + trades = minetest.deserialize(self._trades) + if not trades then + minetest.log("error", "[mobs_mc] Failed to select villager trade!") + return + end + end + + if concrete_tradenum > #trades then + concrete_tradenum = #trades + end + local trade = trades[concrete_tradenum] + inv:set_stack("wanted", 1, ItemStack(trade.wanted[1])) + inv:set_stack("offered", 1, ItemStack(trade.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 + mobs:register_mob("mobs_mc:villager", { type = "npc", hp_min = 20, @@ -359,6 +420,23 @@ mobs:register_mob("mobs_mc:villager", { local inv inv = minetest.get_inventory({type="detached", name="mobs_mc:trade"}) + local update_offer = function(inv, player, sound) + if inv:contains_item("input", inv:get_stack("wanted", 1)) and + (inv:get_stack("wanted", 2):is_empty() or inv:contains_item("input", inv:get_stack("wanted", 2))) then + inv:set_stack("output", 1, inv:get_stack("offered", 1)) + if sound then + minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name()}) + end + return true + else + inv:set_stack("output", 1, ItemStack("")) + if sound then + minetest.sound_play("mobs_mc_villager_deny", {to_player = player:get_player_name()}) + end + return false + end + end + if not inv then inv = minetest.create_detached_inventory("mobs_mc:trade", { allow_take = function(inv, listname, index, stack, player) @@ -387,41 +465,28 @@ mobs:register_mob("mobs_mc:villager", { end end, on_put = function(inv, listname, index, stack, player) - if inv:contains_item("input", inv:get_stack("wanted", 1)) then - inv:set_stack("output", 1, inv:get_stack("offered", 1)) - minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name()}) - else - inv:set_stack("output", 1, ItemStack("")) - minetest.sound_play("mobs_mc_villager_deny", {to_player = player:get_player_name()}) - end + update_offer(inv, player, true) end, on_move = function(inv, from_list, from_index, to_list, to_index, count, player) - if inv:contains_item("input", inv:get_stack("wanted", 1)) then - inv:set_stack("output", 1, inv:get_stack("offered", 1)) - minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name()}) - else - inv:set_stack("output", 1, ItemStack("")) - minetest.sound_play("mobs_mc_villager_deny", {to_player = player:get_player_name()}) - end + update_offer(inv, player, true) end, on_take = function(inv, listname, index, stack, player) local accept if listname == "output" 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 accept = true end - if inv:contains_item("input", inv:get_stack("wanted", 1)) then - inv:set_stack("output", 1, inv:get_stack("offered", 1)) - accept = true - else - inv:set_stack("output", 1, ItemStack("")) - accept = false - end if accept then minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name()}) else minetest.sound_play("mobs_mc_villager_deny", {to_player = player:get_player_name()}) end + + update_offer(inv, player, false) end, }) end @@ -430,42 +495,20 @@ mobs:register_mob("mobs_mc:villager", { inv:set_size("wanted", 2) inv:set_size("offered", 1) - for i=1, inv:get_size("wanted") do - inv:set_stack("wanted", i, "") - end - for i=1, inv:get_size("offered") do - inv:set_stack("offered", i, "") - end - init_profession(self) - local profession = professions[self._profession] + if not self._trades then + update_trades(self) + end + set_trade(self, inv, 1) - local trade_tiers = profession.trades - if trade_tiers == nil then - return - end - local tier = trade_tiers[math.random(1, #trade_tiers)] - local tradenum = math.random(1, #tier) - local trade = tier[tradenum] - local wanted = ItemStack(trade[1][1]) - wanted:set_count(math.random(trade[1][2], trade[1][3])) - local offered = ItemStack(trade[2][1]) - offered:set_count(math.random(trade[2][2], trade[2][3])) - inv:set_stack("wanted", 1, wanted) - inv:set_stack("offered", 1, offered) - -- Second wanted item - if trade[1][4] then - local wanted2 = ItemStack(trade[1][4]) - wanted2:set_count(math.random(trade[1][5], trade[1][6])) - inv:set_stack("wanted", 2, wanted2) - end - - local formspec = + local formspec = "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]".. mcl_vars.inventory_header.. - "list[current_player;main;0,4.5;9,3;9]".. - "list[current_player;main;0,7.74;9,1;]" + "list[current_player;main;0,4.5;9,3;9]" + .."list[current_player;main;0,7.74;9,1;]" + .."button[1,1;0.5,1;prev_trade;<]" + .."button[7.26,1;0.5,1;next_trade;>]" .."list[detached:mobs_mc:trade;wanted;2,1;2,1;]" .."list[detached:mobs_mc:trade;offered;5.76,1;1,1;]" .."list[detached:mobs_mc:trade;input;2,2.5;2,1;]" @@ -527,6 +570,10 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if formname == "mobs_mc:trade" then if fields.quit then return_fields(player) + elseif fields.next_trade then + + elseif fields.prev_trade then + end end end) From 9bfa11679489f16851ca06ba3f0180e29f1ce7a9 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Jun 2018 21:46:13 +0200 Subject: [PATCH 0118/1107] Allow to select different trades --- mods/ENTITIES/mobs_mc/villager.lua | 121 +++++++++++++++++++---------- 1 file changed, 81 insertions(+), 40 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 6611393a..e0a203a2 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -7,6 +7,11 @@ local MP = minetest.get_modpath(minetest.get_current_modname()) local S, NS = dofile(MP.."/intllib.lua") +-- 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 = {} + --################### --################### VILLAGER --################### @@ -326,7 +331,7 @@ local update_trades = function(self, inv) self._trades = minetest.serialize(trades) end -local set_trade = function(self, inv, concrete_tradenum) +local set_trade = function(self, player, inv, concrete_tradenum) local trades = minetest.deserialize(self._trades) if not trades then update_trades(self) @@ -338,7 +343,11 @@ local set_trade = function(self, inv, concrete_tradenum) end if concrete_tradenum > #trades then + concrete_tradenum = 1 + player_tradenum[player:get_player_name()] = concrete_tradenum + elseif concrete_tradenum < 1 then concrete_tradenum = #trades + player_tradenum[player:get_player_name()] = concrete_tradenum end local trade = trades[concrete_tradenum] inv:set_stack("wanted", 1, ItemStack(trade.wanted[1])) @@ -352,6 +361,44 @@ local set_trade = function(self, inv, concrete_tradenum) end +local function show_trade_formspec(playername) + local formspec = + "size[9,8.75]".. + "background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]".. + mcl_vars.inventory_header.. + "list[current_player;main;0,4.5;9,3;9]" + .."list[current_player;main;0,7.74;9,1;]" + .."button[1,1;0.5,1;prev_trade;<]" + .."button[7.26,1;0.5,1;next_trade;>]" + .."list[detached:mobs_mc:trade;wanted;2,1;2,1;]" + .."list[detached:mobs_mc:trade;offered;5.76,1;1,1;]" + .."list[detached:mobs_mc:trade;input;2,2.5;2,1;]" + .."list[detached:mobs_mc:trade;output;5.76,2.55;1,1;]" + .."listring[detached:mobs_mc:trade;output]" + .."listring[current_player;main]" + .."listring[detached:mobs_mc:trade;input]" + .."listring[current_player;main]" + minetest.sound_play("mobs_mc_villager_trade", {to_player = playername}) + minetest.show_formspec(playername, "mobs_mc:trade", formspec) +end + +local update_offer = function(inv, player, sound) + if inv:contains_item("input", inv:get_stack("wanted", 1)) and + (inv:get_stack("wanted", 2):is_empty() or inv:contains_item("input", inv:get_stack("wanted", 2))) then + inv:set_stack("output", 1, inv:get_stack("offered", 1)) + if sound then + minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name()}) + end + return true + else + inv:set_stack("output", 1, ItemStack("")) + if sound then + minetest.sound_play("mobs_mc_villager_deny", {to_player = player:get_player_name()}) + end + return false + end +end + mobs:register_mob("mobs_mc:villager", { type = "npc", hp_min = 20, @@ -417,26 +464,11 @@ mobs:register_mob("mobs_mc:villager", { view_range = 16, fear_height = 4, on_rightclick = function(self, clicker) - local inv - inv = minetest.get_inventory({type="detached", name="mobs_mc:trade"}) + local name = clicker:get_player_name() - local update_offer = function(inv, player, sound) - if inv:contains_item("input", inv:get_stack("wanted", 1)) and - (inv:get_stack("wanted", 2):is_empty() or inv:contains_item("input", inv:get_stack("wanted", 2))) then - inv:set_stack("output", 1, inv:get_stack("offered", 1)) - if sound then - minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name()}) - end - return true - else - inv:set_stack("output", 1, ItemStack("")) - if sound then - minetest.sound_play("mobs_mc_villager_deny", {to_player = player:get_player_name()}) - end - return false - end - end + player_trading_with[name] = self + local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade"}) if not inv then inv = minetest.create_detached_inventory("mobs_mc:trade", { allow_take = function(inv, listname, index, stack, player) @@ -499,26 +531,10 @@ mobs:register_mob("mobs_mc:villager", { if not self._trades then update_trades(self) end - set_trade(self, inv, 1) + player_tradenum[name] = 1 + set_trade(self, player, inv, player_tradenum[name]) - local formspec = - "size[9,8.75]".. - "background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]".. - mcl_vars.inventory_header.. - "list[current_player;main;0,4.5;9,3;9]" - .."list[current_player;main;0,7.74;9,1;]" - .."button[1,1;0.5,1;prev_trade;<]" - .."button[7.26,1;0.5,1;next_trade;>]" - .."list[detached:mobs_mc:trade;wanted;2,1;2,1;]" - .."list[detached:mobs_mc:trade;offered;5.76,1;1,1;]" - .."list[detached:mobs_mc:trade;input;2,2.5;2,1;]" - .."list[detached:mobs_mc:trade;output;5.76,2.55;1,1;]" - .."listring[detached:mobs_mc:trade;output]" - .."listring[current_player;main]" - .."listring[detached:mobs_mc:trade;input]" - .."listring[current_player;main]" - minetest.sound_play("mobs_mc_villager_trade", {to_player = clicker:get_player_name()}) - minetest.show_formspec(clicker:get_player_name(), "mobs_mc:trade", formspec) + show_trade_formspec(name) end, on_spawn = function(self) @@ -568,18 +584,43 @@ end minetest.register_on_player_receive_fields(function(player, formname, fields) if formname == "mobs_mc:trade" then + local name = player:get_player_name() if fields.quit then return_fields(player) + player_trading_with[name] = nil elseif fields.next_trade then - + local trader = player_trading_with[name] + if not trader or not trader.object:get_luaentity() then + return + end + player_tradenum[name] = player_tradenum[name] + 1 + local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade"}) + set_trade(trader, player, inv, player_tradenum[name]) + update_offer(inv, player, false) + show_trade_formspec(name) elseif fields.prev_trade then - + local trader = player_trading_with[name] + if not trader or not trader.object:get_luaentity() then + return + end + player_tradenum[name] = player_tradenum[name] - 1 + local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade"}) + set_trade(trader, player, inv, player_tradenum[name]) + update_offer(inv, player, false) + show_trade_formspec(name) end end end) minetest.register_on_leaveplayer(function(player) return_fields(player) + player_tradenum[player:get_player_name()] = nil + player_trading_with[player:get_player_name()] = nil +end) + +minetest.register_on_joinplayer(function(player) + player_tradenum[player:get_player_name()] = 1 + player_trading_with[player:get_player_name()] = nil end) mobs:spawn_specific("mobs_mc:villager", mobs_mc.spawn.village, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 8000, 4, mobs_mc.spawn_height.water+1, mobs_mc.spawn_height.overworld_max) From a58a01040d4fa2734fac34e09b2bef5b0b2a18d5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Jun 2018 22:13:24 +0200 Subject: [PATCH 0119/1107] Show villager name in trading formspec --- .../textures/mobs_mc_trading_formspec_bg.png | Bin 2015 -> 1936 bytes mods/ENTITIES/mobs_mc/villager.lua | 14 ++++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) 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 index cfc64aeaa25a5c43a6a1bffed14f5276c105f45d..029c686cd63630a5e41a3c6b196cc5a6f87468a3 100644 GIT binary patch literal 1936 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 diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index e0a203a2..a0415687 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -16,7 +16,7 @@ local player_trading_with = {} --################### VILLAGER --################### --- LIST OF VILLAGES PROFESSIONS AND TRADES +-- LIST OF VILLAGER PROFESSIONS AND TRADES local E1 = { "mcl_core:emerald", 1, 1 } -- one emerald local professions = { farmer = { @@ -361,12 +361,14 @@ local set_trade = function(self, player, inv, concrete_tradenum) end -local function show_trade_formspec(playername) +local function show_trade_formspec(playername, trader) + local profession = professions[trader._profession].name local formspec = "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]".. mcl_vars.inventory_header.. - "list[current_player;main;0,4.5;9,3;9]" + "label[4,0;"..minetest.formspec_escape(profession).."]" + .."list[current_player;main;0,4.5;9,3;9]" .."list[current_player;main;0,7.74;9,1;]" .."button[1,1;0.5,1;prev_trade;<]" .."button[7.26,1;0.5,1;next_trade;>]" @@ -534,7 +536,7 @@ mobs:register_mob("mobs_mc:villager", { player_tradenum[name] = 1 set_trade(self, player, inv, player_tradenum[name]) - show_trade_formspec(name) + show_trade_formspec(name, self) end, on_spawn = function(self) @@ -597,7 +599,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade"}) set_trade(trader, player, inv, player_tradenum[name]) update_offer(inv, player, false) - show_trade_formspec(name) + show_trade_formspec(name, trader) elseif fields.prev_trade then local trader = player_trading_with[name] if not trader or not trader.object:get_luaentity() then @@ -607,7 +609,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade"}) set_trade(trader, player, inv, player_tradenum[name]) update_offer(inv, player, false) - show_trade_formspec(name) + show_trade_formspec(name, trader) end end end) From 6e32d23d5678ed0791d1b2c040f8354b5ec6bbe4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Jun 2018 22:21:10 +0200 Subject: [PATCH 0120/1107] Add warnings and notes about trading implementation --- mods/ENTITIES/mobs_mc/villager.lua | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index a0415687..364e342e 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -3,6 +3,12 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes +-- TODO: Per-player trading inventories +-- TODO: Trading tiers +-- TODO: Trade locking +-- FIXME: Weird behaviour when taking single item from output stack +-- FIXME: Placing output on exiting item in player inventory destroys item + -- intllib local MP = minetest.get_modpath(minetest.get_current_modname()) local S, NS = dofile(MP.."/intllib.lua") @@ -291,7 +297,7 @@ local init_profession = function(self) self._profession = profession_names[p] end if not self._max_trade_tier then - -- TODO: Randomize + -- TODO: Start with tier 1 self._max_trade_tier = 10 end end @@ -368,6 +374,8 @@ local function show_trade_formspec(playername, trader) "background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]".. mcl_vars.inventory_header.. "label[4,0;"..minetest.formspec_escape(profession).."]" + -- FIXME: Remove when trading bugs are fixed + .."label[0,0.5;"..minetest.formspec_escape(minetest.colorize("#FF0000", "WARNING! Trading is incomplete and might have bugs!")).."]" .."list[current_player;main;0,4.5;9,3;9]" .."list[current_player;main;0,7.74;9,1;]" .."button[1,1;0.5,1;prev_trade;<]" @@ -470,6 +478,7 @@ mobs:register_mob("mobs_mc:villager", { player_trading_with[name] = self + -- TODO: Create per-player trading inventories local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade"}) if not inv then inv = minetest.create_detached_inventory("mobs_mc:trade", { From b504e8c317869c404e1d2de4cb25ff0528e4b79f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Jun 2018 22:23:46 +0200 Subject: [PATCH 0121/1107] Make trader warning less bright --- mods/ENTITIES/mobs_mc/villager.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 364e342e..85cfe226 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -375,7 +375,7 @@ local function show_trade_formspec(playername, trader) mcl_vars.inventory_header.. "label[4,0;"..minetest.formspec_escape(profession).."]" -- FIXME: Remove when trading bugs are fixed - .."label[0,0.5;"..minetest.formspec_escape(minetest.colorize("#FF0000", "WARNING! Trading is incomplete and might have bugs!")).."]" + .."label[0,0.5;"..minetest.formspec_escape(minetest.colorize("#FF3333", "WARNING! Trading is incomplete and has bugs!")).."]" .."list[current_player;main;0,4.5;9,3;9]" .."list[current_player;main;0,7.74;9,1;]" .."button[1,1;0.5,1;prev_trade;<]" From 64fe90257db7a5b44296e915dc7488d7bad88219 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 4 Jun 2018 22:27:03 +0200 Subject: [PATCH 0122/1107] Version 0.40.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0c7a9d5f..ee6bc747 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.39.0 +Version: 0.40.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 0e00c85f993c15f276d48df246a714cdc2413ee7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Jun 2018 01:44:57 +0200 Subject: [PATCH 0123/1107] Add README into tools directory --- tools/README.md | 26 ++++++++++++++++++++++++++ tools/Texture_Converter.py | 16 +++------------- 2 files changed, 29 insertions(+), 13 deletions(-) create mode 100644 tools/README.md diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 00000000..3f069877 --- /dev/null +++ b/tools/README.md @@ -0,0 +1,26 @@ +# MineClone 2 Tools +This directory is for tools and scripts for MineClone 2. +Currently, the only tool is Texture Converter. + +## Texture Converter (EXPERIMENTAL) +This is a Python script which converts a resource pack for Minecraft to +a texture pack for Minetest (and thus, MineClone 2). + +**WARNING**: This script is currently incomplete, not all textures will be +converted. Some texture conversions are even buggy! +For a 100% complete texture pack, a bit of manual work will be required +afterwards. + +Modes of operation: +- Can create a Minetest texture pack (default) +- Can update the MineClone 2 textures + +Requirements: +- Know how to use the console +- Python 3 +- ImageMagick + +Usage: +- Make sure the file “`Conversion_Table.csv`” is in the same directory as the script +- In the console, run `./Texture_Converter.py -h` to learn the available options + diff --git a/tools/Texture_Converter.py b/tools/Texture_Converter.py index 22a6fe6b..3f449a15 100755 --- a/tools/Texture_Converter.py +++ b/tools/Texture_Converter.py @@ -1,17 +1,7 @@ #!/usr/bin/env python -# EXPERIMENTAL texture pack converting utility. -# This Python script helps in converting Minecraft texture packs. It has 2 main features: -# - Can create a Minetest texture pack (default) -# - Can update the MineClone 2 textures -# This script is currently incomplete, not all textures are converted. -# -# Requirements: -# - Python 3 -# - ImageMagick -# -# Usage: -# - Make sure the file “Conversion_Table.csv” is in the same directory as the script -# - Run ./Texture_Converter.py -h to learn the available options +# Texture Converter. +# Converts Minecraft resource packs to Minetest texture packs. +# See README.md. __author__ = "Wuzzy" __license__ = "MIT License" From 309dc4048409a92577fbe9854d737ab0491d57a5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Jun 2018 01:53:59 +0200 Subject: [PATCH 0124/1107] Fix typos in Texture Converter --- tools/README.md | 6 ++++-- tools/Texture_Converter.py | 14 +++++++------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/tools/README.md b/tools/README.md index 3f069877..2b6d0643 100644 --- a/tools/README.md +++ b/tools/README.md @@ -4,7 +4,7 @@ Currently, the only tool is Texture Converter. ## Texture Converter (EXPERIMENTAL) This is a Python script which converts a resource pack for Minecraft to -a texture pack for Minetest (and thus, MineClone 2). +a texture pack for Minetest so it can be used with MineClone 2. **WARNING**: This script is currently incomplete, not all textures will be converted. Some texture conversions are even buggy! @@ -23,4 +23,6 @@ Requirements: Usage: - Make sure the file “`Conversion_Table.csv`” is in the same directory as the script - In the console, run `./Texture_Converter.py -h` to learn the available options - +- Convert the textures +- Put the new texture directory in the Minetest texture pack directory, just like + any other Minetest texture pack diff --git a/tools/Texture_Converter.py b/tools/Texture_Converter.py index 3f449a15..809b020d 100755 --- a/tools/Texture_Converter.py +++ b/tools/Texture_Converter.py @@ -40,17 +40,17 @@ Mandatory argument: Optional arguments: -p - Specify the size of the original textures (default: 16) + Specify the size (pixels) of the original textures (default: 16) -o - Directory in which to put the resulting MineClone 2 texture pack + Directory in which to put the resulting Minetest texture pack (default: working directory) -d - The script will only pretend to convert textures by writing - to the console only, but not changing any files. + Just pretend to convert textures and just print output, but do not actually + change any files. -v - Prints out all copying actions + Print out all copying actions -h - Shows this help an exits""" + Show this help and exit""" try: opts, args = getopt.getopt(sys.argv[1:],"hi:o:p:dv") except getopt.GetoptError: @@ -65,7 +65,7 @@ for opt, arg in opts: print( """This is the official MineClone 2 Texture Converter. This will convert textures from Minecraft resource packs to -a MineClone 2 texture pack. +a Minetest texture pack. Supported Minecraft version: 1.12 (Java Edition) From 1752e29f2d67540e87b6ea35d7dc19c216171702 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Jun 2018 01:58:23 +0200 Subject: [PATCH 0125/1107] Update Texture Converter README again --- tools/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/README.md b/tools/README.md index 2b6d0643..abcc73ae 100644 --- a/tools/README.md +++ b/tools/README.md @@ -8,8 +8,9 @@ a texture pack for Minetest so it can be used with MineClone 2. **WARNING**: This script is currently incomplete, not all textures will be converted. Some texture conversions are even buggy! -For a 100% complete texture pack, a bit of manual work will be required -afterwards. +Coverage is close to 100%, but it's not quite there yet. +For a 100% complete texture pack, a bit of manual work on the textures +will be required afterwards. Modes of operation: - Can create a Minetest texture pack (default) From 58df62ec8cb706cfe7d145940949ca733bf9e8ee Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Jun 2018 01:58:40 +0200 Subject: [PATCH 0126/1107] Add encoding definition to Texture Converter --- tools/Texture_Converter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/Texture_Converter.py b/tools/Texture_Converter.py index 809b020d..5fd78139 100755 --- a/tools/Texture_Converter.py +++ b/tools/Texture_Converter.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +# -*- coding: utf-8 -*- # Texture Converter. # Converts Minecraft resource packs to Minetest texture packs. # See README.md. From 1e72dd6b33ddb398c7883db5bb54d373982715ff Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Jun 2018 02:03:07 +0200 Subject: [PATCH 0127/1107] More Texture Converter clarification --- tools/Texture_Converter.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/Texture_Converter.py b/tools/Texture_Converter.py index 5fd78139..6cb6cdb4 100755 --- a/tools/Texture_Converter.py +++ b/tools/Texture_Converter.py @@ -40,8 +40,8 @@ Mandatory argument: Directory of Minecraft resource pack to convert Optional arguments: --p - Specify the size (pixels) of the original textures (default: 16) +-p + Specify the size (in pixels) of the original textures (default: 16) -o Directory in which to put the resulting Minetest texture pack (default: working directory) @@ -86,11 +86,11 @@ Syntax:""") if base_dir == None: print( -"""ERROR: You forgot to tell me the path to the Minecraft resource pack. +"""ERROR: You didn't tell me the path to the Minecraft resource pack. Mind-reading has not been implemented yet. Try this: - """+appname+""" -i + """+appname+""" -i -p For the full help, use: """+appname+""" -h""") From 7a080ac30854e671be479af76635df6c8b5785dd Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 5 Jun 2018 19:27:18 +0200 Subject: [PATCH 0128/1107] Fix up/down observers dropping themselves --- mods/ITEMS/REDSTONE/mcl_observers/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ITEMS/REDSTONE/mcl_observers/init.lua b/mods/ITEMS/REDSTONE/mcl_observers/init.lua index e0eb57d9..0017d461 100644 --- a/mods/ITEMS/REDSTONE/mcl_observers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_observers/init.lua @@ -137,6 +137,7 @@ mesecon.register_node("mcl_observers:observer_down", on_rotate = false, _mcl_blast_resistance = 17.5, _mcl_hardness = 3.5, + drop = "mcl_observers:observer_off", }, { tiles = { @@ -185,6 +186,7 @@ mesecon.register_node("mcl_observers:observer_up", on_rotate = false, _mcl_blast_resistance = 17.5, _mcl_hardness = 3.5, + drop = "mcl_observers:observer_off", }, { tiles = { From 3c4a1013b832bf10978d9c812689a74936ad0368 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Jun 2018 00:16:25 +0200 Subject: [PATCH 0129/1107] Villager: Prevent taking partial track from output --- mods/ENTITIES/mobs_mc/villager.lua | 34 +++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 85cfe226..9c67f36f 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -6,7 +6,6 @@ -- TODO: Per-player trading inventories -- TODO: Trading tiers -- TODO: Trade locking --- FIXME: Weird behaviour when taking single item from output stack -- FIXME: Placing output on exiting item in player inventory destroys item -- intllib @@ -483,22 +482,30 @@ mobs:register_mob("mobs_mc:villager", { if not inv then inv = minetest.create_detached_inventory("mobs_mc:trade", { allow_take = function(inv, listname, index, stack, player) - if listname == "input" or listname == "output" then + if listname == "input" then return stack:get_count() + elseif listname == "output" then + -- Only allow taking full stack + local count = stack:get_count() + if count == inv:get_stack(listname, index):get_count() then + return count + 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 == "wanted" or from_list == "offered" or to_list == "wanted" or to_list == "offered" then - return 0 - elseif from_list == "output" and inv:get_stack(to_list, to_index):is_empty() then + if from_list == "input" and to_list == "input" then return count - elseif from_list == "input" then - return count - else - return 0 + elseif from_list == "output" and to_list == "input" then + 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 @@ -511,6 +518,14 @@ mobs:register_mob("mobs_mc:villager", { 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()}) + end update_offer(inv, player, true) end, on_take = function(inv, listname, index, stack, player) @@ -528,7 +543,6 @@ mobs:register_mob("mobs_mc:villager", { else minetest.sound_play("mobs_mc_villager_deny", {to_player = player:get_player_name()}) end - update_offer(inv, player, false) end, }) From 1c0e02625978b34cde821301607e394f132aeafd Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Jun 2018 00:43:10 +0200 Subject: [PATCH 0130/1107] Villager: Fix taking output sometimes destroy item --- mods/ENTITIES/mobs_mc/villager.lua | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 9c67f36f..218a4b75 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -6,7 +6,6 @@ -- TODO: Per-player trading inventories -- TODO: Trading tiers -- TODO: Trade locking --- FIXME: Placing output on exiting item in player inventory destroys item -- intllib local MP = minetest.get_modpath(minetest.get_current_modname()) @@ -373,8 +372,6 @@ local function show_trade_formspec(playername, trader) "background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]".. mcl_vars.inventory_header.. "label[4,0;"..minetest.formspec_escape(profession).."]" - -- FIXME: Remove when trading bugs are fixed - .."label[0,0.5;"..minetest.formspec_escape(minetest.colorize("#FF3333", "WARNING! Trading is incomplete and has bugs!")).."]" .."list[current_player;main;0,4.5;9,3;9]" .."list[current_player;main;0,7.74;9,1;]" .."button[1,1;0.5,1;prev_trade;<]" @@ -488,7 +485,23 @@ mobs:register_mob("mobs_mc:villager", { -- Only allow taking full stack local count = stack:get_count() if count == inv:get_stack(listname, index):get_count() then - return count + -- 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) + wanted1:set_count(wanted1:get_count()*2) + wanted2:set_count(wanted2:get_count()*2) + if inv:contains_item("input", wanted1) and + (wanted2:is_empty() or inv:contains_item("input", wanted2)) then + 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 @@ -537,13 +550,14 @@ mobs:register_mob("mobs_mc:villager", { inv:remove_item("input", inv:get_stack("wanted", 2)) 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 = player:get_player_name()}) else minetest.sound_play("mobs_mc_villager_deny", {to_player = player:get_player_name()}) end - update_offer(inv, player, false) end, }) end From f545af54c1f2d09f0933c8dbb7a26af70bd1b80e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Jun 2018 01:08:57 +0200 Subject: [PATCH 0131/1107] Disable buggy compass trade --- mods/ENTITIES/mobs_mc/villager.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 218a4b75..b40f7563 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -142,9 +142,11 @@ local professions = { { { "mcl_core:paper", 24, 36 }, E1 }, }, - { - { { "mcl_compass:compass", 1, 1 }, E1 }, - }, +-- { + -- TODO: compass + -- the difficulty lies in supporting the compass group, not the concrete item +-- { { "mcl_compass:compass", 1, 1 }, E1 }, +-- }, { -- TODO: replace with empty map From 829ca1f1c1b9c76bc714988af85aa6f7aaa19ef2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Jun 2018 13:55:19 +0200 Subject: [PATCH 0132/1107] Villager profession depends on clothes, add nitwit --- mods/ENTITIES/mobs_mc/villager.lua | 53 ++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index b40f7563..4711b96f 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -24,8 +24,8 @@ local player_trading_with = {} local E1 = { "mcl_core:emerald", 1, 1 } -- one emerald local professions = { farmer = { - id = "farmer", name = "Farmer", + texture = "mobs_mc_villager_farmer.png", trades = { { { { "mcl_farming:wheat_item", 18, 22, }, E1 }, @@ -51,8 +51,8 @@ local professions = { } }, fisherman = { - id = "fisherman", name = "Fisherman", + texture = "mobs_mc_villager_farmer.png", trades = { { { { "mcl_fishing:fish_raw", 6, 6, "mcl_core:emerald", 1, 1 }, { "mcl_fishing:fish_cooked", 6, 6 } }, @@ -63,8 +63,8 @@ local professions = { }, }, fletcher = { - id = "fletcher", name = "Fletcher", + texture = "mobs_mc_villager_farmer.png", trades = { { { { "mcl_mobitems:string", 15, 20 }, E1 }, @@ -78,8 +78,8 @@ local professions = { } }, shepherd ={ - id = "shepherd", name = "Shepherd", + texture = "mobs_mc_villager_farmer.png", trades = { { { { "mcl_wool:white", 16, 22 }, E1 }, @@ -106,8 +106,8 @@ local professions = { }, }, librarian = { - id = "librarian", name = "Librarian", + texture = "mobs_mc_villager_librarian.png", trades = { { { { "mcl_core:paper", 24, 36 }, E1 }, @@ -135,8 +135,8 @@ local professions = { }, }, cartographer = { - id = "cartographer", name = "Cartographer", + texture = "mobs_mc_villager_librarian.png", trades = { { { { "mcl_core:paper", 24, 36 }, E1 }, @@ -157,8 +157,8 @@ local professions = { }, }, armorer = { - id = "armorer", name = "Armorer", + texture = "mobs_mc_villager_smith.png", trades = { { { { "mcl_core:coal_lump", 16, 24 }, E1 }, @@ -186,6 +186,7 @@ local professions = { }, leatherworker = { name = "Leatherworker", + texture = "mobs_mc_villager_butcher.png", trades = { { { { "mcl_mobitems:leather", 9, 12 }, E1 }, @@ -204,6 +205,7 @@ local professions = { }, butcher = { name = "Butcher", + texture = "mobs_mc_villager_butcher.png", trades = { { { { "mcl_mobitems:beef", 14, 18 }, E1 }, @@ -219,6 +221,7 @@ local professions = { }, weapon_smith = { name = "Weapon Smith", + texture = "mobs_mc_villager_smith.png", trades = { { { { "mcl_core:coal_lump", 16, 24 }, E1 }, @@ -242,6 +245,7 @@ local professions = { }, tool_smith = { name = "Tool Smith", + texture = "mobs_mc_villager_smith.png", trades = { { { { "mcl_core:coal_lump", 16, 24 }, E1 }, @@ -264,6 +268,7 @@ local professions = { }, cleric = { name = "Cleric", + texture = "mobs_mc_villager_priest.png", trades = { { { { "mcl_mobitems:rotten_flesh", 36, 40 }, E1 }, @@ -283,7 +288,12 @@ local professions = { -- TODO: Bottle 'o enchanting }, }, - -- TODO: Nitwit + nitwit = { + name = "Nitwit", + texture = "mobs_mc_villager.png", + -- No trades for nitwit + trades = nil, + } } local profession_names = {} @@ -293,8 +303,16 @@ end local init_profession = function(self) if not self._profession then - local p = math.random(1, #profession_names) - self._profession = profession_names[p] + -- Select random profession from all professions with matching clothing + local texture = self.base_texture[1] + local matches = {} + for prof_id, prof in pairs(professions) do + if texture == prof.texture then + table.insert(matches, prof_id) + end + end + local p = math.random(1, #matches) + self._profession = matches[p] end if not self._max_trade_tier then -- TODO: Start with tier 1 @@ -306,6 +324,8 @@ local update_trades = function(self, inv) local profession = professions[self._profession] local trade_tiers = profession.trades if trade_tiers == nil then + -- Empty trades + self._trades = false return end @@ -474,6 +494,15 @@ mobs:register_mob("mobs_mc:villager", { on_rightclick = function(self, clicker) local name = clicker:get_player_name() + init_profession(self) + if self._trades == nil then + update_trades(self) + end + if self._trades == false then + -- Villager has no trades, rightclick is a no-op + return + end + player_trading_with[name] = self -- TODO: Create per-player trading inventories @@ -568,10 +597,6 @@ mobs:register_mob("mobs_mc:villager", { inv:set_size("wanted", 2) inv:set_size("offered", 1) - init_profession(self) - if not self._trades then - update_trades(self) - end player_tradenum[name] = 1 set_trade(self, player, inv, player_tradenum[name]) From 2c55daa3e295b241d82141d4aa60460ba2e0472d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Jun 2018 14:12:27 +0200 Subject: [PATCH 0133/1107] Change nitwit villager texture --- .../mobs_mc/textures/mobs_mc_villager.png | Bin 848 -> 799 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_villager.png index 62c98bcdaa890ae2a5a7cb0c043fff20bb2686d1..7220aa15b7c20574a2e4656e2f66dc928c2780c7 100644 GIT binary patch delta 487 zcmcb>HlJ;R3S;9$RnI{GXiYme1>Xn_dp8B|Fc*(d``{$6xa?pDHw8y;WoKVydr!rX zL~XY~RU<1Yk07vf|1_s8GAirP+hi5m^7#Ns*Chojje_C1m zE?c5R*Eju3YxJcbU3mB3zTkR{(#I_630pF6H{RG3BL8*L;e1t@YA2Z+ia!_xTIQ8E zUH)0KD`x%l&Ie`Dq9+cx6tIN{s0N76;bL4NrlTywu2d;{Q2e;Mz`J(M-c=7iZvXha zQ{h;W!{aO8)^Ph7cQLdXh|Tou)A-V?q?;WcAHQo*pt|RDL7Qp?spQv4Ulyy>Q}j rQzqk?pVqT*@-(sR`>FiTCf=!c|CZ3_eEtj!3=E#GY<@25oD!MXwqS`g|*U)9V4VZ!<73FqQ=Q1v5B2yOGAgz|=f(|K0l4%FK7%7D{v! zb-({#gD8M1>0%=ZF|?ld0$QYCRQp;F?GB^9xCfZ^l>) zF34puYc~sel(Df;X3oUBoK6qUs$}by8khMUxV9{7()JsN5^OYQWaLgcc1_~Ok<7-U zFPB&>U)re7`s{*I(^0V);Ts|c Date: Wed, 6 Jun 2018 14:39:16 +0200 Subject: [PATCH 0134/1107] Add disabled trade image --- .../mobs_mc_trading_formspec_disabled.png | Bin 0 -> 256 bytes mods/ENTITIES/mobs_mc/villager.lua | 7 ++++++- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_trading_formspec_disabled.png 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 new file mode 100644 index 0000000000000000000000000000000000000000..3516b8bd2167a2c1e3138cdcb80201728a90e017 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0y~yU@!+^MrH;EhDo9htPBhcYymzYt_%ze2c@JcT-_uY z7#J8!g8YIR9G=}sV_;xd;pyTSQo)$?Ac29Al}*wh_CNyrvU-Cn%^Jt-dHzc`n0&Tx z`^D@q>o0%vUuK1~|C=5EF)vUvGGyT3Xu7c~w(wNoAuoabyHCD3KAV01W2NZD94|R! zt?$+Cel|~PtI?*I`P1j+XcaM-q1)NvyG8)9yRimHgpR{g;2Y{pIJ! z|2wK(_j5}8&uR5vL*l=N)&E^#|8@1htLJ}3?|)tYIm7PkYsP7U*?0Hw9o)viz`)?? L>gTe~DWM4fo#1Bz literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 4711b96f..07cc1fa1 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -387,11 +387,16 @@ local set_trade = function(self, player, inv, concrete_tradenum) end -local function show_trade_formspec(playername, trader) +local function show_trade_formspec(playername, trader, is_disabled) local profession = professions[trader._profession].name + local disabled = "" + if is_disabled then + disabled = "image[4.3,2.52;1,1;mobs_mc_trading_formspec_disabled.png]" + end local formspec = "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]".. + disabled.. mcl_vars.inventory_header.. "label[4,0;"..minetest.formspec_escape(profession).."]" .."list[current_player;main;0,4.5;9,3;9]" From 8b95871682f357c3c688180b02b618077648097b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Jun 2018 16:34:44 +0200 Subject: [PATCH 0135/1107] Implement trading tier unlocking --- mods/ENTITIES/mobs_mc/villager.lua | 79 ++++++++++++++++++++++++------ 1 file changed, 65 insertions(+), 14 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 07cc1fa1..f541260c 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -4,7 +4,6 @@ --License for code WTFPL and otherwise stated in readmes -- TODO: Per-player trading inventories --- TODO: Trading tiers -- TODO: Trade locking -- intllib @@ -315,12 +314,11 @@ local init_profession = function(self) self._profession = matches[p] end if not self._max_trade_tier then - -- TODO: Start with tier 1 - self._max_trade_tier = 10 + self._max_trade_tier = 1 end end -local update_trades = function(self, inv) +local init_trades = function(self, inv) local profession = professions[self._profession] local trade_tiers = profession.trades if trade_tiers == nil then @@ -329,7 +327,7 @@ local update_trades = function(self, inv) return end - local max_tier = math.min(#trade_tiers, self._max_trade_tier) + local max_tier = #trade_tiers local trades = {} for tiernum=1, max_tier do local tier = trade_tiers[tiernum] @@ -350,18 +348,21 @@ local update_trades = function(self, inv) table.insert(trades, { wanted = wanted, offered = offered_item .. " " .. offered_count, - tier = tiernum, + 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) end -local set_trade = function(self, player, inv, concrete_tradenum) - local trades = minetest.deserialize(self._trades) +local set_trade = function(trader, player, inv, concrete_tradenum) + local trades = minetest.deserialize(trader._trades) if not trades then - update_trades(self) - trades = minetest.deserialize(self._trades) + init_trades(trader) + trades = minetest.deserialize(trader._trades) if not trades then minetest.log("error", "[mobs_mc] Failed to select villager trade!") return @@ -376,6 +377,11 @@ local set_trade = function(self, player, inv, concrete_tradenum) player_tradenum[player:get_player_name()] = concrete_tradenum end local trade = trades[concrete_tradenum] + if trader._max_trade_tier < trade.tier then + concrete_tradenum = 1 + player_tradenum[player:get_player_name()] = concrete_tradenum + trade = trades[concrete_tradenum] + end inv:set_stack("wanted", 1, ItemStack(trade.wanted[1])) inv:set_stack("offered", 1, ItemStack(trade.offered)) if trade.wanted[2] then @@ -501,7 +507,7 @@ mobs:register_mob("mobs_mc:villager", { init_profession(self) if self._trades == nil then - update_trades(self) + init_trades(self) end if self._trades == false then -- Villager has no trades, rightclick is a no-op @@ -579,20 +585,57 @@ mobs:register_mob("mobs_mc:villager", { end, on_take = function(inv, listname, index, stack, player) local accept + local name = player:get_player_name() if listname == "output" 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 + 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_stuff = true + trade.traded_once = true + elseif math.random(1,5) then + -- Otherwise, 20% chance to unlock all trades + unlock_stuff = true + end + 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 + end + for t=1, #trades do + trades[t].locked = false + trades[t].trade_counter = 0 + end + end + trade.trade_counter = trade.trade_counter + 1 + if trade.trade_counter >= 12 then + trade.locked = true + elseif trade.trade_counter >= 2 then + math.random(1, math.random(1, 20)) + trade.locked = true + 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 = player:get_player_name()}) + minetest.sound_play("mobs_mc_villager_accept", {to_player = name}) else - minetest.sound_play("mobs_mc_villager_deny", {to_player = player:get_player_name()}) + minetest.sound_play("mobs_mc_villager_deny", {to_player = name}) end end, }) @@ -603,7 +646,7 @@ mobs:register_mob("mobs_mc:villager", { inv:set_size("offered", 1) player_tradenum[name] = 1 - set_trade(self, player, inv, player_tradenum[name]) + set_trade(self, clicker, inv, player_tradenum[name]) show_trade_formspec(name, self) end, @@ -664,6 +707,10 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if not trader or not trader.object:get_luaentity() then return end + local trades = trader._trades + if not trades then + return + end player_tradenum[name] = player_tradenum[name] + 1 local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade"}) set_trade(trader, player, inv, player_tradenum[name]) @@ -674,6 +721,10 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if not trader or not trader.object:get_luaentity() then return end + local trades = trader._trades + if not trades then + return + end player_tradenum[name] = player_tradenum[name] - 1 local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade"}) set_trade(trader, player, inv, player_tradenum[name]) From 3823a6ba111d8ee36e03aafaa86d7df06fe8cb3c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Jun 2018 17:33:14 +0200 Subject: [PATCH 0136/1107] Add trade locking for villagers --- mods/ENTITIES/mobs_mc/villager.lua | 86 +++++++++++++++++++++--------- 1 file changed, 61 insertions(+), 25 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index f541260c..b0b6f813 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -4,7 +4,8 @@ --License for code WTFPL and otherwise stated in readmes -- TODO: Per-player trading inventories --- TODO: Trade locking +-- TODO: Particles +-- TODO: 4s Regeneration I after trade unlock -- intllib local MP = minetest.get_modpath(minetest.get_current_modname()) @@ -89,18 +90,19 @@ local professions = { { { "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:light_blue", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:brown", 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:magenta", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:black", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:cyan", 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 } }, }, }, }, @@ -393,18 +395,26 @@ local set_trade = function(trader, player, inv, concrete_tradenum) end -local function show_trade_formspec(playername, trader, is_disabled) +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 = "" - if is_disabled then - disabled = "image[4.3,2.52;1,1;mobs_mc_trading_formspec_disabled.png]" + local disabled_img = "" + if trade.locked then + disabled_img = "image[4.3,2.52;1,1;mobs_mc_trading_formspec_disabled.png]" end local formspec = - "size[9,8.75]".. - "background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]".. - disabled.. - mcl_vars.inventory_header.. - "label[4,0;"..minetest.formspec_escape(profession).."]" + "size[9,8.75]" + .."background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]" + ..disabled_img + ..mcl_vars.inventory_header + .."label[4,0;"..minetest.formspec_escape(profession).."]" .."list[current_player;main;0,4.5;9,3;9]" .."list[current_player;main;0,7.74;9,1;]" .."button[1,1;0.5,1;prev_trade;<]" @@ -422,17 +432,32 @@ local function show_trade_formspec(playername, trader, is_disabled) end local update_offer = function(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 if inv:contains_item("input", inv:get_stack("wanted", 1)) and - (inv:get_stack("wanted", 2):is_empty() or inv:contains_item("input", inv:get_stack("wanted", 2))) then + (inv:get_stack("wanted", 2):is_empty() or inv:contains_item("input", inv:get_stack("wanted", 2))) and + (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 = player:get_player_name()}) + minetest.sound_play("mobs_mc_villager_accept", {to_player = name}) end return true else inv:set_stack("output", 1, ItemStack("")) if sound then - minetest.sound_play("mobs_mc_villager_deny", {to_player = player:get_player_name()}) + minetest.sound_play("mobs_mc_villager_deny", {to_player = name}) end return false end @@ -602,10 +627,12 @@ mobs:register_mob("mobs_mc:villager", { 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 math.random(1,5) then - -- Otherwise, 20% chance to unlock all trades + 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 if unlock_stuff then @@ -622,12 +649,21 @@ mobs:register_mob("mobs_mc:villager", { if trade.trade_counter >= 12 then trade.locked = true elseif trade.trade_counter >= 2 then - math.random(1, math.random(1, 20)) - trade.locked = true + local r = math.random(1, math.random(1, 9)) + if r == 1 then + trade.locked = true + end + end + + trader._trades = minetest.serialize(trades) + if trade.locked then + inv:set_stack("output", 1, "") + 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) @@ -646,7 +682,7 @@ mobs:register_mob("mobs_mc:villager", { inv:set_size("offered", 1) player_tradenum[name] = 1 - set_trade(self, clicker, inv, player_tradenum[name]) + set_trade(self, clicker, inv, player_tradenum[name], player_tradenum[name]) show_trade_formspec(name, self) end, @@ -715,7 +751,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade"}) set_trade(trader, player, inv, player_tradenum[name]) update_offer(inv, player, false) - show_trade_formspec(name, trader) + show_trade_formspec(name, trader, player_tradenum[name]) elseif fields.prev_trade then local trader = player_trading_with[name] if not trader or not trader.object:get_luaentity() then @@ -729,7 +765,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade"}) set_trade(trader, player, inv, player_tradenum[name]) update_offer(inv, player, false) - show_trade_formspec(name, trader) + show_trade_formspec(name, trader, player_tradenum[name]) end end end) From 4d4374730e4e3fd4bf42637eb0e612594ce9ad7a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Jun 2018 19:37:31 +0200 Subject: [PATCH 0137/1107] Trading: Allow to sell compass --- mods/ENTITIES/mobs_mc/villager.lua | 109 +++++++++++++++++++++++++---- 1 file changed, 97 insertions(+), 12 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index b0b6f813..47d28f24 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -6,6 +6,7 @@ -- TODO: Per-player trading inventories -- TODO: Particles -- TODO: 4s Regeneration I after trade unlock +-- FIXME: Possible to lock all trades -- intllib local MP = minetest.get_modpath(minetest.get_current_modname()) @@ -21,6 +22,20 @@ local player_trading_with = {} --################### -- 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 local professions = { farmer = { @@ -143,11 +158,10 @@ local professions = { { { "mcl_core:paper", 24, 36 }, E1 }, }, --- { - -- TODO: compass - -- the difficulty lies in supporting the compass group, not the concrete item --- { { "mcl_compass:compass", 1, 1 }, E1 }, --- }, + { + -- subject to special checks + { { "mcl_compass:compass", 1, 1 }, E1 }, + }, { -- TODO: replace with empty map @@ -446,9 +460,47 @@ local update_offer = function(inv, player, sound) if not trade then return false end - if inv:contains_item("input", inv:get_stack("wanted", 1)) and - (inv:get_stack("wanted", 2):is_empty() or inv:contains_item("input", inv:get_stack("wanted", 2))) and - (trade.locked == false) then + 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 check_special = function(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 check_input = function(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 check_specials = function(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}) @@ -558,10 +610,30 @@ mobs:register_mob("mobs_mc:villager", { -- 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) - if inv:contains_item("input", wanted1) and - (wanted2:is_empty() or inv:contains_item("input", wanted2)) then + -- BEGIN OF SPECIAL HANDLING FOR COMPASS + local special_checks = function(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, @@ -612,11 +684,24 @@ mobs:register_mob("mobs_mc:villager", { local accept local name = player:get_player_name() if listname == "output" then - inv:remove_item("input", inv:get_stack("wanted", 1)) + 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 @@ -649,7 +734,7 @@ mobs:register_mob("mobs_mc:villager", { if trade.trade_counter >= 12 then trade.locked = true elseif trade.trade_counter >= 2 then - local r = math.random(1, math.random(1, 9)) + local r = math.random(1, math.random(4, 10)) if r == 1 then trade.locked = true end From 5faed5d7f070bee67bdc3d4d7379b4d24d8cd01c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Jun 2018 19:50:17 +0200 Subject: [PATCH 0138/1107] Add 2 crosses in trading formspec --- mods/ENTITIES/mobs_mc/villager.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 47d28f24..5ac0c73a 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -3,7 +3,7 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- TODO: Per-player trading inventories +-- TODO/FIXME: Per-player trading inventories -- TODO: Particles -- TODO: 4s Regeneration I after trade unlock -- FIXME: Possible to lock all trades @@ -421,7 +421,8 @@ local function show_trade_formspec(playername, trader, 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]" + 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 formspec = "size[9,8.75]" From ce7ac37e850dd93902a95f14a445d3d65e2bdb70 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Jun 2018 21:28:23 +0200 Subject: [PATCH 0139/1107] Add a few v6-exclusive trades to villagers --- mods/ENTITIES/mobs_mc/villager.lua | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 5ac0c73a..0a845836 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -37,6 +37,16 @@ if minetest.registered_aliases[COMPASS] then end local E1 = { "mcl_core:emerald", 1, 1 } -- one emerald + +-- Special trades for v6 only +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 professions = { farmer = { name = "Farmer", @@ -44,7 +54,7 @@ local professions = { trades = { { { { "mcl_farming:wheat_item", 18, 22, }, E1 }, - { { "mcl_farming:potato_item", 15, 15, }, E1 }, + { { "mcl_farming:potato_item", 15, 19, }, E1 }, { { "mcl_farming:carrot_item", 15, 19, }, E1 }, { E1, { "mcl_farming:bread", 2, 4 } }, }, @@ -62,6 +72,9 @@ local professions = { { { E1, { "mcl_farming:cookie", 6, 10 } }, { E1, { "mcl_cake:cake", 1, 1 } }, + TRADE_V6_BIRCH_SAPLING, + TRADE_V6_DARK_OAK_SAPLING, + TRADE_V6_ACACIA_SAPLING, }, } }, @@ -297,6 +310,7 @@ local professions = { { { E1, { "mcl_nether:glowstone", 1, 3 } }, + TRADE_V6_RED_SANDSTONE, { { "mcl_core:emerald", 4, 7 }, { "mcl_throwing:ender_pearl", 1, 1 } }, }, From 9f2460c26341d73c4755e800a365c74e419c730f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 6 Jun 2018 21:29:44 +0200 Subject: [PATCH 0140/1107] Make red sandstone trade earlier --- mods/ENTITIES/mobs_mc/villager.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 0a845836..91cbea54 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -309,8 +309,8 @@ local professions = { }, { - { E1, { "mcl_nether:glowstone", 1, 3 } }, TRADE_V6_RED_SANDSTONE, + { E1, { "mcl_nether:glowstone", 1, 3 } }, { { "mcl_core:emerald", 4, 7 }, { "mcl_throwing:ender_pearl", 1, 1 } }, }, From cca841e45952b3988b93871dd2b87927aa2e403f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Jun 2018 12:05:05 +0200 Subject: [PATCH 0141/1107] Villager trading: Use per-player trading inventory --- mods/ENTITIES/mobs_mc/villager.lua | 380 +++++++++++++++-------------- 1 file changed, 194 insertions(+), 186 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 91cbea54..ccaeecf1 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -3,7 +3,6 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --- TODO/FIXME: Per-player trading inventories -- TODO: Particles -- TODO: 4s Regeneration I after trade unlock -- FIXME: Possible to lock all trades @@ -438,6 +437,8 @@ local function show_trade_formspec(playername, trader, tradenum) 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 = minetest.formspec_escape("detached:"..tradeinv_name) local formspec = "size[9,8.75]" .."background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]" @@ -448,16 +449,16 @@ local function show_trade_formspec(playername, trader, tradenum) .."list[current_player;main;0,7.74;9,1;]" .."button[1,1;0.5,1;prev_trade;<]" .."button[7.26,1;0.5,1;next_trade;>]" - .."list[detached:mobs_mc:trade;wanted;2,1;2,1;]" - .."list[detached:mobs_mc:trade;offered;5.76,1;1,1;]" - .."list[detached:mobs_mc:trade;input;2,2.5;2,1;]" - .."list[detached:mobs_mc:trade;output;5.76,2.55;1,1;]" - .."listring[detached:mobs_mc:trade;output]" + .."list["..tradeinv..";wanted;2,1;2,1;]" + .."list["..tradeinv..";offered;5.76,1;1,1;]" + .."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[detached:mobs_mc:trade;input]" + .."listring["..tradeinv..";input]" .."listring[current_player;main]" minetest.sound_play("mobs_mc_villager_trade", {to_player = playername}) - minetest.show_formspec(playername, "mobs_mc:trade", formspec) + minetest.show_formspec(playername, tradeinv_name, formspec) end local update_offer = function(inv, player, sound) @@ -608,178 +609,7 @@ mobs:register_mob("mobs_mc:villager", { player_trading_with[name] = self - -- TODO: Create per-player trading inventories - local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade"}) - if not inv then - inv = minetest.create_detached_inventory("mobs_mc:trade", { - allow_take = function(inv, listname, index, stack, player) - if listname == "input" then - return stack:get_count() - elseif listname == "output" then - -- 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 special_checks = function(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 - 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 - return stack:get_count() - 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()}) - 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 - 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 - end - for t=1, #trades do - trades[t].locked = false - trades[t].trade_counter = 0 - end - end - trade.trade_counter = trade.trade_counter + 1 - 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 - - trader._trades = minetest.serialize(trades) - if trade.locked then - inv:set_stack("output", 1, "") - 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}) - else - minetest.sound_play("mobs_mc_villager_deny", {to_player = name}) - end - end, - }) - end - inv:set_size("input", 2) - inv:set_size("output", 1) - inv:set_size("wanted", 2) - inv:set_size("offered", 1) + local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade_"..name}) player_tradenum[name] = 1 set_trade(self, clicker, inv, player_tradenum[name], player_tradenum[name]) @@ -821,7 +651,8 @@ local function return_item(itemstack, dropper, pos, inv_p) end local return_fields = function(player) - local inv_t = minetest.get_inventory({type="detached", name = "mobs_mc:trade"}) + 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() for i=1, inv_t:get_size("input") do local stack = inv_t:get_stack("input", i) @@ -833,7 +664,7 @@ local return_fields = function(player) end minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname == "mobs_mc:trade" then + if string.sub(formname, 1, 14) == "mobs_mc:trade_" then local name = player:get_player_name() if fields.quit then return_fields(player) @@ -848,7 +679,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) return end player_tradenum[name] = player_tradenum[name] + 1 - local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade"}) + local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade_"..name}) set_trade(trader, player, inv, player_tradenum[name]) update_offer(inv, player, false) show_trade_formspec(name, trader, player_tradenum[name]) @@ -862,7 +693,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) return end player_tradenum[name] = player_tradenum[name] - 1 - local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade"}) + local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade_"..name}) set_trade(trader, player, inv, player_tradenum[name]) update_offer(inv, player, false) show_trade_formspec(name, trader, player_tradenum[name]) @@ -876,9 +707,186 @@ minetest.register_on_leaveplayer(function(player) player_trading_with[player:get_player_name()] = 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 + -- 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 special_checks = function(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 + 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 + return stack:get_count() + 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()}) + 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 + 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 + end + for t=1, #trades do + trades[t].locked = false + trades[t].trade_counter = 0 + end + end + trade.trade_counter = trade.trade_counter + 1 + 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 + + trader._trades = minetest.serialize(trades) + if trade.locked then + inv:set_stack("output", 1, "") + 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}) + else + minetest.sound_play("mobs_mc_villager_deny", {to_player = name}) + end + end, +} + + minetest.register_on_joinplayer(function(player) - player_tradenum[player:get_player_name()] = 1 - player_trading_with[player:get_player_name()] = nil + 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) mobs:spawn_specific("mobs_mc:villager", mobs_mc.spawn.village, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 8000, 4, mobs_mc.spawn_height.water+1, mobs_mc.spawn_height.overworld_max) From 3e8ca5a1ca81c2fddb638972c359c157c3e2dc86 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Jun 2018 13:06:28 +0200 Subject: [PATCH 0142/1107] Trading: Hide left/right button if end of list --- mods/ENTITIES/mobs_mc/villager.lua | 73 ++++++++++++++++++------------ 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index ccaeecf1..5478a1e0 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -329,6 +329,21 @@ for id, _ in pairs(professions) do table.insert(profession_names, id) end +local update_max_tradenum = function(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 init_profession = function(self) if not self._profession then -- Select random profession from all professions with matching clothing @@ -397,20 +412,16 @@ local set_trade = function(trader, player, inv, concrete_tradenum) return end end + local name = player:get_player_name() - if concrete_tradenum > #trades then - concrete_tradenum = 1 - player_tradenum[player:get_player_name()] = concrete_tradenum + -- 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 = #trades - player_tradenum[player:get_player_name()] = concrete_tradenum - end - local trade = trades[concrete_tradenum] - if trader._max_trade_tier < trade.tier then concrete_tradenum = 1 - player_tradenum[player:get_player_name()] = concrete_tradenum - trade = trades[concrete_tradenum] end + player_tradenum[name] = concrete_tradenum + local trade = trades[concrete_tradenum] inv:set_stack("wanted", 1, ItemStack(trade.wanted[1])) inv:set_stack("offered", 1, ItemStack(trade.offered)) if trade.wanted[2] then @@ -439,6 +450,17 @@ local function show_trade_formspec(playername, trader, tradenum) end local tradeinv_name = "mobs_mc:trade_"..playername local tradeinv = minetest.formspec_escape("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 formspec = "size[9,8.75]" .."background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]" @@ -447,8 +469,7 @@ local function show_trade_formspec(playername, trader, tradenum) .."label[4,0;"..minetest.formspec_escape(profession).."]" .."list[current_player;main;0,4.5;9,3;9]" .."list[current_player;main;0,7.74;9,1;]" - .."button[1,1;0.5,1;prev_trade;<]" - .."button[7.26,1;0.5,1;next_trade;>]" + ..b_prev..b_next .."list["..tradeinv..";wanted;2,1;2,1;]" .."list["..tradeinv..";offered;5.76,1;1,1;]" .."list["..tradeinv..";input;2,2.5;2,1;]" @@ -602,6 +623,7 @@ mobs:register_mob("mobs_mc:villager", { 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 @@ -611,8 +633,7 @@ mobs:register_mob("mobs_mc:villager", { local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade_"..name}) - player_tradenum[name] = 1 - set_trade(self, clicker, inv, player_tradenum[name], player_tradenum[name]) + set_trade(self, clicker, inv, 1) show_trade_formspec(name, self) end, @@ -669,7 +690,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if fields.quit then return_fields(player) player_trading_with[name] = nil - elseif fields.next_trade then + 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 @@ -678,23 +699,13 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if not trades then return end - player_tradenum[name] = player_tradenum[name] + 1 - local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade_"..name}) - set_trade(trader, player, inv, player_tradenum[name]) - update_offer(inv, player, false) - show_trade_formspec(name, trader, player_tradenum[name]) - elseif fields.prev_trade then - local trader = player_trading_with[name] - if not trader or not trader.object:get_luaentity() then - return + local dir = 1 + if fields.prev_trade then + dir = -1 end - local trades = trader._trades - if not trades then - return - end - player_tradenum[name] = player_tradenum[name] - 1 + local tradenum = player_tradenum[name] + dir local inv = minetest.get_inventory({type="detached", name="mobs_mc:trade_"..name}) - set_trade(trader, player, inv, player_tradenum[name]) + set_trade(trader, player, inv, tradenum) update_offer(inv, player, false) show_trade_formspec(name, trader, player_tradenum[name]) end @@ -835,6 +846,8 @@ local trade_inventory = { -- 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 + update_max_tradenum(trader) + show_trade_formspec(name, trader, tradenum) end for t=1, #trades do trades[t].locked = false From ed52e494087081fa2d6f927b400be9d12309fd90 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Jun 2018 13:20:19 +0200 Subject: [PATCH 0143/1107] Heal trader for unlocking trades --- mods/ENTITIES/mobs_mc/villager.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 5478a1e0..e569ccbe 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -853,6 +853,9 @@ local trade_inventory = { trades[t].locked = false trades[t].trade_counter = 0 end + -- 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 if trade.trade_counter >= 12 then From 51ff6b17256b23903b117b2a18171f24d4685b06 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Jun 2018 13:48:40 +0200 Subject: [PATCH 0144/1107] Villager: Prevent locking of all trades This is done by adding an "emergency unlock" which unlocks everything else when the last trade was locked. --- mods/ENTITIES/mobs_mc/villager.lua | 43 ++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index e569ccbe..ef8d2b99 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -5,7 +5,6 @@ -- TODO: Particles -- TODO: 4s Regeneration I after trade unlock --- FIXME: Possible to lock all trades -- intllib local MP = minetest.get_modpath(minetest.get_current_modname()) @@ -360,6 +359,9 @@ local init_profession = function(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 end local init_trades = function(self, inv) @@ -842,34 +844,59 @@ local trade_inventory = { -- Otherwise, 20% chance to unlock if used freshly reset trade unlock_stuff = true end + -- DEBUG + unlock_stuff = false + 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 update_max_tradenum(trader) - show_trade_formspec(name, trader, tradenum) + 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 - 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 + -- 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 - trader._trades = minetest.serialize(trades) 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 From dbed565197b7fcaa925e7c83739350399ef9d899 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Jun 2018 13:53:26 +0200 Subject: [PATCH 0145/1107] Fix unlock_stuff being always false in villager --- mods/ENTITIES/mobs_mc/villager.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index ef8d2b99..d1913569 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -844,8 +844,6 @@ local trade_inventory = { -- Otherwise, 20% chance to unlock if used freshly reset trade unlock_stuff = true end - -- DEBUG - unlock_stuff = false local update_formspec = false if unlock_stuff then -- First-time trade unlock all trades and unlock next trade tier From aa3d3969aac7512d0169024b47f33bdde67e84ed Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Jun 2018 14:24:00 +0200 Subject: [PATCH 0146/1107] Make villager stand still if there is near player --- mods/ENTITIES/mobs_mc/villager.lua | 55 ++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index d1913569..9ff90f4b 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -3,6 +3,10 @@ --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes +--################### +--################### VILLAGER +--################### + -- TODO: Particles -- TODO: 4s Regeneration I after trade unlock @@ -15,9 +19,9 @@ local player_tradenum = {} -- playername-indexed table containing the objectref of trader, if trading formspec is open local player_trading_with = {} ---################### ---################### VILLAGER ---################### +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 -- LIST OF VILLAGER PROFESSIONS AND TRADES @@ -328,6 +332,11 @@ for id, _ in pairs(professions) do table.insert(profession_names, id) end +local stand_still = function(self) + self.walk_chance = 0 + self.jump = false +end + local update_max_tradenum = function(self) if not self._trades then return @@ -618,7 +627,10 @@ mobs:register_mob("mobs_mc:villager", { light_damage = 0, view_range = 16, fear_height = 4, + jump = true, + walk_chance = DEFAULT_WALK_CHANCE, on_rightclick = function(self, clicker) + -- Initiate trading local name = clicker:get_player_name() init_profession(self) @@ -638,6 +650,43 @@ mobs:register_mob("mobs_mc:villager", { 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, + 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 + end end, on_spawn = function(self) From 9faa3099a490f787ce1193c51c2aa950dc72eea2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Jun 2018 15:01:44 +0200 Subject: [PATCH 0147/1107] Trader: Close trade formspec + return items on die --- mods/ENTITIES/mobs_mc/villager.lua | 318 +++++++++++++++++------------ 1 file changed, 184 insertions(+), 134 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 9ff90f4b..44c0dbd4 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -6,6 +6,7 @@ --################### --################### VILLAGER --################### +-- Summary: Villagers are complex NPCs, their main feature allows players to trade with them. -- TODO: Particles -- TODO: 4s Regeneration I after trade unlock @@ -23,6 +24,8 @@ 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): @@ -352,7 +355,7 @@ local update_max_tradenum = function(self) self._max_tradenum = #trades end -local init_profession = function(self) +local init_trader_vars = function(self) if not self._profession then -- Select random profession from all professions with matching clothing local texture = self.base_texture[1] @@ -371,6 +374,9 @@ local init_profession = function(self) if not self._locked_trades then self._locked_trades = 0 end + if not self._trading_players then + self._trading_players = {} + end end local init_trades = function(self, inv) @@ -563,137 +569,6 @@ local update_offer = function(inv, player, sound) end end -mobs:register_mob("mobs_mc:villager", { - type = "npc", - 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 - }, - { - "mobs_mc_villager_farmer.png", - "mobs_mc_villager_farmer.png", --hat - }, - { - "mobs_mc_villager_priest.png", - "mobs_mc_villager_priest.png", --hat - }, - { - "mobs_mc_villager_librarian.png", - "mobs_mc_villager_librarian.png", --hat - }, - { - "mobs_mc_villager_butcher.png", - "mobs_mc_villager_butcher.png", --hat - }, - { - "mobs_mc_villager_smith.png", - "mobs_mc_villager_smith.png", --hat - }, - }, - visual_size = {x=3, y=3}, - makes_footstep_sound = true, - walk_velocity = 1.2, - run_velocity = 2.4, - drops = {}, - sounds = { - random = "mobs_mc_villager_noise", - death = "mobs_mc_villager_death", - damage = "mobs_mc_villager_damage", - distance = 16, - }, - 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, - die_speed = 15, - die_start = 210, - die_end = 220, - die_loop = false, - }, - water_damage = 0, - lava_damage = 4, - light_damage = 0, - view_range = 16, - fear_height = 4, - jump = true, - walk_chance = DEFAULT_WALK_CHANCE, - on_rightclick = function(self, clicker) - -- Initiate trading - local name = clicker:get_player_name() - - init_profession(self) - 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}) - - 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, - 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 - end - end, - - on_spawn = function(self) - init_profession(self) - 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 @@ -739,7 +614,13 @@ 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] @@ -766,14 +647,28 @@ end) minetest.register_on_leaveplayer(function(player) return_fields(player) player_tradenum[player:get_player_name()] = nil + local trader = player_trading_with[name] + if trader then + trader._trading_players[name] = nil + end player_trading_with[player:get_player_name()] = nil + end) +-- Return true if player is trading with villager, and the villager entity exists +local trader_exists = function(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 @@ -825,6 +720,9 @@ local trade_inventory = { 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 @@ -834,7 +732,11 @@ local trade_inventory = { end, allow_put = function(inv, listname, index, stack, player) if listname == "input" then - return stack:get_count() + if not trader_exists(player:get_player_name()) then + return 0 + else + return stack:get_count() + end else return 0 end @@ -962,7 +864,6 @@ local trade_inventory = { end, } - minetest.register_on_joinplayer(function(player) local name = player:get_player_name() player_tradenum[name] = 1 @@ -979,6 +880,155 @@ minetest.register_on_joinplayer(function(player) inv:set_size("offered", 1) end) +--[=======[ MOB REGISTRATION AND SPAWNING ]=======] + +mobs:register_mob("mobs_mc:villager", { + type = "npc", + 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 + }, + { + "mobs_mc_villager_farmer.png", + "mobs_mc_villager_farmer.png", --hat + }, + { + "mobs_mc_villager_priest.png", + "mobs_mc_villager_priest.png", --hat + }, + { + "mobs_mc_villager_librarian.png", + "mobs_mc_villager_librarian.png", --hat + }, + { + "mobs_mc_villager_butcher.png", + "mobs_mc_villager_butcher.png", --hat + }, + { + "mobs_mc_villager_smith.png", + "mobs_mc_villager_smith.png", --hat + }, + }, + visual_size = {x=3, y=3}, + makes_footstep_sound = true, + walk_velocity = 1.2, + run_velocity = 2.4, + drops = {}, + sounds = { + random = "mobs_mc_villager_noise", + death = "mobs_mc_villager_death", + damage = "mobs_mc_villager_damage", + distance = 16, + }, + 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, + die_speed = 15, + die_start = 210, + die_end = 220, + die_loop = false, + }, + water_damage = 0, + lava_damage = 4, + light_damage = 0, + view_range = 16, + fear_height = 4, + jump = true, + walk_chance = DEFAULT_WALK_CHANCE, + on_rightclick = function(self, clicker) + -- Initiate trading + local name = clicker:get_player_name() + self._trading_players[name] = true + + init_trader_vars(self) + 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}) + + 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 + end + end, + + on_spawn = function(self) + init_trader_vars(self) + end, + on_die = function(self, pos) + -- Close open trade formspecs and give input back to players + local trading_players = self._trading_players + 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, +}) + + + mobs:spawn_specific("mobs_mc:villager", mobs_mc.spawn.village, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 8000, 4, mobs_mc.spawn_height.water+1, mobs_mc.spawn_height.overworld_max) -- compatibility From a804144ed4ac6a5faf1fbea513e410fdc103bb43 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Jun 2018 15:09:52 +0200 Subject: [PATCH 0148/1107] Trading: Make iron helmet cheaper --- mods/ENTITIES/mobs_mc/villager.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 44c0dbd4..a5c7e0a6 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -195,7 +195,7 @@ local professions = { trades = { { { { "mcl_core:coal_lump", 16, 24 }, E1 }, - { { "mcl_core:emerald", 6, 8 }, { "3d_armor:helmet_iron", 1, 1 } }, + { { "mcl_core:emerald", 4, 6 }, { "3d_armor:helmet_iron", 1, 1 } }, }, { From e051eae5bca55c549886c2ba1919b107fc3530e2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Jun 2018 15:22:32 +0200 Subject: [PATCH 0149/1107] Lightning no longer turns villagers to witches Because witches are incomplete. Also add villager TODOs. --- mods/ENTITIES/mobs_mc/villager.lua | 8 ++++++++ mods/ENTITIES/mobs_mc/villager_zombie.lua | 2 +- mods/ENVIRONMENT/lightning/init.lua | 4 ++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index a5c7e0a6..fbc7bc52 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -10,6 +10,14 @@ -- TODO: Particles -- TODO: 4s Regeneration I after trade unlock +-- TODO: Breeding +-- TODO: Baby villagers +-- TODO: Spawning in villages +-- TODO: Behaviour: +-- TODO: Walk around village, but do not leave it intentionally +-- TODO: Run into house on rain or danger, open doors +-- TODO: Internal inventory, pick up items, trade with other villagers +-- TODO: Farm stuff -- intllib local MP = minetest.get_modpath(minetest.get_current_modname()) diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mobs_mc/villager_zombie.lua index 22e082c7..4abb6b6e 100644 --- a/mods/ENTITIES/mobs_mc/villager_zombie.lua +++ b/mods/ENTITIES/mobs_mc/villager_zombie.lua @@ -7,7 +7,7 @@ local MP = minetest.get_modpath(minetest.get_current_modname()) local S, NS = dofile(MP.."/intllib.lua") ---dofile(minetest.get_modpath("mobs").."/api.lua") +-- TODO: Turn villagers to zombie villager --################### --################### ZOMBIE VILLAGER diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index 0f3061e4..625934fb 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -191,10 +191,14 @@ lightning.strike = function(pos) obj:set_yaw(rot) -- villager → witch elseif lua.name == "mobs_mc:villager" then + -- Witches are incomplete, this code is unused + -- TODO: Enable this code when witches are working. + --[[ local rot = obj:get_yaw() obj:remove() obj = minetest.add_entity(pos2, "mobs_mc:witch") obj:set_yaw(rot) + ]] -- TODO: creeper → charged creeper elseif lua.name == "mobs_mc:creeper" then From fe0f4df958e43051f266afd3f2848a52f90803e7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Jun 2018 15:32:50 +0200 Subject: [PATCH 0150/1107] Remove WIP mark from villagers --- mods/MISC/mcl_wip/init.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/MISC/mcl_wip/init.lua b/mods/MISC/mcl_wip/init.lua index 40ad8d1e..8f9d206b 100644 --- a/mods/MISC/mcl_wip/init.lua +++ b/mods/MISC/mcl_wip/init.lua @@ -10,7 +10,6 @@ local wip_items = { "mcl_minecarts:activator_rail", "mobs_mc:enderdragon", "mobs_mc:wither", - "mobs_mc:villager", "mobs_mc:parrot", "mobs_mc:witch", } From 45add3cedd1b74d8ee94079c7ca109e03f7a2935 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Jun 2018 15:51:03 +0200 Subject: [PATCH 0151/1107] Add creamy horse texture --- mods/ENTITIES/mobs_mc/horse.lua | 1 + .../mobs_mc/textures/mobs_mc_horse_creamy.png | Bin 0 -> 1536 bytes tools/Conversion_Table.csv | 27 +++++++++--------- 3 files changed, 15 insertions(+), 13 deletions(-) create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_creamy.png diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 82d45520..8601768a 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -57,6 +57,7 @@ local horse_base = { "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 = { diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_creamy.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_horse_creamy.png new file mode 100644 index 0000000000000000000000000000000000000000..a4e6ce8f0dcd393784847242c99cf38d236dd11c GIT binary patch literal 1536 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4rT@hhA$5${$yZa$PDlaab;j&SW)Rx6=u>N zXR&8i?#VSx>szB2m-;_AKL6tOo}vIQY3YnHaum3vrdOz!Ilv)7oPZP%0Npsk>s z?y8e3C)ci_vDnUT&&ux0$2Qtpm~U=?}FY9(&@wl*N#At3gvgG&g{V!x=rQ7RITzk9W zv+HrGzdDynYtR2S;Mvm=<2q69Nk`@1JH2~s?XH>|nI3DKv-tP?-K;X2Ck3yZpV;d1 z?YBk@*VbLzS=#ocU;WMc=V9XCm4DVS{a$YC&*kIv$s*P0@2ZAXvz$#|e)R85Sak65 z<9W|rywoh;ms$4zY;#yTyZz^$hR-WB9 zB9kV^lxLuQ@;FaV&0k-}cE+kWhgkmhDQ9?;HH`&kPM4H0mdxiWiM9~?`{*H;Etf*! z+4iT-!CHblI5mwGroQmJGXGO<62&P`Ckb# zAElZtPtLOBGHa}RaC<*f;heV(kuOwCnNwJ^St@tuajn@un_(r>63zo>8J8@1m#5aa zo;5_dX$nJeq+#ebrY*O)c${_boZ{cg+~C$5z_5fXLAX&%=8{IPx;J0VLeYMPS8V*j)?ht=vG-}?Og^+jyPzJiTR-?lTof1l18plrZU zG%aRZeBAcU@0}7}XqQ-W?b*A3|H=2o%Nc%FRR5n~ed4D&(`V7f^XL1$Rm)fFTKsqK zk^H`empSmyx$p8q!v3>c6#N=$|MTzMJ>6<|l#7M;%ep1&-k&`6w?J9EFpK?7aU;`| zaQCtY*WXlqxc^J}0)zd->1@wVaI8LgIqzDsDY`438Os-+>8jCVb zCkEMgZksi}^DlYqTEo6dnDvZ?!O9?qCX41P6PfuRD$95JDa@NH-*3%ydFz2Gtn=oV zv!3`hUGCJZ3UwG2yJRIsbW+&ZQGy&$61ZX#HE<(ALn$-J{;jRA9nsar#i=!X6zy z=I7EZT2+mf2d&lf^czAMt~2H57jL+ipLXDr(uOs+j}+=#{t&$4%v7ADFX^)S5YGuF zZ>Kry%BqgWecI8G#`tqmG}jBQ1??=;j>H-1Gzd88Z?JeTFaO@D$abF0T}G)Xzqyyl zDwK;k+-9s%dcbk=YlRWZEk2dTpWH5PlN{I7ibse=)F{^)PoMc^>j@8|4#^Hx#{Cz6 z=O4dcae1GZq^H$_`HT(8v%fu&nPB`PL{!SBbe02=TQcW! z86Oqd5TE+q#>LuaDpT6)Ngs^5KQ3X|ee0=si%4MCeSu?b~D&~rCoZ*r> zT4LS2=IocOMpMTrADZSoEV}VWEA90f-(8KBaa`R7Nt2EL{GES-)lcVy@UhBNw_`sp r%gJysFfcH1eA*tD(9*>UVlyx}#J}GDa9j2N`yj5TtDnm{r-UW|MD~-W literal 0 HcmV?d00001 diff --git a/tools/Conversion_Table.csv b/tools/Conversion_Table.csv index 92a9f09c..ad12753e 100644 --- a/tools/Conversion_Table.csv +++ b/tools/Conversion_Table.csv @@ -677,7 +677,7 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/entity/cow,cow.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_cow.png,,,,,,, /assets/minecraft/textures/entity/creeper,creeper.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_creeper.png,,,,,,, /assets/minecraft/textures/items,diamond_horse_armor.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_diamond_horse_armor.png,,,,,,, -/assets/minecraft/textures/entity/horse,donkey.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_donkey.png,,,,,,,y +/assets/minecraft/textures/entity/horse,donkey.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_donkey.png,,,,,,, /assets/minecraft/textures/entity/enderdragon,dragon.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_dragon.png,,,,,,, /assets/minecraft/textures/entity/shulker,endergolem.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_endergolem.png,,,,,,, /assets/minecraft/textures/entity/enderman,enderman_eyes.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_enderman_eyes.png,,,,,,, @@ -690,23 +690,24 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/entity/horse/armor,horse_armor_diamond.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_armor_diamond.png,,,,,,, /assets/minecraft/textures/entity/horse/armor,horse_armor_gold.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_armor_gold.png,,,,,,, /assets/minecraft/textures/entity/horse/armor,horse_armor_iron.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_armor_iron.png,,,,,,, -/assets/minecraft/textures/entity/horse,horse_black.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_black.png,,,,,,,y -/assets/minecraft/textures/entity/horse,horse_brown.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_brown.png,,,,,,,y -/assets/minecraft/textures/entity/horse,horse_chestnut.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_chestnut.png,,,,,,,y -/assets/minecraft/textures/entity/horse,horse_darkbrown.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_darkbrown.png,,,,,,,y -/assets/minecraft/textures/entity/horse,horse_gray.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_gray.png,,,,,,,y -/assets/minecraft/textures/entity/horse,horse_markings_blackdots.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_markings_blackdots.png,,,,,,,y -/assets/minecraft/textures/entity/horse,horse_markings_whitedots.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_markings_whitedots.png,,,,,,,y -/assets/minecraft/textures/entity/horse,horse_markings_whitefield.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_markings_whitefield.png,,,,,,,y -/assets/minecraft/textures/entity/horse,horse_markings_white.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_markings_white.png,,,,,,,y -/assets/minecraft/textures/entity/horse,horse_white.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_white.png,,,,,,,y -/assets/minecraft/textures/entity/horse,horse_zombie.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_zombie.png,,,,,,,y +/assets/minecraft/textures/entity/horse,horse_black.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_black.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_brown.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_brown.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_chestnut.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_chestnut.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_darkbrown.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_darkbrown.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_gray.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_gray.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_creamy.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_creamy.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_markings_blackdots.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_markings_blackdots.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_markings_whitedots.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_markings_whitedots.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_markings_whitefield.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_markings_whitefield.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_markings_white.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_markings_white.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_white.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_white.png,,,,,,, +/assets/minecraft/textures/entity/horse,horse_zombie.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_horse_zombie.png,,,,,,, /assets/minecraft/textures/entity/zombie,husk.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_husk.png,,,,,,, /assets/minecraft/textures/entity,iron_golem.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_iron_golem.png,,,,,,, /assets/minecraft/textures/items,iron_horse_armor.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_iron_horse_armor.png,,,,,,, /assets/minecraft/textures/entity/slime,magmacube.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_magmacube.png,,,,,,, /assets/minecraft/textures/entity/cow,mooshroom.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_mooshroom.png,,,,,,, -/assets/minecraft/textures/entity/horse,mule.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_mule.png,,,,,,,y +/assets/minecraft/textures/entity/horse,mule.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_mule.png,,,,,,, /assets/minecraft/textures/entity/pig,pig.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_pig.png,,,,,,, /assets/minecraft/textures/entity/pig,pig_saddle.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_pig_saddle.png,,,,,,, /assets/minecraft/textures/entity/bear,polarbear.png,/mods/ENTITIES/mobs_mc/textures,mobs_mc_polarbear.png,,,,,,, From a6bb31f2a604050c054572f70bfce8dc404519be Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 10 Jun 2018 16:09:28 +0200 Subject: [PATCH 0152/1107] Fix explo mobs destroy land if mobs_griefing=false --- mods/ENTITIES/mcl_mobs/api.lua | 2 +- settingtypes.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 2df48634..86ab7903 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -1959,7 +1959,7 @@ local do_states = function(self, dtime) self.object:remove() - if mod_tnt and tnt and tnt.boom + if mobs_griefing and mod_tnt and tnt and tnt.boom and not minetest.is_protected(pos, "") then tnt.boom(pos, { diff --git a/settingtypes.txt b/settingtypes.txt index d46fdce8..153c34fa 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -46,7 +46,7 @@ only_peaceful_mobs (Spawn only peaceful mobs) bool false # If enabled, mobs might drop items when they die. mobs_drop_items (Mobs drop items) bool true -# If enabled, mobs can take and place blocks around them. +# If enabled, mobs can take, place, change and destroy blocks around them. mobs_griefing (Mobs change blocks) bool true # If enabled, players respawn at the bed they last lay on instead of normal From 2bb8b2c4e21c73cbe55c90a8455dd6d669b1b22a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 11 Jun 2018 14:47:41 +0200 Subject: [PATCH 0153/1107] Fix undeclared global fail in villager.lua --- mods/ENTITIES/mobs_mc/villager.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index fbc7bc52..8709ecdb 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -653,13 +653,14 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end) minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() return_fields(player) - player_tradenum[player:get_player_name()] = nil + player_tradenum[name] = nil local trader = player_trading_with[name] if trader then trader._trading_players[name] = nil end - player_trading_with[player:get_player_name()] = nil + player_trading_with[name] = nil end) From 857dddab3b12e727b44f7813913139b81abea17a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 12 Jun 2018 16:20:00 +0200 Subject: [PATCH 0154/1107] Version 0.41.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ee6bc747..cf9a1af3 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.40.0 +Version: 0.41.0 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 5c2dd375283f8625766c3b843b5c023061be6a56 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 13 Jun 2018 17:20:10 +0200 Subject: [PATCH 0155/1107] Fix crash if dropping charged bow --- mods/ITEMS/mcl_bows/bow.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 93d480ed..7e7d27e3 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -145,7 +145,7 @@ for level=0, 2 do range = 0, -- Pointing range to 0 to prevent punching with bow :D groups = {not_in_creative_inventory=1, not_in_craft_guide=1}, on_drop = function(itemstack, dropper, pos) - reset_bow_state(player) + reset_bow_state(dropper) itemstack:set_name("mcl_bows:bow") minetest.item_drop(itemstack, dropper, pos) itemstack:take_item() From 801e6fb1c43c468a82580fd43742fa2699c9ca3b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 13 Jun 2018 19:41:57 +0200 Subject: [PATCH 0156/1107] Mesecons: Stop using deprecated settings syntax --- mods/ITEMS/REDSTONE/mesecons/settings.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons/settings.lua b/mods/ITEMS/REDSTONE/mesecons/settings.lua index 1ebbfde4..02207073 100644 --- a/mods/ITEMS/REDSTONE/mesecons/settings.lua +++ b/mods/ITEMS/REDSTONE/mesecons/settings.lua @@ -1,15 +1,15 @@ -- SETTINGS function mesecon.setting(setting, default) if type(default) == "boolean" then - local read = minetest.setting_getbool("mesecon."..setting) + local read = minetest.settings:get_bool("mesecon."..setting) if read == nil then return default else return read end elseif type(default) == "string" then - return minetest.setting_get("mesecon."..setting) or default + return minetest.settings:get("mesecon."..setting) or default elseif type(default) == "number" then - return tonumber(minetest.setting_get("mesecon."..setting) or default) + return tonumber(minetest.settings:get("mesecon."..setting) or default) end end From f68e835087656f2e0abdd06e03984a2ed43e50d3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Jun 2018 18:26:59 +0200 Subject: [PATCH 0157/1107] Fix Nether portal not teleporting players anymore --- mods/ITEMS/mcl_portals/portal_nether.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index 1c1f6774..11da3b3e 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -404,7 +404,7 @@ minetest.register_abm({ end -- teleport the object minetest.after(3, function(obj, pos, target) - if not obj:get_luaentity() then + if (not obj:get_luaentity()) and (not obj:is_player()) then return end -- Prevent quick back-and-forth teleportation From c1614dabc5f21d44dc080428f10de7e3df60416e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Jun 2018 19:07:20 +0200 Subject: [PATCH 0158/1107] Rewrite emerge algorithm of Netherportal gen. --- mods/ITEMS/mcl_portals/portal_nether.lua | 50 ++++++++++++++++-------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index 11da3b3e..e9f5a8d9 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -9,6 +9,8 @@ local FRAME_SIZE_Y_MIN = 5 local FRAME_SIZE_X_MAX = 23 local FRAME_SIZE_Y_MAX = 23 +local NETHER_PORTAL_TELEPORT_DELAY = 3 -- seconds before teleporting in Nether portal + local mg_name = minetest.get_mapgen_setting("mg_name") -- 3D noise @@ -179,6 +181,7 @@ local function build_portal(pos, target) end end end + minetest.log("action", "[mcl_portal] Destination Nether portal generated at "..minetest.pos_to_string(p2).."!") end local function find_nether_target_y(target_x, target_z) @@ -399,11 +402,11 @@ minetest.register_abm({ -- force emerge of target area minetest.get_voxel_manip():read_from_map(target, target) if not minetest.get_node_or_nil(target) then - minetest.emerge_area( - vector.subtract(target, 4), vector.add(target, 4)) + minetest.emerge_area(vector.subtract(target, 4), vector.add(target, 4)) end - -- teleport the object - minetest.after(3, function(obj, pos, target) + + -- teleport function + local teleport = function(obj, pos, target) if (not obj:get_luaentity()) and (not obj:is_player()) then return end @@ -423,18 +426,6 @@ minetest.register_abm({ return end - -- Build target portal (if there isn't already one) - - local n = minetest.get_node_or_nil(target) - if n and n.name ~= "mcl_portals:portal" then - local emerge_callback = function(blockpos, action, calls_remaining, param) - if calls_remaining <= 0 then - build_portal(param.target, param.pos, false) - end - end - minetest.emerge_area(vector.subtract(target, 7), vector.add(target, 7), emerge_callback, { pos = pos, target = target }) - end - -- Teleport obj:set_pos(target) if obj:is_player() then @@ -447,8 +438,30 @@ minetest.register_abm({ minetest.after(4, function(o) portal_cooloff[o] = false end, obj) + if obj:is_player() then + local name = obj:get_player_name() + minetest.log("action", "[mcl_portal] "..name.." teleported to Nether portal at "..minetest.pos_to_string(target)..".") + end + end + + local n = minetest.get_node_or_nil(target) + if n and n.name ~= "mcl_portals:portal" then + -- Emerge target area, wait for emerging to be finished, build destination portal + -- (if there isn't already one, teleport object after a short delay. + local emerge_callback = function(blockpos, action, calls_remaining, param) + minetest.log("verbose", "[mcl_portal] emerge_callack called! action="..action) + if calls_remaining <= 0 then + minetest.log("verbose", "[mcl_portal] Area for destination Nether portal emerged!") + build_portal(param.target, param.pos, false) + minetest.after(NETHER_PORTAL_TELEPORT_DELAY, teleport, obj, pos, target) + end + end + minetest.log("verbose", "[mcl_portal] Emerging area for destination Nether portal ...") + minetest.emerge_area(vector.subtract(target, 7), vector.add(target, 7), emerge_callback, { pos = pos, target = target }) + else + minetest.after(NETHER_PORTAL_TELEPORT_DELAY, teleport, obj, pos, target) + end - end, obj, pos, target) end end end @@ -469,6 +482,9 @@ minetest.override_item("mcl_core:obsidian", { _on_ignite = function(user, pointed_thing) local pos = pointed_thing.under local portal_placed = mcl_portals.light_nether_portal(pos) + if portal_placed then + minetest.log("action", "[mcl_portal] Nether portal activated at "..minetest.pos_to_string(pos)..".") + end if portal_placed and minetest.get_modpath("doc") then doc.mark_entry_as_revealed(user:get_player_name(), "nodes", "mcl_portals:portal") From fe60b2c8bb890b2a4632f189e93ad28ceb0a3f6e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Jun 2018 19:15:39 +0200 Subject: [PATCH 0159/1107] More Nether portal generating refactor stuff --- mods/ITEMS/mcl_portals/portal_nether.lua | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index e9f5a8d9..0ed0ddcb 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -9,7 +9,8 @@ local FRAME_SIZE_Y_MIN = 5 local FRAME_SIZE_X_MAX = 23 local FRAME_SIZE_Y_MAX = 23 -local NETHER_PORTAL_TELEPORT_DELAY = 3 -- seconds before teleporting in Nether portal +local TELEPORT_DELAY = 3 -- seconds before teleporting in Nether portal +local TELEPORT_COOLOFF = 4 -- after object was teleported, for this many seconds it won't teleported again local mg_name = minetest.get_mapgen_setting("mg_name") @@ -433,9 +434,9 @@ minetest.register_abm({ minetest.sound_play("mcl_portals_teleport", {pos=target, gain=0.5, max_hear_distance = 16}) end - -- Enable teleportation cooloff for 4 seconds, to prevent back-and-forth teleportation + -- Enable teleportation cooloff for some seconds, to prevent back-and-forth teleportation portal_cooloff[obj] = true - minetest.after(4, function(o) + minetest.after(TELEPORT_COOLOFF, function(o) portal_cooloff[o] = false end, obj) if obj:is_player() then @@ -450,16 +451,16 @@ minetest.register_abm({ -- (if there isn't already one, teleport object after a short delay. local emerge_callback = function(blockpos, action, calls_remaining, param) minetest.log("verbose", "[mcl_portal] emerge_callack called! action="..action) - if calls_remaining <= 0 then + if calls_remaining <= 0 and action ~= minetest.EMERGE_CANCELLED and action ~= minetest.EMERGE_ERRORED then minetest.log("verbose", "[mcl_portal] Area for destination Nether portal emerged!") build_portal(param.target, param.pos, false) - minetest.after(NETHER_PORTAL_TELEPORT_DELAY, teleport, obj, pos, target) + minetest.after(TELEPORT_DELAY, teleport, obj, pos, target) end end minetest.log("verbose", "[mcl_portal] Emerging area for destination Nether portal ...") minetest.emerge_area(vector.subtract(target, 7), vector.add(target, 7), emerge_callback, { pos = pos, target = target }) else - minetest.after(NETHER_PORTAL_TELEPORT_DELAY, teleport, obj, pos, target) + minetest.after(TELEPORT_DELAY, teleport, obj, pos, target) end end From d34d368306454a428b4a927a3206320a87a2c8ab Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 15 Jun 2018 21:26:15 +0200 Subject: [PATCH 0160/1107] Disable double doors because of bug on place --- mods/ITEMS/mcl_doors/api_doors.lua | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_doors/api_doors.lua b/mods/ITEMS/mcl_doors/api_doors.lua index fd5171ed..f17e85c8 100644 --- a/mods/ITEMS/mcl_doors/api_doors.lua +++ b/mods/ITEMS/mcl_doors/api_doors.lua @@ -134,13 +134,11 @@ function mcl_doors:register_door(name, def) elseif p2 == 3 then pt3.z = pt3.z-1 end - if not string.find(minetest.get_node(pt3).name, name.."_b_") then - minetest.set_node(pt, {name=name.."_b_1", param2=p2}) - minetest.set_node(pt2, {name=name.."_t_1", param2=p2}) - else - minetest.set_node(pt, {name=name.."_b_2", param2=p2}) - minetest.set_node(pt2, {name=name.."_t_2", param2=p2}) - end + -- Set door nodes + minetest.set_node(pt, {name=name.."_b_1", param2=p2}) + minetest.set_node(pt2, {name=name.."_t_1", param2=p2}) + -- TODO: Mirror door when 2 doors are placed next to each other, to create double doors + if def.sounds and def.sounds.place then minetest.sound_play(def.sounds.place, {pos=pt}) end From 94d4ad99f4bba918b123254f03921631e90c5d66 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Jun 2018 13:13:34 +0200 Subject: [PATCH 0161/1107] Version 0.41.1 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf9a1af3..a99b0b4c 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.41.0 +Version: 0.41.1 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From a88f644001cdbc9d757f33410c7cf9e0cf968929 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 20 Jun 2018 19:02:52 +0200 Subject: [PATCH 0162/1107] Update deprecated settings syntax --- mods/ENTITIES/mcl_item_entity/init.lua | 2 +- mods/ENTITIES/mobs_mc/0_gameconfig.lua | 2 +- mods/ENTITIES/mobs_mc_gameconfig/init.lua | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 4c956af2..fa587bf2 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -295,7 +295,7 @@ end --modify builtin:item -local time_to_live = tonumber(core.setting_get("item_entity_ttl")) +local time_to_live = tonumber(minetest.settings:get("item_entity_ttl")) if not time_to_live then time_to_live = 300 end diff --git a/mods/ENTITIES/mobs_mc/0_gameconfig.lua b/mods/ENTITIES/mobs_mc/0_gameconfig.lua index a609ec9b..6b1180b7 100644 --- a/mods/ENTITIES/mobs_mc/0_gameconfig.lua +++ b/mods/ENTITIES/mobs_mc/0_gameconfig.lua @@ -287,7 +287,7 @@ mobs_mc.spawn = { -- This table contains important spawn height references for the mob spawn height. -- Please base your mob spawn height on these numbers to keep things clean. mobs_mc.spawn_height = { - water = tonumber(minetest.setting_get("water_level")) or 0, -- Water level in the Overworld + water = tonumber(minetest.settings:get("water_level")) or 0, -- Water level in the Overworld -- Overworld boundaries (inclusive) overworld_min = -2999, diff --git a/mods/ENTITIES/mobs_mc_gameconfig/init.lua b/mods/ENTITIES/mobs_mc_gameconfig/init.lua index d504129b..ff02ccfd 100644 --- a/mods/ENTITIES/mobs_mc_gameconfig/init.lua +++ b/mods/ENTITIES/mobs_mc_gameconfig/init.lua @@ -216,7 +216,7 @@ mobs_mc.override.spawn = { -- This table contains important spawn height references for the mob spawn height. mobs_mc.override.spawn_height = { - water = tonumber(minetest.setting_get("water_level")) or 0, -- Water level in the Overworld + water = tonumber(minetest.settings:get("water_level")) or 0, -- Water level in the Overworld -- Overworld boundaries (inclusive) overworld_min = mcl_vars.mg_overworld_min, From b2fa90cae7f6178164b57120561460779847f743 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 22 Jun 2018 13:05:07 +0200 Subject: [PATCH 0163/1107] Update bug tracker URL (git.minetest.land) --- CONTRIBUTING.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8cc3afd0..57b1a41f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -70,4 +70,4 @@ Depending on what you add, the chances for inclusion vary: ## Reporting bugs Report all bugs and missing Minecraft features here: - + diff --git a/README.md b/README.md index a99b0b4c..06a29614 100644 --- a/README.md +++ b/README.md @@ -182,7 +182,7 @@ Technical differences from Minecraft: ## Reporting bugs Please report all bugs and missing Minecraft features here: - + ## Other readme files From 61c5c61e006c27f7ee89667406efd21dcdb5e68c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 2 Jul 2018 23:27:11 +0200 Subject: [PATCH 0164/1107] Fix crash when using nametag --- mods/ENTITIES/mcl_mobs/api.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 86ab7903..9549b05d 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -2910,7 +2910,7 @@ local on_rightclick_prefix = function(self, clicker) update_tag(self) - if not mobs.is_creative(name) then + if not mobs.is_creative(clicker:get_player_name()) then item:take_item() player:set_wielded_item(item) end From f7227de6fa7afb048cdee6bae3c51b2e0fb1d10b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 2 Jul 2018 23:34:40 +0200 Subject: [PATCH 0165/1107] Local variable fix in mcl_mobs --- mods/ENTITIES/mcl_mobs/api.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 9549b05d..294d0c6f 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -1410,7 +1410,7 @@ local npc_attack = function(self) p = obj.object:get_pos() sp = s - dist = get_distance(p, s) + local dist = get_distance(p, s) -- aim higher to make looking up hills more realistic p.y = p.y + 1 From 675185ac024c63568bbe5187974f537939e1e8b2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 2 Jul 2018 23:40:45 +0200 Subject: [PATCH 0166/1107] Version 0.41.2 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 06a29614..0aab8500 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.41.1 +Version: 0.41.2 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From ce04c81482fd6cb91dde3bb892591e79617ec4e7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 4 Jul 2018 01:53:08 +0200 Subject: [PATCH 0167/1107] Fix another crash in mcl_mobs --- mods/ENTITIES/mcl_mobs/api.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 294d0c6f..452ef55e 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -2912,7 +2912,7 @@ local on_rightclick_prefix = function(self, clicker) if not mobs.is_creative(clicker:get_player_name()) then item:take_item() - player:set_wielded_item(item) + clicker:set_wielded_item(item) end return true end From 5e31db04d7f68c0da6e08fc273d3d3347da26e13 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 4 Jul 2018 01:53:37 +0200 Subject: [PATCH 0168/1107] Version 0.41.3 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0aab8500..911a845d 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ An unofficial Minecraft-like game for Minetest. Forked from MineClone by daredevils. Developed by Wuzzy and contributors. Not developed or endorsed by Mojang AB. -Version: 0.41.2 +Version: 0.41.3 ### Gameplay You start in a randomly-generated world made entirely of cubes. You can explore From 5d4b4b099cda896b0cc64fcb8e49f0b47d82f03c Mon Sep 17 00:00:00 2001 From: MysticTempest Date: Mon, 9 Jul 2018 23:33:32 +0200 Subject: [PATCH 0169/1107] Fix snowman's head texture --- mods/ENTITIES/mobs_mc/snowman.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/snowman.lua b/mods/ENTITIES/mobs_mc/snowman.lua index b73dd763..2a467a81 100644 --- a/mods/ENTITIES/mobs_mc/snowman.lua +++ b/mods/ENTITIES/mobs_mc/snowman.lua @@ -36,12 +36,12 @@ mobs:register_mob("mobs_mc:snowman", { mesh = "mobs_mc_snowman.b3d", textures = { "mobs_mc_snowman.png", --snowman texture - "farming_pumpkin_top.png", --top + "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_side.png", --left + "farming_pumpkin_top.png", --left }, gotten_texture = gotten_texture, drops = {{ name = mobs_mc.items.snowball, chance = 1, min = 0, max = 15 }}, From 67ebf3366fd540e6d29e6b6ef6aea2514d3f6c42 Mon Sep 17 00:00:00 2001 From: MysticTempest Date: Mon, 9 Jul 2018 23:45:54 +0200 Subject: [PATCH 0170/1107] Make player sit in minecarts --- mods/ENTITIES/mcl_minecarts/README.txt | 4 ++++ mods/ENTITIES/mcl_minecarts/init.lua | 13 ++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_minecarts/README.txt b/mods/ENTITIES/mcl_minecarts/README.txt index b4b77f21..881e2a58 100644 --- a/mods/ENTITIES/mcl_minecarts/README.txt +++ b/mods/ENTITIES/mcl_minecarts/README.txt @@ -13,6 +13,10 @@ 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: ----------------------- diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index 7d8fd613..33014228 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -417,6 +417,7 @@ register_minecart( "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 @@ -425,11 +426,21 @@ register_minecart( self._driver = nil self._start_pos = nil clicker:set_detach() + local player = minetest.get_player_by_name(name) + player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) elseif not self._driver then self._driver = player_name self._start_pos = self.object:getpos() mcl_player.player_attached[player_name] = true - clicker:set_attach(self.object, "", {x=0, y=3, z=0}, {x=0, y=0, z=0}) + clicker:set_attach(self.object, "", {x=0, y=8.25, 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}) + end + end, name) end end ) From ad2fbb0008c4c5830bf5ea730c636414cad2810c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 14 Sep 2018 14:48:48 +0200 Subject: [PATCH 0171/1107] Add some despawning logic (but do not enable despawning yet) --- mods/ENTITIES/mcl_mobs/api.lua | 37 ++++++++++++++++++++------------ mods/ENTITIES/mobs_mc/bat.lua | 1 + mods/ENTITIES/mobs_mc/ocelot.lua | 2 ++ mods/ENTITIES/mobs_mc/squid.lua | 1 + mods/ENTITIES/mobs_mc/wolf.lua | 3 ++- 5 files changed, 29 insertions(+), 15 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 452ef55e..846a86c2 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -60,6 +60,7 @@ local mobs_drop_items = minetest.settings:get_bool("mobs_drop_items") ~= false local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false local creative = minetest.settings:get_bool("creative_mode") local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false +-- TODO local remove_far = false local difficulty = tonumber(minetest.settings:get("mob_difficulty")) or 1.0 local show_health = false @@ -2537,11 +2538,10 @@ 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 self.type ~= "npc" - and self.state ~= "attack" - and not self.tamed - and self.lifetimer < 20000 then + and ((not self.nametag) or (self.nametag == "")) + and self.lifetimer <= 20 then self.object:remove() @@ -2735,19 +2735,19 @@ local mob_step = function(self, dtime) local pos = self.object:get_pos() local yaw = 0 - -- when lifetimer expires remove mob (except npc and tamed) - if self.type ~= "npc" - and not self.tamed - and self.state ~= "attack" - and remove_far ~= true - and self.lifetimer < 20000 then + -- Despawning: when lifetimer expires, remove mob + if remove_far + and self.can_despawn == true + and ((not self.nametag) or (self.nametag == "")) then + + -- TODO: Finish up implementation of despawning rules self.lifetimer = self.lifetimer - dtime if self.lifetimer <= 0 then -- only despawn away from player - local objs = minetest.get_objects_inside_radius(pos, 15) + local objs = minetest.get_objects_inside_radius(pos, 32) for n = 1, #objs do @@ -2759,8 +2759,6 @@ local mob_step = function(self, dtime) end end - effect(pos, 15, "tnt_smoke.png", 2, 4, 2, 0) - self.object:remove() return @@ -2935,6 +2933,16 @@ function mobs:register_mob(name, def) mobs.spawning_mobs[name] = true +local can_despawn +if def.can_despawn ~= nil then + can_despawn = def.can_despawn +else + if def.type == "monster" then + can_despawn = true + else + can_despawn = false + end +end minetest.register_entity(name, { stepheight = def.stepheight or 1.1, -- was 0.6 @@ -2950,7 +2958,7 @@ minetest.register_entity(name, { jump_height = def.jump_height or 4, -- was 6 drawtype = def.drawtype, -- DEPRECATED, use rotate instead rotate = math.rad(def.rotate or 0), -- 0=front, 90=side, 180=back, 270=side2 - lifetimer = def.lifetimer or 180, -- 3 minutes + lifetimer = def.lifetimer or 57.73, hp_min = max(1, (def.hp_min or 5) * difficulty), hp_max = max(1, (def.hp_max or 10) * difficulty), physical = true, @@ -3035,6 +3043,7 @@ minetest.register_entity(name, { -- MCL2 extensions ignores_nametag = def.ignores_nametag or false, rain_damage = def.rain_damage or 0, + can_despawn = can_despawn, on_spawn = def.on_spawn, diff --git a/mods/ENTITIES/mobs_mc/bat.lua b/mods/ENTITIES/mobs_mc/bat.lua index 64e0e349..d30bc98d 100644 --- a/mods/ENTITIES/mobs_mc/bat.lua +++ b/mods/ENTITIES/mobs_mc/bat.lua @@ -6,6 +6,7 @@ local S, NS = dofile(MP.."/intllib.lua") mobs:register_mob("mobs_mc:bat", { type = "animal", + can_despawn = true, passive = true, hp_min = 6, hp_max = 6, diff --git a/mods/ENTITIES/mobs_mc/ocelot.lua b/mods/ENTITIES/mobs_mc/ocelot.lua index a590029f..7bfdd674 100644 --- a/mods/ENTITIES/mobs_mc/ocelot.lua +++ b/mods/ENTITIES/mobs_mc/ocelot.lua @@ -30,6 +30,7 @@ end -- Ocelot local ocelot = { type = "animal", + can_despawn = true, hp_min = 10, hp_max = 10, collisionbox = {-0.3, -0.01, -0.3, 0.3, 0.69, 0.3}, @@ -97,6 +98,7 @@ mobs:register_mob("mobs_mc:ocelot", ocelot) -- Cat local cat = table.copy(ocelot) 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 diff --git a/mods/ENTITIES/mobs_mc/squid.lua b/mods/ENTITIES/mobs_mc/squid.lua index d61ae087..a2ea34ab 100644 --- a/mods/ENTITIES/mobs_mc/squid.lua +++ b/mods/ENTITIES/mobs_mc/squid.lua @@ -10,6 +10,7 @@ local S, NS = dofile(MP.."/intllib.lua") mobs:register_mob("mobs_mc:squid", { type = "animal", + can_despawn = true, passive = true, hp_min = 10, hp_max = 10, diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua index 056f3437..934fd753 100644 --- a/mods/ENTITIES/mobs_mc/wolf.lua +++ b/mods/ENTITIES/mobs_mc/wolf.lua @@ -22,7 +22,7 @@ end -- Wolf local wolf = { type = "animal", - + can_despawn = true, hp_min = 8, hp_max = 8, passive = false, @@ -123,6 +123,7 @@ 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 From 077cd14f4fb02f2e52c5ccff33aa2cb5a4912c54 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 14 Sep 2018 15:58:31 +0200 Subject: [PATCH 0172/1107] Add skeleton sounds --- mods/ENTITIES/mobs_mc/LICENSE-media.md | 12 ++++++++++++ mods/ENTITIES/mobs_mc/horse.lua | 6 +++--- mods/ENTITIES/mobs_mc/skeleton+stray.lua | 6 +++--- mods/ENTITIES/mobs_mc/skeleton_wither.lua | 6 +++--- .../mobs_mc/sounds/mobs_mc_skeleton_death.ogg | Bin 0 -> 28074 bytes .../mobs_mc/sounds/mobs_mc_skeleton_hurt.ogg | Bin 0 -> 13920 bytes .../sounds/mobs_mc_skeleton_random.1.ogg | Bin 0 -> 10497 bytes .../sounds/mobs_mc_skeleton_random.2.ogg | Bin 0 -> 14438 bytes 8 files changed, 21 insertions(+), 9 deletions(-) create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_death.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_hurt.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_random.1.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_random.2.ogg diff --git a/mods/ENTITIES/mobs_mc/LICENSE-media.md b/mods/ENTITIES/mobs_mc/LICENSE-media.md index 17aecc18..da0c7f87 100644 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ b/mods/ENTITIES/mobs_mc/LICENSE-media.md @@ -123,3 +123,15 @@ Origin of those models: * [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: + + +Note: Many of these sounds have been more or less altered to fit the game. diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 8601768a..25bfb2dd 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -327,9 +327,9 @@ skeleton_horse.drops = { max = 2,}, } skeleton_horse.sounds = { - random = "skeleton1", - death = "skeletondeath", - damage = "skeletonhurt1", + random = "mobs_mc_skeleton_random", + death = "mobs_mc_skeleton_death", + damage = "mobs_mc_skeleton_hurt", distance = 16, } skeleton_horse.blood_amount = 0 diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index dec08907..65b6fe49 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -32,9 +32,9 @@ local skeleton = { visual_size = {x=3, y=3}, makes_footstep_sound = true, sounds = { - random = "skeleton1", - death = "skeletondeath", - damage = "skeletonhurt1", + random = "mobs_mc_skeleton_random", + death = "mobs_mc_skeleton_death", + damage = "mobs_mc_skeleton_hurt", distance = 16, }, walk_velocity = 1.2, diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mobs_mc/skeleton_wither.lua index 144d37cf..3a5ed04a 100644 --- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua +++ b/mods/ENTITIES/mobs_mc/skeleton_wither.lua @@ -29,9 +29,9 @@ mobs:register_mob("mobs_mc:witherskeleton", { visual_size = {x=3.6, y=3.6}, makes_footstep_sound = true, sounds = { - random = "skeleton1", - death = "skeletondeath", - damage = "skeletonhurt1", + random = "mobs_mc_skeleton_random", + death = "mobs_mc_skeleton_death", + damage = "mobs_mc_skeleton_hurt", distance = 16, }, walk_velocity = 1.2, diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_death.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c11402b14b11fa34001aea374aff0e7d5f348fff GIT binary patch literal 28074 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 literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_skeleton_hurt.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2289183d2be1f314a0c6c53bb142f708c50516b4 GIT binary patch literal 13920 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āX^xIUzp%&x-#OLVKoxJzyCmIbv@73 z*V6gjf1YmN;c_PVxZ(~CA*FW3pBA4U{{FV>oVLo0>3RK|);tT|`lVp;=C?V%kL$u4 z$|Fktud>}W=g#!+p9S4*h1ae~Qea>FEWGIwE5jMq()b3`c-Bc5PKDgmk;wX%vw!RN zn#(`b{+!-??QCs78v{>}O@7e(wBAFVTV}hpzMsinc8{@zmpkuNUim3QmlHn4sjt_a ze^y;qeI~j4%Eu?`br~6sOj>d=tbfbj-+o$ih5qwv3P&yzlHWeHcC7>h!yV3*wue7N zC@UDhnYrG+?eHAiuQ$Y=ufFs8x25B>BRpkxVH-AsMi zo;uf2jyHe3_T}Vsb2RdJ)iNY76c`Af{GjpU+k*Z@HUc-JulPwY-1&Q|_SVeAc!?7Y z<#7S53mF}9ojWY2&swzdhMDo}T#eJ*Z&*v`JIpz%s+98Vw|39#vcD-(@B3c|8^_q@ z<+OJ>Fg(~X!Rl}QTeW*~9nasNpr>(%*?dzFOCu0t(N!t zhFIB2>;0u>#~ipAme|-9O#fRy^Y<R2uNtt~jZd?1+s(~8Gc%s?H@D^?|C0na%t_&3vZ1#u8Hoy zP`oy>UH<+Q)j2%!t&4neemce+-2S`tJoC-I_3yk`*%;)0a6gciebdVP*4*HL)c=H? zhk~ZBUckV>kWqC;ew}XVy(!A?Lbq0J-4}WPSlWR^oBHIR*VbIiNt(axW}2?9$H!z& z!#`q>?INDq*L+0}xEPF^^H+P_`^IVb%{tb_Q~uvK zJp~QL7?CYkBhJ)%ikpb_3C}FJT$b*m`GEK3u}>1^Hd&nv)4tty_`4)opZCW8=0=;y z&!4}L;KXx%`De3N?%BW)eQr<>ucHI~M>y6&l| zcx-lPhv}w5`FrP2Z+!CjXS(k#{m(&6zS6gf&!?ye8ZSO|@wW^Ak-s+cAMAM_uA(>d z=kIU(=ahFpno%SF%ddiK_pfTXS9@%j4uoEfa4l<_94YhszM;`|<>fwl3=Cf+OYh4m z>HaoV^32+LI$F8j?AUbo+&`ah-`&-pdoTJrGsBEm4e>2)1x=e?n8oGa4Z2Vn$iN_@ zR=VF~>+?EZVb7FOxwjSKZp$}KpCvjkv}Oz6-EEu<6WwhJlqO35pJ-(!ds32}d;j6v zPp@5jv2mgz8$(n$Pp7|<|Miz~v0XPgrQ^O=++NBbcb4tg627eSu@>ANe}8khs%eo9@*%$WR>(-Hf9jiX=DerZ2 zEd8Tbyv4p?k=W_g_N69IIJ08+#Ta~*w~O!!*lVHlTIn#uo9(VKoAk54tvtA7g7B?P z8~1JKI3>RKK9}?ZdD-9V-Q6`>eGammcy{IYzi&V1EUMI>XaBLV)N{-F$d|7@-yUYS zRb|-sJ@}w{)y#E@+q74B+$eav@Ycr-&b(6Gp&inmpeE9PZrir6|F6$nZTZN&W0{!! z36}n1+mmOtr!Nz>al2A=N$Z-#8sW56WfPe1KK|4fs(;7*>q_C9Uw#Evi|4i-wt4w2 zxTe7TE2qL8v+d7}4Ml1$T5X>fmvO~XAbO_v`&k_4mcPzS&JbP@b~yjtZ2S6u|NK|I zkNVcC-t~Cb)ajrKKKKZK&Lz`kF1EJcfsg8z2Zwd+@(R2*cL@Un!;ZJvlhZbzHvG)h zcz(a)<}+U-)~{*bqoB^6{QHWMp3KI_56(`y|8<7m#eJ^1weIhqe|@*8X2IjNA+!Ax z7aef5J*%vDGAU%ymz6@w8`pBEtu^1vus-^P-}iejg)Hw_T=sc?{+QdYh0pU@FDvQZ zIkA@W^`Vd`z5`Qpbr~Q-5(iczh9sC77#O}YZ``9kb>htJCT9COCQX?>dE#~@WmP2; z(?gS{>{M1%R#H|qw=g?0Y3jrY6X$(DeMw)Wc;yAg2__e&evdS{X%++;?%4Ly`u18T z(ef=Dole&MdstGpEva(KXfT5<8UWXk2}jXh~~_D4^vFeqy^iu5*oT5jJ|^IrCn z(6@he84McCF1|c>%Tun%t}{10!Z`0c_YL!Tv$NTF53e!2(=RFBxpGP1sx4Qn1BF1L zoxhkZn*Dao>YqybpHq~Jw>0RK?Ma$Cd+IF<%@uc(b}jda)D>WUXks-x^E`X@Z%!S% z!?9I+%+5zSA2q$eAD*h&b>l$wCy|b?ziVd{ZVF>@2|e9+s{beF>BjsoubUBc$$9hkPoFEi-!K2BYJT{dVugd^<0D z{9xWI-h@qG65gJDW5eV5yl~dC%RfR^n(t-&^jd+RW$wDk*Af`s?I^Hrl&X-3wvyIn zXEPLXNo4N6YA7@7&L?TF(*lwV-@b8o$|s#z=e(4m?Rsowap~!3a|hW>n*j4$BHr%~ zbeknOxq?=M9NT<$@1swTbGG;XJr>s~wc0%Q|2aGEC-pfw^Kw_TZC&^KVQPx_e}6UA zI1arlKX*S!P1W1rD|{;VQuqMHT1rFD#K*mi~V3!}7MsH~FX5eYhA9 z6);_I0!vqI<^TONZaT`G*&O-f&vL=Z3K{L{@dcr}VH{i7xw#qSxO2_RW_>e0Z`Hmm z*_C0--!J}LX;&@Gj4sEhCcl$?_j*g+YNmhB@|q_!GdRqed;VN^Zom&|%~vwjhu3b> zRo3v-;+fzCKoFNXVTZ|H7nhR`!_(cOSj6 z-tw_yW#aQwbNLu{eLFpIznGZA!XTEz&o$47-Fv^y@`%TzS?`vV-YHGLvAU@?+ge9{ zVn*BD#;za+1_qt_o$`zavjj3`b6>5K^c5=)*}_(LFwB_!dGM3#7c7{s|JuB|ukX$g z1OE&5Gk4y)xB6DXv0vAn4&RnDdJ}Q1)@@>$_ur=PzhZ7|FJry=r?*zWqQA< zSfm(3-S^Em_zjEhF7RSF{Q5JN1p4TO;lINg=}ZG6Ic7)-rl>g@BN!cf=;L1>b^fd!(OMk zezsFF$C|e5Q9l=WEzb#IWMF8R{WIn87n9!skLn{AU#onkKVNV0dy8`%4=;$!-m0i{ zq$K=9v~JMdUNPV2Tg056d|mCo`- z&-&zd?3xGH6Vt7n>PhV%UiCZHwOedudXxS!W3{(R6GuZ}%FU?}(GTLjKRy~R%hKSv zm80$a#WU%}-g#OJ0*!j7Hi44+k3vCDS25p?lCxiPqj%`#t@o-Bt2S_&+Wpb1wd(46 zyT>2*?)&NV^6kBPscRMY>i0*jl{X2syXNV$`sT?4_BXbsR9lnfu0r zv)@Ob-Fma@t=zO_cUw)D_=KH*`SMxbmA7h3k5wBNmd}3vKG$4@LGHWrv$p&rron5M zH$L2VtWRu1^~}4hpvH~O+)B&6s=Ry7l*ZQ@7#-T?b^hly9ZA8)-oH+s#;ZA_Y;)av zcAx7#v{7r?$31m*SD%S#f2($z>mby3h3nhtZ!Gg>9k-8ku$O+w{j;xd-|4oG79N{? z&+staat#Y8ZY+BvAtU2pGV_LnLAZ~Z^;OXz)yG%0C8|J-mJ6!Iu9_R>5D|FB?a2?*C%qUz{-Hy#Su`je} z(TQeA5iC9Q#!&4@%(}}=BFh=N{IA`)<>9Yywg2Pc$7P2Y*%+Jos*RjUC&P%wiQ!UT^q+7snZLaQ(U%7U-R#tzx&VSuK z@Wj>F_3RBRzAzYPL>a_1-a4>lwIi3@{Cm}BWS<n`?|UF^(NT^3p3pfYWS}2 zJvHrHk|A?t)O*ddv;5{TF)%26jeT%U>2>6(hcySb`AlA$rzmx6)7%HGVUHZI`_G7W z45(_4tv)CF)OyC+AL8L67jGUZ;=b`)=JU}wW7o2y)9jXB6WH8ccSHa2Bd$C3+wG)F z{~oisT(+;!<(Kr`s(*U1nok0DuH5~4Lhjmk0*0(6?O9?~zYDhHZCm+2Gx61|j3k%G zca02eRu*ooyv-2AA{N84r=yXN!R2q+zG|g)b&M%$=kGC;21qb$5Phekd)qtTyW{V< zhei5~A%9QVZdnp9$86;MDwI)z!NA`4V%DLqslgML8_cjde?sj$L&)D#d2BW7Gzx?| z&ODf<#URDtb5w|%&(ZE^Ay z@UF4j>NxL9Zwc3uzhB-b=sgWp;MBccXZ!Nw&FAs+-{$7W-M?4&zxIbYJ7bU~gTaxt zw_-%AG-mzZZ?iqjiEWPHU;laLmW8cuX>rxR)BmO3+n4(I%}jB&v*9%@`MV{mO^rnv z{A{_SKGYdx$8JxU|M6TlgVZ-^xw?yOCA_N?B-T~iuKynq$oJ~X5tUza+(ZNl`6AO? z&hE_x4INDIGB?+}zUsbw$kUzseY^Hup7`T)k(-I>_xpKi+1%R;KgV7F7IWmz*K~X4 z(zpKG)vW(&@Y#MY-u~yzr%#)ft(UKV_P+FA#nnmks^6`zDs(@zEOmF=mmB-fJ$kZt z)3SQ4Pj6Olc8CyI!u)obdbnDP-nngi_&1*jI)87{1OBIbid>%0|B@{$+{oBA^I*as z{W!alke#OKem`ua80x-rcgAua7R{i&Tf z&;0kVgqso!_r9GLwm%|qJz!Q>u;6n8?1$Odwa9a% z(tmf{j@_T9zVm3SxLVU%>CKrAQ%}rNKl}dElC$q**81>X>ODUHXKA?GoI^7Moo>JV zbTV{`=CNNK3})Xp@3_8$hhfVs!Rc-16L0_hvu6SOj6-VDFSg#9y!1=>!yrXa4a9me zZsYAUA3Tm7&$;S;RAX_Nn^!XS@&d@_zX!{C5!#Q_Wwm zcpKiLFqsoQEA1H#7+x4_2y%v8zvz0~b?yfJ51;;-G0gef758STh5H(|nTlT-Bp9~L ziOudl|utcR`KsQHu|-8a4AV9td7Lt0GcgO8NWjw@)(5JSFxqP5Ik3&(`$k8$%f*=U3bf zj1BrC@>NNNRgyX4y_MgWf6Fvs()qj2&gR>vN+q9^4;vT^7&KTTj+}Yg>KT}J=lEL= ztqtPa*Q+tE`Fle4#jm(_4$q{g#{+fdS{*N*`{DkPJ89hE%hQ_+oWz(I*0FzGtb5jQ zZtEq1^3I#H!aa8}GW7hd(dSD0u5HLS^Jn$()B0|ArO$^SpDsT?R<`i#g^)CV76y%; z9TjhG-hXy2Eh}i#?x}UMD+3uAT>hTQGkc?zq%$*7@7Aeff~j8q+e6aBf8S0sabalK zCqCgAyYO!!x&P zesuYoaIoi*=ZcfP)tn2iYNi2Kdakx_G6OS z;nfds-G8?K?E3F{D|F=R_P>=l7ti&p;K-+A?d`X_mqwX)tK8ljdez(~?(P@Ux6w>u z(q)g#;6!qvW#k*Pw9r*vjq z$V&lrI5e{R?0V*FpZ%-O{n4XX$4k%l)yaa!-#_*|IV@+J|MBbojB*!QAMtr1B|6n5 z$^~|xeS|&o-|}rKvtIR+_i~*3W8QD~W-L4%*5uIGE>$*p!;ef>W5%hu42|kp+s-a3 z4=geJID2Np)#(eJV_PfjrMVd5zHwiaPJF#fGmKN{_=h{~&rTiw$8_tB8>pO0$chnd zn)#hGBBt)d^ZMV9+MNDZlJeiHNWf{tGd6M%&f*=4!o9#QGX;< z)Z5G_zvAJQ>r3`rUj9Efor$6DTkrwd#`xfjeY`y9zqX|nUD+K1YG*lIK7953xxD>6 zwM+NRe!cq`>yw5ri}nVm$Gg$ukfB5d_%ZBH??3bqia%POwL2m z3s<-&+&Xgk-ec)vKWV2I-|SX~g@j&HGg)1C{^=^d>ccInIW4O+zKeI8zEE2D-i#Eomyg2P>2 zy*WDdINSVad*<0<=Z|mrGs(y>UfTT^$KMjx_Ln^CzuF56r?*O4-#ws~SjaAMAa?r3 z$miTa8>iQ-GjCtFrSRut-g(wn_jpM}SHDcponNM7Q?+obM5fTo-}hoVKXR9>meYM? zo*w_h_phP0xZF48gJS-FXL-IhQ04iad9TlEa&EaJBLl+%v-(>#GcudkIGMg&YjXJV zQrllEau?Ju^WPjYZ*l&Y5|)eHS95-Z#hdK<61Fh%(a|GQc=!K|oa@Ln!MGvi)aDwa zm(0RO*R>lzrfI3|ZV)ze$Yj<3n>2y5I>G<0*W+cZ)#o;vuHI3%<7{Ag*@>+;`?wDl znA}NYgbY-$%)Eyfr~s{vKd*DumbZ7xq-h-;?ahr+jEs!)z6Rf9^?$p|@hn5z^loyqddE#qxFSMUCvUh?$G&p#Sc zk^wHCTgw+SCwk5)=k^WR(`~!g>CCzH2M?FEZnmB|S>;w+!tYn2T{q`Uwh}wez;X6f zK$^GLg8SO`TLsy;s{@yP*AU}dx#rdK1q=*w-<*H7?1}%r%q!r~2P+BPUB_}1oewVV z;9R;8oZK3`|CB_{ZV^#GH}AzphoGZ7aySH;RbAx!U*6uguYbSXbocM}o27PX9x-32 z>9+q}SHAKm=WM%5-OrL%`r2Bp|2k^a!hAk-S?9er zW{`F;NIsO&K6_G?E%%D>v$y~3U&p|3@5|$temteIm$TRm_VC&H2FY&YQj$_G+rn~1 zl!1Z4!sx>ugD-!BYPD}VEo)1Vs*G6Qw)mJwNpHp8(pr0w+WP$XeU84%GcUxq*cqLV zDa!j%ILzo(jd`CC0$$H2gFfcNmk zt|wMAzvgMN{QQ@6cFC&_j>4(;Zp(z0Bs$;8H}A>aJVoW%@!8AxUwF^{_|E${k5_!^ zwq-?!yw$f~nbzCoGa-ChUBERh(ga zdpdG&7qm=W;(M-g*PeOPbGLuEd#mMgSBipQ_@OgXSsap0dbxFVtX$&GGO=uI4LZ{J zrJLjSVpYa@Uy?U{FJZo6(yhAs;nqX;6Jjrc<|`#)1I?MO-uvoWNh===N*B&wKBvzi z!n7*uch8*dy-QlxsQyged+c1BXUgfY0ItR-9$$LD9kyY8A=z8PWBgiqUbU#oqdeBF zuUB$j{}qzsS8ov>kYm}Ac!R^Elp{d-fDqdO?trA*x5WBu*Qy0=dm6;J?@PDg+P5qQ zOZAM~B6!y`Up{$#a~snH%}y;)Ni`>X@$aahNpoK9sSf#25gUJbPnLsx)zniDi>kP8 zTnjcm*4V%G+hyhVe^c9@*vM(jn7HF{&xNX>vL~S(oBVQig?;dw_f@iP`l(3m^{zhs z=Quf5Kfj(efAfc_&-PE^_DECS<@Ty+;^z&U7~;Md8@@Zt$6%^-{===jX&%A}-cv!V zs9r8__}5cqFX`2OWzV#aGTMDUQ<9q|S$D5US2&^AE-g})_)EzD^dYWYNYz1iSN1;w?->U$Z_58(uUhtRK ze>M2>=lbzUdu-$CT|{jbcQ3z@wK|dcvit>!zqv=%{q441U32~M*O_M(XV1RBeoK74 zXm}1!v+msVwt`myOXXhI@9x{Wrg0+Mis+B;@2lL@I;oYjwAT5>3Wm5Zzpb3>URhl+ W{=nnU!~;r|2Mn1Sl2sV_`1k;Z2lZ+I literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..e81c45a41e0f2253e659d290befd0d505bf39a5a GIT binary patch literal 10497 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 HA0Hn8V6N?p literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..1d495b87827cd64c8b19508267581f6220231acf GIT binary patch literal 14438 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 literal 0 HcmV?d00001 From 26a5059cc0f57dfef69191ac63c813ed6e803ea4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 14 Sep 2018 16:05:47 +0200 Subject: [PATCH 0173/1107] Add bow shooting sound when mob fires an arrow --- mods/ENTITIES/mobs_mc/skeleton+stray.lua | 1 + mods/ENTITIES/mobs_mc/villager_illusioner.lua | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index 65b6fe49..a10fef5e 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -35,6 +35,7 @@ local skeleton = { random = "mobs_mc_skeleton_random", death = "mobs_mc_skeleton_death", damage = "mobs_mc_skeleton_hurt", + shoot_attack = "mcl_bows_bow_shoot", distance = 16, }, walk_velocity = 1.2, diff --git a/mods/ENTITIES/mobs_mc/villager_illusioner.lua b/mods/ENTITIES/mobs_mc/villager_illusioner.lua index 7d50ecd2..e6d1b2c9 100644 --- a/mods/ENTITIES/mobs_mc/villager_illusioner.lua +++ b/mods/ENTITIES/mobs_mc/villager_illusioner.lua @@ -23,6 +23,11 @@ mobs:register_mob("mobs_mc:illusioner", { "mobs_mc_illusionist.png", --hat "mcl_bows_bow.png", }, }, + sounds = { + -- TODO: more sounds + shoot_attack = "mcl_bows_bow_shoot", + distance = 16, + }, visual_size = {x=3, y=3}, walk_velocity = 0.6, run_velocity = 2, From 7d66d5f2d303769166dc77464cf1ca27ff17ffb0 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 14 Sep 2018 16:08:32 +0200 Subject: [PATCH 0174/1107] Remove unused arrow code for wither skeleton --- mods/ENTITIES/mobs_mc/skeleton_wither.lua | 3 --- 1 file changed, 3 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mobs_mc/skeleton_wither.lua index 3a5ed04a..cd932129 100644 --- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua +++ b/mods/ENTITIES/mobs_mc/skeleton_wither.lua @@ -79,9 +79,6 @@ mobs:register_mob("mobs_mc:witherskeleton", { light_damage = 0, view_range = 16, attack_type = "dogfight", - arrow = "mobs_mc:arrow_entity", - shoot_interval = 2.5, - shoot_offset = 1, dogshoot_switch = 1, dogshoot_count_max =0.5, blood_amount = 0, From 900625b17b3aceb19b1cc14dbacdc678c8d1c356 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 14 Sep 2018 16:27:58 +0200 Subject: [PATCH 0175/1107] Add ghast shoot/death sound, add many sound TODOs --- mods/ENTITIES/mobs_mc/agent.lua | 1 + mods/ENTITIES/mobs_mc/bat.lua | 1 + mods/ENTITIES/mobs_mc/chicken.lua | 3 +-- mods/ENTITIES/mobs_mc/cow+mooshroom.lua | 3 +-- mods/ENTITIES/mobs_mc/ender_dragon.lua | 1 + mods/ENTITIES/mobs_mc/enderman.lua | 2 +- mods/ENTITIES/mobs_mc/endermite.lua | 2 ++ mods/ENTITIES/mobs_mc/ghast.lua | 8 +++++--- mods/ENTITIES/mobs_mc/guardian.lua | 1 + mods/ENTITIES/mobs_mc/guardian_elder.lua | 1 + mods/ENTITIES/mobs_mc/horse.lua | 1 + mods/ENTITIES/mobs_mc/iron_golem.lua | 5 +---- mods/ENTITIES/mobs_mc/ocelot.lua | 1 + mods/ENTITIES/mobs_mc/parrot.lua | 1 + mods/ENTITIES/mobs_mc/polar_bear.lua | 5 +---- mods/ENTITIES/mobs_mc/rabbit.lua | 2 +- mods/ENTITIES/mobs_mc/shulker.lua | 1 + mods/ENTITIES/mobs_mc/silverfish.lua | 2 +- mods/ENTITIES/mobs_mc/snowman.lua | 1 + mods/ENTITIES/mobs_mc/spider.lua | 1 + mods/ENTITIES/mobs_mc/squid.lua | 4 ++++ mods/ENTITIES/mobs_mc/vex.lua | 2 ++ mods/ENTITIES/mobs_mc/villager.lua | 7 +------ mods/ENTITIES/mobs_mc/villager_evoker.lua | 8 +------- mods/ENTITIES/mobs_mc/villager_vindicator.lua | 6 +----- mods/ENTITIES/mobs_mc/witch.lua | 7 +------ mods/ENTITIES/mobs_mc/wither.lua | 1 + mods/ENTITIES/mobs_mc/wolf.lua | 5 +---- 28 files changed, 37 insertions(+), 46 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/agent.lua b/mods/ENTITIES/mobs_mc/agent.lua index a5501175..9de2292e 100644 --- a/mods/ENTITIES/mobs_mc/agent.lua +++ b/mods/ENTITIES/mobs_mc/agent.lua @@ -19,6 +19,7 @@ mobs:register_mob("mobs_mc:agent", { textures = { {"mobs_mc_agent.png"}, }, + -- TODO: sounds visual_size = {x=3, y=3}, walk_velocity = 0.6, run_velocity = 2, diff --git a/mods/ENTITIES/mobs_mc/bat.lua b/mods/ENTITIES/mobs_mc/bat.lua index d30bc98d..27a0d23c 100644 --- a/mods/ENTITIES/mobs_mc/bat.lua +++ b/mods/ENTITIES/mobs_mc/bat.lua @@ -19,6 +19,7 @@ mobs:register_mob("mobs_mc:bat", { visual_size = {x=1, y=1}, sounds = { random = "mobs_rat", -- TODO: This sound is supposed to be very high-pitched and scary + -- TODO: more sounds? distance = 16, }, walk_velocity = 4.5, diff --git a/mods/ENTITIES/mobs_mc/chicken.lua b/mods/ENTITIES/mobs_mc/chicken.lua index cd8a22b2..a29311b6 100644 --- a/mods/ENTITIES/mobs_mc/chicken.lua +++ b/mods/ENTITIES/mobs_mc/chicken.lua @@ -47,8 +47,7 @@ mobs:register_mob("mobs_mc:chicken", { fall_speed = -2.25, sounds = { random = "mobs_chicken", - death = "Chickenhurt1", -- TODO: replace - damage = "Chickenhurt1", -- TODO: replace + -- TODO: death, damage distance = 16, }, animation = { diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua index 46b15711..15f62d3e 100644 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua @@ -34,8 +34,7 @@ local cow_def = { runaway = true, sounds = { random = "mobs_mc_cow", - death = "Cowhurt1", -- TODO: Replace - damage = "Cowhurt1", -- TODO: Replace + -- TODO: death, damage distance = 16, }, animation = { diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index 183b0781..c6e99f47 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -54,6 +54,7 @@ mobs:register_mob("mobs_mc:enderdragon", { walk_velocity = 6, run_velocity = 6, sounds = { + -- TODO: more sounds shoot_attack = "mobs_mc_ender_dragon_shoot", attack = "mobs_mc_ender_dragon_attack", distance = 60, diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua index 1b60dac6..459c1a4a 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mobs_mc/enderman.lua @@ -180,7 +180,7 @@ mobs:register_mob("mobs_mc:enderman", { sounds = { war_cry = "mobs_sandmonster", death = "green_slime_death", - damage = "Creeperdeath", + -- TODO: damage, random distance = 16, }, walk_velocity = 0.2, diff --git a/mods/ENTITIES/mobs_mc/endermite.lua b/mods/ENTITIES/mobs_mc/endermite.lua index 6c40f8c2..6cdcaf76 100644 --- a/mods/ENTITIES/mobs_mc/endermite.lua +++ b/mods/ENTITIES/mobs_mc/endermite.lua @@ -23,6 +23,8 @@ mobs:register_mob("mobs_mc:endermite", { makes_footstep_sound = false, sounds = { random = "mobs_rat", + distance = 16, + -- TODO: more sounds }, walk_velocity = 1, run_velocity = 2, diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index f1200647..5cb0080f 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -28,11 +28,13 @@ mobs:register_mob("mobs_mc:ghast", { }, visual_size = {x=12, y=12}, sounds = { - shoot = "mobs_fireball", - death = "zombiedeath", - damage = "ghast_damage", + 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, diff --git a/mods/ENTITIES/mobs_mc/guardian.lua b/mods/ENTITIES/mobs_mc/guardian.lua index 13148714..56bda522 100644 --- a/mods/ENTITIES/mobs_mc/guardian.lua +++ b/mods/ENTITIES/mobs_mc/guardian.lua @@ -29,6 +29,7 @@ mobs:register_mob("mobs_mc:guardian", { visual_size = {x=3, y=3}, sounds = { damage = "mobs_mc_squid_hurt", + -- TODO: more and better sounds distance = 16, }, animation = { diff --git a/mods/ENTITIES/mobs_mc/guardian_elder.lua b/mods/ENTITIES/mobs_mc/guardian_elder.lua index 78c21f10..11dba11a 100644 --- a/mods/ENTITIES/mobs_mc/guardian_elder.lua +++ b/mods/ENTITIES/mobs_mc/guardian_elder.lua @@ -29,6 +29,7 @@ mobs:register_mob("mobs_mc:guardian_elder", { visual_size = {x=7, y=7}, sounds = { damage = "mobs_mc_squid_hurt", + -- TODO: more and better sounds distance = 16, }, animation = { diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 25bfb2dd..960a1f8e 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -102,6 +102,7 @@ local horse = { run_end = 40, }, textures = horse_textures, + -- TODO: sounds fear_height = 4, fly = false, walk_chance = 60, diff --git a/mods/ENTITIES/mobs_mc/iron_golem.lua b/mods/ENTITIES/mobs_mc/iron_golem.lua index 0c30e6d6..ebd93dc6 100644 --- a/mods/ENTITIES/mobs_mc/iron_golem.lua +++ b/mods/ENTITIES/mobs_mc/iron_golem.lua @@ -27,10 +27,7 @@ mobs:register_mob("mobs_mc:iron_golem", { }, visual_size = {x=3, y=3}, makes_footstep_sound = true, - sounds = { - -- TODO - distance = 16, - }, + -- TODO: sounds view_range = 16, stepheight = 1.1, owner = "", diff --git a/mods/ENTITIES/mobs_mc/ocelot.lua b/mods/ENTITIES/mobs_mc/ocelot.lua index 7bfdd674..e6c385cf 100644 --- a/mods/ENTITIES/mobs_mc/ocelot.lua +++ b/mods/ENTITIES/mobs_mc/ocelot.lua @@ -51,6 +51,7 @@ local ocelot = { fear_height = 4, sounds = { random = "mobs_kitten", + -- TODO: more sounds distance = 16, }, animation = { diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mobs_mc/parrot.lua index ef421557..89e4c77f 100644 --- a/mods/ENTITIES/mobs_mc/parrot.lua +++ b/mods/ENTITIES/mobs_mc/parrot.lua @@ -29,6 +29,7 @@ mobs:register_mob("mobs_mc:parrot", { makes_footstep_sound = true, walk_velocity = 3, run_velocity = 5, + -- TODO: sounds drops = { {name = mobs_mc.items.feather, chance = 1, diff --git a/mods/ENTITIES/mobs_mc/polar_bear.lua b/mods/ENTITIES/mobs_mc/polar_bear.lua index 8028655a..84da77e7 100644 --- a/mods/ENTITIES/mobs_mc/polar_bear.lua +++ b/mods/ENTITIES/mobs_mc/polar_bear.lua @@ -50,10 +50,7 @@ mobs:register_mob("mobs_mc:polar_bear", { lava_damage = 5, light_damage = 0, fear_height = 4, - sounds = { - random = "Cowhurt1", -- TODO: Replace - distance = 16, - }, + -- TODO: sounds animation = { speed_normal = 25, speed_run = 50, stand_start = 0, stand_end = 0, diff --git a/mods/ENTITIES/mobs_mc/rabbit.lua b/mods/ENTITIES/mobs_mc/rabbit.lua index 0a15f3c7..d0a8d849 100644 --- a/mods/ENTITIES/mobs_mc/rabbit.lua +++ b/mods/ENTITIES/mobs_mc/rabbit.lua @@ -24,7 +24,7 @@ local rabbit = { {"mobs_mc_rabbit_black.png"}, }, visual_size = {x=1.5, y=1.5}, - sounds = {}, + -- TODO: sounds: random, damage, death makes_footstep_sound = false, walk_velocity = 1, run_velocity = 3.7, diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index f7f4dabc..ddb17e7c 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -29,6 +29,7 @@ mobs:register_mob("mobs_mc:shulker", { 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, diff --git a/mods/ENTITIES/mobs_mc/silverfish.lua b/mods/ENTITIES/mobs_mc/silverfish.lua index b7f51829..7c9157cc 100644 --- a/mods/ENTITIES/mobs_mc/silverfish.lua +++ b/mods/ENTITIES/mobs_mc/silverfish.lua @@ -21,7 +21,7 @@ mobs:register_mob("mobs_mc:silverfish", { }, pathfinding = 1, visual_size = {x=3, y=3}, - sounds = {}, + -- TODO: sounds makes_footstep_sound = false, walk_velocity = 0.6, run_velocity = 2, diff --git a/mods/ENTITIES/mobs_mc/snowman.lua b/mods/ENTITIES/mobs_mc/snowman.lua index 2a467a81..c5e56045 100644 --- a/mods/ENTITIES/mobs_mc/snowman.lua +++ b/mods/ENTITIES/mobs_mc/snowman.lua @@ -34,6 +34,7 @@ mobs:register_mob("mobs_mc:snowman", { collisionbox = {-0.35, -0.01, -0.35, 0.35, 1.89, 0.35}, visual = "mesh", mesh = "mobs_mc_snowman.b3d", + -- TODO: sounds: damage, death textures = { "mobs_mc_snowman.png", --snowman texture "farming_pumpkin_side.png", --top diff --git a/mods/ENTITIES/mobs_mc/spider.lua b/mods/ENTITIES/mobs_mc/spider.lua index a04f705d..2fe6ae53 100644 --- a/mods/ENTITIES/mobs_mc/spider.lua +++ b/mods/ENTITIES/mobs_mc/spider.lua @@ -37,6 +37,7 @@ local spider = { sounds = { random = "mobs_spider", attack = "mobs_spider", + -- TODO: sounds: walk, death distance = 16, }, walk_velocity = 3.9, diff --git a/mods/ENTITIES/mobs_mc/squid.lua b/mods/ENTITIES/mobs_mc/squid.lua index a2ea34ab..721f861b 100644 --- a/mods/ENTITIES/mobs_mc/squid.lua +++ b/mods/ENTITIES/mobs_mc/squid.lua @@ -24,6 +24,8 @@ mobs:register_mob("mobs_mc:squid", { }, sounds = { damage = "mobs_mc_squid_hurt", + death = "mobs_mc_squid_hurt", + -- TODO: sounds: random, damage, death distance = 16, }, animation = { @@ -56,6 +58,8 @@ mobs:register_mob("mobs_mc:squid", { blood_texture = "mobs_mc_squid_blood.png", }) +-- TODO: Behaviour: squirt + -- Spawn near the water surface local water = mobs_mc.spawn_height.water diff --git a/mods/ENTITIES/mobs_mc/vex.lua b/mods/ENTITIES/mobs_mc/vex.lua index b7d1570d..ec881dcd 100644 --- a/mods/ENTITIES/mobs_mc/vex.lua +++ b/mods/ENTITIES/mobs_mc/vex.lua @@ -38,6 +38,7 @@ mobs:register_mob("mobs_mc:vex", { sounds = { random = "mobs_rat", death = "green_slime_death", + -- TODO: Sounds: random (better), death (better), damage distance = 16, }, animation = { @@ -53,6 +54,7 @@ mobs:register_mob("mobs_mc:vex", { }, 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" diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 8709ecdb..892afadf 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -929,12 +929,7 @@ mobs:register_mob("mobs_mc:villager", { walk_velocity = 1.2, run_velocity = 2.4, drops = {}, - sounds = { - random = "mobs_mc_villager_noise", - death = "mobs_mc_villager_death", - damage = "mobs_mc_villager_damage", - distance = 16, - }, + -- TODO: sounds animation = { stand_speed = 25, stand_start = 40, diff --git a/mods/ENTITIES/mobs_mc/villager_evoker.lua b/mods/ENTITIES/mobs_mc/villager_evoker.lua index 1e7fa9ec..9c96e7ee 100644 --- a/mods/ENTITIES/mobs_mc/villager_evoker.lua +++ b/mods/ENTITIES/mobs_mc/villager_evoker.lua @@ -61,13 +61,7 @@ mobs:register_mob("mobs_mc:evoker", { min = 1, max = 1,}, }, - sounds = { - random = "Villagerdead", - death = "Villagerdead", - damage = "mese_dragon", - attack = "zombiedeath", - distance = 16, - }, + -- TODO: sounds animation = { stand_speed = 25, stand_start = 40, diff --git a/mods/ENTITIES/mobs_mc/villager_vindicator.lua b/mods/ENTITIES/mobs_mc/villager_vindicator.lua index aafd083b..82eff89b 100644 --- a/mods/ENTITIES/mobs_mc/villager_vindicator.lua +++ b/mods/ENTITIES/mobs_mc/villager_vindicator.lua @@ -47,11 +47,7 @@ mobs:register_mob("mobs_mc:vindicator", { min = 1, max = 1,}, }, - sounds = { - random = "Villager1", - death = "Villagerdead", - damage = "Villagerhurt1", - }, + -- TODO: sounds animation = { stand_speed = 25, stand_start = 40, diff --git a/mods/ENTITIES/mobs_mc/witch.lua b/mods/ENTITIES/mobs_mc/witch.lua index 85abbdc2..7edce46e 100644 --- a/mods/ENTITIES/mobs_mc/witch.lua +++ b/mods/ENTITIES/mobs_mc/witch.lua @@ -50,12 +50,7 @@ mobs:register_mob("mobs_mc:witch", { {name = mobs_mc.items.sugar, chance = 8, min = 0, max = 2,}, {name = mobs_mc.items.stick, chance = 4, min = 0, max = 2,}, }, - sounds = { - random = "Villager1", - death = "Villagerdead", - damage = "Villagerhurt1", - distance = 16, - }, + -- TODO: sounds animation = { speed_normal = 30, speed_run = 60, diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index a29cbef1..4c85390e 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -37,6 +37,7 @@ mobs:register_mob("mobs_mc:wither", { sounds = { shoot_attack = "mobs_mc_ender_dragon_shoot", attack = "mobs_mc_ender_dragon_attack", + -- TODO: sounds distance = 60, }, jump = true, diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua index 934fd753..1884b6de 100644 --- a/mods/ENTITIES/mobs_mc/wolf.lua +++ b/mods/ENTITIES/mobs_mc/wolf.lua @@ -35,10 +35,7 @@ local wolf = { }, visual_size = {x=3, y=3}, makes_footstep_sound = true, - sounds = { - war_cry = "mobs_wolf_attack", - distance = 16, - }, + -- TODO: sounds pathfinding = 1, floats = 1, view_range = 16, From e422e47ada98ae2d76be29170d2e79fc0b21c1d0 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 14 Sep 2018 17:37:24 +0200 Subject: [PATCH 0176/1107] Add crazy coo hurt/death sounds --- mods/ENTITIES/mobs_mc/LICENSE-media.md | 6 +++++- mods/ENTITIES/mobs_mc/cow+mooshroom.lua | 3 ++- .../mobs_mc/sounds/mobs_mc_cow_hurt.ogg | Bin 0 -> 11042 bytes 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/LICENSE-media.md b/mods/ENTITIES/mobs_mc/LICENSE-media.md index da0c7f87..06322aa1 100644 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ b/mods/ENTITIES/mobs_mc/LICENSE-media.md @@ -89,6 +89,10 @@ Origin of those models: * 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: * [NPXcoot](https://github.com/NPXcoot1) (CC BY-SA 4.0) * `mobs_mc_ender_dragon_*` * Blender Foundation (CC BY 3.0) @@ -134,4 +138,4 @@ Origin of those models: * Source: -Note: Many of these sounds have been more or less altered to fit the game. +Note: Many of these sounds have been more or less modified to fit the game. diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua index 15f62d3e..6dbae97e 100644 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua @@ -34,7 +34,8 @@ local cow_def = { runaway = true, sounds = { random = "mobs_mc_cow", - -- TODO: death, damage + damage = "mobs_mc_cow_hurt", + death = "mobs_mc_cow_hurt", distance = 16, }, animation = { diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_cow_hurt.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b07a7828145eb58976c1ecd4bdbceccdcf41cb20 GIT binary patch literal 11042 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 Y7ie)eU;MTGxexo^*Vf;zPLpQ<0Cy@ZkpKVy literal 0 HcmV?d00001 From 8b38a169e67a1921ec767dec3e2edab6778dc1f1 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 18 Sep 2018 14:23:11 +0200 Subject: [PATCH 0177/1107] Add basic horse sounds --- mods/ENTITIES/mobs_mc/LICENSE-media.md | 9 ++++++++- mods/ENTITIES/mobs_mc/horse.lua | 11 ++++++++++- .../mobs_mc/sounds/mobs_mc_horse_death.ogg | Bin 0 -> 35964 bytes .../mobs_mc/sounds/mobs_mc_horse_hurt.ogg | Bin 0 -> 18822 bytes .../mobs_mc/sounds/mobs_mc_horse_random.1.ogg | Bin 0 -> 37577 bytes .../mobs_mc/sounds/mobs_mc_horse_random.2.ogg | Bin 0 -> 45612 bytes 6 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_death.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_hurt.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_random.1.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_random.2.ogg diff --git a/mods/ENTITIES/mobs_mc/LICENSE-media.md b/mods/ENTITIES/mobs_mc/LICENSE-media.md index 06322aa1..139730e5 100644 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ b/mods/ENTITIES/mobs_mc/LICENSE-media.md @@ -136,6 +136,13 @@ Origin of those models: * [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: +* [ERH](https://freesound.org/people/ERH/) + * `mobs_mc_horse_random.2.ogg` (CC BY 3.0) + * Source: Note: Many of these sounds have been more or less modified to fit the game. diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 960a1f8e..4b8cb90a 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -102,7 +102,13 @@ local horse = { run_end = 40, }, textures = horse_textures, - -- TODO: sounds + sounds = { + random = "mobs_mc_horse_random", + -- TODO: Separate damage sound + damage = "mobs_mc_horse_death", + death = "mobs_mc_horse_death", + distance = 16, + }, fear_height = 4, fly = false, walk_chance = 60, @@ -363,6 +369,8 @@ donkey.animation = { stand_start = 0, stand_end = 0, walk_start = 0, walk_end = 40, } +-- TODO: donkey sounds +donkey.sounds = nil donkey.visual_size = { x=horse.visual_size.x*d, y=horse.visual_size.y*d } donkey.collisionbox = { horse.collisionbox[1] * d, @@ -382,6 +390,7 @@ local m = 0.94 local mule = table.copy(donkey) 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 = horse.sounds mule.collisionbox = { horse.collisionbox[1] * m, horse.collisionbox[2] * m, diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_death.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b4fd749c01ffbdeb27b514cbb6ae9ad3a5c640e5 GIT binary patch literal 35964 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 alzF2=vEiuo$7wPVKU$9SoM7bR;{yOtR`+=T literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_horse_hurt.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b6d7efd98d986696353a7ad6fe0bb019be5de519 GIT binary patch literal 18822 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%0AF*Xzm;V1(q`X>uPtLjMrR|Jj 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 vJc>94Hchmy{Bh(kzy8;{B5gUlLiRH literal 0 HcmV?d00001 From fd33d9d2ec474da0fb045f64ef449fc5fb3c7dee Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 18 Sep 2018 16:14:55 +0200 Subject: [PATCH 0178/1107] Add creeper and vex sounds --- mods/ENTITIES/mobs_mc/LICENSE-media.md | 11 +++++++++++ mods/ENTITIES/mobs_mc/creeper.lua | 4 ++-- .../mobs_mc/sounds/mobs_mc_creeper_death.ogg | Bin 0 -> 22263 bytes .../mobs_mc/sounds/mobs_mc_creeper_hurt.ogg | Bin 0 -> 10422 bytes .../mobs_mc/sounds/mobs_mc_vex_death.ogg | Bin 0 -> 15955 bytes .../mobs_mc/sounds/mobs_mc_vex_hurt.ogg | Bin 0 -> 10772 bytes mods/ENTITIES/mobs_mc/vex.lua | 6 +++--- 7 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_death.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_hurt.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_death.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_vex_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/LICENSE-media.md b/mods/ENTITIES/mobs_mc/LICENSE-media.md index 139730e5..65124094 100644 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ b/mods/ENTITIES/mobs_mc/LICENSE-media.md @@ -144,5 +144,16 @@ Origin of those models: * [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: Note: Many of these sounds have been more or less modified to fit the game. diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index b131bf09..ee105662 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -28,8 +28,8 @@ mobs:register_mob("mobs_mc:creeper", { visual_size = {x=3, y=3}, sounds = { attack = "tnt_ignite", - --TODO: death = "", - --TODO: damage = "", + death = "mobs_mc_creeper_death", + damage = "mobs_mc_creeper_hurt", fuse = "tnt_ignite", explode = "tnt_explode", distance = 16, diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_death.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_death.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ba43206ad3e66032b84bab5c3d4b2c2977cbbd97 GIT binary patch literal 22263 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