From f1229c5401494b7d809817fa43e4d25076451341 Mon Sep 17 00:00:00 2001 From: talamh Date: Sun, 2 May 2021 01:58:40 +0000 Subject: [PATCH 001/228] Added spawn egg for killer rabbitt --- .../mobs_mc_spawn_icon_rabbit_caerbannog.png | Bin 0 -> 1897 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_rabbit_caerbannog.png diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_rabbit_caerbannog.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_rabbit_caerbannog.png new file mode 100644 index 0000000000000000000000000000000000000000..4244a83c6f0a93ff1f7d65180fd6d56b43e98af3 GIT binary patch literal 1897 zcmV-v2bTDWP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1YulI182{O1&N1WN)Wj>8%;H<;s3VuS0|@?KYW zmmM}(W=UmAvR(i0-{Jnj!5qBvK`o{j4;()E#2Fnst|Om!I{bNG56AAjv%C8R!z5_s zdbGIg9d^ceUiP}y$*_lqg;HNH%KI02EyT7q*gLL`gsu&awXn-;A>p;Nzn;tG))ABG zqYHJ7AM5=|11>jjUX){qq#k$AhiXjd8y{Z5Tbn>d&;9R>K0doWl!1x6kQ}(%L@4tj z$!NoQXN;M)EV3+%3aG{IQ1sL0_4V-zx!cf}BD1U*2UO;c{F~ZCB17#+Av|IV<8+T;Z@u_B<0# zLrPT0*$`v}XQf0883%c4lxa{u+e#G>J$F{L%oXBR2ctoZ#1(Rq_<7P`l_X6JVpoKN zz{)okI=4;dc9jepH!_FlAS_0h@>i$(&Y&@7LJ=Kya|K*HBO55DazySR41*#x7OCMR zc%L7SsjEQ2aMEmWFdt>E0QpOxx8RafXu-gM_R1sDwiW#G=JYD!H<&Qhg0IR;^Z3&5fHhx|g6?PQug-im@jMu2TUL$2>JVjJ)Tm z+|=wyJc}R$WSHVKnu?=QtWgX4k#5C0k&@74l-_&0nZM zRQI^rPS^%yVYyRXk>0&FnxL&&4|}Qy>|;&%M(f@gq=T{5_4$b}k9f+$Q^fUg6gfFW zwnkcjn(r*hu3^nfr|$=3&&w&UqcpzM%N~COS(kRf29#~Q5b+2nBlzMqa#wEwL6vJu zVOnjpH5$}!kABV3%@vBpcD{GJweaa8&Lki4GFFpb^0iQDDnknAwvg&Gp4;Au#saK$ zVRvs%JZob+HwYC`f`Yv^%X+@Xe@ySw=uRtWJO_kc(nu|(a&K7EHNmR(bT6(=*FuFA z)h?R*NagX8(x*|^U1*EeEPd=GfD?Mjr#XWL{Qch$%Y_QXTw6&y?#y+B!{VT8uKx1G zr}D|)J2Jk={o|7Vc}|~F@duZ6QWxPwxUB)L%JgzDt?zz{YW5HG@r4cmQA9RD<3UIBDK7$1w-QnX|n=&!S6J#FSNeT0%D6YqIUEif*S>-oYH>emR5}^Fkwg@_oh35b$_S93CGmdz$@Es=#J; zeN9ja714I3q6@tu+)BDBeyF5T)-tFLe)~f-Vq8coja2Q-F895(dJZ}6uSk_y2F|BM z2ufQ4noTQziPQIMt^tazs0rq%XIq2V_qc*JAdmcS!E-OmM6aK8ekfIob4^iObE(#y zUHC(`UzN+Jt^3o7f4Y$32Qj(-0gvB171uc!#sB~S24YJ`L;%PDS^!tH0(VpZ000Sa zNLh0L01FcU01FcV0GgZ_00007bV*G`2jv9<0V4$`wT`m@000?uMObu0Z*6U5Zgc=c za%Ew3Wn>_CX>@2HM@dakSAh-}0004CNklbF5XOHoK`b;JVIM$K99Z8z zgPq_DXerpKg^gMWSBOs`_yF2S;;Kp&{r>lkCK@B4V3=Z)r$1%5iFTC>(}10W(?Yt0g{KT~|LB0{1RiBgp!Ypopv*h^Cyz`N@%B3xU*m=o zt`rm4%`%KJzZ1nVec%Xe6THe6MC2Pa2#BJHEhpZv%>xfW)2*`v&{}%{_i;?3R4HDb z=M{hjU}YMGL~8(+ouB79BEnr9^9gJkL&Mt2MOG*rgJ*!3k+ECA8*mx~W9K~f7fu|v j9Vl0|3LH#0`#-TSNF9Mg)SuCN00000NkvXXu0mjfBRps$ literal 0 HcmV?d00001 From e6b61a1551948352bf7e3dce3f59f7238a5d413e Mon Sep 17 00:00:00 2001 From: talamh Date: Sun, 2 May 2021 02:00:21 +0000 Subject: [PATCH 002/228] Update 'mods/ENTITIES/mobs_mc/rabbit.lua' --- mods/ENTITIES/mobs_mc/rabbit.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/rabbit.lua b/mods/ENTITIES/mobs_mc/rabbit.lua index 90d5c27bf..2a9521ecb 100644 --- a/mods/ENTITIES/mobs_mc/rabbit.lua +++ b/mods/ENTITIES/mobs_mc/rabbit.lua @@ -233,4 +233,4 @@ mobs:spawn(spawn_grass) mobs:register_egg("mobs_mc:rabbit", S("Rabbit"), "mobs_mc_spawn_icon_rabbit.png", 0) -- Note: This spawn egg does not exist in Minecraft -mobs:register_egg("mobs_mc:killer_bunny", S("Killer Bunny"), "mobs_mc_spawn_icon_rabbit.png^[colorize:#FF0000:192", 0) -- TODO: Update inventory image +mobs:register_egg("mobs_mc:killer_bunny", S("Killer Bunny"), "mobs_mc_spawn_icon_rabbit_caerbannog.png", 0) From a65db15b5caf92e1e18c07880ea62b8ff5ce61ff Mon Sep 17 00:00:00 2001 From: NO11 Date: Sat, 29 May 2021 19:21:15 +0000 Subject: [PATCH 003/228] Totem particle textures --- .../textures/mcl_particles_totem1.png | Bin 0 -> 148 bytes .../textures/mcl_particles_totem2.png | Bin 0 -> 154 bytes .../textures/mcl_particles_totem3.png | Bin 0 -> 155 bytes .../textures/mcl_particles_totem4.png | Bin 0 -> 165 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 mods/CORE/mcl_particles/textures/mcl_particles_totem1.png create mode 100644 mods/CORE/mcl_particles/textures/mcl_particles_totem2.png create mode 100644 mods/CORE/mcl_particles/textures/mcl_particles_totem3.png create mode 100644 mods/CORE/mcl_particles/textures/mcl_particles_totem4.png diff --git a/mods/CORE/mcl_particles/textures/mcl_particles_totem1.png b/mods/CORE/mcl_particles/textures/mcl_particles_totem1.png new file mode 100644 index 0000000000000000000000000000000000000000..15fe082e104d5d524ab2fa7b9af63c29c196756d GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VY)RhkE7sn8Z%gG4~v=dyO{rUg@zkN*8 lL_xjdE1|%O$WD@{VY)RhkE rgruaTp-7@BgTe~DWM4f;{PWz literal 0 HcmV?d00001 diff --git a/mods/CORE/mcl_particles/textures/mcl_particles_totem3.png b/mods/CORE/mcl_particles/textures/mcl_particles_totem3.png new file mode 100644 index 0000000000000000000000000000000000000000..55d6f49d3543ca553e475954f6012306ea7ba0bf GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VY)RhkEp00i_>zopr0FK-$I{*Lx literal 0 HcmV?d00001 diff --git a/mods/CORE/mcl_particles/textures/mcl_particles_totem4.png b/mods/CORE/mcl_particles/textures/mcl_particles_totem4.png new file mode 100644 index 0000000000000000000000000000000000000000..d6e6502b7fd0c0d1a68c8afdcea112d4693e07db GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VY)RhkEpe+aVfI>!|E{-7*my;6|m<*JP|NZ~}UtaIv zi4z?QIU*T%Il0AfO%OE_e5|H6NyhJjZ%d842m^yIw+NSW@uBHJ-3*?telF{r5}E+c C1}gjj literal 0 HcmV?d00001 From 75e263debca16802eabb977cbae1f1895dd32bc5 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sat, 29 May 2021 19:24:16 +0000 Subject: [PATCH 004/228] Add code for totem partciles --- mods/ITEMS/mcl_totems/init.lua | 48 ++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_totems/init.lua b/mods/ITEMS/mcl_totems/init.lua index 499d7362d..e64404c2c 100644 --- a/mods/ITEMS/mcl_totems/init.lua +++ b/mods/ITEMS/mcl_totems/init.lua @@ -4,6 +4,41 @@ minetest.register_on_leaveplayer(function(player) hud_totem[player] = nil end) +-- Totem particle registration +-- TODO: real MC colors, these are randomly selected colors: +local colors = {"#7FFF00", "#698B22", "#BCEE68", "#EEEE00", "#C5F007"} +for c, color in pairs(colors) do + local colorizing = ".png^[colorize:"..color + for n = 1, 4 do + minetest.register_entity("mcl_totems:totem_particle"..n.."_color"..c, { + physical = true, + collide_with_objects = false, + collisionbox = {-0.02,-0.02,-0.02, 0.02,0.02,0.02}, + pointable = false, + visual = "sprite", + visual_size = {x=0.2, y=0.2}, + textures = {"mcl_particles_totem"..n..colorizing}, + spritediv = {x=1, y=1}, + initial_sprite_basepos = {x=0, y=0}, + static_save = false, + glow = 5, + on_activate = function(self, staticdata) + self.object:set_velocity({x = math.random(-4, 4)*math.random(), y = math.random(-1, 4)*math.random(), z = math.random(-4, 4)*math.random()}) + minetest.after(0.3, function() + self.object:set_acceleration({x=0, y=-4, z=0}) + self.object:set_velocity({x=0, y=0, z=0}) + end) + end, + on_step = function(self, dtime) + local r = math.random(1,80) + if r == 1 then + self.object:remove() + end + end + }) + end +end + -- Save the player from death when holding totem of undying in hand mcl_damage.register_modifier(function(obj, damage, reason) if obj:is_player() then @@ -32,7 +67,16 @@ mcl_damage.register_modifier(function(obj, damage, reason) -- Effects minetest.sound_play({name = "mcl_totems_totem", gain=1}, {pos=ppos, max_hear_distance=16}, true) - -- Big totem overlay + --Particles + for i = 1, 200 do + local particle = "mcl_totems:totem_particle"..math.random(1, 4).."_color"..math.random(1, 5) + minetest.after(math.random(1, 2)*math.random(), function() + local new_pos = obj:get_pos() + minetest.add_entity({x=new_pos.x, y=new_pos.y + 1, z=new_pos.z}, particle) + end) + end + + -- Big totem overlay if not hud_totem[obj] then hud_totem[obj] = obj:hud_add({ hud_elem_type = "image", @@ -55,4 +99,4 @@ mcl_damage.register_modifier(function(obj, damage, reason) end end end -end, 1000) +end, 1000) \ No newline at end of file From 640b0dc4859014f15939cce0be36dd06c2b1419c Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 2 Jun 2021 00:23:11 +0200 Subject: [PATCH 005/228] basic title API working (testing needed) --- mods/HUD/mcl_title/init.lua | 161 ++++++++++++++++++++++++++++++++++++ mods/HUD/mcl_title/mod.conf | 4 + 2 files changed, 165 insertions(+) create mode 100644 mods/HUD/mcl_title/init.lua create mode 100644 mods/HUD/mcl_title/mod.conf diff --git a/mods/HUD/mcl_title/init.lua b/mods/HUD/mcl_title/init.lua new file mode 100644 index 000000000..9975ff840 --- /dev/null +++ b/mods/HUD/mcl_title/init.lua @@ -0,0 +1,161 @@ +--TODO: use SSCSM to reduce lag and network trafic (just send modchannel messages) +--TODO: exactly mc like layout + +local huds_idx = {} + +huds_idx.title = {} +huds_idx.subtitle = {} +huds_idx.actionbar = {} + +mcl_title = {} +mcl_title.defaults = {fadein = 10, stay = 70, fadeout = 20} +mcl_title.layout = {} +mcl_title.layout.title = {position = {x = 0.5, y = 0.5}, alignment = {x = 0, y = -1.3}, size = 5} +mcl_title.layout.subtitle = {position = {x = 0.5, y = 0.5}, alignment = {x = 0, y = 1.9}, size = 2} +mcl_title.layout.actionbar = {position = {x = 0.5, y = 1}, alignment = {x = 0, y = -15}, size = 1} + +local get_color = mcl_util.get_color + +local function gametick_to_secondes(gametick) + return gametick / 20 +end + + +--PARAMS SYSTEM +local player_params = {} + +minetest.register_on_joinplayer(function(player) + player_params[player] = { + stay = gametick_to_secondes(mcl_title.defaults.stay), + --fadeIn = gametick_to_secondes(mcl_title.defaults.fadein), + --fadeOut = gametick_to_secondes(mcl_title.defaults.fadeout), + } +end) + +minetest.register_on_leaveplayer(function(player) + player_params = nil +end) + +function mcl_title.params_set(player, data) + player_params[player] = { + stay = gametick_to_secondes(data.stay) or gametick_to_secondes(mcl_title.defaults.stay), + --fadeIn = gametick_to_secondes(data.fadeIn) or gametick_to_secondes(mcl_title.defaults.fadein), + --fadeOut = gametick_to_secondes(data.fadeOut) or gametick_to_secondes(mcl_title.defaults.fadeout), + } +end + +function mcl_title.params_get(player) + return player_params[player] +end + +--API FUNCTIONS + +function mcl_title.set(player, type, data) + if not data.color then + data.color = "white" + end + local _, hex_color = get_color(data.color) + if not hex_color then + return false + end + + if huds_idx[type][player] then + player:hud_remove(huds_idx[type][player]) + end + + --TODO: enable this code then Fleckenstein's pr get merged + --[[ + local bold + if data.bold == "true" then + bold = true + else + bold = false + end + + local italic + if data.italic == "true" then + italic = true + else + italic = false + end]] + + local stay = mcl_title.params_get(player).stay + + huds_idx[type][player] = player:hud_add({ + hud_elem_type = "text", + position = mcl_title.layout[type].position, + alignment = mcl_title.layout[type].alignment, + text = data.text, + --bold = bold, + --italic = italic, + size = {x = mcl_title.layout[type].size}, + number = hex_color, + z_index = 1100, + }) + + minetest.after(stay, function() + if huds_idx[type][player] then + player:hud_remove(huds_idx[type][player]) + end + huds_idx[type][player] = nil + end) + return true +end + +function mcl_title.remove(player, type) + if huds_idx[type][player] then + player:hud_remove(huds_idx[type][player]) + end + huds_idx[type][player] = nil +end + +function mcl_title.clear(player) + mcl_title.remove(player, "title") + mcl_title.remove(player, "subtitle") + mcl_title.remove(player, "actionbar") +end + +minetest.register_on_dieplayer(function(player) + mcl_title.clear(player) +end) + + +--TEMP STUFF!! +--TODO: remove then testing/tweaking done +minetest.register_chatcommand("title", { + func = function(name, param) + local player = minetest.get_player_by_name(name) + mcl_title.set(player, "title", {text=param, color="gold"}) + end, +}) + +minetest.register_chatcommand("subtitle", { + func = function(name, param) + local player = minetest.get_player_by_name(name) + mcl_title.set(player, "subtitle", {text=param, color="gold"}) + end, +}) + +minetest.register_chatcommand("actionbar", { + func = function(name, param) + local player = minetest.get_player_by_name(name) + mcl_title.set(player, "actionbar", {text=param, color="gold"}) + end, +}) + +minetest.register_chatcommand("timeout", { + func = function(name, param) + local player = minetest.get_player_by_name(name) + mcl_title.params_set(player, {stay = 600}) + end, +}) + +minetest.register_chatcommand("all", { + func = function(name, param) + local player = minetest.get_player_by_name(name) + mcl_title.params_set(player, {stay = 600}) + mcl_title.set(player, "title", {text=param, color="gold"}) + mcl_title.set(player, "subtitle", {text=param, color="gold"}) + mcl_title.set(player, "actionbar", {text=param, color="gold"}) + end, +}) \ No newline at end of file diff --git a/mods/HUD/mcl_title/mod.conf b/mods/HUD/mcl_title/mod.conf new file mode 100644 index 000000000..0f29a8118 --- /dev/null +++ b/mods/HUD/mcl_title/mod.conf @@ -0,0 +1,4 @@ +name = mcl_title +description = Add an API to add in HUD title +depends = mcl_colors +author = AFCMS \ No newline at end of file From 6b53dda79bf8b31309206ea29b6e84184cc17fc7 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 2 Jun 2021 00:25:15 +0200 Subject: [PATCH 006/228] add todo list --- mods/HUD/mcl_title/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/HUD/mcl_title/init.lua b/mods/HUD/mcl_title/init.lua index 9975ff840..41b4dfc4a 100644 --- a/mods/HUD/mcl_title/init.lua +++ b/mods/HUD/mcl_title/init.lua @@ -1,4 +1,5 @@ --TODO: use SSCSM to reduce lag and network trafic (just send modchannel messages) +--TODO: fadeIn and fadeOut animation (needs engine change: SSCSM or native support) --TODO: exactly mc like layout local huds_idx = {} From c8102838cb80e5ada8649a7ccf48c1c288a4de2b Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 2 Jun 2021 00:26:10 +0200 Subject: [PATCH 007/228] add missing TODO entry (bold+italic) --- mods/HUD/mcl_title/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/HUD/mcl_title/init.lua b/mods/HUD/mcl_title/init.lua index 41b4dfc4a..807ed19c9 100644 --- a/mods/HUD/mcl_title/init.lua +++ b/mods/HUD/mcl_title/init.lua @@ -65,6 +65,7 @@ function mcl_title.set(player, type, data) end --TODO: enable this code then Fleckenstein's pr get merged + --TODO: be sure API is correctly used --[[ local bold if data.bold == "true" then From 7e64470f7086c2978f0ad48710d6c0f253b6c3cb Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 2 Jun 2021 11:07:31 +0200 Subject: [PATCH 008/228] fix future API usage of bold+italic pr --- mods/HUD/mcl_title/init.lua | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/mods/HUD/mcl_title/init.lua b/mods/HUD/mcl_title/init.lua index 807ed19c9..83277b3bf 100644 --- a/mods/HUD/mcl_title/init.lua +++ b/mods/HUD/mcl_title/init.lua @@ -64,22 +64,10 @@ function mcl_title.set(player, type, data) player:hud_remove(huds_idx[type][player]) end - --TODO: enable this code then Fleckenstein's pr get merged - --TODO: be sure API is correctly used - --[[ - local bold - if data.bold == "true" then - bold = true - else - bold = false - end + --TODO: enable this code then Fleckenstein's pr get merged (in about 5-6 years) - local italic - if data.italic == "true" then - italic = true - else - italic = false - end]] + --if data.bold == nil then data.bold = false end + --if data.italic == nil then data.italic = false end local stay = mcl_title.params_get(player).stay @@ -88,8 +76,8 @@ function mcl_title.set(player, type, data) position = mcl_title.layout[type].position, alignment = mcl_title.layout[type].alignment, text = data.text, - --bold = bold, - --italic = italic, + --bold = data.bold, + --italic = data.italic, size = {x = mcl_title.layout[type].size}, number = hex_color, z_index = 1100, From b9fd1ac227c59407a92ca208d1fd71681c7952f0 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 2 Jun 2021 11:12:15 +0200 Subject: [PATCH 009/228] credit digminecraft for the tutorial --- mods/HUD/mcl_title/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/HUD/mcl_title/init.lua b/mods/HUD/mcl_title/init.lua index 83277b3bf..a2fd82b24 100644 --- a/mods/HUD/mcl_title/init.lua +++ b/mods/HUD/mcl_title/init.lua @@ -1,3 +1,5 @@ +--Based on https://www.digminecraft.com/game_commands/title_command.php + --TODO: use SSCSM to reduce lag and network trafic (just send modchannel messages) --TODO: fadeIn and fadeOut animation (needs engine change: SSCSM or native support) --TODO: exactly mc like layout From ee21a24fb61705bedfee8b2ad935b1e389018a58 Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 7 Jun 2021 17:13:50 +0000 Subject: [PATCH 010/228] Don't register a separate entity for every particle --- mods/ITEMS/mcl_totems/init.lua | 60 ++++++++++++++++------------------ 1 file changed, 28 insertions(+), 32 deletions(-) diff --git a/mods/ITEMS/mcl_totems/init.lua b/mods/ITEMS/mcl_totems/init.lua index e64404c2c..a6429f7b8 100644 --- a/mods/ITEMS/mcl_totems/init.lua +++ b/mods/ITEMS/mcl_totems/init.lua @@ -7,37 +7,34 @@ end) -- Totem particle registration -- TODO: real MC colors, these are randomly selected colors: local colors = {"#7FFF00", "#698B22", "#BCEE68", "#EEEE00", "#C5F007"} -for c, color in pairs(colors) do - local colorizing = ".png^[colorize:"..color - for n = 1, 4 do - minetest.register_entity("mcl_totems:totem_particle"..n.."_color"..c, { - physical = true, - collide_with_objects = false, - collisionbox = {-0.02,-0.02,-0.02, 0.02,0.02,0.02}, - pointable = false, - visual = "sprite", - visual_size = {x=0.2, y=0.2}, - textures = {"mcl_particles_totem"..n..colorizing}, - spritediv = {x=1, y=1}, - initial_sprite_basepos = {x=0, y=0}, - static_save = false, - glow = 5, - on_activate = function(self, staticdata) - self.object:set_velocity({x = math.random(-4, 4)*math.random(), y = math.random(-1, 4)*math.random(), z = math.random(-4, 4)*math.random()}) - minetest.after(0.3, function() - self.object:set_acceleration({x=0, y=-4, z=0}) - self.object:set_velocity({x=0, y=0, z=0}) - end) - end, - on_step = function(self, dtime) - local r = math.random(1,80) - if r == 1 then - self.object:remove() - end - end +minetest.register_entity("mcl_totems:totem_particle", { + physical = true, + collide_with_objects = false, + collisionbox = {-0.02,-0.02,-0.02, 0.02,0.02,0.02}, + pointable = false, + visual = "sprite", + visual_size = {x=0.2, y=0.2}, + spritediv = {x=1, y=1}, + initial_sprite_basepos = {x=0, y=0}, + static_save = false, + glow = 5, + on_activate = function(self, staticdata) + self.object:set_properties({ + textures = {"mcl_particles_totem"..math.random(1, 4)..".png^[colorize:"..colors[math.random(#colors)]} }) + self.object:set_velocity({x = math.random(-4, 4)*math.random(), y = math.random(-1, 4)*math.random(), z = math.random(-4, 4)*math.random()}) + minetest.after(0.3, function() + self.object:set_acceleration({x=0, y=-4, z=0}) + self.object:set_velocity({x=0, y=0, z=0}) + end) + end, + on_step = function(self, dtime) + local r = math.random(1,50) + if r == 1 then + self.object:remove() + end end -end +}) -- Save the player from death when holding totem of undying in hand mcl_damage.register_modifier(function(obj, damage, reason) @@ -68,11 +65,10 @@ mcl_damage.register_modifier(function(obj, damage, reason) minetest.sound_play({name = "mcl_totems_totem", gain=1}, {pos=ppos, max_hear_distance=16}, true) --Particles - for i = 1, 200 do - local particle = "mcl_totems:totem_particle"..math.random(1, 4).."_color"..math.random(1, 5) + for i = 1, 150 do minetest.after(math.random(1, 2)*math.random(), function() local new_pos = obj:get_pos() - minetest.add_entity({x=new_pos.x, y=new_pos.y + 1, z=new_pos.z}, particle) + minetest.add_entity({x = new_pos.x, y = new_pos.y + 1, z = new_pos.z}, "mcl_totems:totem_particle") end) end From 2603c4768ba34be059b8f3dd175985bc08683cea Mon Sep 17 00:00:00 2001 From: AFCMS Date: Mon, 7 Jun 2021 22:32:05 +0200 Subject: [PATCH 011/228] mcl_title: basic mc like layout (collide with other mods) --- mods/HUD/mcl_title/init.lua | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/mods/HUD/mcl_title/init.lua b/mods/HUD/mcl_title/init.lua index a2fd82b24..ffd740b4a 100644 --- a/mods/HUD/mcl_title/init.lua +++ b/mods/HUD/mcl_title/init.lua @@ -1,7 +1,11 @@ ---Based on https://www.digminecraft.com/game_commands/title_command.php +--Based on: +--https://www.digminecraft.com/game_commands/title_command.php +--https://youtu.be/oVrtQRO2hpY --TODO: use SSCSM to reduce lag and network trafic (just send modchannel messages) --TODO: fadeIn and fadeOut animation (needs engine change: SSCSM or native support) +--TODO: allow obfuscating text (needs engine change: SSCSM or native support) +--TODO: allow colorizing and styling of part of the text (NEEDS ENGINE CHANGE!!!) --TODO: exactly mc like layout local huds_idx = {} @@ -13,9 +17,9 @@ huds_idx.actionbar = {} mcl_title = {} mcl_title.defaults = {fadein = 10, stay = 70, fadeout = 20} mcl_title.layout = {} -mcl_title.layout.title = {position = {x = 0.5, y = 0.5}, alignment = {x = 0, y = -1.3}, size = 5} -mcl_title.layout.subtitle = {position = {x = 0.5, y = 0.5}, alignment = {x = 0, y = 1.9}, size = 2} -mcl_title.layout.actionbar = {position = {x = 0.5, y = 1}, alignment = {x = 0, y = -15}, size = 1} +mcl_title.layout.title = {position = {x = 0.5, y = 0.5}, alignment = {x = 0, y = -1.3}, size = 7} +mcl_title.layout.subtitle = {position = {x = 0.5, y = 0.5}, alignment = {x = 0, y = 1.7}, size = 4} +mcl_title.layout.actionbar = {position = {x = 0.5, y = 1}, alignment = {x = 0, y = -11}, size = 2} local get_color = mcl_util.get_color From 99ccd9ea4c77d09a7e4062f16819a3bbdff9fe53 Mon Sep 17 00:00:00 2001 From: NO11 Date: Tue, 8 Jun 2021 15:13:00 +0000 Subject: [PATCH 012/228] Fix possible crash --- mods/ITEMS/mcl_totems/init.lua | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_totems/init.lua b/mods/ITEMS/mcl_totems/init.lua index a6429f7b8..1847d579b 100644 --- a/mods/ITEMS/mcl_totems/init.lua +++ b/mods/ITEMS/mcl_totems/init.lua @@ -22,8 +22,11 @@ minetest.register_entity("mcl_totems:totem_particle", { self.object:set_properties({ textures = {"mcl_particles_totem"..math.random(1, 4)..".png^[colorize:"..colors[math.random(#colors)]} }) - self.object:set_velocity({x = math.random(-4, 4)*math.random(), y = math.random(-1, 4)*math.random(), z = math.random(-4, 4)*math.random()}) - minetest.after(0.3, function() + local t = math.random(1, 2)*math.random() + minetest.after(t, function() + self.object:set_velocity({x = math.random(-4, 4)*math.random(), y = math.random(-1, 4)*math.random(), z = math.random(-4, 4)*math.random()}) + end) + minetest.after(0.3 + t, function() self.object:set_acceleration({x=0, y=-4, z=0}) self.object:set_velocity({x=0, y=0, z=0}) end) @@ -65,12 +68,14 @@ mcl_damage.register_modifier(function(obj, damage, reason) minetest.sound_play({name = "mcl_totems_totem", gain=1}, {pos=ppos, max_hear_distance=16}, true) --Particles - for i = 1, 150 do - minetest.after(math.random(1, 2)*math.random(), function() - local new_pos = obj:get_pos() + + minetest.after(0.1, function() + local new_pos = obj:get_pos() + if not new_pos then return end + for i = 1, 150 do minetest.add_entity({x = new_pos.x, y = new_pos.y + 1, z = new_pos.z}, "mcl_totems:totem_particle") - end) - end + end + end) -- Big totem overlay if not hud_totem[obj] then From ee2fa60cae6f151720c1ac7949218f7fee6d4013 Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 9 Jun 2021 14:47:42 +0000 Subject: [PATCH 013/228] local totem particle position --- mods/ITEMS/mcl_totems/init.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_totems/init.lua b/mods/ITEMS/mcl_totems/init.lua index 1847d579b..ecdc20da0 100644 --- a/mods/ITEMS/mcl_totems/init.lua +++ b/mods/ITEMS/mcl_totems/init.lua @@ -72,8 +72,9 @@ mcl_damage.register_modifier(function(obj, damage, reason) minetest.after(0.1, function() local new_pos = obj:get_pos() if not new_pos then return end + local particlepos = {x = new_pos.x, y = new_pos.y + 1, z = new_pos.z} for i = 1, 150 do - minetest.add_entity({x = new_pos.x, y = new_pos.y + 1, z = new_pos.z}, "mcl_totems:totem_particle") + minetest.add_entity(particlepos, "mcl_totems:totem_particle") end end) From 509568b4b01e7529af9c8ad1e00980eba7bbd648 Mon Sep 17 00:00:00 2001 From: NO11 Date: Thu, 8 Jul 2021 16:49:19 +0000 Subject: [PATCH 014/228] Use real Minecraft colors for totem particles! --- mods/ITEMS/mcl_totems/init.lua | 38 ++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_totems/init.lua b/mods/ITEMS/mcl_totems/init.lua index ecdc20da0..2311e88d7 100644 --- a/mods/ITEMS/mcl_totems/init.lua +++ b/mods/ITEMS/mcl_totems/init.lua @@ -5,8 +5,32 @@ minetest.register_on_leaveplayer(function(player) end) -- Totem particle registration --- TODO: real MC colors, these are randomly selected colors: -local colors = {"#7FFF00", "#698B22", "#BCEE68", "#EEEE00", "#C5F007"} +function rgb_to_hex(rgb) + local hexadecimal = "#" + + for key, value in pairs(rgb) do + local hex = "" + + while value > 0 do + local index = math.fmod(value, 16) + 1 + value = math.floor(value / 16) + hex = string.sub("0123456789ABCDEF", index, index) .. hex + end + + local len = string.len(hex) + + if len == 0 then + hex = "00" + elseif len == 1 then + hex = "0" .. hex + end + + hexadecimal = hexadecimal .. hex + end + + return hexadecimal +end + minetest.register_entity("mcl_totems:totem_particle", { physical = true, collide_with_objects = false, @@ -17,10 +41,16 @@ minetest.register_entity("mcl_totems:totem_particle", { spritediv = {x=1, y=1}, initial_sprite_basepos = {x=0, y=0}, static_save = false, - glow = 5, + glow = 14, on_activate = function(self, staticdata) + local color + if math.random(0, 3) == 0 then + color = rgb_to_hex({ (0.6 + math.random() * 0.2) * 255, (0.6 + math.random() * 0.3) * 255, (math.random() * 0.2) * 255 }) + else + color = rgb_to_hex({ (0.1 + math.random() * 0.4) * 255, (0.6 + math.random() * 0.3) * 255, (math.random() * 0.2) * 255 }) + end self.object:set_properties({ - textures = {"mcl_particles_totem"..math.random(1, 4)..".png^[colorize:"..colors[math.random(#colors)]} + textures = { "mcl_particles_totem"..math.random(1, 4)..".png^[colorize:"..color } }) local t = math.random(1, 2)*math.random() minetest.after(t, function() From 8e931e92f57ce18792a846828e0e942f52f8eef1 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Fri, 9 Jul 2021 11:34:23 +0200 Subject: [PATCH 015/228] refactor mcl_title to be more efficient --- mods/HUD/mcl_title/init.lua | 120 +++++++++++++++++++++++++++--------- 1 file changed, 90 insertions(+), 30 deletions(-) diff --git a/mods/HUD/mcl_title/init.lua b/mods/HUD/mcl_title/init.lua index ffd740b4a..48c3a909f 100644 --- a/mods/HUD/mcl_title/init.lua +++ b/mods/HUD/mcl_title/init.lua @@ -8,8 +8,17 @@ --TODO: allow colorizing and styling of part of the text (NEEDS ENGINE CHANGE!!!) --TODO: exactly mc like layout +--Note that the table storing timeouts use playername as index insteed of player objects (faster) +--This is intended in order to speedup the process of removing HUD elements the the timeout is up + local huds_idx = {} +local hud_hide_timeouts = {} + +hud_hide_timeouts.title = {} +hud_hide_timeouts.subtitle = {} +hud_hide_timeouts.actionbar = {} + huds_idx.title = {} huds_idx.subtitle = {} huds_idx.actionbar = {} @@ -19,10 +28,13 @@ mcl_title.defaults = {fadein = 10, stay = 70, fadeout = 20} mcl_title.layout = {} mcl_title.layout.title = {position = {x = 0.5, y = 0.5}, alignment = {x = 0, y = -1.3}, size = 7} mcl_title.layout.subtitle = {position = {x = 0.5, y = 0.5}, alignment = {x = 0, y = 1.7}, size = 4} -mcl_title.layout.actionbar = {position = {x = 0.5, y = 1}, alignment = {x = 0, y = -11}, size = 2} +mcl_title.layout.actionbar = {position = {x = 0.5, y = 1}, alignment = {x = 0, y = 0}, size = 1} local get_color = mcl_util.get_color +local string = string +local pairs = pairs + local function gametick_to_secondes(gametick) return gametick / 20 end @@ -32,15 +44,64 @@ end local player_params = {} minetest.register_on_joinplayer(function(player) - player_params[player] = { + local playername = player:get_player_name() + player_params[playername] = { stay = gametick_to_secondes(mcl_title.defaults.stay), --fadeIn = gametick_to_secondes(mcl_title.defaults.fadein), --fadeOut = gametick_to_secondes(mcl_title.defaults.fadeout), - } + } + local _, hex_color = get_color("white") + huds_idx.title[player] = player:hud_add({ + hud_elem_type = "text", + position = mcl_title.layout.title.position, + alignment = mcl_title.layout.title.alignment, + text = "", + --bold = data.bold, + --italic = data.italic, + size = {x = mcl_title.layout.title.size}, + number = hex_color, + z_index = 100, + }) + huds_idx.subtitle[player] = player:hud_add({ + hud_elem_type = "text", + position = mcl_title.layout.subtitle.position, + alignment = mcl_title.layout.subtitle.alignment, + text = "", + --bold = data.bold, + --italic = data.italic, + size = {x = mcl_title.layout.subtitle.size}, + number = hex_color, + z_index = 100, + }) + huds_idx.actionbar[player] = player:hud_add({ + hud_elem_type = "text", + position = mcl_title.layout.actionbar.position, + offset = {x = 0, y = -210}, + alignment = mcl_title.layout.actionbar.alignment, + --bold = data.bold, + --italic = data.italic, + text = "", + size = {x = mcl_title.layout.actionbar.size}, + number = hex_color, + z_index = 100, + }) end) minetest.register_on_leaveplayer(function(player) - player_params = nil + local playername = player:get_player_name() + + --remove player params from the list + player_params[player] = nil + + --remove HUD idx from the list (HUD elements are removed by the engine) + huds_idx.title[player] = nil + huds_idx.subtitle[player] = nil + huds_idx.actionbar[player] = nil + + --remove timers form list + hud_hide_timeouts.title[playername] = nil + hud_hide_timeouts.subtitle[playername] = nil + hud_hide_timeouts.actionbar[playername] = nil end) function mcl_title.params_set(player, data) @@ -66,43 +127,22 @@ function mcl_title.set(player, type, data) return false end - if huds_idx[type][player] then - player:hud_remove(huds_idx[type][player]) - end - --TODO: enable this code then Fleckenstein's pr get merged (in about 5-6 years) --if data.bold == nil then data.bold = false end --if data.italic == nil then data.italic = false end - local stay = mcl_title.params_get(player).stay + player:hud_change(huds_idx[type][player], "text", data.text) + player:hud_change(huds_idx[type][player], "number", hex_color) - huds_idx[type][player] = player:hud_add({ - hud_elem_type = "text", - position = mcl_title.layout[type].position, - alignment = mcl_title.layout[type].alignment, - text = data.text, - --bold = data.bold, - --italic = data.italic, - size = {x = mcl_title.layout[type].size}, - number = hex_color, - z_index = 1100, - }) - - minetest.after(stay, function() - if huds_idx[type][player] then - player:hud_remove(huds_idx[type][player]) - end - huds_idx[type][player] = nil - end) + hud_hide_timeouts[type][player:get_player_name()] = data.stay or mcl_title.params_get(player).stay return true end function mcl_title.remove(player, type) - if huds_idx[type][player] then - player:hud_remove(huds_idx[type][player]) + if player then + player:hud_change(huds_idx[type][player], "text", "") end - huds_idx[type][player] = nil end function mcl_title.clear(player) @@ -115,6 +155,26 @@ minetest.register_on_dieplayer(function(player) mcl_title.clear(player) end) +minetest.register_globalstep(function(dtime) + local new_timeouts = { + title = {}, + subtitle = {}, + actionbar = {}, + } + for element, content in pairs(hud_hide_timeouts) do + for name, timeout in pairs(content) do + timeout = timeout - dtime + if timeout <= 0 then + local player = minetest.get_player_by_name(name) + mcl_title.remove(player, element) + else + new_timeouts[element][name] = timeout + end + end + end + hud_hide_timeouts = new_timeouts +end) + --TEMP STUFF!! --TODO: remove then testing/tweaking done From d2f7d3136028f726d3aaba1ff7e4304e1952aef5 Mon Sep 17 00:00:00 2001 From: Emojigit Date: Sat, 10 Jul 2021 10:16:55 +0800 Subject: [PATCH 016/228] Fix warning in `mcl_end` This fixes: ``` 2021-07-10 10:00:58: WARNING[Main]: get_mapgen_params is deprecated; use get_mapgen_setting instead (at .../../games/MineClone2/mods/ITEMS/mcl_end/chorus_plant.lua:456) ``` --- mods/ITEMS/mcl_end/chorus_plant.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index 24307b5ed..4dc54db18 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -453,7 +453,7 @@ function mcl_end.grow_chorus_plant_step(pos, node, pr) end --- ABM --- -local seed = minetest.get_mapgen_params().seed +local seed = minetest.get_mapgen_setting("seed") local pr = PseudoRandom(seed) minetest.register_abm({ label = "Chorus plant growth", From 5ceb48fcb13ae20a4295cc7c0d4cbcfa30c26a8c Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 12 Jul 2021 18:05:52 +0000 Subject: [PATCH 017/228] Faster rgb to hex --- mods/ITEMS/mcl_totems/init.lua | 61 +++++++++++----------------------- 1 file changed, 20 insertions(+), 41 deletions(-) diff --git a/mods/ITEMS/mcl_totems/init.lua b/mods/ITEMS/mcl_totems/init.lua index 2311e88d7..5f9b254a3 100644 --- a/mods/ITEMS/mcl_totems/init.lua +++ b/mods/ITEMS/mcl_totems/init.lua @@ -5,64 +5,43 @@ minetest.register_on_leaveplayer(function(player) end) -- Totem particle registration -function rgb_to_hex(rgb) - local hexadecimal = "#" - for key, value in pairs(rgb) do - local hex = "" - - while value > 0 do - local index = math.fmod(value, 16) + 1 - value = math.floor(value / 16) - hex = string.sub("0123456789ABCDEF", index, index) .. hex - end - - local len = string.len(hex) - - if len == 0 then - hex = "00" - elseif len == 1 then - hex = "0" .. hex - end - - hexadecimal = hexadecimal .. hex - end - - return hexadecimal +function rgb_to_hex(r, g, b) + return string.format("%02x%02x%02x", r, g, b) end minetest.register_entity("mcl_totems:totem_particle", { physical = true, collide_with_objects = false, - collisionbox = {-0.02,-0.02,-0.02, 0.02,0.02,0.02}, + collisionbox = { -0.02, -0.02, -0.02, 0.02, 0.02, 0.02 }, pointable = false, visual = "sprite", - visual_size = {x=0.2, y=0.2}, - spritediv = {x=1, y=1}, - initial_sprite_basepos = {x=0, y=0}, + visual_size = { x = 0.2, y = 0.2 }, + spritediv = { x = 1, y = 1 }, + initial_sprite_basepos = { x = 0, y = 0 }, static_save = false, glow = 14, on_activate = function(self, staticdata) local color if math.random(0, 3) == 0 then - color = rgb_to_hex({ (0.6 + math.random() * 0.2) * 255, (0.6 + math.random() * 0.3) * 255, (math.random() * 0.2) * 255 }) + color = rgb_to_hex( 153 + math.random() * 51, 153 + math.random() * 76.5, math.random() * 51) else - color = rgb_to_hex({ (0.1 + math.random() * 0.4) * 255, (0.6 + math.random() * 0.3) * 255, (math.random() * 0.2) * 255 }) + color = rgb_to_hex(25.5 + math.random() * 102, 153 + math.random() * 76.5, math.random() * 51) end self.object:set_properties({ - textures = { "mcl_particles_totem"..math.random(1, 4)..".png^[colorize:"..color } + textures = { "mcl_particles_totem"..math.random(1, 4)..".png^[colorize:#"..color } }) local t = math.random(1, 2)*math.random() minetest.after(t, function() - self.object:set_velocity({x = math.random(-4, 4)*math.random(), y = math.random(-1, 4)*math.random(), z = math.random(-4, 4)*math.random()}) + self.object:set_velocity({ x = math.random(-4, 4) * math.random(), y = math.random(-1, 4) * math.random(), z = math.random(-4, 4) * math.random() }) end) minetest.after(0.3 + t, function() - self.object:set_acceleration({x=0, y=-4, z=0}) - self.object:set_velocity({x=0, y=0, z=0}) + self.object:set_acceleration({ x = 0, y = -4, z = 0 }) + self.object:set_velocity({ x = 0, y = 0, z = 0 }) end) end, on_step = function(self, dtime) - local r = math.random(1,50) + local r = math.random(1, 50) if r == 1 then self.object:remove() end @@ -79,7 +58,7 @@ mcl_damage.register_modifier(function(obj, damage, reason) local ppos = obj:get_pos() local pnname = minetest.get_node(ppos).name -- Some exceptions when _not_ to save the player - for n=1, #mobs_mc.misc.totem_fail_nodes do + for n = 1, #mobs_mc.misc.totem_fail_nodes do if pnname == mobs_mc.misc.totem_fail_nodes[n] then return end @@ -95,14 +74,14 @@ mcl_damage.register_modifier(function(obj, damage, reason) end -- Effects - minetest.sound_play({name = "mcl_totems_totem", gain=1}, {pos=ppos, max_hear_distance=16}, true) + minetest.sound_play({ name = "mcl_totems_totem", gain = 1 }, { pos = ppos, max_hear_distance = 16 }, true) --Particles minetest.after(0.1, function() local new_pos = obj:get_pos() if not new_pos then return end - local particlepos = {x = new_pos.x, y = new_pos.y + 1, z = new_pos.z} + local particlepos = { x = new_pos.x, y = new_pos.y + 1, z = new_pos.z } for i = 1, 150 do minetest.add_entity(particlepos, "mcl_totems:totem_particle") end @@ -113,9 +92,9 @@ mcl_damage.register_modifier(function(obj, damage, reason) hud_totem[obj] = obj:hud_add({ hud_elem_type = "image", text = "mcl_totems_totem.png", - position = { x=0.5, y=1 }, - scale = { x=17, y=17 }, - offset = { x=0, y=-178 }, + position = { x = 0.5, y = 1 }, + scale = { x = 17, y = 17 }, + offset = { x = 0, y = -178 }, z_index = 100, }) minetest.after(3, function() @@ -131,4 +110,4 @@ mcl_damage.register_modifier(function(obj, damage, reason) end end end -end, 1000) \ No newline at end of file +end, 1000) From 60fcafeee4fdeb9a236f141801fc95e103685178 Mon Sep 17 00:00:00 2001 From: Tianyang Zhang Date: Thu, 15 Jul 2021 19:25:32 -0700 Subject: [PATCH 018/228] Update description of emerald --- mods/ITEMS/mcl_core/craftitems.lua | 2 +- mods/ITEMS/mcl_core/locale/mcl_core.de.tr | 2 +- mods/ITEMS/mcl_core/locale/mcl_core.es.tr | 2 +- mods/ITEMS/mcl_core/locale/mcl_core.fr.tr | 2 +- mods/ITEMS/mcl_core/locale/mcl_core.pl.tr | 2 +- mods/ITEMS/mcl_core/locale/mcl_core.ru.tr | 2 +- mods/ITEMS/mcl_core/locale/template.txt | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_core/craftitems.lua b/mods/ITEMS/mcl_core/craftitems.lua index 03f30b7b9..836f21688 100644 --- a/mods/ITEMS/mcl_core/craftitems.lua +++ b/mods/ITEMS/mcl_core/craftitems.lua @@ -93,7 +93,7 @@ minetest.register_craftitem("mcl_core:gold_ingot", { minetest.register_craftitem("mcl_core:emerald", { description = S("Emerald"), - _doc_items_longdesc = S("Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting."), + _doc_items_longdesc = S("Emeralds are used for trading with villagers."), inventory_image = "mcl_core_emerald.png", stack_max = 64, groups = { craftitem=1 }, diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index 0a1cbad37..f5a28c76f 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Smaragd Emerald Ore=Smaragderz Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Smaragderz ist das Erz von Smaragden. Es ist sehr selten und kann nur einzeln gefunden werden, nicht in Ansammlungen. -Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Smaragde sind nicht besonders nützlich, aber man kann sie in der Fertigung durch Goldbarren eintauschen. +Emeralds are used for trading with villagers.=Smaragde sind nicht besonders nützlich, aber man kann sie in der Fertigung durch Goldbarren eintauschen. Flint=Feuerstein Flint is a raw material.=Feuerstein ist ein Rohstoff. Flowing Lava=Fließende Lava diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.es.tr b/mods/ITEMS/mcl_core/locale/mcl_core.es.tr index 1e1029c0f..54ee95d16 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.es.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.es.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Esmeralda Emerald Ore=Mena de esmeralda Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=El mineral esmeralda es el mineral de las esmeraldas. Es muy raro y se puede encontrar solo, no en grupos. -Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Las esmeraldas no son muy útiles por sí mismas, pero pueden cambiarse por lingotes de oro haciendo artesanías. +Emeralds are used for trading with villagers.=Las esmeraldas no son muy útiles por sí mismas, pero pueden cambiarse por lingotes de oro haciendo artesanías. Flint=Pedernal Flint is a raw material.=El pedernal es una materia prima. Flowing Lava=Lava que fluye diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr b/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr index 725025e48..84657c8a1 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Emeraude Emerald Ore=Minerai d'Emeraude Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Le minerai d'émeraude produit des émeraudes. Il est très rare et peut être trouvé seul, pas en filons. -Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Les émeraudes ne sont pas très utiles seules, mais elles peuvent être échangées contre des lingots d'or. +Emeralds are used for trading with villagers.=Les émeraudes ne sont pas très utiles seules, mais elles peuvent être échangées contre des lingots d'or. Flint=Silex Flint is a raw material.=Le silex est une matière première. Flowing Lava=Lave qui coule diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr b/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr index 832a47830..90a75f810 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Szmaragd Emerald Ore=Ruda szmaragdu Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Ruda szmaragdu jest bardzo rzadka i występuje samotnie, nie w grupach. -Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Szmaragdy nie są zbyt użyteczne same w sobie, ale można z nich wytworzyć sztabki złota. +Emeralds are used for trading with villagers.=Szmaragdy nie są zbyt użyteczne same w sobie, ale można z nich wytworzyć sztabki złota. Flint=Krzemień Flint is a raw material.=Krzemień jest surowym materiałem. Flowing Lava=Płynąca lawa diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr b/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr index f93db7c2c..07236037b 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Изумруд Emerald Ore=Изумрудная руда Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Изумрудная руда встречается очень редко и всегда по одному блоку. -Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Изумруды не очень полезны сами по себе, но их можно обменять на золотые слитки. +Emeralds are used for trading with villagers.=Изумруды не очень полезны сами по себе, но их можно обменять на золотые слитки. Flint=Кремень Flint is a raw material.=Кремень это необработанный материал. Flowing Lava=Текущая лава diff --git a/mods/ITEMS/mcl_core/locale/template.txt b/mods/ITEMS/mcl_core/locale/template.txt index 2cb74f5d1..1e8ee04ce 100644 --- a/mods/ITEMS/mcl_core/locale/template.txt +++ b/mods/ITEMS/mcl_core/locale/template.txt @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald= Emerald Ore= Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.= -Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.= +Emeralds are used for trading with villagers.= Flint= Flint is a raw material.= Flowing Lava= From 559cf85c9449b77591603ca561618668a3fb027e Mon Sep 17 00:00:00 2001 From: Tianyang Zhang Date: Mon, 19 Jul 2021 09:12:39 -0700 Subject: [PATCH 019/228] Improve description of emerald --- mods/ITEMS/mcl_core/craftitems.lua | 2 +- mods/ITEMS/mcl_core/locale/mcl_core.de.tr | 2 +- mods/ITEMS/mcl_core/locale/mcl_core.es.tr | 2 +- mods/ITEMS/mcl_core/locale/mcl_core.fr.tr | 2 +- mods/ITEMS/mcl_core/locale/mcl_core.pl.tr | 2 +- mods/ITEMS/mcl_core/locale/mcl_core.ru.tr | 2 +- mods/ITEMS/mcl_core/locale/template.txt | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_core/craftitems.lua b/mods/ITEMS/mcl_core/craftitems.lua index 836f21688..85a078766 100644 --- a/mods/ITEMS/mcl_core/craftitems.lua +++ b/mods/ITEMS/mcl_core/craftitems.lua @@ -93,7 +93,7 @@ minetest.register_craftitem("mcl_core:gold_ingot", { minetest.register_craftitem("mcl_core:emerald", { description = S("Emerald"), - _doc_items_longdesc = S("Emeralds are used for trading with villagers."), + _doc_items_longdesc = S("Emeralds are used in villager trades as currency."), inventory_image = "mcl_core_emerald.png", stack_max = 64, groups = { craftitem=1 }, diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index f5a28c76f..8b75dfd40 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Smaragd Emerald Ore=Smaragderz Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Smaragderz ist das Erz von Smaragden. Es ist sehr selten und kann nur einzeln gefunden werden, nicht in Ansammlungen. -Emeralds are used for trading with villagers.=Smaragde sind nicht besonders nützlich, aber man kann sie in der Fertigung durch Goldbarren eintauschen. +Emeralds are used in villager trades as currency.=Smaragde sind nicht besonders nützlich, aber man kann sie in der Fertigung durch Goldbarren eintauschen. Flint=Feuerstein Flint is a raw material.=Feuerstein ist ein Rohstoff. Flowing Lava=Fließende Lava diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.es.tr b/mods/ITEMS/mcl_core/locale/mcl_core.es.tr index 54ee95d16..d77f45dc2 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.es.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.es.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Esmeralda Emerald Ore=Mena de esmeralda Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=El mineral esmeralda es el mineral de las esmeraldas. Es muy raro y se puede encontrar solo, no en grupos. -Emeralds are used for trading with villagers.=Las esmeraldas no son muy útiles por sí mismas, pero pueden cambiarse por lingotes de oro haciendo artesanías. +Emeralds are used in villager trades as currency.=Las esmeraldas no son muy útiles por sí mismas, pero pueden cambiarse por lingotes de oro haciendo artesanías. Flint=Pedernal Flint is a raw material.=El pedernal es una materia prima. Flowing Lava=Lava que fluye diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr b/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr index 84657c8a1..4d6a3ed43 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Emeraude Emerald Ore=Minerai d'Emeraude Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Le minerai d'émeraude produit des émeraudes. Il est très rare et peut être trouvé seul, pas en filons. -Emeralds are used for trading with villagers.=Les émeraudes ne sont pas très utiles seules, mais elles peuvent être échangées contre des lingots d'or. +Emeralds are used in villager trades as currency.=Les émeraudes ne sont pas très utiles seules, mais elles peuvent être échangées contre des lingots d'or. Flint=Silex Flint is a raw material.=Le silex est une matière première. Flowing Lava=Lave qui coule diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr b/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr index 90a75f810..f8dbbde6b 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Szmaragd Emerald Ore=Ruda szmaragdu Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Ruda szmaragdu jest bardzo rzadka i występuje samotnie, nie w grupach. -Emeralds are used for trading with villagers.=Szmaragdy nie są zbyt użyteczne same w sobie, ale można z nich wytworzyć sztabki złota. +Emeralds are used in villager trades as currency.=Szmaragdy nie są zbyt użyteczne same w sobie, ale można z nich wytworzyć sztabki złota. Flint=Krzemień Flint is a raw material.=Krzemień jest surowym materiałem. Flowing Lava=Płynąca lawa diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr b/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr index 07236037b..ad9d863b2 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Изумруд Emerald Ore=Изумрудная руда Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Изумрудная руда встречается очень редко и всегда по одному блоку. -Emeralds are used for trading with villagers.=Изумруды не очень полезны сами по себе, но их можно обменять на золотые слитки. +Emeralds are used in villager trades as currency.=Изумруды не очень полезны сами по себе, но их можно обменять на золотые слитки. Flint=Кремень Flint is a raw material.=Кремень это необработанный материал. Flowing Lava=Текущая лава diff --git a/mods/ITEMS/mcl_core/locale/template.txt b/mods/ITEMS/mcl_core/locale/template.txt index 1e8ee04ce..19d156711 100644 --- a/mods/ITEMS/mcl_core/locale/template.txt +++ b/mods/ITEMS/mcl_core/locale/template.txt @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald= Emerald Ore= Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.= -Emeralds are used for trading with villagers.= +Emeralds are used in villager trades as currency.= Flint= Flint is a raw material.= Flowing Lava= From b5f7ae54583197b55bb5e8f5f81a6605fa4f74e8 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 20 Jul 2021 15:47:26 +0200 Subject: [PATCH 020/228] working implementation + support of other mods --- mods/ENTITIES/mcl_boats/init.lua | 2 +- mods/ENTITIES/mcl_boats/mod.conf | 2 +- mods/ENTITIES/mcl_minecarts/init.lua | 2 +- mods/ENTITIES/mcl_minecarts/mod.conf | 2 +- mods/HUD/mcl_title/init.lua | 5 ++--- mods/ITEMS/mcl_beds/functions.lua | 2 +- 6 files changed, 7 insertions(+), 8 deletions(-) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index 76ace7a45..e81e9ffc5 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -84,7 +84,7 @@ local function attach_object(self, obj) end end, name) obj:set_look_horizontal(yaw) - mcl_tmp_message.message(obj, S("Sneak to dismount")) + mcl_title.set(obj, "actionbar", {text=S("Sneak to dismount"), color="white", stay=3}) else obj:get_luaentity()._old_visual_size = visual_size end diff --git a/mods/ENTITIES/mcl_boats/mod.conf b/mods/ENTITIES/mcl_boats/mod.conf index a5d6cc8cb..61463b6ec 100644 --- a/mods/ENTITIES/mcl_boats/mod.conf +++ b/mods/ENTITIES/mcl_boats/mod.conf @@ -1,7 +1,7 @@ name = mcl_boats author = PilzAdam description = Adds drivable boats. -depends = mcl_player, flowlib +depends = mcl_player, flowlib, mcl_title optional_depends = mcl_core, doc_identifier diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index e33e120a1..a76ab538a 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -646,7 +646,7 @@ register_minecart( if player then mcl_player.player_set_animation(player, "sit" , 30) player:set_eye_offset({x=0, y=-5.5, z=0},{x=0, y=-4, z=0}) - mcl_tmp_message.message(clicker, S("Sneak to dismount")) + mcl_title.set(clicker, "actionbar", {text=S("Sneak to dismount"), color="white", stay=3}) end end, name) end diff --git a/mods/ENTITIES/mcl_minecarts/mod.conf b/mods/ENTITIES/mcl_minecarts/mod.conf index 9fff9175d..3b8ae5551 100644 --- a/mods/ENTITIES/mcl_minecarts/mod.conf +++ b/mods/ENTITIES/mcl_minecarts/mod.conf @@ -1,6 +1,6 @@ name = mcl_minecarts author = Krock description = Minecarts are vehicles to move players quickly on rails. -depends = mcl_explosions, mcl_core, mcl_sounds, mcl_player, mcl_achievements, mcl_chests, mcl_furnaces, mesecons_commandblock, mcl_hoppers, mcl_tnt, mesecons +depends = mcl_title, mcl_explosions, mcl_core, mcl_sounds, mcl_player, mcl_achievements, mcl_chests, mcl_furnaces, mesecons_commandblock, mcl_hoppers, mcl_tnt, mesecons optional_depends = doc_identifier, mcl_wip diff --git a/mods/HUD/mcl_title/init.lua b/mods/HUD/mcl_title/init.lua index 48c3a909f..03fe17614 100644 --- a/mods/HUD/mcl_title/init.lua +++ b/mods/HUD/mcl_title/init.lua @@ -45,7 +45,7 @@ local player_params = {} minetest.register_on_joinplayer(function(player) local playername = player:get_player_name() - player_params[playername] = { + player_params[player] = { stay = gametick_to_secondes(mcl_title.defaults.stay), --fadeIn = gametick_to_secondes(mcl_title.defaults.fadein), --fadeOut = gametick_to_secondes(mcl_title.defaults.fadeout), @@ -127,14 +127,13 @@ function mcl_title.set(player, type, data) return false end - --TODO: enable this code then Fleckenstein's pr get merged (in about 5-6 years) + --TODO: enable this code then Fleckenstein's pr get merged (in about 5-6 years lol) --if data.bold == nil then data.bold = false end --if data.italic == nil then data.italic = false end player:hud_change(huds_idx[type][player], "text", data.text) player:hud_change(huds_idx[type][player], "number", hex_color) - hud_hide_timeouts[type][player:get_player_name()] = data.stay or mcl_title.params_get(player).stay return true end diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index dc9afe2ba..f323ca4c7 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -330,7 +330,7 @@ function mcl_beds.on_rightclick(pos, player, is_top) message = select(2, lay_down(player, ppos, other)) end if message then - mcl_tmp_message.message(player, message) + mcl_title.set(player, "actionbar", {text=message, color="white", stay=3}) end else lay_down(player, nil, nil, false) From c31c852a6ea63eb2ffed49089881866fb59df0ed Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 20 Jul 2021 16:14:34 +0200 Subject: [PATCH 021/228] add documentation --- mods/ENTITIES/mcl_boats/init.lua | 2 +- mods/ENTITIES/mcl_minecarts/init.lua | 2 +- mods/HUD/mcl_title/API.md | 42 ++++++++++++++++++++++++++++ mods/HUD/mcl_title/init.lua | 2 +- mods/ITEMS/mcl_beds/functions.lua | 2 +- 5 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 mods/HUD/mcl_title/API.md diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index e81e9ffc5..311b07882 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -84,7 +84,7 @@ local function attach_object(self, obj) end end, name) obj:set_look_horizontal(yaw) - mcl_title.set(obj, "actionbar", {text=S("Sneak to dismount"), color="white", stay=3}) + mcl_title.set(obj, "actionbar", {text=S("Sneak to dismount"), color="white", stay=60}) else obj:get_luaentity()._old_visual_size = visual_size end diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index a76ab538a..4d3873cc2 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -646,7 +646,7 @@ register_minecart( if player then mcl_player.player_set_animation(player, "sit" , 30) player:set_eye_offset({x=0, y=-5.5, z=0},{x=0, y=-4, z=0}) - mcl_title.set(clicker, "actionbar", {text=S("Sneak to dismount"), color="white", stay=3}) + mcl_title.set(clicker, "actionbar", {text=S("Sneak to dismount"), color="white", stay=60}) end end, name) end diff --git a/mods/HUD/mcl_title/API.md b/mods/HUD/mcl_title/API.md new file mode 100644 index 000000000..50614be4f --- /dev/null +++ b/mods/HUD/mcl_title/API.md @@ -0,0 +1,42 @@ +# mcl_title + +Allow mods to show messages in the hud of players. + +## mcl_title.set(player, type, data) + +Show a hud message of `type` to player `player` with `data` as params. + +The element will stay for the per-player param `stay` or `data.stay` (in gametick which is 1/20 second). + +Here is a usage exemple: + +```lua +--show a title in the HUD with minecraft color "gold" +mcl_title.set(player, "title", {text="dummy text", color="gold"}) + +--show a subtitle in the HUD with hex color "#612D2D" +mcl_title.set(player, "subtitle", {text="dummy subtitle", color="#612D2D"}) + +--show an actionbar in the HUD (above the hotbar) with minecraft color "red" +mcl_title.set(player, "subtitle", {text="dummy actionbar", color="red"}) + +--show a title in the HUD with minecraft color "gold" staying for 3 seconds (override stay setting) +mcl_title.set(player, "title", {text="dummy text", color="gold", stay=3}) +``` + +## mcl_title.remove(player, type) + +Hide HUD element of type `type` for player `player`. + +## mcl_title.clear(player) + +Remove every title/subtitle/actionbar from a player. +Basicaly run `mcl_title.remove(player, type)` for every type. + +## mcl_title.params_set(player, params) + +Allow mods to set `stay` and upcomming `fadeIn`/`fadeOut` params. + +```lua +mcl_title.params_set(player, {stay = 600}) --elements with no 'data.stay' field will stay during 30s (600/20) +``` \ No newline at end of file diff --git a/mods/HUD/mcl_title/init.lua b/mods/HUD/mcl_title/init.lua index 03fe17614..d1dbece4b 100644 --- a/mods/HUD/mcl_title/init.lua +++ b/mods/HUD/mcl_title/init.lua @@ -134,7 +134,7 @@ function mcl_title.set(player, type, data) player:hud_change(huds_idx[type][player], "text", data.text) player:hud_change(huds_idx[type][player], "number", hex_color) - hud_hide_timeouts[type][player:get_player_name()] = data.stay or mcl_title.params_get(player).stay + hud_hide_timeouts[type][player:get_player_name()] = gametick_to_secondes(data.stay) or mcl_title.params_get(player).stay return true end diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index f323ca4c7..e196f69ad 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -330,7 +330,7 @@ function mcl_beds.on_rightclick(pos, player, is_top) message = select(2, lay_down(player, ppos, other)) end if message then - mcl_title.set(player, "actionbar", {text=message, color="white", stay=3}) + mcl_title.set(player, "actionbar", {text=message, color="white", stay=60}) end else lay_down(player, nil, nil, false) From 75b425ffd77b85ba3081ddf2e47f8b6695ec8fa5 Mon Sep 17 00:00:00 2001 From: NO11 Date: Fri, 23 Jul 2021 12:23:30 +0000 Subject: [PATCH 022/228] Fix #1842 make other mods not using "mineclone" name space for item ids --- mods/HELP/mcl_item_id/init.lua | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/mods/HELP/mcl_item_id/init.lua b/mods/HELP/mcl_item_id/init.lua index 3b3128f26..50247a858 100644 --- a/mods/HELP/mcl_item_id/init.lua +++ b/mods/HELP/mcl_item_id/init.lua @@ -1,4 +1,5 @@ local game = "mineclone" +local mcl_mods = {} local same_id = { heads = { "skeleton", "zombie", "creeper", "wither_skeleton" }, @@ -10,17 +11,34 @@ local same_id = { "stonebrick", "stonebrickmossy", }, wool = { - "black", "blue", "brown", "cyan", "green", + "black", "blue", "brown", "cyan", "green", "grey", "light_blue", "lime", "magenta", "orange", "pink", "purple", "red", "silver", "white", "yellow", }, } +local worldmt = io.open(minetest.get_worldpath() .. "/world.mt", "r") +local gameid = worldmt:read("*a"):match("gameid%s*=%s*(%S+)\n") +worldmt:close() + +for _, mod in pairs(minetest.get_modnames()) do + if minetest.get_modpath(mod):match("/games/" .. gameid .. "/") then + table.insert(mcl_mods, mod) + end +end + +local function item_id(id) + if minetest.settings:get_bool("mcl_item_id_debug", false) then + return id, "#555555" + end +end + tt.register_snippet(function(itemstring) local def = minetest.registered_items[itemstring] local desc = def.description local item_split = itemstring:find(":") local new_id = game .. itemstring:sub(item_split) + local mcl_mod = itemstring:sub(1, item_split) for mod, ids in pairs(same_id) do for _, id in pairs(ids) do if itemstring == "mcl_" .. mod .. ":" .. id then @@ -28,12 +46,15 @@ tt.register_snippet(function(itemstring) end end end - if new_id ~= game .. ":book_enchanted" then - minetest.register_alias_force(new_id, itemstring) - end - if minetest.settings:get_bool("mcl_item_id_debug", false) then - return new_id, "#555555" + for _, modname in pairs(mcl_mods) do + if modname .. ":" == mcl_mod then + if new_id ~= game .. ":book_enchanted" and new_id ~= itemstring then + minetest.register_alias_force(new_id, itemstring) + end + return item_id(new_id) + end end + return item_id(itemstring) end) minetest.register_alias_force(game .. ":book_enchanted", "mcl_enchanting:book_enchanted") From 09a68443cd641ed73631cc076916616e518402ea Mon Sep 17 00:00:00 2001 From: NO11 Date: Fri, 23 Jul 2021 16:12:43 +0000 Subject: [PATCH 023/228] Better fix for #1842 (make other mods not using "mineclone" name space for item ids) --- mods/HELP/mcl_item_id/init.lua | 57 ++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/mods/HELP/mcl_item_id/init.lua b/mods/HELP/mcl_item_id/init.lua index 50247a858..4e9c7c9f1 100644 --- a/mods/HELP/mcl_item_id/init.lua +++ b/mods/HELP/mcl_item_id/init.lua @@ -1,5 +1,20 @@ +mcl_item_id = {} + local game = "mineclone" -local mcl_mods = {} + +function mcl_item_id.set_mod_namespace(modname, namespace) + local namespace = namespace or modname + mcl_item_id[modname .. "_namespace"] = namespace +end + +function mcl_item_id.get_mod_namespace(modname) + local namespace = mcl_item_id[modname .. "_namespace"] + if namespace then + return namespace + else + return "" + end +end local same_id = { heads = { "skeleton", "zombie", "creeper", "wither_skeleton" }, @@ -17,28 +32,15 @@ local same_id = { }, } -local worldmt = io.open(minetest.get_worldpath() .. "/world.mt", "r") -local gameid = worldmt:read("*a"):match("gameid%s*=%s*(%S+)\n") -worldmt:close() - -for _, mod in pairs(minetest.get_modnames()) do - if minetest.get_modpath(mod):match("/games/" .. gameid .. "/") then - table.insert(mcl_mods, mod) - end -end - -local function item_id(id) - if minetest.settings:get_bool("mcl_item_id_debug", false) then - return id, "#555555" - end -end - tt.register_snippet(function(itemstring) local def = minetest.registered_items[itemstring] local desc = def.description local item_split = itemstring:find(":") - local new_id = game .. itemstring:sub(item_split) - local mcl_mod = itemstring:sub(1, item_split) + local id_part1 = itemstring:sub(1, item_split) + local id_part2 = itemstring:sub(item_split) + local modname = id_part1:gsub("%:", "") + local new_id = game .. id_part2 + local mod_namespace = mcl_item_id.get_mod_namespace(modname) for mod, ids in pairs(same_id) do for _, id in pairs(ids) do if itemstring == "mcl_" .. mod .. ":" .. id then @@ -46,15 +48,16 @@ tt.register_snippet(function(itemstring) end end end - for _, modname in pairs(mcl_mods) do - if modname .. ":" == mcl_mod then - if new_id ~= game .. ":book_enchanted" and new_id ~= itemstring then - minetest.register_alias_force(new_id, itemstring) - end - return item_id(new_id) - end + + if mod_namespace then + new_id = mod_namespace .. id_part2 + end + if new_id ~= game .. ":book_enchanted" then + minetest.register_alias_force(new_id, itemstring) + end + if minetest.settings:get_bool("mcl_item_id_debug", false) then + return new_id, "#555555" end - return item_id(itemstring) end) minetest.register_alias_force(game .. ":book_enchanted", "mcl_enchanting:book_enchanted") From e44e9eaf623809bc2fa4c617dd6e9629aa5b3879 Mon Sep 17 00:00:00 2001 From: NO11 Date: Fri, 23 Jul 2021 21:35:10 +0000 Subject: [PATCH 024/228] Fix typo --- mods/HELP/mcl_item_id/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/HELP/mcl_item_id/init.lua b/mods/HELP/mcl_item_id/init.lua index 4e9c7c9f1..911d8225b 100644 --- a/mods/HELP/mcl_item_id/init.lua +++ b/mods/HELP/mcl_item_id/init.lua @@ -12,7 +12,7 @@ function mcl_item_id.get_mod_namespace(modname) if namespace then return namespace else - return "" + return end end From c05e57efb1f3d55c89354c28a84e76abe63aadd5 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sat, 24 Jul 2021 14:09:47 +0000 Subject: [PATCH 025/228] Fix some crashes with set_mod_namespace and bugs --- mods/HELP/mcl_item_id/init.lua | 46 +++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/mods/HELP/mcl_item_id/init.lua b/mods/HELP/mcl_item_id/init.lua index 911d8225b..9a2f926e8 100644 --- a/mods/HELP/mcl_item_id/init.lua +++ b/mods/HELP/mcl_item_id/init.lua @@ -1,22 +1,38 @@ -mcl_item_id = {} +mcl_item_id = { + mod_namespaces = {}, +} local game = "mineclone" function mcl_item_id.set_mod_namespace(modname, namespace) local namespace = namespace or modname - mcl_item_id[modname .. "_namespace"] = namespace + mcl_item_id.mod_namespaces[modname] = namespace + minetest.register_on_mods_loaded(function() + for item, def in pairs(minetest.registered_items) do + local item_split = item:find(":") + if item_split then + local id_modname = item:sub(1, item_split - 1) + local id_string = item:sub(item_split) + if id_modname == modname then + minetest.register_alias_force(namespace .. id_string, item) + end + end + end + end) end function mcl_item_id.get_mod_namespace(modname) - local namespace = mcl_item_id[modname .. "_namespace"] + local namespace = mcl_item_id.mod_namespaces[modname] if namespace then return namespace else - return + return game end end local same_id = { + enchanting = { "table" }, + experience = { "bottle" }, heads = { "skeleton", "zombie", "creeper", "wither_skeleton" }, mobitems = { "rabbit", "chicken" }, walls = { @@ -34,13 +50,11 @@ local same_id = { tt.register_snippet(function(itemstring) local def = minetest.registered_items[itemstring] - local desc = def.description local item_split = itemstring:find(":") - local id_part1 = itemstring:sub(1, item_split) - local id_part2 = itemstring:sub(item_split) - local modname = id_part1:gsub("%:", "") - local new_id = game .. id_part2 - local mod_namespace = mcl_item_id.get_mod_namespace(modname) + local id_string = itemstring:sub(item_split) + local id_modname = itemstring:sub(1, item_split - 1) + local new_id = game .. id_string + local mod_namespace = mcl_item_id.get_mod_namespace(id_modname) for mod, ids in pairs(same_id) do for _, id in pairs(ids) do if itemstring == "mcl_" .. mod .. ":" .. id then @@ -48,16 +62,12 @@ tt.register_snippet(function(itemstring) end end end - - if mod_namespace then - new_id = mod_namespace .. id_part2 - end - if new_id ~= game .. ":book_enchanted" then + if mod_namespace ~= game then + new_id = mod_namespace .. id_string + else minetest.register_alias_force(new_id, itemstring) end if minetest.settings:get_bool("mcl_item_id_debug", false) then return new_id, "#555555" end -end) - -minetest.register_alias_force(game .. ":book_enchanted", "mcl_enchanting:book_enchanted") +end) \ No newline at end of file From 65d33b935ab23e6a43b069c62124d51ead05c165 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sat, 24 Jul 2021 14:45:55 +0000 Subject: [PATCH 026/228] Add API-md for `mcl_item_id` --- mods/HELP/mcl_item_id/API.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 mods/HELP/mcl_item_id/API.md diff --git a/mods/HELP/mcl_item_id/API.md b/mods/HELP/mcl_item_id/API.md new file mode 100644 index 000000000..a2f244e0c --- /dev/null +++ b/mods/HELP/mcl_item_id/API.md @@ -0,0 +1,24 @@ +# mcl_item_id +Show the item ID of an item in the description. +With this API, you can register a different name space than "mineclone" for your mod. + +## mcl_item_id.set_mod_namespace(modname, namespace) +Set a name space for all items in a mod. + +* param1: the modname +* param2: (optional) string of the desired name space, if nil, it is the name of the mod + +## mcl_item_id.get_mod_namespace(modname) +Get the name space of a mod registered with mcl_item_id.set_mod_namespace(modname, namespace). + +* param1: the modname + +### Examples: + +The name of the mod is "mod" which registered an item called "mod:itemname". + +* mcl_item_id.set_mod_namespace("mod", "mymod") will show "mymod:itemname" in the description of "mod:itemname" +* mcl_item_id.set_mod_namespace(minetest.get_current_modname()) will show "mod:itemname" in the description of "mod:itemname" +* mcl_item_id.get_mod_namespace(minetest.get_current_modname()) will return "mod" + +(If no namespace is set by a mod, mcl_item_id.get_mod_namespace(minetest.get_current_modname()) will return "mineclone") From 5c5c405ccf92762af6f0757d4a3b015ff14d0d37 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sat, 24 Jul 2021 15:19:10 +0000 Subject: [PATCH 027/228] Add missing check --- mods/HELP/mcl_item_id/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/HELP/mcl_item_id/init.lua b/mods/HELP/mcl_item_id/init.lua index 9a2f926e8..e6df1af03 100644 --- a/mods/HELP/mcl_item_id/init.lua +++ b/mods/HELP/mcl_item_id/init.lua @@ -13,7 +13,7 @@ function mcl_item_id.set_mod_namespace(modname, namespace) if item_split then local id_modname = item:sub(1, item_split - 1) local id_string = item:sub(item_split) - if id_modname == modname then + if id_modname == modname and modname ~= namespace then minetest.register_alias_force(namespace .. id_string, item) end end From 4846076c8fc2555dff12bf148c5b1d83ab39ec9d Mon Sep 17 00:00:00 2001 From: NO11 Date: Sat, 24 Jul 2021 19:07:44 +0000 Subject: [PATCH 028/228] `mcl_item_id` simplify code --- mods/HELP/mcl_item_id/init.lua | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/mods/HELP/mcl_item_id/init.lua b/mods/HELP/mcl_item_id/init.lua index e6df1af03..f3e6d2735 100644 --- a/mods/HELP/mcl_item_id/init.lua +++ b/mods/HELP/mcl_item_id/init.lua @@ -7,18 +7,6 @@ local game = "mineclone" function mcl_item_id.set_mod_namespace(modname, namespace) local namespace = namespace or modname mcl_item_id.mod_namespaces[modname] = namespace - minetest.register_on_mods_loaded(function() - for item, def in pairs(minetest.registered_items) do - local item_split = item:find(":") - if item_split then - local id_modname = item:sub(1, item_split - 1) - local id_string = item:sub(item_split) - if id_modname == modname and modname ~= namespace then - minetest.register_alias_force(namespace .. id_string, item) - end - end - end - end) end function mcl_item_id.get_mod_namespace(modname) @@ -64,7 +52,8 @@ tt.register_snippet(function(itemstring) end if mod_namespace ~= game then new_id = mod_namespace .. id_string - else + end + if mod_namespace ~= id_modname then minetest.register_alias_force(new_id, itemstring) end if minetest.settings:get_bool("mcl_item_id_debug", false) then From b4b33cb4a547634b3c46e70e74e0e9c8b7a8c831 Mon Sep 17 00:00:00 2001 From: Emojigit <55009343+Emojigit@users.noreply.github.com> Date: Tue, 27 Jul 2021 19:26:25 +0800 Subject: [PATCH 029/228] [mcl_nether_gold] Kick it. Bye mcl_nether_gold! --- mods/ITEMS/mcl_nether_gold/LICENSE | 674 ------------------ mods/ITEMS/mcl_nether_gold/README.md | 3 - mods/ITEMS/mcl_nether_gold/depends.txt | 3 - mods/ITEMS/mcl_nether_gold/description.txt | 1 - mods/ITEMS/mcl_nether_gold/init.lua | 53 -- mods/ITEMS/mcl_nether_gold/mod.conf | 1 - mods/ITEMS/mcl_nether_gold/screenshot.png | Bin 595157 -> 0 bytes .../textures/mcl_nether_gold_ore.png | Bin 2340 -> 0 bytes 8 files changed, 735 deletions(-) delete mode 100644 mods/ITEMS/mcl_nether_gold/LICENSE delete mode 100644 mods/ITEMS/mcl_nether_gold/README.md delete mode 100644 mods/ITEMS/mcl_nether_gold/depends.txt delete mode 100644 mods/ITEMS/mcl_nether_gold/description.txt delete mode 100644 mods/ITEMS/mcl_nether_gold/init.lua delete mode 100644 mods/ITEMS/mcl_nether_gold/mod.conf delete mode 100644 mods/ITEMS/mcl_nether_gold/screenshot.png delete mode 100644 mods/ITEMS/mcl_nether_gold/textures/mcl_nether_gold_ore.png diff --git a/mods/ITEMS/mcl_nether_gold/LICENSE b/mods/ITEMS/mcl_nether_gold/LICENSE deleted file mode 100644 index e72bfddab..000000000 --- a/mods/ITEMS/mcl_nether_gold/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/mods/ITEMS/mcl_nether_gold/README.md b/mods/ITEMS/mcl_nether_gold/README.md deleted file mode 100644 index 928816fa0..000000000 --- a/mods/ITEMS/mcl_nether_gold/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# mcl_nether_gold -### by NO11 -You need the Minetest subgame "Mineclone 2" to use the mod. \ No newline at end of file diff --git a/mods/ITEMS/mcl_nether_gold/depends.txt b/mods/ITEMS/mcl_nether_gold/depends.txt deleted file mode 100644 index e504fcdd8..000000000 --- a/mods/ITEMS/mcl_nether_gold/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -mcl_core -mcl_sounds -mcl_nether \ No newline at end of file diff --git a/mods/ITEMS/mcl_nether_gold/description.txt b/mods/ITEMS/mcl_nether_gold/description.txt deleted file mode 100644 index e63ef43c4..000000000 --- a/mods/ITEMS/mcl_nether_gold/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds Nether Gold Ore \ No newline at end of file diff --git a/mods/ITEMS/mcl_nether_gold/init.lua b/mods/ITEMS/mcl_nether_gold/init.lua deleted file mode 100644 index c86f46211..000000000 --- a/mods/ITEMS/mcl_nether_gold/init.lua +++ /dev/null @@ -1,53 +0,0 @@ -minetest.register_node("mcl_nether_gold:nether_gold_ore", { - description = ("Nether Gold Ore"), - _doc_items_longdesc = ("Nether gold ore is an ore containing nether gold. It is commonly found around netherrack in the Nether."), - stack_max = 64, - tiles = {"mcl_nether_netherrack.png^mcl_nether_gold_ore.png"}, - is_ground_content = true, - groups = {pickaxey=1, building_block=1, material_stone=1, xp=0}, - drop = { - max_items = 1, - items = { - {items = {'mcl_core:gold_nugget 6'},rarity = 5}, - {items = {'mcl_core:gold_nugget 5'},rarity = 5}, - {items = {'mcl_core:gold_nugget 4'},rarity = 5}, - {items = {'mcl_core:gold_nugget 3'},rarity = 5}, - {items = {'mcl_core:gold_nugget 2'}}, - } - }, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 3, - _mcl_hardness = 3, - _mcl_silk_touch_drop = true, - _mcl_fortune_drop = mcl_core.fortune_drop_ore -}) - -minetest.register_craft({ - type = "cooking", - output = 'mcl_core:gold_ingot', - recipe = 'mcl_nether_gold:nether_gold_ore', - cooktime = 10, -}) - -if minetest.settings:get_bool("mcl_generate_ores", true) then - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_nether_gold:nether_gold_ore", - wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, - clust_scarcity = 850, - clust_num_ores = 4, -- MC cluster amount: 4-10 - clust_size = 3, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_nether_gold:nether_gold_ore", - wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, - clust_scarcity = 1650, - clust_num_ores = 8, -- MC cluster amount: 4-10 - clust_size = 4, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) -end \ No newline at end of file diff --git a/mods/ITEMS/mcl_nether_gold/mod.conf b/mods/ITEMS/mcl_nether_gold/mod.conf deleted file mode 100644 index 8ee4241e8..000000000 --- a/mods/ITEMS/mcl_nether_gold/mod.conf +++ /dev/null @@ -1 +0,0 @@ -name = mcl_nether_gold \ No newline at end of file diff --git a/mods/ITEMS/mcl_nether_gold/screenshot.png b/mods/ITEMS/mcl_nether_gold/screenshot.png deleted file mode 100644 index ee9cac199ba477927a5d2d25e79a2c2c7d1aee9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 595157 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%0D}?Y&G(yT9c0 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

|l7wlKgZ5kE6156e#7?xM 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 z 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 Vgech;cAVh&n3 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�yS*+`z_Wr@{E6H=vmI{rj0-=)=he{Z^7m!o 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 z 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�-H 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 diff --git a/mods/ITEMS/mcl_nether_gold/textures/mcl_nether_gold_ore.png b/mods/ITEMS/mcl_nether_gold/textures/mcl_nether_gold_ore.png deleted file mode 100644 index 9b621e586be904498caae1df3e8f6245cb7a829b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2340 zcmV+<3ETFGP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bvvcx6~{O1%o0wA#+hqWp<$nnz{fj!H6m83GR z88DWG=x!uN^}qfc>JNOZ4PLPe(I@XUKAbq&j84?+vs$D1`js2KJ1^tvJg^udw6t!0 z7yFEHcfSx=#>?xt3RV0>akM>)Lz**Nbi^)-BeHAU$h}JPUgpPgH z7|p>SS!FvJ()f*Y7Mfo}87<-0QiPEqzWQ^7DSXFHo$ecWr}u`P&N5D~P$=!iz`tQ6 zq@vH zmRP}91Dgd`RVEn=w1;8SOg6*xtF5LYM7G@qwANN|FvlVVn{1^;0WLFaphQhk1RoWw z5r*xF#a#2IYrbkCW^M+S*1(y;8y}bYHuztz<7kX2U1M}SSRpPuHH|PPbMqHgAjAy8 z)Lr;qmwM<%KZqqT=q{Ke7MOKeE{Zd^w&>!SVCOU|y|#u4O&kCs%*7BFC(v(2ahZiqa{!EV6Zcqf?4);ha}ky=26BToU;B+4L**+D;n zBQ%s9Iaba&?}Cdix$Mcaci#KpXO7B&0tXj-2qA_Pa-_)7MIS?qF~yv0BBU^vd$sA2mz--2qfrIx$tkW%OF zy6>UKo_Ze8+MvP14L`z&BaM7m6INeYGjGiO&YBU{CS!crg_|`Dhp=6knNHl~42)Se zU_49)AZR-|)6p>7$=u{jr%8rX2q(-t14zsY%`c z!JL}Z33H#kePONTtD?|F(Ar$6Ir2nN1%_)xKGnJ`hJ#Idv975wO zqEOQli|AGyO~R~}03$^z`Kb@<~d!gmSm>yEsdnGybmc$ZA0lWJgXj6G8 zRnkK--9yyYNQrO8$D)Ztgqb%2IM)0U?-gz*0S>S=&k{VFnvWVGM)g!-ksUy$eZj-$ z6>2;*+%`<=_W#o^_}C4P&2YEsnF?km=pwMr)U3WB1rS))>L^bX}Y*-zf;<^&yBH!Qi%SK@og<3^}9)T_ZCfYAaG_{@BkUgE` z?H(#ltQ^-}oi&51k?0DRS~k8}cXu%IePPr+3ejg~t@XrUxJf{XA0=Y9!z(M1FxS{5 z5MYuByG|YrXyU*k9URDBfl?DGmi*VW6IUtra^k*eyXEvG`7%_n{3L<0Ii-%{$g+fC z>j1LdXVIMlnWA!aud}B$U&2{DCD{&G?Krh0ehb*{4B6({erw6w1AgsQHba7tViUk( z)KBgAB5x?j_&NVO9sjgkYPDk-ETs&Gair|-#HyiI<)>n=B8QC?KX4jtrW+4z4mpdfn`$cO7dxlcnffJ6Pn-{`z0nYbX0>?HkTR)5)J_ln*FS8qZ*siM|L zdVFxv%F$$cY?-XQ90zd3OnX}(T(g%E`!2WE{8}J4ST9(eZF)wGn58?ujxBj)n$;I3 zJ{b8v$!iK%JBQ<6=0Ks>>TlQyOu)z}AZY*q00v@9M??U^0Bisb%;O)200009a7bBm z001r{001r{0eGc9b^rhX2XskIMF-^r91IsPaC-910007WNkl$)H=WTKk_D%9}C3tGIOymO3d)rcJ^6 zcs9r9cOMc|GnJ-1xV@}PoixylC=>~)x*$(hcY2&Nl*&K71pC*V3)=#XvWg@ec z=kt2@^dN&KM4n6zCoc3=lE$_wTPC6~dq4M+ahSfgEqRmSul*q%Cq)-Pw|^B6q#Z(ps~ks3CT)}Hx2kf4 Date: Wed, 28 Jul 2021 20:11:37 +0400 Subject: [PATCH 030/228] Add Nether Gold compatibility alias --- mods/ITEMS/mcl_blackstone/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ITEMS/mcl_blackstone/init.lua b/mods/ITEMS/mcl_blackstone/init.lua index badcf99e4..510726dda 100644 --- a/mods/ITEMS/mcl_blackstone/init.lua +++ b/mods/ITEMS/mcl_blackstone/init.lua @@ -96,6 +96,8 @@ minetest.register_node("mcl_blackstone:nether_gold", { _mcl_silk_touch_drop = true, _mcl_fortune_drop = mcl_core.fortune_drop_ore, }) +-- Compatibility with Nether Gold mod by NO11: +minetest.register_alias("mcl_nether_gold:nether_gold_ore", "mcl_blackstone:nether_gold") minetest.register_node("mcl_blackstone:basalt_polished", { description = S("Polished Basalt"), From 4aabd7d9e721a860864157ac5145985d8a2360b9 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sun, 1 Aug 2021 12:10:00 +0000 Subject: [PATCH 031/228] Make size/position of potion HUD more MC like --- mods/ITEMS/mcl_potions/functions.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua index 09b95115a..c3b034b66 100644 --- a/mods/ITEMS/mcl_potions/functions.lua +++ b/mods/ITEMS/mcl_potions/functions.lua @@ -35,13 +35,13 @@ local function potions_init_icons(player) local name = player:get_player_name() icon_ids[name] = {} for e=1, EFFECT_TYPES do - local x = -7 + -38 * e + local x = -52 * e - 2 local id = player:hud_add({ hud_elem_type = "image", text = "blank.png", position = { x = 1, y = 0 }, - offset = { x = x, y = 272 }, - scale = { x = 2, y = 2 }, + offset = { x = x, y = 3 }, + scale = { x = 3, y = 3 }, alignment = { x = 1, y = 1 }, z_index = 100, }) From 5c563d6ffd16ba6d64691fff5e0356b85eb4fe80 Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 2 Aug 2021 12:24:34 +0000 Subject: [PATCH 032/228] Make eating particles much more MC like! --- mods/PLAYER/mcl_hunger/hunger.lua | 32 ++++++++++++------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/mods/PLAYER/mcl_hunger/hunger.lua b/mods/PLAYER/mcl_hunger/hunger.lua index 5dec8b1b0..d9a6fd5fe 100644 --- a/mods/PLAYER/mcl_hunger/hunger.lua +++ b/mods/PLAYER/mcl_hunger/hunger.lua @@ -152,26 +152,18 @@ function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poiso -- If false, force item to not spawn any food partiles when eaten if def._food_particles ~= false and texture and texture ~= "" then local v = user:get_velocity() or user:get_player_velocity() - local minvel = vector.add(v, {x=-1, y=1, z=-1}) - local maxvel = vector.add(v, {x=1, y=2, z=1}) - - minetest.add_particlespawner({ - amount = math.min(math.max(8, hunger_change*2), 25), - time = 0.1, - minpos = {x=pos.x, y=pos.y, z=pos.z}, - maxpos = {x=pos.x, y=pos.y, z=pos.z}, - minvel = minvel, - maxvel = maxvel, - minacc = {x=0, y=-5, z=0}, - maxacc = {x=0, y=-9, z=0}, - minexptime = 1, - maxexptime = 1, - minsize = 1, - maxsize = 2, - collisiondetection = true, - vertical = false, - texture = texture, - }) + for i = 0, math.min(math.max(8, hunger_change*2), 25) do + minetest.add_particle({ + pos = { x = pos.x, y = pos.y, z = pos.z }, + velocity = vector.add(v, { x = math.random(-1, 1), y = math.random(1, 2), z = math.random(-1, 1) }), + acceleration = { x = 0, y = math.random(-9, -5), z = 0 }, + expirationtime = 1, + size = math.random(1, 2), + collisiondetection = true, + vertical = false, + texture = "[combine:3x3:" .. -i .. "," .. -i .. "=" .. texture, + }) + end end minetest.sound_play("mcl_hunger_bite", { max_hear_distance = 12, From df0c1f1dd1e32dc74a1b9e9a767037c517cdf071 Mon Sep 17 00:00:00 2001 From: Emily Date: Fri, 6 Aug 2021 11:14:17 +0200 Subject: [PATCH 033/228] Make bows and fishing rods show their durability in description (Fixes issue #1773) --- mods/HELP/mcl_tt/snippets_mcl.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mods/HELP/mcl_tt/snippets_mcl.lua b/mods/HELP/mcl_tt/snippets_mcl.lua index 3c79f52e8..121d8ed70 100644 --- a/mods/HELP/mcl_tt/snippets_mcl.lua +++ b/mods/HELP/mcl_tt/snippets_mcl.lua @@ -107,3 +107,8 @@ tt.register_snippet(function(itemstring) end end) +tt.register_snippet(function(itemstring, _, itemstack) + if itemstring:sub(1, 23) == "mcl_fishing:fishing_rod" or itemstring:sub(1, 12) == "mcl_bows:bow" then + return S("Durability: @1 uses", mcl_util.calculate_durability(itemstack or ItemStack(itemstring))) + end +end) From 5bb57a81ad46c163b58da046920b8a4bee18b30b Mon Sep 17 00:00:00 2001 From: Emily Date: Fri, 6 Aug 2021 11:55:27 +0200 Subject: [PATCH 034/228] Add durability tooltip to translation template --- mods/HELP/mcl_tt/locale/template.txt | 1 + mods/HELP/mcl_tt/snippets_mcl.lua | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/HELP/mcl_tt/locale/template.txt b/mods/HELP/mcl_tt/locale/template.txt index 1259216c7..6fb735b13 100644 --- a/mods/HELP/mcl_tt/locale/template.txt +++ b/mods/HELP/mcl_tt/locale/template.txt @@ -45,3 +45,4 @@ Mining durability: @1= Block breaking strength: @1= @1 uses= Unlimited uses= +Durability: @1= diff --git a/mods/HELP/mcl_tt/snippets_mcl.lua b/mods/HELP/mcl_tt/snippets_mcl.lua index 121d8ed70..825776f5f 100644 --- a/mods/HELP/mcl_tt/snippets_mcl.lua +++ b/mods/HELP/mcl_tt/snippets_mcl.lua @@ -109,6 +109,6 @@ end) tt.register_snippet(function(itemstring, _, itemstack) if itemstring:sub(1, 23) == "mcl_fishing:fishing_rod" or itemstring:sub(1, 12) == "mcl_bows:bow" then - return S("Durability: @1 uses", mcl_util.calculate_durability(itemstack or ItemStack(itemstring))) + return S("Durability: @1", S("@1 uses", mcl_util.calculate_durability(itemstack or ItemStack(itemstring)))) end end) From 664c2381374ee25f423d2b0d0eb66b838257eca6 Mon Sep 17 00:00:00 2001 From: NO11 Date: Fri, 6 Aug 2021 10:52:55 +0000 Subject: [PATCH 035/228] Add german translation for the bow/fishing rod desc --- mods/HELP/mcl_tt/locale/mcl_tt.de.tr | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/HELP/mcl_tt/locale/mcl_tt.de.tr b/mods/HELP/mcl_tt/locale/mcl_tt.de.tr index 8f878afc7..54c376c3b 100644 --- a/mods/HELP/mcl_tt/locale/mcl_tt.de.tr +++ b/mods/HELP/mcl_tt/locale/mcl_tt.de.tr @@ -45,3 +45,4 @@ Mining durability: @1=Grabehaltbarkeit: @1 Block breaking strength: @1=Blockbruchstärke: @1 @1 uses=@1 Verwendungen Unlimited uses=Unbegrenzte Verwendungen +Durability: @1=Haltbarkeit: @1 From f8dcf056707c917f2b77aead6669ee0d05905c86 Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 11 Aug 2021 15:41:45 +0000 Subject: [PATCH 036/228] Add MC like nodebox for anvils --- mods/ITEMS/mcl_anvils/init.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index fbf6fb751..51b78da6f 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -297,9 +297,10 @@ local anvildef = { node_box = { type = "fixed", fixed = { - {-8/16, 2/16, -5/16, 8/16, 8/16, 5/16}, -- top - {-5/16, -4/16, -2/16, 5/16, 5/16, 2/16}, -- middle - {-8/16, -8/16, -5/16, 8/16, -4/16, 5/16}, -- base + { -6/16, -8/16, -6/16, 6/16, -4/16, 6/16 }, + { -5/16, -4/16, -4/16, 5/16, -3/16, 4/16 }, + { -4/16, -3/16, -2/16, 4/16, 2/16, 2/16 }, + { -8/16, 2/16, -5/16, 8/16, 8/16, 5/16 }, } }, sounds = mcl_sounds.node_sound_metal_defaults(), From cb55c36863b429a8328c98bc478d525d081727ca Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 11 Aug 2021 15:44:43 +0000 Subject: [PATCH 037/228] Correct the texture of anvils Because of the new node_nox, the textures have to be a little bit bigger. --- .../mcl_anvils_anvil_top_damaged_0.png | Bin 195 -> 6074 bytes .../mcl_anvils_anvil_top_damaged_1.png | Bin 209 -> 5855 bytes .../mcl_anvils_anvil_top_damaged_2.png | Bin 220 -> 5882 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/ITEMS/mcl_anvils/textures/mcl_anvils_anvil_top_damaged_0.png b/mods/ITEMS/mcl_anvils/textures/mcl_anvils_anvil_top_damaged_0.png index 84c64e9159abbd2703d701a32211caa4cc9b8418..43938aa7265afa58d0394ae683e7815a6159dc40 100644 GIT binary patch literal 6074 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 PuQ;wB&v&o)+~j`)mnpRX delta 163 zcmV;U09^myEztpxBL)B%P)t-slm8VMe;sF9xBvhE0d!JMQvg8b*k%9#0B1==K~#7F z9m~ND0zn8yVRmd_SutKmw*g}ZBrp|#Q-K{g{Tu$8}E3 za0gU)FPMq~VeUxoV_~1)8Mu6f0uhP5d4|=ssf}NuvD_28@-6qm<9r^S{_@Ka5oW~6 RhyMTo002ovPDHLkV1mc^K{fyY diff --git a/mods/ITEMS/mcl_anvils/textures/mcl_anvils_anvil_top_damaged_2.png b/mods/ITEMS/mcl_anvils/textures/mcl_anvils_anvil_top_damaged_2.png index 5f5cfbffa6f0ebd6c1fa06ad201cb312ca6875e0..096f65eac2203e52431aebcd73c473f68a690441 100644 GIT binary patch literal 5882 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 XpT)8tEoFEQw41@x)z4*}Q$iB}no2*M From fe62189019f0ec704396d797d223706eb8b111eb Mon Sep 17 00:00:00 2001 From: AFCMS Date: Fri, 13 Aug 2021 11:35:18 +0200 Subject: [PATCH 038/228] Update French translation (part 1) --- mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr | 5 +++-- .../mcl_minecarts/locale/mcl_minecarts.fr.tr | 1 + mods/ENTITIES/mobs_mc/locale/template.txt | 1 + mods/HELP/doc/doc_items/locale/doc_items.fr.tr | 2 +- mods/HUD/mcl_credits/locale/mcl_credits.de.tr | 1 + mods/HUD/mcl_credits/locale/mcl_credits.es.tr | 14 ++++++++++++++ mods/HUD/mcl_credits/locale/mcl_credits.fr.tr | 14 ++++++++++++++ mods/HUD/mcl_credits/locale/mcl_credits.pl.tr | 14 ++++++++++++++ mods/HUD/mcl_credits/locale/mcl_credits.ru.tr | 14 ++++++++++++++ mods/ITEMS/mcl_chests/init.lua | 2 +- mods/ITEMS/mcl_chests/locale/template.txt | 2 +- .../ITEMS/mcl_fireworks/locale/mcl_fireworks.es.tr | 3 +++ .../ITEMS/mcl_fireworks/locale/mcl_fireworks.fr.tr | 3 +++ .../ITEMS/mcl_fireworks/locale/mcl_fireworks.ru.tr | 3 +++ mods/ITEMS/mcl_maps/locale/mcl_maps.fr.tr | 5 ++++- 15 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 mods/HUD/mcl_credits/locale/mcl_credits.es.tr create mode 100644 mods/HUD/mcl_credits/locale/mcl_credits.fr.tr create mode 100644 mods/HUD/mcl_credits/locale/mcl_credits.pl.tr create mode 100644 mods/HUD/mcl_credits/locale/mcl_credits.ru.tr create mode 100644 mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.es.tr create mode 100644 mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.fr.tr create mode 100644 mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.ru.tr diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr index 04d6d9da9..785d50146 100644 --- a/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr @@ -6,6 +6,7 @@ Boats are used to travel on the surface of water.=Les bateaux sont utilisés pou Dark Oak Boat=Bateau en Chêne Noir Jungle Boat=Bateau en Acajou Oak Boat=Bateau en Chêne -Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Rightclick the boat again to leave it, punch the boat to make it drop as an item.=Faites un clic droit sur une source d'eau pour placer le bateau. Faites un clic droit sur le bateau pour y entrer. Utilisez [Gauche] et [Droite] pour diriger, [Avant] pour accélérer et [Arrière] pour ralentir ou reculer. Cliquez de nouveau avec le bouton droit sur le bateau pour le quitter, frappez le bateau pour le faire tomber en tant qu'objet. +Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Use [Sneak] to leave the boat, punch the boat to make it drop as an item.=Faites un clic droit sur une source d'eau pour placer le bateau. Faites un clic droit sur le bateau pour y entrer. Utilisez [Gauche] et [Droite] pour diriger, [Avant] pour accélérer et [Arrière] pour ralentir ou reculer. Utilisez [Sneak] pour le quitter, frappez le bateau pour le faire tomber en tant qu'objet. Spruce Boat=Bateau en Sapin -Water vehicle=Véhicule aquatique \ No newline at end of file +Water vehicle=Véhicule aquatique +Sneak to dismount= \ No newline at end of file diff --git a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr index 39cdfd013..67ed5eb1b 100644 --- a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr +++ b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr @@ -33,3 +33,4 @@ Activates minecarts when powered=Active les wagonnets lorsqu'il est alimenté Emits redstone power when a minecart is detected=Émet de l'énergie redstone lorsqu'un wagonnet est détecté Vehicle for fast travel on rails=Véhicule pour voyager rapidement sur rails Can be ignited by tools or powered activator rail=Peut être allumé par des outils ou un rail d'activation motorisé +Sneak to dismount= \ No newline at end of file diff --git a/mods/ENTITIES/mobs_mc/locale/template.txt b/mods/ENTITIES/mobs_mc/locale/template.txt index 04ba9e465..7b55c1b89 100644 --- a/mods/ENTITIES/mobs_mc/locale/template.txt +++ b/mods/ENTITIES/mobs_mc/locale/template.txt @@ -28,6 +28,7 @@ Pig= Polar Bear= Rabbit= Killer Bunny= +The Killer Bunny= Sheep= Shulker= Silverfish= diff --git a/mods/HELP/doc/doc_items/locale/doc_items.fr.tr b/mods/HELP/doc/doc_items/locale/doc_items.fr.tr index 5d655404d..824ceeeba 100644 --- a/mods/HELP/doc/doc_items/locale/doc_items.fr.tr +++ b/mods/HELP/doc/doc_items/locale/doc_items.fr.tr @@ -2,7 +2,7 @@ Using it as fuel turns it into: @1.=L'utiliser comme combustible le transforme en : @1. @1 seconds=@1 secondes # Item count times item name -%@1×@2=%@1×@ +@1×@2=@1×@ # Itemname (25%) @1 (@2%)=@1 (@2%) # Itemname (<0.5%) diff --git a/mods/HUD/mcl_credits/locale/mcl_credits.de.tr b/mods/HUD/mcl_credits/locale/mcl_credits.de.tr index 6a38d18e6..fa26f5bc4 100644 --- a/mods/HUD/mcl_credits/locale/mcl_credits.de.tr +++ b/mods/HUD/mcl_credits/locale/mcl_credits.de.tr @@ -7,6 +7,7 @@ Creator of MineClone2=Schöpfer von MineClone2 Developers=Entwickler Jump to speed up (additionally sprint)=Springen, um zu beschleunigen (zusätzlich sprinten) Maintainers=Betreuer +MineClone5=MineClone5 Original Mod Authors=Original-Mod-Autoren Sneak to skip=Schleichen zum Überspringen Textures=Texturen diff --git a/mods/HUD/mcl_credits/locale/mcl_credits.es.tr b/mods/HUD/mcl_credits/locale/mcl_credits.es.tr new file mode 100644 index 000000000..a8886286e --- /dev/null +++ b/mods/HUD/mcl_credits/locale/mcl_credits.es.tr @@ -0,0 +1,14 @@ +# textdomain: mcl_credits +3D Models= +A faithful Open Source clone of Minecraft= +Contributors= +Creator of MineClone= +Creator of MineClone2= +Developers= +Jump to speed up (additionally sprint)= +Maintainers= +MineClone5= +Original Mod Authors= +Sneak to skip= +Textures= +Translations= \ No newline at end of file diff --git a/mods/HUD/mcl_credits/locale/mcl_credits.fr.tr b/mods/HUD/mcl_credits/locale/mcl_credits.fr.tr new file mode 100644 index 000000000..b34249eff --- /dev/null +++ b/mods/HUD/mcl_credits/locale/mcl_credits.fr.tr @@ -0,0 +1,14 @@ +# textdomain: mcl_credits +3D Models=Modèles 3D +A faithful Open Source clone of Minecraft=Un clone open source de Minecraft +Contributors=Contributeurs +Creator of MineClone=Créateur de MineClone +Creator of MineClone2=Créateur de MineClone2 +Developers=Développeurs +Jump to speed up (additionally sprint)=Saut pour accélérer (peut être combiné avec sprint) +Maintainers=Mainteneurs +MineClone5=MineClone5 +Original Mod Authors=Auteurs des mods originaux +Sneak to skip=Shift pour passer +Textures=Textures +Translations=Traductions \ No newline at end of file diff --git a/mods/HUD/mcl_credits/locale/mcl_credits.pl.tr b/mods/HUD/mcl_credits/locale/mcl_credits.pl.tr new file mode 100644 index 000000000..a8886286e --- /dev/null +++ b/mods/HUD/mcl_credits/locale/mcl_credits.pl.tr @@ -0,0 +1,14 @@ +# textdomain: mcl_credits +3D Models= +A faithful Open Source clone of Minecraft= +Contributors= +Creator of MineClone= +Creator of MineClone2= +Developers= +Jump to speed up (additionally sprint)= +Maintainers= +MineClone5= +Original Mod Authors= +Sneak to skip= +Textures= +Translations= \ No newline at end of file diff --git a/mods/HUD/mcl_credits/locale/mcl_credits.ru.tr b/mods/HUD/mcl_credits/locale/mcl_credits.ru.tr new file mode 100644 index 000000000..a8886286e --- /dev/null +++ b/mods/HUD/mcl_credits/locale/mcl_credits.ru.tr @@ -0,0 +1,14 @@ +# textdomain: mcl_credits +3D Models= +A faithful Open Source clone of Minecraft= +Contributors= +Creator of MineClone= +Creator of MineClone2= +Developers= +Jump to speed up (additionally sprint)= +Maintainers= +MineClone5= +Original Mod Authors= +Sneak to skip= +Textures= +Translations= \ No newline at end of file diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index cd66c3fc4..69f6a601d 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -1133,7 +1133,7 @@ for color, desc in pairs(boxtypes) do if mod_doc then if is_canonical then longdesc = S("A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.") - usagehelp = S("To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out.") + usagehelp = S("To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.") entry_name = S("Shulker Box") else create_entry = false diff --git a/mods/ITEMS/mcl_chests/locale/template.txt b/mods/ITEMS/mcl_chests/locale/template.txt index 1d947184b..d680c24c9 100644 --- a/mods/ITEMS/mcl_chests/locale/template.txt +++ b/mods/ITEMS/mcl_chests/locale/template.txt @@ -24,7 +24,7 @@ Red Shulker Box= Grey Shulker Box= Black Shulker Box= A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.= -To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out.= +To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.= Shulker Box= Large Chest= Inventory= diff --git a/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.es.tr b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.es.tr new file mode 100644 index 000000000..e66eb06a5 --- /dev/null +++ b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.es.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_fireworks +Firework Rocket= +Flight Duration:= \ No newline at end of file diff --git a/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.fr.tr b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.fr.tr new file mode 100644 index 000000000..b02faa428 --- /dev/null +++ b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.fr.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_fireworks +Firework Rocket=Fusée +Flight Duration:=Durée de vol : \ No newline at end of file diff --git a/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.ru.tr b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.ru.tr new file mode 100644 index 000000000..e66eb06a5 --- /dev/null +++ b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.ru.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_fireworks +Firework Rocket= +Flight Duration:= \ No newline at end of file diff --git a/mods/ITEMS/mcl_maps/locale/mcl_maps.fr.tr b/mods/ITEMS/mcl_maps/locale/mcl_maps.fr.tr index 9ef7cd5c5..1808e839d 100644 --- a/mods/ITEMS/mcl_maps/locale/mcl_maps.fr.tr +++ b/mods/ITEMS/mcl_maps/locale/mcl_maps.fr.tr @@ -1,5 +1,8 @@ # textdomain: mcl_maps Empty Map=Carte Vierge Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=Les cartes vierges ne sont pas utiles en tant que cartes, mais elles peuvent être empilées et transformées en cartes utilisables. -Rightclick to start using the map (which can't be stacked anymore).=Clic droit pour commencer à utiliser la carte (qui ne peut plus être empilée). +Rightclick to create a filled map (which can't be stacked anymore).=Clic droit pour créer une carte remplie (qui ne peut plus être empilée). Map=Carte +Shows a map image.=Affiche une carte. +When created, the map saves the nearby area as an image that can be viewed any time by holding the map.=Lors de sa création, la carte sauvegarde le terrain proche sous forme d'image qui peut être consultée n'importe quand en tenant la carte dans la main. +Hold the map in your hand. This will display a map on your screen.=Tenez la carte dans votre main. Cela affichera la carte à l'écran. From 58a292a4f3edcf6816936b89a6b32275fb785299 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Mon, 16 Aug 2021 13:48:08 +0200 Subject: [PATCH 039/228] fix inconsistency --- mods/HUD/mcl_title/init.lua | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/mods/HUD/mcl_title/init.lua b/mods/HUD/mcl_title/init.lua index d1dbece4b..ffdc45639 100644 --- a/mods/HUD/mcl_title/init.lua +++ b/mods/HUD/mcl_title/init.lua @@ -36,7 +36,11 @@ local string = string local pairs = pairs local function gametick_to_secondes(gametick) - return gametick / 20 + if gametick then + return gametick / 20 + else + return nil + end end @@ -46,9 +50,9 @@ local player_params = {} minetest.register_on_joinplayer(function(player) local playername = player:get_player_name() player_params[player] = { - stay = gametick_to_secondes(mcl_title.defaults.stay), - --fadeIn = gametick_to_secondes(mcl_title.defaults.fadein), - --fadeOut = gametick_to_secondes(mcl_title.defaults.fadeout), + stay = mcl_title.defaults.stay, + --fadeIn = mcl_title.defaults.fadein, + --fadeOut = mcl_title.defaults.fadeout, } local _, hex_color = get_color("white") huds_idx.title[player] = player:hud_add({ @@ -106,9 +110,9 @@ end) function mcl_title.params_set(player, data) player_params[player] = { - stay = gametick_to_secondes(data.stay) or gametick_to_secondes(mcl_title.defaults.stay), - --fadeIn = gametick_to_secondes(data.fadeIn) or gametick_to_secondes(mcl_title.defaults.fadein), - --fadeOut = gametick_to_secondes(data.fadeOut) or gametick_to_secondes(mcl_title.defaults.fadeout), + stay = data.stay or mcl_title.defaults.stay, + --fadeIn = data.fadeIn or mcl_title.defaults.fadein, + --fadeOut = data.fadeOut or mcl_title.defaults.fadeout, } end @@ -134,7 +138,7 @@ function mcl_title.set(player, type, data) player:hud_change(huds_idx[type][player], "text", data.text) player:hud_change(huds_idx[type][player], "number", hex_color) - hud_hide_timeouts[type][player:get_player_name()] = gametick_to_secondes(data.stay) or mcl_title.params_get(player).stay + hud_hide_timeouts[type][player:get_player_name()] = gametick_to_secondes(data.stay) or gametick_to_secondes(mcl_title.params_get(player).stay) return true end From 40898d3e9dfeb492ecaca2621308c8c125ef5471 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Mon, 16 Aug 2021 14:19:50 +0200 Subject: [PATCH 040/228] WIP bold and italic support --- mods/HUD/mcl_title/init.lua | 38 +++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/mods/HUD/mcl_title/init.lua b/mods/HUD/mcl_title/init.lua index ffdc45639..933158d20 100644 --- a/mods/HUD/mcl_title/init.lua +++ b/mods/HUD/mcl_title/init.lua @@ -43,6 +43,23 @@ local function gametick_to_secondes(gametick) end end +--https://github.com/minetest/minetest/blob/b3b075ea02034306256b486dd45410aa765f035a/doc/lua_api.txt#L8477 + +local function style_to_bits(bold, italic) + if bold then + if italic then + return 3 + else + return 1 + end + else + if italic then + return 2 + else + return 0 + end + end +end --PARAMS SYSTEM local player_params = {} @@ -60,8 +77,7 @@ minetest.register_on_joinplayer(function(player) position = mcl_title.layout.title.position, alignment = mcl_title.layout.title.alignment, text = "", - --bold = data.bold, - --italic = data.italic, + style = 0, size = {x = mcl_title.layout.title.size}, number = hex_color, z_index = 100, @@ -71,8 +87,7 @@ minetest.register_on_joinplayer(function(player) position = mcl_title.layout.subtitle.position, alignment = mcl_title.layout.subtitle.alignment, text = "", - --bold = data.bold, - --italic = data.italic, + style = 0, size = {x = mcl_title.layout.subtitle.size}, number = hex_color, z_index = 100, @@ -82,8 +97,7 @@ minetest.register_on_joinplayer(function(player) position = mcl_title.layout.actionbar.position, offset = {x = 0, y = -210}, alignment = mcl_title.layout.actionbar.alignment, - --bold = data.bold, - --italic = data.italic, + style = 0, text = "", size = {x = mcl_title.layout.actionbar.size}, number = hex_color, @@ -131,13 +145,12 @@ function mcl_title.set(player, type, data) return false end - --TODO: enable this code then Fleckenstein's pr get merged (in about 5-6 years lol) - - --if data.bold == nil then data.bold = false end - --if data.italic == nil then data.italic = false end - player:hud_change(huds_idx[type][player], "text", data.text) player:hud_change(huds_idx[type][player], "number", hex_color) + + --apply bold and italic + player:hud_change(huds_idx[type][player], "style", style_to_bits(data.bold, data.italic)) + hud_hide_timeouts[type][player:get_player_name()] = gametick_to_secondes(data.stay) or gametick_to_secondes(mcl_title.params_get(player).stay) return true end @@ -145,6 +158,7 @@ end function mcl_title.remove(player, type) if player then player:hud_change(huds_idx[type][player], "text", "") + player:hud_change(huds_idx[type][player], "style", 0) --no styling end end @@ -184,7 +198,7 @@ end) minetest.register_chatcommand("title", { func = function(name, param) local player = minetest.get_player_by_name(name) - mcl_title.set(player, "title", {text=param, color="gold"}) + mcl_title.set(player, "title", {text=param, color="gold", bold=true, italic=true}) end, }) From df4b8e64cc153ba70457a199661e1e6e92e30bf9 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Thu, 19 Aug 2021 19:21:33 +0200 Subject: [PATCH 041/228] finish `mcl_title` API + doc --- mods/HUD/mcl_title/API.md | 8 ++++++ mods/HUD/mcl_title/init.lua | 28 +++++++++++--------- mods/HUD/mcl_tmp_message/API.md | 7 ----- mods/HUD/mcl_tmp_message/init.lua | 44 ------------------------------- mods/HUD/mcl_tmp_message/mod.conf | 3 --- 5 files changed, 23 insertions(+), 67 deletions(-) delete mode 100644 mods/HUD/mcl_tmp_message/API.md delete mode 100644 mods/HUD/mcl_tmp_message/init.lua delete mode 100644 mods/HUD/mcl_tmp_message/mod.conf diff --git a/mods/HUD/mcl_title/API.md b/mods/HUD/mcl_title/API.md index 50614be4f..97d75ece8 100644 --- a/mods/HUD/mcl_title/API.md +++ b/mods/HUD/mcl_title/API.md @@ -39,4 +39,12 @@ Allow mods to set `stay` and upcomming `fadeIn`/`fadeOut` params. ```lua mcl_title.params_set(player, {stay = 600}) --elements with no 'data.stay' field will stay during 30s (600/20) +``` + +## mcl_title.params_get(player) + +Get `stay` and upcomming `fadeIn` and `fadeOut` params of a player as a table. + +```lua +mcl_title.params_get(player) ``` \ No newline at end of file diff --git a/mods/HUD/mcl_title/init.lua b/mods/HUD/mcl_title/init.lua index 933158d20..2ea1571c8 100644 --- a/mods/HUD/mcl_title/init.lua +++ b/mods/HUD/mcl_title/init.lua @@ -32,7 +32,7 @@ mcl_title.layout.actionbar = {position = {x = 0.5, y = 1}, alignment = {x = 0, y local get_color = mcl_util.get_color -local string = string +--local string = string local pairs = pairs local function gametick_to_secondes(gametick) @@ -44,7 +44,7 @@ local function gametick_to_secondes(gametick) end --https://github.com/minetest/minetest/blob/b3b075ea02034306256b486dd45410aa765f035a/doc/lua_api.txt#L8477 - +--[[ local function style_to_bits(bold, italic) if bold then if italic then @@ -60,24 +60,25 @@ local function style_to_bits(bold, italic) end end end +]] --PARAMS SYSTEM local player_params = {} minetest.register_on_joinplayer(function(player) - local playername = player:get_player_name() + --local playername = player:get_player_name() player_params[player] = { stay = mcl_title.defaults.stay, --fadeIn = mcl_title.defaults.fadein, --fadeOut = mcl_title.defaults.fadeout, } - local _, hex_color = get_color("white") + local _, hex_color = get_color("white") huds_idx.title[player] = player:hud_add({ hud_elem_type = "text", position = mcl_title.layout.title.position, alignment = mcl_title.layout.title.alignment, text = "", - style = 0, + --style = 0, size = {x = mcl_title.layout.title.size}, number = hex_color, z_index = 100, @@ -87,7 +88,7 @@ minetest.register_on_joinplayer(function(player) position = mcl_title.layout.subtitle.position, alignment = mcl_title.layout.subtitle.alignment, text = "", - style = 0, + --style = 0, size = {x = mcl_title.layout.subtitle.size}, number = hex_color, z_index = 100, @@ -97,7 +98,7 @@ minetest.register_on_joinplayer(function(player) position = mcl_title.layout.actionbar.position, offset = {x = 0, y = -210}, alignment = mcl_title.layout.actionbar.alignment, - style = 0, + --style = 0, text = "", size = {x = mcl_title.layout.actionbar.size}, number = hex_color, @@ -116,7 +117,7 @@ minetest.register_on_leaveplayer(function(player) huds_idx.subtitle[player] = nil huds_idx.actionbar[player] = nil - --remove timers form list + --remove timers from list hud_hide_timeouts.title[playername] = nil hud_hide_timeouts.subtitle[playername] = nil hud_hide_timeouts.actionbar[playername] = nil @@ -149,7 +150,7 @@ function mcl_title.set(player, type, data) player:hud_change(huds_idx[type][player], "number", hex_color) --apply bold and italic - player:hud_change(huds_idx[type][player], "style", style_to_bits(data.bold, data.italic)) + --player:hud_change(huds_idx[type][player], "style", style_to_bits(data.bold, data.italic)) hud_hide_timeouts[type][player:get_player_name()] = gametick_to_secondes(data.stay) or gametick_to_secondes(mcl_title.params_get(player).stay) return true @@ -158,7 +159,7 @@ end function mcl_title.remove(player, type) if player then player:hud_change(huds_idx[type][player], "text", "") - player:hud_change(huds_idx[type][player], "style", 0) --no styling + --player:hud_change(huds_idx[type][player], "style", 0) --no styling end end @@ -193,8 +194,8 @@ minetest.register_globalstep(function(dtime) end) ---TEMP STUFF!! ---TODO: remove then testing/tweaking done +--DEBUG STUFF!! +--[[ minetest.register_chatcommand("title", { func = function(name, param) local player = minetest.get_player_by_name(name) @@ -231,4 +232,5 @@ minetest.register_chatcommand("all", { mcl_title.set(player, "subtitle", {text=param, color="gold"}) mcl_title.set(player, "actionbar", {text=param, color="gold"}) end, -}) \ No newline at end of file +}) +]] \ No newline at end of file diff --git a/mods/HUD/mcl_tmp_message/API.md b/mods/HUD/mcl_tmp_message/API.md deleted file mode 100644 index 0a3fc06a3..000000000 --- a/mods/HUD/mcl_tmp_message/API.md +++ /dev/null @@ -1,7 +0,0 @@ -# mcl_temp_message - -Allow mods to show short messages in the hud of players. - -## mcl_tmp_message.message(player, message) - -Show above the hotbar a hud message to player . \ No newline at end of file diff --git a/mods/HUD/mcl_tmp_message/init.lua b/mods/HUD/mcl_tmp_message/init.lua deleted file mode 100644 index 1456cd592..000000000 --- a/mods/HUD/mcl_tmp_message/init.lua +++ /dev/null @@ -1,44 +0,0 @@ -mcl_tmp_message = {} - -local huds = {} -local hud_hide_timeouts = {} - -function mcl_tmp_message.message(player, message) - local name = player:get_player_name() - player:hud_change(huds[name], "text", message) - hud_hide_timeouts[name] = 3 -end - -minetest.register_on_joinplayer(function(player) - huds[player:get_player_name()] = player:hud_add({ - hud_elem_type = "text", - position = {x=0.5, y=1}, - offset = {x = 0, y = -210}, - alignment = {x=0, y=0}, - number = 0xFFFFFF , - text = "", - z_index = 100, - }) -end) - -minetest.register_on_leaveplayer(function(player) - local name = player:get_player_name() - huds[name] = nil - hud_hide_timeouts[name] = nil -end) - -minetest.register_globalstep(function(dtime) - local new_timeouts = {} - for name, timeout in pairs(hud_hide_timeouts) do - timeout = timeout - dtime - if timeout <= 0 then - local player = minetest.get_player_by_name(name) - if player then - player:hud_change(huds[name], "text", "") - end - else - new_timeouts[name] = timeout - end - end - hud_hide_timeouts = new_timeouts -end) diff --git a/mods/HUD/mcl_tmp_message/mod.conf b/mods/HUD/mcl_tmp_message/mod.conf deleted file mode 100644 index ad453643e..000000000 --- a/mods/HUD/mcl_tmp_message/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = mcl_tmp_message -author = Fleckenstein -description = A simple API to show a temporary message to a player From af8e88f44cad6465e91530b0f87e8588e885cff3 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 24 Aug 2021 08:25:42 +0200 Subject: [PATCH 042/228] fix error in `mcl_title` documentation --- mods/HUD/mcl_title/API.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/HUD/mcl_title/API.md b/mods/HUD/mcl_title/API.md index 97d75ece8..37f1c279f 100644 --- a/mods/HUD/mcl_title/API.md +++ b/mods/HUD/mcl_title/API.md @@ -21,7 +21,7 @@ mcl_title.set(player, "subtitle", {text="dummy subtitle", color="#612D2D"}) mcl_title.set(player, "subtitle", {text="dummy actionbar", color="red"}) --show a title in the HUD with minecraft color "gold" staying for 3 seconds (override stay setting) -mcl_title.set(player, "title", {text="dummy text", color="gold", stay=3}) +mcl_title.set(player, "title", {text="dummy text", color="gold", stay=60}) ``` ## mcl_title.remove(player, type) From f0af15fcd8006a66ce91ba3efbf77c24a8e8ffca Mon Sep 17 00:00:00 2001 From: NO11 Date: Thu, 26 Aug 2021 10:14:57 +0000 Subject: [PATCH 043/228] Make anvil selection/collision box more MC like --- mods/ITEMS/mcl_anvils/init.lua | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index 51b78da6f..e1685c60e 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -284,6 +284,12 @@ local function damage_anvil_by_falling(pos, distance) end end +local anvilbox = { + type = "fixed", + fixed = { + { -8 / 16, -8 / 16, -6 / 16, 8 / 16, 8 / 16, 6 / 16 }, + }, +} local anvildef = { groups = {pickaxey=1, falling_node=1, falling_node_damage=1, crush_after_fall=1, deco_block=1, anvil=1}, tiles = {"mcl_anvils_anvil_top_damaged_0.png^[transformR90", "mcl_anvils_anvil_base.png", "mcl_anvils_anvil_side.png"}, @@ -297,12 +303,14 @@ local anvildef = { node_box = { type = "fixed", fixed = { - { -6/16, -8/16, -6/16, 6/16, -4/16, 6/16 }, - { -5/16, -4/16, -4/16, 5/16, -3/16, 4/16 }, - { -4/16, -3/16, -2/16, 4/16, 2/16, 2/16 }, - { -8/16, 2/16, -5/16, 8/16, 8/16, 5/16 }, + { -6 / 16, -8 / 16, -6 / 16, 6 / 16, -4 / 16, 6 / 16 }, + { -5 / 16, -4 / 16, -4 / 16, 5 / 16, -3 / 16, 4 / 16 }, + { -4 / 16, -3 / 16, -2 / 16, 4 / 16, 2 / 16, 2 / 16 }, + { -8 / 16, 2 / 16, -5 / 16, 8 / 16, 8 / 16, 5 / 16 }, } }, + selection_box = anvilbox, + collision_box = anvilbox, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 1200, _mcl_hardness = 5, From 2b322a451f9ecd71918c9eeb6f40a386d031bfea Mon Sep 17 00:00:00 2001 From: NO11 Date: Thu, 26 Aug 2021 10:17:15 +0000 Subject: [PATCH 044/228] remove space --- mods/ITEMS/mcl_totems/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_totems/init.lua b/mods/ITEMS/mcl_totems/init.lua index 5f9b254a3..2206fcb2a 100644 --- a/mods/ITEMS/mcl_totems/init.lua +++ b/mods/ITEMS/mcl_totems/init.lua @@ -87,7 +87,7 @@ mcl_damage.register_modifier(function(obj, damage, reason) end end) - -- Big totem overlay + -- Big totem overlay if not hud_totem[obj] then hud_totem[obj] = obj:hud_add({ hud_elem_type = "image", From ca086109bf17787e3a7b075ceb07ccb82810a3bb Mon Sep 17 00:00:00 2001 From: NO11 Date: Tue, 31 Aug 2021 21:04:57 +0000 Subject: [PATCH 045/228] support tables for `_repair_material` --- mods/ITEMS/mcl_anvils/init.lua | 44 +++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index e1685c60e..d3b32b844 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -53,6 +53,15 @@ local function get_consumed_materials(tool, material) return materials_used end +local function contains(table, value) + for _, i in pairs(table) do + if i == value then + return true + end + end + return false +end + -- Given 2 input stacks, tells you which is the tool and which is the material. -- Returns ("tool", input1, input2) if input1 is tool and input2 is material. -- Returns ("material", input2, input1) if input1 is material and input2 is tool. @@ -60,9 +69,15 @@ end local function distinguish_tool_and_material(input1, input2) local def1 = input1:get_definition() local def2 = input2:get_definition() - if def1.type == "tool" and def1._repair_material then + local r1 = def1._repair_material + local r2 = def2._repair_material + if def1.type == "tool" and r1 and type(r1) == "table" and contains(r1, input2) then return "tool", input1, input2 - elseif def2.type == "tool" and def2._repair_material then + elseif def2.type == "tool" and r2 and type(r2) == "table" and contains(r2, input1) then + return "material", input2, input1 + elseif def1.type == "tool" and r1 then + return "tool", input1, input2 + elseif def2.type == "tool" and r2 then return "material", input2, input1 else return nil @@ -121,11 +136,28 @@ local function update_anvil_slots(meta) local distinguished, tool, material = distinguish_tool_and_material(input1, input2) if distinguished then local tooldef = tool:get_definition() + local repair = tooldef._repair_material local has_correct_material = false - if string.sub(tooldef._repair_material, 1, 6) == "group:" then - has_correct_material = minetest.get_item_group(material:get_name(), string.sub(tooldef._repair_material, 7)) ~= 0 - elseif material:get_name() == tooldef._repair_material then - has_correct_material = true + local material_name = material:get_name() + if type(repair) == "string" then + if string.sub(repair, 1, 6) == "group:" then + has_correct_material = minetest.get_item_group(material_name, string.sub(repair, 7)) ~= 0 + elseif material_name == repair then + has_correct_material = true + end + else + if contains(repair, material_name) then + has_correct_material = true + else + for _, r in pairs(repair) do + if string.sub(r, 1, 6) == "group:" then + if minetest.get_item_group(material_name, string.sub(r, 7)) ~= 0 then + has_correct_material = true + end + + end + end + end end if has_correct_material and tool:get_wear() > 0 then local materials_used = get_consumed_materials(tool, material) From 0da7b3fbda988d11ee79a03ca3c2719d6906e20f Mon Sep 17 00:00:00 2001 From: NO11 Date: Thu, 2 Sep 2021 20:38:01 +0000 Subject: [PATCH 046/228] Make cactus mechanisms more MC like (Fix #1741) --- mods/ITEMS/mcl_core/functions.lua | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index eceb81c51..af4821c90 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -184,6 +184,7 @@ minetest.register_abm({ end, }) +-- Cactus mechanisms minetest.register_abm({ label = "Cactus growth", nodenames = {"mcl_core:cactus"}, @@ -195,19 +196,31 @@ minetest.register_abm({ end, }) --- Make cactus destroy items minetest.register_abm({ label = "Cactus destroy items", nodenames = {"mcl_core:cactus"}, interval = 1, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) - for _,object in pairs(minetest.get_objects_inside_radius(pos, 0.9)) do + for _, object in pairs(minetest.get_objects_inside_radius(pos, 0.9)) do local entity = object:get_luaentity() if entity and entity.name == "__builtin:item" then object:remove() end end + local posses = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } } + for _, p in pairs(posses) do + if minetest.registered_nodes[minetest.get_node(vector.new(pos.x + p[1], pos.y, pos.z + p[2])).name].walkable then + local posy = pos.y + while minetest.get_node(vector.new(pos.x, posy, pos.z)).name == "mcl_core:cactus" do + local pos = vector.new(pos.x, posy, pos.z) + minetest.remove_node(pos) + minetest.add_item(vector.offset(pos, math.random(-0.5, 0.5), 0, math.random(-0.5, 0.5)), "mcl_core:cactus") + posy = posy + 1 + end + break + end + end end, }) From bf62eb33fa97cc345fcab2515b2360cd18b80fbf Mon Sep 17 00:00:00 2001 From: NO11 Date: Fri, 3 Sep 2021 14:06:21 +0000 Subject: [PATCH 047/228] Change label of cactus abm --- mods/ITEMS/mcl_core/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index af4821c90..2ef73af72 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -197,7 +197,7 @@ minetest.register_abm({ }) minetest.register_abm({ - label = "Cactus destroy items", + label = "Cactus mechanisms", nodenames = {"mcl_core:cactus"}, interval = 1, chance = 1, From 5fedd914fb110aa8adeed1c3fe633a2c9e25c9e7 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sat, 4 Sep 2021 19:14:08 +0000 Subject: [PATCH 048/228] Fix strange behaviour when filling end portal with bedrock inside (#1749) --- mods/ITEMS/mcl_portals/portal_end.lua | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index 9f0db352a..e4982c39b 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -391,7 +391,3 @@ minetest.override_item("mcl_end:ender_eye", { return itemstack end, }) -minetest.override_item("mcl_core:bedrock", { - after_destruct = destroy_portal, -}) - From f41cea71fd61473090cd04ac8f206f56b9cd3410 Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 6 Sep 2021 13:30:08 +0000 Subject: [PATCH 049/228] Make it possible to use shears in the dispenser for mobs (Fix #1233) --- mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 53 +++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 7c2c07393..62ed2dc71 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -168,6 +168,59 @@ local dispenserdef = { end inv:set_stack("main", stack_id, stack) + + -- Use shears on sheeps + elseif igroups.shears then + for _, obj in pairs(minetest.get_objects_inside_radius(droppos, 1)) do + local entity = obj:get_luaentity() + if entity and not entity.child and not entity.gotten then + local entname = entity.name + local pos = obj:get_pos() + local used, texture = false + if entname == "mobs_mc:sheep" then + minetest.add_item(pos, entity.drops[2].name .. " " .. math.random(1, 3)) + if not entity.color then + entity.color = "unicolor_white" + end + entity.base_texture = { "blank.png", "mobs_mc_sheep.png" } + texture = entity.base_texture + entity.drops = { + { name = mobs_mc.items.mutton_raw, chance = 1, min = 1, max = 2 }, + } + used = true + elseif entname == "mobs_mc:snowman" then + texture = { + "mobs_mc_snowman.png", + "blank.png", "blank.png", + "blank.png", "blank.png", + "blank.png", "blank.png", + } + used = true + elseif entname == "mobs_mc:mooshroom" then + local droppos = vector.offset(pos, 0, 1.4, 0) + if entity.base_texture[1] == "mobs_mc_mooshroom_brown.png" then + minetest.add_item(droppos, mobs_mc.items.mushroom_brown .. " 5") + else + minetest.add_item(droppos, mobs_mc.items.mushroom_red .. " 5") + end + local oldyaw = obj:get_yaw() + obj:remove() + local cow = minetest.add_entity(pos, "mobs_mc:cow") + cow:set_yaw(oldyaw) + obj = cow + entity = cow:get_luaentity() + used = true + end + if used then + obj:set_properties({ textures = texture }) + entity.gotten = true + minetest.sound_play("mcl_tools_shears_cut", { pos = pos }, true) + stack:add_wear(65535 / stackdef._mcl_diggroups.shearsy.uses) + inv:set_stack("main", stack_id, stack) + end + end + end + -- Spawn Egg elseif igroups.spawn_egg then -- Spawn mob From dc8436fdf95afe224437d5fa6e3c883fa322f2a6 Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 6 Sep 2021 14:34:25 +0000 Subject: [PATCH 050/228] Destroy objects near cactus faster (make it possible to throw items at a cactus) --- mods/ENTITIES/mcl_item_entity/init.lua | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index ab1ac5752..7869b9d79 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -575,7 +575,7 @@ minetest.register_entity(":__builtin:item", { return true end, - on_step = function(self, dtime) + on_step = function(self, dtime, moveresult) if self._removed then self.object:set_properties({ physical = false @@ -642,6 +642,18 @@ minetest.register_entity(":__builtin:item", { end end + -- Destroy item when it collides with a cactus + if moveresult and moveresult.collides then + for _, collision in pairs(moveresult.collisions) do + local pos = collision.node_pos + if collision.type == "node" and minetest.get_node(pos).name == "mcl_core:cactus" then + self._removed = true + self.object:remove() + return + end + end + end + -- Push item out when stuck inside solid opaque node if def and def.walkable and def.groups and def.groups.opaque == 1 then local shootdir From 1a5339e907c1b5d572e2fe38a8b4451bf9bfff43 Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 8 Sep 2021 14:22:53 +0000 Subject: [PATCH 051/228] Only use the shears once in dispenser if there are more mobs in front of the dispenser --- mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 62ed2dc71..82d53c806 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -217,6 +217,7 @@ local dispenserdef = { minetest.sound_play("mcl_tools_shears_cut", { pos = pos }, true) stack:add_wear(65535 / stackdef._mcl_diggroups.shearsy.uses) inv:set_stack("main", stack_id, stack) + break end end end From 89ff666a6a7a456daf22a224f42ba7a34919aeec Mon Sep 17 00:00:00 2001 From: NO11 Date: Sun, 12 Sep 2021 12:21:18 +0000 Subject: [PATCH 052/228] Add playersSleepingPercentage server setting (Fix #920) --- mods/ITEMS/mcl_beds/functions.lua | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index e196f69ad..fd8a6d7cd 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -9,6 +9,7 @@ local weather_mod = minetest.get_modpath("mcl_weather") local explosions_mod = minetest.get_modpath("mcl_explosions") local spawn_mod = minetest.get_modpath("mcl_spawn") local worlds_mod = minetest.get_modpath("mcl_worlds") +local players_in_bed_setting = tonumber(minetest.settings:get("mcl_playersSleepingPercentage")) -- Helper functions @@ -34,19 +35,10 @@ local function is_night_skip_enabled() end local function check_in_beds(players) - local in_bed = mcl_beds.player if not players then players = minetest.get_connected_players() end - - for n, player in pairs(players) do - local name = player:get_player_name() - if not in_bed[name] then - return false - end - end - - return #players > 0 + return players_in_bed_setting <= (#mcl_beds.player * 100) / #players end -- These monsters do not prevent sleep @@ -198,8 +190,8 @@ end local function update_formspecs(finished, ges) local ges = ges or #minetest.get_connected_players() local form_n = "size[12,5;true]" - local all_in_bed = ges == player_in_bed - local night_skip = is_night_skip_enabled() + local all_in_bed = players_in_bed_setting <= (player_in_bed * 100) / ges + local night_skip = is_night_skip_enabled() and players_in_bed_setting <= 100 local button_leave = "button_exit[4,3;4,0.75;leave;"..F(S("Leave bed")).."]" local button_abort = "button_exit[4,3;4,0.75;leave;"..F(S("Abort sleep")).."]" local bg_presleep = "bgcolor[#00000080;true]" @@ -212,7 +204,7 @@ local function update_formspecs(finished, ges) return elseif not is_sp then local text = S("Players in bed: @1/@2", player_in_bed, ges) - if not night_skip then + if not night_skip or players_in_bed_setting > 100 then text = text .. "\n" .. S("Note: Night skip is disabled.") form_n = form_n .. bg_presleep form_n = form_n .. button_leave @@ -221,7 +213,13 @@ local function update_formspecs(finished, ges) form_n = form_n .. bg_sleep form_n = form_n .. button_abort else - text = text .. "\n" .. S("You will fall asleep when all players are in bed.") + local comment = "You will fall asleep when " + if players_in_bed_setting == 100 then + comment = comment .. "all players are in bed." + else + comment = comment .. players_in_bed_setting .. "% of all players are in bed." + end + text = text .. "\n" .. S(comment) form_n = form_n .. bg_presleep form_n = form_n .. button_leave end From 0bc9ab9233811b508e1aa29c4b1ea421b47fead3 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sun, 12 Sep 2021 12:23:28 +0000 Subject: [PATCH 053/228] Add playersSleepingPercentage setting to settingtypes.txt --- settingtypes.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/settingtypes.txt b/settingtypes.txt index f605019ad..89e11833f 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -33,6 +33,11 @@ mcl_tnt_griefing (TNT destroys blocks) bool true # This setting is only read at startup. enable_bed_respawn (Respawn at bed) bool true +# How many players have to sleep to skip the night, in percent. +# Setting to 0 will mean 1 player is always enough to skip the night. Setting above 100 will prevent skipping the night. +# 100 by default. +mcl_playersSleepingPercentage (Players Sleeping Percentage) int 100 + # 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 From cd84c472dcb67b32b74397f87c00503b7414fc77 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sun, 12 Sep 2021 12:49:39 +0000 Subject: [PATCH 054/228] Add translation support. --- mods/ITEMS/mcl_beds/functions.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index fd8a6d7cd..01ccec851 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -215,11 +215,11 @@ local function update_formspecs(finished, ges) else local comment = "You will fall asleep when " if players_in_bed_setting == 100 then - comment = comment .. "all players are in bed." + comment = S(comment .. "all players are in bed.") else - comment = comment .. players_in_bed_setting .. "% of all players are in bed." + comment = S(comment .. "@1% of all players are in bed.", players_in_bed_setting) end - text = text .. "\n" .. S(comment) + text = text .. "\n" .. comment form_n = form_n .. bg_presleep form_n = form_n .. button_leave end From 9f9799d96e699a0b64bce5fee061deeb040b3aa4 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sun, 12 Sep 2021 12:50:54 +0000 Subject: [PATCH 055/228] Update template.txt in mcl_beds --- mods/ITEMS/mcl_beds/locale/template.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ITEMS/mcl_beds/locale/template.txt b/mods/ITEMS/mcl_beds/locale/template.txt index 8301dfa33..5525bd91b 100644 --- a/mods/ITEMS/mcl_beds/locale/template.txt +++ b/mods/ITEMS/mcl_beds/locale/template.txt @@ -37,5 +37,6 @@ Players in bed: @1/@2= Note: Night skip is disabled.= You're sleeping.= You will fall asleep when all players are in bed.= +You will fall asleep when @1% of all players are in bed.= You're in bed.= Allows you to sleep= From 410b7c7844b674a062e1726a058e992698b9b34e Mon Sep 17 00:00:00 2001 From: NO11 Date: Sun, 12 Sep 2021 12:52:26 +0000 Subject: [PATCH 056/228] Update german translation for mcl_beds --- mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr index 16592115e..eb6967941 100644 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr @@ -37,5 +37,6 @@ Players in bed: @1/@2=Spieler im Bett: @1/@2 Note: Night skip is disabled.=Anmerkung: Überspringen der Nacht deaktiviert. You're sleeping.=Sie schlafen. You will fall asleep when all players are in bed.=Sie werden einschlafen, wenn alle Spieler im Bett sind. +You will fall asleep when @1% of all players are in bed.=Sie werden einschlafen, wenn @1% der Spieler im Bett sind. You're in bed.=Sie sind im Bett. Allows you to sleep=Zum Einschafen From 1c192f4fbbee2089ff72912cf369e8591fd4e481 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 8 Jul 2021 15:34:50 +0200 Subject: [PATCH 057/228] Do not send useless HUDCHANGE packets Several mods set or unset the visibility of a HUD bar way too often (e.g. in a globalstep handler), causing the server to send a lot of superfluous HUDCHANGE packets to each client. Returning from hb.hide_hudbar() early if HUD bar visibility would not change prevents sending these packets. --- mods/HUD/hudbars/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/HUD/hudbars/init.lua b/mods/HUD/hudbars/init.lua index 08f1914ca..505ff403b 100644 --- a/mods/HUD/hudbars/init.lua +++ b/mods/HUD/hudbars/init.lua @@ -425,6 +425,7 @@ function hb.hide_hudbar(player, identifier) local name = player:get_player_name() local hudtable = hb.get_hudtable(identifier) if hudtable == nil then return false end + if hudtable.hudstate[name].hidden == true then return true end if hb.settings.bar_type == "progress_bar" then if hudtable.hudids[name].icon then player:hud_change(hudtable.hudids[name].icon, "scale", {x=0,y=0}) @@ -443,6 +444,7 @@ function hb.unhide_hudbar(player, identifier) local name = player:get_player_name() local hudtable = hb.get_hudtable(identifier) if hudtable == nil then return false end + if hudtable.hudstate[name].hidden == false then return true end local value = hudtable.hudstate[name].value local max = hudtable.hudstate[name].max if hb.settings.bar_type == "progress_bar" then From 95c4d6472bc57c056c5116be88d8f99550ec04b6 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sun, 4 Jul 2021 03:25:05 +0200 Subject: [PATCH 058/228] Send FOV packets only when necessary Before this change, about 10 to 30 FOV packets were sent from the server to each connected client each second. This patch only sends FOV packets when the FOV actually needs to be changed, i.e. when the player starts or stops sprinting. --- mods/PLAYER/mcl_sprint/init.lua | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/mods/PLAYER/mcl_sprint/init.lua b/mods/PLAYER/mcl_sprint/init.lua index 73a518c42..4c0d609c9 100644 --- a/mods/PLAYER/mcl_sprint/init.lua +++ b/mods/PLAYER/mcl_sprint/init.lua @@ -69,18 +69,19 @@ local function setSprinting(playerName, sprinting) --Sets the state of a player local controls = player:get_player_control() if players[playerName] then players[playerName].sprinting = sprinting + local fov_old = players[playerName].fov + local fov_new = fov_old + local fade_time = .15 if sprinting == true or controls.RMB and string.find(player:get_wielded_item():get_name(), "mcl_bows:bow") and player:get_wielded_item():get_name() ~= "mcl_bows:bow" then if sprinting == true then - players[playerName].fov = math.min(players[playerName].fov + 0.05, 1.2) - players[playerName].fade_time = .15 + fov_new = math.min(players[playerName].fov + 0.05, 1.2) else - players[playerName].fov = .7 + fov_new = .7 players[playerName].fade_time = .3 end - player:set_fov(players[playerName].fov, true, players[playerName].fade_time) if sprinting == true then playerphysics.add_physics_factor(player, "speed", "mcl_sprint:sprint", mcl_sprint.SPEED) end @@ -88,12 +89,15 @@ local function setSprinting(playerName, sprinting) --Sets the state of a player and player:get_wielded_item():get_name() ~= "mcl_bows:bow_0" and player:get_wielded_item():get_name() ~= "mcl_bows:bow_1" and player:get_wielded_item():get_name() ~= "mcl_bows:bow_2" then - players[playerName].fov = math.max(players[playerName].fov - 0.05, 1.0) - player:set_fov(players[playerName].fov, true, 0.15) + fov_new = math.max(players[playerName].fov - 0.05, 1.0) if sprinting == false then playerphysics.remove_physics_factor(player, "speed", "mcl_sprint:sprint") end end + if fov_new ~= fov_old then + players[playerName].fov = fov_new + player:set_fov(fov_new, true, fade_time) + end return true end return false From 693a5317efd84eeb1141414e0b48930a09bdceec Mon Sep 17 00:00:00 2001 From: sfan5 Date: Wed, 28 Jul 2021 20:44:48 +0200 Subject: [PATCH 059/228] Fix non-serializable item entity unload crash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some items, like shulkers or books, can have so much metadata that the corresponding item entity can not be serialized by the Minetest engine. Without this patch, dropping such an item and then moving away crashes Minetest, as it can not serialize the entity with serializeString16() when unloading a map block. The patch resets the overlong metadata of non-serializable item entities. This avoids a crash and makes it possible to retrieve a “sanitized” item without metadata when the mapblock containing the item entity is reloaded. Originally sfan5 guessed the maximum possible item entity serialization size that would not lead to a crash as 65530 bytes, but anon5 calculated it to be actually 65487 bytes. This has been experimentally verified by erlehmann. --- mods/ENTITIES/mcl_item_entity/init.lua | 28 +++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 7869b9d79..7a2758ed0 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -480,7 +480,7 @@ minetest.register_entity(":__builtin:item", { end, get_staticdata = function(self) - return minetest.serialize({ + local data = minetest.serialize({ itemstring = self.itemstring, always_collect = self.always_collect, age = self.age, @@ -488,6 +488,32 @@ minetest.register_entity(":__builtin:item", { _flowing = self._flowing, _removed = self._removed, }) + -- sfan5 guessed that the biggest serializable item + -- entity would have a size of 65530 bytes. This has + -- been experimentally verified to be still too large. + -- + -- anon5 has calculated that the biggest serializable + -- item entity has a size of exactly 65487 bytes: + -- + -- 1. serializeString16 can handle max. 65535 bytes. + -- 2. The following engine metadata is always saved: + -- • 1 byte (version) + -- • 2 byte (length prefix) + -- • 14 byte “__builtin:item” + -- • 4 byte (length prefix) + -- • 2 byte (health) + -- • 3 × 4 byte = 12 byte (position) + -- • 4 byte (yaw) + -- • 1 byte (version 2) + -- • 2 × 4 byte = 8 byte (pitch and roll) + -- 3. This leaves 65487 bytes for the serialization. + if #data > 65487 then -- would crash the engine + local stack = ItemStack(self.itemstring) + stack:get_meta():from_table(nil) + self.itemstring = stack:to_string() + return self:get_staticdata() + end + return data end, on_activate = function(self, staticdata, dtime_s) From 256de2bc365466735900dde62c749035ee700843 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Thu, 29 Jul 2021 15:46:50 +0200 Subject: [PATCH 060/228] Log warning for non-serializable item entity fix --- mods/ENTITIES/mcl_item_entity/init.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 7a2758ed0..cfd141f04 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -511,6 +511,13 @@ minetest.register_entity(":__builtin:item", { local stack = ItemStack(self.itemstring) stack:get_meta():from_table(nil) self.itemstring = stack:to_string() + minetest.log( + "warning", + "Overlong item entity metadata removed: “" .. + self.itemstring .. + "” had serialized length of " .. + #data + ) return self:get_staticdata() end return data From 27e4bd6d09b8a1ea36e9b0120b5aa7b90d16cc5a Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 18 Sep 2021 22:28:20 +0200 Subject: [PATCH 061/228] Fix burning entity packet spam - Use upright_sprite for 3rd person flame display, which is both closer to minecraft and allows for client side texture animation - Take care of flame HUD in the MineClone2Client --- mods/ENTITIES/mcl_burning/api.lua | 18 +++-------- mods/ENTITIES/mcl_burning/init.lua | 51 +++++++++++++----------------- 2 files changed, 27 insertions(+), 42 deletions(-) diff --git a/mods/ENTITIES/mcl_burning/api.lua b/mods/ENTITIES/mcl_burning/api.lua index 4cb19cca1..969985205 100644 --- a/mods/ENTITIES/mcl_burning/api.lua +++ b/mods/ENTITIES/mcl_burning/api.lua @@ -67,14 +67,9 @@ function mcl_burning.set_on_fire(obj, burn_time) end if not storage.burn_time or burn_time >= storage.burn_time then - if obj:is_player() and not storage.fire_hud_id then - storage.fire_hud_id = obj:hud_add({ - hud_elem_type = "image", - position = {x = 0.5, y = 0.5}, - scale = {x = -100, y = -100}, - text = "mcl_burning_entity_flame_animated.png^[opacity:180^[verticalframe:" .. mcl_burning.animation_frames .. ":" .. 1, - z_index = 1000, - }) + if obj:is_player() then + mcl_burning.channels[obj]:send_all(tostring(mcl_burning.animation_frames)) + mcl_burning.channels[obj]:send_all("start") end storage.burn_time = burn_time storage.fire_damage_timer = 0 @@ -95,7 +90,6 @@ function mcl_burning.set_on_fire(obj, burn_time) fire_entity:set_properties({visual_size = size}) fire_entity:set_attach(obj, "", offset, {x = 0, y = 0, z = 0}) local fire_luaentity = fire_entity:get_luaentity() - fire_luaentity:update_frame(obj, storage) for _, other in pairs(minetest.get_objects_inside_radius(fire_entity:get_pos(), 0)) do local other_luaentity = other:get_luaentity() @@ -111,9 +105,7 @@ function mcl_burning.extinguish(obj) if mcl_burning.is_burning(obj) then local storage = mcl_burning.get_storage(obj) if obj:is_player() then - if storage.fire_hud_id then - obj:hud_remove(storage.fire_hud_id) - end + mcl_burning.channels[obj]:send_all("stop") mcl_burning.storage[obj] = {} else storage.burn_time = nil @@ -143,4 +135,4 @@ function mcl_burning.tick(obj, dtime, storage) end end end -end \ No newline at end of file +end diff --git a/mods/ENTITIES/mcl_burning/init.lua b/mods/ENTITIES/mcl_burning/init.lua index 34b7ca2d4..313e75dca 100644 --- a/mods/ENTITIES/mcl_burning/init.lua +++ b/mods/ENTITIES/mcl_burning/init.lua @@ -7,6 +7,7 @@ local get_item_group = minetest.get_item_group mcl_burning = { storage = {}, + channels = {}, animation_frames = tonumber(minetest.settings:get("fire_animation_frames")) or 8 } @@ -54,12 +55,11 @@ minetest.register_on_joinplayer(function(player) end mcl_burning.storage[player] = storage + mcl_burning.channels[player] = minetest.mod_channel_join("mcl_burning:" .. player:get_player_name()) end) minetest.register_on_leaveplayer(function(player) - local storage = mcl_burning.storage[player] - storage.fire_hud_id = nil - player:get_meta():set_string("mcl_burning:data", minetest.serialize(storage)) + player:get_meta():set_string("mcl_burning:data", minetest.serialize(mcl_burning.storage[player])) mcl_burning.storage[player] = nil end) @@ -68,27 +68,28 @@ minetest.register_entity("mcl_burning:fire", { initial_properties = { physical = false, collisionbox = {0, 0, 0, 0, 0, 0}, - visual = "cube", + visual = "upright_sprite", + textures = { + name = "mcl_burning_entity_flame_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.0, + }, + }, + spritediv = {x = 1, y = mcl_burning.animation_frames}, pointable = false, glow = -1, backface_culling = false, }, animation_frame = 0, animation_timer = 0, - on_step = function(self, dtime) - local parent, storage = self:sanity_check() - - if parent then - self.animation_timer = self.animation_timer + dtime - if self.animation_timer >= 0.1 then - self.animation_timer = 0 - self.animation_frame = self.animation_frame + 1 - if self.animation_frame > mcl_burning.animation_frames - 1 then - self.animation_frame = 0 - end - self:update_frame(parent, storage) - end - else + on_activate = function(self) + self.object:set_sprite({x = 0, y = 0}, mcl_burning.animation_frames, 1.0 / mcl_burning.animation_frames) + end, + on_step = function(self) + if not self:sanity_check() then self.object:remove() end end, @@ -96,23 +97,15 @@ minetest.register_entity("mcl_burning:fire", { local parent = self.object:get_attach() if not parent then - return + return false end local storage = mcl_burning.get_storage(parent) if not storage or not storage.burn_time then - return + return false end - return parent, storage - end, - update_frame = function(self, parent, storage) - local frame_overlay = "^[opacity:180^[verticalframe:" .. mcl_burning.animation_frames .. ":" .. self.animation_frame - local fire_texture = "mcl_burning_entity_flame_animated.png" .. frame_overlay - self.object:set_properties({textures = {"blank.png", "blank.png", fire_texture, fire_texture, fire_texture, fire_texture}}) - if parent:is_player() then - parent:hud_change(storage.fire_hud_id, "text", "mcl_burning_hud_flame_animated.png" .. frame_overlay) - end + return true end, }) From 0e15accada59737c415a0920e93b65a39e5aa2ae Mon Sep 17 00:00:00 2001 From: NO11 Date: Sun, 19 Sep 2021 11:15:19 +0000 Subject: [PATCH 062/228] Enable fly in creative mode --- mods/MISC/mcl_privs/init.lua | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/mods/MISC/mcl_privs/init.lua b/mods/MISC/mcl_privs/init.lua index 63694ab11..5a23c00fb 100644 --- a/mods/MISC/mcl_privs/init.lua +++ b/mods/MISC/mcl_privs/init.lua @@ -3,3 +3,14 @@ local S = minetest.get_translator(minetest.get_current_modname()) minetest.register_privilege("maphack", { description = S("Can place and use advanced blocks like mob spawners, command blocks and barriers."), }) + +minetest.register_on_joinplayer(function(player) + local name = user:get_player_name() + local fly = false + if minetest.is_creative_enabled(name) then + fly = true + end + minetest.set_player_privs(name, { + fly = fly, + }) +end) From 18a83fa5d725c51563a2f35bf818b7c9b9041680 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sun, 19 Sep 2021 11:18:09 +0000 Subject: [PATCH 063/228] Fix typo --- mods/MISC/mcl_privs/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/MISC/mcl_privs/init.lua b/mods/MISC/mcl_privs/init.lua index 5a23c00fb..091ddb65e 100644 --- a/mods/MISC/mcl_privs/init.lua +++ b/mods/MISC/mcl_privs/init.lua @@ -5,7 +5,7 @@ minetest.register_privilege("maphack", { }) minetest.register_on_joinplayer(function(player) - local name = user:get_player_name() + local name = player:get_player_name() local fly = false if minetest.is_creative_enabled(name) then fly = true From fed43586f202cd71fe374560f90b42bef18361ec Mon Sep 17 00:00:00 2001 From: NO11 Date: Sun, 19 Sep 2021 11:28:07 +0000 Subject: [PATCH 064/228] fix typo --- mods/MISC/mcl_privs/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/MISC/mcl_privs/init.lua b/mods/MISC/mcl_privs/init.lua index 091ddb65e..1d1465676 100644 --- a/mods/MISC/mcl_privs/init.lua +++ b/mods/MISC/mcl_privs/init.lua @@ -6,7 +6,7 @@ minetest.register_privilege("maphack", { minetest.register_on_joinplayer(function(player) local name = player:get_player_name() - local fly = false + local fly = nil if minetest.is_creative_enabled(name) then fly = true end From f10d579d9c45bdddb7f2ae1935d74821b9c6a8b3 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sun, 19 Sep 2021 12:07:21 +0000 Subject: [PATCH 065/228] Only change fly priv on join if it wasn't revoked or granted --- mods/MISC/mcl_privs/init.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mods/MISC/mcl_privs/init.lua b/mods/MISC/mcl_privs/init.lua index 1d1465676..c63f7c5c5 100644 --- a/mods/MISC/mcl_privs/init.lua +++ b/mods/MISC/mcl_privs/init.lua @@ -6,6 +6,10 @@ minetest.register_privilege("maphack", { minetest.register_on_joinplayer(function(player) local name = player:get_player_name() + + local meta = player:get_meta() + if meta:get_int("fly_changed") == 1 then return end + local fly = nil if minetest.is_creative_enabled(name) then fly = true @@ -14,3 +18,13 @@ minetest.register_on_joinplayer(function(player) fly = fly, }) end) + +for _, action in pairs({ "grant", "revoke" }) do + minetest["register_on_priv_" .. action](function(name, _, priv) + if priv == "fly" then + local player = minetest.get_player_by_name(name) + local meta = player:get_meta() + meta:set_int("fly_changed", 1) + end + end) +end \ No newline at end of file From c6003398b5f4149b3eaffe585fde40e8374c721b Mon Sep 17 00:00:00 2001 From: NO11 Date: Sun, 19 Sep 2021 13:14:36 +0000 Subject: [PATCH 066/228] Remove chain armor recipes, because villagers spawn now --- mods/MISC/mcl_temp_helper_recipes/init.lua | 34 ---------------------- 1 file changed, 34 deletions(-) diff --git a/mods/MISC/mcl_temp_helper_recipes/init.lua b/mods/MISC/mcl_temp_helper_recipes/init.lua index 420cd6c2e..b7607946d 100644 --- a/mods/MISC/mcl_temp_helper_recipes/init.lua +++ b/mods/MISC/mcl_temp_helper_recipes/init.lua @@ -35,40 +35,6 @@ minetest.register_craft({ }, }) -minetest.register_craft({ - output = "mcl_armor:helmet_chain", - recipe = { - { "xpanes:bar_flat", "mcl_core:iron_ingot", "xpanes:bar_flat" }, - { "xpanes:bar_flat", "", "xpanes:bar_flat" }, - } -}) - -minetest.register_craft({ - output = "mcl_armor:leggings_chain", - recipe = { - { "xpanes:bar_flat", "mcl_core:iron_ingot", "xpanes:bar_flat" }, - { "xpanes:bar_flat", "", "xpanes:bar_flat" }, - { "xpanes:bar_flat", "", "xpanes:bar_flat" }, - } -}) - -minetest.register_craft({ - output = "mcl_armor:boots_chain", - recipe = { - { "xpanes:bar_flat", "", "xpanes:bar_flat" }, - { "xpanes:bar_flat", "", "xpanes:bar_flat" }, - } -}) - -minetest.register_craft({ - output = "mcl_armor:chestplate_chain", - recipe = { - { "xpanes:bar_flat", "", "xpanes:bar_flat" }, - { "xpanes:bar_flat", "mcl_core:iron_ingot", "xpanes:bar_flat" }, - { "xpanes:bar_flat", "xpanes:bar_flat", "xpanes:bar_flat" }, - } -}) - -- 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! From 3e54acce9db66ff7d330cbcffe20c8ae8ffcd91a Mon Sep 17 00:00:00 2001 From: AFCMS Date: Mon, 20 Sep 2021 09:47:24 +0200 Subject: [PATCH 067/228] fix emerald help text translation --- mods/ITEMS/mcl_core/locale/mcl_core.de.tr | 2 +- mods/ITEMS/mcl_core/locale/mcl_core.es.tr | 2 +- mods/ITEMS/mcl_core/locale/mcl_core.fr.tr | 2 +- mods/ITEMS/mcl_core/locale/mcl_core.pl.tr | 2 +- mods/ITEMS/mcl_core/locale/mcl_core.ru.tr | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index 0a1cbad37..b064cebbe 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Smaragd Emerald Ore=Smaragderz Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Smaragderz ist das Erz von Smaragden. Es ist sehr selten und kann nur einzeln gefunden werden, nicht in Ansammlungen. -Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Smaragde sind nicht besonders nützlich, aber man kann sie in der Fertigung durch Goldbarren eintauschen. +Emeralds are used in villager trades as currency.= Flint=Feuerstein Flint is a raw material.=Feuerstein ist ein Rohstoff. Flowing Lava=Fließende Lava diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.es.tr b/mods/ITEMS/mcl_core/locale/mcl_core.es.tr index 1e1029c0f..1937babd3 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.es.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.es.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Esmeralda Emerald Ore=Mena de esmeralda Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=El mineral esmeralda es el mineral de las esmeraldas. Es muy raro y se puede encontrar solo, no en grupos. -Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Las esmeraldas no son muy útiles por sí mismas, pero pueden cambiarse por lingotes de oro haciendo artesanías. +Emeralds are used in villager trades as currency.= Flint=Pedernal Flint is a raw material.=El pedernal es una materia prima. Flowing Lava=Lava que fluye diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr b/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr index 725025e48..64aadd6db 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Emeraude Emerald Ore=Minerai d'Emeraude Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Le minerai d'émeraude produit des émeraudes. Il est très rare et peut être trouvé seul, pas en filons. -Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Les émeraudes ne sont pas très utiles seules, mais elles peuvent être échangées contre des lingots d'or. +Emeralds are used in villager trades as currency.=Les émeraudes sont utilisées pour faire des échanges avec les villageois. Flint=Silex Flint is a raw material.=Le silex est une matière première. Flowing Lava=Lave qui coule diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr b/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr index 832a47830..68dfbd3d0 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Szmaragd Emerald Ore=Ruda szmaragdu Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Ruda szmaragdu jest bardzo rzadka i występuje samotnie, nie w grupach. -Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Szmaragdy nie są zbyt użyteczne same w sobie, ale można z nich wytworzyć sztabki złota. +Emeralds are used in villager trades as currency.= Flint=Krzemień Flint is a raw material.=Krzemień jest surowym materiałem. Flowing Lava=Płynąca lawa diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr b/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr index f93db7c2c..2d5b5462c 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Изумруд Emerald Ore=Изумрудная руда Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Изумрудная руда встречается очень редко и всегда по одному блоку. -Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Изумруды не очень полезны сами по себе, но их можно обменять на золотые слитки. +Emeralds are used in villager trades as currency.= Flint=Кремень Flint is a raw material.=Кремень это необработанный материал. Flowing Lava=Текущая лава From e0c7e938dea19a3df5efd9fa73b61c85d17640ed Mon Sep 17 00:00:00 2001 From: AFCMS Date: Mon, 20 Sep 2021 07:55:51 +0000 Subject: [PATCH 068/228] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'mods/ITEMS?= =?UTF-8?q?/mcl=5Fcore/locale/mcl=5Fcore.fr.tr'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mods/ITEMS/mcl_core/locale/mcl_core.fr.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr b/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr index 4d6a3ed43..64aadd6db 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Emeraude Emerald Ore=Minerai d'Emeraude Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Le minerai d'émeraude produit des émeraudes. Il est très rare et peut être trouvé seul, pas en filons. -Emeralds are used in villager trades as currency.=Les émeraudes ne sont pas très utiles seules, mais elles peuvent être échangées contre des lingots d'or. +Emeralds are used in villager trades as currency.=Les émeraudes sont utilisées pour faire des échanges avec les villageois. Flint=Silex Flint is a raw material.=Le silex est une matière première. Flowing Lava=Lave qui coule From e8134345d4476be032117723b5397926ff6d5199 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Mon, 20 Sep 2021 07:56:25 +0000 Subject: [PATCH 069/228] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'mods/ITEMS?= =?UTF-8?q?/mcl=5Fcore/locale/mcl=5Fcore.de.tr'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mods/ITEMS/mcl_core/locale/mcl_core.de.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index 8b75dfd40..b064cebbe 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Smaragd Emerald Ore=Smaragderz Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Smaragderz ist das Erz von Smaragden. Es ist sehr selten und kann nur einzeln gefunden werden, nicht in Ansammlungen. -Emeralds are used in villager trades as currency.=Smaragde sind nicht besonders nützlich, aber man kann sie in der Fertigung durch Goldbarren eintauschen. +Emeralds are used in villager trades as currency.= Flint=Feuerstein Flint is a raw material.=Feuerstein ist ein Rohstoff. Flowing Lava=Fließende Lava From b2af00db2201f1ddc20c0b9650c983402aaa10b7 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Mon, 20 Sep 2021 07:57:04 +0000 Subject: [PATCH 070/228] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'mods/ITEMS?= =?UTF-8?q?/mcl=5Fcore/locale/mcl=5Fcore.es.tr'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mods/ITEMS/mcl_core/locale/mcl_core.es.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.es.tr b/mods/ITEMS/mcl_core/locale/mcl_core.es.tr index d77f45dc2..1937babd3 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.es.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.es.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Esmeralda Emerald Ore=Mena de esmeralda Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=El mineral esmeralda es el mineral de las esmeraldas. Es muy raro y se puede encontrar solo, no en grupos. -Emeralds are used in villager trades as currency.=Las esmeraldas no son muy útiles por sí mismas, pero pueden cambiarse por lingotes de oro haciendo artesanías. +Emeralds are used in villager trades as currency.= Flint=Pedernal Flint is a raw material.=El pedernal es una materia prima. Flowing Lava=Lava que fluye From e36a8c5acf48d473db9ae5807b176b94a779e15c Mon Sep 17 00:00:00 2001 From: AFCMS Date: Mon, 20 Sep 2021 07:58:25 +0000 Subject: [PATCH 071/228] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'mods/ITEMS?= =?UTF-8?q?/mcl=5Fcore/locale/mcl=5Fcore.pl.tr'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mods/ITEMS/mcl_core/locale/mcl_core.pl.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr b/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr index f8dbbde6b..68dfbd3d0 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Szmaragd Emerald Ore=Ruda szmaragdu Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Ruda szmaragdu jest bardzo rzadka i występuje samotnie, nie w grupach. -Emeralds are used in villager trades as currency.=Szmaragdy nie są zbyt użyteczne same w sobie, ale można z nich wytworzyć sztabki złota. +Emeralds are used in villager trades as currency.= Flint=Krzemień Flint is a raw material.=Krzemień jest surowym materiałem. Flowing Lava=Płynąca lawa From b0cf07a020ba353545465b8909fd88ad8725c4cd Mon Sep 17 00:00:00 2001 From: AFCMS Date: Mon, 20 Sep 2021 07:59:00 +0000 Subject: [PATCH 072/228] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20'mods/ITEMS?= =?UTF-8?q?/mcl=5Fcore/locale/mcl=5Fcore.ru.tr'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mods/ITEMS/mcl_core/locale/mcl_core.ru.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr b/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr index ad9d863b2..2d5b5462c 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Изумруд Emerald Ore=Изумрудная руда Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Изумрудная руда встречается очень редко и всегда по одному блоку. -Emeralds are used in villager trades as currency.=Изумруды не очень полезны сами по себе, но их можно обменять на золотые слитки. +Emeralds are used in villager trades as currency.= Flint=Кремень Flint is a raw material.=Кремень это необработанный материал. Flowing Lava=Текущая лава From 89e90b13eb53085a801c37c639a796a0a917cac0 Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 20 Sep 2021 14:16:59 +0000 Subject: [PATCH 073/228] Use on_newplayer --- mods/MISC/mcl_privs/init.lua | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/mods/MISC/mcl_privs/init.lua b/mods/MISC/mcl_privs/init.lua index c63f7c5c5..302557f86 100644 --- a/mods/MISC/mcl_privs/init.lua +++ b/mods/MISC/mcl_privs/init.lua @@ -4,12 +4,9 @@ minetest.register_privilege("maphack", { description = S("Can place and use advanced blocks like mob spawners, command blocks and barriers."), }) -minetest.register_on_joinplayer(function(player) +minetest.register_on_newplayer(function(player) local name = player:get_player_name() - local meta = player:get_meta() - if meta:get_int("fly_changed") == 1 then return end - local fly = nil if minetest.is_creative_enabled(name) then fly = true @@ -18,13 +15,3 @@ minetest.register_on_joinplayer(function(player) fly = fly, }) end) - -for _, action in pairs({ "grant", "revoke" }) do - minetest["register_on_priv_" .. action](function(name, _, priv) - if priv == "fly" then - local player = minetest.get_player_by_name(name) - local meta = player:get_meta() - meta:set_int("fly_changed", 1) - end - end) -end \ No newline at end of file From df1d8077e6123cef815bc4f30dd02838b9b84dec Mon Sep 17 00:00:00 2001 From: NO11 Date: Tue, 21 Sep 2021 18:07:36 +0000 Subject: [PATCH 074/228] Some fixes for mcl_beds - remove enable_bed_night_skip setting (mcl_playersSleepingPercentage setting can be used to enable disable night skip) - make it possible to change mcl_playersSleepingPercentage ingame - fix weird bug which allowed only numbers <= 0 --- mods/ITEMS/mcl_beds/functions.lua | 39 +++++++++++++++---------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 01ccec851..e7306b40a 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -9,36 +9,36 @@ local weather_mod = minetest.get_modpath("mcl_weather") local explosions_mod = minetest.get_modpath("mcl_explosions") local spawn_mod = minetest.get_modpath("mcl_spawn") local worlds_mod = minetest.get_modpath("mcl_worlds") -local players_in_bed_setting = tonumber(minetest.settings:get("mcl_playersSleepingPercentage")) -- Helper functions local function get_look_yaw(pos) local n = minetest.get_node(pos) - if n.param2 == 1 then - return math.pi / 2, n.param2 - elseif n.param2 == 3 then - return -math.pi / 2, n.param2 - elseif n.param2 == 0 then - return math.pi, n.param2 + local param = n.param2 + if param == 1 then + return math.pi / 2, param + elseif param == 3 then + return -math.pi / 2, param + elseif param == 0 then + return math.pi, param else - return 0, n.param2 + return 0, param end end +local function players_in_bed_setting() + return tonumber(minetest.settings:get("mcl_playersSleepingPercentage")) +end + local function is_night_skip_enabled() - local enable_night_skip = minetest.settings:get_bool("enable_bed_night_skip") - if enable_night_skip == nil then - enable_night_skip = true - end - return enable_night_skip + return players_in_bed_setting() <= 100 end local function check_in_beds(players) if not players then players = minetest.get_connected_players() end - return players_in_bed_setting <= (#mcl_beds.player * 100) / #players + return players_in_bed_setting() <= (player_in_bed * 100) / #players end -- These monsters do not prevent sleep @@ -190,8 +190,8 @@ end local function update_formspecs(finished, ges) local ges = ges or #minetest.get_connected_players() local form_n = "size[12,5;true]" - local all_in_bed = players_in_bed_setting <= (player_in_bed * 100) / ges - local night_skip = is_night_skip_enabled() and players_in_bed_setting <= 100 + local all_in_bed = players_in_bed_setting() <= (player_in_bed * 100) / ges + local night_skip = is_night_skip_enabled() local button_leave = "button_exit[4,3;4,0.75;leave;"..F(S("Leave bed")).."]" local button_abort = "button_exit[4,3;4,0.75;leave;"..F(S("Abort sleep")).."]" local bg_presleep = "bgcolor[#00000080;true]" @@ -204,7 +204,7 @@ local function update_formspecs(finished, ges) return elseif not is_sp then local text = S("Players in bed: @1/@2", player_in_bed, ges) - if not night_skip or players_in_bed_setting > 100 then + if not night_skip then text = text .. "\n" .. S("Note: Night skip is disabled.") form_n = form_n .. bg_presleep form_n = form_n .. button_leave @@ -214,10 +214,10 @@ local function update_formspecs(finished, ges) form_n = form_n .. button_abort else local comment = "You will fall asleep when " - if players_in_bed_setting == 100 then + if players_in_bed_setting() == 100 then comment = S(comment .. "all players are in bed.") else - comment = S(comment .. "@1% of all players are in bed.", players_in_bed_setting) + comment = S(comment .. "@1% of all players are in bed.", players_in_bed_setting()) end text = text .. "\n" .. comment form_n = form_n .. bg_presleep @@ -347,7 +347,6 @@ function mcl_beds.on_rightclick(pos, player, is_top) end end - -- Callbacks minetest.register_on_joinplayer(function(player) local meta = player:get_meta() From 71f448537cb523c9f8287b630ccce6f1ddd91cca Mon Sep 17 00:00:00 2001 From: NO11 Date: Tue, 21 Sep 2021 18:14:24 +0000 Subject: [PATCH 075/228] Remove unused setting from settingtypes.txt --- settingtypes.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/settingtypes.txt b/settingtypes.txt index 89e11833f..542711675 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -36,11 +36,9 @@ enable_bed_respawn (Respawn at bed) bool true # How many players have to sleep to skip the night, in percent. # Setting to 0 will mean 1 player is always enough to skip the night. Setting above 100 will prevent skipping the night. # 100 by default. +# The setting can be changed ingame using `/set mcl_playersSleepingPercentage ` mcl_playersSleepingPercentage (Players Sleeping Percentage) int 100 -# 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 From e83438e42cb677e6336f52e5e17973fcbef5663c Mon Sep 17 00:00:00 2001 From: NO11 Date: Tue, 21 Sep 2021 18:19:07 +0000 Subject: [PATCH 076/228] Update mcl_bed README.txt --- mods/ITEMS/mcl_beds/README.txt | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/mods/ITEMS/mcl_beds/README.txt b/mods/ITEMS/mcl_beds/README.txt index cda6ebd92..34b493702 100644 --- a/mods/ITEMS/mcl_beds/README.txt +++ b/mods/ITEMS/mcl_beds/README.txt @@ -12,15 +12,7 @@ Authors of media (textures) BlockMen (CC BY-SA 3.0) This mod adds a bed to Minetest which allows to skip the night. -To sleep, rightclick the bed. If playing in singleplayer mode the night gets skipped -immediately. If playing multiplayer you get shown how many other players are in bed too, -if all players are sleeping the night gets skipped. The night skip can be forced if more -than 50% of the players are lying in bed and use this option. - -Another feature is a controlled respawning. If you have slept in bed (not just lying in -it) your respawn point is set to the beds location and you will respawn there after +To sleep, rightclick the bed. +Another feature is a controlled respawning. If you have slept in bed your respawn point is set to the beds location and you will respawn there after death. -You can disable the respawn at beds by setting "enable_bed_respawn = false" in -minetest.conf. -You can disable the night skip feature by setting "enable_bed_night_skip = false" in -minetest.conf or by using the /set command in-game. +Use the mcl_playersSleepingPercentage setting to enable/disable night skipping or set a percentage of how many players need to sleep to skip the night. \ No newline at end of file From 8697b38d60325f289eb75fd19b83e86e877946bc Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 27 Sep 2021 20:00:11 +0000 Subject: [PATCH 077/228] Remove on_newplayer ... --- mods/MISC/mcl_privs/init.lua | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/mods/MISC/mcl_privs/init.lua b/mods/MISC/mcl_privs/init.lua index 302557f86..c63f7c5c5 100644 --- a/mods/MISC/mcl_privs/init.lua +++ b/mods/MISC/mcl_privs/init.lua @@ -4,9 +4,12 @@ minetest.register_privilege("maphack", { description = S("Can place and use advanced blocks like mob spawners, command blocks and barriers."), }) -minetest.register_on_newplayer(function(player) +minetest.register_on_joinplayer(function(player) local name = player:get_player_name() + local meta = player:get_meta() + if meta:get_int("fly_changed") == 1 then return end + local fly = nil if minetest.is_creative_enabled(name) then fly = true @@ -15,3 +18,13 @@ minetest.register_on_newplayer(function(player) fly = fly, }) end) + +for _, action in pairs({ "grant", "revoke" }) do + minetest["register_on_priv_" .. action](function(name, _, priv) + if priv == "fly" then + local player = minetest.get_player_by_name(name) + local meta = player:get_meta() + meta:set_int("fly_changed", 1) + end + end) +end \ No newline at end of file From 03be73656648136fdabff2dd68c6e44ed184f475 Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 27 Sep 2021 20:13:12 +0000 Subject: [PATCH 078/228] Dont skip night if no players are in bed --- 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 e7306b40a..e2bece033 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -38,6 +38,9 @@ local function check_in_beds(players) if not players then players = minetest.get_connected_players() end + if player_in_bed < 0 then + return false + end return players_in_bed_setting() <= (player_in_bed * 100) / #players end From 16c73c1cb652b02f77e6140e9ad41f602d5f29aa Mon Sep 17 00:00:00 2001 From: NO11 Date: Tue, 28 Sep 2021 13:16:19 +0000 Subject: [PATCH 079/228] Add forgotten `=` --- 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 e2bece033..062219294 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -38,7 +38,7 @@ local function check_in_beds(players) if not players then players = minetest.get_connected_players() end - if player_in_bed < 0 then + if player_in_bed <= 0 then return false end return players_in_bed_setting() <= (player_in_bed * 100) / #players From e9437e9e1e623a493ecf2abbac91fefd775c5aa4 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 29 Sep 2021 21:06:51 +0200 Subject: [PATCH 080/228] fix crash then using function in `_mcl_armor_[texture, preview]` tool field --- mods/ITEMS/mcl_enchanting/engine.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index d2a749947..6050aeed2 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -270,8 +270,14 @@ function mcl_enchanting.initialize() new_def.groups.not_in_creative_inventory = 1 new_def.groups.not_in_craft_guide = 1 new_def.groups.enchanted = 1 - new_def._mcl_armor_texture = new_def._mcl_armor_texture and new_def._mcl_armor_texture .. mcl_enchanting.overlay - new_def._mcl_armor_preview = new_def._mcl_armor_preview and new_def._mcl_armor_preview .. mcl_enchanting.overlay + + if new_def._mcl_armor_texture and not type(new_def._mcl_armor_texture) == "function" then + new_def._mcl_armor_texture = new_def._mcl_armor_texture .. mcl_enchanting.overlay + end + if new_def._mcl_armor_preview and not type(new_def._mcl_armor_preview) == "function" then + new_def._mcl_armor_preview = new_def._mcl_armor_preview .. mcl_enchanting.overlay + end + new_def._mcl_enchanting_enchanted_tool = new_name new_def.after_use = get_after_use_callback(itemdef) local register_list = register_item_list From a410d173069baf3d38f5fe5a704e4db562e5dd8a Mon Sep 17 00:00:00 2001 From: NO11 Date: Thu, 30 Sep 2021 20:14:13 +0000 Subject: [PATCH 081/228] Fix that all of new players' default_privs are removed --- mods/MISC/mcl_privs/init.lua | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/mods/MISC/mcl_privs/init.lua b/mods/MISC/mcl_privs/init.lua index c63f7c5c5..f06ff3582 100644 --- a/mods/MISC/mcl_privs/init.lua +++ b/mods/MISC/mcl_privs/init.lua @@ -6,7 +6,6 @@ minetest.register_privilege("maphack", { minetest.register_on_joinplayer(function(player) local name = player:get_player_name() - local meta = player:get_meta() if meta:get_int("fly_changed") == 1 then return end @@ -14,12 +13,12 @@ minetest.register_on_joinplayer(function(player) if minetest.is_creative_enabled(name) then fly = true end - minetest.set_player_privs(name, { - fly = fly, - }) + local player_privs = minetest.get_player_privs(name) + player_privs.fly = fly + minetest.set_player_privs(name, player_privs) end) -for _, action in pairs({ "grant", "revoke" }) do +for _, action in pairs({"grant", "revoke"}) do minetest["register_on_priv_" .. action](function(name, _, priv) if priv == "fly" then local player = minetest.get_player_by_name(name) From 8e3f9d216944d258cd385223db037ef1882deb63 Mon Sep 17 00:00:00 2001 From: NO11 Date: Thu, 9 Sep 2021 09:22:27 +0000 Subject: [PATCH 082/228] add basic lightning API --- mods/ENVIRONMENT/lightning/init.lua | 75 ++++++++++++++++++----------- 1 file changed, 46 insertions(+), 29 deletions(-) diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index 3d5955d6e..3230f0b0a 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -24,13 +24,14 @@ local get_objects_inside_radius = minetest.get_objects_inside_radius local get_item_group = minetest.get_item_group lightning = { - interval_low = 17, - interval_high = 503, - range_h = 100, - range_v = 50, - size = 100, - -- disable this to stop lightning mod from striking - auto = true, + interval_low = 17, + interval_high = 503, + range_h = 100, + range_v = 50, + size = 100, + -- disable this to stop lightning mod from striking + auto = true, + on_strike_functions = {}, } local rng = PcgRandom(32321123312123) @@ -54,6 +55,18 @@ end minetest.register_globalstep(revertsky) +-- lightning strike API + +-- See README.md +--[[ + lightning.register_on_strike(function(pos, pos2, objects) + -- code + end) +]] +function lightning.register_on_strike(func) + table.insert(lightning.on_strike_functions, func) +end + -- select a random strike point, midpoint local function choose_pos(pos) if not pos then @@ -79,14 +92,14 @@ local function choose_pos(pos) pos.z = math.floor(pos.z - (lightning.range_h / 2) + rng:next(1, lightning.range_h)) end - local b, pos2 = line_of_sight(pos, {x = pos.x, y = pos.y - lightning.range_v, z = pos.z}, 1) + local b, pos2 = line_of_sight(pos, { x = pos.x, y = pos.y - lightning.range_v, z = pos.z }, 1) -- nothing but air found if b then return nil, nil end - local n = get_node({x = pos2.x, y = pos2.y - 1/2, z = pos2.z}) + local n = get_node({ x = pos2.x, y = pos2.y - 1/2, z = pos2.z }) if n.name == "air" or n.name == "ignore" then return nil, nil end @@ -94,7 +107,6 @@ local function choose_pos(pos) return pos, pos2 end --- lightning strike API -- * pos: optional, if not given a random pos will be chosen -- * returns: bool - success if a strike happened function lightning.strike(pos) @@ -108,21 +120,30 @@ function lightning.strike(pos) if not pos then return false end + local objects = get_objects_inside_radius(pos2, 3.5) + if lightning.on_strike_functions then + for _, func in pairs(lightning.on_strike_functions) do + func(pos, pos2, objects) + end + end +end + + +lightning.register_on_strike(function(pos, pos2, objects) + local particle_pos = vector.offset(pos2, 0, (lightning.size / 2) + 0.5, 0) + local particle_size = lightning.size * 10 + local time = 0.2 add_particlespawner({ amount = 1, - time = 0.2, + time = time, -- make it hit the top of a block exactly with the bottom - minpos = {x = pos2.x, y = pos2.y + (lightning.size / 2) + 1/2, z = pos2.z }, - maxpos = {x = pos2.x, y = pos2.y + (lightning.size / 2) + 1/2, z = pos2.z }, - minvel = {x = 0, y = 0, z = 0}, - maxvel = {x = 0, y = 0, z = 0}, - minacc = {x = 0, y = 0, z = 0}, - maxacc = {x = 0, y = 0, z = 0}, - minexptime = 0.2, - maxexptime = 0.2, - minsize = lightning.size * 10, - maxsize = lightning.size * 10, + minpos = particle_pos, + maxpos = particle_pos, + minexptime = time, + maxexptime = time, + minsize = particle_size, + maxsize = particle_size, collisiondetection = true, vertical = true, -- to make it appear hitting the node that will get set on fire, make sure @@ -135,10 +156,7 @@ function lightning.strike(pos) sound_play({ name = "lightning_thunder", gain = 10 }, { pos = pos, max_hear_distance = 500 }, true) -- damage nearby objects, transform mobs - -- TODO: use an API insteed of hardcoding this behaviour - local objs = get_objects_inside_radius(pos2, 3.5) - for o=1, #objs do - local obj = objs[o] + for _, obj in pairs(objects) do local lua = obj:get_luaentity() -- pig → zombie pigman (no damage) if lua and lua.name == "mobs_mc:pig" then @@ -155,7 +173,7 @@ function lightning.strike(pos) end obj:set_properties({textures = lua.base_texture}) -- villager → witch (no damage) - --elseif lua and lua.name == "mobs_mc:villager" then + -- elseif lua and lua.name == "mobs_mc:villager" then -- Witches are incomplete, this code is unused -- TODO: Enable this code when witches are working. --[[ @@ -172,7 +190,7 @@ function lightning.strike(pos) obj:set_yaw(rot) -- Other objects: Just damage else - mcl_util.deal_damage(obj, 5, {type = "lightning_bolt"}) + mcl_util.deal_damage(obj, 5, { type = "lightning_bolt" }) end end @@ -223,8 +241,7 @@ function lightning.strike(pos) end end end - -end +end) -- if other mods disable auto lightning during initialization, don't trigger the first lightning. after(5, function(dtime) From e4af02ea526ef32da38ca7094f13b1c7c128bc83 Mon Sep 17 00:00:00 2001 From: NO11 Date: Thu, 9 Sep 2021 09:54:58 +0000 Subject: [PATCH 083/228] Add function to replace mobs --- mods/CORE/mcl_util/init.lua | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index a7504af08..363b9b5fe 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -538,3 +538,12 @@ function mcl_util.get_object_name(object) return luaentity.nametag and luaentity.nametag ~= "" and luaentity.nametag or luaentity.description or luaentity.name end end + +function mcl_util.replace_mob(obj, mob) + local rot = obj:get_yaw() + local pos = obj:get_pos() + obj:remove() + obj = minetest.add_entity(pos, mob) + obj:set_yaw(rot) + return obj +end From 463fe2af5f3343dcecefec9eb5147f34ec04cb3d Mon Sep 17 00:00:00 2001 From: NO11 Date: Thu, 9 Sep 2021 09:57:36 +0000 Subject: [PATCH 084/228] use mcl_util.replace_mob function to simplify lightning code --- mods/ENVIRONMENT/lightning/init.lua | 38 +++++++---------------------- 1 file changed, 9 insertions(+), 29 deletions(-) diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index 3230f0b0a..5568e63fc 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -128,8 +128,6 @@ function lightning.strike(pos) end end - - lightning.register_on_strike(function(pos, pos2, objects) local particle_pos = vector.offset(pos2, 0, (lightning.size / 2) + 0.5, 0) local particle_size = lightning.size * 10 @@ -158,37 +156,19 @@ lightning.register_on_strike(function(pos, pos2, objects) -- damage nearby objects, transform mobs for _, obj in pairs(objects) do local lua = obj:get_luaentity() - -- pig → zombie pigman (no damage) if lua and lua.name == "mobs_mc:pig" then - local rot = obj:get_yaw() - obj:remove() - obj = add_entity(pos2, "mobs_mc:pigman") - obj:set_yaw(rot) - -- mooshroom: toggle color red/brown (no damage) + mcl_util.replace_mob(obj, "mobs_mc:pigman") elseif lua and 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 (no damage) - -- elseif lua and 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) - ]] - -- charged creeper + obj:set_properties({ textures = lua.base_texture }) + elseif lua and lua.name == "mobs_mc:villager" then + mcl_util.replace_mob(obj, "mobs_mc:witch") elseif lua and lua.name == "mobs_mc:creeper" then - local rot = obj:get_yaw() - obj:remove() - obj = add_entity(pos2, "mobs_mc:creeper_charged") - obj:set_yaw(rot) - -- Other objects: Just damage + mcl_util.replace_mob(obj, "mobs_mc:creeper_charged") else mcl_util.deal_damage(obj, 5, { type = "lightning_bolt" }) end @@ -204,7 +184,7 @@ lightning.register_on_strike(function(pos, pos2, objects) local name = player:get_player_name() if ps[name] == nil then ps[name] = {p = player, sky = sky} - mcl_weather.skycolor.add_layer("lightning", {{r=255,g=255,b=255}}, true) + mcl_weather.skycolor.add_layer("lightning", { { r = 255, g = 255, b = 255 } }, true) mcl_weather.skycolor.active = true end end @@ -219,7 +199,7 @@ lightning.register_on_strike(function(pos, pos2, objects) if rng:next(1,100) <= 3 then skeleton_lightning = true end - if get_item_group(get_node({x = pos2.x, y = pos2.y - 1, z = pos2.z}).name, "liquid") < 1 then + if get_item_group(get_node({ x = pos2.x, y = pos2.y - 1, z = pos2.z }).name, "liquid") < 1 then if get_node(pos2).name == "air" then -- Low chance for a lightning to spawn skeleton horse + skeletons if skeleton_lightning then @@ -228,7 +208,7 @@ lightning.register_on_strike(function(pos, pos2, objects) 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 = { x=math.cos(angle),y=0,z=math.sin(angle) } posadd = vector.normalize(posadd) local mob = add_entity(vector.add(pos2, posadd), "mobs_mc:skeleton") mob:set_yaw(angle-math.pi/2) @@ -237,7 +217,7 @@ lightning.register_on_strike(function(pos, pos2, objects) -- Cause a fire else - set_node(pos2, {name = "mcl_fire:fire"}) + set_node(pos2, { name = "mcl_fire:fire" }) end end end From fe91d7f3e0a5c629cb1f3abad593671ee851ee39 Mon Sep 17 00:00:00 2001 From: NO11 Date: Thu, 9 Sep 2021 10:07:45 +0000 Subject: [PATCH 085/228] use mcl_util.replace_mob function to simplify dispenser code --- mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 82d53c806..47acacbb9 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -203,12 +203,8 @@ local dispenserdef = { else minetest.add_item(droppos, mobs_mc.items.mushroom_red .. " 5") end - local oldyaw = obj:get_yaw() - obj:remove() - local cow = minetest.add_entity(pos, "mobs_mc:cow") - cow:set_yaw(oldyaw) - obj = cow - entity = cow:get_luaentity() + obj = mcl_util.replace_mob(obj, "mobs_mc:cow") + entity = obj:get_luaentity() used = true end if used then From 9188467a6adfdc6bd8edfeb8f156c510ce7ab1b0 Mon Sep 17 00:00:00 2001 From: NO11 Date: Thu, 9 Sep 2021 12:31:19 +0000 Subject: [PATCH 086/228] add API.md for lightning mod --- mods/ENVIRONMENT/lightning/API.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 mods/ENVIRONMENT/lightning/API.md diff --git a/mods/ENVIRONMENT/lightning/API.md b/mods/ENVIRONMENT/lightning/API.md new file mode 100644 index 000000000..6a4dd11cf --- /dev/null +++ b/mods/ENVIRONMENT/lightning/API.md @@ -0,0 +1,31 @@ +# lightning +Lightning mod for MineClone2 with the following API: + +## lightning.register_on_strike(function(pos, pos2, objects)) +Custom function called when a lightning strikes. + +* `pos`: impact position +* `pos2`: rounded node position where fire is placed +* `objects`: table with ObjectRefs of all objects within a radius of 3.5 around pos2 + +## lightning.strike(pos) +Let a lightning strike. + +* pos: optional, if not given a random pos will be chosen +* returns: bool - success if a strike happened + + +### Examples: + +``` +lightning.register_on_strike(function(pos, pos2, objects) + for _, obj in pairs(objects) do + obj:remove() + end + minetest.add_entity(pos, "mobs_mc:sheep") +end) + +minetest.register_on_respawnplayer(function(player) + lightning.strike(player:get_pos()) +end) +``` \ No newline at end of file From 72ea9069bd848eb4bcbd030bc32b859370c5cef5 Mon Sep 17 00:00:00 2001 From: NO11 Date: Thu, 9 Sep 2021 12:35:05 +0000 Subject: [PATCH 087/228] correct lightning API.md a bit --- mods/ENVIRONMENT/lightning/API.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ENVIRONMENT/lightning/API.md b/mods/ENVIRONMENT/lightning/API.md index 6a4dd11cf..ad4f0a3b4 100644 --- a/mods/ENVIRONMENT/lightning/API.md +++ b/mods/ENVIRONMENT/lightning/API.md @@ -11,8 +11,8 @@ Custom function called when a lightning strikes. ## lightning.strike(pos) Let a lightning strike. -* pos: optional, if not given a random pos will be chosen -* returns: bool - success if a strike happened +* `pos`: optional, if not given a random pos will be chosen +* `returns`: bool - success if a strike happened ### Examples: From 03829dd51884c92fae3d8ee0dd04f3dad1155dec Mon Sep 17 00:00:00 2001 From: NO11 Date: Thu, 9 Sep 2021 12:35:50 +0000 Subject: [PATCH 088/228] fix typo --- mods/ENVIRONMENT/lightning/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index 5568e63fc..b234092af 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -57,7 +57,7 @@ minetest.register_globalstep(revertsky) -- lightning strike API --- See README.md +-- See API.md --[[ lightning.register_on_strike(function(pos, pos2, objects) -- code From 0584d16569103bb5cd15c5e5041efb842d5b8784 Mon Sep 17 00:00:00 2001 From: NO11 Date: Thu, 9 Sep 2021 13:21:33 +0000 Subject: [PATCH 089/228] add lightning API support for mobs --- mods/ENVIRONMENT/lightning/init.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index b234092af..83494462f 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -156,6 +156,10 @@ lightning.register_on_strike(function(pos, pos2, objects) -- damage nearby objects, transform mobs for _, obj in pairs(objects) do local lua = obj:get_luaentity() + if lua and lua._on_strike then + lua._on_strike(lua, pos, pos2, objects) + end + -- remove this when mob API is done if lua and lua.name == "mobs_mc:pig" then mcl_util.replace_mob(obj, "mobs_mc:pigman") elseif lua and lua.name == "mobs_mc:mooshroom" then From 9ccf8de606c4ce4e6b903ac3ce6727d01f3d5160 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sat, 9 Oct 2021 14:41:56 +0000 Subject: [PATCH 090/228] Fix crash on startup if mcl_playersSleepingPercentage is not defined (#1874) --- 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 062219294..b8478fc1f 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -27,7 +27,7 @@ local function get_look_yaw(pos) end local function players_in_bed_setting() - return tonumber(minetest.settings:get("mcl_playersSleepingPercentage")) + return tonumber(minetest.settings:get("mcl_playersSleepingPercentage")) or 100 end local function is_night_skip_enabled() From 1c458a2e7258565e0d98050263cf98ec17607c71 Mon Sep 17 00:00:00 2001 From: epCode Date: Fri, 15 Oct 2021 12:00:37 -0700 Subject: [PATCH 091/228] Add crossbows --- mods/ITEMS/mcl_bows/arrow.lua | 6 +- mods/ITEMS/mcl_bows/crossbow.lua | 454 ++++++++ mods/ITEMS/mcl_bows/init.lua | 6 + .../ITEMS/mcl_bows/models/mcl_bows_rocket.b3d | Bin 0 -> 11758 bytes .../ITEMS/mcl_bows/models/mcl_bows_rocket.mtl | 10 + .../ITEMS/mcl_bows/models/mcl_bows_rocket.obj | 1016 +++++++++++++++++ mods/ITEMS/mcl_bows/rocket.lua | 706 ++++++++++++ .../sounds/mcl_bows_crossbow_drawback_0.ogg | Bin 0 -> 13529 bytes .../sounds/mcl_bows_crossbow_drawback_1.ogg | Bin 0 -> 13401 bytes .../sounds/mcl_bows_crossbow_drawback_2.ogg | Bin 0 -> 10139 bytes .../sounds/mcl_bows_crossbow_load.ogg | Bin 0 -> 7627 bytes .../sounds/mcl_bows_crossbow_shoot.ogg | Bin 0 -> 9767 bytes .../mcl_bows/sounds/mcl_bows_firework.ogg | Bin 0 -> 42143 bytes .../sounds/mcl_bows_firework_soft.ogg | Bin 0 -> 55786 bytes .../mcl_bows/textures/mcl_bows_crossbow.png | Bin 0 -> 2311 bytes .../mcl_bows/textures/mcl_bows_crossbow_0.png | Bin 0 -> 2369 bytes .../mcl_bows/textures/mcl_bows_crossbow_1.png | Bin 0 -> 2383 bytes .../mcl_bows/textures/mcl_bows_crossbow_2.png | Bin 0 -> 2362 bytes .../mcl_bows/textures/mcl_bows_crossbow_3.png | Bin 0 -> 2794 bytes .../textures/mcl_bows_firework_blue.png | Bin 0 -> 630 bytes .../textures/mcl_bows_firework_green.png | Bin 0 -> 627 bytes .../textures/mcl_bows_firework_red.png | Bin 0 -> 622 bytes .../textures/mcl_bows_firework_white.png | Bin 0 -> 1577 bytes .../textures/mcl_bows_firework_yellow.png | Bin 0 -> 1717 bytes .../mcl_bows/textures/mcl_bows_rocket.png | Bin 0 -> 2133 bytes .../textures/mcl_bows_rocket_particle.png | Bin 0 -> 4675 bytes mods/ITEMS/mcl_enchanting/enchantments.lua | 14 +- mods/ITEMS/mcl_mobspawners/init.lua | 3 +- mods/ITEMS/mcl_potions/tipped_arrow.lua | 2 +- mods/PLAYER/mcl_player/init.lua | 6 +- mods/PLAYER/mcl_playerplus/init.lua | 13 + 31 files changed, 2221 insertions(+), 15 deletions(-) create mode 100644 mods/ITEMS/mcl_bows/crossbow.lua create mode 100644 mods/ITEMS/mcl_bows/models/mcl_bows_rocket.b3d create mode 100644 mods/ITEMS/mcl_bows/models/mcl_bows_rocket.mtl create mode 100644 mods/ITEMS/mcl_bows/models/mcl_bows_rocket.obj create mode 100644 mods/ITEMS/mcl_bows/rocket.lua create mode 100644 mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_0.ogg create mode 100644 mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_1.ogg create mode 100644 mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_2.ogg create mode 100644 mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_load.ogg create mode 100644 mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_shoot.ogg create mode 100644 mods/ITEMS/mcl_bows/sounds/mcl_bows_firework.ogg create mode 100644 mods/ITEMS/mcl_bows/sounds/mcl_bows_firework_soft.ogg create mode 100644 mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow.png create mode 100644 mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_0.png create mode 100644 mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_1.png create mode 100644 mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_2.png create mode 100644 mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_3.png create mode 100644 mods/ITEMS/mcl_bows/textures/mcl_bows_firework_blue.png create mode 100644 mods/ITEMS/mcl_bows/textures/mcl_bows_firework_green.png create mode 100644 mods/ITEMS/mcl_bows/textures/mcl_bows_firework_red.png create mode 100644 mods/ITEMS/mcl_bows/textures/mcl_bows_firework_white.png create mode 100644 mods/ITEMS/mcl_bows/textures/mcl_bows_firework_yellow.png create mode 100644 mods/ITEMS/mcl_bows/textures/mcl_bows_rocket.png create mode 100644 mods/ITEMS/mcl_bows/textures/mcl_bows_rocket_particle.png diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 9a22ee622..343707617 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -43,7 +43,7 @@ S("An arrow fired from a bow has a regular damage of 1-9. At full charge, there' S("Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons."), _doc_items_usagehelp = S("To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it."), inventory_image = "mcl_bows_arrow_inv.png", - groups = { ammo=1, ammo_bow=1, ammo_bow_regular=1 }, + groups = { ammo=1, ammo_bow=1, ammo_bow_regular=1, ammo_crossbow=1 }, _on_dispense = function(itemstack, dispenserpos, droppos, dropnode, dropdir) -- Shoot arrow local shootpos = vector.add(dispenserpos, vector.multiply(dropdir, 0.51)) @@ -324,7 +324,9 @@ function ARROW_ENTITY.on_step(self, dtime) end if not obj:is_player() then mcl_burning.extinguish(self.object) - self.object:remove() + if self._piercing == 0 then + self.object:remove() + end end return end diff --git a/mods/ITEMS/mcl_bows/crossbow.lua b/mods/ITEMS/mcl_bows/crossbow.lua new file mode 100644 index 000000000..e3124156b --- /dev/null +++ b/mods/ITEMS/mcl_bows/crossbow.lua @@ -0,0 +1,454 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +mcl_bows_s = {} + +-- local arrows = { +-- ["mcl_bows:arrow"] = "mcl_bows:arrow_entity", +-- } + +local GRAVITY = 9.81 +local BOW_DURABILITY = 385 + +-- Charging time in microseconds +local _BOW_CHARGE_TIME_HALF = 350000 -- bow level 1 +local _BOW_CHARGE_TIME_FULL = 900000 -- bow level 2 (full charge) + +local BOW_CHARGE_TIME_HALF = 350000 -- bow level 1 +local BOW_CHARGE_TIME_FULL = 900000 -- bow level 2 (full charge) + +-- Factor to multiply with player speed while player uses bow +-- This emulates the sneak speed. +local PLAYER_USE_CROSSBOW_SPEED = tonumber(minetest.settings:get("movement_speed_crouch")) / tonumber(minetest.settings:get("movement_speed_walk")) + +-- TODO: Use Minecraft speed (ca. 53 m/s) +-- Currently nerfed because at full speed the arrow would easily get out of the range of the loaded map. +local BOW_MAX_SPEED = 68 + +local function play_load_sound(id, pos) + minetest.sound_play("mcl_bows_crossbow_drawback_"..id, {pos=pos, max_hear_distance=12}, true) +end + +--[[ Store the charging state of each player. +keys: player name +value: +nil = not charging or player not existing +number: currently charging, the number is the time from minetest.get_us_time + in which the charging has started +]] +local bow_load = {} + +-- Another player table, this one stores the wield index of the bow being charged +local bow_index = {} + +function mcl_bows_s.shoot_arrow_crossbow(arrow_item, pos, dir, yaw, shooter, power, damage, is_critical, crossbow_stack, collectable) + local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, arrow_item.."_entity") + if power == nil then + power = BOW_MAX_SPEED --19 + end + if damage == nil then + damage = 3 + end + local knockback + if crossbow_stack then + local enchantments = mcl_enchanting.get_enchantments(crossbow_stack) + if enchantments.piercing then + obj:get_luaentity()._piercing = 1 * enchantments.piercing + else + obj:get_luaentity()._piercing = 0 + end + end + obj:set_velocity({x=dir.x*power, y=dir.y*power, z=dir.z*power}) + obj:set_acceleration({x=0, y=-GRAVITY, z=0}) + obj:set_yaw(yaw-math.pi/2) + local le = obj:get_luaentity() + le._shooter = shooter + le._source_object = shooter + le._damage = damage + le._is_critical = is_critical + le._startpos = pos + le._knockback = knockback + le._collectable = collectable + minetest.sound_play("mcl_bows_crossbow_shoot", {pos=pos, max_hear_distance=16}, true) + if shooter and shooter:is_player() then + if obj:get_luaentity().player == "" then + obj:get_luaentity().player = shooter + end + obj:get_luaentity().node = shooter:get_inventory():get_stack("main", 1):get_name() + end + return obj +end + +local function get_arrow(player) + local inv = player:get_inventory() + local arrow_stack, arrow_stack_id + for i=1, inv:get_size("main") do + local it = inv:get_stack("main", i) + if not it:is_empty() and minetest.get_item_group(it:get_name(), "ammo_crossbow") ~= 0 then + arrow_stack = it + arrow_stack_id = i + break + end + end + return arrow_stack, arrow_stack_id +end + +local function player_shoot_arrow(itemstack, player, power, damage, is_critical) + local has_multishot_enchantment = mcl_enchanting.has_enchantment(player:get_wielded_item(), "multishot") + local arrow_itemstring = wielditem:get_meta():get("arrow") + + if not arrow_itemstring then + return false + end + + local playerpos = player:get_pos() + local dir = player:get_look_dir() + local yaw = player:get_look_horizontal() + + if has_multishot_enchantment then + mcl_bows_s.shoot_arrow_crossbow(arrow_itemstring, {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, {x=dir.x, y=dir.y, z=dir.z + .2}, yaw, player, power, damage, is_critical, player:get_wielded_item(), false) + mcl_bows_s.shoot_arrow_crossbow(arrow_itemstring, {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, {x=dir.x, y=dir.y, z=dir.z - .2}, yaw, player, power, damage, is_critical, player:get_wielded_item(), false) + mcl_bows_s.shoot_arrow_crossbow(arrow_itemstring, {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, dir, yaw, player, power, damage, is_critical, player:get_wielded_item(), true) + else + mcl_bows_s.shoot_arrow_crossbow(arrow_itemstring, {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, dir, yaw, player, power, damage, is_critical, player:get_wielded_item(), true) + end + return true +end + +-- Bow item, uncharged state +minetest.register_tool("mcl_bows:crossbow", { + description = S("Corssbow"), + _tt_help = S("Launches arrows"), + _doc_items_longdesc = S("Bows are ranged weapons to shoot arrows at your foes.").."\n".. +S("The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead."), + _doc_items_usagehelp = S("To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot."), + _doc_items_durability = BOW_DURABILITY, + inventory_image = "mcl_bows_crossbow.png", + wield_scale = mcl_vars.tool_wield_scale, + stack_max = 1, + range = 4, + -- Trick to disable digging as well + on_use = function() return end, + on_place = function(itemstack, player, pointed_thing) + if pointed_thing and pointed_thing.type == "node" then + -- Call on_rightclick if the pointed node defines it + local node = minetest.get_node(pointed_thing.under) + if player and not player:get_player_control().sneak then + if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, player, itemstack) or itemstack + end + end + end + + itemstack:get_meta():set_string("active", "true") + return itemstack + end, + on_secondary_use = function(itemstack) + itemstack:get_meta():set_string("active", "true") + return itemstack + end, + groups = {weapon=1,weapon_ranged=1,crossbow=1,enchantability=1}, + _mcl_uses = 326, +}) + +minetest.register_tool("mcl_bows:crossbow_loaded", { + description = S("Corssbow"), + _tt_help = S("Launches arrows"), + _doc_items_longdesc = S("Corssbow are ranged weapons to shoot arrows at your foes.").."\n".. +S("The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead."), + _doc_items_usagehelp = S("To use the corssbow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to load an arrow into the chamber, then to shoot press left mouse."), + _doc_items_durability = BOW_DURABILITY, + inventory_image = "mcl_bows_crossbow_3.png", + wield_scale = mcl_vars.tool_wield_scale, + stack_max = 1, + range = 4, + -- Trick to disable digging as well + on_use = function() return end, + on_place = function(itemstack, player, pointed_thing) + if pointed_thing and pointed_thing.type == "node" then + -- Call on_rightclick if the pointed node defines it + local node = minetest.get_node(pointed_thing.under) + if player and not player:get_player_control().sneak then + if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, player, itemstack) or itemstack + end + end + end + + itemstack:get_meta():set_string("active", "true") + return itemstack + end, + on_secondary_use = function(itemstack) + itemstack:get_meta():set_string("active", "true") + return itemstack + end, + groups = {weapon=1,weapon_ranged=1,crossbow=1,enchantability=1}, + _mcl_uses = 326, +}) + +-- Iterates through player inventory and resets all the bows in "charging" state back to their original stage +local function reset_bows(player) + local inv = player:get_inventory() + local list = inv:get_list("main") + for place, stack in pairs(list) do + if stack:get_name() == "mcl_bows:crossbow" or stack:get_name() == "mcl_bows:crossbow_enchanted" then + stack:get_meta():set_string("active", "") + elseif stack:get_name()=="mcl_bows:crossbow_0" or stack:get_name()=="mcl_bows:crossbow_1" or stack:get_name()=="mcl_bows:crossbow_2" then + stack:set_name("mcl_bows:crossbow") + stack:get_meta():set_string("active", "") + list[place] = stack + elseif stack:get_name()=="mcl_bows:crossbow_0_enchanted" or stack:get_name()=="mcl_bows:crossbow_1_enchanted" or stack:get_name()=="mcl_bows:crossbow_2_enchanted" then + stack:set_name("mcl_bows:crossbow_enchanted") + stack:get_meta():set_string("active", "") + list[place] = stack + end + end + inv:set_list("main", list) +end + +-- Resets the bow charging state and player speed. To be used when the player is no longer charging the bow +local function reset_bow_state(player, also_reset_bows) + bow_load[player:get_player_name()] = nil + bow_index[player:get_player_name()] = nil + if minetest.get_modpath("playerphysics") then + playerphysics.remove_physics_factor(player, "speed", "mcl_bows:use_crossbow") + end + if also_reset_bows then + reset_bows(player) + end +end + +-- Bow in charging state +for level=0, 2 do + minetest.register_tool("mcl_bows:crossbow_"..level, { + description = S("Crossbow"), + _doc_items_create_entry = false, + inventory_image = "mcl_bows_crossbow_"..level..".png", + wield_scale = mcl_vars.tool_wield_scale, + stack_max = 1, + range = 0, -- Pointing range to 0 to prevent punching with bow :D + groups = {not_in_creative_inventory=1, not_in_craft_guide=1, bow=1, enchantability=1}, + -- Trick to disable digging as well + on_use = function() return end, + on_drop = function(itemstack, dropper, pos) + reset_bow_state(dropper) + itemstack:get_meta():set_string("active", "") + if mcl_enchanting.is_enchanted(itemstack:get_name()) then + itemstack:set_name("mcl_bows:crossbow_enchanted") + else + itemstack:set_name("mcl_bows:crossbow") + end + minetest.item_drop(itemstack, dropper, pos) + itemstack:take_item() + return itemstack + end, + -- Prevent accidental interaction with itemframes and other nodes + on_place = function(itemstack) + return itemstack + end, + _mcl_uses = 385, + }) +end + + +controls.register_on_release(function(player, key, time) + if key~="RMB" then return end + --local inv = minetest.get_inventory({type="player", name=player:get_player_name()}) + local wielditem = player:get_wielded_item() + if wielditem:get_name()=="mcl_bows:crossbow_2" and get_arrow(player) or wielditem:get_name()=="mcl_bows:crossbow_2" and minetest.is_creative_enabled(player:get_player_name()) or wielditem:get_name()=="mcl_bows:crossbow_2_enchanted" and get_arrow(player) or wielditem:get_name()=="mcl_bows:crossbow_2_enchanted" and minetest.is_creative_enabled(player:get_player_name()) then + local arrow_stack, arrow_stack_id = get_arrow(player) + local arrow_itemstring + + if minetest.is_creative_enabled(player:get_player_name()) then + if arrow_stack then + arrow_itemstring = arrow_stack:get_name() + else + arrow_itemstring = "mcl_bows:arrow" + end + else + arrow_itemstring = arrow_stack:get_name() + arrow_stack:take_item() + player:get_inventory():set_stack("main", arrow_stack_id, arrow_stack) + end + + wielditem:get_meta():set_string("arrow", arrow_itemstring) + + if wielditem:get_name()=="mcl_bows:crossbow_2" then + wielditem:set_name("mcl_bows:crossbow_loaded") + else + wielditem:set_name("mcl_bows:crossbow_loaded_enchanted") + end + player:set_wielded_item(wielditem) + minetest.sound_play("mcl_bows_crossbow_load", {pos=player:get_pos(), max_hear_distance=16}, true) + else + reset_bow_state(player, true) + end +end) + +controls.register_on_press(function(player, key, time) + if key~="LMB" then return end + wielditem = player:get_wielded_item() + if wielditem:get_name()=="mcl_bows:crossbow_loaded" or wielditem:get_name()=="mcl_bows:crossbow_loaded_enchanted" then + local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) + local speed, damage + local p_load = bow_load[player:get_player_name()] + local charge + -- Type sanity check + if type(p_load) == "number" then + charge = minetest.get_us_time() - p_load + else + -- In case something goes wrong ... + -- Just assume minimum charge. + charge = 0 + minetest.log("warning", "[mcl_bows] Player "..player:get_player_name().." fires arrow with non-numeric bow_load!") + end + charge = math.max(math.min(charge, BOW_CHARGE_TIME_FULL), 0) + + local charge_ratio = charge / BOW_CHARGE_TIME_FULL + charge_ratio = math.max(math.min(charge_ratio, 1), 0) + + -- Calculate damage and speed + -- Fully charged + local is_critical = false + speed = BOW_MAX_SPEED + local r = math.random(1,5) + if r == 1 then + -- 20% chance for critical hit + damage = 10 + is_critical = true + else + damage = 9 + end + + local has_shot = player_shoot_arrow(wielditem, player, speed, damage, is_critical) + + if enchanted then + wielditem:set_name("mcl_bows:crossbow_enchanted") + else + wielditem:set_name("mcl_bows:crossbow") + end + + if has_shot and not minetest.is_creative_enabled(player:get_player_name()) then + local durability = BOW_DURABILITY + local unbreaking = mcl_enchanting.get_enchantment(wielditem, "unbreaking") + local multishot = mcl_enchanting.get_enchantment(wielditem, "multishot") + if unbreaking > 0 then + durability = durability * (unbreaking + 1) + end + if multishot then + durability = durability / 3 + end + wielditem:add_wear(65535/durability) + end + player:set_wielded_item(wielditem) + reset_bow_state(player, true) + end +end) + +controls.register_on_hold(function(player, key, time) + local name = player:get_player_name() + local creative = minetest.is_creative_enabled(name) + if key ~= "RMB" then + return + end + --local inv = minetest.get_inventory({type="player", name=name}) + local wielditem = player:get_wielded_item() + local enchantments = mcl_enchanting.get_enchantments(wielditem) + if enchantments.quick_charge then + BOW_CHARGE_TIME_HALF = _BOW_CHARGE_TIME_HALF - (enchantments.quick_charge * 0.13 * 1000000 * .5) + BOW_CHARGE_TIME_FULL = _BOW_CHARGE_TIME_FULL - (enchantments.quick_charge * 0.13 * 1000000) + else + BOW_CHARGE_TIME_HALF = _BOW_CHARGE_TIME_HALF + BOW_CHARGE_TIME_FULL = _BOW_CHARGE_TIME_FULL + end + + if bow_load[name] == nil and (wielditem:get_name()=="mcl_bows:crossbow" or wielditem:get_name()=="mcl_bows:crossbow_enchanted") and wielditem:get_meta():get("active") and (creative or get_arrow(player)) then + local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) + if enchanted then + wielditem:set_name("mcl_bows:crossbow_0_enchanted") + play_load_sound(0, player:get_pos()) + else + wielditem:set_name("mcl_bows:crossbow_0") + play_load_sound(0, player:get_pos()) + end + player:set_wielded_item(wielditem) + if minetest.get_modpath("playerphysics") then + -- Slow player down when using bow + playerphysics.add_physics_factor(player, "speed", "mcl_bows:use_crossbow", PLAYER_USE_CROSSBOW_SPEED) + end + bow_load[name] = minetest.get_us_time() + bow_index[name] = player:get_wield_index() + else + if player:get_wield_index() == bow_index[name] then + if type(bow_load[name]) == "number" then + if wielditem:get_name() == "mcl_bows:crossbow_0" and minetest.get_us_time() - bow_load[name] >= BOW_CHARGE_TIME_HALF then + wielditem:set_name("mcl_bows:crossbow_1") + play_load_sound(1, player:get_pos()) + elseif wielditem:get_name() == "mcl_bows:crossbow_0_enchanted" and minetest.get_us_time() - bow_load[name] >= BOW_CHARGE_TIME_HALF then + wielditem:set_name("mcl_bows:crossbow_1_enchanted") + play_load_sound(1, player:get_pos()) + elseif wielditem:get_name() == "mcl_bows:crossbow_1" and minetest.get_us_time() - bow_load[name] >= BOW_CHARGE_TIME_FULL then + wielditem:set_name("mcl_bows:crossbow_2") + play_load_sound(2, player:get_pos()) + elseif wielditem:get_name() == "mcl_bows:crossbow_1_enchanted" and minetest.get_us_time() - bow_load[name] >= BOW_CHARGE_TIME_FULL then + wielditem:set_name("mcl_bows:crossbow_2_enchanted") + play_load_sound(2, player:get_pos()) + end + else + if wielditem:get_name() == "mcl_bows:crossbow_0" or wielditem:get_name() == "mcl_bows:crossbow_1" or wielditem:get_name() == "mcl_bows:crossbow_2" then + wielditem:set_name("mcl_bows:crossbow") + play_load_sound(1, player:get_pos()) + elseif wielditem:get_name() == "mcl_bows:crossbow_0_enchanted" or wielditem:get_name() == "mcl_bows:crossbow_1_enchanted" or wielditem:get_name() == "mcl_bows:crossbow_2_enchanted" then + wielditem:set_name("mcl_bows:crossbow_enchanted") + play_load_sound(1, player:get_pos()) + end + end + player:set_wielded_item(wielditem) + else + reset_bow_state(player, true) + end + end +end) + +minetest.register_globalstep(function(dtime) + for _, player in pairs(minetest.get_connected_players()) do + local name = player:get_player_name() + local wielditem = player:get_wielded_item() + local wieldindex = player:get_wield_index() + --local controls = player:get_player_control() + if type(bow_load[name]) == "number" and ((wielditem:get_name()~="mcl_bows:crossbow_0" and wielditem:get_name()~="mcl_bows:crossbow_1" and wielditem:get_name()~="mcl_bows:crossbow_2" and wielditem:get_name()~="mcl_bows:crossbow_0_enchanted" and wielditem:get_name()~="mcl_bows:crossbow_1_enchanted" and wielditem:get_name()~="mcl_bows:crossbow_2_enchanted") or wieldindex ~= bow_index[name]) then + reset_bow_state(player, true) + end + end +end) + +minetest.register_on_joinplayer(function(player) + reset_bows(player) +end) + +minetest.register_on_leaveplayer(function(player) + reset_bow_state(player, true) +end) + +if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then + minetest.register_craft({ + output = "mcl_bows:crossbow", + recipe = { + {"mcl_core:stick", "mcl_core:iron_ingot", "mcl_core:stick"}, + {"mcl_mobitems:string", "mcl_bows:arrow", "mcl_mobitems:string"}, + {"", "mcl_core:stick", ""}, + } + }) +end + +minetest.register_craft({ + type = "fuel", + recipe = "group:bow", + burntime = 15, +}) + +-- Add entry aliases for the Help +if minetest.get_modpath("doc") then + doc.add_entry_alias("tools", "mcl_bows:crossbow", "tools", "mcl_bows:crossbow_0") + doc.add_entry_alias("tools", "mcl_bows:crossbow", "tools", "mcl_bows:crossbow_1") + doc.add_entry_alias("tools", "mcl_bows:crossbow", "tools", "mcl_bows:crossbow_2") +end diff --git a/mods/ITEMS/mcl_bows/init.lua b/mods/ITEMS/mcl_bows/init.lua index a2745d950..d5b06dac7 100644 --- a/mods/ITEMS/mcl_bows/init.lua +++ b/mods/ITEMS/mcl_bows/init.lua @@ -1,5 +1,11 @@ +--Bow dofile(minetest.get_modpath("mcl_bows") .. "/arrow.lua") dofile(minetest.get_modpath("mcl_bows") .. "/bow.lua") +dofile(minetest.get_modpath("mcl_bows") .. "/rocket.lua") +--Crossbow +dofile(minetest.get_modpath("mcl_bows") .. "/crossbow.lua") + +--Compatiblility with older MineClone worlds minetest.register_alias("mcl_throwing:bow", "mcl_bows:bow") minetest.register_alias("mcl_throwing:arrow", "mcl_bows:arrow") diff --git a/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.b3d b/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.b3d new file mode 100644 index 0000000000000000000000000000000000000000..0a34f1eaa63c07c7f37e90df2300497fc6c5385f GIT binary patch literal 11758 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 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.mtl b/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.mtl new file mode 100644 index 000000000..f231bdf4c --- /dev/null +++ b/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.mtl @@ -0,0 +1,10 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl None +Ns 500 +Ka 0.8 0.8 0.8 +Kd 0.8 0.8 0.8 +Ks 0.8 0.8 0.8 +d 1 +illum 2 diff --git a/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.obj b/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.obj new file mode 100644 index 000000000..e2bd11d34 --- /dev/null +++ b/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.obj @@ -0,0 +1,1016 @@ +# Blender v3.0.0 Alpha OBJ File: '' +# www.blender.org +mtllib mcl_bows_rocket.mtl +o Plane +v -1.414214 -0.063116 0.000000 +v 0.000000 -0.063116 1.414214 +v -0.000000 -0.063116 -1.414214 +v 1.414214 -0.063116 -0.000000 +v -1.414214 -0.062205 0.000000 +v 0.000000 -0.062205 1.414214 +v -0.000000 -0.062205 -1.414214 +v 1.414214 -0.062205 -0.000000 +v -1.414214 -0.060838 0.000000 +v 0.000000 -0.060838 1.414214 +v -0.000000 -0.060838 -1.414214 +v 1.414214 -0.060838 -0.000000 +v -1.414214 -0.059926 0.000000 +v 0.000000 -0.059926 1.414214 +v -0.000000 -0.059926 -1.414214 +v 1.414214 -0.059926 -0.000000 +v -1.414214 -0.058559 0.000000 +v 0.000000 -0.058559 1.414214 +v -0.000000 -0.058559 -1.414214 +v 1.414214 -0.058559 -0.000000 +v -1.414214 -0.057648 0.000000 +v 0.000000 -0.057648 1.414214 +v -0.000000 -0.057648 -1.414214 +v 1.414214 -0.057648 -0.000000 +v -1.414214 -0.056281 0.000000 +v 0.000000 -0.056281 1.414214 +v -0.000000 -0.056281 -1.414214 +v 1.414214 -0.056281 -0.000000 +v -1.414214 -0.055369 0.000000 +v 0.000000 -0.055369 1.414214 +v -0.000000 -0.055369 -1.414214 +v 1.414214 -0.055369 -0.000000 +v -1.414214 -0.054002 0.000000 +v 0.000000 -0.054002 1.414214 +v -0.000000 -0.054002 -1.414214 +v 1.414214 -0.054002 -0.000000 +v -1.414214 -0.053091 0.000000 +v 0.000000 -0.053091 1.414214 +v -0.000000 -0.053091 -1.414214 +v 1.414214 -0.053091 -0.000000 +v -1.414214 -0.051723 0.000000 +v 0.000000 -0.051723 1.414214 +v -0.000000 -0.051723 -1.414214 +v 1.414214 -0.051723 -0.000000 +v -1.414214 -0.050812 0.000000 +v 0.000000 -0.050812 1.414214 +v -0.000000 -0.050812 -1.414214 +v 1.414214 -0.050812 -0.000000 +v -1.414214 -0.049445 0.000000 +v 0.000000 -0.049445 1.414214 +v -0.000000 -0.049445 -1.414214 +v 1.414214 -0.049445 -0.000000 +v -1.414214 -0.048533 0.000000 +v 0.000000 -0.048533 1.414214 +v -0.000000 -0.048533 -1.414214 +v 1.414214 -0.048533 -0.000000 +v -1.414214 -0.047166 0.000000 +v 0.000000 -0.047166 1.414214 +v -0.000000 -0.047166 -1.414214 +v 1.414214 -0.047166 -0.000000 +v -1.414214 -0.046255 0.000000 +v 0.000000 -0.046255 1.414214 +v -0.000000 -0.046255 -1.414214 +v 1.414214 -0.046255 -0.000000 +v -1.414214 -0.044888 0.000000 +v 0.000000 -0.044888 1.414214 +v -0.000000 -0.044888 -1.414214 +v 1.414214 -0.044888 -0.000000 +v -1.414214 -0.043976 0.000000 +v 0.000000 -0.043976 1.414214 +v -0.000000 -0.043976 -1.414214 +v 1.414214 -0.043976 -0.000000 +v -1.414214 -0.042609 0.000000 +v 0.000000 -0.042609 1.414214 +v -0.000000 -0.042609 -1.414214 +v 1.414214 -0.042609 -0.000000 +v -1.414214 -0.041698 0.000000 +v 0.000000 -0.041698 1.414214 +v -0.000000 -0.041698 -1.414214 +v 1.414214 -0.041698 -0.000000 +v -1.414214 -0.040331 0.000000 +v 0.000000 -0.040331 1.414214 +v -0.000000 -0.040331 -1.414214 +v 1.414214 -0.040331 -0.000000 +v -1.414214 -0.039419 0.000000 +v 0.000000 -0.039419 1.414214 +v -0.000000 -0.039419 -1.414214 +v 1.414214 -0.039419 -0.000000 +v -1.414214 -0.038052 0.000000 +v 0.000000 -0.038052 1.414214 +v -0.000000 -0.038052 -1.414214 +v 1.414214 -0.038052 -0.000000 +v -1.414214 -0.037141 0.000000 +v 0.000000 -0.037141 1.414214 +v -0.000000 -0.037141 -1.414214 +v 1.414214 -0.037141 -0.000000 +v -1.414214 -0.035773 0.000000 +v 0.000000 -0.035773 1.414214 +v -0.000000 -0.035773 -1.414214 +v 1.414214 -0.035773 -0.000000 +v -1.414214 -0.034862 0.000000 +v 0.000000 -0.034862 1.414214 +v -0.000000 -0.034862 -1.414214 +v 1.414214 -0.034862 -0.000000 +v -1.414214 -0.033495 0.000000 +v 0.000000 -0.033495 1.414214 +v -0.000000 -0.033495 -1.414214 +v 1.414214 -0.033495 -0.000000 +v -1.414214 -0.032583 0.000000 +v 0.000000 -0.032583 1.414214 +v -0.000000 -0.032583 -1.414214 +v 1.414214 -0.032583 -0.000000 +v -1.414214 -0.031216 0.000000 +v 0.000000 -0.031216 1.414214 +v -0.000000 -0.031216 -1.414214 +v 1.414214 -0.031216 -0.000000 +v -1.414214 -0.030305 0.000000 +v 0.000000 -0.030305 1.414214 +v -0.000000 -0.030305 -1.414214 +v 1.414214 -0.030305 -0.000000 +v -1.414214 -0.028938 0.000000 +v 0.000000 -0.028938 1.414214 +v -0.000000 -0.028938 -1.414214 +v 1.414214 -0.028938 -0.000000 +v -1.414214 -0.028026 0.000000 +v 0.000000 -0.028026 1.414214 +v -0.000000 -0.028026 -1.414214 +v 1.414214 -0.028026 -0.000000 +v -1.414214 -0.026659 0.000000 +v 0.000000 -0.026659 1.414214 +v -0.000000 -0.026659 -1.414214 +v 1.414214 -0.026659 -0.000000 +v -1.414214 -0.025748 0.000000 +v 0.000000 -0.025748 1.414214 +v -0.000000 -0.025748 -1.414214 +v 1.414214 -0.025748 -0.000000 +v -1.414214 -0.024381 0.000000 +v 0.000000 -0.024381 1.414214 +v -0.000000 -0.024381 -1.414214 +v 1.414214 -0.024381 -0.000000 +v -1.414214 -0.023469 0.000000 +v 0.000000 -0.023469 1.414214 +v -0.000000 -0.023469 -1.414214 +v 1.414214 -0.023469 -0.000000 +v -1.414214 -0.022102 0.000000 +v 0.000000 -0.022102 1.414214 +v -0.000000 -0.022102 -1.414214 +v 1.414214 -0.022102 -0.000000 +v -1.414214 -0.021191 0.000000 +v 0.000000 -0.021191 1.414214 +v -0.000000 -0.021191 -1.414214 +v 1.414214 -0.021191 -0.000000 +v -1.414214 -0.019824 0.000000 +v 0.000000 -0.019824 1.414214 +v -0.000000 -0.019824 -1.414214 +v 1.414214 -0.019824 -0.000000 +v -1.414214 -0.018912 0.000000 +v 0.000000 -0.018912 1.414214 +v -0.000000 -0.018912 -1.414214 +v 1.414214 -0.018912 -0.000000 +v -1.414214 -0.017545 0.000000 +v 0.000000 -0.017545 1.414214 +v -0.000000 -0.017545 -1.414214 +v 1.414214 -0.017545 -0.000000 +v -1.414214 -0.016634 0.000000 +v 0.000000 -0.016634 1.414214 +v -0.000000 -0.016634 -1.414214 +v 1.414214 -0.016634 -0.000000 +v -1.414214 -0.015266 0.000000 +v 0.000000 -0.015266 1.414214 +v -0.000000 -0.015266 -1.414214 +v 1.414214 -0.015266 -0.000000 +v -1.414214 -0.014355 0.000000 +v 0.000000 -0.014355 1.414214 +v -0.000000 -0.014355 -1.414214 +v 1.414214 -0.014355 -0.000000 +v -1.414214 -0.012988 0.000000 +v 0.000000 -0.012988 1.414214 +v -0.000000 -0.012988 -1.414214 +v 1.414214 -0.012988 -0.000000 +v -1.414214 -0.012076 0.000000 +v 0.000000 -0.012076 1.414214 +v -0.000000 -0.012076 -1.414214 +v 1.414214 -0.012076 -0.000000 +v -1.414214 -0.010709 0.000000 +v 0.000000 -0.010709 1.414214 +v -0.000000 -0.010709 -1.414214 +v 1.414214 -0.010709 -0.000000 +v -1.414214 -0.009798 0.000000 +v 0.000000 -0.009798 1.414214 +v -0.000000 -0.009798 -1.414214 +v 1.414214 -0.009798 -0.000000 +v -1.414214 -0.008431 0.000000 +v 0.000000 -0.008431 1.414214 +v -0.000000 -0.008431 -1.414214 +v 1.414214 -0.008431 -0.000000 +v -1.414214 -0.007519 0.000000 +v 0.000000 -0.007519 1.414214 +v -0.000000 -0.007519 -1.414214 +v 1.414214 -0.007519 -0.000000 +v -1.414214 -0.006152 0.000000 +v 0.000000 -0.006152 1.414214 +v -0.000000 -0.006152 -1.414214 +v 1.414214 -0.006152 -0.000000 +v -1.414214 -0.005241 0.000000 +v 0.000000 -0.005241 1.414214 +v -0.000000 -0.005241 -1.414214 +v 1.414214 -0.005241 -0.000000 +v -1.414214 -0.003874 0.000000 +v 0.000000 -0.003874 1.414214 +v -0.000000 -0.003874 -1.414214 +v 1.414214 -0.003874 -0.000000 +v -1.414214 -0.002962 0.000000 +v 0.000000 -0.002962 1.414214 +v -0.000000 -0.002962 -1.414214 +v 1.414214 -0.002962 -0.000000 +v -1.414214 -0.001595 0.000000 +v 0.000000 -0.001595 1.414214 +v -0.000000 -0.001595 -1.414214 +v 1.414214 -0.001595 -0.000000 +v -1.414214 -0.000684 0.000000 +v 0.000000 -0.000684 1.414214 +v -0.000000 -0.000684 -1.414214 +v 1.414214 -0.000684 -0.000000 +v -1.414214 0.000684 0.000000 +v 0.000000 0.000684 1.414214 +v -0.000000 0.000684 -1.414214 +v 1.414214 0.000684 -0.000000 +v -1.414214 0.001595 0.000000 +v 0.000000 0.001595 1.414214 +v -0.000000 0.001595 -1.414214 +v 1.414214 0.001595 -0.000000 +v -1.414214 0.002962 0.000000 +v 0.000000 0.002962 1.414214 +v -0.000000 0.002962 -1.414214 +v 1.414214 0.002962 -0.000000 +v -1.414214 0.003874 0.000000 +v 0.000000 0.003874 1.414214 +v -0.000000 0.003874 -1.414214 +v 1.414214 0.003874 -0.000000 +v -1.414214 0.005241 0.000000 +v 0.000000 0.005241 1.414214 +v -0.000000 0.005241 -1.414214 +v 1.414214 0.005241 -0.000000 +v -1.414214 0.006152 0.000000 +v 0.000000 0.006152 1.414214 +v -0.000000 0.006152 -1.414214 +v 1.414214 0.006152 -0.000000 +v -1.414214 0.007519 0.000000 +v 0.000000 0.007519 1.414214 +v -0.000000 0.007519 -1.414214 +v 1.414214 0.007519 -0.000000 +v -1.414214 0.008431 0.000000 +v 0.000000 0.008431 1.414214 +v -0.000000 0.008431 -1.414214 +v 1.414214 0.008431 -0.000000 +v -1.414214 0.009798 0.000000 +v 0.000000 0.009798 1.414214 +v -0.000000 0.009798 -1.414214 +v 1.414214 0.009798 -0.000000 +v -1.414214 0.010709 0.000000 +v 0.000000 0.010709 1.414214 +v -0.000000 0.010709 -1.414214 +v 1.414214 0.010709 -0.000000 +v -1.414214 0.012076 0.000000 +v 0.000000 0.012076 1.414214 +v -0.000000 0.012076 -1.414214 +v 1.414214 0.012076 -0.000000 +v -1.414214 0.012988 0.000000 +v 0.000000 0.012988 1.414214 +v -0.000000 0.012988 -1.414214 +v 1.414214 0.012988 -0.000000 +v -1.414214 0.014355 0.000000 +v 0.000000 0.014355 1.414214 +v -0.000000 0.014355 -1.414214 +v 1.414214 0.014355 -0.000000 +v -1.414214 0.015266 0.000000 +v 0.000000 0.015266 1.414214 +v -0.000000 0.015266 -1.414214 +v 1.414214 0.015266 -0.000000 +v -1.414214 0.016634 0.000000 +v 0.000000 0.016634 1.414214 +v -0.000000 0.016634 -1.414214 +v 1.414214 0.016634 -0.000000 +v -1.414214 0.017545 0.000000 +v 0.000000 0.017545 1.414214 +v -0.000000 0.017545 -1.414214 +v 1.414214 0.017545 -0.000000 +v -1.414214 0.018912 0.000000 +v 0.000000 0.018912 1.414214 +v -0.000000 0.018912 -1.414214 +v 1.414214 0.018912 -0.000000 +v -1.414214 0.019824 0.000000 +v 0.000000 0.019824 1.414214 +v -0.000000 0.019824 -1.414214 +v 1.414214 0.019824 -0.000000 +v -1.414214 0.021191 0.000000 +v 0.000000 0.021191 1.414214 +v -0.000000 0.021191 -1.414214 +v 1.414214 0.021191 -0.000000 +v -1.414214 0.022102 0.000000 +v 0.000000 0.022102 1.414214 +v -0.000000 0.022102 -1.414214 +v 1.414214 0.022102 -0.000000 +v -1.414214 0.023469 0.000000 +v 0.000000 0.023469 1.414214 +v -0.000000 0.023469 -1.414214 +v 1.414214 0.023469 -0.000000 +v -1.414214 0.024381 0.000000 +v 0.000000 0.024381 1.414214 +v -0.000000 0.024381 -1.414214 +v 1.414214 0.024381 -0.000000 +v -1.414214 0.025748 0.000000 +v 0.000000 0.025748 1.414214 +v -0.000000 0.025748 -1.414214 +v 1.414214 0.025748 -0.000000 +v -1.414214 0.026659 0.000000 +v 0.000000 0.026659 1.414214 +v -0.000000 0.026659 -1.414214 +v 1.414214 0.026659 -0.000000 +v -1.414214 0.028026 0.000000 +v 0.000000 0.028026 1.414214 +v -0.000000 0.028026 -1.414214 +v 1.414214 0.028026 -0.000000 +v -1.414214 0.028938 0.000000 +v 0.000000 0.028938 1.414214 +v -0.000000 0.028938 -1.414214 +v 1.414214 0.028938 -0.000000 +v -1.414214 0.030305 0.000000 +v 0.000000 0.030305 1.414214 +v -0.000000 0.030305 -1.414214 +v 1.414214 0.030305 -0.000000 +v -1.414214 0.031216 0.000000 +v 0.000000 0.031216 1.414214 +v -0.000000 0.031216 -1.414214 +v 1.414214 0.031216 -0.000000 +v -1.414214 0.032584 0.000000 +v 0.000000 0.032584 1.414214 +v -0.000000 0.032584 -1.414214 +v 1.414214 0.032584 -0.000000 +v -1.414214 0.033495 0.000000 +v 0.000000 0.033495 1.414214 +v -0.000000 0.033495 -1.414214 +v 1.414214 0.033495 -0.000000 +v -1.414214 0.034862 0.000000 +v 0.000000 0.034862 1.414214 +v -0.000000 0.034862 -1.414214 +v 1.414214 0.034862 -0.000000 +v -1.414214 0.035774 0.000000 +v 0.000000 0.035774 1.414214 +v -0.000000 0.035774 -1.414214 +v 1.414214 0.035774 -0.000000 +v -1.414214 0.037141 0.000000 +v 0.000000 0.037141 1.414214 +v -0.000000 0.037141 -1.414214 +v 1.414214 0.037141 -0.000000 +v -1.414214 0.038052 0.000000 +v 0.000000 0.038052 1.414214 +v -0.000000 0.038052 -1.414214 +v 1.414214 0.038052 -0.000000 +v -1.414214 0.039419 0.000000 +v 0.000000 0.039419 1.414214 +v -0.000000 0.039419 -1.414214 +v 1.414214 0.039419 -0.000000 +v -1.414214 0.040331 0.000000 +v 0.000000 0.040331 1.414214 +v -0.000000 0.040331 -1.414214 +v 1.414214 0.040331 -0.000000 +v -1.414214 0.041698 0.000000 +v 0.000000 0.041698 1.414214 +v -0.000000 0.041698 -1.414214 +v 1.414214 0.041698 -0.000000 +v -1.414214 0.042609 0.000000 +v 0.000000 0.042609 1.414214 +v -0.000000 0.042609 -1.414214 +v 1.414214 0.042609 -0.000000 +v -1.414214 0.043976 0.000000 +v 0.000000 0.043976 1.414214 +v -0.000000 0.043976 -1.414214 +v 1.414214 0.043976 -0.000000 +v -1.414214 0.044888 0.000000 +v 0.000000 0.044888 1.414214 +v -0.000000 0.044888 -1.414214 +v 1.414214 0.044888 -0.000000 +v -1.414214 0.046255 0.000000 +v 0.000000 0.046255 1.414214 +v -0.000000 0.046255 -1.414214 +v 1.414214 0.046255 -0.000000 +v -1.414214 0.047166 0.000000 +v 0.000000 0.047166 1.414214 +v -0.000000 0.047166 -1.414214 +v 1.414214 0.047166 -0.000000 +v -1.414214 0.048533 0.000000 +v 0.000000 0.048533 1.414214 +v -0.000000 0.048533 -1.414214 +v 1.414214 0.048533 -0.000000 +v -1.414214 0.049445 0.000000 +v 0.000000 0.049445 1.414214 +v -0.000000 0.049445 -1.414214 +v 1.414214 0.049445 -0.000000 +v -1.414214 0.050812 0.000000 +v 0.000000 0.050812 1.414214 +v -0.000000 0.050812 -1.414214 +v 1.414214 0.050812 -0.000000 +v -1.414214 0.051723 0.000000 +v 0.000000 0.051723 1.414214 +v -0.000000 0.051723 -1.414214 +v 1.414214 0.051723 -0.000000 +v -1.414214 0.053091 0.000000 +v 0.000000 0.053091 1.414214 +v -0.000000 0.053091 -1.414214 +v 1.414214 0.053091 -0.000000 +v -1.414214 0.054002 0.000000 +v 0.000000 0.054002 1.414214 +v -0.000000 0.054002 -1.414214 +v 1.414214 0.054002 -0.000000 +v -1.414214 0.055369 0.000000 +v 0.000000 0.055369 1.414214 +v -0.000000 0.055369 -1.414214 +v 1.414214 0.055369 -0.000000 +v -1.414214 0.056281 0.000000 +v 0.000000 0.056281 1.414214 +v -0.000000 0.056281 -1.414214 +v 1.414214 0.056281 -0.000000 +v -1.414214 0.057648 0.000000 +v 0.000000 0.057648 1.414214 +v -0.000000 0.057648 -1.414214 +v 1.414214 0.057648 -0.000000 +v -1.414214 0.058559 0.000000 +v 0.000000 0.058559 1.414214 +v -0.000000 0.058559 -1.414214 +v 1.414214 0.058559 -0.000000 +v -1.414214 0.059926 0.000000 +v 0.000000 0.059926 1.414214 +v -0.000000 0.059926 -1.414214 +v 1.414214 0.059926 -0.000000 +v -1.414214 0.060838 0.000000 +v 0.000000 0.060838 1.414214 +v -0.000000 0.060838 -1.414214 +v 1.414214 0.060838 -0.000000 +v -1.414214 0.062205 0.000000 +v 0.000000 0.062205 1.414214 +v -0.000000 0.062205 -1.414214 +v 1.414214 0.062205 -0.000000 +v -1.414214 0.063116 0.000000 +v 0.000000 0.063116 1.414214 +v -0.000000 0.063116 -1.414214 +v 1.414214 0.063116 -0.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl None +s off +f 1/1/1 3/2/1 4/3/1 2/4/1 +f 5/5/2 6/6/2 8/7/2 7/8/2 +f 9/9/1 11/10/1 12/11/1 10/12/1 +f 13/13/2 14/14/2 16/15/2 15/16/2 +f 17/17/1 19/18/1 20/19/1 18/20/1 +f 21/21/2 22/22/2 24/23/2 23/24/2 +f 25/25/1 27/26/1 28/27/1 26/28/1 +f 29/29/2 30/30/2 32/31/2 31/32/2 +f 33/33/1 35/34/1 36/35/1 34/36/1 +f 37/37/2 38/38/2 40/39/2 39/40/2 +f 41/41/1 43/42/1 44/43/1 42/44/1 +f 45/45/2 46/46/2 48/47/2 47/48/2 +f 49/49/1 51/50/1 52/51/1 50/52/1 +f 53/53/2 54/54/2 56/55/2 55/56/2 +f 57/57/1 59/58/1 60/59/1 58/60/1 +f 61/61/2 62/62/2 64/63/2 63/64/2 +f 65/65/1 67/66/1 68/67/1 66/68/1 +f 69/69/2 70/70/2 72/71/2 71/72/2 +f 73/73/1 75/74/1 76/75/1 74/76/1 +f 77/77/2 78/78/2 80/79/2 79/80/2 +f 81/81/1 83/82/1 84/83/1 82/84/1 +f 85/85/2 86/86/2 88/87/2 87/88/2 +f 89/89/1 91/90/1 92/91/1 90/92/1 +f 93/93/2 94/94/2 96/95/2 95/96/2 +f 97/97/1 99/98/1 100/99/1 98/100/1 +f 101/101/2 102/102/2 104/103/2 103/104/2 +f 105/105/1 107/106/1 108/107/1 106/108/1 +f 109/109/2 110/110/2 112/111/2 111/112/2 +f 113/113/1 115/114/1 116/115/1 114/116/1 +f 117/117/2 118/118/2 120/119/2 119/120/2 +f 121/121/1 123/122/1 124/123/1 122/124/1 +f 125/125/2 126/126/2 128/127/2 127/128/2 +f 129/129/1 131/130/1 132/131/1 130/132/1 +f 133/133/2 134/134/2 136/135/2 135/136/2 +f 137/137/1 139/138/1 140/139/1 138/140/1 +f 141/141/2 142/142/2 144/143/2 143/144/2 +f 145/145/1 147/146/1 148/147/1 146/148/1 +f 149/149/2 150/150/2 152/151/2 151/152/2 +f 153/153/1 155/154/1 156/155/1 154/156/1 +f 157/157/2 158/158/2 160/159/2 159/160/2 +f 161/161/1 163/162/1 164/163/1 162/164/1 +f 165/165/2 166/166/2 168/167/2 167/168/2 +f 169/169/1 171/170/1 172/171/1 170/172/1 +f 173/173/2 174/174/2 176/175/2 175/176/2 +f 177/177/1 179/178/1 180/179/1 178/180/1 +f 181/181/2 182/182/2 184/183/2 183/184/2 +f 185/185/1 187/186/1 188/187/1 186/188/1 +f 189/189/2 190/190/2 192/191/2 191/192/2 +f 193/193/1 195/194/1 196/195/1 194/196/1 +f 197/197/2 198/198/2 200/199/2 199/200/2 +f 201/201/1 203/202/1 204/203/1 202/204/1 +f 205/205/2 206/206/2 208/207/2 207/208/2 +f 209/209/1 211/210/1 212/211/1 210/212/1 +f 213/213/2 214/214/2 216/215/2 215/216/2 +f 217/217/1 219/218/1 220/219/1 218/220/1 +f 221/221/2 222/222/2 224/223/2 223/224/2 +f 225/225/1 227/226/1 228/227/1 226/228/1 +f 229/229/2 230/230/2 232/231/2 231/232/2 +f 233/233/1 235/234/1 236/235/1 234/236/1 +f 237/237/2 238/238/2 240/239/2 239/240/2 +f 241/241/1 243/242/1 244/243/1 242/244/1 +f 245/245/2 246/246/2 248/247/2 247/248/2 +f 249/249/1 251/250/1 252/251/1 250/252/1 +f 253/253/2 254/254/2 256/255/2 255/256/2 +f 257/257/1 259/258/1 260/259/1 258/260/1 +f 261/261/2 262/262/2 264/263/2 263/264/2 +f 265/265/1 267/266/1 268/267/1 266/268/1 +f 269/269/2 270/270/2 272/271/2 271/272/2 +f 273/273/1 275/274/1 276/275/1 274/276/1 +f 277/277/2 278/278/2 280/279/2 279/280/2 +f 281/281/1 283/282/1 284/283/1 282/284/1 +f 285/285/2 286/286/2 288/287/2 287/288/2 +f 289/289/1 291/290/1 292/291/1 290/292/1 +f 293/293/2 294/294/2 296/295/2 295/296/2 +f 297/297/1 299/298/1 300/299/1 298/300/1 +f 301/301/2 302/302/2 304/303/2 303/304/2 +f 305/305/1 307/306/1 308/307/1 306/308/1 +f 309/309/2 310/310/2 312/311/2 311/312/2 +f 313/313/1 315/314/1 316/315/1 314/316/1 +f 317/317/2 318/318/2 320/319/2 319/320/2 +f 321/321/1 323/322/1 324/323/1 322/324/1 +f 325/325/2 326/326/2 328/327/2 327/328/2 +f 329/329/1 331/330/1 332/331/1 330/332/1 +f 333/333/2 334/334/2 336/335/2 335/336/2 +f 337/337/1 339/338/1 340/339/1 338/340/1 +f 341/341/2 342/342/2 344/343/2 343/344/2 +f 345/345/1 347/346/1 348/347/1 346/348/1 +f 349/349/2 350/350/2 352/351/2 351/352/2 +f 353/353/1 355/354/1 356/355/1 354/356/1 +f 357/357/2 358/358/2 360/359/2 359/360/2 +f 361/361/1 363/362/1 364/363/1 362/364/1 +f 365/365/2 366/366/2 368/367/2 367/368/2 +f 369/369/1 371/370/1 372/371/1 370/372/1 +f 373/373/2 374/374/2 376/375/2 375/376/2 +f 377/377/1 379/378/1 380/379/1 378/380/1 +f 381/381/2 382/382/2 384/383/2 383/384/2 +f 385/385/1 387/386/1 388/387/1 386/388/1 +f 389/389/2 390/390/2 392/391/2 391/392/2 +f 393/393/1 395/394/1 396/395/1 394/396/1 +f 397/397/2 398/398/2 400/399/2 399/400/2 +f 401/401/1 403/402/1 404/403/1 402/404/1 +f 405/405/2 406/406/2 408/407/2 407/408/2 +f 409/409/1 411/410/1 412/411/1 410/412/1 +f 413/413/2 414/414/2 416/415/2 415/416/2 +f 417/417/1 419/418/1 420/419/1 418/420/1 +f 421/421/2 422/422/2 424/423/2 423/424/2 +f 425/425/1 427/426/1 428/427/1 426/428/1 +f 429/429/2 430/430/2 432/431/2 431/432/2 +f 433/433/1 435/434/1 436/435/1 434/436/1 +f 437/437/2 438/438/2 440/439/2 439/440/2 +f 441/441/1 443/442/1 444/443/1 442/444/1 +f 445/445/2 446/446/2 448/447/2 447/448/2 diff --git a/mods/ITEMS/mcl_bows/rocket.lua b/mods/ITEMS/mcl_bows/rocket.lua new file mode 100644 index 000000000..678aba4d4 --- /dev/null +++ b/mods/ITEMS/mcl_bows/rocket.lua @@ -0,0 +1,706 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local math = math +local vector = vector + +-- Time in seconds after which a stuck arrow is deleted +local ARROW_TIMEOUT = 1 +-- Time after which stuck arrow is rechecked for being stuck +local STUCK_RECHECK_TIME = 0.1 + +--local GRAVITY = 9.81 + +local YAW_OFFSET = -math.pi/2 + +local function dir_to_pitch(dir) + --local dir2 = vector.normalize(dir) + local xz = math.abs(dir.x) + math.abs(dir.z) + return -math.atan2(-dir.y, xz) +end + +local function random_arrow_positions(positions, placement) + if positions == "x" then + return math.random(-4, 4) + elseif positions == "y" then + return math.random(0, 10) + end + if placement == "front" and positions == "z" then + return 3 + elseif placement == "back" and positions == "z" then + return -3 + end + return 0 +end + +local function damage_explosion(self, damagemulitplier) + mcl_explosions.explode(self.object:get_pos(), 3, {}) + local objects = minetest.get_objects_inside_radius(self.object:get_pos(), 8) + for _,obj in pairs(objects) do + if obj:is_player() then + mcl_util.deal_damage(obj, damagemulitplier - vector.distance(self.object:get_pos(), obj:get_pos()), {type = "explosion"}) + elseif obj:get_luaentity()._cmi_is_mob then + obj:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damagemulitplier - vector.distance(self.object:get_pos(), obj:get_pos())}, + }, self.object:get_velocity()) + end + end +end + +local function particle_explosion(self) + local particle_pattern = math.random(1, 3) + local fpitch = 0 + local true_type = "" + local type = math.random(1,2) + local size = math.random(1,3) + local colors = {"red", "yellow", "blue", "green", "white"} + local this_colors = {colors[math.random(#colors)], colors[math.random(#colors)], colors[math.random(#colors)]} + + if size == 1 then + fpitch = math.random(200, 300) + elseif size == 2 then + fpitch = math.random(100, 130) + else + fpitch = math.random(60, 70) + end + + if type == 1 then + true_type = "Popper" + else + true_type = "Floof" + end + + if type == 1 then + minetest.sound_play("mcl_bows_firework", { + pos = self.object:get_pos(), + max_hear_distance = 100, + gain = 3.0, + pitch = fpitch/100 + }, true) + else + minetest.sound_play("mcl_bows_firework_soft", { + pos = self.object:get_pos(), + max_hear_distance = 100, + gain = 4.0, + pitch = fpitch/100 + }, true) + end + + if particle_pattern == 1 then + minetest.add_particlespawner({ + amount = 400 * size, + time = 0.0001, + minpos = self.object:get_pos(), + maxpos = self.object:get_pos(), + minvel = vector.new(-7 * size,-7 * size,-7 * size), + maxvel = vector.new(7 * size,7 * size,7 * size), + minexptime = .6 * size / 2, + maxexptime = .9 * size / 2, + minsize = 2 * size, + maxsize = 3 * size, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_firework_"..this_colors[1]..".png", + glow = 14, + }) + minetest.add_particlespawner({ + amount = 400 * size, + time = 0.0001, + minpos = self.object:get_pos(), + maxpos = self.object:get_pos(), + minvel = vector.new(-2 * size,-2 * size,-2 * size), + maxvel = vector.new(2 * size,2 * size,2 * size), + minexptime = .6 * size / 2, + maxexptime = .9 * size / 2, + minsize = 2 * size, + maxsize = 3 * size, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_firework_"..this_colors[2]..".png", + glow = 14, + }) + minetest.add_particlespawner({ + amount = 100 * size, + time = 0.0001, + minpos = self.object:get_pos(), + maxpos = self.object:get_pos(), + minvel = vector.new(-14 * size,-14 * size,-14 * size), + maxvel = vector.new(14 * size,14 * size,14 * size), + minexptime = .6 * size / 2, + maxexptime = .9 * size / 2, + minsize = 2 * size, + maxsize = 3 * size, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_firework_"..this_colors[3]..".png", + glow = 14, + }) + elseif particle_pattern == 2 then + + minetest.add_particlespawner({ + amount = 240 * size, + time = 0.0001, + minpos = self.object:get_pos(), + maxpos = self.object:get_pos(), + minvel = vector.new(-5 * size,-5 * size,-5 * size), + maxvel = vector.new(5 * size,5 * size,5 * size), + minexptime = .6 * size / 2, + maxexptime = .9 * size / 2, + minsize = 2 * size, + maxsize = 3 * size, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_firework_"..this_colors[1]..".png", + glow = 14, + }) + minetest.add_particlespawner({ + amount = 500 * size, + time = 0.0001, + minpos = self.object:get_pos(), + maxpos = self.object:get_pos(), + minvel = vector.new(-2 * size,-2 * size,-2 * size), + maxvel = vector.new(2 * size,2 * size,2 * size), + minexptime = .6 * size / 2, + maxexptime = .9 * size / 2, + minsize = 2 * size, + maxsize = 3 * size, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_firework_"..this_colors[2]..".png", + glow = 14, + }) + minetest.add_particlespawner({ + amount = 350 * size, + time = 0.0001, + minpos = self.object:get_pos(), + maxpos = self.object:get_pos(), + minvel = vector.new(-3 * size,-3 * size,-3 * size), + maxvel = vector.new(3 * size,3 * size,3 * size), + minexptime = .6 * size / 2, + maxexptime = .9 * size / 2, + minsize = 2 * size, + maxsize = 3 * size, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_firework_"..this_colors[3]..".png", + glow = 14, + }) + elseif particle_pattern == 3 then + + minetest.add_particlespawner({ + amount = 400 * size, + time = 0.0001, + minpos = self.object:get_pos(), + maxpos = self.object:get_pos(), + minvel = vector.new(-6 * size,-4 * size,-6 * size), + maxvel = vector.new(6 * size,4 * size,6 * size), + minexptime = .6 * size, + maxexptime = .9 * size, + minsize = 2 * size, + maxsize = 3 * size, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_firework_"..this_colors[1]..".png", + glow = 14, + }) + minetest.add_particlespawner({ + amount = 120 * size, + time = 0.0001, + minpos = self.object:get_pos(), + maxpos = self.object:get_pos(), + minvel = vector.new(-8 * size,6 * size,-8 * size), + maxvel = vector.new(8 * size,6 * size,8 * size), + minexptime = .6 * size, + maxexptime = .9 * size, + minsize = 2 * size, + maxsize = 3 * size, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_firework_"..this_colors[2]..".png", + glow = 14, + }) + minetest.add_particlespawner({ + amount = 130 * size, + time = 0.0001, + minpos = self.object:get_pos(), + maxpos = self.object:get_pos(), + minvel = vector.new(-3 * size,3 * size,-3 * size), + maxvel = vector.new(3 * size,3 * size,3 * size), + minexptime = .6 * size, + maxexptime = .9 * size, + minsize = 2 * size, + maxsize = 3 * size, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_firework_"..this_colors[3]..".png", + glow = 14, + }) + end + + return size + +end + +local mod_awards = minetest.get_modpath("awards") and minetest.get_modpath("mcl_achievements") +local mod_button = minetest.get_modpath("mesecons_button") + +minetest.register_craftitem("mcl_bows:rocket", { + description = S("Arrow"), + _tt_help = S("Ammunition").."\n"..S("Damage from bow: 1-10").."\n"..S("Damage from dispenser: 3"), + _doc_items_longdesc = S("Arrows are ammunition for bows and dispensers.").."\n".. +S("An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.").."\n".. +S("Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons."), + _doc_items_usagehelp = S("To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it."), + inventory_image = "mcl_bows_rocket.png", + groups = { ammo=1, ammo_crossbow=1, ammo_bow_regular=1 }, + _on_dispense = function(itemstack, dispenserpos, droppos, dropnode, dropdir) + -- Shoot arrow + local shootpos = vector.add(dispenserpos, vector.multiply(dropdir, 0.51)) + local yaw = math.atan2(dropdir.z, dropdir.x) + YAW_OFFSET + mcl_bows.shoot_arrow(itemstack:get_name(), shootpos, dropdir, yaw, nil, 19, 3) + end, +}) + + + +local ARROW_ENTITY={ + physical = true, + pointable = false, + visual = "mesh", + mesh = "mcl_bows_rocket.obj", + visual_size = {x=2.5, y=2.5}, + textures = {"mcl_bows_rocket.png"}, + collisionbox = {-0.19, -0.125, -0.19, 0.19, 0.125, 0.19}, + collide_with_objects = false, + _fire_damage_resistant = true, + + _lastpos={}, + _startpos=nil, + _damage=1, -- Damage on impact + _is_critical=false, -- Whether this arrow would deal critical damage + _stuck=false, -- Whether arrow is stuck + _fuse=nil,-- Amount of time (in seconds) the arrow has been stuck so far + _fuserechecktimer=nil,-- An additional timer for periodically re-checking the stuck status of an arrow + _stuckin=nil, --Position of node in which arow is stuck. + _shooter=nil, -- ObjectRef of player or mob who shot it + _is_arrow = true, + + _viscosity=0, -- Viscosity of node the arrow is currently in + _deflection_cooloff=0, -- Cooloff timer after an arrow deflection, to prevent many deflections in quick succession +} + +-- Destroy arrow entity self at pos and drops it as an item +local function spawn_item(self, pos) + if not minetest.is_creative_enabled("") then + local item = minetest.add_item(pos, "mcl_bows:rocket") + item:set_velocity({x=0, y=0, z=0}) + item:set_yaw(self.object:get_yaw()) + end + mcl_burning.extinguish(self.object) + self.object:remove() +end + +local function damage_particles(pos, is_critical) + if is_critical then + minetest.add_particlespawner({ + amount = 15, + time = 0.1, + minpos = {x=pos.x-0.5, y=pos.y-0.5, z=pos.z-0.5}, + maxpos = {x=pos.x+0.5, y=pos.y+0.5, z=pos.z+0.5}, + minvel = {x=-0.1, y=-0.1, z=-0.1}, + maxvel = {x=0.1, y=0.1, z=0.1}, + minacc = {x=0, y=0, z=0}, + maxacc = {x=0, y=0, z=0}, + minexptime = 1, + maxexptime = 2, + minsize = 1.5, + maxsize = 1.5, + collisiondetection = false, + vertical = false, + texture = "mcl_particles_crit.png^[colorize:#bc7a57:127", + }) + end +end + +function ARROW_ENTITY.on_step(self, dtime) + mcl_burning.tick(self.object, dtime, self) + + self._time_in_air = self._time_in_air + .001 + + + local pos = self.object:get_pos() + local dpos = table.copy(pos) -- digital pos + dpos = vector.round(dpos) + local node = minetest.get_node(dpos) + + if not self._fuse then + self._fuse = 0 + end + if not self._fuserechecktimer then + self._fuserechecktimer = 0 + end + + self._fuse = self._fuse + dtime + self._fuserechecktimer = self._fuserechecktimer + dtime + + if self._fuse > ARROW_TIMEOUT then + self._stuck = true + end + if self._stuck then + if self._fuse > ARROW_TIMEOUT then + local eploded_particle = particle_explosion(self) + damage_explosion(self, eploded_particle * 17) + mcl_burning.extinguish(self.object) + self.object:remove() + return + end + -- Drop arrow as item when it is no longer stuck + -- FIXME: Arrows are a bit slow to react and continue to float in mid air for a few seconds. + if self._fuserechecktimer > STUCK_RECHECK_TIME then + local stuckin_def + if self._stuckin then + stuckin_def = minetest.registered_nodes[minetest.get_node(self._stuckin).name] + end + -- TODO: In MC, arrow just falls down without turning into an item + if stuckin_def and stuckin_def.walkable == false then + spawn_item(self, pos) + return + end + self._fuserechecktimer = 0 + end + -- Pickup arrow if player is nearby (not in Creative Mode) + local objects = minetest.get_objects_inside_radius(pos, 1) + for _,obj in ipairs(objects) do + if obj:is_player() then + if self._collectable and not minetest.is_creative_enabled(obj:get_player_name()) then + if obj:get_inventory():room_for_item("main", "mcl_bows:rocket") then + obj:get_inventory():add_item("main", "mcl_bows:rocket") + minetest.sound_play("item_drop_pickup", { + pos = pos, + max_hear_distance = 16, + gain = 1.0, + }, true) + end + end + mcl_burning.extinguish(self.object) + self.object:remove() + return + end + end + + -- Check for object "collision". Done every tick (hopefully this is not too stressing) + else + + if self._in_player == false then + minetest.add_particlespawner({ + amount = 1, + time = .0001, + minpos = pos, + maxpos = pos, + minvel = vector.new(-0.1,-0.1,-0.1), + maxvel = vector.new(0.1,0.1,0.1), + minexptime = 0.5, + maxexptime = 0.5, + minsize = 2, + maxsize = 2, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_rocket_particle.png", + glow = 1, + }) + end + -- We just check for any hurtable objects nearby. + -- The radius of 3 is fairly liberal, but anything lower than than will cause + -- arrow to hilariously go through mobs often. + -- TODO: Implement an ACTUAL collision detection (engine support needed). + local objs = minetest.get_objects_inside_radius(pos, 1.5) + local closest_object + local closest_distance + + if self._deflection_cooloff > 0 then + self._deflection_cooloff = self._deflection_cooloff - dtime + end + + -- Iterate through all objects and remember the closest attackable object + for k, obj in pairs(objs) do + local ok = false + -- Arrows can only damage players and mobs + if obj:is_player() then + ok = true + elseif obj:get_luaentity() then + if (obj:get_luaentity()._cmi_is_mob or obj:get_luaentity()._hittable_by_projectile) then + ok = true + end + end + + if ok then + local dist = vector.distance(pos, obj:get_pos()) + if not closest_object or not closest_distance then + closest_object = obj + closest_distance = dist + elseif dist < closest_distance then + closest_object = obj + closest_distance = dist + end + end + end + + -- If an attackable object was found, we will damage the closest one only + + if closest_object then + local obj = closest_object + local is_player = obj:is_player() + local lua = obj:get_luaentity() + if obj == self._shooter and self._time_in_air > 1.02 or obj ~= self._shooter and (is_player or (lua and (lua._cmi_is_mob or lua._hittable_by_projectile))) then + if obj:get_hp() > 0 then + -- Check if there is no solid node between arrow and object + local ray = minetest.raycast(self.object:get_pos(), obj:get_pos(), true) + for pointed_thing in ray do + if pointed_thing.type == "object" and pointed_thing.ref == closest_object then + -- Target reached! We can proceed now. + break + elseif pointed_thing.type == "node" then + local nn = minetest.get_node(minetest.get_pointed_thing_position(pointed_thing)).name + local def = minetest.registered_nodes[nn] + if (not def) or def.walkable then + -- There's a node in the way. Delete arrow without damage + mcl_burning.extinguish(self.object) + self.object:remove() + return + end + end + end + + -- Punch target object but avoid hurting enderman. + if not lua or lua.name ~= "mobs_mc:enderman" then + if self._in_player == false then + damage_particles(self.object:get_pos(), self._is_critical) + end + if mcl_burning.is_burning(self.object) then + mcl_burning.set_on_fire(obj, 5) + end + if self._in_player == false then + obj:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=self._damage}, + }, self.object:get_velocity()) + if obj:is_player() then + local eploded_particle = particle_explosion(self) + damage_explosion(self, eploded_particle * 17) + mcl_burning.extinguish(self.object) + self.object:remove() + end + end + end + + + if is_player then + if self._shooter and self._shooter:is_player() and self._in_player == false then + -- “Ding” sound for hitting another player + minetest.sound_play({name="mcl_bows_hit_player", gain=0.1}, {to_player=self._shooter:get_player_name()}, true) + end + end + + if lua then + local entity_name = lua.name + -- Achievement for hitting skeleton, wither skeleton or stray (TODO) with an arrow at least 50 meters away + -- NOTE: Range has been reduced because mobs unload much earlier than that ... >_> + -- TODO: This achievement should be given for the kill, not just a hit + if self._shooter and self._shooter:is_player() and vector.distance(pos, self._startpos) >= 20 then + if mod_awards and (entity_name == "mobs_mc:skeleton" or entity_name == "mobs_mc:stray" or entity_name == "mobs_mc:witherskeleton") then + awards.unlock(self._shooter:get_player_name(), "mcl:snipeSkeleton") + end + end + end + if self._in_player == false then + minetest.sound_play({name="mcl_bows_hit_other", gain=0.3}, {pos=self.object:get_pos(), max_hear_distance=16}, true) + end + end + if not obj:is_player() then + mcl_burning.extinguish(self.object) + if self._piercing == 0 then + local eploded_particle = particle_explosion(self) + damage_explosion(self, eploded_particle * 17) + self.object:remove() + end + end + return + end + end + end + + -- Check for node collision + if self._lastpos.x~=nil and not self._stuck then + local def = minetest.registered_nodes[node.name] + local vel = self.object:get_velocity() + -- Arrow has stopped in one axis, so it probably hit something. + -- This detection is a bit clunky, but sadly, MT does not offer a direct collision detection for us. :-( + if (math.abs(vel.x) < 0.0001) or (math.abs(vel.z) < 0.0001) or (math.abs(vel.y) < 0.00001) then + -- Check for the node to which the arrow is pointing + local dir + if math.abs(vel.y) < 0.00001 then + if self._lastpos.y < pos.y then + dir = {x=0, y=1, z=0} + else + dir = {x=0, y=-1, z=0} + end + else + dir = minetest.facedir_to_dir(minetest.dir_to_facedir(minetest.yaw_to_dir(self.object:get_yaw()-YAW_OFFSET))) + end + self._stuckin = vector.add(dpos, dir) + local snode = minetest.get_node(self._stuckin) + local sdef = minetest.registered_nodes[snode.name] + + -- If node is non-walkable, unknown or ignore, don't make arrow stuck. + -- This causes a deflection in the engine. + if not sdef or sdef.walkable == false or snode.name == "ignore" then + self._stuckin = nil + if self._deflection_cooloff <= 0 then + -- Lose 1/3 of velocity on deflection + local newvel = vector.multiply(vel, 0.6667) + + self.object:set_velocity(newvel) + -- Reset deflection cooloff timer to prevent many deflections happening in quick succession + self._deflection_cooloff = 1.0 + end + else + + -- Node was walkable, make arrow stuck + self._stuck = true + self._fuserechecktimer = 0 + + self.object:set_velocity({x=0, y=0, z=0}) + self.object:set_acceleration({x=0, y=0, z=0}) + + minetest.sound_play({name="mcl_bows_hit_other", gain=0.3}, {pos=self.object:get_pos(), max_hear_distance=16}, true) + + if mcl_burning.is_burning(self.object) and snode.name == "mcl_tnt:tnt" then + tnt.ignite(self._stuckin) + end + + -- Push the button! Push, push, push the button! + if mod_button and minetest.get_item_group(node.name, "button") > 0 and minetest.get_item_group(node.name, "button_push_by_arrow") == 1 then + local bdir = minetest.wallmounted_to_dir(node.param2) + -- Check the button orientation + if vector.equals(vector.add(dpos, bdir), self._stuckin) then + mesecon.push_button(dpos, node) + end + end + end + elseif (def and def.liquidtype ~= "none") then + -- Slow down arrow in liquids + local v = def.liquid_viscosity + if not v then + v = 0 + end + --local old_v = self._viscosity + self._viscosity = v + local vpenalty = math.max(0.1, 0.98 - 0.1 * v) + if math.abs(vel.x) > 0.001 then + vel.x = vel.x * vpenalty + end + if math.abs(vel.z) > 0.001 then + vel.z = vel.z * vpenalty + end + self.object:set_velocity(vel) + end + end + + -- Update yaw + if not self._stuck then + local vel = self.object:get_velocity() + local yaw = minetest.dir_to_yaw(vel)+YAW_OFFSET + local pitch = dir_to_pitch(vel) + self.object:set_rotation({ x = 0, y = yaw, z = pitch }) + end + + -- Update internal variable + self._lastpos={x=pos.x, y=pos.y, z=pos.z} +end + +-- Force recheck of stuck arrows when punched. +-- Otherwise, punching has no effect. +function ARROW_ENTITY.on_punch(self) + if self._stuck then + self._fuserechecktimer = STUCK_RECHECK_TIME + end +end + +function ARROW_ENTITY.get_staticdata(self) + local out = { + lastpos = self._lastpos, + startpos = self._startpos, + damage = self._damage, + is_critical = self._is_critical, + stuck = self._stuck, + stuckin = self._stuckin, + } + if self._stuck then + -- If _fuse is missing for some reason, assume the maximum + if not self._fuse then + self._fuse = ARROW_TIMEOUT + end + out.stuckstarttime = minetest.get_gametime() - self._fuse + end + if self._shooter and self._shooter:is_player() then + out.shootername = self._shooter:get_player_name() + end + return minetest.serialize(out) +end + +function ARROW_ENTITY.on_activate(self, staticdata, dtime_s) + self._time_in_air = 1.0 + self._in_player = false + local data = minetest.deserialize(staticdata) + if data then + self._stuck = data.stuck + if data.stuck then + if data.stuckstarttime then + -- First, check if the stuck arrow is aleady past its life timer. + -- If yes, delete it. + self._fuse = minetest.get_gametime() - data.stuckstarttime + if self._fuse > ARROW_TIMEOUT then + mcl_burning.extinguish(self.object) + self.object:remove() + return + end + end + + self._fuse = 2 + -- Perform a stuck recheck on the next step. + self._fuserechecktimer = STUCK_RECHECK_TIME + + self._stuckin = data.stuckin + end + + -- Get the remaining arrow state + self._lastpos = data.lastpos + self._startpos = data.startpos + self._damage = data.damage + self._is_critical = data.is_critical + if data.shootername then + local shooter = minetest.get_player_by_name(data.shootername) + if shooter and shooter:is_player() then + self._shooter = shooter + end + end + end + self.object:set_armor_groups({ immortal = 1 }) +end + +minetest.register_entity("mcl_bows:rocket_entity", ARROW_ENTITY) + +if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then + minetest.register_craft({ + output = "mcl_bows:rocket 1", + recipe = { + {"mcl_core:paper"}, + {"mcl_fireworks:rocket_2"}, + {"mcl_bows:arrow"}, + } + }) +end + +if minetest.get_modpath("doc_identifier") then + doc.sub.identifier.register_object("mcl_bows:rocket_entity", "craftitems", "mcl_bows:rocket") +end diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_0.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_0.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f4f81b30749b453245ee3b3280244ceecb167fe0 GIT binary patch literal 13529 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

f;m2@iI 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�RIDaq3pr3&2e)p%3JgIJo9SYPvCD-qn}cSOHJO)!ik!QXO}FU8jhBy zwHa?z75N{i*((o}9`wl~^m5fDk9Vc*XE{qGz;?9C6oHTd%DCDzc;jWw6%{yaIE>pvc?tn&gEWPh}go$Rt3IO1JX zKdgc>(6q$?RKPip=aOp53YFpRWScxkE%0rRfZa@?9@%L-sd|Z$m#RHA7p#&-%`1BU z?C;7V-?i(F&?cQ64L%2*(O-Z1pkEUrdgX6=@djJBazi3%(I_>b;cdib7hfH(=;inH z(FMx4lYu5~oR>DulE%Vgr&MjI@#kK8QX~=9#F3N_pVV{bSC!6XK02~07Wm@{p!J|K z`{wt1S7G=wYYZ#C&%hM-FExP77pQrtGm#QbJt!>~xH2(qZ5G!T%xwO)a?6&y<+YEz z7#_93AP8x=dwW8MX8Nst$4o+s@1EVDkCYrU(Oj};T2I(zMk1;5?TF+kX#~Xy6H_K; zgWZr|(xHo;4OztO`c#4BO*d~Hin%G^c}y(i)JCC!sTaZmd$*58BG-qp#~a-u4}@*C zh{BA2yg!$NN~LRO@Vj}NWotCSdVwSY!HAZL$ct)S^uvg~E<0sA+G4X~u; z5sX^k15BgX5X?2s(%GNX4&Sr}oN}w|nvkwJdX%RYhid|GHc_Z(L^qzvlF6ZveTy_o z&K(w%k551L`ueBgX0FBRb6ayeLcsdrI#7$Mqfz0yiAtDUkbcnDcnKc$W^Ui9+}wGv zW!+6ST|*)gnaE{n;p^2op^VxToJ+JJ8w;KpFl%)$Xq~A`77L}&ozn%2G5O}ZQ0)4_ z6qxH;)UPxwxTst{F+n?R+8csy9~p_-ESCqzi-nvf-Wc3J>2y>EXhlkIySZ0xo(Q`Y27LSC}jZ))CzPAS!l~ zN4oOSU^oEUkjsUxl^nT<8AI*29A;4?n4G&$Y8qdkGqb|5hRVp`Cb1`Bd z+Lnt&sv|gAO%ZXoa6edoPso6rI5cC5!dYyON1-!_NNKXVILlM2gn?hsR|U1I3C*bI z12l0I2~n|btk+~|T=7mIxLYU?N`(@-%#NES!Lb^!kpIL5Lo;}wDCqoY!~13BX(=IN zLU`1HQ3@IOU=%{^&yIU+HJX;>RxCJG`QUermWL`4>8XhT6_%renL@9uC$~JO)sOh< zvWCSZiGbO_1ns6?>t{r~dihP86*|oVDBLVIs(na}VV=d_hT0~t*A@EUrIUoosGZSK ze*Dr>FC}Hb)g=oztSV0P+i_&~+e1B4Tt#JDClTK<0J$-H!7cjnZaeoZ-&h!kG`uwi zn{hEcKrrtN!vSc9^xhC7fXS@qet5ZiE;RQ2+Lz%zvzOw553`hlg|3yIqt8zJ?#5+l zKbF=~jQiB0`j!AuF3^1n1Z8$k${4ArJi>~j4%VmWfr$DD3?_D8Lf@tH#s>v(CoAE> z3VX8V(|G*0b7aCt-be7eCSVJQ4*OU00{Oa&S z;!j6z)0K*f3`OHAILD*GDzrkridtj}MSx_1^728Fm@O3`!I@pBR}OzOt6sJ2-uMub z#FI)m9k(PQO7_R>IdsS@2{%Rlw*GKR^?+>aI;!WM7rQZ(*zDFVXj6)j>aO3AfH9Fh zOyD8>F=ZS}Hf!2ipw}GC80J8ic<&2CuU@y~Q3)FDaCCGHUT;JT&{@iQ6Ljv6WOCpoOV=?JihL$IGkQ~v?YvRa)8DM-Ai-Bzd>SsJJdVF-h zez%Z&?(EqwNrnQl9ymyr@E8}S^^Ef;;k^s}LANK9N?^MP>w?ud)i!=_Jbgpawaa^> z0AbUYbMGtCM0dl{;vtN%TQWAZxb*sONlIWu-96a$qpL&C0B9Qo5?U7t0!3I7D1 zZa5W@*N{J^^mJF#q>{CZ+2+Q)m`1N1$@X{d8BFA-%#26_TepmR>sUE%uJu=Knli?tKq33-*no}69J^c zGNM<|@-U?0vXJ&i+<7@B2=z_Rq*j&613J1x06*BKN6;fA3q(=eCCu6NK|-)8p?U9& z5b~sg(Op8x;JdCAMzfGoFZ#Vd9(ZfE-Ra&^-y@9=!dBt7>eN;yDH;0e9wZ_h z9re>_Gz`7GAG6aDd~NLGboblGE3@ub-(-Hjv>%&^u+m zF&i}~xiw{PDG`t2FI|reXAckFX!~=F90NOfwtd4p%G9|B_u(57k}pgJ^zLlC^QWh- zL4Z=bZ^p0)DP&{nc?@$Li!m%#|Gd~EgG}OPag;lDjppmSM7jy!)QhoTH>9K7TTO-RN@4N2$A4m^ z0wI|wlGu}m;5SEqZwZuGHQ<4D$h~TwX|*rS_Bnj}Eu`-aYpiSD6(|^|nHfR=)ZxyM ziVar{tXlmWXF}wcT{x>}r*{FLM6_I~v{x%bvi@a3=AO;p?I@DOI)B^OWpl|un02qU zGJqf~UfjL8J0Pyhefq__S1ns4WIMwraR+^-XR(=Dk@JK*UjbBpp>HB-&vMQ&~G@^V7F zmz(?H47oK38S1(5*^-SLOYZa92ecs%9%1=n*$4G(S}Jqc=W)<_$M1yW(gTk zOb^P<@9qpOere8?;Vx!N(my8vVOZJF@defu1j7IZMg9!wMRL0$t;@~JUF)mC$5VRn zSZTQk3JGTlky&h6b^QL*pXGYftPVVkiSoPMq6Ni2kp{n|!d4*9P$a0cvACO|{Hr4M ziu(&y32v_0Hh`A0z}lob`M_5*i!nVSKO(m)>Hf##{i^4{{W~rMnE+L9G2Sa(9cY6e zB9}Ar52LkxsdFmD!H~)F)kW!|LJ*uH5`G%v%PMnXv4$ZJp!`+zIkZ*^aa7{tQqX8; zyv}rAbqZK-e~%=T*Z~h-?7eC4P_b-D%cp&{@9Fm^Q(s>j9sdeTxJq&MFwtp(B3Ru* z`~}CY$Azv3qNd;101d-+{#un_8Mll~>fXIEut5Udi0m}zUNTXH8~~`_&aZszZ&Xk7 z@SVS4|ArH9>vBMXsW=1jR=pZ?2ax=bXi0aEHM5;4kwj#rNc=&q5lE`DaM5x;CwS~^ zor!bzR+sqazJOAfFpF2|Y6G}v&!nu8Zla#h$(5;;#smf*6W_)M7-(2dLze0e?I z=)*vuuy*L%__Iq{bWJAVWkt}tabJXuOS1S-T;Bu$yh=P*HVRo%RR>f?x+6+=NeISm zyBmX2B!s@y+j{1~nut-jG^4a`YHXJ)EfuYY*3+%LoceG_o3nl3Y3t#pgH~1)MmN=3 zz&^yT#4;g;B7|%!88Wb}uv6Cyd(F0NogwG!EF3zS!7%fWHg}k4u+j^(;S7?C>fR>A z6)JbdUN3Cb%_Y5mLSEf?OY%v()4b8>*iruDeip9Y@I>`%GV0>jZ;rX?cVJ#8UKt-U ztvML^RtZ35FovIFGDq=J4h5MR!lY}n)y=Dl?lO8Rm85q)&P?fdgw>XRO*(B~b4K6yeP`Sm=zyZ&gu*5zaB zzDWlN4&A!7BuyG(nHVJlbuH7Zq<0(AyhpSeifgz_r1yd=tzuYokRmNs6@g7DkO+Ec zc}wdk56{{;uI-g?XggJDgP{A`k%i=9<3J+y@+&jZ$yHei&eHAjUdKREz@fhNQ+K{h z@A`HXG2OCJ#k7#V65w-agJg32gR_ZmQ?oo|N6+oKO5FI6tTI|dJkVgi_R%)vtz&li zo_do5=&d_-U!DfuB*68kI3>1b3YroE_+)J&nf#1oC>Qz-}lWR$I47kH*^#9kw5m2*oG85 z8@ic9kMe~aJdexap1!MR&*iY_kdc54s|DUlC81nZl+wTB#7<~Xr? zNQliG6|$`xT^6SgCzV0J1R;&$!BMd1)o2=La_^}fV`@QZ+4yOiZEMfvjYcsThX3o( zJIqe-rhL;`b>=>`B)2K|i@J*+_o|XhkL48Tnh&j*i1i(f0vsrz@Y^t#p=qvE5Q)!80O+XJ6Yf3#Q1-EqBodgo4aC}{NgUX^^9;k8GiT?UEYKXjMDX>Cc_}U&**4*Jkm;1nT)jW!=?Dx|6X0-=lZ*(D#vvS-!kZ?X4`Vz z%ZD(^ia2&!Ib=`5RhK8_-x}4qec+&PaZ}chM7bg4%L^=POX8uW=C_3dd}y0sO`Z-_ zrZXTjxH4qw|Hg)HH=-bQ6k!hHbJ zDUoi|6YsDl!Qo=UN~o^cM!r<&bLE}Sg1?j?S33Yif!m7nzpN?$Y0p+evfUMZY5wc=Y>*GTS z$6P#lHLYVD>zYEkmu1boM?p%(Mdp%}_2--6inw+&pripgNE-M%U4K;o_Tw2<+{dpDBq-4Lx`nEua(_1$v-VaNF(E^k#9`g2K&Oyl$Eaau z)adr8-`b+qwI>C&eRG(3x4CyC@o%0ZcM)TkoJr4orGI!%B|hhYbB+l$-!v%Sd{^BxWc0)!lMG=6G09>vp71lRC-bz+kb4j^WWC*p0g(26snNtP~uJh z<~dyi19!-qnr(dF&hK&65G2rTl!bp+003RN>fUqb2#sz#N_QNk+cFue{(FysMn@fd zhaDin76G6Sz{Bd=k=>eF;khoEBrby5ZO{|!`g?g*aCSzni3jz$QQ&2iQftW|HBD#a z0Vl>VfsrL@jPxYgw)N7D9!XT7V-Eq2=mX7*Fauvj18+sh^W=p(419H9SG48P11eoZ z4n*x$L~Y7^_djbPMh-M3sD4`pVl>2n4LN+{1##(GP9Zu#k>o!w|AH6I5$69lUPK39 zBE$DT=k$Lo{GSB=tpp$whiO88x^72|tQGjqFpx1x%*Rn*Iq)NbUaj1T_0gVS>#kf- zsxthScR&I5jl<5xD;LzN<~l4mq;f4K`g>*waJ!&^LlCj2eBjBszw8?NkXJt1wW>p@ zF$yb(Q=`v2gh~JP$MFH+!&CqtX!jGpe^ZsG768uqkwH*?;h7%=1N^9bP7YKamd2b$C>gKq|#$*5aqCgFGP6*F6Nfj)=8mALYyNUO$=Em zkmICKbWxBKF+*+?Me(Ddd7Z~>6dCh<{Yt5Hs`Hrj0Duyx--@Dwlqcl9W++9U=z;-U z7sBPB& zy=-fW>2RZ>e6KoOHJxq=2Yf?k=#Py^OK(sDZ=h^1qA>ij%M(*KFT&&U1TCW)Jt)1Y z(}|GhIEDEHC{OnDx>N$;ENUVly7B_LD}>X85{_*UNp&IJ?P+-elz&t}Brrgnm$oq0 z&rXXmCvFVrnvkpOkOd@eYJTmmLl#ip8k1i=k11Vw?VI#>9r`BY_z*}NazU95$aPdF zl_H_uFeIondA=)^PM>d+%l}4V*e$v6r#rhKxhF>HcgVxHjT!*{TLG|Y3QJ5a5X-ut zK&K#&m#GAVC6se18&#v+JT235|6lWm@u4|<)VCXoQ+C)lC=U7eTgyN0FaMj+IEUBR z$^v><(-et8siNf#rWKeR<%QU0Er3vkv`!Kbo|+csdwF5pvR&|IMa3Lpqnm($sHq;| z#1eF`xu_heF60O;+a5p)f^g7QIKgU0HHDlk+cv$jSR+VlJO~%D+^ZGBL0jS3c%6iB zvK~F2h=MO$Cm-cCI$AzT@Rp5oA{tuFtFrUuxQ5m-<3hT9uTCHYm8RPDe$V{RRE?mr?Q_M-| z4hflFuiV1qc15q&OMuJ_mny%BRU_sGNKkqS=}bT3uYn_}`SgBhhI{~GXI3*ZKLan% zguUv%57ZPE(&y$P=2B$nDk{%ZwIJIqq(k%4ARhC%Gb9is#A9y23%auExT($$6y`&8 zHQxpxM$r1-1|UYzGV?PaK%RmZ$!X=lTw5oHpzeG-KTrcPf{^nlIU}h1ZM`{0g>J_x48Q%by0a`AY+OM@d02ln1GJ2-+-~P_~7KzSD%0? zTHnZ$;6g&r4gUZ>0pLmJ3k2N9&aNw06Wz!jo?bqF0nqUVn~Q`*07D?=FP!o|0`cvo zW9~Hq0QpOYJS;x?v?XUXOkODN0e)1kHGU2&oxQz0*LeH*czdt$_40J`Ad`JOy;uF< z>_YYPU$e?(rL)TqRH_%nf7Z>*hwMWINM!)tDSgd!BKqN8NG+cFx4_~R;?|a`n)h7_ z#f66XZi)`ksQPfU^V$l3-Vk>%#uf{&pE|NTI-_%c%WC00{hJ#;ePoyOL zV=*t^$5r8t@z_VR+Gt9K2byY;z&riKB)O)h=B7YYD>CN-1I+<_?T?zvbgs1+{sX*I zDy~&3QHxol$!A)NJt$1_P~GdeTZJXYW44Spo0c*uqmpo0sG+o^s2-a|VlqfA6aLzJ z%WuE-YF>J@N%J{n$Eo~=0m}yWpNDLxY>gF3Bz8PWX+(nU5lf{k*~P*bu)-`DpjovX@v51aGU??T;&{+3LNZNgB=L zzzvOA%tn@@n5&}^7dS3u@pRA)G0cm;`D0#xF1*{9v`mZ-XVyCk@e1lMyvWt6SDF(< z$~(-AucvPK?WD&NetCI$Fp7_?RMFdZbA*)4<-FMd_!-FAW$&ztn4OnHo1gqE$Uxftbv6IP*;Xu1>2~ajq zAt@8RRksGAi<{J|D$(TDvPIn%W$PC))h(iytWP9af)-e!l4nwxVC1w@We%v@qMg_I z5!QF><8W&zmW0D3*!8)FC-QGdRQbkiOPE&98OSq1`r@nfX8~j+T#@cdL z%i`kxN6Dl6z{7`n%JNm4=;v+F5A!Q*_gf!Qihp9WZP$f1|K`J7cvzfK} zUb7L4j{7k3_ZA&#`SBNiUO|DHaR7{wJ%D(%Gn>t1>WDl7HbKFcj20Q6z4qYcWbKDD z=$}r6Q$Nq<`%^}dLJy$x$M!+uoiEg$grDzkQPCK=a+tBQ{a&fDbyKQS9su2(Y@wB| zXbih90M1luOs0(LQHqWam`OcaJ)#H-V$S5i;pX0C%#Hd6b%iAAMpahCtwlE>n?y1DPPJIiQO5tLWva5WuogZ{_2VmLGUu^($5L9;7WJ{ z|0zoS*=sM_CF#{AQ-wdDqBEMMZ!=sU+42VLmzyccCIAYZLKu@W8--jQ_`1ZgKfj*d zA2@`^io|^%_TG|SsT<*@zff!*@~Tj{+m6fGZ9 zr7%rCr%5Jb!x5M6g{!-kd;B`fW{k_c0zz-%Z^OJx zDWmTnJ=OoL$-ZtQJ+^GkwZZnb&E)VDOsWeI(6VVVWswvwH0A`@vWTO4C{Z%akz=S} zt;>VSJdIM(JdD8_<*ue2c*BgBIOo^);li2H{WH>N*U|Ak2CI_(2Htk1=<8>fuY|cMNHB~ZkBmkuRw5T(Z#>2&<=om~ zao}Z6{9$A>+Ino_%!6}Swgg^`9GN*~kQ(#T)eEkN52OTK8Q8V6zR2D<#4XvGN_H>+);pMC(z55(lE>bM=4(-j%kpv z8R$k2OiQv=t4X#Vj}iCFn;6lX=0vuILd#cVxs8_Z+HqOzEXFy=wDee0#0<~xr=XxiON%0q>$%sBSC}{_6QTWC3-Z1!hMau_DI9%dU@Lu1FN=*=bc6WUc-B`cKuU-viHntvmZ> z*Q8ImAIN^bJ>hEjlm;O&w!JJtH*kxfPDLTNAi_Q#cq#0$Jcb{*A845nbG-Z(asa(X z&G7l7ot~o$j84PKf8TB#eqcsocjzzR7eFG#+qx*20qWxY?w<;2Iz3}j`j@1A&<&6^ z?f#-w0Qs#%cSYuQu1)}R_FiG?+uDM4(1A9PdDG;Qlj+q}h*`lS^7FjNMOsf5r?$6Y z?WvI@$jJ4q1p->5K-pmo$+~Ms+`Qi6~LQ+k2S z3|en&tH1YcSBMc|+Pm6pa?3Bp?+fA4$xWF?p+uRow~u4PB5o|1XQ<2&`5B%IIT8+~ zP*)9XI6Yzx(K@-&t)4AYkm5LS3aI|NCp$XOa-q%eFROc7>I&70m*5ETE0s9Po?NLlzaf|EmlMVXU7RZAl)_^#w_IH%9*LQ)c<|&SJID5`laLD=fn{}E z+V=(ZCfKk^P-f7#!04JGA{Upk&k+n-?JE)JWjxwf7}8iNmSQ9C@G?d;uKhTi+)mPG zRB_d-Rn@>mw#?w!a4H;Z?PY6zP*FhSUm#Y4N|@*58~g$HlN8fCdz6r3M;3kBu(iKz zd?>ofAGD}u89dD}lUaPcl}gckcOiegU{-EWc?AkEB9$M%%V4$Axn1Uaqn}VVf8{OS z=(=gD;0L7rLlF7e%eju?q;h^m*4pz_+h!NknPuQ4&PCq_U~uML=!Ni9QY>oFvhe!V zy#2zV@g@`XH9HN@hc-Cks~>IG!ZphBC9=cCx2XJ!9}J09XpDu8XdHJ}H@&l%ySHJ{PZ@fi zovQ}_7~j(Bo?O1t2*D3K-u9t3S|CL;8P=S}URKAokflE+&h9w*#q_wzZV_7TSl*8( z-#E01#gccgy~+{Pr=sbPe*x>?>(<~F6qg4pqL^qNnZQb9o467qBI?*yV+?hvAEUwD z0sqTQ78#ZG0eHU9?R zEiJXT_smr@SLTQINRZNG&3Yt9WQA*Q=M0R#xc=znQx{@(;?ofcqN}wj28|wKXZTUF zb@QDr7ir-^NA!hY%Y6#`S!!!h^Jd>W;)X&@QFH#m{z?fscUC9D&&<5|!356Z@?{_U z~d{hy{q=&a~>Sx6*>y}RDa%Jgp1qFX=Zjy}{^HYv)pdiU_L38K^zJ9+O* z87q6ybYt1XQ6&p*oCcyjRL4tAET4UcUFn?6%H^ zDS#FMCFF4~a7nyt6|j?{*jM+K^>wT{uV4ZAd66~i0;*o9DZ@*p+<+l2U}lXAA=jkT z$B-#;$6n{xFi!T0m$k5(Duulq8Uwt0{-x#8Q^A7WS|7ecXMnb;#Wg^NcPIoejtcUi zsZCdknT#G?T7%%}t2;3kQUMebpB67$E1LY!A4o>?VrhZhSR@ny&G=Lm)~2&=s-f5S zjjFJXNty|u6j)l45O2!Np(D*5jo~eVnnvC^4yC0t=T9*A5}^cK=Uy`A zULxebqDAZ9+^g}Y#*facJ(z*sf2vH~y6&W2hWGFQB{$Qbop}3!P zc^^Bwhwfr*z5z;dwm-D%F$5sMBnn|F84qg>mjx2Kdk@8@c7&rAF2pRHcx#qAlb(iI z=n!R0w(efiwBd^X3k=#0C&uue7o2jQ-i^m8>NTQm z#PlI0c$e;{q{uAhPRqjZbFm9?N~;dJD23i!Dutgt{pG}G?eW}{X2pQD-kO&)B+2ZS zHa4wVwOnBZ^eDp~6gC)3y_S znr{9}5|fByfoPn6XnZ^%qpZg|c#UVsR%BwgYwiK+uNx~I{gq=3n>E26coxkeD#?ic z%JWQe55Bbd49aq+sR|?JL}6~;IsT{uE{5RY`$yXa+RB-XAFW@WJ+xxYgC$DjCKeCi z!Jha1s5+m3u-Q>-_iB4m+H+=Lq+3&-nmMpz(ORKbYGX0Y@1wX9Z;Yjlbk<-n=%LK} zysy8P_nT(`=T5-=tw``t^?1T5CC46h(**;4 z+CM$nsTw2H_gq~38fIRCyU_tE&G`UW6Hgl3=#2_lGHE3zBc>;u$ACxoL{X07rN+ux zEZIY~j(+>SA#@spQqKh4uq++6Q++_hLKPc&=x+^fqC0B2eVNfPJRF6A@AnUqK>1O3 zKr6Q!+xYAlQtDw7YN*~I6|$=y{Ez{}7_v<$Gs4iy6-qBUH>gY1pPYrMg(@imhdNd4lYlk-~o3I(x!HxCVUy|q)b!EcXxUk6Q zQNQ!n+@$wb8D>gqXL^9Kp3=6M7HyBl!{H#n(W3?V%ItW*RTE-O5J{ac4osn)%6hi8 zXrh0l`}psX)5`t{i`!2QsWzDOqt7hwQ`Bn`!$WSni z*ed=vekiup<*5TOb3Jk7W*Q6xxHqg5ScXc*xIN+OKn1McU|Qz?W^ZL3N*dwOJY)K& zN-6Tl?tvN&)#tWFin5fFl#&vn)ds&Xb3YhtIRLC@-QgRL>wRF=_c*{YKU@fRY-~#p zyLm8OnCPx?p)LK&)cm%K;sxa63b9rg9?liG&#hwD!F zkvq4i5=12>N44eFY(9DeXOCuy8vLUyYEfCdHdOmjfZw!dSLE}I{+Pb2r=!! zSrt7!2@Kh-^-~l%;@=7|Q-gIhw6#<`%6<9bh1E=(1Np-X z*XB!W|Crjdm8ruBAi#%((5!T!5Gg=LZhpKO+a;7=&D3LE@0;#uZ9bl5U64>ac05bn z&JTB>v0&D5UHeqx>W;j(OnO@En@x|WPm~WlY2}G-X-(L#NDSO}O(A%r^{a!5{G^cE Qoyb|&u<}Xhfw1ns0I+TuF#rGn literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_load.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_load.ogg new file mode 100644 index 0000000000000000000000000000000000000000..02d2fd1afcbb49c4eb423909287e3c80378435a0 GIT binary patch literal 7627 zcmeG>d05lOwi6%_)&@*4MD&FK0x?kn0RhpQAYl)ZkkAmMLI9D)4bW=UHX>k%KotT- zHX#s%m{_*pQnjE45fF)pAgzk1prwmd>r&hLCZOKFzWd$#zVCkTzdPSB%$#%PoSC!C zocU!hM9{+GoGn;JVB(>4vdIHJs> zk#OUH9%Pq`;piHn*e(wToBg&Ky>>^dGE7KKwb>?ay@Y*XZjTyD!hIe!)ff4E=iD*m zXG-a~77|7siAp$r)-ZN==Aid<)!W8+b{_<|7C%FqM6@4D$6oBxSe^k{&25VSL~xrR z@DL`r71Q5pdqwN8<_VcS&qM3ZjO4O-uxyL{aC_3|_HCov_e7WH#+=*}eKI#@EI0N= zZagmUZGE}t&I?_g-8umQYVEzt?zzZ_c-f@4Og|@2sRt5uDj^sb6J3hygB#bU9#5(4 z+;FUOV}BdDzs+ox1Rx-ZuGFSfH2$x;KDsRFUsw8uUJ{@~U0&L1dugi!ljCqHgKRXb z;a&i3O6QO@8MMGm+NDfiSOc^CFH6I&JPZ5aoe^|q2Y^ns)oiuB47I_b3}<+Jn7MK^ zlQjxeq0`7eFMDVG1#ZNydVN`{2<3h-epW3a$QD7{XiJyA!X=%I?Krc)T$%a>L4;|Vqehk-BolV$NWGKYgHQJRd%KF@*q?X$2(y*woC?KSHUj)a-NuHHG zyK@2nIp|q0e%H*p@|+hp6iY~b&g}zk{bXIEyfEl9({cg5+KdXlnCt<)xKKS+lX=`b zC{3=uAy^`pazb3>a}foNN=Q7&FtnKslDzVaK9{2~D*kM^#|~F57i#}hul{VywsM43 z>qd!mU&-V0KHR=B`ipJfoXCwG+jeJk&z;f2b@TK7>R9h12f(1onT<)Quz-50YG1gY z@tlF*Mb1{tr9-xt4>^RkIk2vguRNixc}mmHW3p+iNNlVYyKUGyDbh1`*du9}mo&0H z>1JnA%!xhGoo@qXE^O|MZu?W@=t6|(U34#~*x>JxQ|nwb=~ZMOTa(+eg z;hIOyGLyeV&IZZRa>-G#WLjM0oL`obU!gc9OYb{AbNXM__mLBr;Q%X)9A<{YpCYG= zYP%XnQyZD}bZ(C;wNRm1%=v#d003PF%|d6-5jKZ1!tog4PBc{f5TtpIBH44|?Y_HlTtp+G^JNJgTZ+Td@D2eL(OJc98>U19kaOa4zQhq#$)+ zCig(0Dlv#b>FnXyJ!mq5#~upQ*#L`62wRrEZKytsJY5MM1}qHX$~@ie0ZW&bMxVEm zK94y!{P$WYh{iU6^(`AHNXtcNX>VmgDP8VNIt|_=|9<%gve+JoHGh&tr?Kc<*1s?5 zKOFv}fq$t1=;8 zi&y;P#fbnAA&h_s%2r5oO08vtOjS&FFNjn$)V>bVH=wAdP zM9u*0m+`H)*!JrcB}CJU$)<79fTh0!Psbp1#Cp2bEucAC8#&Vw9RV5%CbnSuuhH1| zy~^Y%vfi!a&|&{WNiYe@C(>ZovSxZ`qw&?JaNo`nS&AOKUZC2MI<gt>pfv{%i~@k{A2MJ$~7AzRbCzQE_@H6m)g=ih{}AhKl!K z8VdtYVR#zH&aart*KtrNj+;WtVHyikjv{3nDjJ&=@Ftmw1 zp@GA3K?2c2FZjnt<>o03z!RA5B}jz>-qQ|#A=Ig=Oe;G%4yHHFm;_ypBQ2)FJUKk% zayf)K$rB-6RSCxj!Yp9Ikp)Q_q#VD8RhcmVsD>m6K%djLBt6{KiaV=rEa;lhnXASL zsyn#2ac7Ma%v)278|EMtzE|IBe`n2G9cRQsYv>f^*srruvqE74N5fE2xw?E;p_n<} zsnh@Hw)k&!%AYyi1@*oy$>yZ)`X-wKux1MYq?Y(?IVG~zE_l)D>F&!MD#``sT!wZH zXulwr+=Ktq{ShKKM}&U+Lh&q!f7{z?^5<8}-`_9)pS>|bno1o7aD%z}^yr*Iccnu$ zw#aZkzRe1tjG@&TV(LQ&X>mvh)~~?Z*|D@tAW`{=sVI5FbwN7S`l`24U4v90ap|0d z27)lS6~S6lJGoSFfYOPpOt*tpOM|ck_YgIN!L6i`Lry_hs|J@=$aJoZ(P7h69xe|u zLt94#2}lycm9Fp;oVk>lF)0+*nqP76w`&c9p~NrA*^&=>3z3!8fc z&~c2D3JNJB(#%05ps(}-bVnS+$%bbgUvE5rk!aR1r{EhBx?YdY!*qVdX~1PdHzVZe zUSbWXSp);7m(XT53GWbfImMhlI75ek;vD7I=VmzTGU1Ts_XxRE%9)*unoW`6Q&g9! zT0!5Ha^SpNC}S>nh6*u(GG-AW@X3ntGoC|8iy@u-EdmOH{NEy=AjoEJ2JGlk@KPPE zt~1*<>w0iF*Ulm2P!I&pfpmi4@GZYtK~fHBZU~QGeckD2Poi85cR%i{7l?5SqtC`H ze4(L@T03qCjum9|1qZ8E2jHh_8^(f-?9}|wBm$!^IHWooJTR@VRmz4SSmvhX7 zOQ=}|)IjeCT)#^=cw}b-pl|6m4~3!c-D?KC=s^edfQhNu!V63~eW_i2SM8QCFQ;lx z02tx{biPzn1ILEO+X~d4&QtD_$4s5w6SxcdNV9%(JR190D?Fov3SFjmyho% zx}SeQP)JyK1U%jlvo|3fAW*2e2d8d~Ld|~ZFaTb&^MUS5hwfTT3Ur@zM9dY;^1$E_ zHYX(1dsP%CZomCj zd*HfeCeqQ-5`mKS1fiTp0bQp;9_b(`a{m0kvVSEh#AT0UU zT|e?vQOJ>9Z#oQ|3kq-40*PXTV_=5-a#7zo*0n`>uj?j8R^L1kJbq!zXEPMy>ibs4 zdeGDqKsg_21Foy88yyF%y`x`;PMIBRKjoHU*Eq7jxJxTT>DGp}E12zBfc#N#6~_cb(gx5Q+O7 z16F|o6kjQeJjVCub>P{SX=E9m5~Y%C__gLE1FghEq{g#9Yv$at@JAQQw0Qq|y=S-1 z7&>$;4obgsC5`TvmVI$igeoS$;eL5Rff>LixCZ>;mg)41)c*MMBU8J6{=AeoN?aUW z)M$#p{P;`~$}jPZ3H$Km@RFtRtnqZ}EyOQTA&0xpi}oTBT|)EntARg%Ef*8S>tEFE zzy0(`4ej*Gg%^hvA`z`ELQk}??j`v#Ky$FbVOQ~grd|3wub#S6VF#(Xtmh)z--Iwn!EfHHGck*Lf=D( z2sST`JM<890DB;+9?NU7;1ww1S|45)sfnMmk9|9pQV_Q_cC9r-`LLt05r9vYn<=ga zl(iLy>`$vZ`Bi+x9?v#uDc5JMspf1XOD%|Oj){y?l&1Qx2u!_tN>x1()YW}RWKRt& zx+p#zC!vT;pI^@Wxb;|n^Udv5QvKA=ZxWFEEP)sKh~ zXx@_tRhj2_SRNb8tLKre+ovuY9`I1eBpN;R;EANA(YUS2J2hX{uEw?^xP{0Yny7ua z0}>6t-fmq{I-@{F6nT92@rU*7>6+bC#JRz2AS{%Kqh5(&+6}rSQJK4TmC{QSvd(V$ zXmCf%VD5`AL{IaVL@~A5KtWU}EbXoB3D&(4%dXCIyScmV^+1;05yBU{zJBxkvVj4w zUV=1Wvpevr0J9!|60ox*@L(i1r7)E-mNUP`{0MF@mr@w#&LVpI_B=OF3O%@aGib{= zvMfI+H+7?7W&Pnk#=xO+I!S14A8wf-TyG>avI22roV`NKPgBP4f0f^Z^MUJ(A5ts)$p8 zv5nrNB@5ZFBb(0Zi`Acbf81oR<{c1zlkL$Y6O{1oGD{ZUZyyXnb#64E;K>1WeL%=8 zd3yRTHpch$6(Z@;Yx}d~Q!gJlri7oic5yzx_VYMAnFLT`uHbi-cuVTit`km=<&7eQ zt+D5XJJDr}&Cy|5_fOYHOeNyO`sL`6bl~Hd)ugA>~f#?d<1ZdrdYc1c0qqgHrT~}n#pr43y^rS{D=)0Ch(gs3ke4Ip* z(jLzvtIBV*1aEB7O62i%QRWw}amW`XhS&qCOdjof=k_$|#f?9>-{nj`nP1ticqN}Y z(;tOSV0K6}y+_8jNRYsPNDwxDX#0)?kA|LPM_Rty*OKS+a#lS1Vcm%p{KcCp4Z`m# ztBo(aJ&U9`JX&jI6hv-6?Ok2M!{}ciWG*wIp7=Ow$q?#(+=alu6`%8svm+8c;W4K7 z{91JtSow#$u|wZ_B##+EBY;SPVV5G+-r0vNQz+O>qb3nRNfed|twivVXX54V-lDzA zFiKU@>N4Ac?{U3-*Uz8YY+<1nInceAKX3@wifhMF-Ki^J?mW}kvFXbCnDQHx7Hvnj zL}01zaNXDuQK|eUeSE`}vOGD@GSZA1cHw*l7CS>{cHpa>MPAC(hoQcfeh0o<&$v%L zj7}p{$!+lCh`u09=T zdsb{bdSY4AwU4UD7v(i6Hg*MYDMO(d+wRA(s_)H@Y7%unmrPhZ;miypBZsxRQzNdaNmVEqxjoopuuwF1+QCLRmq_Nb(65cRIjjpr|#ae2(>@*tQ5`mtE0Pf^ zD2Q4Ykz-e5v1zV*+yR+@G19dAxcN>{&qjbQJ%u=`UJrd}vtZB~Fgo-^Y9HNqxU?)2 zJrf0im<>Z&W=lS>*#r&P+=IV?A~cA^Q_0&);h7}!qGyP?^KV@GQ~lO zEIq2%GE}pzt>qe{!0!oNi*o!j8lOHyEF0FPiD`MDq6OFc(4hCpRJth+5&(p3+L66N_ zEn7FXMx`OC577$}=2=?(U?y2+!D4y+cBxu1vH{tRGCAM7%I)<}%a+Hk{o?*wTi|?l zrBF+{k=h}V)cRKq{NhJ!_8WMhVvpbV$zI1%tKXn8sdw*$h)&C96 zXpu3rE&#pmgGia_$KLTVBPc*RpIp?PuEO#<#uT#d+a6)Ogyo+m$oyE!v~oqyrr&z} zb1TM>Wt7r#{i7K{4+sGRIeYm9uHt;^qlpRl3ryIB@QoBaiZ_ZJXk6`B7AO(uOQPlZ|b~nptD^p#(FJ{T!xW3Uha7Kl}MhW?0|Z`>O(S zk6w9w>G3&4H$leaGS616b^4CLm;aI98_h#tVi?^hynx3_Rea8sebv4OHHL7eOdcYq zENHuNRCCLsYuAGB+l}Hf?=DG+$BMUKiq`{Osk}yDuPOy?8L66|G+U^g#@=fzD>Tgab~sC1ny+)g+1H9?Oc_mSG0GR-LtWU99zp3 z8RZriFOuQjyDi;Ky zR0`Tt%kx~Cn&R<|FK5PL!=8}X_*M@e4}nIw*XiDhmz-0-rleE(EkKzWo2-mF6;i9W zTcT)^AmK&I{>fp*rn(yzr+zuw1jJDZJpW_-R)yBYnp?}O^R4RC n<{eM-GVdJODqw5$goROz>&M$j@fj%@jbHz=diwXnY+&)<)>*a9 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_shoot.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_shoot.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a7d7b69d12fdd3ff614c0c612faa7a2d03f40459 GIT binary patch literal 9767 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 h@mz2nxK18jA1T) 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 Z2QkYyuAV!?7LKUJE;D1-4Oakw2LP@;_w)b& literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_firework_soft.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_firework_soft.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8b2e7bc5bdf0d5d25ae4a1c89c881e0ff4900369 GIT binary patch literal 55786 zcmeFZcUV(T*C@IHX$qo(Ql%);M0%AH1Qk$gd)8vNUw^3 z)XtZ9M?FQv^ur+`32LY!#rR%W-zp!=pacgf2KBkxK6Thdcr>PGH4`TyQs}WC+5l@6+ z!W*M1gkjYiqhD`~ac|6+g8zvJh-utu{4;e<5+LomY}`D5#x<6VIoS-d*TIFPfaNJk zIH{wq@kf19&$hNJwoR(ADX4JlEEVi5rTGH_kboekAod_b(=#vK;`F zMA=$g+1f#B=-e7`lQe)SjKDNUKvJAiTeB5v~;LIJ-b9@kp~jWC;X^WlE<~ zq4|pm1bCaiz?s;axYI3rK5;QEk0EK`+dI7^-s-%Bq(2;V=wY4*dCA{_Y)M1*Cc=8u zX%e&k=DaT@Q5NO(gLTZ9_16MXzG`oAm z`RFv!pZuBZ;UDfl$b0ojhnY9a{pFvTa{|EY3xA~eU&$X){wu|qQK14Id}Uo?or0%H zVRO&z)z8frRA@v&DHfCjr8vBN2?Z;bRkP13AAWW-D@Nx5f7V}(0-4Hb8F`0-`HzwW zC%AR+=YU%ApN!k&Mqj+z_a70x#rF8p4KVhJ-O?3T(AU#9@N_hc_ZY8yWBkiwdIT{& z5^l;E{NDxZ-L#@J(keay=>ff*<;{}m9CWWfTY!czSWSY)o6v4Q6<8#;va?it2Wak9{-^^rz&zy z_QSkd)S3U%oHV`1vPj6&QYNcB&hp6#{Xmh z05nC?Jp8kcJl452q$4?`b4y=O;eV|$VC#^C=70o9*jNBy27rak>_MONm&_w&-`%mH zQvbo$^8EI4@~7uvA(7YbtFLqEc3n7Ap3tlQhGB5-ncY>G-uv((OSL<%PnSqJ@GtEEH`r|nFLrsl zZ0bk}Ius@PmF>SxM1a#9Y(Rm)YNrjDZ~u~O@If{;=(DN&UfYq%54^VhE@77cKYzGD z00<PI6UKj$JWL_*v3?!$(q^D2EDskfqC7*=l4d4PfFyq3|*)Q>U zK_)KCHshzO;KPBtAFV(m=-o95FnbY&@y@13?|}2>3(c@41-BQF?Bu6pm$G>vc>a;i z&j$b}H_$XI6SwG{!50eJPx&3Lf}J~eA2Vp`>Kn(;KaIn@%iv4Q&aV*y5uyKVQJ`^W zllbpy2~7rY6$V#hW5&d#cc&xd=NF#?AqONhLC6vE44cI4ynJvcQThWoVyyyg!G1Nxf@FGs%gkx{`71TWH#-5)fEtapGNhO}EtLuaz)TYfz}ZA~ zyFIs*idC~}6JTH|y#~AmWg*P$foK+u#U1GjGT6-2T=3TNFZsiA}OUbZHTv<$@ zd6UOracbklM2UiSvetw41h9@b%Myf3j@G#i)}03p4tEeFGe$@GcQOpLKT<#t5QUL=C|=NRwTsI9Taze{{)hVBsDEheW(;!Ulu$Q1 zPkEG=pMMrC4SMXpv^_Wm3cu~jsH#L|5N-)0>M6k7ydb+NQIgGlXE@$pQo1p zI=}q?nfvw3zNq{Oz|`}GOv&(dxOgFV%H04i#b>v!IY{^pK}dhp<~a+oaN zjo7$np+(AXMX9nf2cJ2JUO~%Jrf0@H3+1nv0~rL?fm3<*{2W(S%(M5mDwvWSxInJi zgLM|-56Zzha4PnK530esFD*>=;rIBGj80qaizN9MVGq9yJ+mk*=lK*Cby`P;jWN!oqJ2#lU*V0VM?) zKFs2$jLxQ5$dMaV3a;1~W1Ovs4^Y!UTER*U_!yVAP1bN16 z@vnyT*HJnhV2{%V5Z#Te!M{EDPA%aFdH-(6iiy$r)0gUxi3}b^Pc79;pzOxzfc@Tp zIR4tsAVJQ8IQ}#|0FSH;%G7@wVxmB}tbZCnMBw=UG=PY}VgB|2Gp8na>?!PN=1-b; zngfe})4vT_AR@5xZ`COxu=vk-e-Op!2>dOA%P-mK>UUk>)(8xy!>zXSlXi(>Rt3`#*kG=PkfS|llO_8iUC=6gy?LR_Dk(p)rT zcvGYR;Lh8w3-8{xaEhk0@Cjs-1-6g}`vE_Df2q}01qzWp?`<)rRHjnC@bW2}5(%}8 z%xp04)aGl}szTvm9^$0BSmc zZ{ON1$=sG#R8qcsU+sa0)+2CvBl)uvDgh)^RDTbgr)4Utzb=m^oN`WHwNb*U#yPd}*las%3?@E4o@hQs5IfL4q^q$Cvn4ux zbqNYld(p{vz(aI`C7 z6MoyPwVC1mc!lGqC;E9YcA&T9W`mGVgcj4(P&n(xu=at`VM53ddun6HN#m!2*x=>@ zT#o7d(V~Sn-lY>m*kV3HR2|^A_qFlfjf7hP&!_yCj~e~am=IG4W*Q22w1e?(4WF29 zNZ)pL_q%F()fAngE&ot+WE_(U#UPK7C(XsM>TAjClT+wXgeR(gH8s|oKK4_Y3HlJ9 zH(6fmInvljBoKDw@Zv{3%D+0l%XD|Tzt6VtcDz~ z@W^OlV|!`kDWx+QPDmA)8IQ}qv1O&qs}MOtG8!{^JoW6x(l`V*(=K1WNVB%!_X!29gx#T;VweRkCU;CaPrIXDa4FK03 zti7|WQMj2?AboWok`U1ot-TTuM~~}keUI;Seg4w%*2}HQr>0#}+MZU@Lg|d2sQrZ> z()AZpmYPBr(L$bRLsk+IT zw6f}K(K$)-IzfTYrUgoLD@n3%1P1z4cmzC`%6l#FNT8(ls#buHb^+X2!pP+e+#{e~ zYpAvyKF5fMuU8jlqsd~$YdiLiz7U_$UE|mO4os*V(7q3FqOWb`EPJ1sfMk45*73w- zK_mwm1S8WJfr~GVJxoBESGf)&MdisN6F8s0=R6y3XE{T{PA*28qc|T(!mYFoG}`)p z1w;TpY6V6s`uO%+uaAc>tc~)%lc{StH)9?~Dw0akAh)27_Gh$RT3)?IuI)El)!I$49XwnU~9@S(WGBSj5xju{!tn6=dN}-pP57 z{Z?R1(mktm;LUb(w1jcGf9o;A7&?W2-aa@1^K|`a!4oiq3RO_oUotu_D$b<%Q3G_* z=E*&q6d0v*r1cQ4(^uv-+XG_e7)Un1oN4_iA|>z$-hkmqd4llmJa|hOx{1(%A6@M8 z*xy}p*t<8tsPXZ{-TX@wP6BvMTQ6;udIJybQREq9Z)*2&$)23|)E1k8HzY}kXMY_?hBrpcF zM@!dxc^Fhb9-W!R{vE#hz!zmC<$ z?4@>w;19R>l2VUO0x}jSR%<^k{+R8!Y&-0ci4Hhcs8Re5fvnYkIkB$n#2yj%3hkd- zJ`g4o^wlQ|r0#ri>-^b3>Vcww0pqZ%$or#b6XZ-U?-168W*5s2@XwZx2G%0>iGE&+ zxU$BN0nlT(Q796AB^37lvdQFVgHJ~4GInDWGKX8jz;;nD5E+lyhNXjEk^l_Ri$KF` zmpbz=d1t?Ez8W&b^6w1YwKHb9aVDE~2RAyjjoJxW8j+4TC=(-kRs^*1Ln@>_6YHr| zG)J+|;oqe@TUb}VqDy2O{k8q!H==|qD{-=HrVq`2@O^NS3?Kt)#uZi>kP!KWCVD5# zv-K*Cd)trO)o9!5RGl?V(aVzMBV)!3J~A#dO4z!co}0Ks(cAXxRQ77(m-PUkH`Dg* zx5{HjC&eDo!bN;iaAk^xZ?i}9hNd1bu`Ldgob;`GSJ3--xVw$DbM4~IPirW7*gCRc z-E)1-zM*8LOZxVpV(O8>qM+#XD!dMrho}iB4Tx z>M@D~W3wG_$M6X%t$+PH4c2sGHhJp2GsMF&_a~Ko`gE@6gF7Z5lbi#REsR-x2Ske3Q zYU6gzS&~BUDd?Hfd>RelZ31Il6ger7)~)G$uGCax?>zwP(?*R_y!5A@a4?x7#N%gshh(4XnPWw_BF6LMx!Wpuj?DUlp5 zn#gZ^(!0HY#vV6HWqNCEFgB;xvqj_H+FD6eWc};B0r8SD==o^Pz5~}(RDO!Mkq7F* z{bs!@S%P;p8>dH{WW6~?N=BjjjR8-e6iQ3Y+@bxg@=c;CvfG$kML&h^^oT*5LpWr|dXL&evO7;#kKCd3 zjd;NL1)!=(bbtMqP@#03rszkW>K7Mj-(-G(FjLDs5@{2pVj%;Tl&B|8j{$1utQNu7 za3(c{zM8EZK;&rH(V*oVB~aJM_Cp)4((1=LesOGLB;e+i&F`-EBwq2`wWpsHBeCd7LM;fq7@GB{;ljr+F&j=ef7$^!& zuV^YB%hUR|V^&gq{r&5fP-kQ{tRtigVM|iGdh9E+8c^s?j=Zt1;rk#|H78#C>$Edz zJ0a`{8sr+J*+0F4T0<}Q$chXSYoe+Zhm1Xj;tLef*o{QHUluE0^)5CqaPV-(--N8v zXnvFmTaESBI@v`?p1ioHE=ymxp(V?%`JqJU$Aav&_ssclYpZWr3j-Qr3dV?rQDdx# zN?z^I`7IPVa! zwsm;EEGX!kxJULZ0*)JKx-Cww5_J2CN_u{utGZa8jr>=a~So8&O z-5^CM_fSvT&f%58D{jDxB<;1%vXS(dMrG z)r|KVe64*cBOZ?>X^m9JE6Sf4l~r&9K&|gc>+iO5zeT%Ggzz0#lPPHqtp8N}qS@|q zM}+jI^p+yAp|ZmAxVy-oP!w>mw>p_>%5A*y_4loX=07{;xzU>vErKirozo4+7MkB zyA)EgtWM!XNPKbt%go7DKvK>Bd5JkFj8n0SwfQ~G+i#p&-s--Aj1mlDfm0Ojtjpvl zBmj-g86`4K6A>R#Cd=*!!H28>0NMF@a7Z%$93Z^Y_(DMd0`Gp>ghd^EKFj&zs57{B zd%HB@9!){IiYoi8kmqC5It~xg&po5(rz^6bG3z~=1$Av?1U@WfmNOr`lNzUrV6<=j zcAV&qn;0KkPW$37ePPX_=hKpx-p+^#rR4+>v(cBgR%o1SR9b+-`rrQA`x~`nJ1tqy zeGdN_j=k_-p&ERMod9ewa-0gN+EpLX?;csR=H8m!~tBBBhY!7O}ljC|5l+ zIy2|f+(cowkrGAnY9jlMu4?#$k-n|5&Mp}AcjSm4ml@{dV`+)JEM{+1KO2JkRax12 zXC_b!p(Yu76uEgtAoeC!aqo!m+1KDiNYR(hTen{O%Qmtu?}>_Ykqyi5p_Ap*}%M7Xk!57ff=;g9P>V8asoovgBckKVm$O> zvXOuVv$K?%ZqS6hDSHt5`33n4kz(by+n%olwwaA0b*Mm{IG;Bcspc;{R$lYEmEG(d zSHS9-ZHQwzegIs+8f?yFyxE^tYNZLkKNj&QAT3A)p7*L$r4)87=~o)Dyn3=(low2q zl^+GZS9kK=ockS+M#vW)HQ+$VBa%BeJsxkECbx9pUL2X>h9SnI8e3-E0q(fI6EtM< zDgpoI3x!ILykZAkH{7@Hhg;mbYfRlIc;lqq&F_0X?JH0oUNP=K=PyhjQt26yc3ZC~XcwMD)lezUg335HCi2rE&JyE(({a>spp^bMM;u za;SJxhTYM)q3*cilbzV!o}v8_U;pfRa`Bl20v8;G%d9uQqF6EfJl0rusHxy9rD8y} z(+RwOy2feU4N9XcHG?o#I3U*h1hG8Q96BvR5E0Oxx$|D%$dphdHYVz%GyLs( ziGoKGX3DL1*ZIhB0%D)2gge;NK9f|j9&oBWdrlfY^I|sN0{F)vqw`-5nbVhv`A^wZ zt`MV$2+#%dlITYaCI%2aiT+>-in2LVs(;)_5~GyyxI-c9Iu#J{atFdc%r>^qZc`{a zhTUkS@-ul^-yCuH;mLJ9e%)vqpebGcH{m_=YHxF^-*r>hkwKRG^H6%$Hraj2>73dj zc@&dE-Sgz|f$)Rr8jp@xUsk(CZjnx|;~We5Uwb_Lsv*dV(u75_tFmXFPfyg0`o^jI zptGyC(7F&zbV+}ge_lk{x>0~%-0CF-@B9IeY?#}FPFa^jVfrM?C4X-@MAg;tf-~oI zqd45?40H#@ChDy>y6Pp{7pAb8RmD3Nc9?S0?L2O-mw0Z-mTkMdBge-0`nq^DQow)r z`k_~Mp7C6$7-aK8>V^g+prPFi#VcoYvQP5}-(KrxbLba>NI(kazqcH@yO*-EZ2js& zuq>pT>zoMV?<`lhO3e9R%XGJQ-Xv!xP8krV)(MKQ)hTj0oD;b=Uan@eQa^e~QbISv zG?6PFPxLROHF_BPb}u4LZqG>h3uh$KREZ>u{B_euV2Ck6AiYe+p5-aah3RiEL^hQJ z@7KL)r_}-!Z3n+l5?Fy=8wMv<93}94>0)}5$MH0gI65X3j4R5sjn%PY1Oo5bH{QgS zeHuABie`qcxqI%99gnsi|4=W575_+#4me525!8ac{P(tq*K;P^CNa{|hj@$mdM_EC z`HaKTM#KT8A&aivjTKhodsNEtR&869c_D8NV>Q5w>i?~Yn8ao91Xn{KM`cZ;;-kx} z4ulEgqnId%?MIPCxxuuCQb=aFvFbJY(gFFzplh-hVL>?xwJWfw71ytx-;#m|78l*& zaU_Uy!bi-FA-B@z+I`={`Jxmw`r(E1c~Q_m@gq^)Arwlb!)FtPHWFs5MUqH zyIU={yMW%A-QkUWX7@Q}YS-yLH@-RI?!CsHJxz5tlr%0=urHAN zA@NNY==Y;iX3pK^WUh)QAv?W z;Ki!LxUK#%Q;yA-&skz77jTOn(dKZ?1m+6<4dqGGI?Mz(N9O-{Xfy zFWY{qA2J#>)z%T(ICR5Y-IEG9+P2Zx?{fOy8=~Gei{FrSnvRZ__eFnodg|Foi(Q`I zppew;Xk0V0RFqrRLK0?R1mu(zq`Ud@0HY|3{dQ3F`yXq5N9?7)T}{&328qimx5dv1 zL>G)9oUfG*w6hhbHs6yJ_i63w(y~6!nPj7q-2LoIyS$V4kt}w z*ny`o9Pno5=cp=vX_y`pm4`v^QNJqXTiI`#;>Hf*x-RRO%uify8W}Y_Q$p#ZD>2&K zse_c9d?eA0vg}@94y#4(+);q^l7TzR%=t|YYni!M(`cUo^sh^Px3?t=tFqJ5E(2tN z{iE7<0N^qiH@8OYnQuJTs#yA8+_*qCI14^rPv6>WZ5O}5 ze+ea__7@6-`LRDIweU(Zgz9TH{GtbxXQ!%Oo=i?E2vpvXJ@>6yJ6QjxQzTq5<10^lnN&{8QLar7oh3hjRbYDN-{Za+oH`6b=Wy|1S)`y2qi zD`mh3rlAhO1V5-y>+<^jfO$fIK&K}B>t+OG_*L|RSCP~7(w2uIq++sa_|}u2eb$gT z?VQR+Z-*ytcqiAj5Y3(+#@%u_1XWkEJ#ST#{OEkffr8O7I~R`bCue6oQMc=2GcEE> z83Nby+|Er^PvVfV_{GL@og-aKlUzW`xW)#vy3x0ynxDm~JRqQ-WWpWLvv&L_*=K>B9YgqivipuQi9&e7-o)W-kB_o|B zyOfgsis+-GDmY1DFWcGkoo7;OHLsm9RI&g#9jnx%QwG0c5~u=6FQ~D6<^)8Z1(G+h z$~*?|5*&v9_z0x2G67AeOOCDflK_o`v$O0HrTz~$B1l-h=sxmVjJVt1?W!T_?AFK~ zw|%_6|I*J{RaNJlr0&oIYigiLPPV17UOa-i-{ccx_y^oH$NPxBD(6MF>McS|%3+Bo z&ej88>($?_i{Ef2c$D#`S5=2$VugfDq=m=RKT6vW({6vt`SD5l=F;Y}MR@=XU3SzH z{I5X;$!~Ybjz32z^7h+^DCC5gl4BR#t8=zB_I4u5Xc67Da;X>Ni`F;U_K#asmuQfq z%+s=>PwJ31Oo|<4(5$4IE5%U-`BiXutHaho*cxVRtYjiK`C(E(s`ij?0<}}ml>qvU zFI;y+=iXvcqurxxL7%UQXoJ*=tnLa9O0YVrY42Ppe%-?snyBn>53{mvE9sFWA1X|j z)3fg2tfjee&XA+!!fr2qpXrhZooN~6i-|R?)9pMq7Cw!>7F1zF>QD+6f*PL~GyL)* zt^Ezt8((i4WC^~v+BJLUCJK&i zS}mt*X4Cupi1AL1V9VsayQJE>Z*O-rKn5%K?6DYEZICUs;^4_}p_LYf?o7_g(|@_T z>MZ3Zl;W&aATX!rWQqvxnLhgLw<2(J7Rj0~-^Sytqge^`!K@MJ%6BMck}Hct!!^yMkmACV6*(E5qSCWQCR2p~rabJ=-k zR=uSLeD=2u+hLz0>!vWx{K8gAGY2mJoOJCs#6~T4FPQ$Ut2tz42%8-ruGH5rD#(mt z0AGZbbjw8RM&xBR_N_1WIoJ9%yhumkehsS$U*hVAolWG+cKMm95+JL=Qh24(`G0dep<6muqlg2~F`UH_HSJVQy2M zaa+{^Xe;^AjqDyc+%aK&=eviZVK<{9_V&H%`^COh#0&av8%3**OhekoWJNW@h!d)x zkFyWMptnb$Dpq^7dUx*X6QYATMsw6jS?*_LNZ*jX*x-ARXu+Z4eCGz`OmXHxm#gQp z5L#)YTi$mh=(UE8oyJJYWz9V$_MUdT1fn%#nD&x=Ri(a2YtQWMiLC06M=xkD;6a^otN>5(%+5O0`;7D zhe^o-$&?uQ-ipuC2)-l**PZzr2b2%wuL!@t51Ed_lRM1x7ic}2JFM#5>Em<2+o+1& zXEkHtBBxFO?*%L^Ca3N>5sd9|o}VZ>Z01|A*rB7tsRuii{yQ(+ZE&o$9DBAAjqdmk z$jJ`J6M|FEfz1t!wd>x(F@HeA$(DWJNGGeT#4TfK_UJE;CzH{2{bJp%W+ChWGnI_y zPB~Y;A6u98-nfH(IZ9k~+3ez(J%UXhMpKk#6TkY#$Zu-%6raDH^U9!YTXDc1i+*mY z;W;V!T+?JFQ-A?H{mW zqr#M?Sv`{9%*I%GP25k~la zF_&9z`n|ZmVL4LJnAXgLJ+mGm?(QH)Nx7a{Q=4Q?P$-*(G3pVBa+0*=A}I;Y2(q%y zAxNYWP9!%6_oF;V$MVPCh8q$6q5f%EPmMUk>@j-OL!Xeb6k4ihsCN(H8iJcj^uf^Y zp;+%0^TWwp;VJO;HaV<#DyMjve+}HAhe7j64hcb!*PNt?vv#klEd$IXokB zQ-*;>vo@qkX^OJ}*@oHthKdX*p3~1AL|F_*c+#Ac6xVO(zDEl5vT8~;%8kqRuwPXr ztO$A@JYGS~1>~IcFfsRd{w@`#^mj$A9tATO)s#Sp?Zzh)i<{;xtH+wm)z0)=P9DyQ zuFaP9;pp zvT~+)x38_g58Jhmx9myx3(Jq4*v;;VeGT!l@jUsF#lP|z{}3S;$Qa2~Dq$c~v1p!`bISr?GLQe0B zR4A`^GZA5+3&NG?4gPq7e@%!!pfkdW=%#49OJKQp{neb5N_t;-1kD_9ev?Ny6;9ml z9TD6&kylHvh&Zfpypn#=PDf1l5)eo~_w3-Og|Iz!yzb37KDJiJ!fIZ_<9H7F zmCmwN(W4TG8!oF@8j>oVJ@C!piZ3H#%%KvpZBbCph$LR`esb(%Fg-FNC;Mib==Tt2 z$B{B;%MrC&$)i10RE$9ftF%3$700_C5Q3W8qzs$!lm%XRl$Bi}seN~((Zlz! z*4nQsudtmKD!bh7oKg6JKuz}AuOw02*HgV|074Gos8QM_99v?O{n~x&G2)}TDeb6M zU;3PDcN$u@+!%#Z7H2&J76Lqu{QZbKzpnVM&vj`mHF-v)AmnUVC|(@s;*9JjJ?v+O z9pu(4@wGn)aOs=vH-57OB5PTHZIkp44))SDb$XYTSsWZ6Qm!SAasM=o90?4nBBzcV zgODjHr(6;YXOE$+FeNXH;E9K z=6bF}=qG7=Mi?wAv$RLV;N!d8kDp98%oe)NB#4VFEaS0S2XCcYo7cW*f2=&L7syA{ zXwfN*WTHRcWZfFBA9Be5l{K_#OxT?#I$>x^4DnBlC$~v zr08T36T9{H*}gTajaza=au7jZYkndrGl(V*2ciny!-S zyxLZK$*LrmJ}=URPv;dTi#FNl31+?u1-H#HK8nQAv5QJd=I)$bfL9>E?L`VYN*NZ} zkAuue-?e^~7k^9rt0}2@vFdo)CIy>iDAT+?yJr9C>Rz9ngvJ9a9a7+e`8f%Q$^6wZ zBWFTgwe;FR=43CSeRaBRX!$l|JHJF46A-^>0;398mN&0Nq+*r316W;04M$N|)}>Y2 zxcjf}tnL`B?x70kc(MEy>HfGRg?omH;4hJ!09SD+~YPFnYv!NNG z-!?@IX|SZlwf@foW+BBfo3_1Dd?Zak@7r^aa$h&yA#>nPAQ1@3S$kO0EidN^<66uNB$H9m3yAKTz|G8eXkty__royXp4@NU>2 z_diOAyN z@j?3KAruuq`fIJQsG%;{?x z!JxelL*Mlb=Z?;y!nX8GiH{^|=#ZaicwCWFyef?-7SNj?+_2Od?s<^WU>BNgr~ZX@ zNysUx!}g=*)S&EjwWby6Bn=Y^7N&jeTCcA%XkY=_KY`q;N7>ep`1qtEUZkaKDDKSf zW$$2Wd3J72JLb>6#bRvRlbM9YS9146wM}85gy2N)5pnCMI>6H}l z8oUsFykrj2onepNh>l^L^i`__q%(*@W9HVg>WHNXH*Rq+^g^#t>iln;ug#U=`9m5i z4?@iW;7LValHQgvK6%k}&{(nF^tS&7Tbe8mH}yl?LWStK=6>zuyVsGw_fe5|-MDk= z66(i;7W0mp1Dwu%t9VmP{1ki|)+$R|M_ElguEBO>aUBgrc2_Y%J~mCW5qCN@H^i3* zdi7C+VBh?Ah;!=C2K_C?qX#E7qdqqpdjxu)H7wH?PI`56<0E$$8jfkGRfM`J4ht!e z-P&Gegu&zASEA~Dc{e5}B<@S+9B3tD5KF#~`7``~?&wask62F{R%PA9&BE=a0%|%E zxS_a(o*EvKy89RP=69gQN%#*XfnPbGguSh*-Jtlwvg~_Aev@Aa0*g4LY$xS#*?&JU zH+zNwvs6L|g71?}#txF?zGGxLqA20D2X<)G{T-?!&hZUqW;HXtB6oR(Ax8kz0NWX* z3j;Q!KD0Jhde;Gwv`3%eBHaG9<6?S7G?QVYi+fDJ)Eu<-w6$%{BS;iIP5HlYV98|U1&b3 z3Xs-p6k$h0a>ks!heHH~g%`7G77^7DL94{0`PHg`g)FF0RJ3byW$HtR-Vk$+?qVWb zYLVr7sEtT%Y)Z-v40@jHcIowNoR6QV=Cmwt$heOU-J%qGsI`7GA1ML zOUl9}1B)MA9vTf1Ts>SENwglTE<1s}s34l&p&QJ@uefADDU>@-7>qEQ1C|DpYgtl} zCuaM&h2o3{`gQSE{^Ypv6CSVnXaXw&+&WQ9O| zb#3iN_f*u*aY(J8qC@JAe-F6ub7DyOJWVoZU&;vu=RpYmOPKhl78Wz4G{>COzZq23 zauud~&wPKGuHJhljrI;HWuOklR`UizH& zIcw-Hh}q+%#qxX>dNm#rK*pZXnmff&zu(#Z?f0Jfabw*y(Q9jt2qEHV z5B6>O=`~aQ8X?Oj=temRTR$Y=#4I5S)A+M7XQO1^%pb9R@d!S}za`TkbJ*mf!jWI8 zTaFuQVjh9#2E9&9GA^60+n0}j;9fVL1ap&86?Z_l>AK&sUMim4;}0(gKBm#Fj9Me= z?-%=|rXQL^zjql-Cgn?WB^7pZCI$;lSqJN?HYpS-aSYyS`MO412dTX9vfJC!Ao3BTgxc7|{iE4Jg5|C*50)@n+ zpoq}=lbI1xiB*hQ{%rTeE`Q^RyR?F@*v>dvEV>KWku1kkqFM|Ng((71)Ag6%MCr0H znST9BQU!1a z)L>Tbb4ByDj3-5J9<;xV0pB+MERSwp*_xG0`AE1AyOEFX{rBvqEs6 z9+3e!v8&X|%6N+Z7+bU%5RhaVz1|-ntEI zwq3D~26Yq=*xS>W+$dM*yO#B(O2oxu{kw#!>2zOK))V5Eae)8HL|puNX%5927cmxM zU2xL+E#f`~qq-xmBHS>#F)Q<3 zmz(uI@AS-b^|P+K@>z{`L+(jf*$ssew7;j`wSu30*S(plRcQl?9-OxUYA_BR;l6hjHg5KvwBoU zRNa8D%zQQ)p33o)7L(dcm3=l{h-Jv;CvVxq4YS)Uo+Cj%`MlBzhGu8Iep4{{RE5>o zB(8@hN$nj$kC)AX%NagZH9j;ufe}S?@Hf=Iio@aFqA9OYi_q4jU?nE6i!WZMk$i?w zaFJ^T+>xq&5T%#D%-Kig!nu1%K4G7CE zUAhS8A|iChS5|bCV!dT)T4UEUit&ncL6@Z;3cM_OviGb#s{QP3^b z<2S+UEkuWc)iur30eaSM=n~Xly0=fy6F#Jg(;%!}M?4l)v0q-yt{I=~np8Bs98T$4 zbTcvq$=hh4h@F7@DL(9mLhbws!g9FP8Yal<+m7vI@9I3k5?D_i^Jq@i?|tlc($V|0 z8=Hs4LagCBy_Fy9Y0`O=JwDL+9)y?MM!{E=eU{wu}qFg%_uK zQo$S^-{*g#sZ##xjEW=BK-C;}aQ$%*r*Cdl;wG6BBdMTt&^4tq=gB!qK$#yF_kR9@ z@U%JoOHT=fDXYT_c;%I$Ia+l%e!EW|S>%jx&keS#;?j=-KXE7@MYgsH=iv8z#%&}L z`rzW+aN!aL@06XBPqMp*xm7g?qO4yAPH|BTcpm3of%33vM|x z)AL2RV>yhaSWT*LgGcK_NOL-!?}#1(u1uZ`)ryn4?u>po;Z5JgP{!kEQrS>zDs#ns zp+cLX9wHOx%9qi8LY~+zkTSKPeyP})F)uNC+W4d~H=^X*kaY6OvauZxd_=O?Z05V= z_lm?95zP}?QA<3vlY}<3B6{Jz-o5JalkWP}x9Vv>XBUXVO|4SLUe9lP72~;Y%;>sr z6JUdshs$e+{0h&_VAQDV_on3$x&ZF9Q?Eg{Gvn|=ek}~vI?D}Bbqw6 zRqXLH68aJ_a^GZdl-m;Ptj(+CNL5_Av!l=6oIfEzR_IIP*X>gL;$pq?g39?&VPr&1 zWoPAAy0)Tu#i&Rd^B%*jjxJxFY*#Vo>Cg$wMQslr*zCe*ZM>}M_z%hpWP8@MNKMQ# zx9LW$_9!*5XytP_Ipi)gW{+w#=~kD)yfi@?{`49OfxjBrP|r_Y9;Jqm2dmemp2$fn zq?$G_d52EzD%R!&X*L>9b|0ziX+4Ye&}P5vN5s#_NLTOHnfAnLdZLpLkx&jjms0o= zQ%%U|v79=m0@A=_L2qhna){6Wh+|W3N$za5%dpwzb9)|tzcF&MwGoU1{f;M8?tn{Jag*WDW+g<8!7YuAOZKwh{AH_A2Qd|Q*p9e_)amti} zo)|EkI%UBB-~lAta~Cmz&KP^p9b-*&0aF+eO0*){5p9S*4K^Bk>_yE_C20@D5BD$M z4Kf3y*U!%!&=OQG;|_bIRziXkpMl>`fhSbU5<*REBkRlQ(YuZwjmeH)llso@%cfRV zn@8?%-UciL%rJWahuIiU*f8uSL8{ zX%P|G$x+-IR@^1SexBJ_ih$j=_jh_wt93b%Lh7j>Pg&UgA%}093*zX>=>@`srlu7m z&i|*FUepT92V{DbcDApOTCTZDKkTP9@X>yMP2*(mngVgDA-`ma{mxvhIGP4NM;?H39%`pj)+9srt%2V2tGW8^GXYLYGFuaF+F~74Q?ZY&6#6 z3a=J5(ep`Y&6lxRk)3r}56OT1&=B7@Rw#M9YcT(T`srz@tBt6AK7M|B`coY=Y>y9Z{~;_G`O$2TH-bw>)raj%L)hP+qR!ib9~o6 zf0W@R)m0y%=s$!UF~Tr+cy|gF=lMo`mK-!oKyRM}5DgW5V=zaWGrWf$8gCI;6hhTz zh3q=?gpgI7c|pvy_ViC5#d6oRkGc3L=TdSoH-yuPp9ryT5f z8)oJ^t_s(>T0Kr`Z?x~+Px;i;u5r_uQ@q8OcXJJQl_!l@?}u}rW+c=-l=qzxX_m2` zk{C1y3ZBc*@@IA_r;&)%1!(Gi_`ld!m{C;RZ+jYeb>O->Ff)geU(7Mhb(72heir;B zWr}z5gL5Pask1PJzg2(c6?u~Ec}0_wl(d|WtBEnK>CpF1q0LiT#I8EIiS6^AGPXI= zdD{LavkA!izH@iJU3B%bpEfn}Eh)Qr#f)z6BKS%ba`jrbsGQ$x+JgN2P5~t7)@eJ> zpX`OiYwcjn7cpDTO98jal3@bIlZ|7!S4V0kI;N*>u^x_%-Vk=o$*YiQpS(`4)b|_c zlKS|MWa==iE*oJDp3r)E2yw)oDM@1^d2esbO>Bu-B}7OFTICu~-mw(%x?`*_l4sVfY8kq;I*(aL z{12keJDSb^jr*~yR;$CNEu~bA#$KViv{q}?o)xQN$Bt@CYm`zYM$loeQZq4HMO6rm z9mL)QK@drve1GS8&XaTQocx>5xj*-Pecspm{kmYip1-r7Sj-qP#lT~Ww$Yl-G6c~Q z*0g4CaD9mq`CDD$FB0kHOGR8qE7Pdh3}xni)*YDOSdn}hohK57-zenY}Q}0eSL=(<4yzbVvca8H) zLqywkoy&l#^h(#YfP}B>yQ(Ts>~^s{NUs=s@1gW0^srOA$ir~CGh44$N*0Js%K2}@ ziwnszkp%n2kX^2)61c}w$|GZ1zYRXveAxn7t7qsBsp&62)zR0}U^OlSrjw_7EtZ5W zmvfe;2bL@$1sdHJM)sZf;i#1{5xgn*+-TK?+fz*vYg0uz^}B+QZOrt1-t2HvaTV{2 zZ@>!;s$%#uO2l@wbrp+lRpSbA-LJVGq&(wFn~vJ9S>w(EQ@|Z3e*XaHq|AS%eNh@8 zBBs6nUA(w^!(fP+(^QpVedGxzU1AjO`GP*kQh=D!;+|8{54`}wkYgyH;DZRQxiwI$ za9kQU(ZG8-{{HK7+3Q^Zz;9L_U-}^*V>!kfC+Sjdp~@Y9{CWFeWvyU)!>^#>F*h-| zVJepow!fQtJ&(NGo01=;;TheViICIz=J4PYR~yBl7qB?yb^m2q168h;Y2SsMNN8P` z^4%cF@UeV4HY|{<$ME^}0eP*}-m3y7DOaFE`{a|WmJWhDlumApeDD*U|b<#fKa30exq82}2 zTmWsF+PJhJAXSpY17Vd~FZdD{MN){Ltl3DQn|oFesQ$Shd(P2eAo3@!8eB z>JKd3(1rwsEW~LI9OULTHxIo+>kZ6p@a}BAp7@k+5*3L}$G%Y;ll<#*BfP3y)i>nS z++_c{ZH2`|)XQ4%LiST~?ULPs-@|s{aP%;3`IoJN_lBN!2E?-eD$sLVZtAg6-KY;4 zjGcc*=wW--33mz&}$b@i8SMG_%Cz@6K@1;Vwr8Z#` zN=9eqw2hC+N$U7xp9pBPwyXh*{OTUt&G^PJUTA*a!?k~WZzaB#Yqt`wy-vQ;`~ip0 zTtqYDz8WHX*TV9K}{Etj3dEZ^&RWwdFyZ zytL-ryIUa;mDLBnwc+kT)7HV4jJMzIF8XG+xN~;>s9*RsSSmdL<&fjwk+?t>bo$Fd zo0}^H+Ja+~KK7%oKt%HK6@&pI@Ua(PaNvTO^?|;&IiW(!O4aJp1TuOZW45!@HG+#w z@jpIrwU07wub&xUO461LJx#Ld)C_ii)`s8fwzCHx`T9GLX?`M1u{ZI{|Jh23W7Npm zc2PsBdB|DlMTOu$3BQr}bdD$BffIm3?Ho%@fv4^jg~zH4(H^o3<>)A`8V+5AVm*|O zz3|nLnlS6|mb>%_-dG9g88jU^^G({FZV$U_!=1j`jM~_F5{?ANAZWc)UFg8zupaou9N8jX z1Vvk0LmxTLL=kZcFf%Y3wTXJ;vq&&-!Al-`oJG8yXG@4ZQ*zh_WGGo*OwS?j|CMs& zFN-%Sq$sO>xOz?Vc1ANauWpkFj>%E~{`>l(){wA~opppvE3{T!o4VdDr?q=hv_h$Q%O>8dMxPL5}ltb;IzhirBMCaAb^wS_LUn` zx0M3U#-=IHia3OJurl3IczF9<%!fxij|Khh05fXBE0|dpK>VGBrsyBmH?f}qQ&=0# z&p*RwTQLm>TRX}Y8HNVE5&*#3D+f)3%{F<^0i+>^sobispLo*qBxpy}f{m{=eRC`6 zn3ULglPD1}L$s#)AceZO+WQtxP&~)S4<}9}$Zv!(=mYhG$A%X`n!e%Xo3O7_Bph*n zb6{Y1Abqp#a6h~uGTL5y8wDLf9>e3cruSRud258pOigdt=%(blO}FEy)p~vyv6wI* zg};VR|8^463JY)_Xq!i0%&3bX$39<#XYFRbt~`;Lt|NDJX{#&L-MqKExgdIwUHs1e z0fN!JP(D3Jf!*-}v-NX6MQu}6)&1>4^49XhJCQt#OJd(6Eu(TKKb!noW-H2x3K|$x zgTmIHo5J;$-rp!l01; z%cM`Sj2%{bCJ#@(J{sXk`pu%mpyO$`oDz3~$#8a1&7tk~-B<=c6UUncx(oh38>=2) zo>*{X(CH7n^hjabWXh{op5#z(#OA@a)s}m9;=N0iyq3|ba*z#3`{@^0C1mC_Ukvm& z|6r|MehG;`z^>SUZwmEvZXC6~Zx${J2LFtTZq-!Zx?siG8F5`Gz9{qEn(AtEON*8L zxqK6MG$lPlS@=($87Cjpip+pukI&S<+_zbgbhHb2EaF4pLAC`vKC`#~S2M8iBwl3@ zXl8HLm@Svqe_&2HhFw*>IDBWcSenFPsj(hB10)IN;V zoIU6#iG9!L?95YL>-|AILo>O>1%EN+0uF}~7n*Wk6i2UTvrQeZyx3~bJ3!@q4_@xe zV!fBa&;Kwk8_wvoJg=cyM^o+(+YYUUWk%MnxmKk2G{5>7XOmUHTfxaL?a%w0=|{mW z#(R1DQa4O{nbX+TbajagT68yi?&yQsHpAtnmu=2)odom+rP-a)DK*;sZ6WahNw&Z| zYtwCSoPfv+Wpj%R_%(WQ4QU!f&7`bDbCqdo(!pacfg)sDIu#YVj;1xHYPS=*5~)oY zV}X&`@zl&ETz9cw(c)|v17-B^sUsSb^7t96dVd}~vg%%E1-WYNdM@JRQQvS+UKy?R z@ub&K5wHtRHw27r%T|S_byUt2=zj-F##hWF4m4oydl)aG3lS+<8iAliy!KUIryFYh z+r1|h7+b!)I?A5NTg2}!Ti_U${mk;P+hl&kjyLjdP1DzpJdS6>GoDoLT}MV-F7m; zTBYcn+Jl&kvK3i1S9@2_lGwtM@QpFpbth2Br;K>w8(Zy(;v9H5%mMRp&2v@pqxYZb zvB*f*Ya0`YVo%Z4ZR1>JU39T4ci>5oL*Q+gVB}DxLCLMWUwjC}bSxA=ksk{!MpI|4 zy=9QB8XKoS{HTl`4ISA7ak9$@ggxwzyjYiM0+~zUgvq5NOD*B$S=J*)CkcRrfNta( zz+>Xg==aA}?BP0Z=bxEXa;+8oU*>Da{QqQ?|LH2M^q(%HrB(d&j7=cj+!93BSA74c zu7v+jX?Y&);X^qu#PL+KBX?-5`k4s|&{RC0!hreII?$fIv40U>_vHmHuB^1>sWdx4 zSFL5VynS^u6Vgs$@?NMfrd$GYa%-XGlgQOCZF9Dk*N3o}65!vPDbSmCn9!wvy^iu; zn6VYof}`8Bzey3&y-VNZ*adQKDJFO%@16>K+1#9TfNM-{9-o9c&_0as(o&qPOr?upvvTyU(PdR{?aQow z3J1MPIpkBg;*KV^ldVU>Nk%BE5PZ4pByB^d_`#hELK0U}G`?*PCO&$2vjd;TFp=H$ z_tlwIll(W=0G>@O%s-!g16VSj^S#JG-zly z=bC$}T4)+#vn!`M-_RztCPoCfdIUkIsazln3A(w^ida3hUT)cTc9K%Y{YI1*B<8sh zvoug4&bLjfghGuy1B(*)OnTM=$PBa2eoBbr#c$x@qxjqbrOKjAa70xh@^ywFxZh zl|<#;u&0Vm#oQYOM(6n8I9V2v`vQFbE4=8nb{;n_J?{+}!)It*`4=EAJ zibCC&-Z2u%63s4MAAo0BC9%NTgY%Ua+Owi9?^=#Z=&Shs`3z2*LWS8Y>q}iUE1oqd zs=c8BO`oVKB$iu(#|o-mBMZ=%>hdtSQq(xq#Bu-tCQMqW9-^ySdtW06rpI>fEymFs zGG!X+>-HJ=o5*5k%^O8Yp`*-mnPvoI?gjO(swzaTTUzG14`@?yr$irzyCHY7HBYN@ zR1Q(~+Z#+XTKl=Vz1sR1#Ppf$;*2b0@B!ftsEEWq-``5!(=6h*QAcuZ6k^W3`U$u{ zTR3qEm40?#?h@mp_TLQBVH`|nF0isVGBDC5tz3Drd!u|3os6)~Hl2jre=)E9LT|P$ zZ7B`zed*IJjSSWQ{)Lj^De|P<^B5o z>hO3f?SyA)D`mT4Ypa<+zy^@!92;;-pU%fqlIN8jhfQsVezg(?mQGt36#Q33jj?Ve}ik zSed@`vTYZo7ex`o1BLo^E&vu80%-A_6UcdBa(Igw;~q{qEVOuFz^K`{PQZm^ZE8$d z_0Nx3p`J&s^Kp!7;s|U0=pE4#;j~b9b0rD%KVAQpoUn)%q04bO72EN^u+cYRN!`FL zL@MuuWFcba>ubSezmE~G+_i4AXlWJX3Kw+v5*VUGW&4oeA;E0s8IY@e+u56cbrb!F zT!4bFdq0DBYU(bI=kyOXD07*K-&MR$hu?jwQ~`K59(J{S*qWxq*w$H*Z2B9wsTZ zjVguYaH||0O*Yail4~Gvnq=HYZrX;B=(3{#SR=4E>#tkmk&@4BL2uwzS#$t+v^Un{ zb48rYcs#?0;1LUVDK4!MA$M$YTAZkRzddT>V`*Snwo8eVPe`<-|{F6c9WRpHj+{ht5_`f2n*!KI6w zS1?)K7^i=_0C=PQY4|+?Tru5-eayCr_J|=NAE~Y-#iv9RY&=@P_!kd5NQLjBNE$h7k*6b5SVb0 zSbAnht9oxNWkh$lKn*t{*l3BJZoC2)y%4z~_BZMRJ2VZ(@BPbwpC)E_U5UVp)t=O7 zIE=2DbiM4|{L0IfgBlp{qCPpso%rTRrzSMsUcqVHn^vz>N3x9t`Tp_9mZlM3=MR`T zrcX4lzy#@)%(_^seGo$WM$5r|s(KPKs0msRf#ry5nw^bhB8p~bGI+Ca1C`K0{fUAx zF5bBQ00QUNO2?n_bjYWNY|U4b#g`Ip?9zk7%;H0Um-<&30!(#<>95U-o^s(RJqGFE z?q@n2J^~)+?5fm*zWj`0Wic@x2Yl&|@2at>m$7(c&;bB6$rrolzIuOwuiafXnfI5l zlz*Sc(p)6@Uu!O^p%w*smX8vz=>3ZG&B7g907_JeYMs% z*FlnMf3-t-(%<+|^azS);>u3CeaTABZDrVSEam0O<#fJVGi=f$Gxq9sm|s3r3U=bP z#9gKO9smal&j;o81SjR8a~Homabh4ru(Vr={m*s9q|jjTZp z%&;wPeg>-0Ag5>;^U(C{?k{;byG(PwNGq@m?OGFqo0dk zKr!9PYIK-6T-`|jV)XteJJQQTL`ip&Lt=W=V%+=LU5iIWU$4;XL>WzjEp9s^p*kc& zV+eXNB6}h?s@+cG&`1R)HEL`#G~|6j`f8Ao(UpsjSbxS_^&PDa-fE-{d8$p^Dk6%T z`H*?CSNs}N@g{2&S*)NOr zvo+O$bS3~IbvfRw60_rSIIe_UJZ30cCj&(K6YuHo0}RZDL>#}i=N}S$tbU)@sDeNe zSc^ESzH*P`VxjUH4!l=p(;v6jEfin=DJCZ7;~JP18R))#Lek!$w^E?s1!NSNhPf3l z==&tsEoRflDY%K_6yTv8rsI@ zo^OAf{m6i_zEIiuXu^z7CrIb(VykGljOoYf>0e`wg3g6yk_L25z!+x{xbt2UdvDu| zbW>=I6(;78Yb>l2oiavT>N-9BpxA)u^L{|xa-~IR<>p$R5FiQO_{GCcz1A+#=7Txf zi~|iC_Ci}jl%c<0UxDo^0EUW>zZsVu5Df;IKMo?x1dMB{XLJsme5z`)gy6Nm-gUg{ zl|4EIkVt)+OTy?5`8jqpRShKR#D8`#83X77|J}`XiDmBm8ND8Kpx!ZHt)tx=;BlB@ z*bfKhYYddP!c<7y?t+O{eR;HU@``@P> zLT$T8w2a(&OJk7b7%`G}d3mHsKfvbs%W7Yrdco>4VcPgp+wx9~mX zy_14vx3YG)1k zT{lIXH8}?-MuD_xj>=!S)}mAl+A*}1vLvyR=rEyw zLxSeD5&y!>!>EQp?E}7;m;5BF!R0)J@Drux9wX$z#Y}I^cNzdCDYfO?sub52jH0ufBxpwmZ3jkvm2)zt=~gb>l&8} zSY6=N*M!cy+gLo3E~3kg6x#?oF4>h+J`O1|9y=-c|(Pbf$&7pHvIFP4f!dws<-#L zoC>u;KHMvX+BVQCHq|a+Li{epp3bah(Jq+%z9af2Mva1v>yVCPqHRLc^Q=V8pftjD z-0#Z{)gL*B6c=$g{V9r_-mtc3k42ljy~edCHmg$AaTT>qjcDam3oijz9=}w^0$m0jHhV^Z!C%(JDW_io8O+WAE?LvF z^!}SH@urHT+801ncMvKuiLp}Qj7TO><0ZMU9e}yRE{y8n4@~;=+1bnH+e1CNV1EBF zL=|1{uPP#_8WHzx?N+`KXLMfB7sBztajh&KCh5{<&l!sOywSpmOP>t0@mRak;aJfg ziqtxsm_Kq4$M@$$A>p zR1+cr3QJ;nspdUc0HXt-BhBUk)+Vjv-)kk)-&R)u?|k0gSM_FPd3fgkp-y<|Tygs6 zKT8W8jt*c}GMD%-XXHn}AhZCQ5B&-liCRX1J0XVlekR53O(HI z#kDrH2>n$d9-d4Z-kwez)&`ns|9;Cuh!!TM8Jg5JIE1ag{iZ|Sdg5Fp?f#mzzulDI zaVWNm;n23jLRaxC6?E&*JmU3VYi=fegt(CBBllu>+_rH)d8A7$d^L7iov~Nfe*Hwe zw`$pR-F<$v=J?CL>y)F2iqD=@;@t-p>|Yk8Ek5~>R~&oYGgDSt)y3l8{j@qX27VB7 zZ#t#4lvn=BOB~A6)`X<}UDF1@Do9Kz_>SBZlg{dqrE6?iVYRlMg9P;Lz!)Z}qZN>> zlaJM|*ALwahCzmRSF}G~<}cA)uv?W%W@hA!;kb2n$MRs|KVg!r*{nLw*hEb7Je93{ z$OSB0UaE9-6!2CxN_&%fLM1S^ z580ijzTB9mZ1?Q7?QQ8Qp+g)xrp5T%r>pSgGkZ}!&R08${sr!;$EFk5^yBwGkid3z zk_F4fe(5yklJ&2Wg`x#7U(d(tySt10W-@f=Q{trY9ubLz0GST9%}_#PjV%?WMETPBBfyeRugAn}JHtR257Rt}>7%~EOTAz6WdzCSV)6J?a zIuJ9*18t&TWwJwO_flBYLH8nT|Df^IWdp}gJsvHY4+!*FI!9E3Y)99@;X+y4tlH`j z1k@xDJ;%jiF%gI$+-r!>(p|BW z#>@8g8cLSe-poA3piMQ2!xt$xVKxRletQbmwvQ-nK@c}bH%lHsRNS5i;<&m_$muoW z3v(|a|5Fr<#@q-N(F6Jb7Y_(g!H4{5&l^Id`n0t>jw1&QG0l5W$MCuCk5p{`4JdXx zm0mMxXv>kKe5*kl)Pebb*cGI|wqAB|x<;wjk^a*!?t6qx#zWNp;I!NEV~(Ck7ZphI zfv-_c-mB+K052zihc55!+2VG_ix=2q{dh~{mTJNP-+o z`ff*t$D|`wH?4UED4Q==!H0y&Vbgn6csUv8mUY@k_#Ncg_5D#Lf4g!AFjy2c;CNpT zZK!0Vw0c_j?u`?< zg?I08{Iro?7V@co1RVnMg=E7s|F!*bsq>!W1YS%(I=!JPac#rd+xR)dz8O$|L-;O6 zeNzBqrt8mV-NaiWJXK6}9z%D%eOFC3fvCh+z_wq$Se@gf$+Uw*=}*u7uvBisx*fs< zXtCMAbt~vxcH{%SNt=;`Jj)*SJ5Oyyjcz*JJa_gXGnggjonb6pOHA58D%qrUX#-w% zheTda99H<=QE4A7WiYjiv4FPBW+e?(id0&9KPr97980(99#$rFoxD2AXApnH2lO8B z|Mffo^)O|!_;`p`f4}o*H@>L-5{&wJlro?SLQqe~cXritp6`yns`|GArWFVBK0Vdf z1(k@Q{5-?E&q#a-3$FC|y*#isWo5K2td>fxa{8L1T&fi>lmFmf7eH9DlCw|-n3t;+ zju&2k@wM3U+z$MhObG0=U*0nq)JpGfA>Kjz$dq|{o&6UUV?0UeFeI(@{;vERKP|u< zM$>j%adSc*B4&&fd(ARFulHkt5^C!AUaQ0VrvbY&`cQHW6slZ?3habY?coQ)?bWfH z)rL$-{2#;Wh(!!p_HF^JH5u(Gx3*7rGrJ8{CDnViC|Q&ced?e#a~0CNM;(d0`vV0G3JQRxSS^zemj#HeJSO`hsi1J^Xks zj{{GZG#kFf#j?*l6<%7h@szqqtJ({RRE865#Lty0x@>sN*gO!wW?uHcl~XoD;kyV zE-?}29+$^!=!zt~7LY0AZ<*_VnJ-hOGL1Ie#OMI^bU7C_?L>l@3 zNR>zGaRD|X3oi)nK=+y+$K*!dbmlMGPO1+H4KIMZpD;w9@b(Q~8cdH7UFR6fMY_gy z1*ku>W|*wMQ!6sd06Oy_jpxT@FaIMKrNtk)yv)p|vH*!;fYX1S3Hs^3#z~d8BX3Av zEb0P_WQQuCgY|}kF-^CoAuoA{%Ul23BSt#bXAlUe0jWj&82Z#bv)Bel>SgZlEIZ@n z8t!|!hfH|?dktDhs=;}-29&EVmwC}}jy+39$i`)Io3);|OfvUQ^{vLGvSP1hZ_IIC zo+N#D_Wwiyl;U z^$v7!2wqsH%hXDx7zv+%4V}Nnna-6FFI8TkUXp;oZ>>*`nt&yTd-S*do(e5Q|H?Vo z>onwtYBA**g8y~Y!Y7$buhiaS1~C0#eV-T|*pi{89m~KkMTibJ3I6xhnbvOIswhSv z*uO{_neJyOx!57GxTleJu{z%)+~oqlzfo7gJ0C_rfVbXPWh!jhD=5#*|mAyk=7+a@3XcRY;5%qu^tVRy;;yO}MPzt&^HH5g-fpW*Hyy2deFlXURuN-Yq`^jpCHljMZK+|<`* zw{0o1?;ncak)1YR`mO?wtMymhv~=#t$x&55pi`m$E;LCm#Ixw73<0EWKVCwAT7c*n z9u}eYv1E!vG#jhRZ=QiXh-Gy8qZl{zCR*VRE8q=ZNde;J(H5+HU#goLK%ZzdL;Le zv7n&}`vJ@-T~0`r4>jdLeRt*|`DWnZK=fslZDmQ*aT zn2phnA}4bP5%Np|E*a*-zJr>%xrzmiZ&m%pSY?%#9p*+|Mj=caUUFXc}%qYGMW?iCJNp zg!zv;P0gVB2)H0*-O%23w$bwCJhN%_(hGf!k_^!%{~h-G=daCrD%?{yBTkJKx_!6bWpj{UQY(kB#KOtm%w++os^Gl+FS0fwOv^ z`+RI>yh(mr8#*NyscjF8dITcGEvMfzsyArpE_P@C^_fY^|FCWPl#gBwN;HyZx$c1~TSn z6S*oHmOYm>3TRh`3wr5yf05n?*<_U_U-mRv7Frwl&qxGqnihn>HoO z*>m-hSaYw@Opy~vQbo#=Ao#YQm1{Q!O%G13JI6)#mWHkU^s&EfHeCzE)-3iK@zUiR1<(KaKZ;ou z2C&j^Z<2VJumZzj(hHargheoJ4zU>-%WFF}z1;`1N7Xdylv_vX#|z#oeL@#ia(TeO z{lyMgXRGpqZ>=^F?IFj@M-l$}U{@sKkeACAR{P?|w2)!Ln@p(%BIK4yge!G_bYpAY z<~7jd!K+H+y1Nuyd$dtdlR`YYU#pHJ-L4*ZcdNp~x+t*yppcOL_p=IFsgmW#axKMH zYd0|Kgg~l$U=12{Yjiu|c6X29NPHFkG>ogkH$YS80br_ov6Lyegtf&9uWz{~`Aib$ z`--esck{10d8cw&OC&-V*j8ZOyxY>)IM8w`oW5uz7jJNd19B1>CzE|Og-z0AV7Ff= zZtdN~_};efVdN_706k&*^>?KURyR$b#~R{)7d8>}Nv=4R#iU>6rR#|i~VudD%`53e|#mpGa+W?@D^4b>j;>NT|7c>0*5gUkv@ zeZ!^o>`X30%)JT*DtLe414<5%3Qi(|YvIhS9HEJdqI@abKDt|5!g2}Fj$@YL9u3_6 z&bwE?J)%QQb&nhQ7xELRkE%2I{5O(&d%YX_8oz8?*|l?y{quLJSlwF+s5>~c?S8Ry zG177p1ZmvVmUE0~;k4fySH~PfPu;f2pzS&8%hn$&NSul^Pw~xP9!3wowgl`Huq}W+gjUf&>7NzSP!sH7tIkzg<&VB;Y@1C0#Y36YCr@yHgkLr~Fb9o&Sl;Se&R4Gj81VIGCTOH8lAb61(Ad+85L-cr z{Zr*6rK~P))m=R(%2~b^5gsJGUD5|&mpX7a*`@`Kw4bbmk>ren4@)K1rtQT>%M+-* zX4)x7)VnM+|B-)2;iWvA>J-YH8UCVn6n$8n!luA+c)-01dz#zqb*bXnDI*cksSl}~ zavHFS-j@}dyk}CSyi!diL{H?UTYGT(J^wtFXE74AG6Bh~GE4{;7@y8fA4$hAzwolE zGMWguzCXg#siYtiN{Z4vV4h|N5=n|*k`Ah$hm6}0{#9;VNs8j5F+<(YP&xnff;j1!Wq{YGBxk54^c<*oS2s8gLgE2A>pDSU&ecL_8S) zTIWsaRZhi5HcERCu$}b0&3%(2j&-VzXRUMdw9h+n{C-=Kb7WqN>U{{PUyC>yzC^nf!lYAhyL7WN z{wTjX9n17ernK)dc=|p0L^~44*G-vBSIduB7OsU8H);0y>R;@24?>2R>i0{(-me{j z7TrW4bvm52>$`C_8KKWpC%~S5UaIDAG&j9Z-atZ6W)P}0@x5l)FteeE| z)P!(@GZ`H(W>2r{n~S~3^1AylfxZh~L&iwX>ZMEji@&F%iBcG~^5+p4XncQ>YPWLF zKhh=Eh_P=UNOd_7q`MBv*YngBW3(y9{>6(*LJ$kj$+*}Gk++~Zt?eq3=jGO^&?g^< zfjNkcm8)|~(~zH1DcPqJ6pVJ4F;C5|U}pk-&ImQt{OJ=!`XY&W95Q;(8KQvOw6z+D z6pnxCTVWFM5&B8PF!RsMFps{Wqnm%rUP%e?$*qk-wY}5hv(P_RdHvsO?M|3rI7wq< z5`o}-YW%b9!eR4`G}i0T6;Af54fUxv4Nb=c5XrDT|LU5j(?cVpdo{Lfq$Gp=^J7(R8J;H`y?J&16GV!I~^ zgbr&~m3KfvMB{8{YHL8W!sXK-xJ#cVD1j;92@EtNm)Xv4Q3%}s?eBjH`Cibduuigi zeO~8;`~2_5SrncM_6@$BCDC3COjq>lH3BDSmF8c5*HpTHH8fFZJG-xV+xg**D(@R@ zLLuBh3FYB>0R@!rXu7uFch^5f>#1$psln83L~h=Qef%cGV&zctF!X%w_;WS~f_*w? z^Gd1u8z|%rFgta+y)31)wc2NEyD|{8<;A%&A8_+ZLG$B@PM*$fXx7yn_#9kDWqMe< zi?Mzv3`{fIJ;pjt}i9PAx$JF>xpSNq0FfE=VxPeINfH( zM#NgJQ^PRmQ;f#SVqIXO#lcl)>~M!W_(g3y%w4p7HoB-e9D~C2Nje@@u87yJQKzTL zVRc>_Ld!iMre+ohV&FP9FaNs>0{>wd_amTaJu=5PWZ9J65k(7w&G{2VbfyP-wnyTp z?B5}4zWY^(Lwl?)ts{z7CaF7Z(M5Dx(*~@Cr@)h%s%<#5ZHk-$m}O#}zLUm|f>q%3 zNUGhRwa4$u&hv$yfiB2+bIbqb~2%H}T89Q*h@sMP-FNuSLWUpcm$MmZ6^$q<$%4CfU=%WCqEm~b@ zpj%<+94;6Rnw;eweypNB(g#8=4UsZo{U;`{+&rmM0tghb-<3So5Y}Xfkt4PEh+2Dz zR?2>UgqNjl*tMv17M93TwW|a7%!kmR{x^*eZXnD{KMgErllJA@0SdwMGc3_)(1v9U zJPV<%J*0{DkUHQ0{t9tDF3%e0=`Mz?Yt=u9uX0YSAoo~jsx3_g*2SgP*$L(MZeGZM zVJ-SN+easm$oEL*dntYofcLP|!-zR1)eIug&2cKK^y z8vN;9;&aI1{Rb=5YeUD6E_YIkt*DbQ&`Bbty_GsfBY#qmQVikqaY( zxQNw6$GJK)m>uXnl*hJ4^??*Bjkf)zae-kNpY!MnDNG#kfrsZO%8nF;Ik@fut&{eh zsC7KSGdDkgy@$0ihgh0rOuDX@R{5H?mvyYObYtzj4E=}wa zErI%bn$Xr^ot5&1ff;!3L|~-;!kj7AXn1Xi#1UL7E@PsYbGj^iokywbxcTj^;;g(| ze|I;x>?tB=wOf^a+wvLHI9LIV|6FL-6MZD%Ht=~)TToI2Z}cCrXC(ETE7;A@qagC- z4cU#k#`qQg0S#O{@GeCuC1 z3^T;3Im&+OdXVCTK)R~=4jdqJH%ABibs{4MXyCX>)gYB)Tv&qka?~$}KT(VE7%lyW zpIZCls)Zr~k~!j@Pwkkr+U{SSP##``=Oz1QdAf-T&u~9#ea)CXb@*Z-MVk%bqSg$K z6XaJJePs)b6f?DIv<3x}ma-L zZyuTF{8`rg|MW1-vT*Y2F?D2`EV1*CGYA7_=!dK93VT7OE0}Q%ROJJp^^XIGpU3}t+_d)02zk?J*&|Wcx5KSAyflPcUbGFdN2?4qM_Xn=t zc!WSVvHjHAxX&|M=TE+go!EEyr!4!`-BH)YSfO>Pkb3}jPH#&Ol4V<3q8q4)iB5K=o+ z#EG(ccP@)BH`bog85;=wMq2Peo)OKp@^+qk?(%V)7vVuTxNZ9|in4oHEMN=C2C0bc zwnsxlj#nk;_F8*r3;8$##CTnrujuYd$CM88&qn@bsI~f#j%IP0$FgH;;2+lpXPi0R z>aCwgW1%Y{gOyeD;$Ex~oF&xze%M*2)0 zxwB7ctztj>0^61EmK}sOw>Q!f^ZKib>S7Xo4)-j+`3@`9Cl+?*BAWjeOVR(xpI&u? zI+5$S<)p7B_=x=7QbcSOR8oMCx>-Sy4*XuI&PX!3WN_9a05QPoU<7u@QWiP2x|WN1 zMN3S!b*AvUxjC02bhyA%c6~10j>{`z-T_(8+Q?^SFGVMPl)YK+KxVBZKML&mr{9TpNm^8z-wFOA zCeC<9d#ggrK*fxq2&#phnT(mo5mW#&)V}ycR&I+yPCM)fS5!=xPRE4V<@8iwlqw(A z;6t{kSBp*~Oree|;x;3<`Fd_5TsnWoXAIc`_wPiidfQ)kspm2h8#{nxv61yF|ITps z&Wp#jfZ3PlS-G5^0hrBYnKy-*nHgFBFO0X_Oz#T z?ZEkegjjo;ceF=t!-I4T2VhEoyno(i+?i!oT&GP`(M_;>5Ib2@*GpBZzBhNB^y1&> zkIQ8?k5b|E`5gNE3t55Iy<6>{;)8c4Yd2_ib1(4aGQNxNX)aPlpqx#6jO@FVmE!o~ zI?7?I@7s3~+*{WfH3+uPG*7DH2FCPre|LR54 zy&P2pMOf817OB;xrBB$7)d0iPkjTq%YyXF+^9)P+4f{Uszq`_M<|xz3a_?PM?vW!a zS1xexje<6`%+xef+*-MEn_EG%9I2q;R#0=`1Qit(k%#*^p69sV@roB5*YC%5e$MaM z&iypVeHRM}{ifPAoV8Mmao-_IBw{j*#F5?yZ-DT4qafs{)na|c%18ys0^TfvUf0I+Px2pT;j!4dXdlm0@ z+EeuyEa;fKYiD_1yp~^N8Ey-3xp&JAz(IE*?m;IjUBBZSrc1O}{T*_%@YFrVhpjaN z*3hixpX1Ur<3_I#IQfD=mltpL_hX#LmcDwr{SUPF2k-Knp*sSAxDYTAb0zt0&J<;# z0E?VFf@UCIRdJp!tg2~23!sqX$C1*1&0R2$&UlZ?-|N|qXZAD?&LnOJa&y9T7s?Yr z?ch`1MQ-*e#ICQZmUW}zGU3CAk4u03mNXeXr`cNP3aR|ky$%87vPQ#jf=1cr?*&gf z2%MOm>)CM{Rv-qQdfZHzAV2jGLDbsfH?pj>LNcLZlY3m0@1rkLq zJ@CRlO8;ZWuXd!$of1E@iR?_;J#uk(TwSifh*svf+W`3+6%^KCj&Js&o;EBfoKY72 zG-m5b)7xGRHpN5dX7%K=P2zsn^7TSw2=-klEib|yEkYE|@+|$bL0ntK-^GW;R=AdY zzJFwPSdKbTY;?;-j*RSe#cGJ1AboQ#^QZ7t{My1w;G>j~xmppp{q`PF3Ur47hw6)A2!QhgoONaV`jy zcV=%veKFV7($N7;AgLc8*Jh23VEL|`=5Z?fA%3LAJf=8&oQEzcdOhfK+yrW%%Ax9MI|3 zA+`;JpG9U(VocJ^!?~o$8&QQVOSJ4~xi86YB^0bZ|9KmN7n+F$i@3tr@XN=;w@N2d zlo326*F#swlZwqVx0lfGhGlX7z@06h^c7QUp-TJ+{B9thK3HvsyDY=|a^t%a*cy9O zp|QTLC3WMS!g*a`<(lwOAh1)}J^)6Rwi_z0To>s+kxAI%CUv#pTQ_b^JD3*pDm-}p z!ysTrn?fh>j@iagVU*eA+N0l`@?E&HcSpIvv*>8>|b!oRyMheRT=|757VgEyAI0SO6$^LlPrWL>^R-yC*vVVRlI7; zRCq0lQ`x_{Wx073>WOVI12zZNZKFPYa>L+b;}z!KF^1fTGt;V z3;+FK$0ER@YXKMJh6GD}WHXkV2yadMYSfAJ93cwq4}gk356S;xn1RFFF6))t9BPe< zs)S*8v)=JMD98b?J2j0bG>3R+lRm%SfaY7D5|%JZhb{Q=2}R458-|mcD*;7{ zunLXmh4EiiawXbw3i9rYBJ~>1B|9KM;X9=$Od{3|Zrr&2Sv`EACXq#KQA3hl&#M8; z@a~mYQQFr}-KTvN=6}XC;^L4BRvcxfZTCo&0`b4EUydj{U;0PSo7e<|PkNi(Faa9T zU}8N&4O!Z>vjM;B7+q~%UH@)vW5{FS+zE$bLDx>f1Iaj(TvFcN(8|~|O2M5fol=(m zgSnHlu0rQwYb^O`C`Oi?%5iH6le*u232Ae>xjcUPDirDjPkU#fkC^26`7zt=@VJb1ouC@vXK!o!*~*I6K~iE25H>r!ME*JPDk!*V-p>FOdZm8h z$n*Ktx#mZHA9CY)yjHWqb#;!xux8M6k!s4K-7*43a44uE58>8gA_u#O?}mDXtxg)x zhY67D>^HC~;ivj5@TXu!T1(W(Eu5(c!FLT0+PJcgs3(XI%017eTqLiB?EEEehiOSoOf-4zI&&Il7hO`ut>HDm;?5yC7jheKEP37tg-14FVXMtPFZ@IMJtlwYbn@mI?rzgB((P)Zfx` zh#}Q>YLhPlx|O?RduBnJQ>RrED#OaQgO>n+neIKP%U0Ky9-oq}R88H@hti0kJxoC4 zJ)P&u#G$vo=W~6r0T`=OcCC}y@rbol*@O4((T3RB%`oWzRK26l(egeK={K;CffWb^ zY!5Ym%b_qRT8b(!m~kb&ZL7cvLsm*jOd+trF^L!qv#qPMM9dUCLIoo zPHqIpZjC1xN6PJ(8gemVz)RK59ou)*?wI5W0F<(x>$L%n8PxUYIHCES?o-Wg48`WsIP78_S6FaXjPVj%A^TN)L3v;#to2u+pR%IYAl z^)5|iIfzJXTP+)cQ)##dO|jjHbHc-dyH~RU zD3F9hQiC#a!NK*^Z^s4sh0j$tK&k)BQtN8hjqf?bc`rL#BUZ;-!Icn5{)TT*azjk3 zxv~wgS8Cci9(##>SWex#ckaua-C=TEH|(EVYVAT{g#>wRa?)Khix@=L%T z@jT(DRbk0}w>PgRN15~hcf=kA-bjKcXfwmuY?nVhxb&MPK{ADkDT9W?uVC!32a@6|Uj0$z-(5gW4+YB|EQNDHOUIzH#Rk%e^- zl(5sGy_C<=q+P5RZVR($sJ7C${IwPDS_*GldFh1k=+p35SpQGH=4eMtxo=g8jI~tK1&+F6^RJs_17hjjWH=G(Tzap7VQo)6zwmU1(=Rmo1{sluW!$^Njaywk zPSQMneYd9<8QinlZ;KX6pO4N#gIxD*C&i_|C-IvvjO%O)h6mrZE=w|PE!PbH{NQ7v zVp(d(K$Uc32Ni)tqwgwIzzVrr*c&uD017opOAfhhNx)(Wv4jBJTE;R4YlBz5@6F%HYK_sp6p6d;Q(>q8MW$zMD&)y zDDs)u+Pz*0jHBuO`&NNBrrcp?gKg!eNtL(5oBzEhAdFhGyUsfZNG#dXoXxW}p;D8o z%_(QY`4IGXWn`Bv%zzLNRH)U`3s_&KkR9RTP=t9tNADq=MYCGgHc7<-TGCR9YP#;q=!bUc&kH9j-{eCnUH z#-qk362mJNtJ9U7JK2>Ab6V)azEq>;HJks zC8{!548Y8u>hWqoOK-X0Y^YE8o?Ucxq8ITWYHC&`4V4~FqBv=L7$5z&w_mTkKnlxE zt{y-Ri?AkQ^4c9<%`6dK&E1ODI3z?MW75CoRqq{F_sz{5>6A9#G4kNHjJQHF=gZ7c zU0uojJ&2>AR!SQ%#{z2+%+Ah!BORTisEv>abwj&!GP_cqH6i=*;>V|^JtEj()2p=B z(nk;PsYGXyRQ8qm;=Z^iew?TK@SBxCxFP!id-6-Y&kS7ukCGJpFC}54Q4%q_jedR_ zAql2B)B1Bf|F6=*lNwGVCB9T|+GTsoU>Bel{Z>(itj$1o^jdBz{FJkX{ID*si=!@O zjApR7m1!hN`x=RaCI4FF-5^#TbAh&wSI6T^BzT?fX~$>PUVO#M?#Y#1%m3izA2dG~ za*6ux-JevP3dnPo{o?-h3*71SuRoZ2bVH;vpv1OuL{&Rt>Lm75vu5T`oZ}iU6+e$c z{Rybm!9^`x8^~vn$xlLIO|&`cB(;l_VfqYCdu(1V(#Y|#vEALvDE2>eaR~-9?jyJ2 z;oXU9{->kry&;Qt-06Ia9S~1}t)vwe%UI%!R473yXQ%b0uHl(wz<=AGcks?9$-jaCmWtli6e zKtMdR9gc}c(Y(CXRx(Fy=rYmgo5b0T<F7&}e&IeSMb-Gnuz>PP+{0-3-&Tj!e-GMy8uj zECHSpdP?2wfW_i8wpn^sIvvoR{*DpDQ8pE~K81x0p7kFezOIcNe$%cG$bD<5rXc`t z!?v7BCtY2th69`a3%m81Mxy|jVBn!*%pCN)FN~`hv5?9V)GVFBcMd+st)}%hHD*MZ zKz5f$-meX|B*;c=RbsLNbp1;pO$GY0HV@bSSz=BJq5+043vjQqpe!2Qz~a)5E4XJQ z?a@!sf4A^nKKr|EjlWD)S&go&gyr96#19k-)hfA&DggJXni9gtFsk2W|ITWIAnX{4lzOmO%3siYhz1&KWl zFpaRiB4N9(ifd~bv{@>)Vwy0CP$+NcNxst~jRv-0*I61?FG4k zXPKMSp<=CiHfL89p+s@hqELsR9s8fRX$Jpuw=aAcXFD@<%DDQRekt~O{?)q~l&DnK zJ~fK>DO=^iU^sH#=VNudVE{HX>Rz`_2xPam)K&4S1#)zms*qb=6SK8}L#riLs-d=n zuxG=w=oF&?zx20bGSapHIo7gvWjRhg$+;8Uk%An)m-}PgRdKeUz^dTvRi%S%%>IakpSNf4Lac>8MF1$i}q~GWJ@I9%N?nekoRc zDz`3s&cPR1Apv0E?BRxSAJB>;7R3zyi%=q^df#m$bf0GvQoThbTAhF#<3-0}&7 z+Us`3j}8BLT#ojtMerC@?dtHNT6A7xO2(2?LaU8;)4 zdSHjAeAQC|k&sVaKExrYUl5vC14N$5h!!lsL&~wyotpx`R1oL?ira?Ag(rx;F;H$M za;QFjDW+v02l<8gh<82VG9Z^U!Q(IAJQY^JlmjnjVqm$}UAR|nVSZyf=N&;m#`bU8 zD2}{M+6pOrE2iK<*nu=!g5o<^#%3vvw=iY#^ycSShQ;-?^X$&c?30X#FcQ;EMeIY6 z6ly%%pd;bxfVh~e6ha5sT+lJSFoqflj2l6gApOT>!y~>u+L7iI+057&q^}IOP-vd~ zB;e~*g*ZHxSVu)=X`*(XlFnWTA`5d|*S!Wx3XdplYx}3*zYcp#DL74S{gIhi0O-QD zkOn%A?t%!XY=&c2#vO1L{VzbAh$}-}NRcxWZH~-KH8HB-gOQfv=4yKQUq_lr~&F8ne)T~C-1NPua zvU=Jy4Z}z{X`F9=;S&sB6I>vxAIf-X>N&>op@-G;K#iG?sA=6z15ru!xkhWYz7ak1 zhE*<#20h?4d3@@8bahCpySmcYV#iI;-~(IsICt)Yg#zfIuY98@1W>>!!6Cp+SUf=Q-#Fw@3Q9EC*53}Evf|-)9o|Q@;=LglRWEWuB)X-Fm6WwT3 z~#t9l_1n$B&!RB{6%WWkDGG<9|Ip=Tj(Q3pQYgJUi24hUR} zG&gCYoppS6)NgPSkQYvRij-%ObA%N0NX^wZFs)osZz`N{J;%0E=C8+tnb%ff3->^j z+^)P4Uoz*t@v+(5muo&dZHkSJmp_j5Po=5>0Jh!g0o z^hI%jUwRP{2%_XBY5R}g8g6HJQ&|X4c}7(olA}9BUcp@>bn@;rsw}72Jo~+7?QWaH z0H7-~{R--qT^ci*zAZMykgWCJA~)ds_3N*nGy!sWo*vnV-2g-Y;6PIf z*0Nfh1qebW$3j0n;}&wcKV1D?_UU48eLK?2y!@77d-W6D**eQi-fy&8v$!a5K$QRS z#Gi&14TZeYR6?!$^260HYs=Uz>hiwj-#;}3uUeSebZo5Z!w9E=-^(3QTGXc(tEQ;P z7Gy`K1&M4zTuww^B9z}6SGPk-dP%ZuS|>*3TpM}#B&PXo4gF2m3|7XOx&8*|n4FL4 zGTI{62dqv}ul(D|z;TO2ouo$UQe-S@4lB-KUIX!GD@M0%74Ie$Cmsx=B^3==ouA)+ z`8hcf?ws-BoX5NWeB|J>&`sUm%DjJM(i^~6qYKf4q{5W~r<>7sT|EzAwEf4V$R#9@ zO@>XyQk#;#-QV51SWM1%Gvf?w*3~HExmi$Q6J&OUg*iR=@D6a>+;SxMS%TU2IOgD= znu+}3o!$r$epO~SujpZaZqAYQDMOJ9Ug=Ww%mDv5-=D)0(_gw}f@lIxkTA-woKZk* z_$kf+rW|3(%sx-b`Ux_i1Np)aZP(|$FGrG2`FHroD!t21y8j1aBXWt`&d_bVmzXiX zpkV7$P0p6(mg}@wYQh##NS~rS*Zz6|I#(uR*B42yS5zzu&^fDmk3+#ByiyBJG~zsj zqMljrX&r2xo#-DXFE6cTp8rk!I(M_;^htxJBCf0THX(L8cN^bho05pleR0|dQ8K$% zT3!M7r8)|6XJg;#i@2Vy*2VhOqo%8MI!c$~;kTkmKghW4#NqD=UyaPe>8E9U&D^6_;og)(vm4+`QujLdI_Jeh^-D&l$P@0SMudm^_Vnutj9~L?; zusnd}9l@BDE*04P`)2Xjly8(2(hzt1PbSU>Ao#3cNOAREqYA%US1i7?;AFo)qzelA zEYBa$B#ZCIWj}HIi_{U5aSy%bk;oi(sp!tj%hv(jyJe~QSLubr-(7WgDP*Aoh=6>D zq<=69`0y(>Z(MA1xW~|%M=D#4fvSD3i~3$0_S)7g(>3V^O~AQ^gJuwWIiC)_GFk2k zK5gvrCy4p)5Ejalbx7O0U%2-__l!}rQjF$QDsP`*{!vvCdVCj3Y-uN z;sV~o|NfN(2a{>J!{-@ToX>i(Cck>JLr4zfvw9jP4i*n#GwJdT4GiaJ`%gn%4xQ^8 zq0or!B|zdCT-SsR|EWeUy1Bjocf!D{qkq+JRsIWZTOotkb3%@OD^I<0P){V}cukzK zUy2;y9q+8ax#->_76-()FCfCFrlnP50=r610_;ho+$*M2D`-~MXYX7hC5j;7^UtT~ z_`Wxri*s3~!M1+g@cOtqUKRYwi;?vOAgPWH(0^lq1%RcAMC|py!enDz6Yje0vETv1Hn{b#5h^S&oWs-s?l1RjR;KmDeY?#7=w3ywdftxeU9Op#4m{q~ zJ-#X$QEE@ssOuWwUNQ|4!gZZ_Rkk?|tC$CDdRO$W0?oO}lS%lktrW8K2$Iy23S-OO7N6Tlt7>v))D~YZ;`4SRw1lxh;dm!MZAbJ*-_JFZ1 z0&xzWF{~V@!l0qir%HFPU>hlujYjU|+^-?<+WGdk{#eab5%CK_UvcXwi%adxF4p`s z0X+10zm0_lWy2NFoZwHx+md0{){Rw|3`$Ez2Q2zQ_n^khPv-0YBa}Ui|1(!RRPkN0 z0qgd+Tk!`9LwM!!DStZkZpX-W<+Hdk|J|u4p;1eG_VXQgMYV>QeRF$NvT(lYi#SX< z>xSpQ7}cNpkJr|*K5_M5Ke6dGveHRhV`ck)v;_ITw1k~TONt$xkN9boHhwf-;zp~v z@uIm>f@svliTa$TDFOPTzx}wor}sEPc3H{sdi$J35;SVGU1dvv>`s9h&NEzhi(%Z|Y&f`eGL&Y6thCb#(I zyZL;M{`66EaB;g(ETu(VCXW=qOg#6a{s`!@di$$eKSN^SzRuI=r^|VEvk-5?*Tp={ zZ?BJb(*e$b^C&+nlPW_!*q&C)H%`?UJ>^#6WRXs%Y1!XgW7Qql0z(F}!Bo=~-~0G+4|RD)qWa5q$gZ0!DvSkzT2A-9G5*j$8MY>Sfb%h0(hn<^5F zQ%*hB`h2oyp|ZZz8e8M3eKI0J)n@f-*pt`&N3=uz`+8RyEOLG?Oi-p2R3wWWC0iEc zI2PtKLOTk3MF|4Yz#`4t>kJc4H=B7nM_&5nHJkaOy5APNJ__sr4_C$1`+=;fI8McN zZ{qO4@s=^@FbZ~>Z+kZ0d+^H1_*OfMMg(GHT~XWa-7CL3`y`4jXu*Khf`VzTzyJm*1+?_aW2z1zOUbT>(r|})u`*#jQxhHcdl0V)yO60K_#?>+p9GCD-;!PRzxFP%gPB{?UR$qnHM8Pc@@oZL}_LE$2Au4Csid0MgRFSbw5exhrS%;_*8-8;vNgO8YAN6}wiG~xKq z)|!vurOQnb;2pGf14}i?lGCLx3_O##0VwYAo0H<3HZF$Ns4Zpun?CalRk|dvnT*F88H9Q(uQAgawiKPtUt4Y=*24~4)fK~V$` z>eqFMYJhso%Bnn(d@^4@)^Od%bZ-S@Ef?jxy2=_+)EFOyt>I92dIh(#7AC&^pE56Y+-fGsqgzfQ# z8!;!xb?h|gZj=Gy{5%T+k2=492#nS`@r`+L4m28!2|hkp z4I8@iG9jel#X{^6vLrOgTt&AjhR+$lS*W{f<1mb}y*f2X9t!e+Jvq5*ORus69atkWY8snKmQEle+9gRy%l%Gn2AG(h7o?(&a z&rJM@OEDZPOlYA6`Jv(AQ^MpkHHj6N%He`WKS0a5SsXD;o+JxkjwqvAoI8poL+K!+@ojB6a8 zfj5RDw?Q9M=H7~}79_rm;eR#xi7eRL&|FpXE3tsc~%Gl^7aAMqvZ9{q(#HV zKOMVRT^((8jq%vSgLr(|(K)#RXhFS#4-|9T-*q^soi7T$LFPdfe-;D=P3>cpbA!&) zpfxDT#>;-OxR^6-?4L_$*cS58*Glw(ksoAW@JpvtLS;;G(b^=7lJ=_CUdA&9-qDM` zT(&tGCfegXJyO-YnHI(4`GXxO-;5H4_nXM!!cC1s@snH4HF?}C`4coAI|!*vJpIXD z6M{ZxW-vPJ=C^Al>}1ci^KsAmY|jN{yWqYikqerbz1KO62{2EmEg zi|e)BJo9gCoaMyQ?Qe)Yil`QS_j9@B)le*-7k41Q5MchY+Yk$!CxNZn7#M0|1X^%T z{TqS`-E;5_e!Fls^=pfxP?5^^$XWV4^Xep96t8%@C@;XbmqlI9x;Qj#t8GuI?7 z)<*4LJB0>1bd|2!Cf2C;TXA)at@T$;b(P)193XQyLJ2YM+C1dF?;A_XTbdIyQ6a__ z=Z>sv1zA(eTMwgphe~G`qA_J_Mh{jM7Ld7nX}06&ynGv-fC54rhkVcRB~8GbIXwNb zEy?-MzB|d*5;>>OXIt17gN>cnLRJqtWe9TPHox~NM@%}N_>g92hO5w-WkBrUvtQs} z@j4*zc=BL@Fn&96WmZ|+kZ2|)WLL9a@u$6Xrm+^U)d+duCzYYEd$(8rYIcXvz^R)~ zU29lZS0@+QWuD*p%#nKiGg=wVdriBZE2MrfD;Ex)AK5Jw5+zeIenav}mjiWDikJL3 zfAcz|F#-6mb$5=wWrXn`Fp4Qm(8GG(|^E>VD5%5$v@x3fDkqik2cpT2GipFM){Pkar%uv9 zV)hQB2t!dC{Y29)YJX<8ob5xIx5(EbwziXGTeEwObF5t#!G+Q={b2nkTErzyIkePP zdB{jGr#&CZdc^JqiUZ)@862Se!<9eF?Ht%Lg?|?!2|~JG&S_ypD`$G|=DMu`JFy+SStIwA6O) zX4%On_xaJ!QMqhBZC`5nF)MbHOOSm9!kY8EW)wYIr^mwuFn?6M2srm}`0VG-UbX*% zza$wQ`Ada`_18Sxn5H0nlt0UL%-XFPJ?r_@^Y!2VDboW?pqlaXXDhpqV9C<}VS?>Z z?c8H{tm+Ot3zc6$p*VCj+N>=sU7RZb z`(KQu)LU5i3#8R(tq@NZa@&W`(;09uo<`XB#|X>}8ZA)@jN51{!=NagBdgb^b!$iG z`UeUYSX{54$8q7fytzDL95D#I)q-*rq2WAO7iF-v!Bw9N9? z5)ZKJMx~D_!IRuSimFS4f!w$r-^x<+Lt| zYv7=;57Jp7C9?JLR$cR$r>ES*`cDABdTSe{zWTk}kAkOjf%8wdEZltR#|YRLQ8R0> zd&_u=6Il^5cusUa3p|y=&i8!`^!@m~P~o=+q2TTo&I~%JF?`N@!l2wp{-eOD{rgg8 z>9I|6ZaB)o?yGVc($_w~u6!L-tYSMnimB8%yM2@S#nk9Qo9A1F{EHu1wcrdYnI~4> z?K~)2Ju6VtszBdk3m|w8|=>PfAY0$9kR~k-|fqzByw$@G!(%H zL^}$zp1SJF49y%p2fbx!>-a+p?$U;;UL!N%@CMx4G&06AsJP=lgBwGzR}3A=e6mR!C*NN{X-5 z9S}h5uzIpah~OIepyGbP{l`*qA3OGb)$^2+1*bka99nm!M;JYuvZ}^9V15kDj%GJC zT+;~QCOllOGS7~Fp~m!~SrG&;8^{*9UCXloqg>Q5?y5j*9d^`k-v6SJYOo-IvrsGNgEoW~^M32Lbe7t9k_4+DuvJ#HE^3O%uE+vAe)j01F~z^bZ1`=!0@M zaeCI&GKbb^r@*6j*%16>@;R6XA&gmpx$KJ@oj=3tKbB9dq-qsL5av(cM_}OUbp**= zUw$g3qqGj|IIE~by6X`RNPqhosH6m_1qiWr)3;sv;bvu~uG`6I$awcA@Ba_#IR9TH zLfbF`B)~P>{4^BePXi*(w15r|+UMsq)6H`lCb5O9%)?t&AF7v38Y;VUJN6PAfOD8D z9A5)laW5W;ktPD23o=iBdM4hWg-1Tl9Nt!-F<7pV+KJRlhS|rD31zEG zY>+^Nx}vD;R1<`a8+(lo1cTSPqCuf)3uG^8D&GjoesaL6M-Fz9n_IOJC{)o@TPk&8Y7%;IppanMazlDJsuxZ#^@n zgq4KL%>lP#CpyB8-Xj8EV6k3l?dQ&+6t7DQ-N z!dwjb&jdeu@Z`(um3mhKEtoPoU5Y>*!?H}DQWm)ExoEh zRH?3-)Z~1v!?|E{v#LB2xmXiVs!ytPf0J&(SI*A1Bm-=DP{itS%J_|GltC;$FffPiRJ0x(rU@GKejjZ?$0&}^jpm*z zivEf0RDysIEwILhl8VgVNIvK(OUoV!(Yo4bl)k(%HYaN)ts#E{o&LLChpkNOQsOtA z65!!4oWz}l*uKBy{`pJM*F2;DHD;}W5ZuI?wK+)mNsxxn-K*G`6j7o+NI7q6#|vwV zU;f(h+_uZgHV83qzIh`e&n}#B^Pa{@WP(cDGw6@ur3tkD=Or(Tf|r?z$)20m%K4O$ zd>$f+H|(-{=Cy}p0M1`y8$}kaoouWr%&XQOE^oQ?v;poY?RYhe^9I-%25WSg&X0AB z3LdD)$OD#xJypy?)Sjtklodr3p12R4kyiWI0_F6>MV%BwbZWSTA*fEMQzq|2&d`(8 zYUmjz`=$59SDM;2urH;8qSq7pU^r_wA@fNd(lsbav?%Hemjl1Ju98?wU>t2T<}r^w za`ol9G~g~EIu#_UJ<6NMK-a<|SR{ww(umpRSd4w>H>YyV=2?Tp3jiQ{Ng?H(h?;ei z)(7tl6ADE;QloLJkovqM*?6s}}{OF;IMXsUwq-gdt16Sj(-@Yb^v%4u~>R&?mw z=54x1*nbM6x#}+=zydW; z>0Ro<+X4L2cN~t-G!mZb5~2t8;9%EIKL@ti1~K z5dm!Sq+9#B9T}SqWvAjH;dYuC+aV$NuZ7y%B?;1v-R_0bnzx{h*|#*l?`kS0#G?=K zvm+HQg}%{+WjC1{It*;1dU5?7i<(e_qqn!NvN-{fT;ZQ9xPgmhnigXp=5u!F?;(_j z{bl?3uuD3Kz{x-ez_&^4{s|ku0%MAxjF@N08_8}_HVOVoeh%7nsD+<%b-=@tUOqK3 z&e~i4TW}EsC|(M_;6#G=bMbZGlZ(knX})M{oB8Lf6#!5^vN0HnJJ-R#obS?VC#Vn& z4wMd}$Jwu^in7ekyLZuA#%Kdk{KQ?>@0&TAmW2N8)t>h?T+j+bSnthtVHRIqVy#61GC2zjdakd zwp5#I$`-7J_#qh-tti?Hp~H7s=`8$v%y5@ez_%cw*eiw#YE-u!xw5&JVKK>)VJ%6r zSO%#zErd@oue&Ui_l3TH#L=4;VcO6nnjvMCzqZPIFTZbU%B zcWM7#_lNtO=daagC!hPhrt!T0k%pvXs9Frx%!LVTy_PpG$LGSyP9}0k`{lP+QyTu; zvy)|A{yQ|3vNJSCkoUA@xmD4Q*t+0a{Gzq;7IOktBG;$rJ+e~C=!P~)LKi9;=2KaQ$P;;d zQz%)zkScV>Ix8OrX{UmR<>oT$4^)09c##5~10n;u3|{Bum(oob!!I~7@|&Aom1O`k z{j$382E%FeaZx#tjt=hOAeyCJ$mJg=yG&||y~71?@MT~T7CG~si@rSZ+&0OolqU8a z?f-kWy|xkj)N16>U`aH5j?50)E?G;`ESy?ap){RuEOtqw<<1*|`YO>u9of#Qwqx8= z8$Y#TA^7&A`1sV<$=PE2$0pQf{g1vd`*|H`7UUemF7 za>QL=!Fp%~Y+-5`S&D{^;pWcsv8V zX&9#m9i(I`Ti2Ck7-6+By_5p@R#}GvYI5bk>N4jJQv6-B4(3_L3`l5>%+0%_lb?s& z_{0CF2^&<<>g55<`1S0tVvWPm%;UlSRDxaE#=fMc^r89+5WQSjZALEDV`6no-7H;C zfcdUR>|fk%!EaZ5FDe3a8%2mZXAs?Je)o1w@x<5UMPIikrB$&In6yr>%dwU49aWju z&RlweS{4joIq4ytuJQGL{BL7pCeZ7TFFv3EChznwC+h>8lpSgfw&hJNhl+=egZxD0 z^Z-*P$RB|{Z@Bynd?x;@{wk z0g%H5#2z2@`1g?N^+KnVTyid7)?A{fIa0LrbHQe71n#hK!DrF|3h5UzH;chF;#a4b z1|;Z=r>ksj=<|wG!VI)PN1!8JhIygj{C}0mO?g`ZMJ1)JR8c2y*y=;%{SaVXdcW=r zXop~O@B2aX;s0sv+W(o*-}q3v30)#QC$d~Oo0C+8E*eRQ6GF<|hM7wjD{=|Z z*sN6Um$HbBO(~a}O-ambZn509vCTHN`R<&*;rsmZd4ByoujljmJkRHOp7)#c=`}=; zU9MSgiP>&P8toDZ&uD;)e~R{7$DGqd4YBMPR-e9O;aZstB6kq!PMXv;hu!)kT_($J z)5WfO8r3&sEW`D{K-Ib?9*dg0xGF%z$M}}#_s)Et2<=_lbe^kuKDyVv?++$uZc%>P ztTPVSp-9kiOhOIcDkGI=7_d_@snel*pCZ=`t$#aV{$&i1HFL^-@Ai%N@^nrBx-orH z_swNOZKAf9P3L|UvPGiril#aMeROj58}$C9>R15sH6q;gK&eG-rL$_!Isl-Z{Lbm! z-G>)ALsIyq9&Yagmf&Zmi(ns9hc?>4N&-T{<0Km<`6oDus~QxxeiB?VmSvFGiBh0V zdtOfeslMWp9@=AdppX)KggfO)3L(Ru*wqmXhje?rmE1-%KSW2dQT;;uLl!wbm8(>Z z_3h_#j^Xqa7KCv1L7Z&&al>?Hvrb=7vcNCE7ddZaLHuP+*q-6*w|sB;z{I*vG zBq{g->&?N)LuivrgcW#ykoZ=lSF33CyG3z<$3+0AY_A2lqi?4kTOG)oO!DCKHLxnN zltp^}F-?!_Z|mS1l3Irks->5{e?8%7bf-$yUc>mBoA!+ps{b{4tZM`*fw+|NFXhWt zKpF9^mNlR+P&V9j+doB>#w>XIBK&yO z^Q!zy%GuPEIsr1Xx<_8S>!x3jz+VS~oRoUs!rXKA$ejuzAA^DxJ|BkCuYOmeYeOGJ z%db#Md(QM&lx4BGSJFOSHDcT^A|)&6qwy8T%4zPwGPbLJh5nb-N1=s30_7r5y!Kkr zPd8kEtzLWv^6VcK^tVsy=4XTBX+OQ`j&jnL5mMBs&FL3=mwXy@&U7EjqxKYr@Ir{+ z7$teoUb8PfZcis*Q)70x1&jmI6KVrx$ip~Lx$Q!pmG)fRQy^5B7*#c%6&hDG*UHcP zB5W0vS(~zpN#Bq-gZ-|7Zz^dF&Yhmab^r9wYXU`CQJ3BM8q_xxt&lkR6zn%nm&D)z z0WJ|=7K=Ke#iRAtN3svA>?X=0kDE74(T8rM&x~)};brnIR}!|9nRh5d`^@_neP%;1 z)ijj-wwslfWi;J>4j3CzDnFE_1=K}lB|uMAXI2=0e+5&Py#OQCD0s8s;6w5h2*>?r z;u+5tKU$LQo%Rk)eQw2g`R;5YwJR!ZMXX4dH+*+D`6P``=FaxR7G@(V>kiq*AHook zZp6z#PcQtdrDFG}i8{;1$IVU68zjH(O)a_74y|qZ+?vq8VHPRjsvMI`Mbd2~F^0^t zLa)yDB*CJ(v4v7Niv0TY?M3s$1l`=QZ;yVRaG`C84Jc9un8J<)iD@9elKPTgt%?%E(Vf_{;CSy(*$$adjSX z9uUzxOv|!7>Hpkft4FT#L-6f)LgG0DsT?)3YdxGAm+s+iC17lV!Fr$k9-QtRy<(sR zJWx3|BDqT|fy(yv#u~n<#1HezW70}v9kVAc09P!ux@xIQ%_3rU=~7Gj?uQPMYFHYb z&B6BkWr(P%URGRc)2@%~X~7e+F^-(Qqxz`jE2nitZ4A;3uK3P;O$*6l6*n%E31#SV z2EoW{MVD0IMhR;W0tLI#Knu+5@bn6HVboAGR9lNtrRkQ5>!q?R^3O;C*hUZc$8WI% z#rS0TymhhP0JKnqa9r)AtWKo5k!A$ z;q>~z6UWGqHMk0CjEKxl!wHASxIB8ksW$BR-`DQ;d0ziJGdeHCpJ7eXGx`-+^{}-1u<$2!B3IaU^cp zD}sQ95MsrR)w*R!qn~{DJfuG^R0+n=*W#mv?8m^+JFN&W!{&5H2{(ctb(=GW*Q1{w zzBt(IGy$sr{$_^y=Wzw*EA~c|GS!_*JA`%^m?vR znOLFJf+7~(f3GC^+}B`>WV;yzsoUB_#k3U%%nXN|T%Zd;C3%l+i|H*bRRmibDj;Z9 zTt9YmR10-6IISjqCCI_jY*ZE#D&7aLd+5%cS`d8hzmCUtthN?!Q6vp#SvgP!+%q2@ zn)cagurKkd4*KSv&YPR{OP4ws?ld11F$1JHnJnvFV#1667a@xBh=Z2_betN~~}N9hCDwF?Dq zVvW{Gc&!h!7k!HFh`%CG6~0aEplgV>LAuUvpxqgwcm8Biy&6Z&R!4;?9Ns{g8iN(i&o(1XL)t(aUq`y*4PRds{;V6vju##IQ0=r4@Lq_j7`LoQ`Qiga_VsLZx3xlMhS7e1?heQ~m zo92%~JyYX?0b5EqOWT8*(|8S1Q)`1P_=v{&Wa zQ}~}@sRa+s8SOq5Wa-a@Xw;npn@2~2v4&OT_-3OYE2r|lTGmv}UQ~`?r*u8}_;7ed zetm6t_1Z}D8jp|or;XK6+;0?2 z)56a<1bM{JA|&&+ZD?CKII<{vFp03p=^xFOvX2^eAt(RAg9?_fR_UeuZq<7ehlIo@ z#7}iJpxAzS9bf=( zMaBJnNQv45H-7+h+pEQ5_MXBz>#0NUCB<*n9Sb30u{Mb`8P&z#CMH{LGMy#M0E zO!jAiz{}*rH?7eu6i!;hU(Op&rkqo{l(%A26la3L|lw!5nl$IJ_ z1QE`i77PkH1|y73p}tG)Ohf6CiE00YtD!0U>aDV*SW!QVp@D6dd{SVl|CDlNZqZTQ zkF5<8wl!CWe(XZ{6|}@1HDP@b3D9phM<%Gnb4ChbgBX)0vZ=VM7lQsLS)u>SQ(X4V z?kD3_YHA3(OJI$>(GA*C7Dj{^p?zUHRtwr5OewB>6qO2ig2R|Px>b3}JLEDQPoRT& zPW#)Q8l)KPO<0oQW4r>rTIqdM`q8bCJF5ZCKL$;ku(z`+{p#vj?b&|2`4^7(ht7Un z7?#P4Bs&2SF`r5sV$Xqi_iC^K;kVc})}HMf+6SH(y1$MWe-SZ@&!^WrcRK^lZ)yv_ c-je@FEoVy(XtS8|T4%!zRSg4e&Hs=55ATUp8vp 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 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_1.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_1.png new file mode 100644 index 0000000000000000000000000000000000000000..3769f2967b880e0b3eaa1162b8db067891f48b19 GIT binary patch literal 2383 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 literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_3.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_3.png new file mode 100644 index 0000000000000000000000000000000000000000..8a8f1b03fcfaf94a5ef572da591dc05a5c80080f GIT binary patch literal 2794 zcmV zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1b<(kmwn{Ld+J1SGK@hqWp<$nn!482j6j_bTy} zJ&XpB=$0C6#$SI<^9Mf6$r?zd4pCBL4WIdK zTaw6`n`KOn^bD25Yf{1K- zutHqCG8bVi=GHHIfe@O9H@^YC*P-9O(A{E03hhl&^Py!XLJpN!AG1PLzq5JC(~&IyK%pDNe$vC;i@9Io z&G__7yz##=XBKt;2XhA0edX;N*81A#+Gb3vaA9f%)rUTXlflmH$0?Ot=kQx zC`I+-Ld?ejVJqoanl3n_y_&5>zl2Cb2w4%qX6^R`*`Al4k@z~qIZU~iM!v5+E{dLS zjJc*e14ag1A8`e&gA|_-eC|6kOw_Ud1>bmM|N9LiQKo zWgHya2;91ME`kXzh*lbv?QcpONb8~Ar?Z1?F&|S4DIRaLv%=n56;a%6hr~{cd zFI+TEAFyjys$O5Xl`yZMrGXqM@)eo= zxvP1Dmk&cZ4Jg#S58V}AISx4O6m?u@59JW9menk?hdHPj$l7tb^oF{u@;unjMKn3+ zyeM~*qz6ri(Y`6TneBNSq@JzQ}FreA5N>8^s-{8(SK`?t{e}}oa zr1n19M`-dH*#gep<1mPwskPhXrAa=Y{4_{V|F|h94itINWn@m{F0Nwf<1DYaj?GiW zg>q1-U4nR2GL*3PtSy*JYp3Q5Sj-PVQ|Ln6+jOT$4UURm*+}WgU+ZoRrEPeeN41=n z7_}ohTY-As!nPn~m5d`VB z+_im4e;F(~3}*l_PuE=pGGDTUDk}Qq@#pO8EbcW+JYa7M>ZPD4i4gTieA+%`tR_>2 z?dT;Gz+N`YD`Ys~#|h6zwp#D;c#tWBl))Bg8DWo^!+5GhlaT zm*qBN*0RZorUWf&Bx=#Hg;XqU51~751R?ag7vBXnrtxIj=ro$?5h+_Cr6o0&%U+g%Qq9uwwC5 z&^lQW6>-!m6rn<>6nNgNw7S4z7YA_yOYP=A`H%CH^ld zw21NGxF7HCJ?`EC{ziqVX4g2NYL<~sCWLHmRS3Q!gfIpW!R+1FrbK+5hE=c^yb=l=N&P9j)JTqcs z((}X-Vxice zlu?0&IIS8fCepN@@bC{gevw=D3zHLWQaAy0zu5Li3<&N5 z&AM%WAKP~G1PD9>S6bU&Z2&W$q}SV8^a$wN1}?7Kn!E>G?f`>Nx@1U>6rkxZ6oB_L z`lcMve+z`x+}>LIIDG&z)K%&RI5-4Gij=+X@$R0^-u^w)>hA}qVsgCR_H%jw000JJ zOGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^Rg3Jet{5jnU; z#Q*>TP)S5VR5;6(liN-cQ51&1J)L$+TZ^=uiY=5wYYa*uMloVABwi3N@D+Rn?|cPc zhlB`35{)7#3Q;tiO=+p+(9)sh)WUSO7f4|eFJxV=WPN-6|NfVdQu4nw&~sDn77i($ z8Z0Nb1b_;V{+*CBpFT1%I?h^Zo3XJmF*rCVT}Rsh==(vPi@tikC}DV`X-n_cAjP;UjG0L)BJTOd6RCcSq;^ma8~ca>d41LmM#kR)@MiQihMwm0#wI--^|S=eULKiT;QLxiT(}{ufOE~y zVqRu*dAcJ(;^`dmlumj#&)iBM5au(6|)FXSwc8n3f5 zJP)EX>4Tx04R}tkv&MmKpe$iTSX}?4pxxj5U@H~5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=H{g6A|?JWDYS_3;J6>}?mh0_0scmXsb<$WplX(p zP9}tGZdK@cMG#>OU>H$}nfjb4rrU7TlmpZjx!mAuISpFljzbi*RvAfDc| zbk6(45mu5E;&b9LgDyz?$aUG}H_kbWYY7*5n`d(!Ey()lA#h$5yuo&qkMnX zWrgz=XSGset$XqphVt6VGS_JiA&EsSL4*JqHIz|-g*dGmDJIgipYZTU9luB}nOtQs zax9<<6_Voz|AXJ%nuW;;Hz||=x?gPjV+82g1)6o+{yw(t<_QpZ2ClTWzuEw1K1r{) zwb&8Rw+&oew>5bWxZD8-pLEHP94SE4Unl_YXY@@up#K&KuDQLn_Hp_EWT>mu4RCM> zj20<--Q(T8oxS~grq$mMb0c!6Z+X|p00009a7bBm000XU000XU0RWnu7ytkO2XskI zMF-^y4HYOcBZGFMrBF3SeR&5wJigHAyB(A!a=4p1=Eh>-j%~ z21y}iM}1CFKJ0p4fBL)s;&&7c3=9mSe9X#H?5xa;XsUnz{m;Pg6WvJ=z{I0>-j%O%v0af0BI&KZ!?y} QCIA2c07*qoM6N<$f>%QorT_o{ literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_green.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_green.png new file mode 100644 index 0000000000000000000000000000000000000000..acd74d6d1c59b86acfa3c74c9861a414b28f061c GIT binary patch literal 627 zcmV-(0*w8MP)EX>4Tx04R}tkv&MmKpe$iTSX}?4pxxj5U@H~5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=H{g6A|?JWDYS_3;J6>}?mh0_0scmXsb<$WplX(p zP9}tGZdK@cMG#>OU>H$}nfjb4rrU7TlmpZjx!mAuISpFljzbi*RvAfDc| zbk6(45mu5E;&b9LgDyz?$aUG}H_kbWYY7*5n`d(!Ey()lA#h$5yuo&qkMnX zWrgz=XSGset$XqphVt6VGS_JiA&EsSL4*JqHIz|-g*dGmDJIgipYZTU9luB}nOtQs zax9<<6_Voz|AXJ%nuW;;Hz||=x?gPjV+82g1)6o+{yw(t<_QpZ2ClTWzuEw1K1r{) zwb&8Rw+&oew>5bWxZD8-pLEHP94SE4Unl_YXY@@up#K&KuDQLn_Hp_EWT>mu4RCM> zj20<--Q(T8oxS~grq$mMb0c!6Z+X|p00009a7bBm000XU000XU0RWnu7ytkO2XskI zMF-^y4HYOI7BNEw0001jNklYzcxul;3SeR&5wJig1tv8yW=TBiUj2Rk;NLBT z1~FzyOHM~2W>KuF-~D}k{QG_s4GatnLd>G_?8+>RtZ1tL{Qu4H6T?YR4kIfwBQupf zJsdQ!pobs^Koev^jveIiMvFLf4X^$_KmL6`{-lAT;laOKkeH{wrvVGvFD=Wy1!MpK N002ovPDHLkV1m_i4Y~jT literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_red.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_red.png new file mode 100644 index 0000000000000000000000000000000000000000..4d7355c57a57e45bcf3060f4831604a1bc07d10a GIT binary patch literal 622 zcmV-!0+IcRP)EX>4Tx04R}tkv&MmKpe$iTSX}?4pxxj5U@H~5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=H{g6A|?JWDYS_3;J6>}?mh0_0scmXsb<$WplX(p zP9}tGZdK@cMG#>OU>H$}nfjb4rrU7TlmpZjx!mAuISpFljzbi*RvAfDc| zbk6(45mu5E;&b9LgDyz?$aUG}H_kbWYY7*5n`d(!Ey()lA#h$5yuo&qkMnX zWrgz=XSGset$XqphVt6VGS_JiA&EsSL4*JqHIz|-g*dGmDJIgipYZTU9luB}nOtQs zax9<<6_Voz|AXJ%nuW;;Hz||=x?gPjV+82g1)6o+{yw(t<_QpZ2ClTWzuEw1K1r{) zwb&8Rw+&oew>5bWxZD8-pLEHP94SE4Unl_YXY@@up#K&KuDQLn_Hp_EWT>mu4RCM> zj20<--Q(T8oxS~grq$mMb0c!6Z+X|p00009a7bBm000XU000XU0RWnu7ytkO2XskI zMF-^y4HYO23x-o+0001eNklYjYH!a#3SeR&5wJk@si`qbO5#!X_xbaGw{9Uc zFiT2uIyy3oiegv&`t|qy`%yG7FfcHSin1#!GqSRxss8`__fJeGK>#BwD zaB^>EX>4U6ba`-PAZ2)IW&i+q+TB-Mmg6W4{nsjH2}nXbmV?2Z(>v(p&&4*bI92IN zI`uJULfMjKA;i5PT(tiF)#)Gn#IcaKm_iQ0;pel@QlKQa|MGTc=ePUu;HGl1)A<5n zokHsV7|Y>bV7HGBa|~Xtc1p(^Nk^a=`3R_EWP#FdlZ0J%JNqM0UUwzr6mL^qWS8}D z+)_C%ja%q5$atn(gO5O|8N5_vRaUp%)1HBji?s~CnMleQ~hmHR9@|8xt*8vf` zbYg|PWUO4IF_;^7c!3b^2XD3kJljFPyIDV2s$kGIm=h*g+_HyQj6c?vZagde407KU zOtBpS01?JEB*O{@Twpa0?4n3y295~?6=W{h8w(g=xfG#-feK<3_!n3fS#En$gETJlmVmQVH7YN)ZMnrms& zw4qG2&|*t1x3V&=s1&PTZ4GN&)0)@PvDUhF->rupd+NEDleL4@PwfTP_+U*oriNcU zS%Z~goFRCW6C0d?G4Tw><6r;_S_Wq>vG+2V8=Sc;*c2v6(gruwcrXSE{mNpUPwqaL zdx|%*^b~LM9dk6O`w8X<)P3gd3)b2==jz7Tz6%GYPOqvPyOB}Pn z$B~>6F+B%GK6;v;QF)z7t(%D+bEAGvpruLIIwLPfWS)}l4R=x|8UD;5&Veqd(6g}Q z&#+u1eGiL1g5`n+y#dQb(i^Z`B)tL4MbaCvTqL~#%SF-~uv}1~H(0dQdoLY*vb#nj!0flKpLr_UWLm+T+Z)Rz1WdHzpoPCi!NW(xJ#a~mUQd%7> z_<=))>SRGw#8InIgbJlrXw|{w(hs3YLz3d+D7Y3J{8+3yxH#+T;3^1$A0TdSPKqv4 z;{TFDix>}%`|XH%&pJjd5P ze0;r&@htCie~z${HyPj)iD#H@Sj6kZQ=68~d7n7KN|Hi+PCRPR1&JTIF1!53x#+OK zGb2VOJx3fN7K?2xw=pXjD)A(7R8cj`7qTuZoVPfu%gm2FkDyqg5ltM4I;F9{xecpCXq`t_?79%%cJolH&*egWuhng^6)DDHI1fUu^qh z7zpeFjhbzLAKP~01n@rtS6a(osRPrWq}N(n^a$wL1}?5!n!E>G?g0Hyx@1U>MD5y92^28Mao|Dcz0KOZ~vZY_V)upL2{ECAdxKq z000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2jvP57Y-u@zorTR004DKL_t(2&)t$e z4uBvGgZ%TyO0aUeK b{`;X<* zaB^>EX>4U6ba`-PAZ2)IW&i+q+Ray4lI$o9{MRYw2uL6h$H6QSbAvhlB;Z=Qt9q&K z_wkCbk!2x?OaU(H|NT4YAN+(xC}^^nV|4h19I_M$=JqeIJG-#%=YzWlZ}fD1Ay9er zem|yi+85~cHsBJ2kGFcV^NrZ)=;HZw=x1bs(C(9jUbddY=_vOt#BAw4)kAh)Ps5eU zdHJ+lU!BZnx>tk*l$yfIi*(Q4t-I|E{JhwgsbBX1JN9wOp3nt-o5|;>0vtOHAb^B`kq}05s1dK zq8we&nPXsh0CK;EMYM!VA*aa%U2qWQ71&~ z?1~lgl3BS(V=_1IumT}GPTq6@d}$~B?yi1Ns$ftT%!UaTcWf7j@~yV~;@QJa(eG8k zl-lV45FxfA8TMenMfS>(T@p#mz|lZZLFR(Baex6Fw{^{uR&F#CNrp{ya^?~q0Rz^jOLGWZ{9&kVE$^Fv7 zU*zaWK^dPQD3=_?Xlgq)fZrxY7om(Dz~`u8s^qZH?4xnbZ<`iE!>Y+A*M zv&`K~Ju<>N+uohjnzvZ799*rphwxQuv~z1`qRnS_v^`1XY<=mA1zx)O;qpOGr{Lp? zkQt}&lDcA>b!ExJSwFnrNel@+KhAE0?XdQ@m0HJA-@Zl)9m{=>@6`)$eSDS|Jxx?} zN#^P}39KztIUy5Y>H~iCHMjTpwUZZ|=cY@{=2ld~PPxN>+~<`i_E5j)-?1}3z(=3p z_Y!>c34SlZN1x#L5`6RtelNjCpWycreDt&Od+h0F<@X35{jB^R;i8|F-y?kV?edec zLTL*T|6`WE@GTAcg5Nz;eB~?eY2xpbdxjsqQh)LG@USz}i(B)DJ2QQAYkqf%Jsx88 zyVLA;h|#xBv2XPBC(ix9$kD(DSVmR<4>_^-vPu8QtpET4g=s@WP)S2WAaHVTW@&6? z004NLeUUv#!$2IxUsI)0S{*F-fkTGsWIiY`*(|B^zB7!Qv7@$TN^?j0c1%S<&p#sF2bjC3L{W^*fI z;1xl1qYq&WNX*n{Q>i38$Jaf4e7%eDEbnuFjF%XP9nS#OuUUo0iUbpE$xw zl0tk=JZjJdi66NxyZpwv=&-;uBSt1YM;sv*i)}2oF)JA=@g#9nQ8mgJvMwu}w>Yci zDr?@8zc7^7mY29ra|j76U=b;ZkWs}3%CHclRU^ejn)c%!{z1o|B9~0A4KQ-dqXHF@ z;|KqP-`$#piE%e66bCwAZ2Myv2@ApqkCqV!s6DuPlGk$N9?CIg4fdwrD zF-`dY?>BZ0e}BIIi8GpCqigv4^ZEBT`|&3Y6b=8r-GanC^*s#$Sz#~>;{u0_00000 LNkvXXu0mjfC5$>B literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_rocket.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_rocket.png new file mode 100644 index 0000000000000000000000000000000000000000..800185ce08db4e4327442dcee0a0393223ad1bc5 GIT binary patch literal 2133 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 FV1hj1Dy9Gc literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index ecc9fe113..17b6b6ac6 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -379,8 +379,8 @@ mcl_enchanting.enchantments.mending = { inv_tool_tab = true, } --- requires missing MineClone2 feature ---[[mcl_enchanting.enchantments.multishot = { + +mcl_enchanting.enchantments.multishot = { name = S("Multishot"), max_level = 1, primary = {crossbow = true}, @@ -396,10 +396,10 @@ mcl_enchanting.enchantments.mending = { power_range_table = {{20, 50}}, inv_combat_tab = true, inv_tool_tab = false, -}]]-- +} -- requires missing MineClone2 feature ---[[mcl_enchanting.enchantments.piercing = { +mcl_enchanting.enchantments.piercing = { name = S("Piercing"), max_level = 4, primary = {crossbow = true}, @@ -415,7 +415,7 @@ mcl_enchanting.enchantments.mending = { power_range_table = {{1, 50}, {11, 50}, {21, 50}, {31, 50}}, inv_combat_tab = true, inv_tool_tab = false, -}]]-- +} -- implemented in mcl_bows mcl_enchanting.enchantments.power = { @@ -456,7 +456,7 @@ mcl_enchanting.enchantments.punch = { } -- requires missing MineClone2 feature ---[[mcl_enchanting.enchantments.quick_charge = { +mcl_enchanting.enchantments.quick_charge = { name = S("Quick Charge"), max_level = 3, primary = {crossbow = true}, @@ -472,7 +472,7 @@ mcl_enchanting.enchantments.punch = { power_range_table = {{12, 50}, {32, 50}, {52, 50}}, inv_combat_tab = true, inv_tool_tab = false, -}]]-- +} -- unimplemented --[[mcl_enchanting.enchantments.respiration = { diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index 6c5d7f6e4..b756d4a6d 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -230,7 +230,7 @@ local function spawn_mobs(pos, elapsed) -- spawn up to 4 mobs in random air blocks if air then - local max = 4 + local max = 200 if spawn_count_overrides[mob] then max = spawn_count_overrides[mob] end @@ -387,4 +387,3 @@ minetest.register_lbm({ respawn_doll(pos) end, }) - diff --git a/mods/ITEMS/mcl_potions/tipped_arrow.lua b/mods/ITEMS/mcl_potions/tipped_arrow.lua index ab55cb72a..1717533a8 100644 --- a/mods/ITEMS/mcl_potions/tipped_arrow.lua +++ b/mods/ITEMS/mcl_potions/tipped_arrow.lua @@ -463,4 +463,4 @@ function mcl_potions.register_arrow(name, desc, color, def) if minetest.get_modpath("doc_identifier") then doc.sub.identifier.register_object("mcl_bows:arrow_entity", "craftitems", "mcl_bows:arrow") end -end \ No newline at end of file +end diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index a3c769741..2a4c25c34 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -9,7 +9,7 @@ local animation_blend = 0 local function get_mouse_button(player) local controls = player:get_player_control() local get_wielded_item_name = player:get_wielded_item():get_name() - if controls.RMB and not string.find(get_wielded_item_name, "mcl_bows:bow") or controls.LMB then + if controls.RMB and not string.find(get_wielded_item_name, "mcl_bows:bow") and not string.find(get_wielded_item_name, "mcl_bows:crossbow") or controls.LMB then return true else return false @@ -212,9 +212,9 @@ minetest.register_globalstep(function(dtime) player_set_animation(player, "swim_walk_mine", animation_speed_mod) elseif not controls.sneak and head_in_water and is_sprinting == true then player_set_animation(player, "swim_walk", animation_speed_mod) - elseif string.find(player:get_wielded_item():get_name(), "mcl_bows:bow") and controls.RMB and controls.sneak then + elseif string.find(player:get_wielded_item():get_name(), "mcl_bows:bow") and controls.RMB and controls.sneak or string.find(player:get_wielded_item():get_name(), "mcl_bows:crossbow_") and controls.sneak then player_set_animation(player, "bow_sneak", animation_speed_mod) - elseif string.find(player:get_wielded_item():get_name(), "mcl_bows:bow") and controls.RMB then + elseif string.find(player:get_wielded_item():get_name(), "mcl_bows:bow") and controls.RMB or string.find(player:get_wielded_item():get_name(), "mcl_bows:crossbow_") then player_set_animation(player, "bow_walk", animation_speed_mod) elseif is_sprinting == true and get_mouse_button(player) == true and not controls.sneak and not head_in_water then player_set_animation(player, "run_walk_mine", animation_speed_mod) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 1f881d2b6..f86d5e26a 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -127,6 +127,7 @@ minetest.register_globalstep(function(dtime) for _,player in pairs(get_connected_players()) do --[[ + _ _ _ __ _ _ __ (_)_ __ ___ __ _| |_(_) ___ _ __ ___ / _` | '_ \| | '_ ` _ \ / _` | __| |/ _ \| '_ \/ __| @@ -220,6 +221,10 @@ minetest.register_globalstep(function(dtime) player:set_bone_position("Wield_Item", vector.new(0,3.9,1.3), vector.new(90,0,0)) elseif string.find(wielded:get_name(), "mcl_bows:bow") then player:set_bone_position("Wield_Item", vector.new(.5,4.5,-1.6), vector.new(90,0,20)) + elseif string.find(wielded:get_name(), "mcl_bows:crossbow_loaded") then + player:set_bone_position("Wield_Item", vector.new(-1.5,5.7,1.8), vector.new(64,90,0)) + elseif string.find(wielded:get_name(), "mcl_bows:crossbow") then + player:set_bone_position("Wield_Item", vector.new(-1.5,5.7,1.8), vector.new(90,90,0)) else player:set_bone_position("Wield_Item", vector.new(-1.5,4.9,1.8), vector.new(135,0,90)) end @@ -231,6 +236,14 @@ minetest.register_globalstep(function(dtime) if string.find(wielded:get_name(), "mcl_bows:bow") and control.RMB then player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch+90,-30,pitch * -1 * .35)) player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3.5,5.785,0), vector.new(pitch+90,43,pitch * .35)) + -- controls right and left arms pitch when holing a loaded crossbow + elseif string.find(wielded:get_name(), "mcl_bows:crossbow_loaded") then + player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch+90,-30,pitch * -1 * .35)) + player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3.5,5.785,0), vector.new(pitch+90,43,pitch * .35)) + -- controls right and left arms pitch when loading a crossbow + elseif string.find(wielded:get_name(), "mcl_bows:crossbow_") then + player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(45,-20,25)) + player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3,5.785,0), vector.new(55,20,-45)) -- when punching elseif control.LMB and not parent then player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch,0,0)) From e5c5a785533115a82cea5414f61e6844ed47b27d Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 24 Oct 2021 20:13:34 +0200 Subject: [PATCH 092/228] Update contribution guidelines --- CODE_OF_CONDUCT.md | 128 +++++++++++++++++++++++++++++++ CONTRIBUTING.md | 186 ++++++++++++++++++++++++++------------------- 2 files changed, 236 insertions(+), 78 deletions(-) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..8086a2f44 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +eliasfleckenstein@web.de. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1b5098a4f..84ac10f20 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,101 +1,127 @@ -# Contributing to MineClone 2 -So you want to contribute to MineClone 2? +# Contributing to MineClone2 +So you want to contribute to MineClone2? Wow, thank you! :-) But first, some things to note: -MineClone 2's development target is to make a free software clone of Minecraft, -***version 1.12***, ***PC edition***, *** + Optifine features supported by the Minetest Engine ***. +MineClone2's development target is to make a free software clone of Minecraft, +***version 1.17***, ***Java Edition***, *** + Optifine features supported by the Minetest Engine***. The priority is making polished features up to version 1.12. -MineClone 2 is maintained by three persons. Namely, kay27, EliasFleckenstein and jordan4ibanez. You can find us -in the Minetest forums (forums.minetest.net), in IRC in the #mineclone2 -channel on irc.freenode.net. And finally, you can send e-mails to - or . +MineClone2 is maintained by Nicu and Fleckenstein. If you have any +problems or questions, contact us (See Links section below). -By sending us patches or asking us to include your changes in this game, -you agree that they fall under the terms of the LGPLv2.1, which basically -means they will become part of a free software. +You can help with MineClone2's development in many different ways, +whether you're a programmer or not. -## The suggested workflow -We don't **dictate** your workflow, but in order to work with us in an efficient -way, you can follow these suggestions: +## Links +* [Mesehub](https://git.minetest.land/MineClone2/MineClone2) +* [Discord](https://discord.gg/xE4z8EEpDC) +* [YouTube](https://www.youtube.com/channel/UClI_YcsXMF3KNeJtoBfnk9A) +* [IRC](https://web.libera.chat/#mineclone2) +* [Matrix](https://app.element.io/#/room/#mc2:matrix.org) +* [Reddit](https://www.reddit.com/r/MineClone2/) +* [Minetest forums](https://forum.minetest.net/viewtopic.php?f=50&t=16407) -For small and medium changes: +## Using git +MineClone2 is developed using the version control system [git](https://git-scm.com/). If you want to +contribute code to the project, it is **highly recommended** that you learn the git basics. +However, if you're not a programmer or don't plan to help with the coding part of the development, +it's still useful if you know it - in case you want to contribute files that are not related to code, +or to easily keep your game updated and test out pull requests. However, it's not required in this +case. -* Fork the repository +## How you can help as a non-programmer + +As someone who does not know how to write programs in Lua or does not +know how to use the Minetest API, you can still help us out a lot. +For example, by opening an issue in the [Issue tracker](https://git.minetest.land/MineClone2/MineClone2/issues), you can +report a bug or request a feature. + +### Rules about both bugs and feature requests +* Stay polite towards the developers and anyone else involved in the discussion. +* Choose a descriptive title. +* Try to use proper english and please start the title with a capital letter. +* Always check the currently opened issues before creating a new one. Don't report bugs that have already been reported or request features that already have been requested. +* If you know about Minetest's inner workings, please think about whether the bug / the feature that you are reporting / requesting is actually an issue with Minetest itself, and if it is, head to the [Minetest issue tracker](https://github.com/minetest/minetest/issues) instead. +* If you need any help regarding creating a Mesehub account or opening an issue, feel free to ask on the Discord / Matrix server or the IRC channel. + +### Reporting bugs +* A bug is an unintended behavior or, in the worst case, a crash. However, it is not a bug if you believe something is missing in the game. In this case, please read "Requesting features" +* If you report a crash, always include the error message. If you play in singleplayer, post a screenshot of the message that minetest showed when the crash happened (or copy the message into your issue). If you are a server admin, you can find error messages in the log file of the server. +* Tell us which MineClone2 and minetest versions you are using. +* It's always useful to tell us what you were doing to trigger the bug, e.g. before the crash happened or what causes the faulty behavior + +### Requesting features +* Make sure the feature you request is Minecraft 1.17 Java Edition or Optifine behavior. +* Don't beg for something to be implemented. We are not going to rethink our development roadmap because someone sais "Pls pls make this I'm waiting for this so bad!!!11!". +* Check whether the feature has been implemented in a newer version of MineClone2, in case you are not using the latest one. + +### Testing code +If you want to help us with speeding up MineClone2 development and making the game more stable, a great way to do that is by testing out new features from contributors. +For most new things that get into the game, a pull request is created. A pull request is essentially a programmer saying "Look, I modified the game, please apply my changes to the upstream version of the game". +However, every programmer makes mistakes sometimes, some of which are hard to spot. You can help by downloading this modified version of the game and trying it out - then you tell us whether the code works and does what it claims to do or whether you have encountered any issues. +You can find currently open pull requests here: . Note that pull requests that start with a `WIP:` are not done yet, and therefore might not work, so it's not very useful to try them out yet. + +### Profiling +If you own a server, a great way to help us improve MineClone2's code is by giving us profiler results. Profiler results give us detailed information about the game's performance and let us know where the real troublespots are. This way we can make the game faster. +Minetest has a built in profiler. Simply set `profiler.load = true` in your configuration file and restart the server. After running the server for some time, just run `/profiler save` in chat - then you will find a file in the world directory containing the results. Open a new issue and upload the file. You can name the issue " profiler results". + +### Let us know your opinion +It is always encouraged to actively contribute to issue discussions, let us know what you think about a topic and help us make decisions. + +### Crediting +If you opened or have contributed to an issue, you receive the `Community` role on our Discord (after asking for it). + +## How you can help as a programmer +(Almost) all the MineClone2 development is done using pull requests. If you feel like a problem needs to fixed or you want to make a new feature, you could start writing the code right away and notifying us when you're, but it it never hurts to discuss things first. If there is no issue on the topic, open one. If there is an issue, tell us that you'd like to take care of it, to avoid duplicate work. Note that we appreciate any effort, so even if you are a relatively new programmer, you can already contribute to the project - if you have problems or questions regarding git, Lua, or the Minetest API - or the MineClone2 codebase, feel free to ask them on our Discord. +By asking us to include your changes in this game, you agree that they fall under the terms of the GPLv3, which basically means they will become part of a free software. +If your code leads to bugs or crashes after being merged, it is your responsibility to fix them as soon as possible. + +### The recommended workflow +* Fork the repository (in case you have not already) * Do your change in a new branch * Create a pull request to get your changes merged into master +* Keep your pull request up to date by regulary merging upstream +* After the pull request got merged, you can delete the branch -For small changes, sending us a patch is also good. +### Git Guidelines +* We use merge rather than rebase or squash merge +* We don't use git submodules. +* Your commit names should be relatively descriptive, e.g. when saying "Fix #issueid", the commit message should also contain the title of the issue. -For big changes: Same as above, but consider notifying us first to avoid -duplicate work and possible tears of rejection. ;-) +### Code Guidelines +* Each mod must provide `mod.conf`. +* Each mod which add API functions should store functions inside a global table named like the mod. +* Public functions should not use self references but rather just access the table directly. +* Use modern Minetest API +* Use spaces instead of tabs +* Even if it improves performance, it is discouraged to localize variables at the beggining of files, since if another mod overrides some of the functions / variables you localized, you will still have a reference to the old function. -For trusted people, we might give them direct commit access to this -repository. In this case, you obviously don't need to fork, but you still -need to show your contributions align with the project goals. We still -reserve the right to revert everything that we don't like. -For bigger changes, we strongly recommend to use feature branches and -discuss with me first. +### Changes to Gameplay +Pull Requests that change gameplay have to be properly researched and need to state their sources. These PRs also need Fleckenstein's approval before they are merged. +You can use these sources: -If your code causes bugs and crashes, it is your responsibility to fix them as soon as possible. +* Minecraft code (Name the source file and line, however DONT post any proprietary code). You can use MCP to decompile Minecraft. +* Testing things inside of Minecraft (Attach screenshots / video footage of the results) +* Official Minecraft Wiki (Include a link to the page) -We mostly use plain merging rather than rebasing or squash merging. +### Developer status +Active and trusted contributors are often granted write access to the MineClone2 repository. However you should not push things directly to MineClone2 master - rather, do your work on a branch on your private repo, then create a pull request. This way other people can review your changes and make sure they work before they get merged. You are allowed to merge PRs if they have recieved the necessary feedback. +You may also be assigned to issues or pull requests as a developer. In this case it is your responsibility to fix the issue / review and merge the pull request when it is ready. You can also unassign yourself from the issue / PR if you have no time or don't want to take care of it for some other reason (after all, everyone is a volunteer and we can't expect you to do work that you are not intrested in) - the important thing is really that you make sure to inform us if you won't take care of something that has been assigned to you. +Also, please assign yourself to something that you want to work on to avoid duplicate work. +As a developer, it should be easy to reach you about your code. You should be on the Discord (or, if you really don't like Discord, Matrix or IRC). -Your commit names should be relatively descriptive, e.g. when saying "Fix #issueid", the commit message should also contain the title of the issue. +### Maintainer status +Maintainers are responsible for making sure issues are addressed and pull requests are reviewed and merged, by assigning either themselves or Developers to issues / PRs. +Maintainers are responsible for making releases, making sure guidelines are kept and making project decisions based on what the community wants. +Maintainers grant/revoke developer access. -Contributors will be credited in `CREDITS.md`. +Currently there are two maintainers with different responsibility fields: -## Code Style +* Fleckenstein - responsible for gameplay review, technical guidelines and issue/PR delegation +* Nicu - responsible for community related issues -Each mod must provide `mod.conf`. -Each mod which add API functions should store functions inside a global table named like the mod. -Public functions should not use self references but rather just access the table directly. -Functions should be defined in this way: -``` -function mcl_xyz.stuff(param) end -``` -Insteed of this way: -``` -mcl_xyz.stuff = function(param) end -``` -Indentation must be unified, more likely with tabs. - -Time sensitive mods should make a local copy of most used API functions to improve performances. -``` -local vector = vector -local get_node = minetest.get_node -``` - - -## Features > 1.12 - -If you want to make a feature that was added in a Minecraft version later than 1.12, you should fork MineClone5 (mineclone5 branch in the repository) and add your changes to this. - -## What we accept - -* Every MC features up to version 1.12 JE. -* Every already finished and working good features from versions above (only when making a MineClone5 PR / Contribution). -* Except features which couldn't be done easily and bugfree because of Minetest engine limitations. Eg. we CAN extend world boundaries by playing with map chunks, just teleporting player onto next layer after 31000 , but it would cost too much (time, code, bugs, performance, stability, etc). -* Some features, approved by the rest of the community, I mean maybe some voting and really missing any negative feedback. - -## What we reject - -* Any features which cause critical bugs, sending them to rework/fix or trying to fix immediately. -* Some small portions of big entirely missing features which just definitely break gamplay balance give nothing useful -* Controversial features, which some people support while others do not should be discussed well, with publishing forum announcements, at least during the week. In case if there are still doubts - send them into the mod. - -## Reporting bugs -Report all bugs and missing Minecraft features here: - - - -## Direct discussion -We have an IRC channel! Join us on #mineclone2 in freenode.net. - - - -## Creating releases +#### Creating releases * Launch MineClone2 to make sure it still runs * Update the version number in README.md * Use `git tag ` to tag the latest commit with the version number @@ -103,3 +129,7 @@ We have an IRC channel! Join us on #mineclone2 in freenode.net. * Update ContentDB (https://content.minetest.net/packages/Wuzzy/mineclone2/) * Update first post in forum thread (https://forum.minetest.net/viewtopic.php?f=50&t=16407) * Post release announcement and changelog in forums + +## Crediting +Contributors, Developers and Maintainers will be credited in `CREDITS.md`. If you make your first time contribution, please add yourself to this file. +There are also Discord roles for Contributors, Developers and Maintainers. From 5c55ddff1e77db995979c6e64457190455fa07f5 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 24 Oct 2021 20:21:54 +0200 Subject: [PATCH 093/228] Delete merge artifact --- CONTRIBUTING.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 67554d9fa..84ac10f20 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -81,7 +81,6 @@ If your code leads to bugs or crashes after being merged, it is your responsibil * Fork the repository (in case you have not already) * Do your change in a new branch * Create a pull request to get your changes merged into master -<<<<<<< HEAD * Keep your pull request up to date by regulary merging upstream * After the pull request got merged, you can delete the branch From 832e634e3bae8e37657a5e8eb23950d6c37c0509 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 24 Oct 2021 20:44:37 +0200 Subject: [PATCH 094/228] Use tabs instead of spaces, spaces are braindead --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 84ac10f20..b47ab9aa0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -94,7 +94,7 @@ If your code leads to bugs or crashes after being merged, it is your responsibil * Each mod which add API functions should store functions inside a global table named like the mod. * Public functions should not use self references but rather just access the table directly. * Use modern Minetest API -* Use spaces instead of tabs +* Use tabs instead of spaces * Even if it improves performance, it is discouraged to localize variables at the beggining of files, since if another mod overrides some of the functions / variables you localized, you will still have a reference to the old function. ### Changes to Gameplay From dafe860e56ac7ce866affe414fe7eef20b5fd3db Mon Sep 17 00:00:00 2001 From: NO11 Date: Sun, 24 Oct 2021 19:31:51 +0000 Subject: [PATCH 095/228] simple totem particles --- mods/ITEMS/mcl_totems/init.lua | 77 +++++++++------------------------- 1 file changed, 20 insertions(+), 57 deletions(-) diff --git a/mods/ITEMS/mcl_totems/init.lua b/mods/ITEMS/mcl_totems/init.lua index 2206fcb2a..79b2c8de0 100644 --- a/mods/ITEMS/mcl_totems/init.lua +++ b/mods/ITEMS/mcl_totems/init.lua @@ -4,49 +4,7 @@ minetest.register_on_leaveplayer(function(player) hud_totem[player] = nil end) --- Totem particle registration - -function rgb_to_hex(r, g, b) - return string.format("%02x%02x%02x", r, g, b) -end - -minetest.register_entity("mcl_totems:totem_particle", { - physical = true, - collide_with_objects = false, - collisionbox = { -0.02, -0.02, -0.02, 0.02, 0.02, 0.02 }, - pointable = false, - visual = "sprite", - visual_size = { x = 0.2, y = 0.2 }, - spritediv = { x = 1, y = 1 }, - initial_sprite_basepos = { x = 0, y = 0 }, - static_save = false, - glow = 14, - on_activate = function(self, staticdata) - local color - if math.random(0, 3) == 0 then - color = rgb_to_hex( 153 + math.random() * 51, 153 + math.random() * 76.5, math.random() * 51) - else - color = rgb_to_hex(25.5 + math.random() * 102, 153 + math.random() * 76.5, math.random() * 51) - end - self.object:set_properties({ - textures = { "mcl_particles_totem"..math.random(1, 4)..".png^[colorize:#"..color } - }) - local t = math.random(1, 2)*math.random() - minetest.after(t, function() - self.object:set_velocity({ x = math.random(-4, 4) * math.random(), y = math.random(-1, 4) * math.random(), z = math.random(-4, 4) * math.random() }) - end) - minetest.after(0.3 + t, function() - self.object:set_acceleration({ x = 0, y = -4, z = 0 }) - self.object:set_velocity({ x = 0, y = 0, z = 0 }) - end) - end, - on_step = function(self, dtime) - local r = math.random(1, 50) - if r == 1 then - self.object:remove() - end - end -}) +local particle_colors = {"98BF22", "C49E09", "337D0B", "B0B021", "1E9200"} -- TODO: real MC colors -- Save the player from death when holding totem of undying in hand mcl_damage.register_modifier(function(obj, damage, reason) @@ -74,27 +32,32 @@ mcl_damage.register_modifier(function(obj, damage, reason) end -- Effects - minetest.sound_play({ name = "mcl_totems_totem", gain = 1 }, { pos = ppos, max_hear_distance = 16 }, true) - - --Particles + minetest.sound_play({name = "mcl_totems_totem", gain = 1}, {pos=ppos, max_hear_distance = 16}, true) - minetest.after(0.1, function() - local new_pos = obj:get_pos() - if not new_pos then return end - local particlepos = { x = new_pos.x, y = new_pos.y + 1, z = new_pos.z } - for i = 1, 150 do - minetest.add_entity(particlepos, "mcl_totems:totem_particle") - end - end) + for i = 1, 100 do + minetest.add_particle({ + pos = vector.offset(ppos, 0, math.random(-10, 10) / 10, 0), + velocity = vector.new(math.random(-15, 15) / 10, math.random(0, 15) / 10, math.random(-15, 15) / 10), + acceleration = vector.new(0, -math.random(1, 10) / 10, 0), + expirationtime = math.random(1, 3), + size = math.random(1, 2), + collisiondetection = true, + collision_removal = true, + object_collision = false, + texture = "mcl_particles_totem" .. math.random(1, 4) .. ".png^[colorize:#" .. particle_colors[math.random(#particle_colors)], + glow = 10, + }) + + end -- Big totem overlay if not hud_totem[obj] then hud_totem[obj] = obj:hud_add({ hud_elem_type = "image", text = "mcl_totems_totem.png", - position = { x = 0.5, y = 1 }, - scale = { x = 17, y = 17 }, - offset = { x = 0, y = -178 }, + position = {x = 0.5, y = 1}, + scale = {x = 17, y = 17}, + offset = {x = 0, y = -178}, z_index = 100, }) minetest.after(3, function() From 6e94550a12ad7685a18e09fc5235238ac0a06770 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 08:44:12 +0000 Subject: [PATCH 096/228] Clarification about tab indent Signed-off-by: Elias Fleckenstein --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b47ab9aa0..1765a8799 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -94,7 +94,7 @@ If your code leads to bugs or crashes after being merged, it is your responsibil * Each mod which add API functions should store functions inside a global table named like the mod. * Public functions should not use self references but rather just access the table directly. * Use modern Minetest API -* Use tabs instead of spaces +* Use tabs for indentation (rather than spaces) * Even if it improves performance, it is discouraged to localize variables at the beggining of files, since if another mod overrides some of the functions / variables you localized, you will still have a reference to the old function. ### Changes to Gameplay From f3693138c85a3f91a79a5f26ab10bcc914e02062 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 08:46:33 +0000 Subject: [PATCH 097/228] Use proper English Signed-off-by: Elias Fleckenstein --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1765a8799..ebea65736 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,7 @@ Wow, thank you! :-) But first, some things to note: MineClone2's development target is to make a free software clone of Minecraft, -***version 1.17***, ***Java Edition***, *** + Optifine features supported by the Minetest Engine***. The priority is making polished features up to version 1.12. +***version 1.17***, ***Java Edition***, *** + Optifine features supported by the Minetest Engine ***. The priority is making polished features up to version 1.12. MineClone2 is maintained by Nicu and Fleckenstein. If you have any problems or questions, contact us (See Links section below). @@ -40,7 +40,7 @@ report a bug or request a feature. ### Rules about both bugs and feature requests * Stay polite towards the developers and anyone else involved in the discussion. * Choose a descriptive title. -* Try to use proper english and please start the title with a capital letter. +* Try to use proper English and please start the title with a capital letter. * Always check the currently opened issues before creating a new one. Don't report bugs that have already been reported or request features that already have been requested. * If you know about Minetest's inner workings, please think about whether the bug / the feature that you are reporting / requesting is actually an issue with Minetest itself, and if it is, head to the [Minetest issue tracker](https://github.com/minetest/minetest/issues) instead. * If you need any help regarding creating a Mesehub account or opening an issue, feel free to ask on the Discord / Matrix server or the IRC channel. From b18e077ba3d99c0f2a3660a8b7a9bc5f973b98f4 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 08:47:56 +0000 Subject: [PATCH 098/228] Markdown fix to development target info Signed-off-by: Elias Fleckenstein --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ebea65736..4f3bc9c39 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,7 @@ Wow, thank you! :-) But first, some things to note: MineClone2's development target is to make a free software clone of Minecraft, -***version 1.17***, ***Java Edition***, *** + Optifine features supported by the Minetest Engine ***. The priority is making polished features up to version 1.12. +***version 1.17***, ***Java Edition***, ***+ Optifine features supported by the Minetest Engine***. The priority is making polished features up to version 1.12. MineClone2 is maintained by Nicu and Fleckenstein. If you have any problems or questions, contact us (See Links section below). From b9999195ec99104aaa5ff6584600893c2bb739c8 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 16:52:56 +0200 Subject: [PATCH 099/228] Add publishing releases to my responsibility field --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b47ab9aa0..e9a14a54f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -118,7 +118,7 @@ Maintainers grant/revoke developer access. Currently there are two maintainers with different responsibility fields: -* Fleckenstein - responsible for gameplay review, technical guidelines and issue/PR delegation +* Fleckenstein - responsible for gameplay review, publishing releases, technical guidelines and issue/PR delegation * Nicu - responsible for community related issues #### Creating releases From 664244d25c5212bd672b3e42db70489a46771162 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 17:20:58 +0200 Subject: [PATCH 100/228] Make sure PRs are tested at least twice before being merged --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e9a14a54f..eaced68fa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -106,7 +106,7 @@ You can use these sources: * Official Minecraft Wiki (Include a link to the page) ### Developer status -Active and trusted contributors are often granted write access to the MineClone2 repository. However you should not push things directly to MineClone2 master - rather, do your work on a branch on your private repo, then create a pull request. This way other people can review your changes and make sure they work before they get merged. You are allowed to merge PRs if they have recieved the necessary feedback. +Active and trusted contributors are often granted write access to the MineClone2 repository. However you should not push things directly to MineClone2 master - rather, do your work on a branch on your private repo, then create a pull request. This way other people can review your changes and make sure they work before they get merged. You are allowed to merge PRs if they have recieved the necessary feedback and have been tested to not lead to any crashes and do what they claim to do by at least two different people. You may also be assigned to issues or pull requests as a developer. In this case it is your responsibility to fix the issue / review and merge the pull request when it is ready. You can also unassign yourself from the issue / PR if you have no time or don't want to take care of it for some other reason (after all, everyone is a volunteer and we can't expect you to do work that you are not intrested in) - the important thing is really that you make sure to inform us if you won't take care of something that has been assigned to you. Also, please assign yourself to something that you want to work on to avoid duplicate work. As a developer, it should be easy to reach you about your code. You should be on the Discord (or, if you really don't like Discord, Matrix or IRC). From 4b1606eaee2d5da2c36e1892efae3bae37d3b13e Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 18:26:31 +0200 Subject: [PATCH 101/228] Update 'git for non-programmers' section --- CONTRIBUTING.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 79d08e22a..93b52c32b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -25,10 +25,10 @@ whether you're a programmer or not. ## Using git MineClone2 is developed using the version control system [git](https://git-scm.com/). If you want to contribute code to the project, it is **highly recommended** that you learn the git basics. -However, if you're not a programmer or don't plan to help with the coding part of the development, -it's still useful if you know it - in case you want to contribute files that are not related to code, -or to easily keep your game updated and test out pull requests. However, it's not required in this -case. +For non-programmers and people who do not plan to contribute code to Mineclone2, git is not required. +However, git is a tool that will be referenced frequently because of its usefulness. +As such, it is valuable in learning how git works and its terminology. It can also help you in +keeping your game updated, and easily testing pull requests. ## How you can help as a non-programmer From 27f35fe422c560bad9109e09460ff36a9f1f024a Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 18:48:11 +0200 Subject: [PATCH 102/228] Add info about discord server in 'Let us know your opinion' section --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 93b52c32b..1e1b20778 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -67,7 +67,7 @@ If you own a server, a great way to help us improve MineClone2's code is by givi Minetest has a built in profiler. Simply set `profiler.load = true` in your configuration file and restart the server. After running the server for some time, just run `/profiler save` in chat - then you will find a file in the world directory containing the results. Open a new issue and upload the file. You can name the issue " profiler results". ### Let us know your opinion -It is always encouraged to actively contribute to issue discussions, let us know what you think about a topic and help us make decisions. +It is always encouraged to actively contribute to issue discussions on MeseHub, let us know what you think about a topic and help us make decisions. Also, note that a lot of discussion takes place on the Discord server, so it's definitely worth checking it out. ### Crediting If you opened or have contributed to an issue, you receive the `Community` role on our Discord (after asking for it). From d2242363889327ecc44ef1c1924f3f16160e2604 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 18:58:30 +0200 Subject: [PATCH 103/228] Consistency about line length (not a convention, just something applied to this file) --- CONTRIBUTING.md | 201 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 147 insertions(+), 54 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1e1b20778..7e914ac17 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,8 +4,10 @@ Wow, thank you! :-) But first, some things to note: -MineClone2's development target is to make a free software clone of Minecraft, -***version 1.17***, ***Java Edition***, ***+ Optifine features supported by the Minetest Engine***. The priority is making polished features up to version 1.12. +MineClone2's development target is to make a free software clone of +Minecraft, ***version 1.17***, ***Java Edition***, ***+ Optifine +features supported by the Minetest Engine***. The priority is making +polished features up to version 1.12. MineClone2 is maintained by Nicu and Fleckenstein. If you have any problems or questions, contact us (See Links section below). @@ -23,59 +25,116 @@ whether you're a programmer or not. * [Minetest forums](https://forum.minetest.net/viewtopic.php?f=50&t=16407) ## Using git -MineClone2 is developed using the version control system [git](https://git-scm.com/). If you want to -contribute code to the project, it is **highly recommended** that you learn the git basics. -For non-programmers and people who do not plan to contribute code to Mineclone2, git is not required. -However, git is a tool that will be referenced frequently because of its usefulness. -As such, it is valuable in learning how git works and its terminology. It can also help you in +MineClone2 is developed using the version control system +[git](https://git-scm.com/). If you want to contribute code to the +project, it is **highly recommended** that you learn the git basics. +For non-programmers and people who do not plan to contribute code to +Mineclone2, git is not required. However, git is a tool that will be +referenced frequently because of its usefulness. As such, it is valuable +in learning how git works and its terminology. It can also help you in keeping your game updated, and easily testing pull requests. ## How you can help as a non-programmer As someone who does not know how to write programs in Lua or does not -know how to use the Minetest API, you can still help us out a lot. -For example, by opening an issue in the [Issue tracker](https://git.minetest.land/MineClone2/MineClone2/issues), you can -report a bug or request a feature. +know how to use the Minetest API, you can still help us out a lot. For +example, by opening an issue in the +[Issue tracker](https://git.minetest.land/MineClone2/MineClone2/issues), +you can report a bug or request a feature. ### Rules about both bugs and feature requests -* Stay polite towards the developers and anyone else involved in the discussion. +* Stay polite towards the developers and anyone else involved in the +discussion. * Choose a descriptive title. -* Try to use proper English and please start the title with a capital letter. -* Always check the currently opened issues before creating a new one. Don't report bugs that have already been reported or request features that already have been requested. -* If you know about Minetest's inner workings, please think about whether the bug / the feature that you are reporting / requesting is actually an issue with Minetest itself, and if it is, head to the [Minetest issue tracker](https://github.com/minetest/minetest/issues) instead. -* If you need any help regarding creating a Mesehub account or opening an issue, feel free to ask on the Discord / Matrix server or the IRC channel. +* Try to use proper English and please start the title with a capital +letter. +* Always check the currently opened issues before creating a new one. +Don't report bugs that have already been reported or request features +that already have been requested. +* If you know about Minetest's inner workings, please think about +whether the bug / the feature that you are reporting / requesting is +actually an issue with Minetest itself, and if it is, head to the +[Minetest issue tracker](https://github.com/minetest/minetest/issues) +instead. +* If you need any help regarding creating a Mesehub account or opening +an issue, feel free to ask on the Discord / Matrix server or the IRC +channel. ### Reporting bugs -* A bug is an unintended behavior or, in the worst case, a crash. However, it is not a bug if you believe something is missing in the game. In this case, please read "Requesting features" -* If you report a crash, always include the error message. If you play in singleplayer, post a screenshot of the message that minetest showed when the crash happened (or copy the message into your issue). If you are a server admin, you can find error messages in the log file of the server. +* A bug is an unintended behavior or, in the worst case, a crash. +However, it is not a bug if you believe something is missing in the +game. In this case, please read "Requesting features" +* If you report a crash, always include the error message. If you play +in singleplayer, post a screenshot of the message that minetest showed +when the crash happened (or copy the message into your issue). If you +are a server admin, you can find error messages in the log file of the +server. * Tell us which MineClone2 and minetest versions you are using. -* It's always useful to tell us what you were doing to trigger the bug, e.g. before the crash happened or what causes the faulty behavior +* It's always useful to tell us what you were doing to trigger the bug, +e.g. before the crash happened or what causes the faulty behavior ### Requesting features -* Make sure the feature you request is Minecraft 1.17 Java Edition or Optifine behavior. -* Don't beg for something to be implemented. We are not going to rethink our development roadmap because someone sais "Pls pls make this I'm waiting for this so bad!!!11!". -* Check whether the feature has been implemented in a newer version of MineClone2, in case you are not using the latest one. +* Make sure the feature you request is Minecraft 1.17 Java Edition or +Optifine behavior. +* Don't beg for something to be implemented. We are not going to rethink +our development roadmap because someone sais "Pls pls make this I'm +waiting for this so bad!!!11!". +* Check whether the feature has been implemented in a newer version of +MineClone2, in case you are not using the latest one. ### Testing code -If you want to help us with speeding up MineClone2 development and making the game more stable, a great way to do that is by testing out new features from contributors. -For most new things that get into the game, a pull request is created. A pull request is essentially a programmer saying "Look, I modified the game, please apply my changes to the upstream version of the game". -However, every programmer makes mistakes sometimes, some of which are hard to spot. You can help by downloading this modified version of the game and trying it out - then you tell us whether the code works and does what it claims to do or whether you have encountered any issues. -You can find currently open pull requests here: . Note that pull requests that start with a `WIP:` are not done yet, and therefore might not work, so it's not very useful to try them out yet. +If you want to help us with speeding up MineClone2 development and +making the game more stable, a great way to do that is by testing out +new features from contributors. For most new things that get into the +game, a pull request is created. A pull request is essentially a +programmer saying "Look, I modified the game, please apply my changes +to the upstream version of the game". However, every programmer makes +mistakes sometimes, some of which are hard to spot. You can help by +downloading this modified version of the game and trying it out - then +you tell us whether the code works and does what it claims to do or +whether you have encountered any issues. You can find currently open +pull requests here: +. Note that pull +requests that start with a `WIP:` are not done yet, and therefore might +not work, so it's not very useful to try them out yet. ### Profiling -If you own a server, a great way to help us improve MineClone2's code is by giving us profiler results. Profiler results give us detailed information about the game's performance and let us know where the real troublespots are. This way we can make the game faster. -Minetest has a built in profiler. Simply set `profiler.load = true` in your configuration file and restart the server. After running the server for some time, just run `/profiler save` in chat - then you will find a file in the world directory containing the results. Open a new issue and upload the file. You can name the issue " profiler results". +If you own a server, a great way to help us improve MineClone2's code +is by giving us profiler results. Profiler results give us detailed +information about the game's performance and let us know where the real +troublespots are. This way we can make the game faster. Minetest has a +built in profiler. Simply set `profiler.load = true` in your +configuration file and restart the server. After running the server for +some time, just run `/profiler save` in chat - then you will find a file +in the world directory containing the results. Open a new issue and +upload the file. You can name the issue " profiler +results". ### Let us know your opinion -It is always encouraged to actively contribute to issue discussions on MeseHub, let us know what you think about a topic and help us make decisions. Also, note that a lot of discussion takes place on the Discord server, so it's definitely worth checking it out. +It is always encouraged to actively contribute to issue discussions on +MeseHub, let us know what you think about a topic and help us make +decisions. Also, note that a lot of discussion takes place on the +Discord server, so it's definitely worth checking it out. ### Crediting -If you opened or have contributed to an issue, you receive the `Community` role on our Discord (after asking for it). +If you opened or have contributed to an issue, you receive the +`Community` role on our Discord (after asking for it). ## How you can help as a programmer -(Almost) all the MineClone2 development is done using pull requests. If you feel like a problem needs to fixed or you want to make a new feature, you could start writing the code right away and notifying us when you're, but it it never hurts to discuss things first. If there is no issue on the topic, open one. If there is an issue, tell us that you'd like to take care of it, to avoid duplicate work. Note that we appreciate any effort, so even if you are a relatively new programmer, you can already contribute to the project - if you have problems or questions regarding git, Lua, or the Minetest API - or the MineClone2 codebase, feel free to ask them on our Discord. -By asking us to include your changes in this game, you agree that they fall under the terms of the GPLv3, which basically means they will become part of a free software. -If your code leads to bugs or crashes after being merged, it is your responsibility to fix them as soon as possible. +(Almost) all the MineClone2 development is done using pull requests. +If you feel like a problem needs to fixed or you want to make a new +feature, you could start writing the code right away and notifying us +when you're, but it it never hurts to discuss things first. If there is +no issue on the topic, open one. If there is an issue, tell us that +you'd like to take care of it, to avoid duplicate work. Note that we +appreciate any effort, so even if you are a relatively new programmer, +you can already contribute to the project - if you have problems or +questions regarding git, Lua, or the Minetest API - or the MineClone2 +codebase, feel free to ask them on our Discord. By asking us to include +your changes in this game, you agree that they fall under the terms of +the GPLv3, which basically means they will become part of a free +software. If your code leads to bugs or crashes after being merged, it +is your responsibility to fix them as soon as possible. ### The recommended workflow * Fork the repository (in case you have not already) @@ -87,49 +146,83 @@ If your code leads to bugs or crashes after being merged, it is your responsibil ### Git Guidelines * We use merge rather than rebase or squash merge * We don't use git submodules. -* Your commit names should be relatively descriptive, e.g. when saying "Fix #issueid", the commit message should also contain the title of the issue. +* Your commit names should be relatively descriptive, e.g. when saying +"Fix #issueid", the commit message should also contain the title of the +issue. ### Code Guidelines * Each mod must provide `mod.conf`. -* Each mod which add API functions should store functions inside a global table named like the mod. -* Public functions should not use self references but rather just access the table directly. +* Each mod which add API functions should store functions inside a +global table named like the mod. +* Public functions should not use self references but rather just access +the table directly. * Use modern Minetest API * Use tabs for indentation (rather than spaces) -* Even if it improves performance, it is discouraged to localize variables at the beggining of files, since if another mod overrides some of the functions / variables you localized, you will still have a reference to the old function. +* Even if it improves performance, it is discouraged to localize +variables at the beggining of files, since if another mod overrides some +of the functions / variables you localized, you will still have a +reference to the old function. ### Changes to Gameplay -Pull Requests that change gameplay have to be properly researched and need to state their sources. These PRs also need Fleckenstein's approval before they are merged. +Pull Requests that change gameplay have to be properly researched and +need to state their sources. These PRs also need Fleckenstein's approval +before they are merged. You can use these sources: -* Minecraft code (Name the source file and line, however DONT post any proprietary code). You can use MCP to decompile Minecraft. -* Testing things inside of Minecraft (Attach screenshots / video footage of the results) +* Minecraft code (Name the source file and line, however DONT post any +proprietary code). You can use MCP to decompile Minecraft. +* Testing things inside of Minecraft (Attach screenshots / video footage +of the results) * Official Minecraft Wiki (Include a link to the page) ### Developer status -Active and trusted contributors are often granted write access to the MineClone2 repository. However you should not push things directly to MineClone2 master - rather, do your work on a branch on your private repo, then create a pull request. This way other people can review your changes and make sure they work before they get merged. You are allowed to merge PRs if they have recieved the necessary feedback and have been tested to not lead to any crashes and do what they claim to do by at least two different people. -You may also be assigned to issues or pull requests as a developer. In this case it is your responsibility to fix the issue / review and merge the pull request when it is ready. You can also unassign yourself from the issue / PR if you have no time or don't want to take care of it for some other reason (after all, everyone is a volunteer and we can't expect you to do work that you are not intrested in) - the important thing is really that you make sure to inform us if you won't take care of something that has been assigned to you. -Also, please assign yourself to something that you want to work on to avoid duplicate work. -As a developer, it should be easy to reach you about your code. You should be on the Discord (or, if you really don't like Discord, Matrix or IRC). +Active and trusted contributors are often granted write access to the +MineClone2 repository. However you should not push things directly to +MineClone2 master - rather, do your work on a branch on your private +repo, then create a pull request. This way other people can review your +changes and make sure they work before they get merged. You are allowed +to merge PRs if they have recieved the necessary feedback and have been +tested to not lead to any crashes and do what they claim to do by at +least two different people. You may also be assigned to issues or pull +requests as a developer. In this case it is your responsibility to fix +the issue / review and merge the pull request when it is ready. You can +also unassign yourself from the issue / PR if you have no time or don't +want to take care of it for some other reason (after all, everyone is a +volunteer and we can't expect you to do work that you are not intrested +in) - the important thing is really that you make sure to inform us if +you won't take care of something that has been assigned to you. Also, +please assign yourself to something that you want to work on to avoid +duplicate work. As a developer, it should be easy to reach you about +your code. You should be on the Discord (or, if you really don't like +Discord, Matrix or IRC). ### Maintainer status -Maintainers are responsible for making sure issues are addressed and pull requests are reviewed and merged, by assigning either themselves or Developers to issues / PRs. -Maintainers are responsible for making releases, making sure guidelines are kept and making project decisions based on what the community wants. -Maintainers grant/revoke developer access. +Maintainers are responsible for making sure issues are addressed and +pull requests are reviewed and merged, by assigning either themselves or +Developers to issues / PRs. Maintainers are responsible for making +releases, making sure guidelines are kept and making project decisions +based on what the community wants. Maintainers grant/revoke developer +access. Currently there are two maintainers with different +responsibility fields: -Currently there are two maintainers with different responsibility fields: - -* Fleckenstein - responsible for gameplay review, publishing releases, technical guidelines and issue/PR delegation +* Fleckenstein - responsible for gameplay review, publishing releases, +technical guidelines and issue/PR delegation * Nicu - responsible for community related issues #### Creating releases * Launch MineClone2 to make sure it still runs * Update the version number in README.md -* Use `git tag ` to tag the latest commit with the version number +* Use `git tag ` to tag the latest commit with the +version number * Push to repo (don't forget `--tags`!) -* Update ContentDB (https://content.minetest.net/packages/Wuzzy/mineclone2/) -* Update first post in forum thread (https://forum.minetest.net/viewtopic.php?f=50&t=16407) +* Update ContentDB +(https://content.minetest.net/packages/Wuzzy/mineclone2/) +* Update first post in forum thread +(https://forum.minetest.net/viewtopic.php?f=50&t=16407) * Post release announcement and changelog in forums ## Crediting -Contributors, Developers and Maintainers will be credited in `CREDITS.md`. If you make your first time contribution, please add yourself to this file. -There are also Discord roles for Contributors, Developers and Maintainers. +Contributors, Developers and Maintainers will be credited in +`CREDITS.md`. If you make your first time contribution, please add +yourself to this file. There are also Discord roles for Contributors, +Developers and Maintainers. From 74890101520d4b04578dbc333aab38ea6cdf6eca Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 25 Oct 2021 17:08:38 +0000 Subject: [PATCH 104/228] Use particlespawners instead of single particles --- mods/ITEMS/mcl_totems/init.lua | 37 +++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/mods/ITEMS/mcl_totems/init.lua b/mods/ITEMS/mcl_totems/init.lua index 79b2c8de0..aa188855f 100644 --- a/mods/ITEMS/mcl_totems/init.lua +++ b/mods/ITEMS/mcl_totems/init.lua @@ -34,20 +34,29 @@ mcl_damage.register_modifier(function(obj, damage, reason) -- Effects minetest.sound_play({name = "mcl_totems_totem", gain = 1}, {pos=ppos, max_hear_distance = 16}, true) - for i = 1, 100 do - minetest.add_particle({ - pos = vector.offset(ppos, 0, math.random(-10, 10) / 10, 0), - velocity = vector.new(math.random(-15, 15) / 10, math.random(0, 15) / 10, math.random(-15, 15) / 10), - acceleration = vector.new(0, -math.random(1, 10) / 10, 0), - expirationtime = math.random(1, 3), - size = math.random(1, 2), - collisiondetection = true, - collision_removal = true, - object_collision = false, - texture = "mcl_particles_totem" .. math.random(1, 4) .. ".png^[colorize:#" .. particle_colors[math.random(#particle_colors)], - glow = 10, - }) - + for i = 1, 4 do + for c = 1, #particle_colors do + minetest.add_particlespawner({ + amount = math.round(100/(4 * #particle_colors)), + time = 1, + minpos = vector.offset(ppos, 0, -1, 0), + maxpos = vector.offset(ppos, 0, 1, 0), + minvel = vector.new(-1.5, 0, -1.5), + maxvel = vector.new(1.5, 1.5, 1.5), + minacc = vector.new(0, -0.1, 0), + maxacc = vector.new(0, -1, 0), + minexptime = 1, + maxexptime = 3, + minsize = 1, + maxsize = 2, + collisiondetection = true, + collision_removal = true, + object_collision = false, + vertical = false, + texture = "mcl_particles_totem" .. i .. ".png^[colorize:#" .. particle_colors[c], + glow = 10, + }) + end end -- Big totem overlay From a6def5e9bb7ddc3e70b13be51e4a53f1f33dcbba Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 19:14:53 +0200 Subject: [PATCH 105/228] Remove guideline about localizing variables --- CONTRIBUTING.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7e914ac17..722deefaf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -158,10 +158,6 @@ global table named like the mod. the table directly. * Use modern Minetest API * Use tabs for indentation (rather than spaces) -* Even if it improves performance, it is discouraged to localize -variables at the beggining of files, since if another mod overrides some -of the functions / variables you localized, you will still have a -reference to the old function. ### Changes to Gameplay Pull Requests that change gameplay have to be properly researched and From 6580bcab5a80644f940dbaf172b64979bbe5d6d5 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 19:15:26 +0200 Subject: [PATCH 106/228] Add info about Minestorm and add links for MCP and Minestorm --- CONTRIBUTING.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 722deefaf..f9d97c063 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -166,7 +166,10 @@ before they are merged. You can use these sources: * Minecraft code (Name the source file and line, however DONT post any -proprietary code). You can use MCP to decompile Minecraft. +proprietary code). You can use +[MCP](https://minecraft.fandom.com/wiki/Programs_and_editors/Mod_Coder_Pack) +to decompile Minecraft or look at +[Minestorm](https://github.com/Minestom/Minestom) code. * Testing things inside of Minecraft (Attach screenshots / video footage of the results) * Official Minecraft Wiki (Include a link to the page) From 362de4c920453f838349f43261f2cd9f46ba6951 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 19:16:24 +0200 Subject: [PATCH 107/228] Add minecraft wiki link --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f9d97c063..3637bdf1c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -172,7 +172,8 @@ to decompile Minecraft or look at [Minestorm](https://github.com/Minestom/Minestom) code. * Testing things inside of Minecraft (Attach screenshots / video footage of the results) -* Official Minecraft Wiki (Include a link to the page) +* [Official Minecraft Wiki](https://minecraft.fandom.com/wiki/Minecraft_Wiki) +(Include a link to the specific page you used) ### Developer status Active and trusted contributors are often granted write access to the From 3a422e3afc91a9dded5f613770b776759a2f8376 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 19:25:48 +0200 Subject: [PATCH 108/228] Reword 'understandable English' rule --- CONTRIBUTING.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3637bdf1c..03a76ce57 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -46,8 +46,9 @@ you can report a bug or request a feature. * Stay polite towards the developers and anyone else involved in the discussion. * Choose a descriptive title. -* Try to use proper English and please start the title with a capital -letter. +* Please write in plain, understandable English. It will be easier to +communicate. +* Please start the issue title with a capital letter. * Always check the currently opened issues before creating a new one. Don't report bugs that have already been reported or request features that already have been requested. From 756d28e2c61300205731e0cd370329e2dbb3a708 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 19:31:07 +0200 Subject: [PATCH 109/228] Use iliekprogrammar's wording in the begging rule --- CONTRIBUTING.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 03a76ce57..df3b5c059 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -77,9 +77,10 @@ e.g. before the crash happened or what causes the faulty behavior ### Requesting features * Make sure the feature you request is Minecraft 1.17 Java Edition or Optifine behavior. -* Don't beg for something to be implemented. We are not going to rethink -our development roadmap because someone sais "Pls pls make this I'm -waiting for this so bad!!!11!". +* Begging or excessive attention seeking does not help us in the +slightest, and may very well disrupt Mineclone2 development. It's better +to put that energy into helping or researching the feature in question. +After all, we're just volunteers working on our spare time. * Check whether the feature has been implemented in a newer version of MineClone2, in case you are not using the latest one. From 7707c3132c4da6c6f5db246d802c589610ab100d Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 19:46:13 +0200 Subject: [PATCH 110/228] Fix duplicate and forgotten word in 'helping as a programmer' section --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index df3b5c059..9b209d912 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -126,8 +126,8 @@ If you opened or have contributed to an issue, you receive the (Almost) all the MineClone2 development is done using pull requests. If you feel like a problem needs to fixed or you want to make a new feature, you could start writing the code right away and notifying us -when you're, but it it never hurts to discuss things first. If there is -no issue on the topic, open one. If there is an issue, tell us that +when you're done, but it never hurts to discuss things first. If there +is no issue on the topic, open one. If there is an issue, tell us that you'd like to take care of it, to avoid duplicate work. Note that we appreciate any effort, so even if you are a relatively new programmer, you can already contribute to the project - if you have problems or From c9987884358cff0548af0d017b5d073274aaa00a Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 19:48:14 +0200 Subject: [PATCH 111/228] Reword 'help for junior devs' section --- CONTRIBUTING.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9b209d912..cd7f9c465 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -128,15 +128,17 @@ If you feel like a problem needs to fixed or you want to make a new feature, you could start writing the code right away and notifying us when you're done, but it never hurts to discuss things first. If there is no issue on the topic, open one. If there is an issue, tell us that -you'd like to take care of it, to avoid duplicate work. Note that we -appreciate any effort, so even if you are a relatively new programmer, -you can already contribute to the project - if you have problems or -questions regarding git, Lua, or the Minetest API - or the MineClone2 -codebase, feel free to ask them on our Discord. By asking us to include -your changes in this game, you agree that they fall under the terms of -the GPLv3, which basically means they will become part of a free -software. If your code leads to bugs or crashes after being merged, it -is your responsibility to fix them as soon as possible. +you'd like to take care of it, to avoid duplicate work. We appreciate +any contributing effort to Mineclone2. If you are a relatively new +programmer, you can reach us on Discord, Matrix or IRC for questions +about git, Lua, Minetest API, Mineclone2 codebase or anything related +to MineClone2. We can help you avoid writing code that would be deemed +inadequeate, or help you become familiar with Mineclone2 better, or even +help using development tools. By asking us to include your changes in +this game, you agree that they fall under the terms of the GPLv3, which +basically means they will become part of a free software. If your code +leads to bugs or crashes after being merged, it is your responsibility +to fix them as soon as possible. ### The recommended workflow * Fork the repository (in case you have not already) From 5edf27ac88cbbbd249e781f0ca623b1f3696733f Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 19:54:10 +0200 Subject: [PATCH 112/228] Reword 'bug responsibility' section --- CONTRIBUTING.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cd7f9c465..66a1a3452 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -136,9 +136,10 @@ to MineClone2. We can help you avoid writing code that would be deemed inadequeate, or help you become familiar with Mineclone2 better, or even help using development tools. By asking us to include your changes in this game, you agree that they fall under the terms of the GPLv3, which -basically means they will become part of a free software. If your code -leads to bugs or crashes after being merged, it is your responsibility -to fix them as soon as possible. +basically means they will become part of a free software. Sometimes, +your code may cause crashes or bugs - we try to avoid such scenarios by +testing everytime before merging it, but if your merged work causes +problems, we ask you fix the issues as soon as possible. ### The recommended workflow * Fork the repository (in case you have not already) From 7f43ba6e36f857374803025664f0855dc7abceac Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 19:56:03 +0200 Subject: [PATCH 113/228] Clarify rule about merging upstream --- CONTRIBUTING.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 66a1a3452..ec0974e63 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -145,7 +145,9 @@ problems, we ask you fix the issues as soon as possible. * Fork the repository (in case you have not already) * Do your change in a new branch * Create a pull request to get your changes merged into master -* Keep your pull request up to date by regulary merging upstream +* Keep your pull request up to date by regulary merging upstream. It is +imperative that conflicts are resolved prior to merging the pull +request. * After the pull request got merged, you can delete the branch ### Git Guidelines From a877c615a5723e3a83bb5b42b90dd9f1938d67be Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 20:01:12 +0200 Subject: [PATCH 114/228] Clarify tabs usage: Use spaces for alignment --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ec0974e63..dfe2d9265 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -164,7 +164,7 @@ global table named like the mod. * Public functions should not use self references but rather just access the table directly. * Use modern Minetest API -* Use tabs for indentation (rather than spaces) +* Tabs should be used for indent, spaces for alignment ### Changes to Gameplay Pull Requests that change gameplay have to be properly researched and From 6e7827902cb9f5951550139cdb7d32c350aa7f1c Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 20:04:08 +0200 Subject: [PATCH 115/228] Use the wording 'reproduce a problem' in the reporting bugs section --- CONTRIBUTING.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dfe2d9265..3d29321c7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -71,8 +71,9 @@ when the crash happened (or copy the message into your issue). If you are a server admin, you can find error messages in the log file of the server. * Tell us which MineClone2 and minetest versions you are using. -* It's always useful to tell us what you were doing to trigger the bug, -e.g. before the crash happened or what causes the faulty behavior +* Tell us how to reproduce the problem: What you were doing to trigger +the bug, e.g. before the crash happened or what causes the faulty +behavior. ### Requesting features * Make sure the feature you request is Minecraft 1.17 Java Edition or From fba30eccd67e54852d98c320732c8add0a6acb2b Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 20:04:51 +0200 Subject: [PATCH 116/228] Add rule about double quotes for strings --- CONTRIBUTING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3d29321c7..c829fa3f3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -166,6 +166,7 @@ global table named like the mod. the table directly. * Use modern Minetest API * Tabs should be used for indent, spaces for alignment +* Use double quotes for strings ### Changes to Gameplay Pull Requests that change gameplay have to be properly researched and From 47fbb0c176b849a14cc7f62d9a026303f73d5d37 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 20:18:03 +0200 Subject: [PATCH 117/228] Mod naming convention, snake case convention --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c829fa3f3..3495d4ad3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -160,6 +160,7 @@ issue. ### Code Guidelines * Each mod must provide `mod.conf`. +* Mod names are snake case, and newly added mods start with `mcl_` * Each mod which add API functions should store functions inside a global table named like the mod. * Public functions should not use self references but rather just access @@ -167,6 +168,7 @@ the table directly. * Use modern Minetest API * Tabs should be used for indent, spaces for alignment * Use double quotes for strings +* Use snake_case rather than CamelCase ### Changes to Gameplay Pull Requests that change gameplay have to be properly researched and From a80438d58e7aec6bfb817578633099226138ffd4 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 20:21:45 +0200 Subject: [PATCH 118/228] Advice about atomic commits --- CONTRIBUTING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3495d4ad3..926fab212 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -157,6 +157,7 @@ request. * Your commit names should be relatively descriptive, e.g. when saying "Fix #issueid", the commit message should also contain the title of the issue. +* Try to keep your commits as atomic as possible ### Code Guidelines * Each mod must provide `mod.conf`. From 64660617964c6a51fa5a7237446e7ebeab8ef8db Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 20:33:45 +0200 Subject: [PATCH 119/228] Add back function declaration guideline, provide examples for code style guidelines --- CONTRIBUTING.md | 79 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 71 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 926fab212..827497799 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -161,15 +161,78 @@ issue. ### Code Guidelines * Each mod must provide `mod.conf`. -* Mod names are snake case, and newly added mods start with `mcl_` -* Each mod which add API functions should store functions inside a -global table named like the mod. +* Mod names are snake case, and newly added mods start with `mcl_`, e.g. +`mcl_core`, `mcl_farming`, `mcl_monster_eggs` +* To export functions, store them inside a global table named like the +mod, e.g. + +```lua +mcl_example = {} + +function mcl_example.do_something() + -- ... +end + +``` + * Public functions should not use self references but rather just access -the table directly. -* Use modern Minetest API -* Tabs should be used for indent, spaces for alignment -* Use double quotes for strings -* Use snake_case rather than CamelCase +the table directly, e.g. + +```lua +-- bad +function mcl_example:do_something() +end + +-- good +function mcl_example.do_something() +end +``` + +* Use modern Minetest API, e.g. no usage of `minetest.env` +* Tabs should be used for indent, spaces for alignment, e.g. + +```lua + +-- use tabs for indent + +for i = 1, 10 do + if i % 3 == 0 then + print(i) + end +end + +-- use tabs for indent and spaces to align things + +some_table = { + {"a string", 5}, + {"a very much longer string", 10}, +} +``` + +* Use double quotes for strings, e.g. `"asdf"` rather than `'asdf'` +* Use snake_case rather than CamelCase, e.g. `my_function` rather than +`MyFunction` +* Dont declare functions as an assignment, e.g. + +```lua +-- bad +local some_local_func = function() + -- ... +end + +my_mod.some_func = function() + -- ... +end + +-- good +local function some_local_func() + -- ... +end + +function my_mod.some_func() + -- ... +end +``` ### Changes to Gameplay Pull Requests that change gameplay have to be properly researched and From da5e703675429381932b8d8fb9c863ccd3d16f96 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 20:36:29 +0200 Subject: [PATCH 120/228] Clarify that 'make atomic commits' is just an advise --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 827497799..1f2d1d0de 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -157,7 +157,8 @@ request. * Your commit names should be relatively descriptive, e.g. when saying "Fix #issueid", the commit message should also contain the title of the issue. -* Try to keep your commits as atomic as possible +* Try to keep your commits as atomic as possible (advise, but completely +optional) ### Code Guidelines * Each mod must provide `mod.conf`. From f3d16d264cb46f1659b85795a75c1b762be4b615 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 20:41:09 +0200 Subject: [PATCH 121/228] Add notice about Minetest not supporting capital letters in modnames --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1f2d1d0de..9c235880d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -163,7 +163,8 @@ optional) ### Code Guidelines * Each mod must provide `mod.conf`. * Mod names are snake case, and newly added mods start with `mcl_`, e.g. -`mcl_core`, `mcl_farming`, `mcl_monster_eggs` +`mcl_core`, `mcl_farming`, `mcl_monster_eggs`. Keep in mind Minetest +does not support capital letters in mod names. * To export functions, store them inside a global table named like the mod, e.g. From eccba76732bff067bf677bee46acfc51e1298234 Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 25 Oct 2021 20:25:34 +0000 Subject: [PATCH 122/228] Use math.floor instead of math.round --- mods/ITEMS/mcl_totems/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_totems/init.lua b/mods/ITEMS/mcl_totems/init.lua index aa188855f..b11e68df7 100644 --- a/mods/ITEMS/mcl_totems/init.lua +++ b/mods/ITEMS/mcl_totems/init.lua @@ -37,7 +37,7 @@ mcl_damage.register_modifier(function(obj, damage, reason) for i = 1, 4 do for c = 1, #particle_colors do minetest.add_particlespawner({ - amount = math.round(100/(4 * #particle_colors)), + amount = math.floor(100 / (4 * #particle_colors)), time = 1, minpos = vector.offset(ppos, 0, -1, 0), maxpos = vector.offset(ppos, 0, 1, 0), From 30f7c638f377f7a2387974736ccd6ac171e5b0a6 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 22:55:48 +0200 Subject: [PATCH 123/228] mcl_enchanting: Add spanish translations and update template Credit to: todoporlalibertad Reviewed by j45 --- .../locale/mcl_enchanting.es.tr | 123 +++++++++++ mods/ITEMS/mcl_enchanting/locale/template.txt | 205 ++++++++++-------- 2 files changed, 240 insertions(+), 88 deletions(-) create mode 100644 mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.es.tr diff --git a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.es.tr b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.es.tr new file mode 100644 index 000000000..a977e8fe6 --- /dev/null +++ b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.es.tr @@ -0,0 +1,123 @@ +# textdomain: mcl_enchanting + + +### enchantments.lua ### + +Arrows passes through multiple objects.=Las flechas atraviesan multiples enemigos. +Arrows set target on fire.=Las flechas prenderan los enemigos. +Bane of Arthropods=Perdición de los Artrópodos +Channeling=Conductividad + +Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.=Canaliza los rayos de una tormenta hacia el enemigo. + +Curse of Vanishing=Maldición de Desaparición +Decreases crossbow charging time.=Disminuye el tiempo de carga de las ballestas. +Decreases time until rod catches something.=Disminuye el tiempo que tardan en picar los cebos en la pesca. +Depth Strider=Agilidad acuática +Efficiency=Eficiencia +Extends underwater breathing time.=Aumenta el tiempo de mantener la respiración. +Fire Aspect=Aspecto Ígneo +Flame=Fuego +Fortune=Fortuna +Frost Walker=Paso Helado +Impaling=Empalamiento +Increases arrow damage.=Incrementa el daño de las flechas. +Increases arrow knockback.=Incrementa el empuje de las flechas. +Increases certain block drops.=Incrementa la cantidad de objetos que sueltan los bloques. + +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Incrementa el daño y ralentiza a los artrópodos. (arañas, lepismas, endermitas, etc) + +Increases damage to undead mobs.=Incrementa el daño contra no-muertos. +Increases damage.=Incrementa el daño. +Increases item durability.=Incrementa la durabilidad de una herramienta. +Increases knockback.=Incrementa el empuje. +Increases mining speed.=Incrementa la velocidad de picado. +Increases mob loot.=Incrementa el botín de los enemigos. +Increases rate of good loot (enchanting books, etc.)=Incrementa la probabilidad de encontrar tesoros. +Increases sweeping attack damage.=Incrementa el daño de efecto area. +Increases underwater movement speed.=Incrementa la velocidad de nado bajo el agua. +Increases walking speed on soul sand.=Incrementa la velocidad al caminar sobre arena de Almas. +Infinity=Infinidad +Item destroyed on death.=El objeto se destruye tras tu muerte. +Knockback=Empuje +Looting=Botín +Loyalty=Lealtad +Luck of the Sea=Suerte Marina +Lure=Atracción +Mending=Reparación +Mined blocks drop themselves.=Los bloques se minarán enteros. +Multishot=Multidisparo +Piercing=Perforación +Power=Poder +Punch=Retroceso +Quick Charge=Carga Rápida +Repair the item while gaining XP orbs.=Repara los objetos portados al recibir orbes de experiencia. +Respiration=Respiración +Riptide=Propulsión acuática +Sets target on fire.=Incencia al enemigo. +Sharpness=Filo +Shoot 3 arrows at the cost of one.=Dispara 3 flechas al precio de una. +Shooting consumes no regular arrows.=No se consumiran las flechas lanzadas. +Silk Touch=Toque de Seda +Smite=Golpeo +Soul Speed=Velocidad de Almas +Sweeping Edge=Filo Arrasador +Trident deals additional damage to ocean mobs.=Incrementa el daño del tridente sobre criaturas acuáticas. + +Trident launches player with itself when thrown. Works only in water or rain.=El tridente impulsa al portador dentro del agua o bajo la lluvia. + +Trident returns after being thrown. Higher levels reduce return time.=El tridente regresa al portador tras lanzarlo. + +Turns water beneath the player into frosted ice and prevents the damage from magma blocks.=Congela el agua bajo tus pies y evita el daño de los bloques de magma. + +Unbreaking=Irrompibilidad + +### engine.lua ### + +@1 Enchantment Levels=Nivel de encantamiento: @1 +@1 Lapis Lazuli=@1 Lapis Lázuli +Inventory=Inventario +Level requirement: @1=Nivel requerido: @1 + +### init.lua ### + +'@1' is not a valid number='@1' no es un número válido +'@1' is not a valid number.='@1' no es un número válido + []= [] +@1 can't be combined with @2.=@1 no se puede combinar con @2 + +After finally selecting your enchantment; left-click on the selection, and you will see both the lapis lazuli and your experience levels consumed. And, an enchanted item left in its place.=Despues elige tu encantamiento, los niveles de experiencia y el lapis lázuli seran consumidos y el encantamiento aplicado al objeto. + +After placing your items in the slots, the enchanting options will be shown. Hover over the options to read what is available to you.=Coloca el objeto en su ranura yse mostraran los encantamientos a elegir. + +Enchant=Encantamiento +Enchant an item=Encantar objeto +Enchanted Book=Libro Encantado +Enchanting Table=Mesa de Encantamientos + +Enchanting Tables will let you enchant armors, tools, weapons, and books with various abilities. But, at the cost of some experience, and lapis lazuli.=La mesa de Encantamientos dara a tus herramientas, armas o armadura algunas habilidades magicas. Pero a coste de algo de experiencia y lapis lázuli. + +Enchanting succeded.=Encantado correctamente. +Forcefully enchant an item=Encantar objeto a la fuerza. + +Place a tool, armor, weapon or book into the top left slot, and then place 1-3 Lapis Lazuli in the slot to the right.=Coloca una herramienta, arma, armadura o libro sobre la ranura izquierda, coloca de 1 a 3 Lapis lázulis en la ranura derecha. + +Player '@1' cannot be found.=Jugador @1 no encontrado. +Rightclick the Enchanting Table to open the enchanting menu.=Clic derecho sobre la mesa de encantamientos para abrir la interfaz. +Spend experience, and lapis to enchant various items.=Experiencia y Lapis para encantar varios objetos. + +The number you have entered (@1) is too big, it must be at most @2.=@1 es muy grande, debe ser menor que @2 + +The number you have entered (@1) is too small, it must be at least @2.=@1 es muy pequeño, debe ser mayor a @2 + +The selected enchantment can't be added to the target item.=El encantamiento seleccionado no puede añadirse a ese objeto. +The target doesn't hold an item.=El jugador no sujeta un objeto. +The target item is not enchantable.=El objeto del jugador no se puede encantar. +There is no such enchantment '@1'.=@1 no es un encantamiento. + +These options are randomized, and dependent on experience level; but the enchantment strength can be increased.=Las opciones seran aleatorias dependiendo del nivel de experiencia, los niveles de encantamiento pueden ser aumentados. + +To increase the enchantment strength, place bookshelves around the enchanting table. However, you will need to keep 1 air node between the table, & the bookshelves to empower the enchanting table.=Para aumentar los niveles de encantamientos, coloca librerias alrededor y cerca de la mesa de encantamientos. + +Usage: /enchant []=Usa: /enchant [] +Usage: /forceenchant []=Usa /forceenchant [] diff --git a/mods/ITEMS/mcl_enchanting/locale/template.txt b/mods/ITEMS/mcl_enchanting/locale/template.txt index 08fa82097..1f540d6d3 100644 --- a/mods/ITEMS/mcl_enchanting/locale/template.txt +++ b/mods/ITEMS/mcl_enchanting/locale/template.txt @@ -1,100 +1,129 @@ # textdomain: mcl_enchanting -Aqua Affinity= -Increases underwater mining speed.= -Bane of Arthropods= -Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).= -Blast Protection= -Reduces explosion damage and knockback.= -Channeling= -Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.= -Curse of Binding= -Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.= -Curse of Vanishing= -Item destroyed on death.= -Depth Strider= -Increases underwater movement speed.= -Efficiency= -Increases mining speed.= -Feather Falling= -Reduces fall damage.= -Fire Aspect= -Sets target on fire.= -Fire Protection= -Reduces fire damage.= -Flame= -Arrows set target on fire.= -Fortune= -Increases certain block drops.= -Frost Walker= -Turns water beneath the player into frosted ice and prevents the damage from magma blocks.= -Impaling= -Trident deals additional damage to ocean mobs.= -Infinity= -Shooting consumes no regular arrows.= -Knockback= -Increases knockback.= -Looting= -Increases mob loot.= -Loyalty= -Trident returns after being thrown. Higher levels reduce return time.= -Luck of the Sea= -Increases rate of good loot (enchanting books, etc.)= -Lure= -Decreases time until rod catches something.= -Mending= -Repair the item while gaining XP orbs.= -Multishot= -Shoot 3 arrows at the cost of one.= -Piercing= + + +### enchantments.lua ### + Arrows passes through multiple objects.= -Power= -Increases arrow damage.= -Projectile Protection= -Reduces projectile damage.= -Protection= -Reduces most types of damage by 4% for each level.= -Punch= -Increases arrow knockback.= -Quick Charge= +Arrows set target on fire.= +Bane of Arthropods= +Channeling= + +Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.= + +Curse of Vanishing= Decreases crossbow charging time.= -Respiration= +Decreases time until rod catches something.= +Depth Strider= +Efficiency= Extends underwater breathing time.= -Riptide= -Trident launches player with itself when thrown. Works only in water or rain.= -Sharpness= -Increases damage.= -Silk Touch= -Mined blocks drop themselves.= -Smite= +Fire Aspect= +Flame= +Fortune= +Frost Walker= +Impaling= +Increases arrow damage.= +Increases arrow knockback.= +Increases certain block drops.= + +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).= + Increases damage to undead mobs.= -Soul Speed= -Increases walking speed on soul sand.= -Sweeping Edge= -Increases sweeping attack damage.= -Thorns= -Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.= -Unbreaking= +Increases damage.= Increases item durability.= -Inventory= -@1 Lapis Lazuli= +Increases knockback.= +Increases mining speed.= +Increases mob loot.= +Increases rate of good loot (enchanting books, etc.)= +Increases sweeping attack damage.= +Increases underwater movement speed.= +Increases walking speed on soul sand.= +Infinity= +Item destroyed on death.= +Knockback= +Looting= +Loyalty= +Luck of the Sea= +Lure= +Mending= +Mined blocks drop themselves.= +Multishot= +Piercing= +Power= +Punch= +Quick Charge= +Repair the item while gaining XP orbs.= +Respiration= +Riptide= +Sets target on fire.= +Sharpness= +Shoot 3 arrows at the cost of one.= +Shooting consumes no regular arrows.= +Silk Touch= +Smite= +Soul Speed= +Sweeping Edge= +Trident deals additional damage to ocean mobs.= + +Trident launches player with itself when thrown. Works only in water or rain.= + +Trident returns after being thrown. Higher levels reduce return time.= + +Turns water beneath the player into frosted ice and prevents the damage from magma blocks.= + +Unbreaking= + +### engine.lua ### + @1 Enchantment Levels= +@1 Lapis Lazuli= +Inventory= Level requirement: @1= -Enchant an item= - []= -Usage: /enchant []= -Player '@1' cannot be found.= -There is no such enchantment '@1'.= -The target doesn't hold an item.= -The selected enchantment can't be added to the target item.= + +### init.lua ### + '@1' is not a valid number= -The number you have entered (@1) is too big, it must be at most @2.= -The number you have entered (@1) is too small, it must be at least @2.= -@1 can't be combined with @2.= -Enchanting succeded.= -Forcefully enchant an item= -Usage: /forceenchant []= -The target item is not enchantable.= '@1' is not a valid number.= + []= +@1 can't be combined with @2.= + +After finally selecting your enchantment; left-click on the selection, and you will see both the lapis lazuli and your experience levels consumed. And, an enchanted item left in its place.= + +After placing your items in the slots, the enchanting options will be shown. Hover over the options to read what is available to you.= + +Enchant= +Enchant an item= Enchanted Book= Enchanting Table= -Enchant= + +Enchanting Tables will let you enchant armors, tools, weapons, and books with various abilities. But, at the cost of some experience, and lapis lazuli.= + +Enchanting succeded.= +Forcefully enchant an item= + +Place a tool, armor, weapon or book into the top left slot, and then place 1-3 Lapis Lazuli in the slot to the right.= + +Player '@1' cannot be found.= +Rightclick the Enchanting Table to open the enchanting menu.= +Spend experience, and lapis to enchant various items.= + +The number you have entered (@1) is too big, it must be at most @2.= + +The number you have entered (@1) is too small, it must be at least @2.= + +The selected enchantment can't be added to the target item.= +The target doesn't hold an item.= +The target item is not enchantable.= +There is no such enchantment '@1'.= + +These options are randomized, and dependent on experience level; but the enchantment strength can be increased.= + +To increase the enchantment strength, place bookshelves around the enchanting table. However, you will need to keep 1 air node between the table, & the bookshelves to empower the enchanting table.= + +Usage: /enchant []= +Usage: /forceenchant []= + + +##### not used anymore ##### + +# textdomain: mcl_enchanting +Aqua Affinity= From 0369465630508956cb75d1c2c055e71a67b74b73 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 25 Oct 2021 22:59:21 +0200 Subject: [PATCH 124/228] Add todoporlalibertad to translation credits --- CREDITS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.md b/CREDITS.md index 296e7c23b..de3dcae61 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -110,6 +110,7 @@ * wuniversales * kay27 * pitchum +* todoporlalibertad ## Special thanks * celeron55 for creating Minetest From 4e8e6fbb51a6a110619dbe0f2d6acccbc87dfa60 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Tue, 26 Oct 2021 11:42:33 +0200 Subject: [PATCH 125/228] Update development target section --- CONTRIBUTING.md | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9c235880d..6cdd0db6e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,10 +4,22 @@ Wow, thank you! :-) But first, some things to note: -MineClone2's development target is to make a free software clone of -Minecraft, ***version 1.17***, ***Java Edition***, ***+ Optifine -features supported by the Minetest Engine***. The priority is making -polished features up to version 1.12. +MineClone2's development target is to... + +- Crucially, create a stable, moddable, free/libre clone of Minecraft +based on the Minetest engine with polished features, usable in both +singleplayer and multiplayer. Currently, most of **Minecraft Java +Edition 1.12.2** features are already implemented and polishing existing +features are prioritised over new feature requests. +- With lessened priority yet strictly, implement features targetting +**Minecraft version 1.17 + Optifine** (Optifine only as far as supported +by the Minetest Engine). This means features in parity with the listed +Minecraft experiences are prioritised over those that don't fulfill this +scope. +- Optionally, create a performant experience that will run relatively +well on really low spec computers. Unfortunately, due to Minecraft's +mechanisms and Minetest engine's limitations along with a very small +playerbase on low spec computers, optimizations are hard to investigate. MineClone2 is maintained by Nicu and Fleckenstein. If you have any problems or questions, contact us (See Links section below). @@ -298,7 +310,7 @@ version number (https://forum.minetest.net/viewtopic.php?f=50&t=16407) * Post release announcement and changelog in forums -## Crediting +### Crediting Contributors, Developers and Maintainers will be credited in `CREDITS.md`. If you make your first time contribution, please add yourself to this file. There are also Discord roles for Contributors, From e341b2a6fe22c879abb66353a7539fd32320bb27 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Tue, 26 Oct 2021 11:55:08 +0200 Subject: [PATCH 126/228] Split code contributor section --- CONTRIBUTING.md | 81 ++++++++++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 35 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6cdd0db6e..6c5aa2cd1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -137,24 +137,8 @@ If you opened or have contributed to an issue, you receive the ## How you can help as a programmer (Almost) all the MineClone2 development is done using pull requests. -If you feel like a problem needs to fixed or you want to make a new -feature, you could start writing the code right away and notifying us -when you're done, but it never hurts to discuss things first. If there -is no issue on the topic, open one. If there is an issue, tell us that -you'd like to take care of it, to avoid duplicate work. We appreciate -any contributing effort to Mineclone2. If you are a relatively new -programmer, you can reach us on Discord, Matrix or IRC for questions -about git, Lua, Minetest API, Mineclone2 codebase or anything related -to MineClone2. We can help you avoid writing code that would be deemed -inadequeate, or help you become familiar with Mineclone2 better, or even -help using development tools. By asking us to include your changes in -this game, you agree that they fall under the terms of the GPLv3, which -basically means they will become part of a free software. Sometimes, -your code may cause crashes or bugs - we try to avoid such scenarios by -testing everytime before merging it, but if your merged work causes -problems, we ask you fix the issues as soon as possible. -### The recommended workflow +### Recommended workflow * Fork the repository (in case you have not already) * Do your change in a new branch * Create a pull request to get your changes merged into master @@ -163,7 +147,45 @@ imperative that conflicts are resolved prior to merging the pull request. * After the pull request got merged, you can delete the branch -### Git Guidelines +### Discuss first +If you feel like a problem needs to fixed or you want to make a new +feature, you could start writing the code right away and notifying us +when you're done, but it never hurts to discuss things first. If there +is no issue on the topic, open one. If there is an issue, tell us that +you'd like to take care of it, to avoid duplicate work. + +### Don't hesitate to ask for help +We appreciate any contributing effort to MineClone2. If you are a +relatively new programmer, you can reach us on Discord, Matrix or IRC +for questions about git, Lua, Minetest API, MineClone2 codebase or +anything related to MineClone2. We can help you avoid writing code that +would be deemed inadequeate, or help you become familiar with MineClone2 +better, or even help using development tools. + +### Maintain your own code, even if alreay got merged +Sometimes, your code may cause crashes or bugs - we try to avoid such +scenarios by testing everytime before merging it, but if your merged +work causes problems, we ask you fix the issues as soon as possible. + +### Changing Gameplay +Pull Requests that change gameplay have to be properly researched and +need to state their sources. These PRs also need Fleckenstein's approval +before they are merged. +You can use these sources: + +* Minecraft code (Name the source file and line, however DONT post any +proprietary code). You can use +[MCP](https://minecraft.fandom.com/wiki/Programs_and_editors/Mod_Coder_Pack) +to decompile Minecraft or look at +[Minestorm](https://github.com/Minestom/Minestom) code. +* Testing things inside of Minecraft (Attach screenshots / video footage +of the results) +* [Official Minecraft Wiki](https://minecraft.fandom.com/wiki/Minecraft_Wiki) +(Include a link to the specific page you used) + +### Keep our guidelines + +#### Git Guidelines * We use merge rather than rebase or squash merge * We don't use git submodules. * Your commit names should be relatively descriptive, e.g. when saying @@ -172,7 +194,7 @@ issue. * Try to keep your commits as atomic as possible (advise, but completely optional) -### Code Guidelines +#### Code Guidelines * Each mod must provide `mod.conf`. * Mod names are snake case, and newly added mods start with `mcl_`, e.g. `mcl_core`, `mcl_farming`, `mcl_monster_eggs`. Keep in mind Minetest @@ -226,7 +248,7 @@ some_table = { * Use double quotes for strings, e.g. `"asdf"` rather than `'asdf'` * Use snake_case rather than CamelCase, e.g. `my_function` rather than `MyFunction` -* Dont declare functions as an assignment, e.g. +* Don't declare functions as an assignment, e.g. ```lua -- bad @@ -248,21 +270,10 @@ function my_mod.some_func() end ``` -### Changes to Gameplay -Pull Requests that change gameplay have to be properly researched and -need to state their sources. These PRs also need Fleckenstein's approval -before they are merged. -You can use these sources: - -* Minecraft code (Name the source file and line, however DONT post any -proprietary code). You can use -[MCP](https://minecraft.fandom.com/wiki/Programs_and_editors/Mod_Coder_Pack) -to decompile Minecraft or look at -[Minestorm](https://github.com/Minestom/Minestom) code. -* Testing things inside of Minecraft (Attach screenshots / video footage -of the results) -* [Official Minecraft Wiki](https://minecraft.fandom.com/wiki/Minecraft_Wiki) -(Include a link to the specific page you used) +### Licensing +By asking us to include your changes in +this game, you agree that they fall under the terms of the GPLv3, which +basically means they will become part of a free software. ### Developer status Active and trusted contributors are often granted write access to the From a0789e72f04ee7c5bbc03c1fcf68e082eceac980 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Tue, 26 Oct 2021 11:57:17 +0200 Subject: [PATCH 127/228] Move licensing down, just before crediting --- CONTRIBUTING.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6c5aa2cd1..f7e21d481 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -270,11 +270,6 @@ function my_mod.some_func() end ``` -### Licensing -By asking us to include your changes in -this game, you agree that they fall under the terms of the GPLv3, which -basically means they will become part of a free software. - ### Developer status Active and trusted contributors are often granted write access to the MineClone2 repository. However you should not push things directly to @@ -321,6 +316,11 @@ version number (https://forum.minetest.net/viewtopic.php?f=50&t=16407) * Post release announcement and changelog in forums +### Licensing +By asking us to include your changes in +this game, you agree that they fall under the terms of the GPLv3, which +basically means they will become part of a free software. + ### Crediting Contributors, Developers and Maintainers will be credited in `CREDITS.md`. If you make your first time contribution, please add From 70425e9f30611ab7dcbbbf5518ed113fdf1e1809 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Tue, 26 Oct 2021 11:59:32 +0200 Subject: [PATCH 128/228] Split profiling section --- CONTRIBUTING.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f7e21d481..1f063a062 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -117,11 +117,13 @@ not work, so it's not very useful to try them out yet. If you own a server, a great way to help us improve MineClone2's code is by giving us profiler results. Profiler results give us detailed information about the game's performance and let us know where the real -troublespots are. This way we can make the game faster. Minetest has a -built in profiler. Simply set `profiler.load = true` in your -configuration file and restart the server. After running the server for -some time, just run `/profiler save` in chat - then you will find a file -in the world directory containing the results. Open a new issue and +troublespots are. This way we can make the game faster. + +#### Using Minetest's profiler +Minetest has a built in profiler. Simply set `profiler.load = true` in +your configuration file and restart the server. After running the server +for some time, just run `/profiler save` in chat - then you will find a +file in the world directory containing the results. Open a new issue and upload the file. You can name the issue " profiler results". From ea0f52763c2b183368b8a0f4690c34d060bdafac Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Tue, 26 Oct 2021 12:04:16 +0200 Subject: [PATCH 129/228] Split developer responsibilities into a list --- CONTRIBUTING.md | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1f063a062..58762bfcb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -274,22 +274,27 @@ end ### Developer status Active and trusted contributors are often granted write access to the -MineClone2 repository. However you should not push things directly to +MineClone2 repository. + +#### Developer responsibilities +- You should not push things directly to MineClone2 master - rather, do your work on a branch on your private repo, then create a pull request. This way other people can review your -changes and make sure they work before they get merged. You are allowed -to merge PRs if they have recieved the necessary feedback and have been +changes and make sure they work before they get merged. +- Merge PRs if they have recieved the necessary feedback and have been tested to not lead to any crashes and do what they claim to do by at -least two different people. You may also be assigned to issues or pull +least two different people. +- You may also be assigned to issues or pull requests as a developer. In this case it is your responsibility to fix the issue / review and merge the pull request when it is ready. You can also unassign yourself from the issue / PR if you have no time or don't want to take care of it for some other reason (after all, everyone is a volunteer and we can't expect you to do work that you are not intrested -in) - the important thing is really that you make sure to inform us if -you won't take care of something that has been assigned to you. Also, -please assign yourself to something that you want to work on to avoid -duplicate work. As a developer, it should be easy to reach you about +in) - **the important thing is that you make sure to inform us if you +won't take care of something that has been assigned to you.** +- Please assign yourself to something that you want to work on to avoid +duplicate work. +- As a developer, it should be easy to reach you about your code. You should be on the Discord (or, if you really don't like Discord, Matrix or IRC). From 1bd972bff7cf48e7076cc28f5c03a6067f5b27b2 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Tue, 26 Oct 2021 12:11:18 +0200 Subject: [PATCH 130/228] Split maintainer responsibilities into list --- CONTRIBUTING.md | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 58762bfcb..fed4885b4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -299,19 +299,25 @@ your code. You should be on the Discord (or, if you really don't like Discord, Matrix or IRC). ### Maintainer status -Maintainers are responsible for making sure issues are addressed and -pull requests are reviewed and merged, by assigning either themselves or -Developers to issues / PRs. Maintainers are responsible for making -releases, making sure guidelines are kept and making project decisions -based on what the community wants. Maintainers grant/revoke developer -access. Currently there are two maintainers with different -responsibility fields: +Maintainers carry the main responsibility for the project. +#### Maintainer responsibilities +- Making sure issues are addressed and pull requests are reviewed and +merged, by assigning either themselves or Developers to issues / PRs +- Making releases +- Making sure guidelines are kept +- Making project decisions based on what the community wants +- Granting/revoking developer access +- Enforcing the code of conduct (See CODE_OF_CONDUCT.md) +- Moderating official community spaces (See Links section) +- Resolving conflicts and problems within the community + +#### Current maintainers * Fleckenstein - responsible for gameplay review, publishing releases, technical guidelines and issue/PR delegation * Nicu - responsible for community related issues -#### Creating releases +#### Release process * Launch MineClone2 to make sure it still runs * Update the version number in README.md * Use `git tag ` to tag the latest commit with the From 64ebdd0f18beabe915bcabed52b52bf1bb7433e5 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Tue, 26 Oct 2021 12:16:00 +0200 Subject: [PATCH 131/228] Update line length in licensing section --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fed4885b4..eb93cc2ff 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -330,9 +330,9 @@ version number * Post release announcement and changelog in forums ### Licensing -By asking us to include your changes in -this game, you agree that they fall under the terms of the GPLv3, which -basically means they will become part of a free software. +By asking us to include your changes in this game, you agree that they +fall under the terms of the GPLv3, which basically means they will +become part of a free software. ### Crediting Contributors, Developers and Maintainers will be credited in From 0c567c7921b63d2b690577cd45de2467bdbebb43 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Tue, 26 Oct 2021 12:22:21 +0200 Subject: [PATCH 132/228] Update maintainer section in CREDITS.md (leave kay27 in, but remove jordan since he never did any maintainance work) --- CREDITS.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index de3dcae61..3d039f6b1 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -8,8 +8,8 @@ ## Maintainers * Fleckenstein +* Nicu * kay27 -* jordan4ibanez ## Developers * bzoss @@ -19,7 +19,6 @@ * iliekprogrammar * MysticTempest * Rootyjr -* Nicu * aligator * Code-Sploit * NO11 From c315d155e1a51a678931be04b16ae9bcc3cf91ae Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Tue, 26 Oct 2021 12:35:19 +0200 Subject: [PATCH 133/228] Update CREDITS.md --- CREDITS.md | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index 3d039f6b1..95884dcac 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -22,6 +22,8 @@ * aligator * Code-Sploit * NO11 +* cora +* jordan4ibanez ## Contributors * Laurent Rocher @@ -47,8 +49,24 @@ * dBeans * nickolas360 * yutyo -* ztianyang +* Tianyang Zhang * j45 +* Marcin Serwin +* erlehmann +* E +* Benjamin Schötz +* Doloment +* Sydney Gems +* talamh +* Emily2255 +* Emojigit +* FinishedFragment +* sfan5 +* Blue Blancmange +* Jared Moody +* SmallJoker +* Sven792 +* aldum ## MineClone5 * kay27 @@ -73,7 +91,6 @@ * Rochambeau * rubenwardy * stu -* jordan4ibanez * 4aiman * Kahrl * Krock @@ -102,6 +119,7 @@ * xMrVizzy * yutyo * NO11 +* kay27 ## Translations * Wuzzy @@ -110,6 +128,7 @@ * kay27 * pitchum * todoporlalibertad +* Marcin Serwin ## Special thanks * celeron55 for creating Minetest From 797da20fa7d4c83f411a4c2586ed16b1c1da913a Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Tue, 26 Oct 2021 13:08:07 +0200 Subject: [PATCH 134/228] Add script to automatically generate ingame credits from CREDITS.md --- mods/HUD/mcl_credits/init.lua | 121 +------------------------ mods/HUD/mcl_credits/people.lua | 141 ++++++++++++++++++++++++++++++ tools/generate_ingame_credits.lua | 49 +++++++++++ 3 files changed, 193 insertions(+), 118 deletions(-) create mode 100644 mods/HUD/mcl_credits/people.lua create mode 100755 tools/generate_ingame_credits.lua diff --git a/mods/HUD/mcl_credits/init.lua b/mods/HUD/mcl_credits/init.lua index 235b2a3cb..db3ac8436 100644 --- a/mods/HUD/mcl_credits/init.lua +++ b/mods/HUD/mcl_credits/init.lua @@ -3,123 +3,8 @@ local S = minetest.get_translator(modname) mcl_credits = { players = {}, -} - -mcl_credits.description = S("A faithful Open Source clone of Minecraft") - --- Sub-lists are sorted by number of commits, but the list should not be rearranged (-> new contributors are just added at the end of the list) -mcl_credits.people = { - { S("Creator of MineClone"), 0x0A9400, { - "davedevils", - }}, - { S("Creator of MineClone2"), 0xFBF837, { - "Wuzzy", - }}, - { S("Maintainers"), 0xFF51D5, { - "Fleckenstein", - "kay27", - "oilboi", - }}, - { S("Developers"), 0xF84355, { - "bzoss", - "AFCMS", - "epCode", - "ryvnf", - "iliekprogrammar", - "MysticTempest", - "Rootyjr", - "Nicu", - "aligator", - "Code-Sploit", - "NO11", - }}, - { S("Contributors"), 0x52FF00, { - "Laurent Rocher", - "HimbeerserverDE", - "TechDudie", - "Alexander Minges", - "ArTee3", - "ZeDique la Ruleta", - "pitchum", - "wuniversales", - "Bu-Gee", - "David McMackins II", - "Nicholas Niro", - "Wouters Dorian", - "Blue Blancmange", - "Jared Moody", - "Li0n", - "Midgard", - "Saku Laesvuori", - "Yukitty", - "ZedekThePD", - "aldum", - "dBeans", - "nickolas360", - "yutyo", - "ztianyang", - "j45", - }}, - {"MineClone5", 0xA60014, { - "kay27", - "Debiankaios", - "epCode", - "NO11", - "j45", - }}, - { S("Original Mod Authors"), 0x343434, { - "Wuzzy", - "Fleckenstein", - "BlockMen", - "TenPlus1", - "PilzAdam", - "ryvnf", - "stujones11", - "Arcelmi", - "celeron55", - "maikerumine", - "GunshipPenguin", - "Qwertymine3", - "Rochambeau", - "rubenwardy", - "stu", - "oilboi", - "4aiman", - "Kahrl", - "Krock", - "UgnilJoZ", - "lordfingle", - "22i", - "bzoss", - "kilbith", - "xeranas", - "kddekadenz", - "sofar", - "4Evergreen4", - "jordan4ibanez", - "paramat", - }}, - { S("3D Models"), 0x0019FF, { - "22i", - "tobyplowy", - "epCode", - }}, - { S("Textures"), 0xFF9705, { - "XSSheep", - "Wuzzy", - "kingoscargames", - "leorockway", - "xMrVizzy", - "yutyo", - "NO11", - }}, - { S("Translations"), 0x00FF60, { - "Wuzzy", - "Rocher Laurent", - "wuniversales", - "kay27", - "pitchum", - }}, + description = S("A faithful Open Source clone of Minecraft"), + people = dofile(minetest.get_modpath(modname) .. "/people.lua"), } local function add_hud_element(def, huds, y) @@ -243,7 +128,7 @@ minetest.register_globalstep(function(dtime) y = y - 5 end end - + if y > -100 then if id == huds.icon then y = math.max(400, y) diff --git a/mods/HUD/mcl_credits/people.lua b/mods/HUD/mcl_credits/people.lua new file mode 100644 index 000000000..2861b5052 --- /dev/null +++ b/mods/HUD/mcl_credits/people.lua @@ -0,0 +1,141 @@ +local modname = minetest.get_current_modname() +local S = minetest.get_translator(modname) + +return { + {S("Creator of MineClone"), 0x0A9400, { + "davedevils", + }}, + {S("Creator of MineClone2"), 0xFBF837, { + "Wuzzy", + }}, + {S("Maintainers"), 0xFF51D5, { + "Fleckenstein", + "Nicu", + "kay27", + }}, + {S("Developers"), 0xF84355, { + "bzoss", + "AFCMS", + "epCode", + "ryvnf", + "iliekprogrammar", + "MysticTempest", + "Rootyjr", + "aligator", + "Code-Sploit", + "NO11", + "cora", + "jordan4ibanez", + }}, + {S("Contributors"), 0x52FF00, { + "Laurent Rocher", + "HimbeerserverDE", + "TechDudie", + "Alexander Minges", + "ArTee3", + "ZeDique la Ruleta", + "pitchum", + "wuniversales", + "Bu-Gee", + "David McMackins II", + "Nicholas Niro", + "Wouters Dorian", + "Blue Blancmange", + "Jared Moody", + "Li0n", + "Midgard", + "Saku Laesvuori", + "Yukitty", + "ZedekThePD", + "aldum", + "dBeans", + "nickolas360", + "yutyo", + "Tianyang Zhang", + "j45", + "Marcin Serwin", + "erlehmann", + "E", + "Benjamin Schötz", + "Doloment", + "Sydney Gems", + "talamh", + "Emily2255", + "Emojigit", + "FinishedFragment", + "sfan5", + "Blue Blancmange", + "Jared Moody", + "SmallJoker", + "Sven792", + "aldum", + }}, + {S("MineClone5"), 0xA60014, { + "kay27", + "Debiankaios", + "epCode", + "NO11", + "j45", + }}, + {S("Original Mod Authors"), 0x343434, { + "Wuzzy", + "Fleckenstein", + "BlockMen", + "TenPlus1", + "PilzAdam", + "ryvnf", + "stujones11", + "Arcelmi", + "celeron55", + "maikerumine", + "GunshipPenguin", + "Qwertymine3", + "Rochambeau", + "rubenwardy", + "stu", + "4aiman", + "Kahrl", + "Krock", + "UgnilJoZ", + "lordfingle", + "22i", + "bzoss", + "kilbith", + "xeranas", + "kddekadenz", + "sofar", + "4Evergreen4", + "jordan4ibanez", + "paramat", + }}, + {S("3D Models"), 0x0019FF, { + "22i", + "tobyplowy", + "epCode", + }}, + {S("Textures"), 0xFF9705, { + "XSSheep", + "Wuzzy", + "kingoscargames", + "leorockway", + "xMrVizzy", + "yutyo", + "NO11", + "kay27", + }}, + {S("Translations"), 0x00FF60, { + "Wuzzy", + "Rocher Laurent", + "wuniversales", + "kay27", + "pitchum", + "todoporlalibertad", + "Marcin Serwin", + }}, + {S("Special thanks"), 0x00E9FF, { + "celeron55 for creating Minetest", + "Jordach for the jukebox music compilation from Big Freaking Dig", + "The workaholics who spent way too much time writing for the Minecraft Wiki. It's an invaluable resource for creating this game", + "Notch and Jeb for being the major forces behind Minecraft", + }}, +} diff --git a/tools/generate_ingame_credits.lua b/tools/generate_ingame_credits.lua new file mode 100755 index 000000000..89b633ef0 --- /dev/null +++ b/tools/generate_ingame_credits.lua @@ -0,0 +1,49 @@ +#! /usr/bin/env lua +-- Script to automatically generate mods/HUD/mcl_credits/people.lua from CREDITS.md +-- Run from MCL2 root folder + +local colors = { + ["Creator of MineClone"] = "0x0A9400", + ["Creator of MineClone2"] = "0xFBF837", + ["Maintainers"] = "0xFF51D5", + ["Developers"] = "0xF84355", + ["Contributors"] = "0x52FF00", + ["MineClone5"] = "0xA60014", + ["Original Mod Authors"] = "0x343434", + ["3D Models"] = "0x0019FF", + ["Textures"] = "0xFF9705", + ["Translations"] = "0x00FF60", + ["Special thanks"] = "0x00E9FF", +} + +local from = io.open("CREDITS.md", "r") +local to = io.open("mods/HUD/mcl_credits/people.lua", "w") + +to:write([[ +local modname = minetest.get_current_modname() +local S = minetest.get_translator(modname) + +]]) + +to:write("return {\n") + +local started_block = false + +for line in from:lines() do + if line:find("## ") == 1 then + if started_block then + to:write("\t}},\n") + end + local title = line:sub(4, #line) + to:write("\t{S(\"" .. title .. "\"), " .. (colors[title] or "0xFFFFFF") .. ", {\n") + started_block = true + elseif line:find("*") == 1 then + to:write("\t\t\"" .. line:sub(3, #line) .. "\",\n") + end +end + +if started_block then + to:write("\t}},\n") +end + +to:write("}\n") From 835076ea4b2ed25d850ce2452b858fd26ab4364f Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Tue, 26 Oct 2021 14:28:40 +0200 Subject: [PATCH 135/228] Document asset contributions --- CONTRIBUTING.md | 57 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index eb93cc2ff..e817f81bd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -113,6 +113,63 @@ pull requests here: requests that start with a `WIP:` are not done yet, and therefore might not work, so it's not very useful to try them out yet. +### Contributing assets +Due to license problems, MineClone2 can unfortunately not use +Minecraft's assets, therefore we are always looking for asset +contributions. To contribute assets, it can be useful to learn git +basics and read the section for Programmers of this document, however +this is not required. It's also a good idea to join the Discord server +(or alternatively IRC or Matrix). + +#### Textures +For textures we use the Pixel Perfection texture pack. This is mostly +enough; however in some cases - e.g. for newer minecraft features, it's +useful to have texture artists around. If you want to make such +contributions, join our Discord server. Demands for textures will be +communicated there. + +#### Sounds +MineClone2 currently does not have a consistent way to handle sounds. +The sounds in the game come from different sources, like the SnowZone +ressource pack or minetest_game. Unfortunately, MineClone2 does not play +a sound in every situation you would get one in Minecraft. Any help with +sounds is greatly appreciated, however if you add new sounds you should +probably work together with a programmer, to write the code to actually +play these sounds in game. + +#### 3D Models +Most of the 3D Models in MineClone2 come from +[22i's repository](https://github.com/22i/minecraft-voxel-blender-models). +Similar to the textures, we need people that can make 3D Models with +Blender on demand. Many of the models have to be patched, some new +animations have to be added etc. + +#### Translations + +##### Workflow +To add/update support for your language to MineClone2, you should take +the steps documented in the section for Programmers, add/update the +translation files of the mods that you want to update. You can add +support for all mods, just some of them or only one mod; you can update +the translation file entirely or only partly; basically any effort is +valued. If your changes are small, you can also send them to developers +via E-Mail, Discord, IRC or Matrix - they will credit you appropriately. + +##### Things to note +You can use the script at `tools/check_translate_files.py` to compare +the translation files for the language you are working on with the +template files, to see what is missing and what is out of date with +the template file. However, template files are often incomplete and/or +out of date, sometimes they don't match the code. You can update the +translation files if that is required, you can also modifiy the code in +your translation PR if it's related to translation. You can also work on +multiple languages at the same time in one PR. + +#### Crediting +Asset contributions will be credited in their own respective sections in +CREDITS.md. If you have commited the results yourself, you will also be +credited in the Contributors section. + ### Profiling If you own a server, a great way to help us improve MineClone2's code is by giving us profiler results. Profiler results give us detailed From 19689dd857c047fb857489ed4385b4c5440400c6 Mon Sep 17 00:00:00 2001 From: NO11 Date: Tue, 26 Oct 2021 16:50:10 +0000 Subject: [PATCH 136/228] Use enchanted golden apple for thing banner --- mods/ITEMS/mcl_banners/patterncraft.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_banners/patterncraft.lua b/mods/ITEMS/mcl_banners/patterncraft.lua index 79778a665..767235b1e 100644 --- a/mods/ITEMS/mcl_banners/patterncraft.lua +++ b/mods/ITEMS/mcl_banners/patterncraft.lua @@ -119,8 +119,7 @@ local patterns = { name = N("@1 Thing Charge"), type = "shapeless", - -- TODO: Replace with enchanted golden apple - { e, "mcl_core:apple_gold", d }, + { e, "mcl_core:apple_gold_enchanted", d }, }, ["rhombus"] = { name = N("@1 Lozenge"), From d30e014233957a0b31f06c0e0f753ab005028282 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 27 Oct 2021 18:40:45 +0200 Subject: [PATCH 137/228] Mineclone2 -> MineClone2 --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e817f81bd..bd02346b4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -41,7 +41,7 @@ MineClone2 is developed using the version control system [git](https://git-scm.com/). If you want to contribute code to the project, it is **highly recommended** that you learn the git basics. For non-programmers and people who do not plan to contribute code to -Mineclone2, git is not required. However, git is a tool that will be +MineClone2, git is not required. However, git is a tool that will be referenced frequently because of its usefulness. As such, it is valuable in learning how git works and its terminology. It can also help you in keeping your game updated, and easily testing pull requests. @@ -91,7 +91,7 @@ behavior. * Make sure the feature you request is Minecraft 1.17 Java Edition or Optifine behavior. * Begging or excessive attention seeking does not help us in the -slightest, and may very well disrupt Mineclone2 development. It's better +slightest, and may very well disrupt MineClone2 development. It's better to put that energy into helping or researching the feature in question. After all, we're just volunteers working on our spare time. * Check whether the feature has been implemented in a newer version of From 90796ec7b44d0eab168c77cae2c205e2b296b62f Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 27 Oct 2021 18:42:11 +0200 Subject: [PATCH 138/228] can unfortunately not -> unfortunately cannot --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bd02346b4..d200085ff 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -114,7 +114,7 @@ requests that start with a `WIP:` are not done yet, and therefore might not work, so it's not very useful to try them out yet. ### Contributing assets -Due to license problems, MineClone2 can unfortunately not use +Due to license problems, MineClone2 unfortunately cannot use Minecraft's assets, therefore we are always looking for asset contributions. To contribute assets, it can be useful to learn git basics and read the section for Programmers of this document, however From 61dccfb9e529be38be73fea6cf1f90827e410e26 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 27 Oct 2021 18:44:10 +0200 Subject: [PATCH 139/228] Reword up to date guideline for feature requests --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d200085ff..482bd6c00 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -94,8 +94,8 @@ Optifine behavior. slightest, and may very well disrupt MineClone2 development. It's better to put that energy into helping or researching the feature in question. After all, we're just volunteers working on our spare time. -* Check whether the feature has been implemented in a newer version of -MineClone2, in case you are not using the latest one. +* Ensure the requested feature has not been implemented in MineClone2 +latest or development versions. ### Testing code If you want to help us with speeding up MineClone2 development and From c1934c4f3a7d720854a9ece52fc7d34213733d59 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 27 Oct 2021 18:45:37 +0200 Subject: [PATCH 140/228] Reword feature request alignment with development goals guideline --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 482bd6c00..d8929c9e5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -88,8 +88,8 @@ the bug, e.g. before the crash happened or what causes the faulty behavior. ### Requesting features -* Make sure the feature you request is Minecraft 1.17 Java Edition or -Optifine behavior. +* Ensure the requested feature fulfills our development targets and +goals. * Begging or excessive attention seeking does not help us in the slightest, and may very well disrupt MineClone2 development. It's better to put that energy into helping or researching the feature in question. From 938911e7e383e0f625574c40c49e4ce1b5f551e6 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 27 Oct 2021 18:46:58 +0200 Subject: [PATCH 141/228] even help using -> assist you use --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d8929c9e5..949b61ddb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -219,7 +219,7 @@ relatively new programmer, you can reach us on Discord, Matrix or IRC for questions about git, Lua, Minetest API, MineClone2 codebase or anything related to MineClone2. We can help you avoid writing code that would be deemed inadequeate, or help you become familiar with MineClone2 -better, or even help using development tools. +better, or assist you use development tools. ### Maintain your own code, even if alreay got merged Sometimes, your code may cause crashes or bugs - we try to avoid such From fb2a501a9c5d104096b968cb13ea97e11c75f46b Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 27 Oct 2021 18:47:38 +0200 Subject: [PATCH 142/228] Keep our guidelines -> Stick to our guidelines --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 949b61ddb..a6385f627 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -242,7 +242,7 @@ of the results) * [Official Minecraft Wiki](https://minecraft.fandom.com/wiki/Minecraft_Wiki) (Include a link to the specific page you used) -### Keep our guidelines +### Stick to our guidelines #### Git Guidelines * We use merge rather than rebase or squash merge From 4db9952a84df35d96b127b40a2e93735ae2e8b83 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 27 Oct 2021 18:48:38 +0200 Subject: [PATCH 143/228] if -> only when --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a6385f627..35b3eaa3e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -338,9 +338,9 @@ MineClone2 repository. MineClone2 master - rather, do your work on a branch on your private repo, then create a pull request. This way other people can review your changes and make sure they work before they get merged. -- Merge PRs if they have recieved the necessary feedback and have been -tested to not lead to any crashes and do what they claim to do by at -least two different people. +- Merge PRs only when they have recieved the necessary feedback and have +been tested to not lead to any crashes and do what they claim to do by +at least two different people. - You may also be assigned to issues or pull requests as a developer. In this case it is your responsibility to fix the issue / review and merge the pull request when it is ready. You can From 11e364b3ec7bc472f04f6d17cc38113ea5aacd97 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 27 Oct 2021 18:52:26 +0200 Subject: [PATCH 144/228] Give development target it's own headline --- CONTRIBUTING.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 35b3eaa3e..c328ca371 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,10 +2,13 @@ So you want to contribute to MineClone2? Wow, thank you! :-) -But first, some things to note: +MineClone2 is maintained by Nicu and Fleckenstein. If you have any +problems or questions, contact us (See Links section below). -MineClone2's development target is to... +You can help with MineClone2's development in many different ways, +whether you're a programmer or not. +## MineClone2's development target is to... - Crucially, create a stable, moddable, free/libre clone of Minecraft based on the Minetest engine with polished features, usable in both singleplayer and multiplayer. Currently, most of **Minecraft Java @@ -21,12 +24,6 @@ well on really low spec computers. Unfortunately, due to Minecraft's mechanisms and Minetest engine's limitations along with a very small playerbase on low spec computers, optimizations are hard to investigate. -MineClone2 is maintained by Nicu and Fleckenstein. If you have any -problems or questions, contact us (See Links section below). - -You can help with MineClone2's development in many different ways, -whether you're a programmer or not. - ## Links * [Mesehub](https://git.minetest.land/MineClone2/MineClone2) * [Discord](https://discord.gg/xE4z8EEpDC) From 6fd8ff8865af2841366a730239e9babc465cb65d Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 27 Oct 2021 18:54:39 +0200 Subject: [PATCH 145/228] testing -> test --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c328ca371..56876fad1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -40,8 +40,8 @@ project, it is **highly recommended** that you learn the git basics. For non-programmers and people who do not plan to contribute code to MineClone2, git is not required. However, git is a tool that will be referenced frequently because of its usefulness. As such, it is valuable -in learning how git works and its terminology. It can also help you in -keeping your game updated, and easily testing pull requests. +in learning how git works and its terminology. It can also help you +keeping your game updated, and easily test pull requests. ## How you can help as a non-programmer From bbdd8f55eb28acf6245864f3eeff8aa0071949a6 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 28 Oct 2021 09:34:39 +0200 Subject: [PATCH 146/228] Reword 'reporting issues' part in 'testing pull requests' section --- CONTRIBUTING.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 56876fad1..de3ae536e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -103,9 +103,10 @@ programmer saying "Look, I modified the game, please apply my changes to the upstream version of the game". However, every programmer makes mistakes sometimes, some of which are hard to spot. You can help by downloading this modified version of the game and trying it out - then -you tell us whether the code works and does what it claims to do or -whether you have encountered any issues. You can find currently open -pull requests here: +tell us if the code works as expected without any issues. Ideally, you +would report issues will pull requests similar to when you were +reporting bugs that are the mainline (See Reporting bugs section). You +can find currently open pull requests here: . Note that pull requests that start with a `WIP:` are not done yet, and therefore might not work, so it's not very useful to try them out yet. From 5b37f5600504608e3cd0dbffc1c43c15a6b6c14d Mon Sep 17 00:00:00 2001 From: NO11 Date: Thu, 28 Oct 2021 09:43:14 +0000 Subject: [PATCH 147/228] Remove small gray border of buttons in creative inventory pages --- mods/HUD/mcl_inventory/creative.lua | 1339 +++++++++++++-------------- 1 file changed, 669 insertions(+), 670 deletions(-) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index ff9cccf9e..2be0be4bc 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -1,670 +1,669 @@ -local S = minetest.get_translator(minetest.get_current_modname()) -local F = minetest.formspec_escape - --- Prepare player info table -local players = {} - --- Containing all the items for each Creative Mode tab -local inventory_lists = {} - ---local mod_player = minetest.get_modpath("mcl_player") - --- Create tables -local builtin_filter_ids = {"blocks","deco","redstone","rail","food","tools","combat","mobs","brew","matr","misc","all"} -for _, f in pairs(builtin_filter_ids) do - inventory_lists[f] = {} -end - -local function replace_enchanted_books(tbl) - for k, item in ipairs(tbl) do - if item:find("mcl_enchanting:book_enchanted") == 1 then - local _, enchantment, level = item:match("(%a+) ([_%w]+) (%d+)") - level = level and tonumber(level) - if enchantment and level then - tbl[k] = mcl_enchanting.enchant(ItemStack("mcl_enchanting:book_enchanted"), enchantment, level) - end - end - end -end - ---[[ Populate all the item tables. We only do this once. Note this code must be -executed after loading all the other mods in order to work. ]] -minetest.register_on_mods_loaded(function() - for name,def in pairs(minetest.registered_items) do - if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then - local function is_redstone(def) - return def.mesecons or def.groups.mesecon or def.groups.mesecon_conductor_craftable or def.groups.mesecon_effecor_off - end - local function is_tool(def) - return def.groups.tool or (def.tool_capabilities and def.tool_capabilities.damage_groups == nil) - end - local function is_weapon_or_armor(def) - return def.groups.weapon or def.groups.weapon_ranged or def.groups.ammo or def.groups.combat_item or ((def.groups.armor_head or def.groups.armor_torso or def.groups.armor_legs or def.groups.armor_feet or def.groups.horse_armor) and def.groups.non_combat_armor ~= 1) - end - -- Is set to true if it was added in any category besides misc - local nonmisc = false - if def.groups.building_block then - table.insert(inventory_lists["blocks"], name) - nonmisc = true - end - if def.groups.deco_block then - table.insert(inventory_lists["deco"], name) - nonmisc = true - end - if is_redstone(def) then - table.insert(inventory_lists["redstone"], name) - nonmisc = true - end - if def.groups.transport then - table.insert(inventory_lists["rail"], name) - nonmisc = true - end - if (def.groups.food and not def.groups.brewitem) or def.groups.eatable then - table.insert(inventory_lists["food"], name) - nonmisc = true - end - if is_tool(def) then - table.insert(inventory_lists["tools"], name) - nonmisc = true - end - if is_weapon_or_armor(def) then - table.insert(inventory_lists["combat"], name) - nonmisc = true - end - if def.groups.spawn_egg == 1 then - table.insert(inventory_lists["mobs"], name) - nonmisc = true - end - if def.groups.brewitem then - table.insert(inventory_lists["brew"], name) - nonmisc = true - end - if def.groups.craftitem then - table.insert(inventory_lists["matr"], name) - nonmisc = true - end - -- Misc. category is for everything which is not in any other category - if not nonmisc then - table.insert(inventory_lists["misc"], name) - end - - table.insert(inventory_lists["all"], name) - end - end - - for ench, def in pairs(mcl_enchanting.enchantments) do - local str = "mcl_enchanting:book_enchanted " .. ench .. " " .. def.max_level - if def.inv_tool_tab then - table.insert(inventory_lists["tools"], str) - end - if def.inv_combat_tab then - table.insert(inventory_lists["combat"], str) - end - table.insert(inventory_lists["all"], str) - end - - for _, to_sort in pairs(inventory_lists) do - table.sort(to_sort) - replace_enchanted_books(to_sort) - end -end) - -local function filter_item(name, description, lang, filter) - local desc - if not lang then - desc = string.lower(description) - else - desc = string.lower(minetest.get_translated_string(lang, description)) - end - return string.find(name, filter) or string.find(desc, filter) -end - -local function set_inv_search(filter, player) - local playername = player:get_player_name() - local inv = minetest.get_inventory({type="detached", name="creative_"..playername}) - local creative_list = {} - local lang = minetest.get_player_information(playername).lang_code - for name,def in pairs(minetest.registered_items) do - if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then - if filter_item(string.lower(def.name), def.description, lang, filter) then - table.insert(creative_list, name) - end - end - end - for ench, def in pairs(mcl_enchanting.enchantments) do - for i = 1, def.max_level do - local stack = mcl_enchanting.enchant(ItemStack("mcl_enchanting:book_enchanted"), ench, i) - if filter_item("mcl_enchanting:book_enchanted", minetest.strip_colors(stack:get_description()), lang, filter) then - table.insert(creative_list, "mcl_enchanting:book_enchanted " .. ench .. " " .. i) - end - end - end - table.sort(creative_list) - replace_enchanted_books(creative_list) - - inv:set_size("main", #creative_list) - inv:set_list("main", creative_list) -end - -local function set_inv_page(page, player) - local playername = player:get_player_name() - local inv = minetest.get_inventory({type="detached", name="creative_"..playername}) - inv:set_size("main", 0) - local creative_list = {} - if inventory_lists[page] then -- Standard filter - creative_list = inventory_lists[page] - end - inv:set_size("main", #creative_list) - inv:set_list("main", creative_list) -end - -local function init(player) - local playername = player:get_player_name() - minetest.create_detached_inventory("creative_"..playername, { - allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) - if minetest.is_creative_enabled(playername) then - return count - else - return 0 - end - end, - allow_put = function(inv, listname, index, stack, player) - return 0 - end, - allow_take = function(inv, listname, index, stack, player) - if minetest.is_creative_enabled(player:get_player_name()) then - return -1 - else - return 0 - end - end, - }, playername) - set_inv_page("all", player) -end - --- Create the trash field -local trash = minetest.create_detached_inventory("trash", { - allow_put = function(inv, listname, index, stack, player) - if minetest.is_creative_enabled(player:get_player_name()) then - return stack:get_count() - else - return 0 - end - end, - on_put = function(inv, listname, index, stack, player) - inv:set_stack(listname, index, "") - end, -}) -trash:set_size("main", 1) - -local noffset = {} -- numeric tab offset -local offset = {} -- string offset: -local boffset = {} -- -local hoch = {} -local filtername = {} ---local bg = {} - -local noffset_x_start = -0.24 -local noffset_x = noffset_x_start -local noffset_y = -0.25 -local function next_noffset(id, right) - if right then - noffset[id] = { 8.94, noffset_y } - else - noffset[id] = { noffset_x, noffset_y } - noffset_x = noffset_x + 1.25 - end -end - --- Upper row -next_noffset("blocks") -next_noffset("deco") -next_noffset("redstone") -next_noffset("rail") -next_noffset("brew") -next_noffset("misc") -next_noffset("nix", true) - -noffset_x = noffset_x_start -noffset_y = 8.12 - --- Lower row -next_noffset("food") -next_noffset("tools") -next_noffset("combat") -next_noffset("mobs") -next_noffset("matr") -next_noffset("inv", true) - -for k,v in pairs(noffset) do - offset[k] = tostring(v[1]) .. "," .. tostring(v[2]) - boffset[k] = tostring(v[1]+0.19) .. "," .. tostring(v[2]+0.25) -end - -hoch["blocks"] = "" -hoch["deco"] = "" -hoch["redstone"] = "" -hoch["rail"] = "" -hoch["brew"] = "" -hoch["misc"] = "" -hoch["nix"] = "" -hoch["default"] = "" -hoch["food"] = "_down" -hoch["tools"] = "_down" -hoch["combat"] = "_down" -hoch["mobs"] = "_down" -hoch["matr"] = "_down" -hoch["inv"] = "_down" - -filtername["blocks"] = S("Building Blocks") -filtername["deco"] = S("Decoration Blocks") -filtername["redstone"] = S("Redstone") -filtername["rail"] = S("Transportation") -filtername["misc"] = S("Miscellaneous") -filtername["nix"] = S("Search Items") -filtername["food"] = S("Foodstuffs") -filtername["tools"] = S("Tools") -filtername["combat"] = S("Combat") -filtername["mobs"] = S("Mobs") -filtername["brew"] = S("Brewing") -filtername["matr"] = S("Materials") -filtername["inv"] = S("Survival Inventory") - ---local dark_bg = "crafting_creative_bg_dark.png" - ---[[local function reset_menu_item_bg() - bg["blocks"] = dark_bg - bg["deco"] = dark_bg - bg["redstone"] = dark_bg - bg["rail"] = dark_bg - bg["misc"] = dark_bg - bg["nix"] = dark_bg - bg["food"] = dark_bg - bg["tools"] = dark_bg - bg["combat"] = dark_bg - bg["mobs"] = dark_bg - bg["brew"] = dark_bg - bg["matr"] = dark_bg - bg["inv"] = dark_bg - bg["default"] = dark_bg -end]] - - -function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, show, page, filter) - --reset_menu_item_bg() - pagenum = math.floor(pagenum) or 1 - - local playername = player:get_player_name() - - if not inv_size then - if page == "nix" then - local inv = minetest.get_inventory({type="detached", name="creative_"..playername}) - inv_size = inv:get_size("main") - elseif page and page ~= "inv" then - inv_size = #(inventory_lists[page]) - else - inv_size = 0 - end - end - local pagemax = math.max(1, math.floor((inv_size-1) / (9*5) + 1)) - local name = "nix" - local main_list - local listrings = "listring[detached:creative_"..playername..";main]".. - "listring[current_player;main]".. - "listring[detached:trash;main]" - - if page then - name = page - if players[playername] then - players[playername].page = page - end - end - --bg[name] = "crafting_creative_bg.png" - - local inv_bg = "crafting_inventory_creative.png" - if name == "inv" then - inv_bg = "crafting_inventory_creative_survival.png" - - -- Show armor and player image - local player_preview - if minetest.settings:get_bool("3d_player_preview", true) then - player_preview = mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "") - else - player_preview = "image[3.9,1.4;1.2333,2.4666;"..mcl_player.player_get_preview(player).."]" - end - - -- Background images for armor slots (hide if occupied) - local armor_slot_imgs = "" - local inv = player:get_inventory() - if inv:get_stack("armor", 2):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[2.5,1.3;1,1;mcl_inventory_empty_armor_slot_helmet.png]" - end - if inv:get_stack("armor", 3):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[2.5,2.75;1,1;mcl_inventory_empty_armor_slot_chestplate.png]" - end - if inv:get_stack("armor", 4):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[5.5,1.3;1,1;mcl_inventory_empty_armor_slot_leggings.png]" - end - if inv:get_stack("armor", 5):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[5.5,2.75;1,1;mcl_inventory_empty_armor_slot_boots.png]" - end - - -- Survival inventory slots - main_list = "list[current_player;main;0,3.75;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,3.75,9,3).. - -- armor - "list[current_player;armor;2.5,1.3;1,1;1]".. - "list[current_player;armor;2.5,2.75;1,1;2]".. - "list[current_player;armor;5.5,1.3;1,1;3]".. - "list[current_player;armor;5.5,2.75;1,1;4]".. - mcl_formspec.get_itemslot_bg(2.5,1.3,1,1).. - mcl_formspec.get_itemslot_bg(2.5,2.75,1,1).. - mcl_formspec.get_itemslot_bg(5.5,1.3,1,1).. - mcl_formspec.get_itemslot_bg(5.5,2.75,1,1).. - armor_slot_imgs.. - -- player preview - player_preview.. - -- crafting guide button - "image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]".. - "tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]".. - -- help button - "image_button[9,2;1,1;doc_button_icon_lores.png;__mcl_doc;]".. - "tooltip[__mcl_doc;"..F(S("Help")).."]".. - -- skins button - "image_button[9,3;1,1;mcl_skins_button.png;__mcl_skins;]".. - "tooltip[__mcl_skins;"..F(S("Select player skin")).."]".. - -- achievements button - "image_button[9,4;1,1;mcl_achievements_button.png;__mcl_achievements;]".. - --"style_type[image_button;border=;bgimg=;bgimg_pressed=]".. - "tooltip[__mcl_achievements;"..F(S("Achievements")).."]" - - -- For shortcuts - listrings = listrings .. - "listring[detached:"..playername.."_armor;armor]".. - "listring[current_player;main]" - else - -- Creative inventory slots - main_list = "list[detached:creative_"..playername..";main;0,1.75;9,5;"..tostring(start_i).."]".. - mcl_formspec.get_itemslot_bg(0,1.75,9,5).. - -- Page buttons - "label[9.0,5.5;"..F(S("@1/@2", pagenum, pagemax)).."]".. - "image_button[9.0,6.0;0.7,0.7;crafting_creative_prev.png;creative_prev;]".. - "image_button[9.5,6.0;0.7,0.7;crafting_creative_next.png;creative_next;]" - end - - local tab_icon = { - blocks = "mcl_core:brick_block", - deco = "mcl_flowers:peony", - redstone = "mesecons:redstone", - rail = "mcl_minecarts:golden_rail", - misc = "mcl_buckets:bucket_lava", - nix = "mcl_compass:compass", - food = "mcl_core:apple", - tools = "mcl_core:axe_iron", - combat = "mcl_core:sword_gold", - mobs = "mobs_mc:cow", - brew = "mcl_potions:dragon_breath", - matr = "mcl_core:stick", - inv = "mcl_chests:chest", - } - local function tab(current_tab, this_tab) - local bg_img - if current_tab == this_tab then - bg_img = "crafting_creative_active"..hoch[this_tab]..".png" - else - bg_img = "crafting_creative_inactive"..hoch[this_tab]..".png" - end - return - "style["..this_tab..";border=false;bgimg=;bgimg_pressed=]".. - "item_image_button[" .. boffset[this_tab] ..";1,1;"..tab_icon[this_tab]..";"..this_tab..";]".. - "image[" .. offset[this_tab] .. ";1.5,1.44;" .. bg_img .. "]" .. - "image[" .. boffset[this_tab] .. ";1,1;crafting_creative_marker.png]" - end - local caption = "" - if name ~= "inv" and filtername[name] then - caption = "label[0,1.2;"..F(minetest.colorize("#313131", filtername[name])).."]" - end - - local formspec = "size[10,9.3]".. - "no_prepend[]".. - mcl_vars.gui_nonbg..mcl_vars.gui_bg_color.. - "background[-0.19,-0.25;10.5,9.87;"..inv_bg.."]".. - "label[-5,-5;"..name.."]".. - tab(name, "blocks") .. - "tooltip[blocks;"..F(filtername["blocks"]).."]".. - tab(name, "deco") .. - "tooltip[deco;"..F(filtername["deco"]).."]".. - tab(name, "redstone") .. - "tooltip[redstone;"..F(filtername["redstone"]).."]".. - tab(name, "rail") .. - "tooltip[rail;"..F(filtername["rail"]).."]".. - tab(name, "misc") .. - "tooltip[misc;"..F(filtername["misc"]).."]".. - tab(name, "nix") .. - "tooltip[nix;"..F(filtername["nix"]).."]".. - caption.. - "list[current_player;main;0,7;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7,9,1).. - main_list.. - tab(name, "food") .. - "tooltip[food;"..F(filtername["food"]).."]".. - tab(name, "tools") .. - "tooltip[tools;"..F(filtername["tools"]).."]".. - tab(name, "combat") .. - "tooltip[combat;"..F(filtername["combat"]).."]".. - tab(name, "mobs") .. - "tooltip[mobs;"..F(filtername["mobs"]).."]".. - tab(name, "brew") .. - "tooltip[brew;"..F(filtername["brew"]).."]".. - tab(name, "matr") .. - "tooltip[matr;"..F(filtername["matr"]).."]".. - tab(name, "inv") .. - "tooltip[inv;"..F(filtername["inv"]).."]".. - "list[detached:trash;main;9,7;1,1;]".. - mcl_formspec.get_itemslot_bg(9,7,1,1).. - "image[9,7;1,1;crafting_creative_trash.png]".. - listrings - - if name == "nix" then - if filter == nil then - filter = "" - end - formspec = formspec .. "field[5.3,1.34;4,0.75;search;;"..minetest.formspec_escape(filter).."]" - formspec = formspec .. "field_close_on_enter[search;false]" - end - if pagenum then formspec = formspec .. "p"..tostring(pagenum) end - player:set_inventory_formspec(formspec) -end - -minetest.register_on_player_receive_fields(function(player, formname, fields) - local page = nil - - if not minetest.is_creative_enabled(player:get_player_name()) then - return - end - if formname ~= "" or fields.quit == "true" then - -- No-op if formspec closed or not player inventory (formname == "") - return - end - - local name = player:get_player_name() - - if fields.blocks then - if players[name].page == "blocks" then return end - set_inv_page("blocks",player) - page = "blocks" - elseif fields.deco then - if players[name].page == "deco" then return end - set_inv_page("deco",player) - page = "deco" - elseif fields.redstone then - if players[name].page == "redstone" then return end - set_inv_page("redstone",player) - page = "redstone" - elseif fields.rail then - if players[name].page == "rail" then return end - set_inv_page("rail",player) - page = "rail" - elseif fields.misc then - if players[name].page == "misc" then return end - set_inv_page("misc",player) - page = "misc" - elseif fields.nix then - set_inv_page("all",player) - page = "nix" - elseif fields.food then - if players[name].page == "food" then return end - set_inv_page("food",player) - page = "food" - elseif fields.tools then - if players[name].page == "tools" then return end - set_inv_page("tools",player) - page = "tools" - elseif fields.combat then - if players[name].page == "combat" then return end - set_inv_page("combat",player) - page = "combat" - elseif fields.mobs then - if players[name].page == "mobs" then return end - set_inv_page("mobs",player) - page = "mobs" - elseif fields.brew then - if players[name].page == "brew" then return end - set_inv_page("brew",player) - page = "brew" - elseif fields.matr then - if players[name].page == "matr" then return end - set_inv_page("matr",player) - page = "matr" - elseif fields.inv then - if players[name].page == "inv" then return end - page = "inv" - elseif fields.search == "" and not fields.creative_next and not fields.creative_prev then - set_inv_page("all", player) - page = "nix" - elseif fields.search and not fields.creative_next and not fields.creative_prev then - set_inv_search(string.lower(fields.search),player) - page = "nix" - end - - if page then - players[name].page = page - end - if players[name].page then - page = players[name].page - end - - -- Figure out current scroll bar from formspec - --local formspec = player:get_inventory_formspec() - - local start_i = players[name].start_i - - if fields.creative_prev then - start_i = start_i - 9*5 - elseif fields.creative_next then - start_i = start_i + 9*5 - else - -- Reset scroll bar if not scrolled - start_i = 0 - end - if start_i < 0 then - start_i = start_i + 9*5 - end - - local inv_size - if page == "nix" then - local inv = minetest.get_inventory({type="detached", name="creative_"..name}) - inv_size = inv:get_size("main") - elseif page and page ~= "inv" then - inv_size = #(inventory_lists[page]) - else - inv_size = 0 - end - - if start_i >= inv_size then - start_i = start_i - 9*5 - end - if start_i < 0 or start_i >= inv_size then - start_i = 0 - end - players[name].start_i = start_i - - local filter = "" - if not fields.nix and fields.search and fields.search ~= "" then - filter = fields.search - players[name].filter = filter - end - - mcl_inventory.set_creative_formspec(player, start_i, start_i / (9*5) + 1, inv_size, false, page, filter) -end) - - -if minetest.is_creative_enabled("") then - minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) - -- Place infinite nodes, except for shulker boxes - local group = minetest.get_item_group(itemstack:get_name(), "shulker_box") - return group == 0 or group == nil - end) - - function minetest.handle_node_drops(pos, drops, digger) - if not digger or not digger:is_player() then - for _,item in ipairs(drops) do - minetest.add_item(pos, item) - end - end - local inv = digger:get_inventory() - if inv then - for _,item in ipairs(drops) do - if not inv:contains_item("main", item, true) then - inv:add_item("main", item) - end - end - end - end - - mcl_inventory.update_inventory_formspec = function(player) - local page - - local name = player:get_player_name() - - if players[name].page then - page = players[name].page - else - page = "nix" - end - - -- Figure out current scroll bar from formspec - --local formspec = player:get_inventory_formspec() - local start_i = players[name].start_i - - local inv_size - if page == "nix" then - local inv = minetest.get_inventory({type="detached", name="creative_"..name}) - inv_size = inv:get_size("main") - elseif page and page ~= "inv" then - inv_size = #(inventory_lists[page]) - else - inv_size = 0 - end - - local filter = players[name].filter - if filter == nil then - filter = "" - end - - mcl_inventory.set_creative_formspec(player, start_i, start_i / (9*5) + 1, inv_size, false, page, filter) - end -end - -minetest.register_on_joinplayer(function(player) - -- Initialize variables and inventory - local name = player:get_player_name() - if not players[name] then - players[name] = {} - players[name].page = "nix" - players[name].filter = "" - players[name].start_i = 0 - end - init(player) - mcl_inventory.set_creative_formspec(player, 0, 1, nil, false, "nix", "") -end) +local S = minetest.get_translator(minetest.get_current_modname()) +local F = minetest.formspec_escape + +-- Prepare player info table +local players = {} + +-- Containing all the items for each Creative Mode tab +local inventory_lists = {} + +--local mod_player = minetest.get_modpath("mcl_player") + +-- Create tables +local builtin_filter_ids = {"blocks","deco","redstone","rail","food","tools","combat","mobs","brew","matr","misc","all"} +for _, f in pairs(builtin_filter_ids) do + inventory_lists[f] = {} +end + +local function replace_enchanted_books(tbl) + for k, item in ipairs(tbl) do + if item:find("mcl_enchanting:book_enchanted") == 1 then + local _, enchantment, level = item:match("(%a+) ([_%w]+) (%d+)") + level = level and tonumber(level) + if enchantment and level then + tbl[k] = mcl_enchanting.enchant(ItemStack("mcl_enchanting:book_enchanted"), enchantment, level) + end + end + end +end + +--[[ Populate all the item tables. We only do this once. Note this code must be +executed after loading all the other mods in order to work. ]] +minetest.register_on_mods_loaded(function() + for name,def in pairs(minetest.registered_items) do + if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then + local function is_redstone(def) + return def.mesecons or def.groups.mesecon or def.groups.mesecon_conductor_craftable or def.groups.mesecon_effecor_off + end + local function is_tool(def) + return def.groups.tool or (def.tool_capabilities and def.tool_capabilities.damage_groups == nil) + end + local function is_weapon_or_armor(def) + return def.groups.weapon or def.groups.weapon_ranged or def.groups.ammo or def.groups.combat_item or ((def.groups.armor_head or def.groups.armor_torso or def.groups.armor_legs or def.groups.armor_feet or def.groups.horse_armor) and def.groups.non_combat_armor ~= 1) + end + -- Is set to true if it was added in any category besides misc + local nonmisc = false + if def.groups.building_block then + table.insert(inventory_lists["blocks"], name) + nonmisc = true + end + if def.groups.deco_block then + table.insert(inventory_lists["deco"], name) + nonmisc = true + end + if is_redstone(def) then + table.insert(inventory_lists["redstone"], name) + nonmisc = true + end + if def.groups.transport then + table.insert(inventory_lists["rail"], name) + nonmisc = true + end + if (def.groups.food and not def.groups.brewitem) or def.groups.eatable then + table.insert(inventory_lists["food"], name) + nonmisc = true + end + if is_tool(def) then + table.insert(inventory_lists["tools"], name) + nonmisc = true + end + if is_weapon_or_armor(def) then + table.insert(inventory_lists["combat"], name) + nonmisc = true + end + if def.groups.spawn_egg == 1 then + table.insert(inventory_lists["mobs"], name) + nonmisc = true + end + if def.groups.brewitem then + table.insert(inventory_lists["brew"], name) + nonmisc = true + end + if def.groups.craftitem then + table.insert(inventory_lists["matr"], name) + nonmisc = true + end + -- Misc. category is for everything which is not in any other category + if not nonmisc then + table.insert(inventory_lists["misc"], name) + end + + table.insert(inventory_lists["all"], name) + end + end + + for ench, def in pairs(mcl_enchanting.enchantments) do + local str = "mcl_enchanting:book_enchanted " .. ench .. " " .. def.max_level + if def.inv_tool_tab then + table.insert(inventory_lists["tools"], str) + end + if def.inv_combat_tab then + table.insert(inventory_lists["combat"], str) + end + table.insert(inventory_lists["all"], str) + end + + for _, to_sort in pairs(inventory_lists) do + table.sort(to_sort) + replace_enchanted_books(to_sort) + end +end) + +local function filter_item(name, description, lang, filter) + local desc + if not lang then + desc = string.lower(description) + else + desc = string.lower(minetest.get_translated_string(lang, description)) + end + return string.find(name, filter) or string.find(desc, filter) +end + +local function set_inv_search(filter, player) + local playername = player:get_player_name() + local inv = minetest.get_inventory({type="detached", name="creative_"..playername}) + local creative_list = {} + local lang = minetest.get_player_information(playername).lang_code + for name,def in pairs(minetest.registered_items) do + if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then + if filter_item(string.lower(def.name), def.description, lang, filter) then + table.insert(creative_list, name) + end + end + end + for ench, def in pairs(mcl_enchanting.enchantments) do + for i = 1, def.max_level do + local stack = mcl_enchanting.enchant(ItemStack("mcl_enchanting:book_enchanted"), ench, i) + if filter_item("mcl_enchanting:book_enchanted", minetest.strip_colors(stack:get_description()), lang, filter) then + table.insert(creative_list, "mcl_enchanting:book_enchanted " .. ench .. " " .. i) + end + end + end + table.sort(creative_list) + replace_enchanted_books(creative_list) + + inv:set_size("main", #creative_list) + inv:set_list("main", creative_list) +end + +local function set_inv_page(page, player) + local playername = player:get_player_name() + local inv = minetest.get_inventory({type="detached", name="creative_"..playername}) + inv:set_size("main", 0) + local creative_list = {} + if inventory_lists[page] then -- Standard filter + creative_list = inventory_lists[page] + end + inv:set_size("main", #creative_list) + inv:set_list("main", creative_list) +end + +local function init(player) + local playername = player:get_player_name() + minetest.create_detached_inventory("creative_"..playername, { + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + if minetest.is_creative_enabled(playername) then + return count + else + return 0 + end + end, + allow_put = function(inv, listname, index, stack, player) + return 0 + end, + allow_take = function(inv, listname, index, stack, player) + if minetest.is_creative_enabled(player:get_player_name()) then + return -1 + else + return 0 + end + end, + }, playername) + set_inv_page("all", player) +end + +-- Create the trash field +local trash = minetest.create_detached_inventory("trash", { + allow_put = function(inv, listname, index, stack, player) + if minetest.is_creative_enabled(player:get_player_name()) then + return stack:get_count() + else + return 0 + end + end, + on_put = function(inv, listname, index, stack, player) + inv:set_stack(listname, index, "") + end, +}) +trash:set_size("main", 1) + +local noffset = {} -- numeric tab offset +local offset = {} -- string offset: +local boffset = {} -- +local hoch = {} +local filtername = {} +--local bg = {} + +local noffset_x_start = -0.24 +local noffset_x = noffset_x_start +local noffset_y = -0.25 +local function next_noffset(id, right) + if right then + noffset[id] = { 8.94, noffset_y } + else + noffset[id] = { noffset_x, noffset_y } + noffset_x = noffset_x + 1.25 + end +end + +-- Upper row +next_noffset("blocks") +next_noffset("deco") +next_noffset("redstone") +next_noffset("rail") +next_noffset("brew") +next_noffset("misc") +next_noffset("nix", true) + +noffset_x = noffset_x_start +noffset_y = 8.12 + +-- Lower row +next_noffset("food") +next_noffset("tools") +next_noffset("combat") +next_noffset("mobs") +next_noffset("matr") +next_noffset("inv", true) + +for k,v in pairs(noffset) do + offset[k] = tostring(v[1]) .. "," .. tostring(v[2]) + boffset[k] = tostring(v[1]+0.19) .. "," .. tostring(v[2]+0.25) +end + +hoch["blocks"] = "" +hoch["deco"] = "" +hoch["redstone"] = "" +hoch["rail"] = "" +hoch["brew"] = "" +hoch["misc"] = "" +hoch["nix"] = "" +hoch["default"] = "" +hoch["food"] = "_down" +hoch["tools"] = "_down" +hoch["combat"] = "_down" +hoch["mobs"] = "_down" +hoch["matr"] = "_down" +hoch["inv"] = "_down" + +filtername["blocks"] = S("Building Blocks") +filtername["deco"] = S("Decoration Blocks") +filtername["redstone"] = S("Redstone") +filtername["rail"] = S("Transportation") +filtername["misc"] = S("Miscellaneous") +filtername["nix"] = S("Search Items") +filtername["food"] = S("Foodstuffs") +filtername["tools"] = S("Tools") +filtername["combat"] = S("Combat") +filtername["mobs"] = S("Mobs") +filtername["brew"] = S("Brewing") +filtername["matr"] = S("Materials") +filtername["inv"] = S("Survival Inventory") + +--local dark_bg = "crafting_creative_bg_dark.png" + +--[[local function reset_menu_item_bg() + bg["blocks"] = dark_bg + bg["deco"] = dark_bg + bg["redstone"] = dark_bg + bg["rail"] = dark_bg + bg["misc"] = dark_bg + bg["nix"] = dark_bg + bg["food"] = dark_bg + bg["tools"] = dark_bg + bg["combat"] = dark_bg + bg["mobs"] = dark_bg + bg["brew"] = dark_bg + bg["matr"] = dark_bg + bg["inv"] = dark_bg + bg["default"] = dark_bg +end]] + + +function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, show, page, filter) + --reset_menu_item_bg() + pagenum = math.floor(pagenum) or 1 + + local playername = player:get_player_name() + + if not inv_size then + if page == "nix" then + local inv = minetest.get_inventory({type="detached", name="creative_"..playername}) + inv_size = inv:get_size("main") + elseif page and page ~= "inv" then + inv_size = #(inventory_lists[page]) + else + inv_size = 0 + end + end + local pagemax = math.max(1, math.floor((inv_size-1) / (9*5) + 1)) + local name = "nix" + local main_list + local listrings = "listring[detached:creative_"..playername..";main]".. + "listring[current_player;main]".. + "listring[detached:trash;main]" + + if page then + name = page + if players[playername] then + players[playername].page = page + end + end + --bg[name] = "crafting_creative_bg.png" + + local inv_bg = "crafting_inventory_creative.png" + if name == "inv" then + inv_bg = "crafting_inventory_creative_survival.png" + + -- Show armor and player image + local player_preview + if minetest.settings:get_bool("3d_player_preview", true) then + player_preview = mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "") + else + player_preview = "image[3.9,1.4;1.2333,2.4666;"..mcl_player.player_get_preview(player).."]" + end + + -- Background images for armor slots (hide if occupied) + local armor_slot_imgs = "" + local inv = player:get_inventory() + if inv:get_stack("armor", 2):is_empty() then + armor_slot_imgs = armor_slot_imgs .. "image[2.5,1.3;1,1;mcl_inventory_empty_armor_slot_helmet.png]" + end + if inv:get_stack("armor", 3):is_empty() then + armor_slot_imgs = armor_slot_imgs .. "image[2.5,2.75;1,1;mcl_inventory_empty_armor_slot_chestplate.png]" + end + if inv:get_stack("armor", 4):is_empty() then + armor_slot_imgs = armor_slot_imgs .. "image[5.5,1.3;1,1;mcl_inventory_empty_armor_slot_leggings.png]" + end + if inv:get_stack("armor", 5):is_empty() then + armor_slot_imgs = armor_slot_imgs .. "image[5.5,2.75;1,1;mcl_inventory_empty_armor_slot_boots.png]" + end + + -- Survival inventory slots + main_list = "list[current_player;main;0,3.75;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,3.75,9,3).. + -- armor + "list[current_player;armor;2.5,1.3;1,1;1]".. + "list[current_player;armor;2.5,2.75;1,1;2]".. + "list[current_player;armor;5.5,1.3;1,1;3]".. + "list[current_player;armor;5.5,2.75;1,1;4]".. + mcl_formspec.get_itemslot_bg(2.5,1.3,1,1).. + mcl_formspec.get_itemslot_bg(2.5,2.75,1,1).. + mcl_formspec.get_itemslot_bg(5.5,1.3,1,1).. + mcl_formspec.get_itemslot_bg(5.5,2.75,1,1).. + armor_slot_imgs.. + -- player preview + player_preview.. + -- crafting guide button + "image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]".. + "tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]".. + -- help button + "image_button[9,2;1,1;doc_button_icon_lores.png;__mcl_doc;]".. + "tooltip[__mcl_doc;"..F(S("Help")).."]".. + -- skins button + "image_button[9,3;1,1;mcl_skins_button.png;__mcl_skins;]".. + "tooltip[__mcl_skins;"..F(S("Select player skin")).."]".. + -- achievements button + "image_button[9,4;1,1;mcl_achievements_button.png;__mcl_achievements;]".. + --"style_type[image_button;border=;bgimg=;bgimg_pressed=]".. + "tooltip[__mcl_achievements;"..F(S("Achievements")).."]" + + -- For shortcuts + listrings = listrings .. + "listring[detached:"..playername.."_armor;armor]".. + "listring[current_player;main]" + else + -- Creative inventory slots + main_list = "list[detached:creative_"..playername..";main;0,1.75;9,5;"..tostring(start_i).."]".. + mcl_formspec.get_itemslot_bg(0,1.75,9,5).. + -- Page buttons + "label[9.0,5.5;"..F(S("@1/@2", pagenum, pagemax)).."]".. + "image_button[9.0,6.0;0.7,0.7;crafting_creative_prev.png;creative_prev;]".. + "image_button[9.5,6.0;0.7,0.7;crafting_creative_next.png;creative_next;]" + end + + local tab_icon = { + blocks = "mcl_core:brick_block", + deco = "mcl_flowers:peony", + redstone = "mesecons:redstone", + rail = "mcl_minecarts:golden_rail", + misc = "mcl_buckets:bucket_lava", + nix = "mcl_compass:compass", + food = "mcl_core:apple", + tools = "mcl_core:axe_iron", + combat = "mcl_core:sword_gold", + mobs = "mobs_mc:cow", + brew = "mcl_potions:dragon_breath", + matr = "mcl_core:stick", + inv = "mcl_chests:chest", + } + local function tab(current_tab, this_tab) + local bg_img + if current_tab == this_tab then + bg_img = "crafting_creative_active"..hoch[this_tab]..".png" + else + bg_img = "crafting_creative_inactive"..hoch[this_tab]..".png" + end + return + "style["..this_tab..";border=false;bgimg=;bgimg_pressed=]".. + "item_image_button[" .. boffset[this_tab] ..";1,1;"..tab_icon[this_tab]..";"..this_tab..";]".. + "image[" .. offset[this_tab] .. ";1.5,1.44;" .. bg_img .. "]" + end + local caption = "" + if name ~= "inv" and filtername[name] then + caption = "label[0,1.2;"..F(minetest.colorize("#313131", filtername[name])).."]" + end + + local formspec = "size[10,9.3]".. + "no_prepend[]".. + mcl_vars.gui_nonbg..mcl_vars.gui_bg_color.. + "background[-0.19,-0.25;10.5,9.87;"..inv_bg.."]".. + "label[-5,-5;"..name.."]".. + tab(name, "blocks") .. + "tooltip[blocks;"..F(filtername["blocks"]).."]".. + tab(name, "deco") .. + "tooltip[deco;"..F(filtername["deco"]).."]".. + tab(name, "redstone") .. + "tooltip[redstone;"..F(filtername["redstone"]).."]".. + tab(name, "rail") .. + "tooltip[rail;"..F(filtername["rail"]).."]".. + tab(name, "misc") .. + "tooltip[misc;"..F(filtername["misc"]).."]".. + tab(name, "nix") .. + "tooltip[nix;"..F(filtername["nix"]).."]".. + caption.. + "list[current_player;main;0,7;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7,9,1).. + main_list.. + tab(name, "food") .. + "tooltip[food;"..F(filtername["food"]).."]".. + tab(name, "tools") .. + "tooltip[tools;"..F(filtername["tools"]).."]".. + tab(name, "combat") .. + "tooltip[combat;"..F(filtername["combat"]).."]".. + tab(name, "mobs") .. + "tooltip[mobs;"..F(filtername["mobs"]).."]".. + tab(name, "brew") .. + "tooltip[brew;"..F(filtername["brew"]).."]".. + tab(name, "matr") .. + "tooltip[matr;"..F(filtername["matr"]).."]".. + tab(name, "inv") .. + "tooltip[inv;"..F(filtername["inv"]).."]".. + "list[detached:trash;main;9,7;1,1;]".. + mcl_formspec.get_itemslot_bg(9,7,1,1).. + "image[9,7;1,1;crafting_creative_trash.png]".. + listrings + + if name == "nix" then + if filter == nil then + filter = "" + end + formspec = formspec .. "field[5.3,1.34;4,0.75;search;;"..minetest.formspec_escape(filter).."]" + formspec = formspec .. "field_close_on_enter[search;false]" + end + if pagenum then formspec = formspec .. "p"..tostring(pagenum) end + player:set_inventory_formspec(formspec) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local page = nil + + if not minetest.is_creative_enabled(player:get_player_name()) then + return + end + if formname ~= "" or fields.quit == "true" then + -- No-op if formspec closed or not player inventory (formname == "") + return + end + + local name = player:get_player_name() + + if fields.blocks then + if players[name].page == "blocks" then return end + set_inv_page("blocks",player) + page = "blocks" + elseif fields.deco then + if players[name].page == "deco" then return end + set_inv_page("deco",player) + page = "deco" + elseif fields.redstone then + if players[name].page == "redstone" then return end + set_inv_page("redstone",player) + page = "redstone" + elseif fields.rail then + if players[name].page == "rail" then return end + set_inv_page("rail",player) + page = "rail" + elseif fields.misc then + if players[name].page == "misc" then return end + set_inv_page("misc",player) + page = "misc" + elseif fields.nix then + set_inv_page("all",player) + page = "nix" + elseif fields.food then + if players[name].page == "food" then return end + set_inv_page("food",player) + page = "food" + elseif fields.tools then + if players[name].page == "tools" then return end + set_inv_page("tools",player) + page = "tools" + elseif fields.combat then + if players[name].page == "combat" then return end + set_inv_page("combat",player) + page = "combat" + elseif fields.mobs then + if players[name].page == "mobs" then return end + set_inv_page("mobs",player) + page = "mobs" + elseif fields.brew then + if players[name].page == "brew" then return end + set_inv_page("brew",player) + page = "brew" + elseif fields.matr then + if players[name].page == "matr" then return end + set_inv_page("matr",player) + page = "matr" + elseif fields.inv then + if players[name].page == "inv" then return end + page = "inv" + elseif fields.search == "" and not fields.creative_next and not fields.creative_prev then + set_inv_page("all", player) + page = "nix" + elseif fields.search and not fields.creative_next and not fields.creative_prev then + set_inv_search(string.lower(fields.search),player) + page = "nix" + end + + if page then + players[name].page = page + end + if players[name].page then + page = players[name].page + end + + -- Figure out current scroll bar from formspec + --local formspec = player:get_inventory_formspec() + + local start_i = players[name].start_i + + if fields.creative_prev then + start_i = start_i - 9*5 + elseif fields.creative_next then + start_i = start_i + 9*5 + else + -- Reset scroll bar if not scrolled + start_i = 0 + end + if start_i < 0 then + start_i = start_i + 9*5 + end + + local inv_size + if page == "nix" then + local inv = minetest.get_inventory({type="detached", name="creative_"..name}) + inv_size = inv:get_size("main") + elseif page and page ~= "inv" then + inv_size = #(inventory_lists[page]) + else + inv_size = 0 + end + + if start_i >= inv_size then + start_i = start_i - 9*5 + end + if start_i < 0 or start_i >= inv_size then + start_i = 0 + end + players[name].start_i = start_i + + local filter = "" + if not fields.nix and fields.search and fields.search ~= "" then + filter = fields.search + players[name].filter = filter + end + + mcl_inventory.set_creative_formspec(player, start_i, start_i / (9*5) + 1, inv_size, false, page, filter) +end) + + +if minetest.is_creative_enabled("") then + minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) + -- Place infinite nodes, except for shulker boxes + local group = minetest.get_item_group(itemstack:get_name(), "shulker_box") + return group == 0 or group == nil + end) + + function minetest.handle_node_drops(pos, drops, digger) + if not digger or not digger:is_player() then + for _,item in ipairs(drops) do + minetest.add_item(pos, item) + end + end + local inv = digger:get_inventory() + if inv then + for _,item in ipairs(drops) do + if not inv:contains_item("main", item, true) then + inv:add_item("main", item) + end + end + end + end + + mcl_inventory.update_inventory_formspec = function(player) + local page + + local name = player:get_player_name() + + if players[name].page then + page = players[name].page + else + page = "nix" + end + + -- Figure out current scroll bar from formspec + --local formspec = player:get_inventory_formspec() + local start_i = players[name].start_i + + local inv_size + if page == "nix" then + local inv = minetest.get_inventory({type="detached", name="creative_"..name}) + inv_size = inv:get_size("main") + elseif page and page ~= "inv" then + inv_size = #(inventory_lists[page]) + else + inv_size = 0 + end + + local filter = players[name].filter + if filter == nil then + filter = "" + end + + mcl_inventory.set_creative_formspec(player, start_i, start_i / (9*5) + 1, inv_size, false, page, filter) + end +end + +minetest.register_on_joinplayer(function(player) + -- Initialize variables and inventory + local name = player:get_player_name() + if not players[name] then + players[name] = {} + players[name].page = "nix" + players[name].filter = "" + players[name].start_i = 0 + end + init(player) + mcl_inventory.set_creative_formspec(player, 0, 1, nil, false, "nix", "") +end) From 28b73042114ae4a7f1077d41d1e0cff8d224be64 Mon Sep 17 00:00:00 2001 From: NO11 Date: Tue, 2 Nov 2021 22:55:49 +0100 Subject: [PATCH 148/228] Break minecart it's near a cactus (Fix #924) --- mods/ENTITIES/mcl_minecarts/init.lua | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index 4d3873cc2..119a13523 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -198,7 +198,20 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o else self._last_float_check = self._last_float_check + dtime end - local pos, rou_pos, node + + local pos, rou_pos, node = self.object:get_pos() + local r = 0.6 + for _, node_pos in pairs({{r, 0}, {0, r}, {-r, 0}, {0, -r}}) do + if minetest.get_node(vector.offset(pos, node_pos[1], 0, node_pos[2])).name == "mcl_core:cactus" then + detach_driver(self) + for d = 1, #drop do + minetest.add_item(pos, drop[d]) + end + self.object:remove() + return + end + end + -- Drop minecart if it isn't on a rail anymore if self._last_float_check >= mcl_minecarts.check_float_time then pos = self.object:get_pos() From db696d0e2b41e41c5859c0748a046144c3cf5981 Mon Sep 17 00:00:00 2001 From: Artem Arbatsky Date: Fri, 24 Sep 2021 16:50:54 +0500 Subject: [PATCH 149/228] Add missing call for on_die function --- mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua index 45e46d3db..03e6789ed 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua @@ -122,7 +122,10 @@ mobs.death_logic = function(self, dtime) if self.death_animation_timer >= 1.25 then item_drop(self,false,1) mobs.death_effect(self) - mcl_experience.throw_experience(self.object:get_pos(), math_random(self.xp_min, self.xp_max)) + mcl_experience.throw_experience(self.object:get_pos(), math_random(self.xp_min, self.xp_max)) + if self.on_die then + self.on_die(self, self.object:get_pos()) + end self.object:remove() return end @@ -155,4 +158,4 @@ mobs.death_logic = function(self, dtime) if self.pause_timer <= 0 then mobs.set_velocity(self,0) end -end \ No newline at end of file +end From 2607d40f1fcb4680f324aea4ad733fbe48a0fbfa Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sat, 17 Jul 2021 07:23:20 +0200 Subject: [PATCH 150/228] Add script to show packets count from debug logs Mineclonia has inherited mods from MineClone 2 that send a lot of network packets. This behaviour wastes bandwith and is most likely a major reason for the unusually high amount of lag that MineClone2 and Mineclonia have. Many network packets that are sent by Mineclonia are entirely useless. Analyzing minetest log files to figure out what kind of packets are sent and how often is a first step in getting rid of useless traffic. --- tools/analyze-packet-spam | 60 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100755 tools/analyze-packet-spam diff --git a/tools/analyze-packet-spam b/tools/analyze-packet-spam new file mode 100755 index 000000000..310616fd9 --- /dev/null +++ b/tools/analyze-packet-spam @@ -0,0 +1,60 @@ +#!/bin/sh -eu +# analyze-packet-spam – show minetest client packet count per second +# Copyright © 2021 Nils Dagsson Moskopp (erlehmann) + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# Dieses Programm hat das Ziel, die Medienkompetenz der Leser zu +# steigern. Gelegentlich packe ich sogar einen handfesten Buffer +# Overflow oder eine Format String Vulnerability zwischen die anderen +# Codezeilen und schreibe das auch nicht dran. + +# This script takes a minetest log with at least INFO log level and +# outputs the MINETEST network protocol packet count per second. + +# To collect such a log file of minetest running for 10 minutes, run: +# timeout 600 minetest --info >log.txt 2>&1 >/dev/null + +# To get packet counts from that file, run: +# ./analyze-packet-spam "${TEMPFILE}" + +TIMESTAMP_START=$( <"${TEMPFILE}" head -n1 |cut -d' ' -f1 ) +TIMESTAMP_END=$( <"${TEMPFILE}" tail -n1 |cut -d' ' -f1 ) +DURATION=$(( 30 + ${TIMESTAMP_END} - ${TIMESTAMP_START} )) + +PACKET_NAME_SEEN='' +<"${TEMPFILE}" tac \ + |while read _ PACKET_NAME PACKET_COUNT; do + case "${PACKET_NAME_SEEN}" in + *"${PACKET_NAME}"*) + ;; + *) + PACKET_COUNT_PER_SECOND=$( + printf '1k %s %s /p' "${PACKET_COUNT}" "${DURATION}" \ + |dc + ) + printf '%s\t%s\n' "${PACKET_COUNT_PER_SECOND}" "${PACKET_NAME}" + PACKET_NAME_SEEN="${PACKET_NAME_SEEN} ${PACKET_NAME}" + ;; + esac + done + +unlink "${TEMPFILE}" From 148575a05b8d0204155e0d5ce4cf1dcd45490f19 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 16:28:13 +0100 Subject: [PATCH 151/228] Remove unused hud_manager.hud_exists function --- mods/HUD/mcl_experience/init.lua | 9 --------- 1 file changed, 9 deletions(-) diff --git a/mods/HUD/mcl_experience/init.lua b/mods/HUD/mcl_experience/init.lua index e514ffc19..b7175ccfb 100644 --- a/mods/HUD/mcl_experience/init.lua +++ b/mods/HUD/mcl_experience/init.lua @@ -116,15 +116,6 @@ function hud_manager.change_hud(data) end end --- gets if hud exists -function hud_manager.hud_exists(player,hud_name) - local name = player:get_player_name() - if player_huds[name] and player_huds[name][hud_name] then - return true - else - return false - end -end ------------------- -- saves specific users data for when they relog From a4e73886d566d2718ed6700731dd57198faa5744 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 19:36:57 +0100 Subject: [PATCH 152/228] Rework XP API --- mods/ENTITIES/mcl_item_entity/init.lua | 4 +- .../api/mob_functions/death_logic.lua | 4 +- mods/ENTITIES/mobs_mc/ender_dragon.lua | 2 +- mods/HUD/mcl_experience/bottle.lua | 63 ++ mods/HUD/mcl_experience/command.lua | 39 + mods/HUD/mcl_experience/init.lua | 723 ++++-------------- mods/HUD/mcl_experience/orb.lua | 220 ++++++ .../{experience.ogg => mcl_experience.ogg} | Bin ...vel_up.ogg => mcl_experience_level_up.ogg} | Bin ...erience_bar.png => mcl_experience_bar.png} | Bin ....png => mcl_experience_bar_background.png} | Bin ...erience_orb.png => mcl_experience_orb.png} | Bin mods/ITEMS/mcl_enchanting/enchantments.lua | 43 ++ mods/ITEMS/mcl_enchanting/engine.lua | 6 +- mods/ITEMS/mcl_fishing/init.lua | 6 +- mods/ITEMS/mcl_furnaces/init.lua | 4 +- mods/ITEMS/mcl_mobspawners/init.lua | 2 +- 17 files changed, 538 insertions(+), 578 deletions(-) create mode 100644 mods/HUD/mcl_experience/bottle.lua create mode 100644 mods/HUD/mcl_experience/command.lua create mode 100644 mods/HUD/mcl_experience/orb.lua rename mods/HUD/mcl_experience/sounds/{experience.ogg => mcl_experience.ogg} (100%) rename mods/HUD/mcl_experience/sounds/{level_up.ogg => mcl_experience_level_up.ogg} (100%) rename mods/HUD/mcl_experience/textures/{experience_bar.png => mcl_experience_bar.png} (100%) rename mods/HUD/mcl_experience/textures/{experience_bar_background.png => mcl_experience_bar_background.png} (100%) rename mods/HUD/mcl_experience/textures/{experience_orb.png => mcl_experience_orb.png} (100%) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index cfd141f04..678f8e2b7 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -290,10 +290,10 @@ function minetest.handle_node_drops(pos, drops, digger) end end - if digger and mcl_experience.throw_experience and not silk_touch_drop then + if digger and mcl_experience.throw_xp and not silk_touch_drop then local experience_amount = minetest.get_item_group(dug_node.name,"xp") if experience_amount > 0 then - mcl_experience.throw_experience(pos, experience_amount) + mcl_experience.throw_xp(pos, experience_amount) end end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua index 45e46d3db..27d0030ea 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua @@ -122,7 +122,7 @@ mobs.death_logic = function(self, dtime) if self.death_animation_timer >= 1.25 then item_drop(self,false,1) mobs.death_effect(self) - mcl_experience.throw_experience(self.object:get_pos(), math_random(self.xp_min, self.xp_max)) + mcl_experience.throw_xp(self.object:get_pos(), math_random(self.xp_min, self.xp_max)) self.object:remove() return end @@ -155,4 +155,4 @@ mobs.death_logic = function(self, dtime) if self.pause_timer <= 0 then mobs.set_velocity(self,0) end -end \ No newline at end of file +end diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index bafb3f84a..3634e20f4 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -103,7 +103,7 @@ mobs:register_mob("mobs_mc:enderdragon", { mcl_portals.spawn_gateway_portal() mcl_structures.call_struct(self._portal_pos, "end_exit_portal_open") if self._initial then - mcl_experience.throw_experience(pos, 11500) -- 500 + 11500 = 12000 + mcl_experience.throw_xp(pos, 11500) -- 500 + 11500 = 12000 minetest.set_node(vector.add(self._portal_pos, vector.new(3, 5, 3)), {name = mobs_mc.items.dragon_egg}) end end diff --git a/mods/HUD/mcl_experience/bottle.lua b/mods/HUD/mcl_experience/bottle.lua new file mode 100644 index 000000000..10e42a57d --- /dev/null +++ b/mods/HUD/mcl_experience/bottle.lua @@ -0,0 +1,63 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_entity("mcl_experience:bottle",{ + textures = {"mcl_experience_bottle.png"}, + hp_max = 1, + visual_size = {x = 0.35, y = 0.35}, + collisionbox = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + pointable = false, + on_step = function(self, dtime) + local pos = self.object:get_pos() + local node = minetest.get_node(pos) + local n = node.name + if n ~= "air" and n ~= "mcl_portals:portal" and n ~= "mcl_portals:portal_end" and minetest.get_item_group(n, "liquid") == 0 then + minetest.sound_play("mcl_potions_breaking_glass", {pos = pos, max_hear_distance = 16, gain = 1}) + mcl_experience.throw_xp(pos, math.random(3, 11)) + minetest.add_particlespawner({ + amount = 50, + time = 0.1, + minpos = vector.add(pos, vector.new(-0.1, 0.5, -0.1)), + maxpos = vector.add(pos, vector.new( 0.1, 0.6, 0.1)), + minvel = vector.new(-2, 0, -2), + maxvel = vector.new( 2, 2, 2), + minacc = vector.new(0, 0, 0), + maxacc = vector.new(0, 0, 0), + minexptime = 0.5, + maxexptime = 1.25, + minsize = 1, + maxsize = 2, + collisiondetection = true, + vertical = false, + texture = "mcl_particles_effect.png^[colorize:blue:127", + }) + self.object:remove() + end + end, +}) + +local function throw_xp_bottle(pos, dir, velocity) + minetest.sound_play("mcl_throwing_throw", {pos = pos, gain = 0.4, max_hear_distance = 16}, true) + local obj = minetest.add_entity(pos, "mcl_experience:bottle") + obj:set_velocity(vector.multiply(dir, velocity)) + local acceleration = vector.multiply(dir, -3) + acceleration.y = -9.81 + obj:set_acceleration(acceleration) +end + +minetest.register_craftitem("mcl_experience:bottle", { + description = "Bottle o' Enchanting", + inventory_image = "mcl_experience_bottle.png", + wield_image = "mcl_experience_bottle.png", + stack_max = 64, + on_use = function(itemstack, placer, pointed_thing) + throw_xp_bottle(vector.add(placer:get_pos(), vector.new(0, 1.5, 0)), placer:get_look_dir(), 10) + if not minetest.is_creative_enabled(placer:get_player_name()) then + itemstack:take_item() + end + return itemstack + end, + _on_dispense = function(_, pos, _, _, dir) + throw_xp_bottle(vector.add(pos, vector.multiply(dir, 0.51)), dir, 10) + end +}) + diff --git a/mods/HUD/mcl_experience/command.lua b/mods/HUD/mcl_experience/command.lua new file mode 100644 index 000000000..040031b5a --- /dev/null +++ b/mods/HUD/mcl_experience/command.lua @@ -0,0 +1,39 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_chatcommand("xp", { + params = S("[[] ]"), + description = S("Gives a player some XP"), + privs = {server=true}, + func = function(name, params) + local player, xp = nil, 1000 + local P, i = {}, 0 + for str in string.gmatch(params, "([^ ]+)") do + i = i + 1 + P[i] = str + end + if i > 2 then + return false, S("Error: Too many parameters!") + end + if i > 0 then + xp = tonumber(P[i]) + end + if i < 2 then + player = minetest.get_player_by_name(name) + end + if i == 2 then + player = minetest.get_player_by_name(P[1]) + end + + if not xp then + return false, S("Error: Incorrect value of XP") + end + + if not player then + return false, S("Error: Player not found") + end + + mcl_experience.add_xp(player, xp) + + return true, S("Added @1 XP to @2, total: @3, experience level: @4", tostring(xp), player:get_player_name(), tostring(mcl_experience.get_xp(player)), tostring(mcl_experience.get_level(player))) + end, +}) diff --git a/mods/HUD/mcl_experience/init.lua b/mods/HUD/mcl_experience/init.lua index b7175ccfb..aea805fa2 100644 --- a/mods/HUD/mcl_experience/init.lua +++ b/mods/HUD/mcl_experience/init.lua @@ -1,632 +1,227 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -mcl_experience = {} - -local vector = vector -local math = math -local string = string - -local pool = {} -local registered_nodes -local max_xp = 2^31-1 -local max_orb_age = 300 -- seconds - -local gravity = {x = 0, y = -((tonumber(minetest.settings:get("movement_gravity"))) or 9.81), z = 0} -local size_min, size_max = 20, 59 -- percents -local delta_size = size_max - size_min -local size_to_xp = { - {-32768, 2}, -- 1 - { 3, 6}, -- 2 - { 7, 16}, -- 3 - { 17, 36}, -- 4 - { 37, 72}, -- 5 - { 73, 148}, -- 6 - { 149, 306}, -- 7 - { 307, 616}, -- 8 - { 617, 1236}, -- 9 - { 1237, 2476}, --10 - { 2477, 32767} --11 +mcl_experience = { + on_add_xp = {}, } -local function xp_to_size(xp) - local i, l = 1, #size_to_xp - while (xp > size_to_xp[i][1]) and (i < l) do - i = i + 1 - end - return ((i-1) / (l-1) * delta_size + size_min)/100 -end +local modpath = minetest.get_modpath(minetest.get_current_modname()) -minetest.register_on_mods_loaded(function() - registered_nodes = minetest.registered_nodes -end) +dofile(modpath .. "/command.lua") +dofile(modpath .. "/orb.lua") +dofile(modpath .. "/bottle.lua") -local function load_data(player) - local name = player:get_player_name() - pool[name] = {} - local temp_pool = pool[name] - local meta = player:get_meta() - temp_pool.xp = meta:get_int("xp") or 0 - temp_pool.level = mcl_experience.xp_to_level(temp_pool.xp) - temp_pool.bar, temp_pool.bar_step, temp_pool.xp_next_level = mcl_experience.xp_to_bar(temp_pool.xp, temp_pool.level) - temp_pool.last_time= minetest.get_us_time()/1000000 -end +-- local storage --- saves data to be utilized on next login -local function save_data(player) - local name = player:get_player_name() - local temp_pool = pool[name] - local meta = player:get_meta() - meta:set_int("xp", temp_pool.xp) - pool[name] = nil -end +local hud_bars = {} +local hud_levels = {} +local caches = {} -local player_huds = {} -- the list of players hud lists (3d array) -hud_manager = {} -- hud manager class +-- helpers --- terminate the player's list on leave -minetest.register_on_leaveplayer(function(player) - local name = player:get_player_name() - player_huds[name] = nil -end) - --- create instance of new hud -function hud_manager.add_hud(player,hud_name,def) - local name = player:get_player_name() - if minetest.is_creative_enabled(name) then - return - end - local local_hud = player:hud_add({ - hud_elem_type = def.hud_elem_type, - position = def.position, - text = def.text, - text2 = def.text2, - number = def.number, - item = def.item, - direction = def.direction, - size = def.size, - offset = def.offset, - z_index = def.z_index, - alignment = def.alignment, - scale = def.scale, - }) - -- create new 3d array here - -- depends.txt is not needed - -- with it here - if not player_huds[name] then - player_huds[name] = {} - end - - player_huds[name][hud_name] = local_hud -end - --- delete instance of hud -function hud_manager.remove_hud(player,hud_name) - local name = player:get_player_name() - if player_huds[name] and player_huds[name][hud_name] then - player:hud_remove(player_huds[name][hud_name]) - player_huds[name][hud_name] = nil - end -end - --- change element of hud -function hud_manager.change_hud(data) - local name = data.player:get_player_name() - if player_huds[name] and player_huds[name][data.hud_name] then - data.player:hud_change(player_huds[name][data.hud_name], data.element, data.data) - end -end - -------------------- - --- saves specific users data for when they relog -minetest.register_on_leaveplayer(function(player) - save_data(player) -end) - --- is used for shutdowns to save all data -local function save_all() - for name,_ in pairs(pool) do - local player = minetest.get_player_by_name(name) - if player then - save_data(player) - end - end -end - --- save all data to mod storage on shutdown -minetest.register_on_shutdown(function() - save_all() -end) - - -function mcl_experience.get_player_xp_level(player) - local name = player:get_player_name() - return pool[name].level -end - -function mcl_experience.set_player_xp_level(player,level) - local name = player:get_player_name() - if level == pool[name].level then - return - end - pool[name].level = level - pool[name].xp, pool[name].bar_step, pool[name].xp_next_level = mcl_experience.bar_to_xp(pool[name].bar, level) - hud_manager.change_hud({player = player, hud_name = "xp_level", element = "text", data = tostring(level)}) - -- we may don't update the bar -end - -local name -local temp_pool -minetest.register_on_joinplayer(function(player) - - load_data(player) - - name = player:get_player_name() - temp_pool = pool[name] - - hud_manager.add_hud(player,"experience_bar", - { - hud_elem_type = "image", - name = "experience bar", - text = "experience_bar_background.png^[lowpart:" .. math.floor(temp_pool.bar / 36 * 100) .. ":experience_bar.png^[transformR270", - position = {x=0.5, y=1}, - offset = {x = (-9 * 28) - 3, y = -(48 + 24 + 16 - 5)}, - scale = {x = 2.8, y = 3.0}, - alignment = { x = 1, y = 1 }, - z_index = 11, - }) - - hud_manager.add_hud(player,"xp_level", - { - hud_elem_type = "text", position = {x=0.5, y=1}, - name = "xp_level", text = tostring(temp_pool.level), - number = 0x80FF20, - offset = {x = 0, y = -(48 + 24 + 24)}, - z_index = 12, - }) -end) - -function mcl_experience.xp_to_level(xp) +local function xp_to_level(xp) local xp = xp or 0 local a, b, c, D + if xp > 1507 then - a, b, c = 4.5, -162.5, 2220-xp + a, b, c = 4.5, -162.5, 2220 - xp elseif xp > 352 then - a, b, c = 2.5, -40.5, 360-xp + a, b, c = 2.5, -40.5, 360 - xp else a, b, c = 1, 6, -xp end - D = b*b-4*a*c + + D = b * b - 4 * a * c + if D == 0 then - return math.floor(-b/2/a) - elseif D > 0 then - local v1, v2 = -b/2/a, math.sqrt(D)/2/a - return math.floor((math.max(v1-v2, v1+v2))) + return math.floor(-b / 2 / a) + elseif D > 0 then + local v1, v2 = -b / 2 / a, math.sqrt(D) / 2 / a + return math.floor(math.max(v1 - v2, v1 + v2)) end + return 0 end -function mcl_experience.level_to_xp(level) - if (level >= 1 and level <= 16) then +local function level_to_xp(level) + if level >= 1 and level <= 16 then return math.floor(math.pow(level, 2) + 6 * level) - elseif (level >= 17 and level <= 31) then + elseif level >= 17 and level <= 31 then return math.floor(2.5 * math.pow(level, 2) - 40.5 * level + 360) elseif level >= 32 then - return math.floor(4.5 * math.pow(level, 2) - 162.5 * level + 2220); + return math.floor(4.5 * math.pow(level, 2) - 162.5 * level + 2220) end + return 0 end -function mcl_experience.xp_to_bar(xp, level) - local level = level or mcl_experience.xp_to_level(xp) - local xp_this_level = mcl_experience.level_to_xp(level) - local xp_next_level = mcl_experience.level_to_xp(level+1) - local bar_step = 36 / (xp_next_level-xp_this_level) - local bar = (xp-xp_this_level) * bar_step - return bar, bar_step, xp_next_level +local function calculate_bounds(level) + return level_to_xp(level), level_to_xp(level + 1) end -function mcl_experience.bar_to_xp(bar, level) - local xp_this_level = mcl_experience.level_to_xp(level) - local xp_next_level = mcl_experience.level_to_xp(level+1) - local bar_step = 36 / (xp_next_level-xp_this_level) - local xp = xp_this_level + math.floor(bar/36*(xp_next_level-xp_this_level)) - return xp, bar_step, xp_next_level +local function xp_to_bar(xp, level) + local xp_min, xp_max = calculate_bounds(level) + + return (xp - xp_min) / (xp_max - xp_min) end -function mcl_experience.add_experience(player, experience) - local name = player:get_player_name() - local temp_pool = pool[name] +local function bar_to_xp(bar, level) + local xp_min, xp_max = calculate_bounds(level) - local inv = player:get_inventory() - local candidates = { - {list = "main", index = player:get_wield_index()}, - {list = "armor", index = 2}, - {list = "armor", index = 3}, - {list = "armor", index = 4}, - {list = "armor", index = 5}, - } - local final_candidates = {} - for _, can in ipairs(candidates) do - local stack = inv:get_stack(can.list, can.index) - local wear = stack:get_wear() - if mcl_enchanting.has_enchantment(stack, "mending") and wear > 0 then - can.stack = stack - can.wear = wear - table.insert(final_candidates, can) - end - end - if #final_candidates > 0 then - local can = final_candidates[math.random(#final_candidates)] - local stack, list, index, wear = can.stack, can.list, can.index, can.wear - local uses = mcl_util.calculate_durability(stack) - local multiplier = 2 * 65535 / uses - local repair = experience * multiplier - local new_wear = wear - repair - if new_wear < 0 then - experience = math.floor(-new_wear / multiplier + 0.5) - new_wear = 0 - else - experience = 0 - end - stack:set_wear(math.floor(new_wear)) - inv:set_stack(list, index, stack) - end + return xp_min + bar * (xp_max - xp_min) +end - local old_bar, old_xp, old_level = temp_pool.bar, temp_pool.xp, temp_pool.level - temp_pool.xp = math.min(math.max(temp_pool.xp + experience, 0), max_xp) +local function get_time() + return minetest.get_us_time() / 1000000 +end - if (temp_pool.xp < temp_pool.xp_next_level) and (temp_pool.xp >= old_xp) then - temp_pool.bar = temp_pool.bar + temp_pool.bar_step * experience - else - temp_pool.level = mcl_experience.xp_to_level(temp_pool.xp) - temp_pool.bar, temp_pool.bar_step, temp_pool.xp_next_level = mcl_experience.xp_to_bar(temp_pool.xp, temp_pool.level) - end +-- api - if old_bar ~= temp_pool.bar then - hud_manager.change_hud({player = player, hud_name = "experience_bar", element = "text", data = "experience_bar_background.png^[lowpart:" .. math.floor(temp_pool.bar / 36 * 100) .. ":experience_bar.png^[transformR270",}) - end +function mcl_experience.get_level(player) + return caches[player].level +end - if experience > 0 and minetest.get_us_time()/1000000 - temp_pool.last_time > 0.01 then - if old_level ~= temp_pool.level then - minetest.sound_play("level_up",{gain=0.2,to_player = name}) - temp_pool.last_time = minetest.get_us_time()/1000000 + 0.2 - else - minetest.sound_play("experience",{gain=0.1,to_player = name,pitch=math.random(75,99)/100}) - temp_pool.last_time = minetest.get_us_time()/1000000 - end - end +function mcl_experience.set_level(player, level) + local cache = caches[player] - if old_level ~= temp_pool.level then - hud_manager.change_hud({player = player, hud_name = "xp_level", element = "text", data = tostring(temp_pool.level)}) + if level ~= cache.level then + mcl_experience.set_xp(player, math.floor(bar_to_xp(xp_to_bar(mcl_experience.get_xp(player), cache.level), level))) end end ---reset player level -local name -local temp_pool -local xp_amount -minetest.register_on_dieplayer(function(player) - if minetest.settings:get_bool("mcl_keepInventory", false) then - return - end +function mcl_experience.get_xp(player) + return player:get_meta():get_int("xp") +end - name = player:get_player_name() - temp_pool = pool[name] - xp_amount = temp_pool.xp +function mcl_experience.set_xp(player, xp) + player:get_meta():set_int("xp", xp) - temp_pool.xp = 0 - temp_pool.level = 0 - temp_pool.bar, temp_pool.bar_step, temp_pool.xp_next_level = mcl_experience.xp_to_bar(temp_pool.xp, temp_pool.level) + mcl_experience.update(player) +end - hud_manager.change_hud({player = player, hud_name = "xp_level", element = "text", data = tostring(temp_pool.level)}) - hud_manager.change_hud({player = player, hud_name = "experience_bar", element = "text", data = "experience_bar_background.png^[lowpart:" .. math.floor(temp_pool.bar / 36 * 100) .. ":experience_bar.png^[transformR270",}) +function mcl_experience.add_xp(player, xp) + for _, cb in ipairs(mcl_experience.on_add_xp) do + xp = cb.func(player, xp) or xp - mcl_experience.throw_experience(player:get_pos(), xp_amount) -end) - -local collector, pos, pos2 -local direction, distance, player_velocity, goal -local currentvel, acceleration, multiplier, velocity -local node, vel, def -local is_moving, is_slippery, slippery, slip_factor -local size -local function xp_step(self, dtime) - --if item set to be collected then only execute go to player - if self.collected == true then - if not self.collector then - self.collected = false - return - end - collector = minetest.get_player_by_name(self.collector) - if collector and collector:get_hp() > 0 and vector.distance(self.object:get_pos(),collector:get_pos()) < 7.25 then - self.object:set_acceleration(vector.new(0,0,0)) - self.disable_physics(self) - --get the variables - pos = self.object:get_pos() - pos2 = collector:get_pos() - - player_velocity = collector:get_velocity() or collector:get_player_velocity() - - pos2.y = pos2.y + 0.8 - - direction = vector.direction(pos,pos2) - distance = vector.distance(pos2,pos) - multiplier = distance - if multiplier < 1 then - multiplier = 1 - end - goal = vector.multiply(direction,multiplier) - currentvel = self.object:get_velocity() - - if distance > 1 then - multiplier = 20 - distance - velocity = vector.multiply(direction,multiplier) - goal = velocity - acceleration = vector.new(goal.x-currentvel.x,goal.y-currentvel.y,goal.z-currentvel.z) - self.object:add_velocity(vector.add(acceleration,player_velocity)) - elseif distance < 0.8 then - mcl_experience.add_experience(collector, self._xp) - self.object:remove() - end - return - else - self.collector = nil - self.enable_physics(self) + if xp == 0 then + break end end + local cache = caches[player] + local old_level = cache.level - self.age = self.age + dtime - if self.age > max_orb_age then - self.object:remove() - return - end + mcl_experience.set_xp(player, mcl_experience.get_xp(player) + xp) - pos = self.object:get_pos() + local current_time = get_time() - if pos then - node = minetest.get_node_or_nil({ - x = pos.x, - y = pos.y -0.25, - z = pos.z - }) - else - return - end + if current_time - cache.last_time > 0.01 then + local name = player:get_player_name() - -- Remove nodes in 'ignore' - if node and node.name == "ignore" then - self.object:remove() - return - end - - if not self.physical_state then - return -- Don't do anything - end - - -- Slide on slippery nodes - vel = self.object:get_velocity() - def = node and registered_nodes[node.name] - is_moving = (def and not def.walkable) or - vel.x ~= 0 or vel.y ~= 0 or vel.z ~= 0 - is_slippery = false - - if def and def.walkable then - slippery = minetest.get_item_group(node.name, "slippery") - is_slippery = slippery ~= 0 - if is_slippery and (math.abs(vel.x) > 0.2 or math.abs(vel.z) > 0.2) then - -- Horizontal deceleration - slip_factor = 4.0 / (slippery + 4) - self.object:set_acceleration({ - x = -vel.x * slip_factor, - y = 0, - z = -vel.z * slip_factor + if old_level == cache.level then + minetest.sound_play("mcl_experience", { + to_player = name, + gain = 0.1, + pitch = math.random(75, 99) / 100, }) - elseif vel.y == 0 then - is_moving = false + + cache.last_time = current_time + else + minetest.sound_play("mcl_experience_level_up", { + to_player = name, + gain = 0.2, + }) + + cache.last_time = current_time + 0.2 end end - - if self.moving_state == is_moving and self.slippery_state == is_slippery then - -- Do not update anything until the moving state changes - return - end - - self.moving_state = is_moving - self.slippery_state = is_slippery - - if is_moving then - self.object:set_acceleration(gravity) - else - self.object:set_acceleration({x = 0, y = 0, z = 0}) - self.object:set_velocity({x = 0, y = 0, z = 0}) - end end -minetest.register_entity("mcl_experience:orb", { - initial_properties = { - hp_max = 1, - physical = true, - collide_with_objects = false, - collisionbox = {-0.2, -0.2, -0.2, 0.2, 0.2, 0.2}, - visual = "sprite", - visual_size = {x = 0.4, y = 0.4}, - textures = {name="experience_orb.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}}, - spritediv = {x = 1, y = 14}, - initial_sprite_basepos = {x = 0, y = 0}, - is_visible = true, - pointable = false, - static_save = false, - }, - moving_state = true, - slippery_state = false, - physical_state = true, - -- Item expiry - age = 0, - -- Pushing item out of solid nodes - force_out = nil, - force_out_start = nil, - --Collection Variables - collectable = false, - try_timer = 0, - collected = false, - delete_timer = 0, - radius = 4, - - - on_activate = function(self, staticdata, dtime_s) - self.object:set_velocity(vector.new( - math.random(-2,2)*math.random(), - math.random(2,5), - math.random(-2,2)*math.random() - )) - self.object:set_armor_groups({immortal = 1}) - self.object:set_velocity({x = 0, y = 2, z = 0}) - self.object:set_acceleration(gravity) - local xp = tonumber(staticdata) - self._xp = xp - size = xp_to_size(xp) - self.object:set_properties({ - visual_size = {x = size, y = size}, - glow = 14, - }) - self.object:set_sprite({x=1,y=math.random(1,14)}, 14, 0.05, false) - end, - - enable_physics = function(self) - if not self.physical_state then - self.physical_state = true - self.object:set_properties({physical = true}) - self.object:set_velocity({x=0, y=0, z=0}) - self.object:set_acceleration(gravity) - end - end, - - disable_physics = function(self) - if self.physical_state then - self.physical_state = false - self.object:set_properties({physical = false}) - self.object:set_velocity({x=0, y=0, z=0}) - self.object:set_acceleration({x=0, y=0, z=0}) - end - end, - on_step = function(self, dtime) - xp_step(self, dtime) - end, -}) - -minetest.register_chatcommand("xp", { - params = S("[[] ]"), - description = S("Gives a player some XP"), - privs = {server=true}, - func = function(name, params) - local player, xp = nil, 1000 - local P, i = {}, 0 - for str in string.gmatch(params, "([^ ]+)") do - i = i + 1 - P[i] = str - end - if i > 2 then - return false, S("Error: Too many parameters!") - end - if i > 0 then - xp = tonumber(P[i]) - end - if i < 2 then - player = minetest.get_player_by_name(name) - end - if i == 2 then - player = minetest.get_player_by_name(P[1]) - end - if not xp then - return false, S("Error: Incorrect value of XP") - end - if not player then - return false, S("Error: Player not found") - end - mcl_experience.add_experience(player, xp) - local playername = player:get_player_name() - minetest.chat_send_player(name, S("Added @1 XP to @2, total: @3, experience level: @4", tostring(xp), playername, tostring(pool[playername].xp), tostring(pool[playername].level))) - end, -}) - -function mcl_experience.throw_experience(pos, amount) +function mcl_experience.throw_xp(pos, total_xp) local i, j = 0, 0 - local obj, xp - while i < amount and j < 100 do - xp = math.min(math.random(1, math.min(32767, amount-math.floor(i/2))), amount-i) - obj = minetest.add_entity(pos, "mcl_experience:orb", tostring(xp)) + + while i < total_xp and j < 100 do + local xp = math.min(math.random(1, math.min(32767, total_xp - math.floor(i / 2))), total_xp - i) + local obj = minetest.add_entity(pos, "mcl_experience:orb", tostring(xp)) + if not obj then return false end - obj:set_velocity({ - x=math.random(-2,2)*math.random(), - y=math.random(2,5), - z=math.random(-2,2)*math.random() - }) + + obj:set_velocity(vector.new( + math.random(-2, 2) * math.random(), + math.random( 2, 5), + math.random(-2, 2) * math.random() + )) + i = i + xp j = j + 1 end end -minetest.register_entity("mcl_experience:bottle",{ - textures = {"mcl_experience_bottle.png"}, - hp_max = 1, - visual_size = {x = 0.35, y = 0.35}, - collisionbox = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, - pointable = false, - on_step = function(self, dtime) - local pos = self.object:get_pos() - local node = minetest.get_node(pos) - local n = node.name - if n ~= "air" and n ~= "mcl_portals:portal" and n ~= "mcl_portals:portal_end" and minetest.get_item_group(n, "liquid") == 0 then - minetest.sound_play("mcl_potions_breaking_glass", {pos = pos, max_hear_distance = 16, gain = 1}) - mcl_experience.throw_experience(pos, math.random(3, 11)) - minetest.add_particlespawner({ - amount = 50, - time = 0.1, - minpos = vector.add(pos, vector.new(-0.1, 0.5, -0.1)), - maxpos = vector.add(pos, vector.new( 0.1, 0.6, 0.1)), - minvel = vector.new(-2, 0, -2), - maxvel = vector.new( 2, 2, 2), - minacc = vector.new(0, 0, 0), - maxacc = vector.new(0, 0, 0), - minexptime = 0.5, - maxexptime = 1.25, - minsize = 1, - maxsize = 2, - collisiondetection = true, - vertical = false, - texture = "mcl_particles_effect.png^[colorize:blue:127", - }) - self.object:remove() - end - end, -}) +function mcl_experience.update(player) + local xp = mcl_experience.get_xp(player) + local cache = caches[player] -local function throw_xp_bottle(pos, dir, velocity) - minetest.sound_play("mcl_throwing_throw", {pos = pos, gain = 0.4, max_hear_distance = 16}, true) - local obj = minetest.add_entity(pos, "mcl_experience:bottle") - obj:set_velocity(vector.multiply(dir, velocity)) - local acceleration = vector.multiply(dir, -3) - acceleration.y = -9.81 - obj:set_acceleration(acceleration) + cache.level = xp_to_level(xp) + + if not minetest.is_creative_enabled(player:get_player_name()) then + player:hud_change(hud_bars[player], "text", "mcl_experience_bar_background.png^[lowpart:" + .. math.floor(math.floor(xp_to_bar(xp, cache.level) * 18) / 18 * 100) + .. ":mcl_experience_bar.png^[transformR270" + ) + + if cache.level == 0 then + player:hud_change(hud_levels[player], "text", "") + else + player:hud_change(hud_levels[player], "text", tostring(cache.level)) + end + end end -minetest.register_craftitem("mcl_experience:bottle", { - description = "Bottle o' Enchanting", - inventory_image = "mcl_experience_bottle.png", - wield_image = "mcl_experience_bottle.png", - stack_max = 64, - on_use = function(itemstack, placer, pointed_thing) - throw_xp_bottle(vector.add(placer:get_pos(), vector.new(0, 1.5, 0)), placer:get_look_dir(), 10) - if not minetest.is_creative_enabled(placer:get_player_name()) then - itemstack:take_item() - end - return itemstack - end, - _on_dispense = function(_, pos, _, _, dir) - throw_xp_bottle(vector.add(pos, vector.multiply(dir, 0.51)), dir, 10) +function mcl_experience.register_on_add_xp(func, priority) + table.insert(mcl_experience.on_add_xp, {func = func, priority = priority or 0}) +end + +-- callbacks + +minetest.register_on_joinplayer(function(player) + caches[player] = { + last_time = get_time(), + } + + if not minetest.is_creative_enabled(player:get_player_name()) then + hud_bars[player] = player:hud_add({ + hud_elem_type = "image", + position = {x = 0.5, y = 1}, + offset = {x = (-9 * 28) - 3, y = -(48 + 24 + 16 - 5)}, + scale = {x = 2.8, y = 3.0}, + alignment = {x = 1, y = 1}, + z_index = 11, + }) + + hud_levels[player] = player:hud_add({ + hud_elem_type = "text", + position = {x = 0.5, y = 1}, + number = 0x80FF20, + offset = {x = 0, y = -(48 + 24 + 24)}, + z_index = 12, + }) end -}) + + mcl_experience.update(player) +end) + +minetest.register_on_leaveplayer(function(player) + hud_bars[player] = nil + hud_levels[player] = nil + caches[player] = nil +end) + +minetest.register_on_dieplayer(function(player) + if not minetest.settings:get_bool("mcl_keepInventory", false) then + mcl_experience.throw_xp(player:get_pos(), mcl_experience.get_xp(player)) + mcl_experience.set_xp(player, 0) + end +end) + +minetest.register_on_mods_loaded(function() + table.sort(mcl_experience.on_add_xp, function(a, b) return a.priority < b.priority end) +end) diff --git a/mods/HUD/mcl_experience/orb.lua b/mods/HUD/mcl_experience/orb.lua new file mode 100644 index 000000000..9aecce00d --- /dev/null +++ b/mods/HUD/mcl_experience/orb.lua @@ -0,0 +1,220 @@ +local size_min, size_max = 20, 59 +local delta_size = size_max - size_min + +local size_to_xp = { + {-32768, 2}, -- 1 + { 3, 6}, -- 2 + { 7, 16}, -- 3 + { 17, 36}, -- 4 + { 37, 72}, -- 5 + { 73, 148}, -- 6 + { 149, 306}, -- 7 + { 307, 616}, -- 8 + { 617, 1236}, -- 9 + { 1237, 2476}, -- 10 + { 2477, 32767} -- 11 +} + +local function xp_to_size(xp) + local i, l = 1, #size_to_xp + + while xp > size_to_xp[i][1] and i < l do + i = i + 1 + end + + return ((i - 1) / (l - 1) * delta_size + size_min) / 100 +end + +local max_orb_age = 300 -- seconds +local gravity = vector.new(0, -((tonumber(minetest.settings:get("movement_gravity"))) or 9.81), 0) + +local collector, pos, pos2 +local direction, distance, player_velocity, goal +local currentvel, acceleration, multiplier, velocity +local node, vel, def +local is_moving, is_slippery, slippery, slip_factor +local size +local function xp_step(self, dtime) + --if item set to be collected then only execute go to player + if self.collected == true then + if not self.collector then + self.collected = false + return + end + collector = minetest.get_player_by_name(self.collector) + if collector and collector:get_hp() > 0 and vector.distance(self.object:get_pos(),collector:get_pos()) < 7.25 then + self.object:set_acceleration(vector.new(0,0,0)) + self.disable_physics(self) + --get the variables + pos = self.object:get_pos() + pos2 = collector:get_pos() + + player_velocity = collector:get_velocity() or collector:get_player_velocity() + + pos2.y = pos2.y + 0.8 + + direction = vector.direction(pos,pos2) + distance = vector.distance(pos2,pos) + multiplier = distance + if multiplier < 1 then + multiplier = 1 + end + goal = vector.multiply(direction,multiplier) + currentvel = self.object:get_velocity() + + if distance > 1 then + multiplier = 20 - distance + velocity = vector.multiply(direction,multiplier) + goal = velocity + acceleration = vector.new(goal.x-currentvel.x,goal.y-currentvel.y,goal.z-currentvel.z) + self.object:add_velocity(vector.add(acceleration,player_velocity)) + elseif distance < 0.8 then + mcl_experience.add_xp(collector, self._xp) + self.object:remove() + end + return + else + self.collector = nil + self.enable_physics(self) + end + end + + + self.age = self.age + dtime + if self.age > max_orb_age then + self.object:remove() + return + end + + pos = self.object:get_pos() + + if pos then + node = minetest.get_node_or_nil({ + x = pos.x, + y = pos.y -0.25, + z = pos.z + }) + else + return + end + + -- Remove nodes in 'ignore' + if node and node.name == "ignore" then + self.object:remove() + return + end + + if not self.physical_state then + return -- Don't do anything + end + + -- Slide on slippery nodes + vel = self.object:get_velocity() + def = node and minetest.registered_nodes[node.name] + is_moving = (def and not def.walkable) or + vel.x ~= 0 or vel.y ~= 0 or vel.z ~= 0 + is_slippery = false + + if def and def.walkable then + slippery = minetest.get_item_group(node.name, "slippery") + is_slippery = slippery ~= 0 + if is_slippery and (math.abs(vel.x) > 0.2 or math.abs(vel.z) > 0.2) then + -- Horizontal deceleration + slip_factor = 4.0 / (slippery + 4) + self.object:set_acceleration({ + x = -vel.x * slip_factor, + y = 0, + z = -vel.z * slip_factor + }) + elseif vel.y == 0 then + is_moving = false + end + end + + if self.moving_state == is_moving and self.slippery_state == is_slippery then + -- Do not update anything until the moving state changes + return + end + + self.moving_state = is_moving + self.slippery_state = is_slippery + + if is_moving then + self.object:set_acceleration(gravity) + else + self.object:set_acceleration({x = 0, y = 0, z = 0}) + self.object:set_velocity({x = 0, y = 0, z = 0}) + end +end + +minetest.register_entity("mcl_experience:orb", { + initial_properties = { + hp_max = 1, + physical = true, + collide_with_objects = false, + collisionbox = {-0.2, -0.2, -0.2, 0.2, 0.2, 0.2}, + visual = "sprite", + visual_size = {x = 0.4, y = 0.4}, + textures = {name="mcl_experience_orb.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}}, + spritediv = {x = 1, y = 14}, + initial_sprite_basepos = {x = 0, y = 0}, + is_visible = true, + pointable = false, + static_save = false, + }, + moving_state = true, + slippery_state = false, + physical_state = true, + -- Item expiry + age = 0, + -- Pushing item out of solid nodes + force_out = nil, + force_out_start = nil, + --Collection Variables + collectable = false, + try_timer = 0, + collected = false, + delete_timer = 0, + radius = 4, + + + on_activate = function(self, staticdata, dtime_s) + self.object:set_velocity(vector.new( + math.random(-2,2)*math.random(), + math.random(2,5), + math.random(-2,2)*math.random() + )) + self.object:set_armor_groups({immortal = 1}) + self.object:set_velocity({x = 0, y = 2, z = 0}) + self.object:set_acceleration(gravity) + local xp = tonumber(staticdata) + self._xp = xp + size = xp_to_size(xp) + self.object:set_properties({ + visual_size = {x = size, y = size}, + glow = 14, + }) + self.object:set_sprite({x=1,y=math.random(1,14)}, 14, 0.05, false) + end, + + enable_physics = function(self) + if not self.physical_state then + self.physical_state = true + self.object:set_properties({physical = true}) + self.object:set_velocity({x=0, y=0, z=0}) + self.object:set_acceleration(gravity) + end + end, + + disable_physics = function(self) + if self.physical_state then + self.physical_state = false + self.object:set_properties({physical = false}) + self.object:set_velocity({x=0, y=0, z=0}) + self.object:set_acceleration({x=0, y=0, z=0}) + end + end, + on_step = function(self, dtime) + xp_step(self, dtime) + end, +}) diff --git a/mods/HUD/mcl_experience/sounds/experience.ogg b/mods/HUD/mcl_experience/sounds/mcl_experience.ogg similarity index 100% rename from mods/HUD/mcl_experience/sounds/experience.ogg rename to mods/HUD/mcl_experience/sounds/mcl_experience.ogg diff --git a/mods/HUD/mcl_experience/sounds/level_up.ogg b/mods/HUD/mcl_experience/sounds/mcl_experience_level_up.ogg similarity index 100% rename from mods/HUD/mcl_experience/sounds/level_up.ogg rename to mods/HUD/mcl_experience/sounds/mcl_experience_level_up.ogg diff --git a/mods/HUD/mcl_experience/textures/experience_bar.png b/mods/HUD/mcl_experience/textures/mcl_experience_bar.png similarity index 100% rename from mods/HUD/mcl_experience/textures/experience_bar.png rename to mods/HUD/mcl_experience/textures/mcl_experience_bar.png diff --git a/mods/HUD/mcl_experience/textures/experience_bar_background.png b/mods/HUD/mcl_experience/textures/mcl_experience_bar_background.png similarity index 100% rename from mods/HUD/mcl_experience/textures/experience_bar_background.png rename to mods/HUD/mcl_experience/textures/mcl_experience_bar_background.png diff --git a/mods/HUD/mcl_experience/textures/experience_orb.png b/mods/HUD/mcl_experience/textures/mcl_experience_orb.png similarity index 100% rename from mods/HUD/mcl_experience/textures/experience_orb.png rename to mods/HUD/mcl_experience/textures/mcl_experience_orb.png diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 17b6b6ac6..e876baf31 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -379,6 +379,49 @@ mcl_enchanting.enchantments.mending = { inv_tool_tab = true, } +mcl_experience.register_on_add_xp(function(player, xp) + local inv = player:get_inventory() + + local candidates = { + {list = "main", index = player:get_wield_index()}, + {list = "armor", index = 2}, + {list = "armor", index = 3}, + {list = "armor", index = 4}, + {list = "armor", index = 5}, + } + + local final_candidates = {} + for _, can in ipairs(candidates) do + local stack = inv:get_stack(can.list, can.index) + local wear = stack:get_wear() + if mcl_enchanting.has_enchantment(stack, "mending") and wear > 0 then + can.stack = stack + can.wear = wear + table.insert(final_candidates, can) + end + end + + if #final_candidates > 0 then + local can = final_candidates[math.random(#final_candidates)] + local stack, list, index, wear = can.stack, can.list, can.index, can.wear + local uses = mcl_util.calculate_durability(stack) + local multiplier = 2 * 65535 / uses + local repair = xp * multiplier + local new_wear = wear - repair + + if new_wear < 0 then + xp = math.floor(-new_wear / multiplier + 0.5) + new_wear = 0 + else + xp = 0 + end + + stack:set_wear(math.floor(new_wear)) + inv:set_stack(list, index, stack) + end + + return xp +end, 0) mcl_enchanting.enchantments.multishot = { name = S("Multishot"), diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index 6050aeed2..02425945c 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -499,7 +499,7 @@ function mcl_enchanting.show_enchanting_formspec(player) .. "real_coordinates[true]" .. "image[3.15,0.6;7.6,4.1;mcl_enchanting_button_background.png]" local itemstack = inv:get_stack("enchanting_item", 1) - local player_levels = mcl_experience.get_player_xp_level(player) + local player_levels = mcl_experience.get_level(player) local y = 0.65 local any_enchantment = false local table_slots = mcl_enchanting.get_table_slots(player, itemstack, num_bookshelves) @@ -549,11 +549,11 @@ function mcl_enchanting.handle_formspec_fields(player, formname, fields) if not slot then return end - local player_level = mcl_experience.get_player_xp_level(player) + local player_level = mcl_experience.get_level(player) if player_level < slot.level_requirement then return end - mcl_experience.set_player_xp_level(player, player_level - button_pressed) + mcl_experience.set_level(player, player_level - button_pressed) inv:remove_item("enchanting_lapis", cost) mcl_enchanting.set_enchanted_itemstring(itemstack) mcl_enchanting.set_enchantments(itemstack, slot.enchantments) diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index e0c78832f..ade0be818 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -37,7 +37,7 @@ local fish = function(itemstack, player, pointed_thing) local num = 0 local ent = nil local noent = true - + local durability = 65 local unbreaking = mcl_enchanting.get_enchantment(itemstack, "unbreaking") if unbreaking > 0 then @@ -117,8 +117,8 @@ local fish = function(itemstack, player, pointed_thing) else minetest.add_item(pos, item) end - if mcl_experience.throw_experience then - mcl_experience.throw_experience(pos, math.random(1,6)) + if mcl_experience.throw_xp then + mcl_experience.throw_xp(pos, math.random(1,6)) end if not minetest.is_creative_enabled(player:get_player_name()) then diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index ca43b275a..dca476762 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -75,9 +75,9 @@ local function give_xp(pos, player) local xp = meta:get_int("xp") if xp > 0 then if player then - mcl_experience.add_experience(player, xp) + mcl_experience.add_xp(player, xp) else - mcl_experience.throw_experience(vector.add(pos, dir), xp) + mcl_experience.throw_xp(vector.add(pos, dir), xp) end meta:set_int("xp", 0) end diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index b756d4a6d..6e4b24c96 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -317,7 +317,7 @@ minetest.register_node("mcl_mobspawners:spawner", { if obj then obj:remove() end - mcl_experience.throw_experience(pos, math.random(15, 43)) + mcl_experience.throw_xp(pos, math.random(15, 43)) end, on_punch = function(pos) From 34f329a9d559c326e1c198ce1fbbfa16c1edee8e Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 19:57:21 +0100 Subject: [PATCH 153/228] TextureConverter: Implement grass palette conversion Source: https://minecraft.fandom.com/wiki/Tint Since the MineClone2 biomes do not entirely match with the Minecraft ones I picked the Minecraft biomes that seem to match them best. This also changes the palette index of the nether to match the desert instead of the mesa biome and changes the color of grass blocks in item form to the default minecraft one. --- mods/ITEMS/mcl_core/nodes_base.lua | 2 +- mods/MAPGEN/mcl_biomes/init.lua | 2 +- tools/Texture_Converter.py | 67 +++++++++++++++++++++--------- 3 files changed, 50 insertions(+), 21 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index abc650bb0..fe1ee58c2 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -365,7 +365,7 @@ minetest.register_node("mcl_core:dirt_with_grass", { overlay_tiles = {"mcl_core_grass_block_top.png", "", {name="mcl_core_grass_block_side_overlay.png", tileable_vertical=false}}, palette = "mcl_core_palette_grass.png", palette_index = 0, - color = "#55aa60", + color = "#8EB971", is_ground_content = true, stack_max = 64, groups = {handy=1,shovely=1,dirt=2,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}, diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index a630dba04..a04822439 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1496,7 +1496,7 @@ local function register_dimension_biomes() heat_point = 100, humidity_point = 0, _mcl_biome_type = "hot", - _mcl_palette_index = 19, + _mcl_palette_index = 17, }) --[[ THE END ]] diff --git a/tools/Texture_Converter.py b/tools/Texture_Converter.py index 820fa9c08..bdf249113 100755 --- a/tools/Texture_Converter.py +++ b/tools/Texture_Converter.py @@ -118,17 +118,6 @@ def colorize_alpha(colormap, source, colormap_pixel, texture_size, destination): colorize(colormap, source, colormap_pixel, texture_size, tempfile2.name) os.system("composite -compose Dst_In "+source+" "+tempfile2.name+" -alpha Set "+destination) -# This function is unused atm. -# TODO: Implemnt colormap extraction -def extract_colormap(colormap, colormap_pixel, positions): - os.system("convert -size 16x16 canvas:black "+tempfile1.name) - x=0 - y=0 - for p in positions: - os.system("convert "+colormap+" -crop 1x1+"+colormap_pixel+" -depth 8 "+tempfile2.name) - os.system("composite -geometry 16x16+"+x+"+"+y+" "+tempfile2.name) - x = x+1 - def target_dir(directory): if make_texture_pack: return output_dir + "/" + output_dir_name @@ -397,20 +386,60 @@ def convert_textures(): colorize_alpha(FOLIAG, tex_dir+"/blocks/vine.png", "16+39", str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/mcl_core_vine.png") # Tall grass, fern (inventory images) - pcol = "49+172" # Plains grass color + pcol = "50+173" # Plains grass color colorize_alpha(GRASS, tex_dir+"/blocks/tallgrass.png", pcol, str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/mcl_flowers_tallgrass_inv.png") colorize_alpha(GRASS, tex_dir+"/blocks/fern.png", pcol, str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/mcl_flowers_fern_inv.png") colorize_alpha(GRASS, tex_dir+"/blocks/double_plant_fern_top.png", pcol, str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/mcl_flowers_double_plant_fern_inv.png") colorize_alpha(GRASS, tex_dir+"/blocks/double_plant_grass_top.png", pcol, str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/mcl_flowers_double_plant_grass_inv.png") - # TODO: Convert grass palette - - offset = [ - [ pcol, "", "grass" ], # Default grass: Plains + # Convert grass palette: https://minecraft.fandom.com/wiki/Tint + grass_colors = [ + # [Coords or #Color, AdditionalTint], # Index - Minecraft biome name (MineClone2 biome names) + ["50+173"], # 0 - Plains (flat, Plains, Plains_beach, Plains_ocean, End) + ["0+255"], # 1 - Savanna (Savanna, Savanna_beach, Savanna_ocean) + ["255+255"], # 2 - Ice Spikes (IcePlainsSpikes, IcePlainsSpikes_ocean) + ["255+255"], # 3 - Snowy Taiga (ColdTaiga, ColdTaiga_beach, ColdTaiga_beach_water, ColdTaiga_ocean) + ["178+193"], # 4 - Giant Tree Taiga (MegaTaiga, MegaTaiga_ocean) + ["178+193"], # 5 - Giant Tree Taiga (MegaSpruceTaiga, MegaSpruceTaiga_ocean) + ["203+239"], # 6 - Montains (ExtremeHills, ExtremeHills_beach, ExtremeHills_ocean) + ["203+239"], # 7 - Montains (ExtremeHillsM, ExtremeHillsM_ocean) + ["203+239"], # 8 - Montains (ExtremeHills+, ExtremeHills+_snowtop, ExtremeHills+_ocean) + ["50+173"], # 9 - Beach (StoneBeach, StoneBeach_ocean) + ["255+255"], # 10 - Snowy Tundra (IcePlains, IcePlains_ocean) + ["50+173"], # 11 - Sunflower Plains (SunflowerPlains, SunflowerPlains_ocean) + ["191+203"], # 12 - Taiga (Taiga, Taiga_beach, Taiga_ocean) + ["76+112"], # 13 - Forest (Forest, Forest_beach, Forest_ocean) + ["76+112"], # 14 - Flower Forest (FlowerForest, FlowerForest_beach, FlowerForest_ocean) + ["101+163"], # 15 - Birch Forest (BirchForest, BirchForest_ocean) + ["101+163"], # 16 - Birch Forest Hills (BirchForestM, BirchForestM_ocean) + ["0+255"], # 17 - Desert and Nether (Desert, Desert_ocean, Nether) + ["76+112", "#28340A"], # 18 - Dark Forest (RoofedForest, RoofedForest_ocean) + ["#90814d"], # 19 - Mesa (Mesa, Mesa_sandlevel, Mesa_ocean, ) + ["#90814d"], # 20 - Mesa (MesaBryce, MesaBryce_sandlevel, MesaBryce_ocean) + ["#90814d"], # 21 - Mesa (MesaPlateauF, MesaPlateauF_grasstop, MesaPlateauF_sandlevel, MesaPlateauF_ocean) + ["#90814d"], # 22 - Mesa (MesaPlateauFM, MesaPlateauFM_grasstop, MesaPlateauFM_sandlevel, MesaPlateauFM_ocean) + ["0+255"], # 23 - Shattered Savanna (or Savanna Plateau ?) (SavannaM, SavannaM_ocean) + ["12+36"], # 24 - Jungle (Jungle, Jungle_shore, Jungle_ocean) + ["12+36"], # 25 - Modified Jungle (JungleM, JungleM_shore, JungleM_ocean) + ["12+61"], # 26 - Jungle Edge (JungleEdge, JungleEdge_ocean) + ["12+61"], # 27 - Modified Jungle Edge (JungleEdgeM, JungleEdgeM_ocean) + ["#6A7039"], # 28 - Swamp (Swampland, Swampland_shore, Swampland_ocean) + ["25+25"], # 29 - Mushroom Fields and Mushroom Field Shore (MushroomIsland, MushroomIslandShore, MushroomIsland_ocean) ] - for o in offset: - 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") + + grass_palette_file = target_dir("/mods/ITEMS/mcl_core/textures") + "/mcl_core_palette_grass.png" + os.system("convert -size 16x16 canvas:transparent " + grass_palette_file) + + for i, color in enumerate(grass_colors): + if color[0][0] == "#": + os.system("convert -size 1x1 xc:\"" + color[0] + "\" " + tempfile1.name + ".png") + else: + os.system("convert " + GRASS + " -crop 1x1+" + color[0] + " " + tempfile1.name + ".png") + + if len(color) > 1: + os.system("convert " + tempfile1.name + ".png \\( -size 1x1 xc:\"" + color[1] + "\" \\) -compose blend -define compose:args=50,50 -composite " + tempfile1.name + ".png") + + os.system("convert " + grass_palette_file + " \\( " + tempfile1.name + ".png -geometry +" + str(i % 16) + "+" + str(int(i / 16)) + " \\) -composite " + grass_palette_file) # Metadata if make_texture_pack: From 970988cb39bcd1ab35e17de886ffdd46aa52eee0 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 4 Aug 2021 12:41:25 +0200 Subject: [PATCH 154/228] Add sugar cane colorisation --- mods/ITEMS/mcl_core/functions.lua | 10 +++++++--- mods/ITEMS/mcl_core/nodes_cactuscane.lua | 13 +++++++++++++ .../mcl_core/textures/default_papyrus.png | Bin 277 -> 1953 bytes 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index 2ef73af72..d2ff3690a 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -773,8 +773,7 @@ end local grass_spread_randomizer = PseudoRandom(minetest.get_mapgen_setting("seed")) --- Return appropriate grass block node for pos -function mcl_core.get_grass_block_type(pos) +function mcl_core.get_grass_palette_index(pos) local biome_data = minetest.get_biome_data(pos) local index = 0 if biome_data then @@ -785,7 +784,12 @@ function mcl_core.get_grass_block_type(pos) index = reg_biome._mcl_palette_index end end - return {name="mcl_core:dirt_with_grass", param2=index} + return index +end + +-- Return appropriate grass block node for pos +function mcl_core.get_grass_block_type(pos) + return {name = "mcl_core:dirt_with_grass", param2 = mcl_core.get_grass_palette_index(pos)} end ------------------------------ diff --git a/mods/ITEMS/mcl_core/nodes_cactuscane.lua b/mods/ITEMS/mcl_core/nodes_cactuscane.lua index 839102534..e61d6df80 100644 --- a/mods/ITEMS/mcl_core/nodes_cactuscane.lua +++ b/mods/ITEMS/mcl_core/nodes_cactuscane.lua @@ -53,7 +53,10 @@ minetest.register_node("mcl_core:reeds", { _doc_items_longdesc = S("Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well."), _doc_items_usagehelp = S("Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow."), drawtype = "plantlike", + paramtype2 = "color", tiles = {"default_papyrus.png"}, + palette = "mcl_core_palette_grass.png", + palette_index = 0, inventory_image = "mcl_core_reeds.png", wield_image = "mcl_core_reeds.png", paramtype = "light", @@ -79,6 +82,7 @@ minetest.register_node("mcl_core:reeds", { 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 = "", + drop = "mcl_core:reeds", -- to prevent color inheritation on_place = mcl_util.generate_on_place_plant_function(function(place_pos, place_node) local soil_pos = {x=place_pos.x, y=place_pos.y-1, z=place_pos.z} local soil_node = minetest.get_node_or_nil(soil_pos) @@ -114,6 +118,15 @@ minetest.register_node("mcl_core:reeds", { return false end), + on_construct = function(pos) + local node = minetest.get_node(pos) + if node.param2 == 0 then + node.param2 = mcl_core.get_grass_palette_index(pos) + if node.param2 ~= 0 then + minetest.set_node(pos, node) + end + end + end, _mcl_blast_resistance = 0, _mcl_hardness = 0, }) diff --git a/mods/ITEMS/mcl_core/textures/default_papyrus.png b/mods/ITEMS/mcl_core/textures/default_papyrus.png index b6e2062ec6e5f4d2bf5c2a41437627ac6935e687..c928402f9507ddf95b93d2c43f31738a09356b81 100644 GIT binary patch delta 1951 zcmV;Q2VnS>0-+C(7=H)^0002B`ZwwT00i-RR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}tyfuc?I;ZW*D87mNFavgFjl=C^zvI^z}G|alBzbb(G^%a=m_CJ{r69Uf8-+c z1`IoIgSAR76HK5ef>*~C#uJqp&-p_w;i88*J@3bANsmJ)bWuADFIs@N9SXemsrLL(xTfIyeTVF$u_Jc{_mWGeDOhFA46^-_kAk6sKO_VrgfLM0g!Q zzUlRLL!XZIMt?-t0Vd@h%b9m;#kW?E)kR|^qIPD~2sSP=GBHWW^?1!nb8@rDZnPlH ztEjS2UQ|{|TE>7RtTaG_1tT`BqtBQHqM=GodZH{ub)DCa0%hHKGQD9Vr-LrSAn8mM zv=%jOEI9mz;V+{X&jn>Fp&08_f7#%>!QV7!E%y+i@_##4f{S`y3yjWOf66Q&1l#0| zM}SwG^sA5jkyI51d4$=^0;5WYiNtv3mL5E7na9!}TL{6GX+T0GzFEMa76z0>&1g|M zB8Mn(^g>V+EpbbISzwa>AW6VT=q4 zA71$$0e<$jgitwe@j`VsuK4s0(u7soCpPo{~A{3;lv+ zy?^TB?bUm)b9(U@RrD}r?`f-li!SyKPH{-SEvfp)yAs7IQe`yqr%*P?kmOv;u1sa? zSvW=H7wtK7Gem?5_p>9 zY7N#f+O$@jDS!UVm|sQoDWl!Z&awE-7wrcHy+*tB{j<2erZFmL7|_&}q5|!&h0_q<@5M>+ITC z8P+}^`^f%go~faEC&JF-()of3-|Us7#T|P7Md;u&c4xX-y)l%Xyxbn#o=$z+`D{BYoJ%7KQugYl#Z^zlmE5^N;(jKRiJJBlGM`%4gZA0`$ z->BRVLikGzFVW8a9)`vXGSGP*wer|cXPsAH^sD~E*z_v{c?UOV`?KJ!C4hWUZB`fH zu!O>2e+k@rxO}OcYqw|IOnZsjW;5HkzK?ePH2aXsUTbhqbDw0w7p&?N+kakOlMlcE z{{iyl_o#?U>4X3P0V8QcLr_UWLm+T+Z)Rz1WdHzpoSl%dO2beThQHRJrRX4vgE(Yx zEx6dpr78r$LW~uxPHEC&F*k-JrT7NEi9SpRLGTTH0R?CO8yy_X;)TQiaX9Dy@4e7; zlgJd#9+knLU8vG1 z%S&h+h`aMLv#etCb`TtiAH;5K(pdZ?-i=Lc+3p4=nMFUI_BN~I^y1w1RXcc`(8tGR z#EdBkB^_z1&M{r~r5-sU_Y_3Zgt2;a&6M1T3ORWkiUuOxrY3K@%762fGLpwsUN+$l zBTt)${on7kkF#pCv9-v;Jgizvs^(+@?~kxHgpFrtU)N-{e!s0|rd!SY^NnAA?NBgF z<9F8p0007FOGiWi|A&vvzW@LL32;bRa{vGf6951U69E94oEQKA00(qQO+^Rg2m}fd z2@>7nWdHyH21!IgRDUSXZPC9<13?f5@ZTOO6m4X=GKHOm5Ku^$*GOR*u)f}ag}qOZ z&h+{KR=$9wusCci4g@{YNlYVak#mjUR6Fc9^Zl8?by}DQMn);BT?F7ZEnJ13t!hPU zP^EpRpxEnKHW=XXyn|A1`h+Ig^1|h`$=vICPdiZ13Ysl?q~)-g8*F|8tQK llh9+?wVNdCEf~PDfp2QAPj|0&ecJ#4002ovPDHLkV1niRxds3L delta 261 zcmZ3;Kb2{ML_G^L0|Ud`yN`l^lx~1eh%1mTpC06ysvl<{o6zDEm}_?b{(Zf0U9%KZ zZf@=k8#bu=s9E^ShbwDxa&j`A(Ut*f;4caC3ugHLABsQ}16S-^bD&g*r;B4q1!HnT zNJ1Hpw|5A$A=A}M(pM$anj|8l`wZ)RN)q%#ytzw~Ja``56`Cd{b>sqH$eU@?N_rk{ zW!n7ep1qkzHJFNeMB!#hT!RT2?Q2hJ5RGaSuOTX}KmN-3bD7(8A5T-G@yGywo? CI9i$j From 47340386e20501cad0d2e7a0deba2a64a0022c0a Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 20:55:33 +0100 Subject: [PATCH 155/228] Turn parethesized sentence about voluntary work into normal one --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index de3ae536e..6d46237ca 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -343,9 +343,9 @@ at least two different people. requests as a developer. In this case it is your responsibility to fix the issue / review and merge the pull request when it is ready. You can also unassign yourself from the issue / PR if you have no time or don't -want to take care of it for some other reason (after all, everyone is a +want to take care of it for some other reason. After all, everyone is a volunteer and we can't expect you to do work that you are not intrested -in) - **the important thing is that you make sure to inform us if you +in. **The important thing is that you make sure to inform us if you won't take care of something that has been assigned to you.** - Please assign yourself to something that you want to work on to avoid duplicate work. From 4d93e13f80873075b492a35ef340ab49f2b6ff4f Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 20:59:27 +0100 Subject: [PATCH 156/228] Reword developer presence in public discussion rooms rule --- CONTRIBUTING.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6d46237ca..bbe097c0c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -349,9 +349,10 @@ in. **The important thing is that you make sure to inform us if you won't take care of something that has been assigned to you.** - Please assign yourself to something that you want to work on to avoid duplicate work. -- As a developer, it should be easy to reach you about -your code. You should be on the Discord (or, if you really don't like -Discord, Matrix or IRC). +- As a developer, it should be easy to reach you about your work. You +should be in at least one of the public MineClone2 discussion rooms - +preferrably Discord, but if you really don't like Discord, Matrix +or IRC are fine too. ### Maintainer status Maintainers carry the main responsibility for the project. From 6473494cbcf66e2454d33bc7b678dbf0c21ccdd1 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 21:01:43 +0100 Subject: [PATCH 157/228] prioritised -> prioritized --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bbe097c0c..ad9090930 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -13,11 +13,11 @@ whether you're a programmer or not. based on the Minetest engine with polished features, usable in both singleplayer and multiplayer. Currently, most of **Minecraft Java Edition 1.12.2** features are already implemented and polishing existing -features are prioritised over new feature requests. +features are prioritized over new feature requests. - With lessened priority yet strictly, implement features targetting **Minecraft version 1.17 + Optifine** (Optifine only as far as supported by the Minetest Engine). This means features in parity with the listed -Minecraft experiences are prioritised over those that don't fulfill this +Minecraft experiences are prioritized over those that don't fulfill this scope. - Optionally, create a performant experience that will run relatively well on really low spec computers. Unfortunately, due to Minecraft's From c2f0f0297be67de7ddc5775c5a5a63de9b5bb637 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 21:02:15 +0100 Subject: [PATCH 158/228] Optifine -> OptiFine --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ad9090930..ed5d2704d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,7 +15,7 @@ singleplayer and multiplayer. Currently, most of **Minecraft Java Edition 1.12.2** features are already implemented and polishing existing features are prioritized over new feature requests. - With lessened priority yet strictly, implement features targetting -**Minecraft version 1.17 + Optifine** (Optifine only as far as supported +**Minecraft version 1.17 + OptiFine** (OptiFine only as far as supported by the Minetest Engine). This means features in parity with the listed Minecraft experiences are prioritized over those that don't fulfill this scope. From 7c1777c53ac4ae388b1127d0266c5ec801fed4fb Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 21:03:17 +0100 Subject: [PATCH 159/228] minetest -> Minetest --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ed5d2704d..ea1175534 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -75,11 +75,11 @@ channel. However, it is not a bug if you believe something is missing in the game. In this case, please read "Requesting features" * If you report a crash, always include the error message. If you play -in singleplayer, post a screenshot of the message that minetest showed +in singleplayer, post a screenshot of the message that Minetest showed when the crash happened (or copy the message into your issue). If you are a server admin, you can find error messages in the log file of the server. -* Tell us which MineClone2 and minetest versions you are using. +* Tell us which MineClone2 and Minetest versions you are using. * Tell us how to reproduce the problem: What you were doing to trigger the bug, e.g. before the crash happened or what causes the faulty behavior. From faff9316e0b21cc32aa73e5f9fda7993ce56d1f1 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 21:03:58 +0100 Subject: [PATCH 160/228] minecraft -> Minecraft --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ea1175534..e8711bceb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -121,7 +121,7 @@ this is not required. It's also a good idea to join the Discord server #### Textures For textures we use the Pixel Perfection texture pack. This is mostly -enough; however in some cases - e.g. for newer minecraft features, it's +enough; however in some cases - e.g. for newer Minecraft features, it's useful to have texture artists around. If you want to make such contributions, join our Discord server. Demands for textures will be communicated there. From 6000c29171b7bcee909293addb60fb2fe012fd58 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 21:04:52 +0100 Subject: [PATCH 161/228] ressource -> resource --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e8711bceb..3f9186a32 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -129,7 +129,7 @@ communicated there. #### Sounds MineClone2 currently does not have a consistent way to handle sounds. The sounds in the game come from different sources, like the SnowZone -ressource pack or minetest_game. Unfortunately, MineClone2 does not play +resource pack or minetest_game. Unfortunately, MineClone2 does not play a sound in every situation you would get one in Minecraft. Any help with sounds is greatly appreciated, however if you add new sounds you should probably work together with a programmer, to write the code to actually From d6907970111ea975cd3fbbbb1f403721514fef7f Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 21:05:38 +0100 Subject: [PATCH 162/228] commited -> committed --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3f9186a32..f69a83015 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -159,7 +159,7 @@ the translation files for the language you are working on with the template files, to see what is missing and what is out of date with the template file. However, template files are often incomplete and/or out of date, sometimes they don't match the code. You can update the -translation files if that is required, you can also modifiy the code in +translation files if that is required, you can also modify the code in your translation PR if it's related to translation. You can also work on multiple languages at the same time in one PR. From cdf6533e0ac2c1321c5a048d28db3556af6d4161 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 21:06:08 +0100 Subject: [PATCH 163/228] regulary -> regularly --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f69a83015..2246e4bf9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -199,7 +199,7 @@ If you opened or have contributed to an issue, you receive the * Fork the repository (in case you have not already) * Do your change in a new branch * Create a pull request to get your changes merged into master -* Keep your pull request up to date by regulary merging upstream. It is +* Keep your pull request up to date by regularly merging upstream. It is imperative that conflicts are resolved prior to merging the pull request. * After the pull request got merged, you can delete the branch From bb6fe65aa5a3bb04b094f71851067e25b42b901b Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 21:06:35 +0100 Subject: [PATCH 164/228] inadequeate -> inadequate --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2246e4bf9..bc90905e0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -216,7 +216,7 @@ We appreciate any contributing effort to MineClone2. If you are a relatively new programmer, you can reach us on Discord, Matrix or IRC for questions about git, Lua, Minetest API, MineClone2 codebase or anything related to MineClone2. We can help you avoid writing code that -would be deemed inadequeate, or help you become familiar with MineClone2 +would be deemed inadequate, or help you become familiar with MineClone2 better, or assist you use development tools. ### Maintain your own code, even if alreay got merged From e70161501f3a01ac7c1ef3f3e895e1b07f334ec9 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 21:06:58 +0100 Subject: [PATCH 165/228] alreay -> already --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bc90905e0..b9f277a69 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -219,7 +219,7 @@ anything related to MineClone2. We can help you avoid writing code that would be deemed inadequate, or help you become familiar with MineClone2 better, or assist you use development tools. -### Maintain your own code, even if alreay got merged +### Maintain your own code, even if already got merged Sometimes, your code may cause crashes or bugs - we try to avoid such scenarios by testing everytime before merging it, but if your merged work causes problems, we ask you fix the issues as soon as possible. From 18dd1cabd0e523d25323a881071eb717b47bdeea Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 21:07:28 +0100 Subject: [PATCH 166/228] everytime -> every time --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b9f277a69..4e4be4ff7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -221,7 +221,7 @@ better, or assist you use development tools. ### Maintain your own code, even if already got merged Sometimes, your code may cause crashes or bugs - we try to avoid such -scenarios by testing everytime before merging it, but if your merged +scenarios by testing every time before merging it, but if your merged work causes problems, we ask you fix the issues as soon as possible. ### Changing Gameplay From 39f66eb4a025c8e4207ccadd690eb0467b8701be Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 21:08:11 +0100 Subject: [PATCH 167/228] repo -> repository --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4e4be4ff7..b9f443573 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -334,8 +334,8 @@ MineClone2 repository. #### Developer responsibilities - You should not push things directly to MineClone2 master - rather, do your work on a branch on your private -repo, then create a pull request. This way other people can review your -changes and make sure they work before they get merged. +repository, then create a pull request. This way other people can review +your changes and make sure they work before they get merged. - Merge PRs only when they have recieved the necessary feedback and have been tested to not lead to any crashes and do what they claim to do by at least two different people. From 46d1dd42d4f2c5ca4fd839fdf683c102c95ff5e7 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 21:08:47 +0100 Subject: [PATCH 168/228] recieved -> received --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b9f443573..67cc2c3e6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -336,7 +336,7 @@ MineClone2 repository. MineClone2 master - rather, do your work on a branch on your private repository, then create a pull request. This way other people can review your changes and make sure they work before they get merged. -- Merge PRs only when they have recieved the necessary feedback and have +- Merge PRs only when they have received the necessary feedback and have been tested to not lead to any crashes and do what they claim to do by at least two different people. - You may also be assigned to issues or pull From 61d0dc8182d37e2da33e3d6c7d0e082d813e3e20 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 21:09:13 +0100 Subject: [PATCH 169/228] intrested -> interested --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 67cc2c3e6..8ab8ee818 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -344,7 +344,7 @@ requests as a developer. In this case it is your responsibility to fix the issue / review and merge the pull request when it is ready. You can also unassign yourself from the issue / PR if you have no time or don't want to take care of it for some other reason. After all, everyone is a -volunteer and we can't expect you to do work that you are not intrested +volunteer and we can't expect you to do work that you are not interested in. **The important thing is that you make sure to inform us if you won't take care of something that has been assigned to you.** - Please assign yourself to something that you want to work on to avoid From c6e9d763d673816251d37c03eb19318c7bd8a8a6 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 21:09:57 +0100 Subject: [PATCH 170/228] repo -> repository (in release process documentation) --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8ab8ee818..2b1f16ad8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -378,7 +378,7 @@ technical guidelines and issue/PR delegation * Update the version number in README.md * Use `git tag ` to tag the latest commit with the version number -* Push to repo (don't forget `--tags`!) +* Push to repository (don't forget `--tags`!) * Update ContentDB (https://content.minetest.net/packages/Wuzzy/mineclone2/) * Update first post in forum thread From 24ca8252a9aa97303475b6e15aac21ac65f0804f Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 21:14:22 +0100 Subject: [PATCH 171/228] community wants -> community feedback --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2b1f16ad8..961e16cee 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -362,7 +362,7 @@ Maintainers carry the main responsibility for the project. merged, by assigning either themselves or Developers to issues / PRs - Making releases - Making sure guidelines are kept -- Making project decisions based on what the community wants +- Making project decisions based on community feedback - Granting/revoking developer access - Enforcing the code of conduct (See CODE_OF_CONDUCT.md) - Moderating official community spaces (See Links section) From a77e79d985fc384ea49810b1feb2d625a9c9feac Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 3 Nov 2021 21:15:20 +0100 Subject: [PATCH 172/228] where the real troublespots are -> places to investigate optimization issues --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 961e16cee..7abbcc5ea 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -171,8 +171,8 @@ credited in the Contributors section. ### Profiling If you own a server, a great way to help us improve MineClone2's code is by giving us profiler results. Profiler results give us detailed -information about the game's performance and let us know where the real -troublespots are. This way we can make the game faster. +information about the game's performance and let us know places to +investigate optimization issues. This way we can make the game faster. #### Using Minetest's profiler Minetest has a built in profiler. Simply set `profiler.load = true` in From f9e7f584926946148c22675fa816e30ab8e366d0 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 4 Nov 2021 12:21:06 +0100 Subject: [PATCH 173/228] Reword necessary PR feedback section --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7abbcc5ea..5d84ea47b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -336,9 +336,9 @@ MineClone2 repository. MineClone2 master - rather, do your work on a branch on your private repository, then create a pull request. This way other people can review your changes and make sure they work before they get merged. -- Merge PRs only when they have received the necessary feedback and have -been tested to not lead to any crashes and do what they claim to do by -at least two different people. +- Merge PRs only when they have recieved the necessary feedback and have +been tested by at least two different people (including the author of +the pull request), to avoid crashes or the introduction of new bugs. - You may also be assigned to issues or pull requests as a developer. In this case it is your responsibility to fix the issue / review and merge the pull request when it is ready. You can From b937b38b1c24f14e25e24621978110ed1b7602bd Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 4 Nov 2021 12:26:14 +0100 Subject: [PATCH 174/228] Separate translations and assets --- CONTRIBUTING.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5d84ea47b..5e00fddd8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -142,9 +142,14 @@ Similar to the textures, we need people that can make 3D Models with Blender on demand. Many of the models have to be patched, some new animations have to be added etc. -#### Translations +#### Crediting +Asset contributions will be credited in their own respective sections in +CREDITS.md. If you have commited the results yourself, you will also be +credited in the Contributors section. -##### Workflow +### Contributing Translations + +#### Workflow To add/update support for your language to MineClone2, you should take the steps documented in the section for Programmers, add/update the translation files of the mods that you want to update. You can add @@ -153,7 +158,7 @@ the translation file entirely or only partly; basically any effort is valued. If your changes are small, you can also send them to developers via E-Mail, Discord, IRC or Matrix - they will credit you appropriately. -##### Things to note +#### Things to note You can use the script at `tools/check_translate_files.py` to compare the translation files for the language you are working on with the template files, to see what is missing and what is out of date with @@ -164,9 +169,9 @@ your translation PR if it's related to translation. You can also work on multiple languages at the same time in one PR. #### Crediting -Asset contributions will be credited in their own respective sections in -CREDITS.md. If you have commited the results yourself, you will also be -credited in the Contributors section. +Translation contributions will be credited in their own in CREDITS.md. +If you have commited the results yourself, you will also be credited in +the Contributors section. ### Profiling If you own a server, a great way to help us improve MineClone2's code From 649f481b51162e4314da28c58769d9730e9b216c Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 4 Nov 2021 12:28:36 +0100 Subject: [PATCH 175/228] provide example for non-descriptive title --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5e00fddd8..9be680d6a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -54,7 +54,8 @@ you can report a bug or request a feature. ### Rules about both bugs and feature requests * Stay polite towards the developers and anyone else involved in the discussion. -* Choose a descriptive title. +* Choose a descriptive title (e.g. not just "crash", "bug" or "question" +). * Please write in plain, understandable English. It will be easier to communicate. * Please start the issue title with a capital letter. From 4a3a8841cdf956807e4b97a7dee2774ae873a930 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 4 Nov 2021 12:31:13 +0100 Subject: [PATCH 176/228] Add ingame credits script to release process --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9be680d6a..e8ea2bf5b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -380,6 +380,8 @@ technical guidelines and issue/PR delegation * Nicu - responsible for community related issues #### Release process +* Run `tools/generate_ingame_credits.lua` to update the ingame credits +from `CREDITS.md` and commit the result (if anything changed) * Launch MineClone2 to make sure it still runs * Update the version number in README.md * Use `git tag ` to tag the latest commit with the From ce4c0ed4c199028ebb69614629e7ece31a395e4b Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 4 Nov 2021 12:56:34 +0100 Subject: [PATCH 177/228] free -> free/libre --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e8ea2bf5b..de13bce7d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -396,7 +396,7 @@ version number ### Licensing By asking us to include your changes in this game, you agree that they fall under the terms of the GPLv3, which basically means they will -become part of a free software. +become part of a free/libre software. ### Crediting Contributors, Developers and Maintainers will be credited in From be86b603f8391d733f174bb6ccd44869f8327948 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 4 Nov 2021 13:14:35 +0100 Subject: [PATCH 178/228] Update README.md to reflect new contribution guidelines --- README.md | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 034d381ab..fe32f0039 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# MineClone 2 +# MineClone2 An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils. Developed by many people. Not developed or endorsed by Mojang AB. @@ -69,9 +69,9 @@ an explanation. This game requires [Minetest](http://minetest.net) to run (version 5.3.0 or later). So you need to install Minetest first. Only stable versions of Minetest are officially supported. -There is no support for running MineClone 2 in development versions of Minetest. +There is no support for running MineClone2 in development versions of Minetest. -To install MineClone 2 (if you haven't already), move this directory into the +To install MineClone2 (if you haven't already), move this directory into the “games” directory of your Minetest data directory. Consult the help of Minetest to learn more. @@ -86,20 +86,21 @@ The MineClone2 repository is hosted at Mesehub. To contribute or report issues, * Reddit: * Minetest forums: -## Project description -The main goal of **MineClone 2** is to be a clone of Minecraft and to be released as free software. - -* **Target of development: Minecraft, PC Edition, version 1.12** (later known as “Java Edition”) -* MineClone2 also includes Optifine features supported by the Minetest -* In general, Minecraft is aimed to be cloned as good as possible -* Cloning the gameplay has highest priority -* MineClone 2 will use different assets, but with a similar style -* Limitations found in Minetest will be documented in the course of development -* Features of later Minecraft versions are collected in the mineclone5 branch - -## Using features from newer versions of Minecraft -For > 1.12 features, checkout MineClone5. It includes features from newer Minecraft versions. -Download it here: https://git.minetest.land/MineClone2/MineClone2/src/branch/mineclone5 +## Target +- Crucially, create a stable, moddable, free/libre clone of Minecraft +based on the Minetest engine with polished features, usable in both +singleplayer and multiplayer. Currently, most of **Minecraft Java +Edition 1.12.2** features are already implemented and polishing existing +features are prioritized over new feature requests. +- With lessened priority yet strictly, implement features targetting +**Minecraft version 1.17 + OptiFine** (OptiFine only as far as supported +by the Minetest Engine). This means features in parity with the listed +Minecraft experiences are prioritized over those that don't fulfill this +scope. +- Optionally, create a performant experience that will run relatively +well on really low spec computers. Unfortunately, due to Minecraft's +mechanisms and Minetest engine's limitations along with a very small +playerbase on low spec computers, optimizations are hard to investigate. ## Completion status This game is currently in **beta** stage. @@ -186,7 +187,7 @@ Technical differences from Minecraft: * Different engine (Minetest) * Different easter eggs -… and finally, MineClone 2 is free software (“free” as in “freedom”)! +… and finally, MineClone2 is free software (“free” as in “freedom”)! ## Other readme files From 23ca11c8e1b0f4e802ea5b41ac63c32136dc760a Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Thu, 4 Nov 2021 01:53:58 +0100 Subject: [PATCH 179/228] Use RLE compression in tga_encoder --- mods/CORE/tga_encoder/init.lua | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/mods/CORE/tga_encoder/init.lua b/mods/CORE/tga_encoder/init.lua index 96afda5e1..973e44855 100644 --- a/mods/CORE/tga_encoder/init.lua +++ b/mods/CORE/tga_encoder/init.lua @@ -38,18 +38,31 @@ function image:encode_header() self.data = self.data .. string.char(0) -- image id .. string.char(0) -- color map type - .. string.char(2) -- image type (uncompressed true-color image = 2) + .. string.char(10) -- image type (RLE RGB = 10) self:encode_colormap_spec() -- color map specification self:encode_image_spec() -- image specification end function image:encode_data() + local current_pixel = '' + local previous_pixel = '' + local count = 1 + local encoded = '' + local rle_packet = '' for _, row in ipairs(self.pixels) do for _, pixel in ipairs(row) do - self.data = self.data - .. string.char(pixel[3], pixel[2], pixel[1]) + current_pixel = string.char(pixel[3], pixel[2], pixel[1]) + if current_pixel ~= previous_pixel or count == 128 then + encoded = encoded .. rle_packet + count = 1 + previous_pixel = current_pixel + else + count = count + 1 + end + rle_packet = string.char(128 + count - 1) .. current_pixel end end + self.data = self.data .. encoded .. rle_packet end function image:encode_footer() From 4926c0560da96ef4d0677487212fac519f6c2083 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Thu, 4 Nov 2021 15:15:28 +0100 Subject: [PATCH 180/228] Speed up TGA encoding by creating fewer strings --- mods/CORE/tga_encoder/init.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mods/CORE/tga_encoder/init.lua b/mods/CORE/tga_encoder/init.lua index 973e44855..39309c9c9 100644 --- a/mods/CORE/tga_encoder/init.lua +++ b/mods/CORE/tga_encoder/init.lua @@ -47,13 +47,13 @@ function image:encode_data() local current_pixel = '' local previous_pixel = '' local count = 1 - local encoded = '' + local packets = {} local rle_packet = '' for _, row in ipairs(self.pixels) do for _, pixel in ipairs(row) do current_pixel = string.char(pixel[3], pixel[2], pixel[1]) if current_pixel ~= previous_pixel or count == 128 then - encoded = encoded .. rle_packet + packets[#packets +1] = rle_packet count = 1 previous_pixel = current_pixel else @@ -62,7 +62,8 @@ function image:encode_data() rle_packet = string.char(128 + count - 1) .. current_pixel end end - self.data = self.data .. encoded .. rle_packet + packets[#packets +1] = rle_packet + self.data = self.data .. table.concat(packets) end function image:encode_footer() From d1d11f97406500ada5fe8e29577a36bd5bd6bf31 Mon Sep 17 00:00:00 2001 From: Dieter44 <55900078+Dieter44@users.noreply.github.com> Date: Thu, 4 Nov 2021 20:58:54 +0100 Subject: [PATCH 181/228] Fixed debug hudbars for player saturation and exhaustion when mcl_hunger_debug=true is set in .config file --- mods/PLAYER/mcl_hunger/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index 8c154700a..90a622a18 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -91,8 +91,8 @@ end -- register saturation hudbar hb.register_hudbar("hunger", 0xFFFFFF, S("Food"), { icon = "hbhunger_icon.png", bgicon = "hbhunger_bgicon.png", bar = "hbhunger_bar.png" }, 1, 20, 20, false) if mcl_hunger.debug then - hb.register_hudbar("saturation", 0xFFFFFF, S("Saturation"), { icon = "mcl_hunger_icon_saturation.png", bgicon = "mcl_hunger_bgicon_saturation.png", bar = "mcl_hunger_bar_saturation.png" }, 1, mcl_hunger.SATURATION_INIT, 200, false, S("%s: %.1f/%d")) - 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" }, 1, 0, mcl_hunger.EXHAUST_LVL, false, S("%s: %d/%d")) + hb.register_hudbar("saturation", 0xFFFFFF, S("Saturation"), { icon = "mcl_hunger_icon_saturation.png", bgicon = "mcl_hunger_bgicon_saturation.png", bar = "mcl_hunger_bar_saturation.png" }, 1, mcl_hunger.SATURATION_INIT, 200, false) + 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" }, 1, 0, mcl_hunger.EXHAUST_LVL, false) end minetest.register_on_joinplayer(function(player) From d0d60804a39da1b8d8a980861440b1146747ec20 Mon Sep 17 00:00:00 2001 From: Dieter44 <55900078+Dieter44@users.noreply.github.com> Date: Thu, 4 Nov 2021 21:01:28 +0100 Subject: [PATCH 182/228] Implemented health regeneration mechanics as described in minecraft wiki. Saturation values and different regeneration speeds now used. --- mods/PLAYER/mcl_hunger/init.lua | 84 +++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 36 deletions(-) diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index 90a622a18..535ccbed1 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -134,46 +134,58 @@ minetest.register_on_player_hpchange(function(player, hp_change) 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 -minetest.register_globalstep(function(dtime) - main_timer = main_timer + dtime - timer = timer + dtime - if main_timer > mcl_hunger.HUD_TICK or timer > 0.25 then - if main_timer > mcl_hunger.HUD_TICK then main_timer = 0 end - for _,player in pairs(minetest.get_connected_players()) do - local name = player:get_player_name() - local h = tonumber(mcl_hunger.get_hunger(player)) - local hp = player:get_hp() - if timer > 0.25 then - -- Slow health regeneration, and hunger damage (every 4s). - -- Regeneration rate based on tutorial video . - -- Minecraft Wiki seems to be wrong in claiming that full hunger gives 0.5s regen rate. - if timerMult == 0 then - if h >= 18 and hp > 0 and hp < 20 then - -- +1 HP, +exhaustion - player:set_hp(hp+1) - mcl_hunger.exhaust(name, mcl_hunger.EXHAUST_REGEN) - mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) - elseif h == 0 then - -- Damage hungry player down to 1 HP - -- TODO: Allow starvation at higher difficulty levels - if hp-1 > 0 then - mcl_util.deal_damage(player, 1, {type = "starve"}) + +local fastFoodTickTimer = 0 -- 0.5 second cycle +local slowFoodTickTimer = 0 -- 4 second cycle +minetest.register_globalstep(function(dtime) + fastFoodTickTimer = fastFoodTickTimer + dtime + slowFoodTickTimer = slowFoodTickTimer + dtime + + local fastTimerWrapped = false -- if the fastFoodTickTimer wrapped around and everything dependent should be updated + local slowTimerWrapped = false + + if fastFoodTickTimer > 0.5 then + fastFoodTickTimer = 0 + fastTimerWrapped = true + end + if slowFoodTickTimer > 4.0 then + slowFoodTickTimer = 0 + slowTimerWrapped = true + end + + if fastTimerWrapped or slowTimerWrapped then -- only update players if something must be updated + for _,player in ipairs(minetest.get_connected_players()) do + + local playerName = player:get_player_name() + local foodLevel = mcl_hunger.get_hunger(player) + local foodSaturationLevel = mcl_hunger.get_saturation(player) + local playerHealth = player:get_hp() + + if playerHealth < 20 then + if foodLevel == 20 and foodSaturationLevel >= 6 then -- fast regeneration (2 health per second) + if fastTimerWrapped then + player:set_hp(playerHealth+1) + mcl_hunger.exhaust(playerName, mcl_hunger.EXHAUST_REGEN) + mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) + end + elseif foodLevel >= 18 then -- slow regeneration (1 health every 4 seconds) + if slowTimerWrapped then + player:set_hp(playerHealth+1) + mcl_hunger.exhaust(playerName, mcl_hunger.EXHAUST_REGEN) + mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) end end end - - end - end - end - if timer > 0.25 then - timer = 0 - timerMult = timerMult + 2 - if timerMult > 7 then - timerMult = 0 + + if foodLevel == 0 then --starvation + maximumStarvation = 1 -- the amount of health at which a player will stop to get harmed by starvation (10 for Easy, 1 for Normal, 0 for Hard) + -- TODO: implement Minecraft-like difficulty modes and the update maximumStarvation here + if playerHealth > maximumStarvation and slowTimerWrapped then + mcl_util.deal_damage(player, 1, {type = "starve"}) + end + end + end end end) From 1b259f928bb32e30208235d17560097ba059b047 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sat, 6 Nov 2021 13:12:03 +0000 Subject: [PATCH 183/228] Add simple bone meal API - callback api - particle api --- mods/ITEMS/mcl_dye/init.lua | 83 ++++++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 34 deletions(-) diff --git a/mods/ITEMS/mcl_dye/init.lua b/mods/ITEMS/mcl_dye/init.lua index b9b5d92ac..274e31fcf 100644 --- a/mods/ITEMS/mcl_dye/init.lua +++ b/mods/ITEMS/mcl_dye/init.lua @@ -128,26 +128,35 @@ for _, row in ipairs(dyelocal.dyes) do end -- Bone Meal -local function bone_meal_particle(pos) +function mcl_dye.add_bone_meal_particle(pos, def) + if not def then + def = {} + end minetest.add_particlespawner({ - amount = 10, - time = 0.1, - minpos = { x = pos.x - 0.5, y = pos.y - 0.5, z = pos.z - 0.5 }, - maxpos = { x = pos.x + 0.5, y = pos.y + 0.5, z = pos.z + 0.5 }, - minvel = { x = 0, y = 0, z = 0}, - maxvel = { x = 0, y = 0, z = 0}, - minacc = { x = 0, y = 0, z = 0}, - maxacc = { x = 0, y = 0, z = 0}, - minexptime = 1, - maxexptime = 4, - minsize = 0.7, - maxsize = 2.4, + amount = def.amount or 10, + time = def.time or 0.1, + minpos = def.minpos or vector.subtract(pos, 0.5), + maxpos = def.maxpos or vector.add(pos, 0.5), + minvel = def.minvel or vector.new(0, 0, 0), + maxvel = def.maxvel or vector.new(0, 0, 0), + minacc = def.minacc or vector.new(0, 0, 0), + minacc = def.minacc or vector.new(0, 0, 0), + minexptime = def.minexptime or 1, + maxexptime = def.maxexptime or 4, + minsize = def.minsize or 0.7, + maxsize = def.maxsize or 2.4, texture = "mcl_particles_bonemeal.png^[colorize:#00EE00:125", -- TODO: real MC color - glow = 5, + glow = def.glow or 5, }) end -function mcl_dye.apply_bone_meal(pointed_thing) +mcl_dye.bone_meal_callbacks = {} + +function mcl_dye.register_on_bone_meal_apply(func) + table.insert(mcl_dye.bone_meal_callbacks, func) +end + +local function apply_bone_meal(pointed_thing) -- Bone meal currently spawns all flowers found in the plains. local flowers_table_plains = { "mcl_flowers:dandelion", @@ -183,14 +192,21 @@ function mcl_dye.apply_bone_meal(pointed_thing) local pos = pointed_thing.under local n = minetest.get_node(pos) if n.name == "" then return false end + + for _, func in pairs(mcl_dye.bone_meal_callbacks) do + if func(pointed_thing, user) then + return true + end + end + if minetest.get_item_group(n.name, "sapling") >= 1 then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) -- Saplings: 45% chance to advance growth stage if math.random(1,100) <= 45 then return mcl_core.grow_sapling(pos, n) end elseif minetest.get_item_group(n.name, "mushroom") == 1 then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) -- Try to grow huge mushroom -- Must be on a dirt-type block @@ -240,39 +256,37 @@ function mcl_dye.apply_bone_meal(pointed_thing) return false -- Wheat, Potato, Carrot, Pumpkin Stem, Melon Stem: Advance by 2-5 stages elseif string.find(n.name, "mcl_farming:wheat_") then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) local stages = math.random(2, 5) return mcl_farming:grow_plant("plant_wheat", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:potato_") then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) local stages = math.random(2, 5) return mcl_farming:grow_plant("plant_potato", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:carrot_") then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) local stages = math.random(2, 5) return mcl_farming:grow_plant("plant_carrot", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:pumpkin_") then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) local stages = math.random(2, 5) return mcl_farming:grow_plant("plant_pumpkin_stem", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:melontige_") then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) local stages = math.random(2, 5) return mcl_farming:grow_plant("plant_melon_stem", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:beetroot_") then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) -- Beetroot: 75% chance to advance to next stage if math.random(1, 100) <= 75 then return mcl_farming:grow_plant("plant_beetroot", pos, n, 1, true) end elseif n.name == "mcl_cocoas:cocoa_1" or n.name == "mcl_cocoas:cocoa_2" then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) -- Cocoa: Advance by 1 stage mcl_cocoas.grow(pos) return true elseif minetest.get_item_group(n.name, "grass_block") == 1 then - local grass_block_pos = {x = pos.x, y = pos.y + 1, z = pos.z} - bone_meal_particle(grass_block_pos) -- Grass Block: Generate tall grass and random flowers all over the place for i = -2, 2 do for j = -2, 2 do @@ -285,6 +299,7 @@ function mcl_dye.apply_bone_meal(pointed_thing) -- Randomly generate flowers, tall grass or nothing if math.random(1,100) <= 90 then -- 90% tall grass, 10% flower + mcl_dye.add_bone_meal_particle(pos, {amount = 4}) if math.random(1,100) <= 90 then local col = n2.param2 minetest.add_node(pos, {name="mcl_flowers:tallgrass", param2=col}) @@ -314,24 +329,24 @@ function mcl_dye.apply_bone_meal(pointed_thing) -- Double flowers: Drop corresponding item elseif n.name == "mcl_flowers:rose_bush" or n.name == "mcl_flowers:rose_bush_top" then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) minetest.add_item(pos, "mcl_flowers:rose_bush") return true elseif n.name == "mcl_flowers:peony" or n.name == "mcl_flowers:peony_top" then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) minetest.add_item(pos, "mcl_flowers:peony") return true elseif n.name == "mcl_flowers:lilac" or n.name == "mcl_flowers:lilac_top" then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) minetest.add_item(pos, "mcl_flowers:lilac") return true elseif n.name == "mcl_flowers:sunflower" or n.name == "mcl_flowers:sunflower_top" then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) minetest.add_item(pos, "mcl_flowers:sunflower") return true elseif n.name == "mcl_flowers:tallgrass" then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) -- Tall Grass: Grow into double tallgrass local toppos = { x=pos.x, y=pos.y+1, z=pos.z } local topnode = minetest.get_node(toppos) @@ -342,7 +357,7 @@ function mcl_dye.apply_bone_meal(pointed_thing) end elseif n.name == "mcl_flowers:fern" then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) -- Fern: Grow into large fern local toppos = { x=pos.x, y=pos.y+1, z=pos.z } local topnode = minetest.get_node(toppos) @@ -374,7 +389,7 @@ minetest.register_craftitem("mcl_dye:white", { end -- Use the bone meal on the ground - if(mcl_dye.apply_bone_meal(pointed_thing) and (not minetest.is_creative_enabled(user:get_player_name()))) then + if (apply_bone_meal(pointed_thing, user) and (not minetest.is_creative_enabled(user:get_player_name()))) then itemstack:take_item() end return itemstack @@ -387,7 +402,7 @@ minetest.register_craftitem("mcl_dye:white", { else pointed_thing = { above = pos, under = droppos } end - local success = mcl_dye.apply_bone_meal(pointed_thing) + local success = apply_bone_meal(pointed_thing, nil) if success then stack:take_item() end From 7bbc1e99519e12e47e0f88d84b9a999aa0affdb4 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sat, 6 Nov 2021 13:34:22 +0000 Subject: [PATCH 184/228] Add API.md for bone meal API --- mods/ITEMS/mcl_dye/API.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 mods/ITEMS/mcl_dye/API.md diff --git a/mods/ITEMS/mcl_dye/API.md b/mods/ITEMS/mcl_dye/API.md new file mode 100644 index 000000000..04169f966 --- /dev/null +++ b/mods/ITEMS/mcl_dye/API.md @@ -0,0 +1,14 @@ +# mcl_dye + +# Bone meal API +Callback and particle functions. + +## mcl_dye.add_bone_meal_particle(pos, def) +Spawns standard or custom bone meal particles. +* `pos`: position, is ignored if you define def.minpos and def.maxpos +* `def`: (optional) particle definition + +## mcl_dye.register_on_bone_meal_apply(function(pointed_thing, user)) +Called when the bone meal is applied anywhere. +* `pointed_thing`: exact pointing location (see Minetest API), where the bone meal is applied +* `user`: ObjectRef of the player who aplied the bone meal, can be nil! \ No newline at end of file From ea46c8741bc8e89b789ff63ef3e989e8e490ec37 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 7 Nov 2021 20:29:11 +0100 Subject: [PATCH 185/228] Add OpenCollective link and credits --- CONTRIBUTING.md | 8 ++++++++ CREDITS.md | 3 +++ README.md | 1 + mods/HUD/mcl_credits/people.lua | 3 +++ tools/generate_ingame_credits.lua | 1 + 5 files changed, 16 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index de13bce7d..27a820d87 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,6 +32,7 @@ playerbase on low spec computers, optimizations are hard to investigate. * [Matrix](https://app.element.io/#/room/#mc2:matrix.org) * [Reddit](https://www.reddit.com/r/MineClone2/) * [Minetest forums](https://forum.minetest.net/viewtopic.php?f=50&t=16407) +* [OpenCollective](https://opencollective.com/mineclone2) ## Using git MineClone2 is developed using the version control system @@ -194,9 +195,16 @@ MeseHub, let us know what you think about a topic and help us make decisions. Also, note that a lot of discussion takes place on the Discord server, so it's definitely worth checking it out. +### Funding +You can help pay for our infrastructure (Mesehub) by donating to our +OpenCollective link (See Links section). + ### Crediting If you opened or have contributed to an issue, you receive the `Community` role on our Discord (after asking for it). +OpenCollective Funders are credited in their own section in +`CREDITS.md` and receive a special role "Funder" on our discord (unless +they have made their donation Incognito). ## How you can help as a programmer (Almost) all the MineClone2 development is done using pull requests. diff --git a/CREDITS.md b/CREDITS.md index 95884dcac..dfbe58375 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -130,6 +130,9 @@ * todoporlalibertad * Marcin Serwin +## Funders +* 40W + ## Special thanks * celeron55 for creating Minetest * Jordach for the jukebox music compilation from Big Freaking Dig diff --git a/README.md b/README.md index fe32f0039..b8dc50f1f 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,7 @@ The MineClone2 repository is hosted at Mesehub. To contribute or report issues, * Matrix: * Reddit: * Minetest forums: +* OpenCollective: ## Target - Crucially, create a stable, moddable, free/libre clone of Minecraft diff --git a/mods/HUD/mcl_credits/people.lua b/mods/HUD/mcl_credits/people.lua index 2861b5052..8f1d4c2e9 100644 --- a/mods/HUD/mcl_credits/people.lua +++ b/mods/HUD/mcl_credits/people.lua @@ -132,6 +132,9 @@ return { "todoporlalibertad", "Marcin Serwin", }}, + {S("Funders"), 0xF7FF00, { + "40W", + }}, {S("Special thanks"), 0x00E9FF, { "celeron55 for creating Minetest", "Jordach for the jukebox music compilation from Big Freaking Dig", diff --git a/tools/generate_ingame_credits.lua b/tools/generate_ingame_credits.lua index 89b633ef0..db124aaf6 100755 --- a/tools/generate_ingame_credits.lua +++ b/tools/generate_ingame_credits.lua @@ -13,6 +13,7 @@ local colors = { ["3D Models"] = "0x0019FF", ["Textures"] = "0xFF9705", ["Translations"] = "0x00FF60", + ["Funders"] = "0xF7FF00", ["Special thanks"] = "0x00E9FF", } From a34ae040c8ea78d8a4f697bbce7485365f549f0a Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 8 Nov 2021 14:02:22 +0100 Subject: [PATCH 186/228] Add ContentDB links --- CONTRIBUTING.md | 1 + README.md | 1 + 2 files changed, 2 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 27a820d87..a7383df79 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,6 +32,7 @@ playerbase on low spec computers, optimizations are hard to investigate. * [Matrix](https://app.element.io/#/room/#mc2:matrix.org) * [Reddit](https://www.reddit.com/r/MineClone2/) * [Minetest forums](https://forum.minetest.net/viewtopic.php?f=50&t=16407) +* [ContentDB](https://content.minetest.net/packages/wuzzy/mineclone2/) * [OpenCollective](https://opencollective.com/mineclone2) ## Using git diff --git a/README.md b/README.md index b8dc50f1f..8f8f0b1e6 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,7 @@ The MineClone2 repository is hosted at Mesehub. To contribute or report issues, * Matrix: * Reddit: * Minetest forums: +* ContentDB: * OpenCollective: ## Target From 30ce6f8a779d5f4a3ab564c46b3d7ecbdaaf11b5 Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 8 Nov 2021 13:16:20 +0000 Subject: [PATCH 187/228] Fix typo min -> max --- mods/ITEMS/mcl_dye/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_dye/init.lua b/mods/ITEMS/mcl_dye/init.lua index 274e31fcf..2f6b0f105 100644 --- a/mods/ITEMS/mcl_dye/init.lua +++ b/mods/ITEMS/mcl_dye/init.lua @@ -140,7 +140,7 @@ function mcl_dye.add_bone_meal_particle(pos, def) minvel = def.minvel or vector.new(0, 0, 0), maxvel = def.maxvel or vector.new(0, 0, 0), minacc = def.minacc or vector.new(0, 0, 0), - minacc = def.minacc or vector.new(0, 0, 0), + maxacc = def.maxacc or vector.new(0, 0, 0), minexptime = def.minexptime or 1, maxexptime = def.maxexptime or 4, minsize = def.minsize or 0.7, From 976f522b9d25952768a77f7d6a9ae990d186da37 Mon Sep 17 00:00:00 2001 From: Dieter44 <55900078+Dieter44@users.noreply.github.com> Date: Mon, 8 Nov 2021 15:33:53 +0100 Subject: [PATCH 188/228] Combine slowFoodTickTimer and fastFoodTickTimer to a single food_tick_timer --- mods/PLAYER/mcl_hunger/init.lua | 69 +++++++++++++-------------------- 1 file changed, 27 insertions(+), 42 deletions(-) diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index 535ccbed1..0405c28ef 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -136,57 +136,42 @@ end) -local fastFoodTickTimer = 0 -- 0.5 second cycle -local slowFoodTickTimer = 0 -- 4 second cycle + +local food_tick_timer = 0 minetest.register_globalstep(function(dtime) - fastFoodTickTimer = fastFoodTickTimer + dtime - slowFoodTickTimer = slowFoodTickTimer + dtime + food_tick_timer = food_tick_timer + dtime - local fastTimerWrapped = false -- if the fastFoodTickTimer wrapped around and everything dependent should be updated - local slowTimerWrapped = false - - if fastFoodTickTimer > 0.5 then - fastFoodTickTimer = 0 - fastTimerWrapped = true - end - if slowFoodTickTimer > 4.0 then - slowFoodTickTimer = 0 - slowTimerWrapped = true - end - - if fastTimerWrapped or slowTimerWrapped then -- only update players if something must be updated - for _,player in ipairs(minetest.get_connected_players()) do + for _,player in ipairs(minetest.get_connected_players()) do + + local player_name = player:get_player_name() + local food_level = mcl_hunger.get_hunger(player) + local food_saturation_level = mcl_hunger.get_saturation(player) + local player_health = player:get_hp() + + if food_tick_timer > 4.0 then + food_tick_timer = 0 - local playerName = player:get_player_name() - local foodLevel = mcl_hunger.get_hunger(player) - local foodSaturationLevel = mcl_hunger.get_saturation(player) - local playerHealth = player:get_hp() + if food_level >= 18 and player_health < 20 then --slow regenration + food_tick_timer = 0 + player:set_hp(player_health+1) + mcl_hunger.exhaust(player_name, mcl_hunger.EXHAUST_REGEN) + mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) - if playerHealth < 20 then - if foodLevel == 20 and foodSaturationLevel >= 6 then -- fast regeneration (2 health per second) - if fastTimerWrapped then - player:set_hp(playerHealth+1) - mcl_hunger.exhaust(playerName, mcl_hunger.EXHAUST_REGEN) - mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) - end - elseif foodLevel >= 18 then -- slow regeneration (1 health every 4 seconds) - if slowTimerWrapped then - player:set_hp(playerHealth+1) - mcl_hunger.exhaust(playerName, mcl_hunger.EXHAUST_REGEN) - mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) - end - end - end - - if foodLevel == 0 then --starvation - maximumStarvation = 1 -- the amount of health at which a player will stop to get harmed by starvation (10 for Easy, 1 for Normal, 0 for Hard) + elseif food_level == 0 then --starvation + maximumStarvation = 1 --the amount of health at which a player will stop to get harmed by starvation (10 for Easy, 1 for Normal, 0 for Hard) -- TODO: implement Minecraft-like difficulty modes and the update maximumStarvation here - if playerHealth > maximumStarvation and slowTimerWrapped then + if player_health > maximumStarvation then mcl_util.deal_damage(player, 1, {type = "starve"}) end end - + + elseif food_tick_timer > 0.5 and food_level == 20 and food_saturation_level >= 6 then --fast regeneration + food_tick_timer = 0 + player:set_hp(player_health+1) + mcl_hunger.exhaust(player_name, mcl_hunger.EXHAUST_REGEN) + mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) end + end end) From 2f053885414d0cc5d480e92d2acc63e7e7de8b1a Mon Sep 17 00:00:00 2001 From: Dieter44 <55900078+Dieter44@users.noreply.github.com> Date: Mon, 8 Nov 2021 15:49:05 +0100 Subject: [PATCH 189/228] Add one food_tick_timer per player instead of using one for all players. --- mods/PLAYER/mcl_hunger/init.lua | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index 0405c28ef..1e3d07a47 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -137,11 +137,16 @@ end) -local food_tick_timer = 0 +local food_tick_timers = {} --one food_tick_timer per player, keys are the player-objects minetest.register_globalstep(function(dtime) - food_tick_timer = food_tick_timer + dtime - for _,player in ipairs(minetest.get_connected_players()) do + + local food_tick_timer = food_tick_timers[player] + if food_tick_timer == nil then + food_tick_timer = 0 + else + food_tick_timer = food_tick_timer + dtime + end local player_name = player:get_player_name() local food_level = mcl_hunger.get_hunger(player) @@ -172,6 +177,7 @@ minetest.register_globalstep(function(dtime) mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) end + food_tick_timers[player] = food_tick_timer --update food_tick_timer table end end) From e82d21040c952e78fa8c64c8a32405d311a8a43c Mon Sep 17 00:00:00 2001 From: Dieter44 <55900078+Dieter44@users.noreply.github.com> Date: Mon, 8 Nov 2021 19:15:56 +0100 Subject: [PATCH 190/228] minor changes, ipairs() replaced with pairs() --- mods/PLAYER/mcl_hunger/init.lua | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index 1e3d07a47..3a7af7e67 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -139,15 +139,9 @@ end) local food_tick_timers = {} --one food_tick_timer per player, keys are the player-objects minetest.register_globalstep(function(dtime) - for _,player in ipairs(minetest.get_connected_players()) do + for _,player in pairs(minetest.get_connected_players()) do - local food_tick_timer = food_tick_timers[player] - if food_tick_timer == nil then - food_tick_timer = 0 - else - food_tick_timer = food_tick_timer + dtime - end - + local food_tick_timer = food_tick_timers[player] and food_tick_timers[player] + dtime or 0 local player_name = player:get_player_name() local food_level = mcl_hunger.get_hunger(player) local food_saturation_level = mcl_hunger.get_saturation(player) @@ -157,15 +151,14 @@ minetest.register_globalstep(function(dtime) food_tick_timer = 0 if food_level >= 18 and player_health < 20 then --slow regenration - food_tick_timer = 0 player:set_hp(player_health+1) mcl_hunger.exhaust(player_name, mcl_hunger.EXHAUST_REGEN) mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) elseif food_level == 0 then --starvation - maximumStarvation = 1 --the amount of health at which a player will stop to get harmed by starvation (10 for Easy, 1 for Normal, 0 for Hard) + local maximum_starvation = 1 --the amount of health at which a player will stop to get harmed by starvation (10 for Easy, 1 for Normal, 0 for Hard) -- TODO: implement Minecraft-like difficulty modes and the update maximumStarvation here - if player_health > maximumStarvation then + if player_health > maximum_starvation then mcl_util.deal_damage(player, 1, {type = "starve"}) end end From a7bc460fae77f2a841bb7a5b9e735226373a4e44 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Tue, 9 Nov 2021 17:39:39 +0100 Subject: [PATCH 191/228] Fix boat and enchanting book texture glitches / warnings --- mods/ENTITIES/mcl_boats/init.lua | 10 ++++++++-- mods/ITEMS/mcl_enchanting/init.lua | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index 311b07882..f46c14d46 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -115,7 +115,7 @@ local boat = { collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5}, visual = "mesh", mesh = "mcl_boats_boat.b3d", - textures = {"mcl_boats_texture_oak_boat.png"}, + textures = {"mcl_boats_texture_oak_boat.png", "mcl_boats_texture_oak_boat.png", "mcl_boats_texture_oak_boat.png", "mcl_boats_texture_oak_boat.png", "mcl_boats_texture_oak_boat.png"}, visual_size = boat_visual_size, hp_max = boat_max_hp, damage_texture_modifier = "^[colorize:white:0", @@ -148,6 +148,11 @@ function boat.on_activate(self, staticdata, dtime_s) self._v = data.v self._last_v = self._v self._itemstring = data.itemstring + + while #data.textures < 5 do + table.insert(data.textures, data.textures[1]) + end + self.object:set_properties({textures = data.textures}) end end @@ -434,8 +439,9 @@ for b=1, #boat_ids do pos = vector.add(pos, vector.multiply(dir, boat_y_offset_ground)) end local boat = minetest.add_entity(pos, "mcl_boats:boat") + local texture = "mcl_boats_texture_"..images[b].."_boat.png" boat:get_luaentity()._itemstring = itemstring - boat:set_properties({textures = { "mcl_boats_texture_"..images[b].."_boat.png" }}) + boat:set_properties({textures = { texture, texture, texture, texture, texture }}) boat:set_yaw(placer:get_look_horizontal()) if not minetest.is_creative_enabled(placer:get_player_name()) then itemstack:take_item() diff --git a/mods/ITEMS/mcl_enchanting/init.lua b/mods/ITEMS/mcl_enchanting/init.lua index 5aec1ced6..9f9fbd271 100644 --- a/mods/ITEMS/mcl_enchanting/init.lua +++ b/mods/ITEMS/mcl_enchanting/init.lua @@ -183,7 +183,7 @@ minetest.register_entity("mcl_enchanting:book", { collisionbox = {0, 0, 0}, pointable = false, physical = false, - textures = {"mcl_enchanting_book_entity.png"}, + textures = {"mcl_enchanting_book_entity.png", "mcl_enchanting_book_entity.png", "mcl_enchanting_book_entity.png", "mcl_enchanting_book_entity.png", "mcl_enchanting_book_entity.png"}, static_save = false, }, _player_near = false, From 017bf705e9f5b549a45d448b89a0d1d347db370c Mon Sep 17 00:00:00 2001 From: Dieter44 <55900078+Dieter44@users.noreply.github.com> Date: Tue, 9 Nov 2021 19:35:32 +0100 Subject: [PATCH 192/228] Fixing that player can regenerate health in death screen and then respawn without HP being set to maximum --- mods/PLAYER/mcl_hunger/init.lua | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index 3a7af7e67..e54fb2fb2 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -150,10 +150,12 @@ minetest.register_globalstep(function(dtime) if food_tick_timer > 4.0 then food_tick_timer = 0 - if food_level >= 18 and player_health < 20 then --slow regenration - player:set_hp(player_health+1) - mcl_hunger.exhaust(player_name, mcl_hunger.EXHAUST_REGEN) - mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) + if food_level >= 18 then --slow regenration + if player_health > 0 and player_health < 20 then + player:set_hp(player_health+1) + mcl_hunger.exhaust(player_name, mcl_hunger.EXHAUST_REGEN) + mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) + end elseif food_level == 0 then --starvation local maximum_starvation = 1 --the amount of health at which a player will stop to get harmed by starvation (10 for Easy, 1 for Normal, 0 for Hard) @@ -164,10 +166,12 @@ minetest.register_globalstep(function(dtime) end elseif food_tick_timer > 0.5 and food_level == 20 and food_saturation_level >= 6 then --fast regeneration - food_tick_timer = 0 - player:set_hp(player_health+1) - mcl_hunger.exhaust(player_name, mcl_hunger.EXHAUST_REGEN) - mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) + if player_health > 0 and player_health < 20 then + food_tick_timer = 0 + player:set_hp(player_health+1) + mcl_hunger.exhaust(player_name, mcl_hunger.EXHAUST_REGEN) + mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) + end end food_tick_timers[player] = food_tick_timer --update food_tick_timer table From fa22ec4dd0b9c70eebb108bfef004e9100655bd2 Mon Sep 17 00:00:00 2001 From: iliekprogrammar Date: Wed, 10 Nov 2021 02:50:49 +0800 Subject: [PATCH 193/228] Add helper functions to update/merge tables. --- mods/CORE/mcl_util/init.lua | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 363b9b5fe..d91c86f09 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -1,5 +1,27 @@ mcl_util = {} +-- Updates all values in t using values from to*. +function table.update(t, ...) + for _, to in ipairs{...} do + for k,v in pairs(to) do + t[k] = v + end + end + return t +end + +-- Updates nil values in t using values from to*. +function table.update_nil(t, ...) + for _, to in ipairs{...} do + for k,v in pairs(to) do + if t[k] == nil then + t[k] = v + end + end + end + return t +end + -- Based on minetest.rotate_and_place --[[ From f61143758edc46cb1e4d7feef5a78d35c7c31d75 Mon Sep 17 00:00:00 2001 From: iliekprogrammar Date: Wed, 10 Nov 2021 12:54:28 +0800 Subject: [PATCH 194/228] Fix small typo in API.md --- mods/CORE/mcl_worlds/API.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/CORE/mcl_worlds/API.md b/mods/CORE/mcl_worlds/API.md index dd96b01b5..69508e924 100644 --- a/mods/CORE/mcl_worlds/API.md +++ b/mods/CORE/mcl_worlds/API.md @@ -12,7 +12,7 @@ Params: * pos: position -## mcl_worlds.y_to_layer(y) +## mcl_worlds.y_to_layer(y) This function is used to calculate the minetest y layer and dimension of the given minecraft layer. Mainly used for ore generation. Takes an Y coordinate as input and returns: @@ -78,4 +78,4 @@ Table containing all function registered with mcl_worlds.register_on_dimension_c Notify this mod of a dimension change of to * player: player, player who changed the dimension -* dimension: string, new dimension ("overworld", "nether", "end", "void") \ No newline at end of file +* dimension: string, new dimension ("overworld", "nether", "end", "void") From 8979230c4262411d8e2ae47ba8433e84e63585d1 Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 10 Nov 2021 17:15:27 +0000 Subject: [PATCH 195/228] Several fixes for applying bone meal to grass --- mods/ITEMS/mcl_dye/init.lua | 53 +++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/mods/ITEMS/mcl_dye/init.lua b/mods/ITEMS/mcl_dye/init.lua index 2f6b0f105..2b4d8a2f2 100644 --- a/mods/ITEMS/mcl_dye/init.lua +++ b/mods/ITEMS/mcl_dye/init.lua @@ -288,38 +288,39 @@ local function apply_bone_meal(pointed_thing) return true elseif minetest.get_item_group(n.name, "grass_block") == 1 then -- Grass Block: Generate tall grass and random flowers all over the place - for i = -2, 2 do - for j = -2, 2 do - pos = pointed_thing.above - pos = {x=pos.x+i, y=pos.y, z=pos.z+j} - n = minetest.get_node(pos) - local n2 = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) + for i = -7, 7 do + for j = -7, 7 do + for y = -1, 1 do + pos = vector.offset(pointed_thing.above, i, y, j) + n = minetest.get_node(pos) + local n2 = minetest.get_node(vector.offset(pos, 0, -1, 0)) - if n.name ~= "" and n.name == "air" and (minetest.get_item_group(n2.name, "grass_block_no_snow") == 1) then - -- Randomly generate flowers, tall grass or nothing - if math.random(1,100) <= 90 then - -- 90% tall grass, 10% flower - mcl_dye.add_bone_meal_particle(pos, {amount = 4}) - if math.random(1,100) <= 90 then - local col = n2.param2 - minetest.add_node(pos, {name="mcl_flowers:tallgrass", param2=col}) - else - local flowers_table - if mg_name == "v6" then - flowers_table = flowers_table_plains + if n.name ~= "" and n.name == "air" and (minetest.get_item_group(n2.name, "grass_block_no_snow") == 1) then + -- Randomly generate flowers, tall grass or nothing + if math.random(1, 100) <= 90 / ((math.abs(i) + math.abs(j)) / 2)then + -- 90% tall grass, 10% flower + mcl_dye.add_bone_meal_particle(pos, {amount = 4}) + if math.random(1,100) <= 90 then + local col = n2.param2 + minetest.add_node(pos, {name="mcl_flowers:tallgrass", param2=col}) else - local biome = minetest.get_biome_name(minetest.get_biome_data(pos).biome) - if biome == "Swampland" or biome == "Swampland_shore" or biome == "Swampland_ocean" or biome == "Swampland_deep_ocean" or biome == "Swampland_underground" then - flowers_table = flowers_table_swampland - elseif biome == "FlowerForest" or biome == "FlowerForest_beach" or biome == "FlowerForest_ocean" or biome == "FlowerForest_deep_ocean" or biome == "FlowerForest_underground" then - flowers_table = flowers_table_flower_forest - elseif biome == "Plains" or biome == "Plains_beach" or biome == "Plains_ocean" or biome == "Plains_deep_ocean" or biome == "Plains_underground" or biome == "SunflowerPlains" or biome == "SunflowerPlains_ocean" or biome == "SunflowerPlains_deep_ocean" or biome == "SunflowerPlains_underground" then + local flowers_table + if mg_name == "v6" then flowers_table = flowers_table_plains else - flowers_table = flowers_table_simple + local biome = minetest.get_biome_name(minetest.get_biome_data(pos).biome) + if biome == "Swampland" or biome == "Swampland_shore" or biome == "Swampland_ocean" or biome == "Swampland_deep_ocean" or biome == "Swampland_underground" then + flowers_table = flowers_table_swampland + elseif biome == "FlowerForest" or biome == "FlowerForest_beach" or biome == "FlowerForest_ocean" or biome == "FlowerForest_deep_ocean" or biome == "FlowerForest_underground" then + flowers_table = flowers_table_flower_forest + elseif biome == "Plains" or biome == "Plains_beach" or biome == "Plains_ocean" or biome == "Plains_deep_ocean" or biome == "Plains_underground" or biome == "SunflowerPlains" or biome == "SunflowerPlains_ocean" or biome == "SunflowerPlains_deep_ocean" or biome == "SunflowerPlains_underground" then + flowers_table = flowers_table_plains + else + flowers_table = flowers_table_simple + end end + minetest.add_node(pos, {name=flowers_table[math.random(1, #flowers_table)]}) end - minetest.add_node(pos, {name=flowers_table[math.random(1, #flowers_table)]}) end end end From 0b6467d6798c8620db1dee91152feda66087fdfe Mon Sep 17 00:00:00 2001 From: Dieter44 <55900078+Dieter44@users.noreply.github.com> Date: Thu, 11 Nov 2021 16:03:04 +0100 Subject: [PATCH 196/228] Reduce creeper run_velocity to 2.1, to fix #1691 --- mods/ENTITIES/mobs_mc/creeper.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 999cc5f2d..616e823c8 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -37,7 +37,7 @@ mobs:register_mob("mobs_mc:creeper", { }, makes_footstep_sound = false, walk_velocity = 1.05, - run_velocity = 3.25, + run_velocity = 2.1, runaway_from = { "mobs_mc:ocelot", "mobs_mc:cat" }, attack_type = "explode", eye_height = 1.25, From 68810a2a74ff3dca000234b26c749fb5486d5996 Mon Sep 17 00:00:00 2001 From: Dieter44 <55900078+Dieter44@users.noreply.github.com> Date: Thu, 11 Nov 2021 16:47:32 +0100 Subject: [PATCH 197/228] Change creeper fuse range and defuse range according to minecraft wiki: https://minecraft.fandom.com/wiki/Creeper and: https://minecraft.fandom.com/wiki/Explosion. Fix of #1689 --- mods/ENTITIES/mobs_mc/creeper.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 616e823c8..eb1f108c6 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -47,8 +47,8 @@ mobs:register_mob("mobs_mc:creeper", { --explosion_radius = 3, --explosion_damage_radius = 6, --explosiontimer_reset_radius = 6, - reach = 1.5, - defuse_reach = 4, + reach = 3, + defuse_reach = 5.2, explosion_timer = 0.3, allow_fuse_reset = true, stop_to_explode = true, @@ -186,8 +186,8 @@ mobs:register_mob("mobs_mc:creeper_charged", { --explosion_radius = 3, --explosion_damage_radius = 6, --explosiontimer_reset_radius = 3, - reach = 1.5, - defuse_reach = 4, + reach = 3, + defuse_reach = 10.4, explosion_timer = 0.3, allow_fuse_reset = true, stop_to_explode = true, From 10a5f8c4bfdbfec27fe83ab3c40478e7217c3680 Mon Sep 17 00:00:00 2001 From: Dieter44 <55900078+Dieter44@users.noreply.github.com> Date: Thu, 11 Nov 2021 16:50:29 +0100 Subject: [PATCH 198/228] Adding attribute hostile=true to charged creeper to fix that the charged creeper has no behavior: Issue #1756 --- mods/ENTITIES/mobs_mc/creeper.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index eb1f108c6..2b66d0f07 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -151,6 +151,7 @@ mobs:register_mob("mobs_mc:creeper_charged", { description = S("Charged Creeper"), type = "monster", spawn_class = "hostile", + hostile = true, hp_min = 20, hp_max = 20, xp_min = 5, From 03d22852ee8a5b203840266f39d302a8854e3cfb Mon Sep 17 00:00:00 2001 From: Dieter44 <55900078+Dieter44@users.noreply.github.com> Date: Thu, 11 Nov 2021 16:56:44 +0100 Subject: [PATCH 199/228] Replace mobs:boom with equivalent mcl_explosions.exlode() to fix game crash when creeper is right-clicked with flint and steel. Issue #1753 --- mods/ENTITIES/mobs_mc/creeper.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 2b66d0f07..1e23231c1 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -95,7 +95,8 @@ mobs:register_mob("mobs_mc:creeper", { if self._forced_explosion_countdown_timer then self._forced_explosion_countdown_timer = self._forced_explosion_countdown_timer - dtime if self._forced_explosion_countdown_timer <= 0 then - mobs:boom(self, mcl_util.get_object_center(self.object), self.explosion_strength) + local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false + mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { griefing = mobs_griefing, drop_chance = 1.0}, self.object) end end end, @@ -220,7 +221,8 @@ mobs:register_mob("mobs_mc:creeper_charged", { if self._forced_explosion_countdown_timer then self._forced_explosion_countdown_timer = self._forced_explosion_countdown_timer - dtime if self._forced_explosion_countdown_timer <= 0 then - mobs:boom(self, mcl_util.get_object_center(self.object), self.explosion_strength) + local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false + mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { griefing = mobs_griefing, drop_chance = 1.0}, self.object) end end end, From 0564121183177331901cb5a99e501500f086e535 Mon Sep 17 00:00:00 2001 From: iliekprogrammar Date: Fri, 12 Nov 2021 02:28:27 +0800 Subject: [PATCH 200/228] Code style for #1890 --- mods/PLAYER/mcl_hunger/init.lua | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index e54fb2fb2..21c1e0860 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -134,38 +134,37 @@ minetest.register_on_player_hpchange(function(player, hp_change) end end) - - - -local food_tick_timers = {} --one food_tick_timer per player, keys are the player-objects +local food_tick_timers = {} -- one food_tick_timer per player, keys are the player-objects minetest.register_globalstep(function(dtime) for _,player in pairs(minetest.get_connected_players()) do - + local food_tick_timer = food_tick_timers[player] and food_tick_timers[player] + dtime or 0 local player_name = player:get_player_name() local food_level = mcl_hunger.get_hunger(player) local food_saturation_level = mcl_hunger.get_saturation(player) local player_health = player:get_hp() - + if food_tick_timer > 4.0 then food_tick_timer = 0 - - if food_level >= 18 then --slow regenration + + if food_level >= 18 then -- slow regenration if player_health > 0 and player_health < 20 then player:set_hp(player_health+1) mcl_hunger.exhaust(player_name, mcl_hunger.EXHAUST_REGEN) mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) end - - elseif food_level == 0 then --starvation - local maximum_starvation = 1 --the amount of health at which a player will stop to get harmed by starvation (10 for Easy, 1 for Normal, 0 for Hard) + + elseif food_level == 0 then -- starvation + -- the amount of health at which a player will stop to get + -- harmed by starvation (10 for Easy, 1 for Normal, 0 for Hard) + local maximum_starvation = 1 -- TODO: implement Minecraft-like difficulty modes and the update maximumStarvation here if player_health > maximum_starvation then mcl_util.deal_damage(player, 1, {type = "starve"}) end end - - elseif food_tick_timer > 0.5 and food_level == 20 and food_saturation_level >= 6 then --fast regeneration + + elseif food_tick_timer > 0.5 and food_level == 20 and food_saturation_level >= 6 then -- fast regeneration if player_health > 0 and player_health < 20 then food_tick_timer = 0 player:set_hp(player_health+1) @@ -173,8 +172,8 @@ minetest.register_globalstep(function(dtime) mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) end end - - food_tick_timers[player] = food_tick_timer --update food_tick_timer table + + food_tick_timers[player] = food_tick_timer -- update food_tick_timer table end end) From 740f7583ef991e59b8f62ce3344744515aa2f10d Mon Sep 17 00:00:00 2001 From: iliekprogrammar Date: Fri, 12 Nov 2021 02:49:18 +0800 Subject: [PATCH 201/228] Add Dieter44 to CREDITS.md --- CREDITS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.md b/CREDITS.md index dfbe58375..1381b1c37 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -67,6 +67,7 @@ * SmallJoker * Sven792 * aldum +* Dieter44 ## MineClone5 * kay27 From 2a08f3143561d52e01fad66a5b4dadd1b765b0a2 Mon Sep 17 00:00:00 2001 From: NO11 Date: Fri, 12 Nov 2021 14:09:59 +0000 Subject: [PATCH 202/228] Use particlespawners for better performance (sponge particles) --- mods/ITEMS/mcl_sponges/init.lua | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/mods/ITEMS/mcl_sponges/init.lua b/mods/ITEMS/mcl_sponges/init.lua index a1998ecb0..e9755479b 100644 --- a/mods/ITEMS/mcl_sponges/init.lua +++ b/mods/ITEMS/mcl_sponges/init.lua @@ -115,16 +115,22 @@ function place_wet_sponge(itemstack, placer, pointed_thing) if mcl_worlds.pos_to_dimension(pointed_thing.above) == "nether" then minetest.item_place_node(ItemStack("mcl_sponges:sponge"), placer, pointed_thing) local pos = pointed_thing.above - for n = 0, 25 do - minetest.add_particle({ - pos = {x = pos.x + math.random(-1, 1)*math.random()/2, y = pos.y + 0.6, z = pos.z + math.random(-1, 1)*math.random()/2}, - velocity = {x = 0, y = math.random(), z = 0}, - acceleration = {x=0, y=0, z=0}, - expirationtime = math.random(), + + for n = 1, 5 do + minetest.add_particlespawner({ + amount = 5, + time = 0.1, + minpos = vector.offset(pos, -0.5, 0.6, -0.5), + maxpos = vector.offset(pos, 0.5, 0.6, 0.5), + minvel = vector.new(0, 0.1, 0), + maxvel = vector.new(0, 1, 0), + minexptime = 0.1, + maxexptime = 1, + minsize = 2, + maxsize = 5, collisiondetection = false, vertical = false, - size = math.random(2, 5), - texture = "mcl_particles_sponge"..math.random(1, 5)..".png", + texture = "mcl_particles_sponge" .. n .. ".png", }) end if not minetest.is_creative_enabled(name) then From 490e40d042325302dd5a7e58880cba82be514937 Mon Sep 17 00:00:00 2001 From: NO11 Date: Fri, 12 Nov 2021 15:41:09 +0000 Subject: [PATCH 203/228] Bone meal particles: add some velocity, correct glow --- mods/ITEMS/mcl_dye/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_dye/init.lua b/mods/ITEMS/mcl_dye/init.lua index 2b4d8a2f2..dfb962446 100644 --- a/mods/ITEMS/mcl_dye/init.lua +++ b/mods/ITEMS/mcl_dye/init.lua @@ -137,8 +137,8 @@ function mcl_dye.add_bone_meal_particle(pos, def) time = def.time or 0.1, minpos = def.minpos or vector.subtract(pos, 0.5), maxpos = def.maxpos or vector.add(pos, 0.5), - minvel = def.minvel or vector.new(0, 0, 0), - maxvel = def.maxvel or vector.new(0, 0, 0), + minvel = def.minvel or vector.new(-0.01, 0.01, -0.01), + maxvel = def.maxvel or vector.new(0.01, 0.01, 0.01), minacc = def.minacc or vector.new(0, 0, 0), maxacc = def.maxacc or vector.new(0, 0, 0), minexptime = def.minexptime or 1, @@ -146,7 +146,7 @@ function mcl_dye.add_bone_meal_particle(pos, def) minsize = def.minsize or 0.7, maxsize = def.maxsize or 2.4, texture = "mcl_particles_bonemeal.png^[colorize:#00EE00:125", -- TODO: real MC color - glow = def.glow or 5, + glow = def.glow or 1, }) end From 0cc0a7e01de8fc00dd63eab1b960701940719a66 Mon Sep 17 00:00:00 2001 From: NO11 Date: Fri, 12 Nov 2021 17:49:27 +0000 Subject: [PATCH 204/228] Make dripping particles MC-like --- mods/ENTITIES/drippingwater/init.lua | 167 ++++++++++----------------- 1 file changed, 59 insertions(+), 108 deletions(-) diff --git a/mods/ENTITIES/drippingwater/init.lua b/mods/ENTITIES/drippingwater/init.lua index e17bdda40..a4855acdc 100644 --- a/mods/ENTITIES/drippingwater/init.lua +++ b/mods/ENTITIES/drippingwater/init.lua @@ -1,114 +1,65 @@ ---Dripping Water Mod ---by kddekadenz +-- Dripping Water Mod +-- by kddekadenz local math = math -- License of code, textures & sounds: CC0 ---Drop entities +local function register_drop(liquid, glow, sound, nodes) + minetest.register_entity("drippingwater:drop_" .. liquid, { + hp_max = 1, + physical = true, + collide_with_objects = false, + collisionbox = {-0.01, 0.01, -0.01, 0.01, 0.01, 0.01}, + glow = glow, + pointable = false, + visual = "sprite", + visual_size = {x = 0.1, y = 0.1}, + textures = {""}, + spritediv = {x = 1, y = 1}, + initial_sprite_basepos = {x = 0, y = 0}, + static_save = false, + _dropped = false, + on_activate = function(self) + self.object:set_properties({ + textures = {"[combine:2x2:" .. -math.random(1, 16) .. "," .. -math.random(1, 16) .. "=default_" .. liquid .. "_source_animated.png"} + }) + end, + on_step = function(self, dtime) + local k = math.random(1, 222) + local ownpos = self.object:get_pos() + if k == 1 then + self.object:set_acceleration(vector.new(0, -5, 0)) + end + if minetest.get_node(vector.offset(ownpos, 0, 0.5, 0)).name == "air" then + self.object:set_acceleration(vector.new(0, -5, 0)) + end + if minetest.get_node(vector.offset(ownpos, 0, -0.1, 0)).name ~= "air" then + if not self.object:get_luaentity()._dropped then + self.object:get_luaentity()._dropped = true + minetest.sound_play({name = "drippingwater_" .. sound .. "drip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) + end + if k < 3 then + self.object:remove() + end + end + end, + }) + minetest.register_abm({ + label = "Create drops", + nodenames = nodes, + neighbors = {"group:" .. liquid}, + interval = 2, + chance = 22, + action = function(pos) + if minetest.get_item_group(minetest.get_node(vector.offset(pos, 0, 1, 0)).name, liquid) ~= 0 + and minetest.get_node(vector.offset(pos, 0, -1, 0)).name == "air" then + local x, z = math.random(-45, 45) / 100, math.random(-45, 45) / 100 + minetest.add_entity(vector.offset(pos, x, -0.520, z), "drippingwater:drop_" .. liquid) + end + end, + }) +end ---water - -local water_tex = "default_water_source_animated.png^[verticalframe:16:0" -minetest.register_entity("drippingwater:drop_water", { - hp_max = 1, - physical = true, - collide_with_objects = false, - collisionbox = {-0.025,-0.05,-0.025,0.025,-0.01,0.025}, - pointable = false, - visual = "cube", - visual_size = {x=0.05, y=0.1}, - textures = {water_tex, water_tex, water_tex, water_tex, water_tex, water_tex}, - spritediv = {x=1, y=1}, - initial_sprite_basepos = {x=0, y=0}, - static_save = false, - on_activate = function(self, staticdata) - self.object:set_sprite({x=0,y=0}, 1, 1, true) - end, - on_step = function(self, dtime) - local k = math.random(1,222) - local ownpos = self.object:get_pos() - if k==1 then - self.object:set_acceleration({x=0, y=-5, z=0}) - end - if minetest.get_node({x=ownpos.x, y=ownpos.y +0.5, z=ownpos.z}).name == "air" then - self.object:set_acceleration({x=0, y=-5, z=0}) - end - if minetest.get_node({x=ownpos.x, y=ownpos.y -0.5, z=ownpos.z}).name ~= "air" then - self.object:remove() - minetest.sound_play({name="drippingwater_drip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) - end - end, -}) - - ---lava - -local lava_tex = "default_lava_source_animated.png^[verticalframe:16:0" -minetest.register_entity("drippingwater:drop_lava", { - hp_max = 1, - physical = true, - collide_with_objects = false, - collisionbox = {-0.025,-0.05,-0.025,0.025,-0.01,0.025}, - glow = math.max(7, minetest.registered_nodes["mcl_core:lava_source"].light_source - 3), - pointable = false, - visual = "cube", - visual_size = {x=0.05, y=0.1}, - textures = {lava_tex, lava_tex, lava_tex, lava_tex, lava_tex, lava_tex}, - spritediv = {x=1, y=1}, - initial_sprite_basepos = {x=0, y=0}, - static_save = false, - on_activate = function(self, staticdata) - self.object:set_sprite({x=0,y=0}, 1, 0, true) - end, - on_step = function(self, dtime) - local k = math.random(1,222) - local ownpos = self.object:get_pos() - if k == 1 then - self.object:set_acceleration({x=0, y=-5, z=0}) - end - if minetest.get_node({x=ownpos.x, y=ownpos.y +0.5, z=ownpos.z}).name == "air" then - self.object:set_acceleration({x=0, y=-5, z=0}) - end - if minetest.get_node({x=ownpos.x, y=ownpos.y -0.5, z=ownpos.z}).name ~= "air" then - self.object:remove() - minetest.sound_play({name="drippingwater_lavadrip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) - end - end, -}) - - - ---Create drop - -minetest.register_abm({ - label = "Create water drops", - nodenames = {"group:opaque", "group:leaves"}, - neighbors = {"group:water"}, - interval = 2, - chance = 22, - action = function(pos) - if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name, "water") ~= 0 - and minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" then - local i = math.random(-45,45) / 100 - minetest.add_entity({x=pos.x + i, y=pos.y - 0.501, z=pos.z + i}, "drippingwater:drop_water") - end - end, -}) - ---Create lava drop - -minetest.register_abm({ - label = "Create lava drops", - nodenames = {"group:opaque"}, - neighbors = {"group:lava"}, - interval = 2, - chance = 22, - action = function(pos) - if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name, "lava") ~= 0 - and minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" then - local i = math.random(-45,45) / 100 - minetest.add_entity({x=pos.x + i, y=pos.y - 0.501, z=pos.z + i}, "drippingwater:drop_lava") - end - end, -}) \ No newline at end of file +register_drop("water", 1, "", {"group:opaque", "group:leaves"}) +register_drop("lava", math.max(7, minetest.registered_nodes["mcl_core:lava_source"].light_source - 3), "lava", {"group:opaque"}) \ No newline at end of file From 7ed964756e1798ba7e2feb6b3459e1fb66dae914 Mon Sep 17 00:00:00 2001 From: NO11 Date: Fri, 12 Nov 2021 18:00:04 +0000 Subject: [PATCH 205/228] local luaentity --- mods/ENTITIES/drippingwater/init.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/drippingwater/init.lua b/mods/ENTITIES/drippingwater/init.lua index a4855acdc..45a211d8f 100644 --- a/mods/ENTITIES/drippingwater/init.lua +++ b/mods/ENTITIES/drippingwater/init.lua @@ -35,8 +35,9 @@ local function register_drop(liquid, glow, sound, nodes) self.object:set_acceleration(vector.new(0, -5, 0)) end if minetest.get_node(vector.offset(ownpos, 0, -0.1, 0)).name ~= "air" then - if not self.object:get_luaentity()._dropped then - self.object:get_luaentity()._dropped = true + local ent = self.object:get_luaentity() + if not ent._dropped then + ent._dropped = true minetest.sound_play({name = "drippingwater_" .. sound .. "drip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) end if k < 3 then From 5515e2baa169ee3e5e2fe55043f8fe3272a5269a Mon Sep 17 00:00:00 2001 From: NO11 Date: Fri, 12 Nov 2021 21:49:47 +0000 Subject: [PATCH 206/228] Add 64 items to inventory when creative is on --- mods/HUD/mcl_inventory/creative.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 2be0be4bc..43301ce0b 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -667,3 +667,9 @@ minetest.register_on_joinplayer(function(player) init(player) mcl_inventory.set_creative_formspec(player, 0, 1, nil, false, "nix", "") end) + +minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) + if minetest.is_creative_enabled(player:get_player_name()) and action == "put" and inventory_info.listname == "main" then + player:get_inventory():set_stack("main", inventory_info.index, inventory_info.stack:get_name() .. " 64") + end +end) From 96c4fb60d8641b4181edb902ed24dbf173828d09 Mon Sep 17 00:00:00 2001 From: iliekprogrammar Date: Sat, 13 Nov 2021 10:46:16 +0800 Subject: [PATCH 207/228] Fix crash on startup during immediate runtime by mcl_burning The crash occurs if mcl_burning:data is deserialized to nil. The cause of mcl_burning being set to "return nil" is unknown. Therefore, when it occurs, it will be logged as warning. --- mods/ENTITIES/mcl_burning/init.lua | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/mods/ENTITIES/mcl_burning/init.lua b/mods/ENTITIES/mcl_burning/init.lua index 313e75dca..a47824537 100644 --- a/mods/ENTITIES/mcl_burning/init.lua +++ b/mods/ENTITIES/mcl_burning/init.lua @@ -44,18 +44,18 @@ minetest.register_on_respawnplayer(function(player) mcl_burning.extinguish(player) end) -minetest.register_on_joinplayer(function(player) - local storage - - local burn_data = player:get_meta():get_string("mcl_burning:data") - if burn_data == "" then - storage = {} - else - storage = minetest.deserialize(burn_data) +function mcl_burning.init_player(player) + local meta = player:get_meta() + -- NOTE: mcl_burning:data may be "return nil" (which deserialize into nil) for reasons unknown. + if meta:get_string("mcl_burning:data"):find("return nil", 1, true) then + minetest.log("warning", "[mcl_burning] 'mcl_burning:data' player meta field is invalid! Please report this bug") end - - mcl_burning.storage[player] = storage + mcl_burning.storage[player] = meta:contains("mcl_burning:data") and minetest.deserialize(meta:get_string("mcl_burning:data")) or {} mcl_burning.channels[player] = minetest.mod_channel_join("mcl_burning:" .. player:get_player_name()) +end + +minetest.register_on_joinplayer(function(player) + mcl_burning.init_player(player) end) minetest.register_on_leaveplayer(function(player) From bd1491854369913b8e1373dd5cadcd7280415535 Mon Sep 17 00:00:00 2001 From: iliekprogrammar Date: Sat, 13 Nov 2021 12:12:20 +0800 Subject: [PATCH 208/228] Reduce defuse reach for charged creeper 5.2 is actually half of the estimated MC creeper defuse range, which is 10.4. The reason for this change is to balance the creeper in MCL2 where it fuses whilst moving making it more difficult than MC. In MC, the creeper does not move while fusing. --- mods/ENTITIES/mobs_mc/creeper.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 1e23231c1..a7e33d1bd 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -189,7 +189,7 @@ mobs:register_mob("mobs_mc:creeper_charged", { --explosion_damage_radius = 6, --explosiontimer_reset_radius = 3, reach = 3, - defuse_reach = 10.4, + defuse_reach = 5.2, explosion_timer = 0.3, allow_fuse_reset = true, stop_to_explode = true, From ae8068cca671f5e215045fa4227e05b21fe5ebc5 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sat, 13 Nov 2021 11:17:46 +0000 Subject: [PATCH 209/228] Use stack_max instead of 64 for all items --- mods/HUD/mcl_inventory/creative.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 43301ce0b..4f9f1685a 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -670,6 +670,7 @@ end) minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) if minetest.is_creative_enabled(player:get_player_name()) and action == "put" and inventory_info.listname == "main" then - player:get_inventory():set_stack("main", inventory_info.index, inventory_info.stack:get_name() .. " 64") + local stack = inventory_info.stack + player:get_inventory():set_stack("main", inventory_info.index, stack:get_name() .. " " .. stack:get_stack_max()) end -end) +end) \ No newline at end of file From d4da8555708f2db411cbd0352cc4d7e62b7ee99d Mon Sep 17 00:00:00 2001 From: NO11 Date: Sat, 13 Nov 2021 12:25:10 +0000 Subject: [PATCH 210/228] Add button to switch between max stack size and just one item --- mods/HUD/mcl_inventory/creative.lua | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 4f9f1685a..de03886d9 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -289,6 +289,17 @@ filtername["inv"] = S("Survival Inventory") bg["default"] = dark_bg end]] +local function get_stack_size(player) + return player:get_meta():get_int("switch_stack") +end + +local function set_stack_size(player, n) + player:get_meta():set_int("switch_stack", n) +end + +minetest.register_on_newplayer(function (player) + set_stack_size(player, 64) +end) function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, show, page, filter) --reset_menu_item_bg() @@ -349,6 +360,11 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, armor_slot_imgs = armor_slot_imgs .. "image[5.5,2.75;1,1;mcl_inventory_empty_armor_slot_boots.png]" end + local switch_overlay = "blank.png" + if get_stack_size(player) == 64 then + switch_overlay = "mcl_inventory_button_switch_stack.png" + end + -- Survival inventory slots main_list = "list[current_player;main;0,3.75;9,3;9]".. mcl_formspec.get_itemslot_bg(0,3.75,9,3).. @@ -376,7 +392,10 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, -- achievements button "image_button[9,4;1,1;mcl_achievements_button.png;__mcl_achievements;]".. --"style_type[image_button;border=;bgimg=;bgimg_pressed=]".. - "tooltip[__mcl_achievements;"..F(S("Achievements")).."]" + "tooltip[__mcl_achievements;"..F(S("Achievements")).."]".. + -- switch stack size button + "image_button[9,5;1,1;default_apple.png^" .. switch_overlay .. ";__switch_stack;]".. + "tooltip[__switch_stack;"..F(S("Switch stack size")).."]" -- For shortcuts listrings = listrings .. @@ -544,6 +563,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) elseif fields.search and not fields.creative_next and not fields.creative_prev then set_inv_search(string.lower(fields.search),player) page = "nix" + elseif fields.__switch_stack then + local switch = 1 + if get_stack_size(player) == 1 then + switch = 64 + end + set_stack_size(player, switch) end if page then @@ -669,7 +694,7 @@ minetest.register_on_joinplayer(function(player) end) minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) - if minetest.is_creative_enabled(player:get_player_name()) and action == "put" and inventory_info.listname == "main" then + if minetest.is_creative_enabled(player:get_player_name()) and action == "put" and inventory_info.listname == "main" and get_stack_size(player) == 64 then local stack = inventory_info.stack player:get_inventory():set_stack("main", inventory_info.index, stack:get_name() .. " " .. stack:get_stack_max()) end From d7e59f6a359c2bb371e63829b51f74ae685735ab Mon Sep 17 00:00:00 2001 From: NO11 Date: Sat, 13 Nov 2021 12:26:01 +0000 Subject: [PATCH 211/228] Add switch stack size overlay texture --- .../mcl_inventory_button_switch_stack.png | Bin 0 -> 8936 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 mods/HUD/mcl_inventory/textures/mcl_inventory_button_switch_stack.png diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_button_switch_stack.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_button_switch_stack.png new file mode 100644 index 0000000000000000000000000000000000000000..ac56d833d0c6c4efcb9633794ffc9d767247d962 GIT binary patch literal 8936 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 Date: Sat, 13 Nov 2021 15:19:34 +0000 Subject: [PATCH 212/228] localize wielditem in crossbow.lua (Fix #1901) --- mods/ITEMS/mcl_bows/crossbow.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_bows/crossbow.lua b/mods/ITEMS/mcl_bows/crossbow.lua index e3124156b..5ae21a1f3 100644 --- a/mods/ITEMS/mcl_bows/crossbow.lua +++ b/mods/ITEMS/mcl_bows/crossbow.lua @@ -92,7 +92,7 @@ local function get_arrow(player) return arrow_stack, arrow_stack_id end -local function player_shoot_arrow(itemstack, player, power, damage, is_critical) +local function player_shoot_arrow(wielditem, player, power, damage, is_critical) local has_multishot_enchantment = mcl_enchanting.has_enchantment(player:get_wielded_item(), "multishot") local arrow_itemstring = wielditem:get_meta():get("arrow") @@ -286,7 +286,7 @@ end) controls.register_on_press(function(player, key, time) if key~="LMB" then return end - wielditem = player:get_wielded_item() + local wielditem = player:get_wielded_item() if wielditem:get_name()=="mcl_bows:crossbow_loaded" or wielditem:get_name()=="mcl_bows:crossbow_loaded_enchanted" then local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) local speed, damage From bcb6251d2058d46ca75cb262fd2628ea44526731 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sat, 13 Nov 2021 17:26:17 +0000 Subject: [PATCH 213/228] Use label instead of extra texture --- mods/HUD/mcl_inventory/creative.lua | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index de03886d9..a3314ec0a 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -1,5 +1,6 @@ local S = minetest.get_translator(minetest.get_current_modname()) local F = minetest.formspec_escape +local C = minetest.colorize -- Prepare player info table local players = {} @@ -360,11 +361,8 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, armor_slot_imgs = armor_slot_imgs .. "image[5.5,2.75;1,1;mcl_inventory_empty_armor_slot_boots.png]" end - local switch_overlay = "blank.png" - if get_stack_size(player) == 64 then - switch_overlay = "mcl_inventory_button_switch_stack.png" - end - + local stack_size = get_stack_size(player) + -- Survival inventory slots main_list = "list[current_player;main;0,3.75;9,3;9]".. mcl_formspec.get_itemslot_bg(0,3.75,9,3).. @@ -394,8 +392,9 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, --"style_type[image_button;border=;bgimg=;bgimg_pressed=]".. "tooltip[__mcl_achievements;"..F(S("Achievements")).."]".. -- switch stack size button - "image_button[9,5;1,1;default_apple.png^" .. switch_overlay .. ";__switch_stack;]".. - "tooltip[__switch_stack;"..F(S("Switch stack size")).."]" + "image_button[9,5;1,1;default_apple.png;__switch_stack;]".. + "label[9.4,5.4;".. F(C("#FFFFFF", stack_size ~= 1 and stack_size or "")) .."]".. + "tooltip[__switch_stack;"..F(S("Switch stack size")).."]" -- For shortcuts listrings = listrings .. From add97d39a6171ee5bc20c829dc98074d37fcc14f Mon Sep 17 00:00:00 2001 From: NO11 Date: Sat, 13 Nov 2021 17:28:13 +0000 Subject: [PATCH 214/228] delete overlay texture --- .../mcl_inventory_button_switch_stack.png | Bin 8936 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mods/HUD/mcl_inventory/textures/mcl_inventory_button_switch_stack.png diff --git a/mods/HUD/mcl_inventory/textures/mcl_inventory_button_switch_stack.png b/mods/HUD/mcl_inventory/textures/mcl_inventory_button_switch_stack.png deleted file mode 100644 index ac56d833d0c6c4efcb9633794ffc9d767247d962..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8936 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 Date: Sat, 13 Nov 2021 18:56:52 +0000 Subject: [PATCH 215/228] Use on_joinplayer instead of on_newplayer --- mods/HUD/mcl_inventory/creative.lua | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index a3314ec0a..d2dedd556 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -291,15 +291,17 @@ filtername["inv"] = S("Survival Inventory") end]] local function get_stack_size(player) - return player:get_meta():get_int("switch_stack") + return player:get_meta():get_int("mcl_inventory:switch_stack") end local function set_stack_size(player, n) - player:get_meta():set_int("switch_stack", n) + player:get_meta():set_int("mcl_inventory:switch_stack", n) end -minetest.register_on_newplayer(function (player) - set_stack_size(player, 64) +minetest.register_on_joinplayer(function (player) + if get_stack_size(player) == 0 then + set_stack_size(player, 64) + end end) function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, show, page, filter) From 7ef6613f0967718463e9be3f1f90f97811d8346a Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 15 Nov 2021 21:39:43 +0100 Subject: [PATCH 216/228] Rename drippingwater mod to mcl_dripping --- .../{drippingwater => mcl_dripping}/init.lua | 0 .../{drippingwater => mcl_dripping}/mod.conf | 0 .../{drippingwater => mcl_dripping}/readme.txt | 0 .../sounds/drippingwater_drip.1.ogg | Bin .../sounds/drippingwater_drip.2.ogg | Bin .../sounds/drippingwater_drip.3.ogg | Bin .../sounds/drippingwater_lavadrip.1.ogg | Bin .../sounds/drippingwater_lavadrip.2.ogg | Bin .../sounds/drippingwater_lavadrip.3.ogg | Bin 9 files changed, 0 insertions(+), 0 deletions(-) rename mods/ENTITIES/{drippingwater => mcl_dripping}/init.lua (100%) rename mods/ENTITIES/{drippingwater => mcl_dripping}/mod.conf (100%) rename mods/ENTITIES/{drippingwater => mcl_dripping}/readme.txt (100%) rename mods/ENTITIES/{drippingwater => mcl_dripping}/sounds/drippingwater_drip.1.ogg (100%) rename mods/ENTITIES/{drippingwater => mcl_dripping}/sounds/drippingwater_drip.2.ogg (100%) rename mods/ENTITIES/{drippingwater => mcl_dripping}/sounds/drippingwater_drip.3.ogg (100%) rename mods/ENTITIES/{drippingwater => mcl_dripping}/sounds/drippingwater_lavadrip.1.ogg (100%) rename mods/ENTITIES/{drippingwater => mcl_dripping}/sounds/drippingwater_lavadrip.2.ogg (100%) rename mods/ENTITIES/{drippingwater => mcl_dripping}/sounds/drippingwater_lavadrip.3.ogg (100%) diff --git a/mods/ENTITIES/drippingwater/init.lua b/mods/ENTITIES/mcl_dripping/init.lua similarity index 100% rename from mods/ENTITIES/drippingwater/init.lua rename to mods/ENTITIES/mcl_dripping/init.lua diff --git a/mods/ENTITIES/drippingwater/mod.conf b/mods/ENTITIES/mcl_dripping/mod.conf similarity index 100% rename from mods/ENTITIES/drippingwater/mod.conf rename to mods/ENTITIES/mcl_dripping/mod.conf diff --git a/mods/ENTITIES/drippingwater/readme.txt b/mods/ENTITIES/mcl_dripping/readme.txt similarity index 100% rename from mods/ENTITIES/drippingwater/readme.txt rename to mods/ENTITIES/mcl_dripping/readme.txt diff --git a/mods/ENTITIES/drippingwater/sounds/drippingwater_drip.1.ogg b/mods/ENTITIES/mcl_dripping/sounds/drippingwater_drip.1.ogg similarity index 100% rename from mods/ENTITIES/drippingwater/sounds/drippingwater_drip.1.ogg rename to mods/ENTITIES/mcl_dripping/sounds/drippingwater_drip.1.ogg diff --git a/mods/ENTITIES/drippingwater/sounds/drippingwater_drip.2.ogg b/mods/ENTITIES/mcl_dripping/sounds/drippingwater_drip.2.ogg similarity index 100% rename from mods/ENTITIES/drippingwater/sounds/drippingwater_drip.2.ogg rename to mods/ENTITIES/mcl_dripping/sounds/drippingwater_drip.2.ogg diff --git a/mods/ENTITIES/drippingwater/sounds/drippingwater_drip.3.ogg b/mods/ENTITIES/mcl_dripping/sounds/drippingwater_drip.3.ogg similarity index 100% rename from mods/ENTITIES/drippingwater/sounds/drippingwater_drip.3.ogg rename to mods/ENTITIES/mcl_dripping/sounds/drippingwater_drip.3.ogg diff --git a/mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.1.ogg b/mods/ENTITIES/mcl_dripping/sounds/drippingwater_lavadrip.1.ogg similarity index 100% rename from mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.1.ogg rename to mods/ENTITIES/mcl_dripping/sounds/drippingwater_lavadrip.1.ogg diff --git a/mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.2.ogg b/mods/ENTITIES/mcl_dripping/sounds/drippingwater_lavadrip.2.ogg similarity index 100% rename from mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.2.ogg rename to mods/ENTITIES/mcl_dripping/sounds/drippingwater_lavadrip.2.ogg diff --git a/mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.3.ogg b/mods/ENTITIES/mcl_dripping/sounds/drippingwater_lavadrip.3.ogg similarity index 100% rename from mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.3.ogg rename to mods/ENTITIES/mcl_dripping/sounds/drippingwater_lavadrip.3.ogg From d2a03ec0b91c7e5580daab13cea2b585501e50d6 Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 15 Nov 2021 21:44:23 +0100 Subject: [PATCH 217/228] Rename entity ids --- mods/ENTITIES/mcl_dripping/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_dripping/init.lua b/mods/ENTITIES/mcl_dripping/init.lua index 45a211d8f..57ba7ecfe 100644 --- a/mods/ENTITIES/mcl_dripping/init.lua +++ b/mods/ENTITIES/mcl_dripping/init.lua @@ -6,7 +6,7 @@ local math = math -- License of code, textures & sounds: CC0 local function register_drop(liquid, glow, sound, nodes) - minetest.register_entity("drippingwater:drop_" .. liquid, { + minetest.register_entity("mcl_dripping:drop_" .. liquid, { hp_max = 1, physical = true, collide_with_objects = false, @@ -56,7 +56,7 @@ local function register_drop(liquid, glow, sound, nodes) if minetest.get_item_group(minetest.get_node(vector.offset(pos, 0, 1, 0)).name, liquid) ~= 0 and minetest.get_node(vector.offset(pos, 0, -1, 0)).name == "air" then local x, z = math.random(-45, 45) / 100, math.random(-45, 45) / 100 - minetest.add_entity(vector.offset(pos, x, -0.520, z), "drippingwater:drop_" .. liquid) + minetest.add_entity(vector.offset(pos, x, -0.520, z), "mcl_dripping:drop_" .. liquid) end end, }) From a9804879e208de4c8774498d05bb17a5ff0facaf Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 15 Nov 2021 21:54:16 +0100 Subject: [PATCH 218/228] Rename drippingwater to mcl_dripping in mod.conf and readme.txt --- mods/ENTITIES/mcl_dripping/mod.conf | 2 +- mods/ENTITIES/mcl_dripping/readme.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mcl_dripping/mod.conf b/mods/ENTITIES/mcl_dripping/mod.conf index 1de118f4c..921d5e59f 100644 --- a/mods/ENTITIES/mcl_dripping/mod.conf +++ b/mods/ENTITIES/mcl_dripping/mod.conf @@ -1,4 +1,4 @@ -name = drippingwater +name = mcl_dripping author = kddekadenz description = Drops are generated rarely under solid nodes depends = mcl_core diff --git a/mods/ENTITIES/mcl_dripping/readme.txt b/mods/ENTITIES/mcl_dripping/readme.txt index f609163ed..afe35608e 100644 --- a/mods/ENTITIES/mcl_dripping/readme.txt +++ b/mods/ENTITIES/mcl_dripping/readme.txt @@ -1,12 +1,12 @@ -Dripping Water Mod +Dripping Mod by kddekadenz -modified for MineClone 2 by Wuzzy +modified for MineClone 2 by Wuzzy and NO11 Installing instructions: - 1. Copy the drippingwater mod folder into games/gamemode/mods + 1. Copy the mcl_dripping mod folder into games/gamemode/mods 2. Start game and enjoy :) From c757e98b4fbd9110d5afbcda53f4fcc37131ea84 Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 17 Nov 2021 00:37:11 +0100 Subject: [PATCH 219/228] Fix #1911, error in lightning callback --- mods/ENVIRONMENT/lightning/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index 83494462f..3579316e8 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -215,7 +215,9 @@ lightning.register_on_strike(function(pos, pos2, objects) posadd = { x=math.cos(angle),y=0,z=math.sin(angle) } posadd = vector.normalize(posadd) local mob = add_entity(vector.add(pos2, posadd), "mobs_mc:skeleton") - mob:set_yaw(angle-math.pi/2) + if mob then + mob:set_yaw(angle-math.pi/2) + end angle = angle + (math.pi*2) / 3 end From 9919011aca6fbcf9cbb086d8260e4da0d1de3625 Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 17 Nov 2021 16:43:48 +0100 Subject: [PATCH 220/228] Fix enchanted books losing their enchantments in creative inventory --- mods/HUD/mcl_inventory/creative.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index d2dedd556..76139160b 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -695,8 +695,9 @@ minetest.register_on_joinplayer(function(player) end) minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) - if minetest.is_creative_enabled(player:get_player_name()) and action == "put" and inventory_info.listname == "main" and get_stack_size(player) == 64 then - local stack = inventory_info.stack - player:get_inventory():set_stack("main", inventory_info.index, stack:get_name() .. " " .. stack:get_stack_max()) + local stack = inventory_info.stack + local item = stack:get_name() + if minetest.is_creative_enabled(player:get_player_name()) and action == "put" and inventory_info.listname == "main" and get_stack_size(player) == 64 and not item:find("mcl_enchanting:book_enchanted") then + player:get_inventory():set_stack("main", inventory_info.index, item .. " " .. stack:get_stack_max()) end end) \ No newline at end of file From 30528b0a2c4fb0cd54f30dfe0ba38d568a2f9b18 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 17 Nov 2021 18:25:12 +0100 Subject: [PATCH 221/228] Fix crash when opening a chest with an unknown node on top --- mods/ITEMS/mcl_chests/init.lua | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 69f6a601d..7a0e54c69 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -608,10 +608,12 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile on_rightclick = function(pos, node, clicker) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") - if minetest.registered_nodes[minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name].groups.opaque == 1 - or minetest.registered_nodes[minetest.get_node({x = pos_other.x, y = pos_other.y + 1, z = pos_other.z}).name].groups.opaque == 1 then - -- won't open if there is no space from the top - return false + local above_def = minetest.registered_nodes[minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name] + local above_def_other = minetest.registered_nodes[minetest.get_node({x = pos_other.x, y = pos_other.y + 1, z = pos_other.z}).name] + + if not above_def or above_def.groups.opaque == 1 or not above_def_other or above_def_other.groups.opaque == 1 then + -- won't open if there is no space from the top + return false end local name = minetest.get_meta(pos):get_string("name") From 903d1777be98e62e1f9c11aedcda8236688dc796 Mon Sep 17 00:00:00 2001 From: NO11 Date: Thu, 18 Nov 2021 17:40:32 +0100 Subject: [PATCH 222/228] Use set_count instead of creating a new item and checking for enchanted books --- mods/HUD/mcl_inventory/creative.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 76139160b..f5a9574eb 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -695,9 +695,9 @@ minetest.register_on_joinplayer(function(player) end) minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) - local stack = inventory_info.stack - local item = stack:get_name() - if minetest.is_creative_enabled(player:get_player_name()) and action == "put" and inventory_info.listname == "main" and get_stack_size(player) == 64 and not item:find("mcl_enchanting:book_enchanted") then - player:get_inventory():set_stack("main", inventory_info.index, item .. " " .. stack:get_stack_max()) + if minetest.is_creative_enabled(player:get_player_name()) and get_stack_size(player) == 64 and action == "put" and inventory_info.listname == "main" then + local stack = inventory_info.stack + stack:set_count(stack:get_stack_max()) + player:get_inventory():set_stack("main", inventory_info.index, stack) end -end) \ No newline at end of file +end) From b0aceae73dbfc3405b4b3a3d0db63e759e9a48f1 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Fri, 19 Nov 2021 15:22:40 +0100 Subject: [PATCH 223/228] Fix reference dupe glitches --- mods/ITEMS/mcl_chests/init.lua | 4 ++-- mods/ITEMS/mcl_furnaces/init.lua | 4 ++-- mods/ITEMS/mcl_hoppers/init.lua | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 7a0e54c69..d87ae2a1d 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -293,7 +293,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile local function drop_items_chest(pos, oldnode, oldmetadata) local meta = minetest.get_meta(pos) - local meta2 = meta + local meta2 = meta:to_table() if oldmetadata then meta:from_table(oldmetadata) end @@ -305,7 +305,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile minetest.add_item(p, stack) end end - meta:from_table(meta2:to_table()) + meta:from_table(meta2) end local function on_chest_blast(pos) diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index dca476762..9f836d161 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -461,7 +461,7 @@ minetest.register_node("mcl_furnaces:furnace", { on_timer = furnace_node_timer, after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) - local meta2 = meta + local meta2 = meta:to_table() meta:from_table(oldmetadata) local inv = meta:get_inventory() for _, listname in ipairs({"src", "dst", "fuel"}) do @@ -471,7 +471,7 @@ minetest.register_node("mcl_furnaces:furnace", { minetest.add_item(p, stack) end end - meta:from_table(meta2:to_table()) + meta:from_table(meta2) end, on_construct = function(pos) diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index 9defa26ca..f9ba1a8c8 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -61,7 +61,7 @@ local def_hopper = { after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) - local meta2 = meta + local meta2 = meta:to_table() meta:from_table(oldmetadata) local inv = meta:get_inventory() for i=1,inv:get_size("main") do @@ -71,7 +71,7 @@ local def_hopper = { minetest.add_item(p, stack) end end - meta:from_table(meta2:to_table()) + meta:from_table(meta2) end, allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) local name = player:get_player_name() From 46394e7e1f82856c9c9de262857bb08c2d8ea820 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Wed, 17 Nov 2021 18:03:45 +0100 Subject: [PATCH 224/228] Add obsidian boat that always sinks --- mods/ENTITIES/mcl_boats/init.lua | 11 ++++++----- .../textures/mcl_boats_obsidian_boat.png | Bin 0 -> 264 bytes .../textures/mcl_boats_texture_obsidian_boat.png | Bin 0 -> 535 bytes 3 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 mods/ENTITIES/mcl_boats/textures/mcl_boats_obsidian_boat.png create mode 100644 mods/ENTITIES/mcl_boats/textures/mcl_boats_texture_obsidian_boat.png diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index f46c14d46..beff5fb52 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -342,7 +342,8 @@ function boat.on_step(self, dtime, moveresult) self.object:get_velocity().y) else p.y = p.y + 1 - if is_water(p) then + local is_obsidian_boat = self.object:get_luaentity()._itemstring == "mcl_boats:boat_obsidian" + if is_water(p) or is_obsidian_boat then -- Inside water: Slowly sink local y = self.object:get_velocity().y y = y - 0.01 @@ -382,13 +383,13 @@ end -- Register one entity for all boat types minetest.register_entity("mcl_boats:boat", boat) -local boat_ids = { "boat", "boat_spruce", "boat_birch", "boat_jungle", "boat_acacia", "boat_dark_oak" } -local names = { S("Oak Boat"), S("Spruce Boat"), S("Birch Boat"), S("Jungle Boat"), S("Acacia Boat"), S("Dark Oak Boat") } +local boat_ids = { "boat", "boat_spruce", "boat_birch", "boat_jungle", "boat_acacia", "boat_dark_oak", "boat_obsidian" } +local names = { S("Oak Boat"), S("Spruce Boat"), S("Birch Boat"), S("Jungle Boat"), S("Acacia Boat"), S("Dark Oak Boat"), S("Obsidian Boat") } local craftstuffs = {} if minetest.get_modpath("mcl_core") then - craftstuffs = { "mcl_core:wood", "mcl_core:sprucewood", "mcl_core:birchwood", "mcl_core:junglewood", "mcl_core:acaciawood", "mcl_core:darkwood" } + craftstuffs = { "mcl_core:wood", "mcl_core:sprucewood", "mcl_core:birchwood", "mcl_core:junglewood", "mcl_core:acaciawood", "mcl_core:darkwood", "mcl_core:obsidian" } end -local images = { "oak", "spruce", "birch", "jungle", "acacia", "dark_oak" } +local images = { "oak", "spruce", "birch", "jungle", "acacia", "dark_oak", "obsidian" } for b=1, #boat_ids do local itemstring = "mcl_boats:"..boat_ids[b] diff --git a/mods/ENTITIES/mcl_boats/textures/mcl_boats_obsidian_boat.png b/mods/ENTITIES/mcl_boats/textures/mcl_boats_obsidian_boat.png new file mode 100644 index 0000000000000000000000000000000000000000..6ae10c0c4b4dfd9e13a5008aa3a60c15d85b2930 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDUWnt!GW8vjw7vbj<6Xi2d zmkKS7o4>X9B}5!9sH39;5nrED<_XlxQ4-`A45Yze`}3fMKt{c%i(?3ftmwgwoJ@ui ztPif=c-}efU4n(*27z}61VyG7a$J78Q1Zb82c7&jorJD>=5~Xhb|uf(y)4`@;Z9HX zmo@L?+0T0&Jox_1lrs;yS6vrZH`P3JX383uGm)3_J1d?m*@_yT+_Z%KnQQOiC2AHv oTq@g{`yQ35$bO5s%XZ-}V|t54)E+nOa*&%mUHx3vIVCg!0P{jy^8f$< literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mcl_boats/textures/mcl_boats_texture_obsidian_boat.png b/mods/ENTITIES/mcl_boats/textures/mcl_boats_texture_obsidian_boat.png new file mode 100644 index 0000000000000000000000000000000000000000..af3c24b30e5fa0fa9937cf9f874aa43651924013 GIT binary patch literal 535 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!VDx8ekAz-DT4r?5LXsvE;bfkPIeJ~J~2@~ z19hp;(zy9sdtc%bm*bgZ1=Pz?666;Qq`_eO^Pq(c42*rAE{-7)hu>b`>vcFmB&)BTM(WJn$tN6`~Ce68JJ%+6dvU?1dC3sEtQoH{C zd;GU~xl;o<9tg#6^V-b#U|GB3vx?W}_R9x1tYJ=(iDs4f)*yRBi{Y4f85d83(gX!b zld_*DmOP)3!*^gGbF?eNgLUlL_D&)nId5o1vMVy&(E4`YzUYtiX1}I=t5&U={^gD! zgQ|Mf{HaD#droHnrDt9`d3m;_#ir7iwi#PbtHj@wYMuDjNWD5>_T1vDHLlsKR{cD6 z$o50%?BlCSeW>F z^0(Cj;o%$Q4RY`8e0wnK9QR{ehv&C%&l5LGv5)xu`H=jJgXZyfO;s;w_FM) Date: Sun, 21 Nov 2021 22:13:24 -0300 Subject: [PATCH 225/228] Fix mobs spawn count --- mods/ITEMS/mcl_mobspawners/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index 6e4b24c96..0795fb611 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -230,7 +230,7 @@ local function spawn_mobs(pos, elapsed) -- spawn up to 4 mobs in random air blocks if air then - local max = 200 + local max = 4 if spawn_count_overrides[mob] then max = spawn_count_overrides[mob] end From d3015edeb9489d8a046cd3a635acc7bff14db8f5 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 29 Nov 2021 19:12:49 +0100 Subject: [PATCH 226/228] Fix reference dupes for droppers and dispensers --- mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 4 ++-- mods/ITEMS/REDSTONE/mcl_droppers/init.lua | 4 ++-- mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 47acacbb9..0cd0608c4 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -82,7 +82,7 @@ local dispenserdef = { end, after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) - local meta2 = meta + local meta2 = meta:to_table() meta:from_table(oldmetadata) local inv = meta:get_inventory() for i=1, inv:get_size("main") do @@ -92,7 +92,7 @@ local dispenserdef = { minetest.add_item(p, stack) end end - meta:from_table(meta2:to_table()) + meta:from_table(meta2) end, _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua index b5bcc1d08..abb351091 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua @@ -55,7 +55,7 @@ local dropperdef = { sounds = mcl_sounds.node_sound_stone_defaults(), after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) - local meta2 = meta + local meta2 = meta:to_table() meta:from_table(oldmetadata) local inv = meta:get_inventory() for i=1, inv:get_size("main") do @@ -65,7 +65,7 @@ local dropperdef = { minetest.add_item(p, stack) end end - meta:from_table(meta2:to_table()) + meta:from_table(meta2) end, allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) local name = player:get_player_name() diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua index 5409e6abc..bd8c0a3c3 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua @@ -53,7 +53,7 @@ local dropperdef = { sounds = mcl_sounds.node_sound_stone_defaults(), after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) - local meta2 = meta + local meta2 = meta:to_table() meta:from_table(oldmetadata) local inv = meta:get_inventory() for i=1, inv:get_size("main") do @@ -63,7 +63,7 @@ local dropperdef = { minetest.add_item(p, stack) end end - meta:from_table(meta2:to_table()) + meta:from_table(meta2) end, allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) local name = player:get_player_name() From e6b200aaf3b0a56860272a57012f24ccfa7182ff Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 2 Dec 2021 16:19:59 +0100 Subject: [PATCH 227/228] Fix access to ender inventory without an ender chest --- mods/ITEMS/mcl_chests/init.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index d87ae2a1d..ad5c781f7 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -1055,6 +1055,20 @@ minetest.register_on_joinplayer(function(player) inv:set_size("enderchest", 9*3) end) +minetest.register_allow_player_inventory_action(function(player, action, inv, info) + if inv:get_location().type == "player" and ( + action == "move" and (info.from_list == "enderchest" or info.to_list == "enderchest") + or action == "put" and info.listname == "enderchest" + or action == "take" and info.listname == "enderchest" + ) then + local def = player:get_wielded_item():get_definition() + + if not minetest.find_node_near(player:get_pos(), def and def.range or ItemStack():get_definition().range, "mcl_chests:ender_chest_small", true) then + return 0 + end + end +end) + minetest.register_craft({ output = "mcl_chests:ender_chest", recipe = { From 92686e5412b593776bcc9c5568c94e0aea23a8eb Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 2 Dec 2021 17:28:19 +0100 Subject: [PATCH 228/228] Fix broken mcl_util.calculate_durability --- mods/CORE/mcl_util/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index d91c86f09..d548f6cac 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -478,7 +478,9 @@ function mcl_util.calculate_durability(itemstack) end end end - uses = uses or (next(itemstack:get_tool_capabilities().groupcaps) or {}).uses + + local _, groupcap = next(itemstack:get_tool_capabilities().groupcaps) + uses = uses or (groupcap or {}).uses end return uses or 0