From 4f3137a8e1dd39c9a35ac2069e50291e6cf31839 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 9 Dec 2020 21:00:03 +0100 Subject: [PATCH] Inventory UI improvements --- README.md | 2 + enchanting_idea.txt | 13 +++ mods/armor/depends.txt | 3 +- mods/armor/init.lua | 12 ++- mods/{too_many_items => inventory}/init.lua | 81 ++++++++++++------ .../inventory_empty_armor_slot_feet.png | Bin 0 -> 102 bytes .../inventory_empty_armor_slot_head.png | Bin 0 -> 117 bytes .../inventory_empty_armor_slot_legs.png | Bin 0 -> 114 bytes .../inventory_empty_armor_slot_torso.png | Bin 0 -> 110 bytes mods/pbm/init.lua | 1 - todo.txt | 2 +- 11 files changed, 83 insertions(+), 31 deletions(-) create mode 100644 enchanting_idea.txt rename mods/{too_many_items => inventory}/init.lua (75%) create mode 100644 mods/inventory/textures/inventory_empty_armor_slot_feet.png create mode 100644 mods/inventory/textures/inventory_empty_armor_slot_head.png create mode 100644 mods/inventory/textures/inventory_empty_armor_slot_legs.png create mode 100644 mods/inventory/textures/inventory_empty_armor_slot_torso.png delete mode 100644 mods/pbm/init.lua diff --git a/README.md b/README.md index bdcbb0f..f3df32a 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,8 @@ max_packets_per_iteration = 10096 ## Alpha 0.07 > RailRoad Tech +- Added Suffocation +- The /home command requires a priv now - Added in better minecart algorithm - Added in ability to link minecarts - Added in train wrench diff --git a/enchanting_idea.txt b/enchanting_idea.txt new file mode 100644 index 0000000..0defc57 --- /dev/null +++ b/enchanting_idea.txt @@ -0,0 +1,13 @@ +Enchanting System +----------------- + +My idea for an enchanting system is to introduce runes. Runes work similar to enchanted books in Minecraft: They hold a specific enchantment and they can be applied to an item. +To create a specific rune, (e.g. the "Luck" rune) you need to obtain 3 items determined by the enchanting recipe for that rune (e.g rabbit's paw, a rare rabbit drop, clover, +a plant that has a small chance of getting generated and a horseshoe, craftable using iron) using an artifact. An artifact is a rare structure that has a type and a level, the +type depends on the biome the artifact was generated in (e.g. Snow Artifact in the Snowy biome) and the level depends on the distance to spawn as well as a good portion of luck. +Artifacts generate destroyed, meaning that you'll need a random amount of ressources (gold, ruby, emerald, etc.) to repair it. Artifacts with higher levels require more ressources. +The level of the rune depends on the level of the artifact. To melt items together a special fuel is required; maybe something from the nether (like blaze dust or glowstone). +Every artifact only supports certain runes (e.g to get the fire rune which works like fire aspect you'll need to find a Nether Artifact). To apply a rune to an item you'll need +to place the rune into the world, activate it by rightclicking it (costs xp levels!) and then drop an item on top of it. After 30 seconds or so (and some spooky noises) the rune +explodes and the item is thrown out of it. The rune has a small (!!) chance to drop and level up by an insane amount (like times 10). +All in all, enchantments are not easy to get, so their effect should be pretty OP. diff --git a/mods/armor/depends.txt b/mods/armor/depends.txt index 3cb10fe..45bf5db 100644 --- a/mods/armor/depends.txt +++ b/mods/armor/depends.txt @@ -1,3 +1,4 @@ skins player_api -new_functions \ No newline at end of file +new_functions +inventory diff --git a/mods/armor/init.lua b/mods/armor/init.lua index 89066c9..4062328 100644 --- a/mods/armor/init.lua +++ b/mods/armor/init.lua @@ -15,7 +15,7 @@ local player_skin local armor_skin local stack local skin_element -function recalculate_armor(player) +function recalculate_armor(player, reload_inv) if not player or (player and not player:is_player()) then return end @@ -48,6 +48,12 @@ function recalculate_armor(player) armor_skin = armor_skin.."^"..skin_element end player:set_properties({textures = {player_skin,armor_skin}}) + + if reload_inv then + inventory.reload(player) + else + inventory.set(player) + end end local inv @@ -216,7 +222,7 @@ local acceptable = { minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) if acceptable[inventory_info.from_list] or acceptable[inventory_info.to_list] then minetest.after(0,function() - recalculate_armor(player) + recalculate_armor(player, true) set_armor_gui(player) end) end @@ -340,4 +346,4 @@ for material_id,material in pairs(materials) do end end -end \ No newline at end of file +end diff --git a/mods/too_many_items/init.lua b/mods/inventory/init.lua similarity index 75% rename from mods/too_many_items/init.lua rename to mods/inventory/init.lua index 5596188..9488aa7 100644 --- a/mods/too_many_items/init.lua +++ b/mods/inventory/init.lua @@ -1,6 +1,8 @@ local minetest,pairs = minetest,pairs +inventory = {} local tmi_master_inventory = {} +local is_crafting = {} local pool = {} local max = 7*7 --2x2 formspec @@ -112,7 +114,7 @@ local output_constant = "listcolors[#8b8a89;#c9c3c6;#3e3d3e;#000000;#FFFFFF]".. "list[current_player;main;0,4.5;9,1;]".. --hot bar "list[current_player;main;0,6;9,3;9]".. --main inventory -"button[5,3.5;1,1;toomanyitems.back;back]" --back button +"button[5,3.5;1,1;inventory.back;back]" --back button local output local recipe local usable_recipe @@ -168,14 +170,24 @@ end local function cheat_button(name) if pool[name] and pool[name].cheating then - return "button[11.5,7.6;2,2;toomanyitems.cheat;cheat:on]" + return "button[12.75,7.6;2,2;inventory.cheat;cheat:on]" elseif minetest.check_player_privs(name, {give = true}) then - return "button[11.5,7.6;2,2;toomanyitems.cheat;cheat:off]" + return "button[12.75,7.6;2,2;inventory.cheat;cheat:off]" else return "" end end +local function empty_armor_slots(player) + local fs = "formspec_version[3]" + local inv = player:get_inventory() + for i, comp in ipairs({"head", "torso", "legs", "feet"}) do + if inv:get_stack("armor_" .. comp, 1):get_name() == "" then + fs = fs .. "image[0.25," .. (i - 1) .. ";1,1;inventory_empty_armor_slot_" .. comp .. ".png]" + end + end + return fs +end local form local id @@ -195,32 +207,35 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) elseif formname == "crafting" then form = crafting_table_inv id = "crafting" + if fields.quit then + is_crafting[name] = nil + end end --"next" button - if fields["toomanyitems.next"] then + if fields["inventory.next"] then temp_pool.page = temp_pool.page + 1 --page loops back to first if temp_pool.page > tmi_master_inventory.page_limit then temp_pool.page = 1 end - minetest.show_formspec(name,id, form..tmi_master_inventory["page_"..temp_pool.page]..cheat_button(name)) + minetest.show_formspec(name,id, form..empty_armor_slots(player)..tmi_master_inventory["page_"..temp_pool.page]..cheat_button(name)) minetest.sound_play("lever", {to_player = name,gain=0.7}) - player:set_inventory_formspec(base_inv..tmi_master_inventory["page_"..temp_pool.page]..cheat_button(name)) + player:set_inventory_formspec(base_inv..empty_armor_slots(player)..tmi_master_inventory["page_"..temp_pool.page]..cheat_button(name)) --"prev" button - elseif fields["toomanyitems.prev"] then + elseif fields["inventory.prev"] then temp_pool.page = temp_pool.page - 1 --page loops back to end if temp_pool.page < 1 then temp_pool.page = tmi_master_inventory.page_limit end - minetest.show_formspec(name,id, form..tmi_master_inventory["page_"..temp_pool.page]..cheat_button(name)) + minetest.show_formspec(name,id, form..empty_armor_slots(player)..tmi_master_inventory["page_"..temp_pool.page]..cheat_button(name)) minetest.sound_play("lever", {to_player = name,gain=0.7}) - player:set_inventory_formspec(base_inv..tmi_master_inventory["page_"..temp_pool.page]..cheat_button(name)) - elseif fields["toomanyitems.back"] then + player:set_inventory_formspec(base_inv..empty_armor_slots(player)..tmi_master_inventory["page_"..temp_pool.page]..cheat_button(name)) + elseif fields["inventory.back"] then - minetest.show_formspec(name,id, form..tmi_master_inventory["page_"..temp_pool.page]..cheat_button(name)) + minetest.show_formspec(name,id, form..empty_armor_slots(player)..tmi_master_inventory["page_"..temp_pool.page]..cheat_button(name)) minetest.sound_play("lever", {to_player = name,gain=0.7}) --this resets the craft table elseif fields.quit then @@ -229,23 +244,23 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) inv:set_width("craft", 2) inv:set_size("craft", 4) --reset the player inv - --minetest.show_formspec(name,id, form..tmi_master_inventory["page_"..temp_pool.page]..cheat_button(name)) - elseif fields["toomanyitems.cheat"] then + --minetest.show_formspec(name,id, form..empty_armor_slots(player)..tmi_master_inventory["page_"..temp_pool.page]..cheat_button(name)) + elseif fields["inventory.cheat"] then --check if the player has the give priv if (not temp_pool.cheating and minetest.get_player_privs(name).give == true) or temp_pool.cheating == true then temp_pool.cheating = not temp_pool.cheating - minetest.show_formspec(name,id, form..tmi_master_inventory["page_"..temp_pool.page]..cheat_button(name)) + minetest.show_formspec(name,id, form..empty_armor_slots(player)..tmi_master_inventory["page_"..temp_pool.page]..cheat_button(name)) minetest.sound_play("lever", {to_player = name,gain=0.7}) - player:set_inventory_formspec(base_inv..tmi_master_inventory["page_"..temp_pool.page]..cheat_button(name)) + player:set_inventory_formspec(base_inv..empty_armor_slots(player)..tmi_master_inventory["page_"..temp_pool.page]..cheat_button(name)) else minetest.chat_send_player(name, "Sorry m8, server says I can't let you do that :(") minetest.sound_play("lever", {to_player = name,gain=0.7,pitch=0.7}) end --this is the "cheating" aka giveme function and craft recipe - elseif fields and type(fields) == "table" and string.match(next(fields),"toomanyitems.") then + elseif fields and type(fields) == "table" and string.match(next(fields),"inventory.") then - item = string.gsub(next(fields), "toomanyitems.", "") + item = string.gsub(next(fields), "inventory.", "") stack = ItemStack(item.." 64") inv = player:get_inventory() if temp_pool.cheating and minetest.get_player_privs(name).give then @@ -256,7 +271,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) minetest.sound_play("pickup", {to_player = name,gain=0.7,pitch = math.random(60,100)/100}) --no room for item else - minetest.chat_send_player(name, "Might want to clear your inventory") + minetest.chat_send_player(name, "Might want to clean up your inventory") minetest.sound_play("lever", {to_player = name,gain=0.7,pitch=0.7}) end @@ -264,7 +279,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) else craft_inv = create_craft_formspec(item) if craft_inv and craft_inv ~= "" then - minetest.show_formspec(name, id, tmi_master_inventory["page_"..temp_pool.page]..craft_inv..cheat_button(name)) + minetest.show_formspec(name, id, empty_armor_slots(player)..tmi_master_inventory["page_"..temp_pool.page]..craft_inv..cheat_button(name)) minetest.sound_play("lever", {to_player = name,gain=0.7}) end end @@ -302,7 +317,7 @@ table.sort(all_items_table) tmi_master_inventory["page_"..page] = "size[17.2,8.75]background[-0.19,-0.25;9.41,9.49;crafting_inventory_workbench.png]" for _,item in pairs(all_items_table) do - tmi_master_inventory["page_"..page] = tmi_master_inventory["page_"..page].."item_image_button["..(9.25+x)..","..y..";1,1;"..item..";toomanyitems."..item..";]" + tmi_master_inventory["page_"..page] = tmi_master_inventory["page_"..page].."item_image_button["..(9.25+x)..","..y..";1,1;"..item..";inventory."..item..";]" x = x + 1 if x > 7 then x = 0 @@ -318,10 +333,10 @@ end --add buttons and labels for i = 1,page do --set the last page - tmi_master_inventory["page_"..i] = tmi_master_inventory["page_"..i].."button[9.25,7.6;2,2;toomanyitems.prev;prev]".. - "button[15.25,7.6;2,2;toomanyitems.next;next]".. + tmi_master_inventory["page_"..i] = tmi_master_inventory["page_"..i].."button[9.25,7.6;2,2;inventory.prev;prev]".. + "button[15.25,7.6;2,2;inventory.next;next]".. --this is +1 so it makes more sense - "label[13.75,8.25;page "..i.."/"..page.."]" + "label[11.5,8.25;page "..i.."/"..page.."]" end tmi_master_inventory.page_limit = page @@ -333,14 +348,29 @@ local temp_pool minetest.override_item("craftingtable:craftingtable", { on_rightclick = function(pos, node, player, itemstack) name = player:get_player_name() + is_crafting[name] = true temp_pool = pool[name] player:get_inventory():set_width("craft", 3) player:get_inventory():set_size("craft", 9) - minetest.show_formspec(name, "crafting", crafting_table_inv..tmi_master_inventory["page_"..temp_pool.page]..cheat_button(name)) + minetest.show_formspec(name, "crafting", crafting_table_inv..empty_armor_slots(player)..tmi_master_inventory["page_"..temp_pool.page]..cheat_button(name)) end }) end) +function inventory.set(player) + player:set_inventory_formspec(base_inv..empty_armor_slots(player)..tmi_master_inventory["page_1"]..cheat_button(player:get_player_name())) +end + +function inventory.reload(player) + inventory.set(player) + local name = player:get_player_name() + if is_crafting[name] then + minetest.show_formspec(name, "crafting", crafting_table_inv..empty_armor_slots(player)..tmi_master_inventory["page_1"]..cheat_button(name)) + else + minetest.show_formspec(name, "", base_inv..empty_armor_slots(player)..tmi_master_inventory["page_1"]..cheat_button(name)) + end +end + --set new players inventory up local name @@ -360,7 +390,7 @@ minetest.register_on_joinplayer(function(player) inv:set_size("main", 9*4) inv:set_size("craft", 4) - player:set_inventory_formspec(base_inv..tmi_master_inventory["page_1"]..cheat_button(name)) + inventory.set(player) player:hud_set_hotbar_itemcount(9) player:hud_set_hotbar_image("inventory_hotbar.png") @@ -371,4 +401,5 @@ local name minetest.register_on_leaveplayer(function(player) name = player:get_player_name() pool[name] = nil + is_crafting[name] = nil end) diff --git a/mods/inventory/textures/inventory_empty_armor_slot_feet.png b/mods/inventory/textures/inventory_empty_armor_slot_feet.png new file mode 100644 index 0000000000000000000000000000000000000000..cb9f2bec3d532491036d7abe257137f28418e768 GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`x}GkMAr*|t2e{l0)(afd^ouY~ z{AOVGz;M1%B^8v|F6tcziZGT0 z`2{mLJiCzw7cV!^=1^ph5;u LS3j3^P6cW6C*=03+L4Mh?ax)8HJ2oo#>A9gD6o9P*q|&~{K{u^9uy#<#kcFJ61j4K#qk)78&q Iol`;+0Qp-X4*&oF literal 0 HcmV?d00001 diff --git a/mods/pbm/init.lua b/mods/pbm/init.lua deleted file mode 100644 index 0941677..0000000 --- a/mods/pbm/init.lua +++ /dev/null @@ -1 +0,0 @@ ---this is like abm but it only happens when a user places a node \ No newline at end of file diff --git a/todo.txt b/todo.txt index 1f1308c..0d3cb69 100644 --- a/todo.txt +++ b/todo.txt @@ -7,7 +7,7 @@ - Sprinting - Rebalancing of ore generation probabilities and tool speeds - More sophisticated particle effects -- Season effects (only affecting audiovisuals) +- Season effects (only affecting audiovisuals like textures and music) - Add two new biomes, each with individual trees, exclusive mobs and structures and a boss fight - Fix creative inventory to not overstack items - Add Oil -- 2.44.0