diff --git a/README.txt b/README.txt index acdc6e7..edd3f2b 100644 --- a/README.txt +++ b/README.txt @@ -21,5 +21,4 @@ See README.txt in each mod for more information Every code written by me is LGPLv2.1 Notes: -sfinv mod changed mtg_craftguide mod deleted \ No newline at end of file diff --git a/mods/3d_armor/3d_armor/armor.lua b/mods/3d_armor/3d_armor/armor.lua index 7245424..7cb830f 100644 --- a/mods/3d_armor/3d_armor/armor.lua +++ b/mods/3d_armor/3d_armor/armor.lua @@ -7,13 +7,6 @@ minetest.register_tool("3d_armor:helmet_admin", { wield_image = "3d_armor_inv_helmet_admin.png", groups = {armor_head=20, armor_heal=20, armor_use=0, armor_fire=1, armor_water=0.2}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:helmet_admin2") - end - return itemstack - end, }) minetest.register_tool("3d_armor:helmet_admin2", { @@ -22,13 +15,6 @@ minetest.register_tool("3d_armor:helmet_admin2", { wield_image = "3d_armor_inv_helmet_admin.png", groups = {armor_head=20, armor_heal=20, armor_use=0, armor_fire=1, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:helmet_admin3") - end - return itemstack - end, }) minetest.register_tool("3d_armor:helmet_admin3", { @@ -37,13 +23,6 @@ minetest.register_tool("3d_armor:helmet_admin3", { wield_image = "3d_armor_inv_helmet_admin.png", groups = {armor_head=20, armor_heal=20, armor_use=0, armor_fire=1, physics_jump=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:helmet_admin4") - end - return itemstack - end, }) minetest.register_tool("3d_armor:helmet_admin4", { @@ -52,13 +31,6 @@ minetest.register_tool("3d_armor:helmet_admin4", { wield_image = "3d_armor_inv_helmet_admin.png", groups = {armor_head=20, armor_heal=20, armor_use=0, armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:helmet_admin") - end - return itemstack - end, }) minetest.register_tool("3d_armor:chestplate_admin", { @@ -67,13 +39,6 @@ minetest.register_tool("3d_armor:chestplate_admin", { wield_image = "3d_armor_inv_chestplate_admin.png", groups = {armor_torso=20, armor_heal=20, armor_use=0, armor_fire=1, armor_water=0.2}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:chestplate_admin2") - end - return itemstack - end, }) minetest.register_tool("3d_armor:chestplate_admin2", { @@ -82,55 +47,30 @@ minetest.register_tool("3d_armor:chestplate_admin2", { wield_image = "3d_armor_inv_chestplate_admin.png", groups = {armor_torso=20, armor_heal=20, armor_use=0, armor_fire=1, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:chestplate_admin3") - end - return itemstack - end, }) + minetest.register_tool("3d_armor:chestplate_admin3", { description = "Admin Chestplate Mode 3 (no speed and jump)", inventory_image = "3d_armor_inv_chestplate_admin.png^technic_tool_mode3.png", wield_image = "3d_armor_inv_chestplate_admin.png", groups = {armor_torso=20, armor_heal=20, armor_use=0, armor_fire=1, physics_jump=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:chestplate_admin4") - end - return itemstack - end, }) + minetest.register_tool("3d_armor:chestplate_admin4", { description = "Admin Chestplate Mode 4 (speed and jump)", inventory_image = "3d_armor_inv_chestplate_admin.png^technic_tool_mode4.png", wield_image = "3d_armor_inv_chestplate_admin.png", groups = {armor_torso=20, armor_heal=20, armor_use=0, armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:chestplate_admin") - end - return itemstack - end, }) + minetest.register_tool("3d_armor:leggings_admin", { description = "Admin Leggings Mode 1 (no speed and no jump)", wield_image = "3d_armor_inv_leggings_admin.png", inventory_image = "3d_armor_inv_leggings_admin.png^technic_tool_mode1.png", groups = {armor_legs=20, armor_heal=20, armor_use=0, armor_fire=1, armor_water=0.2}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:leggings_admin2") - end - return itemstack - end, }) minetest.register_tool("3d_armor:leggings_admin2", { @@ -139,13 +79,6 @@ minetest.register_tool("3d_armor:leggings_admin2", { inventory_image = "3d_armor_inv_leggings_admin.png^technic_tool_mode2.png", groups = {armor_legs=20, armor_heal=20, armor_use=0, armor_fire=1, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:leggings_admin3") - end - return itemstack - end, }) minetest.register_tool("3d_armor:leggings_admin3", { @@ -154,13 +87,6 @@ minetest.register_tool("3d_armor:leggings_admin3", { inventory_image = "3d_armor_inv_leggings_admin.png^technic_tool_mode3.png", groups = {armor_legs=20, armor_heal=20, armor_use=0, armor_fire=1, physics_jump=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:leggings_admin4") - end - return itemstack - end, }) minetest.register_tool("3d_armor:leggings_admin4", { @@ -169,30 +95,14 @@ minetest.register_tool("3d_armor:leggings_admin4", { wield_image = "3d_armor_inv_leggings_admin.png", groups = {armor_legs=20, armor_heal=20, armor_use=0, armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:leggings_admin") - end - return itemstack - end, }) - - minetest.register_tool("3d_armor:boots_admin", { description = "Admin Boots Mode 1 (no speed and no jump)", inventory_image = "3d_armor_inv_boots_admin.png^technic_tool_mode1.png", wield_image = "3d_armor_inv_boots_admin.png", groups = {armor_feet=20, armor_heal=20, armor_use=0, armor_fire=1, armor_water=0.2}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:boots_admin2") - end - return itemstack - end, }) minetest.register_tool("3d_armor:boots_admin2", { @@ -201,13 +111,6 @@ minetest.register_tool("3d_armor:boots_admin2", { wield_image = "3d_armor_inv_boots_admin.png", groups = {armor_feet=20, armor_heal=20, armor_use=0, armor_fire=1, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:boots_admin3") - end - return itemstack - end, }) minetest.register_tool("3d_armor:boots_admin3", { @@ -216,13 +119,6 @@ minetest.register_tool("3d_armor:boots_admin3", { wield_image = "3d_armor_inv_boots_admin.png", groups = {armor_feet=20, armor_heal=20, armor_use=0, armor_fire=1, physics_jump=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:boots_admin4") - end - return itemstack - end, }) minetest.register_tool("3d_armor:boots_admin4", { @@ -231,11 +127,4 @@ minetest.register_tool("3d_armor:boots_admin4", { wield_image = "3d_armor_inv_boots_admin.png", groups = {armor_feet=20, armor_heal=20, armor_use=0, armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:boots_admin") - end - return itemstack - end, }) diff --git a/mods/3d_armor/3d_armor/tutorial.lua b/mods/3d_armor/3d_armor/tutorial.lua index d4f3df4..43b6fe5 100644 --- a/mods/3d_armor/3d_armor/tutorial.lua +++ b/mods/3d_armor/3d_armor/tutorial.lua @@ -342,13 +342,6 @@ minetest.register_tool("3d_armor:superlegendenboots", { groups = {armor_feet=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_superlegendenboots.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:superlegendenboots2") - end - return itemstack - end, }) minetest.register_tool("3d_armor:superlegendenboots2", { description = "Superlegendboots Mode 2 (speed and no jump)\nBoots-lv.122", @@ -356,13 +349,6 @@ minetest.register_tool("3d_armor:superlegendenboots2", { groups = {armor_feet=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_superlegendenboots.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:superlegendenboots3") - end - return itemstack - end, }) minetest.register_tool("3d_armor:superlegendenboots3", { description = "Superlegendboots Mode 3 (no speed and jump)\nBoots-lv.122", @@ -370,13 +356,6 @@ minetest.register_tool("3d_armor:superlegendenboots3", { groups = {armor_feet=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_jump=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_superlegendenboots.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:superlegendenboots4") - end - return itemstack - end, }) minetest.register_tool("3d_armor:superlegendenboots4", { description = "Superlegendboots Mode 4 (speed and jump)\nBoots-lv.122", @@ -384,13 +363,6 @@ minetest.register_tool("3d_armor:superlegendenboots4", { groups = {armor_feet=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_jump=0.25, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_superlegendenboots.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:superlegendenboots") - end - return itemstack - end, }) minetest.register_tool("3d_armor:superlegendenchestplate", { @@ -399,13 +371,6 @@ minetest.register_tool("3d_armor:superlegendenchestplate", { groups = {armor_torso=12.2, armor_heal=12, armor_use=0, armor_fire=0.61, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_superlegendenchestplate.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:superlegendenchestplate2") - end - return itemstack - end, }) minetest.register_tool("3d_armor:superlegendenchestplate2", { description = "Superlegendchestplate Mode 2 (speed and no jump)\nChestplate-lv.122", @@ -413,13 +378,6 @@ minetest.register_tool("3d_armor:superlegendenchestplate2", { groups = {armor_torso=12.2, armor_heal=12, armor_use=0, armor_fire=0.61, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_superlegendenchestplate.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:superlegendenchestplate3") - end - return itemstack - end, }) minetest.register_tool("3d_armor:superlegendenchestplate3", { description = "Superlegendchestplate Mode 3 (no speed and jump)\nChestplate-lv.122", @@ -427,13 +385,6 @@ minetest.register_tool("3d_armor:superlegendenchestplate3", { groups = {armor_torso=12.2, armor_heal=12, armor_use=0, armor_fire=0.61, physics_jump=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_superlegendenchestplate.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:superlegendenchestplate4") - end - return itemstack - end, }) minetest.register_tool("3d_armor:superlegendenchestplate4", { description = "Superlegendchestplate Mode 4 (speed and jump)\nChestplate-lv.122", @@ -441,13 +392,6 @@ minetest.register_tool("3d_armor:superlegendenchestplate4", { groups = {armor_torso=12.2, armor_heal=12, armor_use=0, armor_fire=0.61, physics_jump=0.25, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_superlegendenchestplate.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:superlegendenchestplate") - end - return itemstack - end, }) minetest.register_tool("3d_armor:superlegendenhelmet", { @@ -456,13 +400,6 @@ minetest.register_tool("3d_armor:superlegendenhelmet", { groups = {armor_head=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_superlegendenhelmet.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:superlegendenhelmet2") - end - return itemstack - end, }) minetest.register_tool("3d_armor:superlegendenhelmet2", { description = "Superlegendhelmet Mode 2 (speed and no jump)\nHelmet-lv.122", @@ -470,13 +407,6 @@ minetest.register_tool("3d_armor:superlegendenhelmet2", { groups = {armor_head=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_superlegendenhelmet.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:superlegendenhelmet3") - end - return itemstack - end, }) minetest.register_tool("3d_armor:superlegendenhelmet3", { description = "Superlegendhelmet Mode 3 (no speed and jump)\nHelmet-lv.122", @@ -484,13 +414,6 @@ minetest.register_tool("3d_armor:superlegendenhelmet3", { groups = {armor_head=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_jump=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_superlegendenhelmet.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:superlegendenhelmet4") - end - return itemstack - end, }) minetest.register_tool("3d_armor:superlegendenhelmet4", { description = "Superlegendhelmet Mode 4 (speed and jump)\nHelmet-lv.122", @@ -498,13 +421,6 @@ minetest.register_tool("3d_armor:superlegendenhelmet4", { groups = {armor_head=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_jump=0.25, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_superlegendenhelmet.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:superlegendenhelmet") - end - return itemstack - end, }) minetest.register_tool("3d_armor:superlegendenleggings", { @@ -513,13 +429,6 @@ minetest.register_tool("3d_armor:superlegendenleggings", { groups = {armor_legs=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_superlegendenleggings.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:superlegendenleggings2") - end - return itemstack - end, }) minetest.register_tool("3d_armor:superlegendenleggings2", { description = "Superlegendleggings Mode 2 (speed and no jump)\nLeggings-lv.122", @@ -527,13 +436,6 @@ minetest.register_tool("3d_armor:superlegendenleggings2", { groups = {armor_legs=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_superlegendenleggings.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:superlegendenleggings3") - end - return itemstack - end, }) minetest.register_tool("3d_armor:superlegendenleggings3", { description = "Superlegendleggings Mode 3 (no speed and jump)\nLeggings-lv.122", @@ -541,13 +443,6 @@ minetest.register_tool("3d_armor:superlegendenleggings3", { groups = {armor_legs=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_jump=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_superlegendenleggings.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:superlegendenleggings4") - end - return itemstack - end, }) minetest.register_tool("3d_armor:superlegendenleggings4", { description = "Superlegendleggings Mode 4 (speed and jump)\nLeggings-lv.122", @@ -555,13 +450,6 @@ minetest.register_tool("3d_armor:superlegendenleggings4", { groups = {armor_legs=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_jump=0.25, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_superlegendenleggings.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:superlegendenleggings") - end - return itemstack - end, }) @@ -571,13 +459,6 @@ minetest.register_tool("3d_armor:regnumboots", { groups = {armor_feet=15.0, armor_heal=13, armor_use=0,armor_fire=1, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumboots.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:regnumboots2") - end - return itemstack - end, }) minetest.register_tool("3d_armor:regnumboots2", { description = "Regnumboots Mode 2 (speed and no jump)\nBoots-lv.MAX", @@ -585,13 +466,6 @@ minetest.register_tool("3d_armor:regnumboots2", { groups = {armor_feet=15.0, armor_heal=13, armor_use=0,armor_fire=1, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_regnumboots.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:regnumboots3") - end - return itemstack - end, }) minetest.register_tool("3d_armor:regnumboots3", { description = "Regnumboots Mode 3 (no speed and jump)\nBoots-lv.MAX", @@ -599,13 +473,6 @@ minetest.register_tool("3d_armor:regnumboots3", { groups = {armor_feet=15.0, armor_heal=13, armor_use=0,armor_fire=1, physics_jump=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_regnumboots.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:regnumboots4") - end - return itemstack - end, }) minetest.register_tool("3d_armor:regnumboots4", { description = "Regnumboots Mode 4 (speed and jump)\nBoots-lv.MAX", @@ -613,13 +480,6 @@ minetest.register_tool("3d_armor:regnumboots4", { groups = {armor_feet=15.0, armor_heal=13, armor_use=0,armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_regnumboots.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:regnumboots") - end - return itemstack - end, }) minetest.register_tool("3d_armor:regnumchestplate", { @@ -628,13 +488,6 @@ minetest.register_tool("3d_armor:regnumchestplate", { groups = {armor_torso=15.0, armor_heal=13, armor_use=0, armor_fire=1, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumchestplate.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:regnumchestplate2") - end - return itemstack - end, }) minetest.register_tool("3d_armor:regnumchestplate2", { description = "Regnumchestplate Mode 2 (speed and no jump)\nChestplate-lv.MAX", @@ -642,13 +495,6 @@ minetest.register_tool("3d_armor:regnumchestplate2", { groups = {armor_torso=15.0, armor_heal=13, armor_use=0, armor_fire=1, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_regnumchestplate.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:regnumchestplate3") - end - return itemstack - end, }) minetest.register_tool("3d_armor:regnumchestplate3", { description = "Regnumchestplate Mode 3 (no speed and jump)\nChestplate-lv.MAX", @@ -656,13 +502,6 @@ minetest.register_tool("3d_armor:regnumchestplate3", { groups = {armor_torso=15.0, armor_heal=13, armor_use=0, armor_fire=1, physics_jump=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_regnumchestplate.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:regnumchestplate4") - end - return itemstack - end, }) minetest.register_tool("3d_armor:regnumchestplate4", { description = "Regnumchestplate Mode 4 (speed and jump)\nChestplate-lv.MAX", @@ -670,13 +509,6 @@ minetest.register_tool("3d_armor:regnumchestplate4", { groups = {armor_torso=15.0, armor_heal=13, armor_use=0, armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_regnumchestplate.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:regnumchestplate") - end - return itemstack - end, }) minetest.register_tool("3d_armor:regnumhelmet", { @@ -685,13 +517,6 @@ minetest.register_tool("3d_armor:regnumhelmet", { groups = {armor_head=15.0, armor_heal=13, armor_use=0,armor_fire=1, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumhelmet.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:regnumhelmet2") - end - return itemstack - end, }) minetest.register_tool("3d_armor:regnumhelmet2", { description = "Regnumhelmet Mode 2 (speed and no jump)\nHelmet-lv.MAX", @@ -699,13 +524,6 @@ minetest.register_tool("3d_armor:regnumhelmet2", { groups = {armor_head=15.0, armor_heal=13, armor_use=0,armor_fire=1, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_regnumhelmet.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:regnumhelmet3") - end - return itemstack - end, }) minetest.register_tool("3d_armor:regnumhelmet3", { description = "Regnumhelmet Mode 3 (no speed and jump)\nHelmet-lv.MAX", @@ -713,13 +531,6 @@ minetest.register_tool("3d_armor:regnumhelmet3", { groups = {armor_head=15.0, armor_heal=13, armor_use=0,armor_fire=1, physics_jump=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_regnumhelmet.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:regnumhelmet4") - end - return itemstack - end, }) minetest.register_tool("3d_armor:regnumhelmet4", { description = "Regnumhelmet Mode 4 (speed and jump)\nHelmet-lv.MAX", @@ -727,13 +538,6 @@ minetest.register_tool("3d_armor:regnumhelmet4", { groups = {armor_head=15.0, armor_heal=13, armor_use=0,armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_regnumhelmet.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:regnumhelmet") - end - return itemstack - end, }) minetest.register_tool("3d_armor:regnumleggings", { @@ -742,13 +546,6 @@ minetest.register_tool("3d_armor:regnumleggings", { groups = {armor_legs=15.0, armor_heal=13, armor_use=0,armor_fire=1, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumleggings.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:regnumleggings2") - end - return itemstack - end, }) minetest.register_tool("3d_armor:regnumleggings2", { description = "Regnumleggings Mode 2 (speed and no jump)\nLeggings-lv.MAX", @@ -756,13 +553,6 @@ minetest.register_tool("3d_armor:regnumleggings2", { groups = {armor_legs=15.0, armor_heal=13, armor_use=0,armor_fire=1, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_regnumleggings.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:regnumleggings3") - end - return itemstack - end, }) minetest.register_tool("3d_armor:regnumleggings3", { description = "Regnumleggings Mode 3 (no speed and jump)\nLeggings-lv.MAX", @@ -770,13 +560,6 @@ minetest.register_tool("3d_armor:regnumleggings3", { groups = {armor_legs=15.0, armor_heal=13, armor_use=0,armor_fire=1, physics_jump=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_regnumleggings.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:regnumleggings4") - end - return itemstack - end, }) minetest.register_tool("3d_armor:regnumleggings4", { description = "Regnumleggings Mode 4 (speed and jump)\nLeggings-lv.MAX", @@ -784,11 +567,4 @@ minetest.register_tool("3d_armor:regnumleggings4", { groups = {armor_legs=15.0, armor_heal=13, armor_use=0,armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "3d_armor_inv_regnumleggings.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("3d_armor:regnumleggings") - end - return itemstack - end, }) \ No newline at end of file diff --git a/mods/3d_armor/shields/init.lua b/mods/3d_armor/shields/init.lua index 49e0612..c66d739 100644 --- a/mods/3d_armor/shields/init.lua +++ b/mods/3d_armor/shields/init.lua @@ -31,13 +31,6 @@ minetest.register_tool("shields:shield_admin", { wield_image = "shields_inv_shield_admin.png", groups = {armor_shield=20, armor_heal=20, armor_use=0, armor_fire=1, armor_water=0.2}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("shields:shield_admin2") - end - return itemstack - end, }) minetest.register_tool("shields:shield_admin2", { @@ -46,13 +39,6 @@ minetest.register_tool("shields:shield_admin2", { wield_image = "shields_inv_shield_admin.png", groups = {armor_shield=20, armor_heal=20, armor_use=0, armor_fire=1, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("shields:shield_admin3") - end - return itemstack - end, }) minetest.register_tool("shields:shield_admin3", { @@ -61,13 +47,6 @@ minetest.register_tool("shields:shield_admin3", { wield_image = "shields_inv_shield_admin.png", groups = {armor_shield=20, armor_heal=20, armor_use=0, armor_fire=1, physics_jump=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("shields:shield_admin4") - end - return itemstack - end, }) minetest.register_tool("shields:shield_admin4", { @@ -76,11 +55,4 @@ minetest.register_tool("shields:shield_admin4", { wield_image = "shields_inv_shield_admin.png", groups = {armor_shield=20, armor_heal=20, armor_use=0, armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("shields:shield_admin") - end - return itemstack - end, }) diff --git a/mods/3d_armor/shields/tutorial.lua b/mods/3d_armor/shields/tutorial.lua index 5434da2..8e76769 100644 --- a/mods/3d_armor/shields/tutorial.lua +++ b/mods/3d_armor/shields/tutorial.lua @@ -104,13 +104,6 @@ minetest.register_tool("shields:superlegendenshield", { groups = {armor_shield=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "shields_inv_superlegendenshield.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("shields:superlegendenshield2") - end - return itemstack - end, }) minetest.register_tool("shields:superlegendenshield2", { description = "Superlegendshield Mode 2 (speed and no jump)\nShield-lv.122", @@ -118,13 +111,6 @@ minetest.register_tool("shields:superlegendenshield2", { groups = {armor_shield=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "shields_inv_superlegendenshield.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("shields:superlegendenshield3") - end - return itemstack - end, }) minetest.register_tool("shields:superlegendenshield3", { description = "Superlegendshield Mode 3 (no speed and jump)\nShield-lv.122", @@ -132,13 +118,6 @@ minetest.register_tool("shields:superlegendenshield3", { groups = {armor_shield=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_jump=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "shields_inv_superlegendenshield.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("shields:superlegendenshield4") - end - return itemstack - end, }) minetest.register_tool("shields:superlegendenshield4", { description = "Superlegendshield Mode 4 (speed and jump)\nShield-lv.122", @@ -146,13 +125,6 @@ minetest.register_tool("shields:superlegendenshield4", { groups = {armor_shield=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_jump=0.25, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "shields_inv_superlegendenshield.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("shields:superlegendenshield") - end - return itemstack - end, }) minetest.register_tool("shields:regnumshield", { @@ -161,13 +133,6 @@ minetest.register_tool("shields:regnumshield", { groups = {armor_shield=15.0, armor_heal=13, armor_use=0,armor_fire=1, armor_water=0.2}, wear = 0, wield_image = "shields_inv_regnumshield.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("shields:regnumshield2") - end - return itemstack - end, }) minetest.register_tool("shields:regnumshield2", { description = "Regnumshield Mode 2 (speed and no jump)\nShield-lv.MAX", @@ -175,13 +140,6 @@ minetest.register_tool("shields:regnumshield2", { groups = {armor_shield=15.0, armor_heal=13, armor_use=0,armor_fire=1, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "shields_inv_regnumshield.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("shields:regnumshield3") - end - return itemstack - end, }) minetest.register_tool("shields:regnumshield3", { description = "Regnumshield Mode 3 (no speed and jump)\nShield-lv.MAX", @@ -189,13 +147,6 @@ minetest.register_tool("shields:regnumshield3", { groups = {armor_shield=15.0, armor_heal=13, armor_use=0,armor_fire=1, physics_jump=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "shields_inv_regnumshield.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("shields:regnumshield4") - end - return itemstack - end, }) minetest.register_tool("shields:regnumshield4", { description = "Regnumshield Mode 4 (speed and jump)\nShield-lv.MAX", @@ -203,13 +154,4 @@ minetest.register_tool("shields:regnumshield4", { groups = {armor_shield=15.0, armor_heal=13, armor_use=0,armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2, not_in_creative_inventory=1}, wear = 0, wield_image = "shields_inv_regnumshield.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("shields:regnumshield") - end - return itemstack - end, -}) - - +}) \ No newline at end of file diff --git a/mods/awards/.luacheckrc b/mods/awards/.luacheckrc new file mode 100644 index 0000000..f6b420e --- /dev/null +++ b/mods/awards/.luacheckrc @@ -0,0 +1,14 @@ +unused_args = false +allow_defined_top = true + +globals = { + "minetest", "awards", +} + +read_globals = { + string = {fields = {"split"}}, + table = {fields = {"copy", "getn"}}, + "vector", "default", "ItemStack", + "dump", "sfinv", "intllib", + "unified_inventory", +} diff --git a/mods/awards/.travis.yml b/mods/awards/.travis.yml new file mode 100644 index 0000000..077e778 --- /dev/null +++ b/mods/awards/.travis.yml @@ -0,0 +1,12 @@ +language: generic +sudo: false +addons: + apt: + packages: + - luarocks +before_install: + - luarocks install --local luacheck +script: +- $HOME/.luarocks/bin/luacheck --no-color . +notifications: + email: false diff --git a/mods/awards/LICENSE.txt b/mods/awards/LICENSE.txt new file mode 100644 index 0000000..b9bc22e --- /dev/null +++ b/mods/awards/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2013-8 rubenwardy + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/mods/awards/api.lua b/mods/awards/api.lua deleted file mode 100644 index 1712202..0000000 --- a/mods/awards/api.lua +++ /dev/null @@ -1,499 +0,0 @@ --- AWARDS --- by Rubenwardy -------------------------------------------------------- --- this is api function file -------------------------------------------------------- - --- The global award namespace -awards = { - show_mode = "hud" -} - --- Table Save Load Functions -function awards.save() - local file = io.open(minetest.get_worldpath().."/awards.txt", "w") - if file then - file:write(minetest.serialize(awards.players)) - file:close() - end -end - -function awards.load() - local file = io.open(minetest.get_worldpath().."/awards.txt", "r") - if file then - local table = minetest.deserialize(file:read("*all")) - if type(table) == "table" then - return table - end - end - return {} -end - -awards.players = awards.load() -function awards.player(name) - return awards.players[name] -end - --- A table of award definitions -awards.def = {} - -function awards.tbv(tb,value,default) - if not default then - default = {} - end - if not tb or type(tb) ~= "table" then - if not value then - value = "[NULL]" - end - minetest.log("error", "awards.tbv - table "..dump(value).." is null, or not a table! Dump: "..dump(tb)) - return - end - if not value then - error("[ERROR] awards.tbv was not used correctly!\n".. - "Value: '"..dump(value).."'\n".. - "Dump:"..dump(tb)) - return - end - if not tb[value] then - tb[value] = default - end -end - -function awards.assertPlayer(playern) - awards.tbv(awards.players, playern) - awards.tbv(awards.players[playern], "name", playern) - awards.tbv(awards.players[playern], "unlocked") - awards.tbv(awards.players[playern], "place") - awards.tbv(awards.players[playern], "count") - awards.tbv(awards.players[playern], "craft") - awards.tbv(awards.players[playern], "deaths", 0) - awards.tbv(awards.players[playern], "joins", 0) - awards.tbv(awards.players[playern], "chats", 0) -end - --- Load files -dofile(minetest.get_modpath("awards").."/triggers.lua") - --- API Functions -function awards._additional_triggers(name, data_table) - -- To add triggers in another mod, you should override this function - -- If the code can't handle the trigger passed, then call the last value of _additional_triggers - --[[ - local add_trig = awards._additional_triggers - awards._additional_triggers = function(name, data_table) - if data_table.trigger.type == "trigger" then - local tmp = { - award = name, - node = data_table.trigger.node, - target = data_table.trigger.target, - } - table.insert(awards.onTrigger,tmp) - elseif data_table.trigger.type == "trigger2" then - local tmp = { - award = name, - node = data_table.trigger.node, - target = data_table.trigger.target, - } - table.insert(awards.onTrigger2,tmp) - else - add_trig(name, data_table) - end - end - ]]-- -end -function awards.register_achievement(name,data_table) - -- see if a trigger is defined in the achievement definition - if data_table.trigger and data_table.trigger.type then - if data_table.trigger.type == "dig" then - local tmp = { - award = name, - node = data_table.trigger.node, - target = data_table.trigger.target, - } - table.insert(awards.onDig,tmp) - elseif data_table.trigger.type == "place" then - local tmp = { - award = name, - node = data_table.trigger.node, - target = data_table.trigger.target, - } - table.insert(awards.onPlace,tmp) - elseif data_table.trigger.type == "craft" then - local tmp = { - award = name, - item = data_table.trigger.item, - target = data_table.trigger.target, - } - table.insert(awards.onCraft,tmp) - elseif data_table.trigger.type == "death" then - local tmp = { - award = name, - target = data_table.trigger.target, - } - table.insert(awards.onDeath,tmp) - elseif data_table.trigger.type == "chat" then - local tmp = { - award = name, - target = data_table.trigger.target, - } - table.insert(awards.onChat,tmp) - elseif data_table.trigger.type == "join" then - local tmp = { - award = name, - target = data_table.trigger.target, - } - table.insert(awards.onJoin,tmp) - else - awards._additional_triggers(name, data_table) - end - end - - -- check icon, background and custom_announce data - if data_table.icon == nil or data_table.icon == "" then - data_table.icon = "unknown.png" - end - if data_table.background == nil or data_table.background == "" then - data_table.background = "bg_default.png" - end - if data_table.custom_announce == nil or data_table.custom_announce == "" then - data_table.custom_announce = "Achievement Unlocked:" - end - - -- add the achievement to the definition table - data_table.name = name - awards.def[name] = data_table -end - --- run a function when a node is dug -function awards.register_onDig(func) - table.insert(awards.onDig,func) -end - --- run a function when a node is placed -function awards.register_onPlace(func) - table.insert(awards.onPlace,func) -end - --- run a function when a player dies -function awards.register_onDeath(func) - table.insert(awards.onDeath,func) -end - --- run a function when a player chats -function awards.register_onChat(func) - table.insert(awards.onChat,func) -end - --- run a function when a player joins -function awards.register_onJoin(func) - table.insert(awards.onJoin,func) -end - --- run a function when an item is crafted -function awards.register_onCraft(func) - table.insert(awards.onCraft,func) -end - --- This function is called whenever a target condition is met. --- It checks if a player already has that achievement, and if they do not, --- it gives it to them ----------------------------------------------- ---awards.give_achievement(name,award) --- name - the name of the player --- award - the name of the award to give -function awards.give_achievement(name, award) - -- Access Player Data - local data = awards.players[name] - - -- Perform checks - if not data then - return - end - if not awards.def[award] then - return - end - awards.tbv(data,"unlocked") - - -- check to see if the player does not already have that achievement - if not data.unlocked[award] or data.unlocked[award]~=award then - -- Set award flag - data.unlocked[award]=award - - -- Give Prizes - if awards.def[award] and awards.def[award].prizes then - for i = 1, #awards.def[award].prizes do - local itemstack = ItemStack(awards.def[award].prizes[i]) - if itemstack:is_empty() or not itemstack:is_known() then - return - end - local receiverref = core.get_player_by_name(name) - if receiverref == nil then - return - end - receiverref:get_inventory():add_item("main", itemstack) - end - end - - -- Get data from definition tables - local title = award - local desc = "" - local background = "" - local icon = "" - local custom_announce = "" - if awards.def[award].title then - title = awards.def[award].title - end - if awards.def[award].custom_announce then - custom_announce = awards.def[award].custom_announce - end - if awards.def[award].background then - background = awards.def[award].background - end - if awards.def[award].icon then - icon = awards.def[award].icon - end - if awards.def[award] and awards.def[award].description then - desc = awards.def[award].description - end - - -- send the won award message to the player - if awards.show_mode == "formspec" then - -- use a formspec to send it - minetest.show_formspec(name, "achievements:unlocked", "size[4,2]" - .."image_button_exit[0,0;4,2;"..background..";close1; ]" - .."image_button_exit[0.2,0.8;1,1;"..icon..";close2; ]" - .."label[1.1,1;"..title.."]" - .."label[0.3,0.1;"..custom_announce.."]") - elseif awards.show_mode == "chat" then - -- use the chat console to send it - minetest.chat_send_player(name, "Achievement Unlocked: "..title) - if desc~="" then - minetest.chat_send_player(name, desc) - end - else - local player = minetest.get_player_by_name(name) - local one = player:hud_add({ - hud_elem_type = "image", - name = "award_bg", - scale = {x = 1, y = 1}, - text = background, - position = {x = 0.5, y = 0}, - offset = {x = 0, y = 138}, - alignment = {x = 0, y = -1} - }) - local two = player:hud_add({ - hud_elem_type = "text", - name = "award_au", - number = 0xFFFFFF, - scale = {x = 100, y = 20}, - text = "Achievement Unlocked!", - position = {x = 0.5, y = 0}, - offset = {x = 0, y = 40}, - alignment = {x = 0, y = -1} - }) - local three = player:hud_add({ - hud_elem_type = "text", - name = "award_title", - number = 0xFFFFFF, - scale = {x = 100, y = 20}, - text = title, - position = {x = 0.5, y = 0}, - offset = {x = 30, y = 100}, - alignment = {x = 0, y = -1} - }) - local four = player:hud_add({ - hud_elem_type = "image", - name = "award_icon", - scale = {x = 4, y = 4}, - text = icon, - position = {x = 0.5, y = 0}, - offset = {x = -81.5, y = 126}, - alignment = {x = 0, y = -1} - }) - minetest.after(3, function() - player:hud_remove(one) - player:hud_remove(two) - player:hud_remove(three) - player:hud_remove(four) - end) - end - - -- record this in the log - minetest.log("action", name.." has unlocked award "..title) - - -- save playertable - awards.save() - end -end -minetest.register_on_player_receive_fields(function(player, formname, fields) - local name = player:get_player_name() - if fields.aw then - awards.showto(name, name, nil, false) - end - if fields.awards then - local event = minetest.explode_textlist_event(fields.awards) - if event.type == "CHG" then - awards.showto(name,name,event.index,false) - end - end - -end) - --- List a player's achievements - ---[[minetest.register_chatcommand("gawd", { - params = "award name", - description = "gawd: give award to self", - func = function(name, param) - awards.give_achievement(name,param) - end -})]]-- - -function awards._order_awards(name) - local done = {} - local retval = {} - local player = awards.player(name) - if player and player.unlocked then - for _,got in pairs(player.unlocked) do - if awards.def[got] then - done[got] = true - table.insert(retval,{name=got,got=true}) - end - end - end - for _,def in pairs(awards.def) do - if not done[def.name] then - table.insert(retval,{name=def.name,got=false}) - end - end - return retval -end - -function awards.showto(name, to, sid, text) - if name == "" or name == nil then - name = to - end - if text then - if not awards.players[name] or not awards.players[name].unlocked then - minetest.chat_send_player(to, "You have not unlocked any awards") - return - end - minetest.chat_send_player(to, name.."'s awards:") - - for _, str in pairs(awards.players[name].unlocked) do - local def = awards.def[str] - if def then - if def.title then - if def.description then - minetest.chat_send_player(to, def.title..": "..def.description) - else - minetest.chat_send_player(to, def.title) - end - else - minetest.chat_send_player(to, str) - end - end - end - else - if sid == nil or sid < 1 then - sid = 1 - end - local formspec = "size[11,6]" - .."button[0,0;2,0.5;inven;Back]" - .."button[2,0;2,0.5;main;Main]" - .."background[11,6;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - local listofawards = awards._order_awards(name) - - -- Sidebar - if sid then - local item = listofawards[sid+0] - local def = awards.def[item.name] - if def and def.secret and not item.got then - formspec = formspec .. "label[1,3.75;Secret Award]".. - "image[1,1;3,3;unknown.png]" - if def and def.description then - formspec = formspec .. "label[0,4.25;Unlock this award to find out what it is]" - end - else - local title = item.name - if def and def.title then - title = def.title - end - local status = "" - if item.got then - status = " (got)" - end - local icon = "" - if def and def.icon then - icon = def.icon - end - formspec = formspec .. "label[1,3.75;"..title..status.."]".. - "image[1,1;3,3;"..icon.."]" - if def and def.description then - formspec = formspec .. "label[0,4.25;"..def.description.."]" - end - end - end - - -- Create list box - formspec = formspec .. "textlist[4.75,1;6,5;awards;" - local first = true - local all = 0 - local gotaw = 0 - for _,award in pairs(listofawards) do - local def = awards.def[award.name] - if def then - if not first then - formspec = formspec .. "," - end - first = false - - if def.secret and not award.got then - formspec = formspec .. "#ACACACSecret Award" - else - local title = award.name - if def and def.title then - title = def.title - end - if award.got then - gotaw = gotaw+1 - formspec = formspec .. minetest.formspec_escape(title) - else - formspec = formspec .. "#ACACAC".. minetest.formspec_escape(title) - end - all = all+1 - end - end - end - formspec = formspec .. ";"..sid.."]" - if all == gotaw then - local player_inv = minetest.get_player_by_name(name):get_inventory() - player_inv:set_size("a20", 1) - player_inv:set_stack("a20", 1, "default:dirt") - else - local player_inv = minetest.get_player_by_name(name):get_inventory() - player_inv:set_size("a20", 1) - player_inv:set_stack("a20", 1, "") - end - formspec = formspec .. "label[4,0;"..gotaw.."/"..all.."]" - - -- Show formspec to user - minetest.get_player_by_name(to):set_inventory_formspec(formspec) - end -end - -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname~="awards:awards" then - return false - end - if fields.quit then - return true - end - local name = player:get_player_name() - - - return true -end) - diff --git a/mods/awards/depends.txt b/mods/awards/depends.txt new file mode 100644 index 0000000..c8f3f2d --- /dev/null +++ b/mods/awards/depends.txt @@ -0,0 +1,14 @@ +intllib? +sfinv? +unified_inventory? +default? +stairs? +farming? +dye? +beds? +wool? +vessels? +moreblocks? +fire? +flowers? +nyancat? diff --git a/mods/awards/init.lua b/mods/awards/init.lua index d245daf..8b016be 100644 --- a/mods/awards/init.lua +++ b/mods/awards/init.lua @@ -1,465 +1,39 @@ --- AWARDS --- by Rubenwardy changed by 1248 -------------------------------------------------------- --- this is the init file for the award mod -------------------------------------------------------- -local intllib = nil -local S -if (intllib) then - dofile(minetest.get_modpath("intllib").."/intllib.lua") - S = intllib.Getter(minetest.get_current_modname()) -else - S = function ( s ) return s end -end - -dofile(minetest.get_modpath("awards").."/api.lua") - -awards.register_achievement("award_ruby_bronze",{ - title = S("Ruby (Bronze)"), - description = S("Dig 25 Ruby Ore."), - icon = "ruby_ruby_ore.png", - trigger = { - type = "dig", - node = "gems:ruby_ore", - target = 25 - } -}) - -awards.register_achievement("award_ruby_silber",{ - title = S("Ruby (Silber)"), - description = S("Dig 50 Ruby Ore."), - icon = "ruby_ruby_ore.png", - trigger = { - type = "dig", - node = "gems:ruby_ore", - target = 50 - } -}) - -awards.register_achievement("award_ruby_gold",{ - title = S("Ruby (Gold)"), - description = S("Dig 100 Ruby Ore."), - icon = "ruby_ruby_ore.png", - trigger = { - type = "dig", - node = "gems:ruby_ore", - target = 100 - } -}) - -awards.register_achievement("award_ruby_platin",{ - title = S("Ruby (Platin)"), - description = S("Dig 200 Ruby Ore."), - icon = "ruby_ruby_ore.png", - trigger = { - type = "dig", - node = "gems:ruby_ore", - target = 200 - } -}) - -awards.register_achievement("award_sapphire_bronze",{ - title = S("Sapphire (Bronze)"), - description = S("Dig 25 Sapphire Ore."), - icon = "gems_sapphire_ore.png", - trigger = { - type = "dig", - node = "gems:sapphire_ore", - target = 25 - } -}) - -awards.register_achievement("award_sapphire_silber",{ - title = S("Sapphire (Silber)"), - description = S("Dig 50 Sapphire Ore."), - icon = "gems_sapphire_ore.png", - trigger = { - type = "dig", - node = "gems:sapphire_ore", - target = 50 - } -}) - -awards.register_achievement("award_sapphire_gold",{ - title = S("Sapphire (Gold)"), - description = S("Dig 100 Sapphire Ore."), - icon = "gems_sapphire_ore.png", - trigger = { - type = "dig", - node = "gems:sapphire_ore", - target = 100 - } -}) - -awards.register_achievement("award_sapphire_platin",{ - title = S("Sapphire (Platin)"), - description = S("Dig 200 Sapphire Ore."), - icon = "gems_sapphire_ore.png", - trigger = { - type = "dig", - node = "gems:sapphire_ore", - target = 200 - } -}) - -awards.register_achievement("award_amethyst_bronze",{ - title = S("Amethyst (Bronze)"), - description = S("Dig 25 Amethyst Ore."), - icon = "gems_amethyst_ore.png", - trigger = { - type = "dig", - node = "gems:amethyst_ore", - target = 25 - } -}) - -awards.register_achievement("award_amethyst_silber",{ - title = S("Amethyst (Silber)"), - description = S("Dig 50 Amethyst Ore."), - icon = "gems_amethyst_ore.png", - trigger = { - type = "dig", - node = "gems:amethyst_ore", - target = 50 - } -}) - -awards.register_achievement("award_amethyst_Gold",{ - title = S("Amethyst (Gold)"), - description = S("Dig 100 Amethyst Ore."), - icon = "gems_amethyst_ore.png", - trigger = { - type = "dig", - node = "gems:amethyst_ore", - target = 100 - } -}) - -awards.register_achievement("award_amethyst_platin",{ - title = S("Amethyst (Platin)"), - description = S("Dig 200 Amethyst Ore."), - icon = "gems_amethyst_ore.png", - trigger = { - type = "dig", - node = "gems:amethyst_ore", - target = 200 - } -}) - -awards.register_achievement("award_shadow_bronze",{ - title = S("Shadow (Bronze)"), - description = S("Dig 25 Shadow Ore."), - icon = "shadow_ore.png", - trigger = { - type = "dig", - node = "gems:shadow_ore", - target = 25 - } -}) - -awards.register_achievement("award_shadow_silber",{ - title = S("Shadow (Silber)"), - description = S("Dig 50 Shadow Ore."), - icon = "shadow_ore.png", - trigger = { - type = "dig", - node = "gems:shadow_ore", - target = 50 - } -}) - -awards.register_achievement("award_shadow_gold",{ - title = S("Shadow (Gold)"), - description = S("Dig 100 Shadow Ore."), - icon = "shadow_ore.png", - trigger = { - type = "dig", - node = "gems:shadow_ore", - target = 100 - } -}) - -awards.register_achievement("award_shadow_platin",{ - title = S("Shadow (Platin)"), - description = S("Dig 200 Shadow Ore."), - icon = "shadow_ore.png", - trigger = { - type = "dig", - node = "gems:shadow_ore", - target = 200 - } -}) - -awards.register_achievement("award_pearl_bronze",{ - title = S("Pearl (Bronze)"), - description = S("Dig 25 Pearl Ore."), - icon = "gems_pearl_ore.png", - trigger = { - type = "dig", - node = "gems:pearl_ore", - target = 25 - } -}) - -awards.register_achievement("award_pearl_silber",{ - title = S("Pearl (Silber)"), - description = S("Dig 50 Pearl Ore."), - icon = "gems_pearl_ore.png", - trigger = { - type = "dig", - node = "gems:pearl_ore", - target = 50 - } -}) - -awards.register_achievement("award_pearl_gold",{ - title = S("Pearl (Gold)"), - description = S("Dig 100 Pearl Ore."), - icon = "gems_pearl_ore.png", - trigger = { - type = "dig", - node = "gems:pearl_ore", - target = 100 - } -}) - -awards.register_achievement("award_pearl_platin",{ - title = S("Pearl (Platin)"), - description = S("Dig 200 Pearl Ore."), - icon = "gems_pearl_ore.png", - trigger = { - type = "dig", - node = "gems:pearl_ore", - target = 200 - } -}) - -awards.register_achievement("award_emerald_bronze",{ - title = S("Emerald (Bronze)"), - description = S("Dig 25 Emerald Ore."), - icon = "gems_emerald_ore.png", - trigger = { - type = "dig", - node = "gems:emerald_ore", - target = 25 - } -}) - -awards.register_achievement("award_emerald_silber",{ - title = S("Emerald (Silber)"), - description = S("Dig 50 Emerald Ore."), - icon = "gems_emerald_ore.png", - trigger = { - type = "dig", - node = "gems:emerald_ore", - target = 50 - } -}) - -awards.register_achievement("award_emerald_gold",{ - title = S("Emerald (Gold)"), - description = S("Dig 100 Emerald Ore."), - icon = "gems_emerald_ore.png", - trigger = { - type = "dig", - node = "gems:emerald_ore", - target = 100 - } -}) - -awards.register_achievement("award_emerald_platin",{ - title = S("Emerald (Platin)"), - description = S("Dig 200 Emerald Ore."), - icon = "gems_emerald_ore.png", - trigger = { - type = "dig", - node = "gems:emerald_ore", - target = 200 - } -}) - -awards.register_achievement("award_admin_ore_bronze",{ - title = S("Admin Ore (Bronze)"), - description = S("Dig 5 Admin Ore."), - icon = "default_stone.png^tutorial_admin_ore.png", - trigger = { - type = "dig", - node = "tutorial:stone_with_admin", - target = 5 - } -}) - -awards.register_achievement("award_admin_ore_silber",{ - title = S("Admin Ore (Silber)"), - description = S("Dig 10 Admin Ore."), - icon = "default_stone.png^tutorial_admin_ore.png", - trigger = { - type = "dig", - node = "tutorial:stone_with_admin", - target = 10 - } -}) - -awards.register_achievement("award_admin_ore_gold",{ - title = S("Admin Ore (Gold)"), - description = S("Dig 20 Admin Ore."), - icon = "default_stone.png^tutorial_admin_ore.png", - trigger = { - type = "dig", - node = "tutorial:stone_with_admin", - target = 20 - } -}) - -awards.register_achievement("award_admin_ore_platin",{ - title = S("Admin Ore (Platin)"), - description = S("Dig 40 Admin Ore."), - icon = "default_stone.png^tutorial_admin_ore.png", - trigger = { - type = "dig", - node = "tutorial:stone_with_admin", - target = 40 - } -}) - -awards.register_achievement("award_titan_ore_bronze",{ - title = S("Titan Ore (Bronze)"), - description = S("Dig 10 Titan Ore."), - icon = "tutorial_titan_ore.png", - trigger = { - type = "dig", - node = "tutorial:stone_with_titan", - target = 10 - } -}) -awards.register_achievement("award_titan_ore_silber",{ - title = S("Titan Ore (Silber)"), - description = S("Dig 20 Titan Ore."), - icon = "tutorial_titan_ore.png", - trigger = { - type = "dig", - node = "tutorial:stone_with_titan", - target = 20 - } -}) -awards.register_achievement("award_titan_ore_gold",{ - title = S("Titan Ore (Gold)"), - description = S("Dig 40 Titan Ore."), - icon = "tutorial_titan_ore.png", - trigger = { - type = "dig", - node = "tutorial:stone_with_titan", - target = 40 - } -}) -awards.register_achievement("award_titan_ore_platin",{ - title = S("Titan Ore (Platin)"), - description = S("Dig 80 Titan Ore."), - icon = "tutorial_titan_ore.png", - trigger = { - type = "dig", - node = "tutorial:stone_with_titan", - target = 80 - } -}) -awards.register_achievement("award_regnum_ore_bronze",{ - title = S("Regnum Ore (Bronze)"), - description = S("Dig 2 Regnum Ore."), - icon = "default_stone.png^tutorial_regnum_ore.png", - trigger = { - type = "dig", - node = "tutorial:stone_with_regnum", - target = 2 - } -}) -awards.register_achievement("award_regnum_ore_silber",{ - title = S("Regnum Ore (Silber)"), - description = S("Dig 5 Regnum Ore."), - icon = "default_stone.png^tutorial_regnum_ore.png", - trigger = { - type = "dig", - node = "tutorial:stone_with_regnum", - target = 5 - } -}) -awards.register_achievement("award_regnum_ore_gold",{ - title = S("Regnum Ore (Gold)"), - description = S("Dig 10 Regnum Ore."), - icon = "default_stone.png^tutorial_regnum_ore.png", - trigger = { - type = "dig", - node = "tutorial:stone_with_regnum", - target = 10 - } -}) -awards.register_achievement("award_regnum_ore_platin",{ - title = S("Regnum Ore (Platin)"), - description = S("Dig 20 Regnum Ore."), - icon = "default_stone.png^tutorial_regnum_ore.png", - trigger = { - type = "dig", - node = "tutorial:stone_with_regnum", - target = 20 - } -}) -awards.register_achievement("award_???_bronze",{ - title = S("??? (Bronze)"), - description = S("?") -}) -awards.register_onDeath(function(player,data) - local pos = player:getpos() - if pos and minetest.find_node_near(pos, 5, "default:mese") ~= nil then - return "award_???_bronze" - end - return nil -end) - - -awards.register_achievement("award_???_silber",{ - title = S("??? (Silber)"), - description = S("?") -}) -awards.register_onDeath(function(player,data) - local pos = player:getpos() - if pos and minetest.find_node_near(pos, 5, "moreores:mineral_mithril") ~= nil then - return "award_???_silber" - end - return nil -end) - - -awards.register_achievement("award_???_gold",{ - title = S("??? (Gold)"), - description = S("?") -}) -awards.register_onDeath(function(player,data) - local pos = player:getpos() - if pos and minetest.find_node_near(pos, 5, "tutorial:stone_with_titan") ~= nil then - return "award_???_gold" - end - return nil -end) - -awards.register_achievement("award_???_platin",{ - title = S("??? (Platin)"), - description = S("?") -}) -awards.register_onDeath(function(player,data) - local pos = player:getpos() - if pos and minetest.find_node_near(pos, 5, "tutorial:stone_with_admin") ~= nil then - return "award_???_platin" - end - return nil -end) - - - - - +-- Copyright (c) 2013-18 rubenwardy. MIT. +-- The global award namespace +awards = { + show_mode = "hud", + registered_awards = {}, + registered_triggers = {}, + on_unlock = {}, +} +-- Internationalization support. +awards.gettext, awards.ngettext = dofile(minetest.get_modpath("awards").."/src/intllib.lua") +-- Load files +dofile(minetest.get_modpath("awards").."/src/data.lua") +dofile(minetest.get_modpath("awards").."/src/api_awards.lua") +dofile(minetest.get_modpath("awards").."/src/api_triggers.lua") +--dofile(minetest.get_modpath("awards").."/src/chat_commands.lua") +dofile(minetest.get_modpath("awards").."/src/gui.lua") +dofile(minetest.get_modpath("awards").."/src/triggers.lua") +dofile(minetest.get_modpath("awards").."/src/awards.lua") +awards.load() +minetest.register_on_shutdown(awards.save) +-- Backwards compatibility +awards.give_achievement = awards.unlock +awards.getFormspec = awards.get_formspec +awards.showto = awards.show_to +awards.register_onDig = awards.register_on_dig +awards.register_onPlace = awards.register_on_place +awards.register_onDeath = awards.register_on_death +awards.register_onChat = awards.register_on_chat +awards.register_onJoin = awards.register_on_join +awards.register_onCraft = awards.register_on_craft +awards.def = awards.registered_awards +awards.register_achievement = awards.register_award diff --git a/mods/awards/locale/de.po b/mods/awards/locale/de.po new file mode 100644 index 0000000..443c1b3 --- /dev/null +++ b/mods/awards/locale/de.po @@ -0,0 +1,824 @@ +# German translations for PACKAGE package. +# Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Wuzzy2, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-21 05:35-0300\n" +"PO-Revision-Date: 2017-02-21 04:19-0300\n" +"Last-Translator: Wuzzy2\n" +"Language-Team: German\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: api.lua +msgid "Secret Achievement Unlocked:" +msgstr "Geheime Auszeichnung erhalten:" + +#: api.lua +msgid "Achievement Unlocked:" +msgstr "Auszeichnung erhalten:" + +#: api.lua +#, lua-format +msgid "Secret Achievement Unlocked: %s" +msgstr "Geheime Auszeichnung erhalten: %s" + +#: api.lua +#, lua-format +msgid "Achievement Unlocked: %s" +msgstr "Auszeichnung erhalten: %s" + +#: api.lua +msgid "Secret Achievement Unlocked!" +msgstr "Geheime Auszeichnung erhalten!" + +#: api.lua +msgid "Achievement Unlocked!" +msgstr "Auszeichnung erhalten:" + +#: api.lua +msgid "Error: No awards available." +msgstr "Fehler: Keine Auszeichnungen vorhanden." + +#: api.lua +msgid "OK" +msgstr "OK" + +#: api.lua +msgid "(Secret Award)" +msgstr "(Geheime Auszeichnung)" + +#: api.lua +msgid "Unlock this award to find out what it is." +msgstr "Verdienen Sie sich diese Auszeichnung, um herauszufinden, was sie ist." + +#: api.lua +#, lua-format +msgid "%s (got)" +msgstr "%s (erhalten)" + +#: api.lua +msgid "You've disabled awards. Type /awards enable to reenable." +msgstr "" +"Sie haben die Auszeichnungen deaktiviert. Geben Sie »/awards enable« ein, um " +"sie wieder zu aktivieren." + +#: api.lua +msgid "You have not unlocked any awards." +msgstr "Sie haben noch keine Auszeichnungen." + +#: api.lua +#, lua-format +msgid "%s’s awards:" +msgstr "%ss Auszeichnungen:" + +#: api.lua chat_commands.lua +#, lua-format +msgid "%s: %s" +msgstr "%s: %s" + +#: sfinv.lua unified_inventory.lua +msgid "Awards" +msgstr "Auszeichnungen" + +#: triggers.lua +msgid "@1/@2 dug" +msgstr "@1/@2 abgebaut" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Mine: @2" +msgid_plural "Mine: @1×@2" +msgstr[0] "Bauen Sie einen Block ab: @2" +msgstr[1] "Bauen Sie Blöcke ab: @1×@2" + +#: triggers.lua +msgid "Mine @1 block." +msgid_plural "Mine @1 blocks." +msgstr[0] "Bauen Sie einen @1 Block ab." +msgstr[1] "Bauen Sie @1 Blöcke ab." + +#: triggers.lua +msgid "@1/@2 placed" +msgstr "@1/@2 platziert" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Place: @2" +msgid_plural "Place: @1×@2" +msgstr[0] "Platzieren Sie einen Block: @2" +msgstr[1] "Platzieren Sie Blöcke: @1×@2" + +#: triggers.lua +msgid "Place a block." +msgid_plural "Place @1 blocks." +msgstr[0] "Platzieren Sie einen Block." +msgstr[1] "Platzieren Sie @1 Blöcke." + +#: triggers.lua +msgid "@1/@2 eaten" +msgstr "@1/@2 gegessen" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Eat: @2" +msgid_plural "Eat: @1×@2" +msgstr[0] "Essen Sie: @2" +msgstr[1] "Essen Sie: @1×@2" + +#: triggers.lua +msgid "Eat an item." +msgid_plural "Eat @1 items." +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "@1/@2 deaths" +msgstr "@1/@2 Tode" + +#: triggers.lua +msgid "Die." +msgid_plural "Die @1 times." +msgstr[0] "Sterben Sie." +msgstr[1] "Sterben Sie @1 mal." + +#: triggers.lua +msgid "@1/@2 chat messages" +msgstr "@1/@2 Chatnachrichten" + +#: triggers.lua +msgid "Write something in chat." +msgid_plural "Write @1 chat messages." +msgstr[0] "Schreiben Sie etwas im Chat." +msgstr[1] "Schreiben Sie @1 Chatnachrichten." + +#: triggers.lua +msgid "@1/@2 game joins" +msgstr "@1/@2 Spielen beigetreten" + +#: triggers.lua +msgid "Join the game." +msgid_plural "Join the game @1 times." +msgstr[0] "Treten Sie dem Spiel bei." +msgstr[1] "Treten Sie dem Spiel @1 mal bei." + +#: triggers.lua +msgid "@1/@2 crafted" +msgstr "@1/@2 gefertigt" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Craft: @2" +msgid_plural "Craft: @1×@2" +msgstr[0] "Fertigen Sie an: @2" +msgstr[1] "Fertigen Sie an: @1×@2" + +#: triggers.lua +msgid "Craft an item." +msgid_plural "Craft @1 items." +msgstr[0] "" +msgstr[1] "" + +#: init.lua +msgid "Saint-Maclou" +msgstr "Saint-Maclou" + +#: init.lua +msgid "Place 20 coal checkers." +msgstr "Platzieren Sie 20 Kohlenschachbrettmuster." + +#: init.lua +msgid "Castorama" +msgstr "Gießmeister" + +#: init.lua +msgid "Place 20 iron checkers." +msgstr "Platzieren Sie 20 Eisenschachbrettmuster." + +#: init.lua +msgid "Sam the Trapper" +msgstr "Sam der Fallensteller" + +#: init.lua +msgid "Place 2 trap stones." +msgstr "Platzieren Sie 2 Fallensteine." + +#: init.lua +msgid "Backpacker" +msgstr "Rucksacktourist" + +#: init.lua +msgid "Craft 4 large bags." +msgstr "Fertigen Sie 4 große Taschen." + +#: init.lua +msgid "Pyromaniac" +msgstr "Pyromane" + +#: init.lua +msgid "Craft 8 times flint and steel." +msgstr "Fertigen Sie 8 mal einen Feuerstein und Stahl an." + +#: init.lua +msgid "Firefighter" +msgstr "Feuerwehr" + +#: init.lua +msgid "Put out 1000 fires." +msgstr "Löschen Sie 1000 Flammen." + +#: init.lua +msgid "Light It Up" +msgstr "Licht an!" + +#: init.lua +msgid "Place 100 torches." +msgstr "Platzieren Sie 100 Fackeln." + +#: init.lua +msgid "Well Lit" +msgstr "Gut ausgeleuchtet" + +#: init.lua +msgid "Place 1,000 torches." +msgstr "Platzieren Sie 1000 Fackeln." + +#: init.lua +msgid "Really Well Lit" +msgstr "Sehr gute Beleuchtung" + +#: init.lua +msgid "Craft 10 mese lamps." +msgstr "Fertigen Sie 10 Meselampen." + +#: init.lua +msgid "Outpost" +msgstr "Außenposten" + +#: init.lua +msgid "Craft 200 stone bricks." +msgstr "Fertigen Sie 200 Steinziegel." + +#: init.lua +msgid "Watchtower" +msgstr "Wachturm" + +#: init.lua +msgid "Craft 800 stone bricks." +msgstr "Fertigen Sie 800 Steinziegel an." + +#: init.lua +msgid "Fortress" +msgstr "Burg" + +#: init.lua +msgid "Craft 3,200 stone bricks." +msgstr "Fertigen Sie 3200 Steinziegel." + +#: init.lua +msgid "Desert Dweller" +msgstr "Wüstenbewohner" + +#: init.lua +msgid "Craft 400 desert stone bricks." +msgstr "Fertigen Sie 400 Wüstensteinziegel." + +#: init.lua +msgid "Pharaoh" +msgstr "Pharao" + +#: init.lua +msgid "Craft 100 sandstone bricks." +msgstr "Fertigen Sie 100 Sandsteinziegel." + +#: init.lua +msgid "Little Library" +msgstr "Kleine Bücherei" + +#: init.lua +msgid "Craft 7 bookshelves." +msgstr "Fertigen Sie 7 Bücherregale." + +#: init.lua +msgid "Lava and Water" +msgstr "Lava und Wasser" + +#: init.lua +msgid "Mine your first obsidian." +msgstr "Bauen Sie Ihr erstes Obsidian ab." + +#: init.lua +msgid "Obsessed with Obsidian" +msgstr "Von Obsidian besessen" + +#: init.lua +msgid "Mine 50 obsidian." +msgstr "Bauen Sie 50 Obsidian ab." + +#: init.lua +msgid "Lava Miner" +msgstr "Lavagräber" + +#: init.lua +msgid "Mine any block while being very close to lava." +msgstr "" +"Bauen Sie einen beliebigen Block ab, während Sie sehr nahe an der Lava " +"stehen." + +#: init.lua +msgid "On The Way" +msgstr "Auf dem Weg" + +#: init.lua +msgid "Place 100 rails." +msgstr "Platzieren Sie 100 Gleise." + +#: init.lua +msgid "First Day in the Woods" +msgstr "Erster Tag im Wald" + +#: init.lua +msgid "Dig 6 tree blocks." +msgstr "Bauen Sie 6 Baumblöcke ab." + +#: init.lua +msgid "Lumberjack" +msgstr "Holzfäller" + +#: init.lua +msgid "Dig 36 tree blocks." +msgstr "Bauen Sie 36 Baumblöcke ab." + +#: init.lua +msgid "Semi-pro Lumberjack" +msgstr "Fortgeschrittener Holzfäller" + +#: init.lua +msgid "Dig 216 tree blocks." +msgstr "Bauen Sie 216 Baumblöcke ab." + +#: init.lua +msgid "Professional Lumberjack" +msgstr "Profiholzfäller" + +#: init.lua +msgid "Dig 1,296 tree blocks." +msgstr "Bauen Sie 1296 Baumblöcke ab." + +#: init.lua +msgid "Junglebaby" +msgstr "Dschungelbaby" + +#: init.lua +msgid "Dig 100 jungle tree blocks." +msgstr "Bauen Sie 100 Dschungelbaumblöcke ab." + +#: init.lua +msgid "Jungleman" +msgstr "Dschungelmann" + +#: init.lua +msgid "Dig 1,000 jungle tree blocks." +msgstr "Bauen Sie 1000 Dschungelbaumblöcke ab." + +#: init.lua +msgid "First Mese Find" +msgstr "Erster Mesefund" + +#: init.lua +msgid "Mine your first mese ore." +msgstr "Bauen Sie Ihr erstes Meseerz ab." + +#: init.lua +msgid "Mese Mastery" +msgstr "Mesemeister" + +#: init.lua +msgid "Mine a mese block." +msgstr "Bauen Sie einen Meseblock ab." + +#: init.lua +msgid "You’re a copper" +msgstr "Du Kupfer!" + +#: init.lua +msgid "Dig 1,000 copper ores." +msgstr "Bauen Sie 1000 Kupfererze ab." + +#: init.lua +msgid "A Cat in a Pop-Tart?!" +msgstr "Eine Katze im Pop-Tart?!" + +#: init.lua +msgid "Mine a nyan cat." +msgstr "Bauen Sie eine Nyan Cat ab." + +#: init.lua +msgid "Mini Miner" +msgstr "Berganfänger" + +#: init.lua +msgid "Dig 100 stone blocks." +msgstr "Bauen Sie 100 Steinblöcke ab." + +#: init.lua +msgid "Hardened Miner" +msgstr "Abhehärteter Bergarbeiter" + +#: init.lua +msgid "Dig 1,000 stone blocks." +msgstr "Bauen Sie 1000 Steine ab." + +#: init.lua +msgid "Master Miner" +msgstr "Profibergarbeiter" + +#: init.lua +msgid "Dig 10,000 stone blocks." +msgstr "Bauen Sie 10000 Steine ab." + +#: init.lua +msgid "Marchand De Sable" +msgstr "" + +#: init.lua +msgid "Dig 1,000 sand." +msgstr "Bauen Sie 1000 Sand ab." + +#: init.lua +msgid "Crafter of Sticks" +msgstr "Stockmacher" + +#: init.lua +msgid "Craft 100 sticks." +msgstr "Fertigen Sie 100 Stöcke." + +#: init.lua +msgid "Jungle Discoverer" +msgstr "Dschungelerkunder" + +#: init.lua +msgid "Mine your first jungle grass." +msgstr "Bauen Sie Ihr erstes Dschungelgras ab." + +#: init.lua +msgid "Grasslands Discoverer" +msgstr "Prärieerkunder" + +#: init.lua +msgid "Mine some grass." +msgstr "Bauen Sie etwas Gras ab." + +#: init.lua +msgid "Savannah Discoverer" +msgstr "Savannenerkunder" + +#: init.lua +msgid "Mine some dry grass." +msgstr "Bauen Sie etwas trockenes Gras ab." + +#: init.lua +msgid "Desert Discoverer" +msgstr "Wüstenerkunder" + +#: init.lua +msgid "Mine your first cactus." +msgstr "Bauen Sie Ihren ersten Kaktus ab." + +#: init.lua +msgid "Far Lands" +msgstr "Ferne Lande" + +#: init.lua +msgid "Mine your first dry shrub." +msgstr "Bauen Sie Ihren ersten vertrockneten Strauch ab." + +#: init.lua +msgid "Glacier Discoverer" +msgstr "Gletschererkunder" + +#: init.lua +msgid "Mine your first ice." +msgstr "Bauen Sie Ihr erstes Eis ab." + +#: init.lua +msgid "Very Simple Snow Man" +msgstr "Sehr simpler Schneemann" + +#: init.lua +msgid "Place two snow blocks." +msgstr "Platzieren Sie zwei Schneeblöcke." + +#: init.lua +msgid "First Gold Find" +msgstr "Erster Goldfund" + +#: init.lua +msgid "Mine your first gold ore." +msgstr "Bauen Sie Ihr erstes Golderz ab." + +#: init.lua +msgid "Gold Rush" +msgstr "Goldrausch" + +#: init.lua +msgid "Mine 45 gold ores." +msgstr "Bauen Sie 18 Diamanterze ab." + +#: init.lua +msgid "Wow, I am Diamonds!" +msgstr "Wow, ich bin Diamanten!" + +#: init.lua +msgid "Mine your first diamond ore." +msgstr "Bauen Sie Ihr erstes Diamanterz ab." + +#: init.lua +msgid "Girl's Best Friend" +msgstr "Bester Freund der Mädchen" + +#: init.lua +msgid "Mine 18 diamond ores." +msgstr "Bauen Sie 18 Diamanterze ab." + +#: init.lua +msgid "Hardest Block on Earth" +msgstr "Härtester Block der Welt" + +#: init.lua +msgid "Craft a diamond block." +msgstr "Fertigen Sie einen Diamantblock an." + +#: init.lua +msgid "In the Dungeon" +msgstr "Im Verlies" + +#: init.lua +msgid "Mine a mossy cobblestone." +msgstr "Bauen Sie ein bemoostes Kopfsteinpflaster ab." + +#: init.lua +msgid "Smelter" +msgstr "Schmelzer" + +#: init.lua +msgid "Craft 10 furnaces." +msgstr "Fertigen Sie 10 Öfen." + +#: init.lua +msgid "Treasurer" +msgstr "Schatzmeister" + +#: init.lua +msgid "Craft 15 chests." +msgstr "Fertigen Sie 15 Truhen." + +#: init.lua +msgid "Bankier" +msgstr "Bankier" + +#: init.lua +msgid "Craft 30 locked chests." +msgstr "Fertigen Sie 30 abgeschlossene Truhen." + +#: init.lua +msgid "Bricker" +msgstr "Ziegler" + +#: init.lua +msgid "Craft 200 brick blocks." +msgstr "Fertigen Sie 200 Ziegelblöcke." + +#: init.lua +msgid "House of Obsidian" +msgstr "Haus aus Obsidian" + +#: init.lua +msgid "Craft 100 obsidian bricks." +msgstr "Fertigen Sie 100 Obsidianziegel." + +#: init.lua +msgid "Build a Cave" +msgstr "Höhlenbauer" + +#: init.lua +msgid "Place 100 stone." +msgstr "Platzieren Sie 100 Steine." + +#: init.lua +msgid "Long Ladder" +msgstr "Lange Leiter" + +#: init.lua +msgid "Place 400 wooden ladders." +msgstr "Platzieren Sie 400 Holzleitern." + +#: init.lua +msgid "Industrial Age" +msgstr "Industriezeitalter" + +#: init.lua +msgid "Place 40 steel ladders." +msgstr "Platzieren Sie 40 Stahlleitern." + +#: init.lua +msgid "Yummy!" +msgstr "Lecker!" + +#: init.lua +msgid "Eat 80 apples." +msgstr "Essen Sie 80 Äpfel." + +#: init.lua +msgid "Glasser" +msgstr "Glasmacher" + +#: init.lua +msgid "Craft 14 vessels shelves." +msgstr "Fertigen Sie 14 Gefäßregale." + +#: init.lua +msgid "Farming Skills Acquired" +msgstr "Landwirtschaft erlernt" + +#: init.lua +msgid "Harvest a fully grown wheat plant." +msgstr "Ernten Sie eine voll ausgewachsene Getreidepflanze." + +#: init.lua +msgid "Field Worker" +msgstr "Feldarbeiter" + +#: init.lua +msgid "Harvest 25 fully grown wheat plants." +msgstr "Ernten Sie 25 voll ausgewachsene Getreidepflanzen." + +#: init.lua +msgid "Aspiring Farmer" +msgstr "Aufstrebender Bauer" + +#: init.lua +msgid "Harvest 125 fully grown wheat plants." +msgstr "Ernten Sie 125 voll ausgewachsene Getreidepflanzen." + +#: init.lua +msgid "Wheat Magnate" +msgstr "Getreidemagnat" + +#: init.lua +msgid "Harvest 625 fully grown wheat plants." +msgstr "Ernten Sie 625 voll ausgewachsene Getreidepflanzen." + +#: init.lua +msgid "Baker" +msgstr "Bäcker" + +#: init.lua +msgid "Eat 10 loaves of bread." +msgstr "Essen Sie 10 Brote." + +#: init.lua +msgid "Wool Over Your Eyes" +msgstr "Wollige Augen" + +#: init.lua +msgid "Craft 250 white wool." +msgstr "Fertigen Sie 250 weiße Wolle." + +#: init.lua +msgid "Hotelier" +msgstr "Hotelier" + +#: init.lua +msgid "Craft 15 fancy beds." +msgstr "Fertigen Sie 15 schicke Betten." + +#: init.lua +msgid "Filthy Rich" +msgstr "Stinkreich" + +#: init.lua +msgid "Craft 24 gold block stairs." +msgstr "Fertigen Sie 24 Goldblockstufen." + +#: init.lua +msgid "Roses Are Red" +msgstr "Rosen sind rot" + +#: init.lua +msgid "Craft 400 red dyes." +msgstr "Fertigen Sie 400 rote Farbstoffe." + +#: init.lua +msgid "Dandelions are Yellow" +msgstr "Löwenzahn ist gelb" + +#: init.lua +msgid "Craft 400 yellow dyes." +msgstr "Fertigen Sie 400 gelbe Farbstoffe." + +#: init.lua +msgid "Geraniums are Blue" +msgstr "Geranien sind blau" + +#: init.lua +msgid "Craft 400 blue dyes." +msgstr "Fertigen Sie 400 blaue Farbstoffe." + +#: init.lua +msgid "White Color Stock" +msgstr "Weißer Farbstoffvorrat" + +#: init.lua +msgid "Craft 100 white dyes." +msgstr "Fertigen Sie 100 weiße Farbstoffe." + +#: init.lua +msgid "Tasty Mushrooms" +msgstr "Leckere Pilze" + +#: init.lua +msgid "Eat 3 brown mushrooms." +msgstr "Essen Sie 3 braune Pilze." + +#: init.lua +msgid "Mushroom Lover" +msgstr "Pilzfreund" + +#: init.lua +msgid "Eat 33 brown mushrooms." +msgstr "Essen Sie 33 braune Pilze." + +#: init.lua +msgid "Underground Mushroom Farmer" +msgstr "Unterirdischer Pilzbauer" + +#: init.lua +msgid "Eat 333 brown mushrooms." +msgstr "Essen Sie 333 braune Pilze." + +#: init.lua +msgid "Builder" +msgstr "Bauarbeiter" + +#: init.lua +msgid "Constructor" +msgstr "Konstrukteur" + +#: init.lua +msgid "Architect" +msgstr "Architekt" + +#: init.lua +msgid "Master Architect" +msgstr "Meisterarchitekt" + +#: chat_commands.lua +msgid "[c|clear|disable|enable]" +msgstr "[c|clear|disable|enable]" + +#: chat_commands.lua +msgid "Show, clear, disable or enable your achievements" +msgstr "Zeigen, löschen, deaktivieren oder aktivieren Sie Ihre Auszeichnungen" + +#: chat_commands.lua +msgid "" +"All your awards and statistics have been cleared. You can now start again." +msgstr "" +"All Ihre Auszeichnugen und Statistiken wurden zurückgesetzt. Sie können nun " +"von vorne anfangen." + +#: chat_commands.lua +msgid "You have disabled your achievements." +msgstr "Sie haben Ihre Auszeichnungen deaktiviert." + +#: chat_commands.lua +msgid "You have enabled your achievements." +msgstr "Sie haben Ihre Auszeichnungen aktiviert." + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Show details of an achievement" +msgstr "Details einer Auszeichnung anzeigen" + +#: chat_commands.lua +msgid "Achievement not found." +msgstr "Auszeichnung nicht gefunden." + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Get the achievements statistics for the given player or yourself" +msgstr "Die Statistik der Auszeichnungen eines Spielers zeigen" diff --git a/mods/awards/locale/es.po b/mods/awards/locale/es.po new file mode 100644 index 0000000..a2d5958 --- /dev/null +++ b/mods/awards/locale/es.po @@ -0,0 +1,825 @@ +# Spanish translations for PACKAGE package +# Traducciones al español para el paquete PACKAGE. +# Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Diego Martínez , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-21 05:35-0300\n" +"PO-Revision-Date: 2017-02-20 22:17-0300\n" +"Last-Translator: Diego Martínez \n" +"Language-Team: Spanish\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: api.lua +msgid "Secret Achievement Unlocked:" +msgstr "Logro secreto desbloqueado:" + +#: api.lua +msgid "Achievement Unlocked:" +msgstr "Logro desbloqueado:" + +#: api.lua +#, lua-format +msgid "Secret Achievement Unlocked: %s" +msgstr "Logro secreto desbloqueado: %s" + +#: api.lua +#, lua-format +msgid "Achievement Unlocked: %s" +msgstr "Logro desbloqueado: %s" + +#: api.lua +msgid "Secret Achievement Unlocked!" +msgstr "Logro secreto desbloqueado!" + +#: api.lua +msgid "Achievement Unlocked!" +msgstr "Logro desbloqueado!" + +#: api.lua +msgid "Error: No awards available." +msgstr "Error: No hay logros disponibles." + +#: api.lua +msgid "OK" +msgstr "Aceptar" + +#: api.lua +msgid "(Secret Award)" +msgstr "(Logro secreto)" + +#: api.lua +msgid "Unlock this award to find out what it is." +msgstr "Desbloquea éste logro para saber qué es." + +#: api.lua +#, lua-format +msgid "%s (got)" +msgstr "%s (obtenido)" + +#: api.lua +msgid "You've disabled awards. Type /awards enable to reenable." +msgstr "" +"Has deshabilitado los logros. Escribe \"/awards enable\" para reactivar." + +#: api.lua +msgid "You have not unlocked any awards." +msgstr "No has desbloqueado ningún logro." + +#: api.lua +#, lua-format +msgid "%s’s awards:" +msgstr "Logros de %s:" + +#: api.lua chat_commands.lua +#, lua-format +msgid "%s: %s" +msgstr "%s: %s" + +#: sfinv.lua unified_inventory.lua +msgid "Awards" +msgstr "Logros" + +#: triggers.lua +msgid "@1/@2 dug" +msgstr "@1/@2 excavados" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Mine: @2" +msgid_plural "Mine: @1×@2" +msgstr[0] "Excavar: @2" +msgstr[1] "Excavar: @1×@2" + +#: triggers.lua +msgid "Mine @1 block." +msgid_plural "Mine @1 blocks." +msgstr[0] "Excavar un bloque." +msgstr[1] "Excavar @1 bloques." + +#: triggers.lua +msgid "@1/@2 placed" +msgstr "@1/@2 colocados" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Place: @2" +msgid_plural "Place: @1×@2" +msgstr[0] "Colocar: @2" +msgstr[1] "Colocar: @1×@2" + +#: triggers.lua +msgid "Place a block." +msgid_plural "Place @1 blocks." +msgstr[0] "Colocar un bloque." +msgstr[1] "Colocar @1 bloques." + +#: triggers.lua +msgid "@1/@2 eaten" +msgstr "@1/@2 comidos" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Eat: @2" +msgid_plural "Eat: @1×@2" +msgstr[0] "Comer: @2" +msgstr[1] "Comer: @1×@2" + +#: triggers.lua +msgid "Eat an item." +msgid_plural "Eat @1 items." +msgstr[0] "Comer un objeto." +msgstr[1] "Comer @1 objetos." + +#: triggers.lua +msgid "@1/@2 deaths" +msgstr "@1/@2 muertes" + +#: triggers.lua +msgid "Die." +msgid_plural "Die @1 times." +msgstr[0] "Morir." +msgstr[1] "Morir @1 veces." + +#: triggers.lua +msgid "@1/@2 chat messages" +msgstr "@1/@2 conversaciones" + +#: triggers.lua +msgid "Write something in chat." +msgid_plural "Write @1 chat messages." +msgstr[0] "Escribir algo." +msgstr[1] "Escribir @1 mensajes." + +#: triggers.lua +msgid "@1/@2 game joins" +msgstr "@1/@2 veces unido" + +#: triggers.lua +msgid "Join the game." +msgid_plural "Join the game @1 times." +msgstr[0] "Unirse al juego." +msgstr[1] "Unirse al juego @1 veces." + +#: triggers.lua +msgid "@1/@2 crafted" +msgstr "@1/@2 elaborado" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Craft: @2" +msgid_plural "Craft: @1×@2" +msgstr[0] "Elaborar: @2" +msgstr[1] "Elaborar: %1×@2" + +#: triggers.lua +msgid "Craft an item." +msgid_plural "Craft @1 items." +msgstr[0] "Elaborar un objeto." +msgstr[1] "Elaborar @1 objetos." + +#: init.lua +msgid "Saint-Maclou" +msgstr "Saint-Maclou" + +#: init.lua +msgid "Place 20 coal checkers." +msgstr "Colocar 20 baldosas de ajedrez de carbón." + +#: init.lua +msgid "Castorama" +msgstr "Castorama" + +#: init.lua +msgid "Place 20 iron checkers." +msgstr "Colocar 20 baldosas de ajedrez de hierro." + +#: init.lua +msgid "Sam the Trapper" +msgstr "Sam el Atrapador" + +#: init.lua +msgid "Place 2 trap stones." +msgstr "Colocar 2 piedras trampa." + +#: init.lua +msgid "Backpacker" +msgstr "Mochilero" + +#: init.lua +msgid "Craft 4 large bags." +msgstr "Elaborar 4 bolsas grandes." + +#: init.lua +msgid "Pyromaniac" +msgstr "Piromaníaco" + +#: init.lua +msgid "Craft 8 times flint and steel." +msgstr "Elaborar pedernal y hierro 8 veces." + +#: init.lua +msgid "Firefighter" +msgstr "Bombero" + +#: init.lua +msgid "Put out 1000 fires." +msgstr "Apagar 1000 incendios." + +#: init.lua +msgid "Light It Up" +msgstr "Ilumínalo" + +#: init.lua +msgid "Place 100 torches." +msgstr "Colocar 100 antorchas." + +#: init.lua +msgid "Well Lit" +msgstr "Bien Iluminado" + +#: init.lua +msgid "Place 1,000 torches." +msgstr "Colocar 1.000 antorchas." + +#: init.lua +msgid "Really Well Lit" +msgstr "Realmente Bien Iluminado" + +#: init.lua +msgid "Craft 10 mese lamps." +msgstr "Elaborar 10 lámparas de MESE." + +#: init.lua +msgid "Outpost" +msgstr "Puesto de avanzada" + +#: init.lua +msgid "Craft 200 stone bricks." +msgstr "Elaborar 200 ladrillos de piedra." + +#: init.lua +msgid "Watchtower" +msgstr "Torre del vigía" + +#: init.lua +msgid "Craft 800 stone bricks." +msgstr "Elaborar 800 ladrillos de piedra." + +#: init.lua +msgid "Fortress" +msgstr "Fortaleza" + +#: init.lua +msgid "Craft 3,200 stone bricks." +msgstr "Elaborar 3.200 ladrillos de piedra." + +#: init.lua +msgid "Desert Dweller" +msgstr "Morador Desértico" + +#: init.lua +msgid "Craft 400 desert stone bricks." +msgstr "Elaborar 400 ladrillos de piedra desértica." + +#: init.lua +msgid "Pharaoh" +msgstr "Faraón" + +#: init.lua +msgid "Craft 100 sandstone bricks." +msgstr "Elaborar 200 ladrillos de arenisca." + +#: init.lua +msgid "Little Library" +msgstr "Pequeña Biblioteca" + +#: init.lua +msgid "Craft 7 bookshelves." +msgstr "Elaborar 7 libreros." + +#: init.lua +msgid "Lava and Water" +msgstr "Lava y Agua" + +#: init.lua +msgid "Mine your first obsidian." +msgstr "Excavar tu primera obsidiana." + +#: init.lua +msgid "Obsessed with Obsidian" +msgstr "Obsesionado con la Obsidiana" + +#: init.lua +msgid "Mine 50 obsidian." +msgstr "Excavar 50 obsidianas." + +#: init.lua +msgid "Lava Miner" +msgstr "Minero de Lava" + +#: init.lua +msgid "Mine any block while being very close to lava." +msgstr "Excavar un bloque cerca de lava." + +#: init.lua +msgid "On The Way" +msgstr "En Camino" + +#: init.lua +msgid "Place 100 rails." +msgstr "Colocar 100 rieles." + +#: init.lua +msgid "First Day in the Woods" +msgstr "Primer Día en el Bosque" + +#: init.lua +msgid "Dig 6 tree blocks." +msgstr "Cortar 6 árboles." + +#: init.lua +msgid "Lumberjack" +msgstr "Leñador" + +#: init.lua +msgid "Dig 36 tree blocks." +msgstr "Cortar 36 árboles." + +#: init.lua +msgid "Semi-pro Lumberjack" +msgstr "Leñador semi-profesional" + +#: init.lua +msgid "Dig 216 tree blocks." +msgstr "Cortar 216 árboles." + +#: init.lua +msgid "Professional Lumberjack" +msgstr "Leñador profesional" + +#: init.lua +msgid "Dig 1,296 tree blocks." +msgstr "Cortar 1.296 árboles." + +#: init.lua +msgid "Junglebaby" +msgstr "Bebé de la Selva" + +#: init.lua +msgid "Dig 100 jungle tree blocks." +msgstr "Cortar 100 árboles selváticos." + +#: init.lua +msgid "Jungleman" +msgstr "Hombre de la Selva" + +#: init.lua +msgid "Dig 1,000 jungle tree blocks." +msgstr "Cortar 1.000 árboles selváticos." + +#: init.lua +msgid "First Mese Find" +msgstr "Primer Encuentro de MESE" + +#: init.lua +msgid "Mine your first mese ore." +msgstr "Excava tu primer mineral de MESE." + +#: init.lua +msgid "Mese Mastery" +msgstr "Maestría de MESE" + +#: init.lua +msgid "Mine a mese block." +msgstr "Excava tu primer bloque de MESE." + +#: init.lua +msgid "You’re a copper" +msgstr "Eres un cobre" + +#: init.lua +msgid "Dig 1,000 copper ores." +msgstr "Excavar 1.000 minerales de cobre" + +#: init.lua +msgid "A Cat in a Pop-Tart?!" +msgstr "¡¿Un Gato en un Pop-Tart?!" + +#: init.lua +msgid "Mine a nyan cat." +msgstr "Excavar un Gato Nyan." + +#: init.lua +msgid "Mini Miner" +msgstr "Mini Minero" + +#: init.lua +msgid "Dig 100 stone blocks." +msgstr "Excavar 100 bloques de piedra." + +#: init.lua +msgid "Hardened Miner" +msgstr "Minero Curtido" + +#: init.lua +msgid "Dig 1,000 stone blocks." +msgstr "Excavar 1.000 bloques de piedra." + +#: init.lua +msgid "Master Miner" +msgstr "Minero Maestro" + +#: init.lua +msgid "Dig 10,000 stone blocks." +msgstr "Excavar 10.000 bloques de piedra." + +#: init.lua +msgid "Marchand De Sable" +msgstr "Marchand De Sable" + +#: init.lua +msgid "Dig 1,000 sand." +msgstr "Cavar 1.000 bloques de arena." + +#: init.lua +msgid "Crafter of Sticks" +msgstr "Elaborador de Varitas" + +#: init.lua +msgid "Craft 100 sticks." +msgstr "Elaborar 100 varitas." + +#: init.lua +msgid "Jungle Discoverer" +msgstr "Descubridor de Selva" + +#: init.lua +msgid "Mine your first jungle grass." +msgstr "Cortar tu primer pasto de selva." + +#: init.lua +msgid "Grasslands Discoverer" +msgstr "Descubridor de Praderas" + +#: init.lua +msgid "Mine some grass." +msgstr "Cortar un poco de pasto." + +#: init.lua +msgid "Savannah Discoverer" +msgstr "Descubridor de Savana" + +#: init.lua +msgid "Mine some dry grass." +msgstr "Cortar un poco de pasto seco." + +#: init.lua +msgid "Desert Discoverer" +msgstr "Descubridor del Desierto" + +#: init.lua +msgid "Mine your first cactus." +msgstr "Cortar tu primer cácto." + +#: init.lua +msgid "Far Lands" +msgstr "Tierras Lejanas" + +#: init.lua +msgid "Mine your first dry shrub." +msgstr "Cortar tu primer arbusto seco" + +#: init.lua +msgid "Glacier Discoverer" +msgstr "Descubridor del Glaciar" + +#: init.lua +msgid "Mine your first ice." +msgstr "Romper tu primer bloque de hielo." + +#: init.lua +msgid "Very Simple Snow Man" +msgstr "Muñeco de Nieve Muy Simple" + +#: init.lua +msgid "Place two snow blocks." +msgstr "Colocar dos bloques de nieve." + +#: init.lua +msgid "First Gold Find" +msgstr "Primer Encuentro de Oro" + +#: init.lua +msgid "Mine your first gold ore." +msgstr "Excavar tu primer pepita de oro." + +#: init.lua +msgid "Gold Rush" +msgstr "Fiebre del Oro" + +#: init.lua +msgid "Mine 45 gold ores." +msgstr "Excavar 45 pepitas de oro." + +#: init.lua +msgid "Wow, I am Diamonds!" +msgstr "¡Guau, Soy Diamantes!" + +#: init.lua +msgid "Mine your first diamond ore." +msgstr "Excava tu primer diamante." + +#: init.lua +msgid "Girl's Best Friend" +msgstr "El Mejor Amigo de Las Mujeres" + +#: init.lua +msgid "Mine 18 diamond ores." +msgstr "Excava 10 diamantes." + +#: init.lua +msgid "Hardest Block on Earth" +msgstr "El Bloque Más Duro Sobre La Tierra" + +#: init.lua +msgid "Craft a diamond block." +msgstr "Elaborar un bloque de diamante." + +#: init.lua +msgid "In the Dungeon" +msgstr "En Las Mazmorras" + +#: init.lua +msgid "Mine a mossy cobblestone." +msgstr "Excavar unos adoquines musgosos." + +#: init.lua +msgid "Smelter" +msgstr "Fundidor" + +#: init.lua +msgid "Craft 10 furnaces." +msgstr "Elaborar 10 hornos." + +#: init.lua +msgid "Treasurer" +msgstr "Tesorero" + +#: init.lua +msgid "Craft 15 chests." +msgstr "Elaborar 15 cofres." + +#: init.lua +msgid "Bankier" +msgstr "Banquero" + +#: init.lua +msgid "Craft 30 locked chests." +msgstr "Elaborar 30 bloques cerrados." + +#: init.lua +msgid "Bricker" +msgstr "Ladrillero" + +#: init.lua +msgid "Craft 200 brick blocks." +msgstr "Elaborar 200 bloques de ladrillo." + +#: init.lua +msgid "House of Obsidian" +msgstr "Casa de Obsidiana" + +#: init.lua +msgid "Craft 100 obsidian bricks." +msgstr "Elaborar 100 ladrillos de obsidiana." + +#: init.lua +msgid "Build a Cave" +msgstr "Construye Una Cueva" + +#: init.lua +msgid "Place 100 stone." +msgstr "Coloca 100 piedras." + +#: init.lua +msgid "Long Ladder" +msgstr "Escalerilla Larga" + +#: init.lua +msgid "Place 400 wooden ladders." +msgstr "Coloca 400 escalerillas de madera." + +#: init.lua +msgid "Industrial Age" +msgstr "Era Industrial" + +#: init.lua +msgid "Place 40 steel ladders." +msgstr "Coloca 40 escalerillas de acero." + +#: init.lua +msgid "Yummy!" +msgstr "¡Qué Rico!" + +#: init.lua +msgid "Eat 80 apples." +msgstr "Come 80 manzanas." + +# Intentionally marked as fuzzy. +#: init.lua +#, fuzzy +msgid "Glasser" +msgstr "Vidriero" + +#: init.lua +msgid "Craft 14 vessels shelves." +msgstr "Elabora 14 estanterías para botellas." + +#: init.lua +msgid "Farming Skills Acquired" +msgstr "Habilidades de Granja Adquiridas" + +#: init.lua +msgid "Harvest a fully grown wheat plant." +msgstr "Cosecha una plantas de trigo madura." + +#: init.lua +msgid "Field Worker" +msgstr "Trabajador de Campo" + +#: init.lua +msgid "Harvest 25 fully grown wheat plants." +msgstr "Cosecha 25 plantas de trigo maduras." + +#: init.lua +msgid "Aspiring Farmer" +msgstr "Aspirante a Granjero" + +#: init.lua +msgid "Harvest 125 fully grown wheat plants." +msgstr "Cosecha 125 plantas de trigo maduras." + +#: init.lua +msgid "Wheat Magnate" +msgstr "Magnate del Maíz" + +#: init.lua +msgid "Harvest 625 fully grown wheat plants." +msgstr "Cosecha 625 plantas de trigo maduras." + +#: init.lua +msgid "Baker" +msgstr "Panadero" + +#: init.lua +msgid "Eat 10 loaves of bread." +msgstr "Come 10 rebanadas de pan." + +#: init.lua +msgid "Wool Over Your Eyes" +msgstr "Lana Sobre Tus Ojos" + +#: init.lua +msgid "Craft 250 white wool." +msgstr "Elabora 250 bloques de lana blanca." + +#: init.lua +msgid "Hotelier" +msgstr "Hotelero" + +#: init.lua +msgid "Craft 15 fancy beds." +msgstr "Elabora 15 camas de lujo." + +#: init.lua +msgid "Filthy Rich" +msgstr "Sucio Rico" + +#: init.lua +msgid "Craft 24 gold block stairs." +msgstr "Elabora 24 escaleras de bloque de oro." + +#: init.lua +msgid "Roses Are Red" +msgstr "Las Rosas Son Rojas" + +#: init.lua +msgid "Craft 400 red dyes." +msgstr "Elabora 400 colorantes rojos." + +#: init.lua +msgid "Dandelions are Yellow" +msgstr "Los Dientes de León Son Amarillos" + +#: init.lua +msgid "Craft 400 yellow dyes." +msgstr "Elabora 400 colorantes amarillos." + +#: init.lua +msgid "Geraniums are Blue" +msgstr "Los Geranios Son Azules" + +#: init.lua +msgid "Craft 400 blue dyes." +msgstr "Elabora 400 colorantes azules." + +#: init.lua +msgid "White Color Stock" +msgstr "Reserva de Color Blanco" + +#: init.lua +msgid "Craft 100 white dyes." +msgstr "Elabora 100 colorantes blancos." + +#: init.lua +msgid "Tasty Mushrooms" +msgstr "Ricos Hongos" + +#: init.lua +msgid "Eat 3 brown mushrooms." +msgstr "Come 3 hongos marrones." + +#: init.lua +msgid "Mushroom Lover" +msgstr "Amante de los Hongos" + +#: init.lua +msgid "Eat 33 brown mushrooms." +msgstr "Come 33 hongos marrones." + +#: init.lua +msgid "Underground Mushroom Farmer" +msgstr "Granjero de Hongos Subterráneo" + +#: init.lua +msgid "Eat 333 brown mushrooms." +msgstr "Come 333 hongos marrones." + +# Nota: "Builder" y "Constructor" se traducen a "Constructor", +# así que lo traduje de ésta manera para diferenciar. +#: init.lua +msgid "Builder" +msgstr "Hacedor" + +#: init.lua +msgid "Constructor" +msgstr "Constructor" + +#: init.lua +msgid "Architect" +msgstr "Arquitecto" + +#: init.lua +msgid "Master Architect" +msgstr "Maestro Arquitecto" + +#: chat_commands.lua +msgid "[c|clear|disable|enable]" +msgstr "[c|clear|disable|enable]" + +#: chat_commands.lua +msgid "Show, clear, disable or enable your achievements" +msgstr "Mostrar, limpiar, deshabilitar o habilitar tus logros" + +#: chat_commands.lua +msgid "" +"All your awards and statistics have been cleared. You can now start again." +msgstr "" +"Todos tus logros y estadísticas han sido borrados. Puedes iniciar nuevamente." + +#: chat_commands.lua +msgid "You have disabled your achievements." +msgstr "Has deshabilitado tus logros." + +#: chat_commands.lua +msgid "You have enabled your achievements." +msgstr "Has habilitado tus logros." + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Show details of an achievement" +msgstr "Muestra los detalles de un logro" + +#: chat_commands.lua +msgid "Achievement not found." +msgstr "Logro no encontrado." + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Get the achievements statistics for the given player or yourself" +msgstr "Obtener las estadísticas y logros del jugador dado" diff --git a/mods/awards/locale/fr.po b/mods/awards/locale/fr.po new file mode 100644 index 0000000..e173437 --- /dev/null +++ b/mods/awards/locale/fr.po @@ -0,0 +1,818 @@ +# French translations for PACKAGE package. +# Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# xisd, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-21 05:50-0300\n" +"PO-Revision-Date: 2017-02-21 05:50-0300\n" +"Last-Translator: xisd\n" +"Language-Team: French\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: api.lua +msgid "Secret Achievement Unlocked:" +msgstr "Réussite Secrète Débloquée :" + +#: api.lua +msgid "Achievement Unlocked:" +msgstr "Réussite Débloquée :" + +#: api.lua +#, lua-format +msgid "Secret Achievement Unlocked: %s" +msgstr "Réussite Secrète Débloquée : %s" + +#: api.lua +#, lua-format +msgid "Achievement Unlocked: %s" +msgstr "Réussite Débloquée : %s" + +#: api.lua +msgid "Secret Achievement Unlocked!" +msgstr "Réussite Secrète Débloquée !" + +#: api.lua +msgid "Achievement Unlocked!" +msgstr "Réussite Débloquée !" + +#: api.lua +msgid "Error: No awards available." +msgstr "Erreur : Aucun trophée disponible" + +#: api.lua +msgid "OK" +msgstr "OK" + +#: api.lua +msgid "(Secret Award)" +msgstr "(Trophée Secret)" + +#: api.lua +msgid "Unlock this award to find out what it is." +msgstr "Débloque ce trophée pour découvrir ce que c'est." + +#: api.lua +#, lua-format +msgid "%s (got)" +msgstr "%s (obtenu)" + +#: api.lua +msgid "You've disabled awards. Type /awards enable to reenable." +msgstr "Vous avez désactivé les trophées. Tapez '/awards enable' pour les réactiver." + +#: api.lua +msgid "You have not unlocked any awards." +msgstr "Vous n'avez encore débloqué aucun trophée." + +#: api.lua +#, lua-format +msgid "%s’s awards:" +msgstr "Les trophées de %s :" + +#: api.lua chat_commands.lua +#, lua-format +msgid "%s: %s" +msgstr "%s : %s" + +#: sfinv.lua unified_inventory.lua +msgid "Awards" +msgstr "Trophées" + +#: triggers.lua +msgid "@1/@2 dug" +msgstr "@1/@2 creusés" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Mine: @2" +msgid_plural "Mine: @1×@2" +msgstr[0] "Mine : @2" +msgstr[1] "Mine : @1×@2" + +#: triggers.lua +msgid "Mine @1 block." +msgid_plural "Mine @1 blocks." +msgstr[0] "Creuse @1 bloc." +msgstr[1] "Creuse @1 blocs." + +#: triggers.lua +msgid "@1/@2 placed" +msgstr "@1/@2 placés" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Place: @2" +msgid_plural "Place: @1×@2" +msgstr[0] "Place : @2" +msgstr[1] "Place : @1×@2" + +#: triggers.lua +msgid "Place a block." +msgid_plural "Place @1 blocks." +msgstr[0] "Place un bloc." +msgstr[1] "Place @1 blocs." + +#: triggers.lua +msgid "@1/@2 eaten" +msgstr "@1/@2 Mangés" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Eat: @2" +msgid_plural "Eat: @1×@2" +msgstr[0] "Mange : @2" +msgstr[1] "Mange : @1×@2" + +#: triggers.lua +msgid "Eat an item." +msgid_plural "Eat @1 items." +msgstr[0] "Mange quelque chose." +msgstr[1] "Mange @1 aliments." + +#: triggers.lua +msgid "@1/@2 deaths" +msgstr "@1/@2 morts" + +#: triggers.lua +msgid "Die." +msgid_plural "Die @1 times." +msgstr[0] "Mort·e." +msgstr[1] "Mort·e %d fois." + +#: triggers.lua +msgid "@1/@2 chat messages" +msgstr "@1/@2 messages du chat" + +#: triggers.lua +msgid "Write something in chat." +msgid_plural "Write @1 chat messages." +msgstr[0] "Écrit quelque chose dans le chat." +msgstr[1] "Écrit @1 messages dans le chat." + +#: triggers.lua +msgid "@1/@2 game joins" +msgstr "@1/@2 connexions" + +#: triggers.lua +msgid "Join the game." +msgid_plural "Join the game @1 times." +msgstr[0] "Connecte toi au jeu." +msgstr[1] "Connecte toi au jeu @1 fois." + +#: triggers.lua +msgid "@1/@2 crafted" +msgstr "@1/@2 craftés" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Craft: @2" +msgid_plural "Craft: @1×@2" +msgstr[0] "Fabrique : @2" +msgstr[1] "Fabrique : @1×@2" + +#: triggers.lua +msgid "Craft an item." +msgid_plural "Craft @1 items." +msgstr[0] "Confectionne un objet." +msgstr[1] "Confectionne @1 objets." + +#: init.lua +msgid "Saint-Maclou" +msgstr "Saint-Maclou" + +#: init.lua +msgid "Place 20 coal checkers." +msgstr "Place 20 damiers de charbon." + +#: init.lua +msgid "Castorama" +msgstr "Castorama" + +#: init.lua +msgid "Place 20 iron checkers." +msgstr "Place 20 damiers de fer." + +#: init.lua +msgid "Sam the Trapper" +msgstr "Sam le Trappeur" + +#: init.lua +msgid "Place 2 trap stones." +msgstr "Place 2 pièges de pierre." + +#: init.lua +msgid "Backpacker" +msgstr "Randonneu·r·se" + +#: init.lua +msgid "Craft 4 large bags." +msgstr "Confectionne 4 grands sacs" + +#: init.lua +msgid "Pyromaniac" +msgstr "Pyromane" + +#: init.lua +msgid "Craft 8 times flint and steel." +msgstr "Fabrique 8 silex et aciers." + +#: init.lua +msgid "Firefighter" +msgstr "Pompier" + +#: init.lua +msgid "Put out 1000 fires." +msgstr "Éteint 1000 feux." + +#: init.lua +msgid "Light It Up" +msgstr "Eclairé·e" + +#: init.lua +msgid "Place 100 torches." +msgstr "Place 100 torches." + +#: init.lua +msgid "Well Lit" +msgstr "Bien Éclairé" + +#: init.lua +msgid "Place 1,000 torches." +msgstr "Place 1000 torches." + +#: init.lua +msgid "Really Well Lit" +msgstr "Vraiment Bien Éclairé" + +#: init.lua +msgid "Craft 10 mese lamps." +msgstr "Fabrique 10 lampes de mese." + +#: init.lua +msgid "Outpost" +msgstr "Poste Avancé" + +#: init.lua +msgid "Craft 200 stone bricks." +msgstr "Confectionne 200 briques de pierre." + +#: init.lua +msgid "Watchtower" +msgstr "Tour de Garde" + +#: init.lua +msgid "Craft 800 stone bricks." +msgstr "Confectionne 800 briques de pierre." + +#: init.lua +msgid "Fortress" +msgstr "Forteresse" + +#: init.lua +msgid "Craft 3,200 stone bricks." +msgstr "Confectionne 3200 briques de pierre." + +#: init.lua +msgid "Desert Dweller" +msgstr "Habitant·e du Désert" + +#: init.lua +msgid "Craft 400 desert stone bricks." +msgstr "Confectionne 400 briques de pierre du désert." + +#: init.lua +msgid "Pharaoh" +msgstr "Pharaon" + +#: init.lua +msgid "Craft 100 sandstone bricks." +msgstr "Confectionne 100 briques de roche de sable." + +#: init.lua +msgid "Little Library" +msgstr "Petite Bibliothèque" + +#: init.lua +msgid "Craft 7 bookshelves." +msgstr "Fabrique 7 bibliothèques." + +#: init.lua +msgid "Lava and Water" +msgstr "La Lave et l'Eau" + +#: init.lua +msgid "Mine your first obsidian." +msgstr "Mine ton premier bloc d'obsidienne." + +#: init.lua +msgid "Obsessed with Obsidian" +msgstr "Obsédé·e par l'obsidienne" + +#: init.lua +msgid "Mine 50 obsidian." +msgstr "Mine 50 pierres d'obsidienne." + +#: init.lua +msgid "Lava Miner" +msgstr "Mineu·r·se de lave" + +#: init.lua +msgid "Mine any block while being very close to lava." +msgstr "Mine n'importe quel bloc à proximité de la lave." + +#: init.lua +msgid "On The Way" +msgstr "Sur La Voie" + +#: init.lua +msgid "Place 100 rails." +msgstr "Place 100 rails." + +#: init.lua +msgid "First Day in the Woods" +msgstr "Premier Jour dans les Bois" + +#: init.lua +msgid "Dig 6 tree blocks." +msgstr "Creuse 6 blocs d'arbre." + +#: init.lua +msgid "Lumberjack" +msgstr "Bûcheron·ne" + +#: init.lua +msgid "Dig 36 tree blocks." +msgstr "Creuse 36 blocs d'arbre." + +#: init.lua +msgid "Semi-pro Lumberjack" +msgstr "Bûcheron.ne. Semi-Professionnel.le." + +#: init.lua +msgid "Dig 216 tree blocks." +msgstr "Creuse 216 blocs d'arbre." + +#: init.lua +msgid "Professional Lumberjack" +msgstr "Bûcheron·ne Professionnel·le" + +#: init.lua +msgid "Dig 1,296 tree blocks." +msgstr "Creuse 1296 blocs d'arbre." + +#: init.lua +msgid "Junglebaby" +msgstr "Enfant de la Jungle" + +#: init.lua +msgid "Dig 100 jungle tree blocks." +msgstr "Creuse 100 blocs d'arbres de jungle." + +#: init.lua +msgid "Jungleman" +msgstr "Personne de la Jungle" + +#: init.lua +msgid "Dig 1,000 jungle tree blocks." +msgstr "Creuse 1000 blocs d'arbre de jungle." + +#: init.lua +msgid "First Mese Find" +msgstr "Première Pépite : Mese" + +#: init.lua +msgid "Mine your first mese ore." +msgstr "Mine ton premier minerai de mese." + +#: init.lua +msgid "Mese Mastery" +msgstr "Maîtrise de Mese" + +#: init.lua +msgid "Mine a mese block." +msgstr "Mine un bloc de mese." + +#: init.lua +msgid "You’re a copper" +msgstr "Faîtes Jouer les Cuivres" + +#: init.lua +msgid "Dig 1,000 copper ores." +msgstr "Creuse 1000 minerais de cuivre." + +#: init.lua +msgid "A Cat in a Pop-Tart?!" +msgstr "Un Chat dans un Pop-Tart ?!" + +#: init.lua +msgid "Mine a nyan cat." +msgstr "Mine un nyan cat." + +#: init.lua +msgid "Mini Miner" +msgstr "Mini Mineu·r·se" + +#: init.lua +msgid "Dig 100 stone blocks." +msgstr "Creuse 100 blocs de pierre." + +#: init.lua +msgid "Hardened Miner" +msgstr "Mineu·r·se Endurci·e" + +#: init.lua +msgid "Dig 1,000 stone blocks." +msgstr "Creuse 1000 blocs de pierre." + +#: init.lua +msgid "Master Miner" +msgstr "Maître·sse Mineu·r·se" + +#: init.lua +msgid "Dig 10,000 stone blocks." +msgstr "Creuse 10000 blocs de pierre." + +#: init.lua +msgid "Marchand De Sable" +msgstr "Marchand·e De Sable" + +#: init.lua +msgid "Dig 1,000 sand." +msgstr "Creuse 1000 blocs de sable." + +#: init.lua +msgid "Crafter of Sticks" +msgstr "Fabriquant·e de Bâtons." + +#: init.lua +msgid "Craft 100 sticks." +msgstr "Confectionne 100 bâtons." + +#: init.lua +msgid "Jungle Discoverer" +msgstr "Explorat·eur·rice de la Jungle" + +#: init.lua +msgid "Mine your first jungle grass." +msgstr "Ramasse ta première herbe de jungle." + +#: init.lua +msgid "Grasslands Discoverer" +msgstr "Découvreu·r·se de prairies" + +#: init.lua +msgid "Mine some grass." +msgstr "Ramasse de l'herbe." + +#: init.lua +msgid "Savannah Discoverer" +msgstr "Explorat·eur·rice de la Savanne" + +#: init.lua +msgid "Mine some dry grass." +msgstr "Ramasse de l'herbe sèche." + +#: init.lua +msgid "Desert Discoverer" +msgstr "Expolrat·eur·rice du Désert." + +#: init.lua +msgid "Mine your first cactus." +msgstr "Mine ton premier catus." + +#: init.lua +msgid "Far Lands" +msgstr "Terres Lointaines" + +#: init.lua +msgid "Mine your first dry shrub." +msgstr "Coupe ton premier arbuste sec." + +#: init.lua +msgid "Glacier Discoverer" +msgstr "Découvreu·r·se de glacier" + +#: init.lua +msgid "Mine your first ice." +msgstr "Creuse ton premier bloc de glace." + +#: init.lua +msgid "Very Simple Snow Man" +msgstr "Bonhomme de Neige Rudimentaire" + +#: init.lua +msgid "Place two snow blocks." +msgstr "Place deux blocs de neige." + +#: init.lua +msgid "First Gold Find" +msgstr "Première Pépite : Or" + +#: init.lua +msgid "Mine your first gold ore." +msgstr "Mine ton premier minerai d'or." + +#: init.lua +msgid "Gold Rush" +msgstr "Ruée vers l'Or" + +#: init.lua +msgid "Mine 45 gold ores." +msgstr "Mine 45 minerais d'or." + +#: init.lua +msgid "Wow, I am Diamonds!" +msgstr "Wow, Je suis Diamants!" + +#: init.lua +msgid "Mine your first diamond ore." +msgstr "Mine ton premier diamant." + +#: init.lua +#, fuzzy +msgid "Girl's Best Friend" +msgstr "Girl's Best Friend" + +#: init.lua +msgid "Mine 18 diamond ores." +msgstr "Mine 18 diamants." + +#: init.lua +msgid "Hardest Block on Earth" +msgstr "Le Bloc le Plus Dur du Monde" + +#: init.lua +msgid "Craft a diamond block." +msgstr "Confectionne un bloc de diamant." + +#: init.lua +msgid "In the Dungeon" +msgstr "Dans le Donjon" + +#: init.lua +msgid "Mine a mossy cobblestone." +msgstr "Mine un bloc de pavés moussus." + +#: init.lua +msgid "Smelter" +msgstr "Fondeu·r·se" + +#: init.lua +msgid "Craft 10 furnaces." +msgstr "Construis 10 fours." + +#: init.lua +msgid "Treasurer" +msgstr "Trésori·er·ère" + +#: init.lua +msgid "Craft 15 chests." +msgstr "Fabrique 15 coffres." + +#: init.lua +msgid "Bankier" +msgstr "Banqui·er·ère" + +#: init.lua +msgid "Craft 30 locked chests." +msgstr "Fabrique 30 coffres Verrouillés." + +#: init.lua +msgid "Bricker" +msgstr "Briqueu·r·se" + +#: init.lua +msgid "Craft 200 brick blocks." +msgstr "Confectionne 200 blocs de brique." + +#: init.lua +msgid "House of Obsidian" +msgstr "La Maison de L'Obsidienne" + +#: init.lua +msgid "Craft 100 obsidian bricks." +msgstr "Confectionne 100 briques d'obsidienne." + +#: init.lua +msgid "Build a Cave" +msgstr "Construis une grotte" + +#: init.lua +msgid "Place 100 stone." +msgstr "Place 100 pierres." + +#: init.lua +msgid "Long Ladder" +msgstr "Longue Echelle" + +#: init.lua +msgid "Place 400 wooden ladders." +msgstr "Place 400 échelles en bois." + +#: init.lua +msgid "Industrial Age" +msgstr "Âge Industriel" + +#: init.lua +msgid "Place 40 steel ladders." +msgstr "Place 40 échelles métalliques." + +#: init.lua +msgid "Yummy!" +msgstr "Miam !" + +#: init.lua +msgid "Eat 80 apples." +msgstr "Mange 80 pommes." + +#: init.lua +msgid "Glasser" +msgstr "Verri·er·ère" + +#: init.lua +msgid "Craft 14 vessels shelves." +msgstr "Fabrique 14 vaisseliers." + +#: init.lua +msgid "Farming Skills Acquired" +msgstr "Compétences Paysannes Acquises" + +#: init.lua +msgid "Harvest a fully grown wheat plant." +msgstr "Récolte un plant de blé à maturité." + +#: init.lua +msgid "Field Worker" +msgstr "Travailleu·r·se Agricole" + +#: init.lua +msgid "Harvest 25 fully grown wheat plants." +msgstr "Récolte 25 plants de blé à maturité." + +#: init.lua +msgid "Aspiring Farmer" +msgstr "Apprenti·e Fermi·er·ère" + +#: init.lua +msgid "Harvest 125 fully grown wheat plants." +msgstr "Récolte 125 plants de blé à maturité." + +#: init.lua +msgid "Wheat Magnate" +msgstr "Magnat·e du Blé" + +#: init.lua +msgid "Harvest 625 fully grown wheat plants." +msgstr "Récolte 625 plants de blé à maturité." + +#: init.lua +msgid "Baker" +msgstr "Boulang·er·ère" + +#: init.lua +msgid "Eat 10 loaves of bread." +msgstr "Mange 10 miches de pain." + +#: init.lua +msgid "Wool Over Your Eyes" +msgstr "De la Laines dans Tes Yeux" + +#: init.lua +msgid "Craft 250 white wool." +msgstr "Confectionne 250 blocs de laine blanche." + +#: init.lua +msgid "Hotelier" +msgstr "Hoteli·er·ère" + +#: init.lua +msgid "Craft 15 fancy beds." +msgstr "Construis 15 lits chics." + +#: init.lua +msgid "Filthy Rich" +msgstr "Richissime" + +#: init.lua +msgid "Craft 24 gold block stairs." +msgstr "Construis 24 escaliers en or." + +#: init.lua +msgid "Roses Are Red" +msgstr "Les Roses Sont Rouges" + +#: init.lua +msgid "Craft 400 red dyes." +msgstr "Prépare 400 teintures rouges." + +#: init.lua +msgid "Dandelions are Yellow" +msgstr "Les Pissenlits sont Jaunes." + +#: init.lua +msgid "Craft 400 yellow dyes." +msgstr "Prépare 400 teintures jaunes." + +#: init.lua +msgid "Geraniums are Blue" +msgstr "Les Geraniums Sont Bleus" + +#: init.lua +msgid "Craft 400 blue dyes." +msgstr "Prépare 400 teintures bleues." + +#: init.lua +msgid "White Color Stock" +msgstr "Chaussettes Blanches" + +#: init.lua +msgid "Craft 100 white dyes." +msgstr "Prépare 100 teintures blanches." + +#: init.lua +msgid "Tasty Mushrooms" +msgstr "Délicieux Champignons" + +#: init.lua +msgid "Eat 3 brown mushrooms." +msgstr "Mange 3 champignons marrons." + +#: init.lua +msgid "Mushroom Lover" +msgstr "Adorat·eur·rice de Champignons" + +#: init.lua +msgid "Eat 33 brown mushrooms." +msgstr "Mange 33 champignons marrons." + +#: init.lua +msgid "Underground Mushroom Farmer" +msgstr "Culture de Champignons en Cave" + +#: init.lua +msgid "Eat 333 brown mushrooms." +msgstr "Mange 333 champignons marrons." + +#: init.lua +msgid "Builder" +msgstr "Bâtisseu·r·se" + +#: init.lua +msgid "Constructor" +msgstr "Construct·eur·rice" + +#: init.lua +msgid "Architect" +msgstr "Architecte" + +#: init.lua +msgid "Master Architect" +msgstr "Maître·sse Architecte" + +#: chat_commands.lua +msgid "[c|clear|disable|enable]" +msgstr "[c|clear|disable|enable]" + +#: chat_commands.lua +msgid "Show, clear, disable or enable your achievements" +msgstr "Affiche, réinitialise, désactive ou active vos réussites." + +#: chat_commands.lua +msgid "All your awards and statistics have been cleared. You can now start again." +msgstr "Tous vos trophées et statistiques ont été réinitialisés. Vous pouvez recommencer à nouveau." + +#: chat_commands.lua +msgid "You have disabled your achievements." +msgstr "Vous avez désactivé vos réussites." + +#: chat_commands.lua +msgid "You have enabled your achievements." +msgstr "Vous avez activé vos réussites." + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Show details of an achievement" +msgstr "Afficher les détails d'une réussite" + +#: chat_commands.lua +msgid "Achievement not found." +msgstr "Réussite non trouvée." + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Get the achievements statistics for the given player or yourself" +msgstr "Obtenez les statistiques des réussites d'un joueur donné ou de vous-même" diff --git a/mods/awards/locale/pt.po b/mods/awards/locale/pt.po new file mode 100644 index 0000000..e28b909 --- /dev/null +++ b/mods/awards/locale/pt.po @@ -0,0 +1,819 @@ +# Portuguese translations for Awards package. +# Copyright (C) 2018 +# This file is distributed under the same license as the Awards package. +# FIRST AUTHOR borgesdossantosbruno@gmail.com, 2018. +# BrunoMine, 2018 +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-21 05:50-0300\n" +"PO-Revision-Date: 2018-08-01 16:16-0300\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.0.6\n" +"Last-Translator: BrunoMine\n" +"Language: pt\n" + +#: api.lua +msgid "Secret Achievement Unlocked:" +msgstr "Conquista Secreta Desbloqueada:" + +#: api.lua +msgid "Achievement Unlocked:" +msgstr "Conquista Desbloqueada:" + +#: api.lua +#, lua-format +msgid "Secret Achievement Unlocked: %s" +msgstr "Conquista Secreta Desbloqueada: %s" + +#: api.lua +#, lua-format +msgid "Achievement Unlocked: %s" +msgstr "Conquista Desbloqueada: %s" + +#: api.lua +msgid "Secret Achievement Unlocked!" +msgstr "Conquista Secreta Desbloqueada!" + +#: api.lua +msgid "Achievement Unlocked!" +msgstr "Conquista Desbloqueada!" + +#: api.lua +msgid "Error: No awards available." +msgstr "Erro: Nenhuma conquista encontrada." + +#: api.lua +msgid "OK" +msgstr "OK" + +#: api.lua +msgid "(Secret Award)" +msgstr "(Conquista Secreta)" + +#: api.lua +msgid "Unlock this award to find out what it is." +msgstr "Desbloqueie essa conquista para descobrir o que significa." + +#: api.lua +#, lua-format +msgid "%s (got)" +msgstr "%s (obtido)" + +#: api.lua +msgid "You've disabled awards. Type /awards enable to reenable." +msgstr "Desabilitaste as conquistas. Digite /awards enable para reabilitar." + +#: api.lua +msgid "You have not unlocked any awards." +msgstr "Nenhuma conquista desbloqueada ainda." + +#: api.lua +#, lua-format +msgid "%s’s awards:" +msgstr "%s das conquistas:" + +#: api.lua chat_commands.lua +#, lua-format +msgid "%s: %s" +msgstr "%s: %s" + +#: sfinv.lua unified_inventory.lua +msgid "Awards" +msgstr "Conquistas" + +#: triggers.lua +msgid "@1/@2 dug" +msgstr "@1 de @2 obtidos" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Mine: @2" +msgid_plural "Mine: @1×@2" +msgstr[0] "Cavar: @2" +msgstr[1] "Minar: @1×@2" + +#: triggers.lua +msgid "Mine @1 block." +msgid_plural "Mine @1 blocks." +msgstr[0] "Cavar um bloco." +msgstr[1] "Cavar @1 blocos." + +#: triggers.lua +msgid "@1/@2 placed" +msgstr "@1 de @2 colocados" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Place: @2" +msgid_plural "Place: @1×@2" +msgstr[0] "Colocar: @2" +msgstr[1] "Place: @1×@2" + +#: triggers.lua +msgid "Place a block." +msgid_plural "Place @1 blocks." +msgstr[0] "Colocar um bloco." +msgstr[1] "Colocar @1 blocos." + +#: triggers.lua +msgid "@1/@2 eaten" +msgstr "@1 de @2 consumidos" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Eat: @2" +msgid_plural "Eat: @1×@2" +msgstr[0] "Consumir: @2" +msgstr[1] "Consumir: @1×@2" + +#: triggers.lua +msgid "Eat an item." +msgid_plural "Eat @1 items." +msgstr[0] "Consumir um item." +msgstr[1] "Consumir @1 itens." + +#: triggers.lua +msgid "@1/@2 deaths" +msgstr "@1 de @2 mortes" + +#: triggers.lua +msgid "Die." +msgid_plural "Die @1 times." +msgstr[0] "Morrer." +msgstr[1] "Morrer @1 vezes." + +#: triggers.lua +msgid "@1/@2 chat messages" +msgstr "@1 de @2" + +#: triggers.lua +msgid "Write something in chat." +msgid_plural "Write @1 chat messages." +msgstr[0] "Escrever algo no bate papo." +msgstr[1] "Escrever @1 mensagens no bate papo." + +#: triggers.lua +msgid "@1/@2 game joins" +msgstr "@1 de @2" + +#: triggers.lua +msgid "Join the game." +msgid_plural "Join the game @1 times." +msgstr[0] "Entre no jogo." +msgstr[1] "Entre no jogo @1 vezes." + +#: triggers.lua +msgid "@1/@2 crafted" +msgstr "@1 de @2 feitos" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Craft: @2" +msgid_plural "Craft: @1×@2" +msgstr[0] "Fazer @2" +msgstr[1] "Montar @2 @1 vezes" + +#: triggers.lua +msgid "Craft an item." +msgid_plural "Craft @1 items." +msgstr[0] "Fazer um item." +msgstr[1] "Fazer @1 itens." + +#: init.lua +msgid "Saint-Maclou" +msgstr "Saint-Maclou" + +#: init.lua +msgid "Place 20 coal checkers." +msgstr "" + +#: init.lua +msgid "Castorama" +msgstr "" + +#: init.lua +msgid "Place 20 iron checkers." +msgstr "" + +#: init.lua +msgid "Sam the Trapper" +msgstr "" + +#: init.lua +msgid "Place 2 trap stones." +msgstr "" + +#: init.lua +msgid "Backpacker" +msgstr "" + +#: init.lua +msgid "Craft 4 large bags." +msgstr "" + +#: init.lua +msgid "Pyromaniac" +msgstr "Piromaníaco" + +#: init.lua +msgid "Craft 8 times flint and steel." +msgstr "Montar acendedor de Ferro e Pederneira 8 vezes." + +#: init.lua +msgid "Firefighter" +msgstr "Bombeiro" + +#: init.lua +msgid "Put out 1000 fires." +msgstr "Apagar fogo 1000 vezes." + +#: init.lua +msgid "Light It Up" +msgstr "Ilumine Isso" + +#: init.lua +msgid "Place 100 torches." +msgstr "Colocar 100 tochas." + +#: init.lua +msgid "Well Lit" +msgstr "Bem Iluminado" + +#: init.lua +msgid "Place 1,000 torches." +msgstr "Colocar 1.000 tochas." + +#: init.lua +msgid "Really Well Lit" +msgstr "Realmente Bem Iluminado" + +#: init.lua +msgid "Craft 10 mese lamps." +msgstr "Fazer 10 lâmpadas de mese." + +#: init.lua +msgid "Outpost" +msgstr "Posto Avançado" + +#: init.lua +msgid "Craft 200 stone bricks." +msgstr "Fazer 200 tijolos de pedra." + +#: init.lua +msgid "Watchtower" +msgstr "Sentinela" + +#: init.lua +msgid "Craft 800 stone bricks." +msgstr "Fazer 800 tijolos de pedra." + +#: init.lua +msgid "Fortress" +msgstr "Fortaleza" + +#: init.lua +msgid "Craft 3,200 stone bricks." +msgstr "Fazer 3.200 tijolos de pedra." + +#: init.lua +msgid "Desert Dweller" +msgstr "Morador do Deserto" + +#: init.lua +msgid "Craft 400 desert stone bricks." +msgstr "Fazer 400 Tijolos de pedra do deserto." + +#: init.lua +msgid "Pharaoh" +msgstr "Faraó" + +#: init.lua +msgid "Craft 100 sandstone bricks." +msgstr "Fazer 100 tijolos de arenito." + +#: init.lua +msgid "Little Library" +msgstr "Pequena Biblioteca" + +#: init.lua +msgid "Craft 7 bookshelves." +msgstr "Fazer 7 estantes de livros." + +#: init.lua +msgid "Lava and Water" +msgstr "Lava e Ãgua" + +#: init.lua +msgid "Mine your first obsidian." +msgstr "Cavar sua primeira obsidiana." + +#: init.lua +msgid "Obsessed with Obsidian" +msgstr "Obcecado por Obsidiana" + +#: init.lua +msgid "Mine 50 obsidian." +msgstr "Minerar 50 obsidianas." + +#: init.lua +msgid "Lava Miner" +msgstr "Minerador de Lava" + +#: init.lua +msgid "Mine any block while being very close to lava." +msgstr "Minerar qualquer bloco enquanto estiver mergulhado em lava." + +#: init.lua +msgid "On The Way" +msgstr "No Caminho" + +#: init.lua +msgid "Place 100 rails." +msgstr "Colocar 100 trilhos." + +#: init.lua +msgid "First Day in the Woods" +msgstr "Primeiro dia na Floresta" + +#: init.lua +msgid "Dig 6 tree blocks." +msgstr "Cortar 6 blocos de árvore." + +#: init.lua +msgid "Lumberjack" +msgstr "Lenhador" + +#: init.lua +msgid "Dig 36 tree blocks." +msgstr "Cortar 36 blocos de árvore." + +#: init.lua +msgid "Semi-pro Lumberjack" +msgstr "Lenhador Semi-Profissional" + +#: init.lua +msgid "Dig 216 tree blocks." +msgstr "Cortar 216 blocos de árvore." + +#: init.lua +msgid "Professional Lumberjack" +msgstr "Lenhador Profissional" + +#: init.lua +msgid "Dig 1,296 tree blocks." +msgstr "Cortar 1.296 blocos de árvore." + +#: init.lua +msgid "Junglebaby" +msgstr "Bebê Selvagem" + +#: init.lua +msgid "Dig 100 jungle tree blocks." +msgstr "Cortar 100 blocos de árvore selvagem." + +#: init.lua +msgid "Jungleman" +msgstr "Homem Selvagem" + +#: init.lua +msgid "Dig 1,000 jungle tree blocks." +msgstr "Cortar 1.000 blocos de árvore selvagem." + +#: init.lua +msgid "First Mese Find" +msgstr "Primeiro Mese" + +#: init.lua +msgid "Mine your first mese ore." +msgstr "Cavar seu primeiro mese." + +#: init.lua +msgid "Mese Mastery" +msgstr "Mestre do Mese" + +#: init.lua +msgid "Mine a mese block." +msgstr "Cavar um bloco de mese." + +#: init.lua +msgid "You’re a copper" +msgstr "Sou um Cobre" + +#: init.lua +msgid "Dig 1,000 copper ores." +msgstr "Minerar 1.000 cobres." + +#: init.lua +msgid "A Cat in a Pop-Tart?!" +msgstr "Um Gato em um Pop-Tart?!" + +#: init.lua +msgid "Mine a nyan cat." +msgstr "Capturar um gato nyan." + +#: init.lua +msgid "Mini Miner" +msgstr "Mini Minerador" + +#: init.lua +msgid "Dig 100 stone blocks." +msgstr "Minerar 100 blocos de pedra." + +#: init.lua +msgid "Hardened Miner" +msgstr "Minerador Avançado" + +#: init.lua +msgid "Dig 1,000 stone blocks." +msgstr "Minerar 1.000 blocos de pedra." + +#: init.lua +msgid "Master Miner" +msgstr "Minerador Mestre" + +#: init.lua +msgid "Dig 10,000 stone blocks." +msgstr "Minerar 10.000 blocos de pedra." + +#: init.lua +msgid "Marchand De Sable" +msgstr "Vendedor de Areia" + +#: init.lua +msgid "Dig 1,000 sand." +msgstr "Cavar 1.000 blocos de areia." + +#: init.lua +msgid "Crafter of Sticks" +msgstr "Rachador de Lenha" + +#: init.lua +msgid "Craft 100 sticks." +msgstr "Lenhar 100 gravetos." + +#: init.lua +msgid "Jungle Discoverer" +msgstr "Desbravador Selvagem" + +#: init.lua +msgid "Mine your first jungle grass." +msgstr "Cortar seu primeiro mato selvagem." + +#: init.lua +msgid "Grasslands Discoverer" +msgstr "Descobridor do Gramado" + +#: init.lua +msgid "Mine some grass." +msgstr "Minerar algum mato" + +#: init.lua +msgid "Savannah Discoverer" +msgstr "Descobridor da Savana" + +#: init.lua +msgid "Mine some dry grass." +msgstr "Minerar algum mato seco." + +#: init.lua +msgid "Desert Discoverer" +msgstr "Descobridor do Deserto" + +#: init.lua +msgid "Mine your first cactus." +msgstr "Cortar seu primeiro cacto." + +#: init.lua +msgid "Far Lands" +msgstr "Terras Distantes" + +#: init.lua +msgid "Mine your first dry shrub." +msgstr "Minerar seu primeiro arbusto seco." + +#: init.lua +msgid "Glacier Discoverer" +msgstr "Descobridor Glacial" + +#: init.lua +msgid "Mine your first ice." +msgstr "Quebrar seu primeiro bloco de gelo." + +#: init.lua +msgid "Very Simple Snow Man" +msgstr "Homem de Neve Muito Simples" + +#: init.lua +msgid "Place two snow blocks." +msgstr "Colocar 2 blocos de neve." + +#: init.lua +msgid "First Gold Find" +msgstr "Achei Ouro" + +#: init.lua +msgid "Mine your first gold ore." +msgstr "Minerar sua primeira de ouro." + +#: init.lua +msgid "Gold Rush" +msgstr "Corriga do Ouro" + +#: init.lua +msgid "Mine 45 gold ores." +msgstr "Minerar 45 de ouro." + +#: init.lua +msgid "Wow, I am Diamonds!" +msgstr "Uau, Diamante!" + +#: init.lua +msgid "Mine your first diamond ore." +msgstr "Minerar seu primeiro diamante." + +#: init.lua +msgid "Girl's Best Friend" +msgstr "Melhor Amigo da Menina" + +#: init.lua +msgid "Mine 18 diamond ores." +msgstr "Minere 18 diamantes." + +#: init.lua +msgid "Hardest Block on Earth" +msgstr "O Bloco mais Duro da Terra" + +#: init.lua +msgid "Craft a diamond block." +msgstr "Montar um bloco de diamante." + +#: init.lua +msgid "In the Dungeon" +msgstr "Na Masmorra" + +#: init.lua +msgid "Mine a mossy cobblestone." +msgstr "Minerar um pedregulho com musgo." + +#: init.lua +msgid "Smelter" +msgstr "Fundidor" + +#: init.lua +msgid "Craft 10 furnaces." +msgstr "Montar 10 fornos." + +#: init.lua +msgid "Treasurer" +msgstr "Tesoureiro" + +#: init.lua +msgid "Craft 15 chests." +msgstr "Montar 10 baús." + +#: init.lua +msgid "Bankier" +msgstr "Banqueiro" + +#: init.lua +msgid "Craft 30 locked chests." +msgstr "Montar 30 baús trancados." + +#: init.lua +msgid "Bricker" +msgstr "Tijoleiro" + +#: init.lua +msgid "Craft 200 brick blocks." +msgstr "Fazer 200 blocos de tijolo." + +#: init.lua +msgid "House of Obsidian" +msgstr "Casa de Obsidiana" + +#: init.lua +msgid "Craft 100 obsidian bricks." +msgstr "Montar 100 tijolos de obsidiana." + +#: init.lua +msgid "Build a Cave" +msgstr "Montar uma Caverna" + +#: init.lua +msgid "Place 100 stone." +msgstr "Colocar 100 pedras." + +#: init.lua +msgid "Long Ladder" +msgstr "Longa Escadaria" + +#: init.lua +msgid "Place 400 wooden ladders." +msgstr "Colocar 400 escadas de madeira." + +#: init.lua +msgid "Industrial Age" +msgstr "Era Industrial" + +#: init.lua +msgid "Place 40 steel ladders." +msgstr "Colocar 40 escadas de ferro." + +#: init.lua +msgid "Yummy!" +msgstr "Humm!" + +#: init.lua +msgid "Eat 80 apples." +msgstr "Comer 80 maçãs." + +#: init.lua +msgid "Glasser" +msgstr "Vidraceiro" + +#: init.lua +msgid "Craft 14 vessels shelves." +msgstr "Montar 14 estantes de frascos." + +#: init.lua +msgid "Farming Skills Acquired" +msgstr "Conhecimento de Cultivo Adquirido" + +#: init.lua +msgid "Harvest a fully grown wheat plant." +msgstr "Colher um trigo totalmente crescido." + +#: init.lua +msgid "Field Worker" +msgstr "Trabalhador do Campo" + +#: init.lua +msgid "Harvest 25 fully grown wheat plants." +msgstr "Colher 25 plantas trigos totalmente crescidos." + +#: init.lua +msgid "Aspiring Farmer" +msgstr "Fazendeiro Aspirante" + +#: init.lua +msgid "Harvest 125 fully grown wheat plants." +msgstr "Colher 125 plantas trigos totalmente crescidos." + +#: init.lua +msgid "Wheat Magnate" +msgstr "Magnata do Trigo" + +#: init.lua +msgid "Harvest 625 fully grown wheat plants." +msgstr "Colher 625 plantas trigos totalmente crescidos." + +#: init.lua +msgid "Baker" +msgstr "Padeiro" + +#: init.lua +msgid "Eat 10 loaves of bread." +msgstr "Comer 10 pães." + +#: init.lua +msgid "Wool Over Your Eyes" +msgstr "Lã Sobre Meus Olhos" + +#: init.lua +msgid "Craft 250 white wool." +msgstr "Tecer 250 lãs branca." + +#: init.lua +msgid "Hotelier" +msgstr "Hoteleiro" + +#: init.lua +msgid "Craft 15 fancy beds." +msgstr "Montar 15 camas chiques." + +#: init.lua +msgid "Filthy Rich" +msgstr "Muito Rico" + +#: init.lua +msgid "Craft 24 gold block stairs." +msgstr "Montar 24 escadas de bloco de ouro." + +#: init.lua +msgid "Roses Are Red" +msgstr "Rosas São Vermelhas" + +#: init.lua +msgid "Craft 400 red dyes." +msgstr "Fazer 400 tintas vermelhas." + +#: init.lua +msgid "Dandelions are Yellow" +msgstr "Dentes-de-Leões são Amarelos" + +#: init.lua +msgid "Craft 400 yellow dyes." +msgstr "Fazer 400 tintas amarelas." + +#: init.lua +msgid "Geraniums are Blue" +msgstr "Gerânios são Azuis" + +#: init.lua +msgid "Craft 400 blue dyes." +msgstr "Fazer 400 tintas azuis." + +#: init.lua +msgid "White Color Stock" +msgstr "Estoque de Cor Branca" + +#: init.lua +msgid "Craft 100 white dyes." +msgstr "Fazer 100 tintas brancas." + +#: init.lua +msgid "Tasty Mushrooms" +msgstr "Cogumelos Deliciosos" + +#: init.lua +msgid "Eat 3 brown mushrooms." +msgstr "Comer 3 cogumelos marrons." + +#: init.lua +msgid "Mushroom Lover" +msgstr "Amante de Cogumelo" + +#: init.lua +msgid "Eat 33 brown mushrooms." +msgstr "Comer 33 cogumelos marrons." + +#: init.lua +msgid "Underground Mushroom Farmer" +msgstr "Fazendeiro Subterrâneo de Cogumelos" + +#: init.lua +msgid "Eat 333 brown mushrooms." +msgstr "Comer 333 cogumelos marrons." + +#: init.lua +msgid "Builder" +msgstr "Construtor" + +#: init.lua +msgid "Constructor" +msgstr "Empreiteiro" + +#: init.lua +msgid "Architect" +msgstr "Arquiteto" + +#: init.lua +msgid "Master Architect" +msgstr "Arquiteto Mestre" + +#: chat_commands.lua +msgid "[c|clear|disable|enable]" +msgstr "[c|clear|disable|enable]" + +#: chat_commands.lua +msgid "Show, clear, disable or enable your achievements" +msgstr "Exibir, limpar, desabilitar ou habilitar suas conquistas" + +#: chat_commands.lua +msgid "All your awards and statistics have been cleared. You can now start again." +msgstr "Todas as suas conquistas e estatísticas foram limpas. Agora podes iniciar novamente." + +#: chat_commands.lua +msgid "You have disabled your achievements." +msgstr "Suas conquistas foram desabilitadas." + +#: chat_commands.lua +msgid "You have enabled your achievements." +msgstr "Suas conquistas foram habilitadas." + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Show details of an achievement" +msgstr "Mostra detalhes de uma conquista" + +#: chat_commands.lua +msgid "Achievement not found." +msgstr "Conquista não encontrada." + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Get the achievements statistics for the given player or yourself" +msgstr "Ver as estatísticas de conquistas de um jogador ou suas próprias" diff --git a/mods/awards/locale/template.pot b/mods/awards/locale/template.pot new file mode 100644 index 0000000..970ae7c --- /dev/null +++ b/mods/awards/locale/template.pot @@ -0,0 +1,819 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-21 05:50-0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: api.lua +msgid "Secret Achievement Unlocked:" +msgstr "" + +#: api.lua +msgid "Achievement Unlocked:" +msgstr "" + +#: api.lua +#, lua-format +msgid "Secret Achievement Unlocked: %s" +msgstr "" + +#: api.lua +#, lua-format +msgid "Achievement Unlocked: %s" +msgstr "" + +#: api.lua +msgid "Secret Achievement Unlocked!" +msgstr "" + +#: api.lua +msgid "Achievement Unlocked!" +msgstr "" + +#: api.lua +msgid "Error: No awards available." +msgstr "" + +#: api.lua +msgid "OK" +msgstr "" + +#: api.lua +msgid "(Secret Award)" +msgstr "" + +#: api.lua +msgid "Unlock this award to find out what it is." +msgstr "" + +#: api.lua +#, lua-format +msgid "%s (got)" +msgstr "" + +#: api.lua +msgid "You've disabled awards. Type /awards enable to reenable." +msgstr "" + +#: api.lua +msgid "You have not unlocked any awards." +msgstr "" + +#: api.lua +#, lua-format +msgid "%s’s awards:" +msgstr "" + +#: api.lua chat_commands.lua +#, lua-format +msgid "%s: %s" +msgstr "" + +#: sfinv.lua unified_inventory.lua +msgid "Awards" +msgstr "" + +#: triggers.lua +msgid "@1/@2 dug" +msgstr "" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Mine: @2" +msgid_plural "Mine: @1×@2" +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "Mine @1 block." +msgid_plural "Mine @1 blocks." +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "@1/@2 placed" +msgstr "" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Place: @2" +msgid_plural "Place: @1×@2" +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "Place a block." +msgid_plural "Place @1 blocks." +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "@1/@2 eaten" +msgstr "" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Eat: @2" +msgid_plural "Eat: @1×@2" +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "Eat an item." +msgid_plural "Eat @1 items." +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "@1/@2 deaths" +msgstr "" + +#: triggers.lua +msgid "Die." +msgid_plural "Die @1 times." +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "@1/@2 chat messages" +msgstr "" + +#: triggers.lua +msgid "Write something in chat." +msgid_plural "Write @1 chat messages." +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "@1/@2 game joins" +msgstr "" + +#: triggers.lua +msgid "Join the game." +msgid_plural "Join the game @1 times." +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "@1/@2 crafted" +msgstr "" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Craft: @2" +msgid_plural "Craft: @1×@2" +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "Craft an item." +msgid_plural "Craft @1 items." +msgstr[0] "" +msgstr[1] "" + +#: init.lua +msgid "Saint-Maclou" +msgstr "" + +#: init.lua +msgid "Place 20 coal checkers." +msgstr "" + +#: init.lua +msgid "Castorama" +msgstr "" + +#: init.lua +msgid "Place 20 iron checkers." +msgstr "" + +#: init.lua +msgid "Sam the Trapper" +msgstr "" + +#: init.lua +msgid "Place 2 trap stones." +msgstr "" + +#: init.lua +msgid "Backpacker" +msgstr "" + +#: init.lua +msgid "Craft 4 large bags." +msgstr "" + +#: init.lua +msgid "Pyromaniac" +msgstr "" + +#: init.lua +msgid "Craft 8 times flint and steel." +msgstr "" + +#: init.lua +msgid "Firefighter" +msgstr "" + +#: init.lua +msgid "Put out 1000 fires." +msgstr "" + +#: init.lua +msgid "Light It Up" +msgstr "" + +#: init.lua +msgid "Place 100 torches." +msgstr "" + +#: init.lua +msgid "Well Lit" +msgstr "" + +#: init.lua +msgid "Place 1,000 torches." +msgstr "" + +#: init.lua +msgid "Really Well Lit" +msgstr "" + +#: init.lua +msgid "Craft 10 mese lamps." +msgstr "" + +#: init.lua +msgid "Outpost" +msgstr "" + +#: init.lua +msgid "Craft 200 stone bricks." +msgstr "" + +#: init.lua +msgid "Watchtower" +msgstr "" + +#: init.lua +msgid "Craft 800 stone bricks." +msgstr "" + +#: init.lua +msgid "Fortress" +msgstr "" + +#: init.lua +msgid "Craft 3,200 stone bricks." +msgstr "" + +#: init.lua +msgid "Desert Dweller" +msgstr "" + +#: init.lua +msgid "Craft 400 desert stone bricks." +msgstr "" + +#: init.lua +msgid "Pharaoh" +msgstr "" + +#: init.lua +msgid "Craft 100 sandstone bricks." +msgstr "" + +#: init.lua +msgid "Little Library" +msgstr "" + +#: init.lua +msgid "Craft 7 bookshelves." +msgstr "" + +#: init.lua +msgid "Lava and Water" +msgstr "" + +#: init.lua +msgid "Mine your first obsidian." +msgstr "" + +#: init.lua +msgid "Obsessed with Obsidian" +msgstr "" + +#: init.lua +msgid "Mine 50 obsidian." +msgstr "" + +#: init.lua +msgid "Lava Miner" +msgstr "" + +#: init.lua +msgid "Mine any block while being very close to lava." +msgstr "" + +#: init.lua +msgid "On The Way" +msgstr "" + +#: init.lua +msgid "Place 100 rails." +msgstr "" + +#: init.lua +msgid "First Day in the Woods" +msgstr "" + +#: init.lua +msgid "Dig 6 tree blocks." +msgstr "" + +#: init.lua +msgid "Lumberjack" +msgstr "" + +#: init.lua +msgid "Dig 36 tree blocks." +msgstr "" + +#: init.lua +msgid "Semi-pro Lumberjack" +msgstr "" + +#: init.lua +msgid "Dig 216 tree blocks." +msgstr "" + +#: init.lua +msgid "Professional Lumberjack" +msgstr "" + +#: init.lua +msgid "Dig 1,296 tree blocks." +msgstr "" + +#: init.lua +msgid "Junglebaby" +msgstr "" + +#: init.lua +msgid "Dig 100 jungle tree blocks." +msgstr "" + +#: init.lua +msgid "Jungleman" +msgstr "" + +#: init.lua +msgid "Dig 1,000 jungle tree blocks." +msgstr "" + +#: init.lua +msgid "First Mese Find" +msgstr "" + +#: init.lua +msgid "Mine your first mese ore." +msgstr "" + +#: init.lua +msgid "Mese Mastery" +msgstr "" + +#: init.lua +msgid "Mine a mese block." +msgstr "" + +#: init.lua +msgid "You’re a copper" +msgstr "" + +#: init.lua +msgid "Dig 1,000 copper ores." +msgstr "" + +#: init.lua +msgid "A Cat in a Pop-Tart?!" +msgstr "" + +#: init.lua +msgid "Mine a nyan cat." +msgstr "" + +#: init.lua +msgid "Mini Miner" +msgstr "" + +#: init.lua +msgid "Dig 100 stone blocks." +msgstr "" + +#: init.lua +msgid "Hardened Miner" +msgstr "" + +#: init.lua +msgid "Dig 1,000 stone blocks." +msgstr "" + +#: init.lua +msgid "Master Miner" +msgstr "" + +#: init.lua +msgid "Dig 10,000 stone blocks." +msgstr "" + +#: init.lua +msgid "Marchand De Sable" +msgstr "" + +#: init.lua +msgid "Dig 1,000 sand." +msgstr "" + +#: init.lua +msgid "Crafter of Sticks" +msgstr "" + +#: init.lua +msgid "Craft 100 sticks." +msgstr "" + +#: init.lua +msgid "Jungle Discoverer" +msgstr "" + +#: init.lua +msgid "Mine your first jungle grass." +msgstr "" + +#: init.lua +msgid "Grasslands Discoverer" +msgstr "" + +#: init.lua +msgid "Mine some grass." +msgstr "" + +#: init.lua +msgid "Savannah Discoverer" +msgstr "" + +#: init.lua +msgid "Mine some dry grass." +msgstr "" + +#: init.lua +msgid "Desert Discoverer" +msgstr "" + +#: init.lua +msgid "Mine your first cactus." +msgstr "" + +#: init.lua +msgid "Far Lands" +msgstr "" + +#: init.lua +msgid "Mine your first dry shrub." +msgstr "" + +#: init.lua +msgid "Glacier Discoverer" +msgstr "" + +#: init.lua +msgid "Mine your first ice." +msgstr "" + +#: init.lua +msgid "Very Simple Snow Man" +msgstr "" + +#: init.lua +msgid "Place two snow blocks." +msgstr "" + +#: init.lua +msgid "First Gold Find" +msgstr "" + +#: init.lua +msgid "Mine your first gold ore." +msgstr "" + +#: init.lua +msgid "Gold Rush" +msgstr "" + +#: init.lua +msgid "Mine 45 gold ores." +msgstr "" + +#: init.lua +msgid "Wow, I am Diamonds!" +msgstr "" + +#: init.lua +msgid "Mine your first diamond ore." +msgstr "" + +#: init.lua +msgid "Girl's Best Friend" +msgstr "" + +#: init.lua +msgid "Mine 18 diamond ores." +msgstr "" + +#: init.lua +msgid "Hardest Block on Earth" +msgstr "" + +#: init.lua +msgid "Craft a diamond block." +msgstr "" + +#: init.lua +msgid "In the Dungeon" +msgstr "" + +#: init.lua +msgid "Mine a mossy cobblestone." +msgstr "" + +#: init.lua +msgid "Smelter" +msgstr "" + +#: init.lua +msgid "Craft 10 furnaces." +msgstr "" + +#: init.lua +msgid "Treasurer" +msgstr "" + +#: init.lua +msgid "Craft 15 chests." +msgstr "" + +#: init.lua +msgid "Bankier" +msgstr "" + +#: init.lua +msgid "Craft 30 locked chests." +msgstr "" + +#: init.lua +msgid "Bricker" +msgstr "" + +#: init.lua +msgid "Craft 200 brick blocks." +msgstr "" + +#: init.lua +msgid "House of Obsidian" +msgstr "" + +#: init.lua +msgid "Craft 100 obsidian bricks." +msgstr "" + +#: init.lua +msgid "Build a Cave" +msgstr "" + +#: init.lua +msgid "Place 100 stone." +msgstr "" + +#: init.lua +msgid "Long Ladder" +msgstr "" + +#: init.lua +msgid "Place 400 wooden ladders." +msgstr "" + +#: init.lua +msgid "Industrial Age" +msgstr "" + +#: init.lua +msgid "Place 40 steel ladders." +msgstr "" + +#: init.lua +msgid "Yummy!" +msgstr "" + +#: init.lua +msgid "Eat 80 apples." +msgstr "" + +#: init.lua +msgid "Glasser" +msgstr "" + +#: init.lua +msgid "Craft 14 vessels shelves." +msgstr "" + +#: init.lua +msgid "Farming Skills Acquired" +msgstr "" + +#: init.lua +msgid "Harvest a fully grown wheat plant." +msgstr "" + +#: init.lua +msgid "Field Worker" +msgstr "" + +#: init.lua +msgid "Harvest 25 fully grown wheat plants." +msgstr "" + +#: init.lua +msgid "Aspiring Farmer" +msgstr "" + +#: init.lua +msgid "Harvest 125 fully grown wheat plants." +msgstr "" + +#: init.lua +msgid "Wheat Magnate" +msgstr "" + +#: init.lua +msgid "Harvest 625 fully grown wheat plants." +msgstr "" + +#: init.lua +msgid "Baker" +msgstr "" + +#: init.lua +msgid "Eat 10 loaves of bread." +msgstr "" + +#: init.lua +msgid "Wool Over Your Eyes" +msgstr "" + +#: init.lua +msgid "Craft 250 white wool." +msgstr "" + +#: init.lua +msgid "Hotelier" +msgstr "" + +#: init.lua +msgid "Craft 15 fancy beds." +msgstr "" + +#: init.lua +msgid "Filthy Rich" +msgstr "" + +#: init.lua +msgid "Craft 24 gold block stairs." +msgstr "" + +#: init.lua +msgid "Roses Are Red" +msgstr "" + +#: init.lua +msgid "Craft 400 red dyes." +msgstr "" + +#: init.lua +msgid "Dandelions are Yellow" +msgstr "" + +#: init.lua +msgid "Craft 400 yellow dyes." +msgstr "" + +#: init.lua +msgid "Geraniums are Blue" +msgstr "" + +#: init.lua +msgid "Craft 400 blue dyes." +msgstr "" + +#: init.lua +msgid "White Color Stock" +msgstr "" + +#: init.lua +msgid "Craft 100 white dyes." +msgstr "" + +#: init.lua +msgid "Tasty Mushrooms" +msgstr "" + +#: init.lua +msgid "Eat 3 brown mushrooms." +msgstr "" + +#: init.lua +msgid "Mushroom Lover" +msgstr "" + +#: init.lua +msgid "Eat 33 brown mushrooms." +msgstr "" + +#: init.lua +msgid "Underground Mushroom Farmer" +msgstr "" + +#: init.lua +msgid "Eat 333 brown mushrooms." +msgstr "" + +#: init.lua +msgid "Builder" +msgstr "" + +#: init.lua +msgid "Constructor" +msgstr "" + +#: init.lua +msgid "Architect" +msgstr "" + +#: init.lua +msgid "Master Architect" +msgstr "" + +#: chat_commands.lua +msgid "[c|clear|disable|enable]" +msgstr "" + +#: chat_commands.lua +msgid "Show, clear, disable or enable your achievements" +msgstr "" + +#: chat_commands.lua +msgid "" +"All your awards and statistics have been cleared. You can now start again." +msgstr "" + +#: chat_commands.lua +msgid "You have disabled your achievements." +msgstr "" + +#: chat_commands.lua +msgid "You have enabled your achievements." +msgstr "" + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Show details of an achievement" +msgstr "" + +#: chat_commands.lua +msgid "Achievement not found." +msgstr "" + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Get the achievements statistics for the given player or yourself" +msgstr "" diff --git a/mods/awards/mod.conf b/mods/awards/mod.conf new file mode 100644 index 0000000..e3e83d6 --- /dev/null +++ b/mods/awards/mod.conf @@ -0,0 +1,8 @@ +name = awards +title = Awards +author = rubenwardy +description = Adds awards to Minetest, and an API to register new ones. +optional_depends = intllib,sfinv,unified_inventory,default,stairs,farming,dye,beds,wool,vessels,moreblocks,fire,flowers,nyancat +license = MIT +forum = https://forum.minetest.net/viewtopic.php?t=4870 +version = 3.0.0 diff --git a/mods/awards/readme.md b/mods/awards/readme.md index b77dac9..2903221 100644 --- a/mods/awards/readme.md +++ b/mods/awards/readme.md @@ -1,55 +1,328 @@ -Awards ------- +# Awards -by Andrew "Rubenwardy" Ward, GPL 3.0 or later. +Adds awards/achievements to Minetest (plus a very good API). -This mod adds achievements to Minetest. +by [rubenwardy](https://rubenwardy.com), licensed under MIT. +With thanks to Wuzzy, kaeza, and MrIbby. -Majority of awards are back ported from Calinou's -old fork in Carbone, under same license. +Majority of awards are back ported from Calinou's old fork in Carbone, under same license. -Code Reference --------------- +# Introduction -The API -======= -* awards.register_achievement(name,data_table) - * name - * desciption - * sound [optional] - * image [optional] - * trigger [optional] [table] - * type - "dig", "place", "death", "chat" or "join" - * (for dig/place type) node - the nodes name - * (for all types) target - how many to dig / place - * secret [optional] - if true, then player needs to unlock to find out what it is. -* awards.give_achievement(name,award) - * -- gives an award to a player -* awards.register_onDig(func(player,data)) - * -- return award name or null -* awards.register_onPlace(func(player,data)) - * -- return award name or null -* awards.register_onDeath(func(player,data)) - * -- return award name or null -* awards.register_onChat(func(player,data)) - * -- return award name or null -* awards.register_onJoin(func(player,data)) - * -- return award name or null +## Awards and Triggers + +An award is a single unlockable unit, registered like so: + +```lua +awards.register_award("mymod:award", { + description = "My Example Award", +}) +``` + +Awards are unlocked either using `awards.unlock()` or by a trigger being +fullfilled. A trigger is a condition which unlocks an award. Triggers are +registered at the same time as an award is registered: + +```lua +awards.register_award("mymod:award", { + description = "My Example Award", + trigger = { + type = "dig", + node = "default:stone", + target = 10, + }, +}) +``` + +The above trigger type is an example of a counted_key trigger: +rather than a single counter there's a counter per key - in this +case the key is the value of the `node` field. + +If you leave out the key in a `counted_key` trigger, then the total will be used +instead. For example, here is an award which unlocks after you've placed 10 +nodes of any type: + +```lua +awards.register_award("mymod:award", { + description = "Place 10 nodes!", + trigger = { + type = "place", + target = 10, + }, +}) +``` + +You can also register an *Unlock Function*, which can return the name of an +award to unlock it: + +```lua +awards.register_award("mymod:award", { + title = "Lava Miner", + description = "Mine any block while being very close to lava.", +}) + +awards.register_on_dig(function(player, data) + local pos = player:get_pos() + if pos and (minetest.find_node_near(pos, 1, "default:lava_source") or + minetest.find_node_near(pos, 1, "default:lava_flowing")) then + return "mymod:award" + end + return nil +end) +``` + +The above is a bad example as you don't actually need the stats data given. +It would be better to register a `dignode` callback and call `awards.unlock()` +if the condition is met. + +## Trigger Types + +The trigger type is used to determine which event will cause the trigger will be +fulfilled. The awards mod comes with a number of predefined types, documented +in [Builtin Trigger Types](#builtin-trigger-types). + +Trigger types are registered like so: + +```lua +awards.register_trigger("chat", { + type = "counted", + progress = "@1/@2 chat messages", + auto_description = { "Send a chat message", "Chat @1 times" }, +}) + +minetest.register_on_chat_message(function(name, message) + local player = minetest.get_player_by_name(name) + if not player or string.find(message, "/") then + return + end + awards.notify_chat(player) +end) +``` + +A trigger type has a type as well, which determines how the data is stored and +also how the trigger is fulfilled. + +**Trigger Type Types:** + +* **custom** requires you handle the calling of awards.unlock() yourself. You also + need to implement on_register() yourself. You'll also probably want to implement + `on_register()` to catch awards registered with your trigger type. +* **counted** stores a single counter for each player which is incremented by calling + `trigger:notify(player)`. Good for homogenous actions like number of chat messages, + joins, and the like. +* **counted_key** stores a table of counters each indexed by a key. There is also + a total field (`__total`) which stores the sum of all counters. A counter is + incremented by calling `trigger:notify(player, key)`. This is good for things like + placing nodes or crafting items, where the key will be the item or node name. + If `key` is an item, then you should also add `key_is_item = true` to the + trigger type definition. + +As said, you could use a custom trigger if none of the other ones match your needs. +Here's an example. + +```lua +awards.register_trigger("foo", { + type = "custom", + progress = "@1/@2 foos", + auto_description = { "Do a foo", "Foo @1 times" }, + + on_register = function(self, award) + print(award.name .. " was registered with foo trigger type") + end, +}) + +minetest.register_on_foo(function() + for _, trigger in pairs(awards.on.foo) do + -- trigger is either a trigger tables or + -- or an unlock function. + + -- some complex logic + if condition then + awards.unlock(trigger) + end + end +end) + +``` + +## Award Difficulty + +Difficulty is used to determine how awards are sorted in awards lists. + +If the award trigger is counted, ie: the trigger requires a `target` property, +then the difficulty multipler is timesd by `target` to get the overall difficulty. +If the award isn't a counted type then the difficulty multiplier is used as the +overal difficulty. Award difficulty affects how awards are sorted in a list - +more difficult awards are further down the list. + +In real terms, `difficulty` is a relative difficulty to do one unit of the trigger +if its counted, otherwise it's the relative difficulty of completely doing the +award (if not-counted). For the `dig` trigger type, 1 unit would be 1 node dug. -Player Data -=========== +Actual code used to calculate award difficulty: -A list of data referenced/hashed by the player's name. -* player name - * name [string] - * count [table] - dig counter - * modname [table] - * itemname [int] - * place [table] - place counter - * modname [table] - * itemname [int] - * deaths - * chats - * joins +```lua +local difficulty = def.difficulty or 1 +if def.trigger and def.trigger.target then + difficulty = difficulty * def.trigger.target +end +``` + + +# API + +## Awards + +* `awards.register_award(name, def)`, the def table has the following fields: + * `title` - title of the award (defaults to name) + * `description` - longer description of the award, displayed in Awards tab + * `difficulty` - see [Award Difficulty](#award-difficulty). + * `requires` - list of awards that need to be unlocked before this one + is visible. + * `prizes` - list of items to give when you earn the award + * `secret` - boolean if this award is secret (i.e. showed on awards list) + * `sound` - `SimpleSoundSpec` table to play on unlock. + `false` to disable unlock sound. + * `icon` - the icon image. Defaults to `awards_unknown.png`. + * `hud_background` - the background image used in the HUD to contain the text and icon. + Defaults to `awards_bg_default.png`. + * `trigger` - trigger definition, see [Builtin Trigger Types](#builtin-trigger-types). + * `on_unlock(name, def)` - callback on unlock. +* `awards.registered_awards` - table of award name to definition. +* `awards.register_on_unlock(func(name, def))` + * `name` is the player name + * `def` is the award def. + * return true to cancel HUD from appearing. +* `awards.unlock(player_name, award_name)` + * gives an award to a player +* `awards.get_award_states(player_name)` + * Returns list of tables, sorted by `score`, each having the fields: + + ```lua + { + name = "mymod:awardname", + def = {}, -- Award definition + unlocked = true, -- Whether award has been unlocked + started = true, -- Whether any progress has been made + score = 0, -- Score used in sorting + + -- Either a table or nil + -- Will be nil if progress is indeterminable or + -- if the award is unlocked + progress = { + current = 5, + target = 10, + label = "label", -- Label to show over progress bar + } + } + ``` + +## Triggers + +* `awards.register_trigger(name, def)`, the def table has the following fields: + * `type` - see trigger type types in [Trigger Types](#trigger-types). + * `progress` - used to format progress, defaults to "%1/%2". + * `auto_description` - a table of two elements. Each element is a format string. Element 1 is singular, element 2 is plural. Used for the award description (not title) if none is given. + * `on_register(self, award_def)` - called when an award registers with this type. + * "counted_key" only: + * `auto_description_total` - Used if the trigger is for the total. + * `get_key(self, def)` - get key for particular award, return nil for a total. + * `key_is_item` - true if the key is an item name. On notify(), + any watched groups will also be notified as `group:groupname` keys. +* `awards.registered_triggers` - table of trigger name to definition. + +## Builtin Trigger Types + +Callbacks (register a function to be run) + +* dig type: Dig a node. + * node: the dug node type. If nil, all dug nodes are counted +* place type: Place a node. + * node: the placed node type. If nil, all placed nodes are counted +* craft type: Craft something. + * item: the crafted item type. If nil, all crafted items are counted +* death type: Die. + * reason: the death reason, one of the types in PlayerHPChangeReason (see lua_api.txt) + or nil for total deaths. +* chat type: Write a chat message. +* join type: Join the server. +* eat type: Eat an item. + * item: the eaten item type. If nil, all eaten items are counted + +(for all types) target - how many times to dig/place/craft/etc. + +Each type has a register function like so: + +* awards.register_on_TRIGGERTYPE(func(player, data)) + * data is the player stats data + * return award name or null + +### dig + +```lua +trigger = { + type = "dig", + node = "default:dirt", -- item, alias, or group + target = 50, +} +``` + +### place + +```lua +trigger = { + type = "place", + node = "default:dirt", -- item, alias, or group + target = 50, +} +``` + +### craft + +```lua +trigger = { + type = "craft", + item = "default:dirt", -- item, alias, or group + target = 50, +} +``` + +### death + +```lua +trigger = { + type = "death", + reason = "fall", + target = 5, +} +``` + +### chat + +```lua +trigger = { + type = "chat", + target = 100, +} +``` + +### join + +```lua +trigger = { + type = "join", + target = 100, +} +``` + +### eat + +```lua +trigger = { + type = "eat", + item = "default:apple", + target = 100, +} +``` diff --git a/mods/awards/screenshot.png b/mods/awards/screenshot.png new file mode 100644 index 0000000..ab9e19e Binary files /dev/null and b/mods/awards/screenshot.png differ diff --git a/mods/awards/settingtypes.txt b/mods/awards/settingtypes.txt new file mode 100644 index 0000000..1133d52 --- /dev/null +++ b/mods/awards/settingtypes.txt @@ -0,0 +1,2 @@ +# Add default achievements from the awards mod +awards.add_defaults (Add Default Achievements) bool true diff --git a/mods/awards/sounds/awards_got_generic.ogg b/mods/awards/sounds/awards_got_generic.ogg new file mode 100644 index 0000000..3ae982b Binary files /dev/null and b/mods/awards/sounds/awards_got_generic.ogg differ diff --git a/mods/awards/src/api_awards.lua b/mods/awards/src/api_awards.lua new file mode 100644 index 0000000..d68ebce --- /dev/null +++ b/mods/awards/src/api_awards.lua @@ -0,0 +1,252 @@ +-- Copyright (c) 2013-18 rubenwardy. MIT. + +local S = awards.gettext + +function awards.register_award(name, def) + def.name = name + + -- Add Triggers + if def.trigger and def.trigger.type then + local tdef = awards.registered_triggers[def.trigger.type] + assert(tdef, "Trigger not found: " .. def.trigger.type) + tdef:on_register(def) + end + + function def:can_unlock(data) + if not self.requires then + return true + end + + for i=1, #self.requires do + if not data.unlocked[self.requires[i]] then + return false + end + end + return true + end + + -- Add Award + awards.registered_awards[name] = def + + local tdef = awards.registered_awards[name] + if def.description == nil and tdef.getDefaultDescription then + def.description = tdef:getDefaultDescription() + end +end + + +-- This function is called whenever a target condition is met. +-- It checks if a player already has that award, and if they do not, +-- it gives it to them +---------------------------------------------- +--awards.unlock(name, award) +-- name - the name of the player +-- award - the name of the award to give +function awards.unlock(name, award) + -- Ensure the player is online. + if not minetest.get_player_by_name(name) then + return + end + + -- Access Player Data + local data = awards.player(name) + local awdef = awards.registered_awards[award] + assert(awdef, "Unable to unlock an award which doesn't exist!") + + if data.disabled or + (data.unlocked[award] and data.unlocked[award] == award) then + return + end + + if not awdef:can_unlock(data) then + minetest.log("warning", "can_unlock returned false in unlock of " .. + award .. " for " .. name) + return + end + + -- Unlock Award + minetest.log("action", name.." has unlocked award "..award) + data.unlocked[award] = award + awards.save() + + -- Give Prizes + if awdef and awdef.prizes then + for i = 1, #awdef.prizes do + local itemstack = ItemStack(awdef.prizes[i]) + if not itemstack:is_empty() then + local receiverref = minetest.get_player_by_name(name) + if receiverref then + receiverref:get_inventory():add_item("main", itemstack) + end + end + end + end + + -- Run callbacks + if awdef.on_unlock and awdef.on_unlock(name, awdef) then + return + end + for _, callback in pairs(awards.on_unlock) do + if callback(name, awdef) then + return + end + end + + -- Get Notification Settings + local title = awdef.title or award + local desc = awdef.description or "" + local background = awdef.hud_background or awdef.background or "awards_bg_default.png" + local icon = (awdef.icon or "awards_unknown.png") .. "^[resize:32x32" + local sound = awdef.sound + if sound == nil then + -- Explicit check for nil because sound could be `false` to disable it + sound = {name="awards_got_generic", gain=0.25} + end + + -- Do Notification + if sound then + -- Enforce sound delay to prevent sound spamming + local lastsound = data.lastsound + if lastsound == nil or os.difftime(os.time(), lastsound) >= 1 then + minetest.sound_play(sound, {to_player=name}) + data.lastsound = os.time() + end + end + + if awards.show_mode == "chat" then + local chat_announce + if awdef.secret then + chat_announce = S("Secret Award Unlocked: %s") + else + chat_announce = S("Award Unlocked: %s") + end + -- use the chat console to send it + minetest.chat_send_player(name, string.format(chat_announce, title)) + if desc~="" then + minetest.chat_send_player(name, desc) + end + else + local player = minetest.get_player_by_name(name) + local one = player:hud_add({ + hud_elem_type = "image", + name = "award_bg", + scale = {x = 2, y = 1}, + text = background, + position = {x = 0.5, y = 0.05}, + offset = {x = 0, y = 138}, + alignment = {x = 0, y = -1} + }) + local hud_announce + if awdef.secret then + hud_announce = S("Secret Award Unlocked!") + else + hud_announce = S("Award Unlocked!") + end + local two = player:hud_add({ + hud_elem_type = "text", + name = "award_au", + number = 0xFFFFFF, + scale = {x = 100, y = 20}, + text = hud_announce, + position = {x = 0.5, y = 0.05}, + offset = {x = 0, y = 45}, + alignment = {x = 0, y = -1} + }) + local three = player:hud_add({ + hud_elem_type = "text", + name = "award_title", + number = 0xFFFFFF, + scale = {x = 100, y = 20}, + text = title, + position = {x = 0.5, y = 0.05}, + offset = {x = 0, y = 100}, + alignment = {x = 0, y = -1} + }) + local four = player:hud_add({ + hud_elem_type = "image", + name = "award_icon", + scale = {x = 2, y = 2}, -- adjusted for 32x32 from x/y = 4 + text = icon, + position = {x = 0.5, y = 0.05}, + offset = {x = -200.5, y = 126}, + alignment = {x = 0, y = -1} + }) + minetest.after(4, function() + local player2 = minetest.get_player_by_name(name) + if player2 then + player2:hud_remove(one) + player2:hud_remove(two) + player2:hud_remove(three) + player2:hud_remove(four) + end + end) + end +end + +function awards.get_award_states(name) + local hash_is_unlocked = {} + local retval = {} + + -- Add all unlocked awards + local data = awards.player(name) + if data and data.unlocked then + for awardname, _ in pairs(data.unlocked) do + local def = awards.registered_awards[awardname] + if def then + hash_is_unlocked[awardname] = true + local score = -100000 + + local difficulty = def.difficulty or 1 + if def.trigger and def.trigger.target then + difficulty = difficulty * def.trigger.target + end + score = score + difficulty + + retval[#retval + 1] = { + name = awardname, + def = def, + unlocked = true, + started = true, + score = score, + progress = nil, + } + end + end + end + + -- Add all locked awards + for _, def in pairs(awards.registered_awards) do + if not hash_is_unlocked[def.name] and def:can_unlock(data) then + local progress = def.get_progress and def:get_progress(data) + local started = false + local score = def.difficulty or 1 + if def.secret then + score = 1000000 + elseif def.trigger and def.trigger.target and progress then + local perc = progress.current / progress.target + score = score * (1 - perc) * def.trigger.target + if perc < 0.001 then + score = score + 100 + else + started = true + end + else + score = 100 + end + + retval[#retval + 1] = { + name = def.name, + def = def, + unlocked = false, + started = started, + score = score, + progress = progress, + } + end + end + + table.sort(retval, function(a, b) + return a.score < b.score + end) + return retval +end diff --git a/mods/awards/src/api_triggers.lua b/mods/awards/src/api_triggers.lua new file mode 100644 index 0000000..67826fd --- /dev/null +++ b/mods/awards/src/api_triggers.lua @@ -0,0 +1,218 @@ +-- Copyright (c) 2013-18 rubenwardy. MIT. + +local S, NS = awards.gettext, awards.ngettext + +awards.on = {} + +local default_def = {} + +function default_def:run_callbacks(player, data, table_func) + for i = 1, #self.on do + local res = nil + local entry = self.on[i] + if type(entry) == "function" then + res = entry(player, data) + elseif type(entry) == "table" and entry.award then + res = table_func(entry) + end + + if res then + awards.unlock(player:get_player_name(), res) + end + end +end + +function awards.register_trigger(tname, tdef) + assert(type(tdef) == "table", + "Passing a callback to register_trigger is not supported in 3.0") + + tdef.name = tname + for key, value in pairs(default_def) do + tdef[key] = value + end + + if tdef.type == "counted" then + local old_reg = tdef.on_register + + function tdef:on_register(def) + local tmp = { + award = def.name, + target = def.trigger.target, + } + tdef.register(tmp) + + function def.get_progress(_, data) + local current = math.min(data[tname] or 0, tmp.target) + return { + current = current, + target = tmp.target, + label = S(tdef.progress, current, tmp.target), + } + end + + function def.getDefaultDescription(_) + local n = def.trigger.target + return NS(tdef.auto_description[1], tdef.auto_description[2], n, n) + end + + if old_reg then + return old_reg(tdef, def) + end + end + + function tdef.notify(player) + assert(player and player.is_player and player:is_player()) + local name = player:get_player_name() + local data = awards.player(name) + + -- Increment counter + local currentVal = (data[tname] or 0) + 1 + data[tname] = currentVal + + tdef:run_callbacks(player, data, function(entry) + if entry.target and entry.award and currentVal and + currentVal >= entry.target then + return entry.award + end + end) + end + + awards["notify_" .. tname] = tdef.notify + + elseif tdef.type == "counted_key" then + if tdef.key_is_item then + tdef.watched_groups = {} + end + + -- On award register + local old_reg = tdef.on_register + function tdef:on_register(def) + -- Register trigger + local tmp = { + award = def.name, + key = tdef:get_key(def), + target = def.trigger.target, + } + tdef.register(tmp) + + -- If group, add it to watch list + if tdef.key_is_item and tmp.key and tmp.key:sub(1, 6) == "group:" then + tdef.watched_groups[tmp.key:sub(7, #tmp.key)] = true + end + + -- Called to get progress values and labels + function def.get_progress(_, data) + data[tname] = data[tname] or {} + + local done + if tmp.key then + done = data[tname][tmp.key] or 0 + else + done = data[tname].__total or 0 + end + done = math.min(done, tmp.target) + + return { + current = done, + target = tmp.target, + label = S(tdef.progress, done, tmp.target), + } + end + + -- Build description if none is specificed by the award + function def.getDefaultDescription(_) + local n = def.trigger.target + if tmp.key then + local nname = tmp.key + return NS(tdef.auto_description[1], + tdef.auto_description[2], n, n, nname) + else + return NS(tdef.auto_description_total[1], + tdef.auto_description_total[2], n, n) + end + end + + -- Call on_register in trigger type definition + if old_reg then + return old_reg(tdef, def) + end + end + + function tdef.notify(player, key, n) + n = n or 1 + + if tdef.key_is_item and key:sub(1, 6) ~= "group:" then + local itemdef = minetest.registered_items[key] + if itemdef then + for groupname,rating in pairs(itemdef.groups or {}) do + if rating ~= 0 and tdef.watched_groups[groupname] then + tdef.notify(player, "group:" .. groupname, n) + end + end + end + end + + assert(player and player.is_player and player:is_player() and key) + local name = player:get_player_name() + local data = awards.player(name) + + -- Increment counter + data[tname] = data[tname] or {} + local currentVal = (data[tname][key] or 0) + n + data[tname][key] = currentVal + data[tname].__total = (data[tname].__total or 0) + if key:sub(1, 6) ~= "group:" then + data[tname].__total = data[tname].__total + n + end + + tdef:run_callbacks(player, data, function(entry) + local current + if entry.key == key then + current = currentVal + elseif entry.key == nil then + current = data[tname].__total + else + return + end + if current >= entry.target then + return entry.award + end + end) + end + + awards["notify_" .. tname] = tdef.notify + + elseif tdef.type and tdef.type ~= "custom" then + error("Unrecognised trigger type " .. tdef.type) + end + + awards.registered_triggers[tname] = tdef + + tdef.on = {} + tdef.register = function(func) + table.insert(tdef.on, func) + end + + -- Backwards compat + awards.on[tname] = tdef.on + awards['register_on_' .. tname] = tdef.register + return tdef +end + +function awards.increment_item_counter(data, field, itemname, count) + itemname = minetest.registered_aliases[itemname] or itemname + data[field][itemname] = (data[field][itemname] or 0) + (count or 1) +end + +function awards.get_item_count(data, field, itemname) + itemname = minetest.registered_aliases[itemname] or itemname + return data[field][itemname] or 0 +end + +function awards.get_total_keyed_count(data, field) + return data[field].__total or 0 +end + +function awards.register_on_unlock(func) + table.insert(awards.on_unlock, func) +end diff --git a/mods/awards/src/awards.lua b/mods/awards/src/awards.lua new file mode 100644 index 0000000..3b8bb49 --- /dev/null +++ b/mods/awards/src/awards.lua @@ -0,0 +1,477 @@ +-- Copyright (c) 2013-18 rubenwardy and Wuzzy. MIT. + +local S = awards.gettext + +awards.register_award("award_ruby_bronze",{ + title = S("Ruby (Bronze)"), + description = S("Dig 25 Ruby Ore."), + icon = "default_stone.png^ruby_ruby_ore.png", + trigger = { + type = "dig", + node = "gems:ruby_ore", + target = 25 + } +}) + +awards.register_award("award_ruby_silber",{ + title = S("Ruby (Silber)"), + description = S("Dig 50 Ruby Ore."), + icon = "default_stone.png^ruby_ruby_ore.png", + trigger = { + type = "dig", + node = "gems:ruby_ore", + target = 50 + } +}) + +awards.register_award("award_ruby_gold",{ + title = S("Ruby (Gold)"), + description = S("Dig 100 Ruby Ore."), + icon = "default_stone.png^ruby_ruby_ore.png", + trigger = { + type = "dig", + node = "gems:ruby_ore", + target = 100 + } +}) + +awards.register_award("award_ruby_platin",{ + title = S("Ruby (Platin)"), + description = S("Dig 200 Ruby Ore."), + icon = "default_stone.png^ruby_ruby_ore.png", + trigger = { + type = "dig", + node = "gems:ruby_ore", + target = 200 + } +}) + +awards.register_award("award_sapphire_bronze",{ + title = S("Sapphire (Bronze)"), + description = S("Dig 25 Sapphire Ore."), + icon = "default_stone.png^gems_sapphire_ore.png", + trigger = { + type = "dig", + node = "gems:sapphire_ore", + target = 25 + } +}) + +awards.register_award("award_sapphire_silber",{ + title = S("Sapphire (Silber)"), + description = S("Dig 50 Sapphire Ore."), + icon = "default_stone.png^gems_sapphire_ore.png", + trigger = { + type = "dig", + node = "gems:sapphire_ore", + target = 50 + } +}) + +awards.register_award("award_sapphire_gold",{ + title = S("Sapphire (Gold)"), + description = S("Dig 100 Sapphire Ore."), + icon = "default_stone.png^gems_sapphire_ore.png", + trigger = { + type = "dig", + node = "gems:sapphire_ore", + target = 100 + } +}) + +awards.register_award("award_sapphire_platin",{ + title = S("Sapphire (Platin)"), + description = S("Dig 200 Sapphire Ore."), + icon = "default_stone.png^gems_sapphire_ore.png", + trigger = { + type = "dig", + node = "gems:sapphire_ore", + target = 200 + } +}) + +awards.register_award("award_amethyst_bronze",{ + title = S("Amethyst (Bronze)"), + description = S("Dig 25 Amethyst Ore."), + icon = "default_stone.png^gems_amethyst_ore.png", + trigger = { + type = "dig", + node = "gems:amethyst_ore", + target = 25 + } +}) + +awards.register_award("award_amethyst_silber",{ + title = S("Amethyst (Silber)"), + description = S("Dig 50 Amethyst Ore."), + icon = "default_stone.png^gems_amethyst_ore.png", + trigger = { + type = "dig", + node = "gems:amethyst_ore", + target = 50 + } +}) + +awards.register_award("award_amethyst_Gold",{ + title = S("Amethyst (Gold)"), + description = S("Dig 100 Amethyst Ore."), + icon = "default_stone.png^gems_amethyst_ore.png", + trigger = { + type = "dig", + node = "gems:amethyst_ore", + target = 100 + } +}) + +awards.register_award("award_amethyst_platin",{ + title = S("Amethyst (Platin)"), + description = S("Dig 200 Amethyst Ore."), + icon = "default_stone.png^gems_amethyst_ore.png", + trigger = { + type = "dig", + node = "gems:amethyst_ore", + target = 200 + } +}) + +awards.register_award("award_shadow_bronze",{ + title = S("Shadow (Bronze)"), + description = S("Dig 25 Shadow Ore."), + icon = "default_stone.png^shadow_ore.png", + trigger = { + type = "dig", + node = "gems:shadow_ore", + target = 25 + } +}) + +awards.register_award("award_shadow_silber",{ + title = S("Shadow (Silber)"), + description = S("Dig 50 Shadow Ore."), + icon = "default_stone.png^shadow_ore.png", + trigger = { + type = "dig", + node = "gems:shadow_ore", + target = 50 + } +}) + +awards.register_award("award_shadow_gold",{ + title = S("Shadow (Gold)"), + description = S("Dig 100 Shadow Ore."), + icon = "default_stone.png^shadow_ore.png", + trigger = { + type = "dig", + node = "gems:shadow_ore", + target = 100 + } +}) + +awards.register_award("award_shadow_platin",{ + title = S("Shadow (Platin)"), + description = S("Dig 200 Shadow Ore."), + icon = "default_stone.png^shadow_ore.png", + trigger = { + type = "dig", + node = "gems:shadow_ore", + target = 200 + } +}) + +awards.register_award("award_pearl_bronze",{ + title = S("Pearl (Bronze)"), + description = S("Dig 25 Pearl Ore."), + icon = "default_stone.png^gems_pearl_ore.png", + trigger = { + type = "dig", + node = "gems:pearl_ore", + target = 25 + } +}) + +awards.register_award("award_pearl_silber",{ + title = S("Pearl (Silber)"), + description = S("Dig 50 Pearl Ore."), + icon = "default_stone.png^gems_pearl_ore.png", + trigger = { + type = "dig", + node = "gems:pearl_ore", + target = 50 + } +}) + +awards.register_award("award_pearl_gold",{ + title = S("Pearl (Gold)"), + description = S("Dig 100 Pearl Ore."), + icon = "default_stone.png^gems_pearl_ore.png", + trigger = { + type = "dig", + node = "gems:pearl_ore", + target = 100 + } +}) + +awards.register_award("award_pearl_platin",{ + title = S("Pearl (Platin)"), + description = S("Dig 200 Pearl Ore."), + icon = "default_stone.png^gems_pearl_ore.png", + trigger = { + type = "dig", + node = "gems:pearl_ore", + target = 200 + } +}) + +awards.register_award("award_emerald_bronze",{ + title = S("Emerald (Bronze)"), + description = S("Dig 25 Emerald Ore."), + icon = "default_stone.png^gems_emerald_ore.png", + trigger = { + type = "dig", + node = "gems:emerald_ore", + target = 25 + } +}) + +awards.register_award("award_emerald_silber",{ + title = S("Emerald (Silber)"), + description = S("Dig 50 Emerald Ore."), + icon = "default_stone.png^gems_emerald_ore.png", + trigger = { + type = "dig", + node = "gems:emerald_ore", + target = 50 + } +}) + +awards.register_award("award_emerald_gold",{ + title = S("Emerald (Gold)"), + description = S("Dig 100 Emerald Ore."), + icon = "default_stone.png^gems_emerald_ore.png", + trigger = { + type = "dig", + node = "gems:emerald_ore", + target = 100 + } +}) + +awards.register_award("award_emerald_platin",{ + title = S("Emerald (Platin)"), + description = S("Dig 200 Emerald Ore."), + icon = "default_stone.png^gems_emerald_ore.png", + trigger = { + type = "dig", + node = "gems:emerald_ore", + target = 200 + } +}) + +awards.register_award("award_admin_ore_bronze",{ + title = S("Admin Ore (Bronze)"), + description = S("Dig 5 Admin Ore."), + icon = "default_stone.png^tutorial_admin_ore.png", + trigger = { + type = "dig", + node = "tutorial:stone_with_admin", + target = 5 + } +}) + +awards.register_award("award_admin_ore_silber",{ + title = S("Admin Ore (Silber)"), + description = S("Dig 10 Admin Ore."), + icon = "default_stone.png^tutorial_admin_ore.png", + trigger = { + type = "dig", + node = "tutorial:stone_with_admin", + target = 10 + } +}) + +awards.register_award("award_admin_ore_gold",{ + title = S("Admin Ore (Gold)"), + description = S("Dig 20 Admin Ore."), + icon = "default_stone.png^tutorial_admin_ore.png", + trigger = { + type = "dig", + node = "tutorial:stone_with_admin", + target = 20 + } +}) + +awards.register_award("award_admin_ore_platin",{ + title = S("Admin Ore (Platin)"), + description = S("Dig 40 Admin Ore."), + icon = "default_stone.png^tutorial_admin_ore.png", + trigger = { + type = "dig", + node = "tutorial:stone_with_admin", + target = 40 + } +}) + +awards.register_award("award_titan_ore_bronze",{ + title = S("Titan Ore (Bronze)"), + description = S("Dig 10 Titan Ore."), + icon = "tutorial_titan_ore.png", + trigger = { + type = "dig", + node = "tutorial:stone_with_titan", + target = 10 + } +}) +awards.register_award("award_titan_ore_silber",{ + title = S("Titan Ore (Silber)"), + description = S("Dig 20 Titan Ore."), + icon = "tutorial_titan_ore.png", + trigger = { + type = "dig", + node = "tutorial:stone_with_titan", + target = 20 + } +}) +awards.register_award("award_titan_ore_gold",{ + title = S("Titan Ore (Gold)"), + description = S("Dig 40 Titan Ore."), + icon = "tutorial_titan_ore.png", + trigger = { + type = "dig", + node = "tutorial:stone_with_titan", + target = 40 + } +}) +awards.register_award("award_titan_ore_platin",{ + title = S("Titan Ore (Platin)"), + description = S("Dig 80 Titan Ore."), + icon = "tutorial_titan_ore.png", + trigger = { + type = "dig", + node = "tutorial:stone_with_titan", + target = 80 + } +}) +awards.register_award("award_regnum_ore_bronze",{ + title = S("Regnum Ore (Bronze)"), + description = S("Dig 2 Regnum Ore."), + icon = "default_stone.png^tutorial_regnum_ore.png", + trigger = { + type = "dig", + node = "tutorial:stone_with_regnum", + target = 2 + } +}) +awards.register_award("award_regnum_ore_silber",{ + title = S("Regnum Ore (Silber)"), + description = S("Dig 5 Regnum Ore."), + icon = "default_stone.png^tutorial_regnum_ore.png", + trigger = { + type = "dig", + node = "tutorial:stone_with_regnum", + target = 5 + } +}) +awards.register_award("award_regnum_ore_gold",{ + title = S("Regnum Ore (Gold)"), + description = S("Dig 10 Regnum Ore."), + icon = "default_stone.png^tutorial_regnum_ore.png", + trigger = { + type = "dig", + node = "tutorial:stone_with_regnum", + target = 10 + } +}) +awards.register_award("award_regnum_ore_platin",{ + title = S("Regnum Ore (Platin)"), + description = S("Dig 20 Regnum Ore."), + icon = "default_stone.png^tutorial_regnum_ore.png", + trigger = { + type = "dig", + node = "tutorial:stone_with_regnum", + target = 20 + } +}) +awards.register_award("award_???_bronze",{ + title = S("Die next to Mese"), + description = S("Die next to a Mese Block"), + icon = "default_mese_block.png", + secret = true +}) +awards.register_on_death(function(player,data) + local pos = player:getpos() + if pos and minetest.find_node_near(pos, 5, "default:mese") ~= nil then + return "award_???_bronze" + end + return nil +end) + + +awards.register_award("award_???_silber",{ + title = S("Die next to Mithril"), + description = S("Die next to a Mithril Ore"), + icon = "default_stone.png^moreores_mineral_mithril.png", + secret = true +}) +awards.register_on_death(function(player,data) + local pos = player:getpos() + if pos and minetest.find_node_near(pos, 5, "moreores:mineral_mithril") ~= nil then + return "award_???_silber" + end + return nil +end) + + +awards.register_award("award_???_gold",{ + title = S("Die next to Titan"), + description = S("Die next to a Titan Ore"), + icon = "default_stone.png^tutorial_titan_ore.png", + secret = true +}) +awards.register_on_death(function(player,data) + local pos = player:getpos() + if pos and minetest.find_node_near(pos, 5, "tutorial:stone_with_titan") ~= nil then + return "award_???_gold" + end + return nil +end) + +awards.register_award("award_???_platin",{ + title = S("Die next to Admin"), + description = S("Die next to an Admin Ore"), + icon = "default_stone.png^tutorial_admin_ore.png", + secret = true +}) +awards.register_on_death(function(player,data) + local pos = player:getpos() + if pos and minetest.find_node_near(pos, 5, "tutorial:stone_with_admin") ~= nil then + return "award_???_platin" + end + return nil +end) + +awards.register_award("award_???_regnum",{ + title = S("Die next to Regnum"), + description = S("Die next to a Regnum Ore"), + icon = "default_stone.png^tutorial_regnum_ore.png", + secret = true +}) +awards.register_on_death(function(player,data) + local pos = player:getpos() + if pos and minetest.find_node_near(pos, 5, "tutorial:stone_with_regnum") ~= nil then + return "award_???_regnum" + end + return nil +end) + +awards.register_award("award_???_nyancat",{ + title = S("Die next to Nyancat"), + description = S("Die next to a Nyancat"), + icon = "nyancat_front.png", + secret = true +}) +awards.register_on_death(function(player,data) + local pos = player:getpos() + if pos and minetest.find_node_near(pos, 5, "nyancat:nyancat") ~= nil then + return "award_???_nyancat" + end + return nil +end) diff --git a/mods/awards/src/chat_commands.lua b/mods/awards/src/chat_commands.lua new file mode 100644 index 0000000..9c1580e --- /dev/null +++ b/mods/awards/src/chat_commands.lua @@ -0,0 +1,61 @@ +-- Copyright (c) 2013-18 rubenwardy. MIT. + +local S = awards.gettext + +minetest.register_chatcommand("awards", { + params = S("[c|clear|disable|enable]"), + description = S("Show, clear, disable or enable your awards"), + func = function(name, param) + if param == "clear" then + awards.clear_player(name) + minetest.chat_send_player(name, + S("All your awards and statistics have been cleared. You can now start again.")) + elseif param == "disable" then + awards.disable(name) + minetest.chat_send_player(name, S("You have disabled awards.")) + elseif param == "enable" then + awards.enable(name) + minetest.chat_send_player(name, S("You have enabled awards.")) + elseif param == "c" then + awards.show_to(name, name, nil, true) + else + awards.show_to(name, name, nil, false) + end + + if (param == "disable" or param == "enable") and minetest.global_exists("sfinv") then + local player = minetest.get_player_by_name(name) + if player then + sfinv.set_player_inventory_formspec(player) + end + end + end +}) + +minetest.register_chatcommand("awd", { + params = S(""), + description = S("Show details of an award"), + func = function(name, param) + local def = awards.registered_awards[param] + if def then + minetest.chat_send_player(name, string.format(S("%s: %s"), def.title, def.description)) + else + minetest.chat_send_player(name, S("Award not found.")) + end + end +}) + +minetest.register_chatcommand("awpl", { + privs = { + server = true + }, + params = S(""), + description = S("Get the awards statistics for the given player or yourself"), + func = function(name, param) + if not param or param == "" then + param = name + end + minetest.chat_send_player(name, param) + local player = awards.player(param) + minetest.chat_send_player(name, dump(player)) + end +}) diff --git a/mods/awards/src/data.lua b/mods/awards/src/data.lua new file mode 100644 index 0000000..0f2188d --- /dev/null +++ b/mods/awards/src/data.lua @@ -0,0 +1,112 @@ + +local storage = minetest.get_mod_storage() +local __player_data + +-- Table Save Load Functions +function awards.save() + storage:set_string("player_data", minetest.write_json(__player_data)) +end + +local function convert_data() + minetest.log("warning", "Importing awards data from previous version") + + local old_players = __player_data + __player_data = {} + for name, data in pairs(old_players) do + while name.name do + name = name.name + end + data.name = name + print("Converting data for " .. name) + + -- Just rename counted + local counted = { + chats = "chat", + deaths = "death", + joins = "join", + } + for from, to in pairs(counted) do + data[to] = data[from] + data[from] = nil + end + + data.death = { + unknown = data.death, + __total = data.death, + } + + -- Convert item db to new format + local counted_items = { + count = "dig", + place = "place", + craft = "craft", + } + for from, to in pairs(counted_items) do + local ret = {} + + local count = 0 + if data[from] then + for modname, items in pairs(data[from]) do + for itemname, value in pairs(items) do + itemname = modname .. ":" .. itemname + local key = minetest.registered_aliases[itemname] or itemname + ret[key] = value + count = count + value + end + end + end + + ret.__total = count + data[from] = nil + data[to] = ret + end + + __player_data[name] = data + end +end + +function awards.load() + local old_save_path = minetest.get_worldpath().."/awards.txt" + local file = io.open(old_save_path, "r") + if file then + local table = minetest.deserialize(file:read("*all")) + if type(table) == "table" then + __player_data = table + convert_data() + else + __player_data = {} + end + file:close() + os.rename(old_save_path, minetest.get_worldpath().."/awards.bk.txt") + awards.save() + else + local json = storage:get("player_data") + __player_data = json and minetest.parse_json(json) or {} + end +end + +function awards.player(name) + assert(type(name) == "string") + local data = __player_data[name] or {} + __player_data[name] = data + + data.name = data.name or name + data.unlocked = data.unlocked or {} + return data +end + +function awards.player_or_nil(name) + return __player_data[name] +end + +function awards.enable(name) + awards.player(name).disabled = nil +end + +function awards.disable(name) + awards.player(name).disabled = true +end + +function awards.clear_player(name) + __player_data[name] = {} +end diff --git a/mods/awards/src/gui.lua b/mods/awards/src/gui.lua new file mode 100644 index 0000000..ab5be41 --- /dev/null +++ b/mods/awards/src/gui.lua @@ -0,0 +1,227 @@ +-- Copyright (c) 2013-18 rubenwardy. MIT. + +local S = awards.gettext + +function awards.get_formspec(name, to, sid) + local formspec = "" + local awards_list = awards.get_award_states(name) + + if #awards_list == 0 then + formspec = formspec .. "label[3.9,1.5;"..minetest.formspec_escape(S("Error: No achivements available.")).."]" + formspec = formspec .. "button_exit[4.2,2.3;3,1;close;"..minetest.formspec_escape(S("OK")).."]" + return formspec + end + sid = awards_list[sid] and sid or 1 + + -- Sidebar + local sitem = awards_list[sid] + local sdef = sitem.def + if sdef and sdef.secret and not sitem.unlocked then + formspec = formspec .. "label[1,3.85;".. + minetest.formspec_escape(S("(Secret Award)")).."]".. + "image[0.45,0.75;3.5,3.5;awards_unknown.png]" + if sdef and sdef.description then + formspec = formspec .. "textarea[0.25,4.35;4.8,1.7;;".. + minetest.formspec_escape( + S("Unlock this award to find out what it is."))..";]" + end + else + local title = sitem.name + if sdef and sdef.title then + title = sdef.title + end + local status = "%s" + if sitem.unlocked then + status = S("%s (unlocked)") + end + + formspec = formspec .. "textarea[0.5,3.85;4.8,1.45;;" .. + string.format(status, minetest.formspec_escape(title)) .. + ";]" + + if sdef and sdef.icon then + formspec = formspec .. "image[0.45,0.75;3.5,3.5;" .. sdef.icon .. "]" -- adjusted values from 0.6,0;3,3 + end + + if sitem.progress then + local barwidth = 3.95 + local perc = sitem.progress.current / sitem.progress.target + local label = sitem.progress.label + if perc > 1 then + perc = 1 + end + formspec = formspec .. "background[0,8.99;" .. barwidth ..",0.4;awards_progress_gray.png;false]" + formspec = formspec .. "background[0,8.99;" .. (barwidth * perc) ..",0.4;awards_progress_green.png;false]" + if label then + formspec = formspec .. "label[1.6,8.90;" .. minetest.formspec_escape(label) .. "]" + end + end + + if sdef and sdef.description then + formspec = formspec .. "box[-0.05,4.5;3.9,4.2;#000]" + formspec = formspec .. "textarea[0.25,4.5;3.9,4.2;;" .. + minetest.formspec_escape(sdef.description) .. ";]" + end + end + local total_awards = 0 + -- Create list box + formspec = formspec .. "textlist[4,0.75;3.8,8.6;awards;" + local first = true + for _, award in pairs(awards_list) do + local def = award.def + if def then + if not first then + formspec = formspec .. "," + end + first = false + + if def.secret and not award.unlocked then + formspec = formspec .. "#707070"..minetest.formspec_escape(S("(Secret Award)")) + else + local title = award.name + if def and def.title then + title = def.title + end + -- title = title .. " [" .. award.score .. "]" + if award.unlocked then + total_awards = total_awards + 1 + formspec = formspec .. minetest.formspec_escape(title) + elseif award.started then + formspec = formspec .. "#c0c0c0".. minetest.formspec_escape(title) + else + formspec = formspec .. "#a0a0a0".. minetest.formspec_escape(title) + end + end + end + end + if total_awards == 42 then + local player_inv = minetest.get_player_by_name(name):get_inventory() + player_inv:set_size("a20", 1) + player_inv:set_stack("a20", 1, "default:dirt") + else + local player_inv = minetest.get_player_by_name(name):get_inventory() + player_inv:set_size("a20", 1) + player_inv:set_stack("a20", 1, "") + end + formspec = formspec .. ";"..sid.."]" + formspec = formspec .. "label[5.6,0;"..total_awards.."/42]" + .."button[0,0;2,0.5;inven;Back]" + .."button[2,0;2,0.5;main;Main]" + return formspec +end + + +function awards.show_to(name, to, sid, text) + if name == "" or name == nil then + name = to + end + local data = awards.player(to) + if name == to and data.disabled then + minetest.chat_send_player(name, S("You've disabled awards. Type /awards enable to reenable.")) + return + end + if text then + local awards_list = awards.get_award_states(name) + if #awards_list == 0 then + minetest.chat_send_player(to, S("Error: No award available.")) + return + elseif not data or not data.unlocked then + minetest.chat_send_player(to, S("You have not unlocked any awards.")) + return + end + minetest.chat_send_player(to, string.format(S("%s’s awards:"), name)) + + for str, _ in pairs(data.unlocked) do + local def = awards.registered_awards[str] + if def then + if def.title then + if def.description then + minetest.chat_send_player(to, string.format(S("%s: %s"), def.title, def.description)) + else + minetest.chat_send_player(to, def.title) + end + else + minetest.chat_send_player(to, str) + end + end + end + else + local deco = "" + if minetest.global_exists("default") then + deco = default.gui_bg .. default.gui_bg_img + end + -- Show formspec to user + minetest.get_player_by_name(to):set_inventory_formspec("size[8,9.35]" .. deco .. awards.get_formspec(name, to, sid)) + end +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.aw then + awards.show_to(name, name, nil, false) + end + + + if fields.awards then + local event = minetest.explode_textlist_event(fields.awards) + if event.type == "CHG" then + awards.show_to(name, name, event.index, false) + end + end +end) +--[[ +if minetest.get_modpath("sfinv") then + sfinv.register_page("awards:awards", { + title = S("Awards"), + on_enter = function(self, player, context) + context.awards_idx = 1 + end, + is_in_nav = function(self, player, context) + local data = awards.player(player:get_player_name()) + return not data.disabled + end, + get = function(self, player, context) + local name = player:get_player_name() + return sfinv.make_formspec(player, context, + awards.get_formspec(name, name, context.awards_idx), + false) + end, + on_player_receive_fields = function(self, player, context, fields) + if fields.awards then + local event = minetest.explode_textlist_event(fields.awards) + if event.type == "CHG" then + context.awards_idx = event.index + sfinv.set_player_inventory_formspec(player, context) + end + end + end + }) + + local function check_and_reshow(name) + local player = minetest.get_player_by_name(name) + if not player then + return + end + + local context = sfinv.get_or_create_context(player) + if context.page ~= "awards:awards" then + return + end + + sfinv.set_player_inventory_formspec(player, context) + end + + awards.register_on_unlock(check_and_reshow) +end +--]] +if minetest.get_modpath("unified_inventory") ~= nil then + unified_inventory.register_button("awards", { + type = "image", + image = "awards_ui_icon.png", + tooltip = S("Awards"), + action = function(player) + local name = player:get_player_name() + awards.show_to(name, name, nil, false) + end, + }) +end diff --git a/mods/awards/src/intllib.lua b/mods/awards/src/intllib.lua new file mode 100644 index 0000000..c7af2c2 --- /dev/null +++ b/mods/awards/src/intllib.lua @@ -0,0 +1,44 @@ +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext diff --git a/mods/awards/src/triggers.lua b/mods/awards/src/triggers.lua new file mode 100644 index 0000000..fc260b5 --- /dev/null +++ b/mods/awards/src/triggers.lua @@ -0,0 +1,145 @@ +-- AWARDS +-- +-- Copyright (C) 2013-2015 rubenwardy +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU Lesser General Public License as published by +-- the Free Software Foundation; either version 2.1 of the License, or +-- (at your option) any later version. +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU Lesser General Public License for more details. +-- You should have received a copy of the GNU Lesser General Public License along +-- with this program; if not, write to the Free Software Foundation, Inc., +-- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +-- + +-- Check if a player object is valid for awards. +local function player_ok(player) + return player and player.is_player and player:is_player() and not player.is_fake_player +end + +awards.register_trigger("chat", { + type = "counted", + progress = "@1/@2 chat messages", + auto_description = { "Send a chat message", "Chat @1 times" }, +}) +minetest.register_on_chat_message(function(name, message) + local player = minetest.get_player_by_name(name) + if not player_ok(player) or string.find(message, "/") then + return + end + + awards.notify_chat(player) +end) + + +awards.register_trigger("join", { + type = "counted", + progress = "@1/@2 joins", + auto_description = { "Join once", "Join @1 times" }, +}) +minetest.register_on_joinplayer(awards.notify_join) + + +awards.register_trigger("death", { + type = "counted_key", + progress = "@1/@2 deaths", + auto_description = { "Die once of @2", "Die @1 times of @2" }, + auto_description_total = { "Die @1 times.", "Mine @1 times" }, + get_key = function(self, def) + return def.trigger.reason + end, +}) +minetest.register_on_dieplayer(function(player, reason) + if reason then + reason = reason.type + else + reason = "unknown" + end + awards.notify_death(player, reason) +end) + + +awards.register_trigger("dig", { + type = "counted_key", + progress = "@1/@2 dug", + auto_description = { "Mine: @2", "Mine: @1×@2" }, + auto_description_total = { "Mine @1 block.", "Mine @1 blocks." }, + get_key = function(self, def) + return minetest.registered_aliases[def.trigger.node] or def.trigger.node + end, + key_is_item = true, +}) +minetest.register_on_dignode(function(pos, node, player) + if not player_ok(player) or not pos or not node then + return + end + + local node_name = node.name + node_name = minetest.registered_aliases[node_name] or node_name + awards.notify_dig(player, node_name) +end) + + +awards.register_trigger("place", { + type = "counted_key", + progress = "@1/@2 placed", + auto_description = { "Place: @2", "Place: @1×@2" }, + auto_description_total = { "Place @1 block.", "Place @1 blocks." }, + get_key = function(self, def) + return minetest.registered_aliases[def.trigger.node] or def.trigger.node + end, + key_is_item = true, +}) +minetest.register_on_placenode(function(pos, node, player) + if not player_ok(player) or not pos or not node then + return + end + + local node_name = node.name + node_name = minetest.registered_aliases[node_name] or node_name + awards.notify_place(player, node_name) +end) + + +awards.register_trigger("craft", { + type = "counted_key", + progress = "@1/@2 crafted", + auto_description = { "Craft: @2", "Craft: @1×@2" }, + auto_description_total = { "Craft @1 item", "Craft @1 items." }, + get_key = function(self, def) + return minetest.registered_aliases[def.trigger.item] or def.trigger.item + end, + key_is_item = true, +}) +minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + if not player_ok(player) or itemstack:is_empty() then + return + end + + local itemname = itemstack:get_name() + itemname = minetest.registered_aliases[itemname] or itemname + awards.notify_craft(player, itemname, itemstack:get_count()) +end) + + +awards.register_trigger("eat", { + type = "counted_key", + progress = "@1/@2 eaten", + auto_description = { "Eat @2", "Eat @1×@2" }, + auto_description_total = { "Eat @1 item", "Eat @1 items." }, + get_key = function(self, def) + return minetest.registered_aliases[def.trigger.item] or def.trigger.item + end, + key_is_item = true, +}) +minetest.register_on_item_eat(function(_, _, itemstack, player, _) + if not player_ok(player) or itemstack:is_empty() then + return + end + + local itemname = itemstack:get_name() + itemname = minetest.registered_aliases[itemname] or itemname + awards.notify_eat(player, itemname) +end) diff --git a/mods/awards/textures/_Gimp/awards_Pyromaniac.xcf b/mods/awards/textures/_Gimp/awards_Pyromaniac.xcf new file mode 100644 index 0000000..3a2dcf5 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_Pyromaniac.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_a_cat_in_a_pop_tart.xcf b/mods/awards/textures/_Gimp/awards_a_cat_in_a_pop_tart.xcf new file mode 100644 index 0000000..793a479 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_a_cat_in_a_pop_tart.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_architect.xcf b/mods/awards/textures/_Gimp/awards_architect.xcf new file mode 100644 index 0000000..7937372 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_architect.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_aspiring_farmer.xcf b/mods/awards/textures/_Gimp/awards_aspiring_farmer.xcf new file mode 100644 index 0000000..803ac3b Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_aspiring_farmer.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_backpacker.xcf b/mods/awards/textures/_Gimp/awards_backpacker.xcf new file mode 100644 index 0000000..45d957b Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_backpacker.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_baker.xcf b/mods/awards/textures/_Gimp/awards_baker.xcf new file mode 100644 index 0000000..6b99dfb Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_baker.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_banker.xcf b/mods/awards/textures/_Gimp/awards_banker.xcf new file mode 100644 index 0000000..f8e2014 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_banker.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_bricker.xcf b/mods/awards/textures/_Gimp/awards_bricker.xcf new file mode 100644 index 0000000..5a24f86 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_bricker.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_build_a_cave.xcf b/mods/awards/textures/_Gimp/awards_build_a_cave.xcf new file mode 100644 index 0000000..d5b9e0a Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_build_a_cave.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_builder.xcf b/mods/awards/textures/_Gimp/awards_builder.xcf new file mode 100644 index 0000000..6b33fd5 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_builder.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_castorama.xcf b/mods/awards/textures/_Gimp/awards_castorama.xcf new file mode 100644 index 0000000..1a114b2 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_castorama.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_crafter_of_sticks.xcf b/mods/awards/textures/_Gimp/awards_crafter_of_sticks.xcf new file mode 100644 index 0000000..70eb2d6 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_crafter_of_sticks.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_dandelions_are_yellow.xcf b/mods/awards/textures/_Gimp/awards_dandelions_are_yellow.xcf new file mode 100644 index 0000000..a161242 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_dandelions_are_yellow.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_desert_discoverer.xcf b/mods/awards/textures/_Gimp/awards_desert_discoverer.xcf new file mode 100644 index 0000000..e5e51e0 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_desert_discoverer.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_desert_dweller.xcf b/mods/awards/textures/_Gimp/awards_desert_dweller.xcf new file mode 100644 index 0000000..9a43ffb Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_desert_dweller.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_engineer.xcf b/mods/awards/textures/_Gimp/awards_engineer.xcf new file mode 100644 index 0000000..0e07f24 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_engineer.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_far_lands.xcf b/mods/awards/textures/_Gimp/awards_far_lands.xcf new file mode 100644 index 0000000..1f9797a Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_far_lands.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_farming_skills_acquired.xcf b/mods/awards/textures/_Gimp/awards_farming_skills_acquired.xcf new file mode 100644 index 0000000..3fbedd6 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_farming_skills_acquired.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_field_worker.xcf b/mods/awards/textures/_Gimp/awards_field_worker.xcf new file mode 100644 index 0000000..61b3cad Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_field_worker.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_filthy_rich.xcf b/mods/awards/textures/_Gimp/awards_filthy_rich.xcf new file mode 100644 index 0000000..9693359 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_filthy_rich.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_firefighter.xcf b/mods/awards/textures/_Gimp/awards_firefighter.xcf new file mode 100644 index 0000000..2e245f4 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_firefighter.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_first_day_in_the_woods.xcf b/mods/awards/textures/_Gimp/awards_first_day_in_the_woods.xcf new file mode 100644 index 0000000..f2c90ef Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_first_day_in_the_woods.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_first_gold_find.xcf b/mods/awards/textures/_Gimp/awards_first_gold_find.xcf new file mode 100644 index 0000000..39c8c22 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_first_gold_find.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_first_mese_find.xcf b/mods/awards/textures/_Gimp/awards_first_mese_find.xcf new file mode 100644 index 0000000..7ba420a Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_first_mese_find.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_fortress.xcf b/mods/awards/textures/_Gimp/awards_fortress.xcf new file mode 100644 index 0000000..c17a8a4 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_fortress.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_geraniums_are_blue.xcf b/mods/awards/textures/_Gimp/awards_geraniums_are_blue.xcf new file mode 100644 index 0000000..f48c57f Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_geraniums_are_blue.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_girls_best_friend.xcf b/mods/awards/textures/_Gimp/awards_girls_best_friend.xcf new file mode 100644 index 0000000..c727bd4 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_girls_best_friend.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_glacier_discoverer.xcf b/mods/awards/textures/_Gimp/awards_glacier_discoverer.xcf new file mode 100644 index 0000000..2a504aa Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_glacier_discoverer.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_glasser.xcf b/mods/awards/textures/_Gimp/awards_glasser.xcf new file mode 100644 index 0000000..97c8575 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_glasser.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_gold_rush.xcf b/mods/awards/textures/_Gimp/awards_gold_rush.xcf new file mode 100644 index 0000000..0fbc8a5 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_gold_rush.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_grasslands_discoverer.xcf b/mods/awards/textures/_Gimp/awards_grasslands_discoverer.xcf new file mode 100644 index 0000000..35fa979 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_grasslands_discoverer.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_hardened_miner.xcf b/mods/awards/textures/_Gimp/awards_hardened_miner.xcf new file mode 100644 index 0000000..ffbd68f Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_hardened_miner.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_hardest_block_on_earth.xcf b/mods/awards/textures/_Gimp/awards_hardest_block_on_earth.xcf new file mode 100644 index 0000000..89d1fbf Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_hardest_block_on_earth.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_hotelier.xcf b/mods/awards/textures/_Gimp/awards_hotelier.xcf new file mode 100644 index 0000000..788f4ce Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_hotelier.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_house_of_obsidian.xcf b/mods/awards/textures/_Gimp/awards_house_of_obsidian.xcf new file mode 100644 index 0000000..01e8660 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_house_of_obsidian.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_in_the_dungeon.xcf b/mods/awards/textures/_Gimp/awards_in_the_dungeon.xcf new file mode 100644 index 0000000..88ede74 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_in_the_dungeon.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_industrial_age.xcf b/mods/awards/textures/_Gimp/awards_industrial_age.xcf new file mode 100644 index 0000000..daee558 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_industrial_age.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_jungle_discoverer.xcf b/mods/awards/textures/_Gimp/awards_jungle_discoverer.xcf new file mode 100644 index 0000000..92e74fd Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_jungle_discoverer.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_junglebaby.xcf b/mods/awards/textures/_Gimp/awards_junglebaby.xcf new file mode 100644 index 0000000..58e83fd Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_junglebaby.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_jungleman.xcf b/mods/awards/textures/_Gimp/awards_jungleman.xcf new file mode 100644 index 0000000..7b64747 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_jungleman.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_lava_and_water.xcf b/mods/awards/textures/_Gimp/awards_lava_and_water.xcf new file mode 100644 index 0000000..bfa7d14 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_lava_and_water.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_lava_miner.xcf b/mods/awards/textures/_Gimp/awards_lava_miner.xcf new file mode 100644 index 0000000..0c2684c Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_lava_miner.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_level1.xcf b/mods/awards/textures/_Gimp/awards_level1.xcf new file mode 100644 index 0000000..09d53df Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_level1.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_level2.xcf b/mods/awards/textures/_Gimp/awards_level2.xcf new file mode 100644 index 0000000..170ebc4 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_level2.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_level3.xcf b/mods/awards/textures/_Gimp/awards_level3.xcf new file mode 100644 index 0000000..dbf3480 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_level3.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_level4.xcf b/mods/awards/textures/_Gimp/awards_level4.xcf new file mode 100644 index 0000000..ddbba7d Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_level4.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_level5.xcf b/mods/awards/textures/_Gimp/awards_level5.xcf new file mode 100644 index 0000000..bc6a38b Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_level5.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_level6.xcf b/mods/awards/textures/_Gimp/awards_level6.xcf new file mode 100644 index 0000000..99d3e1a Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_level6.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_level7.xcf b/mods/awards/textures/_Gimp/awards_level7.xcf new file mode 100644 index 0000000..269a8d1 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_level7.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_light_it_up.xcf b/mods/awards/textures/_Gimp/awards_light_it_up.xcf new file mode 100644 index 0000000..ceb8693 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_light_it_up.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_little_library.xcf b/mods/awards/textures/_Gimp/awards_little_library.xcf new file mode 100644 index 0000000..7f3a36a Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_little_library.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_long_ladder.xcf b/mods/awards/textures/_Gimp/awards_long_ladder.xcf new file mode 100644 index 0000000..4642d8a Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_long_ladder.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_lumberjack.xcf b/mods/awards/textures/_Gimp/awards_lumberjack.xcf new file mode 100644 index 0000000..884a2e9 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_lumberjack.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_marchand_de_sable.xcf b/mods/awards/textures/_Gimp/awards_marchand_de_sable.xcf new file mode 100644 index 0000000..9f07ad2 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_marchand_de_sable.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_master_architect.xcf b/mods/awards/textures/_Gimp/awards_master_architect.xcf new file mode 100644 index 0000000..147a764 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_master_architect.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_master_miner.xcf b/mods/awards/textures/_Gimp/awards_master_miner.xcf new file mode 100644 index 0000000..7f49780 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_master_miner.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_mese_mastery.xcf b/mods/awards/textures/_Gimp/awards_mese_mastery.xcf new file mode 100644 index 0000000..3e041ac Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_mese_mastery.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_mini_miner.xcf b/mods/awards/textures/_Gimp/awards_mini_miner.xcf new file mode 100644 index 0000000..69bbe8a Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_mini_miner.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_mushroom_lover.xcf b/mods/awards/textures/_Gimp/awards_mushroom_lover.xcf new file mode 100644 index 0000000..7b1b838 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_mushroom_lover.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_obsessed_with_obsidian.xcf b/mods/awards/textures/_Gimp/awards_obsessed_with_obsidian.xcf new file mode 100644 index 0000000..7e25536 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_obsessed_with_obsidian.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_on_the_way.xcf b/mods/awards/textures/_Gimp/awards_on_the_way.xcf new file mode 100644 index 0000000..658c116 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_on_the_way.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_outpost.xcf b/mods/awards/textures/_Gimp/awards_outpost.xcf new file mode 100644 index 0000000..0204ef5 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_outpost.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_pharaoh.xcf b/mods/awards/textures/_Gimp/awards_pharaoh.xcf new file mode 100644 index 0000000..14feb90 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_pharaoh.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_professional_lumberjack.xcf b/mods/awards/textures/_Gimp/awards_professional_lumberjack.xcf new file mode 100644 index 0000000..ee1be0b Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_professional_lumberjack.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_really_well_lit.xcf b/mods/awards/textures/_Gimp/awards_really_well_lit.xcf new file mode 100644 index 0000000..b3747cf Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_really_well_lit.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_roses_are_red.xcf b/mods/awards/textures/_Gimp/awards_roses_are_red.xcf new file mode 100644 index 0000000..eec49b9 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_roses_are_red.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_saint_maclou.xcf b/mods/awards/textures/_Gimp/awards_saint_maclou.xcf new file mode 100644 index 0000000..d998363 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_saint_maclou.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_sam_the_trapper.xcf b/mods/awards/textures/_Gimp/awards_sam_the_trapper.xcf new file mode 100644 index 0000000..ea1f208 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_sam_the_trapper.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_savannah_discoverer.xcf b/mods/awards/textures/_Gimp/awards_savannah_discoverer.xcf new file mode 100644 index 0000000..1f7cd36 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_savannah_discoverer.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_semi_pro_lumberjack.xcf b/mods/awards/textures/_Gimp/awards_semi_pro_lumberjack.xcf new file mode 100644 index 0000000..0a0c426 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_semi_pro_lumberjack.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_smelter.xcf b/mods/awards/textures/_Gimp/awards_smelter.xcf new file mode 100644 index 0000000..9bc2c7f Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_smelter.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_tasty_mushrooms.xcf b/mods/awards/textures/_Gimp/awards_tasty_mushrooms.xcf new file mode 100644 index 0000000..ad28538 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_tasty_mushrooms.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_template.xcf b/mods/awards/textures/_Gimp/awards_template.xcf new file mode 100644 index 0000000..371b3f3 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_template.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_treasurer.xcf b/mods/awards/textures/_Gimp/awards_treasurer.xcf new file mode 100644 index 0000000..1f857f8 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_treasurer.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_ui_icon.xcf b/mods/awards/textures/_Gimp/awards_ui_icon.xcf new file mode 100644 index 0000000..8ad704b Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_ui_icon.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_underground_mushroom_farmer.xcf b/mods/awards/textures/_Gimp/awards_underground_mushroom_farmer.xcf new file mode 100644 index 0000000..fb53f08 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_underground_mushroom_farmer.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_unknown.xcf b/mods/awards/textures/_Gimp/awards_unknown.xcf new file mode 100644 index 0000000..b71bb16 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_unknown.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_very_simple_snow_man.xcf b/mods/awards/textures/_Gimp/awards_very_simple_snow_man.xcf new file mode 100644 index 0000000..ce7ac1d Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_very_simple_snow_man.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_watchtower.xcf b/mods/awards/textures/_Gimp/awards_watchtower.xcf new file mode 100644 index 0000000..2fbe2e3 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_watchtower.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_well_lit.xcf b/mods/awards/textures/_Gimp/awards_well_lit.xcf new file mode 100644 index 0000000..bc3fbab Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_well_lit.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_wheat_magnate.xcf b/mods/awards/textures/_Gimp/awards_wheat_magnate.xcf new file mode 100644 index 0000000..0fb20ec Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_wheat_magnate.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_white_color_stock.xcf b/mods/awards/textures/_Gimp/awards_white_color_stock.xcf new file mode 100644 index 0000000..010fac1 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_white_color_stock.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_wool_over_your_eyes.xcf b/mods/awards/textures/_Gimp/awards_wool_over_your_eyes.xcf new file mode 100644 index 0000000..19bc54c Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_wool_over_your_eyes.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_wow_i_am_diamonds.xcf b/mods/awards/textures/_Gimp/awards_wow_i_am_diamonds.xcf new file mode 100644 index 0000000..98c2cbe Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_wow_i_am_diamonds.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_youre_a_copper.xcf b/mods/awards/textures/_Gimp/awards_youre_a_copper.xcf new file mode 100644 index 0000000..ba06034 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_youre_a_copper.xcf differ diff --git a/mods/awards/textures/_Gimp/awards_yummy.xcf b/mods/awards/textures/_Gimp/awards_yummy.xcf new file mode 100644 index 0000000..862bbe8 Binary files /dev/null and b/mods/awards/textures/_Gimp/awards_yummy.xcf differ diff --git a/mods/awards/textures/_Read Me.txt b/mods/awards/textures/_Read Me.txt new file mode 100644 index 0000000..c7f5dcf --- /dev/null +++ b/mods/awards/textures/_Read Me.txt @@ -0,0 +1,428 @@ + __________ .___ _____ + \______ \ ____ _____ __| _/ / \ ____ + | _// __ \\__ \ / __ | / \ / \_/ __ \ + | | \ ___/ / __ \_/ /_/ | / Y \ ___/ + |____|_ /\___ >____ /\____ | \____|__ /\___ > + \/ \/ \/ \/ \/ \/ + + and license info + + Below is a listing of the Award icon source and attribution/licence info. + CC BY-SA 3.0 - https://creativecommons.org/licenses/by-sa/3.0/ + CC0 - https://creativecommons.org/share-your-work/public-domain/cc0/ + +A Cat in a Pop Tart?! -- CC0 + Inspiration art RinRinDaishi on Deviant art + https://www.deviantart.com/rinrindaishi/art/Nyancat-Bed-335515771 + see _RinrinDaishi_message.png + Icon drawn by Sirrobzeroone from scratch + +Architect -- CC BY-SA 3.0 + Tree Wood (default_wood.png) - BlockMen + Stone Wall (cobble) texture - Neuromancer/Brane Praefect + Rest - Sirrobzeroone + +Aspiring Farmer -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Dirt Texture (default_dirt.png) - Random-Geek/Neuromancer + Fence texture - Paramat/Blockmen + Wheat Texture - PilzAdam/BlockMen/MasterGollum/Gambit + Rest - Sirrobzeroone + +Backpacker -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Binoculars - Paramat + Wool Texture - Cisoun + Rest - Sirrobzeroone + +Baker -- CC BY-SA 3.0 + Tree Wood (default_wood.png) - BlockMen + Stone Wall texture - Neuromancer/Brane Praefect + Furnace - Neuromancer + Rest - Sirrobzeroone + +Banker -- CC BY-SA 3.0 + Wood Pine Floor (default_pinewood.png) - Paramat + Chest - BlockMen + Rest - Sirrobzeroone + +Bricker -- CC BY-SA 3.0 + Brick Texture - Calinou + Rest - Sirrobzeroone + +Build a Cave -- CC BY-SA 3.0 + Stone (default_stone.png) - Cisoun + Grass texture (default_grass.png) - Paramat + Rest - Sirrobzeroone + +Builder -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Wool Texture - Cisoun + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Rest - Sirrobzeroone + +Castorama -- CC0 (Public Domain) + All - Sirrobzeroone + +Crafter of Sticks -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Grass Tall (default_grass_*.png) - Gambit + Rest - Sirrobzeroone + +Dandelions are Yellow -- CC0 (Public Domain) + All - Openclipart Library/Sirrobzeroone + +Desert Discoverer -- CC BY-SA 3.0 + Sand (default_desert_sand.png) - VanessaE + Dry Shrub (default_dry_shrub.png) - celeron55 + Sun () - Celeron55 + Rest - Sirrobzeroone + +Desert Dweller -- CC BY-SA 3.0 + Sand (default_desert_sand.png) - VanessaE + Rest - Sirrobzeroone + +Engineer -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Rest - Sirrobzeroone + +Far Lands -- CC BY-SA 3.0 + Water (default_water.png) - Cisoun + Tree Bark (default_tree.png) - Cisoun + Tree Wood (default_wood.png) - BlockMen + Tree Leaves (default_leaves.png) - Cisoun + Sun () - Celeron55 + Rest - Sirrobzeroone + +Farming Skills Acquired -- CC BY-SA 3.0 + Wheat Texture - PilzAdam/BlockMen/MasterGollum/Gambit + Dirt Texture (default_dirt.png) - Random-Geek/Neuromancer + Grass texture (default_grass.png) - Paramat + Sun () - Celeron55 + Rest - Sirrobzeroone + +Field Worker -- CC BY-SA 3.0 + Wheat Texture - PilzAdam/BlockMen/MasterGollum/Gambit + Dirt Texture (default_dirt.png) - Random-Geek/Neuromancer + Rest - Sirrobzeroone + +Filthy Rich -- CC BY-SA 3.0 + Tree Wood (default_wood.png) - BlockMen + Rest - Sirrobzeroone + +Firefighter -- CC0 (Public Domain) + All - Sirrobzeroone + +First Day in the Woods -- CC BY-SA 3.0 + Tree Bark (default_tree.png) - Cisoun + Grass texture (default_grass.png) - Paramat + Grass Tall (default_grass_*.png) - Gambit + Axe (default_tool_*.png) - BlockMen + Rest - Sirrobzeroone + +First Gold Find -- CC BY-SA 3.0 + Gold Nugget (default_gold_lump.png) - Gambit + Stone (default_stone.png) - Cisoun + Rest - Sirrobzeroone + +First Mese Find -- CC BY-SA 3.0 + Stone (default_stone.png) - Cisoun + Mese Crystal (default_mese_crystal.png) - VanessaE + Rest - Sirrobzeroone + +Fortress -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Tree Bark (default_tree.png) - Cisoun + Tree Leaves (default_leaves.png) - Cisoun + Rest - Sirrobzeroone + +Geraniums are Blue -- CC BY-SA 3.0 + Geranium (flowers_geranium.png) + Wool Texture - Cisoun + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Tree Wood (default_wood.png) - BlockMen + Rest - Sirrobzeroone + +Girl's Best Friend -- CC BY-SA 3.0 + Diamond (default_diamond.png) - BlockMen + Rest - Sirrobzeroone + +Glacier Discoverer -- CC BY-SA 3.0 + Ice (default_ice.png) - as197 + Snow (default_snow.png) - Gambit + Rest - Sirrobzeroone + +Glasser -- CC BY-SA 3.0 + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Tree Wood (default_wood.png) - BlockMen + Rest - Sirrobzeroone + +Gold Rush -- CC BY-SA 3.0 + Stone Blocks (default_stone_block.png) - Paramat + Tree Bark (default_tree.png) - Cisoun + Stone (default_stone.png) - Cisoun + Gold Nugget (default_gold_lump.png) - Gambit + Torch (default_torch_on_floor.png) - VanessaE + Rail (carts_rail_*) - Hexafraction/Sofar + Cart (carts_cart_side.png) - Gambit + Rest - Sirrobzeroone + +Grasslands Discoverer -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Dirt Texture (default_dirt.png) - Random-Geek/Neuromancer + Sun () - Celeron55 + Bluberry (default_blueberries.png) - Random-Geek + Viola (flowers_viola.png) - RHRhino/Gambit/yyt16384/Paramat + Rest - Sirrobzeroone + +Hardened Miner -- CC BY-SA 3.0 + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Rest - Sirrobzeroone + +Hardest Block on Earth -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Tree Bark (default_tree.png) - Cisoun + Tree Leaves (default_leaves.png) - Cisoun + Diamond Block (default_diamond_block.png) - Gambit + Rest - Sirrobzeroone + +Hotelier -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Tree Wood (default_wood.png) - BlockMen + Tree Bark (default_tree.png) - Cisoun + Wood Pine Floor (default_pinewood.png) - Paramat + Wood Acacia Floor (default_acacia_wood.png) - Paramat + Rest - Sirrobzeroone + +House of Obsidian -- CC BY-SA 3.0 + Wood Acacia Floor (default_acacia_wood.png) - Paramat + Grass texture (default_grass.png) - Paramat + Tree Bark (default_tree.png) - Cisoun + Obsidian (default_obsidian.png) - Jojoa1997 + Rest - Sirrobzeroone + +In the Dungeon -- CC BY-SA 3.0 + Wood Pine Floor (default_pinewood.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Rest - Sirrobzeroone + +Industrial Age -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Wood Pine Floor (default_pinewood.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Sun () - Celeron55 + Rest - Sirrobzeroone + +Jungle Discoverer -- CC BY-SA 3.0 + Jungle Bark (default_jungletree.png) - Cisoun + Jungle Leaves (default_jungleleaves.png) - PilzAdam + Jungle Litter (default_rainforest_litter.png) - npx + Grass texture (default_grass.png) - Paramat + Rest - Sirrobzeroone + +Junglebaby -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Jungle Bark (default_jungletree.png) - Cisoun + Rest - Sirrobzeroone + +Jungleman -- CC BY-SA 3.0 + Jungle Bark (default_jungletree.png) - Cisoun + Jungle Leaves (default_jungleleaves.png) - PilzAdam + Rest - Sirrobzeroone + +Lava and Water -- CC BY-SA 3.0 + Water (default_water.png) - Cisoun + Lava (default_lava.png) - Cisoun + Obsidian (default_obsidian.png) - Jojoa1997 + Rest - Sirrobzeroone + +Lava Miner -- CC BY-SA 3.0 + Lava (default_lava.png) - Cisoun + Stone (default_stone.png) - Cisoun + Rest - Sirrobzeroone + +Light It Up -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Torch (default_torch_on_floor.png) - VanessaE + Rest - Sirrobzeroone + +Little Library -- CC BY-SA 3.0 + BookShelf (default_bookshelf.png) - Celeron55 + Tree Wood (default_wood.png) - BlockMen + Rest - Sirrobzeroone + +Long Ladder -- CC BY-SA 3.0 + Ladder (default_ladder_wood.png) - Celeron55 + Rest - Sirrobzeroone + +Lumberjack -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Tree Bark (default_tree.png) - Cisoun + Rest - Sirrobzeroone + +Marchand De Sable -- CC BY-SA 3.0 + Sand ( default_desert_sand.png) - VanessaE + Sand Block (default_desert_stone.png) - VanessaE + Rest - Sirrobzeroone + +Master Miner -- CC BY-SA 3.0 + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Rest - Sirrobzeroone + +Mese Mastery -- CC BY-SA 3.0 + Stone (default_stone.png) - Cisoun + Mese block (default_mese_block.png) - Paramat + Rest - Sirrobzeroone + +Mini Miner -- CC BY-SA 3.0 + Stone (default_stone.png) - Cisoun + Iron Ore (default_mineral_iron.png) - Celeron55 + Rest - Sirrobzeroone + +Mushroom Lover -- CC BY-SA 3.0 + Tree Wood (default_wood.png) - BlockMen + Rest - Sirrobzeroone + +Obsessed with Obsidian -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Tree Bark (default_tree.png) - Cisoun + Tree Leaves (default_leaves.png) - Cisoun + Dirt Texture (default_dirt.png) - Random-Geek/Neuromancer + Obsidian (default_obsidian.png) - Jojoa1997 + Rest - Sirrobzeroone + +On The Way -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Tree Bark (default_tree.png) - Cisoun + Tree Leaves (default_leaves.png) - Cisoun + Rail (carts_rail_*) - Hexafraction/Sofar + Rest - Sirrobzeroone + +Outpost -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Tree Bark (default_tree.png) - Cisoun + Tree Leaves (default_leaves.png) - Cisoun + Rest - Sirrobzeroone + +Pharaoh -- CC BY-SA 3.0 + Sand (default_desert_sand.png) - VanessaE + Rest - Sirrobzeroone + +Professional Lumberjack -- CC BY-SA 3.0 + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Tree Wood (default_wood.png) - BlockMen + Axe (default_tool_*.png) - BlockMen + Rest - Sirrobzeroone + +Pyromaniac -- CC0 (Public Domain) + All - Sirrobzeroone + +Really Well Lit -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Wheat Texture - PilzAdam/BlockMen/MasterGollum/Gambit + Tree Wood (default_wood.png) - BlockMen + Rest - Sirrobzeroone + +Roses Are Red -- CC0 (Public Domain) + All - Sirrobzeroone + +Saint-Maclou -- CC0 (Public Domain) + All - Sirrobzeroone + +Sam the Trapper -- CC BY-SA 3.0 + Tree Wood (default_wood.png) - BlockMen + Grass texture (default_grass.png) - Paramat + Rest - Sirrobzeroone + +Savannah Discoverer -- CC BY-SA 3.0 + Dry grass (default_dry_grass.png) - Paramat + Dirt Texture (default_dirt.png) - Random-Geek/Neuromancer + Sun () - Celeron55 + Acacia Leaves (default_acacia_leaves.png) - Paramat + Acacia Bark (default_acacia_tree.png) - Paramat + Rest - Sirrobzeroone + +Semi-pro Lumberjack -- CC BY-SA 3.0 + Tree Wood (default_wood.png) - BlockMen + Tree Bark (default_tree.png) - Cisoun + Axe (default_tool_*.png) - BlockMen + Rest - Sirrobzeroone + +Smelter -- CC0 (Public Domain) + All - Openclipart library/Sirrobzeroone + +Tasty Mushrooms -- CC0 (Public Domain) + All - Openclipart library/Sirrobzeroone + +Treasurer -- CC BY-SA 3.0 + Tree Wood (default_wood.png) - BlockMen + Wood Pine Floor (default_pinewood.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Rest - Sirrobzeroone + +Underground Mushroom Farmer -- CC BY-SA 3.0 + Dirt Texture (default_dirt.png) - Random-Geek/Neuromancer + Stone (default_stone.png) - Cisoun + Mushroom (flowers_mushroom_brown.png) - RHRhino/Gambit/yyt16384/Paramat + Torch (default_torch_on_floor.png) - VanessaE + Rest - Sirrobzeroone + +Very Simple Snow Man -- CC BY-SA 3.0 + Snow (default_snow.png) - Gambit + Stick (default_stick.png) - BlockMen + Rest - Sirrobzeroone + +Watchtower -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Tree Bark (default_tree.png) - Cisoun + Tree Leaves (default_leaves.png) - Cisoun + Rest - Sirrobzeroone + +Well Lit -- CC BY-SA 3.0 + Grass texture (default_grass.png) - Paramat + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Wood Pine Floor (default_pinewood.png) - Paramat + Rest - Sirrobzeroone + +Wheat Magnate -- CC BY-SA 3.0 + Tree Wood (default_wood.png) - BlockMen + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Sun () - Celeron55 + Wheat Texture - PilzAdam/BlockMen/MasterGollum/Gambit + Rest - Sirrobzeroone + +White Color Stock -- CC BY-SA 3.0 + Tree Wood (default_wood.png) - BlockMen + Cobble Wall (default_cobble.png) - Neuromancer/Brane Praefect + Rest - Sirrobzeroone + +Wool Over Your Eyes -- CC BY-SA 3.0 + Sun () - Celeron55 + Grass texture (default_grass.png) - Paramat + Dirt Texture (default_dirt.png) - Random-Geek/Neuromancer + Bluberry (default_blueberries.png) - Random-Geek + Viola (flowers_viola.png) - RHRhino/Gambit/yyt16384/Paramat + Grass Tall (default_grass_*.png) - Gambit + Rest - Sirrobzeroone + +Wow, I am Diamonds! -- CC BY-SA 3.0 + Diamond (default_diamond.png) - BlockMen + Stone (default_stone.png) - Cisoun + Rest - Sirrobzeroone + +You’re a copper -- CC0 (Public Domain) + All - Sirrobzeroone + +Yummy! -- CC0 (Public Domain) + All - Openclipart library/Sirrobzeroone + + + + + diff --git a/mods/awards/textures/_RinrinDaishi_message.png b/mods/awards/textures/_RinrinDaishi_message.png new file mode 100644 index 0000000..b22781e Binary files /dev/null and b/mods/awards/textures/_RinrinDaishi_message.png differ diff --git a/mods/awards/textures/awards_a_cat_in_a_pop_tart.png b/mods/awards/textures/awards_a_cat_in_a_pop_tart.png new file mode 100644 index 0000000..79ec4c1 Binary files /dev/null and b/mods/awards/textures/awards_a_cat_in_a_pop_tart.png differ diff --git a/mods/awards/textures/awards_architect.png b/mods/awards/textures/awards_architect.png new file mode 100644 index 0000000..526a290 Binary files /dev/null and b/mods/awards/textures/awards_architect.png differ diff --git a/mods/awards/textures/awards_aspiring_farmer.png b/mods/awards/textures/awards_aspiring_farmer.png new file mode 100644 index 0000000..6fcce95 Binary files /dev/null and b/mods/awards/textures/awards_aspiring_farmer.png differ diff --git a/mods/awards/textures/awards_backpacker.png b/mods/awards/textures/awards_backpacker.png new file mode 100644 index 0000000..d87ffa7 Binary files /dev/null and b/mods/awards/textures/awards_backpacker.png differ diff --git a/mods/awards/textures/awards_baker.png b/mods/awards/textures/awards_baker.png new file mode 100644 index 0000000..445da14 Binary files /dev/null and b/mods/awards/textures/awards_baker.png differ diff --git a/mods/awards/textures/awards_banker.png b/mods/awards/textures/awards_banker.png new file mode 100644 index 0000000..f0899c0 Binary files /dev/null and b/mods/awards/textures/awards_banker.png differ diff --git a/mods/awards/textures/bg_default.png b/mods/awards/textures/awards_bg_default.png similarity index 100% rename from mods/awards/textures/bg_default.png rename to mods/awards/textures/awards_bg_default.png diff --git a/mods/awards/textures/bg_mining.png b/mods/awards/textures/awards_bg_mining.png similarity index 100% rename from mods/awards/textures/bg_mining.png rename to mods/awards/textures/awards_bg_mining.png diff --git a/mods/awards/textures/awards_bricker.png b/mods/awards/textures/awards_bricker.png new file mode 100644 index 0000000..eb5e814 Binary files /dev/null and b/mods/awards/textures/awards_bricker.png differ diff --git a/mods/awards/textures/awards_build_a_cave.png b/mods/awards/textures/awards_build_a_cave.png new file mode 100644 index 0000000..de2e75b Binary files /dev/null and b/mods/awards/textures/awards_build_a_cave.png differ diff --git a/mods/awards/textures/awards_builder.png b/mods/awards/textures/awards_builder.png new file mode 100644 index 0000000..6c04003 Binary files /dev/null and b/mods/awards/textures/awards_builder.png differ diff --git a/mods/awards/textures/awards_castorama.png b/mods/awards/textures/awards_castorama.png new file mode 100644 index 0000000..b5dce24 Binary files /dev/null and b/mods/awards/textures/awards_castorama.png differ diff --git a/mods/awards/textures/awards_crafter_of_sticks.png b/mods/awards/textures/awards_crafter_of_sticks.png new file mode 100644 index 0000000..a2137bd Binary files /dev/null and b/mods/awards/textures/awards_crafter_of_sticks.png differ diff --git a/mods/awards/textures/awards_dandelions_are_yellow.png b/mods/awards/textures/awards_dandelions_are_yellow.png new file mode 100644 index 0000000..c875de1 Binary files /dev/null and b/mods/awards/textures/awards_dandelions_are_yellow.png differ diff --git a/mods/awards/textures/awards_desert_discoverer.png b/mods/awards/textures/awards_desert_discoverer.png new file mode 100644 index 0000000..6d4a2e5 Binary files /dev/null and b/mods/awards/textures/awards_desert_discoverer.png differ diff --git a/mods/awards/textures/awards_desert_dweller.png b/mods/awards/textures/awards_desert_dweller.png new file mode 100644 index 0000000..e03a2d1 Binary files /dev/null and b/mods/awards/textures/awards_desert_dweller.png differ diff --git a/mods/awards/textures/awards_engineer.png b/mods/awards/textures/awards_engineer.png new file mode 100644 index 0000000..bd6bd4f Binary files /dev/null and b/mods/awards/textures/awards_engineer.png differ diff --git a/mods/awards/textures/awards_far_lands.png b/mods/awards/textures/awards_far_lands.png new file mode 100644 index 0000000..2072bf6 Binary files /dev/null and b/mods/awards/textures/awards_far_lands.png differ diff --git a/mods/awards/textures/awards_farming_skills_acquired.png b/mods/awards/textures/awards_farming_skills_acquired.png new file mode 100644 index 0000000..28803dc Binary files /dev/null and b/mods/awards/textures/awards_farming_skills_acquired.png differ diff --git a/mods/awards/textures/awards_field_worker.png b/mods/awards/textures/awards_field_worker.png new file mode 100644 index 0000000..e898ee9 Binary files /dev/null and b/mods/awards/textures/awards_field_worker.png differ diff --git a/mods/awards/textures/awards_filthy_rich.png b/mods/awards/textures/awards_filthy_rich.png new file mode 100644 index 0000000..6578c38 Binary files /dev/null and b/mods/awards/textures/awards_filthy_rich.png differ diff --git a/mods/awards/textures/awards_firefighter.png b/mods/awards/textures/awards_firefighter.png new file mode 100644 index 0000000..46076a7 Binary files /dev/null and b/mods/awards/textures/awards_firefighter.png differ diff --git a/mods/awards/textures/awards_first_day_in_the_woods.png b/mods/awards/textures/awards_first_day_in_the_woods.png new file mode 100644 index 0000000..e677d88 Binary files /dev/null and b/mods/awards/textures/awards_first_day_in_the_woods.png differ diff --git a/mods/awards/textures/awards_first_gold_find.png b/mods/awards/textures/awards_first_gold_find.png new file mode 100644 index 0000000..edd6c14 Binary files /dev/null and b/mods/awards/textures/awards_first_gold_find.png differ diff --git a/mods/awards/textures/awards_first_mese_find.png b/mods/awards/textures/awards_first_mese_find.png new file mode 100644 index 0000000..43d848e Binary files /dev/null and b/mods/awards/textures/awards_first_mese_find.png differ diff --git a/mods/awards/textures/awards_fortress.png b/mods/awards/textures/awards_fortress.png new file mode 100644 index 0000000..d40ab74 Binary files /dev/null and b/mods/awards/textures/awards_fortress.png differ diff --git a/mods/awards/textures/awards_geraniums_are_blue.png b/mods/awards/textures/awards_geraniums_are_blue.png new file mode 100644 index 0000000..f4fed56 Binary files /dev/null and b/mods/awards/textures/awards_geraniums_are_blue.png differ diff --git a/mods/awards/textures/awards_girls_best_friend.png b/mods/awards/textures/awards_girls_best_friend.png new file mode 100644 index 0000000..6143ea4 Binary files /dev/null and b/mods/awards/textures/awards_girls_best_friend.png differ diff --git a/mods/awards/textures/awards_glacier_discoverer.png b/mods/awards/textures/awards_glacier_discoverer.png new file mode 100644 index 0000000..5d7b3ca Binary files /dev/null and b/mods/awards/textures/awards_glacier_discoverer.png differ diff --git a/mods/awards/textures/awards_glasser.png b/mods/awards/textures/awards_glasser.png new file mode 100644 index 0000000..a5dfb03 Binary files /dev/null and b/mods/awards/textures/awards_glasser.png differ diff --git a/mods/awards/textures/awards_gold_rush.png b/mods/awards/textures/awards_gold_rush.png new file mode 100644 index 0000000..dbd6ac3 Binary files /dev/null and b/mods/awards/textures/awards_gold_rush.png differ diff --git a/mods/awards/textures/awards_grasslands_discoverer.png b/mods/awards/textures/awards_grasslands_discoverer.png new file mode 100644 index 0000000..7de444c Binary files /dev/null and b/mods/awards/textures/awards_grasslands_discoverer.png differ diff --git a/mods/awards/textures/awards_hardened_miner.png b/mods/awards/textures/awards_hardened_miner.png new file mode 100644 index 0000000..d4baf48 Binary files /dev/null and b/mods/awards/textures/awards_hardened_miner.png differ diff --git a/mods/awards/textures/awards_hardest_block_on_earth.png b/mods/awards/textures/awards_hardest_block_on_earth.png new file mode 100644 index 0000000..3ab903c Binary files /dev/null and b/mods/awards/textures/awards_hardest_block_on_earth.png differ diff --git a/mods/awards/textures/awards_hotelier.png b/mods/awards/textures/awards_hotelier.png new file mode 100644 index 0000000..5a0f6fd Binary files /dev/null and b/mods/awards/textures/awards_hotelier.png differ diff --git a/mods/awards/textures/awards_house_of_obsidian.png b/mods/awards/textures/awards_house_of_obsidian.png new file mode 100644 index 0000000..15b3409 Binary files /dev/null and b/mods/awards/textures/awards_house_of_obsidian.png differ diff --git a/mods/awards/textures/awards_in_the_dungeon.png b/mods/awards/textures/awards_in_the_dungeon.png new file mode 100644 index 0000000..d419d64 Binary files /dev/null and b/mods/awards/textures/awards_in_the_dungeon.png differ diff --git a/mods/awards/textures/awards_industrial_age.png b/mods/awards/textures/awards_industrial_age.png new file mode 100644 index 0000000..d02c3c8 Binary files /dev/null and b/mods/awards/textures/awards_industrial_age.png differ diff --git a/mods/awards/textures/awards_jungle_discoverer.png b/mods/awards/textures/awards_jungle_discoverer.png new file mode 100644 index 0000000..f955e66 Binary files /dev/null and b/mods/awards/textures/awards_jungle_discoverer.png differ diff --git a/mods/awards/textures/awards_junglebaby.png b/mods/awards/textures/awards_junglebaby.png new file mode 100644 index 0000000..e878977 Binary files /dev/null and b/mods/awards/textures/awards_junglebaby.png differ diff --git a/mods/awards/textures/awards_jungleman.png b/mods/awards/textures/awards_jungleman.png new file mode 100644 index 0000000..11ad3bd Binary files /dev/null and b/mods/awards/textures/awards_jungleman.png differ diff --git a/mods/awards/textures/awards_lava_and_water.png b/mods/awards/textures/awards_lava_and_water.png new file mode 100644 index 0000000..a61ec12 Binary files /dev/null and b/mods/awards/textures/awards_lava_and_water.png differ diff --git a/mods/awards/textures/awards_lava_miner.png b/mods/awards/textures/awards_lava_miner.png new file mode 100644 index 0000000..14c4ff8 Binary files /dev/null and b/mods/awards/textures/awards_lava_miner.png differ diff --git a/mods/awards/textures/awards_level1.png b/mods/awards/textures/awards_level1.png new file mode 100644 index 0000000..92051e6 Binary files /dev/null and b/mods/awards/textures/awards_level1.png differ diff --git a/mods/awards/textures/awards_level2.png b/mods/awards/textures/awards_level2.png new file mode 100644 index 0000000..7132dcc Binary files /dev/null and b/mods/awards/textures/awards_level2.png differ diff --git a/mods/awards/textures/awards_level3.png b/mods/awards/textures/awards_level3.png new file mode 100644 index 0000000..4a61d25 Binary files /dev/null and b/mods/awards/textures/awards_level3.png differ diff --git a/mods/awards/textures/awards_level4.png b/mods/awards/textures/awards_level4.png new file mode 100644 index 0000000..5909a32 Binary files /dev/null and b/mods/awards/textures/awards_level4.png differ diff --git a/mods/awards/textures/awards_level5.png b/mods/awards/textures/awards_level5.png new file mode 100644 index 0000000..26b94ac Binary files /dev/null and b/mods/awards/textures/awards_level5.png differ diff --git a/mods/awards/textures/awards_level6.png b/mods/awards/textures/awards_level6.png new file mode 100644 index 0000000..1685125 Binary files /dev/null and b/mods/awards/textures/awards_level6.png differ diff --git a/mods/awards/textures/awards_level7.png b/mods/awards/textures/awards_level7.png new file mode 100644 index 0000000..6b84557 Binary files /dev/null and b/mods/awards/textures/awards_level7.png differ diff --git a/mods/awards/textures/awards_light_it_up.png b/mods/awards/textures/awards_light_it_up.png new file mode 100644 index 0000000..e8725d1 Binary files /dev/null and b/mods/awards/textures/awards_light_it_up.png differ diff --git a/mods/awards/textures/awards_little_library.png b/mods/awards/textures/awards_little_library.png new file mode 100644 index 0000000..bf609f3 Binary files /dev/null and b/mods/awards/textures/awards_little_library.png differ diff --git a/mods/awards/textures/awards_long_ladder.png b/mods/awards/textures/awards_long_ladder.png new file mode 100644 index 0000000..a3c38d9 Binary files /dev/null and b/mods/awards/textures/awards_long_ladder.png differ diff --git a/mods/awards/textures/awards_lumberjack.png b/mods/awards/textures/awards_lumberjack.png new file mode 100644 index 0000000..4f89c47 Binary files /dev/null and b/mods/awards/textures/awards_lumberjack.png differ diff --git a/mods/awards/textures/awards_marchand_de_sable.png b/mods/awards/textures/awards_marchand_de_sable.png new file mode 100644 index 0000000..01e80d6 Binary files /dev/null and b/mods/awards/textures/awards_marchand_de_sable.png differ diff --git a/mods/awards/textures/awards_master_architect.png b/mods/awards/textures/awards_master_architect.png new file mode 100644 index 0000000..34b8bc2 Binary files /dev/null and b/mods/awards/textures/awards_master_architect.png differ diff --git a/mods/awards/textures/awards_master_miner.png b/mods/awards/textures/awards_master_miner.png new file mode 100644 index 0000000..8bf37c4 Binary files /dev/null and b/mods/awards/textures/awards_master_miner.png differ diff --git a/mods/awards/textures/awards_mese_mastery.png b/mods/awards/textures/awards_mese_mastery.png new file mode 100644 index 0000000..89714ae Binary files /dev/null and b/mods/awards/textures/awards_mese_mastery.png differ diff --git a/mods/awards/textures/awards_mini_miner.png b/mods/awards/textures/awards_mini_miner.png new file mode 100644 index 0000000..4ccb127 Binary files /dev/null and b/mods/awards/textures/awards_mini_miner.png differ diff --git a/mods/awards/textures/awards_mushroom_lover.png b/mods/awards/textures/awards_mushroom_lover.png new file mode 100644 index 0000000..52805bd Binary files /dev/null and b/mods/awards/textures/awards_mushroom_lover.png differ diff --git a/mods/awards/textures/awards_obsessed_with_obsidian.png b/mods/awards/textures/awards_obsessed_with_obsidian.png new file mode 100644 index 0000000..4b179bd Binary files /dev/null and b/mods/awards/textures/awards_obsessed_with_obsidian.png differ diff --git a/mods/awards/textures/awards_on_the_way.png b/mods/awards/textures/awards_on_the_way.png new file mode 100644 index 0000000..c2fd224 Binary files /dev/null and b/mods/awards/textures/awards_on_the_way.png differ diff --git a/mods/awards/textures/awards_outpost.png b/mods/awards/textures/awards_outpost.png new file mode 100644 index 0000000..e278052 Binary files /dev/null and b/mods/awards/textures/awards_outpost.png differ diff --git a/mods/awards/textures/awards_pharaoh.png b/mods/awards/textures/awards_pharaoh.png new file mode 100644 index 0000000..f2f4b9a Binary files /dev/null and b/mods/awards/textures/awards_pharaoh.png differ diff --git a/mods/awards/textures/awards_professional_lumberjack.png b/mods/awards/textures/awards_professional_lumberjack.png new file mode 100644 index 0000000..6d67fb7 Binary files /dev/null and b/mods/awards/textures/awards_professional_lumberjack.png differ diff --git a/mods/awards/textures/awards_progress_gray.png b/mods/awards/textures/awards_progress_gray.png new file mode 100644 index 0000000..a5fc6cb Binary files /dev/null and b/mods/awards/textures/awards_progress_gray.png differ diff --git a/mods/awards/textures/awards_progress_green.png b/mods/awards/textures/awards_progress_green.png new file mode 100644 index 0000000..54b4e5d Binary files /dev/null and b/mods/awards/textures/awards_progress_green.png differ diff --git a/mods/awards/textures/awards_pyromaniac.png b/mods/awards/textures/awards_pyromaniac.png new file mode 100644 index 0000000..a12649c Binary files /dev/null and b/mods/awards/textures/awards_pyromaniac.png differ diff --git a/mods/awards/textures/awards_really_well_lit.png b/mods/awards/textures/awards_really_well_lit.png new file mode 100644 index 0000000..b69cdff Binary files /dev/null and b/mods/awards/textures/awards_really_well_lit.png differ diff --git a/mods/awards/textures/awards_roses_are_red.png b/mods/awards/textures/awards_roses_are_red.png new file mode 100644 index 0000000..994760f Binary files /dev/null and b/mods/awards/textures/awards_roses_are_red.png differ diff --git a/mods/awards/textures/awards_saint_maclou.png b/mods/awards/textures/awards_saint_maclou.png new file mode 100644 index 0000000..96b3b39 Binary files /dev/null and b/mods/awards/textures/awards_saint_maclou.png differ diff --git a/mods/awards/textures/awards_sam_the_trapper.png b/mods/awards/textures/awards_sam_the_trapper.png new file mode 100644 index 0000000..89ba567 Binary files /dev/null and b/mods/awards/textures/awards_sam_the_trapper.png differ diff --git a/mods/awards/textures/awards_savannah_discoverer.png b/mods/awards/textures/awards_savannah_discoverer.png new file mode 100644 index 0000000..26c5a39 Binary files /dev/null and b/mods/awards/textures/awards_savannah_discoverer.png differ diff --git a/mods/awards/textures/awards_semi_pro_lumberjack.png b/mods/awards/textures/awards_semi_pro_lumberjack.png new file mode 100644 index 0000000..c4d2d79 Binary files /dev/null and b/mods/awards/textures/awards_semi_pro_lumberjack.png differ diff --git a/mods/awards/textures/awards_smelter.png b/mods/awards/textures/awards_smelter.png new file mode 100644 index 0000000..0dea637 Binary files /dev/null and b/mods/awards/textures/awards_smelter.png differ diff --git a/mods/awards/textures/awards_tasty_mushrooms.png b/mods/awards/textures/awards_tasty_mushrooms.png new file mode 100644 index 0000000..bf34fd2 Binary files /dev/null and b/mods/awards/textures/awards_tasty_mushrooms.png differ diff --git a/mods/awards/textures/awards_template.png b/mods/awards/textures/awards_template.png new file mode 100644 index 0000000..4ea47d1 Binary files /dev/null and b/mods/awards/textures/awards_template.png differ diff --git a/mods/awards/textures/awards_treasurer.png b/mods/awards/textures/awards_treasurer.png new file mode 100644 index 0000000..b872604 Binary files /dev/null and b/mods/awards/textures/awards_treasurer.png differ diff --git a/mods/awards/textures/awards_ui_icon.png b/mods/awards/textures/awards_ui_icon.png new file mode 100644 index 0000000..239ad71 Binary files /dev/null and b/mods/awards/textures/awards_ui_icon.png differ diff --git a/mods/awards/textures/awards_underground_mushroom_farmer.png b/mods/awards/textures/awards_underground_mushroom_farmer.png new file mode 100644 index 0000000..5623171 Binary files /dev/null and b/mods/awards/textures/awards_underground_mushroom_farmer.png differ diff --git a/mods/awards/textures/awards_unknown.png b/mods/awards/textures/awards_unknown.png new file mode 100644 index 0000000..40d839c Binary files /dev/null and b/mods/awards/textures/awards_unknown.png differ diff --git a/mods/awards/textures/awards_very_simple_snow_man.png b/mods/awards/textures/awards_very_simple_snow_man.png new file mode 100644 index 0000000..b2da7b7 Binary files /dev/null and b/mods/awards/textures/awards_very_simple_snow_man.png differ diff --git a/mods/awards/textures/awards_watchtower.png b/mods/awards/textures/awards_watchtower.png new file mode 100644 index 0000000..22fabd5 Binary files /dev/null and b/mods/awards/textures/awards_watchtower.png differ diff --git a/mods/awards/textures/awards_well_lit.png b/mods/awards/textures/awards_well_lit.png new file mode 100644 index 0000000..db85e70 Binary files /dev/null and b/mods/awards/textures/awards_well_lit.png differ diff --git a/mods/awards/textures/awards_wheat_magnate.png b/mods/awards/textures/awards_wheat_magnate.png new file mode 100644 index 0000000..835d5fa Binary files /dev/null and b/mods/awards/textures/awards_wheat_magnate.png differ diff --git a/mods/awards/textures/awards_white_color_stock.png b/mods/awards/textures/awards_white_color_stock.png new file mode 100644 index 0000000..4f850f0 Binary files /dev/null and b/mods/awards/textures/awards_white_color_stock.png differ diff --git a/mods/awards/textures/awards_wool_over_your_eyes.png b/mods/awards/textures/awards_wool_over_your_eyes.png new file mode 100644 index 0000000..740c5f0 Binary files /dev/null and b/mods/awards/textures/awards_wool_over_your_eyes.png differ diff --git a/mods/awards/textures/awards_wow_i_am_diamonds.png b/mods/awards/textures/awards_wow_i_am_diamonds.png new file mode 100644 index 0000000..5bb71b9 Binary files /dev/null and b/mods/awards/textures/awards_wow_i_am_diamonds.png differ diff --git a/mods/awards/textures/awards_youre_a_copper.png b/mods/awards/textures/awards_youre_a_copper.png new file mode 100644 index 0000000..4d28811 Binary files /dev/null and b/mods/awards/textures/awards_youre_a_copper.png differ diff --git a/mods/awards/textures/awards_yummy.png b/mods/awards/textures/awards_yummy.png new file mode 100644 index 0000000..da230e8 Binary files /dev/null and b/mods/awards/textures/awards_yummy.png differ diff --git a/mods/awards/textures/mese.png b/mods/awards/textures/mese.png deleted file mode 100644 index 3fc800e..0000000 Binary files a/mods/awards/textures/mese.png and /dev/null differ diff --git a/mods/awards/textures/miniminer.png b/mods/awards/textures/miniminer.png deleted file mode 100644 index 45c7238..0000000 Binary files a/mods/awards/textures/miniminer.png and /dev/null differ diff --git a/mods/awards/textures/novicebuilder.png b/mods/awards/textures/novicebuilder.png deleted file mode 100644 index f24d843..0000000 Binary files a/mods/awards/textures/novicebuilder.png and /dev/null differ diff --git a/mods/awards/textures/template.png b/mods/awards/textures/template.png deleted file mode 100644 index b290454..0000000 Binary files a/mods/awards/textures/template.png and /dev/null differ diff --git a/mods/awards/textures/unknown.png b/mods/awards/textures/unknown.png deleted file mode 100644 index b290454..0000000 Binary files a/mods/awards/textures/unknown.png and /dev/null differ diff --git a/mods/awards/tools/updatepo.sh b/mods/awards/tools/updatepo.sh new file mode 100644 index 0000000..74332e0 --- /dev/null +++ b/mods/awards/tools/updatepo.sh @@ -0,0 +1,22 @@ +#! /bin/bash + +# To create a new translation: +# msginit --locale=ll_CC -o locale/ll_CC.po -i locale/template.pot + +cd "$(dirname "${BASH_SOURCE[0]}")/.."; + +# Extract translatable strings. +xgettext --from-code=UTF-8 \ + --keyword=S \ + --keyword=NS:1,2 \ + --keyword=N_ \ + --add-comments='Translators:' \ + --add-location=file \ + -o locale/template.pot \ + $(find . -name '*.lua') + +# Update translations. +find locale -name '*.po' | while read -r file; do + echo $file + msgmerge --update $file locale/template.pot; +done diff --git a/mods/awards/triggers.lua b/mods/awards/triggers.lua deleted file mode 100644 index 213d5c1..0000000 --- a/mods/awards/triggers.lua +++ /dev/null @@ -1,229 +0,0 @@ --- AWARDS --- by Rubenwardy -------------------------------------------------------- --- this is the trigger handler file for the awards mod -------------------------------------------------------- - --- Function and table holders for Triggers -awards.onDig = {} -awards.onPlace = {} -awards.onChat = {} -awards.onDeath = {} -awards.onJoin = {} - --- Trigger Handles -minetest.register_on_dignode(function(pos, oldnode, digger) - if not digger or not pos or not oldnode then - return - end - local nodedug = string.split(oldnode.name, ":") - if #nodedug ~= 2 then - --minetest.log("error","Awards mod: "..oldnode.name.." is in wrong format!") - return - end - local mod = nodedug[1] - local item = nodedug[2] - local playern = digger:get_player_name() - - if (not playern or not nodedug or not mod or not item) then - return - end - awards.assertPlayer(playern) - awards.tbv(awards.players[playern].count, mod) - awards.tbv(awards.players[playern].count[mod], item, 0) - - -- Increment counter - awards.players[playern].count[mod][item]=awards.players[playern].count[mod][item] + 1 - - -- Run callbacks and triggers - local player=digger - local data=awards.players[playern] - for i=1,# awards.onDig do - local res = nil - if type(awards.onDig[i]) == "function" then - -- Run trigger callback - res = awards.onDig[i](player,data) - elseif type(awards.onDig[i]) == "table" then - -- Handle table trigger - if not awards.onDig[i].node or not awards.onDig[i].target or not awards.onDig[i].award then - -- table running failed! - print("[ERROR] awards - onDig trigger "..i.." is invalid!") - else - -- run the table - local tnodedug = string.split(awards.onDig[i].node, ":") - local tmod=tnodedug[1] - local titem=tnodedug[2] - if tmod==nil or titem==nil or not data.count[tmod] or not data.count[tmod][titem] then - -- table running failed! - elseif data.count[tmod][titem] > awards.onDig[i].target-1 then - res=awards.onDig[i].award - end - end - end - - if res then - awards.give_achievement(playern,res) - end - end -end) - -minetest.register_on_placenode(function(pos,node,digger) - if not digger or not pos or not node or not digger:get_player_name() or digger:get_player_name()=="" then - return - end - local nodedug = string.split(node.name, ":") - if #nodedug ~= 2 then - --minetest.log("error","Awards mod: "..node.name.." is in wrong format!") - return - end - local mod=nodedug[1] - local item=nodedug[2] - local playern = digger:get_player_name() - - -- Run checks - if (not playern or not nodedug or not mod or not item) then - return - end - awards.assertPlayer(playern) - awards.tbv(awards.players[playern].place, mod) - awards.tbv(awards.players[playern].place[mod], item, 0) - - -- Increment counter - awards.players[playern].place[mod][item] = awards.players[playern].place[mod][item] + 1 - - -- Run callbacks and triggers - local player = digger - local data = awards.players[playern] - for i=1,# awards.onPlace do - local res = nil - if type(awards.onPlace[i]) == "function" then - -- Run trigger callback - res = awards.onPlace[i](player,data) - elseif type(awards.onPlace[i]) == "table" then - -- Handle table trigger - if not awards.onPlace[i].node or not awards.onPlace[i].target or not awards.onPlace[i].award then - print("[ERROR] awards - onPlace trigger "..i.." is invalid!") - else - -- run the table - local tnodedug = string.split(awards.onPlace[i].node, ":") - local tmod = tnodedug[1] - local titem = tnodedug[2] - if tmod==nil or titem==nil or not data.place[tmod] or not data.place[tmod][titem] then - -- table running failed! - elseif data.place[tmod][titem] > awards.onPlace[i].target-1 then - res = awards.onPlace[i].award - end - end - end - - if res then - awards.give_achievement(playern,res) - end - end -end) - -minetest.register_on_dieplayer(function(player) - -- Run checks - local name = player:get_player_name() - if not player or not name or name=="" then - return - end - - -- Get player - awards.assertPlayer(name) - local data = awards.players[name] - - -- Increment counter - data.deaths = data.deaths + 1 - - -- Run callbacks and triggers - for _,trigger in pairs(awards.onDeath) do - local res = nil - if type(trigger) == "function" then - res = trigger(player,data) - elseif type(trigger) == "table" then - if trigger.target and trigger.award then - if data.deaths and data.deaths >= trigger.target then - res = trigger.award - end - end - end - if res ~= nil then - awards.give_achievement(name,res) - end - end -end) - -minetest.register_on_joinplayer(function(player) - -- Run checks - local name = player:get_player_name() - if not player or not name or name=="" then - return - end - - -- Get player - awards.assertPlayer(name) - local data = awards.players[name] - - -- Increment counter - data.joins = data.joins + 1 - - -- Run callbacks and triggers - for _,trigger in pairs(awards.onJoin) do - local res = nil - if type(trigger) == "function" then - res = trigger(player,data) - elseif type(trigger) == "table" then - if trigger.target and trigger.award then - if data.joins and data.joins >= trigger.target then - res = trigger.award - end - end - end - if res ~= nil then - awards.give_achievement(name,res) - end - end -end) - -minetest.register_on_chat_message(function(name, message) - -- Run checks - local idx = string.find(message,"/") - if not name or (idx ~= nil and idx <= 1) then - return - end - - -- Get player - awards.assertPlayer(name) - local data = awards.players[name] - local player = minetest.get_player_by_name(name) - - -- Increment counter - data.chats = data.chats + 1 - - -- Run callbacks and triggers - for _,trigger in pairs(awards.onChat) do - local res = nil - if type(trigger) == "function" then - res = trigger(player,data) - elseif type(trigger) == "table" then - if trigger.target and trigger.award then - if data.chats and data.chats >= trigger.target then - res = trigger.award - end - end - end - if res ~= nil then - awards.give_achievement(name,res) - end - end -end) - -minetest.register_on_newplayer(function(player) - local playern = player:get_player_name() - awards.assertPlayer(playern) -end) - -minetest.register_on_shutdown(function() - awards.save() -end) diff --git a/mods/ban_hammer/init.lua b/mods/ban_hammer/init.lua index 562a96c..2ef8620 100644 --- a/mods/ban_hammer/init.lua +++ b/mods/ban_hammer/init.lua @@ -14,25 +14,9 @@ local mode_text = { {"remove noclip privilege of punched player"}, } -local function ban_hammer_setmode(user, itemstack, mode, keys) - local puncher = user:get_player_name() - if keys["sneak"] == false and mode == 0 then - return - end - if keys["sneak"] == true then - mode = mode + 1 - if mode == 6 then - mode = 1 - end - end - itemstack:set_name("ban_hammer:hammer"..mode) - itemstack:set_metadata(mode) - return itemstack, mode -end local function ban_hammer_handler(itemstack, user, pointed_thing, mode) local keys = user:get_player_control() - ban_hammer_setmode(user, itemstack, mode, keys) if pointed_thing.type ~= "object" then return end @@ -86,22 +70,6 @@ local function ban_hammer_handler(itemstack, user, pointed_thing, mode) end return itemstack end - -minetest.register_craftitem("ban_hammer:hammer", { - description = "Admin tool 1: Ban Hammer", - inventory_image = "ban_hammer.png", - groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local mode = 0 - ban_hammer_handler(itemstack, user, pointed_thing, mode) - return itemstack - end, - on_use = function(itemstack, user, pointed_thing) - local mode = 0 - ban_hammer_handler(itemstack, user, pointed_thing, mode) - return itemstack - end, -}) for i = 2, 5 do minetest.register_craftitem("ban_hammer:hammer"..i, { @@ -110,7 +78,7 @@ for i = 2, 5 do wield_image = "ban_hammer.png", groups = {not_in_creative_inventory=1}, stack_max = 1, - on_secondary_use = function(itemstack, user, pointed_thing) + on_use = function(itemstack, user, pointed_thing) local mode = i ban_hammer_handler(itemstack, user, pointed_thing, mode) return itemstack @@ -123,7 +91,7 @@ minetest.register_craftitem("ban_hammer:hammer1", { inventory_image = "ban_hammer.png^technic_tool_mode1.png", wield_image = "ban_hammer.png", stack_max = 1, - on_secondary_use = function(itemstack, user, pointed_thing) + on_use = function(itemstack, user, pointed_thing) ban_hammer_handler(itemstack, user, pointed_thing, 1) return itemstack end, diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 1358c70..a297451 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1450,7 +1450,7 @@ minetest.register_node("default:junglegrass", { sunlight_propagates = true, walkable = false, buildable_to = true, - groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1}, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, junglegrass = 1, flammable = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", @@ -1471,7 +1471,8 @@ minetest.register_node("default:grass_1", { sunlight_propagates = true, walkable = false, buildable_to = true, - groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, flammable = 1}, + groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, + normal_grass = 1, flammable = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", @@ -1501,7 +1502,8 @@ for i = 2, 5 do buildable_to = true, drop = "default:grass_1", groups = {snappy = 3, flora = 1, attached_node = 1, - not_in_creative_inventory = 1, grass = 1, flammable = 1}, + not_in_creative_inventory = 1, grass = 1, + normal_grass = 1, flammable = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", @@ -1523,7 +1525,7 @@ minetest.register_node("default:dry_grass_1", { walkable = false, buildable_to = true, groups = {snappy = 3, flammable = 3, flora = 1, - attached_node = 1, dry_grass = 1}, + attached_node = 1, grass = 1, dry_grass = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", @@ -1552,7 +1554,7 @@ for i = 2, 5 do walkable = false, buildable_to = true, groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, - not_in_creative_inventory=1, dry_grass = 1}, + not_in_creative_inventory = 1, grass = 1, dry_grass = 1}, drop = "default:dry_grass_1", sounds = default.node_sound_leaves_defaults(), selection_box = { @@ -1574,7 +1576,8 @@ minetest.register_node("default:fern_1", { sunlight_propagates = true, walkable = false, buildable_to = true, - groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1}, + groups = {snappy = 3, flammable = 3, flora = 1, grass = 1, + fern = 1, attached_node = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", @@ -1604,7 +1607,7 @@ for i = 2, 3 do walkable = false, buildable_to = true, groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, - not_in_creative_inventory=1}, + grass = 1, fern = 1, not_in_creative_inventory = 1}, drop = "default:fern_1", sounds = default.node_sound_leaves_defaults(), selection_box = { @@ -1626,7 +1629,8 @@ minetest.register_node("default:marram_grass_1", { sunlight_propagates = true, walkable = false, buildable_to = true, - groups = {snappy = 3, flammable = 3, attached_node = 1}, + groups = {snappy = 3, flammable = 3, flora = 1, grass = 1, marram_grass = 1, + attached_node = 1}, sounds = default.node_sound_leaves_defaults(), selection_box = { type = "fixed", @@ -1654,8 +1658,8 @@ for i = 2, 3 do sunlight_propagates = true, walkable = false, buildable_to = true, - groups = {snappy = 3, flammable = 3, attached_node = 1, - not_in_creative_inventory=1}, + groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1, + grass = 1, marram_grass = 1, not_in_creative_inventory = 1}, drop = "default:marram_grass_1", sounds = default.node_sound_leaves_defaults(), selection_box = { @@ -1961,6 +1965,7 @@ minetest.register_node("default:sand_with_kelp", { tiles = {"default_sand.png"}, special_tiles = {{name = "default_kelp.png", tileable_vertical = true}}, inventory_image = "default_kelp.png", + wield_image = "default_kelp.png", paramtype = "light", paramtype2 = "leveled", groups = {snappy = 3}, @@ -2077,6 +2082,7 @@ minetest.register_node("default:coral_green", { tiles = {"default_coral_skeleton.png"}, special_tiles = {{name = "default_coral_green.png", tileable_vertical = true}}, inventory_image = "default_coral_green.png", + wield_image = "default_coral_green.png", groups = {snappy = 3}, selection_box = { type = "fixed", @@ -2107,6 +2113,7 @@ minetest.register_node("default:coral_pink", { tiles = {"default_coral_skeleton.png"}, special_tiles = {{name = "default_coral_pink.png", tileable_vertical = true}}, inventory_image = "default_coral_pink.png", + wield_image = "default_coral_pink.png", groups = {snappy = 3}, selection_box = { type = "fixed", @@ -2137,6 +2144,7 @@ minetest.register_node("default:coral_cyan", { tiles = {"default_coral_skeleton.png"}, special_tiles = {{name = "default_coral_cyan.png", tileable_vertical = true}}, inventory_image = "default_coral_cyan.png", + wield_image = "default_coral_cyan.png", groups = {snappy = 3}, selection_box = { type = "fixed", diff --git a/mods/gems/init.lua b/mods/gems/init.lua index b657dd1..bc2d55d 100644 --- a/mods/gems/init.lua +++ b/mods/gems/init.lua @@ -1,7 +1,7 @@ minetest.register_node("gems:ruby_ore", { description = "ruby ore", light_source = 8, - tiles = {"ruby_ruby_ore.png"}, + tiles = {"default_stone.png^ruby_ruby_ore.png"}, is_ground_content = true, groups = {cracky=6}, sounds = default.node_sound_defaults(), @@ -11,7 +11,7 @@ minetest.register_node("gems:ruby_ore", { minetest.register_node("gems:emerald_ore", { description = "emerald ore", light_source = 8, - tiles = {"gems_emerald_ore.png"}, + tiles = {"default_stone.png^gems_emerald_ore.png"}, is_ground_content = true, groups = {cracky=9}, sounds = default.node_sound_defaults(), @@ -21,7 +21,7 @@ minetest.register_node("gems:emerald_ore", { minetest.register_node("gems:sapphire_ore", { description = "sapphire ore", light_source = 8, - tiles = {"gems_sapphire_ore.png"}, + tiles = {"default_stone.png^gems_sapphire_ore.png"}, is_ground_content = true, groups = {cracky=6}, sounds = default.node_sound_defaults(), @@ -31,7 +31,7 @@ minetest.register_node("gems:sapphire_ore", { minetest.register_node("gems:amethyst_ore", { description = "amethyst ore", light_source = 8, - tiles = {"gems_amethyst_ore.png"}, + tiles = {"default_stone.png^gems_amethyst_ore.png"}, is_ground_content = true, groups = {cracky=7} , sounds = default.node_sound_defaults(), @@ -41,7 +41,7 @@ minetest.register_node("gems:amethyst_ore", { minetest.register_node("gems:shadow_ore", { description = "shadow ore", light_source = 8, - tiles = {"shadow_ore.png"}, + tiles = {"default_stone.png^shadow_ore.png"}, is_ground_content = true, groups = {cracky=8}, sounds = default.node_sound_defaults(), @@ -51,7 +51,7 @@ minetest.register_node("gems:shadow_ore", { minetest.register_node("gems:pearl_ore", { description = "pearl ore", light_source = 8, - tiles = {"gems_pearl_ore.png"}, + tiles = {"default_stone.png^gems_pearl_ore.png"}, is_ground_content = true, groups = {cracky=8}, sounds = default.node_sound_defaults(), diff --git a/mods/gems/init.lua~ b/mods/gems/init.lua~ deleted file mode 100644 index 3c35578..0000000 --- a/mods/gems/init.lua~ +++ /dev/null @@ -1,875 +0,0 @@ -minetest.register_tool("gems:pick_ruby", { - description = "ruby pickaxe", - inventory_image = "ruby_ruby_pick.png", - tool_capabilities = { - full_punch_interval = 0, - max_drop_level=3, - groupcaps={ - cracky={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=1000, maxlevel=3}, - } - }, -}) - -minetest.register_tool("gems:pick_shadow", { - description = "shadow pickaxe", - inventory_image = "shadow_pick.png", - tool_capabilities = { - full_punch_interval = 0, - max_drop_level=3, - groupcaps={ - - cracky={times={[1]=1.2, [2]=0.6, [3]=0.3}, uses=100000, maxlevel=3}, - } - }, -}) - -minetest.register_tool("gems:pick_emerald", { - description = "emerald pickaxe", - inventory_image = "gems_emerald_pick.png", - tool_capabilities = { - full_punch_interval = 0, - max_drop_level=3, - groupcaps={ - cracky={times={[1]=0.8, [2]=0.4, [3]=0.2}, uses=1000000, maxlevel=3}, - } - }, -}) - -minetest.register_tool("gems:pick_sapphire", { - description = "sapphire pickaxe", - inventory_image = "gems_sapphire_pick.png", - tool_capabilities = { - full_punch_interval = 0, - max_drop_level=3, - groupcaps={ - cracky={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=1000, maxlevel=3}, - } - }, -}) - -minetest.register_tool("gems:pick_amethyst", { - description = "amethyst pickaxe", - inventory_image = "gems_amethyst_pick.png", - tool_capabilities = { - full_punch_interval = 0, - max_drop_level=3, - groupcaps={ - cracky={times={[1]=1.6, [2]=0.8, [3]=0.4}, uses=10000, maxlevel=3}, - } - }, -}) - -minetest.register_tool("gems:pick_pearl", { - description = "pearl pickaxe", - inventory_image = "gems_pearl_pick.png", - tool_capabilities = { - full_punch_interval = 0, - max_drop_level=3, - groupcaps={ - cracky={times={[1]=1.2, [2]=0.6, [3]=0.3}, uses=100000, maxlevel=3}, - } - }, -}) - - -minetest.register_tool("gems:sword_ruby", { - description = "ruby sword", - inventory_image = "ruby_ruby_sword.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - - snappy={times={[2]=1.00, [3]=0.50}, uses=1000, maxlevel=3}, - - } - }, -}) - -minetest.register_tool("gems:sword_shadow", { - description = "shadow sword", - inventory_image = "shadow_sword.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - - snappy={times={[2]=0.60, [3]=0.30}, uses=100000, maxlevel=3}, - } - }, -}) - -minetest.register_tool("gems:sword_emerald", { - description = "emerald sword", - inventory_image = "gems_emerald_sword.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - - snappy={times={[2]=0.40, [3]=0.20}, uses=1000000, maxlevel=3}, - } - }, -}) - -minetest.register_tool("gems:sword_sapphire", { - description = "sapphire sword", - inventory_image = "gems_sapphire_sword.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - - snappy={times={[2]=1.00, [3]=0.50}, uses=1000, maxlevel=3}, - } - } -}) - -minetest.register_tool("gems:sword_amethyst", { - description = "amethyst sword", - inventory_image = "gems_amethyst_sword.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - - snappy={times={[2]=0.80, [3]=0.40}, uses=10000, maxlevel=3}, - } - } -}) - -minetest.register_tool("gems:sword_pearl", { - description = "pearl sword", - inventory_image = "gems_pearl_sword.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - - snappy={times={[2]=0.60, [3]=0.30}, uses=100000, maxlevel=3}, - } - } -}) - -minetest.register_tool("gems:axe_emerald", { - descroption = "emerald axe", - inventory_image = "gems_emerald_axe.png", - tool_capabilities = { - max_drop_level=1, - groupcaps={ - choppy={times={[1]=0.8, [2]=0.4, [3]=0.2}, uses=1000000, maxlevel=3}, - } - }, -}) - -minetest.register_tool("gems:axe_shadow", { - descroption = "shadow axe", - inventory_image = "shadow_axe.png", - tool_capabilities = { - max_drop_level=1, - groupcaps={ - - choppy={times={[1]=1.2, [2]=0.6, [3]=0.3}, uses=100000, maxlevel=3}, - } - }, -}) - -minetest.register_tool("gems:axe_ruby", { - descroption = "ruby axe", - inventory_image = "ruby_ruby_axe.png", - tool_capabilities = { - max_drop_level=1, - groupcaps={ - choppy={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=1000, maxlevel=3}, - } - }, -}) - -minetest.register_tool("gems:axe_sapphire", { - descroption = "sapphire axe", - inventory_image = "gems_sapphire_axe.png", - tool_capabilities = { - max_drop_level=1, - groupcaps={ - choppy={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=1000, maxlevel=3}, - } - }, -}) - -minetest.register_tool("gems:axe_amethyst", { - descroption = "amethyst axe", - inventory_image = "gems_amethyst_axe.png", - tool_capabilities = { - max_drop_level=1, - groupcaps={ - choppy={times={[1]=1.6, [2]=0.8, [3]=0.4}, uses=10000, maxlevel=3}, - } - }, -}) - -minetest.register_tool("gems:axe_pearl", { - descroption = "pearl axe", - inventory_image = "gems_pearl_axe.png", - tool_capabilities = { - max_drop_level=1, - groupcaps={ - choppy={times={[1]=1.2, [2]=0.6, [3]=0.3}, uses=100000, maxlevel=3}, - } - }, -}) - -minetest.register_tool("gems:shovel_ruby", { - description = "ruby shovel", - inventory_image = "ruby_ruby_shovel.png", - wield_image = "ruby_ruby_shovel.png", - tool_capabilities = { - max_drop_level=1, - groupcaps={ - crumbly={times={[1]=2.00, [2]=1.00, [3]=0.50}, uses=1000, maxlevel=3} - } - }, -}) - -minetest.register_tool("gems:shovel_shadow", { - description = "shadow shovel", - inventory_image = "shadow_shovel.png", - wield_image = "shadow_shovel.png", - tool_capabilities = { - max_drop_level=1, - groupcaps={ - crumbly={times={[1]=1.2, [2]=0.6, [3]=0.3}, uses=100000, maxlevel=3} - } - } -}) - - -minetest.register_tool("gems:shovel_emerald", { - description = "emerald shovel", - inventory_image = "gems_emerald_shovel.png", - wield_image = "gems_emerald_shovel.png", - tool_capabilities = { - max_drop_level=1, - groupcaps={ - crumbly={times={[1]=0.80, [2]=0.40, [3]=0.20}, uses=1000000, maxlevel=3} - } - }, -}) - -minetest.register_tool("gems:shovel_sapphire", { - description = "sapphire shovel", - inventory_image = "gems_sapphire_shovel.png", - wield_image = "gems_sapphire_shovel.png", - tool_capabilities = { - max_drop_level=1, - groupcaps={ - crumbly={times={[1]=2.00, [2]=1.00, [3]=0.50}, uses=1000, maxlevel=3} - } - }, -}) - -minetest.register_tool("gems:shovel_amethyst", { - description = "amethyst shovel", - inventory_image = "gems_amethyst_shovel.png", - wield_image = "gems_amethyst_shovel.png", - tool_capabilities = { - max_drop_level=1, - groupcaps={ - crumbly={times={[1]=1.60, [2]=0.80, [3]=0.40}, uses=10000, maxlevel=3} - } - }, -}) - -minetest.register_tool("gems:shovel_pearl", { - description = "pearl shovel", - inventory_image = "gems_pearl_shovel.png", - wield_image = "gems_pearl_shovel.png", - tool_capabilities = { - max_drop_level=1, - groupcaps={ - crumbly={times={[1]=1.20, [2]=0.60, [3]=0.30}, uses=100000, maxlevel=3} - } - }, -}) - -minetest.register_node("gems:ruby_ore", { - description = "ruby ore", - tiles = {"ruby_ruby_ore.png"}, - is_ground_content = true, - groups = {cracky=6}, - sounds = default.node_sound_defaults(), - drop = 'craft "gems:ruby_gem" 1', -}) - -minetest.register_node("gems:emerald_ore", { - description = "emerald ore", - tiles = {"gems_emerald_ore.png"}, - is_ground_content = true, - groups = {cracky=9}, - sounds = default.node_sound_defaults(), - drop = 'craft "gems:emerald_gem" 1', -}) - -minetest.register_node("gems:sapphire_ore", { - description = "sapphire ore", - tiles = {"gems_sapphire_ore.png"}, - is_ground_content = true, - groups = {cracky=6}, - sounds = default.node_sound_defaults(), - drop = 'craft "gems:sapphire_gem" 1', -}) - -minetest.register_node("gems:amethyst_ore", { - description = "amethyst ore", - tiles = {"gems_amethyst_ore.png"}, - is_ground_content = true, - groups = {cracky=7} , - sounds = default.node_sound_defaults(), - drop = 'craft "gems:amethyst_gem" 1', -}) - -minetest.register_node("gems:shadow_ore", { - description = "shadow ore", - tiles = {"shadow_ore.png"}, - is_ground_content = true, - groups = {cracky=8}, - sounds = default.node_sound_defaults(), - drop = 'craft "gems:shadow_gem" 1', -}) - -minetest.register_node("gems:pearl_ore", { - description = "pearl ore", - tiles = {"gems_pearl_ore.png"}, - is_ground_content = true, - groups = {cracky=8}, - sounds = default.node_sound_defaults(), - drop = 'craft "gems:pearl_gem" 1', -}) - -minetest.register_node( "gems:ruby_block", { - description = "ruby block", - tile_images = { "ruby_ruby_block.png" }, - is_ground_content = true, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node( "gems:emerald_block", { - description = "emerald block", - tile_images = { "gems_emerald_block.png" }, - is_ground_content = true, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node( "gems:sapphire_block", { - description = "sapphire block", - tile_images = { "gems_sapphire_block.png" }, - is_ground_content = true, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node( "gems:shadow_block", { - description = "shadow block", - tile_images = { "shadow_block.png" }, - is_ground_content = true, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node( "gems:pearl_block", { - description = "pearl block", - tile_images = { "gems_pearl_block.png" }, - is_ground_content = true, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node( "gems:amethyst_block", { - description = "amethyst block", - tile_images = { "gems_amethyst_block.png" }, - is_ground_content = true, - groups = {cracky=3}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_craftitem( "gems:ruby_gem", { - description = "ruby gem", - tile_images = { "ruby:ruby_gem" }, - inventory_image = "ruby_ruby_gem.png", - on_place_on_ground = minetest.craftitem_place_item, -}) - -minetest.register_craftitem( "gems:emerald_gem", { - description = "emerald gem", - tile_images = { "gems:emerald_gem" }, - inventory_image = "gems_emerald_gem.png", - on_place_on_ground = minetest.craftitem_place_item, -}) - -minetest.register_craftitem( "gems:shadow_gem", { - description = "shadow gem", - tile_images = { "gems:shadow_gem" }, - inventory_image = "shadow_gem.png", - on_place_on_ground = minetest.craftitem_place_item, -}) - -minetest.register_craftitem( "gems:sapphire_gem", { - description = "sapphire gem", - tile_images = { "gems:sapphire_gem" }, - inventory_image = "gems_sapphire_gem.png", - on_place_on_ground = minetest.craftitem_place_item, -}) - -minetest.register_craftitem( "gems:amethyst_gem", { - description = "amethyst gem", - tile_images = { "gems:amethyst_gem" }, - inventory_image = "gems_amethyst_gem.png", - on_place_on_ground = minetest.craftitem_place_item, -}) - -minetest.register_craftitem( "gems:pearl_gem", { - description = "pearl gem", - tile_images = { "gems:pearl_gem" }, - inventory_image = "gems_pearl_gem.png", - on_place_on_ground = minetest.craftitem_place_item, -}) - -minetest.register_craft({ - output = 'gems:pick_emerald', - recipe = { - {'gems:emerald_gem', 'gems:emerald_gem', 'gems:emerald_gem'}, - {'', 'default:stick', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:pick_ruby', - recipe = { - {'gems:ruby_gem', 'gems:ruby_gem', 'gems:ruby_gem'}, - {'', 'default:stick', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:pick_sapphire', - recipe = { - {'gems:sapphire_gem', 'gems:sapphire_gem', 'gems:sapphire_gem'}, - {'', 'default:stick', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:pick_amethyst', - recipe = { - {'gems:amethyst_gem', 'gems:amethyst_gem', 'gems:amethyst_gem'}, - {'', 'default:stick', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:pick_shadow', - recipe = { - {'gems:shadow_gem', 'gems:shadow_gem', 'gems:shadow_gem'}, - {'', 'default:stick', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:pick_pearl', - recipe = { - {'gems:pearl_gem', 'gems:pearl_gem', 'gems:pearl_gem'}, - {'', 'default:stick', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:ruby_block', - recipe = { - {'gems:ruby_gem','gems:ruby_gem','gems:ruby_gem',}, - {'gems:ruby_gem','gems:ruby_gem','gems:ruby_gem',}, - {'gems:ruby_gem','gems:ruby_gem','gems:ruby_gem',}, - } -}) - -minetest.register_craft({ - output = 'gems:shadow_block', - recipe = { - {'gems:shadow_gem','gems:shadow_gem','gems:shadow_gem',}, - {'gems:shadow_gem','gems:shadow_gem','gems:shadow_gem',}, - {'gems:shadow_gem','gems:shadow_gem','gems:shadow_gem',}, - } -}) - -minetest.register_craft({ - output = 'gems:amethyst_block', - recipe = { - {'gems:amethyst_gem','gems:amethyst_gem','gems:amethyst_gem',}, - {'gems:amethyst_gem','gems:amethyst_gem','gems:amethyst_gem',}, - {'gems:amethyst_gem','gems:amethyst_gem','gems:amethyst_gem',}, - } -}) - -minetest.register_craft({ - output = 'gems:emerald_block', - recipe = { - {'gems:emerald_gem', 'gems:emerald_gem', 'gems:emerald_gem'}, - {'gems:emerald_gem', 'gems:emerald_gem', 'gems:emerald_gem'}, - {'gems:emerald_gem', 'gems:emerald_gem', 'gems:emerald_gem'}, - } -}) - -minetest.register_craft({ - output = 'gems:sapphire_block', - recipe = { - {'gems:sapphire_gem', 'gems:sapphire_gem', 'gems:sapphire_gem'}, - {'gems:sapphire_gem', 'gems:sapphire_gem', 'gems:sapphire_gem'}, - {'gems:sapphire_gem', 'gems:sapphire_gem', 'gems:sapphire_gem'}, - } -}) - -minetest.register_craft({ - output = 'gems:pearl_block', - recipe = { - {'gems:pearl_gem', 'gems:pearl_gem', 'gems:pearl_gem'}, - {'gems:pearl_gem', 'gems:pearl_gem', 'gems:pearl_gem'}, - {'gems:pearl_gem', 'gems:pearl_gem', 'gems:pearl_gem'}, - } -}) - -minetest.register_craft({ - output = 'gems:shovel_ruby', - recipe = { - {'', 'gems:ruby_gem', ''}, - {'', 'default:stick', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:shovel_emerald', - recipe = { - {'', 'gems:emerald_gem', ''}, - {'', 'default:stick', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:shovel_sapphire', - recipe = { - {'', 'gems:sapphire_gem', ''}, - {'', 'default:stick', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:shovel_amethyst', - recipe = { - {'', 'gems:amethyst_gem', ''}, - {'', 'default:stick', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:shovel_pearl', - recipe = { - {'', 'gems:pearl_gem', ''}, - {'', 'default:stick', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:shovel_shadow', - recipe = { - {'','gems:shadow_gem', ''}, - {'', 'default:stick', ''}, - {'', 'default:stick', ''}, - - } -}) - - -minetest.register_craft({ - output = 'gems:sword_ruby', - recipe = { - {'', 'gems:ruby_gem', ''}, - {'', 'gems:ruby_gem', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:sword_amethyst', - recipe = { - {'', 'gems:amethyst_gem', ''}, - {'', 'gems:amethyst_gem', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:sword_emerald', - recipe = { - {'', 'gems:emerald_gem', ''}, - {'', 'gems:emerald_gem', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:sword_sapphire', - recipe = { - {'', 'gems:sapphire_gem', ''}, - {'', 'gems:sapphire_gem', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:sword_shadow', - recipe = { - {'gems:shadow_gem', '', ''}, - {'gems:shadow_gem' , '', ''}, - {'default:stick', '', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:sword_pearl', - recipe = { - {'', 'gems:pearl_gem', ''}, - {'', 'gems:pearl_gem', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:axe_ruby', - recipe = { - {'gems:ruby_gem', 'gems:ruby_gem', ''}, - {'gems:ruby_gem', 'default:stick', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:axe_emerald', - recipe = { - {'gems:emerald_gem', 'gems:emerald_gem', ''}, - {'gems:emerald_gem', 'default:stick', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:axe_sapphire', - recipe = { - {'gems:sapphire_gem', 'gems:sapphire_gem', ''}, - {'gems:sapphire_gem', 'default:stick', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:axe_amethyst', - recipe = { - {'gems:amethyst_gem', 'gems:amethyst_gem', ''}, - {'gems:amethyst_gem', 'default:stick', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:axe_pearl', - recipe = { - {'gems:pearl_gem', 'gems:pearl_gem', ''}, - {'gems:pearl_gem', 'default:stick', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:axe_shadow', - recipe = { - {'gems:shadow_gem', 'gems:shadow_gem', ''}, - {'gems:shadow_gem', 'default:stick', ''}, - {'', 'default:stick', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:amethyst_gem 9', - recipe = { - {'', '', ''}, - {'', 'gems:amethyst_block', ''}, - {'', '', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:ruby_gem 9', - recipe = { - {'', '', ''}, - {'', 'gems:ruby_block', ''}, - {'', '', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:emerald_gem 9', - recipe = { - {'', '', ''}, - {'', 'gems:emerald_block', ''}, - {'', '', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:sapphire_gem 9', - recipe = { - {'', '', ''}, - {'', 'gems:sapphire_block', ''}, - {'', '', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:shadow_gem 9', - recipe = { - {'', '', ''}, - {'', 'gems:shadow_block', ''}, - {'', '', ''}, - - } -}) - -minetest.register_craft({ - output = 'gems:pearl_gem 9', - recipe = { - {'', '', ''}, - {'', 'gems:pearl_block', ''}, - {'', '', ''}, - - } -}) - - - - - - - - -minetest.register_ore({ - ore_type = "scatter", - ore = "gems:ruby_ore", - wherein = "default:stone", - clust_scarcity = 10*10*10, - clust_num_ores = 4, - clust_size = 3, - height_min = -31000, - height_max = -1000, - flags = "absheight", -}) - - -minetest.register_ore({ - ore_type = "scatter", - ore = "gems:sapphire_ore", - wherein = "default:stone", - clust_scarcity = 10*10*10, - clust_num_ores = 4, - clust_size = 3, - height_min = -31000, - height_max = -1000, - flags = "absheight", -}) - -minetest.register_ore({ - ore_type = "scatter", - ore = "gems:amethyst_ore", - wherein = "default:stone", - clust_scarcity = 13*13*13, - clust_num_ores = 4, - clust_size = 3, - height_min = -31000, - height_max = -2000, - flags = "absheight", -}) - - -minetest.register_ore({ - ore_type = "scatter", - ore = "gems:shadow_ore", - wherein = "default:stone", - clust_scarcity = 15*15*15, - clust_num_ores = 4, - clust_size = 3, - height_min = -31000, - height_max = -3000, - flags = "absheight", -}) - -minetest.register_ore({ - ore_type = "scatter", - ore = "gems:pearl_ore", - wherein = "default:stone", - clust_scarcity = 15*15*15, - clust_num_ores = 4, - clust_size = 3, - height_min = -31000, - height_max = -3000, - flags = "absheight", -}) - -minetest.register_ore({ - ore_type = "scatter", - ore = "gems:emerald_ore", - wherein = "default:stone", - clust_scarcity = 17*17*17, - clust_num_ores = 4, - clust_size = 3, - height_min = -31000, - height_max = -4000, - flags = "absheight", -}) - - - diff --git a/mods/gems/textures/Thumbs.db b/mods/gems/textures/Thumbs.db deleted file mode 100644 index c839319..0000000 Binary files a/mods/gems/textures/Thumbs.db and /dev/null differ diff --git a/mods/gems/textures/gems_amethyst_axe.png b/mods/gems/textures/gems_amethyst_axe.png deleted file mode 100644 index cc18383..0000000 Binary files a/mods/gems/textures/gems_amethyst_axe.png and /dev/null differ diff --git a/mods/gems/textures/gems_amethyst_ore.png b/mods/gems/textures/gems_amethyst_ore.png index 600d038..6e950db 100644 Binary files a/mods/gems/textures/gems_amethyst_ore.png and b/mods/gems/textures/gems_amethyst_ore.png differ diff --git a/mods/gems/textures/gems_amethyst_pick.png b/mods/gems/textures/gems_amethyst_pick.png deleted file mode 100644 index 0be9115..0000000 Binary files a/mods/gems/textures/gems_amethyst_pick.png and /dev/null differ diff --git a/mods/gems/textures/gems_amethyst_shovel.png b/mods/gems/textures/gems_amethyst_shovel.png deleted file mode 100644 index f509dd0..0000000 Binary files a/mods/gems/textures/gems_amethyst_shovel.png and /dev/null differ diff --git a/mods/gems/textures/gems_amethyst_sword.png b/mods/gems/textures/gems_amethyst_sword.png deleted file mode 100644 index 1db48d8..0000000 Binary files a/mods/gems/textures/gems_amethyst_sword.png and /dev/null differ diff --git a/mods/gems/textures/gems_emerald_axe.png b/mods/gems/textures/gems_emerald_axe.png deleted file mode 100644 index 4ca4851..0000000 Binary files a/mods/gems/textures/gems_emerald_axe.png and /dev/null differ diff --git a/mods/gems/textures/gems_emerald_ore.png b/mods/gems/textures/gems_emerald_ore.png index 65bcaeb..6a27820 100644 Binary files a/mods/gems/textures/gems_emerald_ore.png and b/mods/gems/textures/gems_emerald_ore.png differ diff --git a/mods/gems/textures/gems_emerald_pick.png b/mods/gems/textures/gems_emerald_pick.png deleted file mode 100644 index 8d93009..0000000 Binary files a/mods/gems/textures/gems_emerald_pick.png and /dev/null differ diff --git a/mods/gems/textures/gems_emerald_shovel.png b/mods/gems/textures/gems_emerald_shovel.png deleted file mode 100644 index b2e60ad..0000000 Binary files a/mods/gems/textures/gems_emerald_shovel.png and /dev/null differ diff --git a/mods/gems/textures/gems_emerald_sword.png b/mods/gems/textures/gems_emerald_sword.png deleted file mode 100644 index 6a4b7ae..0000000 Binary files a/mods/gems/textures/gems_emerald_sword.png and /dev/null differ diff --git a/mods/gems/textures/gems_pearl_axe.png b/mods/gems/textures/gems_pearl_axe.png deleted file mode 100644 index 6a22bdc..0000000 Binary files a/mods/gems/textures/gems_pearl_axe.png and /dev/null differ diff --git a/mods/gems/textures/gems_pearl_ore.png b/mods/gems/textures/gems_pearl_ore.png index ff05f4b..ba11c4e 100644 Binary files a/mods/gems/textures/gems_pearl_ore.png and b/mods/gems/textures/gems_pearl_ore.png differ diff --git a/mods/gems/textures/gems_pearl_pick.png b/mods/gems/textures/gems_pearl_pick.png deleted file mode 100644 index f6c7fab..0000000 Binary files a/mods/gems/textures/gems_pearl_pick.png and /dev/null differ diff --git a/mods/gems/textures/gems_pearl_shovel.png b/mods/gems/textures/gems_pearl_shovel.png deleted file mode 100644 index f51071b..0000000 Binary files a/mods/gems/textures/gems_pearl_shovel.png and /dev/null differ diff --git a/mods/gems/textures/gems_pearl_sword.png b/mods/gems/textures/gems_pearl_sword.png deleted file mode 100644 index c040a86..0000000 Binary files a/mods/gems/textures/gems_pearl_sword.png and /dev/null differ diff --git a/mods/gems/textures/gems_sapphire_axe.png b/mods/gems/textures/gems_sapphire_axe.png deleted file mode 100644 index 565f4fc..0000000 Binary files a/mods/gems/textures/gems_sapphire_axe.png and /dev/null differ diff --git a/mods/gems/textures/gems_sapphire_ore.png b/mods/gems/textures/gems_sapphire_ore.png index 11874a9..19ec1cd 100644 Binary files a/mods/gems/textures/gems_sapphire_ore.png and b/mods/gems/textures/gems_sapphire_ore.png differ diff --git a/mods/gems/textures/gems_sapphire_pick.png b/mods/gems/textures/gems_sapphire_pick.png deleted file mode 100644 index f51e1d8..0000000 Binary files a/mods/gems/textures/gems_sapphire_pick.png and /dev/null differ diff --git a/mods/gems/textures/gems_sapphire_shovel.png b/mods/gems/textures/gems_sapphire_shovel.png deleted file mode 100644 index bc58bf7..0000000 Binary files a/mods/gems/textures/gems_sapphire_shovel.png and /dev/null differ diff --git a/mods/gems/textures/gems_sapphire_sword.png b/mods/gems/textures/gems_sapphire_sword.png deleted file mode 100644 index abc86b2..0000000 Binary files a/mods/gems/textures/gems_sapphire_sword.png and /dev/null differ diff --git a/mods/gems/textures/ruby_ruby_axe.png b/mods/gems/textures/ruby_ruby_axe.png deleted file mode 100644 index 7e11d6b..0000000 Binary files a/mods/gems/textures/ruby_ruby_axe.png and /dev/null differ diff --git a/mods/gems/textures/ruby_ruby_ore.png b/mods/gems/textures/ruby_ruby_ore.png index afd0d06..81fe33a 100644 Binary files a/mods/gems/textures/ruby_ruby_ore.png and b/mods/gems/textures/ruby_ruby_ore.png differ diff --git a/mods/gems/textures/ruby_ruby_pick.png b/mods/gems/textures/ruby_ruby_pick.png deleted file mode 100644 index 0b68ef7..0000000 Binary files a/mods/gems/textures/ruby_ruby_pick.png and /dev/null differ diff --git a/mods/gems/textures/ruby_ruby_shovel.png b/mods/gems/textures/ruby_ruby_shovel.png deleted file mode 100644 index d7dd38e..0000000 Binary files a/mods/gems/textures/ruby_ruby_shovel.png and /dev/null differ diff --git a/mods/gems/textures/ruby_ruby_sword.png b/mods/gems/textures/ruby_ruby_sword.png deleted file mode 100644 index 52e5b9c..0000000 Binary files a/mods/gems/textures/ruby_ruby_sword.png and /dev/null differ diff --git a/mods/gems/textures/shadow_axe.png b/mods/gems/textures/shadow_axe.png deleted file mode 100644 index 5746108..0000000 Binary files a/mods/gems/textures/shadow_axe.png and /dev/null differ diff --git a/mods/gems/textures/shadow_ore.png b/mods/gems/textures/shadow_ore.png index 50d5edb..c46d867 100644 Binary files a/mods/gems/textures/shadow_ore.png and b/mods/gems/textures/shadow_ore.png differ diff --git a/mods/gems/textures/shadow_pick.png b/mods/gems/textures/shadow_pick.png deleted file mode 100644 index c30d689..0000000 Binary files a/mods/gems/textures/shadow_pick.png and /dev/null differ diff --git a/mods/gems/textures/shadow_shovel.png b/mods/gems/textures/shadow_shovel.png deleted file mode 100644 index 8dfdbd9..0000000 Binary files a/mods/gems/textures/shadow_shovel.png and /dev/null differ diff --git a/mods/gems/textures/shadow_sword.png b/mods/gems/textures/shadow_sword.png deleted file mode 100644 index 814d7c9..0000000 Binary files a/mods/gems/textures/shadow_sword.png and /dev/null differ diff --git a/mods/mobs/api.lua b/mods/mobs/api.lua index db01953..be326fa 100644 --- a/mods/mobs/api.lua +++ b/mods/mobs/api.lua @@ -1,24 +1,19 @@ - --- Intllib and CMI support check +-- Load support for intllib. local MP = minetest.get_modpath(minetest.get_current_modname()) -local S, NS = dofile(MP .. "/intllib.lua") +local S = minetest.get_translator and minetest.get_translator("mobs_redo") or + dofile(MP .. "/intllib.lua") + +-- CMI support check local use_cmi = minetest.global_exists("cmi") mobs = { mod = "redo", - version = "20200412", + version = "20210418", intllib = S, invis = minetest.global_exists("invisibility") and invisibility or {} } --- creative check -local creative_cache = minetest.settings:get_bool("creative_mode") -function mobs.is_creative(name) - return creative_cache or minetest.check_player_privs(name, {creative = true}) -end - - --- localize math functions +-- localize common functions local pi = math.pi local square = math.sqrt local sin = math.sin @@ -26,9 +21,11 @@ local cos = math.cos local abs = math.abs local min = math.min local max = math.max -local atann = math.atan local random = math.random local floor = math.floor +local ceil = math.ceil +local rad = math.rad +local atann = math.atan local atan = function(x) if not x or x ~= x then --error("atan bassed NaN") @@ -37,22 +34,40 @@ local atan = function(x) return atann(x) end end +local table_copy = table.copy +local table_remove = table.remove +local vadd = vector.add +local vdirection = vector.direction +local vmultiply = vector.multiply +local vsubtract = vector.subtract +local settings = minetest.settings +-- creative check +local creative_cache = minetest.settings:get_bool("creative_mode") +function mobs.is_creative(name) + return creative_cache or minetest.check_player_privs(name, + {creative = true}) +end -- Load settings -local damage_enabled = minetest.settings:get_bool("enable_damage") -local mobs_spawn = minetest.settings:get_bool("mobs_spawn") ~= false -local peaceful_only = minetest.settings:get_bool("only_peaceful_mobs") -local disable_blood = minetest.settings:get_bool("mobs_disable_blood") -local mobs_drop_items = minetest.settings:get_bool("mobs_drop_items") ~= false -local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false -local creative = minetest.settings:get_bool("creative_mode") -local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false -local remove_far = minetest.settings:get_bool("remove_far_mobs") ~= false -local difficulty = tonumber(minetest.settings:get("mob_difficulty")) or 1.0 -local show_health = minetest.settings:get_bool("mob_show_health") ~= false -local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 99) -local mob_chance_multiplier = tonumber(minetest.settings:get("mob_chance_multiplier") or 1) +local damage_enabled = settings:get_bool("enable_damage") +local mobs_spawn = settings:get_bool("mobs_spawn") ~= false +local peaceful_only = settings:get_bool("only_peaceful_mobs") +local disable_blood = settings:get_bool("mobs_disable_blood") +local mobs_drop_items = settings:get_bool("mobs_drop_items") ~= false +local mobs_griefing = settings:get_bool("mobs_griefing") ~= false +local spawn_protected = settings:get_bool("mobs_spawn_protected") ~= false +local remove_far = settings:get_bool("remove_far_mobs") ~= false +local mob_area_spawn = settings:get_bool("mob_area_spawn") +local difficulty = tonumber(settings:get("mob_difficulty")) or 1.0 +local show_health = settings:get_bool("mob_show_health") ~= false +local max_per_block = tonumber(settings:get("max_objects_per_block") or 99) +local mob_nospawn_range = tonumber(settings:get("mob_nospawn_range") or 12) +local active_limit = tonumber(settings:get("mob_active_limit") or 0) +local mob_chance_multiplier = tonumber(settings:get("mob_chance_multiplier") or 1) +local peaceful_player_enabled = settings:get_bool("enable_peaceful_player") +local active_mobs = 0 + -- Peaceful mode message so players will know there are no monsters if peaceful_only then @@ -63,11 +78,11 @@ if peaceful_only then end -- calculate aoc range for mob count -local aoc_range = tonumber(minetest.settings:get("active_block_range")) * 16 +local aoc_range = tonumber(settings:get("active_block_range")) * 16 -- pathfinding settings local enable_pathfinding = true -local stuck_timeout = 3 -- how long before mob gets stuck in place and starts searching +local stuck_timeout = 3 -- how long before stuck mod starts searching local stuck_path_timeout = 10 -- how long will mob follow path before giving up -- default nodes @@ -88,6 +103,7 @@ local mob_class = { physical = true, collisionbox = {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, visual_size = {x = 1, y = 1}, + texture_mods = "", makes_footstep_sound = false, view_range = 5, walk_velocity = 1, @@ -96,7 +112,9 @@ local mob_class = { light_damage_min = 14, light_damage_max = 15, water_damage = 0, - lava_damage = 0, + lava_damage = 4, + fire_damage = 4, + air_damage = 0, suffocation = 2, fall_damage = 1, fall_speed = -10, -- must be lower than -2 (default: -10) @@ -148,15 +166,25 @@ local mob_class = { local mob_class_meta = {__index = mob_class} + -- play sound function mob_class:mob_sound(sound) + local pitch = 1.0 + + -- higher pitch for a child + if self.child then pitch = pitch * 1.5 end + + -- a little random pitch to be different + pitch = pitch + random(-10, 10) * 0.005 + if sound then minetest.sound_play(sound, { object = self.object, gain = 1.0, - max_hear_distance = self.sounds.distance - }) + max_hear_distance = self.sounds.distance, + pitch = pitch + }, true) end end @@ -180,6 +208,8 @@ end -- calculate distance local get_distance = function(a, b) + if not a or not b then return 50 end -- nil check + local x, y, z = a.x - b.x, a.y - b.y, a.z - b.z return square(x * x + y * y + z * z) @@ -190,16 +220,15 @@ end function mob_class:collision() local pos = self.object:get_pos() - local vel = self.object:get_velocity() local x, z = 0, 0 local width = -self.collisionbox[1] + self.collisionbox[4] + 0.5 for _,object in ipairs(minetest.get_objects_inside_radius(pos, width)) do - if object:is_player() - or (object:get_luaentity() - and object:get_luaentity()._cmi_is_mob == true - and object ~= self.object) then + if object:is_player() then +-- or (object:get_luaentity() +-- and object:get_luaentity()._cmi_is_mob == true +-- and object ~= self.object) then local pos2 = object:get_pos() local vec = {x = pos.x - pos2.x, z = pos.z - pos2.z} @@ -213,9 +242,47 @@ function mob_class:collision() end +-- check if string exists in another string or table +local check_for = function(look_for, look_inside) + + if type(look_inside) == "string" and look_inside == look_for then + + return true + + elseif type(look_inside) == "table" then + + for _, str in pairs(look_inside) do + + if str == look_for then + return true + end + + if str:find("group:") then + + local group = str:split(":")[2] + + if minetest.get_item_group(look_for, group) ~= 0 then + return true + end + end + end + end + + return false +end + + -- move mob in facing direction function mob_class:set_velocity(v) + -- halt mob if it has been ordered to stay + if self.order == "stand" then + + self.object:set_velocity({x = 0, y = 0, z = 0}) + + return + end + local c_x, c_y = 0, 0 -- can mob be pushed, if so calculate direction @@ -223,25 +290,30 @@ function mob_class:set_velocity(v) c_x, c_y = unpack(self:collision()) end - -- halt mob if it has been ordered to stay - if self.order == "stand" then - self.object:set_velocity({x = 0, y = 0, z = 0}) - return - end - - local yaw = (self.object:get_yaw() or 0) + self.rotate + local yaw = (self.object:get_yaw() or 0) + (self.rotate or 0) -- nil check for velocity - v = v or 0 + v = v or 0.01 - -- set velocity with hard limit of 10 - local vel = self.object:get_velocity() + -- check if standing in liquid with max viscosity of 7 + local visc = min(minetest.registered_nodes[self.standing_in].liquid_viscosity, 7) - self.object:set_velocity({ - x = max(-10, min((sin(yaw) * -v) + c_x, 10)), - y = max(-10, min((vel and vel.y or 0), 10)), - z = max(-10, min((cos(yaw) * v) + c_y, 10)) - }) + -- only slow mob trying to move while inside a viscous fluid that + -- they aren't meant to be in (fish in water, spiders in cobweb etc) + if v > 0 and visc and visc > 0 + and not check_for(self.standing_in, self.fly_in) then + v = v / (visc + 1) + end + + -- set velocity + local vel = self.object:get_velocity() or 0 + + local new_vel = { + x = (sin(yaw) * -v) + c_x, + y = vel.y, + z = (cos(yaw) * v) + c_y} + + self.object:set_velocity(new_vel) end -- global version of above function @@ -290,8 +362,7 @@ end -- set defined animation function mob_class:set_animation(anim, force) - if not self.animation - or not anim then return end + if not self.animation or not anim then return end self.animation.current = self.animation.current or "" @@ -301,9 +372,9 @@ function mob_class:set_animation(anim, force) return end - -- check for more than one animation local num = 0 + -- check for more than one animation (max 4) for n = 1, 4 do if self.animation[anim .. n .. "_start"] @@ -329,13 +400,14 @@ function mob_class:set_animation(anim, force) self.object:set_animation({ x = self.animation[anim .. "_start"], y = self.animation[anim .. "_end"]}, - self.animation[anim .. "_speed"] or self.animation.speed_normal or 15, + self.animation[anim .. "_speed"] or + self.animation.speed_normal or 15, 0, self.animation[anim .. "_loop"] ~= false) end -- above function exported for mount.lua function mobs:set_animation(entity, anim) - mob_class.set_animation(entity, anim) + entity.set_animation(entity, anim) end @@ -369,10 +441,9 @@ local line_of_sight = function(self, pos1, pos2, stepsize) local ad = 0 -- It continues to advance in the line of sight in search of a real - -- obstruction which counts as 'normal' nodebox. + -- obstruction which counts as 'walkable' nodebox. while minetest.registered_nodes[nn] and (minetest.registered_nodes[nn].walkable == false) do --- or minetest.registered_nodes[nn].drawtype == "nodebox") do -- Check if you can still move forward if td < ad + stepsize then @@ -416,7 +487,7 @@ local new_line_of_sight = function(self, pos1, pos2, stepsize) stepsize = stepsize or 1 - local stepv = vector.multiply(vector.direction(pos1, pos2), stepsize) + local stepv = vmultiply(vdirection(pos1, pos2), stepsize) local s, pos = minetest.line_of_sight(pos1, pos2, stepsize) @@ -435,12 +506,11 @@ local new_line_of_sight = function(self, pos1, pos2, stepsize) local nn = minetest.get_node(pos).name -- It continues to advance in the line of sight in search of a real - -- obstruction which counts as 'normal' nodebox. + -- obstruction which counts as 'walkable' nodebox. while minetest.registered_nodes[nn] and (minetest.registered_nodes[nn].walkable == false) do --- or minetest.registered_nodes[nn].drawtype == "nodebox") do - npos1 = vector.add(npos1, stepv) + npos1 = vadd(npos1, stepv) if get_distance(npos1, pos2) < stepsize then return true end @@ -462,18 +532,16 @@ local ray_line_of_sight = function(self, pos1, pos2) local ray = minetest.raycast(pos1, pos2, true, false) local thing = ray:next() - while thing do - --- if thing.type == "object" --- and thing.ref ~= self.object --- and not thing.ref:is_player() then return false end + while thing do -- thing.type, thing.ref if thing.type == "node" then local name = minetest.get_node(thing.under).name if minetest.registered_items[name] - and minetest.registered_items[name].walkable then return false end + and minetest.registered_items[name].walkable then + return false + end end thing = ray:next() @@ -482,12 +550,10 @@ local ray_line_of_sight = function(self, pos1, pos2) return true end --- detect if using minetest 5.0 by searching for permafrost node -local is_50 = minetest.registered_nodes["default:permafrost"] function mob_class:line_of_sight(pos1, pos2, stepsize) - if is_50 then -- only use if minetest 5.0 is detected + if minetest.raycast then -- only use if minetest 5.0 is detected return ray_line_of_sight(self, pos1, pos2) end @@ -500,13 +566,13 @@ function mobs:line_of_sight(entity, pos1, pos2, stepsize) end -function mob_class:attempt_flight_correction() +function mob_class:attempt_flight_correction(override) - if self:flight_check() then return true end + if self:flight_check() and override ~= true then return true end -- We are not flying in what we are supposed to. -- See if we can find intended flight medium and return to it - local pos = self.object:get_pos() + local pos = self.object:get_pos() ; if not pos then return true end local searchnodes = self.fly_in if type(searchnodes) == "string" then @@ -515,18 +581,18 @@ function mob_class:attempt_flight_correction() local flyable_nodes = minetest.find_nodes_in_area( {x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, - {x = pos.x + 1, y = pos.y + 1, z = pos.z + 1}, - searchnodes) + {x = pos.x + 1, y = pos.y + 0, z = pos.z + 1}, searchnodes) + -- pos.y + 0 hopefully fixes floating swimmers if #flyable_nodes < 1 then return false end - local escape_target = flyable_nodes[math.random(1, #flyable_nodes)] - local escape_direction = vector.direction(pos, escape_target) + local escape_target = flyable_nodes[random(#flyable_nodes)] + local escape_direction = vdirection(pos, escape_target) self.object:set_velocity( - vector.multiply(escape_direction, self.run_velocity)) + vmultiply(escape_direction, 1)) --self.run_velocity)) return true end @@ -539,20 +605,9 @@ function mob_class:flight_check() if not def then return false end - if type(self.fly_in) == "string" - and self.standing_in == self.fly_in then - + -- are we standing inside what we should be to fly/swim ? + if check_for(self.standing_in, self.fly_in) then return true - - elseif type(self.fly_in) == "table" then - - for _,fly_in in pairs(self.fly_in) do - - if self.standing_in == fly_in then - - return true - end - end end -- stops mobs getting stuck inside stairs and plantlike nodes @@ -566,7 +621,30 @@ function mob_class:flight_check() end --- if self.stay_near set then check periodically for nodes and turn to face/move +-- turn mob to face position +local yaw_to_pos = function(self, target, rot) + + rot = rot or 0 + + local pos = self.object:get_pos() + local vec = {x = target.x - pos.x, z = target.z - pos.z} + local yaw = (atan(vec.z / vec.x) + rot + pi / 2) - self.rotate + + if target.x > pos.x then + yaw = yaw + pi + end + + yaw = self:set_yaw(yaw, rot) + + return yaw +end + +function mobs:yaw_to_pos(self, target, rot) + return yaw_to_pos(self, target, rot) +end + + +-- if stay near set then check periodically for nodes and turn towards them function mob_class:do_stay_near() if not self.stay_near then return false end @@ -575,7 +653,7 @@ function mob_class:do_stay_near() local searchnodes = self.stay_near[1] local chance = self.stay_near[2] or 10 - if random(1, chance) > 1 then + if not pos or random(chance) > 1 then return false end @@ -586,24 +664,13 @@ function mob_class:do_stay_near() local r = self.view_range local nearby_nodes = minetest.find_nodes_in_area( {x = pos.x - r, y = pos.y - 1, z = pos.z - r}, - {x = pos.x + r, y = pos.y + 1, z = pos.z + r}, - searchnodes) + {x = pos.x + r, y = pos.y + 1, z = pos.z + r}, searchnodes) if #nearby_nodes < 1 then return false end - local target = nearby_nodes[math.random(1, #nearby_nodes)] - local direction = vector.direction(pos, target) - local vec = {x = target.x - pos.x, z = target.z - pos.z} - - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate - - if target.x > pos.x then - yaw = yaw + pi - end - - yaw = self:set_yaw(yaw, 4) + yaw_to_pos(self, nearby_nodes[random(#nearby_nodes)]) self:set_animation("walk") @@ -614,7 +681,8 @@ end -- custom particle effects -local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow) +local effect = function(pos, amount, texture, min_size, max_size, + radius, gravity, glow, fall) radius = radius or 2 min_size = min_size or 0.5 @@ -622,12 +690,20 @@ local effect = function(pos, amount, texture, min_size, max_size, radius, gravit gravity = gravity or -10 glow = glow or 0 + if fall == true then + fall = 0 + elseif fall == false then + fall = radius + else + fall = -radius + end + minetest.add_particlespawner({ amount = amount, time = 0.25, minpos = pos, maxpos = pos, - minvel = {x = -radius, y = -radius, z = -radius}, + minvel = {x = -radius, y = fall, z = -radius}, maxvel = {x = radius, y = radius, z = radius}, minacc = {x = 0, y = gravity, z = 0}, maxacc = {x = 0, y = gravity, z = 0}, @@ -640,6 +716,12 @@ local effect = function(pos, amount, texture, min_size, max_size, radius, gravit }) end +function mobs:effect(pos, amount, texture, min_size, max_size, + radius, gravity, glow, fall) + + effect(pos, amount, texture, min_size, max_size, radius, gravity, glow, fall) +end + -- update nametag colour function mob_class:update_tag() @@ -669,31 +751,30 @@ end -- drop items function mob_class:item_drop() + -- no drops if disabled by setting or mob is child + if not mobs_drop_items or self.child then return end + local pos = self.object:get_pos() -- check for drops function - self.drops = type(self.drops) == "function" and self.drops(pos) or self.drops + self.drops = type(self.drops) == "function" + and self.drops(pos) or self.drops -- check for nil or no drops if not self.drops or #self.drops == 0 then return end - -- no drops if disabled by setting - if not mobs_drop_items then return end - - -- no drops for child mobs - if self.child then return end - -- was mob killed by player? - local death_by_player = self.cause_of_death and self.cause_of_death.puncher - and self.cause_of_death.puncher:is_player() or nil + local death_by_player = self.cause_of_death + and self.cause_of_death.puncher + and self.cause_of_death.puncher:is_player() local obj, item, num for n = 1, #self.drops do - if random(1, self.drops[n].chance) == 1 then + if random(self.drops[n].chance) == 1 then num = random(self.drops[n].min or 0, self.drops[n].max or 1) item = self.drops[n].name @@ -709,7 +790,7 @@ function mob_class:item_drop() end end - -- only drop rare items (drops.min=0) if killed by player + -- only drop rare items (drops.min = 0) if killed by player if death_by_player then obj = minetest.add_item(pos, ItemStack(item .. " " .. num)) @@ -735,20 +816,53 @@ function mob_class:item_drop() end +-- remove mob and descrease counter +local remove_mob = function(self, decrease) + + self.object:remove() + + if decrease and active_limit > 0 then + + active_mobs = active_mobs - 1 + + if active_mobs < 0 then + active_mobs = 0 + end + end +--print("-- active mobs: " .. active_mobs .. " / " .. active_limit) +end + +-- global function for removing mobs +function mobs:remove(self, decrease) + remove_mob(self, decrease) +end + + -- check if mob is dead or only hurt function mob_class:check_for_death(cmi_cause) + + -- We dead already + if self.state == "die" then + return true + end + -- has health actually changed? if self.health == self.old_health and self.health > 0 then return false end + local damaged = self.health < self.old_health + self.old_health = self.health - + -- still got some health? play hurt sound if self.health > 0 then - - self:mob_sound(self.sounds.damage) + + -- only play hurt sound if damaged + if damaged then + self:mob_sound(self.sounds.damage) + end -- make sure health isn't higher than max if self.health > self.hp_max then @@ -762,10 +876,9 @@ function mob_class:check_for_death(cmi_cause) if show_health and (cmi_cause and cmi_cause.type == "punch") then - + self.htimer = 2 self.nametag = "♥ " .. self.health .. " / " .. self.hp_max - self:update_tag() end @@ -782,94 +895,72 @@ function mob_class:check_for_death(cmi_cause) local pos = self.object:get_pos() -- execute custom death function - if self.on_die then + if pos and self.on_die then self:on_die(pos) if use_cmi then cmi.notify_die(self.object, cmi_cause) end - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.object:remove() - end + + remove_mob(self, true) + return true end - -- default death function and die animation (if defined) + -- check for custom death function and die animation if self.animation and self.animation.die_start and self.animation.die_end then local frames = self.animation.die_end - self.animation.die_start local speed = self.animation.die_speed or 15 - local length = max(frames / speed, 0) + local length = max((frames / speed), 0) + local rot = self.animation.die_rotate and 5 self.attack = nil + self.following = nil self.v_start = false self.timer = 0 self.blinktimer = 0 self.passive = true self.state = "die" + self.object:set_properties({ + pointable = false, collide_with_objects = false, + automatic_rotate = rot, static_save = false + }) self:set_velocity(0) self:set_animation("die") minetest.after(length, function(self) - if use_cmi and self.object:get_luaentity() then - cmi.notify_die(self.object, cmi_cause) - end - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.object:remove() + if self.object:get_luaentity() then + + if use_cmi then + cmi.notify_die(self.object, cmi_cause) + end + + remove_mob(self, true) end end, self) - else + + return true + + elseif pos then -- otherwise remove mod and show particle effect if use_cmi then cmi.notify_die(self.object, cmi_cause) end - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.object:remove() - end - end - effect(pos, 20, "tnt_smoke.png") + remove_mob(self, true) + + effect(pos, 20, "tnt_smoke.png") + end return true end --- is mob facing a cliff -function mob_class:is_at_cliff() - - if self.fear_height == 0 then -- 0 for no falling protection! - return false - end - - -- if object no longer exists then return - if not self.object:get_luaentity() then - return false - end - - local yaw = self.object:get_yaw() - local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) - local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) - local pos = self.object:get_pos() - local ypos = pos.y + self.collisionbox[2] -- just above floor - - if minetest.line_of_sight( - {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, - {x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z}, 1) then - - return true - end - - return false -end - - -- get node but use fallback for nil or unknown local node_ok = function(pos, fallback) @@ -885,6 +976,71 @@ local node_ok = function(pos, fallback) end +-- Returns true is node can deal damage to self +local is_node_dangerous = function(self, nodename) + + if self.water_damage > 0 + and minetest.get_item_group(nodename, "water") ~= 0 then + return true + end + + if self.lava_damage > 0 + and minetest.get_item_group(nodename, "lava") ~= 0 then + return true + end + + if self.fire_damage > 0 + and minetest.get_item_group(nodename, "fire") ~= 0 then + return true + end + + if minetest.registered_nodes[nodename].damage_per_second > 0 then + return true + end + + return false +end + + +-- is mob facing a cliff +function mob_class:is_at_cliff() + + if self.fear_height == 0 then -- 0 for no falling protection! + return false + end + + -- get yaw but if nil returned object no longer exists + local yaw = self.object:get_yaw() + + if not yaw then return false end + + local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) + local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) + local pos = self.object:get_pos() + local ypos = pos.y + self.collisionbox[2] -- just above floor + + local free_fall, blocker = minetest.line_of_sight( + {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, + {x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z}) + + -- check for straight drop + if free_fall then + return true + end + + local bnode = node_ok(blocker) + + -- will we drop onto dangerous node? + if is_node_dangerous(self, bnode.name) then + return true + end + + local def = minetest.registered_nodes[bnode.name] + + return (not def and def.walkable) +end + + -- environmental damage (water, lava, fire, light etc.) function mob_class:do_env_damage() @@ -902,17 +1058,93 @@ function mob_class:do_env_damage() self:update_tag() end - local pos = self.object:get_pos() + local pos = self.object:get_pos() ; if not pos then return end self.time_of_day = minetest.get_timeofday() - -- remove mob if standing inside ignore node + -- halt mob if standing inside ignore node if self.standing_in == "ignore" then + + self.object:set_velocity({x = 0, y = 0, z = 0}) + + return true + end + + -- particle appears at random mob height + local py = { + x = pos.x, + y = pos.y + random(self.collisionbox[2], self.collisionbox[5]), + z = pos.z + } + + local nodef = minetest.registered_nodes[self.standing_in] + + -- water + if self.water_damage ~= 0 + and nodef.groups.water then + + self.health = self.health - self.water_damage + + effect(py, 5, "bubble.png", nil, nil, 1, nil) + + if self:check_for_death({type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + + -- lava damage + elseif self.lava_damage ~= 0 + and nodef.groups.lava then + + self.health = self.health - self.lava_damage + + effect(py, 15, "fire_basic_flame.png", 1, 5, 1, 0.2, 15, true) + + if self:check_for_death({type = "environment", pos = pos, + node = self.standing_in, hot = true}) then + return true + end + + -- fire damage + elseif self.fire_damage ~= 0 + and nodef.groups.fire then + + self.health = self.health - self.fire_damage + + effect(py, 15, "fire_basic_flame.png", 1, 5, 1, 0.2, 15, true) + + if self:check_for_death({type = "environment", pos = pos, + node = self.standing_in, hot = true}) then + return true + end + + -- damage_per_second node check (not fire and lava) + elseif nodef.damage_per_second ~= 0 + and nodef.groups.lava == nil and nodef.groups.fire == nil then if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then else - self.object:remove() + self.health = self.health - nodef.damage_per_second + + effect(py, 5, "tnt_smoke.png") + + if self:check_for_death({type = "environment", + pos = pos, node = self.standing_in}) then + return true + end + end + end + + -- air damage + if self.air_damage ~= 0 and self.standing_in == "air" then + + self.health = self.health - self.air_damage + + effect(py, 3, "bubble.png", 1, 1, 1, 0.2) + + if self:check_for_death({type = "environment", + pos = pos, node = self.standing_in}) then + return true end - return true end -- is mob light sensative, or scared of the dark :P @@ -922,83 +1154,40 @@ function mob_class:do_env_damage() if light >= self.light_damage_min and light <= self.light_damage_max then - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.health = self.health - self.light_damage - effect(pos, 5, "tnt_smoke.png") - if self:check_for_death({type = "light"}) then return true end + + self.health = self.health - self.light_damage + + effect(py, 5, "tnt_smoke.png") + + if self:check_for_death({type = "light"}) then + return true end end end - local nodef = minetest.registered_nodes[self.standing_in] - - if (pos) == nil then - return - end - pos.y = pos.y + 1 -- for particle effect position - - -- water - if self.water_damage - and nodef.groups.water then - - if self.water_damage ~= 0 then - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.health = self.health - self.water_damage - - effect(pos, 5, "bubble.png", nil, nil, 1, nil) - - if self:check_for_death({type = "environment", - pos = pos, node = self.standing_in}) then return true end - end - end - - -- lava or fire or ignition source - elseif self.lava_damage - and nodef.groups.igniter then --- and (nodef.groups.lava --- or self.standing_in == node_fire --- or self.standing_in == node_permanent_flame) then - - if self.lava_damage ~= 0 then - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.health = self.health - self.lava_damage - - effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) - - if self:check_for_death({type = "environment", pos = pos, - node = self.standing_in, hot = true}) then return true end - end - - end - - -- damage_per_second node check - elseif nodef.damage_per_second ~= 0 then - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.health = self.health - nodef.damage_per_second - - effect(pos, 5, "tnt_smoke.png") - - if self:check_for_death({type = "environment", - pos = pos, node = self.standing_in}) then return true end - end - end ---[[ --- suffocation inside solid node - if self.suffocation ~= 0 - and nodef.walkable == true - and nodef.groups.disable_suffocation ~= 1 - and nodef.drawtype == "normal" then + if (self.suffocation and self.suffocation ~= 0) + and (nodef.walkable == nil or nodef.walkable == true) + and (nodef.collision_box == nil or nodef.collision_box.type == "regular") + and (nodef.node_box == nil or nodef.node_box.type == "regular") + and (nodef.groups.disable_suffocation ~= 1) then - self.health = self.health - self.suffocation + local damage - if self:check_for_death({type = "environment", - pos = pos, node = self.standing_in}) then return true end + if self.suffocation == true then + damage = 2 + else + damage = (self.suffocation or 2) + end + + self.health = self.health - damage + + if self:check_for_death({type = "suffocation", + pos = pos, node = self.standing_in}) then + return true + end end -]] + return self:check_for_death({type = "unknown"}) end @@ -1029,14 +1218,8 @@ function mob_class:do_jump() -- sanity check if not yaw then return false end - -- what is mob standing on? - pos.y = pos.y + self.collisionbox[2] - 0.2 - - local nod = node_ok(pos) - ---print ("standing on:", nod.name, pos.y) - - if minetest.registered_nodes[nod.name].walkable == false then + -- we can only jump if standing on solid node + if minetest.registered_nodes[self.standing_on].walkable == false then return false end @@ -1044,25 +1227,34 @@ function mob_class:do_jump() local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) + -- set y_pos to base of mob + pos.y = pos.y + self.collisionbox[2] + -- what is in front of mob? local nod = node_ok({ - x = pos.x + dir_x, - y = pos.y + 0.5, - z = pos.z + dir_z + x = pos.x + dir_x, y = pos.y + 0.5, z = pos.z + dir_z }) - -- thin blocks that do not need to be jumped - if nod.name == node_snow then - return false - end + -- what is above and in front? + local nodt = node_ok({ + x = pos.x + dir_x, y = pos.y + 1.5, z = pos.z + dir_z + }) ---print ("in front:", nod.name, pos.y + 0.5) + local blocked = minetest.registered_nodes[nodt.name].walkable - if self.walk_chance == 0 - or minetest.registered_items[nod.name].walkable then +--print("standing on:", self.standing_on, pos.y - 0.25) +--print("in front:", nod.name, pos.y + 0.5) +--print("in front above:", nodt.name, pos.y + 1.5) + + -- jump if standing on solid node (not snow) and not blocked above + if (self.walk_chance == 0 + or minetest.registered_items[nod.name].walkable) + and not blocked + and nod.name ~= node_snow then if not nod.name:find("fence") - and not nod.name:find("gate") then + and not nod.name:find("gate") + and not nod.name:find("wall") then local v = self.object:get_velocity() @@ -1088,27 +1280,28 @@ function mob_class:do_jump() if self:get_velocity() > 0 then self:mob_sound(self.sounds.jump) end + + return true else self.facing_fence = true end + end - -- if we jumped against a block/wall 4 times then turn - if self.object:get_velocity().x ~= 0 - or self.object:get_velocity().z ~= 0 then + -- if blocked against a block/wall for 5 counts then turn + if not self.following + and (self.facing_fence or blocked) then - self.jump_count = (self.jump_count or 0) + 1 ---print ("----", self.jump_count) - if self.jump_count == 4 then + self.jump_count = (self.jump_count or 0) + 1 - local yaw = self.object:get_yaw() or 0 + if self.jump_count > 4 then - yaw = self:set_yaw(yaw + 1.35, 8) ---print ("---- turn") - self.jump_count = 0 - end + local yaw = self.object:get_yaw() or 0 + local turn = random(0, 2) + 1.35 + + yaw = self:set_yaw(yaw + turn, 12) + + self.jump_count = 0 end - - return true end return false @@ -1143,45 +1336,46 @@ local entity_physics = function(pos, radius) end +-- can mob see player +local is_invisible = function(self, player_name) + + if mobs.invis[player_name] and not self.ignore_invisibility then + return true + end +end + + -- should mob follow what I'm holding ? function mob_class:follow_holding(clicker) - if mobs.invis[clicker:get_player_name()] then + if is_invisible(self, clicker:get_player_name()) then return false end local item = clicker:get_wielded_item() - local t = type(self.follow) - -- single item - if t == "string" - and item:get_name() == self.follow then + -- are we holding an item mob can follow ? + if check_for(item:get_name(), self.follow) then return true - - -- multiple items - elseif t == "table" then - - for no = 1, #self.follow do - - if self.follow[no] == item:get_name() then - return true - end - end end return false end +-- Thanks Wuzzy for the following editable settings +local HORNY_TIME = 30 +local HORNY_AGAIN_TIME = 300 +local CHILD_GROW_TIME = 60 * 20 -- 20 minutes -- find two animals of same type and breed if nearby and horny function mob_class:breed() - -- child takes 240 seconds before growing into adult + -- child takes a long time before growing into adult if self.child == true then self.hornytimer = self.hornytimer + 1 - if self.hornytimer > 240 then + if self.hornytimer > CHILD_GROW_TIME then self.child = false self.hornytimer = 0 @@ -1199,25 +1393,29 @@ function mob_class:breed() self.on_grown(self) else -- jump when fully grown so as not to fall into ground - self.object:set_velocity({ - x = 0, - y = self.jump_height, - z = 0 - }) +-- self.object:set_velocity({ +-- x = 0, +-- y = self.jump_height, +-- z = 0 +-- }) + local pos = self.object:get_pos() ; if not pos then return end + local ent = self.object:get_luaentity() + pos.y = pos.y + (ent.collisionbox[2] * -1) - 0.4 + self.object:set_pos(pos) end end return end - -- horny animal can mate for 40 seconds, - -- afterwards horny animal cannot mate again for 200 seconds + -- horny animal can mate for HORNY_TIME seconds, + -- afterwards horny animal cannot mate again for HORNY_AGAIN_TIME seconds if self.horny == true - and self.hornytimer < 240 then + and self.hornytimer < HORNY_TIME + HORNY_AGAIN_TIME then self.hornytimer = self.hornytimer + 1 - if self.hornytimer >= 240 then + if self.hornytimer >= HORNY_TIME + HORNY_AGAIN_TIME then self.hornytimer = 0 self.horny = false end @@ -1225,15 +1423,15 @@ function mob_class:breed() -- find another same animal who is also horny and mate if nearby if self.horny == true - and self.hornytimer <= 40 then + and self.hornytimer <= HORNY_TIME then local pos = self.object:get_pos() - effect({x = pos.x, y = pos.y + 1, z = pos.z}, 8, "heart.png", 3, 4, 1, 0.1) + effect({x = pos.x, y = pos.y + 1, z = pos.z}, 8, + "heart.png", 3, 4, 1, 0.1) local objs = minetest.get_objects_inside_radius(pos, 3) - local num = 0 - local ent = nil + local ent for n = 1, #objs do @@ -1247,12 +1445,12 @@ function mob_class:breed() if ent.name == self.name then canmate = true else - local entname = string.split(ent.name,":") - local selfname = string.split(self.name,":") + local entname = ent.name:split(":") + local selfname = self.name:split(":") if entname[1] == selfname[1] then - entname = string.split(entname[2],"_") - selfname = string.split(selfname[2],"_") + entname = entname[2]:split("_") + selfname = selfname[2]:split("_") if entname[1] == selfname[1] then canmate = true @@ -1261,18 +1459,29 @@ function mob_class:breed() end end - if ent + -- found another similar horny animal that isn't self? + if ent and ent.object ~= self.object and canmate == true and ent.horny == true - and ent.hornytimer <= 40 then - num = num + 1 - end + and ent.hornytimer <= HORNY_TIME then - -- found your mate? then have a baby - if num > 1 then + local pos2 = ent.object:get_pos() - self.hornytimer = 41 - ent.hornytimer = 41 + -- Have mobs face one another + yaw_to_pos(self, pos2) + yaw_to_pos(ent, self.object:get_pos()) + + self.hornytimer = HORNY_TIME + 1 + ent.hornytimer = HORNY_TIME + 1 + + -- have we reached active mob limit + if active_limit > 0 and active_mobs >= active_limit then + minetest.chat_send_player(self.owner, + S("Active Mob Limit Reached!") + .. " (" .. active_mobs + .. " / " .. active_limit .. ")") + return + end -- spawn baby minetest.after(5, function(self, ent) @@ -1292,6 +1501,8 @@ function mob_class:breed() effect(pos, 15, "tnt_smoke.png", 1, 2, 2, 15, 5) end + pos.y = pos.y + 0.5 -- spawn child a little higher + local mob = minetest.add_entity(pos, self.name) local ent2 = mob:get_luaentity() local textures = self.base_texture @@ -1331,8 +1542,6 @@ function mob_class:breed() ent2.owner = self.owner end, self, ent) - num = 0 - break end end @@ -1343,12 +1552,15 @@ end -- find and replace what mob is looking for (grass, wheat etc.) function mob_class:replace(pos) + local vel = self.object:get_velocity() + if not vel then return end + if not mobs_griefing or not self.replace_rate or not self.replace_what or self.child == true - or self.object:get_velocity().y ~= 0 - or random(1, self.replace_rate) > 1 then + or vel.y ~= 0 + or random(self.replace_rate) > 1 then return end @@ -1371,15 +1583,16 @@ function mob_class:replace(pos) if #minetest.find_nodes_in_area(pos, pos, what) > 0 then --- print ("replace node = ".. minetest.get_node(pos).name, pos.y) +-- print("replace node = ".. minetest.get_node(pos).name, pos.y) if self.on_replace then - local oldnode = what + local oldnode = what or "" local newnode = with - -- convert any group: replacements to actual node name - if oldnode:find("group:") then + -- pass actual node name when using table or groups + if type(oldnode) == "table" + or oldnode:find("group:") then oldnode = minetest.get_node(pos).name end @@ -1412,12 +1625,13 @@ end local los_switcher = false local height_switcher = false --- path finding and smart mob routine by rnd, line_of_sight and other edits by Elkien3 +-- path finding and smart mob routine by rnd, +-- line_of_sight and other edits by Elkien3 function mob_class:smart_mobs(s, p, dist, dtime) local s1 = self.path.lastpos + local target_pos = p - local target_pos = self.attack:get_pos() -- is it becoming stuck? if abs(s1.x - s.x) + abs(s1.z - s.z) < .5 then @@ -1490,7 +1704,7 @@ function mob_class:smart_mobs(s, p, dist, dtime) end, self) end - if abs(vector.subtract(s,target_pos).y) > self.stepheight then + if abs(vsubtract(s,target_pos).y) > self.stepheight then if height_switcher then use_pathfind = true @@ -1503,15 +1717,13 @@ function mob_class:smart_mobs(s, p, dist, dtime) end end + -- lets try find a path, first take care of positions + -- since pathfinder is very sensitive if use_pathfind then - -- lets try find a path, first take care of positions - -- since pathfinder is very sensitive - local sheight = self.collisionbox[5] - self.collisionbox[2] -- round position to center of node to avoid stuck in walls -- also adjust height for player models! s.x = floor(s.x + 0.5) --- s.y = floor(s.y + 0.5) - sheight s.z = floor(s.z + 0.5) local ssight, sground = minetest.line_of_sight(s, { @@ -1529,14 +1741,25 @@ function mob_class:smart_mobs(s, p, dist, dtime) p1.z = floor(p1.z + 0.5) local dropheight = 6 + if self.fear_height ~= 0 then dropheight = self.fear_height end - self.path.way = minetest.find_path(s, p1, 16, self.stepheight, dropheight, "Dijkstra") + local jumpheight = 0 + + if self.jump and self.jump_height >= 4 then + jumpheight = min(ceil(self.jump_height / 4), 4) + + elseif self.stepheight > 0.5 then + jumpheight = 1 + end + + self.path.way = minetest.find_path(s, p1, 16, jumpheight, + dropheight, "Dijkstra") --[[ -- show path using particles if self.path.way and #self.path.way > 0 then - print ("-- path length:" .. tonumber(#self.path.way)) + print("-- path length:" .. tonumber(#self.path.way)) for _,pos in pairs(self.path.way) do minetest.add_particle({ pos = pos, @@ -1553,7 +1776,10 @@ function mob_class:smart_mobs(s, p, dist, dtime) ]] self.state = "" - self:do_attack(self.attack) + + if self.attack then + self:do_attack(self.attack) + end -- no path found, try something else if not self.path.way then @@ -1577,7 +1803,7 @@ function mob_class:smart_mobs(s, p, dist, dtime) end end - local sheight = math.ceil(self.collisionbox[5]) + 1 + local sheight = ceil(self.collisionbox[5]) + 1 -- assume mob is 2 blocks high so it digs above its head s.y = s.y + sheight @@ -1643,7 +1869,6 @@ function mob_class:smart_mobs(s, p, dist, dtime) minetest.add_item(p1, ItemStack(node1)) minetest.set_node(p1, {name = "air"}) end - end end end @@ -1651,11 +1876,17 @@ function mob_class:smart_mobs(s, p, dist, dtime) -- will try again in 2 second self.path.stuck_timer = stuck_timeout - 2 - -- frustration! cant find the damn path :( - --self:mob_sound(self.sounds.random) + elseif s.y < p1.y and (not self.fly) then + self:do_jump() --add jump to pathfinding + self.path.following = true else -- yay i found path - self:mob_sound(self.sounds.war_cry) + if self.attack then + self:mob_sound(self.sounds.war_cry) + else + self:mob_sound(self.sounds.random) + end + self:set_velocity(self.walk_velocity) -- follow path now that it has it @@ -1665,18 +1896,15 @@ function mob_class:smart_mobs(s, p, dist, dtime) end --- specific attacks -local specific_attack = function(list, what) +-- peaceful player privilege support +local function is_peaceful_player(player) - -- no list so attack default (player, animals etc.) - if list == nil then - return true - end + if peaceful_player_enabled then - -- found entity on list to attack? - for no = 1, #list do + local player_name = player:get_player_name() - if list[no] == what then + if player_name + and minetest.check_player_privs(player_name, "peaceful_player") then return true end end @@ -1690,15 +1918,13 @@ function mob_class:general_attack() -- return if already attacking, passive or docile during day if self.passive + or self.state == "runaway" or self.state == "attack" or self:day_docile() then return end - local s = self.object:get_pos() - if s == nil then - return - end + local s = self.object:get_pos() ; if not s then return end local objs = minetest.get_objects_inside_radius(s, self.view_range) -- remove entities we aren't interested in @@ -1709,11 +1935,13 @@ function mob_class:general_attack() -- are we a player? if objs[n]:is_player() then - -- if player invisible or mob not setup to attack then remove from list - if self.attack_players == false + -- if player invisible or mob cannot attack then remove from list + if not damage_enabled + or self.attack_players == false or (self.owner and self.type ~= "monster") - or mobs.invis[objs[n]:get_player_name()] - or not specific_attack(self.specific_attack, "player") then + or is_invisible(self, objs[n]:get_player_name()) + or (self.specific_attack + and not check_for("player", self.specific_attack)) then objs[n] = nil --print("- pla", n) end @@ -1726,7 +1954,8 @@ function mob_class:general_attack() or (not self.attack_animals and ent.type == "animal") or (not self.attack_monsters and ent.type == "monster") or (not self.attack_npcs and ent.type == "npc") - or not specific_attack(self.specific_attack, ent.name) then + or (self.specific_attack + and not check_for(ent.name, self.specific_attack)) then objs[n] = nil --print("- mob", n, self.name, ent.name) end @@ -1756,39 +1985,20 @@ function mob_class:general_attack() -- choose closest player to attack that isnt self if dist ~= 0 and dist < min_dist - and self:line_of_sight(sp, p, 2) == true then + and self:line_of_sight(sp, p, 2) == true + and not is_peaceful_player(player) then min_dist = dist min_player = player end end -- attack closest player or mob - if min_player and random(1, 100) > self.attack_chance then + if min_player and random(100) > self.attack_chance then self:do_attack(min_player) end end --- specific runaway -local specific_runaway = function(list, what) - - -- no list so do not run - if list == nil then - return false - end - - -- found entity on list to attack? - for no = 1, #list do - - if list[no] == what then - return true - end - end - - return false -end - - -- find someone to runaway from function mob_class:do_runaway_from() @@ -1796,7 +2006,7 @@ function mob_class:do_runaway_from() return end - local s = self.object:get_pos() + local s = self.object:get_pos() ; if not s then return end local p, sp, dist, pname local player, obj, min_player, name local min_dist = self.view_range + 1 @@ -1808,7 +2018,7 @@ function mob_class:do_runaway_from() pname = objs[n]:get_player_name() - if mobs.invis[pname] + if is_invisible(self, pname) or self.owner == pname then name = "" @@ -1827,10 +2037,10 @@ function mob_class:do_runaway_from() -- find specific mob to runaway from if name ~= "" and name ~= self.name - and specific_runaway(self.runaway_from, name) then + and (self.runaway_from and check_for(name, self.runaway_from)) then - p = player:get_pos() sp = s + p = player and player:get_pos() or s -- aim higher to make looking up hills more realistic p.y = p.y + 1 @@ -1849,20 +2059,8 @@ function mob_class:do_runaway_from() if min_player then - local lp = player:get_pos() - local vec = { - x = lp.x - s.x, - y = lp.y - s.y, - z = lp.z - s.z - } + yaw_to_pos(self, min_player:get_pos(), 3) - local yaw = (atan(vec.z / vec.x) + 3 * pi / 2) - self.rotate - - if lp.x > s.x then - yaw = yaw + pi - end - - yaw = self:set_yaw(yaw, 4) self.state = "runaway" self.runaway_timer = 3 self.following = nil @@ -1874,19 +2072,18 @@ end function mob_class:follow_flop() -- find player to follow - if (self.follow ~= "" - or self.order == "follow") + if (self.follow ~= "" or self.order == "follow") and not self.following and self.state ~= "attack" and self.state ~= "runaway" then - local s = self.object:get_pos() + local s = self.object:get_pos() ; if not s then return end local players = minetest.get_connected_players() for n = 1, #players do if get_distance(players[n]:get_pos(), s) < self.view_range - and not mobs.invis[ players[n]:get_player_name() ] then + and not is_invisible(self, players[n]:get_player_name()) then self.following = players[n] @@ -1907,10 +2104,11 @@ function mob_class:follow_flop() self.following = nil end else - -- stop following player if not holding specific item + -- stop following player if not holding specific item or mob is horny if self.following and self.following:is_player() - and self:follow_holding(self.following) == false then + and (self:follow_holding(self.following) == false + or self.horny) then self.following = nil end @@ -1939,16 +2137,7 @@ function mob_class:follow_flop() if dist > self.view_range then self.following = nil else - local vec = { - x = p.x - s.x, - z = p.z - s.z - } - - local yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate - - if p.x > s.x then yaw = yaw + pi end - - yaw = self:set_yaw(yaw, 6) + yaw_to_pos(self, p) -- anyone but standing npc's can move along if dist > self.reach @@ -1972,16 +2161,24 @@ function mob_class:follow_flop() -- swimmers flop when out of their element, and swim again when back in if self.fly then - local s = self.object:get_pos() - if not self:attempt_flight_correction() then self.state = "flop" + + -- do we have a custom on_flop function? + if self.on_flop then + + if self:on_flop(self) then + return + end + end + self.object:set_velocity({x = 0, y = -5, z = 0}) self:set_animation("stand") return + elseif self.state == "flop" then self.state = "stand" end @@ -2021,13 +2218,13 @@ end -- execute current state (stand, walk, run, attacks) function mob_class:do_states(dtime) - local yaw = self.object:get_yaw() or 0 + local yaw = self.object:get_yaw() ; if not yaw then return end if self.state == "stand" then - if random(1, 4) == 1 then + if self.randomly_turn and random(4) == 1 then - local lp = nil + local lp local s = self.object:get_pos() local objs = minetest.get_objects_inside_radius(s, 3) @@ -2041,15 +2238,7 @@ function mob_class:do_states(dtime) -- look at any players nearby, otherwise turn randomly if lp then - - local vec = { - x = lp.x - s.x, - z = lp.z - s.z - } - - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate - - if lp.x > s.x then yaw = yaw + pi end + yaw = yaw_to_pos(self, lp) else yaw = yaw + random(-0.5, 0.5) end @@ -2064,7 +2253,7 @@ function mob_class:do_states(dtime) if self.order ~= "stand" and self.walk_chance ~= 0 and self.facing_fence ~= true - and random(1, 100) <= self.walk_chance + and random(100) <= self.walk_chance and self.at_cliff == false then self:set_velocity(self.walk_velocity) @@ -2075,13 +2264,13 @@ function mob_class:do_states(dtime) elseif self.state == "walk" then local s = self.object:get_pos() - local lp = nil + local lp -- is there something I need to avoid? if self.water_damage > 0 and self.lava_damage > 0 then - lp = minetest.find_node_near(s, 1, {"group:water", "group:lava"}) + lp = minetest.find_node_near(s, 1, {"group:water", "group:igniter"}) elseif self.water_damage > 0 then @@ -2089,70 +2278,64 @@ function mob_class:do_states(dtime) elseif self.lava_damage > 0 then - lp = minetest.find_node_near(s, 1, {"group:lava"}) + lp = minetest.find_node_near(s, 1, {"group:igniter"}) end if lp then - -- if mob in water or lava then look for land - if (self.lava_damage - and minetest.registered_nodes[self.standing_in].groups.lava) - or (self.water_damage - and minetest.registered_nodes[self.standing_in].groups.water) then + -- if mob in dangerous node then look for land + if not is_node_dangerous(self, self.standing_in) then - lp = minetest.find_node_near(s, 5, {"group:soil", "group:stone", - "group:sand", node_ice, node_snowblock}) + lp = minetest.find_nodes_in_area_under_air( + {s.x - 5, s.y - 1, s.z - 5}, + {s.x + 5, s.y + 2, s.z + 5}, + {"group:soil", "group:stone", "group:sand", + node_ice, node_snowblock}) + + -- select position of random block to climb onto + lp = #lp > 0 and lp[random(#lp)] -- did we find land? if lp then - local vec = { - x = lp.x - s.x, - z = lp.z - s.z - } + yaw = yaw_to_pos(self, lp) - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate - - if lp.x > s.x then yaw = yaw + pi end - - -- look towards land and jump/move in that direction - yaw = self:set_yaw(yaw, 6) self:do_jump() self:set_velocity(self.walk_velocity) else yaw = yaw + random(-0.5, 0.5) end - - else - - local vec = { - x = lp.x - s.x, - z = lp.z - s.z - } - - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate - - if lp.x > s.x then yaw = yaw + pi end end yaw = self:set_yaw(yaw, 8) -- otherwise randomly turn - elseif random(1, 100) <= 30 then + elseif self.randomly_turn and random(100) <= 30 then yaw = yaw + random(-0.5, 0.5) yaw = self:set_yaw(yaw, 8) + + -- for flying/swimming mobs randomly move up and down also + if self.fly_in + and not self.following then + self:attempt_flight_correction(true) + end end -- stand for great fall in front if self.facing_fence == true or self.at_cliff - or random(1, 100) <= self.stand_chance then + or random(100) <= self.stand_chance then - self:set_velocity(0) - self.state = "stand" - self:set_animation("stand", true) + -- don't stand if mob flies and keep_flying set + if (self.fly and not self.keep_flying) + or not self.fly then + + self:set_velocity(0) + self.state = "stand" + self:set_animation("stand", true) + end else self:set_velocity(self.walk_velocity) @@ -2187,19 +2370,21 @@ function mob_class:do_states(dtime) -- attack routines (explode, dogfight, shoot, dogshoot) elseif self.state == "attack" then - -- calculate distance from mob and enemy + -- get mob and enemy positions and distance between local s = self.object:get_pos() - local p = self.attack:get_pos() or s - local dist = get_distance(p, s) + local p = self.attack and self.attack:get_pos() + local dist = p and get_distance(p, s) or 500 - -- stop attacking if player invisible or out of range + -- stop attacking if player out of range or invisible if dist > self.view_range or not self.attack or not self.attack:get_pos() or self.attack:get_hp() <= 0 - or (self.attack:is_player() and mobs.invis[ self.attack:get_player_name() ]) then + or (self.attack:is_player() + and is_invisible(self, self.attack:get_player_name())) then + +--print(" ** stop attacking **", dist, self.view_range) --- print(" ** stop attacking **", dist, self.view_range) self.state = "stand" self:set_velocity(0) self:set_animation("stand") @@ -2214,21 +2399,15 @@ function mob_class:do_states(dtime) if self.attack_type == "explode" then - local vec = { - x = p.x - s.x, - z = p.z - s.z - } - - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate - - if p.x > s.x then yaw = yaw + pi end - - yaw = self:set_yaw(yaw) + yaw = yaw_to_pos(self, p) local node_break_radius = self.explosion_radius or 1 local entity_damage_radius = self.explosion_damage_radius or (node_break_radius * 2) + -- look a little higher to fix raycast + s.y = s.y + 0.5 ; p.y = p.y + 0.5 + -- start timer when in reach and line of sight if not self.v_start and dist <= self.reach @@ -2238,18 +2417,21 @@ function mob_class:do_states(dtime) self.timer = 0 self.blinktimer = 0 self:mob_sound(self.sounds.fuse) --- print ("=== explosion timer started", self.explosion_timer) + +--print("=== explosion timer started", self.explosion_timer) -- stop timer if out of reach or direct line of sight elseif self.allow_fuse_reset and self.v_start - and (dist > self.reach - or not self:line_of_sight(s, p, 2)) then + and (dist > self.reach or not self:line_of_sight(s, p, 2)) then + +--print("=== explosion timer stopped") + self.v_start = false self.timer = 0 self.blinktimer = 0 self.blinkstatus = false - self.object:settexturemod("") + self.object:set_texture_mod("") end -- walk right up to player unless the timer is active @@ -2275,15 +2457,18 @@ function mob_class:do_states(dtime) self.blinktimer = 0 if self.blinkstatus then - self.object:set_texture_mod("") + + self.object:set_texture_mod(self.texture_mods) else - self.object:set_texture_mod("^[brighten") + + self.object:set_texture_mod(self.texture_mods + .. "^[brighten") end self.blinkstatus = not self.blinkstatus end --- print ("=== explosion timer", self.timer) +--print("=== explosion timer", self.timer) if self.timer > self.explosion_timer then @@ -2295,10 +2480,8 @@ function mob_class:do_states(dtime) node_break_radius = 1 end - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.object:remove() - end + + remove_mob(self, true) if minetest.get_modpath("tnt") and tnt and tnt.boom and not minetest.is_protected(pos, "") then @@ -2317,16 +2500,19 @@ function mob_class:do_states(dtime) }) entity_physics(pos, entity_damage_radius) - effect(pos, 32, "tnt_smoke.png", nil, nil, node_break_radius, 1, 0) + + effect(pos, 32, "tnt_smoke.png", nil, nil, + node_break_radius, 1, 0) end - return + return true end end elseif self.attack_type == "dogfight" or (self.attack_type == "dogshoot" and self:dogswitch(dtime) == 2) - or (self.attack_type == "dogshoot" and dist <= self.reach and self:dogswitch() == 0) then + or (self.attack_type == "dogshoot" and dist <= self.reach + and self:dogswitch() == 0) then if self.fly and dist > self.reach then @@ -2373,7 +2559,6 @@ function mob_class:do_states(dtime) }) end end - end -- rnd: new movement direction @@ -2395,25 +2580,16 @@ function mob_class:do_states(dtime) return end - if abs(p1.x-s.x) + abs(p1.z - s.z) < 0.6 then + if abs(p1.x - s.x) + abs(p1.z - s.z) < 0.6 then -- reached waypoint, remove it from queue - table.remove(self.path.way, 1) + table_remove(self.path.way, 1) end -- set new temporary target p = {x = p1.x, y = p1.y, z = p1.z} end - local vec = { - x = p.x - s.x, - z = p.z - s.z - } - - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate - - if p.x > s.x then yaw = yaw + pi end - - yaw = self:set_yaw(yaw) + yaw = yaw_to_pos(self, p) -- move towards enemy if beyond mob reach if dist > self.reach then @@ -2452,9 +2628,11 @@ function mob_class:do_states(dtime) self:set_velocity(0) - if not self.custom_attack then + if self.timer > 1 then - if self.timer > 1 then + -- no custom attack or custom attack returns true to continue + if not self.custom_attack + or self:custom_attack(self, p) == true then self.timer = 0 self:set_animation("punch") @@ -2472,51 +2650,37 @@ function mob_class:do_states(dtime) -- punch player (or what player is attached to) local attached = self.attack:get_attach() + if attached then self.attack = attached end + self.attack:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = self.damage} }, nil) end end - else -- call custom attack every second - if self.custom_attack - and self.timer > 1 then - - self.timer = 0 - - self:custom_attack(p) - end end end elseif self.attack_type == "shoot" or (self.attack_type == "dogshoot" and self:dogswitch(dtime) == 1) - or (self.attack_type == "dogshoot" and dist > self.reach and self:dogswitch() == 0) then + or (self.attack_type == "dogshoot" and dist > self.reach and + self:dogswitch() == 0) then p.y = p.y - .5 s.y = s.y + .5 - local dist = get_distance(p, s) - local vec = { - x = p.x - s.x, - y = p.y - s.y, - z = p.z - s.z - } + local vec = {x = p.x - s.x, y = p.y - s.y, z = p.z - s.z} - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate - - if p.x > s.x then yaw = yaw + pi end - - yaw = self:set_yaw(yaw) + yaw = yaw_to_pos(self, p) self:set_velocity(0) if self.shoot_interval and self.timer > self.shoot_interval - and random(1, 100) <= 60 then + and random(100) <= 60 then self.timer = 0 self:set_animation("shoot") @@ -2565,40 +2729,17 @@ function mob_class:falling(pos) -- sanity check if not v then return end - if v.y > 0 then + local fall_speed = self.fall_speed - -- apply gravity when moving up - self.object:set_acceleration({ - x = 0, - y = -10, - z = 0 - }) + -- in water then use liquid viscosity for float/sink speed + if self.floats == 1 and self.standing_in + and minetest.registered_nodes[self.standing_in].groups.liquid then - elseif v.y <= 0 and v.y > self.fall_speed then + local visc = min( + minetest.registered_nodes[self.standing_in].liquid_viscosity, 7) + 1 - -- fall downwards at set speed - self.object:set_acceleration({ - x = 0, - y = self.fall_speed, - z = 0 - }) - else - -- stop accelerating once max fall speed hit - self.object:set_acceleration({x = 0, y = 0, z = 0}) - end - - -- in water then float up - if self.standing_in - and minetest.registered_nodes[self.standing_in].groups.water then - - if self.floats == 1 then - - self.object:set_acceleration({ - x = 0, - y = -self.fall_speed / (max(1, v.y) ^ 8), -- 8 was 2 - z = 0 - }) - end + self.object:set_velocity({x = v.x, y = 0.6, z = v.z}) + fall_speed = -1.2 / visc else -- fall damage onto solid ground @@ -2608,21 +2749,26 @@ function mob_class:falling(pos) local d = (self.old_y or 0) - self.object:get_pos().y if d > 5 then - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.health = self.health - floor(d - 5) - effect(pos, 5, "tnt_smoke.png", 1, 2, 2, nil) + self.health = self.health - floor(d - 5) - if self:check_for_death({type = "fall"}) then - return - end + effect(pos, 5, "tnt_smoke.png", 1, 2, 2, nil) + + if self:check_for_death({type = "fall"}) then + return true end end self.old_y = self.object:get_pos().y end end + + -- fall at set speed + self.object:set_acceleration({ + x = 0, + y = fall_speed, + z = 0 + }) end @@ -2630,30 +2776,56 @@ end local tr = minetest.get_modpath("toolranks") -- deal damage and effects when mob punched -function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) - - -- mob health check +function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) + --mob health check if self.health <= 0 then - return + return true end -- custom punch function if self.do_punch and self:do_punch(hitter, tflp, tool_capabilities, dir) == false then - return + return true end -- error checking when mod profiling is enabled if not tool_capabilities then - minetest.log("warning", "[mobs] Mod profiling enabled, damage not enabled") - return + minetest.log("warning", + "[mobs] Mod profiling enabled, damage not enabled") + return true end - -- is mob protected? - if self.protected and hitter:is_player() - and minetest.is_protected(self.object:get_pos(), hitter:get_player_name()) then - minetest.chat_send_player(hitter:get_player_name(), S("Mob has been protected!")) - return + -- is mob protected + if self.protected then + + -- did player hit mob and if so is it in protected area + if hitter:is_player() then + + local player_name = hitter:get_player_name() + + if player_name ~= self.owner + and minetest.is_protected(self.object:get_pos(), player_name) then + + minetest.chat_send_player(hitter:get_player_name(), + S("Mob has been protected!")) + + return true + end + + -- if protection is on level 2 then dont let arrows harm mobs + elseif self.protected == 2 then + + local ent = hitter and hitter:get_luaentity() + + if ent and ent._is_arrow then + + return true -- arrow entity + + elseif not ent then + + return true -- non entity + end + end end local weapon = hitter:get_wielded_item() @@ -2685,7 +2857,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) end damage = damage + (tool_capabilities.damage_groups[group] or 0) - * tmp * ((armor[group] or 0) / 100.0) + * tmp * ((armor[group] or 0) / 100.0) end end @@ -2697,23 +2869,25 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) damage = self.immune_to[n][2] or 0 break - -- if "all" then no tool does damage unless it's specified in list + -- if "all" then no tools deal damage unless it's specified in list elseif self.immune_to[n][1] == "all" then damage = self.immune_to[n][2] or 0 end end +--print("Mob Damage is", damage) + -- healing if damage <= -1 then self.health = self.health - floor(damage) - return + return true end - --- print ("Mob Damage is", damage) + if use_cmi - and cmi.notify_punch(self.object, hitter, tflp, tool_capabilities, dir, damage) then - return + and cmi.notify_punch( + self.object, hitter, tflp, tool_capabilities, dir, damage) then + return true end -- add weapon wear @@ -2739,7 +2913,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) weapon:add_wear(wear) end - hitter:set_wielded_item(weapon) + --hitter:set_wielded_item(weapon) -- only play hit sound and show blood effects if damage is 1 or over if damage >= 1 then @@ -2752,30 +2926,36 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) minetest.sound_play(weapon_def.sounds[s], { object = self.object, max_hear_distance = 8 - }) + }, true) else minetest.sound_play("default_punch", { object = self.object, max_hear_distance = 5 - }) + }, true) end -- blood_particles if not disable_blood and self.blood_amount > 0 then local pos = self.object:get_pos() + local blood = self.blood_texture + local amount = self.blood_amount - pos.y = pos.y + (-self.collisionbox[2] + self.collisionbox[5]) * .5 + pos.y = pos.y + (-self.collisionbox[2] + + self.collisionbox[5]) * .5 + + -- lots of damage = more blood :) + if damage > 10 then + amount = self.blood_amount * 2 + end -- do we have a single blood texture or multiple? if type(self.blood_texture) == "table" then - - local blood = self.blood_texture[random(1, #self.blood_texture)] - - effect(pos, self.blood_amount, blood, nil, nil, 1, nil) - else - effect(pos, self.blood_amount, self.blood_texture, nil, nil, 1, nil) + blood = self.blood_texture[random(#self.blood_texture)] end + + effect(pos, amount, blood, 1, 2, 1.75, nil, nil, true) + end -- do damage @@ -2783,25 +2963,26 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) else self.health = self.health - floor(damage) end - + -- exit here if dead, check for tools with fire damage local hot = tool_capabilities and tool_capabilities.damage_groups and tool_capabilities.damage_groups.fire if self:check_for_death({type = "punch", puncher = hitter, hot = hot}) then - return + return true end - --[[ add healthy afterglow when hit (can cause hit lag with larger textures) + --[[ add healthy afterglow when hit (causes lag with large textures) minetest.after(0.1, function() if not self.object:get_luaentity() then return end - self.object:settexturemod("^[colorize:#c9900070") + self.object:set_texture_mod("^[colorize:#c9900070") - core.after(0.3, function() - self.object:settexturemod("") + minetest.after(0.3, function() + if not self.object:get_luaentity() then return end + self.object:set_texture_mod(self.texture_mods) end) end) ]] @@ -2814,7 +2995,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) local v = self.object:get_velocity() -- sanity check - if not v then return end + if not v then return true end local kb = damage or 1 local up = 2 @@ -2829,10 +3010,8 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) dir = dir or {x = 0, y = 0, z = 0} -- use tool knockback value or default - kb = tool_capabilities.damage_groups["knockback"] or kb -- (kb * 1.5) - if kb > 10 then - kb = 10 - end + kb = tool_capabilities.damage_groups["knockback"] or kb + self.object:set_velocity({ x = dir.x * kb, y = up, @@ -2847,20 +3026,8 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) and self.order ~= "stand" then local lp = hitter:get_pos() - local s = self.object:get_pos() - local vec = { - x = lp.x - s.x, - y = lp.y - s.y, - z = lp.z - s.z - } + local yaw = yaw_to_pos(self, lp, 3) - local yaw = (atan(vec.z / vec.x) + 3 * pi / 2) - self.rotate - - if lp.x > s.x then - yaw = yaw + pi - end - - yaw = self:set_yaw(yaw, 6) self.state = "runaway" self.runaway_timer = 0 self.following = nil @@ -2874,15 +3041,17 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) and self.child == false and self.attack_players == true and hitter:get_player_name() ~= self.owner - and not mobs.invis[ name ] then + and not is_invisible(self, name) + and self.object ~= hitter then -- attack whoever punched mob self.state = "" self:do_attack(hitter) -- alert others to the attack - local objs = minetest.get_objects_inside_radius(hitter:get_pos(), self.view_range) - local obj = nil + local objs = minetest.get_objects_inside_radius( + hitter:get_pos(), self.view_range) + local obj for n = 1, #objs do @@ -2890,11 +3059,13 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) if obj and obj._cmi_is_mob then - -- only alert members of same mob + -- only alert members of same mob and assigned helper if obj.group_attack == true and obj.state ~= "attack" and obj.owner ~= name - and obj.name == self.name then + and (obj.name == self.name + or obj.name == self.group_helper) then + obj:do_attack(hitter) end @@ -2909,7 +3080,14 @@ end -- get entity staticdata -function mob_class:get_staticdata() +function mob_class:mob_staticdata() + + -- this handles mob count for mobs activated, unloaded, reloaded + if active_limit > 0 and self.active_toggle then + active_mobs = active_mobs + self.active_toggle + self.active_toggle = -self.active_toggle +--print("-- staticdata", active_mobs, active_limit, self.active_toggle) + end -- remove mob when out of range unless tamed if remove_far @@ -2919,13 +3097,11 @@ function mob_class:get_staticdata() and not self.tamed and self.lifetimer < 20000 then - --print ("REMOVED " .. self.name) - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.object:remove() - end +--print("REMOVED " .. self.name) - return ""-- nil + remove_mob(self, true) + + return minetest.serialize({remove_ok = true, static_save = true}) end self.remove_ok = true @@ -2934,30 +3110,32 @@ function mob_class:get_staticdata() self.state = "stand" -- used to rotate older mobs - if self.drawtype - and self.drawtype == "side" then - self.rotate = math.rad(90) + if self.drawtype and self.drawtype == "side" then + self.rotate = rad(90) end if use_cmi then - self.serialized_cmi_components = cmi.serialize_components(self._cmi_components) + self.serialized_cmi_components = cmi.serialize_components( + self._cmi_components) end - local tmp = {} + local tmp, t = {} for _,stat in pairs(self) do - local t = type(stat) + t = type(stat) if t ~= "function" and t ~= "nil" and t ~= "userdata" + and _ ~= "object" and _ ~= "_cmi_components" then tmp[_] = self[_] end end - --print('===== '..self.name..'\n'.. dump(tmp)..'\n=====\n') +--print('===== '..self.name..'\n'.. dump(tmp)..'\n=====\n') + return minetest.serialize(tmp) end @@ -2965,13 +3143,24 @@ end -- activate mob and reload settings function mob_class:mob_activate(staticdata, def, dtime) + -- if dtime == 0 then entity has just been created + -- anything higher means it is respawning (thanks SorceryKid) + if dtime == 0 and active_limit > 0 then + self.active_toggle = 1 + end + + -- remove mob if not tamed and mob total reached + if active_limit > 0 and active_mobs >= active_limit and not self.tamed then + + remove_mob(self) +--print("-- mob limit reached, removing " .. self.name) + return + end + -- remove monsters in peaceful mode - if self.type == "monster" - and peaceful_only then - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.object:remove() - end + if self.type == "monster" and peaceful_only then + + remove_mob(self, true) return end @@ -2980,8 +3169,18 @@ function mob_class:mob_activate(staticdata, def, dtime) local tmp = minetest.deserialize(staticdata) if tmp then + + local t + for _,stat in pairs(tmp) do - self[_] = stat + + t = type(stat) + + if t ~= "function" + and t ~= "nil" + and t ~= "userdata" then + self[_] = stat + end end end @@ -2999,7 +3198,7 @@ function mob_class:mob_activate(staticdata, def, dtime) def.textures = {def.textures} end - self.base_texture = def.textures and def.textures[random(1, #def.textures)] + self.base_texture = def.textures and def.textures[random(#def.textures)] self.base_mesh = def.mesh self.base_size = self.visual_size self.base_colbox = self.collisionbox @@ -3019,45 +3218,33 @@ function mob_class:mob_activate(staticdata, def, dtime) local selbox = self.base_selbox -- specific texture if gotten - if self.gotten == true - and def.gotten_texture then + if self.gotten == true and def.gotten_texture then textures = def.gotten_texture end -- specific mesh if gotten - if self.gotten == true - and def.gotten_mesh then + if self.gotten == true and def.gotten_mesh then mesh = def.gotten_mesh end -- set child objects to half size if self.child == true then - vis_size = { - x = self.base_size.x * .5, - y = self.base_size.y * .5, - } + vis_size = {x = self.base_size.x * .5, y = self.base_size.y * .5} if def.child_texture then textures = def.child_texture[1] end colbox = { - self.base_colbox[1] * .5, - self.base_colbox[2] * .5, - self.base_colbox[3] * .5, - self.base_colbox[4] * .5, - self.base_colbox[5] * .5, - self.base_colbox[6] * .5 - } + self.base_colbox[1] * .5, self.base_colbox[2] * .5, + self.base_colbox[3] * .5, self.base_colbox[4] * .5, + self.base_colbox[5] * .5, self.base_colbox[6] * .5} + selbox = { - self.base_selbox[1] * .5, - self.base_selbox[2] * .5, - self.base_selbox[3] * .5, - self.base_selbox[4] * .5, - self.base_selbox[5] * .5, - self.base_selbox[6] * .5 - } + self.base_selbox[1] * .5, self.base_selbox[2] * .5, + self.base_selbox[3] * .5, self.base_selbox[4] * .5, + self.base_selbox[5] * .5, self.base_selbox[6] * .5} end if self.health == 0 then @@ -3072,8 +3259,18 @@ function mob_class:mob_activate(staticdata, def, dtime) self.path.following = false -- currently following path? self.path.stuck_timer = 0 -- if stuck for too long search for path + -- Armor groups (immortal = 1 for custom damage handling) + local armor + if type(self.armor) == "table" then + armor = table_copy(self.armor) + armor.immortal = 1 + else + armor = {immortal = 1, fleshy = self.armor} + --armor = {fleshy = self.armor} + end + self.object:set_armor_groups(armor) + -- mob defaults - self.object:set_armor_groups({immortal = 1, fleshy = self.armor}) self.old_y = self.object:get_pos().y self.old_health = self.health self.sounds.distance = self.sounds.distance or 10 @@ -3083,6 +3280,7 @@ function mob_class:mob_activate(staticdata, def, dtime) self.selectionbox = selbox self.visual_size = vis_size self.standing_in = "air" + self.standing_on = "air" -- check existing nametag if not self.nametag then @@ -3091,149 +3289,23 @@ function mob_class:mob_activate(staticdata, def, dtime) -- set anything changed above self.object:set_properties(self) - if self.name == "mobs:dog" then - self.object:set_properties({infotext=self.owner.."'s Dog"}) - if self.metadata == 1 then - self.object:set_properties({textures={"mobs_dog.png"}}) - end - if self.metadata == 2 then - self.object:set_properties({textures={"mobs_dog2.png"}}) - end - if self.metadata2 == 1 then - self.walk_velocity = 1 - self.run_velocity = 3 - self.jump = true - end - if self.metadata2 == 2 then - self.walk_velocity = 0 - self.run_velocity = 0 - self.jump = false - end - end - if self.name == "mobs:dragon" then - self.object:set_properties({infotext=self.owner.."'s Dragon"}) - if self.metadata == 1 then - self.object:set_properties({textures={"mobs_dragon_red.png"}}) - end - if self.metadata == 2 then - self.object:set_properties({textures={"mobs_dragon_yellow.png"}}) - end - if self.metadata == 3 then - self.object:set_properties({textures={"mobs_dragon_blue.png"}}) - end - if self.metadata == 4 then - self.object:set_properties({textures={"mobs_dragon_green.png"}}) - end - if self.metadata2 == 1 then - self.walk_velocity = 1 - self.run_velocity = 3 - self.jump = true - end - if self.metadata2 == 2 then - self.walk_velocity = 0 - self.run_velocity = 0 - self.jump = false - end - end - if self.name == "mobs:cat" then - self.object:set_properties({infotext=self.owner.."'s Cat"}) - if self.metadata == 1 then - self.object:set_properties({textures={"mobs_kitten4.png"}}) - end - if self.metadata == 2 then - self.object:set_properties({textures={"mobs_kitten.png"}}) - end - if self.metadata == 3 then - self.object:set_properties({textures={"mobs_kitten2.png"}}) - end - if self.metadata == 4 then - self.object:set_properties({textures={"mobs_kitten3.png"}}) - end - if self.metadata2 == 1 then - self.walk_velocity = 1 - self.run_velocity = 3 - self.jump = true - end - if self.metadata2 == 2 then - self.walk_velocity = 0 - self.run_velocity = 0 - self.jump = false - end - end - if self.name == "mobs:sheep" then - if self.owner then - self.object:set_properties({infotext=self.owner.."'s Sheep"}) - if minetest.get_player_by_name(self.owner) then - if self.metadata2 == 1 then - self.walk_velocity = 1 - self.run_velocity = 3 - self.jump = true - - end - if self.metadata2 == 2 then - self.walk_velocity = 0 - self.run_velocity = 0 - self.jump = false - end - end - end - end - if self.name == "mobs:knight_1248" then - self.object:set_properties({infotext=self.owner.."'s 1248 Knight"}) - if self.owner then - if self.metadata2 == 1 then - self.walk_velocity = 1 - self.run_velocity = 3 - self.jump = true - - end - if self.metadata2 == 2 then - self.walk_velocity = 0 - self.run_velocity = 0 - self.jump = false - end - end - end - if self.name == "mobs:fox" then - self.object:set_properties({infotext=self.owner.."'s Fox"}) - if self.metadata == 1 then - self.object:set_properties({textures={"mobs_fox.png"}}) - end - if self.metadata == 2 then - self.object:set_properties({textures={"mobs_fox1.png"}}) - end - if self.metadata2 == 1 then - self.walk_velocity = 1 - self.run_velocity = 3 - self.jump = true - end - if self.metadata2 == 2 then - self.walk_velocity = 0 - self.run_velocity = 0 - self.jump = false - end - end - if self.name == "mobs:tortoise" then - self.object:set_properties({infotext=self.owner.."'s Tortoise"}) - if self.metadata2 == 1 then - self.walk_velocity = 1 - self.run_velocity = 3 - self.jump = true - end - if self.metadata2 == 2 then - self.walk_velocity = 0 - self.run_velocity = 0 - self.jump = false - end - end + first_activate(self) self:set_yaw((random(0, 360) - 180) / 180 * pi, 6) self:update_tag() self:set_animation("stand") + -- apply any texture mods + self.object:set_texture_mod(self.texture_mods) + + -- set 5.x flag to remove monsters when map area unloaded + if remove_far and self.type == "monster" then + self.static_save = false + end + -- run on_spawn function if found if self.on_spawn and not self.on_spawn_run then if self.on_spawn(self) then - self.on_spawn_run = true -- if true, set flag to run once only + self.on_spawn_run = true -- if true, set flag to run once only end end @@ -3243,7 +3315,8 @@ function mob_class:mob_activate(staticdata, def, dtime) end if use_cmi then - self._cmi_components = cmi.activate_components(self.serialized_cmi_components) + self._cmi_components = cmi.activate_components( + self.serialized_cmi_components) cmi.notify_activate(self.object, dtime) end end @@ -3280,10 +3353,8 @@ function mob_class:mob_expire(pos, dtime) -- S("lifetimer expired, removed @1", self.name)) effect(pos, 15, "tnt_smoke.png", 2, 4, 2, 0) - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.object:remove() - end + + remove_mob(self, true) return end @@ -3292,371 +3363,26 @@ end -- main mob function -function mob_class:on_step(dtime) - self.metadata3 = self.metadata3 + dtime - if self.metadata3 > 1 then - self.metadata3 = 0 - if self.name == "mobs:dog" then - local pos = self.object:getpos() - if minetest.get_player_by_name(self.owner) then - local inv = minetest.get_player_by_name(self.owner):get_inventory() - inv:set_size("dog",8) - for _,object in ipairs(minetest.get_objects_inside_radius(pos, 15)) do - if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then - if inv and inv:room_for_item("dog", ItemStack(object:get_luaentity().itemstring)) then - if ItemStack(object:get_luaentity().itemstring):get_name() == "tutorial:geschenkpapier" or ItemStack(object:get_luaentity().itemstring):get_name() == "tutorial:geschenkpapier_death" or ItemStack(object:get_luaentity().itemstring):get_name() == "tutorial:dna_string" then - inv:add_item("dog", ItemStack(object:get_luaentity().itemstring)) - object:remove() - end - end - end - end - end - end - if self.name == "mobs:cat" then - local pos = self.object:getpos() - if minetest.get_player_by_name(self.owner) then - local inv = minetest.get_player_by_name(self.owner):get_inventory() - inv:set_size("cat",8) - for _,object in ipairs(minetest.get_objects_inside_radius(pos, 15)) do - if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then - if inv and inv:room_for_item("cat", ItemStack(object:get_luaentity().itemstring)) then - if ItemStack(object:get_luaentity().itemstring):get_name() == "tutorial:geschenkpapier" or ItemStack(object:get_luaentity().itemstring):get_name() == "tutorial:geschenkpapier_death" or ItemStack(object:get_luaentity().itemstring):get_name() == "tutorial:dna_string" then - inv:add_item("cat", ItemStack(object:get_luaentity().itemstring)) - object:remove() - end - end - end - end - end - end +function mob_class:on_step(dtime, moveresult) + first_step(self,dtime) + --[[ moveresult contains this for physical mobs + { + touching_ground = boolean, + collides = boolean, + standing_on_object = boolean, + collisions = { + { + type = string, -- "node" or "object", + axis = string, -- "x", "y" or "z" + node_pos = vector, -- if type is "node" + object = ObjectRef, -- if type is "object" + old_velocity = vector, + new_velocity = vector, + }} + }]] + +if self.state == "die" then return end ---------------- - if self.name == "mobs:dragon" then - if self.owner and minetest.get_player_by_name(self.owner) then - minetest.get_player_by_name(self.owner):set_attribute("dragonx", ""..math.floor(self.object:getpos().x+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("dragony", ""..math.floor(self.object:getpos().y+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("dragonz", ""..math.floor(self.object:getpos().z+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("dragon_meta1", ""..self.metadata) - minetest.get_player_by_name(self.owner):set_attribute("dragon_meta2", ""..self.metadata2) - end - end - if self.name == "mobs:sheep" then - if self.owner and minetest.get_player_by_name(self.owner) then - minetest.get_player_by_name(self.owner):set_attribute("sheepx", ""..math.floor(self.object:getpos().x+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("sheepy", ""..math.floor(self.object:getpos().y+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("sheepz", ""..math.floor(self.object:getpos().z+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("sheep_meta1", ""..self.metadata) - minetest.get_player_by_name(self.owner):set_attribute("sheep_meta2", ""..self.metadata2) - - end - end - if self.name == "mobs:fox" then - if self.owner and minetest.get_player_by_name(self.owner) then - minetest.get_player_by_name(self.owner):set_attribute("foxx", ""..math.floor(self.object:getpos().x+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("foxy", ""..math.floor(self.object:getpos().y+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("foxz", ""..math.floor(self.object:getpos().z+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("fox_meta1", ""..self.metadata) - minetest.get_player_by_name(self.owner):set_attribute("fox_meta2", ""..self.metadata2) - end - end - if self.name == "mobs:tortoise" then - if self.owner and minetest.get_player_by_name(self.owner) then - minetest.get_player_by_name(self.owner):set_attribute("tortoisex", ""..math.floor(self.object:getpos().x+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("tortoisey", ""..math.floor(self.object:getpos().y+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("tortoisez", ""..math.floor(self.object:getpos().z+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("tortoise_meta1", ""..self.metadata) - minetest.get_player_by_name(self.owner):set_attribute("tortoise_meta2", ""..self.metadata2) - end - end - if self.name == "mobs:knight_1248" then - if self.owner and minetest.get_player_by_name(self.owner) then - minetest.get_player_by_name(self.owner):set_attribute("knightx", ""..math.floor(self.object:getpos().x+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("knighty", ""..math.floor(self.object:getpos().y+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("knightz", ""..math.floor(self.object:getpos().z+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("knight_meta1", ""..self.metadata) - minetest.get_player_by_name(self.owner):set_attribute("knight_meta2", ""..self.metadata2) - end - end - if self.name == "mobs:dog" then - if self.owner and minetest.get_player_by_name(self.owner) then - minetest.get_player_by_name(self.owner):set_attribute("dogx", ""..math.floor(self.object:getpos().x+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("dogy", ""..math.floor(self.object:getpos().y+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("dogz", ""..math.floor(self.object:getpos().z+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("dog_meta1", ""..self.metadata) - minetest.get_player_by_name(self.owner):set_attribute("dog_meta2", ""..self.metadata2) - end - end - if self.name == "mobs:cat" then - if self.owner and minetest.get_player_by_name(self.owner) then - minetest.get_player_by_name(self.owner):set_attribute("catx", ""..math.floor(self.object:getpos().x+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("caty", ""..math.floor(self.object:getpos().y+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("catz", ""..math.floor(self.object:getpos().z+0.5)) - minetest.get_player_by_name(self.owner):set_attribute("cat_meta1", ""..self.metadata) - minetest.get_player_by_name(self.owner):set_attribute("cat_meta2", ""..self.metadata2) - end - end - - if self.name == "mobs:dog" and self.metadata2 == 1 then - local pos = self.object:getpos() - local all_objects = minetest.get_objects_inside_radius(pos, 15) - local players = {} - local k = 0 - local _,obj - for _,obj in ipairs(all_objects) do - if obj:is_player() then - if self.owner == obj:get_player_name() then - k = 1 - end - end - end - if k == 0 then - if minetest.get_player_by_name(self.owner) then - self.object:setpos({x = minetest.get_player_by_name(self.owner):getpos().x, y = minetest.get_player_by_name(self.owner):getpos().y+1, z = minetest.get_player_by_name(self.owner):getpos().z+1}) - end - end - end - if self.name == "mobs:cat" and self.metadata2 == 1 then - local pos = self.object:getpos() - local all_objects = minetest.get_objects_inside_radius(pos, 15) - local players = {} - local k = 0 - local _,obj - for _,obj in ipairs(all_objects) do - if obj:is_player() then - if self.owner == obj:get_player_name() then - k = 1 - end - end - end - if k == 0 then - if minetest.get_player_by_name(self.owner) then - self.object:setpos({x = minetest.get_player_by_name(self.owner):getpos().x, y = minetest.get_player_by_name(self.owner):getpos().y+1, z = minetest.get_player_by_name(self.owner):getpos().z+1}) - end - end - end - if self.name == "mobs:dragon" and self.metadata2 == 1 then - local pos = self.object:getpos() - local all_objects = minetest.get_objects_inside_radius(pos, 15) - local players = {} - local k = 0 - local _,obj - for _,obj in ipairs(all_objects) do - if obj:is_player() then - if self.owner == obj:get_player_name() then - k = 1 - end - end - end - if k == 0 then - if self.owner then - if minetest.get_player_by_name(self.owner) then - minetest.get_player_by_name(self.owner):get_inventory():set_size("dragon2",1) - self.object:setpos({x = minetest.get_player_by_name(self.owner):getpos().x, y = minetest.get_player_by_name(self.owner):getpos().y+1, z = minetest.get_player_by_name(self.owner):getpos().z+1}) - local numd = minetest.get_player_by_name(self.owner):get_inventory():get_stack("dragon2", 1):get_count() - if numd > 25 then - if minetest.get_player_by_name(self.owner):get_inventory():get_stack("dragon", 1):get_name() == "tutorial:dragon_crystal" then - minetest.get_player_by_name(self.owner):get_inventory():add_item("main", "tutorial:geschenk_gem") - else - minetest.get_player_by_name(self.owner):get_inventory():add_item("main", "tutorial:geschenk_dragon") - end - minetest.get_player_by_name(self.owner):get_inventory():set_stack("dragon2", 1, "") - else - minetest.get_player_by_name(self.owner):get_inventory():set_stack("dragon2", 1, "default:dirt "..1+numd) - end - end - end - end - end - if self.name == "mobs:sheep" and self.metadata2 == 1 then - local pos = self.object:getpos() - local all_objects = minetest.get_objects_inside_radius(pos, 15) - local players = {} - local k = 0 - local _,obj - for _,obj in ipairs(all_objects) do - if obj:is_player() then - if self.owner == obj:get_player_name() then - k = 1 - end - end - end - if k == 0 then - if self.owner then - if minetest.get_player_by_name(self.owner) then - minetest.get_player_by_name(self.owner):get_inventory():set_size("sheep2",1) - minetest.get_player_by_name(self.owner):get_inventory():set_size("sheep3",1) - self.object:setpos({x = minetest.get_player_by_name(self.owner):getpos().x, y = minetest.get_player_by_name(self.owner):getpos().y+1, z = minetest.get_player_by_name(self.owner):getpos().z+1}) - local numd = minetest.get_player_by_name(self.owner):get_inventory():get_stack("sheep2", 1):get_count() - if numd > 25 then - minetest.get_player_by_name(self.owner):get_inventory():add_item("main", minetest.get_player_by_name(self.owner):get_inventory():get_stack("sheep3", 1)) - minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep2", 1, "") - else - minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep2", 1, "default:dirt "..1+numd) - end - end - end - end - end - if self.name == "mobs:knight_1248" and self.metadata2 == 1 then - local pos = self.object:getpos() - local all_objects = minetest.get_objects_inside_radius(pos, 15) - local players = {} - local k = 0 - local _,obj - for _,obj in ipairs(all_objects) do - if obj:is_player() then - if self.owner == obj:get_player_name() then - k = 1 - end - end - end - if k == 0 then - if minetest.get_player_by_name(self.owner) then - self.object:setpos({x = minetest.get_player_by_name(self.owner):getpos().x, y = minetest.get_player_by_name(self.owner):getpos().y+1, z = minetest.get_player_by_name(self.owner):getpos().z+1}) - end - end - end - if self.name == "mobs:fox" and self.metadata2 == 1 then - local pos = self.object:getpos() - local all_objects = minetest.get_objects_inside_radius(pos, 15) - local players = {} - local k = 0 - local _,obj - for _,obj in ipairs(all_objects) do - if obj:is_player() then - if self.owner == obj:get_player_name() then - k = 1 - end - end - end - if k == 0 then - if self.owner then - if minetest.get_player_by_name(self.owner) then - minetest.get_player_by_name(self.owner):get_inventory():set_size("fox",1) - minetest.get_player_by_name(self.owner):get_inventory():set_size("foxfox",1) - minetest.get_player_by_name(self.owner):get_inventory():set_size("r1248",6) - self.object:setpos({x = minetest.get_player_by_name(self.owner):getpos().x, y = minetest.get_player_by_name(self.owner):getpos().y+1, z = minetest.get_player_by_name(self.owner):getpos().z+1}) - local numd = minetest.get_player_by_name(self.owner):get_inventory():get_stack("fox", 1):get_count() - if numd == 50 then - minetest.get_player_by_name(self.owner):get_inventory():add_item("main", "tutorial:fox_schluessel") - minetest.get_player_by_name(self.owner):get_inventory():set_stack("fox", 1, "default:dirt 80") - elseif numd == 80 then - else - minetest.get_player_by_name(self.owner):get_inventory():set_stack("fox", 1, "default:dirt "..1+numd) - end - local numdd = minetest.get_player_by_name(self.owner):get_inventory():get_stack("foxfox", 1):get_count() - if numdd == 256 then - local ra = math.random(6) - if ra == 1 then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("r1248", 1, "default:dirt") - elseif ra == 2 then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("r1248", 2, "default:dirt") - elseif ra == 3 then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("r1248", 3, "default:dirt") - elseif ra == 4 then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("r1248", 4, "default:dirt") - elseif ra == 5 then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("r1248", 5, "default:dirt") - elseif ra == 6 then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("r1248", 6, "default:dirt") - end - minetest.get_player_by_name(self.owner):get_inventory():set_stack("foxfox", 1, "") - else - minetest.get_player_by_name(self.owner):get_inventory():set_stack("foxfox", 1, "default:dirt "..1+numdd) - end - end - end - end - end - if self.name == "mobs:tortoise" and self.metadata2 == 1 then - local pos = self.object:getpos() - local all_objects = minetest.get_objects_inside_radius(pos, 15) - local players = {} - local k = 0 - local _,obj - for _,obj in ipairs(all_objects) do - if obj:is_player() then - if self.owner == obj:get_player_name() then - k = 1 - end - end - end - if k == 0 then - if minetest.get_player_by_name(self.owner) then - self.object:setpos({x = minetest.get_player_by_name(self.owner):getpos().x, y = minetest.get_player_by_name(self.owner):getpos().y+1, z = minetest.get_player_by_name(self.owner):getpos().z+1}) - minetest.get_player_by_name(self.owner):get_inventory():set_size("tortoise2",1) - local numd = minetest.get_player_by_name(self.owner):get_inventory():get_stack("tortoise2", 1):get_count() - if numd > 25 then - if minetest.get_player_by_name(self.owner):get_inventory():get_stack("tortoise", 1):get_name() == "tutorial:dragon_crystal" then - minetest.get_player_by_name(self.owner):get_inventory():add_item("main", "tutorial:geschenk_gem2") - else - minetest.get_player_by_name(self.owner):get_inventory():add_item("main", "tutorial:geschenk_tortoise") - end - minetest.get_player_by_name(self.owner):get_inventory():set_stack("tortoise2", 1, "") - else - minetest.get_player_by_name(self.owner):get_inventory():set_stack("tortoise2", 1, "default:dirt "..1+numd) - end - end - end - end - if self.name == "mobs:sheep" then - if self.owner then - self.object:set_properties({infotext=self.owner.."'s Sheep"}) - if minetest.get_player_by_name(self.owner) then - local col = minetest.get_player_by_name(self.owner):get_inventory():get_stack("sheep", 1):get_name() - if col == "dye:white" then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:white") - self.object:set_properties({textures={"mobs_sheep_white.png"}}) - elseif col == "dye:grey" then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:grey") - self.object:set_properties({textures={"mobs_sheep_grey.png"}}) - elseif col == "dye:dark_grey" then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:dark_grey") - self.object:set_properties({textures={"mobs_sheep_dark_grey.png"}}) - elseif col == "dye:black" then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:black") - self.object:set_properties({textures={"mobs_sheep_black.png"}}) - elseif col == "dye:violet" then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:violet") - self.object:set_properties({textures={"mobs_sheep_violet.png"}}) - elseif col == "dye:blue" then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:blue") - self.object:set_properties({textures={"mobs_sheep_blue.png"}}) - elseif col == "dye:cyan" then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:cyan") - self.object:set_properties({textures={"mobs_sheep_cyan.png"}}) - elseif col == "dye:dark_green" then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:dark_green") - self.object:set_properties({textures={"mobs_sheep_dark_green.png"}}) - elseif col == "dye:green" then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:green") - self.object:set_properties({textures={"mobs_sheep_green.png"}}) - elseif col == "dye:yellow" then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:yellow") - self.object:set_properties({textures={"mobs_sheep_yellow.png"}}) - elseif col == "dye:brown" then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:brown") - self.object:set_properties({textures={"mobs_sheep_brown.png"}}) - elseif col == "dye:orange" then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:orange") - self.object:set_properties({textures={"mobs_sheep_orange.png"}}) - elseif col == "dye:red" then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:red") - self.object:set_properties({textures={"mobs_sheep_red.png"}}) - elseif col == "dye:magenta" then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:magenta") - self.object:set_properties({textures={"mobs_sheep_magenta.png"}}) - elseif col == "dye:pink" then - minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:pink") - self.object:set_properties({textures={"mobs_sheep_pink.png"}}) - else - minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"") - self.object:set_properties({textures={"mobs_sheep.png"}}) - end - end - end - end - end if use_cmi then cmi.notify_step(self.object, dtime) end @@ -3683,11 +3409,16 @@ function mob_class:on_step(dtime) -- what is mob standing in? self.standing_in = node_ok({ x = pos.x, y = pos.y + y_level + 0.25, z = pos.z}, "air").name --- print ("standing in " .. self.standing_in) + + self.standing_on = node_ok({ + x = pos.x, y = pos.y + y_level - 0.25, z = pos.z}, "air").name + +--print("standing in " .. self.standing_in) -- if standing inside solid block then jump to escape - if minetest.registered_nodes[self.standing_in].walkable and - minetest.registered_nodes[self.standing_in].drawtype == "normal" then + if minetest.registered_nodes[self.standing_in].walkable + and minetest.registered_nodes[self.standing_in].drawtype + == "normal" then self.object:set_velocity({ x = 0, @@ -3703,15 +3434,16 @@ function mob_class:on_step(dtime) self:set_velocity(0) end - -- check for mob expiration (0.25 instead of dtime since were in a timer) + -- has mob expired (0.25 instead of dtime since were in a timer) self:mob_expire(pos, 0.25) end - -- check if falling, flying, floating - self:falling(pos) + -- check if falling, flying, floating and return if player died + if self:falling(pos) then + return + end -- smooth rotation by ThomasMonroe314 - if self.delay and self.delay > 0 then if self.delay == 1 then @@ -3746,8 +3478,6 @@ function mob_class:on_step(dtime) self.object:set_yaw(yaw) end - -- end rotation - -- knockback timer if self.pause_timer > 0 then @@ -3783,7 +3513,7 @@ function mob_class:on_step(dtime) end -- mob plays random sound at times - if random(1, 100) == 1 then + if random(100) == 1 then self:mob_sound(self.sounds.random) end @@ -3808,7 +3538,7 @@ function mob_class:on_step(dtime) self:follow_flop() - self:do_states(dtime) + if self:do_states(dtime) then return end self:do_jump() @@ -3817,266 +3547,11 @@ function mob_class:on_step(dtime) self:do_stay_near() end -function update(self, clicker) - if self.name == "mobs:dog" then - if self.owner ~= clicker:get_player_name() then - local player_name = clicker:get_player_name() - local formspec = "size[3,1]" - .."label[0,0;You are not the owner!!]" - .."background[3,1;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Dog", formspec) - else - local inv = minetest.get_player_by_name(self.owner):get_inventory() - inv:set_size("dog",8) - local player_name = clicker:get_player_name() - local formspec = "size[8,8.5]" - .."list[current_player;dog;0,2;8,1]" - .."list[current_player;main;0,4.5;8,4]" - .."listring[current_player;dog]" - .."listring[current_player;main]" - .."background[8,8.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - if self.metadata == 1 then - formspec = formspec .."button[0,0;2.0,0.5;texture11;Texture:brown]" - end - if self.metadata == 2 then - formspec = formspec .."button[0,0;2.0,0.5;texture12;Texture:grey]" - end - if self.metadata2 == 1 then - formspec = formspec .."button[3,0;2.0,0.5;move1;Move:stand]" - end - if self.metadata2 == 2 then - formspec = formspec .."button[3,0;2.0,0.5;move2;Move:follow]" - end - minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Dog", formspec) - end - end - if self.name == "mobs:cat" then - if self.owner ~= clicker:get_player_name() then - local player_name = clicker:get_player_name() - local formspec = "size[3,1]" - .."label[0,0;You are not the owner!!]" - .."background[3,1;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."background[8,8.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Cat", formspec) - else - local inv = minetest.get_player_by_name(self.owner):get_inventory() - inv:set_size("cat",8) - local player_name = clicker:get_player_name() - local formspec = "size[8,8.5]" - .."list[current_player;cat;0,2;8,1]" - .."list[current_player;main;0,4.5;8,4]" - .."listring[current_player;cat]" - .."listring[current_player;main]" - .."background[8,8.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - if self.metadata == 1 then - formspec = formspec .."button[0,0;2.0,0.5;texture21;Texture:ginger]" - end - if self.metadata == 2 then - formspec = formspec .."button[0,0;2.0,0.5;texture22;Texture:sandy]" - end - if self.metadata == 3 then - formspec = formspec .."button[0,0;2.0,0.5;texture23;Texture:splotchy]" - end - if self.metadata == 4 then - formspec = formspec .."button[0,0;2.0,0.5;texture24;Texture:striped]" - end - if self.metadata2 == 1 then - formspec = formspec .."button[3,0;2.0,0.5;move1;Move:stand]" - end - if self.metadata2 == 2 then - formspec = formspec .."button[3,0;2.0,0.5;move2;Move:follow]" - end - minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Cat", formspec) - end - end - if self.name == "mobs:dragon" then - if self.owner ~= clicker:get_player_name() then - local player_name = clicker:get_player_name() - local formspec = "size[3,1]" - .."label[0,0;You are not the owner!!]" - .."background[3,1;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Dragon", formspec) - else - local inv = minetest.get_player_by_name(self.owner):get_inventory() - local player_name = clicker:get_player_name() - inv:set_size("dragon", 1) - local formspec = "size[8,8.5]" - .."list[current_player;dragon;3.5,2.5;1,1]" - .."label[1,1;Dragon produce a dragon gift/gem gift lv.1 after some time]" - .."label[2.4,3.5;Regnum crystal for gem gift]" - .."list[current_player;main;0,4.5;8,4]" - .."listring[current_player;dragon]" - .."listring[current_player;main]" - .."background[8,8.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - if self.metadata == 1 then - formspec = formspec .."button[0,0;2.0,0.5;texture31;Texture:yellow]" - end - if self.metadata == 2 then - formspec = formspec .."button[0,0;2.0,0.5;texture32;Texture:blue]" - end - if self.metadata == 3 then - formspec = formspec .."button[0,0;2.0,0.5;texture33;Texture:green]" - end - if self.metadata == 4 then - formspec = formspec .."button[0,0;2.0,0.5;texture34;Texture:black]" - end - if self.metadata == 5 then - formspec = formspec .."button[0,0;2.0,0.5;texture35;Texture:great]" - end - if self.metadata == 6 then - formspec = formspec .."button[0,0;2.0,0.5;texture36;Texture:red]" - end - if self.metadata2 == 1 then - formspec = formspec .."button[3,0;2.0,0.5;move1;Move:stand]" - end - if self.metadata2 == 2 then - formspec = formspec .."button[3,0;2.0,0.5;move2;Move:follow]" - end - minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Dragon", formspec) - end - end - if self.name == "mobs:sheep" then - if self.owner ~= clicker:get_player_name() then - local player_name = clicker:get_player_name() - local formspec = "size[3,1]" - .."label[0,0;You are not the owner!!]" - .."background[3,1;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Sheep", formspec) - else - local inv = minetest.get_player_by_name(self.owner):get_inventory() - inv:set_size("sheep",1) - inv:set_size("sheep2",1) - inv:set_size("sheep3",1) - local player_name = clicker:get_player_name() - local formspec = "size[8,8.5]" - .."list[current_player;main;0,3.5;8,4]" - .."list[current_player;sheep;3.5,1;1,1]" - .."label[3.5,2;Set Color]" - .."listring[current_player;sheep]" - .."listring[current_player;main]" - .."background[8,8.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - if self.metadata2 == 1 then - formspec = formspec .."button[0,0;2.0,0.5;move1;Move:stand]" - end - if self.metadata2 == 2 then - formspec = formspec .."button[0,0;2.0,0.5;move2;Move:follow]" - end - minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Sheep", formspec) - end - end - if self.name == "mobs:fox" then - if self.owner ~= clicker:get_player_name() then - local player_name = clicker:get_player_name() - local formspec = "size[3,1]" - .."label[0,0;You are not the owner!!]" - minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Fox", formspec) - else - local inv = minetest.get_player_by_name(self.owner):get_inventory() - - local player_name = clicker:get_player_name() - local formspec = "size[8,8.5]" - .."label[0,1.2;Fox produce a Foxkey and Treasures after some time]" - .."background[8,8.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - if self.metadata == 1 then - formspec = formspec .."button[0,0;2.0,0.5;texture41;Texture:light]" - end - if self.metadata == 2 then - formspec = formspec .."button[0,0;2.0,0.5;texture42;Texture:dark]" - end - if self.metadata2 == 1 then - formspec = formspec .."button[3,0;2.0,0.5;move1;Move:stand]" - end - if self.metadata2 == 2 then - formspec = formspec .."button[3,0;2.0,0.5;move2;Move:follow]" - end - minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Fox", formspec) - end - end - if self.name == "mobs:tortoise" then - if self.owner ~= clicker:get_player_name() then - local player_name = clicker:get_player_name() - local formspec = "size[3,1]" - .."label[0,0;You are not the owner!!]" - .."background[3,1;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Tortoise", formspec) - else - local inv = minetest.get_player_by_name(self.owner):get_inventory() - inv:set_size("tortoise", 1) - local player_name = clicker:get_player_name() - local formspec = "size[8,8.5]" - .."label[1,1;Tortoise produce a tortoise gift/gem gift lv.2 after some time]" - .."label[2.4,3.5;Regnum crystal for gem gift]" - .."list[current_player;main;0,4.5;8,4]" - .."list[current_player;tortoise;3.5,2.5;1,1]" - .."listring[current_player;tortoise]" - .."listring[current_player;main]" - .."background[8,8.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - if self.metadata2 == 1 then - formspec = formspec .."button[0,0;2.0,0.5;move1;Move:stand]" - end - if self.metadata2 == 2 then - formspec = formspec .."button[0,0;2.0,0.5;move2;Move:follow]" - end - minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Tortoise", formspec) - end - end - if self.name == "mobs:knight_1248" then - if self.owner ~= clicker:get_player_name() then - local player_name = clicker:get_player_name() - local formspec = "size[3,1]" - .."label[0,0;You are not the owner!!]" - .."background[3,1;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Knight", formspec) - else - local player_name = clicker:get_player_name() - local formspec = "size[8,8.5]" - .."background[8,8.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - if self.metadata2 == 1 then - formspec = formspec .."button[0,0;2.0,0.5;move1;Move:stand]" - end - if self.metadata2 == 2 then - formspec = formspec .."button[0,0;2.0,0.5;move2;Move:follow]" - end - formspec = formspec .."label[0,1;Hello my name is 1248]" - .."label[0,1.3;Bring me an empty color stick and we can leave this world]" - formspec = formspec .."button[3,4;2.0,0.5;leave;I've got color stick]" - minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Knight", formspec) - end - end -end -- default function when mobs are blown up with TNT function mob_class:on_blast(damage) - --print ("----- Damage", damage) +--print("-- blast damage", damage) self.object:punch(self.object, 1.0, { full_punch_interval = 1.0, @@ -4093,7 +3568,7 @@ mobs.spawning_mobs = {} -- register mob entity function mobs:register_mob(name, def) - mobs.spawning_mobs[name] = true + mobs.spawning_mobs[name] = {} minetest.register_entity(name, setmetatable({ @@ -4103,13 +3578,15 @@ minetest.register_entity(name, setmetatable({ attack_type = def.attack_type, fly = def.fly, fly_in = def.fly_in, + keep_flying = def.keep_flying, owner = def.owner, order = def.order, on_die = def.on_die, + on_flop = def.on_flop, do_custom = def.do_custom, jump_height = def.jump_height, drawtype = def.drawtype, -- DEPRECATED, use rotate instead - rotate = math.rad(def.rotate or 0), -- 0=front, 90=side, 180=back, 270=side2 + rotate = rad(def.rotate or 0), -- 0=front 90=side 180=back 270=side2 glow = def.glow, lifetimer = def.lifetimer, hp_min = max(1, (def.hp_min or 5) * difficulty), @@ -4129,6 +3606,8 @@ minetest.register_entity(name, setmetatable({ light_damage_max = def.light_damage_max, water_damage = def.water_damage, lava_damage = def.lava_damage, + fire_damage = def.fire_damage, + air_damage = def.air_damage, suffocation = def.suffocation, fall_damage = def.fall_damage, fall_speed = def.fall_speed, @@ -4157,6 +3636,7 @@ minetest.register_entity(name, setmetatable({ on_replace = def.on_replace, reach = def.reach, texture_list = def.textures, + texture_mods = def.texture_mods or "", child_texture = def.child_texture, docile_by_day = def.docile_by_day, fear_height = def.fear_height, @@ -4174,6 +3654,7 @@ minetest.register_entity(name, setmetatable({ dogshoot_count_max = def.dogshoot_count_max, dogshoot_count2_max = def.dogshoot_count2_max or def.dogshoot_count_max, group_attack = def.group_attack, + group_helper = def.group_helper, attack_monsters = def.attacks_monsters or def.attack_monsters, attack_animals = def.attack_animals, attack_players = def.attack_players, @@ -4183,6 +3664,8 @@ minetest.register_entity(name, setmetatable({ owner_loyal = def.owner_loyal, pushable = def.pushable, stay_near = def.stay_near, + randomly_turn = def.randomly_turn ~= false, + ignore_invisibility = def.ignore_invisibility, metadata = def.metadata, metadata2 = def.metadata2, @@ -4195,99 +3678,19 @@ minetest.register_entity(name, setmetatable({ on_breed = def.on_breed, on_grown = def.on_grown, + on_rightclick = function(self, clicker) update(self, clicker) end, + on_receive_fields = function(self, fields, sender) + receive_fields(self, fields, sender) + end, on_activate = function(self, staticdata, dtime) return self:mob_activate(staticdata, def, dtime) end, - on_receive_fields = function(self, fields, sender) - if self.owner == sender:get_player_name() then - if fields.leave then - - local player_name = sender:get_player_name() - if minetest.get_player_by_name(self.owner):get_inventory():contains_item("main", "tutorial:colorstick_empty") then - local formspec = "size[4,2.5]" - .."label[0,0;You have won Regnum]" - .."label[0,0.3;You have enough technology to leave this world]" - .."label[0,0.6;and to go to another.....]" - .."label[0,0.9;Thank you for playing Regnum]" - .."label[0,1.2;your 1248]" - .."background[4,2.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Knight", formspec) - end - else - if fields.texture11 then - self.object:set_properties({textures={"mobs_dog2.png"}}) - self.metadata = 2 - update(self, sender) - elseif fields.texture12 then - self.object:set_properties({textures={"mobs_dog.png"}}) - self.metadata = 1 - update(self, sender) - elseif fields.texture21 then - self.object:set_properties({textures={"mobs_kitten.png"}}) - self.metadata = 2 - update(self, sender) - elseif fields.texture22 then - self.object:set_properties({textures={"mobs_kitten2.png"}}) - self.metadata = 3 - update(self, sender) - elseif fields.texture23 then - self.object:set_properties({textures={"mobs_kitten3.png"}}) - self.metadata = 4 - update(self, sender) - elseif fields.texture24 then - self.object:set_properties({textures={"mobs_kitten4.png"}}) - self.metadata = 1 - update(self, sender) - elseif fields.texture31 then - self.object:set_properties({textures={"mobs_dragon_yellow.png"}}) - self.metadata = 2 - update(self, sender) - elseif fields.texture32 then - self.object:set_properties({textures={"mobs_dragon_blue.png"}}) - self.metadata = 3 - update(self, sender) - elseif fields.texture33 then - self.object:set_properties({textures={"mobs_dragon_green.png"}}) - self.metadata = 4 - update(self, sender) - elseif fields.texture34 then - self.object:set_properties({textures={"mobs_dragon_black.png"}}) - self.metadata = 5 - update(self, sender) - elseif fields.texture35 then - self.object:set_properties({textures={"mobs_dragon_great.png"}}) - self.metadata = 6 - update(self, sender) - elseif fields.texture36 then - self.object:set_properties({textures={"mobs_dragon_red.png"}}) - self.metadata = 1 - update(self, sender) - elseif fields.texture41 then - self.object:set_properties({textures={"mobs_fox1.png"}}) - self.metadata = 2 - update(self, sender) - elseif fields.texture42 then - self.object:set_properties({textures={"mobs_fox.png"}}) - self.metadata = 1 - update(self, sender) - elseif fields.move1 then - self.walk_velocity = 0 - self.run_velocity = 0 - self.metadata2 = 2 - update(self, sender) - elseif fields.move2 then - self.walk_velocity = 1 - self.run_velocity = 3 - self.metadata2 = 1 - update(self, sender) - end - end - end + + get_staticdata = function(self) + return self:mob_staticdata(self) end, }, mob_class_meta)) @@ -4323,24 +3726,184 @@ local count_mobs = function(pos, type) end +-- do we have enough space to spawn mob? (thanks wuzzy) +local can_spawn = function(pos, name) + + local ent = minetest.registered_entities[name] + local width_x = max(1, ceil(ent.collisionbox[4] - ent.collisionbox[1])) + local min_x, max_x + + if width_x % 2 == 0 then + max_x = floor(width_x / 2) + min_x = -(max_x - 1) + else + max_x = floor(width_x / 2) + min_x = -max_x + end + + local width_z = max(1, ceil(ent.collisionbox[6] - ent.collisionbox[3])) + local min_z, max_z + + if width_z % 2 == 0 then + max_z = floor(width_z / 2) + min_z = -(max_z - 1) + else + max_z = floor(width_z / 2) + min_z = -max_z + end + + local max_y = max(0, ceil(ent.collisionbox[5] - ent.collisionbox[2]) - 1) + local pos2 + + for y = 0, max_y do + for x = min_x, max_x do + for z = min_z, max_z do + + pos2 = {x = pos.x + x, y = pos.y + y, z = pos.z + z} + + if minetest.registered_nodes[node_ok(pos2).name].walkable == true then + return nil + end + end + end + end + + -- tweak X/Z spawn pos + if width_x % 2 == 0 then + pos.x = pos.x + 0.5 + end + + if width_z % 2 == 0 then + pos.z = pos.z + 0.5 + end + + return pos +end + +function mobs:can_spawn(pos, name) + return can_spawn(pos, name) +end + + -- global functions +function mobs:add_mob(pos, def) + + -- is mob actually registered? + if not mobs.spawning_mobs[def.name] + or not minetest.registered_entities[def.name] then +--print("--- mob doesn't exist", def.name) + return + end + + -- are we over active mob limit + if active_limit > 0 and active_mobs >= active_limit then +--print("--- active mob limit reached", active_mobs, active_limit) + return + end + + -- get total number of this mob in area + local num_mob, is_pla = count_mobs(pos, def.name) + + if not is_pla then +--print("--- no players within active area, will not spawn " .. def.name) + return + end + + local aoc = mobs.spawning_mobs[def.name] + and mobs.spawning_mobs[def.name].aoc or 1 + + if def.ignore_count ~= true and num_mob >= aoc then +--print("--- too many " .. def.name .. " in area", num_mob .. "/" .. aoc) + return + end + + local mob = minetest.add_entity(pos, def.name) + +--print("[mobs] Spawned " .. def.name .. " at " .. minetest.pos_to_string(pos)) + + local ent = mob:get_luaentity() + + if not ent then +--print("[mobs] entity not found " .. def.name) + return false + end + + if def.child then + + local textures = ent.base_texture + + -- using specific child texture (if found) + if ent.child_texture then + textures = ent.child_texture[1] + end + + -- and resize to half height + mob:set_properties({ + textures = textures, + visual_size = { + x = ent.base_size.x * .5, + y = ent.base_size.y * .5 + }, + collisionbox = { + ent.base_colbox[1] * .5, + ent.base_colbox[2] * .5, + ent.base_colbox[3] * .5, + ent.base_colbox[4] * .5, + ent.base_colbox[5] * .5, + ent.base_colbox[6] * .5 + }, + selectionbox = { + ent.base_selbox[1] * .5, + ent.base_selbox[2] * .5, + ent.base_selbox[3] * .5, + ent.base_selbox[4] * .5, + ent.base_selbox[5] * .5, + ent.base_selbox[6] * .5 + }, + }) + + ent.child = true + end + + if def.owner then + ent.tamed = true + ent.owner = def.owner + end + + if def.nametag then + + -- limit name entered to 64 characters long + if def.nametag:len() > 64 then + def.nametag = def.nametag:sub(1, 64) + end + + ent.nametag = def.nametag + + ent:update_tag() + end + + return ent +end + + function mobs:spawn_abm_check(pos, node, name) -- global function to add additional spawn checks -- return true to stop spawning mob end -function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, - interval, chance, aoc, min_height, max_height, day_toggle, on_spawn) +function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, interval, + chance, aoc, min_height, max_height, day_toggle, on_spawn, map_load) -- Do mobs spawn at all? - if not mobs_spawn then + if not mobs_spawn or not mobs.spawning_mobs[name] then +--print ("--- spawning not registered for " .. name) return end -- chance/spawn number override in minetest.conf for registered mob - local numbers = minetest.settings:get(name) + local numbers = settings:get(name) if numbers then numbers = numbers:split(",") @@ -4348,115 +3911,136 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, aoc = tonumber(numbers[2]) or aoc if chance == 0 then - minetest.log("warning", string.format("[mobs] %s has spawning disabled", name)) + minetest.log("warning", + string.format("[mobs] %s has spawning disabled", name)) return end - minetest.log("action", - string.format("[mobs] Chance setting for %s changed to %s (total: %s)", + minetest.log("action", string.format( + "[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc)) - end - minetest.register_abm({ + mobs.spawning_mobs[name].aoc = aoc - label = name .. " spawning", - nodenames = nodes, - neighbors = neighbors, - interval = interval, - chance = max(1, (chance * mob_chance_multiplier)), - catch_up = false, + local spawn_action = function(pos, node, active_object_count, + active_object_count_wider) - action = function(pos, node, active_object_count, active_object_count_wider) + -- use instead of abm's chance setting when using lbm + if map_load and random(max(1, (chance * mob_chance_multiplier))) > 1 then + return + end - -- is mob actually registered? - if not mobs.spawning_mobs[name] - or not minetest.registered_entities[name] then ---print ("--- mob doesn't exist", name) - return - end + -- use instead of abm's neighbor setting when using lbm + if map_load and not minetest.find_node_near(pos, 1, neighbors) then +--print("--- lbm neighbors not found") + return + end - -- additional custom checks for spawning mob - if mobs:spawn_abm_check(pos, node, name) == true then - return - end + -- is mob actually registered? + if not mobs.spawning_mobs[name] + or not minetest.registered_entities[name] then +--print("--- mob doesn't exist", name) + return + end - -- do not spawn if too many entities in area - if active_object_count_wider >= max_per_block then + -- are we over active mob limit + if active_limit > 0 and active_mobs >= active_limit then +--print("--- active mob limit reached", active_mobs, active_limit) + return + end + + -- additional custom checks for spawning mob + if mobs:spawn_abm_check(pos, node, name) == true then + return + end + + -- do not spawn if too many entities in area + if active_object_count_wider + and active_object_count_wider >= max_per_block then --print("--- too many entities in area", active_object_count_wider) - return - end + return + end - -- get total number of this mob in area - local num_mob, is_pla = count_mobs(pos, name) + -- get total number of this mob in area + local num_mob, is_pla = count_mobs(pos, name) - if not is_pla then ---print ("--- no players within active area, will not spawn " .. name) - return - end + if not is_pla then +--print("--- no players within active area, will not spawn " .. name) + return + end - if num_mob >= aoc then ---print ("--- too many " .. name .. " in area", num_mob .. "/" .. aoc) - return - end + if num_mob >= aoc then +--print("--- too many " .. name .. " in area", num_mob .. "/" .. aoc) + return + end -- if toggle set to nil then ignore day/night check - if day_toggle ~= nil then + if day_toggle ~= nil then - local tod = (minetest.get_timeofday() or 0) * 24000 + local tod = (minetest.get_timeofday() or 0) * 24000 - if tod > 4500 and tod < 19500 then - -- daylight, but mob wants night - if day_toggle == false then ---print ("--- mob needs night", name) - return - end - else - -- night time but mob wants day - if day_toggle == true then ---print ("--- mob needs day", name) - return - end + if tod > 4500 and tod < 19500 then + -- daylight, but mob wants night + if day_toggle == false then +--print("--- mob needs night", name) + return end - end - - -- spawn above node - pos.y = pos.y + 1 - - -- are we spawning within height limits? - if pos.y > max_height - or pos.y < min_height then ---print ("--- height limits not met", name, pos.y) - return - end - - -- are light levels ok? - local light = minetest.get_node_light(pos) - if not light - or light > max_light - or light < min_light then ---print ("--- light limits not met", name, light) - return - end - - -- only spawn away from player - local objs = minetest.get_objects_inside_radius(pos, 8) - - for n = 1, #objs do - - if objs[n]:is_player() then ---print ("--- player too close", name) + else + -- night time but mob wants day + if day_toggle == true then +--print("--- mob needs day", name) return end end + end + + -- spawn above node + pos.y = pos.y + 1 + + -- are we spawning within height limits? + if pos.y > max_height + or pos.y < min_height then +--print("--- height limits not met", name, pos.y) + return + end + + -- are light levels ok? + local light = minetest.get_node_light(pos) + if not light + or light > max_light + or light < min_light then +--print("--- light limits not met", name, light) + return + end + + -- mobs cannot spawn in protected areas when enabled + if not spawn_protected + and minetest.is_protected(pos, "") then +--print("--- inside protected area", name) + return + end + + -- only spawn a set distance away from player + local objs = minetest.get_objects_inside_radius(pos, mob_nospawn_range) + + for n = 1, #objs do + + if objs[n]:is_player() then +--print("--- player too close", name) + return + end + end + + local ent = minetest.registered_entities[name] + + -- should we check mob area for obstructions ? + if mob_area_spawn ~= true then -- do we have enough height clearance to spawn mob? - local ent = minetest.registered_entities[name] - local height = max(1, math.ceil( - (ent.collisionbox[5] or 0.25) - - (ent.collisionbox[2] or -0.25) - 1)) + local height = max(0, ent.collisionbox[5] - ent.collisionbox[2]) - for n = 0, height do + for n = 0, floor(height) do local pos2 = {x = pos.x, y = pos.y + n, z = pos.z} @@ -4465,31 +4049,60 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, return end end + else + -- returns position if we have enough space to spawn mob + pos = can_spawn(pos, name) + end - -- mobs cannot spawn in protected areas when enabled - if not spawn_protected - and minetest.is_protected(pos, "") then ---print ("--- inside protected area", name) - return - end + if pos then - -- spawn mob half block higher than ground - pos.y = pos.y + 0.5 + -- adjust for mob collision box + pos.y = pos.y + (ent.collisionbox[2] * -1) - 0.4 local mob = minetest.add_entity(pos, name) ---[[ - print ("[mobs] Spawned " .. name .. " at " - .. minetest.pos_to_string(pos) .. " on " - .. node.name .. " near " .. neighbors[1]) -]] + +-- print("[mobs] Spawned " .. name .. " at " +-- .. minetest.pos_to_string(pos) .. " on " +-- .. node.name .. " near " .. neighbors[1]) + if on_spawn then - - local ent = mob:get_luaentity() - - on_spawn(ent, pos) + on_spawn(mob:get_luaentity(), pos) end + else +--print("--- not enough space to spawn", name) end - }) + end + + + -- are we registering an abm or lbm? + if map_load == true then + + minetest.register_lbm({ + name = name .. "_spawning", + label = name .. " spawning", + nodenames = nodes, + run_at_every_load = false, + + action = function(pos, node) + spawn_action(pos, node) + end + }) + + else + + minetest.register_abm({ + label = name .. " spawning", + nodenames = nodes, + neighbors = neighbors, + interval = interval, + chance = max(1, (chance * mob_chance_multiplier)), + catch_up = false, + + action = function(pos, node, active_object_count, active_object_count_wider) + spawn_action(pos, node, active_object_count, active_object_count_wider) + end + }) + end end @@ -4502,7 +4115,7 @@ function mobs:register_spawn(name, nodes, max_light, min_light, chance, end --- MarkBu's spawn function +-- MarkBu's spawn function (USE this one please) function mobs:spawn(def) mobs:spawn_specific( @@ -4517,7 +4130,8 @@ function mobs:spawn(def) def.min_height or -31000, def.max_height or 31000, def.day_toggle, - def.on_spawn) + def.on_spawn, + def.on_map_load) end @@ -4536,9 +4150,11 @@ function mobs:register_arrow(name, def) hit_player = def.hit_player, hit_node = def.hit_node, hit_mob = def.hit_mob, + hit_object = def.hit_object, drop = def.drop or false, -- drops arrow as registered item when true - collisionbox = def.collisionbox or {0, 0, 0, 0, 0, 0}, + collisionbox = def.collisionbox or {-.1, -.1, -.1, .1, .1, .1}, timer = 0, + lifetime = def.lifetime or 4.5, switch = 0, owner_id = def.owner_id, rotate = def.rotate, @@ -4547,29 +4163,25 @@ function mobs:register_arrow(name, def) on_activate = def.on_activate, - on_punch = def.on_punch or function(self, hitter, tflp, tool_capabilities, dir) + on_punch = def.on_punch or function( + self, hitter, tflp, tool_capabilities, dir) end, on_step = def.on_step or function(self, dtime) - self.timer = self.timer + 1 + self.timer = self.timer + dtime local pos = self.object:get_pos() - if self.switch == 0 - or self.timer > 150 then - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.object:remove() ; -- print ("removed arrow") - end + if self.switch == 0 or self.timer > self.lifetime then + + self.object:remove() ; -- print("removed arrow") return end -- does arrow have a tail (fireball) - if def.tail - and def.tail == 1 - and def.tail_texture then + if def.tail and def.tail == 1 and def.tail_texture then minetest.add_particle({ pos = pos, @@ -4597,29 +4209,27 @@ function mobs:register_arrow(name, def) self.lastpos = (self.lastpos or pos) - minetest.add_item(self.lastpos, self.object:get_luaentity().name) - end - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.object:remove() ; -- print ("hit node") + minetest.add_item(self.lastpos, + self.object:get_luaentity().name) end + self.object:remove() ; -- print("hit node") + return end end - if self.hit_player or self.hit_mob then + if self.hit_player or self.hit_mob or self.hit_object then - for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.0)) do + for _,player in pairs( + minetest.get_objects_inside_radius(pos, 1.0)) do - if self.hit_player - and player:is_player() then + if self.hit_player and player:is_player() then self:hit_player(player) - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.object:remove() ; -- print ("hit player") - end + + self.object:remove() ; -- print("hit player") + return end @@ -4632,10 +4242,21 @@ function mobs:register_arrow(name, def) and entity.name ~= self.object:get_luaentity().name then self:hit_mob(player) - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.object:remove() ; --print ("hit mob") - end + + self.object:remove() ; --print("hit mob") + + return + end + + if entity + and self.hit_object + and (not entity._cmi_is_mob) + and tostring(player) ~= self.owner_id + and entity.name ~= self.object:get_luaentity().name then + + self:hit_object(player) + + self.object:remove() ; -- print("hit object") return end @@ -4650,10 +4271,7 @@ end -- compatibility function function mobs:explosion(pos, radius) - - local self = {sounds = {explode = "tnt_explode"}} - - mobs:boom(self, pos, radius) + mobs:boom({sounds = {explode = "tnt_explode"}}, pos, radius) end @@ -4664,7 +4282,7 @@ function mobs:safe_boom(self, pos, radius) pos = pos, gain = 1.0, max_hear_distance = self.sounds and self.sounds.distance or 32 - }) + }, true) entity_physics(pos, radius) @@ -4701,7 +4319,7 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) local grp = {spawn_egg = 1} -- do NOT add this egg to creative inventory (e.g. dungeon master) - if creative and no_creative == true then + if no_creative == true then grp.not_in_creative_inventory = 1 end @@ -4724,11 +4342,14 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) local pos = pointed_thing.above - -- am I clicking on something with existing on_rightclick function? + -- does existing on_rightclick function exist? local under = minetest.get_node(pointed_thing.under) local def = minetest.registered_nodes[under.name] + if def and def.on_rightclick then - return def.on_rightclick(pointed_thing.under, under, placer, itemstack) + + return def.on_rightclick( + pointed_thing.under, under, placer, itemstack) end if pos @@ -4741,8 +4362,8 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) pos.y = pos.y + 1 local data = itemstack:get_metadata() - local mob = minetest.add_entity(pos, mob, data) - local ent = mob:get_luaentity() + local smob = minetest.add_entity(pos, mob, data) + local ent = smob and smob:get_luaentity() if not ent then return end -- sanity check @@ -4772,11 +4393,14 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) local pos = pointed_thing.above - -- am I clicking on something with existing on_rightclick function? + -- does existing on_rightclick function exist? local under = minetest.get_node(pointed_thing.under) local def = minetest.registered_nodes[under.name] + if def and def.on_rightclick then - return def.on_rightclick(pointed_thing.under, under, placer, itemstack) + + return def.on_rightclick( + pointed_thing.under, under, placer, itemstack) end if pos @@ -4786,10 +4410,19 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) return end + -- have we reached active mob limit + if active_limit > 0 and active_mobs >= active_limit then + minetest.chat_send_player(placer:get_player_name(), + S("Active Mob Limit Reached!") + .. " (" .. active_mobs + .. " / " .. active_limit .. ")") + return + end + pos.y = pos.y + 1 - local mob = minetest.add_entity(pos, mob) - local ent = mob:get_luaentity() + local smob = minetest.add_entity(pos, mob) + local ent = smob and smob:get_luaentity() if not ent then return end -- sanity check @@ -4809,7 +4442,6 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) return itemstack end, }) - end @@ -4819,10 +4451,12 @@ function mobs:force_capture(self, clicker) -- add special mob egg with all mob information local new_stack = ItemStack(self.name .. "_set") - local tmp = {} + local tmp, t = {} for _,stat in pairs(self) do - local t = type(stat) + + t = type(stat) + if t ~= "function" and t ~= "nil" and t ~= "userdata" then @@ -4841,18 +4475,16 @@ function mobs:force_capture(self, clicker) else minetest.add_item(clicker:get_pos(), new_stack) end - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.object:remove() - end self:mob_sound("default_place_node_hard") + + remove_mob(self, true) end -- capture critter (thanks to blert2112 for idea) -function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, - force_take, replacewith) +function mobs:capture_mob(self, clicker, chance_hand, chance_net, + chance_lasso, force_take, replacewith) if self.child or not clicker:is_player() @@ -4879,17 +4511,16 @@ function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, end -- is mob tamed? - if self.tamed == false - and force_take == false then + if self.tamed == false and force_take == false then minetest.chat_send_player(name, S("Not tamed!")) return false end - -- cannot pick up if not owner - if self.owner ~= name - and force_take == false then + -- cannot pick up if not owner (unless player has protection_bypass priv) + if not minetest.check_player_privs(name, "protection_bypass") + and self.owner ~= name and force_take == false then minetest.chat_send_player(name, S("@1 is owner!", self.owner)) @@ -4923,7 +4554,7 @@ function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, end -- calculate chance.. add to inventory if successful? - if chance and chance > 0 and random(1, 100) <= chance then + if chance and chance > 0 and random(100) <= chance then -- default mob egg local new_stack = ItemStack(mobname) @@ -4934,10 +4565,12 @@ function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, new_stack = ItemStack(mobname .. "_set") - local tmp = {} + local tmp, t = {} for _,stat in pairs(self) do - local t = type(stat) + + t = type(stat) + if t ~= "function" and t ~= "nil" and t ~= "userdata" then @@ -4957,23 +4590,23 @@ function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, else minetest.add_item(clicker:get_pos(), new_stack) end - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.object:remove() - end self:mob_sound("default_place_node_hard") + remove_mob(self, true) + return new_stack -- when chance above fails or set to 0, miss! elseif chance and chance ~= 0 then + minetest.chat_send_player(name, S("Missed!")) self:mob_sound("mobs_swing") + return false - -- when chance set to nil always return a miss (used for npc walk/follow) + -- when chance is nil always return a miss (used for npc walk/follow) elseif not chance then return false end @@ -4988,19 +4621,22 @@ function mobs:protect(self, clicker) local name = clicker:get_player_name() local tool = clicker:get_wielded_item() + local tool_name = tool:get_name() - if tool:get_name() ~= "mobs:protector" then + if tool_name ~= "mobs:protector" + and tool_name ~= "mobs:protector2" then return false end - if self.tamed == false then + if not self.tamed then minetest.chat_send_player(name, S("Not tamed!")) - return true -- false + return true end - if self.protected == true then + if (self.protected and tool_name == "mobs:protector") + or (self.protected == 2 and tool_name == "mobs:protector2") then minetest.chat_send_player(name, S("Already protected!")) - return true -- false + return true end if not mobs.is_creative(clicker:get_player_name()) then @@ -5008,12 +4644,19 @@ function mobs:protect(self, clicker) clicker:set_wielded_item(tool) end - self.protected = true + -- set protection level + if tool_name == "mobs:protector" then + self.protected = true + else + self.protected = 2 ; self.fire_damage = 0 + end local pos = self.object:get_pos() + pos.y = pos.y + self.collisionbox[2] + 0.5 - effect(self.object:get_pos(), 25, "mobs_protect_particle.png", 0.5, 4, 2, 15) + effect(self.object:get_pos(), 25, "mobs_protect_particle.png", + 0.5, 4, 2, 15) self:mob_sound("mobs_spell") @@ -5065,8 +4708,11 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) -- make children grow quicker if self.child == true then - self.hornytimer = self.hornytimer + 20 - +-- self.hornytimer = self.hornytimer + 20 + -- deduct 10% of the time to adulthood + self.hornytimer = self.hornytimer + ( + (CHILD_GROW_TIME - self.hornytimer) * 0.1) +--print ("====", self.hornytimer) return true end @@ -5104,24 +4750,29 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) end local item = clicker:get_wielded_item() + local name = clicker:get_player_name() -- if mob has been tamed you can name it with a nametag if item:get_name() == "mobs:nametag" - and clicker:get_player_name() == self.owner then - - local name = clicker:get_player_name() + and (name == self.owner + or minetest.check_player_privs(name, "protection_bypass")) then -- store mob and nametag stack in external variables mob_obj[name] = self mob_sta[name] = item local tag = self.nametag or "" + local esc = minetest.formspec_escape - minetest.show_formspec(name, "mobs_nametag", "size[8,4]" - .. "field[0.5,1;7.5,0;name;" - .. minetest.formspec_escape(S("Enter name:")) .. ";" .. tag .. "]" - .. "button_exit[2.5,3.5;3,1;mob_rename;" - .. minetest.formspec_escape(S("Rename")) .. "]") + minetest.show_formspec(name, "mobs_nametag", + "size[8,4]" .. + "field[0.5,1;7.5,0;name;" .. + esc(S("Enter name:")) .. + ";" .. tag .. "]" .. + "button_exit[2.5,3.5;3,1;mob_rename;" .. + esc(S("Rename")) .. "]") + + return true end return false @@ -5151,8 +4802,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end -- limit name entered to 64 characters long - if string.len(fields.name) > 64 then - fields.name = string.sub(fields.name, 1, 64) + if fields.name:len() > 64 then + fields.name = fields.name:sub(1, 64) end -- update nametag @@ -5194,12 +4845,12 @@ function mobs:alias_mob(old_name, new_name) on_activate = function(self, staticdata) if minetest.registered_entities[new_name] then - minetest.add_entity(self.object:get_pos(), new_name, staticdata) - end - if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else - self.object:remove() + + minetest.add_entity(self.object:get_pos(), + new_name, staticdata) end + + remove_mob(self) end, get_staticdata = function(self) @@ -5207,12 +4858,3 @@ function mobs:alias_mob(old_name, new_name) end }) end -minetest.register_on_player_receive_fields(function(player, formname, fields) - for _,ref in pairs(minetest.luaentities) do - if ref.object and ref.type and ref.npc_name then - if ref.type == "npc" and ("npcf_"..ref.npc_name) == formname then - ref.on_receive_fields(ref, fields, player) - end - end - end -end) \ No newline at end of file diff --git a/mods/mobs/api_.lua b/mods/mobs/api_.lua index f6695c6..17c2a41 100644 --- a/mods/mobs/api_.lua +++ b/mods/mobs/api_.lua @@ -6,9 +6,9 @@ local use_cmi = minetest.global_exists("cmi") mobs = { mod = "redo", - version = "20190124", + version = "20200412", intllib = S, - invis = minetest.global_exists("invisibility") and invisibility or {}, + invis = minetest.global_exists("invisibility") and invisibility or {} } -- creative check @@ -79,11 +79,11 @@ local node_snow = "default:snow" mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "default:dirt" local mob_class = { - stepheight = 1.1, -- was 0.6 + stepheight = 1.1, fly_in = "air", owner = "", order = "", - jump_height = 4, -- was 6 + jump_height = 4, lifetimer = 180, -- 3 minutes physical = true, collisionbox = {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, @@ -106,6 +106,7 @@ local mob_class = { jump = true, knock_back = true, walk_chance = 50, + stand_chance = 30, attack_chance = 5, passive = false, blood_amount = 5, @@ -114,7 +115,7 @@ local mob_class = { floats = 1, -- floats in water by default replace_offset = 0, timer = 0, - metadata3 = 0, + metadata3 = 0, env_damage_timer = 0, -- only used when state = "attack" tamed = false, pause_timer = 0, @@ -142,8 +143,9 @@ local mob_class = { attack_players = true, attack_npcs = true, facing_fence = false, - _cmi_is_mob = true, + _cmi_is_mob = true } + local mob_class_meta = {__index = mob_class} -- play sound @@ -229,10 +231,16 @@ function mob_class:set_velocity(v) local yaw = (self.object:get_yaw() or 0) + self.rotate + -- nil check for velocity + v = v or 0 + + -- set velocity with hard limit of 10 + local vel = self.object:get_velocity() + self.object:set_velocity({ - x = (sin(yaw) * -v) + c_x, - y = self.object:get_velocity().y, - z = (cos(yaw) * v) + c_y, + x = max(-10, min((sin(yaw) * -v) + c_x, 10)), + y = max(-10, min((vel and vel.y or 0), 10)), + z = max(-10, min((cos(yaw) * v) + c_y, 10)) }) end @@ -247,6 +255,8 @@ function mob_class:get_velocity() local v = self.object:get_velocity() + if not v then return 0 end + return (v.x * v.x + v.z * v.z) ^ 0.5 end @@ -278,15 +288,15 @@ end -- set defined animation -function mob_class:set_animation(anim) +function mob_class:set_animation(anim, force) if not self.animation or not anim then return end self.animation.current = self.animation.current or "" - -- only set different animation for attacks when setting to same set - if anim ~= "punch" and anim ~= "shoot" + -- only use different animation for attacks when using same set + if force ~= true and anim ~= "punch" and anim ~= "shoot" and string.find(self.animation.current, anim) then return end @@ -330,7 +340,7 @@ end -- check line of sight (BrunoMine) -function mob_class:line_of_sight(pos1, pos2, stepsize) +local line_of_sight = function(self, pos1, pos2, stepsize) stepsize = stepsize or 1 @@ -393,7 +403,6 @@ function mob_class:line_of_sight(pos1, pos2, stepsize) -- New Nodename found nn = minetest.get_node(pos).name - end return false @@ -401,7 +410,7 @@ end -- check line of sight (by BrunoMine, tweaked by Astrobe) -function mob_class:NEW_line_of_sight(pos1, pos2, stepsize) +local new_line_of_sight = function(self, pos1, pos2, stepsize) if not pos1 or not pos2 then return end @@ -447,10 +456,47 @@ function mob_class:NEW_line_of_sight(pos1, pos2, stepsize) return false end +-- check line of sight using raycasting (thanks Astrobe) +local ray_line_of_sight = function(self, pos1, pos2) + + local ray = minetest.raycast(pos1, pos2, true, false) + local thing = ray:next() + + while thing do + +-- if thing.type == "object" +-- and thing.ref ~= self.object +-- and not thing.ref:is_player() then return false end + + if thing.type == "node" then + + local name = minetest.get_node(thing.under).name + + if minetest.registered_items[name] + and minetest.registered_items[name].walkable then return false end + end + + thing = ray:next() + end + + return true +end + +-- detect if using minetest 5.0 by searching for permafrost node +local is_50 = minetest.registered_nodes["default:permafrost"] + +function mob_class:line_of_sight(pos1, pos2, stepsize) + + if is_50 then -- only use if minetest 5.0 is detected + return ray_line_of_sight(self, pos1, pos2) + end + + return line_of_sight(self, pos1, pos2, stepsize) +end + -- global function function mobs:line_of_sight(entity, pos1, pos2, stepsize) - - return mob_class.line_of_sight(entity, pos1, pos2, stepsize) + return entity:line_of_sight(pos1, pos2, stepsize) end @@ -491,7 +537,7 @@ function mob_class:flight_check() local def = minetest.registered_nodes[self.standing_in] - if not def then return false end -- nil check + if not def then return false end if type(self.fly_in) == "string" and self.standing_in == self.fly_in then @@ -549,11 +595,7 @@ function mob_class:do_stay_near() local target = nearby_nodes[math.random(1, #nearby_nodes)] local direction = vector.direction(pos, target) - - local vec = { - x = target.x - pos.x, - z = target.z - pos.z - } + local vec = {x = target.x - pos.x, z = target.z - pos.z} yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate @@ -594,7 +636,7 @@ local effect = function(pos, amount, texture, min_size, max_size, radius, gravit minsize = min_size, maxsize = max_size, texture = texture, - glow = glow, + glow = glow }) end @@ -627,6 +669,11 @@ end -- drop items function mob_class:item_drop() + local pos = self.object:get_pos() + + -- check for drops function + self.drops = type(self.drops) == "function" and self.drops(pos) or self.drops + -- check for nil or no drops if not self.drops or #self.drops == 0 then return @@ -643,7 +690,6 @@ function mob_class:item_drop() and self.cause_of_death.puncher:is_player() or nil local obj, item, num - local pos = self.object:get_pos() for n = 1, #self.drops do @@ -676,7 +722,7 @@ function mob_class:item_drop() obj:set_velocity({ x = random(-10, 10) / 9, y = 6, - z = random(-10, 10) / 9, + z = random(-10, 10) / 9 }) elseif obj then @@ -694,7 +740,7 @@ function mob_class:check_for_death(cmi_cause) -- has health actually changed? if self.health == self.old_health and self.health > 0 then - return + return false end self.old_health = self.health @@ -802,6 +848,11 @@ function mob_class:is_at_cliff() return false end + -- if object no longer exists then return + if not self.object:get_luaentity() then + return false + end + local yaw = self.object:get_yaw() local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) @@ -810,8 +861,7 @@ function mob_class:is_at_cliff() if minetest.line_of_sight( {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, - {x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z} - , 1) then + {x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z}, 1) then return true end @@ -862,70 +912,78 @@ function mob_class:do_env_damage() else self.object:remove() end - return + return true end -- is mob light sensative, or scared of the dark :P if self.light_damage ~= 0 then + local light = minetest.get_node_light(pos) or 0 + if light >= self.light_damage_min and light <= self.light_damage_max then if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then else self.health = self.health - self.light_damage effect(pos, 5, "tnt_smoke.png") - if self:check_for_death({type = "light"}) then - return - end + if self:check_for_death({type = "light"}) then return true end end end end local nodef = minetest.registered_nodes[self.standing_in] - + + if (pos) == nil then + return + end pos.y = pos.y + 1 -- for particle effect position -- water if self.water_damage and nodef.groups.water then + if self.water_damage ~= 0 then if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then else self.health = self.health - self.water_damage - effect(pos, 5, "bubble.png", nil, nil, 1, nil) - if self:check_for_death({type = "environment",pos = pos, node = self.standing_in}) then - return - end - end - + effect(pos, 5, "bubble.png", nil, nil, 1, nil) + + if self:check_for_death({type = "environment", + pos = pos, node = self.standing_in}) then return true end + end end + -- lava or fire or ignition source elseif self.lava_damage and nodef.groups.igniter then -- and (nodef.groups.lava -- or self.standing_in == node_fire -- or self.standing_in == node_permanent_flame) then + if self.lava_damage ~= 0 then if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then else self.health = self.health - self.lava_damage + effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) - if self:check_for_death({type = "environment",pos = pos, node = self.standing_in, hot = true}) then - return - end + + if self:check_for_death({type = "environment", pos = pos, + node = self.standing_in, hot = true}) then return true end end + end -- damage_per_second node check elseif nodef.damage_per_second ~= 0 then if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else + else self.health = self.health - nodef.damage_per_second + effect(pos, 5, "tnt_smoke.png") - if self:check_for_death({type = "environment",pos = pos, node = self.standing_in}) then - return - end + + if self:check_for_death({type = "environment", + pos = pos, node = self.standing_in}) then return true end end end --[[ @@ -938,10 +996,10 @@ function mob_class:do_env_damage() self.health = self.health - self.suffocation if self:check_for_death({type = "environment", - pos = pos, node = self.standing_in}) then return end + pos = pos, node = self.standing_in}) then return true end end ]] - self:check_for_death({type = "unknown"}) + return self:check_for_death({type = "unknown"}) end @@ -968,6 +1026,9 @@ function mob_class:do_jump() local pos = self.object:get_pos() local yaw = self.object:get_yaw() + -- sanity check + if not yaw then return false end + -- what is mob standing on? pos.y = pos.y + self.collisionbox[2] - 0.2 @@ -1017,9 +1078,9 @@ function mob_class:do_jump() if self.object:get_luaentity() then self.object:set_acceleration({ - x = v.x * 2,--1.5, + x = v.x * 2, y = 0, - z = v.z * 2,--1.5 + z = v.z * 2 }) end end, self, v) @@ -1130,7 +1191,7 @@ function mob_class:breed() mesh = self.base_mesh, visual_size = self.base_size, collisionbox = self.base_colbox, - selectionbox = self.base_selbox, + selectionbox = self.base_selbox }) -- custom function when child grows up @@ -1245,7 +1306,7 @@ function mob_class:breed() textures = textures, visual_size = { x = self.base_size.x * .5, - y = self.base_size.y * .5, + y = self.base_size.y * .5 }, collisionbox = { self.base_colbox[1] * .5, @@ -1253,7 +1314,7 @@ function mob_class:breed() self.base_colbox[3] * .5, self.base_colbox[4] * .5, self.base_colbox[5] * .5, - self.base_colbox[6] * .5, + self.base_colbox[6] * .5 }, selectionbox = { self.base_selbox[1] * .5, @@ -1261,7 +1322,7 @@ function mob_class:breed() self.base_selbox[3] * .5, self.base_selbox[4] * .5, self.base_selbox[5] * .5, - self.base_selbox[6] * .5, + self.base_selbox[6] * .5 }, }) -- tamed and owned by parents' owner @@ -1312,17 +1373,22 @@ function mob_class:replace(pos) -- print ("replace node = ".. minetest.get_node(pos).name, pos.y) - local oldnode = {name = what} - local newnode = {name = with} - local on_replace_return - if self.on_replace then - on_replace_return = self:on_replace(pos, oldnode, newnode) + + local oldnode = what + local newnode = with + + -- convert any group: replacements to actual node name + if oldnode:find("group:") then + oldnode = minetest.get_node(pos).name + end + + if self:on_replace(pos, oldnode, newnode) == false then + return + end end - if on_replace_return ~= false then - minetest.set_node(pos, {name = with}) - end + minetest.set_node(pos, {name = with}) end end @@ -1619,7 +1685,7 @@ local specific_attack = function(list, what) end --- general attack function for all mobs ========== +-- general attack function for all mobs function mob_class:general_attack() -- return if already attacking, passive or docile during day @@ -1630,6 +1696,9 @@ function mob_class:general_attack() end local s = self.object:get_pos() + if s == nil then + return + end local objs = minetest.get_objects_inside_radius(s, self.view_range) -- remove entities we aren't interested in @@ -1996,7 +2065,7 @@ function mob_class:do_states(dtime) and self.walk_chance ~= 0 and self.facing_fence ~= true and random(1, 100) <= self.walk_chance - and self:is_at_cliff() == false then + and self.at_cliff == false then self:set_velocity(self.walk_velocity) self.state = "walk" @@ -2077,15 +2146,13 @@ function mob_class:do_states(dtime) end -- stand for great fall in front - local temp_is_cliff = self:is_at_cliff() - if self.facing_fence == true - or temp_is_cliff - or random(1, 100) <= 30 then + or self.at_cliff + or random(1, 100) <= self.stand_chance then self:set_velocity(0) self.state = "stand" - self:set_animation("stand") + self:set_animation("stand", true) else self:set_velocity(self.walk_velocity) @@ -2106,7 +2173,7 @@ function mob_class:do_states(dtime) -- stop after 5 seconds or when at cliff if self.runaway_timer > 5 - or self:is_at_cliff() + or self.at_cliff or self.order == "stand" then self.runaway_timer = 0 self:set_velocity(0) @@ -2208,9 +2275,9 @@ function mob_class:do_states(dtime) self.blinktimer = 0 if self.blinkstatus then - self.object:settexturemod("") + self.object:set_texture_mod("") else - self.object:settexturemod("^[brighten") + self.object:set_texture_mod("^[brighten") end self.blinkstatus = not self.blinkstatus @@ -2232,13 +2299,14 @@ function mob_class:do_states(dtime) else self.object:remove() end + if minetest.get_modpath("tnt") and tnt and tnt.boom and not minetest.is_protected(pos, "") then tnt.boom(pos, { radius = node_break_radius, damage_radius = entity_damage_radius, - sound = self.sounds.explode, + sound = self.sounds.explode }) else @@ -2357,7 +2425,7 @@ function mob_class:do_states(dtime) self:smart_mobs(s, p, dist, dtime) end - if self:is_at_cliff() then + if self.at_cliff then self:set_velocity(0) self:set_animation("stand") @@ -2389,13 +2457,7 @@ function mob_class:do_states(dtime) if self.timer > 1 then self.timer = 0 - --- if self.double_melee_attack --- and random(1, 2) == 1 then --- self:set_animation("punch2") --- else - self:set_animation("punch") --- end + self:set_animation("punch") local p2 = p local s2 = s @@ -2500,6 +2562,9 @@ function mob_class:falling(pos) -- floating in water (or falling) local v = self.object:get_velocity() + -- sanity check + if not v then return end + if v.y > 0 then -- apply gravity when moving up @@ -2546,13 +2611,15 @@ function mob_class:falling(pos) if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then else self.health = self.health - floor(d - 5) + effect(pos, 5, "tnt_smoke.png", 1, 2, 2, nil) + if self:check_for_death({type = "fall"}) then return end end end - + self.old_y = self.object:get_pos().y end end @@ -2650,9 +2717,9 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) end -- add weapon wear - punch_interval = tool_capabilities.full_punch_interval or 1.4 + --punch_interval = tool_capabilities.full_punch_interval or 1.4 - --[[ toolrank support + -- toolrank support local wear = floor((punch_interval / 75) * 9000) if mobs.is_creative(hitter:get_player_name()) then @@ -2673,7 +2740,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) end hitter:set_wielded_item(weapon) ---]] + -- only play hit sound and show blood effects if damage is 1 or over if damage >= 1 then @@ -2713,9 +2780,9 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) -- do damage if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then - else + else self.health = self.health - floor(damage) - end + end -- exit here if dead, check for tools with fire damage local hot = tool_capabilities and tool_capabilities.damage_groups @@ -2741,11 +2808,14 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) end -- END if damage -- knock back effect (only on full punch) - --[[ if self.knock_back and tflp >= punch_interval then local v = self.object:get_velocity() + + -- sanity check + if not v then return end + local kb = damage or 1 local up = 2 @@ -2760,7 +2830,9 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) -- use tool knockback value or default kb = tool_capabilities.damage_groups["knockback"] or kb -- (kb * 1.5) - + if kb > 10 then + kb = 10 + end self.object:set_velocity({ x = dir.x * kb, y = up, @@ -2769,7 +2841,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) self.pause_timer = 0.25 end - --]] + -- if skittish then run away if self.runaway == true and self.order ~= "stand" then @@ -2913,6 +2985,12 @@ function mob_class:mob_activate(staticdata, def, dtime) end end + -- force current model into mob + self.mesh = def.mesh + self.base_mesh = def.mesh + self.collisionbox = def.collisionbox + self.selectionbox = def.selectionbox + -- select random texture, set model and size if not self.base_texture then @@ -2983,7 +3061,7 @@ function mob_class:mob_activate(staticdata, def, dtime) end if self.health == 0 then - self.health = random (self.hp_min, self.hp_max) + self.health = random(self.hp_min, self.hp_max) end -- pathfinding init @@ -3223,12 +3301,12 @@ function mob_class:on_step(dtime) if minetest.get_player_by_name(self.owner) then local inv = minetest.get_player_by_name(self.owner):get_inventory() inv:set_size("dog",8) - for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 15)) do + for _,object in ipairs(minetest.get_objects_inside_radius(pos, 15)) do if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then if inv and inv:room_for_item("dog", ItemStack(object:get_luaentity().itemstring)) then if ItemStack(object:get_luaentity().itemstring):get_name() == "tutorial:geschenkpapier" or ItemStack(object:get_luaentity().itemstring):get_name() == "tutorial:geschenkpapier_death" or ItemStack(object:get_luaentity().itemstring):get_name() == "tutorial:dna_string" then - object:remove() inv:add_item("dog", ItemStack(object:get_luaentity().itemstring)) + object:remove() end end end @@ -3240,12 +3318,12 @@ function mob_class:on_step(dtime) if minetest.get_player_by_name(self.owner) then local inv = minetest.get_player_by_name(self.owner):get_inventory() inv:set_size("cat",8) - for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 15)) do + for _,object in ipairs(minetest.get_objects_inside_radius(pos, 15)) do if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then if inv and inv:room_for_item("cat", ItemStack(object:get_luaentity().itemstring)) then if ItemStack(object:get_luaentity().itemstring):get_name() == "tutorial:geschenkpapier" or ItemStack(object:get_luaentity().itemstring):get_name() == "tutorial:geschenkpapier_death" or ItemStack(object:get_luaentity().itemstring):get_name() == "tutorial:dna_string" then - object:remove() inv:add_item("cat", ItemStack(object:get_luaentity().itemstring)) + object:remove() end end end @@ -3584,7 +3662,10 @@ function mob_class:on_step(dtime) end local pos = self.object:get_pos() - local yaw = 0 + local yaw = self.object:get_yaw() + + -- early warning check, if no yaw then no entity, skip rest of function + if not yaw then return end -- get node at foot level every quarter second self.node_timer = (self.node_timer or 0) + dtime @@ -3604,6 +3685,24 @@ function mob_class:on_step(dtime) x = pos.x, y = pos.y + y_level + 0.25, z = pos.z}, "air").name -- print ("standing in " .. self.standing_in) + -- if standing inside solid block then jump to escape + if minetest.registered_nodes[self.standing_in].walkable and + minetest.registered_nodes[self.standing_in].drawtype == "normal" then + + self.object:set_velocity({ + x = 0, + y = self.jump_height, + z = 0 + }) + end + + -- check and stop if standing at cliff and fear of heights + self.at_cliff = self:is_at_cliff() + + if self.at_cliff then + self:set_velocity(0) + end + -- check for mob expiration (0.25 instead of dtime since were in a timer) self:mob_expire(pos, 0.25) end @@ -3615,8 +3714,6 @@ function mob_class:on_step(dtime) if self.delay and self.delay > 0 then - local yaw = self.object:get_yaw() - if self.delay == 1 then yaw = self.target_yaw else @@ -3699,7 +3796,7 @@ function mob_class:on_step(dtime) self.env_damage_timer = 0 -- check for environmental damage (water, fire, lava etc.) - self:do_env_damage() + if self:do_env_damage() then return end -- node replace check (cow eats grass etc.) self:replace(pos) @@ -3720,7 +3817,6 @@ function mob_class:on_step(dtime) self:do_stay_near() end - function update(self, clicker) if self.name == "mobs:dog" then if self.owner ~= clicker:get_player_name() then @@ -3956,7 +4052,7 @@ function update(self, clicker) .."background[3,1;1,1;gui_formbg.png;true]" .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" .."bgcolor[#080808BB;true]" - minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Knight", formspec) + minetest.show_formspec(player_name, "npcf_"..self.owner.."'s 1248 Knight", formspec) else local player_name = clicker:get_player_name() local formspec = "size[8,8.5]" @@ -3972,7 +4068,7 @@ function update(self, clicker) formspec = formspec .."label[0,1;Hello my name is 1248]" .."label[0,1.3;Bring me an empty color stick and we can leave this world]" formspec = formspec .."button[3,4;2.0,0.5;leave;I've got color stick]" - minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Knight", formspec) + minetest.show_formspec(player_name, "npcf_"..self.owner.."'s 1248 Knight", formspec) end end end @@ -3987,7 +4083,8 @@ function mob_class:on_blast(damage) damage_groups = {fleshy = damage}, }, nil) - return false, true, {} + -- return no damage, no knockback, no item drops, mob api handles all + return false, false, {} end @@ -4013,6 +4110,7 @@ minetest.register_entity(name, setmetatable({ jump_height = def.jump_height, drawtype = def.drawtype, -- DEPRECATED, use rotate instead rotate = math.rad(def.rotate or 0), -- 0=front, 90=side, 180=back, 270=side2 + glow = def.glow, lifetimer = def.lifetimer, hp_min = max(1, (def.hp_min or 5) * difficulty), hp_max = max(1, (def.hp_max or 10) * difficulty), @@ -4044,6 +4142,7 @@ minetest.register_entity(name, setmetatable({ follow = def.follow, jump = def.jump, walk_chance = def.walk_chance, + stand_chance = def.stand_chance, attack_chance = def.attack_chance, passive = def.passive, knock_back = def.knock_back, @@ -4102,7 +4201,6 @@ minetest.register_entity(name, setmetatable({ on_activate = function(self, staticdata, dtime) return self:mob_activate(staticdata, def, dtime) end, - on_receive_fields = function(self, fields, sender) if self.owner == sender:get_player_name() then if fields.leave then @@ -4118,7 +4216,7 @@ minetest.register_entity(name, setmetatable({ .."background[4,2.5;1,1;gui_formbg.png;true]" .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" .."bgcolor[#080808BB;true]" - minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Knight", formspec) + minetest.show_formspec(player_name, "npcf_"..self.owner.."'s 1248 Knight", formspec) end else if fields.texture11 then @@ -4198,11 +4296,13 @@ end -- END mobs:register_mob function -- count how many mobs of one type are inside an area +-- will also return true for second value if player is inside area local count_mobs = function(pos, type) local total = 0 local objs = minetest.get_objects_inside_radius(pos, aoc_range * 2) local ent + local players for n = 1, #objs do @@ -4214,10 +4314,12 @@ local count_mobs = function(pos, type) if ent and ent.name and ent.name == type then total = total + 1 end + else + players = true end end - return total + return total, players end @@ -4286,7 +4388,12 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, end -- get total number of this mob in area - local num_mob = count_mobs(pos, name) + local num_mob, is_pla = count_mobs(pos, name) + + if not is_pla then +--print ("--- no players within active area, will not spawn " .. name) + return + end if num_mob >= aoc then --print ("--- too many " .. name .. " in area", num_mob .. "/" .. aoc) @@ -4333,7 +4440,7 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, end -- only spawn away from player - local objs = minetest.get_objects_inside_radius(pos, 10) + local objs = minetest.get_objects_inside_radius(pos, 8) for n = 1, #objs do @@ -4387,7 +4494,8 @@ end -- compatibility with older mob registration -function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_object_count, max_height, day_toggle) +function mobs:register_spawn(name, nodes, max_light, min_light, chance, + active_object_count, max_height, day_toggle) mobs:spawn_specific(name, nodes, {"air"}, min_light, max_light, 30, chance, active_object_count, -31000, max_height, day_toggle) @@ -4409,8 +4517,7 @@ function mobs:spawn(def) def.min_height or -31000, def.max_height or 31000, def.day_toggle, - def.on_spawn - ) + def.on_spawn) end @@ -4472,7 +4579,7 @@ function mobs:register_arrow(name, def) collisiondetection = false, texture = def.tail_texture, size = def.tail_size or 5, - glow = def.glow or 0, + glow = def.glow or 0 }) end @@ -4637,6 +4744,8 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) local mob = minetest.add_entity(pos, mob, data) local ent = mob:get_luaentity() + if not ent then return end -- sanity check + -- set owner if not a monster if ent.type ~= "monster" then ent.owner = placer:get_player_name() @@ -4682,6 +4791,8 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) local mob = minetest.add_entity(pos, mob) local ent = mob:get_luaentity() + if not ent then return end -- sanity check + -- don't set owner if monster or sneak pressed if ent.type ~= "monster" and not placer:get_player_control().sneak then @@ -5007,8 +5118,6 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) local tag = self.nametag or "" minetest.show_formspec(name, "mobs_nametag", "size[8,4]" - .. default.gui_bg - .. default.gui_bg_img .. "field[0.5,1;7.5,0;name;" .. minetest.formspec_escape(S("Enter name:")) .. ";" .. tag .. "]" .. "button_exit[2.5,3.5;3,1;mob_rename;" @@ -5069,6 +5178,11 @@ end) -- compatibility function for old entities to new modpack entities function mobs:alias_mob(old_name, new_name) + -- check old_name entity doesnt already exist + if minetest.registered_entities[old_name] then + return + end + -- spawn egg minetest.register_alias(old_name, new_name) @@ -5077,15 +5191,19 @@ function mobs:alias_mob(old_name, new_name) physical = false, - on_activate = function(self) + on_activate = function(self, staticdata) if minetest.registered_entities[new_name] then - minetest.add_entity(self.object:get_pos(), new_name) + minetest.add_entity(self.object:get_pos(), new_name, staticdata) end if self.name == "mobs:dog" or self.name == "mobs:cat" or self.name == "mobs:sheep" or self.name == "mobs:dragon" or self.name == "mobs:knight_1248" or self.name == "mobs:fox" or self.name == "mobs:tortoise" then else self.object:remove() end + end, + + get_staticdata = function(self) + return self end }) end diff --git a/mods/mobs/cat.lua b/mods/mobs/cat.lua index 0034789..558dc4d 100644 --- a/mods/mobs/cat.lua +++ b/mods/mobs/cat.lua @@ -26,6 +26,8 @@ mobs:register_mob("mobs:cat", { lava_damage = 0, light_damage = 0, fall_damage = 0, + suffocation = 0, + knock_back = false, metadata = 1, metadata2 = 1, animation = { diff --git a/mods/mobs/dog.lua b/mods/mobs/dog.lua index 1411d28..09abb8b 100644 --- a/mods/mobs/dog.lua +++ b/mods/mobs/dog.lua @@ -26,6 +26,8 @@ mobs:register_mob("mobs:dog", { lava_damage = 0, light_damage = 0, fall_damage = 0, + suffocation = 0, + knock_back = false, metadata = 1, metadata2 = 1, animation = { diff --git a/mods/mobs/dragon.lua b/mods/mobs/dragon.lua index 2219180..1491582 100644 --- a/mods/mobs/dragon.lua +++ b/mods/mobs/dragon.lua @@ -26,6 +26,8 @@ mobs:register_mob("mobs:dragon", { lava_damage = 0, light_damage = 0, fall_damage = 0, + suffocation = 0, + knock_back = false, metadata = 1, metadata2 = 1, animation = { diff --git a/mods/mobs/egg.lua b/mods/mobs/egg.lua index 0b1b1d3..b6ade28 100644 --- a/mods/mobs/egg.lua +++ b/mods/mobs/egg.lua @@ -177,6 +177,90 @@ minetest.register_craftitem("mobs:desert_stone_monster_egg", { end, }) +minetest.register_craftitem("mobs:dry_dirt_monster_egg", { + description = "Dry dirt monster spawn-egg", + inventory_image = "tutorial_mummy_egg.png", + liquids_pointable = false, + stack_max = 99, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + minetest.env:add_entity(pointed_thing.above,"mobs:dry_dirt_monster") + if not minetest.setting_getbool("creative_mode") then itemstack:take_item() end + return itemstack + end + end, +}) + +minetest.register_craftitem("mobs:clay_monster_egg", { + description = "Clay monster spawn-egg", + inventory_image = "tutorial_mummy_egg.png", + liquids_pointable = false, + stack_max = 99, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + minetest.env:add_entity(pointed_thing.above,"mobs:clay_monster") + if not minetest.setting_getbool("creative_mode") then itemstack:take_item() end + return itemstack + end + end, +}) + +minetest.register_craftitem("mobs:gravel_monster_egg", { + description = "Gravel monster spawn-egg", + inventory_image = "tutorial_mummy_egg.png", + liquids_pointable = false, + stack_max = 99, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + minetest.env:add_entity(pointed_thing.above,"mobs:gravel_monster") + if not minetest.setting_getbool("creative_mode") then itemstack:take_item() end + return itemstack + end + end, +}) + +minetest.register_craftitem("mobs:coniferous_litter_monster_egg", { + description = "Coniferous litter monster spawn-egg", + inventory_image = "tutorial_mummy_egg.png", + liquids_pointable = false, + stack_max = 99, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + minetest.env:add_entity(pointed_thing.above,"mobs:coniferous_litter_monster") + if not minetest.setting_getbool("creative_mode") then itemstack:take_item() end + return itemstack + end + end, +}) + +minetest.register_craftitem("mobs:moss_monster_egg", { + description = "Moss monster spawn-egg", + inventory_image = "tutorial_mummy_egg.png", + liquids_pointable = false, + stack_max = 99, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + minetest.env:add_entity(pointed_thing.above,"mobs:moss_monster") + if not minetest.setting_getbool("creative_mode") then itemstack:take_item() end + return itemstack + end + end, +}) + +minetest.register_craftitem("mobs:permafrost_monster_egg", { + description = "Permafrost monster spawn-egg", + inventory_image = "tutorial_mummy_egg.png", + liquids_pointable = false, + stack_max = 99, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + minetest.env:add_entity(pointed_thing.above,"mobs:permafrost_monster") + if not minetest.setting_getbool("creative_mode") then itemstack:take_item() end + return itemstack + end + end, +}) + minetest.register_craftitem("mobs:dog_egg", { description = "Dog spawn-egg", inventory_image = "tutorial_mummy_egg.png", diff --git a/mods/mobs/fox.lua b/mods/mobs/fox.lua index acaab9c..089fee4 100644 --- a/mods/mobs/fox.lua +++ b/mods/mobs/fox.lua @@ -26,6 +26,8 @@ mobs:register_mob("mobs:fox", { lava_damage = 0, light_damage = 0, fall_damage = 0, + suffocation = 0, + knock_back = false, metadata = 1, metadata2 = 1, animation = { diff --git a/mods/mobs/init.lua b/mods/mobs/init.lua index 9d2a2b2..1148329 100644 --- a/mods/mobs/init.lua +++ b/mods/mobs/init.lua @@ -16,11 +16,10 @@ local animals = { {"cat","Cat","cat"}, {"sheep","Sheep","sheep"}, {"tortoise","Tortoise","tortoise"}, - {"knight","Knight","knight_1248"}, + {"knight","1248 Knight","knight_1248"}, {"fox","Fox","fox"}, {"dragon","Dragon","dragon"}, } - local timer = 0 minetest.register_globalstep(function(dtime) timer = timer + dtime; @@ -110,4 +109,883 @@ function update_meta(player,animal,obj,ent) ent.walk_velocity = 1 ent.run_velocity = 3 end -end \ No newline at end of file +end + +function first_activate(self) + if self.name == "mobs:dog" then + self.object:set_properties({infotext=self.owner.."'s Dog"}) + if self.metadata == 1 then + self.object:set_properties({textures={"mobs_dog.png"}}) + end + if self.metadata == 2 then + self.object:set_properties({textures={"mobs_dog2.png"}}) + end + if self.metadata2 == 1 then + self.walk_velocity = 1 + self.run_velocity = 3 + self.jump = true + end + if self.metadata2 == 2 then + self.walk_velocity = 0 + self.run_velocity = 0 + self.jump = false + end + end + if self.name == "mobs:dragon" then + self.object:set_properties({infotext=self.owner.."'s Dragon"}) + if self.metadata == 1 then + self.object:set_properties({textures={"mobs_dragon_red.png"}}) + end + if self.metadata == 2 then + self.object:set_properties({textures={"mobs_dragon_yellow.png"}}) + end + if self.metadata == 3 then + self.object:set_properties({textures={"mobs_dragon_blue.png"}}) + end + if self.metadata == 4 then + self.object:set_properties({textures={"mobs_dragon_green.png"}}) + end + if self.metadata == 5 then + self.object:set_properties({textures={"mobs_dragon_black.png"}}) + end + if self.metadata == 6 then + self.object:set_properties({textures={"mobs_dragon_great.png"}}) + end + if self.metadata2 == 1 then + self.walk_velocity = 1 + self.run_velocity = 3 + self.jump = true + end + if self.metadata2 == 2 then + self.walk_velocity = 0 + self.run_velocity = 0 + self.jump = false + end + end + if self.name == "mobs:cat" then + self.object:set_properties({infotext=self.owner.."'s Cat"}) + if self.metadata == 1 then + self.object:set_properties({textures={"mobs_kitten4.png"}}) + end + if self.metadata == 2 then + self.object:set_properties({textures={"mobs_kitten.png"}}) + end + if self.metadata == 3 then + self.object:set_properties({textures={"mobs_kitten2.png"}}) + end + if self.metadata == 4 then + self.object:set_properties({textures={"mobs_kitten3.png"}}) + end + if self.metadata2 == 1 then + self.walk_velocity = 1 + self.run_velocity = 3 + self.jump = true + end + if self.metadata2 == 2 then + self.walk_velocity = 0 + self.run_velocity = 0 + self.jump = false + end + end + if self.name == "mobs:sheep" then + if self.owner then + self.object:set_properties({infotext=self.owner.."'s Sheep"}) + if minetest.get_player_by_name(self.owner) then + if self.metadata2 == 1 then + self.walk_velocity = 1 + self.run_velocity = 3 + self.jump = true + + end + if self.metadata2 == 2 then + self.walk_velocity = 0 + self.run_velocity = 0 + self.jump = false + end + end + end + end + if self.name == "mobs:knight_1248" then + self.object:set_properties({infotext=self.owner.."'s 1248 Knight"}) + if self.owner then + if self.metadata2 == 1 then + self.walk_velocity = 1 + self.run_velocity = 3 + self.jump = true + + end + if self.metadata2 == 2 then + self.walk_velocity = 0 + self.run_velocity = 0 + self.jump = false + end + end + end + if self.name == "mobs:fox" then + self.object:set_properties({infotext=self.owner.."'s Fox"}) + if self.metadata == 1 then + self.object:set_properties({textures={"mobs_fox.png"}}) + end + if self.metadata == 2 then + self.object:set_properties({textures={"mobs_fox1.png"}}) + end + if self.metadata2 == 1 then + self.walk_velocity = 1 + self.run_velocity = 3 + self.jump = true + end + if self.metadata2 == 2 then + self.walk_velocity = 0 + self.run_velocity = 0 + self.jump = false + end + end + if self.name == "mobs:tortoise" then + self.object:set_properties({infotext=self.owner.."'s Tortoise"}) + if self.metadata2 == 1 then + self.walk_velocity = 1 + self.run_velocity = 3 + self.jump = true + end + if self.metadata2 == 2 then + self.walk_velocity = 0 + self.run_velocity = 0 + self.jump = false + end + end +end + +function first_step(self,dtime) + self.metadata3 = self.metadata3 + dtime + if self.metadata3 > 1 then + self.metadata3 = 0 + if self.name == "mobs:dog" then + local pos = self.object:getpos() + if minetest.get_player_by_name(self.owner) then + local inv = minetest.get_player_by_name(self.owner):get_inventory() + inv:set_size("dog",8) + for _,object in ipairs(minetest.get_objects_inside_radius(pos, 15)) do + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then + if inv and inv:room_for_item("dog", ItemStack(object:get_luaentity().itemstring)) then + if ItemStack(object:get_luaentity().itemstring):get_name() == "tutorial:geschenkpapier" or ItemStack(object:get_luaentity().itemstring):get_name() == "tutorial:geschenkpapier_death" or ItemStack(object:get_luaentity().itemstring):get_name() == "tutorial:dna_string" then + inv:add_item("dog", ItemStack(object:get_luaentity().itemstring)) + object:remove() + end + end + end + end + end + end + if self.name == "mobs:cat" then + local pos = self.object:getpos() + if minetest.get_player_by_name(self.owner) then + local inv = minetest.get_player_by_name(self.owner):get_inventory() + inv:set_size("cat",8) + for _,object in ipairs(minetest.get_objects_inside_radius(pos, 15)) do + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then + if inv and inv:room_for_item("cat", ItemStack(object:get_luaentity().itemstring)) then + if ItemStack(object:get_luaentity().itemstring):get_name() == "tutorial:geschenkpapier" or ItemStack(object:get_luaentity().itemstring):get_name() == "tutorial:geschenkpapier_death" or ItemStack(object:get_luaentity().itemstring):get_name() == "tutorial:dna_string" then + inv:add_item("cat", ItemStack(object:get_luaentity().itemstring)) + object:remove() + end + end + end + end + end + end + + if self.name == "mobs:dragon" then + if self.owner and minetest.get_player_by_name(self.owner) then + minetest.get_player_by_name(self.owner):set_attribute("dragonx", ""..math.floor(self.object:getpos().x+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("dragony", ""..math.floor(self.object:getpos().y+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("dragonz", ""..math.floor(self.object:getpos().z+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("dragon_meta1", ""..self.metadata) + minetest.get_player_by_name(self.owner):set_attribute("dragon_meta2", ""..self.metadata2) + end + end + if self.name == "mobs:sheep" then + if self.owner and minetest.get_player_by_name(self.owner) then + minetest.get_player_by_name(self.owner):set_attribute("sheepx", ""..math.floor(self.object:getpos().x+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("sheepy", ""..math.floor(self.object:getpos().y+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("sheepz", ""..math.floor(self.object:getpos().z+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("sheep_meta1", ""..self.metadata) + minetest.get_player_by_name(self.owner):set_attribute("sheep_meta2", ""..self.metadata2) + + end + end + if self.name == "mobs:fox" then + if self.owner and minetest.get_player_by_name(self.owner) then + minetest.get_player_by_name(self.owner):set_attribute("foxx", ""..math.floor(self.object:getpos().x+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("foxy", ""..math.floor(self.object:getpos().y+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("foxz", ""..math.floor(self.object:getpos().z+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("fox_meta1", ""..self.metadata) + minetest.get_player_by_name(self.owner):set_attribute("fox_meta2", ""..self.metadata2) + end + end + if self.name == "mobs:tortoise" then + if self.owner and minetest.get_player_by_name(self.owner) then + minetest.get_player_by_name(self.owner):set_attribute("tortoisex", ""..math.floor(self.object:getpos().x+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("tortoisey", ""..math.floor(self.object:getpos().y+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("tortoisez", ""..math.floor(self.object:getpos().z+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("tortoise_meta1", ""..self.metadata) + minetest.get_player_by_name(self.owner):set_attribute("tortoise_meta2", ""..self.metadata2) + end + end + if self.name == "mobs:knight_1248" then + if self.owner and minetest.get_player_by_name(self.owner) then + minetest.get_player_by_name(self.owner):set_attribute("knightx", ""..math.floor(self.object:getpos().x+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("knighty", ""..math.floor(self.object:getpos().y+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("knightz", ""..math.floor(self.object:getpos().z+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("knight_meta1", ""..self.metadata) + minetest.get_player_by_name(self.owner):set_attribute("knight_meta2", ""..self.metadata2) + end + end + if self.name == "mobs:dog" then + if self.owner and minetest.get_player_by_name(self.owner) then + minetest.get_player_by_name(self.owner):set_attribute("dogx", ""..math.floor(self.object:getpos().x+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("dogy", ""..math.floor(self.object:getpos().y+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("dogz", ""..math.floor(self.object:getpos().z+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("dog_meta1", ""..self.metadata) + minetest.get_player_by_name(self.owner):set_attribute("dog_meta2", ""..self.metadata2) + end + end + if self.name == "mobs:cat" then + if self.owner and minetest.get_player_by_name(self.owner) then + minetest.get_player_by_name(self.owner):set_attribute("catx", ""..math.floor(self.object:getpos().x+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("caty", ""..math.floor(self.object:getpos().y+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("catz", ""..math.floor(self.object:getpos().z+0.5)) + minetest.get_player_by_name(self.owner):set_attribute("cat_meta1", ""..self.metadata) + minetest.get_player_by_name(self.owner):set_attribute("cat_meta2", ""..self.metadata2) + end + end + + if self.name == "mobs:dog" and self.metadata2 == 1 then + local pos = self.object:getpos() + local all_objects = minetest.get_objects_inside_radius(pos, 15) + local players = {} + local k = 0 + local _,obj + for _,obj in ipairs(all_objects) do + if obj:is_player() then + if self.owner == obj:get_player_name() then + k = 1 + end + end + end + if k == 0 then + if minetest.get_player_by_name(self.owner) then + self.object:setpos({x = minetest.get_player_by_name(self.owner):getpos().x, y = minetest.get_player_by_name(self.owner):getpos().y+1, z = minetest.get_player_by_name(self.owner):getpos().z+1}) + end + end + end + if self.name == "mobs:cat" and self.metadata2 == 1 then + local pos = self.object:getpos() + local all_objects = minetest.get_objects_inside_radius(pos, 15) + local players = {} + local k = 0 + local _,obj + for _,obj in ipairs(all_objects) do + if obj:is_player() then + if self.owner == obj:get_player_name() then + k = 1 + end + end + end + if k == 0 then + if minetest.get_player_by_name(self.owner) then + self.object:setpos({x = minetest.get_player_by_name(self.owner):getpos().x, y = minetest.get_player_by_name(self.owner):getpos().y+1, z = minetest.get_player_by_name(self.owner):getpos().z+1}) + end + end + end + if self.name == "mobs:dragon" and self.metadata2 == 1 then + local pos = self.object:getpos() + local all_objects = minetest.get_objects_inside_radius(pos, 15) + local players = {} + local k = 0 + local _,obj + for _,obj in ipairs(all_objects) do + if obj:is_player() then + if self.owner == obj:get_player_name() then + k = 1 + end + end + end + if k == 0 then + if self.owner then + if minetest.get_player_by_name(self.owner) then + minetest.get_player_by_name(self.owner):get_inventory():set_size("dragon2",1) + self.object:setpos({x = minetest.get_player_by_name(self.owner):getpos().x, y = minetest.get_player_by_name(self.owner):getpos().y+1, z = minetest.get_player_by_name(self.owner):getpos().z+1}) + local numd = minetest.get_player_by_name(self.owner):get_inventory():get_stack("dragon2", 1):get_count() + if numd > 25 then + if minetest.get_player_by_name(self.owner):get_inventory():get_stack("dragon", 1):get_name() == "tutorial:dragon_crystal" then + minetest.get_player_by_name(self.owner):get_inventory():add_item("main", "tutorial:geschenk_gem") + else + minetest.get_player_by_name(self.owner):get_inventory():add_item("main", "tutorial:geschenk_dragon") + end + minetest.get_player_by_name(self.owner):get_inventory():set_stack("dragon2", 1, "") + else + minetest.get_player_by_name(self.owner):get_inventory():set_stack("dragon2", 1, "default:dirt "..1+numd) + end + end + end + end + end + if self.name == "mobs:sheep" and self.metadata2 == 1 then + local pos = self.object:getpos() + local all_objects = minetest.get_objects_inside_radius(pos, 15) + local players = {} + local k = 0 + local _,obj + for _,obj in ipairs(all_objects) do + if obj:is_player() then + if self.owner == obj:get_player_name() then + k = 1 + end + end + end + if k == 0 then + if self.owner then + if minetest.get_player_by_name(self.owner) then + minetest.get_player_by_name(self.owner):get_inventory():set_size("sheep2",1) + minetest.get_player_by_name(self.owner):get_inventory():set_size("sheep3",1) + self.object:setpos({x = minetest.get_player_by_name(self.owner):getpos().x, y = minetest.get_player_by_name(self.owner):getpos().y+1, z = minetest.get_player_by_name(self.owner):getpos().z+1}) + local numd = minetest.get_player_by_name(self.owner):get_inventory():get_stack("sheep2", 1):get_count() + if numd > 25 then + minetest.get_player_by_name(self.owner):get_inventory():add_item("main", minetest.get_player_by_name(self.owner):get_inventory():get_stack("sheep3", 1)) + minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep2", 1, "") + else + minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep2", 1, "default:dirt "..1+numd) + end + end + end + end + end + if self.name == "mobs:knight_1248" and self.metadata2 == 1 then + local pos = self.object:getpos() + local all_objects = minetest.get_objects_inside_radius(pos, 15) + local players = {} + local k = 0 + local _,obj + for _,obj in ipairs(all_objects) do + if obj:is_player() then + if self.owner == obj:get_player_name() then + k = 1 + end + end + end + if k == 0 then + if minetest.get_player_by_name(self.owner) then + self.object:setpos({x = minetest.get_player_by_name(self.owner):getpos().x, y = minetest.get_player_by_name(self.owner):getpos().y+1, z = minetest.get_player_by_name(self.owner):getpos().z+1}) + end + end + end + if self.name == "mobs:fox" and self.metadata2 == 1 then + local pos = self.object:getpos() + local all_objects = minetest.get_objects_inside_radius(pos, 15) + local players = {} + local k = 0 + local _,obj + for _,obj in ipairs(all_objects) do + if obj:is_player() then + if self.owner == obj:get_player_name() then + k = 1 + end + end + end + if k == 0 then + if self.owner then + if minetest.get_player_by_name(self.owner) then + minetest.get_player_by_name(self.owner):get_inventory():set_size("fox",1) + minetest.get_player_by_name(self.owner):get_inventory():set_size("foxfox",1) + minetest.get_player_by_name(self.owner):get_inventory():set_size("r1248",6) + self.object:setpos({x = minetest.get_player_by_name(self.owner):getpos().x, y = minetest.get_player_by_name(self.owner):getpos().y+1, z = minetest.get_player_by_name(self.owner):getpos().z+1}) + local numd = minetest.get_player_by_name(self.owner):get_inventory():get_stack("fox", 1):get_count() + if numd == 50 then + minetest.get_player_by_name(self.owner):get_inventory():add_item("main", "tutorial:fox_schluessel") + minetest.get_player_by_name(self.owner):get_inventory():set_stack("fox", 1, "default:dirt 80") + elseif numd == 80 then + else + minetest.get_player_by_name(self.owner):get_inventory():set_stack("fox", 1, "default:dirt "..1+numd) + end + local numdd = minetest.get_player_by_name(self.owner):get_inventory():get_stack("foxfox", 1):get_count() + if numdd == 256 then + local ra = math.random(6) + if ra == 1 then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("r1248", 1, "default:dirt") + elseif ra == 2 then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("r1248", 2, "default:dirt") + elseif ra == 3 then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("r1248", 3, "default:dirt") + elseif ra == 4 then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("r1248", 4, "default:dirt") + elseif ra == 5 then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("r1248", 5, "default:dirt") + elseif ra == 6 then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("r1248", 6, "default:dirt") + end + minetest.get_player_by_name(self.owner):get_inventory():set_stack("foxfox", 1, "") + else + minetest.get_player_by_name(self.owner):get_inventory():set_stack("foxfox", 1, "default:dirt "..1+numdd) + end + end + end + end + end + if self.name == "mobs:tortoise" and self.metadata2 == 1 then + local pos = self.object:getpos() + local all_objects = minetest.get_objects_inside_radius(pos, 15) + local players = {} + local k = 0 + local _,obj + for _,obj in ipairs(all_objects) do + if obj:is_player() then + if self.owner == obj:get_player_name() then + k = 1 + end + end + end + if k == 0 then + if minetest.get_player_by_name(self.owner) then + self.object:setpos({x = minetest.get_player_by_name(self.owner):getpos().x, y = minetest.get_player_by_name(self.owner):getpos().y+1, z = minetest.get_player_by_name(self.owner):getpos().z+1}) + minetest.get_player_by_name(self.owner):get_inventory():set_size("tortoise2",1) + local numd = minetest.get_player_by_name(self.owner):get_inventory():get_stack("tortoise2", 1):get_count() + if numd > 25 then + if minetest.get_player_by_name(self.owner):get_inventory():get_stack("tortoise", 1):get_name() == "tutorial:dragon_crystal" then + minetest.get_player_by_name(self.owner):get_inventory():add_item("main", "tutorial:geschenk_gem2") + else + minetest.get_player_by_name(self.owner):get_inventory():add_item("main", "tutorial:geschenk_tortoise") + end + minetest.get_player_by_name(self.owner):get_inventory():set_stack("tortoise2", 1, "") + else + minetest.get_player_by_name(self.owner):get_inventory():set_stack("tortoise2", 1, "default:dirt "..1+numd) + end + end + end + end + if self.name == "mobs:sheep" then + if self.owner then + self.object:set_properties({infotext=self.owner.."'s Sheep"}) + if minetest.get_player_by_name(self.owner) then + local col = minetest.get_player_by_name(self.owner):get_inventory():get_stack("sheep", 1):get_name() + if col == "dye:white" then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:white") + self.object:set_properties({textures={"mobs_sheep_white.png"}}) + elseif col == "dye:grey" then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:grey") + self.object:set_properties({textures={"mobs_sheep_grey.png"}}) + elseif col == "dye:dark_grey" then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:dark_grey") + self.object:set_properties({textures={"mobs_sheep_dark_grey.png"}}) + elseif col == "dye:black" then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:black") + self.object:set_properties({textures={"mobs_sheep_black.png"}}) + elseif col == "dye:violet" then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:violet") + self.object:set_properties({textures={"mobs_sheep_violet.png"}}) + elseif col == "dye:blue" then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:blue") + self.object:set_properties({textures={"mobs_sheep_blue.png"}}) + elseif col == "dye:cyan" then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:cyan") + self.object:set_properties({textures={"mobs_sheep_cyan.png"}}) + elseif col == "dye:dark_green" then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:dark_green") + self.object:set_properties({textures={"mobs_sheep_dark_green.png"}}) + elseif col == "dye:green" then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:green") + self.object:set_properties({textures={"mobs_sheep_green.png"}}) + elseif col == "dye:yellow" then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:yellow") + self.object:set_properties({textures={"mobs_sheep_yellow.png"}}) + elseif col == "dye:brown" then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:brown") + self.object:set_properties({textures={"mobs_sheep_brown.png"}}) + elseif col == "dye:orange" then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:orange") + self.object:set_properties({textures={"mobs_sheep_orange.png"}}) + elseif col == "dye:red" then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:red") + self.object:set_properties({textures={"mobs_sheep_red.png"}}) + elseif col == "dye:magenta" then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:magenta") + self.object:set_properties({textures={"mobs_sheep_magenta.png"}}) + elseif col == "dye:pink" then + minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"wool:pink") + self.object:set_properties({textures={"mobs_sheep_pink.png"}}) + else + minetest.get_player_by_name(self.owner):get_inventory():set_stack("sheep3", 1,"") + self.object:set_properties({textures={"mobs_sheep.png"}}) + end + end + end + end + end +end + +function update(self, clicker) + if self.name == "mobs:dog" then + if self.owner ~= clicker:get_player_name() then + local player_name = clicker:get_player_name() + local formspec = "size[3,1]" + .."label[0,0;You are not the owner!!]" + .."background[3,1;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Dog", formspec) + else + local inv = minetest.get_player_by_name(self.owner):get_inventory() + inv:set_size("dog",8) + local player_name = clicker:get_player_name() + local formspec = "size[8,8.5]" + .."list[current_player;dog;0,2;8,1]" + .."list[current_player;main;0,4.5;8,4]" + .."listring[current_player;dog]" + .."listring[current_player;main]" + .."background[8,8.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + if self.metadata == 1 then + formspec = formspec .."button[0,0;2.0,0.5;texture11;Texture:brown]" + end + if self.metadata == 2 then + formspec = formspec .."button[0,0;2.0,0.5;texture12;Texture:grey]" + end + if self.metadata2 == 1 then + formspec = formspec .."button[3,0;2.0,0.5;move1;Move:stand]" + end + if self.metadata2 == 2 then + formspec = formspec .."button[3,0;2.0,0.5;move2;Move:follow]" + end + minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Dog", formspec) + end + end + if self.name == "mobs:cat" then + if self.owner ~= clicker:get_player_name() then + local player_name = clicker:get_player_name() + local formspec = "size[3,1]" + .."label[0,0;You are not the owner!!]" + .."background[3,1;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."background[8,8.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Cat", formspec) + else + local inv = minetest.get_player_by_name(self.owner):get_inventory() + inv:set_size("cat",8) + local player_name = clicker:get_player_name() + local formspec = "size[8,8.5]" + .."list[current_player;cat;0,2;8,1]" + .."list[current_player;main;0,4.5;8,4]" + .."listring[current_player;cat]" + .."listring[current_player;main]" + .."background[8,8.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + if self.metadata == 1 then + formspec = formspec .."button[0,0;2.0,0.5;texture21;Texture:ginger]" + end + if self.metadata == 2 then + formspec = formspec .."button[0,0;2.0,0.5;texture22;Texture:sandy]" + end + if self.metadata == 3 then + formspec = formspec .."button[0,0;2.0,0.5;texture23;Texture:splotchy]" + end + if self.metadata == 4 then + formspec = formspec .."button[0,0;2.0,0.5;texture24;Texture:striped]" + end + if self.metadata2 == 1 then + formspec = formspec .."button[3,0;2.0,0.5;move1;Move:stand]" + end + if self.metadata2 == 2 then + formspec = formspec .."button[3,0;2.0,0.5;move2;Move:follow]" + end + minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Cat", formspec) + end + end + if self.name == "mobs:dragon" then + if self.owner ~= clicker:get_player_name() then + local player_name = clicker:get_player_name() + local formspec = "size[3,1]" + .."label[0,0;You are not the owner!!]" + .."background[3,1;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Dragon", formspec) + else + local inv = minetest.get_player_by_name(self.owner):get_inventory() + local player_name = clicker:get_player_name() + inv:set_size("dragon", 1) + local formspec = "size[8,8.5]" + .."list[current_player;dragon;3.5,2.5;1,1]" + .."label[1,1;Dragon produce a dragon gift/gem gift lv.1 after some time]" + .."label[2.4,3.5;Regnum crystal for gem gift]" + .."list[current_player;main;0,4.5;8,4]" + .."listring[current_player;dragon]" + .."listring[current_player;main]" + .."background[8,8.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + if self.metadata == 1 then + formspec = formspec .."button[0,0;2.0,0.5;texture31;Texture:yellow]" + end + if self.metadata == 2 then + formspec = formspec .."button[0,0;2.0,0.5;texture32;Texture:blue]" + end + if self.metadata == 3 then + formspec = formspec .."button[0,0;2.0,0.5;texture33;Texture:green]" + end + if self.metadata == 4 then + formspec = formspec .."button[0,0;2.0,0.5;texture34;Texture:black]" + end + if self.metadata == 5 then + formspec = formspec .."button[0,0;2.0,0.5;texture35;Texture:great]" + end + if self.metadata == 6 then + formspec = formspec .."button[0,0;2.0,0.5;texture36;Texture:red]" + end + if self.metadata2 == 1 then + formspec = formspec .."button[3,0;2.0,0.5;move1;Move:stand]" + end + if self.metadata2 == 2 then + formspec = formspec .."button[3,0;2.0,0.5;move2;Move:follow]" + end + minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Dragon", formspec) + end + end + if self.name == "mobs:sheep" then + if self.owner ~= clicker:get_player_name() then + local player_name = clicker:get_player_name() + local formspec = "size[3,1]" + .."label[0,0;You are not the owner!!]" + .."background[3,1;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Sheep", formspec) + else + local inv = minetest.get_player_by_name(self.owner):get_inventory() + inv:set_size("sheep",1) + inv:set_size("sheep2",1) + inv:set_size("sheep3",1) + local player_name = clicker:get_player_name() + local formspec = "size[8,8.5]" + .."list[current_player;main;0,3.5;8,4]" + .."list[current_player;sheep;3.5,1;1,1]" + .."label[3.5,2;Set Color]" + .."listring[current_player;sheep]" + .."listring[current_player;main]" + .."background[8,8.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + if self.metadata2 == 1 then + formspec = formspec .."button[0,0;2.0,0.5;move1;Move:stand]" + end + if self.metadata2 == 2 then + formspec = formspec .."button[0,0;2.0,0.5;move2;Move:follow]" + end + minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Sheep", formspec) + end + end + if self.name == "mobs:fox" then + if self.owner ~= clicker:get_player_name() then + local player_name = clicker:get_player_name() + local formspec = "size[3,1]" + .."label[0,0;You are not the owner!!]" + minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Fox", formspec) + else + local inv = minetest.get_player_by_name(self.owner):get_inventory() + + local player_name = clicker:get_player_name() + local formspec = "size[8,8.5]" + .."label[0,1.2;Fox produce a Foxkey and Treasures after some time]" + .."background[8,8.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + if self.metadata == 1 then + formspec = formspec .."button[0,0;2.0,0.5;texture41;Texture:light]" + end + if self.metadata == 2 then + formspec = formspec .."button[0,0;2.0,0.5;texture42;Texture:dark]" + end + if self.metadata2 == 1 then + formspec = formspec .."button[3,0;2.0,0.5;move1;Move:stand]" + end + if self.metadata2 == 2 then + formspec = formspec .."button[3,0;2.0,0.5;move2;Move:follow]" + end + minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Fox", formspec) + end + end + if self.name == "mobs:tortoise" then + if self.owner ~= clicker:get_player_name() then + local player_name = clicker:get_player_name() + local formspec = "size[3,1]" + .."label[0,0;You are not the owner!!]" + .."background[3,1;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Tortoise", formspec) + else + local inv = minetest.get_player_by_name(self.owner):get_inventory() + inv:set_size("tortoise", 1) + local player_name = clicker:get_player_name() + local formspec = "size[8,8.5]" + .."label[1,1;Tortoise produce a tortoise gift/gem gift lv.2 after some time]" + .."label[2.4,3.5;Regnum crystal for gem gift]" + .."list[current_player;main;0,4.5;8,4]" + .."list[current_player;tortoise;3.5,2.5;1,1]" + .."listring[current_player;tortoise]" + .."listring[current_player;main]" + .."background[8,8.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + if self.metadata2 == 1 then + formspec = formspec .."button[0,0;2.0,0.5;move1;Move:stand]" + end + if self.metadata2 == 2 then + formspec = formspec .."button[0,0;2.0,0.5;move2;Move:follow]" + end + minetest.show_formspec(player_name, "npcf_"..self.owner.."'s Tortoise", formspec) + end + end + if self.name == "mobs:knight_1248" then + if self.owner ~= clicker:get_player_name() then + local player_name = clicker:get_player_name() + local formspec = "size[3,1]" + .."label[0,0;You are not the owner!!]" + .."background[3,1;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + minetest.show_formspec(player_name, "npcf_"..self.owner.."'s 1248 Knight", formspec) + else + local player_name = clicker:get_player_name() + local formspec = "size[8,8.5]" + .."background[8,8.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + if self.metadata2 == 1 then + formspec = formspec .."button[0,0;2.0,0.5;move1;Move:stand]" + end + if self.metadata2 == 2 then + formspec = formspec .."button[0,0;2.0,0.5;move2;Move:follow]" + end + formspec = formspec .."label[0,1;Hello my name is 1248]" + .."label[0,1.3;Bring me an empty color stick and we can leave this world]" + formspec = formspec .."button[3,4;2.0,0.5;leave;I've got color stick]" + minetest.show_formspec(player_name, "npcf_"..self.owner.."'s 1248 Knight", formspec) + end + end +end + +function receive_fields(self, fields, sender) + if self.owner == sender:get_player_name() then + if fields.leave then + local player_name = sender:get_player_name() + if minetest.get_player_by_name(self.owner):get_inventory():contains_item("main", "tutorial:colorstick_empty") then + local formspec = "size[4,2.5]" + .."label[0,0;You have won Regnum]" + .."label[0,0.3;You have enough technology to leave this world]" + .."label[0,0.6;and to go to another.....]" + .."label[0,0.9;Thank you for playing Regnum]" + .."label[0,1.2;your 1248]" + .."background[4,2.5;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + minetest.show_formspec(player_name, "npcf_"..self.owner.."'s 1248 Knight", formspec) + end + else + if fields.texture11 then + self.object:set_properties({textures={"mobs_dog2.png"}}) + self.metadata = 2 + update(self, sender) + elseif fields.texture12 then + self.object:set_properties({textures={"mobs_dog.png"}}) + self.metadata = 1 + update(self, sender) + elseif fields.texture21 then + self.object:set_properties({textures={"mobs_kitten.png"}}) + self.metadata = 2 + update(self, sender) + elseif fields.texture22 then + self.object:set_properties({textures={"mobs_kitten2.png"}}) + self.metadata = 3 + update(self, sender) + elseif fields.texture23 then + self.object:set_properties({textures={"mobs_kitten3.png"}}) + self.metadata = 4 + update(self, sender) + elseif fields.texture24 then + self.object:set_properties({textures={"mobs_kitten4.png"}}) + self.metadata = 1 + update(self, sender) + elseif fields.texture31 then + self.object:set_properties({textures={"mobs_dragon_yellow.png"}}) + self.metadata = 2 + update(self, sender) + elseif fields.texture32 then + self.object:set_properties({textures={"mobs_dragon_blue.png"}}) + self.metadata = 3 + update(self, sender) + elseif fields.texture33 then + self.object:set_properties({textures={"mobs_dragon_green.png"}}) + self.metadata = 4 + update(self, sender) + elseif fields.texture34 then + self.object:set_properties({textures={"mobs_dragon_black.png"}}) + self.metadata = 5 + update(self, sender) + elseif fields.texture35 then + self.object:set_properties({textures={"mobs_dragon_great.png"}}) + self.metadata = 6 + update(self, sender) + elseif fields.texture36 then + self.object:set_properties({textures={"mobs_dragon_red.png"}}) + self.metadata = 1 + update(self, sender) + elseif fields.texture41 then + self.object:set_properties({textures={"mobs_fox1.png"}}) + self.metadata = 2 + update(self, sender) + elseif fields.texture42 then + self.object:set_properties({textures={"mobs_fox.png"}}) + self.metadata = 1 + update(self, sender) + elseif fields.move1 then + self.walk_velocity = 0 + self.run_velocity = 0 + self.metadata2 = 2 + update(self, sender) + elseif fields.move2 then + self.walk_velocity = 1 + self.run_velocity = 3 + self.metadata2 = 1 + update(self, sender) + end + end + end +end +minetest.register_on_player_receive_fields(function(player, formname, fields) + for _,ref in pairs(minetest.luaentities) do + if ref.object and ref.type and ref.npc_name then + if ref.type == "npc" and ("npcf_"..ref.npc_name) == formname then + ref.on_receive_fields(ref, fields, player) + end + end + end +end) + +--[[ + ~100 metadata3 = 0, in mob_class = ... + ~1120 check for animals after nodef.damage_per_second ~= 0 + ~2890 deactivate punch_interval after add weapon wear + ~2920 deactivate hitter:set_wielded_item(weapon) after mobs.is_creative ... + ~2960 check for animals after 'do damage' + ~3270 activate immortal after 'Armor groups (immortal = 1 for custom damage handling)' + ~3290 first activate(self) after 'set anything changed above' and self.object:set_properties(self) + ~3360 first_step(self) after 'main mob function' and function mob_class:on_step(dtime, moveresult) + ~3660 metadata = def.metadata, in minetest.register_entity ... + ~3660 metadata2 = def.metadata2, in minetest.register_entity ... + ~3680 on_rightclick = ... in minetest.register_entity ... + ~3680 on_receive_fields = ... in minetest.register_entity ... +--]] \ No newline at end of file diff --git a/mods/mobs/knight.lua b/mods/mobs/knight.lua index 156228e..ace3517 100644 --- a/mods/mobs/knight.lua +++ b/mods/mobs/knight.lua @@ -26,6 +26,8 @@ mobs:register_mob("mobs:knight_1248", { lava_damage = 0, light_damage = 0, fall_damage = 0, + suffocation = 0, + knock_back = false, metadata = 1, metadata2 = 1, animation = { diff --git a/mods/mobs/monsterx1.lua b/mods/mobs/monsterx1.lua index 44c1ecc..f0a55e8 100644 --- a/mods/mobs/monsterx1.lua +++ b/mods/mobs/monsterx1.lua @@ -774,6 +774,336 @@ mobs:register_mob("mobs:green_monster", { }, }) +mobs:register_mob("mobs:dry_dirt_monster", { + type = "monster", + passive = false, + attack_type = "dogfight", + attack_npcs = false, + damage = 1, + hp_min = 4, + hp_max = 8, + armor = 100, + visual_size = {x=3, y=2.6}, + collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.9, 0.4}, + visual = "mesh", + mesh = "mobs_stone_monster.x", + textures = { + {"mobs_dry_dirt_monster.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "mobs_dirtmonster", + }, + view_range = 15, + walk_velocity = 1, + run_velocity = 3, + jump = true, + drops = { + {name = "tutorial:geschenkpapier", + chance = 1, + min = 2, + max = 4}, + {name = "tutorial:geschenkpapier_death", + chance = 2, + min = 2, + max = 4}, + {name = "tutorial:dna_string", + chance = 2, + min = 1, + max = 1}, + }, + water_damage = 1, + lava_damage = 5, + light_damage = 0, + animation = { + speed_normal = 15, + speed_run = 15, + stand_start = 0, + stand_end = 14, + walk_start = 15, + walk_end = 38, + run_start = 40, + run_end = 63, + punch_start = 40, + punch_end = 63, + }, +}) + +mobs:register_mob("mobs:clay_monster", { + type = "monster", + passive = false, + attack_type = "dogfight", + attack_npcs = false, + damage = 1, + hp_min = 4, + hp_max = 8, + armor = 100, + visual_size = {x=3, y=2.6}, + collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.9, 0.4}, + visual = "mesh", + mesh = "mobs_stone_monster.x", + textures = { + {"mobs_clay_monster.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "mobs_dirtmonster", + }, + view_range = 15, + walk_velocity = 1, + run_velocity = 3, + jump = true, + drops = { + {name = "tutorial:geschenkpapier", + chance = 1, + min = 2, + max = 4}, + {name = "tutorial:geschenkpapier_death", + chance = 2, + min = 2, + max = 4}, + {name = "tutorial:dna_string", + chance = 2, + min = 1, + max = 1}, + }, + water_damage = 1, + lava_damage = 5, + light_damage = 0, + animation = { + speed_normal = 15, + speed_run = 15, + stand_start = 0, + stand_end = 14, + walk_start = 15, + walk_end = 38, + run_start = 40, + run_end = 63, + punch_start = 40, + punch_end = 63, + }, +}) + +mobs:register_mob("mobs:gravel_monster", { + type = "monster", + passive = false, + attack_type = "dogfight", + attack_npcs = false, + damage = 1, + hp_min = 4, + hp_max = 8, + armor = 100, + visual_size = {x=3, y=2.6}, + collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.9, 0.4}, + visual = "mesh", + mesh = "mobs_stone_monster.x", + textures = { + {"mobs_gravel_monster.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "mobs_dirtmonster", + }, + view_range = 15, + walk_velocity = 1, + run_velocity = 3, + jump = true, + drops = { + {name = "tutorial:geschenkpapier", + chance = 1, + min = 2, + max = 4}, + {name = "tutorial:geschenkpapier_death", + chance = 2, + min = 2, + max = 4}, + {name = "tutorial:dna_string", + chance = 2, + min = 1, + max = 1}, + }, + water_damage = 1, + lava_damage = 5, + light_damage = 0, + animation = { + speed_normal = 15, + speed_run = 15, + stand_start = 0, + stand_end = 14, + walk_start = 15, + walk_end = 38, + run_start = 40, + run_end = 63, + punch_start = 40, + punch_end = 63, + }, +}) + +mobs:register_mob("mobs:coniferous_litter_monster", { + type = "monster", + passive = false, + attack_type = "dogfight", + attack_npcs = false, + damage = 1, + hp_min = 4, + hp_max = 8, + armor = 100, + visual_size = {x=3, y=2.6}, + collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.9, 0.4}, + visual = "mesh", + mesh = "mobs_stone_monster.x", + textures = { + {"mobs_coniferous_litter_monster.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "mobs_dirtmonster", + }, + view_range = 15, + walk_velocity = 1, + run_velocity = 3, + jump = true, + drops = { + {name = "tutorial:geschenkpapier", + chance = 1, + min = 2, + max = 4}, + {name = "tutorial:geschenkpapier_death", + chance = 2, + min = 2, + max = 4}, + {name = "tutorial:dna_string", + chance = 2, + min = 1, + max = 1}, + }, + water_damage = 1, + lava_damage = 5, + light_damage = 0, + animation = { + speed_normal = 15, + speed_run = 15, + stand_start = 0, + stand_end = 14, + walk_start = 15, + walk_end = 38, + run_start = 40, + run_end = 63, + punch_start = 40, + punch_end = 63, + }, +}) + +mobs:register_mob("mobs:moss_monster", { + type = "monster", + passive = false, + attack_type = "dogfight", + attack_npcs = false, + damage = 1, + hp_min = 4, + hp_max = 8, + armor = 100, + visual_size = {x=3, y=2.6}, + collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.9, 0.4}, + visual = "mesh", + mesh = "mobs_stone_monster.x", + textures = { + {"mobs_moss_monster.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "mobs_dirtmonster", + }, + view_range = 15, + walk_velocity = 1, + run_velocity = 3, + jump = true, + drops = { + {name = "tutorial:geschenkpapier", + chance = 1, + min = 2, + max = 4}, + {name = "tutorial:geschenkpapier_death", + chance = 2, + min = 2, + max = 4}, + {name = "tutorial:dna_string", + chance = 2, + min = 1, + max = 1}, + }, + water_damage = 1, + lava_damage = 5, + light_damage = 0, + animation = { + speed_normal = 15, + speed_run = 15, + stand_start = 0, + stand_end = 14, + walk_start = 15, + walk_end = 38, + run_start = 40, + run_end = 63, + punch_start = 40, + punch_end = 63, + }, +}) + +mobs:register_mob("mobs:permafrost_monster", { + type = "monster", + passive = false, + attack_type = "dogfight", + attack_npcs = false, + damage = 1, + hp_min = 4, + hp_max = 8, + armor = 100, + visual_size = {x=3, y=2.6}, + collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.9, 0.4}, + visual = "mesh", + mesh = "mobs_stone_monster.x", + textures = { + {"mobs_permafrost_monster.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "mobs_dirtmonster", + }, + view_range = 15, + walk_velocity = 1, + run_velocity = 3, + jump = true, + drops = { + {name = "tutorial:geschenkpapier", + chance = 1, + min = 2, + max = 4}, + {name = "tutorial:geschenkpapier_death", + chance = 2, + min = 2, + max = 4}, + {name = "tutorial:dna_string", + chance = 2, + min = 1, + max = 1}, + }, + water_damage = 1, + lava_damage = 5, + light_damage = 0, + animation = { + speed_normal = 15, + speed_run = 15, + stand_start = 0, + stand_end = 14, + walk_start = 15, + walk_end = 38, + run_start = 40, + run_end = 63, + punch_start = 40, + punch_end = 63, + }, +}) + mobs:register_mob("mobs:dry_grass_monster", { type = "monster", passive = false, @@ -884,10 +1214,16 @@ mobs:register_mob("mobs:rainforest_litter_monster", { }, }) +mobs:register_spawn("mobs:dry_dirt_monster", {"default:dry_dirt"}, 20, -1, 1, 2, 31000) +mobs:register_spawn("mobs:clay_monster", {"default:clay"}, 20, -1, 1, 2, 31000) +mobs:register_spawn("mobs:gravel_monster", {"default:gravel"}, 20, -1, 1, 2, 31000) +mobs:register_spawn("mobs:coniferous_litter_monster", {"default:dirt_with_coniferous_litter"}, 20, -1, 1, 2, 31000) +mobs:register_spawn("mobs:moss_monster", {"default:permafrost_with_moss"}, 20, -1, 1, 2, 31000) +mobs:register_spawn("mobs:permafrost_monster", {"default:permafrost","default:permafrost_with_stones"}, 20, -1, 1, 2, 31000) mobs:register_spawn("mobs:dirt_monster", {"default:dirt"}, 20, -1, 1, 2, 31000) mobs:register_spawn("mobs:rainforest_litter_monster", {"default:dirt_with_rainforest_litter"}, 20, -1, 1, 2, 31000) mobs:register_spawn("mobs:green_monster", {"default:dirt_with_grass"}, 20, -1, 1, 2, 31000) -mobs:register_spawn("mobs:dry_grass_monster", {"default:dirt_with_dry_grass"}, 20, -1, 1, 2, 31000) +mobs:register_spawn("mobs:dry_grass_monster", {"default:dirt_with_dry_grass","default:dry_dirt_with_dry_grass"}, 20, -1, 1, 2, 31000) mobs:register_spawn("mobs:sand_monster", {"default:sand"}, 20, -1, 1, 2, 31000) mobs:register_spawn("mobs:silver_sand_monster", {"default:silver_sand"}, 20, -1, 1, 2, 31000) mobs:register_spawn("mobs:stone_monster", {"default:stone", "default:cobble", "default:mossycobble"}, 20, -1, 1, 2, 31000) diff --git a/mods/mobs/sheep.lua b/mods/mobs/sheep.lua index 7585fb4..b5cabb0 100644 --- a/mods/mobs/sheep.lua +++ b/mods/mobs/sheep.lua @@ -26,6 +26,8 @@ mobs:register_mob("mobs:sheep", { lava_damage = 0, light_damage = 0, fall_damage = 0, + suffocation = 0, + knock_back = false, metadata = 1, metadata2 = 1, animation = { diff --git a/mods/mobs/textures/mobs_clay_monster.png b/mods/mobs/textures/mobs_clay_monster.png new file mode 100644 index 0000000..cbec95e Binary files /dev/null and b/mods/mobs/textures/mobs_clay_monster.png differ diff --git a/mods/mobs/textures/mobs_coniferous_litter_monster.png b/mods/mobs/textures/mobs_coniferous_litter_monster.png new file mode 100644 index 0000000..d8f1555 Binary files /dev/null and b/mods/mobs/textures/mobs_coniferous_litter_monster.png differ diff --git a/mods/mobs/textures/mobs_dry_dirt_monster.png b/mods/mobs/textures/mobs_dry_dirt_monster.png new file mode 100644 index 0000000..903d1d2 Binary files /dev/null and b/mods/mobs/textures/mobs_dry_dirt_monster.png differ diff --git a/mods/mobs/textures/mobs_gravel_monster.png b/mods/mobs/textures/mobs_gravel_monster.png new file mode 100644 index 0000000..d516d7d Binary files /dev/null and b/mods/mobs/textures/mobs_gravel_monster.png differ diff --git a/mods/mobs/textures/mobs_moss_monster.png b/mods/mobs/textures/mobs_moss_monster.png new file mode 100644 index 0000000..a0f73da Binary files /dev/null and b/mods/mobs/textures/mobs_moss_monster.png differ diff --git a/mods/mobs/textures/mobs_permafrost_monster.png b/mods/mobs/textures/mobs_permafrost_monster.png new file mode 100644 index 0000000..110a2e7 Binary files /dev/null and b/mods/mobs/textures/mobs_permafrost_monster.png differ diff --git a/mods/mobs/tortoise.lua b/mods/mobs/tortoise.lua index 8395416..2f1e525 100644 --- a/mods/mobs/tortoise.lua +++ b/mods/mobs/tortoise.lua @@ -26,6 +26,8 @@ mobs:register_mob("mobs:tortoise", { lava_damage = 0, light_damage = 0, fall_damage = 0, + suffocation = 0, + knock_back = false, metadata = 1, metadata2 = 1, animation = { diff --git a/mods/nether/README.txt b/mods/nether/README.txt deleted file mode 100644 index 4206d0e..0000000 --- a/mods/nether/README.txt +++ /dev/null @@ -1,25 +0,0 @@ -Minetest 0.4 mod: nether -======================== - -License of source code: ------------------------ -Copyright (C) 2013 PilzAdam - -This program is free software. It comes without any warranty, to -the extent permitted by applicable law. You can redistribute it -and/or modify it under the terms of the Do What The Fuck You Want -To Public License, Version 2, as published by Sam Hocevar. See -http://sam.zoy.org/wtfpl/COPYING for more details. - -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 ------------------------ -Everything not listed in here: -Copyright (C) 2013 PilzAdam - -nether_rack.png: Zeg9 -nether_glowstone.png: BlockMen diff --git a/mods/nether/depends.txt b/mods/nether/depends.txt deleted file mode 100644 index c5f1f37..0000000 --- a/mods/nether/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -default -stairs? diff --git a/mods/nether/init.lua b/mods/nether/init.lua deleted file mode 100644 index 844143b..0000000 --- a/mods/nether/init.lua +++ /dev/null @@ -1,422 +0,0 @@ --- Minetest 0.4 Mod: Nether - -local NETHER_DEPTH = -5000 - -minetest.register_node("nether:portal", { - description = "Nether Portal", - tiles = { - "nether_transparent.png", - "nether_transparent.png", - "nether_transparent.png", - "nether_transparent.png", - { - name = "nether_portal.png", - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 0.5, - }, - }, - { - name = "nether_portal.png", - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 0.5, - }, - }, - }, - drawtype = "nodebox", - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - use_texture_alpha = true, - walkable = false, - digable = false, - pointable = false, - buildable_to = false, - drop = "", - light_source = 5, - post_effect_color = {a=180, r=128, g=0, b=128}, - alpha = 192, - node_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.1, 0.5, 0.5, 0.1}, - }, - }, - groups = {not_in_creative_inventory=1} -}) - -local function build_portal(pos, target) - local p = {x=pos.x-1, y=pos.y-1, z=pos.z} - local p1 = {x=pos.x-1, y=pos.y-1, z=pos.z} - local p2 = {x=p1.x+3, y=p1.y+4, z=p1.z} - for i=1,4 do - minetest.set_node(p, {name="default:obsidian"}) - p.y = p.y+1 - end - for i=1,3 do - minetest.set_node(p, {name="default:obsidian"}) - p.x = p.x+1 - end - for i=1,4 do - minetest.set_node(p, {name="default:obsidian"}) - p.y = p.y-1 - end - for i=1,3 do - minetest.set_node(p, {name="default:obsidian"}) - p.x = p.x-1 - end - for x=p1.x,p2.x do - for y=p1.y,p2.y do - p = {x=x, y=y, z=p1.z} - if not (x == p1.x or x == p2.x or y==p1.y or y==p2.y) then - minetest.set_node(p, {name="nether:portal", param2=0}) - end - local meta = minetest.get_meta(p) - meta:set_string("p1", minetest.pos_to_string(p1)) - meta:set_string("p2", minetest.pos_to_string(p2)) - meta:set_string("target", minetest.pos_to_string(target)) - - if y ~= p1.y then - for z=-2,2 do - if z ~= 0 then - p.z = p.z+z - if minetest.registered_nodes[minetest.get_node(p).name].is_ground_content then - minetest.remove_node(p) - end - p.z = p.z-z - end - end - end - - end - end -end - -minetest.register_abm({ - nodenames = {"nether:portal"}, - interval = 1, - chance = 2, - action = function(pos, node) - minetest.add_particlespawner( - 32, --amount - 4, --time - {x=pos.x-0.25, y=pos.y-0.25, z=pos.z-0.25}, --minpos - {x=pos.x+0.25, y=pos.y+0.25, z=pos.z+0.25}, --maxpos - {x=-0.8, y=-0.8, z=-0.8}, --minvel - {x=0.8, y=0.8, z=0.8}, --maxvel - {x=0,y=0,z=0}, --minacc - {x=0,y=0,z=0}, --maxacc - 0.5, --minexptime - 1, --maxexptime - 1, --minsize - 2, --maxsize - false, --collisiondetection - "nether_particle.png" --texture - ) - for _,obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do - if obj:is_player() then - local meta = minetest.get_meta(pos) - local target = minetest.string_to_pos(meta:get_string("target")) - if target then - minetest.after(3, function(obj, pos, target) - local objpos = obj:getpos() - objpos.y = objpos.y+0.1 -- Fix some glitches at -8000 - if minetest.get_node(objpos).name ~= "nether:portal" then - return - end - - obj:setpos(target) - - local function check_and_build_portal(pos, target) - local n = minetest.get_node_or_nil(target) - if n and n.name ~= "nether:portal" then - build_portal(target, pos) - minetest.after(2, check_and_build_portal, pos, target) - minetest.after(4, check_and_build_portal, pos, target) - elseif not n then - minetest.after(1, check_and_build_portal, pos, target) - end - end - - minetest.after(1, check_and_build_portal, pos, target) - - end, obj, pos, target) - end - end - end - end, -}) - -local function move_check(p1, max, dir) - local p = {x=p1.x, y=p1.y, z=p1.z} - local d = math.abs(max-p1[dir]) / (max-p1[dir]) - while p[dir] ~= max do - p[dir] = p[dir] + d - if minetest.get_node(p).name ~= "default:obsidian" then - return false - end - end - return true -end - -local function check_portal(p1, p2) - if p1.x ~= p2.x then - if not move_check(p1, p2.x, "x") then - return false - end - if not move_check(p2, p1.x, "x") then - return false - end - elseif p1.z ~= p2.z then - if not move_check(p1, p2.z, "z") then - return false - end - if not move_check(p2, p1.z, "z") then - return false - end - else - return false - end - - if not move_check(p1, p2.y, "y") then - return false - end - if not move_check(p2, p1.y, "y") then - return false - end - - return true -end - -local function is_portal(pos) - for d=-3,3 do - for y=-4,4 do - local px = {x=pos.x+d, y=pos.y+y, z=pos.z} - local pz = {x=pos.x, y=pos.y+y, z=pos.z+d} - if check_portal(px, {x=px.x+3, y=px.y+4, z=px.z}) then - return px, {x=px.x+3, y=px.y+4, z=px.z} - end - if check_portal(pz, {x=pz.x, y=pz.y+4, z=pz.z+3}) then - return pz, {x=pz.x, y=pz.y+4, z=pz.z+3} - end - end - end -end - -local function make_portal(pos) - local p1, p2 = is_portal(pos) - if not p1 or not p2 then - return false - end - - for d=1,2 do - for y=p1.y+1,p2.y-1 do - local p - if p1.z == p2.z then - p = {x=p1.x+d, y=y, z=p1.z} - else - p = {x=p1.x, y=y, z=p1.z+d} - end - if minetest.get_node(p).name ~= "air" then - return false - end - end - end - - local param2 - if p1.z == p2.z then param2 = 0 else param2 = 1 end - - local target = {x=p1.x, y=p1.y, z=p1.z} - target.x = target.x + 1 - if target.y < NETHER_DEPTH then - target.y = math.random(-50, 20) - else - target.y = NETHER_DEPTH - math.random(500, 1500) - end - - for d=0,3 do - for y=p1.y,p2.y do - local p = {} - if param2 == 0 then p = {x=p1.x+d, y=y, z=p1.z} else p = {x=p1.x, y=y, z=p1.z+d} end - if minetest.get_node(p).name == "air" then - minetest.set_node(p, {name="nether:portal", param2=param2}) - end - local meta = minetest.get_meta(p) - meta:set_string("p1", minetest.pos_to_string(p1)) - meta:set_string("p2", minetest.pos_to_string(p2)) - meta:set_string("target", minetest.pos_to_string(target)) - end - end - return true -end - -minetest.register_node(":default:obsidian", { - description = "Obsidian", - tiles = {"default_obsidian.png"}, - is_ground_content = true, - sounds = default.node_sound_stone_defaults(), - groups = {cracky=1,level=2}, - - on_destruct = function(pos) - local meta = minetest.get_meta(pos) - local p1 = minetest.string_to_pos(meta:get_string("p1")) - local p2 = minetest.string_to_pos(meta:get_string("p2")) - local target = minetest.string_to_pos(meta:get_string("target")) - if not p1 or not p2 then - return - end - for x=p1.x,p2.x do - for y=p1.y,p2.y do - for z=p1.z,p2.z do - local nn = minetest.get_node({x=x,y=y,z=z}).name - if nn == "default:obsidian" or nn == "nether:portal" then - if nn == "nether:portal" then - minetest.remove_node({x=x,y=y,z=z}) - end - local m = minetest.get_meta({x=x,y=y,z=z}) - m:set_string("p1", "") - m:set_string("p2", "") - m:set_string("target", "") - end - end - end - end - meta = minetest.get_meta(target) - if not meta then - return - end - p1 = minetest.string_to_pos(meta:get_string("p1")) - p2 = minetest.string_to_pos(meta:get_string("p2")) - if not p1 or not p2 then - return - end - for x=p1.x,p2.x do - for y=p1.y,p2.y do - for z=p1.z,p2.z do - local nn = minetest.get_node({x=x,y=y,z=z}).name - if nn == "default:obsidian" or nn == "nether:portal" then - if nn == "nether:portal" then - minetest.remove_node({x=x,y=y,z=z}) - end - local m = minetest.get_meta({x=x,y=y,z=z}) - m:set_string("p1", "") - m:set_string("p2", "") - m:set_string("target", "") - end - end - end - end - end, -}) - -minetest.register_craftitem(":nether:admin", { - description = "Admin Nether", - inventory_image = "tutorial_adminbattleaxe.png", - on_place = function(stack,_, pt) - if pt.under and minetest.get_node(pt.under).name == "default:obsidian" then - local done = make_portal(pt.under) - if done and not minetest.setting_getbool("creative_mode") then - stack:take_item() - end - end - return stack - end, -}) - -minetest.register_node("nether:rack", { - description = "Netherrack", - tiles = {"nether_rack.png"}, - is_ground_content = true, - drop = { - max_items = 1, - items = {{ - rarity = 3, - items = {"nether:rack"}, - }} - }, - groups = {cracky=3,level=2}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("nether:sand", { - description = "Nethersand", - tiles = {"nether_sand.png"}, - is_ground_content = true, - groups = {crumbly=3,level=2,falling_node=1}, - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_gravel_footstep", gain=0.45}, - }), -}) - -minetest.register_node("nether:glowstone", { - description = "Glowstone", - tiles = {"nether_glowstone.png"}, - is_ground_content = true, - light_source = 13, - groups = {cracky=3,oddly_breakable_by_hand=3}, - sounds = default.node_sound_glass_defaults(), -}) - -minetest.register_node("nether:brick", { - description = "Nether Brick", - tiles = {"nether_brick.png"}, - groups = {cracky=13,level=2}, - sounds = default.node_sound_stone_defaults(), -}) - -local air = minetest.get_content_id("air") -local stone_with_coal = minetest.get_content_id("default:stone_with_coal") -local stone_with_iron = minetest.get_content_id("default:stone_with_iron") -local stone_with_mese = minetest.get_content_id("default:stone_with_mese") -local stone_with_diamond = minetest.get_content_id("default:stone_with_diamond") -local stone_with_gold = minetest.get_content_id("default:stone_with_gold") -local stone_with_copper = minetest.get_content_id("default:stone_with_copper") -local gravel = minetest.get_content_id("default:gravel") -local dirt = minetest.get_content_id("default:dirt") -local sand = minetest.get_content_id("default:sand") -local cobble = minetest.get_content_id("default:cobble") -local mossycobble = minetest.get_content_id("default:mossycobble") -local stair_cobble = minetest.get_content_id("stairs:stair_cobble") -local lava_source = minetest.get_content_id("default:lava_source") -local lava_flowing = minetest.get_content_id("default:lava_flowing") -local glowstone = minetest.get_content_id("nether:glowstone") -local nethersand = minetest.get_content_id("nether:sand") -local netherbrick = minetest.get_content_id("nether:brick") -local netherrack = minetest.get_content_id("nether:rack") - -minetest.register_on_generated(function(minp, maxp, seed) - if maxp.y > NETHER_DEPTH then - return - end - local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") - local data = vm:get_data() - local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax} - for i in area:iterp(minp, maxp) do - local d = data[i] - if d == air or d == stone_with_coal or d == stone_with_iron then - data[i] = air - elseif d == stone_with_mese or d == stone_with_diamond or d == lava_source then - data[i] = lava_source - elseif d == lava_flowing then - -- nothing - elseif d == stone_with_gold then - data[i] = glowstone - elseif d == stone_with_copper or d == gravel or d == dirt or d == sand then - data[i] = nethersand - elseif d == cobble or d == mossycobble or d == stair_cobble then - data[i] = netherbrick - else - data[i] = netherrack - end - end - vm:set_data(data) - --vm:set_lighting({day=0, night=0}) - vm:calc_lighting() - vm:update_liquids() - vm:write_to_map() -end) diff --git a/mods/nether/init.lua~ b/mods/nether/init.lua~ deleted file mode 100644 index 8a86f4c..0000000 --- a/mods/nether/init.lua~ +++ /dev/null @@ -1,422 +0,0 @@ --- Minetest 0.4 Mod: Nether - -local NETHER_DEPTH = -5000 - -minetest.register_node("nether:portal", { - description = "Nether Portal", - tiles = { - "nether_transparent.png", - "nether_transparent.png", - "nether_transparent.png", - "nether_transparent.png", - { - name = "nether_portal.png", - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 0.5, - }, - }, - { - name = "nether_portal.png", - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 0.5, - }, - }, - }, - drawtype = "nodebox", - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - use_texture_alpha = true, - walkable = false, - digable = false, - pointable = false, - buildable_to = false, - drop = "", - light_source = 5, - post_effect_color = {a=180, r=128, g=0, b=128}, - alpha = 192, - node_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.1, 0.5, 0.5, 0.1}, - }, - }, - groups = {not_in_creative_inventory=1} -}) - -local function build_portal(pos, target) - local p = {x=pos.x-1, y=pos.y-1, z=pos.z} - local p1 = {x=pos.x-1, y=pos.y-1, z=pos.z} - local p2 = {x=p1.x+3, y=p1.y+4, z=p1.z} - for i=1,4 do - minetest.set_node(p, {name="default:obsidian"}) - p.y = p.y+1 - end - for i=1,3 do - minetest.set_node(p, {name="default:obsidian"}) - p.x = p.x+1 - end - for i=1,4 do - minetest.set_node(p, {name="default:obsidian"}) - p.y = p.y-1 - end - for i=1,3 do - minetest.set_node(p, {name="default:obsidian"}) - p.x = p.x-1 - end - for x=p1.x,p2.x do - for y=p1.y,p2.y do - p = {x=x, y=y, z=p1.z} - if not (x == p1.x or x == p2.x or y==p1.y or y==p2.y) then - minetest.set_node(p, {name="nether:portal", param2=0}) - end - local meta = minetest.get_meta(p) - meta:set_string("p1", minetest.pos_to_string(p1)) - meta:set_string("p2", minetest.pos_to_string(p2)) - meta:set_string("target", minetest.pos_to_string(target)) - - if y ~= p1.y then - for z=-2,2 do - if z ~= 0 then - p.z = p.z+z - if minetest.registered_nodes[minetest.get_node(p).name].is_ground_content then - minetest.remove_node(p) - end - p.z = p.z-z - end - end - end - - end - end -end - -minetest.register_abm({ - nodenames = {"nether:portal"}, - interval = 1, - chance = 2, - action = function(pos, node) - minetest.add_particlespawner( - 32, --amount - 4, --time - {x=pos.x-0.25, y=pos.y-0.25, z=pos.z-0.25}, --minpos - {x=pos.x+0.25, y=pos.y+0.25, z=pos.z+0.25}, --maxpos - {x=-0.8, y=-0.8, z=-0.8}, --minvel - {x=0.8, y=0.8, z=0.8}, --maxvel - {x=0,y=0,z=0}, --minacc - {x=0,y=0,z=0}, --maxacc - 0.5, --minexptime - 1, --maxexptime - 1, --minsize - 2, --maxsize - false, --collisiondetection - "nether_particle.png" --texture - ) - for _,obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do - if obj:is_player() then - local meta = minetest.get_meta(pos) - local target = minetest.string_to_pos(meta:get_string("target")) - if target then - minetest.after(3, function(obj, pos, target) - local objpos = obj:getpos() - objpos.y = objpos.y+0.1 -- Fix some glitches at -8000 - if minetest.get_node(objpos).name ~= "nether:portal" then - return - end - - obj:setpos(target) - - local function check_and_build_portal(pos, target) - local n = minetest.get_node_or_nil(target) - if n and n.name ~= "nether:portal" then - build_portal(target, pos) - minetest.after(2, check_and_build_portal, pos, target) - minetest.after(4, check_and_build_portal, pos, target) - elseif not n then - minetest.after(1, check_and_build_portal, pos, target) - end - end - - minetest.after(1, check_and_build_portal, pos, target) - - end, obj, pos, target) - end - end - end - end, -}) - -local function move_check(p1, max, dir) - local p = {x=p1.x, y=p1.y, z=p1.z} - local d = math.abs(max-p1[dir]) / (max-p1[dir]) - while p[dir] ~= max do - p[dir] = p[dir] + d - if minetest.get_node(p).name ~= "default:obsidian" then - return false - end - end - return true -end - -local function check_portal(p1, p2) - if p1.x ~= p2.x then - if not move_check(p1, p2.x, "x") then - return false - end - if not move_check(p2, p1.x, "x") then - return false - end - elseif p1.z ~= p2.z then - if not move_check(p1, p2.z, "z") then - return false - end - if not move_check(p2, p1.z, "z") then - return false - end - else - return false - end - - if not move_check(p1, p2.y, "y") then - return false - end - if not move_check(p2, p1.y, "y") then - return false - end - - return true -end - -local function is_portal(pos) - for d=-3,3 do - for y=-4,4 do - local px = {x=pos.x+d, y=pos.y+y, z=pos.z} - local pz = {x=pos.x, y=pos.y+y, z=pos.z+d} - if check_portal(px, {x=px.x+3, y=px.y+4, z=px.z}) then - return px, {x=px.x+3, y=px.y+4, z=px.z} - end - if check_portal(pz, {x=pz.x, y=pz.y+4, z=pz.z+3}) then - return pz, {x=pz.x, y=pz.y+4, z=pz.z+3} - end - end - end -end - -local function make_portal(pos) - local p1, p2 = is_portal(pos) - if not p1 or not p2 then - return false - end - - for d=1,2 do - for y=p1.y+1,p2.y-1 do - local p - if p1.z == p2.z then - p = {x=p1.x+d, y=y, z=p1.z} - else - p = {x=p1.x, y=y, z=p1.z+d} - end - if minetest.get_node(p).name ~= "air" then - return false - end - end - end - - local param2 - if p1.z == p2.z then param2 = 0 else param2 = 1 end - - local target = {x=p1.x, y=p1.y, z=p1.z} - target.x = target.x + 1 - if target.y < NETHER_DEPTH then - target.y = math.random(-50, 20) - else - target.y = NETHER_DEPTH - math.random(500, 1500) - end - - for d=0,3 do - for y=p1.y,p2.y do - local p = {} - if param2 == 0 then p = {x=p1.x+d, y=y, z=p1.z} else p = {x=p1.x, y=y, z=p1.z+d} end - if minetest.get_node(p).name == "air" then - minetest.set_node(p, {name="nether:portal", param2=param2}) - end - local meta = minetest.get_meta(p) - meta:set_string("p1", minetest.pos_to_string(p1)) - meta:set_string("p2", minetest.pos_to_string(p2)) - meta:set_string("target", minetest.pos_to_string(target)) - end - end - return true -end - -minetest.register_node(":default:obsidian", { - description = "Obsidian", - tiles = {"default_obsidian.png"}, - is_ground_content = true, - sounds = default.node_sound_stone_defaults(), - groups = {cracky=1,level=2}, - - on_destruct = function(pos) - local meta = minetest.get_meta(pos) - local p1 = minetest.string_to_pos(meta:get_string("p1")) - local p2 = minetest.string_to_pos(meta:get_string("p2")) - local target = minetest.string_to_pos(meta:get_string("target")) - if not p1 or not p2 then - return - end - for x=p1.x,p2.x do - for y=p1.y,p2.y do - for z=p1.z,p2.z do - local nn = minetest.get_node({x=x,y=y,z=z}).name - if nn == "default:obsidian" or nn == "nether:portal" then - if nn == "nether:portal" then - minetest.remove_node({x=x,y=y,z=z}) - end - local m = minetest.get_meta({x=x,y=y,z=z}) - m:set_string("p1", "") - m:set_string("p2", "") - m:set_string("target", "") - end - end - end - end - meta = minetest.get_meta(target) - if not meta then - return - end - p1 = minetest.string_to_pos(meta:get_string("p1")) - p2 = minetest.string_to_pos(meta:get_string("p2")) - if not p1 or not p2 then - return - end - for x=p1.x,p2.x do - for y=p1.y,p2.y do - for z=p1.z,p2.z do - local nn = minetest.get_node({x=x,y=y,z=z}).name - if nn == "default:obsidian" or nn == "nether:portal" then - if nn == "nether:portal" then - minetest.remove_node({x=x,y=y,z=z}) - end - local m = minetest.get_meta({x=x,y=y,z=z}) - m:set_string("p1", "") - m:set_string("p2", "") - m:set_string("target", "") - end - end - end - end - end, -}) - -minetest.register_craftitem(":nether:admin", { - description = "Admin Nether", - inventory_image = "tutorial_adminbattleaxe.png", - on_place = function(stack,_, pt) - if pt.under and minetest.get_node(pt.under).name == "default:obsidian" then - local done = make_portal(pt.under) - if done and not minetest.setting_getbool("creative_mode") then - stack:take_item() - end - end - return stack - end, -}) - -minetest.register_node("nether:rack", { - description = "Netherrack", - tiles = {"nether_rack.png"}, - is_ground_content = true, - drop = { - max_items = 1, - items = {{ - rarity = 3, - items = {"nether:rack"}, - }} - }, - groups = {cracky=3,level=2}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("nether:sand", { - description = "Nethersand", - tiles = {"nether_sand.png"}, - is_ground_content = true, - groups = {crumbly=3,level=2,falling_node=1}, - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_gravel_footstep", gain=0.45}, - }), -}) - -minetest.register_node("nether:glowstone", { - description = "Glowstone", - tiles = {"nether_glowstone.png"}, - is_ground_content = true, - light_source = 13, - groups = {cracky=3,oddly_breakable_by_hand=3}, - sounds = default.node_sound_glass_defaults(), -}) - -minetest.register_node("nether:brick", { - description = "Nether Brick", - tiles = {"nether_brick.png"}, - groups = {cracky=14,level=2}, - sounds = default.node_sound_stone_defaults(), -}) - -local air = minetest.get_content_id("air") -local stone_with_coal = minetest.get_content_id("default:stone_with_coal") -local stone_with_iron = minetest.get_content_id("default:stone_with_iron") -local stone_with_mese = minetest.get_content_id("default:stone_with_mese") -local stone_with_diamond = minetest.get_content_id("default:stone_with_diamond") -local stone_with_gold = minetest.get_content_id("default:stone_with_gold") -local stone_with_copper = minetest.get_content_id("default:stone_with_copper") -local gravel = minetest.get_content_id("default:gravel") -local dirt = minetest.get_content_id("default:dirt") -local sand = minetest.get_content_id("default:sand") -local cobble = minetest.get_content_id("default:cobble") -local mossycobble = minetest.get_content_id("default:mossycobble") -local stair_cobble = minetest.get_content_id("stairs:stair_cobble") -local lava_source = minetest.get_content_id("default:lava_source") -local lava_flowing = minetest.get_content_id("default:lava_flowing") -local glowstone = minetest.get_content_id("nether:glowstone") -local nethersand = minetest.get_content_id("nether:sand") -local netherbrick = minetest.get_content_id("nether:brick") -local netherrack = minetest.get_content_id("nether:rack") - -minetest.register_on_generated(function(minp, maxp, seed) - if maxp.y > NETHER_DEPTH then - return - end - local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") - local data = vm:get_data() - local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax} - for i in area:iterp(minp, maxp) do - local d = data[i] - if d == air or d == stone_with_coal or d == stone_with_iron then - data[i] = air - elseif d == stone_with_mese or d == stone_with_diamond or d == lava_source then - data[i] = lava_source - elseif d == lava_flowing then - -- nothing - elseif d == stone_with_gold then - data[i] = glowstone - elseif d == stone_with_copper or d == gravel or d == dirt or d == sand then - data[i] = nethersand - elseif d == cobble or d == mossycobble or d == stair_cobble then - data[i] = netherbrick - else - data[i] = netherrack - end - end - vm:set_data(data) - --vm:set_lighting({day=0, night=0}) - vm:calc_lighting() - vm:update_liquids() - vm:write_to_map() -end) diff --git a/mods/nether/textures/nether_brick.png b/mods/nether/textures/nether_brick.png deleted file mode 100644 index 3e8c803..0000000 Binary files a/mods/nether/textures/nether_brick.png and /dev/null differ diff --git a/mods/nether/textures/nether_glowstone.png b/mods/nether/textures/nether_glowstone.png deleted file mode 100644 index 9016eac..0000000 Binary files a/mods/nether/textures/nether_glowstone.png and /dev/null differ diff --git a/mods/nether/textures/nether_particle.png b/mods/nether/textures/nether_particle.png deleted file mode 100644 index 56a5b78..0000000 Binary files a/mods/nether/textures/nether_particle.png and /dev/null differ diff --git a/mods/nether/textures/nether_portal.png b/mods/nether/textures/nether_portal.png deleted file mode 100644 index 824d652..0000000 Binary files a/mods/nether/textures/nether_portal.png and /dev/null differ diff --git a/mods/nether/textures/nether_rack.png b/mods/nether/textures/nether_rack.png deleted file mode 100644 index 201a11a..0000000 Binary files a/mods/nether/textures/nether_rack.png and /dev/null differ diff --git a/mods/nether/textures/nether_sand.png b/mods/nether/textures/nether_sand.png deleted file mode 100644 index 8ec343d..0000000 Binary files a/mods/nether/textures/nether_sand.png and /dev/null differ diff --git a/mods/nether/textures/nether_transparent.png b/mods/nether/textures/nether_transparent.png deleted file mode 100644 index 4883728..0000000 Binary files a/mods/nether/textures/nether_transparent.png and /dev/null differ diff --git a/mods/sfinv/init.lua b/mods/sfinv/init.lua index fbecbef..71e9ee7 100644 --- a/mods/sfinv/init.lua +++ b/mods/sfinv/init.lua @@ -14,10 +14,6 @@ sfinv.register_page("sfinv:crafting", { image[4.75,1.5;1,1;sfinv_crafting_arrow.png] listring[current_player;main] listring[current_player;craft] - image_button[0,0;1.6,1.6;inventory_plus_inven.png;inven;] - label[0.3,1.5;selection] - button[6.6,1.4;1.5,0.5;craft10;Craft (10)] - button[6.6,2.2;1.5,0.5;craft99;Craft (99)] ]], true) end }) diff --git a/mods/technic/technic/textures/technic_tool_mode0.png b/mods/technic/technic/textures/technic_tool_mode0.png new file mode 100644 index 0000000..74dc1cb Binary files /dev/null and b/mods/technic/technic/textures/technic_tool_mode0.png differ diff --git a/mods/technic/technic/tools/mining_drill.lua b/mods/technic/technic/tools/mining_drill.lua index f13ccd1..c59f8d3 100644 --- a/mods/technic/technic/tools/mining_drill.lua +++ b/mods/technic/technic/tools/mining_drill.lua @@ -1,9 +1,3 @@ -local max_charge = {50000, 200000, 650000,1} -local power_usage_per_node = {1000, 2000, 3000,0} - -local S = technic.getter - - local function drill_dig_it0 (pos,player) if minetest.is_protected(pos, player:get_player_name()) then minetest.record_protection_violation(pos, player:get_player_name()) @@ -184,7 +178,7 @@ local function pos_is_pointable(pos) end -local function mining_drill_setmode(user,itemstack) +function technic.mining_drill_setmode(user,itemstack) local player_name=user:get_player_name() local item=itemstack:to_table() local meta=minetest.deserialize(item["metadata"]) @@ -201,251 +195,15 @@ local function mining_drill_setmode(user,itemstack) mode=mode+1 if mode>=6 then mode=1 end local items = user:get_wielded_item():get_name() - if mode2 == 0 then - item["name"]=items.."_"..mode - else - text = items:sub(1, -3) - item["name"]=text.."_"..mode - end + text = items:sub(1, -3) + item["name"]=text.."_"..mode meta["mode"]=mode item["metadata"]=minetest.serialize(meta) - itemstack:replace(item) - return itemstack -end - - -local function mining_drill_mk_handler(itemstack, user, pointed_thing) - local keys = user:get_player_control() - local player_name = user:get_player_name() - local meta = minetest.deserialize(itemstack:get_metadata()) - if not meta or not meta.mode or keys.sneak then - return mining_drill_setmode(user, itemstack) - end - if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) or not meta.charge then - return - end - local items = user:get_wielded_item():get_name() - local text = items:sub(24, 24) - local charge_to_take = power_usage_per_node[tonumber(text)] - if meta.charge >= charge_to_take then - local pos = minetest.get_pointed_thing_position(pointed_thing, above) - drill_dig_it(pos, user, meta.mode) - meta.charge = meta.charge - charge_to_take - itemstack:set_metadata(minetest.serialize(meta)) - technic.set_RE_wear(itemstack, meta.charge, max_charge[tonumber(text)]) - print(max_charge[tonumber(text)]) - print(power_usage_per_node[tonumber(text)]) - print(meta.charge) - end - return itemstack -end - -local function mining_drill_mk1_handler(itemstack, user, pointed_thing) - local keys = user:get_player_control() - local player_name = user:get_player_name() - local meta = minetest.deserialize(itemstack:get_metadata()) - if not meta or not meta.mode or keys.sneak then - return mining_drill_setmode(user, itemstack) - end - if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) or not meta.charge then - return - end - local items = user:get_wielded_item():get_name() - local text = items:sub(24, 24) - local charge_to_take = power_usage_per_node[1] - if meta.charge >= charge_to_take then - local pos = minetest.get_pointed_thing_position(pointed_thing, above) - drill_dig_it(pos, user, meta.mode) - meta.charge = meta.charge - charge_to_take - itemstack:set_metadata(minetest.serialize(meta)) - technic.set_RE_wear(itemstack, meta.charge, max_charge[1]) - print(max_charge[1]) - print(power_usage_per_node[1]) - print(meta.charge) - end - return itemstack -end -local function mining_drill_mkA_handler(itemstack, user, pointed_thing) - local keys = user:get_player_control() - local player_name = user:get_player_name() - local meta = minetest.deserialize(itemstack:get_metadata()) - if not meta or not meta.mode or keys.sneak then - return mining_drill_setmode(user, itemstack) - end - if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) or not meta.charge then - return - end - local items = user:get_wielded_item():get_name() - local text = items:sub(24, 24) - local charge_to_take = power_usage_per_node[4] - if meta.charge >= charge_to_take then - local pos = minetest.get_pointed_thing_position(pointed_thing, above) - drill_dig_it(pos, user, meta.mode) - meta.charge = meta.charge - charge_to_take - itemstack:set_metadata(minetest.serialize(meta)) - technic.set_RE_wear(itemstack, meta.charge, max_charge[4]) - print(max_charge[4]) - print(power_usage_per_node[4]) - print(meta.charge) - end - return itemstack -end -minetest.register_tool("technic:mining_drill", { - description = S("Mining Drill Mk%d"):format(1), - inventory_image = "technic_mining_drill.png", - wear_represents = "technic_RE_charge", - groups = {not_in_creative_inventory=1}, - on_refill = technic.refill_RE_charge, - on_use = function(itemstack, user, pointed_thing) - mining_drill_mk1_handler(itemstack, user, pointed_thing) - return itemstack - end, -}) - -technic.register_power_tool("technic:mining_drill", max_charge[1]) - -for i = 1, 5 do - technic.register_power_tool("technic:mining_drill_"..i, max_charge[1]) - minetest.register_tool("technic:mining_drill_"..i, { - description = S("Mining Drill Mk%d Mode %d"):format(1, i), - inventory_image = "technic_mining_drill.png^technic_tool_mode"..i..".png", - wield_image = "technic_mining_drill_mk2.png", - wear_represents = "technic_RE_charge", - on_refill = technic.refill_RE_charge, - groups = {not_in_creative_inventory=1}, - on_use = function(itemstack, user, pointed_thing) - mining_drill_mk1_handler(itemstack, user, pointed_thing) - return itemstack - end, - }) -end -minetest.register_tool("technic:mining_drill_mk2", { - description = S("Mining Drill Mk%d"):format(2), - inventory_image = "technic_mining_drill_mk2.png", - wear_represents = "technic_RE_charge", - groups = {not_in_creative_inventory=1}, - on_refill = technic.refill_RE_charge, - on_use = function(itemstack, user, pointed_thing) - mining_drill_mk_handler(itemstack, user, pointed_thing) - return itemstack - end, -}) - -technic.register_power_tool("technic:mining_drill_mk2", max_charge[2]) - -for i = 1, 5 do - technic.register_power_tool("technic:mining_drill_mk2_"..i, max_charge[2]) - minetest.register_tool("technic:mining_drill_mk2_"..i, { - description = S("Mining Drill Mk%d Mode %d"):format(2, i), - inventory_image = "technic_mining_drill_mk2.png^technic_tool_mode"..i..".png", - wield_image = "technic_mining_drill_mk2.png", - wear_represents = "technic_RE_charge", - on_refill = technic.refill_RE_charge, - groups = {not_in_creative_inventory=1}, - on_use = function(itemstack, user, pointed_thing) - mining_drill_mk_handler(itemstack, user, pointed_thing) - return itemstack - end, - }) -end - -minetest.register_tool("technic:mining_drill_mk3", { - description = S("Mining Drill Mk%d"):format(3), - inventory_image = "technic_mining_drill_mk3.png", - wear_represents = "technic_RE_charge", - groups = {not_in_creative_inventory=1}, - on_refill = technic.refill_RE_charge, - on_use = function(itemstack, user, pointed_thing) - mining_drill_mk_handler(itemstack,user,pointed_thing) - return itemstack - end, -}) - -technic.register_power_tool("technic:mining_drill_mk3", max_charge[3]) - -for i=1,5,1 do - technic.register_power_tool("technic:mining_drill_mk3_"..i, max_charge[3]) - minetest.register_tool("technic:mining_drill_mk3_"..i, { - description = S("Mining Drill Mk%d Mode %d"):format(3, i), - inventory_image = "technic_mining_drill_mk3.png^technic_tool_mode"..i..".png", - wield_image = "technic_mining_drill_mk3.png", - wear_represents = "technic_RE_charge", - on_refill = technic.refill_RE_charge, - groups = {not_in_creative_inventory=1}, - on_use = function(itemstack, user, pointed_thing) - mining_drill_mk_handler(itemstack,user,pointed_thing) - return itemstack - end, - }) + user:set_wielded_item(item) end local mining_drill_mode_text = {"single node","3 nodes deep","3 nodes wide","3 nodes tall","3x3 nodes"} -minetest.register_tool("technic:mining_drill_mkA1", { - description = "Admin tool 8: Mining drill", - inventory_image = "technic_mining_drill_Admin1.png", - wear_represents = "technic_RE_charge", - on_refill = technic.refill_RE_charge, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - local meta = minetest.deserialize(itemstack:get_metadata()) - if not meta or not meta.mode or keys.sneak then - return mining_drill_setmode(user, itemstack) - end - return itemstack - end, - on_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - local player_name = user:get_player_name() - local meta = minetest.deserialize(itemstack:get_metadata()) - if not meta or not meta.mode or keys.sneak then - return mining_drill_setmode(user, itemstack) - end - if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) then - return - end - local items = user:get_wielded_item():get_name() - local pos = minetest.get_pointed_thing_position(pointed_thing, above) - drill_dig_it(pos, user, meta.mode) - return itemstack - end, -}) - -technic.register_power_tool("technic:mining_drill_mkA1", max_charge[4]) - -for i=1,5,1 do - technic.register_power_tool("technic:mining_drill_mkA1_"..i, max_charge[4]) - minetest.register_tool("technic:mining_drill_mkA1_"..i, { - description = "Admin tool 8: Mining drill Mode "..i.." ("..mining_drill_mode_text[i]..")", - inventory_image = "technic_mining_drill_Admin1.png^technic_tool_mode"..i..".png", - wield_image = "technic_mining_drill_Admin1.png", - wear_represents = "technic_RE_charge", - on_refill = technic.refill_RE_charge, - groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - local meta = minetest.deserialize(itemstack:get_metadata()) - if not meta or not meta.mode or keys.sneak then - return mining_drill_setmode(user, itemstack) - end - return itemstack - end, - on_use = function(itemstack, user, pointed_thing) - local player_name = user:get_player_name() - local meta = minetest.deserialize(itemstack:get_metadata()) - if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) then - return - end - local items = user:get_wielded_item():get_name() - local pos = minetest.get_pointed_thing_position(pointed_thing, above) - drill_dig_it(pos, user, meta.mode) - return itemstack - end, - }) -end - - - local mining_drill_list = { -- {, , }, {"1", 10000, 5000}, @@ -600,46 +358,9 @@ local mining_drill_list = { {"150", 2000000, 1}, } for _, m in pairs(mining_drill_list) do - if tonumber(m[1]) < 150 then - technic.register_power_tool("technic:drill_mkS"..m[1], m[2]) - minetest.register_tool("technic:drill_mkS"..m[1], { - description = "Spezial Mining drill lv."..m[1], - inventory_image = "technic_mining_drill_mkS"..m[1]..".png", - wear_represents = "technic_RE_charge", - on_refill = technic.refill_RE_charge, - groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - local meta = minetest.deserialize(itemstack:get_metadata()) - if not meta or not meta.mode or keys.sneak then - return mining_drill_setmode(user, itemstack) - end - return itemstack - end, - on_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - local player_name = user:get_player_name() - local meta = minetest.deserialize(itemstack:get_metadata()) - if not meta or not meta.mode or keys.sneak then - return mining_drill_setmode(user, itemstack) - end - if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) or not meta.charge then - return - end - local items = user:get_wielded_item():get_name() - local charge_to_take = m[3] - if meta.charge >= charge_to_take then - local pos = minetest.get_pointed_thing_position(pointed_thing, above) - drill_dig_it(pos, user, meta.mode) - meta.charge = meta.charge - charge_to_take - itemstack:set_metadata(minetest.serialize(meta)) - technic.set_RE_wear(itemstack, meta.charge, m[2]) - end - return itemstack - end, - }) - for i=1,5,1 do - technic.register_power_tool("technic:drill_mkS"..m[1].."_"..i, m[2]) + for i=1,5,1 do + technic.register_power_tool("technic:drill_mkS"..m[1].."_"..i, m[2]) + if tonumber(m[1]) < 150 then minetest.register_tool("technic:drill_mkS"..m[1].."_"..i, { description = "Spezial Mining drill lv."..m[1].." Mode "..i.." ("..mining_drill_mode_text[i]..")", inventory_image = "technic_mining_drill_mkS"..m[1]..".png^technic_tool_mode"..i..".png", @@ -647,17 +368,15 @@ for _, m in pairs(mining_drill_list) do wear_represents = "technic_RE_charge", on_refill = technic.refill_RE_charge, groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - local meta = minetest.deserialize(itemstack:get_metadata()) - if not meta or not meta.mode or keys.sneak then - return mining_drill_setmode(user, itemstack) - end - return itemstack - end, on_use = function(itemstack, user, pointed_thing) local player_name = user:get_player_name() local meta = minetest.deserialize(itemstack:get_metadata()) + if meta==nil then + meta={} + end + if meta["mode"]==nil then + meta["mode"]=1 + end if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) or not meta.charge then return end @@ -673,59 +392,27 @@ for _, m in pairs(mining_drill_list) do return itemstack end, }) - end - else - technic.register_power_tool("technic:drill_mkS"..m[1], m[2]) - minetest.register_tool("technic:drill_mkS"..m[1], { - description = "Spezial Mining drill lv.MAX", - inventory_image = "technic_mining_drill_mkS"..m[1]..".png", - wear_represents = "technic_RE_charge", - on_refill = technic.refill_RE_charge, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - local player_name = user:get_player_name() - local meta = minetest.deserialize(itemstack:get_metadata()) - if not meta or not meta.mode or keys.sneak then - return mining_drill_setmode(user, itemstack) - end - return itemstack - end, - on_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - local player_name = user:get_player_name() - local meta = minetest.deserialize(itemstack:get_metadata()) - if not meta or not meta.mode or keys.sneak then - return mining_drill_setmode(user, itemstack) - end - if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) then - return - end - local items = user:get_wielded_item():get_name() - local pos = minetest.get_pointed_thing_position(pointed_thing, above) - drill_dig_it(pos, user, meta.mode) - return itemstack - end, - }) - for i=1,5,1 do - technic.register_power_tool("technic:drill_mkS"..m[1].."_"..i, m[2]) + else + local group = {not_in_creative_inventory=1} + if i == 1 then + group = {} + end minetest.register_tool("technic:drill_mkS"..m[1].."_"..i, { description = "Spezial Mining drill lv.MAX Mode "..i.." ("..mining_drill_mode_text[i]..")", inventory_image = "technic_mining_drill_mkS"..m[1]..".png^technic_tool_mode"..i..".png", wield_image = "technic_mining_drill_mkS"..m[1]..".png", wear_represents = "technic_RE_charge", on_refill = technic.refill_RE_charge, - groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - local meta = minetest.deserialize(itemstack:get_metadata()) - if not meta or not meta.mode or keys.sneak then - return mining_drill_setmode(user, itemstack) - end - return itemstack - end, + groups = group, on_use = function(itemstack, user, pointed_thing) local player_name = user:get_player_name() local meta = minetest.deserialize(itemstack:get_metadata()) + if meta==nil then + meta={} + end + if meta["mode"]==nil then + meta["mode"]=1 + end if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) then return end @@ -737,7 +424,6 @@ for _, m in pairs(mining_drill_list) do }) end end - end minetest.register_craft({ @@ -747,4 +433,37 @@ minetest.register_craft({ {'', 'moreores:mithril_ingot', 'tutorial:admin'}, {'', '', 'moreores:mithril_ingot'}, } -}) \ No newline at end of file +}) + +for i=1,5,1 do + local creative = {not_in_creative_inventory=1} + if i == 1 then + creative = {} + end + technic.register_power_tool("technic:mining_drill_mkA1_"..i, 1) + minetest.register_tool("technic:mining_drill_mkA1_"..i, { + description = "Admin tool 8: Mining drill Mode "..i.." ("..mining_drill_mode_text[i]..")", + inventory_image = "technic_mining_drill_Admin1.png^technic_tool_mode"..i..".png", + wield_image = "technic_mining_drill_Admin1.png", + wear_represents = "technic_RE_charge", + on_refill = technic.refill_RE_charge, + groups = creative, + on_use = function(itemstack, user, pointed_thing) + local player_name = user:get_player_name() + local meta = minetest.deserialize(itemstack:get_metadata()) + if meta==nil then + meta={} + end + if meta["mode"]==nil then + meta["mode"]=1 + end + if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) then + return + end + local items = user:get_wielded_item():get_name() + local pos = minetest.get_pointed_thing_position(pointed_thing, above) + drill_dig_it(pos, user, meta.mode) + return itemstack + end, + }) +end \ No newline at end of file diff --git a/mods/tutorial/chatcommand.lua b/mods/tutorial/chatcommand.lua index fc65c03..18336e7 100644 --- a/mods/tutorial/chatcommand.lua +++ b/mods/tutorial/chatcommand.lua @@ -22,46 +22,48 @@ minetest.register_chatcommand("regnum", { func = function(name, param) local player = minetest.get_player_by_name(name) local inv = player:get_inventory() - awards.give_achievement(name, "award_ruby_bronze") - awards.give_achievement(name, "award_ruby_silber") - awards.give_achievement(name, "award_ruby_gold") - awards.give_achievement(name, "award_ruby_platin") - awards.give_achievement(name, "award_sapphire_bronze") - awards.give_achievement(name, "award_sapphire_silber") - awards.give_achievement(name, "award_sapphire_gold") - awards.give_achievement(name, "award_sapphire_platin") - awards.give_achievement(name, "award_amethyst_bronze") - awards.give_achievement(name, "award_amethyst_silber") - awards.give_achievement(name, "award_amethyst_Gold") - awards.give_achievement(name, "award_amethyst_platin") - awards.give_achievement(name, "award_shadow_bronze") - awards.give_achievement(name, "award_shadow_silber") - awards.give_achievement(name, "award_shadow_gold") - awards.give_achievement(name, "award_shadow_platin") - awards.give_achievement(name, "award_pearl_bronze") - awards.give_achievement(name, "award_pearl_silber") - awards.give_achievement(name, "award_pearl_gold") - awards.give_achievement(name, "award_pearl_platin") - awards.give_achievement(name, "award_emerald_bronze") - awards.give_achievement(name, "award_emerald_silber") - awards.give_achievement(name, "award_emerald_gold") - awards.give_achievement(name, "award_emerald_platin") - awards.give_achievement(name, "award_admin_ore_bronze") - awards.give_achievement(name, "award_admin_ore_silber") - awards.give_achievement(name, "award_admin_ore_gold") - awards.give_achievement(name, "award_admin_ore_platin") - awards.give_achievement(name, "award_titan_ore_bronze") - awards.give_achievement(name, "award_titan_ore_silber") - awards.give_achievement(name, "award_titan_ore_gold") - awards.give_achievement(name, "award_titan_ore_platin") - awards.give_achievement(name, "award_regnum_ore_bronze") - awards.give_achievement(name, "award_regnum_ore_silber") - awards.give_achievement(name, "award_regnum_ore_gold") - awards.give_achievement(name, "award_regnum_ore_platin") - awards.give_achievement(name, "award_???_bronze") - awards.give_achievement(name, "award_???_silber") - awards.give_achievement(name, "award_???_gold") - awards.give_achievement(name, "award_???_platin") + awards.unlock(name, "award_ruby_bronze") + awards.unlock(name, "award_ruby_silber") + awards.unlock(name, "award_ruby_gold") + awards.unlock(name, "award_ruby_platin") + awards.unlock(name, "award_sapphire_bronze") + awards.unlock(name, "award_sapphire_silber") + awards.unlock(name, "award_sapphire_gold") + awards.unlock(name, "award_sapphire_platin") + awards.unlock(name, "award_amethyst_bronze") + awards.unlock(name, "award_amethyst_silber") + awards.unlock(name, "award_amethyst_Gold") + awards.unlock(name, "award_amethyst_platin") + awards.unlock(name, "award_shadow_bronze") + awards.unlock(name, "award_shadow_silber") + awards.unlock(name, "award_shadow_gold") + awards.unlock(name, "award_shadow_platin") + awards.unlock(name, "award_pearl_bronze") + awards.unlock(name, "award_pearl_silber") + awards.unlock(name, "award_pearl_gold") + awards.unlock(name, "award_pearl_platin") + awards.unlock(name, "award_emerald_bronze") + awards.unlock(name, "award_emerald_silber") + awards.unlock(name, "award_emerald_gold") + awards.unlock(name, "award_emerald_platin") + awards.unlock(name, "award_admin_ore_bronze") + awards.unlock(name, "award_admin_ore_silber") + awards.unlock(name, "award_admin_ore_gold") + awards.unlock(name, "award_admin_ore_platin") + awards.unlock(name, "award_titan_ore_bronze") + awards.unlock(name, "award_titan_ore_silber") + awards.unlock(name, "award_titan_ore_gold") + awards.unlock(name, "award_titan_ore_platin") + awards.unlock(name, "award_regnum_ore_bronze") + awards.unlock(name, "award_regnum_ore_silber") + awards.unlock(name, "award_regnum_ore_gold") + awards.unlock(name, "award_regnum_ore_platin") + awards.unlock(name, "award_???_bronze") + awards.unlock(name, "award_???_silber") + awards.unlock(name, "award_???_gold") + awards.unlock(name, "award_???_platin") + awards.unlock(name, "award_???_regnum") + awards.unlock(name, "award_???_nyancat") inv:set_size("rew", 1) inv:set_size("rewb", 1) inv:set_size("b", 1) @@ -116,7 +118,7 @@ minetest.register_chatcommand("regnum", { inv:add_item("main", "tutorial:wallplacer5_1") inv:add_item("main", "tutorial:legendstick9") inv:add_item("main", "technic:laser_mkS150") - inv:add_item("main", "technic:drill_mkS150") + inv:add_item("main", "technic:drill_mkS150_1") inv:add_item("main", "tutorial:colorstick_empty") inv:add_item("gem", "tutorial:magic_gem1") inv:add_item("gem", "tutorial:magic_gem2") diff --git a/mods/tutorial/init.lua b/mods/tutorial/init.lua index 34bb592..9f2e632 100644 --- a/mods/tutorial/init.lua +++ b/mods/tutorial/init.lua @@ -6,7 +6,7 @@ minetest.register_on_joinplayer(function(player) offset = {x=0, y=10}, alignment = {x=1, y=0}, number = 0xFFFFFF , - text = "For Minetest : 5.4.0", + text = "For Minetest : 5.4.x", }) player:hud_add({ hud_elem_type = "text", @@ -14,7 +14,7 @@ minetest.register_on_joinplayer(function(player) offset = {x=0, y=30}, alignment = {x=1, y=0}, number = 0xFFFFFF , - text = "Game Version : 3.5.7", + text = "Game Version : 3.6.0", }) end) @@ -30,6 +30,57 @@ dofile(minetest.get_modpath("tutorial").."/other.lua") dofile(minetest.get_modpath("tutorial").."/alias.lua") --v.2.0.0+ +minetest.register_on_chatcommand(function(name, command, params) + local player = minetest.get_player_by_name(name) + if command == "killme" then + player = minetest.get_player_by_name(name) + end + if command == "kill" then + if params ~= "" then + player = minetest.get_player_by_name(params) + else + player = minetest.get_player_by_name(name) + end + end + local can_access = minetest.check_player_privs(name, {server=true}) + if (command == "killme" or (command == "kill" and can_access )) and minetest.settings:get_bool("enable_damage") then + if player then + local inv = player:get_inventory() + if inv:get_stack("armor", 1):get_name() == "3d_armor:helmet_admin" + and inv:get_stack("armor", 2):get_name() == "3d_armor:chestplate_admin" + and inv:get_stack("armor", 3):get_name() == "3d_armor:leggings_admin" + and inv:get_stack("armor", 4):get_name() == "3d_armor:boots_admin" + and inv:get_stack("armor", 5):get_name() == "shields:shield_admin" then + else + while player:get_hp() ~= 0 do + player:set_hp(0) + end + end + end + end + if command == "kill" and player and can_access and minetest.settings:get_bool("enable_damage") then + return true + end +end) + +local S = minetest.get_translator("sfinv") +sfinv.override_page("sfinv:crafting", { + title = S("Crafting"), + get = function(self, player, context) + return sfinv.make_formspec(player, context, [[ + list[current_player;craft;1.75,0.5;3,3;] + list[current_player;craftpreview;5.75,1.5;1,1;] + image[4.75,1.5;1,1;sfinv_crafting_arrow.png] + listring[current_player;main] + listring[current_player;craft] + image_button[0,0;1.6,1.6;inventory_plus_inven.png;inven;] + label[0.3,1.5;selection] + button[6.6,1.4;1.5,0.5;craft10;Craft (10)] + button[6.6,2.2;1.5,0.5;craft99;Craft (99)] + ]], true) + end +}) + local backward = {} backward.get_formspec = function(player, pos) if player == nil then @@ -228,6 +279,38 @@ minetest.register_node("tutorial:trophy_year4", { fixed = { -0.21, -0.5, -0.125, 0.2725, 0.125, 0.1875 } } }) +minetest.register_node("tutorial:trophy_year5", { + description = "Five years Regnum!!", + tiles = { + "tutorial_trophy_year5.png" + }, + groups = { snappy=3 }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.125, -0.5, -0.125, 0.1875, -0.4375, 0.1875}, -- NodeBox1 + {-0.0625, -0.4375, -0.0625, 0.125, -0.375, 0.125}, -- NodeBox2 + {-0.02, -0.375, -0.02, 0.0825, -0.1875, 0.0825}, -- NodeBox3 + {-0.0625, -0.1875, -0.0625, 0.125, -0.125, 0.125}, -- NodeBox4 + {-0.125, -0.1875, -0.0625, -0.0625, 0.125, 0.125}, -- NodeBox5 + {0.125, -0.1875, -0.0625, 0.1875, 0.125, 0.125}, -- NodeBox6 + {-0.125, -0.1875, 0.125, 0.1875, 0.125, 0.1875}, -- NodeBox7 + {-0.125, -0.1875, -0.125, 0.1875, 0.125, -0.0625}, -- NodeBox8 + {-0.0625, -0.25, -0.0625, 0.125, -0.1875, 0.125}, -- NodeBox9 + {0.1875, 0.05, 0, 0.23, 0.0925, 0.0625}, -- NodeBox10 + {0.1875, -0.15, 0, 0.23, -0.11, 0.0625}, -- NodeBox11 + {0.23, -0.15, 0, 0.2725, 0.0925, 0.0625}, -- NodeBox12 + {-0.1675, -0.15, 0, -0.125, -0.11, 0.0625}, -- NodeBox13 + {-0.1675, 0.05, 0, -0.125, 0.0925, 0.0625}, -- NodeBox14 + {-0.21, -0.15, 0, -0.1675, 0.0925, 0.0625}, -- NodeBox15 + } + }, + selection_box = { + type = "fixed", + fixed = { -0.21, -0.5, -0.125, 0.2725, 0.125, 0.1875 } + } +}) minetest.register_craft({ output = 'tutorial:legendstick9', recipe = { @@ -1332,20 +1415,226 @@ end local timer = 0 local oldpos = {} local newpos = {} +local mode_tools = { + {"tutorial:regnumbattleaxe1","tutorial:regnumbattleaxe2",""}, + {"tutorial:regnumbattleaxe2","tutorial:regnumbattleaxe3",""}, + {"tutorial:regnumbattleaxe3","tutorial:regnumbattleaxe1",""}, + {"tutorial:adminbattleaxe","tutorial:adminbattleaxe2",""}, + {"tutorial:adminbattleaxe2","tutorial:adminbattleaxe3",""}, + {"tutorial:adminbattleaxe3","tutorial:adminbattleaxe",""}, + {"tutorial:superlegendenbattleaxe1","tutorial:superlegendenbattleaxe2",""}, + {"tutorial:superlegendenbattleaxe2","tutorial:superlegendenbattleaxe3",""}, + {"tutorial:superlegendenbattleaxe3","tutorial:superlegendenbattleaxe1",""}, + {"3d_armor:superlegendenboots","3d_armor:superlegendenboots2",""}, + {"3d_armor:superlegendenboots2","3d_armor:superlegendenboots3",""}, + {"3d_armor:superlegendenboots3","3d_armor:superlegendenboots4",""}, + {"3d_armor:superlegendenboots4","3d_armor:superlegendenboots",""}, + {"3d_armor:superlegendenchestplate","3d_armor:superlegendenchestplate2",""}, + {"3d_armor:superlegendenchestplate2","3d_armor:superlegendenchestplate3",""}, + {"3d_armor:superlegendenchestplate3","3d_armor:superlegendenchestplate4",""}, + {"3d_armor:superlegendenchestplate4","3d_armor:superlegendenchestplate",""}, + {"3d_armor:superlegendenhelmet","3d_armor:superlegendenhelmet2",""}, + {"3d_armor:superlegendenhelmet2","3d_armor:superlegendenhelmet3",""}, + {"3d_armor:superlegendenhelmet3","3d_armor:superlegendenhelmet4",""}, + {"3d_armor:superlegendenhelmet4","3d_armor:superlegendenhelmet",""}, + {"3d_armor:superlegendenleggings","3d_armor:superlegendenleggings2",""}, + {"3d_armor:superlegendenleggings2","3d_armor:superlegendenleggings3",""}, + {"3d_armor:superlegendenleggings3","3d_armor:superlegendenleggings4",""}, + {"3d_armor:superlegendenleggings4","3d_armor:superlegendenleggings",""}, + {"3d_armor:regnumboots","3d_armor:regnumboots2",""}, + {"3d_armor:regnumboots2","3d_armor:regnumboots3",""}, + {"3d_armor:regnumboots3","3d_armor:regnumboots4",""}, + {"3d_armor:regnumboots4","3d_armor:regnumboots",""}, + {"3d_armor:regnumchestplate","3d_armor:regnumchestplate2",""}, + {"3d_armor:regnumchestplate2","3d_armor:regnumchestplate3",""}, + {"3d_armor:regnumchestplate3","3d_armor:regnumchestplate4",""}, + {"3d_armor:regnumchestplate4","3d_armor:regnumchestplate",""}, + {"3d_armor:regnumhelmet","3d_armor:regnumhelmet2",""}, + {"3d_armor:regnumhelmet2","3d_armor:regnumhelmet3",""}, + {"3d_armor:regnumhelmet3","3d_armor:regnumhelmet4",""}, + {"3d_armor:regnumhelmet4","3d_armor:regnumhelmet",""}, + {"3d_armor:regnumleggings","3d_armor:regnumleggings2",""}, + {"3d_armor:regnumleggings2","3d_armor:regnumleggings3",""}, + {"3d_armor:regnumleggings3","3d_armor:regnumleggings4",""}, + {"3d_armor:regnumleggings4","3d_armor:regnumleggings",""}, + {"3d_armor:helmet_admin","3d_armor:helmet_admin2",""}, + {"3d_armor:helmet_admin2","3d_armor:helmet_admin3",""}, + {"3d_armor:helmet_admin3","3d_armor:helmet_admin4",""}, + {"3d_armor:helmet_admin4","3d_armor:helmet_admin",""}, + {"3d_armor:chestplate_admin","3d_armor:chestplate_admin2",""}, + {"3d_armor:chestplate_admin2","3d_armor:chestplate_admin3",""}, + {"3d_armor:chestplate_admin3","3d_armor:chestplate_admin4",""}, + {"3d_armor:chestplate_admin4","3d_armor:chestplate_admin",""}, + {"3d_armor:leggings_admin","3d_armor:leggings_admin2",""}, + {"3d_armor:leggings_admin2","3d_armor:leggings_admin3",""}, + {"3d_armor:leggings_admin3","3d_armor:leggings_admin4",""}, + {"3d_armor:leggings_admin4","3d_armor:leggings_admin",""}, + {"3d_armor:boots_admin","3d_armor:boots_admin2",""}, + {"3d_armor:boots_admin2","3d_armor:boots_admin3",""}, + {"3d_armor:boots_admin3","3d_armor:boots_admin4",""}, + {"3d_armor:boots_admin4","3d_armor:boots_admin",""}, + {"shields:superlegendenshield","shields:superlegendenshield2",""}, + {"shields:superlegendenshield2","shields:superlegendenshield3",""}, + {"shields:superlegendenshield3","shields:superlegendenshield4",""}, + {"shields:superlegendenshield4","shields:superlegendenshield",""}, + {"shields:regnumshield","shields:regnumshield2",""}, + {"shields:regnumshield2","shields:regnumshield3",""}, + {"shields:regnumshield3","shields:regnumshield4",""}, + {"shields:regnumshield4","shields:regnumshield",""}, + {"shields:shield_admin","shields:shield_admin2",""}, + {"shields:shield_admin2","shields:shield_admin3",""}, + {"shields:shield_admin3","shields:shield_admin4",""}, + {"shields:shield_admin4","shields:shield_admin",""}, + {"tutorial:server_hammer1","tutorial:server_hammer2",""}, + {"tutorial:server_hammer2","tutorial:server_hammer3",""}, + {"tutorial:server_hammer3","tutorial:server_hammer4",""}, + {"tutorial:server_hammer4","tutorial:server_hammer5",""}, + {"tutorial:server_hammer5","tutorial:server_hammer6",""}, + {"tutorial:server_hammer6","tutorial:server_hammer7",""}, + {"tutorial:server_hammer7","tutorial:server_hammer8",""}, + {"tutorial:server_hammer8","tutorial:server_hammer1",""}, + {"ban_hammer:hammer1","ban_hammer:hammer2",""}, + {"ban_hammer:hammer2","ban_hammer:hammer3",""}, + {"ban_hammer:hammer3","ban_hammer:hammer4",""}, + {"ban_hammer:hammer4","ban_hammer:hammer5",""}, + {"ban_hammer:hammer5","ban_hammer:hammer1",""}, + {"tutorial:wallplacer2_1","tutorial:wallplacer2_2",""}, + {"tutorial:wallplacer2_2","tutorial:wallplacer2_1",""}, + {"tutorial:wallplacer3_1","tutorial:wallplacer3_2",""}, + {"tutorial:wallplacer3_2","tutorial:wallplacer3_3",""}, + {"tutorial:wallplacer3_3","tutorial:wallplacer3_1",""}, + {"tutorial:wallplacer4_1","tutorial:wallplacer4_2",""}, + {"tutorial:wallplacer4_2","tutorial:wallplacer4_3",""}, + {"tutorial:wallplacer4_3","tutorial:wallplacer4_4",""}, + {"tutorial:wallplacer4_4","tutorial:wallplacer4_1",""}, + {"tutorial:wallplacer5_1","tutorial:wallplacer5_2",""}, + {"tutorial:wallplacer5_2","tutorial:wallplacer5_3",""}, + {"tutorial:wallplacer5_3","tutorial:wallplacer5_4",""}, + {"tutorial:wallplacer5_4","tutorial:wallplacer5_5",""}, + {"tutorial:wallplacer5_5","tutorial:wallplacer5_1",""}, + {"tutorial:adminwallplacer_1","tutorial:adminwallplacer_2",""}, + {"tutorial:adminwallplacer_2","tutorial:adminwallplacer_3",""}, + {"tutorial:adminwallplacer_3","tutorial:adminwallplacer_4",""}, + {"tutorial:adminwallplacer_4","tutorial:adminwallplacer_5",""}, + {"tutorial:adminwallplacer_5","tutorial:adminwallplacer_1",""}, + + + {"tutorial:superlegendengun1","tutorial:superlegendengun3",""}, + {"tutorial:superlegendengun2","tutorial:superlegendengun1",""}, + {"tutorial:superlegendengun3","tutorial:superlegendengun2",""}, + + {"tutorial:regnumgun1","tutorial:regnumgun3",""}, + {"tutorial:regnumgun2","tutorial:regnumgun1",""}, + {"tutorial:regnumgun3","tutorial:regnumgun2",""}, + + {"tutorial:gun_admin1","tutorial:gun_admin3",""}, + {"tutorial:gun_admin2","tutorial:gun_admin1",""}, + {"tutorial:gun_admin3","tutorial:gun_admin2",""}, +} + +table.insert(mode_tools, {"tutorial:gun","tutorial:gun_2",""}) +table.insert(mode_tools, {"tutorial:gun_2","tutorial:gun",""}) +for i = 1, 20 do + table.insert(mode_tools, {"tutorial:gun_mega"..i,"tutorial:gun_mega"..i.."_2"}) + table.insert(mode_tools, {"tutorial:gun_mega"..i.."_2","tutorial:gun_mega"..i}) +end +for i = 1, 25 do + table.insert(mode_tools, {"tutorial:cloudgun_mega"..i,"tutorial:cloudgun_mega"..i.."_2"}) + table.insert(mode_tools, {"tutorial:cloudgun_mega"..i.."_2","tutorial:cloudgun_mega"..i}) +end +for i = 1, 4 do + table.insert(mode_tools, {"tutorial:supergun"..i,"tutorial:supergun"..i.."_2"}) + table.insert(mode_tools, {"tutorial:supergun"..i.."_2","tutorial:supergun"..i}) +end +for i = 1, 2 do + table.insert(mode_tools, {"tutorial:uraniumgun"..i,"tutorial:uraniumgun"..i.."_2"}) + table.insert(mode_tools, {"tutorial:uraniumgun"..i.."_2","tutorial:uraniumgun"..i}) +end +for i = 1, 12 do + table.insert(mode_tools, {"tutorial:energygun"..i,"tutorial:energygun"..i.."_2"}) + table.insert(mode_tools, {"tutorial:energygun"..i.."_2","tutorial:energygun"..i}) +end +for i = 1, 7 do + table.insert(mode_tools, {"tutorial:superenergygun"..i,"tutorial:superenergygun"..i.."_2"}) + table.insert(mode_tools, {"tutorial:superenergygun"..i.."_2","tutorial:superenergygun"..i}) +end +for i = 1, 5 do + table.insert(mode_tools, {"tutorial:kristallgun"..i,"tutorial:kristallgun"..i.."_2"}) + table.insert(mode_tools, {"tutorial:kristallgun"..i.."_2","tutorial:kristallgun"..i}) +end +for i = 1, 25 do + table.insert(mode_tools, {"tutorial:ultragun"..i,"tutorial:ultragun"..i.."_2"}) + table.insert(mode_tools, {"tutorial:ultragun"..i.."_2","tutorial:ultragun"..i}) +end +table.insert(mode_tools, {"tutorial:ultragun","tutorial:ultragun_2"}) +table.insert(mode_tools, {"tutorial:ultragun_2","tutorial:ultragun"}) +for i = 1, 4 do + table.insert(mode_tools, {"tutorial:arenagun"..i,"tutorial:arenagun"..i.."_2"}) + table.insert(mode_tools, {"tutorial:arenagun"..i.."_2","tutorial:arenagun"..i}) +end +for i = 1, 10 do + table.insert(mode_tools, {"tutorial:titangun"..i,"tutorial:titangun"..i.."_2"}) + table.insert(mode_tools, {"tutorial:titangun"..i.."_2","tutorial:titangun"..i}) +end +for i = 1, 6 do + table.insert(mode_tools, {"tutorial:legendengun"..i,"tutorial:legendengun"..i.."_2"}) + table.insert(mode_tools, {"tutorial:legendengun"..i.."_2","tutorial:legendengun"..i}) +end + minetest.register_globalstep(function(dtime) timer = timer + dtime + local k = 0 + local players = minetest.get_connected_players() + for _,player in ipairs(players) do + local keys = player:get_player_control() + local player_inv = player:get_inventory() + if keys["sneak"] == true then + + player:set_attribute("sneaking", "true") + else + player:set_attribute("sneaking", "false") + end + if keys["RMB"] == true then + if player:get_attribute("sneaking") == "true" and player:get_attribute("rightclick") == "false" then + local item = player:get_wielded_item():get_name() + local itemstack = player:get_wielded_item() + local kk = 0 + for _,tool in ipairs(mode_tools) do + if item == tool[1] and kk == 0 then + player:set_wielded_item(tool[2]) + kk = 1 + end + end + for i=1,150 do + for j=1,5 do + if item == "technic:drill_mkS"..i.."_"..j and kk == 0 then + technic.mining_drill_setmode(player,itemstack) + kk = 1 + end + end + end + for j=1,5 do + if item == "technic:mining_drill_mkA1_"..j and kk == 0 then + technic.mining_drill_setmode(player,itemstack) + kk = 1 + end + end + end + player:set_attribute("rightclick", "true") + else + player:set_attribute("rightclick", "false") + end + end if (timer >= 1) then local players = minetest.get_connected_players() for _,player in ipairs(players) do local pri = minetest.get_player_privs(player:get_player_name()) local player_inv = player:get_inventory() - - --player_inv:set_size("year", 4) - --if player_inv:room_for_item("main", "tutorial:trophy_year4") and player_inv:get_stack("year", 4):get_count() == 0 then - -- player_inv:add_item("main", "tutorial:trophy_year4") - -- player_inv:set_stack("year", 4, "default:dirt") - --end - + player_inv:set_size("year", 5) + if player_inv:room_for_item("main", "tutorial:trophy_year5") and player_inv:get_stack("year", 5):get_count() == 0 then + player_inv:add_item("main", "tutorial:trophy_year5") + player_inv:set_stack("year", 5, "default:dirt") + end player_inv:set_size("youtube", 1) local c = player_inv:get_stack("youtube",1):get_count() if c == 0 then @@ -1809,13 +2098,6 @@ minetest.register_craftitem("tutorial:wallplacer2_2", { inventory_image = "tutorial_block_placer2.png^technic_tool_mode2.png", wield_image = "tutorial_block_placer2.png", groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:wallplacer2_1") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -1932,13 +2214,6 @@ minetest.register_craftitem("tutorial:wallplacer2_1", { inventory_image = "tutorial_block_placer2.png^technic_tool_mode1.png", wield_image = "tutorial_block_placer2.png", groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:wallplacer2_2") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -2055,13 +2330,6 @@ minetest.register_craftitem("tutorial:wallplacer3_1", { inventory_image = "tutorial_block_placer3.png^technic_tool_mode1.png", wield_image = "tutorial_block_placer3.png", groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:wallplacer3_2") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -2178,13 +2446,6 @@ minetest.register_craftitem("tutorial:wallplacer3_2", { inventory_image = "tutorial_block_placer3.png^technic_tool_mode2.png", wield_image = "tutorial_block_placer3.png", groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:wallplacer3_3") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -2301,13 +2562,6 @@ minetest.register_craftitem("tutorial:wallplacer3_3", { inventory_image = "tutorial_block_placer3.png^technic_tool_mode3.png", wield_image = "tutorial_block_placer3.png", groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:wallplacer3_1") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -2424,13 +2678,6 @@ minetest.register_craftitem("tutorial:wallplacer4_1", { inventory_image = "tutorial_block_placer4.png^technic_tool_mode1.png", wield_image = "tutorial_block_placer4.png", groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:wallplacer4_2") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -2547,13 +2794,6 @@ minetest.register_craftitem("tutorial:wallplacer4_2", { inventory_image = "tutorial_block_placer4.png^technic_tool_mode2.png", wield_image = "tutorial_block_placer4.png", groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:wallplacer4_3") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -2670,13 +2910,6 @@ minetest.register_craftitem("tutorial:wallplacer4_3", { inventory_image = "tutorial_block_placer4.png^technic_tool_mode3.png", wield_image = "tutorial_block_placer4.png", groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:wallplacer4_4") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -2793,13 +3026,6 @@ minetest.register_craftitem("tutorial:wallplacer4_4", { inventory_image = "tutorial_block_placer4.png^technic_tool_mode4.png", wield_image = "tutorial_block_placer4.png", groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:wallplacer4_1") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -2915,13 +3141,6 @@ minetest.register_craftitem("tutorial:wallplacer5_1", { description = "Wallplacer lv.MAX Mode 1 (place 3x3 wall)", inventory_image = "tutorial_block_placer5.png^technic_tool_mode1.png", wield_image = "tutorial_block_placer5.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:wallplacer5_2") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -3038,13 +3257,6 @@ minetest.register_craftitem("tutorial:wallplacer5_2", { inventory_image = "tutorial_block_placer5.png^technic_tool_mode2.png", wield_image = "tutorial_block_placer5.png", groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:wallplacer5_3") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -3161,13 +3373,6 @@ minetest.register_craftitem("tutorial:wallplacer5_3", { inventory_image = "tutorial_block_placer5.png^technic_tool_mode3.png", wield_image = "tutorial_block_placer5.png", groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:wallplacer5_4") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -3284,13 +3489,6 @@ minetest.register_craftitem("tutorial:wallplacer5_4", { inventory_image = "tutorial_block_placer5.png^technic_tool_mode4.png", wield_image = "tutorial_block_placer5.png", groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:wallplacer5_5") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -3407,13 +3605,6 @@ minetest.register_craftitem("tutorial:wallplacer5_5", { inventory_image = "tutorial_block_placer5.png^technic_tool_mode5.png", wield_image = "tutorial_block_placer5.png", groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:wallplacer5_1") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -3526,16 +3717,9 @@ minetest.register_craftitem("tutorial:wallplacer5_5", { end, }) minetest.register_craftitem("tutorial:adminwallplacer_1", { - description = "Admin tool 9: Wallplacer", + description = "Admin tool 9: Wallplacer Mode 1 (place 3x3 wall)", inventory_image = "tutorial_block_placerAdmin.png^technic_tool_mode1.png", wield_image = "tutorial_block_placerAdmin.png", - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:adminwallplacer_2") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -3648,17 +3832,10 @@ minetest.register_craftitem("tutorial:adminwallplacer_1", { end, }) minetest.register_craftitem("tutorial:adminwallplacer_2", { - description = "Admin tool 9: Wallplacer", + description = "Admin tool 9: Wallplacer Mode 2 (place 5x5 wall)", inventory_image = "tutorial_block_placerAdmin.png^technic_tool_mode2.png", wield_image = "tutorial_block_placerAdmin.png", groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:adminwallplacer_3") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -3771,17 +3948,10 @@ minetest.register_craftitem("tutorial:adminwallplacer_2", { end, }) minetest.register_craftitem("tutorial:adminwallplacer_3", { - description = "Admin tool 9: Wallplacer", + description = "Admin tool 9: Wallplacer Mode 3 (place 7x7 wall)", inventory_image = "tutorial_block_placerAdmin.png^technic_tool_mode3.png", wield_image = "tutorial_block_placerAdmin.png", groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:adminwallplacer_4") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -3894,17 +4064,10 @@ minetest.register_craftitem("tutorial:adminwallplacer_3", { end, }) minetest.register_craftitem("tutorial:adminwallplacer_4", { - description = "Admin tool 9: Wallplacer", + description = "Admin tool 9: Wallplacer Mode 4 (place 9x9 wall)", inventory_image = "tutorial_block_placerAdmin.png^technic_tool_mode4.png", wield_image = "tutorial_block_placerAdmin.png", groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:adminwallplacer_5") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -4017,17 +4180,10 @@ minetest.register_craftitem("tutorial:adminwallplacer_4", { end, }) minetest.register_craftitem("tutorial:adminwallplacer_5", { - description = "Admin tool 9: Wallplacer", + description = "Admin tool 9: Wallplacer Mode 5 (place 11x11 wall)", inventory_image = "tutorial_block_placerAdmin.png^technic_tool_mode5.png", wield_image = "tutorial_block_placerAdmin.png", groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:adminwallplacer_1") - end - return itemstack - end, on_place = function(itemstack, placer, pointed_thing) local main = placer:get_wield_index()+1 local inv = placer:get_inventory() @@ -5527,9 +5683,6 @@ end for i = 1, 2 do table.insert(guns, {i+49,"tutorial:uraniumgun"..i,"Uraniumgun lv."..i,"tutorial_uraniumgun"..i..".png"}) end -for i = 1, 2 do - table.insert(guns, {i+49,"tutorial:uraniumgun"..i,"Uraniumgun lv."..i,"tutorial_uraniumgun"..i..".png"}) -end for i = 1, 12 do table.insert(guns, {i+51,"tutorial:energygun"..i,"Energygun lv."..i,"tutorial_energygun"..i..".png"}) end @@ -5580,13 +5733,6 @@ for _, m in pairs(guns) do end return itemstack end, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name(m[2].."_2") - end - return itemstack - end, }) minetest.register_tool(m[2].."_2", { description = m[3].." Mode 2 (no damage to players and no thunder)\nGun-lv."..m[1], @@ -5614,13 +5760,6 @@ for _, m in pairs(guns) do end return itemstack end, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name(m[2]) - end - return itemstack - end, }) end minetest.register_tool("tutorial:superlegendengun1", { @@ -5649,13 +5788,6 @@ minetest.register_tool("tutorial:superlegendengun1", { end return itemstack end, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:superlegendengun3") - end - return itemstack - end, }) minetest.register_tool("tutorial:superlegendengun2", { description = "Superlegendgun Mode 3 (damage to players and thunder)\nGun-lv.122", @@ -5683,13 +5815,6 @@ minetest.register_tool("tutorial:superlegendengun2", { end return itemstack end, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:superlegendengun1") - end - return itemstack - end, }) minetest.register_tool("tutorial:superlegendengun3", { description = "Superlegendgun Mode 2. (no damage to players and no thunder)\nGun-lv.122", @@ -5717,13 +5842,6 @@ minetest.register_tool("tutorial:superlegendengun3", { end return itemstack end, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:superlegendengun2") - end - return itemstack - end, }) minetest.register_tool("tutorial:regnumgun1", { @@ -5751,13 +5869,6 @@ minetest.register_tool("tutorial:regnumgun1", { end return itemstack end, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:regnumgun3") - end - return itemstack - end, }) minetest.register_tool("tutorial:regnumgun2", { description = "Regnumgun Mode 3 (damage to players and thunder)\nGun-lv.MAX", @@ -5785,13 +5896,6 @@ minetest.register_tool("tutorial:regnumgun2", { end return itemstack end, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:regnumgun1") - end - return itemstack - end, }) minetest.register_tool("tutorial:regnumgun3", { @@ -5820,13 +5924,6 @@ minetest.register_tool("tutorial:regnumgun3", { end return itemstack end, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:regnumgun2") - end - return itemstack - end, }) @@ -5855,13 +5952,6 @@ minetest.register_tool("tutorial:gun_admin1", { end return itemstack end, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:gun_admin3") - end - return itemstack - end, }) minetest.register_tool("tutorial:gun_admin2", { description = "Admin tool 11: Gun Mode 3 (damage to players and thunder)", @@ -5889,13 +5979,6 @@ minetest.register_tool("tutorial:gun_admin2", { end return itemstack end, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:gun_admin1") - end - return itemstack - end, }) minetest.register_tool("tutorial:gun_admin3", { @@ -5924,13 +6007,6 @@ minetest.register_tool("tutorial:gun_admin3", { end return itemstack end, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:gun_admin2") - end - return itemstack - end, }) local mine = {} @@ -6579,7 +6655,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local level = string.gsub(level, "_3", "") local level = string.gsub(level, "_4", "") local level = string.gsub(level, "_5", "") - minetest.chat_send_all(level) if tonumber(level) > 0 and tonumber(level) < 150 then item1 = "tutorial:coin2 "..(level-1)*8+3 item2 = "tutorial:admin" @@ -6606,7 +6681,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local level = string.gsub(level, "_3", "") local level = string.gsub(level, "_4", "") local level = string.gsub(level, "_5", "") - minetest.chat_send_all(level) if tonumber(level) > 0 and tonumber(level) < 5 then item1 = "tutorial:coin_gelb "..(level-1)*24+8 re = true @@ -7587,13 +7661,6 @@ minetest.register_tool("tutorial:adminbattleaxe3", { damage_groups = {fleshy=4000} }, liquids_pointable = false, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:adminbattleaxe") - end - return itemstack - end, }) minetest.register_tool("tutorial:superlegendenbattleaxe3", { description = "Superlegendbattleaxe Mode 3 (for hunting mobs)\nBattleaxe-lv.122", @@ -7608,13 +7675,6 @@ minetest.register_tool("tutorial:superlegendenbattleaxe3", { damage_groups = {fleshy=244} }, liquids_pointable = false, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:superlegendenbattleaxe1") - end - return itemstack - end, }) minetest.register_tool("tutorial:regnumbattleaxe3", { description = "Regnumbattleaxe Mode 3 (for hunting mobs)\nBattleaxe-lv.MAX", @@ -7629,13 +7689,6 @@ minetest.register_tool("tutorial:regnumbattleaxe3", { damage_groups = {fleshy=150} }, liquids_pointable = false, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:regnumbattleaxe1") - end - return itemstack - end, }) minetest.register_craft({ output = 'tutorial:bottleSS', diff --git a/mods/tutorial/node.lua b/mods/tutorial/node.lua index c3b6480..7b9b5f4 100644 --- a/mods/tutorial/node.lua +++ b/mods/tutorial/node.lua @@ -261,18 +261,24 @@ minetest.register_node("tutorial:geschenk_gold",{ drop = { max_items = 1, items = { - {items = {"mobs:dirt_monster_egg"},rarity = 17}, - {items = {"mobs:stone_monster_egg"},rarity = 17}, - {items = {"mobs:sand_monster_egg"},rarity = 17}, - {items = {"mobs:desert_sand_monster_egg"},rarity = 17}, - {items = {"mobs:snow_monster_egg"},rarity = 17}, - {items = {"mobs:desert_stone_monster_egg"},rarity = 17}, - {items = {"mobs:ice_monster_egg"},rarity = 17}, - {items = {"mobs:grass_monster_egg"},rarity = 17}, - {items = {"mobs:rainforest_litter_monster_egg"},rarity = 17}, - {items = {"mobs:dry_grass_monster_egg"},rarity = 17}, - {items = {"mobs:silver_sand_monster_egg"},rarity = 17}, - {items = {"default:mese_crystal"},rarity = 2.833}, + {items = {"mobs:dirt_monster_egg"},rarity = 23}, + {items = {"mobs:stone_monster_egg"},rarity = 23}, + {items = {"mobs:sand_monster_egg"},rarity = 23}, + {items = {"mobs:desert_sand_monster_egg"},rarity = 23}, + {items = {"mobs:snow_monster_egg"},rarity = 23}, + {items = {"mobs:desert_stone_monster_egg"},rarity = 23}, + {items = {"mobs:ice_monster_egg"},rarity = 23}, + {items = {"mobs:grass_monster_egg"},rarity = 23}, + {items = {"mobs:rainforest_litter_monster_egg"},rarity = 23}, + {items = {"mobs:dry_grass_monster_egg"},rarity = 23}, + {items = {"mobs:silver_sand_monster_egg"},rarity = 23}, + {items = {"mobs:dry_dirt_monster_egg"},rarity = 23}, + {items = {"mobs:clay_monster_egg"},rarity = 23}, + {items = {"mobs:gravel_monster_egg"},rarity = 23}, + {items = {"mobs:moss_monster_egg"},rarity = 23}, + {items = {"mobs:permafrost_monster_egg"},rarity = 23}, + {items = {"mobs:coniferous_litter_monster_egg"},rarity = 23}, + {items = {"default:mese_crystal"},rarity = 3.833}, {items = {"tutorial:geschenk_gold"}}, } } diff --git a/mods/tutorial/other.lua b/mods/tutorial/other.lua index 5ade529..e4a561a 100644 --- a/mods/tutorial/other.lua +++ b/mods/tutorial/other.lua @@ -725,23 +725,13 @@ rg14.get_formspec = function(player, pos) .."label[0,5.8;superlegendary]" .."label[0,6.1;regnum]" .."label[0,6.4;The legendary battleaxe (or higher) will double some ores if you dig them.]" - .."label[0,6.7;There are differend modes for some battleaxes, armors and guns.]" - .."label[0,7.0;With battleaxe Mode 2 you can dig water and lava.]" - .."label[0,7.3;With battleaxe Mode 3 you can only hunt monster.]" - .."label[0,7.6;With armor Mode 2 you can run faster.]" - .."label[0,7.9;With armor Mode 3 you can jump higher.]" - .."label[0,8.2;With armor Mode 4 you can run faster and jump higher.]" - .."label[0,8.5;With gun Mode 2 you can only make damage to monsters.]" - .."label[0,8.8;With gun Mode 3 you will also add thunder.]" - .."label[0,9.1;For changing the mode of a tool (also Wallplacer and mining Drill),]" - .."label[0,9.4;you have to press the right mouse and sneak (don't point at a node)]" .."button[2,10; 2,0.5;rg13;<]" .."button[4,10; 2,0.5;rg15;>]" return formspec end local rg15 = {} rg15.get_formspec = function(player, pos) - if player == nil then + if player == nil then return end formspec = "size[9,10.3]" @@ -750,12 +740,31 @@ rg15.get_formspec = function(player, pos) .."background[9,10.3;1,1;gui_formbg.png;true]" .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" .."bgcolor[#080808BB;true]" - .."label[0,1;II. 6. Chat commands]" - .."label[0,1.3;/admin for all admin things (give priv needed)]" - .."label[0,1.6;/regnum for all regnum things (give priv needed)]" - .."label[0,1.9;/rank to see your rank]" - .."button[2,10; 2,0.5;rg14;<]" - .."button[4,10; 2,0.5;rg16;>]" + .."label[0,1;II. 6. Tool Modes]" + .."label[0,1.3;There are differend modes for some tools.]" + .."label[0,1.6;For changing the mode of a tool,]" + .."label[0,1.9;you have to press the right mouse and sneak (don't point at a node)]" + + .."label[0,2.5;With (superlegendary/regnum) battleaxe mode 1 you can not dig water and lava,]" + .."label[0,2.8;with mode 2 you can dig water and lava, with mode 3 you can only hunt monster.]" + + .."label[0,3.4;With (superlegendary/regnum) armor mode 1 you can not run faster and jump higher,]" + .."label[0,3.7;with mode 2 you can run faster, with mode 3 you can jump higher,]" + .."label[0,4.0;with mode 4 you can run faster and jump higher.]" + + .."label[0,4.6;With (superlegendary/regnum) gun mode 1 you will not add thunder,]" + .."label[0,4.9;with mode 2 you can only make damage to monsters, with mde 3 you will also add thunder.]" + + .."label[0,5.5;With mining drill mode 1 you will dig a singel node,]" + .."label[0,5.8;with mode 2 you will dig 3 nodes deep, with mode 3 you will dig 3 nodes wide,]" + .."label[0,6.1;with mode 4 you will dig 3 nodes tall, with mode 5 you will dig 3x3 nodes.]" + + .."label[0,6.7;With wallplacer mode 1 you will place a 3x3 wall,]" + .."label[0,7.0;with mode 2 you will place a 5x5 wall, with mode 3 you will place a 7x7 wall,]" + .."label[0,7.3;with mode 4 you will place a 9x9 wall, with mode 5 you will place a 11x11 wall.]" + + .."button[2,10; 2,0.5;rg14;<]" + .."button[4,10; 2,0.5;rg16;>]" return formspec end local rg16 = {} @@ -769,7 +778,26 @@ rg16.get_formspec = function(player, pos) .."background[9,10.3;1,1;gui_formbg.png;true]" .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" .."bgcolor[#080808BB;true]" - .."label[0,1;II. 7. Keys]" + .."label[0,1;II. 7. Chat Commands]" + .."label[0,1.3;/admin for all admin things (give priv needed)]" + .."label[0,1.6;/regnum for all regnum things (give priv needed)]" + .."label[0,1.9;/rank to see your rank]" + .."button[2,10; 2,0.5;rg15;<]" + .."button[4,10; 2,0.5;rg17;>]" + return formspec +end +local rg17 = {} +rg17.get_formspec = function(player, pos) + if player == nil then + return + end + formspec = "size[9,10.3]" + .."button[0,0;2,0.5;inven;Back]" + .."button[2,0;2,0.5;main;Main]" + .."background[9,10.3;1,1;gui_formbg.png;true]" + .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + .."bgcolor[#080808BB;true]" + .."label[0,1;II. 8. Keys]" .."label[0,1.3;Bagkey: can be crafted with grey coins]" .."label[0,1.6;Armorkey: can be crafted with a blue and a red ore]" .."label[0,1.9;Levelkey: can be got as a reward for green level 50]" @@ -785,7 +813,7 @@ rg16.get_formspec = function(player, pos) .."label[0,4.9;Goldenkey: can be got as a reward for yellow level 100]" .."label[0,5.2;Cookingkey: can be crafted with cyan coins]" .."label[0,5.5;Protectionkey: can be got as a reward for all trophys]" - .."button[2,10; 2,0.5;rg15;<]" + .."button[2,10; 2,0.5;rg16;<]" return formspec end local rg10 = {} @@ -1228,7 +1256,7 @@ rg8.get_formspec = function(player, pos) .."background[9,10.3;1,1;gui_formbg.png;true]" .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" .."bgcolor[#080808BB;true]" - .."label[0,1;I. 6. Color items]" + .."label[0,1;I. 6. Color Items]" .."label[0.0,1.3;a) Artifacts]" .."label[0.2,1.6;If you run around you will get artifacts.]" .."label[0.2,1.9;Collect 71 artifacts to get the knight key as a reward.]" @@ -1281,7 +1309,7 @@ rg2.get_formspec = function(player, pos) .."label[0,2.2; 3. Help]" .."label[0,2.5; 4. Spezial]" .."label[0,2.8; 5. Quests]" - .."label[0,3.1; 6. Color items]" + .."label[0,3.1; 6. Color Items]" .."label[0,3.4; 7. Music]" .."label[0,3.7; II. Game]" .."label[0,4.0; 1. Gifts]" @@ -1289,8 +1317,9 @@ rg2.get_formspec = function(player, pos) .."label[0,4.6; 3. Xp & Level]" .."label[0,4.9; 4. Ores]" .."label[0,5.2; 5. Armor, Battleaxes & Guns]" - .."label[0,5.5; 6. Chat commands]" - .."label[0,5.8; 7. Keys]" + .."label[0,5.5; 6. Tool Modes]" + .."label[0,5.8; 7. Chat Commands]" + .."label[0,6.1; 8. Keys]" .."button[2,10; 2,0.5;rg1;<]" .."button[4,10; 2,0.5;rg3;>]" return formspec @@ -1637,6 +1666,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if fields.rg16 then inventory_plus.set_inventory_formspec(player, rg16.get_formspec(player)) end + if fields.rg17 then + inventory_plus.set_inventory_formspec(player, rg17.get_formspec(player)) + end if fields.crafting5 then inventory_plus.set_inventory_formspec(player, crafting5.get_formspec(player)) end @@ -2097,11 +2129,11 @@ ach3.get_formspec = function(player, pos) return end local player_inv = player:get_inventory() - player_inv:set_size("year", 4) local year = player_inv:get_stack("year", 1):get_count() local year2 = player_inv:get_stack("year", 2):get_count() local year3 = player_inv:get_stack("year", 3):get_count() local year4 = player_inv:get_stack("year", 4):get_count() + local year5 = player_inv:get_stack("year", 5):get_count() local d = 0 if year == 1 then d = d+1 @@ -2114,6 +2146,9 @@ ach3.get_formspec = function(player, pos) end if year4 == 1 then d = d+1 + end + if year5 == 1 then + d = d+1 end formspec= "size[10.5,11.3]" .."background[10.5,11.3;1,1;gui_formbg.png;true]" @@ -2125,11 +2160,13 @@ ach3.get_formspec = function(player, pos) .."label[0.8,1.9;Two years Trophy]" .."label[0.8,2.7;Three years Trophy]" .."label[0.8,3.5;Four years Trophy]" - .."label[5.5,0;"..d.."/4]" + .."label[0.8,4.3;Five years Trophy]" + .."label[5.5,0;"..d.."/5]" .."image[0,1;0.8,0.8;tutorial_"..year..".png]" .."image[0,1.8;0.8,0.8;tutorial_"..year2..".png]" .."image[0,2.6;0.8,0.8;tutorial_"..year3..".png]" .."image[0,3.4;0.8,0.8;tutorial_"..year4..".png]" + .."image[0,4.2;0.8,0.8;tutorial_"..year5..".png]" return formspec end for j = 1, 8, 1 do @@ -2251,25 +2288,8 @@ local mode_text = { {"give player Admin rank (all privs)"}, {"mark player as a youtuber"}, } -local function server_hammer_setmode(user, itemstack, mode, keys) - local puncher = user:get_player_name() - if keys["sneak"] == false and mode == 0 then - return - end - if keys["sneak"] == true then - mode = mode + 1 - if mode == 9 then - mode = 1 - end - minetest.chat_send_player(puncher, "Ban hammer mode : "..mode.." - "..mode_text[mode][1] ) - end - itemstack:set_name("tutorial:server_hammer"..mode) - itemstack:set_metadata(mode) - return itemstack, mode -end local function server_hammer_handler(itemstack, user, pointed_thing, mode) local keys = user:get_player_control() - server_hammer_setmode(user, itemstack, mode, keys) if pointed_thing.type ~= "object" then return end @@ -2460,27 +2480,11 @@ local function server_hammer_handler(itemstack, user, pointed_thing, mode) end return itemstack end -minetest.register_craftitem("tutorial:server_hammer", { - description = "Admin tool 6: Server Hammer", - inventory_image = "ban_hammer.png", - stack_max = 1, - groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) - local mode = 0 - server_hammer_handler(itemstack, user, pointed_thing, mode) - return itemstack - end, - on_use = function(itemstack, user, pointed_thing) - local mode = 0 - server_hammer_handler(itemstack, user, pointed_thing, mode) - return itemstack - end, -}) minetest.register_craftitem("tutorial:server_hammer1", { description = "Admin tool 6: Server Hammer Mode 1 ("..mode_text[1][1]..")", inventory_image = "ban_hammer.png^technic_tool_mode1.png", wield_image = "ban_hammer.png", - on_secondary_use = function(itemstack, user, pointed_thing) + on_use = function(itemstack, user, pointed_thing) server_hammer_handler(itemstack, user, pointed_thing, 1) return itemstack end, @@ -2491,7 +2495,7 @@ for i = 2, 8 do inventory_image = "ban_hammer.png^technic_tool_mode"..i..".png", wield_image = "ban_hammer.png", groups = {not_in_creative_inventory=1}, - on_secondary_use = function(itemstack, user, pointed_thing) + on_use = function(itemstack, user, pointed_thing) local mode = i server_hammer_handler(itemstack, user, pointed_thing, mode) return itemstack @@ -2893,7 +2897,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end if fields.achc then local player_inv = player:get_inventory() - player_inv:set_size("year", 4) + player_inv:set_size("year", 5) if player:get_inventory():contains_item("main", "tutorial:trophy_year1") then player_inv:set_stack("year", 1,"tutorial:dirt") end @@ -2905,6 +2909,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end if player:get_inventory():contains_item("main", "tutorial:trophy_year4") then player_inv:set_stack("year", 4,"tutorial:dirt") + end + if player:get_inventory():contains_item("main", "tutorial:trophy_year5") then + player_inv:set_stack("year", 5,"tutorial:dirt") end inventory_plus.set_inventory_formspec(player, ach3.get_formspec(player)) end @@ -3493,7 +3500,7 @@ cr.get_formspec = function(player,pos) .."button[2,2.5;2,0.5;"..image3..";5x5 craft]" .."button[4,2.5;2,0.5;"..image4..";Regnum craft]" .."button[6,2.5;2,0.5;"..image5..";Gem craft]" - .."button[8,2.5;2,0.5;"..image6..";Cooking]" + .."button[8,2.5;2,0.5;"..image6..";Cooking craft]" .."button[10,2.5;2,0.5;"..image7..";Medallion craft]" .."button[12,2.5;2,0.5;"..image8..";Crystal craft]" .."button[3,3.5;2,0.5;dna;DNA craft]" diff --git a/mods/tutorial/textures/blades_inv.png b/mods/tutorial/textures/blades_inv.png deleted file mode 100644 index 47a6224..0000000 Binary files a/mods/tutorial/textures/blades_inv.png and /dev/null differ diff --git a/mods/tutorial/textures/blades_invt.png b/mods/tutorial/textures/blades_invt.png deleted file mode 100644 index 47a6224..0000000 Binary files a/mods/tutorial/textures/blades_invt.png and /dev/null differ diff --git a/mods/tutorial/textures/cabin_inv.png b/mods/tutorial/textures/cabin_inv.png deleted file mode 100644 index 2755911..0000000 Binary files a/mods/tutorial/textures/cabin_inv.png and /dev/null differ diff --git a/mods/tutorial/textures/cabin_invt.png b/mods/tutorial/textures/cabin_invt.png deleted file mode 100644 index 2755911..0000000 Binary files a/mods/tutorial/textures/cabin_invt.png and /dev/null differ diff --git a/mods/tutorial/textures/heli_inv.png b/mods/tutorial/textures/heli_inv.png deleted file mode 100644 index 7b9541a..0000000 Binary files a/mods/tutorial/textures/heli_inv.png and /dev/null differ diff --git a/mods/tutorial/textures/heli_invt.png b/mods/tutorial/textures/heli_invt.png deleted file mode 100644 index 7b9541a..0000000 Binary files a/mods/tutorial/textures/heli_invt.png and /dev/null differ diff --git a/mods/tutorial/textures/inventory_plus_cr.png b/mods/tutorial/textures/inventory_plus_cr.png deleted file mode 100644 index bea1265..0000000 Binary files a/mods/tutorial/textures/inventory_plus_cr.png and /dev/null differ diff --git a/mods/tutorial/textures/inventory_plus_xp_gui.png b/mods/tutorial/textures/inventory_plus_xp_gui.png deleted file mode 100644 index 056d96d..0000000 Binary files a/mods/tutorial/textures/inventory_plus_xp_gui.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_XP.png b/mods/tutorial/textures/tutorial_XP.png deleted file mode 100644 index f8da111..0000000 Binary files a/mods/tutorial/textures/tutorial_XP.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_atombattleaxe.png b/mods/tutorial/textures/tutorial_atombattleaxe.png deleted file mode 100644 index d489adc..0000000 Binary files a/mods/tutorial/textures/tutorial_atombattleaxe.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_atombombe.png b/mods/tutorial/textures/tutorial_atombombe.png deleted file mode 100644 index 268d30c..0000000 Binary files a/mods/tutorial/textures/tutorial_atombombe.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_atombombe1.png b/mods/tutorial/textures/tutorial_atombombe1.png deleted file mode 100644 index b76eb3b..0000000 Binary files a/mods/tutorial/textures/tutorial_atombombe1.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_atombombe2.png b/mods/tutorial/textures/tutorial_atombombe2.png deleted file mode 100644 index 7944b3a..0000000 Binary files a/mods/tutorial/textures/tutorial_atombombe2.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_blackstone.png b/mods/tutorial/textures/tutorial_blackstone.png deleted file mode 100644 index 7f21089..0000000 Binary files a/mods/tutorial/textures/tutorial_blackstone.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_blau_block.png b/mods/tutorial/textures/tutorial_blau_block.png deleted file mode 100644 index ccc7482..0000000 Binary files a/mods/tutorial/textures/tutorial_blau_block.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_blau_gebrant_block.png b/mods/tutorial/textures/tutorial_blau_gebrant_block.png deleted file mode 100644 index d1dfb45..0000000 Binary files a/mods/tutorial/textures/tutorial_blau_gebrant_block.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_blei.png b/mods/tutorial/textures/tutorial_blei.png deleted file mode 100644 index c0e58a9..0000000 Binary files a/mods/tutorial/textures/tutorial_blei.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_blei_ingot.png b/mods/tutorial/textures/tutorial_blei_ingot.png deleted file mode 100644 index a54d578..0000000 Binary files a/mods/tutorial/textures/tutorial_blei_ingot.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_bluestone.png b/mods/tutorial/textures/tutorial_bluestone.png deleted file mode 100644 index e85c689..0000000 Binary files a/mods/tutorial/textures/tutorial_bluestone.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_boat_inventory.png b/mods/tutorial/textures/tutorial_boat_inventory.png deleted file mode 100644 index eae8dfe..0000000 Binary files a/mods/tutorial/textures/tutorial_boat_inventory.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_boat_wield.png b/mods/tutorial/textures/tutorial_boat_wield.png deleted file mode 100644 index 54683e9..0000000 Binary files a/mods/tutorial/textures/tutorial_boat_wield.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_bogen.png b/mods/tutorial/textures/tutorial_bogen.png deleted file mode 100644 index d07620f..0000000 Binary files a/mods/tutorial/textures/tutorial_bogen.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_coreentverner.png b/mods/tutorial/textures/tutorial_coreentverner.png deleted file mode 100644 index 823471f..0000000 Binary files a/mods/tutorial/textures/tutorial_coreentverner.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_decowood.png b/mods/tutorial/textures/tutorial_decowood.png deleted file mode 100644 index 366470f..0000000 Binary files a/mods/tutorial/textures/tutorial_decowood.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_fragezeichen.png b/mods/tutorial/textures/tutorial_fragezeichen.png deleted file mode 100644 index 40bcf9a..0000000 Binary files a/mods/tutorial/textures/tutorial_fragezeichen.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_gelb.png b/mods/tutorial/textures/tutorial_gelb.png deleted file mode 100644 index cdfc4c0..0000000 Binary files a/mods/tutorial/textures/tutorial_gelb.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_gelb_block.png b/mods/tutorial/textures/tutorial_gelb_block.png deleted file mode 100644 index 6701f2a..0000000 Binary files a/mods/tutorial/textures/tutorial_gelb_block.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_gelb_block2.png b/mods/tutorial/textures/tutorial_gelb_block2.png deleted file mode 100644 index f506a9f..0000000 Binary files a/mods/tutorial/textures/tutorial_gelb_block2.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_gelb_block3.png b/mods/tutorial/textures/tutorial_gelb_block3.png deleted file mode 100644 index c811ad5..0000000 Binary files a/mods/tutorial/textures/tutorial_gelb_block3.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_gelb_gebrant.png b/mods/tutorial/textures/tutorial_gelb_gebrant.png deleted file mode 100644 index d67d8e1..0000000 Binary files a/mods/tutorial/textures/tutorial_gelb_gebrant.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_gelb_gebrant_block.png b/mods/tutorial/textures/tutorial_gelb_gebrant_block.png deleted file mode 100644 index 000b52d..0000000 Binary files a/mods/tutorial/textures/tutorial_gelb_gebrant_block.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_geld_lv1.png b/mods/tutorial/textures/tutorial_geld_lv1.png deleted file mode 100644 index 0dc268f..0000000 Binary files a/mods/tutorial/textures/tutorial_geld_lv1.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_geld_lv2.png b/mods/tutorial/textures/tutorial_geld_lv2.png deleted file mode 100644 index 6f0e926..0000000 Binary files a/mods/tutorial/textures/tutorial_geld_lv2.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_geld_lv3.png b/mods/tutorial/textures/tutorial_geld_lv3.png deleted file mode 100644 index 90ff9ca..0000000 Binary files a/mods/tutorial/textures/tutorial_geld_lv3.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_geld_lv4.png b/mods/tutorial/textures/tutorial_geld_lv4.png deleted file mode 100644 index 77dd2e2..0000000 Binary files a/mods/tutorial/textures/tutorial_geld_lv4.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_geld_lv5.png b/mods/tutorial/textures/tutorial_geld_lv5.png deleted file mode 100644 index 3b4ae06..0000000 Binary files a/mods/tutorial/textures/tutorial_geld_lv5.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_glass_reaktor_core.png b/mods/tutorial/textures/tutorial_glass_reaktor_core.png deleted file mode 100644 index 5165e53..0000000 Binary files a/mods/tutorial/textures/tutorial_glass_reaktor_core.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_goldstone.png b/mods/tutorial/textures/tutorial_goldstone.png deleted file mode 100644 index a73530e..0000000 Binary files a/mods/tutorial/textures/tutorial_goldstone.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_granatenwerfer.png b/mods/tutorial/textures/tutorial_granatenwerfer.png deleted file mode 100644 index 8a87a4d..0000000 Binary files a/mods/tutorial/textures/tutorial_granatenwerfer.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_greenstone.png b/mods/tutorial/textures/tutorial_greenstone.png deleted file mode 100644 index 086a249..0000000 Binary files a/mods/tutorial/textures/tutorial_greenstone.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_gruen.png b/mods/tutorial/textures/tutorial_gruen.png deleted file mode 100644 index 875de43..0000000 Binary files a/mods/tutorial/textures/tutorial_gruen.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_gruen_block.png b/mods/tutorial/textures/tutorial_gruen_block.png deleted file mode 100644 index 076411b..0000000 Binary files a/mods/tutorial/textures/tutorial_gruen_block.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_gruen_block2.png b/mods/tutorial/textures/tutorial_gruen_block2.png deleted file mode 100644 index 9ab2b07..0000000 Binary files a/mods/tutorial/textures/tutorial_gruen_block2.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_gruen_block3.png b/mods/tutorial/textures/tutorial_gruen_block3.png deleted file mode 100644 index 268143e..0000000 Binary files a/mods/tutorial/textures/tutorial_gruen_block3.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_gruen_gebrant.png b/mods/tutorial/textures/tutorial_gruen_gebrant.png deleted file mode 100644 index aad2d35..0000000 Binary files a/mods/tutorial/textures/tutorial_gruen_gebrant.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_gruen_gebrant_block.png b/mods/tutorial/textures/tutorial_gruen_gebrant_block.png deleted file mode 100644 index 4e657db..0000000 Binary files a/mods/tutorial/textures/tutorial_gruen_gebrant_block.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_helmet_King.png b/mods/tutorial/textures/tutorial_helmet_King.png deleted file mode 100644 index 2f7dea2..0000000 Binary files a/mods/tutorial/textures/tutorial_helmet_King.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_helmet_King1_preview.png b/mods/tutorial/textures/tutorial_helmet_King1_preview.png deleted file mode 100644 index 8000fc0..0000000 Binary files a/mods/tutorial/textures/tutorial_helmet_King1_preview.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_kreutz.png b/mods/tutorial/textures/tutorial_kreutz.png deleted file mode 100644 index 968534d..0000000 Binary files a/mods/tutorial/textures/tutorial_kreutz.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_lavaball.png b/mods/tutorial/textures/tutorial_lavaball.png deleted file mode 100644 index 7e43002..0000000 Binary files a/mods/tutorial/textures/tutorial_lavaball.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_lavasword.png b/mods/tutorial/textures/tutorial_lavasword.png deleted file mode 100644 index b40e413..0000000 Binary files a/mods/tutorial/textures/tutorial_lavasword.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_lightstone_red_off.png b/mods/tutorial/textures/tutorial_lightstone_red_off.png deleted file mode 100644 index 3c828b2..0000000 Binary files a/mods/tutorial/textures/tutorial_lightstone_red_off.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_lightstone_red_on.png b/mods/tutorial/textures/tutorial_lightstone_red_on.png deleted file mode 100644 index 512b0fe..0000000 Binary files a/mods/tutorial/textures/tutorial_lightstone_red_on.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_mineral_blau.png b/mods/tutorial/textures/tutorial_mineral_blau.png deleted file mode 100644 index d38cbe5..0000000 Binary files a/mods/tutorial/textures/tutorial_mineral_blau.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_mineral_gelb.png b/mods/tutorial/textures/tutorial_mineral_gelb.png deleted file mode 100644 index 60b5c51..0000000 Binary files a/mods/tutorial/textures/tutorial_mineral_gelb.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_mineral_gruen.png b/mods/tutorial/textures/tutorial_mineral_gruen.png deleted file mode 100644 index 4904e05..0000000 Binary files a/mods/tutorial/textures/tutorial_mineral_gruen.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_mineral_rosa.png b/mods/tutorial/textures/tutorial_mineral_rosa.png deleted file mode 100644 index 354a89d..0000000 Binary files a/mods/tutorial/textures/tutorial_mineral_rosa.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_mineral_rot.png b/mods/tutorial/textures/tutorial_mineral_rot.png deleted file mode 100644 index 05c7841..0000000 Binary files a/mods/tutorial/textures/tutorial_mineral_rot.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_mineral_turkis.png b/mods/tutorial/textures/tutorial_mineral_turkis.png deleted file mode 100644 index 2d34a14..0000000 Binary files a/mods/tutorial/textures/tutorial_mineral_turkis.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_pingu.png b/mods/tutorial/textures/tutorial_pingu.png deleted file mode 100644 index ca79e09..0000000 Binary files a/mods/tutorial/textures/tutorial_pingu.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_plutonium.png b/mods/tutorial/textures/tutorial_plutonium.png deleted file mode 100644 index c76056f..0000000 Binary files a/mods/tutorial/textures/tutorial_plutonium.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_plutonium_ingot.png b/mods/tutorial/textures/tutorial_plutonium_ingot.png deleted file mode 100644 index 58fc2ff..0000000 Binary files a/mods/tutorial/textures/tutorial_plutonium_ingot.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_plutonium_ingot2.png b/mods/tutorial/textures/tutorial_plutonium_ingot2.png deleted file mode 100644 index db73d66..0000000 Binary files a/mods/tutorial/textures/tutorial_plutonium_ingot2.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_plutonium_lump.png b/mods/tutorial/textures/tutorial_plutonium_lump.png deleted file mode 100644 index c306afd..0000000 Binary files a/mods/tutorial/textures/tutorial_plutonium_lump.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_radioaktive.png b/mods/tutorial/textures/tutorial_radioaktive.png deleted file mode 100644 index 374dd88..0000000 Binary files a/mods/tutorial/textures/tutorial_radioaktive.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_radioaktiveball.png b/mods/tutorial/textures/tutorial_radioaktiveball.png deleted file mode 100644 index 490a520..0000000 Binary files a/mods/tutorial/textures/tutorial_radioaktiveball.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_radioaktivebattleaxe.png b/mods/tutorial/textures/tutorial_radioaktivebattleaxe.png deleted file mode 100644 index f17fe3f..0000000 Binary files a/mods/tutorial/textures/tutorial_radioaktivebattleaxe.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_raketenwerfer.png b/mods/tutorial/textures/tutorial_raketenwerfer.png deleted file mode 100644 index 8a87a4d..0000000 Binary files a/mods/tutorial/textures/tutorial_raketenwerfer.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_reaktor_core.png b/mods/tutorial/textures/tutorial_reaktor_core.png deleted file mode 100644 index eb8e5f5..0000000 Binary files a/mods/tutorial/textures/tutorial_reaktor_core.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_rosa.png b/mods/tutorial/textures/tutorial_rosa.png deleted file mode 100644 index 0e01619..0000000 Binary files a/mods/tutorial/textures/tutorial_rosa.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_rosa_block.png b/mods/tutorial/textures/tutorial_rosa_block.png deleted file mode 100644 index 80a1d03..0000000 Binary files a/mods/tutorial/textures/tutorial_rosa_block.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_rosa_block2.png b/mods/tutorial/textures/tutorial_rosa_block2.png deleted file mode 100644 index 979b62f..0000000 Binary files a/mods/tutorial/textures/tutorial_rosa_block2.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_rosa_block3.png b/mods/tutorial/textures/tutorial_rosa_block3.png deleted file mode 100644 index 8483ba1..0000000 Binary files a/mods/tutorial/textures/tutorial_rosa_block3.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_rosa_gebrant.png b/mods/tutorial/textures/tutorial_rosa_gebrant.png deleted file mode 100644 index 66d9914..0000000 Binary files a/mods/tutorial/textures/tutorial_rosa_gebrant.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_rosa_gebrant_block.png b/mods/tutorial/textures/tutorial_rosa_gebrant_block.png deleted file mode 100644 index feadb1d..0000000 Binary files a/mods/tutorial/textures/tutorial_rosa_gebrant_block.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_rot.png b/mods/tutorial/textures/tutorial_rot.png deleted file mode 100644 index 91ca85a..0000000 Binary files a/mods/tutorial/textures/tutorial_rot.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_rot_block.png b/mods/tutorial/textures/tutorial_rot_block.png deleted file mode 100644 index e5a8000..0000000 Binary files a/mods/tutorial/textures/tutorial_rot_block.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_rot_block2.png b/mods/tutorial/textures/tutorial_rot_block2.png deleted file mode 100644 index f0140a1..0000000 Binary files a/mods/tutorial/textures/tutorial_rot_block2.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_rot_block3.png b/mods/tutorial/textures/tutorial_rot_block3.png deleted file mode 100644 index 05344b5..0000000 Binary files a/mods/tutorial/textures/tutorial_rot_block3.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_rot_gebrant.png b/mods/tutorial/textures/tutorial_rot_gebrant.png deleted file mode 100644 index 4868b60..0000000 Binary files a/mods/tutorial/textures/tutorial_rot_gebrant.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_rot_gebrant_block.png b/mods/tutorial/textures/tutorial_rot_gebrant_block.png deleted file mode 100644 index 57e0515..0000000 Binary files a/mods/tutorial/textures/tutorial_rot_gebrant_block.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_solar_panel.png b/mods/tutorial/textures/tutorial_solar_panel.png deleted file mode 100644 index a7b0f75..0000000 Binary files a/mods/tutorial/textures/tutorial_solar_panel.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_spawner.png b/mods/tutorial/textures/tutorial_spawner.png deleted file mode 100644 index 06037b4..0000000 Binary files a/mods/tutorial/textures/tutorial_spawner.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_superzauberdiamondaxe.png b/mods/tutorial/textures/tutorial_superzauberdiamondaxe.png deleted file mode 100644 index e79ee65..0000000 Binary files a/mods/tutorial/textures/tutorial_superzauberdiamondaxe.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_superzauberdiamondpick.png b/mods/tutorial/textures/tutorial_superzauberdiamondpick.png deleted file mode 100644 index fc6f913..0000000 Binary files a/mods/tutorial/textures/tutorial_superzauberdiamondpick.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_superzauberdiamondshovel.png b/mods/tutorial/textures/tutorial_superzauberdiamondshovel.png deleted file mode 100644 index b47bc77..0000000 Binary files a/mods/tutorial/textures/tutorial_superzauberdiamondshovel.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_superzauberdiamondsword.png b/mods/tutorial/textures/tutorial_superzauberdiamondsword.png deleted file mode 100644 index 2a059ad..0000000 Binary files a/mods/tutorial/textures/tutorial_superzauberdiamondsword.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_trophy_year5.png b/mods/tutorial/textures/tutorial_trophy_year5.png new file mode 100644 index 0000000..7e6c966 Binary files /dev/null and b/mods/tutorial/textures/tutorial_trophy_year5.png differ diff --git a/mods/tutorial/textures/tutorial_turkis.png b/mods/tutorial/textures/tutorial_turkis.png deleted file mode 100644 index 8113797..0000000 Binary files a/mods/tutorial/textures/tutorial_turkis.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_turkis_block.png b/mods/tutorial/textures/tutorial_turkis_block.png deleted file mode 100644 index d3cdae4..0000000 Binary files a/mods/tutorial/textures/tutorial_turkis_block.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_turkis_block2.png b/mods/tutorial/textures/tutorial_turkis_block2.png deleted file mode 100644 index 3ce43fb..0000000 Binary files a/mods/tutorial/textures/tutorial_turkis_block2.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_turkis_block3.png b/mods/tutorial/textures/tutorial_turkis_block3.png deleted file mode 100644 index c6d1d9e..0000000 Binary files a/mods/tutorial/textures/tutorial_turkis_block3.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_turkis_gebrant.png b/mods/tutorial/textures/tutorial_turkis_gebrant.png deleted file mode 100644 index e650409..0000000 Binary files a/mods/tutorial/textures/tutorial_turkis_gebrant.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_turkis_gebrant_block.png b/mods/tutorial/textures/tutorial_turkis_gebrant_block.png deleted file mode 100644 index a9594c4..0000000 Binary files a/mods/tutorial/textures/tutorial_turkis_gebrant_block.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_verseuchtebattleaxe.png b/mods/tutorial/textures/tutorial_verseuchtebattleaxe.png deleted file mode 100644 index e76f599..0000000 Binary files a/mods/tutorial/textures/tutorial_verseuchtebattleaxe.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_verseuchter_glass_reaktor_core.png b/mods/tutorial/textures/tutorial_verseuchter_glass_reaktor_core.png deleted file mode 100644 index 4811710..0000000 Binary files a/mods/tutorial/textures/tutorial_verseuchter_glass_reaktor_core.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_verseuchter_reaktor_core.png b/mods/tutorial/textures/tutorial_verseuchter_reaktor_core.png deleted file mode 100644 index 81228e9..0000000 Binary files a/mods/tutorial/textures/tutorial_verseuchter_reaktor_core.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_verseuchtesgeschenk.png b/mods/tutorial/textures/tutorial_verseuchtesgeschenk.png deleted file mode 100644 index ebe8783..0000000 Binary files a/mods/tutorial/textures/tutorial_verseuchtesgeschenk.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_waterball.png b/mods/tutorial/textures/tutorial_waterball.png deleted file mode 100644 index 1226474..0000000 Binary files a/mods/tutorial/textures/tutorial_waterball.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_watersword.png b/mods/tutorial/textures/tutorial_watersword.png deleted file mode 100644 index 98b7e96..0000000 Binary files a/mods/tutorial/textures/tutorial_watersword.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_yellowstone.png b/mods/tutorial/textures/tutorial_yellowstone.png deleted file mode 100644 index 6fa08a7..0000000 Binary files a/mods/tutorial/textures/tutorial_yellowstone.png and /dev/null differ diff --git a/mods/tutorial/textures/tutorial_zauberbogen.png b/mods/tutorial/textures/tutorial_zauberbogen.png deleted file mode 100644 index 672e1b6..0000000 Binary files a/mods/tutorial/textures/tutorial_zauberbogen.png and /dev/null differ diff --git a/mods/tutorial/tool.lua b/mods/tutorial/tool.lua index f3b2c91..a6b2eb9 100644 --- a/mods/tutorial/tool.lua +++ b/mods/tutorial/tool.lua @@ -64,13 +64,6 @@ minetest.register_tool("tutorial:regnumbattleaxe1", { damage_groups = {fleshy=150} }, liquids_pointable = false, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:regnumbattleaxe2") - end - return itemstack - end, }) minetest.register_tool("tutorial:regnumbattleaxe2", { description = "Regnumbattleaxe Mode 2 (dig water and lava)\nBattleaxe-lv.MAX", @@ -90,13 +83,6 @@ minetest.register_tool("tutorial:regnumbattleaxe2", { damage_groups = {fleshy=150} }, liquids_pointable = true, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:regnumbattleaxe3") - end - return itemstack - end, }) minetest.register_tool("tutorial:superlegendenbattleaxe1", { description = "Superlegendbattleaxe Mode 1 (dig water and lava)\nBattleaxe-lv.122", @@ -116,13 +102,6 @@ minetest.register_tool("tutorial:superlegendenbattleaxe1", { damage_groups = {fleshy=122} }, liquids_pointable = true, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:superlegendenbattleaxe2") - end - return itemstack - end, }) minetest.register_tool("tutorial:superlegendenbattleaxe2", { description = "Superlegendbattleaxe Mode 2 (dig no water and lava)\nBattleaxe-lv.122", @@ -142,13 +121,6 @@ minetest.register_tool("tutorial:superlegendenbattleaxe2", { damage_groups = {fleshy=122} }, liquids_pointable = false, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:superlegendenbattleaxe3") - end - return itemstack - end, }) minetest.register_tool("tutorial:lilabattleaxe2", { description = "Purplebattleaxe Lv.MAX", @@ -553,13 +525,6 @@ minetest.register_tool("tutorial:adminbattleaxe", { damage_groups = {fleshy=2000} }, liquids_pointable = false, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:adminbattleaxe2") - end - return itemstack - end, }) minetest.register_tool("tutorial:adminbattleaxe2", { description = "Admin tool 3: Admin battleaxe Mode 2 (dig no water and lava)", @@ -580,13 +545,6 @@ minetest.register_tool("tutorial:adminbattleaxe2", { damage_groups = {fleshy=2000} }, liquids_pointable = true, - on_secondary_use = function(itemstack, user, pointed_thing) - local keys = user:get_player_control() - if keys["sneak"] == true then - itemstack:set_name("tutorial:adminbattleaxe3") - end - return itemstack - end, }) --v.0.17.0 --v.0.16.0