From fefd091516f5e601ed5d28720aec84c6261de000 Mon Sep 17 00:00:00 2001 From: Beha Date: Wed, 4 Jan 2017 19:49:42 -0500 Subject: [PATCH] Add bones, beginning of magic. --- bones/README.txt | 17 ++ bones/depends.txt | 2 + bones/init.lua | 235 ++++++++++++++++++ bones/textures/bones_bottom.png | Bin 0 -> 181 bytes bones/textures/bones_front.png | Bin 0 -> 183 bytes bones/textures/bones_rear.png | Bin 0 -> 187 bytes bones/textures/bones_side.png | Bin 0 -> 188 bytes bones/textures/bones_top.png | Bin 0 -> 182 bytes kingdoms/barriers.lua | 2 +- kingdoms/corestone.lua | 8 + kingdoms/depends.txt | 1 + kingdoms/ext/silver.lua | 95 +++++++ kingdoms/gen.lua | 2 + kingdoms/init.lua | 5 + kingdoms/kingdom.lua | 25 +- kingdoms/player.lua | 1 + .../textures/kingdoms_materialized_final.png | Bin 0 -> 782 bytes kingdoms/textures/kingdoms_mineral_silver.png | Bin 0 -> 237 bytes kingdoms/textures/kingdoms_silver_block.png | Bin 0 -> 436 bytes kingdoms/textures/kingdoms_silver_ingot.png | Bin 0 -> 368 bytes kingdoms/textures/kingdoms_silver_lump.png | Bin 0 -> 293 bytes kingdoms/textures/ui_kingdoms_icon.png | Bin 0 -> 221 bytes kingdoms_ui/depends.txt | 2 + kingdoms_ui/init.lua | 11 + magic/crafts.lua | 8 + magic/crystals.lua | 105 ++++++++ magic/init.lua | 4 + magic/spells.lua | 0 magic/textures/magic_crystal.png | Bin 0 -> 3535 bytes magic/textures/magic_essence.png | Bin 0 -> 3464 bytes 30 files changed, 510 insertions(+), 13 deletions(-) create mode 100644 bones/README.txt create mode 100644 bones/depends.txt create mode 100644 bones/init.lua create mode 100644 bones/textures/bones_bottom.png create mode 100644 bones/textures/bones_front.png create mode 100644 bones/textures/bones_rear.png create mode 100644 bones/textures/bones_side.png create mode 100644 bones/textures/bones_top.png create mode 100644 kingdoms/ext/silver.lua create mode 100644 kingdoms/textures/kingdoms_materialized_final.png create mode 100644 kingdoms/textures/kingdoms_mineral_silver.png create mode 100644 kingdoms/textures/kingdoms_silver_block.png create mode 100644 kingdoms/textures/kingdoms_silver_ingot.png create mode 100644 kingdoms/textures/kingdoms_silver_lump.png create mode 100644 kingdoms/textures/ui_kingdoms_icon.png create mode 100644 kingdoms_ui/depends.txt create mode 100644 kingdoms_ui/init.lua create mode 100644 magic/crafts.lua create mode 100644 magic/crystals.lua create mode 100644 magic/spells.lua create mode 100644 magic/textures/magic_crystal.png create mode 100644 magic/textures/magic_essence.png diff --git a/bones/README.txt b/bones/README.txt new file mode 100644 index 0000000..b40a384 --- /dev/null +++ b/bones/README.txt @@ -0,0 +1,17 @@ +Minetest Game mod: bones +======================== + +License of source code: +----------------------- +Copyright (C) 2012 PilzAdam + +WTFPL + +License of media (textures and sounds) +-------------------------------------- +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +http://creativecommons.org/licenses/by-sa/3.0/ + +Authors of media files +---------------------- +Bad_Command_ diff --git a/bones/depends.txt b/bones/depends.txt new file mode 100644 index 0000000..088f357 --- /dev/null +++ b/bones/depends.txt @@ -0,0 +1,2 @@ +default +kingdoms diff --git a/bones/init.lua b/bones/init.lua new file mode 100644 index 0000000..2b475db --- /dev/null +++ b/bones/init.lua @@ -0,0 +1,235 @@ +-- Minetest 0.4 mod: bones +-- See README.txt for licensing and other information. + +bones = {} + +local function is_owner(pos, name) + local akingdom = kingdoms.bypos(pos) + local owner = minetest.get_meta(pos):get_string("owner") + if not akingdom or minetest.check_player_privs(name, "protection_bypass") or owner == "" or owner == name or kingdoms.player.can(name, "heavy_chests") then + return true + end + return false +end + +bones.bones_formspec = + "size[8,9]" .. + default.gui_bg .. + default.gui_bg_img .. + default.gui_slots .. + "list[current_name;main;0,0.3;8,4;]" .. + "list[current_player;main;0,4.85;8,1;]" .. + "list[current_player;main;0,6.08;8,3;8]" .. + "listring[current_name;main]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0,4.85) + +local share_bones_time = tonumber(minetest.setting_get("share_bones_time")) or 1200 +local share_bones_time_early = tonumber(minetest.setting_get("share_bones_time_early")) or share_bones_time / 4 + +minetest.register_node("bones:bones", { + description = "Bones", + tiles = { + "bones_top.png", + "bones_bottom.png", + "bones_side.png", + "bones_side.png", + "bones_rear.png", + "bones_front.png" + }, + paramtype2 = "facedir", + groups = {dig_immediate=2}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_gravel_footstep", gain=0.5}, + dug = {name="default_gravel_footstep", gain=1.0}, + }), + + can_dig = function(pos, player) + local inv = minetest.get_meta(pos):get_inventory() + local name = "" + if player then + name = player:get_player_name() + end + return is_owner(pos, name) and inv:is_empty("main") + end, + + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + if is_owner(pos, player:get_player_name()) then + return count + end + return 0 + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + return 0 + end, + + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if is_owner(pos, player:get_player_name()) then + return stack:get_count() + end + return 0 + end, + + on_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if meta:get_inventory():is_empty("main") then + minetest.remove_node(pos) + end + end, + + on_punch = function(pos, node, player) + if(not is_owner(pos, player:get_player_name())) then + return + end + + if(minetest.get_meta(pos):get_string("infotext") == "") then + return + end + + local inv = minetest.get_meta(pos):get_inventory() + local player_inv = player:get_inventory() + local has_space = true + + for i=1,inv:get_size("main") do + local stk = inv:get_stack("main", i) + if player_inv:room_for_item("main", stk) then + inv:set_stack("main", i, nil) + player_inv:add_item("main", stk) + else + has_space = false + break + end + end + + -- remove bones if player emptied them + if has_space then + if player_inv:room_for_item("main", {name = "bones:bones"}) then + player_inv:add_item("main", {name = "bones:bones"}) + else + minetest.add_item(pos,"bones:bones") + end + minetest.remove_node(pos) + end + end, + + on_timer = function(pos, elapsed) + local meta = minetest.get_meta(pos) + local time = meta:get_int("time") + elapsed + if time >= share_bones_time then + meta:set_string("infotext", meta:get_string("owner").."'s old bones") + meta:set_string("owner", "") + else + meta:set_int("time", time) + return true + end + end, +}) + +local function may_replace(pos, player) + local node_name = minetest.get_node(pos).name + local node_definition = minetest.registered_nodes[node_name] + + -- if the node is unknown, we let the protection mod decide + -- this is consistent with when a player could dig or not dig it + -- unknown decoration would often be removed + -- while unknown building materials in use would usually be left + if not node_definition then + -- only replace nodes that are not protected + return not minetest.is_protected(pos, player:get_player_name()) + end + + -- allow replacing air and liquids + if node_name == "air" or node_definition.liquidtype ~= "none" then + return true + end + + -- don't replace filled chests and other nodes that don't allow it + local can_dig_func = node_definition.can_dig + if can_dig_func and not can_dig_func(pos, player) then + return false + end + + -- default to each nodes buildable_to; if a placed block would replace it, why shouldn't bones? + -- flowers being squished by bones are more realistical than a squished stone, too + -- exception are of course any protected buildable_to + return node_definition.buildable_to and not minetest.is_protected(pos, player:get_player_name()) +end + +minetest.register_on_dieplayer(function(player) + if minetest.setting_getbool("creative_mode") then + return + end + + local player_inv = player:get_inventory() + if player_inv:is_empty("main") and + player_inv:is_empty("craft") then + return + end + + local pos = player:getpos() + pos.x = math.floor(pos.x+0.5) + pos.y = math.floor(pos.y+0.5) + pos.z = math.floor(pos.z+0.5) + local param2 = minetest.dir_to_facedir(player:get_look_dir()) + local player_name = player:get_player_name() + local player_inv = player:get_inventory() + + if (not may_replace(pos, player)) then + if (may_replace({x=pos.x, y=pos.y+1, z=pos.z}, player)) then + -- drop one node above if there's space + -- this should solve most cases of protection related deaths in which players dig straight down + -- yet keeps the bones reachable + pos.y = pos.y+1 + else + -- drop items instead of delete + for i=1,player_inv:get_size("main") do + minetest.add_item(pos, player_inv:get_stack("main", i)) + end + for i=1,player_inv:get_size("craft") do + minetest.add_item(pos, player_inv:get_stack("craft", i)) + end + -- empty lists main and craft + player_inv:set_list("main", {}) + player_inv:set_list("craft", {}) + return + end + end + + minetest.set_node(pos, {name="bones:bones", param2=param2}) + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + inv:set_list("main", player_inv:get_list("main")) + + for i=1,player_inv:get_size("craft") do + local stack = player_inv:get_stack("craft", i) + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + else + --drop if no space left + minetest.add_item(pos, stack) + end + end + + player_inv:set_list("main", {}) + player_inv:set_list("craft", {}) + + meta:set_string("formspec", bones.bones_formspec) + meta:set_string("owner", player_name) + + if share_bones_time ~= 0 then + meta:set_string("infotext", player_name.."'s fresh bones") + + if share_bones_time_early == 0 or not minetest.is_protected(pos, player_name) then + meta:set_int("time", 0) + else + meta:set_int("time", (share_bones_time - share_bones_time_early)) + end + + minetest.get_node_timer(pos):start(10) + else + meta:set_string("infotext", player_name.."'s bones") + end +end) diff --git a/bones/textures/bones_bottom.png b/bones/textures/bones_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..ada72ceaee53f83beb0963a5e5788ed423c7155b GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJe}GSjE0C6zm9@3CUA}zzojZ4e z0=A_9g%Uko978G?eUCG?xduucexUOA`~GKzyyt&v@E-bfEK6wOcSbkGwXXwK6>th| z<$ApC?oHVPVR`W(%w_y-szu8uF8CgxapPUmlkL?e7nb~=&v=)=VChXqNF3e+S6qotDB-O*HXRdf4)^; z(c+Q2Vaj~tm3G#FPY+Ufb~jz;ytVJBpvWGZPwQ41%;7cJ-_PS=`^|&r|8%|MQtvhe f8m2s(vcz8CJmdGv!Tb7v)-iax`njxgN@xNAqqaf7 literal 0 HcmV?d00001 diff --git a/bones/textures/bones_rear.png b/bones/textures/bones_rear.png new file mode 100644 index 0000000000000000000000000000000000000000..8e1ac10b4f0ee0956c6e19a6ca4d75c2d8f2c783 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJe}GSjE0C6zm9@3CUA}zzojZ4e z0=A_9h0;A;978G?MNczwF&GLQI-v6HfBwGcoJdK5#G4VmyDIz>L@qt*x^h?b_!TRT zYi6$*bDmE7aPPL~IX!y=9l@*eEV+9Y9e=zeugCCHoppkRbO!tNlMVBx8%)qP3z(jK i_eb91q!VW}J>_rvGA=2(GXD_JN(N6?KbLh*2~7ZtuS0SG literal 0 HcmV?d00001 diff --git a/bones/textures/bones_side.png b/bones/textures/bones_side.png new file mode 100644 index 0000000000000000000000000000000000000000..3b4810c659c69e6dc25dbafaf33638a3c2d1269d GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJe}GSjE0C6zm9@3CUA}zzojZ4e z0=A_9g)%%{978G?WxE-<90EC-uay2buD>VmxP&+HW`wWOr`|igPEjJ|dmjkxDSyv? zaMx_phPCs=eqCIDR<9?qyyKp0lUbNeqtn5*!Y3z|9on(^<95#9o(1}8Hx$2J`2VtK k&Es!ni<3^w44!27$)EAGJ-h zqSbY~>xARXG_AMUEM51I^CphpLC<4CaL1WGKK==S;`@t0$AicDqc|D*)hN5HMD8&Ma%(G&=wQJUcsMtWgy8 z`1nm-=fmMF&;J#IA!Lk3b0I_+z6!%vZCecn2ea8Z;+#s^PN!d{=|2E~rrCwzxuU3q ztREl$3W9l_FSpxxvG@+5UYdS@uFFnOF9}J<<7fT8BPFP+v@Gu&XNvJ!RT1Y6LIy(m z)zuGGm8pxxx2x6f0Dz*nZ5j+AN|L|x{8LqJ_WOcTOh^_*7wh$V0Kn<#Tj=|(rkT6l zeZN063^$H{olIU3l1bU=x&@)`c~9$lGaQD5Y!EV3P1A*FPfp(U`wl|J^XK0K0LJ5I z7(b{gQWV9upJdt9YW0Wf9tuI>>(>`$`H<%~mKAVLDaD*KAt+-NLVD9+#wy2|S(fK{ zM{)cPjz;p};6;+WXN+_mmy&zlQB@^T^oEc$iY_4R-QNDj`MxMtQc5@)b-q7mtU5Zn zu&i;v?_6L1r0at`k15>|lIgm0c=(m$OcezYk|Ec9x?KKZ7%rta%Wm4XQdJe>BnXbz z>rB_3vb@LmKT6BG-gI3DgFrG?HBF&u7RL9z-T*>fO1a&}Cnw)fN`l~X0DzR;eEzj< zKS7hp7ecVId{7ic)2zW@VwwQ}GD$w-Q|)442z$Q5 zI3s?=^#7BOImISUF<)lAU8ZdJvN_g^xjvXq{Px$d^*~JDq=m)_Qq3Ah=Fg71F4}E7 cFVdQ&MBb@03*OsE&u=k literal 0 HcmV?d00001 diff --git a/kingdoms/textures/kingdoms_silver_block.png b/kingdoms/textures/kingdoms_silver_block.png new file mode 100644 index 0000000000000000000000000000000000000000..ce63c77ca1b57094ebc2b59f6eebb50624a3f611 GIT binary patch literal 436 zcmV;l0ZaagP)B}u$f2m=&-eE~V*oI+q?dL5mwBstFxxUo8jkPV zvH%Dte_XGU04!!D4Jjo61e_EApd=?>x6MBGT@pzrhZ+S>)s%QLQ@T~z_jLsjWS=P+ z8D>sSPM-(i*ZuBfNh$4BeT5_=0UYH?xJJZN#MCezvLs8gQ)r^Ms`$*DO6}OsvZPKg z&)J-`=Vh7o^xEC+s!Jyc1Zi95go89vXH!W!p~Vcq?=h_X%;DmTfoZ)n9aWF+)*G3Q z=k2XRU^UyT_NoE^*u{Nrsy%e~%x6D3v6`)BG1E**C!A-dlH9DvxL2hVj}fEl>!715 z+Z)h31&~!vI%#jWTmQ}17G^;@(6kOW%oekceUFR#>$bJaAvxJWeP&+V-^N(X9?brZ e@w_Zg5&r=J&={NaR=o!R0000 ze680Mzp2+TGp^gr({TG{j}?nsrCyoY4Yt;dQ%)Qe57Mky6Q(?OI(A^S&f?2e{0lwn z(|H)4|F!GyK5FGC9kcT8gG4*_2Rp7aKUlkNWC#`3hepvDQu>u7a@n%N387>D- zRo~ki&%g14)tsf8E2pT;J@)-(6hq&xyBaG_7ZtNzvs_cGq3OBwiHqj3V+Au*?3<*c zBhD)PF9`|yl%l)b>tj^t9-Zm;54@1tE`3zyyVa6!SKl`M@3dohX5HG6zWn4XU_dZ< My85}Sb4q9e0L>4XNB{r; literal 0 HcmV?d00001 diff --git a/kingdoms/textures/kingdoms_silver_lump.png b/kingdoms/textures/kingdoms_silver_lump.png new file mode 100644 index 0000000000000000000000000000000000000000..1ad579cdfb9b5e1563d52872a69b70cde7a88022 GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPtBa0}PNm9kaBS4`|o-U3d7N_4%a^!Au5NNdzkBks> z9kpYqIrMW1I5np#pn2w5xBtowP7bvZVW7?!7bBpA*>r{g65+6uD*X{Ni>U zZaX85Ti2Ec9tqQASOw`xKns?gdY&}uu9j?K!6} j>ATuKtNgHdeGT(hb{m&JQnM_9u4nLc^>bP0l+XkKSS4-{ literal 0 HcmV?d00001 diff --git a/kingdoms/textures/ui_kingdoms_icon.png b/kingdoms/textures/ui_kingdoms_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b67243b78ee57ff5fb496eccf3451c87887385f8 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#AtRHRjQN2hOLTxjHJ&bxAsXkGPP)k3puppD->~=H10lY*JiE^Ryy()Mq*V3N zT{GsT@(Hu@TqX&rXjTU%6Hg_j5}o3`3^y9Y@2zmjUn05R@WeO6!=1s#Pne(HdT{JQ z)4Pd#zDe5M32=6Q7uw+VJV|<2waV|BJ9D=4`o}*O|Dx`EW|p#X%q#1VeU44L{)dVK P-NE4L>gTe~DWM4fh7C=< literal 0 HcmV?d00001 diff --git a/kingdoms_ui/depends.txt b/kingdoms_ui/depends.txt new file mode 100644 index 0000000..5f915e3 --- /dev/null +++ b/kingdoms_ui/depends.txt @@ -0,0 +1,2 @@ +unified_inventory? +kingdoms diff --git a/kingdoms_ui/init.lua b/kingdoms_ui/init.lua new file mode 100644 index 0000000..2e52927 --- /dev/null +++ b/kingdoms_ui/init.lua @@ -0,0 +1,11 @@ +if rawget(_G, "unified_inventory") then + unified_inventory.register_button("kingdoms", { + type = "image", + image = "ui_kingdoms_icon.png", + tooltip = "Open the kingdoms GUI", + hide_lite=false, + action = function(player) + kingdoms.show_main_formspec(player:get_player_name()) + end, + }) +end diff --git a/magic/crafts.lua b/magic/crafts.lua new file mode 100644 index 0000000..d9b1995 --- /dev/null +++ b/magic/crafts.lua @@ -0,0 +1,8 @@ +for _,def in ipairs(magic.crystals) do + minetest.register_craft({ + type = "cooking", + output = "magic:"..def.name.."_essence", + recipe = "magic:crystal_"..def.name, + cooktime = 6, + }) +end diff --git a/magic/crystals.lua b/magic/crystals.lua new file mode 100644 index 0000000..364a05d --- /dev/null +++ b/magic/crystals.lua @@ -0,0 +1,105 @@ +magic.crystals = { + { + name = "rage", + desc = "Rage", + color = "#A00", + light = 10, + ores = { + { + rarity = 10 * 10 * 10, + clust_num_ores = 1, + clust_size = 1, + wherein = "default:lava_source", + y_max = -64, + }, + }, + }, + { + name = "calm", + desc = "Calm", + color = "#00F", + light = 5, + ores = { + { + rarity = 10 * 10 * 10, + clust_num_ores = 1, + clust_size = 1, + wherein = "default:water_source", + y_max = -64, + }, + { + rarity = 16 * 16 * 16, + clust_num_ores = 1, + clust_size = 1, + wherein = "default:water_source", + y_min = -32, + y_max = -8, + }, + }, + }, +} + +for _,def in ipairs(magic.crystals) do + minetest.register_node("magic:crystal_"..def.name, { + description = def.desc.." Crystal", + drawtype = "glasslike", + tiles = {"magic_crystal.png^[colorize:"..def.color..":"..tostring(0xCC)}, + groups = {cracky = 2}, + light_source = def.light or 7, + sunlight_propagates = true, + use_texture_alpha = true, + paramtype = "light", + sounds = default.node_sound_stone_defaults(), + }) + + minetest.register_craftitem("magic:"..def.name.."_essence", { + description = def.desc.." Essence", + inventory_image = "magic_essence.png^[colorize:"..def.color..":"..tostring(0xCC), + }) + + local ndefd = { + ore_type = "scatter", + ore = "magic:crystal_"..def.name, + wherein = "default:stone", + clust_num_ores = 1, + clust_size = 1, + y_min = -31000, + y_max = 31000, + } + + if def.ores then + for _,oredef in ipairs(def.ores) do + local ndef = table.copy(ndefd) + ndef.clust_scarcity = oredef.rarity * #magic.crystals * (def.rarity or 1) + for k,v in pairs(oredef) do + ndef[k] = v + end + minetest.register_ore(ndef) + end + end + + if not def.nodefgen then + local ores = { + { + rarity = 16 * 16 * 16, + clust_num_ores = 3, + clust_size = 2, + y_max = -64, + }, + { + rarity = 14 * 14 * 14, + clust_num_ores = 3, + clust_size = 2, + y_min = 32, + }, + } + for _,oredef in ipairs(ores) do + local ndef = table.copy(ndefd) + ndef.clust_scarcity = oredef.rarity * #magic.crystals * (def.rarity or 1) + for k,v in pairs(oredef) do + ndef[k] = v + end + minetest.register_ore(ndef) + end + end +end diff --git a/magic/init.lua b/magic/init.lua index 2496998..2d564f1 100644 --- a/magic/init.lua +++ b/magic/init.lua @@ -7,4 +7,8 @@ end -- Mod namespace. magic = {} +domodfile("crystals.lua") +domodfile("spells.lua") +domodfile("crafts.lua") + kingdoms.log("action", "Magic loaded.") diff --git a/magic/spells.lua b/magic/spells.lua new file mode 100644 index 0000000..e69de29 diff --git a/magic/textures/magic_crystal.png b/magic/textures/magic_crystal.png new file mode 100644 index 0000000000000000000000000000000000000000..bd07962b3bc588b0d3e521e475aab4b19af250f1 GIT binary patch literal 3535 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 literal 0 HcmV?d00001 diff --git a/magic/textures/magic_essence.png b/magic/textures/magic_essence.png new file mode 100644 index 0000000000000000000000000000000000000000..6e93c3877908261f1ee57c99b4925c9a481e00c7 GIT binary patch literal 3464 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