diff --git a/README.txt b/README.txt index 0acc7dd..76c86b3 100644 --- a/README.txt +++ b/README.txt @@ -17,4 +17,7 @@ And this in only one Game. License: See README.txt in each mod for more information -Every code written by me is LGPLv2.1 \ No newline at end of file +Every code written by me is LGPLv2.1 + +Notes: +sfinv mod changed \ No newline at end of file diff --git a/menu/Thumbs.db b/menu/Thumbs.db index 5ac645f..976c1e6 100644 Binary files a/menu/Thumbs.db and b/menu/Thumbs.db differ diff --git a/mods/3d_armor/.gitignore b/mods/3d_armor/.gitignore index 6e4e459..ba96b08 100644 --- a/mods/3d_armor/.gitignore +++ b/mods/3d_armor/.gitignore @@ -6,3 +6,6 @@ tags *.vim armor.conf +## Eclipse project files & directories +.project +.settings diff --git a/mods/3d_armor/3d_armor/LICENSE.txt b/mods/3d_armor/3d_armor/LICENSE.txt new file mode 100644 index 0000000..e1949c0 --- /dev/null +++ b/mods/3d_armor/3d_armor/LICENSE.txt @@ -0,0 +1,9 @@ +[mod] 3d Armor [3d_armor] +========================= + +License Source Code: (C) 2012-2017 Stuart Jones - LGPL v2.1 + +License Textures: Copyright (C) 2017 davidthecreator - CC-BY-SA 3.0 + +https://github.com/daviddoesminetest/3d-armors-new-textures + diff --git a/mods/3d_armor/3d_armor/README.txt b/mods/3d_armor/3d_armor/README.txt index 224f81c..a0cb3b1 100644 --- a/mods/3d_armor/3d_armor/README.txt +++ b/mods/3d_armor/3d_armor/README.txt @@ -3,7 +3,9 @@ Depends: default -Recommends: inventory_plus or unified_inventory (use only one) +Recommends: sfinv, unified_inventory or smart_inventory (use only one to avoid conflicts) + +Supports: player_monoids and armor_monoid Adds craftable armor that is visible to other players. Each armor item worn contributes to a player's armor group level making them less vulnerable to weapons. @@ -14,11 +16,176 @@ Overall level is boosted by 10% when wearing a full matching set. Fire protection added by TenPlus1 when using crystal armor if Ethereal mod active, level 1 protects against torches, level 2 for crystal spike, level 3 for fire, level 5 for lava. -Configuration -------------- +Armor Configuration +------------------- -Armor can be configured by adding a file called armor.conf in 3d_armor mod and/or world directory. -see armor.conf.example for all available options. +Override the following default settings by adding them to your minetest.conf file. -Note: worldpath config settings override any settings made in the mod's directory. +-- Set false to disable individual armor materials. +armor_material_wood = true +armor_material_cactus = true +armor_material_steel = true +armor_material_bronze = true +armor_material_diamond = true +armor_material_gold = true +armor_material_mithril = true +armor_material_crystal = true + +-- Increase this if you get initialization glitches when a player first joins. +armor_init_delay = 1 + +-- Number of initialization attempts. +-- Use in conjunction with armor_init_delay if initialization problems persist. +armor_init_times = 1 + +-- Increase this if armor is not getting into bones due to server lag. +armor_bones_delay = 1 + +-- How often player armor items are updated. +armor_update_time = 1 + +-- Drop armor when a player dies. +-- Uses bones mod if present, otherwise items are dropped around the player. +armor_drop = true + +-- Pulverise armor when a player dies, overrides armor_drop. +armor_destroy = false + +-- You can use this to increase or decrease overall armor effectiveness, +-- eg: level_multiplier = 0.5 will reduce armor level by half. +armor_level_multiplier = 1 + +-- You can use this to increase or decrease overall armor healing, +-- eg: armor_heal_multiplier = 0 will disable healing altogether. +armor_heal_multiplier = 1 + +-- Enable water protection (periodically restores breath when activated) +armor_water_protect = true + +-- Enable fire protection (defaults true if using ethereal mod) +armor_fire_protect = false + +-- Enable punch damage effects. +armor_punch_damage = true + +-- Enable migration of old armor inventories +armor_migrate_old_inventory = true + +API +--- + +Armor Registration: + +armor:register_armor(name, def) + +Wrapper function for `minetest.register_tool`, while registering armor as +a tool item is still supported, this may be deprecated in future so new code +should use this method. + +Additional fields supported by 3d_armor: + + texture = + preview = + armor_groups = + damage_groups =
+ reciprocate_damage = + on_equip = + on_unequip = + on_destroy = + on_damage = + on_punched = + +armor:register_armor_group(group, base) + +Example: + +armor:register_armor_group("radiation", 100) + +armor:register_armor("mod_name:speed_boots", { + description = "Speed Boots", + inventory_image = "mod_name_speed_boots_inv.png", + texture = "mod_name_speed_boots.png", + preview = "mod_name_speed_boots_preview.png", + groups = {armor_feet=1, armor_use=500, physics_speed=1.2, flammable=1}, + armor_groups = {fleshy=10, radiation=10}, + damage_groups = {cracky=3, snappy=3, choppy=3, crumbly=3, level=1}, + reciprocate_damage = true, + on_destroy = function(player, index, stack) + local pos = player:getpos() + if pos then + minetest.sound_play({ + name = "mod_name_break_sound", + pos = pos, + gain = 0.5, + }) + end + end, +}) + +See armor.lua, technic_armor and shields mods for more examples. + +Default groups: + +Elements: armor_head, armor_torso, armor_legs, armor_feet +Attributes: armor_heal, armor_fire, armor_water +Physics: physics_jump, physics_speed, physics_gravity +Durability: armor_use, flammable + +Notes: + +Elements may be modified by dependent mods, eg shields adds armor_shield. +Attributes and physics values are 'stackable', durability is determined +by the level of armor_use, total uses == approx (65535/armor_use), non-fleshy +damage groups need to be defined in the tool/weapon used against the player. + +Reciprocal tool damage will be done only by the first armor inventory item + with `reciprocate_damage = true` + +Armor Functions: + +armor:set_player_armor(player) + +Primarily an internal function but can be called externally to apply any +changes that might not otherwise get handled. + +armor:punch(player, hitter, time_from_last_punch, tool_capabilities) + +Used to apply damage to all equipped armor based on the damage groups of +each individual item.`hitter`, `time_from_last_punch` and `tool_capabilities` +are optional but should be valid if included. + +armor:damage(player, index, stack, use) + +Adds wear to a single armor itemstack, triggers `on_damage` callbacks and +updates the necessary inventories. Also handles item destruction callbacks +and so should NOT be called from `on_unequip` to avoid an infinite loop. + +Item Callbacks: + +on_equip = func(player, index, stack) +on_unequip = func(player, index, stack) +on_destroy = func(player, index, stack) +on_damage = func(player, index, stack) +on_punched = func(player, hitter, time_from_last_punch, tool_capabilities) + +Notes: + +`on_punched` is called every time a player is punched or takes damage, `hitter`, +`time_from_last_punch` and `tool_capabilities` can be `nil` and will be in the +case of fall damage, etc. When fire protection is enabled, hitter == "fire" +in the event of fire damage. Return `false` to override armor damage effects. +When armor is destroyed `stack` will contain a copy of the previous stack. + +Global Callbacks: + +armor:register_on_update(func(player)) +armor:register_on_equip(func(player, index, stack)) +armor:register_on_unequip(func(player, index, stack)) +armor:register_on_destroy(func(player, index, stack)) + +Global Callback Example: + +armor:register_on_update(function(player) + print(player:get_player_name().." armor updated!") +end) diff --git a/mods/3d_armor/3d_armor/admin.lua b/mods/3d_armor/3d_armor/admin.lua deleted file mode 100644 index f8e1dd9..0000000 --- a/mods/3d_armor/3d_armor/admin.lua +++ /dev/null @@ -1,243 +0,0 @@ -minetest.register_alias("adminboots","3d_armor:boots_admin") -minetest.register_alias("adminhelmet","3d_armor:helmet_admin") -minetest.register_alias("adminchestplate","3d_armor:chestplate_admin") -minetest.register_alias("adminlegginss","3d_armor:leggings_admin") - -minetest.register_tool("3d_armor:helmet_admin", { - description = "Admin Helmet Mode 1 (no speed and no jump)", - inventory_image = "3d_armor_inv_helmet_admin.png^technic_tool_mode1.png", - wield_image = "3d_armor_inv_helmet_admin.png", - groups = {armor_head=5000, armor_heal=2500, armor_use=0, not_in_creative_inventory=1, armor_fire=2000}, - wear = 0, - on_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", { - description = "Admin Helmet Mode 2 (speed and no jump)", - inventory_image = "3d_armor_inv_helmet_admin.png^technic_tool_mode2.png", - wield_image = "3d_armor_inv_helmet_admin.png", - groups = {armor_head=5000, armor_heal=2500, armor_use=0, not_in_creative_inventory=1, armor_fire=2000, physics_speed=0.25}, - wear = 0, - on_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", { - description = "Admin Helmet Mode 3 (no speed and jump)", - inventory_image = "3d_armor_inv_helmet_admin.png^technic_tool_mode3.png", - wield_image = "3d_armor_inv_helmet_admin.png", - groups = {armor_head=5000, armor_heal=2500, armor_use=0, not_in_creative_inventory=1, armor_fire=2000, physics_jump=0.25}, - wear = 0, - on_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", { - description = "Admin Helmet Mode 4 (speed and jump)", - inventory_image = "3d_armor_inv_helmet_admin.png^technic_tool_mode4.png", - wield_image = "3d_armor_inv_helmet_admin.png", - groups = {armor_head=5000, armor_heal=2500, armor_use=0, not_in_creative_inventory=1, armor_fire=2000, physics_jump=0.25, physics_speed=0.25}, - wear = 0, - on_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", { - description = "Admin Chestplate Mode 1 (no speed and no jump)", - inventory_image = "3d_armor_inv_chestplate_admin.png^technic_tool_mode1.png", - wield_image = "3d_armor_inv_chestplate_admin.png", - groups = {armor_torso=10000, armor_heal=5000, armor_use=0, not_in_creative_inventory=1, armor_fire=2000}, - wear = 0, - on_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", { - description = "Admin Chestplate Mode 2 (speed and no jump)", - inventory_image = "3d_armor_inv_chestplate_admin.png^technic_tool_mode2.png", - wield_image = "3d_armor_inv_chestplate_admin.png", - groups = {armor_torso=10000, armor_heal=5000, armor_use=0, not_in_creative_inventory=1, armor_fire=2000, physics_speed=0.25}, - wear = 0, - on_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=10000, armor_heal=5000, armor_use=0, not_in_creative_inventory=1, armor_fire=2000, physics_jump=0.25}, - wear = 0, - on_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=10000, armor_heal=5000, armor_use=0, not_in_creative_inventory=1, armor_fire=2000, physics_jump=0.25, physics_speed=0.25}, - wear = 0, - on_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=5000, armor_heal=2500, armor_use=0, not_in_creative_inventory=1, armor_fire=2000}, - wear = 0, - on_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", { - description = "Admin Leggings Mode 2 (speed and no jump)", - wield_image = "3d_armor_inv_leggings_admin.png", - inventory_image = "3d_armor_inv_leggings_admin.png^technic_tool_mode2.png", - groups = {armor_legs=5000, armor_heal=2500, armor_use=0, not_in_creative_inventory=1, armor_fire=2000, physics_speed=0.25}, - wear = 0, - on_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", { - description = "Admin Leggings Mode 3 (no speed and jump)", - wield_image = "3d_armor_inv_leggings_admin.png", - inventory_image = "3d_armor_inv_leggings_admin.png^technic_tool_mode3.png", - groups = {armor_legs=5000, armor_heal=2500, armor_use=0, not_in_creative_inventory=1, armor_fire=2000, physics_jump=0.25}, - wear = 0, - on_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", { - description = "Admin Leggings Mode 4 (speed and jump)", - inventory_image = "3d_armor_inv_leggings_admin.png^technic_tool_mode4.png", - wield_image = "3d_armor_inv_leggings_admin.png", - groups = {armor_legs=5000, armor_heal=2500, armor_use=0, not_in_creative_inventory=1, armor_fire=2000, physics_jump=0.25, physics_speed=0.25}, - wear = 0, - on_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=5000, armor_heal=2500, armor_use=0, not_in_creative_inventory=1, armor_fire=2000}, - wear = 0, - on_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", { - description = "Admin Boots Mode 2 (speed and no jump)", - inventory_image = "3d_armor_inv_boots_admin.png^technic_tool_mode2.png", - wield_image = "3d_armor_inv_boots_admin.png", - groups = {armor_feet=5000, armor_heal=2500, armor_use=0, not_in_creative_inventory=1, armor_fire=2000, physics_speed=0.25}, - wear = 0, - on_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", { - description = "Admin Boots Mode 3 (no speed and jump)", - inventory_image = "3d_armor_inv_boots_admin.png^technic_tool_mode3.png", - wield_image = "3d_armor_inv_boots_admin.png", - groups = {armor_feet=5000, armor_heal=2500, armor_use=0, not_in_creative_inventory=1, armor_fire=2000, physics_jump=0.25}, - wear = 0, - on_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", { - description = "Admin Boots Mode 4 (speed and jump)", - inventory_image = "3d_armor_inv_boots_admin.png^technic_tool_mode4.png", - wield_image = "3d_armor_inv_boots_admin.png", - groups = {armor_feet=5000, armor_heal=2500, armor_use=0, not_in_creative_inventory=1, armor_fire=2000, physics_jump=0.25, physics_speed=0.25}, - wear = 0, - on_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, -}) \ No newline at end of file diff --git a/mods/3d_armor/3d_armor/api.lua b/mods/3d_armor/3d_armor/api.lua new file mode 100644 index 0000000..e54ff25 --- /dev/null +++ b/mods/3d_armor/3d_armor/api.lua @@ -0,0 +1,604 @@ +-- support for i18n +local S = armor_i18n.gettext + +local skin_previews = {} +local use_player_monoids = minetest.global_exists("player_monoids") +local use_armor_monoid = minetest.global_exists("armor_monoid") +local use_pova_mod = minetest.get_modpath("pova") +local armor_def = setmetatable({}, { + __index = function() + return setmetatable({ + groups = setmetatable({}, { + __index = function() + return 0 + end}) + }, { + __index = function() + return 0 + end + }) + end, +}) +local armor_textures = setmetatable({}, { + __index = function() + return setmetatable({}, { + __index = function() + return "blank.png" + end + }) + end +}) + +armor = { + timer = 0, + elements = {"head", "torso", "legs", "feet"}, + physics = {"jump", "speed", "gravity"}, + attributes = {"heal", "fire", "water"}, + formspec = "image[2.5,1;2,4;armor_preview]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_player;main;1,5.7;8,1;]".. + "list[current_player;main;1,6.85;8,3;8]".. + "label[8,3;Armor key]".. + "label[5.9,3;Protectionkey]".. + "list[current_player;arm;8,2;1,1;]", + def = armor_def, + textures = armor_textures, + default_skin = "character", + materials = { + wood = "group:wood", + cactus = "default:cactus", + steel = "default:steel_ingot", + bronze = "default:bronze_ingot", + diamond = "default:diamond", + gold = "default:gold_ingot", + mithril = "moreores:mithril_ingot", + crystal = "ethereal:crystal_ingot", + }, + fire_nodes = { + {"default:lava_source", 5, 8}, + {"default:lava_flowing", 5, 8}, + {"fire:basic_flame", 3, 4}, + {"fire:permanent_flame", 3, 4}, + {"ethereal:crystal_spike", 2, 1}, + {"ethereal:fire_flower", 2, 1}, + {"default:torch", 1, 1}, + {"default:torch_ceiling", 1, 1}, + {"default:torch_wall", 1, 1}, + }, + registered_groups = {["fleshy"]=100}, + registered_callbacks = { + on_update = {}, + on_equip = {}, + on_unequip = {}, + on_damage = {}, + on_destroy = {}, + }, + migrate_old_inventory = false, + version = "0.4.12", +} + +armor.config = { + init_delay = 2, + init_times = 10, + bones_delay = 1, + update_time = 1, + drop = false, + destroy = false, + level_multiplier = 1, + heal_multiplier = 1, + material_wood = true, + material_cactus = true, + material_steel = true, + material_bronze = true, + material_diamond = true, + material_gold = true, + material_mithril = true, + material_crystal = true, + water_protect = true, + fire_protect = true, + punch_damage = true, +} + +-- Armor Registration + +armor.register_armor = function(self, name, def) + minetest.register_tool(name, def) +end + +armor.register_armor_group = function(self, group, base) + base = base or 100 + self.registered_groups[group] = base + if use_armor_monoid then + armor_monoid.register_armor_group(group, base) + end +end + +-- Armor callbacks + +armor.register_on_update = function(self, func) + if type(func) == "function" then + table.insert(self.registered_callbacks.on_update, func) + end +end + +armor.register_on_equip = function(self, func) + if type(func) == "function" then + table.insert(self.registered_callbacks.on_equip, func) + end +end + +armor.register_on_unequip = function(self, func) + if type(func) == "function" then + table.insert(self.registered_callbacks.on_unequip, func) + end +end + +armor.register_on_damage = function(self, func) + if type(func) == "function" then + table.insert(self.registered_callbacks.on_damage, func) + end +end + +armor.register_on_destroy = function(self, func) + if type(func) == "function" then + table.insert(self.registered_callbacks.on_destroy, func) + end +end + +armor.run_callbacks = function(self, callback, player, index, stack) + if stack then + local def = stack:get_definition() or {} + if type(def[callback]) == "function" then + def[callback](player, index, stack) + end + end + local callbacks = self.registered_callbacks[callback] + if callbacks then + for _, func in pairs(callbacks) do + func(player, index, stack) + end + end +end + +armor.update_player_visuals = function(self, player) + if not player then + return + end + local name = player:get_player_name() + if self.textures[name] then + default.player_set_textures(player, { + self.textures[name].skin, + self.textures[name].armor, + self.textures[name].wielditem, + }) + end + self:run_callbacks("on_update", player) +end + +armor.set_player_armor = function(self, player) + local name, armor_inv = self:get_valid_player(player, "[set_player_armor]") + if not name then + return + end + local state = 0 + local count = 0 + local material = {count=1} + local preview = armor:get_preview(name) + local texture = "3d_armor_trans.png" + local textures = {} + local physics = {} + local attributes = {} + local levels = {} + local groups = {} + local change = {} + for _, phys in pairs(self.physics) do + physics[phys] = 1 + end + for _, attr in pairs(self.attributes) do + attributes[attr] = 0 + end + for group, _ in pairs(self.registered_groups) do + change[group] = 1 + levels[group] = 0 + end + local list = armor_inv:get_list("armor") + if type(list) ~= "table" then + return + end + for i, stack in pairs(list) do + if stack:get_count() == 1 then + local def = stack:get_definition() + for _, element in pairs(self.elements) do + if def.groups["armor_"..element] then + if def.armor_groups then + for group, level in pairs(def.armor_groups) do + if levels[group] then + levels[group] = levels[group] + level + end + end + else + local level = def.groups["armor_"..element] + levels["fleshy"] = levels["fleshy"] + level + end + break + end + -- DEPRECATED, use armor_groups instead + if def.groups["armor_radiation"] and levels["radiation"] then + levels["radiation"] = def.groups["armor_radiation"] + end + end + local item = stack:get_name() + local tex = def.texture or item:gsub("%:", "_") + tex = tex:gsub(".png$", "") + local prev = def.preview or tex.."_preview" + prev = prev:gsub(".png$", "") + local player_inv = player:get_inventory() + local coun = player_inv:get_stack("am", 1):get_count() + if coun == 0 then + texture = texture.."^"..tex..".png" + end + preview = preview.."^"..prev..".png" + state = state + stack:get_wear() + count = count + 1 + for _, phys in pairs(self.physics) do + local value = def.groups["physics_"..phys] or 0 + physics[phys] = physics[phys] + value + end + for _, attr in pairs(self.attributes) do + local value = def.groups["armor_"..attr] or 0 + local armor_inv = minetest.get_inventory({type="detached", name=player:get_player_name().."_armor"}) + local arm = armor_inv:get_stack("arm2", 1):get_name() + if attr == "heal" then + if arm == "tutorial:protection_schluessel1" then + value = value+value*0.1 + elseif arm == "tutorial:protection_schluessel2" then + value = value+value*0.2 + elseif arm == "tutorial:protection_schluessel3" then + value = value+value*0.3 + end + end + attributes[attr] = attributes[attr] + value + end + local mat = string.match(item, "%:.+_(.+)$") + if material.name then + if material.name == mat then + material.count = material.count + 1 + end + else + material.name = mat + end + end + end + for group, level in pairs(levels) do + local armor_inv = minetest.get_inventory({type="detached", name=player:get_player_name().."_armor"}) + local arm = armor_inv:get_stack("arm2", 1):get_name() + if arm == "tutorial:protection_schluessel1" then + level = level+level*0.1 + elseif arm == "tutorial:protection_schluessel2" then + level = level+level*0.2 + elseif arm == "tutorial:protection_schluessel3" then + level = level+level*0.3 + end + if level > 0 then + level = level * armor.config.level_multiplier + if material.name and material.count == #self.elements then + level = level * 1.1 + end + end + local base = self.registered_groups[group] + self.def[name].groups[group] = level + if level > base then + level = base + end + groups[group] = base - level + change[group] = groups[group] / base + end + for _, attr in pairs(self.attributes) do + local mult = attr == "heal" and self.config.heal_multiplier or 1 + self.def[name][attr] = attributes[attr] * mult + end + for _, phys in pairs(self.physics) do + self.def[name][phys] = physics[phys] + end + if use_armor_monoid then + armor_monoid.monoid:add_change(player, change, "3d_armor:armor") + else + player:set_armor_groups(groups) + end + if use_player_monoids then + player_monoids.speed:add_change(player, physics.speed, + "3d_armor:physics") + player_monoids.jump:add_change(player, physics.jump, + "3d_armor:physics") + player_monoids.gravity:add_change(player, physics.gravity, + "3d_armor:physics") + elseif use_pova_mod then + -- only add the changes, not the default 1.0 for each physics setting + pova.add_override(name, "3d_armor", { + speed = physics.speed - 1, + jump = physics.jump - 1, + gravity = physics.gravity - 1, + }) + pova.do_override(player) + else + player:set_physics_override(physics) + end + self.textures[name].armor = texture + self.textures[name].preview = preview + self.def[name].level = self.def[name].groups.fleshy or 0 + self.def[name].state = state + self.def[name].count = count + self:update_player_visuals(player) +end + +armor.punch = function(self, player, hitter, time_from_last_punch, tool_capabilities) + local name, armor_inv = self:get_valid_player(player, "[punch]") + if not name then + return + end + local state = 0 + local count = 0 + local recip = true + local default_groups = {cracky=3, snappy=3, choppy=3, crumbly=3, level=1} + local list = armor_inv:get_list("armor") + for i, stack in pairs(list) do + if stack:get_count() == 1 then + local name = stack:get_name() + local use = minetest.get_item_group(name, "armor_use") or 0 + local damage = use > 0 + local def = stack:get_definition() or {} + if type(def.on_punched) == "function" then + damage = def.on_punched(player, hitter, time_from_last_punch, + tool_capabilities) ~= false and damage == true + end + if damage == true and tool_capabilities then + local damage_groups = def.damage_groups or default_groups + local level = damage_groups.level or 0 + local groupcaps = tool_capabilities.groupcaps or {} + local uses = 0 + damage = false + for group, caps in pairs(groupcaps) do + local maxlevel = caps.maxlevel or 0 + local diff = maxlevel - level + if diff == 0 then + diff = 1 + end + if diff > 0 and caps.times then + local group_level = damage_groups[group] + if group_level then + local time = caps.times[group_level] + if time then + local dt = time_from_last_punch or 0 + if dt > time / diff then + if caps.uses then + uses = caps.uses * math.pow(3, diff) + end + damage = true + break + end + end + end + end + end + if damage == true and recip == true and hitter and + def.reciprocate_damage == true and uses > 0 then + local item = hitter:get_wielded_item() + if item and item:get_name() ~= "" then + item:add_wear(65535 / uses) + hitter:set_wielded_item(item) + end + -- reciprocate tool damage only once + recip = false + end + end + if damage == true and hitter == "fire" then + damage = minetest.get_item_group(name, "flammable") > 0 + end + if damage == true then + self:damage(player, i, stack, use) + end + state = state + stack:get_wear() + count = count + 1 + end + end + self.def[name].state = state + self.def[name].count = count +end + +armor.damage = function(self, player, index, stack, use) + local old_stack = ItemStack(stack) + stack:add_wear(use) + self:run_callbacks("on_damage", player, index, stack) + self:set_inventory_stack(player, index, stack) + if stack:get_count() == 0 then + self:run_callbacks("on_unequip", player, index, old_stack) + self:run_callbacks("on_destroy", player, index, old_stack) + self:set_player_armor(player) + end +end + +armor.get_player_skin = function(self, name) + if (self.skin_mod == "skins" or self.skin_mod == "simple_skins") and skins.skins[name] then + return skins.skins[name]..".png" + elseif self.skin_mod == "u_skins" and u_skins.u_skins[name] then + return u_skins.u_skins[name]..".png" + elseif self.skin_mod == "wardrobe" and wardrobe.playerSkins and wardrobe.playerSkins[name] then + return wardrobe.playerSkins[name] + end + return armor.default_skin..".png" +end + +armor.add_preview = function(self, preview) + skin_previews[preview] = true +end + +armor.get_preview = function(self, name) + local preview = string.gsub(armor:get_player_skin(name), ".png", "_preview.png") + if skin_previews[preview] then + return preview + end + return "character_preview.png" +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if fields.armoff then + + local player_inv = player:get_inventory() + player_inv:set_size("am", 1) + local type = player:get_inventory():get_stack("arm",1):get_name() + if type == "tutorial:armor_key" then + player_inv:set_stack("am", 1, "default:dirt") + else + end + armor:set_player_armor(player) + armor:update_inventory(player) + local name = player:get_player_name() + local formspec = armor:get_armor_formspec(name) + if inv_mod == "inventory_plus" then + local page = player:get_inventory_formspec() + if page:find("detached:"..name.."_armor") then + inventory_plus.set_inventory_formspec(player, formspec) + end + end + end + if fields.armon then + + local player_inv = player:get_inventory() + player_inv:set_size("am", 1) + player_inv:set_stack("am", 1, nil) + armor:set_player_armor(player) + armor:update_inventory(player) + local name = player:get_player_name() + local formspec = armor:get_armor_formspec(name) + if inv_mod == "inventory_plus" then + local page = player:get_inventory_formspec() + if page:find("detached:"..name.."_armor") then + inventory_plus.set_inventory_formspec(player, formspec) + end + end + end +end) + +armor.get_armor_formspec = function(self, name, listring) + if armor.def[name].init_time == 0 then + return "label[0,0;Armor not initialized!]" + end + local formspec = armor.formspec.. + "list[detached:"..name.."_armor;armor;0,1.2;1,4;]".. + "list[detached:"..name.."_armor;armor;1,2.7;1,1;4]".. + "list[detached:"..name.."_armor;arm2;6,2;1,1;]" + local player = minetest.get_player_by_name(name) + local player_inv = player:get_inventory() + local am = player_inv:get_stack("am", 1):get_count() + if am == 1 then + formspec = formspec .."button[7.5,3.7;2,0.5;armon;armor on]" + else + formspec = formspec .."button[7.5,3.7;2,0.5;armoff;armor off]" + + end + if listring == true then + formspec = formspec.."listring[current_player;main]".. + "listring[detached:"..name.."_armor;armor]" + end + formspec = formspec:gsub("armor_preview", armor.textures[name].preview) + formspec = formspec:gsub("armor_level", armor.def[name].level) + for _, attr in pairs(self.attributes) do + formspec = formspec:gsub("armor_attr_"..attr, armor.def[name][attr]) + end + for _, attr in pairs(self.physics) do + formspec = formspec:gsub("armor_physics_"..attr, armor.def[name][attr]) + end + for group, _ in pairs(self.registered_groups) do + formspec = formspec:gsub("armor_group_"..group, + armor.def[name].groups[group]) + end + return formspec +end + +armor.get_element = function(self, item_name) + for _, element in pairs(armor.elements) do + if minetest.get_item_group(item_name, "armor_"..element) > 0 then + return element + end + end +end + +armor.serialize_inventory_list = function(self, list) + local list_table = {} + for _, stack in ipairs(list) do + table.insert(list_table, stack:to_string()) + end + return minetest.serialize(list_table) +end + +armor.deserialize_inventory_list = function(self, list_string) + local list_table = minetest.deserialize(list_string) + local list = {} + for _, stack in ipairs(list_table or {}) do + table.insert(list, ItemStack(stack)) + end + return list +end + +armor.load_armor_inventory = function(self, player) + local _, inv = self:get_valid_player(player, "[load_armor_inventory]") + if inv then + local armor_list_string = player:get_attribute("3d_armor_inventory") + if armor_list_string then + inv:set_list("armor", + self:deserialize_inventory_list(armor_list_string)) + return true + end + end +end + +armor.save_armor_inventory = function(self, player) + local _, inv = self:get_valid_player(player, "[save_armor_inventory]") + if inv then + player:set_attribute("3d_armor_inventory", + self:serialize_inventory_list(inv:get_list("armor"))) + end +end + +armor.update_inventory = function(self, player) + -- DEPRECATED: Legacy inventory support +end + +armor.set_inventory_stack = function(self, player, i, stack) + local _, inv = self:get_valid_player(player, "[set_inventory_stack]") + if inv then + inv:set_stack("armor", i, stack) + self:save_armor_inventory(player) + end +end + +armor.get_valid_player = function(self, player, msg) + msg = msg or "" + if not player then + minetest.log("warning", S("3d_armor: Player reference is nil @1", msg)) + return + end + local name = player:get_player_name() + if not name then + minetest.log("warning", S("3d_armor: Player name is nil @1", msg)) + return + end + local inv = minetest.get_inventory({type="detached", name=name.."_armor"}) + if not inv then + minetest.log("warning", S("3d_armor: Detached armor inventory is nil @1", msg)) + return + end + return name, inv +end + +armor.drop_armor = function(pos, stack) + local node = minetest.get_node_or_nil(pos) + if node then + local obj = minetest.add_item(pos, stack) + if obj then + obj:setvelocity({x=math.random(-1, 1), y=5, z=math.random(-1, 1)}) + end + end +end diff --git a/mods/3d_armor/3d_armor/armor.conf.example b/mods/3d_armor/3d_armor/armor.conf.example index fceb9ed..9ce34b4 100644 --- a/mods/3d_armor/3d_armor/armor.conf.example +++ b/mods/3d_armor/3d_armor/armor.conf.example @@ -1,3 +1,7 @@ +-- DEPRECATED, will not be supported in future versions + +-- See README.txt for new configuration options. + -- Armor Configuration (defaults) -- You can remove any unwanted armor materials from this table. @@ -18,12 +22,13 @@ ARMOR_FIRE_PROTECT = false -- Fire protection nodes, (name, protection level, damage) ARMOR_FIRE_NODES = { - {"default:lava_source", 5, 4}, - {"default:lava_flowing", 5, 4}, - {"fire:basic_flame", 3, 4}, - {"ethereal:crystal_spike", 2, 1}, - {"bakedclay:safe_fire", 2, 1}, - --{"default:torch", 1, 1}, + {"default:lava_source", 5, 4}, + {"default:lava_flowing", 5, 4}, + {"fire:basic_flame", 3, 4}, + {"fire:permanent_flame", 3, 4}, + {"ethereal:crystal_spike", 2, 1}, + {"ethereal:fire_flower", 2, 1}, + {"default:torch", 1, 1}, } -- Increase this if you get initialization glitches when a player first joins. @@ -54,3 +59,7 @@ ARMOR_LEVEL_MULTIPLIER = 1 -- eg: ARMOR_HEAL_MULTIPLIER = 0 will disable healing altogether. ARMOR_HEAL_MULTIPLIER = 1 +-- You can use this to increase or decrease overall armor radiation protection, +-- eg: ARMOR_RADIATION_MULTIPLIER = 0 will completely disable radiation protection. +-- Note: patched technic mod is required +ARMOR_RADIATION_MULTIPLIER = 1 diff --git a/mods/3d_armor/3d_armor/armor.lua b/mods/3d_armor/3d_armor/armor.lua index 63145a4..f36406f 100644 --- a/mods/3d_armor/3d_armor/armor.lua +++ b/mods/3d_armor/3d_armor/armor.lua @@ -1,734 +1,241 @@ +-- support for i18n +local S = armor_i18n.gettext -ARMOR_INIT_DELAY = 1 -ARMOR_INIT_TIMES = 1 -ARMOR_BONES_DELAY = 1 -ARMOR_UPDATE_TIME = 1 -ARMOR_DROP = false -ARMOR_DESTROY = false -ARMOR_LEVEL_MULTIPLIER = 1 -ARMOR_HEAL_MULTIPLIER = 1 -ARMOR_MATERIALS = { - wood = "default:stick", - cactus = "default:cactus", - steel = "default:steel_ingot", - bronze = "default:bronze_ingot", - diamond = "default:diamond", - gold = "default:gold_ingot", - mithril = "moreores:mithril_ingot", - crystal = "ethereal:crystal_ingot", -} -ARMOR_FIRE_PROTECT = true -ARMOR_FIRE_NODES = { - {"default:lava_source", 5, 4}, - {"default:lava_flowing", 5, 4}, - {"fire:basic_flame", 3, 4}, - {"ethereal:crystal_spike", 2, 1}, - {"bakedclay:safe_fire", 2, 1}, - {"technic:corium_source", 2, 2}, - {"technic:corium_flowing", 2, 2}, - {"tutorial:xp_block", 2, 5}, -} - -local skin_mod = nil -local inv_mod = nil - -local modpath = minetest.get_modpath(ARMOR_MOD_NAME) -local worldpath = minetest.get_worldpath() -local input = io.open(modpath.."/armor.conf", "r") -if input then - dofile(modpath.."/armor.conf") - input:close() - input = nil -end -input = io.open(worldpath.."/armor.conf", "r") -if input then - dofile(worldpath.."/armor.conf") - input:close() - input = nil -end -if not minetest.get_modpath("moreores") then - ARMOR_MATERIALS.mithril = nil -end -if not minetest.get_modpath("ethereal") then - ARMOR_MATERIALS.crystal = nil -end - --- override hot nodes so they do not hurt player anywhere but mod -if ARMOR_FIRE_PROTECT == true then - minetest.after(2, function() - for _, row in ipairs(ARMOR_FIRE_NODES) do - if minetest.registered_nodes[row[1]] then - minetest.override_item(row[1], {damage_per_second = 0, radioaktive = 0}) - end - end - end) -end - -local time = 0 - -armor = { - player_hp = {}, - elements = {"head", "torso", "legs", "feet"}, - physics = {"jump","speed","gravity"}, - formspec = "size[8,8.5]list[detached:player_name_armor;armor;0,1;2,3;]" - .."list[detached:player_name_armor;arm2;6,2;1,1;]" - .."image[2,0.75;2,4;armor_preview]" - .."list[current_player;main;0,4.5;8,4;]" - .."list[current_player;craft;4,1;3,3;]" - .."list[current_player;craftpreview;7,2;1,1;]", - textures = {}, - default_skin = "character", - version = "0.4.3", -} - -if minetest.get_modpath("inventory_plus") then - inv_mod = "inventory_plus" - armor.formspec = "size[10,9.5]button[0,0;2,0.5;inven;Back]" - .."button[2,0;2,0.5;main;Main]" - .."background[10,9.5;1,1;gui_formbg.png;true]" - .."listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" - .."bgcolor[#080808BB;true]" - .."list[detached:player_name_armor;armor;0,1;1,4;]" - .."list[detached:player_name_armor;armor;1,2.5;1,1;4]" - .."image[2.5,0.75;2,4;armor_preview]" - .."label[4.5,1;Level: armor_level]" - .."label[4.5,1.5;Heal: armor_heal]" - .."label[4.5,2;Fire: armor_fire]" - .."label[4.5,2.5.5;Speed: armor_speed]" - .."label[4.5,3;Jump: armor_jump]" - .."label[8,3;Armor key]" - .."label[5.9,3;Protectionkey]" - .."list[current_player;main;1,5.5;8,1;]" - .."list[current_player;main;1,6.75;8,3;8]" - .."list[current_player;arm;8,2;1,1;]" - .."list[detached:player_name_armor;arm2;6,2;1,1;]" - -elseif minetest.get_modpath("unified_inventory") then - inv_mod = "unified_inventory" - unified_inventory.register_button("armor", { - type = "image", - image = "inventory_plus_armor.png", - }) - unified_inventory.register_page("armor", { - get_formspec = function(player) - local name = player:get_player_name() - local formspec = "background[0.06,0.99;7.92,7.52;3d_armor_ui_form.png]" - .."label[0,0;Armor]" - .."list[detached:"..name.."_armor;armor;0,1;2,3;]" - .."image[2.5,0.75;2,4;"..armor.textures[name].preview.."]" - .."label[5,1;Level: "..armor.def[name].level.."]" - .."label[5,1.5;Heal: "..armor.def[name].heal.."]" - .."label[5,2;Fire: "..armor.def[name].fire.."]" - return {formspec=formspec} - end, - }) -elseif minetest.get_modpath("inventory_enhanced") then - inv_mod = "inventory_enhanced" -end - -if minetest.get_modpath("skins") then - skin_mod = "skins" -elseif minetest.get_modpath("simple_skins") then - skin_mod = "simple_skins" -elseif minetest.get_modpath("u_skins") then - skin_mod = "u_skins" -elseif minetest.get_modpath("wardrobe") then - skin_mod = "wardrobe" -end - -armor.def = { - state = 0, - count = 0, -} - -minetest.register_on_player_receive_fields(function(player, formname, fields) - if fields.armoff then - - local player_inv = player:get_inventory() - player_inv:set_size("am", 1) - local type = player:get_inventory():get_stack("arm",1):get_name() - if type == "tutorial:armor_key" then - player_inv:set_stack("am", 1, "default:dirt") - else - end - armor:set_player_armor(player) - armor:update_inventory(player) - local name = player:get_player_name() - local formspec = armor:get_armor_formspec(name) - if inv_mod == "inventory_plus" then - local page = player:get_inventory_formspec() - if page:find("detached:"..name.."_armor") then - inventory_plus.set_inventory_formspec(player, formspec) - end - end - end - if fields.armon then - - local player_inv = player:get_inventory() - player_inv:set_size("am", 1) - player_inv:set_stack("am", 1, nil) - armor:set_player_armor(player) - armor:update_inventory(player) - local name = player:get_player_name() - local formspec = armor:get_armor_formspec(name) - if inv_mod == "inventory_plus" then - local page = player:get_inventory_formspec() - if page:find("detached:"..name.."_armor") then - inventory_plus.set_inventory_formspec(player, formspec) - end - end - end -end) -armor.update_player_visuals = function(self, player) - if not player then - return - end - local name = player:get_player_name() - if self.textures[name] then - default.player_set_textures(player, { - self.textures[name].skin, - self.textures[name].armor, - self.textures[name].wielditem, - }) - end -end - -armor.set_player_armor = function(self, player) - local name, player_inv = armor:get_valid_player(player, "[set_player_armor]") - if not name then - return - end - local armor_texture = "3d_armor_trans.png" - local armor_level = 0 - local armor_heal = 0 - local armor_fire = 0 - local state = 0 - local items = 0 - local elements = {} - local textures = {} - local physics_o = {speed=1,gravity=1,jump=1} - local material = {type=nil, count=1} - local preview = armor:get_preview(name) or "character_preview.png" - for _,v in ipairs(self.elements) do - elements[v] = false - end - for i=1, 5 do - local stack = player_inv:get_stack("armor", i) - local item = stack:get_name() - if stack:get_count() == 1 then - local def = stack:get_definition() - for k, v in pairs(elements) do - if v == false then - local level = def.groups["armor_"..k] - if level then - local texture = item:gsub("%:", "_") - local player_inv = player:get_inventory() - local coun = player_inv:get_stack("am", 1):get_count() - if coun == 0 then - table.insert(textures, texture..".png") - else - end - preview = preview.."^"..texture.."_preview.png" - armor_level = armor_level + level - state = state + stack:get_wear() - items = items + 1 - local heal = def.groups["armor_heal"] or 0 - armor_heal = armor_heal + heal - local fire = def.groups["armor_fire"] or 0 - armor_fire = armor_fire + fire - for kk,vv in ipairs(self.physics) do - local o_value = def.groups["physics_"..vv] - if o_value then - physics_o[vv] = physics_o[vv] + o_value - end - end - local mat = string.match(item, "%:.+_(.+)$") - if material.type then - if material.type == mat then - material.count = material.count + 1 - end - else - material.type = mat - end - elements[k] = true - end - end - end - end - end - armor_level = armor_level * ARMOR_LEVEL_MULTIPLIER - armor_heal = armor_heal * ARMOR_HEAL_MULTIPLIER - local player_inv = player:get_inventory() - local arm = player_inv:get_stack("arm2", 1):get_name() - if arm == "tutorial:protection_schluessel1" then - armor_level = armor_level+armor_level*0.1 - armor_heal = armor_heal+armor_heal*0.1 - armor_fire = armor_fire+armor_fire*0.1 - elseif arm == "tutorial:protection_schluessel2" then - armor_level = armor_level+armor_level*0.2 - armor_heal = armor_heal+armor_heal*0.2 - armor_fire = armor_fire+armor_fire*0.2 - elseif arm == "tutorial:protection_schluessel3" then - armor_level = armor_level+armor_level*0.3 - armor_heal = armor_heal+armor_heal*0.3 - armor_fire = armor_fire+armor_fire*0.3 - end - - if #textures > 0 then - armor_texture = table.concat(textures, "^") - end - local armor_groups = {fleshy=100} - if armor_level > 0 then - armor_groups.level = math.floor(armor_level / 100) - armor_groups.fleshy = 100 - armor_level - end - player:set_armor_groups(armor_groups) - player:set_physics_override(physics_o) - self.textures[name].armor = armor_texture - self.textures[name].preview = preview - self.def[name].state = state - self.def[name].count = items - self.def[name].level = armor_level - self.def[name].heal = armor_heal - self.def[name].jump = physics_o.jump - self.def[name].speed = physics_o.speed - self.def[name].gravity = physics_o.gravity - self.def[name].fire = armor_fire - self:update_player_visuals(player) -end - -armor.update_armor = function(self, player, dtime) - local name, player_inv, armor_inv, pos = armor:get_valid_player(player, "[update_armor]") - if not name then - return - end - local hp = player:get_hp() or 0 - if ARMOR_FIRE_PROTECT == true then - pos.y = pos.y + 1.4 -- head level - local node_head = minetest.get_node(pos).name - pos.y = pos.y - 1.2 -- feet level - local node_feet = minetest.get_node(pos).name - -- is player inside a hot node? - for _, row in ipairs(ARMOR_FIRE_NODES) do - -- check for fire protection, if not enough then get hurt - if row[1] == node_head or row[1] == node_feet then - if hp > 0 and armor.def[name].fire < row[2] then - player:set_hp(hp - row[3] * dtime) - break - end - end - end - end - if hp == 0 or hp == self.player_hp[name] then - return - end - if self.player_hp[name] > hp then - local heal_max = 0 - local state = 0 - local items = 0 - for i=1, 5 do - local stack = player_inv:get_stack("armor", i) - if stack:get_count() > 0 then - local use = stack:get_definition().groups["armor_use"] or 0 - local heal = stack:get_definition().groups["armor_heal"] or 0 - local item = stack:get_name() - stack:add_wear(use) - armor_inv:set_stack("armor", i, stack) - player_inv:set_stack("armor", i, stack) - state = state + stack:get_wear() - items = items + 1 - if stack:get_count() == 0 then - local desc = minetest.registered_items[item].description - if desc then - minetest.chat_send_player(name, "Your "..desc.." got destroyed!") - end - self:set_player_armor(player) - armor:update_inventory(player) - end - heal_max = heal_max + heal - end - end - local player_inv = player:get_inventory() - local arm = player_inv:get_stack("arm2", 1):get_name() - if arm == "tutorial:protection_schluessel1" then - heal_max = heal_max+heal_max*0.1 - elseif arm == "tutorial:protection_schluessel2" then - heal_max = heal_max+heal_max*0.2 - elseif arm == "tutorial:protection_schluessel3" then - heal_max = heal_max+heal_max*0.3 +minetest.register_tool("3d_armor:helmet_admin", { + description = "Admin Helmet Mode 1 (no speed and no jump)", + inventory_image = "3d_armor_inv_helmet_admin.png^technic_tool_mode1.png", + wield_image = "3d_armor_inv_helmet_admin.png", + groups = {armor_head=20, armor_heal=25, armor_use=0, armor_fire=1, armor_water=0.2}, + wear = 0, + on_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 - self.def[name].state = state - self.def[name].count = items - heal_max = heal_max * ARMOR_HEAL_MULTIPLIER - if heal_max == nil or heal_max == 0 then - heal_max = 1 - end - if heal_max > math.random(heal_max + math.floor(heal_max*0.1)) then - player:set_hp(self.player_hp[name]) - return - end - end - self.player_hp[name] = hp -end - -armor.get_player_skin = function(self, name) - local skin = nil - if skin_mod == "skins" or skin_mod == "simple_skins" then - skin = skins.skins[name] - elseif skin_mod == "u_skins" then - skin = u_skins.u_skins[name] - elseif skin_mod == "wardrobe" then - skin = string.gsub(wardrobe.playerSkins[name], "%.png$","") - end - return skin or armor.default_skin -end - -armor.get_preview = function(self, name) - if skin_mod == "skins" then - return armor:get_player_skin(name).."_preview.png" - end -end - -armor.get_armor_formspec = function(self, name) - if not armor.textures[name] then - minetest.log("error", "3d_armor: Player texture["..name.."] is nil [get_armor_formspec]") - return "" - end - if not armor.def[name] then - minetest.log("error", "3d_armor: Armor def["..name.."] is nil [get_armor_formspec]") - return "" - end - local player = minetest.get_player_by_name(name) - local player_inv = player:get_inventory() - local am = player_inv:get_stack("am", 1):get_count() - local formspec = armor.formspec:gsub("player_name", name) - formspec = formspec:gsub("armor_preview", armor.textures[name].preview) - formspec = formspec:gsub("armor_level", armor.def[name].level) - formspec = formspec:gsub("armor_heal", armor.def[name].heal) - formspec = formspec:gsub("armor_fire", armor.def[name].fire) - formspec = formspec:gsub("armor_jump", (armor.def[name].jump-1)*4) - formspec = formspec:gsub("armor_speed", (armor.def[name].speed-1)*4) - if am == 1 then - formspec = formspec .."button[7.5,3.7;2,0.5;armon;armor on]" - else - formspec = formspec .."button[7.5,3.7;2,0.5;armoff;armor off]" - - end - return formspec -end -armor.update_inventory = function(self, player) - local name = armor:get_valid_player(player, "[set_player_armor]") - if not name or inv_mod == "inventory_enhanced" then - return - end - if inv_mod == "unified_inventory" then - if unified_inventory.current_page[name] == "armor" then - unified_inventory.set_inventory_formspec(player, "armor") - end - else - local formspec = armor:get_armor_formspec(name) - if inv_mod == "inventory_plus" then - local page = player:get_inventory_formspec() - if page:find("detached:"..name.."_armor") then - inventory_plus.set_inventory_formspec(player, formspec) - end - else - player:set_inventory_formspec(formspec) - end - end -end - -armor.get_valid_player = function(self, player, msg) - msg = msg or "" - if not player then - minetest.log("error", "3d_armor: Player reference is nil "..msg) - return - end - local name = player:get_player_name() - if not name then - minetest.log("error", "3d_armor: Player name is nil "..msg) - return - end - local pos = player:getpos() - local player_inv = player:get_inventory() - local armor_inv = minetest.get_inventory({type="detached", name=name.."_armor"}) - if not pos then - minetest.log("error", "3d_armor: Player position is nil "..msg) - return - elseif not player_inv then - minetest.log("error", "3d_armor: Player inventory is nil "..msg) - return - elseif not armor_inv then - minetest.log("error", "3d_armor: Detached armor inventory is nil "..msg) - return - end - return name, player_inv, armor_inv, pos -end - --- Register Player Model - -default.player_register_model("3d_armor_character.b3d", { - animation_speed = 30, - textures = { - armor.default_skin..".png", - "3d_armor_trans.png", - "3d_armor_trans.png", - }, - animations = { - stand = {x=0, y=79}, - lay = {x=162, y=166}, - walk = {x=168, y=187}, - mine = {x=189, y=198}, - walk_mine = {x=200, y=219}, - sit = {x=81, y=160}, - }, + return itemstack + end, }) --- Register Callbacks +minetest.register_tool("3d_armor:helmet_admin2", { + description = "Admin Helmet Mode 2 (speed and no jump)", + inventory_image = "3d_armor_inv_helmet_admin.png^technic_tool_mode2.png", + wield_image = "3d_armor_inv_helmet_admin.png", + groups = {armor_head=20, armor_heal=25, armor_use=0, armor_fire=1, physics_speed=0.25, armor_water=0.2}, + wear = 0, + on_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_on_player_receive_fields(function(player, formname, fields) - local name = armor:get_valid_player(player, "[on_player_receive_fields]") - if fields.armor then - local formspec = armor:get_armor_formspec(name) - armor:set_player_armor(player) - armor:update_inventory(player) - local name = player:get_player_name() - local formspec = armor:get_armor_formspec(name) - if inv_mod == "inventory_plus" then - local page = player:get_inventory_formspec() - if page:find("detached:"..name.."_armor") then - inventory_plus.set_inventory_formspec(player, formspec) - end - end - inventory_plus.set_inventory_formspec(player, formspec) - return - end - for field, _ in pairs(fields) do - if string.find(field, "skins_set") then - minetest.after(0, function(player) - local skin = armor:get_player_skin(name) - armor.textures[name].skin = skin..".png" - armor:set_player_armor(player) - end, player) - end - end -end) +minetest.register_tool("3d_armor:helmet_admin3", { + description = "Admin Helmet Mode 3 (no speed and jump)", + inventory_image = "3d_armor_inv_helmet_admin.png^technic_tool_mode3.png", + wield_image = "3d_armor_inv_helmet_admin.png", + groups = {armor_head=20, armor_heal=25, armor_use=0, armor_fire=1, physics_jump=0.25, armor_water=0.2}, + wear = 0, + on_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_on_joinplayer(function(player) - default.player_set_model(player, "3d_armor_character.b3d") - local name = player:get_player_name() - local player_inv = player:get_inventory() - local armor_inv = minetest.create_detached_inventory(name.."_armor", { - on_put = function(inv, listname, index, stack, player) - player:get_inventory():set_stack(listname, index, stack) - armor:set_player_armor(player) - armor:update_inventory(player) - end, - on_take = function(inv, listname, index, stack, player) - player:get_inventory():set_stack(listname, index, nil) - armor:set_player_armor(player) - armor:update_inventory(player) - end, - on_move = function(inv, from_list, from_index, to_list, to_index, count, player) - local plaver_inv = player:get_inventory() - local stack = inv:get_stack(to_list, to_index) - player_inv:set_stack(to_list, to_index, stack) - player_inv:set_stack(from_list, from_index, nil) - armor:set_player_armor(player) - armor:update_inventory(player) - end, - allow_put = function(inv, listname, index, stack, player) - if listname == "armor" then - if index == 1 and stack:get_definition().groups.armor_head then - return 1 - elseif index == 2 and stack:get_definition().groups.armor_torso then - return 1 - elseif index == 3 and stack:get_definition().groups.armor_legs then - return 1 - elseif index == 4 and stack:get_definition().groups.armor_feet then - return 1 - elseif index == 5 and stack:get_definition().groups.armor_shield then - return 1 - else - return 0 - end - else - return 1 - end +minetest.register_tool("3d_armor:helmet_admin4", { + description = "Admin Helmet Mode 4 (speed and jump)", + inventory_image = "3d_armor_inv_helmet_admin.png^technic_tool_mode4.png", + wield_image = "3d_armor_inv_helmet_admin.png", + groups = {armor_head=20, armor_heal=25, armor_use=0, armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2}, + wear = 0, + on_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, +}) - end, - allow_take = function(inv, listname, index, stack, player) - return stack:get_count() - end, - allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) - if listname == "armor" then - if index == 1 and stack:get_definition().groups.armor_head then - return 1 - elseif index == 2 and stack:get_definition().groups.armor_torso then - return 1 - elseif index == 3 and stack:get_definition().groups.armor_legs then - return 1 - elseif index == 4 and stack:get_definition().groups.armor_feet then - return 1 - elseif index == 5 and stack:get_definition().groups.armor_shield then - return 1 - else - return 0 - end - else - return 1 - end - end, - }) - armor_inv:set_size("armor", 5) - armor_inv:set_size("arm2", 1) - player_inv:set_size("arm", 1) - player_inv:set_size("arm2", 1) - player_inv:set_size("armor", 5) - - local stack = player_inv:get_stack("arm2", 1) - armor_inv:set_stack("arm2", 1, stack) - for i=1, 5 do - local stack = player_inv:get_stack("armor", i) - armor_inv:set_stack("armor", i, stack) - end +minetest.register_tool("3d_armor:chestplate_admin", { + description = "Admin Chestplate Mode 1 (no speed and no jump)", + inventory_image = "3d_armor_inv_chestplate_admin.png^technic_tool_mode1.png", + wield_image = "3d_armor_inv_chestplate_admin.png", + groups = {armor_torso=20, armor_heal=25, armor_use=0, armor_fire=1, armor_water=0.2}, + wear = 0, + on_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, +}) - -- Legacy support, import player's armor from old inventory format - for _,v in pairs(armor.elements) do - local list = "armor_"..v - armor_inv:add_item("armor", player_inv:get_stack(list, 1)) - player_inv:set_stack(list, 1, nil) - end - -- TODO Remove this on the next version upate +minetest.register_tool("3d_armor:chestplate_admin2", { + description = "Admin Chestplate Mode 2 (speed and no jump)", + inventory_image = "3d_armor_inv_chestplate_admin.png^technic_tool_mode2.png", + wield_image = "3d_armor_inv_chestplate_admin.png", + groups = {armor_torso=20, armor_heal=25, armor_use=0, armor_fire=1, physics_speed=0.25, armor_water=0.2}, + wear = 0, + on_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=25, armor_use=0, armor_fire=1, physics_jump=0.25, armor_water=0.2}, + wear = 0, + on_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=25, armor_use=0, armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2}, + wear = 0, + on_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=25, armor_use=0, armor_fire=1, armor_water=0.2}, + wear = 0, + on_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, +}) - armor.player_hp[name] = 0 - armor.def[name] = { - state = 0, - count = 0, - level = 0, - heal = 0, - jump = 1, - speed = 1, - gravity = 1, - fire = 0, - } - armor.textures[name] = { - skin = armor.default_skin..".png", - armor = "3d_armor_trans.png", - wielditem = "3d_armor_trans.png", - preview = armor.default_skin.."_preview.png", - } - if skin_mod == "skins" then - local skin = skins.skins[name] - if skin and skins.get_type(skin) == skins.type.MODEL then - armor.textures[name].skin = skin..".png" - end - elseif skin_mod == "simple_skins" then - local skin = skins.skins[name] - if skin then - armor.textures[name].skin = skin..".png" - end - elseif skin_mod == "u_skins" then - local skin = u_skins.u_skins[name] - if skin and u_skins.get_type(skin) == u_skins.type.MODEL then - armor.textures[name].skin = skin..".png" - end - elseif skin_mod == "wardrobe" then - local skin = wardrobe.playerSkins[name] - if skin then - armor.textures[name].skin = skin - end - end - if minetest.get_modpath("player_textures") then - local filename = minetest.get_modpath("player_textures").."/textures/player_"..name - local f = io.open(filename..".png") - if f then - f:close() - armor.textures[name].skin = "player_"..name..".png" - end - end - for i=1, ARMOR_INIT_TIMES do - minetest.after(ARMOR_INIT_DELAY * i, function(player) - armor:set_player_armor(player) - if not inv_mod then - armor:update_inventory(player) - end - end, player) - end -end) +minetest.register_tool("3d_armor:leggings_admin2", { + description = "Admin Leggings Mode 2 (speed and no jump)", + wield_image = "3d_armor_inv_leggings_admin.png", + inventory_image = "3d_armor_inv_leggings_admin.png^technic_tool_mode2.png", + groups = {armor_legs=20, armor_heal=25, armor_use=0, armor_fire=1, physics_speed=0.25, armor_water=0.2}, + wear = 0, + on_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, +}) -if ARMOR_DROP == true or ARMOR_DESTROY == true then - armor.drop_armor = function(pos, stack) - local obj = minetest.add_item(pos, stack) - if obj then - local x = math.random(1, 5) - if math.random(1,2) == 1 then - x = -x - end - local z = math.random(1, 5) - if math.random(1,2) == 1 then - z = -z - end - obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z}) - end - end - minetest.register_on_dieplayer(function(player) - local name, player_inv, armor_inv, pos = armor:get_valid_player(player, "[on_dieplayer]") - if not name then - return - end - local drop = {} - for i=1, player_inv:get_size("armor") do - local stack = armor_inv:get_stack("armor", i) - if stack:get_count() > 0 then - table.insert(drop, stack) - armor_inv:set_stack("armor", i, nil) - player_inv:set_stack("armor", i, nil) - end - end - armor:set_player_armor(player) - if inv_mod == "unified_inventory" then - unified_inventory.set_inventory_formspec(player, "craft") - elseif inv_mod == "inventory_plus" then - local formspec = inventory_plus.get_formspec(player,"main") - inventory_plus.set_inventory_formspec(player, formspec) - else - armor:update_inventory(player) - end - if ARMOR_DESTROY == false then - minetest.after(ARMOR_BONES_DELAY, function() - pos = vector.round(pos) - local node = minetest.get_node(pos) - if node then - if node.name == "bones:bones" then - local meta = minetest.get_meta(pos) - local owner = meta:get_string("owner") - local inv = meta:get_inventory() - for _,stack in ipairs(drop) do - if name == owner and inv:room_for_item("main", stack) then - inv:add_item("main", stack) - else - armor.drop_armor(pos, stack) - end - end - end - else - for _,stack in ipairs(drop) do - armor.drop_armor(pos, stack) - end - end - end) - end - end) -end +minetest.register_tool("3d_armor:leggings_admin3", { + description = "Admin Leggings Mode 3 (no speed and jump)", + wield_image = "3d_armor_inv_leggings_admin.png", + inventory_image = "3d_armor_inv_leggings_admin.png^technic_tool_mode3.png", + groups = {armor_legs=20, armor_heal=25, armor_use=0, armor_fire=1, physics_jump=0.25, armor_water=0.2}, + wear = 0, + on_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_globalstep(function(dtime) - time = time + dtime - if time > ARMOR_UPDATE_TIME then - for _,player in ipairs(minetest.get_connected_players()) do - armor:update_armor(player, time) - end - time = 0 - end -end) +minetest.register_tool("3d_armor:leggings_admin4", { + description = "Admin Leggings Mode 4 (speed and jump)", + inventory_image = "3d_armor_inv_leggings_admin.png^technic_tool_mode4.png", + wield_image = "3d_armor_inv_leggings_admin.png", + groups = {armor_legs=20, armor_heal=25, armor_use=0, armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2}, + wear = 0, + on_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=25, armor_use=0, armor_fire=1, armor_water=0.2}, + wear = 0, + on_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", { + description = "Admin Boots Mode 2 (speed and no jump)", + inventory_image = "3d_armor_inv_boots_admin.png^technic_tool_mode2.png", + wield_image = "3d_armor_inv_boots_admin.png", + groups = {armor_feet=20, armor_heal=25, armor_use=0, armor_fire=1, physics_speed=0.25, armor_water=0.2}, + wear = 0, + on_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", { + description = "Admin Boots Mode 3 (no speed and jump)", + inventory_image = "3d_armor_inv_boots_admin.png^technic_tool_mode3.png", + wield_image = "3d_armor_inv_boots_admin.png", + groups = {armor_feet=20, armor_heal=25, armor_use=0, armor_fire=1, physics_jump=0.25, armor_water=0.2}, + wear = 0, + on_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", { + description = "Admin Boots Mode 4 (speed and jump)", + inventory_image = "3d_armor_inv_boots_admin.png^technic_tool_mode4.png", + wield_image = "3d_armor_inv_boots_admin.png", + groups = {armor_feet=20, armor_heal=25, armor_use=0, armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2}, + wear = 0, + on_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/depends.txt b/mods/3d_armor/3d_armor/depends.txt index 525e69c..a33755d 100644 --- a/mods/3d_armor/3d_armor/depends.txt +++ b/mods/3d_armor/3d_armor/depends.txt @@ -1,4 +1,8 @@ default -inventory_plus? -unified_inventory? - +player_monoids? +armor_monoid? +pova? +fire? +ethereal? +bakedclay? +intllib? diff --git a/mods/3d_armor/3d_armor/description.txt b/mods/3d_armor/3d_armor/description.txt new file mode 100644 index 0000000..b0a9b0a --- /dev/null +++ b/mods/3d_armor/3d_armor/description.txt @@ -0,0 +1 @@ +Adds craftable armor that is visible to other players. diff --git a/mods/3d_armor/3d_armor/init.lua b/mods/3d_armor/3d_armor/init.lua index bf8737d..ffdb9a0 100644 --- a/mods/3d_armor/3d_armor/init.lua +++ b/mods/3d_armor/3d_armor/init.lua @@ -1,219 +1,502 @@ +-- support for i18n +armor_i18n = { } +local MP = minetest.get_modpath(minetest.get_current_modname()) +armor_i18n.gettext, armor_i18n.ngettext = dofile(MP.."/intllib.lua") +-- escaping formspec +armor_i18n.fgettext = function(...) return minetest.formspec_escape(armor_i18n.gettext(...)) end +-- local functions +local S = armor_i18n.gettext +local F = armor_i18n.fgettext + +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) +local worldpath = minetest.get_worldpath() +local last_punch_time = {} +local pending_players = {} +local timer = 0 + +dofile(modpath.."/api.lua") ARMOR_MOD_NAME = minetest.get_current_modname() dofile(minetest.get_modpath(ARMOR_MOD_NAME).."/armor.lua") -dofile(minetest.get_modpath(ARMOR_MOD_NAME).."/admin.lua") + dofile(minetest.get_modpath(ARMOR_MOD_NAME).."/tutorial.lua") dofile(minetest.get_modpath(ARMOR_MOD_NAME).."/tutorial_craft.lua") -if ARMOR_MATERIALS.wood then - minetest.register_tool("3d_armor:helmet_wood", { - description = "Wood Helmet", - inventory_image = "3d_armor_inv_helmet_wood.png", - groups = {armor_head=5, armor_heal=0, armor_use=2000}, - wear = 0, - }) - minetest.register_tool("3d_armor:chestplate_wood", { - description = "Wood Chestplate", - inventory_image = "3d_armor_inv_chestplate_wood.png", - groups = {armor_torso=10, armor_heal=0, armor_use=2000}, - wear = 0, - }) - minetest.register_tool("3d_armor:leggings_wood", { - description = "Wood Leggings", - inventory_image = "3d_armor_inv_leggings_wood.png", - groups = {armor_legs=5, armor_heal=0, armor_use=2000}, - wear = 0, - }) - minetest.register_tool("3d_armor:boots_wood", { - description = "Wood Boots", - inventory_image = "3d_armor_inv_boots_wood.png", - groups = {armor_feet=5, armor_heal=0, armor_use=2000}, - wear = 0, - }) + +-- Legacy Config Support + +local input = io.open(modpath.."/armor.conf", "r") +if input then + dofile(modpath.."/armor.conf") + input:close() + input = nil +end +input = io.open(worldpath.."/armor.conf", "r") +if input then + dofile(worldpath.."/armor.conf") + input:close() + input = nil +end +for name, _ in pairs(armor.config) do + local global = "ARMOR_"..name:upper() + if minetest.global_exists(global) then + armor.config[name] = _G[global] + end +end +if minetest.global_exists("ARMOR_MATERIALS") then + armor.materials = table.copy(ARMOR_MATERIALS) +end +if minetest.global_exists("ARMOR_FIRE_NODES") then + armor.fire_nodes = table.copy(ARMOR_FIRE_NODES) end -if ARMOR_MATERIALS.cactus then - minetest.register_tool("3d_armor:helmet_cactus", { - description = "Cactuc Helmet", - inventory_image = "3d_armor_inv_helmet_cactus.png", - groups = {armor_head=7, armor_heal=1, armor_use=200}, - wear = 0, - }) - minetest.register_tool("3d_armor:chestplate_cactus", { - description = "Cactus Chestplate", - inventory_image = "3d_armor_inv_chestplate_cactus.png", - groups = {armor_torso=15, armor_heal=2, armor_use=200}, - wear = 0, - }) - minetest.register_tool("3d_armor:leggings_cactus", { - description = "Cactus Leggings", - inventory_image = "3d_armor_inv_leggings_cactus.png", - groups = {armor_legs=7, armor_heal=1, armor_use=200}, - wear = 0, - }) - minetest.register_tool("3d_armor:boots_cactus", { - description = "Cactus Boots", - inventory_image = "3d_armor_inv_boots_cactus.png", - groups = {armor_feet=7, armor_heal=1, armor_use=200}, - wear = 0, - }) +-- Load Configuration + +for name, config in pairs(armor.config) do + local setting = minetest.settings:get("armor_"..name) + if type(config) == "number" then + setting = tonumber(setting) + elseif type(config) == "boolean" then + setting = minetest.settings:get_bool("armor_"..name) + end + if setting ~= nil then + armor.config[name] = setting + end +end +for material, _ in pairs(armor.materials) do + local key = "material_"..material + if armor.config[key] == false then + armor.materials[material] = nil + end end -if ARMOR_MATERIALS.steel then - minetest.register_tool("3d_armor:helmet_steel", { - description = "Steel Helmet", - inventory_image = "3d_armor_inv_helmet_steel.png", - groups = {armor_head=10, armor_heal=2, armor_use=100}, - wear = 0, - }) - minetest.register_tool("3d_armor:chestplate_steel", { - description = "Steel Chestplate", - inventory_image = "3d_armor_inv_chestplate_steel.png", - groups = {armor_torso=20, armor_heal=4, armor_use=100}, - wear = 0, - }) - minetest.register_tool("3d_armor:leggings_steel", { - description = "Steel Leggings", - inventory_image = "3d_armor_inv_leggings_steel.png", - groups = {armor_legs=10, armor_heal=2, armor_use=100}, - wear = 0, - }) - minetest.register_tool("3d_armor:boots_steel", { - description = "Steel Boots", - inventory_image = "3d_armor_inv_boots_steel.png", - groups = {armor_feet=10, armor_heal=2, armor_use=100}, - wear = 0, - }) +-- Mod Compatibility + +--[[if minetest.get_modpath("technic") then + armor.formspec = armor.formspec.. + "label[5,2.5;"..F("Radiation")..": armor_group_radiation]" + armor:register_armor_group("radiation") +end--]] +local skin_mods = {"skins", "u_skins", "simple_skins", "wardrobe"} +for _, mod in pairs(skin_mods) do + local path = minetest.get_modpath(mod) + if path then + local dir_list = minetest.get_dir_list(path.."/textures") + for _, fn in pairs(dir_list) do + if fn:find("_preview.png$") then + armor:add_preview(fn) + end + end + armor.skin_mod = mod + end +end +if not minetest.get_modpath("moreores") then + armor.materials.mithril = nil +end +if not minetest.get_modpath("ethereal") then + armor.materials.crystal = nil end -if ARMOR_MATERIALS.bronze then - minetest.register_tool("3d_armor:helmet_bronze", { - description = "Bronze Helmet", - inventory_image = "3d_armor_inv_helmet_bronze.png", - groups = {armor_head=20, armor_heal=4, armor_use=75}, - wear = 0, - }) - minetest.register_tool("3d_armor:chestplate_bronze", { - description = "Bronze Chestplate", - inventory_image = "3d_armor_inv_chestplate_bronze.png", - groups = {armor_torso=40, armor_heal=8, armor_use=75}, - wear = 0, - }) - minetest.register_tool("3d_armor:leggings_bronze", { - description = "Bronze Leggings", - inventory_image = "3d_armor_inv_leggings_bronze.png", - groups = {armor_legs=20, armor_heal=4, armor_use=75}, - wear = 0, - }) - minetest.register_tool("3d_armor:boots_bronze", { - description = "Bronze Boots", - inventory_image = "3d_armor_inv_boots_bronze.png", - groups = {armor_feet=20, armor_heal=4, armor_use=75}, - wear = 0, - }) +dofile(modpath.."/armor.lua") + +-- Armor Initialization + +armor.formspec = armor.formspec.. + "label[4.5,1.5;"..F("Level")..": armor_level]".. + "label[4.5,2;"..F("Heal")..": armor_attr_heal]".. + "label[4.5,2.5;"..F("Fire")..": armor_attr_fire]".. + "label[4.5,3;"..F("Water")..": armor_attr_water]".. + "label[4.5,3.5;"..F("Speed")..": armor_physics_speed]".. + "label[4.5,4;"..F("Jump")..": armor_physics_jump]" + +armor:register_on_destroy(function(player, index, stack) + local name = player:get_player_name() + local def = stack:get_definition() + if name and def and def.description then + minetest.chat_send_player(name, S("Your @1 got destroyed!", def.description)) + end +end) + +local function validate_armor_inventory(player) + -- Workaround for detached inventory swap exploit + local _, inv = armor:get_valid_player(player, "[validate_armor_inventory]") + if not inv then + return + end + local armor_prev = {} + local armor_list_string = player:get_attribute("3d_armor_inventory") + if armor_list_string then + local armor_list = armor:deserialize_inventory_list(armor_list_string) + for i, stack in ipairs(armor_list) do + if stack:get_count() > 0 then + armor_prev[stack:get_name()] = i + end + end + end + local elements = {} + local player_inv = player:get_inventory() + for i = 1, 6 do + local stack = inv:get_stack("armor", i) + if stack:get_count() > 0 then + local item = stack:get_name() + local element = armor:get_element(item) + if element and not elements[element] then + if armor_prev[item] then + armor_prev[item] = nil + else + -- Item was not in previous inventory + armor:run_callbacks("on_equip", player, i, stack) + end + elements[element] = true; + else + inv:remove_item("armor", stack) + -- The following code returns invalid items to the player's main + -- inventory but could open up the possibity for a hacked client + -- to receive items back they never really had. I am not certain + -- so remove the is_singleplayer check at your own risk :] + if minetest.is_singleplayer() and player_inv and + player_inv:room_for_item("main", stack) then + player_inv:add_item("main", stack) + end + end + end + end + for item, i in pairs(armor_prev) do + local stack = ItemStack(item) + -- Previous item is not in current inventory + armor:run_callbacks("on_unequip", player, i, stack) + end +end +armor.init_player_armor = function(player) + local name = player:get_player_name() + local pos = player:getpos() + if not name or not pos then + return false + end + local armor_inv = minetest.create_detached_inventory(name.."_armor", { + on_put = function(inv, listname, index, stack, player) + validate_armor_inventory(player) + armor:save_armor_inventory(player) + armor:set_player_armor(player) + local player_inv = player:get_inventory() + local stack = inv:get_stack("arm2", 1) + player_inv:set_stack("arm2", 1, stack) + for i=1, 6 do + local stack = inv:get_stack("armor", i) + player_inv:set_stack("armor", i, stack) + end + end, + on_take = function(inv, listname, index, stack, player) + validate_armor_inventory(player) + armor:save_armor_inventory(player) + armor:set_player_armor(player) + local player_inv = player:get_inventory() + local stack = inv:get_stack("arm2", 1) + player_inv:set_stack("arm2", 1, stack) + for i=1, 6 do + local stack = inv:get_stack("armor", i) + player_inv:set_stack("armor", i, stack) + end + end, + on_move = function(inv, from_list, from_index, to_list, to_index, count, player) + validate_armor_inventory(player) + armor:save_armor_inventory(player) + armor:set_player_armor(player) + end, + allow_put = function(inv, listname, index, put_stack, player) + if listname == "armor" then + if index == 1 and put_stack:get_definition().groups.armor_head then + return 1 + elseif index == 2 and put_stack:get_definition().groups.armor_torso then + return 1 + elseif index == 3 and put_stack:get_definition().groups.armor_legs then + return 1 + elseif index == 4 and put_stack:get_definition().groups.armor_feet then + return 1 + elseif index == 5 and put_stack:get_definition().groups.armor_shield then + return 1 + else + return 0 + end + else + return 1 + end + end, + allow_take = function(inv, listname, index, stack, player) + return stack:get_count() + end, + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + return 0 + end, + }, name) + local player_inv = player:get_inventory() + armor_inv:set_size("armor", 6) + armor_inv:set_size("arm2", 1) + player_inv:set_size("arm", 1) + player_inv:set_size("arm2", 1) + local stack = player_inv:get_stack("arm2", 1) + armor_inv:set_stack("arm2", 1, stack) + + + local player_inv = player:get_inventory() + player_inv:set_size("armor", 6) + for i=1, 6 do + local stack = player_inv:get_stack("armor", i) + armor_inv:set_stack("armor", i, stack) + end + + + for i=1, 6 do + local stack = armor_inv:get_stack("armor", i) + if stack:get_count() > 0 then + armor:run_callbacks("on_equip", player, i, stack) + end + end + armor.def[name] = { + init_time = minetest.get_gametime(), + level = 0, + state = 0, + count = 0, + groups = {}, + } + for _, phys in pairs(armor.physics) do + armor.def[name][phys] = 1 + end + for _, attr in pairs(armor.attributes) do + armor.def[name][attr] = 0 + end + for group, _ in pairs(armor.registered_groups) do + armor.def[name].groups[group] = 0 + end + local skin = armor:get_player_skin(name) + armor.textures[name] = { + skin = skin, + armor = "3d_armor_trans.png", + wielditem = "3d_armor_trans.png", + preview = armor.default_skin.."_preview.png", + } + local texture_path = minetest.get_modpath("player_textures") + if texture_path then + local dir_list = minetest.get_dir_list(texture_path.."/textures") + for _, fn in pairs(dir_list) do + if fn == "player_"..name..".png" then + armor.textures[name].skin = fn + break + end + end + end + armor:set_player_armor(player) + return true end -if ARMOR_MATERIALS.diamond then - minetest.register_tool("3d_armor:helmet_diamond", { - description = "Diamond Helmet", - inventory_image = "3d_armor_inv_helmet_diamond.png", - groups = {armor_head=15, armor_heal=1, armor_use=200}, - wear = 0, - }) - minetest.register_tool("3d_armor:chestplate_diamond", { - description = "Diamond Chestplate", - inventory_image = "3d_armor_inv_chestplate_diamond.png", - groups = {armor_torso=30, armor_heal=2, armor_use=200}, - wear = 0, - }) - minetest.register_tool("3d_armor:leggings_diamond", { - description = "Diamond Leggings", - inventory_image = "3d_armor_inv_leggings_diamond.png", - groups = {armor_legs=15, armor_heal=1, armor_use=200}, - wear = 0, - }) - minetest.register_tool("3d_armor:boots_diamond", { - description = "Diamond Boots", - inventory_image = "3d_armor_inv_boots_diamond.png", - groups = {armor_feet=15, armor_heal=1, armor_use=200}, - wear = 0, - }) +-- Armor Player Model + +default.player_register_model("3d_armor_character.b3d", { + animation_speed = 30, + textures = { + armor.default_skin..".png", + "3d_armor_trans.png", + "3d_armor_trans.png", + }, + animations = { + stand = {x=0, y=79}, + lay = {x=162, y=166}, + walk = {x=168, y=187}, + mine = {x=189, y=198}, + walk_mine = {x=200, y=219}, + sit = {x=81, y=160}, + }, +}) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = armor:get_valid_player(player, "[on_player_receive_fields]") + if not name then + return + end + for field, _ in pairs(fields) do + if string.find(field, "skins_set") then + minetest.after(0, function(player) + local skin = armor:get_player_skin(name) + armor.textures[name].skin = skin + armor:set_player_armor(player) + end, player) + end + end +end) + +minetest.register_on_joinplayer(function(player) + default.player_set_model(player, "3d_armor_character.b3d") + minetest.after(0, function(player) + if armor.init_player_armor(player) == false then + pending_players[player] = 0 + end + end, player) +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + if name then + armor.def[name] = nil + armor.textures[name] = nil + end + pending_players[player] = nil +end) + +if armor.config.drop == true or armor.config.destroy == true then + minetest.register_on_dieplayer(function(player) + local name, armor_inv = armor:get_valid_player(player, "[on_dieplayer]") + if not name then + return + end + local drop = {} + for i=1, armor_inv:get_size("armor") do + local stack = armor_inv:get_stack("armor", i) + if stack:get_count() > 0 then + table.insert(drop, stack) + armor:run_callbacks("on_unequip", player, i, stack) + armor_inv:set_stack("armor", i, nil) + end + end + armor:save_armor_inventory(player) + armor:set_player_armor(player) + local pos = player:getpos() + if pos and armor.config.destroy == false then + minetest.after(armor.config.bones_delay, function() + local meta = nil + local maxp = vector.add(pos, 8) + local minp = vector.subtract(pos, 8) + local bones = minetest.find_nodes_in_area(minp, maxp, {"bones:bones"}) + for _, p in pairs(bones) do + local m = minetest.get_meta(p) + if m:get_string("owner") == name then + meta = m + break + end + end + if meta then + local inv = meta:get_inventory() + for _,stack in ipairs(drop) do + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + else + armor.drop_armor(pos, stack) + end + end + else + for _,stack in ipairs(drop) do + armor.drop_armor(pos, stack) + end + end + end) + end + end) end -if ARMOR_MATERIALS.gold then - minetest.register_tool("3d_armor:helmet_gold", { - description = "Gold Helmet", - inventory_image = "3d_armor_inv_helmet_gold.png", - groups = {armor_head=20, armor_heal=4, armor_use=50}, - wear = 0, - }) - minetest.register_tool("3d_armor:chestplate_gold", { - description = "Gold Chestplate", - inventory_image = "3d_armor_inv_chestplate_gold.png", - groups = {armor_torso=40, armor_heal=8, armor_use=50}, - wear = 0, - }) - minetest.register_tool("3d_armor:leggings_gold", { - description = "Gold Leggings", - inventory_image = "3d_armor_inv_leggings_gold.png", - groups = {armor_legs=20, armor_heal=4, armor_use=50}, - wear = 0, - }) - minetest.register_tool("3d_armor:boots_gold", { - description = "Gold Boots", - inventory_image = "3d_armor_inv_boots_gold.png", - groups = {armor_feet=20, armor_heal=4, armor_use=50}, - wear = 0, - }) +if armor.config.punch_damage == true then + minetest.register_on_punchplayer(function(player, hitter, + time_from_last_punch, tool_capabilities) + local name = player:get_player_name() + if name then + armor:punch(player, hitter, time_from_last_punch, tool_capabilities) + last_punch_time[name] = minetest.get_gametime() + end + end) end -if ARMOR_MATERIALS.mithril then - minetest.register_tool("3d_armor:helmet_mithril", { - description = "Mithril Helmet", - inventory_image = "3d_armor_inv_helmet_mithril.png", - groups = {armor_head=40, armor_heal=8, armor_use=25}, - wear = 0, - }) - minetest.register_tool("3d_armor:chestplate_mithril", { - description = "Mithril Chestplate", - inventory_image = "3d_armor_inv_chestplate_mithril.png", - groups = {armor_torso=80, armor_heal=16, armor_use=25}, - wear = 0, - }) - minetest.register_tool("3d_armor:leggings_mithril", { - description = "Mithril Leggings", - inventory_image = "3d_armor_inv_leggings_mithril.png", - groups = {armor_legs=40, armor_heal=8, armor_use=25}, - wear = 0, - }) - minetest.register_tool("3d_armor:boots_mithril", { - description = "Mithril Boots", - inventory_image = "3d_armor_inv_boots_mithril.png", - groups = {armor_feet=40, armor_heal=8, armor_use=25}, - wear = 0, - }) +minetest.register_on_player_hpchange(function(player, hp_change) + if player and hp_change < 0 then + local name = player:get_player_name() + if name then + local heal = armor.def[name].heal + if heal >= math.random(100) then + hp_change = 0 + end + -- check if armor damage was handled by fire or on_punchplayer + local time = last_punch_time[name] or 0 + if time == 0 or time + 1 < minetest.get_gametime() then + armor:punch(player) + end + end + end + return hp_change +end, true) + +minetest.register_globalstep(function(dtime) + timer = timer + dtime + if timer > armor.config.init_delay then + local players = minetest.get_connected_players() + for player, count in pairs(pending_players) do + local remove = armor.init_player_armor(player) == true + pending_players[player] = count + 1 + if remove == false and count > armor.config.init_times then + minetest.log("warning", S("3d_armor: Failed to initialize player")) + remove = true + end + if remove == true then + pending_players[player] = nil + end + end + timer = 0 + end +end) + +-- Fire Protection and water breating, added by TenPlus1 + +if armor.config.fire_protect == true then + -- override hot nodes so they do not hurt player anywhere but mod + for _, row in pairs(armor.fire_nodes) do + if minetest.registered_nodes[row[1]] then + minetest.override_item(row[1], {damage_per_second = 0}) + end + end +else + print (S("[3d_armor] Fire Nodes disabled")) end - - minetest.register_tool("3d_armor:helmet_crystal", { - description = "Crystal Helmet", - inventory_image = "3d_armor_inv_helmet_crystal.png", - groups = {armor_head=100, armor_heal=50, armor_use=0, armor_fire=10}, - wear = 0, - }) - minetest.register_tool("3d_armor:chestplate_crystal", { - description = "Crystal Chestplate", - inventory_image = "3d_armor_inv_chestplate_crystal.png", - groups = {armor_torso=200, armor_heal=100, armor_use=0, armor_fire=10}, - wear = 0, - }) - minetest.register_tool("3d_armor:leggings_crystal", { - description = "Crystal Leggings", - inventory_image = "3d_armor_inv_leggings_crystal.png", - groups = {armor_legs=100, armor_heal=50, armor_use=0, armor_fire=10}, - wear = 0, - }) - minetest.register_tool("3d_armor:boots_crystal", { - description = "Crystal Boots", - inventory_image = "3d_armor_inv_boots_crystal.png", - groups = {armor_feet=100, armor_heal=50, armor_use=0, physics_speed=1,armor_fire=10,physics_jump=0.5}, - wear = 0, - }) \ No newline at end of file +if armor.config.water_protect == true or armor.config.fire_protect == true then + minetest.register_globalstep(function(dtime) + armor.timer = armor.timer + dtime + if armor.timer < armor.config.update_time then + return + end + for _,player in pairs(minetest.get_connected_players()) do + local name = player:get_player_name() + local pos = player:getpos() + local hp = player:get_hp() + if not name or not pos or not hp then + return + end + -- water breathing + if armor.config.water_protect == true then + if armor.def[name].water >= 1 and + player:get_breath() < 10 then + player:set_breath(10) + end + end + -- fire protection + if armor.config.fire_protect == true then + local fire_damage = true + pos.y = pos.y + 1.4 -- head level + local node_head = minetest.get_node(pos).name + pos.y = pos.y - 1.2 -- feet level + local node_feet = minetest.get_node(pos).name + -- is player inside a hot node? + for _, row in pairs(armor.fire_nodes) do + -- check fire protection, if not enough then get hurt + if row[1] == node_head or row[1] == node_feet then + if fire_damage == true then + armor:punch(player, "fire") + last_punch_time[name] = minetest.get_gametime() + fire_damage = false + end + if hp > 0 and armor.def[name].fire < row[2] then + hp = hp - row[3] * armor.config.update_time + player:set_hp(hp) + break + end + end + end + end + end + armor.timer = 0 + end) +end diff --git a/mods/3d_armor/3d_armor/intllib.lua b/mods/3d_armor/3d_armor/intllib.lua new file mode 100644 index 0000000..6669d72 --- /dev/null +++ b/mods/3d_armor/3d_armor/intllib.lua @@ -0,0 +1,45 @@ + +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext diff --git a/mods/3d_armor/3d_armor/locale/fr.po b/mods/3d_armor/3d_armor/locale/fr.po new file mode 100644 index 0000000..013e961 --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/fr.po @@ -0,0 +1,384 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-06 18:20+0200\n" +"PO-Revision-Date: 2017-08-06 18:20+0200\n" +"Last-Translator: fat115 \n" +"Language-Team: \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.12\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: ../3d_armor/api.lua +msgid "3d_armor: Player name is nil @1" +msgstr "3d_armor : Nom du joueur non trouvé @1" + +#: ../3d_armor/api.lua +msgid "3d_armor: Player inventory is nil @1" +msgstr "3d_armor : Inventaire du joueur non trouvé @1" + +#: ../3d_armor/api.lua +msgid "3d_armor: Detached armor inventory is nil @1" +msgstr "3d_armor : Inventaire détaché pour l'armure non trouvé @1" + +#: ../3d_armor/api.lua +msgid "3d_armor: Player reference is nil @1" +msgstr "3d_armor : Référence au joueur non trouvée @1" + +#: ../3d_armor/armor.lua +msgid "Admin Helmet" +msgstr "Casque d'admin" + +#: ../3d_armor/armor.lua +msgid "Admin Chestplate" +msgstr "Cuirasse d'admin" + +#: ../3d_armor/armor.lua +msgid "Admin Leggings" +msgstr "Jambières d'admin" + +#: ../3d_armor/armor.lua +msgid "Admin Boots" +msgstr "Bottes d'admin" + +#: ../3d_armor/armor.lua +msgid "Wood Helmet" +msgstr "Casque en bois" + +#: ../3d_armor/armor.lua +msgid "Wood Chestplate" +msgstr "Cuirasse en bois" + +#: ../3d_armor/armor.lua +msgid "Wood Leggings" +msgstr "Jambières en bois" + +#: ../3d_armor/armor.lua +msgid "Wood Boots" +msgstr "Bottes en bois" + +#: ../3d_armor/armor.lua +msgid "Cactus Helmet" +msgstr "Casque en cactus" + +#: ../3d_armor/armor.lua +msgid "Cactus Chestplate" +msgstr "Cuirasse en cactus" + +#: ../3d_armor/armor.lua +msgid "Cactus Leggings" +msgstr "Jambières en cactus" + +#: ../3d_armor/armor.lua +msgid "Cactus Boots" +msgstr "Bottes en cactus" + +#: ../3d_armor/armor.lua +msgid "Steel Helmet" +msgstr "Casque en acier" + +#: ../3d_armor/armor.lua +msgid "Steel Chestplate" +msgstr " = Cuirasse en acier" + +#: ../3d_armor/armor.lua +msgid "Steel Leggings" +msgstr "Jambières en acier" + +#: ../3d_armor/armor.lua +msgid "Steel Boots" +msgstr "Bottes en acier" + +#: ../3d_armor/armor.lua +msgid "Bronze Helmet" +msgstr "Casque en bronze" + +#: ../3d_armor/armor.lua +msgid "Bronze Chestplate" +msgstr "Cuirasse en bronze" + +#: ../3d_armor/armor.lua +msgid "Bronze Leggings" +msgstr "Jambières en bronze" + +#: ../3d_armor/armor.lua +msgid "Bronze Boots" +msgstr "Bottes en bronze" + +#: ../3d_armor/armor.lua +msgid "Diamond Helmet" +msgstr "Casque en diamant" + +#: ../3d_armor/armor.lua +msgid "Diamond Chestplate" +msgstr "Cuirasse en diamant" + +#: ../3d_armor/armor.lua +msgid "Diamond Leggings" +msgstr "Jambières en diamant" + +#: ../3d_armor/armor.lua +msgid "Diamond Boots" +msgstr "Bottes en diamant" + +#: ../3d_armor/armor.lua +msgid "Gold Helmet" +msgstr "Casque en or" + +#: ../3d_armor/armor.lua +msgid "Gold Chestplate" +msgstr "Cuirasse en or" + +#: ../3d_armor/armor.lua +msgid "Gold Leggings" +msgstr "Jambières en or" + +#: ../3d_armor/armor.lua +msgid "Gold Boots" +msgstr "Bottes en or" + +#: ../3d_armor/armor.lua +msgid "Mithril Helmet" +msgstr "Casque en mithril" + +#: ../3d_armor/armor.lua +msgid "Mithril Chestplate" +msgstr "Cuirasse en mithril" + +#: ../3d_armor/armor.lua +msgid "Mithril Leggings" +msgstr "Jambières en mithril" + +#: ../3d_armor/armor.lua +msgid "Mithril Boots" +msgstr "Bottes en mithril" + +#: ../3d_armor/armor.lua +msgid "Crystal Helmet" +msgstr "Casque en cristal" + +#: ../3d_armor/armor.lua +msgid "Crystal Chestplate" +msgstr "Cuirasse en cristal" + +#: ../3d_armor/armor.lua +msgid "Crystal Leggings" +msgstr "Jambières en cristal" + +#: ../3d_armor/armor.lua +msgid "Crystal Boots" +msgstr "Bottes en cristal" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Radiation" +msgstr "Radiation" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Level" +msgstr "Niveau" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Heal" +msgstr "Soins" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Fire" +msgstr "Fire" + +#: ../3d_armor/init.lua +msgid "Your @1 got destroyed!" +msgstr "Une partie de votre armure a été détruite : @1 !" + +#: ../3d_armor/init.lua +msgid "3d_armor: Failed to initialize player" +msgstr "3d_armor : Impossible d'initialiser le joueur" + +#: ../3d_armor/init.lua +msgid "[3d_armor] Fire Nodes disabled" +msgstr "[3d_armor] Noeuds de type feu désactivés" + +#: ../3d_armor_ip/init.lua +msgid "3d_armor_ip: Mod loaded but unused." +msgstr "3d_armor_ip : Mod chargé mais inutilisé." + +#: ../3d_armor_ip/init.lua +msgid "Back" +msgstr "Retour" + +#: ../3d_armor_ip/init.lua ../3d_armor_sfinv/init.lua ../3d_armor_ui/init.lua +msgid "Armor" +msgstr "Armure" + +#: ../3d_armor_sfinv/init.lua +msgid "3d_armor_sfinv: Mod loaded but unused." +msgstr "3d_armor_sfinv : Mod chargé mais inutilisé." + +#: ../3d_armor_stand/init.lua +msgid "Armor stand top" +msgstr "Haut de support d'armure" + +#: ../3d_armor_stand/init.lua +msgid "Armor stand" +msgstr "Support d'armure" + +#: ../3d_armor_stand/init.lua +msgid "Armor Stand" +msgstr "Support d'armure" + +#: ../3d_armor_stand/init.lua +msgid "Locked Armor stand" +msgstr "Support d'armure verrouillé" + +#: ../3d_armor_stand/init.lua +msgid "Armor Stand (owned by @1)" +msgstr "Support d'armure (propriété de @1)" + +#: ../3d_armor_ui/init.lua +msgid "3d_armor_ui: Mod loaded but unused." +msgstr "3d_armor_ui : Mod chargé mais inutilisé." + +#: ../3d_armor_ui/init.lua +msgid "3d Armor" +msgstr "Armure 3d" + +#: ../3d_armor_ui/init.lua +msgid "Armor not initialized!" +msgstr "Armure non initialisée !" + +#: ../hazmat_suit/init.lua +msgid "hazmat_suit: Mod loaded but unused." +msgstr "hazmat_suit : Mod chargé mais non utilisé." + +#: ../hazmat_suit/init.lua +msgid "Hazmat Helmet" +msgstr "Casque 'Hazmat'" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Chestplate" +msgstr "Cuirasse 'Hazmat'" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Sleeve" +msgstr "Manches 'Hazmat'" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Leggins" +msgstr "Jambières 'Hazmat'" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Boots" +msgstr "Bottes 'Hazmat'" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Suit" +msgstr "Combinaison 'Hazmat'" + +#: ../shields/init.lua +msgid "Admin Shield" +msgstr "Bouclier d'admin" + +#: ../shields/init.lua +msgid "Wooden Shield" +msgstr "Bouclier en bois" + +#: ../shields/init.lua +msgid "Enhanced Wood Shield" +msgstr "Bouclier en bois amélioré" + +#: ../shields/init.lua +msgid "Cactus Shield" +msgstr "Bouclier en cactus" + +#: ../shields/init.lua +msgid "Enhanced Cactus Shield" +msgstr "Bouclier en cactus amélioré" + +#: ../shields/init.lua +msgid "Steel Shield" +msgstr "Bouclier en acier" + +#: ../shields/init.lua +msgid "Bronze Shield" +msgstr "Bouclier en bronze" + +#: ../shields/init.lua +msgid "Diamond Shield" +msgstr "Bouclier en diamant" + +#: ../shields/init.lua +msgid "Gold Shield" +msgstr "Bouclier en or" + +#: ../shields/init.lua +msgid "Mithril Shield" +msgstr "Bouclier en mithril" + +#: ../shields/init.lua +msgid "Crystal Shield" +msgstr "Bouclier en cristal" + +#: ../technic_armor/init.lua +msgid "technic_armor: Mod loaded but unused." +msgstr "technic_armor : Mod chargé mais non utilisé." + +#: ../technic_armor/init.lua +msgid "Lead" +msgstr "plomb" + +#: ../technic_armor/init.lua +msgid "Brass" +msgstr "laiton" + +#: ../technic_armor/init.lua +msgid "Cast Iron" +msgstr "fonte" + +#: ../technic_armor/init.lua +msgid "Carbon Steel" +msgstr "acier au carbone" + +#: ../technic_armor/init.lua +msgid "Stainless Steel" +msgstr "acier inoxydable" + +#: ../technic_armor/init.lua +msgid "Tin" +msgstr "étain" + +#: ../technic_armor/init.lua +msgid "Silver" +msgstr "argent" + +#: ../technic_armor/init.lua +msgid "Helmet" +msgstr "Casque" + +#: ../technic_armor/init.lua +msgid "Chestplate" +msgstr "Cuirasse" + +#: ../technic_armor/init.lua +msgid "Leggings" +msgstr "Jambières" + +#: ../technic_armor/init.lua +msgid "Boots" +msgstr "Bottes" + +#: ../technic_armor/init.lua +msgid "Shield" +msgstr "Bouclier" + +#. Translators: @1 stands for material and @2 for part of the armor, so that you could use a conjunction if in your language part name comes first then material (e.g. in french 'Silver Boots' is translated in 'Bottes en argent' by using '@2 en @1' as translated string) +#: ../technic_armor/init.lua +msgid "@1 @2" +msgstr "@2 en @1" diff --git a/mods/3d_armor/3d_armor/locale/it.po b/mods/3d_armor/3d_armor/locale/it.po new file mode 100644 index 0000000..9e44322 --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/it.po @@ -0,0 +1,384 @@ +# ITALIAN LOCALE FILE FOR THE 3D ARMOR MODULE +# Copyright (C) 2012-2017 Stuart Jones +# This file is distributed under the same license as the 3D ARMOR package. +# Hamlet , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Italian localization file for the 3D Armor module\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-06 18:20+0200\n" +"PO-Revision-Date: 2017-08-18 00:36+0100\n" +"Last-Translator: H4mlet \n" +"Language-Team: ITALIANO\n" +"Language: it\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 1.6.10\n" + +#: ../3d_armor/api.lua +msgid "3d_armor: Player name is nil @1" +msgstr "3d_armor: Il nome della/del gicatrice/tore è nullo @1" + +#: ../3d_armor/api.lua +msgid "3d_armor: Player inventory is nil @1" +msgstr "3d_armor: L'inventario della/del giocatrice/tore è nullo @1" + +#: ../3d_armor/api.lua +msgid "3d_armor: Detached armor inventory is nil @1" +msgstr "3d_armor: L'inventario staccato dell'armatura è nullo @1" + +#: ../3d_armor/api.lua +msgid "3d_armor: Player reference is nil @1" +msgstr "3d_armor: Il riferimento alla/al giocatrice/tore è nullo @1" + +#: ../3d_armor/armor.lua +msgid "Admin Helmet" +msgstr "Elmo dell'amministratrice/tore" + +#: ../3d_armor/armor.lua +msgid "Admin Chestplate" +msgstr "Corazza dell'amministratrice/tore" + +#: ../3d_armor/armor.lua +msgid "Admin Leggings" +msgstr "Gambali dell'amministratrice/tore" + +#: ../3d_armor/armor.lua +msgid "Admin Boots" +msgstr "Stivali dell'amministratrice/tore" + +#: ../3d_armor/armor.lua +msgid "Wood Helmet" +msgstr "Elmo di legno" + +#: ../3d_armor/armor.lua +msgid "Wood Chestplate" +msgstr "Corazza di legno" + +#: ../3d_armor/armor.lua +msgid "Wood Leggings" +msgstr "Gambali di legno" + +#: ../3d_armor/armor.lua +msgid "Wood Boots" +msgstr "Stivali di legno" + +#: ../3d_armor/armor.lua +msgid "Cactus Helmet" +msgstr "Elmo di cactus" + +#: ../3d_armor/armor.lua +msgid "Cactus Chestplate" +msgstr "Corazza di cactus" + +#: ../3d_armor/armor.lua +msgid "Cactus Leggings" +msgstr "Gambali di cactus" + +#: ../3d_armor/armor.lua +msgid "Cactus Boots" +msgstr "Stivali di cactus" + +#: ../3d_armor/armor.lua +msgid "Steel Helmet" +msgstr "Elmo di acciaio" + +#: ../3d_armor/armor.lua +msgid "Steel Chestplate" +msgstr "Corazza di acciaio" + +#: ../3d_armor/armor.lua +msgid "Steel Leggings" +msgstr "Gambali di acciaio" + +#: ../3d_armor/armor.lua +msgid "Steel Boots" +msgstr "Stivali di acciaio" + +#: ../3d_armor/armor.lua +msgid "Bronze Helmet" +msgstr "Elmo di bronzo" + +#: ../3d_armor/armor.lua +msgid "Bronze Chestplate" +msgstr "Corazza di bronzo" + +#: ../3d_armor/armor.lua +msgid "Bronze Leggings" +msgstr "Gambali di bronzo" + +#: ../3d_armor/armor.lua +msgid "Bronze Boots" +msgstr "Stivali di bronzo" + +#: ../3d_armor/armor.lua +msgid "Diamond Helmet" +msgstr "Elmo di diamante" + +#: ../3d_armor/armor.lua +msgid "Diamond Chestplate" +msgstr "Corazza di diamante" + +#: ../3d_armor/armor.lua +msgid "Diamond Leggings" +msgstr "Gambali di diamante" + +#: ../3d_armor/armor.lua +msgid "Diamond Boots" +msgstr "Stivali di diamante" + +#: ../3d_armor/armor.lua +msgid "Gold Helmet" +msgstr "Elmo d'oro" + +#: ../3d_armor/armor.lua +msgid "Gold Chestplate" +msgstr "Corazza d'oro" + +#: ../3d_armor/armor.lua +msgid "Gold Leggings" +msgstr "Gambali d'oro" + +#: ../3d_armor/armor.lua +msgid "Gold Boots" +msgstr "Stivali d'oro" + +#: ../3d_armor/armor.lua +msgid "Mithril Helmet" +msgstr "Elmo di mithril" + +#: ../3d_armor/armor.lua +msgid "Mithril Chestplate" +msgstr "Corazza di mithril" + +#: ../3d_armor/armor.lua +msgid "Mithril Leggings" +msgstr "Gambali di mithril" + +#: ../3d_armor/armor.lua +msgid "Mithril Boots" +msgstr "Stivali di mithril" + +#: ../3d_armor/armor.lua +msgid "Crystal Helmet" +msgstr "Elmo di cristallo" + +#: ../3d_armor/armor.lua +msgid "Crystal Chestplate" +msgstr "Corazza di cristallo" + +#: ../3d_armor/armor.lua +msgid "Crystal Leggings" +msgstr "Gambali di cristallo" + +#: ../3d_armor/armor.lua +msgid "Crystal Boots" +msgstr "Stivali di cristallo" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Radiation" +msgstr "Radiazione" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Level" +msgstr "Livello" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Heal" +msgstr "Guarigione" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Fire" +msgstr "Fuoco" + +#: ../3d_armor/init.lua +msgid "Your @1 got destroyed!" +msgstr "Il/i vostro/i @1 è/sono stato/i distrutto/i!" + +#: ../3d_armor/init.lua +msgid "3d_armor: Failed to initialize player" +msgstr "3d_armor: Inizializzazione della/del giocatrice/tore fallita" + +#: ../3d_armor/init.lua +msgid "[3d_armor] Fire Nodes disabled" +msgstr "[3d_armor] Nodi fuoco disabilitati" + +#: ../3d_armor_ip/init.lua +msgid "3d_armor_ip: Mod loaded but unused." +msgstr "3d_armor_ip: Mod caricato ma inutilizzato." + +#: ../3d_armor_ip/init.lua +msgid "Back" +msgstr "Indietro" + +#: ../3d_armor_ip/init.lua ../3d_armor_sfinv/init.lua ../3d_armor_ui/init.lua +msgid "Armor" +msgstr "Armatura" + +#: ../3d_armor_sfinv/init.lua +msgid "3d_armor_sfinv: Mod loaded but unused." +msgstr "3d_armor_sfinv: Mod caricato ma inutilizzato." + +#: ../3d_armor_stand/init.lua +msgid "Armor stand top" +msgstr "Parte superiore del supporto per armatura" + +#: ../3d_armor_stand/init.lua +msgid "Armor stand" +msgstr "Supporto per armatura" + +#: ../3d_armor_stand/init.lua +msgid "Armor Stand" +msgstr "Supporto per armatura" + +#: ../3d_armor_stand/init.lua +msgid "Locked Armor stand" +msgstr "Supporto per armatura chiuso a chiave" + +#: ../3d_armor_stand/init.lua +msgid "Armor Stand (owned by @1)" +msgstr "Supporto per armatura (di proprietà di @1)" + +#: ../3d_armor_ui/init.lua +msgid "3d_armor_ui: Mod loaded but unused." +msgstr "3d_armor_ui: Mod caricato ma inutilizzato." + +#: ../3d_armor_ui/init.lua +msgid "3d Armor" +msgstr "Armatura 3D" + +#: ../3d_armor_ui/init.lua +msgid "Armor not initialized!" +msgstr "Armatura non inizializzata!" + +#: ../hazmat_suit/init.lua +msgid "hazmat_suit: Mod loaded but unused." +msgstr "hazmat_suit: Mod caricato ma inutilizzato." + +#: ../hazmat_suit/init.lua +msgid "Hazmat Helmet" +msgstr "Elmo hazmat" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Chestplate" +msgstr "Corazza hazmat" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Sleeve" +msgstr "Manica hazmat" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Leggins" +msgstr "Gambali hazmat" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Boots" +msgstr "Stivali hazmat" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Suit" +msgstr "Completo hazmat" + +#: ../shields/init.lua +msgid "Admin Shield" +msgstr "Scudo dell'amministratrice/tore" + +#: ../shields/init.lua +msgid "Wooden Shield" +msgstr "Scudo di legno" + +#: ../shields/init.lua +msgid "Enhanced Wood Shield" +msgstr "Scudo di legno migliorato" + +#: ../shields/init.lua +msgid "Cactus Shield" +msgstr "Scudo di cactus" + +#: ../shields/init.lua +msgid "Enhanced Cactus Shield" +msgstr "Scudo di cactus migliorato" + +#: ../shields/init.lua +msgid "Steel Shield" +msgstr "Scudo di acciaio" + +#: ../shields/init.lua +msgid "Bronze Shield" +msgstr "Scudo di bronzo" + +#: ../shields/init.lua +msgid "Diamond Shield" +msgstr "Scudo di diamante" + +#: ../shields/init.lua +msgid "Gold Shield" +msgstr "Scudo d'oro" + +#: ../shields/init.lua +msgid "Mithril Shield" +msgstr "Scudo di mithril" + +#: ../shields/init.lua +msgid "Crystal Shield" +msgstr "Scudo di cristallo" + +#: ../technic_armor/init.lua +msgid "technic_armor: Mod loaded but unused." +msgstr "technic_armor: Mod caricato ma inutilizzato." + +#: ../technic_armor/init.lua +msgid "Lead" +msgstr "Piombo" + +#: ../technic_armor/init.lua +msgid "Brass" +msgstr "Ottone" + +#: ../technic_armor/init.lua +msgid "Cast Iron" +msgstr "Ghisa" + +#: ../technic_armor/init.lua +msgid "Carbon Steel" +msgstr "Acciaio al carbonio" + +#: ../technic_armor/init.lua +msgid "Stainless Steel" +msgstr "Acciaio inossidabile" + +#: ../technic_armor/init.lua +msgid "Tin" +msgstr "Stagno" + +#: ../technic_armor/init.lua +msgid "Silver" +msgstr "Argento" + +#: ../technic_armor/init.lua +msgid "Helmet" +msgstr "Elmo" + +#: ../technic_armor/init.lua +msgid "Chestplate" +msgstr "Corazza" + +#: ../technic_armor/init.lua +msgid "Leggings" +msgstr "Gambali" + +#: ../technic_armor/init.lua +msgid "Boots" +msgstr "Stivali" + +#: ../technic_armor/init.lua +msgid "Shield" +msgstr "Scudo" + +#. Translators: @1 stands for material and @2 for part of the armor, so that you could use a conjunction if in your language part name comes first then material (e.g. in french 'Silver Boots' is translated in 'Bottes en argent' by using '@2 en @1' as translated string) +#: ../technic_armor/init.lua +msgid "@1 @2" +msgstr "@2 di @1" diff --git a/mods/3d_armor/3d_armor/locale/ms.po b/mods/3d_armor/3d_armor/locale/ms.po new file mode 100644 index 0000000..c86546f --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/ms.po @@ -0,0 +1,386 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-06 18:20+0200\n" +"PO-Revision-Date: 2018-02-07 13:25+0800\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.6\n" +"Last-Translator: MuhdNurHidayat (MNH48) \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Language: ms\n" + +#: ../3d_armor/api.lua +msgid "3d_armor: Player name is nil @1" +msgstr "3d_armor: Nama pemain tiada nilai @1" + +#: ../3d_armor/api.lua +msgid "3d_armor: Player inventory is nil @1" +msgstr "3d_armor: Inventori pemain tiada nilai @1" + +#: ../3d_armor/api.lua +msgid "3d_armor: Detached armor inventory is nil @1" +msgstr "3d_armor: Inventori perisai terpisah tiada nilai @1" + +#: ../3d_armor/api.lua +msgid "3d_armor: Player reference is nil @1" +msgstr "3d_armor: Rujukan pemain tiada nilai @1" + +#: ../3d_armor/armor.lua +msgid "Admin Helmet" +msgstr "Helmet Pentadbir" + +#: ../3d_armor/armor.lua +msgid "Admin Chestplate" +msgstr "Perisai Dada Pentadbir" + +#: ../3d_armor/armor.lua +msgid "Admin Leggings" +msgstr "Perisai Kaki Pentadbir" + +#: ../3d_armor/armor.lua +msgid "Admin Boots" +msgstr "But Pentadbir" + +#: ../3d_armor/armor.lua +msgid "Wood Helmet" +msgstr "Helmet Kayu" + +#: ../3d_armor/armor.lua +msgid "Wood Chestplate" +msgstr "Perisai Dada Kayu" + +#: ../3d_armor/armor.lua +msgid "Wood Leggings" +msgstr "Perisai Kaki Kayu" + +#: ../3d_armor/armor.lua +msgid "Wood Boots" +msgstr "But Kayu" + +#: ../3d_armor/armor.lua +msgid "Cactus Helmet" +msgstr "Helmet Kaktus" + +#: ../3d_armor/armor.lua +msgid "Cactus Chestplate" +msgstr "Perisai Dada Kaktus" + +#: ../3d_armor/armor.lua +msgid "Cactus Leggings" +msgstr "Perisai Kaki Kaktus" + +#: ../3d_armor/armor.lua +msgid "Cactus Boots" +msgstr "But Kaktus" + +#: ../3d_armor/armor.lua +msgid "Steel Helmet" +msgstr "Helmet Keluli" + +#: ../3d_armor/armor.lua +msgid "Steel Chestplate" +msgstr "Perisai Dada Keluli" + +#: ../3d_armor/armor.lua +msgid "Steel Leggings" +msgstr "Perisai Kaki Keluli" + +#: ../3d_armor/armor.lua +msgid "Steel Boots" +msgstr "But Keluli" + +#: ../3d_armor/armor.lua +msgid "Bronze Helmet" +msgstr "Helmet Gangsa" + +#: ../3d_armor/armor.lua +msgid "Bronze Chestplate" +msgstr "Perisai Dada Gangsa" + +#: ../3d_armor/armor.lua +msgid "Bronze Leggings" +msgstr "Perisai Kaki Gangsa" + +#: ../3d_armor/armor.lua +msgid "Bronze Boots" +msgstr "But Gangsa" + +# 'Diamond' should be translated as 'intan' because the more common word 'berlian' is only specifically used for the gemstone diamond. +#: ../3d_armor/armor.lua +msgid "Diamond Helmet" +msgstr "Helmet Intan" + +#: ../3d_armor/armor.lua +msgid "Diamond Chestplate" +msgstr "Perisai Dada Intan" + +#: ../3d_armor/armor.lua +msgid "Diamond Leggings" +msgstr "Perisai Kaki Intan" + +#: ../3d_armor/armor.lua +msgid "Diamond Boots" +msgstr "But Intan" + +#: ../3d_armor/armor.lua +msgid "Gold Helmet" +msgstr "Helmet Emas" + +#: ../3d_armor/armor.lua +msgid "Gold Chestplate" +msgstr "Perisai Dada Emas" + +#: ../3d_armor/armor.lua +msgid "Gold Leggings" +msgstr "Perisai Kaki Emas" + +#: ../3d_armor/armor.lua +msgid "Gold Boots" +msgstr "But Emas" + +#: ../3d_armor/armor.lua +msgid "Mithril Helmet" +msgstr "Helmet Mithril" + +#: ../3d_armor/armor.lua +msgid "Mithril Chestplate" +msgstr "Perisai Dada Mithril" + +#: ../3d_armor/armor.lua +msgid "Mithril Leggings" +msgstr "Perisai Kaki Mithril" + +#: ../3d_armor/armor.lua +msgid "Mithril Boots" +msgstr "But Mithril" + +#: ../3d_armor/armor.lua +msgid "Crystal Helmet" +msgstr "Helmet Kristal" + +#: ../3d_armor/armor.lua +msgid "Crystal Chestplate" +msgstr "Perisai Dada Kristal" + +#: ../3d_armor/armor.lua +msgid "Crystal Leggings" +msgstr "Perisai Kaki Kristal" + +#: ../3d_armor/armor.lua +msgid "Crystal Boots" +msgstr "But Kristal" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Radiation" +msgstr "Radiasi" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Level" +msgstr "Tahap" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Heal" +msgstr "Pulih" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Fire" +msgstr "Api" + +#: ../3d_armor/init.lua +msgid "Your @1 got destroyed!" +msgstr "@1 anda telah musnah!" + +#: ../3d_armor/init.lua +msgid "3d_armor: Failed to initialize player" +msgstr "3d_armor: Gagal mengasalkan pemain" + +#: ../3d_armor/init.lua +msgid "[3d_armor] Fire Nodes disabled" +msgstr "[3d_armor] Nod-nod Api dilumpuhkan" + +#: ../3d_armor_ip/init.lua +msgid "3d_armor_ip: Mod loaded but unused." +msgstr "3d_armor_ip: Mods dimuatkan tetapi tidak digunakan." + +#: ../3d_armor_ip/init.lua +msgid "Back" +msgstr "Kembali" + +#: ../3d_armor_ip/init.lua ../3d_armor_sfinv/init.lua ../3d_armor_ui/init.lua +msgid "Armor" +msgstr "Perisai" + +#: ../3d_armor_sfinv/init.lua +msgid "3d_armor_sfinv: Mod loaded but unused." +msgstr "3d_armor_sfinv: Mods dimuatkan tetapi tidak digunakan." + +#: ../3d_armor_stand/init.lua +msgid "Armor stand top" +msgstr "Bhg atas dirian perisai" + +#: ../3d_armor_stand/init.lua +msgid "Armor stand" +msgstr "Dirian perisai" + +#: ../3d_armor_stand/init.lua +msgid "Armor Stand" +msgstr "Dirian Perisai" + +#: ../3d_armor_stand/init.lua +msgid "Locked Armor stand" +msgstr "Dirian perisai Berkunci" + +#: ../3d_armor_stand/init.lua +msgid "Armor Stand (owned by @1)" +msgstr "Dirian Perisai (milik @1)" + +#: ../3d_armor_ui/init.lua +msgid "3d_armor_ui: Mod loaded but unused." +msgstr "3d_armor_ui: Mods dimuatkan tetapi tidak digunakan." + +#: ../3d_armor_ui/init.lua +msgid "3d Armor" +msgstr "Perisai 3d" + +#: ../3d_armor_ui/init.lua +msgid "Armor not initialized!" +msgstr "Perisai tidak diasalkan!" + +#: ../hazmat_suit/init.lua +msgid "hazmat_suit: Mod loaded but unused." +msgstr "hazmat_suit: Mods dimuatkan tetapi tidak digunakan." + +#: ../hazmat_suit/init.lua +msgid "Hazmat Helmet" +msgstr "Helmet Keselamatan" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Chestplate" +msgstr "Perisai Dada Keselamatan" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Sleeve" +msgstr "Perisai Tangan Keselamatan" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Leggins" +msgstr "Perisai Kaki Keselamatan" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Boots" +msgstr "But Keselamatan" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Suit" +msgstr "Pakaian Keselamatan" + +#: ../shields/init.lua +msgid "Admin Shield" +msgstr "Perisai Pegang Pentadbir" + +#: ../shields/init.lua +msgid "Wooden Shield" +msgstr "Perisai Pegang Kayu" + +#: ../shields/init.lua +msgid "Enhanced Wood Shield" +msgstr "Perisai Pegang Kayu Kukuh" + +#: ../shields/init.lua +msgid "Cactus Shield" +msgstr "Perisai Pegang Kaktus" + +#: ../shields/init.lua +msgid "Enhanced Cactus Shield" +msgstr "Perisai Pegang Kaktus Kukuh" + +#: ../shields/init.lua +msgid "Steel Shield" +msgstr "Perisai Pegang Keluli" + +#: ../shields/init.lua +msgid "Bronze Shield" +msgstr "Perisai Pegang Gangsa" + +#: ../shields/init.lua +msgid "Diamond Shield" +msgstr "Perisai Pegang Intan" + +#: ../shields/init.lua +msgid "Gold Shield" +msgstr "Perisai Pegang Emas" + +#: ../shields/init.lua +msgid "Mithril Shield" +msgstr "Perisai Pegang Mithril" + +#: ../shields/init.lua +msgid "Crystal Shield" +msgstr "Perisai Pegang Kristal" + +#: ../technic_armor/init.lua +msgid "technic_armor: Mod loaded but unused." +msgstr "technic_armor: Mods dimuatkan tetapi tidak digunakan." + +# 'Lead' here is the chemical compound so the translation is 'plumbum', not 'pimpin' (act of leading). +#: ../technic_armor/init.lua +msgid "Lead" +msgstr "Plumbum" + +#: ../technic_armor/init.lua +msgid "Brass" +msgstr "Loyang" + +#: ../technic_armor/init.lua +msgid "Cast Iron" +msgstr "Besi Tuang" + +#: ../technic_armor/init.lua +msgid "Carbon Steel" +msgstr "Keluli Karbon" + +#: ../technic_armor/init.lua +msgid "Stainless Steel" +msgstr "Keluli Tahan Karat" + +#: ../technic_armor/init.lua +msgid "Tin" +msgstr "Timah" + +#: ../technic_armor/init.lua +msgid "Silver" +msgstr "Perak" + +#: ../technic_armor/init.lua +msgid "Helmet" +msgstr "Helmet" + +#: ../technic_armor/init.lua +msgid "Chestplate" +msgstr "Perisai Dada" + +#: ../technic_armor/init.lua +msgid "Leggings" +msgstr "Perisai Kaki" + +#: ../technic_armor/init.lua +msgid "Boots" +msgstr "But" + +#: ../technic_armor/init.lua +msgid "Shield" +msgstr "Perisai Pegang" + +#. Translators: @1 stands for material and @2 for part of the armor, so that you could use a conjunction if in your language part name comes first then material (e.g. in french 'Silver Boots' is translated in 'Bottes en argent' by using '@2 en @1' as translated string) +#: ../technic_armor/init.lua +msgid "@1 @2" +msgstr "@2 @1" diff --git a/mods/3d_armor/3d_armor/locale/template.pot b/mods/3d_armor/3d_armor/locale/template.pot new file mode 100644 index 0000000..20b7504 --- /dev/null +++ b/mods/3d_armor/3d_armor/locale/template.pot @@ -0,0 +1,383 @@ +# 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-08-06 18:20+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../3d_armor/api.lua +msgid "3d_armor: Player name is nil @1" +msgstr "" + +#: ../3d_armor/api.lua +msgid "3d_armor: Player inventory is nil @1" +msgstr "" + +#: ../3d_armor/api.lua +msgid "3d_armor: Detached armor inventory is nil @1" +msgstr "" + +#: ../3d_armor/api.lua +msgid "3d_armor: Player reference is nil @1" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Admin Helmet" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Admin Chestplate" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Admin Leggings" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Admin Boots" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Wood Helmet" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Wood Chestplate" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Wood Leggings" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Wood Boots" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Cactus Helmet" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Cactus Chestplate" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Cactus Leggings" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Cactus Boots" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Steel Helmet" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Steel Chestplate" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Steel Leggings" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Steel Boots" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Bronze Helmet" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Bronze Chestplate" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Bronze Leggings" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Bronze Boots" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Diamond Helmet" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Diamond Chestplate" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Diamond Leggings" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Diamond Boots" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Gold Helmet" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Gold Chestplate" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Gold Leggings" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Gold Boots" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Mithril Helmet" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Mithril Chestplate" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Mithril Leggings" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Mithril Boots" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Crystal Helmet" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Crystal Chestplate" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Crystal Leggings" +msgstr "" + +#: ../3d_armor/armor.lua +msgid "Crystal Boots" +msgstr "" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Radiation" +msgstr "" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Level" +msgstr "" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Heal" +msgstr "" + +#: ../3d_armor/init.lua ../3d_armor_ui/init.lua +msgid "Fire" +msgstr "" + +#: ../3d_armor/init.lua +msgid "Your @1 got destroyed!" +msgstr "" + +#: ../3d_armor/init.lua +msgid "3d_armor: Failed to initialize player" +msgstr "" + +#: ../3d_armor/init.lua +msgid "[3d_armor] Fire Nodes disabled" +msgstr "" + +#: ../3d_armor_ip/init.lua +msgid "3d_armor_ip: Mod loaded but unused." +msgstr "" + +#: ../3d_armor_ip/init.lua +msgid "Back" +msgstr "" + +#: ../3d_armor_ip/init.lua ../3d_armor_sfinv/init.lua ../3d_armor_ui/init.lua +msgid "Armor" +msgstr "" + +#: ../3d_armor_sfinv/init.lua +msgid "3d_armor_sfinv: Mod loaded but unused." +msgstr "" + +#: ../3d_armor_stand/init.lua +msgid "Armor stand top" +msgstr "" + +#: ../3d_armor_stand/init.lua +msgid "Armor stand" +msgstr "" + +#: ../3d_armor_stand/init.lua +msgid "Armor Stand" +msgstr "" + +#: ../3d_armor_stand/init.lua +msgid "Locked Armor stand" +msgstr "" + +#: ../3d_armor_stand/init.lua +msgid "Armor Stand (owned by @1)" +msgstr "" + +#: ../3d_armor_ui/init.lua +msgid "3d_armor_ui: Mod loaded but unused." +msgstr "" + +#: ../3d_armor_ui/init.lua +msgid "3d Armor" +msgstr "" + +#: ../3d_armor_ui/init.lua +msgid "Armor not initialized!" +msgstr "" + +#: ../hazmat_suit/init.lua +msgid "hazmat_suit: Mod loaded but unused." +msgstr "" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Helmet" +msgstr "" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Chestplate" +msgstr "" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Sleeve" +msgstr "" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Leggins" +msgstr "" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Boots" +msgstr "" + +#: ../hazmat_suit/init.lua +msgid "Hazmat Suit" +msgstr "" + +#: ../shields/init.lua +msgid "Admin Shield" +msgstr "" + +#: ../shields/init.lua +msgid "Wooden Shield" +msgstr "" + +#: ../shields/init.lua +msgid "Enhanced Wood Shield" +msgstr "" + +#: ../shields/init.lua +msgid "Cactus Shield" +msgstr "" + +#: ../shields/init.lua +msgid "Enhanced Cactus Shield" +msgstr "" + +#: ../shields/init.lua +msgid "Steel Shield" +msgstr "" + +#: ../shields/init.lua +msgid "Bronze Shield" +msgstr "" + +#: ../shields/init.lua +msgid "Diamond Shield" +msgstr "" + +#: ../shields/init.lua +msgid "Gold Shield" +msgstr "" + +#: ../shields/init.lua +msgid "Mithril Shield" +msgstr "" + +#: ../shields/init.lua +msgid "Crystal Shield" +msgstr "" + +#: ../technic_armor/init.lua +msgid "technic_armor: Mod loaded but unused." +msgstr "" + +#: ../technic_armor/init.lua +msgid "Lead" +msgstr "" + +#: ../technic_armor/init.lua +msgid "Brass" +msgstr "" + +#: ../technic_armor/init.lua +msgid "Cast Iron" +msgstr "" + +#: ../technic_armor/init.lua +msgid "Carbon Steel" +msgstr "" + +#: ../technic_armor/init.lua +msgid "Stainless Steel" +msgstr "" + +#: ../technic_armor/init.lua +msgid "Tin" +msgstr "" + +#: ../technic_armor/init.lua +msgid "Silver" +msgstr "" + +#: ../technic_armor/init.lua +msgid "Helmet" +msgstr "" + +#: ../technic_armor/init.lua +msgid "Chestplate" +msgstr "" + +#: ../technic_armor/init.lua +msgid "Leggings" +msgstr "" + +#: ../technic_armor/init.lua +msgid "Boots" +msgstr "" + +#: ../technic_armor/init.lua +msgid "Shield" +msgstr "" + +#. Translators: @1 stands for material and @2 for part of the armor, so that you could use a conjunction if in your language part name comes first then material (e.g. in french 'Silver Boots' is translated in 'Bottes en argent' by using '@2 en @1' as translated string) +#: ../technic_armor/init.lua +msgid "@1 @2" +msgstr "" diff --git a/mods/3d_armor/3d_armor/models/3d_armor_character.b3d b/mods/3d_armor/3d_armor/models/3d_armor_character.b3d index 278956b..7c27cae 100644 Binary files a/mods/3d_armor/3d_armor/models/3d_armor_character.b3d and b/mods/3d_armor/3d_armor/models/3d_armor_character.b3d differ diff --git a/mods/3d_armor/3d_armor/models/3d_armor_character.blend b/mods/3d_armor/3d_armor/models/3d_armor_character.blend index 5ded978..f61e222 100644 Binary files a/mods/3d_armor/3d_armor/models/3d_armor_character.blend and b/mods/3d_armor/3d_armor/models/3d_armor_character.blend differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin.png index a05e4c5..23be004 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin.png and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin_preview.png index d61ab25..77acce6 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze.png index 7cfe378..2f4fd83 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze.png and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze_preview.png index 6da8019..1f83af3 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus.png index 7dc43e3..f370644 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus.png and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus_preview.png index 33f9221..e4cbf13 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal.png index 50bbf20..3ca8899 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal.png and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal_preview.png index a3ab7d1..0c6b3e4 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond.png index 6678b16..ef40206 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond.png and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond_preview.png index eb99c4e..7575fbd 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold.png index 2de3966..f431d9b 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold.png and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold_preview.png index 5ca40ac..9daae14 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril.png index 3e4173b..b6c65d6 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril.png and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril_preview.png index b0c4684..21de8c1 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel.png index 4664be5..72ec88b 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel.png and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel_preview.png index 25fc47a..170d094 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood.png index 0ec5d6c..411ce9c 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood.png and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood_preview.png index 53d6d15..d9f192c 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin.png index 404d6e8..a17d0a4 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin.png and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin_preview.png index 09325a5..5395810 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze.png index d9c7267..ac43ddb 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze.png and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze_preview.png index 90d887a..ab1d1ce 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus.png index ee433de..0dd7eb0 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus.png and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus_preview.png index 32bf6f6..9523ef7 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal.png index e36aa49..e4981b1 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal.png and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal_preview.png index c43015c..801dc2a 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond.png index 81a7b21..3538496 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond.png and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond_preview.png index 17e2eb8..92909b3 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold.png index 91b1631..cc3e910 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold.png and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold_preview.png index cb11321..df47bf0 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril.png index 2bbeab8..b06b2a8 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril.png and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril_preview.png index eca051c..4859295 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel.png index 23cdbda..bccb99d 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel.png and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel_preview.png index 0e45907..804e785 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood.png index ea7a1d7..bae4817 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood.png and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood_preview.png index cdca575..8f75f26 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin.png index 4d52d4c..0a04251 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin.png and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin_preview.png index 51ecb9b..9f44921 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze.png index 438002e..7ef5595 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze.png and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze_preview.png index 61fa1af..9a62f82 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus.png index 8cd68d5..e48ec34 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus.png and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus_preview.png index 4e3bfe2..c8be84a 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal.png index c323e94..e63a63f 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal.png and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal_preview.png index 451a15d..dddbbc0 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond.png index 2649670..611dc9f 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond.png and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond_preview.png index 33a273a..ed52aed 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold.png index 6fa3af5..24da53b 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold.png and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold_preview.png index d2e7ac8..d4d9d0c 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril.png index 1d108a2..57e579e 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril.png and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril_preview.png index a331f6a..be50523 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel.png index ec5c203..8d21e8a 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel.png and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel_preview.png index 2c8721c..774d284 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood.png index 0bdb8f7..01e243a 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood.png and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood_preview.png index fe1cead..0e0c3b1 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_admin.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_admin.png index 9c02d1d..69fc00a 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_admin.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_admin.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_bronze.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_bronze.png index 7f5f968..448f41d 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_bronze.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_bronze.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_cactus.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_cactus.png index b665eb8..3f57f22 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_cactus.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_cactus.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_crystal.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_crystal.png index 5709a17..e311893 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_crystal.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_crystal.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_diamond.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_diamond.png index 6bcd620..0a866e7 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_diamond.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_diamond.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_gold.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_gold.png index 8598cf9..55d78b7 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_gold.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_gold.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_mithril.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_mithril.png index a4c180d..00c26f9 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_mithril.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_mithril.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_steel.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_steel.png index 77286b5..82fc591 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_steel.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_steel.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_wood.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_wood.png index 66993a1..53bb557 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_wood.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_wood.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_admin.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_admin.png index 29f3897..dafef2c 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_admin.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_admin.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_bronze.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_bronze.png index da2f3e0..8fc2f17 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_bronze.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_bronze.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_cactus.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_cactus.png index a695e78..7f5bc70 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_cactus.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_cactus.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_crystal.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_crystal.png index 4d23066..b9593bf 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_crystal.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_crystal.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_diamond.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_diamond.png index eee800b..f5ca3aa 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_diamond.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_diamond.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_gold.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_gold.png index 1dddc3d..efe76ca 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_gold.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_gold.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_mithril.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_mithril.png index e4c50a7..6ca9231 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_mithril.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_mithril.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_steel.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_steel.png index 421b3e3..47ef4f2 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_steel.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_steel.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_wood.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_wood.png index 434374f..dac3b06 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_wood.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_wood.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_admin.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_admin.png index e019702..494cc84 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_admin.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_admin.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_bronze.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_bronze.png index 53cdaf1..c0028dd 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_bronze.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_bronze.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_cactus.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_cactus.png index 746c264..10a2b39 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_cactus.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_cactus.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_crystal.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_crystal.png index 8a29eec..565383e 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_crystal.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_crystal.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_diamond.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_diamond.png index 2eb3a5c..6df57bd 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_diamond.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_diamond.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_gold.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_gold.png index e8f83d8..6820d8f 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_gold.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_gold.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_mithril.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_mithril.png index abdd0ca..ce4e910 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_mithril.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_mithril.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_steel.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_steel.png index 4c636f2..1c8bfe8 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_steel.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_steel.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_wood.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_wood.png index e8ee2fe..fbb3e3f 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_wood.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_wood.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_admin.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_admin.png index 1ca01ef..e652ef1 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_admin.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_admin.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_bronze.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_bronze.png index b574108..f194f9f 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_bronze.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_bronze.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_cactus.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_cactus.png index f4f834e..f7c1a28 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_cactus.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_cactus.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_crystal.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_crystal.png index 5b3f703..d466b20 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_crystal.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_crystal.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_diamond.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_diamond.png index 2ab1c8e..c4cd85c 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_diamond.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_diamond.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_gold.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_gold.png index 7424833..2e4b244 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_gold.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_gold.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_mithril.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_mithril.png index b9b1b3c..ffe972c 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_mithril.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_mithril.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_steel.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_steel.png index 77ee17e..1ca9975 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_steel.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_steel.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_wood.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_wood.png index f162e51..9e73b72 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_wood.png and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_wood.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin.png index 6752256..bedfbc1 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin.png and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin_preview.png index fe47999..1d32265 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze.png index 3394288..bcba372 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze.png and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze_preview.png index c4aa7b9..c378148 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus.png index 7d22404..88aa32d 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus.png and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus_preview.png index 1a24863..9dab482 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal.png index cc61390..754bd0f 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal.png and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal_preview.png index 559d008..7808496 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond.png index a646ba2..a57cf07 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond.png and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond_preview.png index a6ac2e2..84976c4 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold.png index d207dff..dfdd094 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold.png and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold_preview.png index 75e6ca4..ff2e3d0 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril.png index ffff3ee..2143572 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril.png and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril_preview.png index ee99178..178054a 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel.png index 78d5874..cca4e31 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel.png and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel_preview.png index 3e3ec85..dbcfcf2 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood.png index 3880fc0..eb61034 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood.png and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood_preview.png index f8ee8e8..1545b4b 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood_preview.png and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_trans.png b/mods/3d_armor/3d_armor/textures/3d_armor_trans.png index 4d7beb8..4a31242 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_trans.png and b/mods/3d_armor/3d_armor/textures/3d_armor_trans.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_ui_form.png b/mods/3d_armor/3d_armor/textures/3d_armor_ui_form.png index 6e5cfee..993809f 100644 Binary files a/mods/3d_armor/3d_armor/textures/3d_armor_ui_form.png and b/mods/3d_armor/3d_armor/textures/3d_armor_ui_form.png differ diff --git a/mods/3d_armor/3d_armor/textures/character_preview.png b/mods/3d_armor/3d_armor/textures/character_preview.png index 4ac4602..82a0ae4 100644 Binary files a/mods/3d_armor/3d_armor/textures/character_preview.png and b/mods/3d_armor/3d_armor/textures/character_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/inventory_plus_armor.png b/mods/3d_armor/3d_armor/textures/inventory_plus_armor.png index 6cde640..f317c70 100644 Binary files a/mods/3d_armor/3d_armor/textures/inventory_plus_armor.png and b/mods/3d_armor/3d_armor/textures/inventory_plus_armor.png differ diff --git a/mods/3d_armor/3d_armor/textures/preview_index.txt b/mods/3d_armor/3d_armor/textures/preview_index.txt new file mode 100644 index 0000000..9e2fe9d --- /dev/null +++ b/mods/3d_armor/3d_armor/textures/preview_index.txt @@ -0,0 +1,44 @@ +3d_armor/textures/3d_armor_helmet_wood.png:head +3d_armor/textures/3d_armor_chestplate_wood.png:torso +3d_armor/textures/3d_armor_leggings_wood.png:legs +3d_armor/textures/3d_armor_boots_wood.png:feet + +3d_armor/textures/3d_armor_helmet_cactus.png:head +3d_armor/textures/3d_armor_chestplate_cactus.png:torso +3d_armor/textures/3d_armor_leggings_cactus.png:legs +3d_armor/textures/3d_armor_boots_cactus.png:feet + +3d_armor/textures/3d_armor_helmet_steel.png:head +3d_armor/textures/3d_armor_chestplate_steel.png:torso +3d_armor/textures/3d_armor_leggings_steel.png:legs +3d_armor/textures/3d_armor_boots_steel.png:feet + +3d_armor/textures/3d_armor_helmet_bronze.png:head +3d_armor/textures/3d_armor_chestplate_bronze.png:torso +3d_armor/textures/3d_armor_leggings_bronze.png:legs +3d_armor/textures/3d_armor_boots_bronze.png:feet + +3d_armor/textures/3d_armor_helmet_gold.png:head +3d_armor/textures/3d_armor_chestplate_gold.png:torso +3d_armor/textures/3d_armor_leggings_gold.png:legs +3d_armor/textures/3d_armor_boots_gold.png:feet + +3d_armor/textures/3d_armor_helmet_diamond.png:head +3d_armor/textures/3d_armor_chestplate_diamond.png:torso +3d_armor/textures/3d_armor_leggings_diamond.png:legs +3d_armor/textures/3d_armor_boots_diamond.png:feet + +3d_armor/textures/3d_armor_helmet_mithril.png:head +3d_armor/textures/3d_armor_chestplate_mithril.png:torso +3d_armor/textures/3d_armor_leggings_mithril.png:legs +3d_armor/textures/3d_armor_boots_mithril.png:feet + +3d_armor/textures/3d_armor_helmet_crystal.png:head +3d_armor/textures/3d_armor_chestplate_crystal.png:torso +3d_armor/textures/3d_armor_leggings_crystal.png:legs +3d_armor/textures/3d_armor_boots_crystal.png:feet + +3d_armor/textures/3d_armor_helmet_admin.png:head +3d_armor/textures/3d_armor_chestplate_admin.png:torso +3d_armor/textures/3d_armor_leggings_admin.png:legs +3d_armor/textures/3d_armor_boots_admin.png:feet diff --git a/mods/3d_armor/3d_armor/tools/updatepo.sh b/mods/3d_armor/3d_armor/tools/updatepo.sh new file mode 100644 index 0000000..21ca5b5 --- /dev/null +++ b/mods/3d_armor/3d_armor/tools/updatepo.sh @@ -0,0 +1,25 @@ +#! /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 \ + --language=Lua \ + --sort-by-file \ + --keyword=S \ + --keyword=NS:1,2 \ + --keyword=N_ \ + --keyword=F \ + --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/3d_armor/3d_armor/tutorial.lua b/mods/3d_armor/3d_armor/tutorial.lua index 3377720..2ab6e42 100644 --- a/mods/3d_armor/3d_armor/tutorial.lua +++ b/mods/3d_armor/3d_armor/tutorial.lua @@ -1,50 +1,50 @@ minetest.register_tool("3d_armor:boots", { description = "Boots\nBoots-lv.0", inventory_image = "3d_armor_inv_boots.png", - groups = {armor_feet=1, armor_heal=0, armor_use=0}, + groups = {armor_feet=0.1, armor_heal=0, armor_use=0}, wear = 0, }) minetest.register_tool("3d_armor:chestplate", { description = "Chestplate\nChestplate-lv.0", inventory_image = "3d_armor_inv_chestplate.png", - groups = {armor_torso=2, armor_heal=0, armor_use=0}, + groups = {armor_torso=0.1, armor_heal=0, armor_use=0}, wear = 0, }) minetest.register_tool("3d_armor:helmet", { description = "Helmet\nHelmet-lv.0", inventory_image = "3d_armor_inv_helmet.png", - groups = {armor_head=1, armor_heal=0, armor_use=0}, + groups = {armor_head=0.1, armor_heal=0, armor_use=0}, wear = 0, }) minetest.register_tool("3d_armor:leggings", { description = "Leggings\nLeggings-lv.0", inventory_image = "3d_armor_inv_leggings.png", - groups = {armor_legs=1, armor_heal=0, armor_use=0}, + groups = {armor_legs=0.1, armor_heal=0, armor_use=0}, wear = 0, }) for i=1,20 do minetest.register_tool("3d_armor:boots_mega"..i, { description = "Megaboots lv."..i.."\nBoots-lv."..i, inventory_image = "3d_armor_inv_boots_mega"..i..".png", - groups = {armor_feet=i, armor_heal=0, armor_use=0, armor_fire=0.2*i}, + groups = {armor_feet=i*0.1, armor_heal=0, armor_use=0, armor_fire=0.005*i}, wear = 0, }) minetest.register_tool("3d_armor:chestplate_mega"..i, { description = "Megachestplate lv."..i.."\nChestplate-lv."..i, inventory_image = "3d_armor_inv_chestplate_mega"..i..".png", - groups = {armor_torso=i, armor_heal=0, armor_use=0, armor_fire=0.2*i}, + groups = {armor_torso=i*0.1, armor_heal=0, armor_use=0, armor_fire=0.005*i}, wear = 0, }) minetest.register_tool("3d_armor:leggings_mega"..i, { description = "Megaleggings lv."..i.."\nLeggings-lv."..i, inventory_image = "3d_armor_inv_leggings_mega"..i..".png", - groups = {armor_legs=i, armor_heal=0, armor_use=0,armor_fire=0.2*i}, + groups = {armor_legs=i*0.1, armor_heal=0, armor_use=0,armor_fire=0.005*i}, wear = 0, }) minetest.register_tool("3d_armor:helmet_mega"..i, { description = "Megahelmet lv."..i.."\nHelmet-lv."..i, inventory_image = "3d_armor_inv_helmet_mega"..i..".png", - groups = {armor_head=i, armor_heal=0, armor_use=0,armor_fire=0.2*i}, + groups = {armor_head=i*0.1, armor_heal=0, armor_use=0,armor_fire=0.005*i}, wear = 0, }) end @@ -52,25 +52,25 @@ for i=1,25 do minetest.register_tool("3d_armor:cloudboots_mega"..i, { description = "Cloudboots lv."..i.."\nBoots-lv."..(i+20), inventory_image = "3d_armor_inv_cloudboots_mega"..i..".png", - groups = {armor_feet=20+i, armor_heal=1, armor_use=0, armor_fire=0.2*(i+20)}, + groups = {armor_feet=(20+i)*0.1, armor_heal=1, armor_use=0, armor_fire=0.005*(i+20)}, wear = 0, }) minetest.register_tool("3d_armor:cloudchestplate_mega"..i, { description = "Cloudchestplate lv."..i.."\nChestplate-lv."..(i+20), inventory_image = "3d_armor_inv_cloudchestplate_mega"..i..".png", - groups = {armor_torso=20+i, armor_heal=1, armor_use=0, armor_fire=0.2*(i+20)}, + groups = {armor_torso=(20+i)*0.1, armor_heal=1, armor_use=0, armor_fire=0.005*(i+20)}, wear = 0, }) minetest.register_tool("3d_armor:cloudleggings_mega"..i, { description = "Cloudleggings lv."..i.."\nLeggings-lv."..(i+20), inventory_image = "3d_armor_inv_cloudleggings_mega"..i..".png", - groups = {armor_legs=20+i, armor_heal=1, armor_use=0,armor_fire=0.2*(i+20)}, + groups = {armor_legs=(20+i)*0.1, armor_heal=1, armor_use=0,armor_fire=0.005*(i+20)}, wear = 0, }) minetest.register_tool("3d_armor:cloudhelmet_mega"..i, { description = "Cloudhelmet lv."..i.."\nHelmet-lv."..(i+20), inventory_image = "3d_armor_inv_cloudhelmet_mega"..i..".png", - groups = {armor_head=20+i, armor_heal=1, armor_use=0,armor_fire=0.2*(i+20)}, + groups = {armor_head=(20+i)*0.1, armor_heal=1, armor_use=0,armor_fire=0.005*(i+20)}, wear = 0, }) end @@ -78,25 +78,25 @@ for i=1,4 do minetest.register_tool("3d_armor:superboots"..i, { description = "Superboots lv."..i.."\nBoots-lv."..(i+45), inventory_image = "3d_armor_inv_superboots"..i..".png", - groups = {armor_feet=45+i, armor_heal=2, armor_use=0, armor_fire=0.2*(i+45)}, + groups = {armor_feet=(45+i)*0.1, armor_heal=2, armor_use=0, armor_fire=0.005*(i+45)}, wear = 0, }) minetest.register_tool("3d_armor:superchestplate"..i, { description = "Superchestplate lv."..i.."\nChestplate-lv."..(i+45), inventory_image = "3d_armor_inv_superchestplate"..i..".png", - groups = {armor_torso=45+i, armor_heal=2, armor_use=0, armor_fire=0.2*(i+45)}, + groups = {armor_torso=(45+i)*0.1, armor_heal=2, armor_use=0, armor_fire=0.005*(i+45)}, wear = 0, }) minetest.register_tool("3d_armor:superleggings"..i, { description = "Superleggings lv."..i.."\nLeggings-lv."..(i+45), inventory_image = "3d_armor_inv_superleggings"..i..".png", - groups = {armor_legs=45+i, armor_heal=2, armor_use=0,armor_fire=0.2*(i+45)}, + groups = {armor_legs=(45+i)*0.1, armor_heal=2, armor_use=0,armor_fire=0.005*(i+45)}, wear = 0, }) minetest.register_tool("3d_armor:superhelmet"..i, { description = "Superhelmet lv."..i.."\nHelmet-lv."..(i+45), inventory_image = "3d_armor_inv_superhelmet"..i..".png", - groups = {armor_head=45+i, armor_heal=2, armor_use=0,armor_fire=0.2*(i+45)}, + groups = {armor_head=(45+i)*0.1, armor_heal=2, armor_use=0,armor_fire=0.005*(i+45)}, wear = 0, }) end @@ -104,25 +104,25 @@ for i=1,2 do minetest.register_tool("3d_armor:uraniumboots"..i, { description = "Uraniumboots lv."..i.."\nBoots-lv."..(i+49), inventory_image = "3d_armor_inv_uraniumboots"..i..".png", - groups = {armor_feet=49+i, armor_heal=3, armor_use=0, armor_fire=0.2*(i+49)}, + groups = {armor_feet=(49+i)*0.1, armor_heal=3, armor_use=0, armor_fire=0.005*(i+49)}, wear = 0, }) minetest.register_tool("3d_armor:uraniumchestplate"..i, { description = "Uraniumchestplate lv."..i.."\nChestplate-lv."..(i+49), inventory_image = "3d_armor_inv_uraniumchestplate"..i..".png", - groups = {armor_torso=49+i, armor_heal=3, armor_use=0, armor_fire=0.2*(i+49)}, + groups = {armor_torso=(49+i)*0.1, armor_heal=3, armor_use=0, armor_fire=0.005*(i+49)}, wear = 0, }) minetest.register_tool("3d_armor:uraniumleggings"..i, { description = "Uraniumleggings lv."..i.."\nLeggings-lv."..(i+49), inventory_image = "3d_armor_inv_uraniumleggings"..i..".png", - groups = {armor_legs=49+i, armor_heal=3, armor_use=0,armor_fire=0.2*(i+49)}, + groups = {armor_legs=(49+i)*0.1, armor_heal=3, armor_use=0,armor_fire=0.005*(i+49)}, wear = 0, }) minetest.register_tool("3d_armor:uraniumhelmet"..i, { description = "Uraniumhelmet lv."..i.."\nHelmet-lv."..(i+49), inventory_image = "3d_armor_inv_uraniumhelmet"..i..".png", - groups = {armor_head=49+i, armor_heal=3, armor_use=0,armor_fire=0.2*(i+49)}, + groups = {armor_head=(49+i)*0.1, armor_heal=3, armor_use=0,armor_fire=0.005*(i+49)}, wear = 0, }) end @@ -130,25 +130,25 @@ for i=1,12 do minetest.register_tool("3d_armor:energyboots"..i, { description = "Energyboots lv."..i.."\nBoots-lv."..(i+51), inventory_image = "3d_armor_inv_energyboots"..i..".png", - groups = {armor_feet=51+i, armor_heal=4, armor_use=0, armor_fire=0.2*(i+51)}, + groups = {armor_feet=(51+i)*0.1, armor_heal=4, armor_use=0, armor_fire=0.005*(i+51)}, wear = 0, }) minetest.register_tool("3d_armor:energychestplate"..i, { description = "Energychestplate lv."..i.."\nChestplate-lv."..(i+51), inventory_image = "3d_armor_inv_energychestplate"..i..".png", - groups = {armor_torso=51+i, armor_heal=4, armor_use=0, armor_fire=0.2*(i+51)}, + groups = {armor_torso=(51+i)*0.1, armor_heal=4, armor_use=0, armor_fire=0.005*(i+51)}, wear = 0, }) minetest.register_tool("3d_armor:energyleggings"..i, { description = "Energyleggings lv."..i.."\nLeggings-lv."..(i+51), inventory_image = "3d_armor_inv_energyleggings"..i..".png", - groups = {armor_legs=51+i, armor_heal=4, armor_use=0,armor_fire=0.2*(i+51)}, + groups = {armor_legs=(51+i)*0.1, armor_heal=4, armor_use=0,armor_fire=0.005*(i+51)}, wear = 0, }) minetest.register_tool("3d_armor:energyhelmet"..i, { description = "Energyhelmet lv."..i.."\nHelmet-lv."..(i+51), inventory_image = "3d_armor_inv_energyhelmet"..i..".png", - groups = {armor_head=51+i, armor_heal=4, armor_use=0,armor_fire=0.2*(i+51)}, + groups = {armor_head=(51+i)*0.1, armor_heal=4, armor_use=0,armor_fire=0.005*(i+51)}, wear = 0, }) end @@ -156,25 +156,25 @@ for i=1,7 do minetest.register_tool("3d_armor:superenergyboots"..i, { description = "Superenergyboots lv."..i.."\nBoots-lv."..(i+63), inventory_image = "3d_armor_inv_superenergyboots"..i..".png", - groups = {armor_feet=63+i, armor_heal=5, armor_use=0, armor_fire=0.2*(i+63)}, + groups = {armor_feet=(63+i)*0.1, armor_heal=5, armor_use=0, armor_fire=0.005*(i+63)}, wear = 0, }) minetest.register_tool("3d_armor:superenergychestplate"..i, { description = "Superenergychestplate lv."..i.."\nChestplate-lv."..(i+63), inventory_image = "3d_armor_inv_superenergychestplate"..i..".png", - groups = {armor_torso=63+i, armor_heal=5, armor_use=0, armor_fire=0.2*(i+63)}, + groups = {armor_torso=(63+i)*0.1, armor_heal=5, armor_use=0, armor_fire=0.005*(i+63)}, wear = 0, }) minetest.register_tool("3d_armor:superenergyleggings"..i, { description = "Superenergyleggings lv."..i.."\nLeggings-lv."..(i+63), inventory_image = "3d_armor_inv_superenergyleggings"..i..".png", - groups = {armor_legs=63+i, armor_heal=5, armor_use=0,armor_fire=0.2*(i+63)}, + groups = {armor_legs=(63+i)*0.1, armor_heal=5, armor_use=0,armor_fire=0.005*(i+63)}, wear = 0, }) minetest.register_tool("3d_armor:superenergyhelmet"..i, { description = "Superenergyhelmet lv."..i.."\nHelmet-lv."..(i+63), inventory_image = "3d_armor_inv_superenergyhelmet"..i..".png", - groups = {armor_head=63+i, armor_heal=5, armor_use=0,armor_fire=0.2*(i+63)}, + groups = {armor_head=(63+i)*0.1, armor_heal=5, armor_use=0,armor_fire=0.005*(i+63)}, wear = 0, }) end @@ -182,25 +182,25 @@ for i=1,5 do minetest.register_tool("3d_armor:kristallboots"..i, { description = "Crystalboots lv."..i.."\nBoots-lv."..(i+70), inventory_image = "3d_armor_inv_kristallboots"..i..".png", - groups = {armor_feet=70+i, armor_heal=6, armor_use=0, armor_fire=0.2*(i+70)}, + groups = {armor_feet=(70+i)*0.1, armor_heal=6, armor_use=0, armor_fire=0.005*(i+70)}, wear = 0, }) minetest.register_tool("3d_armor:kristallchestplate"..i, { description = "Crystalchestplate lv."..i.."\nChestplate-lv."..(i+70), inventory_image = "3d_armor_inv_kristallchestplate"..i..".png", - groups = {armor_torso=70+i, armor_heal=6, armor_use=0, armor_fire=0.2*(i+70)}, + groups = {armor_torso=(70+i)*0.1, armor_heal=6, armor_use=0, armor_fire=0.005*(i+70)}, wear = 0, }) minetest.register_tool("3d_armor:kristallleggings"..i, { description = "Crystalleggings lv."..i.."\nLeggings-lv."..(i+70), inventory_image = "3d_armor_inv_kristallleggings"..i..".png", - groups = {armor_legs=70+i, armor_heal=6, armor_use=0,armor_fire=0.2*(i+70)}, + groups = {armor_legs=(70+i)*0.1, armor_heal=6, armor_use=0,armor_fire=0.005*(i+70)}, wear = 0, }) minetest.register_tool("3d_armor:kristallhelmet"..i, { description = "Crystalhelmet lv."..i.."\nHelmet-lv."..(i+70), inventory_image = "3d_armor_inv_kristallhelmet"..i..".png", - groups = {armor_head=70+i, armor_heal=6, armor_use=0,armor_fire=0.2*(i+70)}, + groups = {armor_head=(70+i)*0.1, armor_heal=6, armor_use=0,armor_fire=0.005*(i+70)}, wear = 0, }) end @@ -208,75 +208,75 @@ for i=1,25 do minetest.register_tool("3d_armor:ultraboots"..i, { description = "Ultraboots lv."..i.."\nBoots-lv."..(i+75), inventory_image = "3d_armor_inv_ultraboots"..i..".png", - groups = {armor_feet=75+i, armor_heal=7, armor_use=0, armor_fire=0.2*(i+75)}, + groups = {armor_feet=(75+i)*0.1, armor_heal=7, armor_use=0, armor_fire=0.005*(i+75)}, wear = 0, }) minetest.register_tool("3d_armor:ultrachestplate"..i, { description = "Ultrachestplate lv."..i.."\nChestplate-lv."..(i+75), inventory_image = "3d_armor_inv_ultrachestplate"..i..".png", - groups = {armor_torso=75+i, armor_heal=7, armor_use=0, armor_fire=0.2*(i+75)}, + groups = {armor_torso=(75+i)*0.1, armor_heal=7, armor_use=0, armor_fire=0.005*(i+75)}, wear = 0, }) minetest.register_tool("3d_armor:ultraleggings"..i, { description = "Ultraleggings lv."..i.."\nLeggings-lv."..(i+75), inventory_image = "3d_armor_inv_ultraleggings"..i..".png", - groups = {armor_legs=75+i, armor_heal=7, armor_use=0,armor_fire=0.2*(i+75)}, + groups = {armor_legs=(75+i)*0.1, armor_heal=7, armor_use=0,armor_fire=0.005*(i+75)}, wear = 0, }) minetest.register_tool("3d_armor:ultrahelmet"..i, { description = "Ultrahelmet lv."..i.."\nHelmet-lv."..(i+75), inventory_image = "3d_armor_inv_ultrahelmet"..i..".png", - groups = {armor_head=75+i, armor_heal=7, armor_use=0,armor_fire=0.2*(i+75)}, + groups = {armor_head=(75+i)*0.1, armor_heal=7, armor_use=0,armor_fire=0.005*(i+75)}, wear = 0, }) end minetest.register_tool("3d_armor:superultraboots", { description = "Superultraboots\nBoots-lv.101", inventory_image = "3d_armor_inv_superultraboots.png", - groups = {armor_feet=101, armor_heal=8, armor_use=0,armor_fire=20.2}, + groups = {armor_feet=10.1, armor_heal=8, armor_use=0,armor_fire=0.505}, wear = 0, }) minetest.register_tool("3d_armor:superultrachestplate", { description = "Superultrachestplate\nChestplate-lv.101", inventory_image = "3d_armor_inv_superultrachestplate.png", - groups = {armor_torso=101, armor_heal=8, armor_use=0, armor_fire=20.2}, + groups = {armor_torso=10.1, armor_heal=8, armor_use=0, armor_fire=0.505}, wear = 0, }) minetest.register_tool("3d_armor:superultrahelmet", { description = "Superultrahelmet\nHelmet-lv.101", inventory_image = "3d_armor_inv_superultrahelmet.png", - groups = {armor_head=101, armor_heal=8, armor_use=0,armor_fire=20.2}, + groups = {armor_head=10.1, armor_heal=8, armor_use=0,armor_fire=0.505}, wear = 0, }) minetest.register_tool("3d_armor:superultraleggings", { description = "Superultraleggings\nLeggings-lv.101", inventory_image = "3d_armor_inv_superultraleggings.png", - groups = {armor_legs=101, armor_heal=8, armor_use=0,armor_fire=20.2}, + groups = {armor_legs=10.1, armor_heal=8, armor_use=0,armor_fire=0.505}, wear = 0, }) for i=1,4 do minetest.register_tool("3d_armor:arenaboots"..i, { description = "Arenaboots lv."..i.."\nBoots-lv."..(i+101), inventory_image = "3d_armor_inv_arenaboots"..i..".png", - groups = {armor_feet=101+i, armor_heal=9, armor_use=0, armor_fire=0.2*(i+101)}, + groups = {armor_feet=(101+i)*0.1, armor_heal=9, armor_use=0, armor_fire=0.005*(i+101)}, wear = 0, }) minetest.register_tool("3d_armor:arenachestplate"..i, { description = "Arenachestplate lv."..i.."\nChestplate-lv."..(i+101), inventory_image = "3d_armor_inv_arenachestplate"..i..".png", - groups = {armor_torso=101+i, armor_heal=9, armor_use=0, armor_fire=0.2*(i+101)}, + groups = {armor_torso=(101+i)*0.1, armor_heal=9, armor_use=0, armor_fire=0.005*(i+101)}, wear = 0, }) minetest.register_tool("3d_armor:arenaleggings"..i, { description = "Arenaleggings lv."..i.."\nLeggings-lv."..(i+101), inventory_image = "3d_armor_inv_arenaleggings"..i..".png", - groups = {armor_legs=101+i, armor_heal=9, armor_use=0,armor_fire=0.2*(i+101)}, + groups = {armor_legs=(101+i)*0.1, armor_heal=9, armor_use=0,armor_fire=0.005*(i+101)}, wear = 0, }) minetest.register_tool("3d_armor:arenahelmet"..i, { description = "Arenahelmet lv."..i.."\nHelmet-lv."..(i+101), inventory_image = "3d_armor_inv_arenahelmet"..i..".png", - groups = {armor_head=101+i, armor_heal=9, armor_use=0,armor_fire=0.2*(i+101)}, + groups = {armor_head=(101+i)*0.1, armor_heal=9, armor_use=0,armor_fire=0.005*(i+101)}, wear = 0, }) end @@ -284,25 +284,25 @@ for i=1,10 do minetest.register_tool("3d_armor:titanboots"..i, { description = "Titanboots lv."..i.."\nBoots-lv."..(i+105), inventory_image = "3d_armor_inv_titanboots"..i..".png", - groups = {armor_feet=105+i, armor_heal=10, armor_use=0, armor_fire=0.2*(i+105)}, + groups = {armor_feet=(105+i)*0.1, armor_heal=10, armor_use=0, armor_fire=0.005*(i+105)}, wear = 0, }) minetest.register_tool("3d_armor:titanchestplate"..i, { description = "Titanchestplate lv."..i.."\nChestplate-lv."..(i+105), inventory_image = "3d_armor_inv_titanchestplate"..i..".png", - groups = {armor_torso=105+i, armor_heal=10, armor_use=0, armor_fire=0.2*(i+105)}, + groups = {armor_torso=(105+i)*0.1, armor_heal=10, armor_use=0, armor_fire=0.005*(i+105)}, wear = 0, }) minetest.register_tool("3d_armor:titanleggings"..i, { description = "Titanleggings lv."..i.."\nLeggings-lv."..(i+105), inventory_image = "3d_armor_inv_titanleggings"..i..".png", - groups = {armor_legs=105+i, armor_heal=10, armor_use=0,armor_fire=0.2*(i+105)}, + groups = {armor_legs=(105+i)*0.1, armor_heal=10, armor_use=0,armor_fire=0.005*(i+105)}, wear = 0, }) minetest.register_tool("3d_armor:titanhelmet"..i, { description = "Titanhelmet lv."..i.."\nHelmet-lv."..(i+105), inventory_image = "3d_armor_inv_titanhelmet"..i..".png", - groups = {armor_head=105+i, armor_heal=10, armor_use=0,armor_fire=0.2*(i+105)}, + groups = {armor_head=(105+i)*0.1, armor_heal=10, armor_use=0,armor_fire=0.005*(i+105)}, wear = 0, }) end @@ -310,25 +310,25 @@ for i=1,6 do minetest.register_tool("3d_armor:legendenboots"..i, { description = "Legendboots lv."..i.."\nBoots-lv."..(i+115), inventory_image = "3d_armor_inv_legendenboots"..i..".png", - groups = {armor_feet=115+i, armor_heal=11, armor_use=0, armor_fire=0.2*(i+115)}, + groups = {armor_feet=(115+i)*0.1, armor_heal=11, armor_use=0, armor_fire=0.005*(i+115)}, wear = 0, }) minetest.register_tool("3d_armor:legendenchestplate"..i, { description = "Legendchestplate lv."..i.."\nChestplate-lv."..(i+115), inventory_image = "3d_armor_inv_legendenchestplate"..i..".png", - groups = {armor_torso=115+i, armor_heal=11, armor_use=0, armor_fire=0.2*(i+115)}, + groups = {armor_torso=(115+i)*0.1, armor_heal=11, armor_use=0, armor_fire=0.005*(i+115)}, wear = 0, }) minetest.register_tool("3d_armor:legendenleggings"..i, { description = "Legendleggings lv."..i.."\nLeggings-lv."..(i+115), inventory_image = "3d_armor_inv_legendenleggings"..i..".png", - groups = {armor_legs=115+i, armor_heal=11, armor_use=0,armor_fire=0.2*(i+115)}, + groups = {armor_legs=(115+i)*0.1, armor_heal=11, armor_use=0,armor_fire=0.005*(i+115)}, wear = 0, }) minetest.register_tool("3d_armor:legendenhelmet"..i, { description = "Legendhelmet lv."..i.."\nHelmet-lv."..(i+115), inventory_image = "3d_armor_inv_legendenhelmet"..i..".png", - groups = {armor_head=115+i, armor_heal=11, armor_use=0,armor_fire=0.2*(i+115)}, + groups = {armor_head=(115+i)*0.1, armor_heal=11, armor_use=0,armor_fire=0.005*(i+115)}, wear = 0, }) end @@ -339,7 +339,7 @@ end minetest.register_tool("3d_armor:superlegendenboots", { description = "Superlegendboots Mode 1 (no speed and no jump)\nBoots-lv.122", inventory_image = "3d_armor_inv_superlegendenboots.png^technic_tool_mode1.png", - groups = {armor_feet=122, armor_heal=12, armor_use=0,armor_fire=24.4}, + groups = {armor_feet=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_superlegendenboots.png", on_use = function(itemstack, user, pointed_thing) @@ -353,7 +353,7 @@ minetest.register_tool("3d_armor:superlegendenboots", { minetest.register_tool("3d_armor:superlegendenboots2", { description = "Superlegendboots Mode 2 (speed and no jump)\nBoots-lv.122", inventory_image = "3d_armor_inv_superlegendenboots.png^technic_tool_mode2.png", - groups = {armor_feet=122, armor_heal=12, armor_use=0,armor_fire=24.4, physics_speed=0.25}, + groups = {armor_feet=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_speed=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_superlegendenboots.png", on_use = function(itemstack, user, pointed_thing) @@ -367,7 +367,7 @@ minetest.register_tool("3d_armor:superlegendenboots2", { minetest.register_tool("3d_armor:superlegendenboots3", { description = "Superlegendboots Mode 3 (no speed and jump)\nBoots-lv.122", inventory_image = "3d_armor_inv_superlegendenboots.png^technic_tool_mode3.png", - groups = {armor_feet=122, armor_heal=12, armor_use=0,armor_fire=24.4, physics_jump=0.25}, + groups = {armor_feet=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_jump=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_superlegendenboots.png", on_use = function(itemstack, user, pointed_thing) @@ -381,7 +381,7 @@ minetest.register_tool("3d_armor:superlegendenboots3", { minetest.register_tool("3d_armor:superlegendenboots4", { description = "Superlegendboots Mode 4 (speed and jump)\nBoots-lv.122", inventory_image = "3d_armor_inv_superlegendenboots.png^technic_tool_mode4.png", - groups = {armor_feet=122, armor_heal=12, armor_use=0,armor_fire=24.4, physics_jump=0.25, physics_speed=0.25}, + 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}, wear = 0, wield_image = "3d_armor_inv_superlegendenboots.png", on_use = function(itemstack, user, pointed_thing) @@ -396,7 +396,7 @@ minetest.register_tool("3d_armor:superlegendenboots4", { minetest.register_tool("3d_armor:superlegendenchestplate", { description = "Superlegendchestplate Mode 1 (no speed and no jump)\nChestplate-lv.122", inventory_image = "3d_armor_inv_superlegendenchestplate.png^technic_tool_mode1.png", - groups = {armor_torso=122, armor_heal=12, armor_use=0, armor_fire=24.4}, + groups = {armor_torso=12.2, armor_heal=12, armor_use=0, armor_fire=0.61, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_superlegendenchestplate.png", on_use = function(itemstack, user, pointed_thing) @@ -410,7 +410,7 @@ minetest.register_tool("3d_armor:superlegendenchestplate", { minetest.register_tool("3d_armor:superlegendenchestplate2", { description = "Superlegendchestplate Mode 2 (speed and no jump)\nChestplate-lv.122", inventory_image = "3d_armor_inv_superlegendenchestplate.png^technic_tool_mode2.png", - groups = {armor_torso=122, armor_heal=12, armor_use=0, armor_fire=24.4, physics_speed=0.25}, + groups = {armor_torso=12.2, armor_heal=12, armor_use=0, armor_fire=0.61, physics_speed=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_superlegendenchestplate.png", on_use = function(itemstack, user, pointed_thing) @@ -424,7 +424,7 @@ minetest.register_tool("3d_armor:superlegendenchestplate2", { minetest.register_tool("3d_armor:superlegendenchestplate3", { description = "Superlegendchestplate Mode 3 (no speed and jump)\nChestplate-lv.122", inventory_image = "3d_armor_inv_superlegendenchestplate.png^technic_tool_mode3.png", - groups = {armor_torso=122, armor_heal=12, armor_use=0, armor_fire=24.4, physics_jump=0.25}, + groups = {armor_torso=12.2, armor_heal=12, armor_use=0, armor_fire=0.61, physics_jump=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_superlegendenchestplate.png", on_use = function(itemstack, user, pointed_thing) @@ -438,7 +438,7 @@ minetest.register_tool("3d_armor:superlegendenchestplate3", { minetest.register_tool("3d_armor:superlegendenchestplate4", { description = "Superlegendchestplate Mode 4 (speed and jump)\nChestplate-lv.122", inventory_image = "3d_armor_inv_superlegendenchestplate.png^technic_tool_mode4.png", - groups = {armor_torso=122, armor_heal=12, armor_use=0, armor_fire=24.4, physics_jump=0.25, physics_speed=0.25}, + 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}, wear = 0, wield_image = "3d_armor_inv_superlegendenchestplate.png", on_use = function(itemstack, user, pointed_thing) @@ -453,7 +453,7 @@ minetest.register_tool("3d_armor:superlegendenchestplate4", { minetest.register_tool("3d_armor:superlegendenhelmet", { description = "Superlegendhelmet Mode 1 (no speed and no jump)\nHelmet-lv.122", inventory_image = "3d_armor_inv_superlegendenhelmet.png^technic_tool_mode1.png", - groups = {armor_head=122, armor_heal=12, armor_use=0,armor_fire=24.4}, + groups = {armor_head=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_superlegendenhelmet.png", on_use = function(itemstack, user, pointed_thing) @@ -467,7 +467,7 @@ minetest.register_tool("3d_armor:superlegendenhelmet", { minetest.register_tool("3d_armor:superlegendenhelmet2", { description = "Superlegendhelmet Mode 2 (speed and no jump)\nHelmet-lv.122", inventory_image = "3d_armor_inv_superlegendenhelmet.png^technic_tool_mode2.png", - groups = {armor_head=122, armor_heal=12, armor_use=0,armor_fire=24.4, physics_speed=0.25}, + groups = {armor_head=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_speed=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_superlegendenhelmet.png", on_use = function(itemstack, user, pointed_thing) @@ -481,7 +481,7 @@ minetest.register_tool("3d_armor:superlegendenhelmet2", { minetest.register_tool("3d_armor:superlegendenhelmet3", { description = "Superlegendhelmet Mode 3 (no speed and jump)\nHelmet-lv.122", inventory_image = "3d_armor_inv_superlegendenhelmet.png^technic_tool_mode3.png", - groups = {armor_head=122, armor_heal=12, armor_use=0,armor_fire=24.4, physics_jump=0.25}, + groups = {armor_head=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_jump=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_superlegendenhelmet.png", on_use = function(itemstack, user, pointed_thing) @@ -495,7 +495,7 @@ minetest.register_tool("3d_armor:superlegendenhelmet3", { minetest.register_tool("3d_armor:superlegendenhelmet4", { description = "Superlegendhelmet Mode 4 (speed and jump)\nHelmet-lv.122", inventory_image = "3d_armor_inv_superlegendenhelmet.png^technic_tool_mode4.png", - groups = {armor_head=122, armor_heal=12, armor_use=0,armor_fire=24.4, physics_jump=0.25, physics_speed=0.25}, + 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}, wear = 0, wield_image = "3d_armor_inv_superlegendenhelmet.png", on_use = function(itemstack, user, pointed_thing) @@ -510,7 +510,7 @@ minetest.register_tool("3d_armor:superlegendenhelmet4", { minetest.register_tool("3d_armor:superlegendenleggings", { description = "Superlegendleggings Mode 1 (no speed and no jump)\nLeggings-lv.122", inventory_image = "3d_armor_inv_superlegendenleggings.png^technic_tool_mode1.png", - groups = {armor_legs=122, armor_heal=12, armor_use=0,armor_fire=24.4}, + groups = {armor_legs=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_superlegendenleggings.png", on_use = function(itemstack, user, pointed_thing) @@ -524,7 +524,7 @@ minetest.register_tool("3d_armor:superlegendenleggings", { minetest.register_tool("3d_armor:superlegendenleggings2", { description = "Superlegendleggings Mode 2 (speed and no jump)\nLeggings-lv.122", inventory_image = "3d_armor_inv_superlegendenleggings.png^technic_tool_mode2.png", - groups = {armor_legs=122, armor_heal=12, armor_use=0,armor_fire=24.4, physics_speed=0.25}, + groups = {armor_legs=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_speed=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_superlegendenleggings.png", on_use = function(itemstack, user, pointed_thing) @@ -538,7 +538,7 @@ minetest.register_tool("3d_armor:superlegendenleggings2", { minetest.register_tool("3d_armor:superlegendenleggings3", { description = "Superlegendleggings Mode 3 (no speed and jump)\nLeggings-lv.122", inventory_image = "3d_armor_inv_superlegendenleggings.png^technic_tool_mode3.png", - groups = {armor_legs=122, armor_heal=12, armor_use=0,armor_fire=24.4, physics_jump=0.25}, + groups = {armor_legs=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_jump=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_superlegendenleggings.png", on_use = function(itemstack, user, pointed_thing) @@ -552,7 +552,7 @@ minetest.register_tool("3d_armor:superlegendenleggings3", { minetest.register_tool("3d_armor:superlegendenleggings4", { description = "Superlegendleggings Mode 4 (speed and jump)\nLeggings-lv.122", inventory_image = "3d_armor_inv_superlegendenleggings.png^technic_tool_mode4.png", - groups = {armor_legs=122, armor_heal=12, armor_use=0,armor_fire=24.4, physics_jump=0.25, physics_speed=0.25}, + 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}, wear = 0, wield_image = "3d_armor_inv_superlegendenleggings.png", on_use = function(itemstack, user, pointed_thing) @@ -568,7 +568,7 @@ minetest.register_tool("3d_armor:superlegendenleggings4", { minetest.register_tool("3d_armor:regnumboots", { description = "Regnumboots Mode 1 (no speed and no jump)\nBoots-lv.MAX", inventory_image = "3d_armor_inv_regnumboots.png^technic_tool_mode1.png", - groups = {armor_feet=150, armor_heal=15, armor_use=0,armor_fire=30}, + groups = {armor_feet=15.0, armor_heal=15, armor_use=0,armor_fire=1, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumboots.png", on_use = function(itemstack, user, pointed_thing) @@ -582,7 +582,7 @@ minetest.register_tool("3d_armor:regnumboots", { minetest.register_tool("3d_armor:regnumboots2", { description = "Regnumboots Mode 2 (speed and no jump)\nBoots-lv.MAX", inventory_image = "3d_armor_inv_regnumboots.png^technic_tool_mode2.png", - groups = {armor_feet=150, armor_heal=15, armor_use=0,armor_fire=30, physics_speed=0.25}, + groups = {armor_feet=15.0, armor_heal=15, armor_use=0,armor_fire=1, physics_speed=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumboots.png", on_use = function(itemstack, user, pointed_thing) @@ -596,7 +596,7 @@ minetest.register_tool("3d_armor:regnumboots2", { minetest.register_tool("3d_armor:regnumboots3", { description = "Regnumboots Mode 3 (no speed and jump)\nBoots-lv.MAX", inventory_image = "3d_armor_inv_regnumboots.png^technic_tool_mode3.png", - groups = {armor_feet=150, armor_heal=15, armor_use=0,armor_fire=30, physics_jump=0.25}, + groups = {armor_feet=15.0, armor_heal=15, armor_use=0,armor_fire=1, physics_jump=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumboots.png", on_use = function(itemstack, user, pointed_thing) @@ -610,7 +610,7 @@ minetest.register_tool("3d_armor:regnumboots3", { minetest.register_tool("3d_armor:regnumboots4", { description = "Regnumboots Mode 4 (speed and jump)\nBoots-lv.MAX", inventory_image = "3d_armor_inv_regnumboots.png^technic_tool_mode4.png", - groups = {armor_feet=150, armor_heal=15, armor_use=0,armor_fire=30, physics_jump=0.25, physics_speed=0.25}, + groups = {armor_feet=15.0, armor_heal=15, armor_use=0,armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumboots.png", on_use = function(itemstack, user, pointed_thing) @@ -625,7 +625,7 @@ minetest.register_tool("3d_armor:regnumboots4", { minetest.register_tool("3d_armor:regnumchestplate", { description = "Regnumchestplate Mode 1 (no speed and no jump)\nChestplate-lv.MAX", inventory_image = "3d_armor_inv_regnumchestplate.png^technic_tool_mode1.png", - groups = {armor_torso=150, armor_heal=15, armor_use=0, armor_fire=30}, + groups = {armor_torso=15.0, armor_heal=15, armor_use=0, armor_fire=1, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumchestplate.png", on_use = function(itemstack, user, pointed_thing) @@ -639,7 +639,7 @@ minetest.register_tool("3d_armor:regnumchestplate", { minetest.register_tool("3d_armor:regnumchestplate2", { description = "Regnumchestplate Mode 2 (speed and no jump)\nChestplate-lv.MAX", inventory_image = "3d_armor_inv_regnumchestplate.png^technic_tool_mode2.png", - groups = {armor_torso=150, armor_heal=15, armor_use=0, armor_fire=30, physics_speed=0.25}, + groups = {armor_torso=15.0, armor_heal=15, armor_use=0, armor_fire=1, physics_speed=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumchestplate.png", on_use = function(itemstack, user, pointed_thing) @@ -653,7 +653,7 @@ minetest.register_tool("3d_armor:regnumchestplate2", { minetest.register_tool("3d_armor:regnumchestplate3", { description = "Regnumchestplate Mode 3 (no speed and jump)\nChestplate-lv.MAX", inventory_image = "3d_armor_inv_regnumchestplate.png^technic_tool_mode3.png", - groups = {armor_torso=150, armor_heal=15, armor_use=0, armor_fire=30, physics_jump=0.25}, + groups = {armor_torso=15.0, armor_heal=15, armor_use=0, armor_fire=1, physics_jump=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumchestplate.png", on_use = function(itemstack, user, pointed_thing) @@ -667,7 +667,7 @@ minetest.register_tool("3d_armor:regnumchestplate3", { minetest.register_tool("3d_armor:regnumchestplate4", { description = "Regnumchestplate Mode 4 (speed and jump)\nChestplate-lv.MAX", inventory_image = "3d_armor_inv_regnumchestplate.png^technic_tool_mode4.png", - groups = {armor_torso=150, armor_heal=15, armor_use=0, armor_fire=30, physics_jump=0.25, physics_speed=0.25}, + groups = {armor_torso=15.0, armor_heal=15, armor_use=0, armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumchestplate.png", on_use = function(itemstack, user, pointed_thing) @@ -682,7 +682,7 @@ minetest.register_tool("3d_armor:regnumchestplate4", { minetest.register_tool("3d_armor:regnumhelmet", { description = "Regnumhelmet Mode 1 (no speed and no jump)\nHelmet-lv.MAX", inventory_image = "3d_armor_inv_regnumhelmet.png^technic_tool_mode1.png", - groups = {armor_head=150, armor_heal=15, armor_use=0,armor_fire=30}, + groups = {armor_head=15.0, armor_heal=15, armor_use=0,armor_fire=1, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumhelmet.png", on_use = function(itemstack, user, pointed_thing) @@ -696,7 +696,7 @@ minetest.register_tool("3d_armor:regnumhelmet", { minetest.register_tool("3d_armor:regnumhelmet2", { description = "Regnumhelmet Mode 2 (speed and no jump)\nHelmet-lv.MAX", inventory_image = "3d_armor_inv_regnumhelmet.png^technic_tool_mode2.png", - groups = {armor_head=150, armor_heal=15, armor_use=0,armor_fire=30, physics_speed=0.25}, + groups = {armor_head=15.0, armor_heal=15, armor_use=0,armor_fire=1, physics_speed=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumhelmet.png", on_use = function(itemstack, user, pointed_thing) @@ -710,7 +710,7 @@ minetest.register_tool("3d_armor:regnumhelmet2", { minetest.register_tool("3d_armor:regnumhelmet3", { description = "Regnumhelmet Mode 3 (no speed and jump)\nHelmet-lv.MAX", inventory_image = "3d_armor_inv_regnumhelmet.png^technic_tool_mode3.png", - groups = {armor_head=150, armor_heal=15, armor_use=0,armor_fire=30, physics_jump=0.25}, + groups = {armor_head=15.0, armor_heal=15, armor_use=0,armor_fire=1, physics_jump=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumhelmet.png", on_use = function(itemstack, user, pointed_thing) @@ -724,7 +724,7 @@ minetest.register_tool("3d_armor:regnumhelmet3", { minetest.register_tool("3d_armor:regnumhelmet4", { description = "Regnumhelmet Mode 4 (speed and jump)\nHelmet-lv.MAX", inventory_image = "3d_armor_inv_regnumhelmet.png^technic_tool_mode4.png", - groups = {armor_head=150, armor_heal=15, armor_use=0,armor_fire=30, physics_jump=0.25, physics_speed=0.25}, + groups = {armor_head=15.0, armor_heal=15, armor_use=0,armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumhelmet.png", on_use = function(itemstack, user, pointed_thing) @@ -739,7 +739,7 @@ minetest.register_tool("3d_armor:regnumhelmet4", { minetest.register_tool("3d_armor:regnumleggings", { description = "Regnumleggings Mode 1 (no speed and no jump)\nLeggings-lv.MAX", inventory_image = "3d_armor_inv_regnumleggings.png^technic_tool_mode1.png", - groups = {armor_legs=150, armor_heal=15, armor_use=0,armor_fire=30}, + groups = {armor_legs=15.0, armor_heal=15, armor_use=0,armor_fire=1, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumleggings.png", on_use = function(itemstack, user, pointed_thing) @@ -753,7 +753,7 @@ minetest.register_tool("3d_armor:regnumleggings", { minetest.register_tool("3d_armor:regnumleggings2", { description = "Regnumleggings Mode 2 (speed and no jump)\nLeggings-lv.MAX", inventory_image = "3d_armor_inv_regnumleggings.png^technic_tool_mode2.png", - groups = {armor_legs=150, armor_heal=15, armor_use=0,armor_fire=30, physics_speed=0.25}, + groups = {armor_legs=15.0, armor_heal=15, armor_use=0,armor_fire=1, physics_speed=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumleggings.png", on_use = function(itemstack, user, pointed_thing) @@ -767,7 +767,7 @@ minetest.register_tool("3d_armor:regnumleggings2", { minetest.register_tool("3d_armor:regnumleggings3", { description = "Regnumleggings Mode 3 (no speed and jump)\nLeggings-lv.MAX", inventory_image = "3d_armor_inv_regnumleggings.png^technic_tool_mode3.png", - groups = {armor_legs=150, armor_heal=15, armor_use=0,armor_fire=30, physics_jump=0.25}, + groups = {armor_legs=15.0, armor_heal=15, armor_use=0,armor_fire=1, physics_jump=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumleggings.png", on_use = function(itemstack, user, pointed_thing) @@ -781,7 +781,7 @@ minetest.register_tool("3d_armor:regnumleggings3", { minetest.register_tool("3d_armor:regnumleggings4", { description = "Regnumleggings Mode 4 (speed and jump)\nLeggings-lv.MAX", inventory_image = "3d_armor_inv_regnumleggings.png^technic_tool_mode4.png", - groups = {armor_legs=150, armor_heal=15, armor_use=0,armor_fire=30, physics_jump=0.25, physics_speed=0.25}, + groups = {armor_legs=15.0, armor_heal=15, armor_use=0,armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2}, wear = 0, wield_image = "3d_armor_inv_regnumleggings.png", on_use = function(itemstack, user, pointed_thing) diff --git a/mods/3d_armor/3d_armor_ip/LICENSE.txt b/mods/3d_armor/3d_armor_ip/LICENSE.txt new file mode 100644 index 0000000..96ff8c3 --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/LICENSE.txt @@ -0,0 +1,5 @@ +[mod] 3d Armor integration to inventory plus [3d_armor_ip] +========================================================== + +License Source Code: (C) 2012-2018 Stuart Jones - LGPL v2.1 + diff --git a/mods/3d_armor/3d_armor_ip/depends.txt b/mods/3d_armor/3d_armor_ip/depends.txt new file mode 100644 index 0000000..e96293b --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/depends.txt @@ -0,0 +1,2 @@ +3d_armor +inventory_plus? diff --git a/mods/3d_armor/3d_armor_ip/description.txt b/mods/3d_armor/3d_armor_ip/description.txt new file mode 100644 index 0000000..01e1b54 --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/description.txt @@ -0,0 +1 @@ +Adds 3d_armor page to the inventory plus diff --git a/mods/3d_armor/3d_armor_ip/init.lua b/mods/3d_armor/3d_armor_ip/init.lua new file mode 100644 index 0000000..23cb98b --- /dev/null +++ b/mods/3d_armor/3d_armor_ip/init.lua @@ -0,0 +1,39 @@ +-- support for i18n +local S = armor_i18n.gettext +local F = armor_i18n.fgettext + +if not minetest.global_exists("inventory_plus") then + minetest.log("warning", S("3d_armor_ip: Mod loaded but unused.")) + return +end + +armor.formspec = "size[10,9.5]button[0,0;2,0.5;inven;"..F("Back").."]".. + "button[2,0;2,0.5;main;"..F("Main").."]"..armor.formspec +armor:register_on_update(function(player) + local name = player:get_player_name() + local formspec = armor:get_armor_formspec(name, true) + local page = player:get_inventory_formspec() + if page:find("detached:"..name.."_armor") then + inventory_plus.set_inventory_formspec(player, formspec) + end +end) + +if minetest.get_modpath("crafting") then + inventory_plus.get_formspec = function(player, page) + end +end + +minetest.register_on_joinplayer(function(player) + inventory_plus.register_button(player,"armor", S("Armor")) +end) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if fields.armor then + local name = armor:get_valid_player(player, "[on_player_receive_fields]") + if not name then + return + end + local formspec = armor:get_armor_formspec(name, true) + inventory_plus.set_inventory_formspec(player, formspec) + end +end) diff --git a/mods/3d_armor/3d_armor_stand/LICENSE.txt b/mods/3d_armor/3d_armor_stand/LICENSE.txt index 5c8246a..82e5de6 100644 --- a/mods/3d_armor/3d_armor_stand/LICENSE.txt +++ b/mods/3d_armor/3d_armor_stand/LICENSE.txt @@ -1,7 +1,22 @@ [mod] 3d Armor Stand [3d_armor_stand] ===================================== -License Source Code: LGPL v2.1 +License Source Code: (C) 2016-2018 Stuart Jones - LGPL v2.1 -Lecense Media: CC BY-SA 3.0 +Lecense Models: (C) 2016-2018 Stuart Jones - CC BY-SA 3.0 +UV model mapping by tobyplowy(aka toby109tt) + +License Textures: + +3d_armor_stand.png +3d_armor_stand_locked.png + +(C) 2017 tobyplowy - CC BY-SA 3.0 + +3d_armor_stand_feet.png +3d_armor_stand_head.png +3d_armor_stand_legs.png +3d_armor_stand_torso.png + +(C) 2016-2017 Stuart Jones - CC BY-SA 3.0 diff --git a/mods/3d_armor/3d_armor_stand/init.lua b/mods/3d_armor/3d_armor_stand/init.lua index d722297..6570270 100644 --- a/mods/3d_armor/3d_armor_stand/init.lua +++ b/mods/3d_armor/3d_armor_stand/init.lua @@ -1,3 +1,6 @@ +-- support for i18n +local S = armor_i18n.gettext + local armor_stand_formspec = "size[8,7]" .. default.gui_bg .. default.gui_bg_img .. @@ -16,6 +19,18 @@ local armor_stand_formspec = "size[8,7]" .. local elements = {"head", "torso", "legs", "feet"} +local function drop_armor(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + for _, element in pairs(elements) do + local stack = inv:get_stack("armor_"..element, 1) + if stack and stack:get_count() > 0 then + armor.drop_armor(pos, stack) + inv:set_stack("armor_"..element, 1, nil) + end + end +end + local function get_stand_object(pos) local object = nil local objects = minetest.get_objects_inside_radius(pos, 0.5) or {} @@ -58,8 +73,11 @@ local function update_entity(pos) if stack:get_count() == 1 then local item = stack:get_name() or "" local def = stack:get_definition() or {} - local texture = def.texture or item:gsub("%:", "_") - table.insert(textures, texture..".png") + local groups = def.groups or {} + if groups["armor_"..element] then + local texture = def.texture or item:gsub("%:", "_") + table.insert(textures, texture..".png") + end end end end @@ -81,24 +99,73 @@ local function update_entity(pos) end end +local function has_locked_armor_stand_privilege(meta, player) + local name = "" + if player then + if minetest.check_player_privs(player, "protection_bypass") then + return true + end + name = player:get_player_name() + end + if name ~= meta:get_string("owner") then + return false + end + return true +end + +local function add_hidden_node(pos, player) + local p = {x=pos.x, y=pos.y + 1, z=pos.z} + local name = player:get_player_name() + local node = minetest.get_node(p) + if node.name == "air" and not minetest.is_protected(pos, name) then + minetest.set_node(p, {name="3d_armor_stand:top"}) + end +end + +local function remove_hidden_node(pos) + local p = {x=pos.x, y=pos.y + 1, z=pos.z} + local node = minetest.get_node(p) + if node.name == "3d_armor_stand:top" then + minetest.remove_node(p) + end +end + +minetest.register_node("3d_armor_stand:top", { + description = S("Armor stand top"), + paramtype = "light", + drawtype = "plantlike", + sunlight_propagates = true, + walkable = true, + pointable = false, + diggable = false, + buildable_to = false, + drop = "", + groups = {not_in_creative_inventory = 1}, + on_blast = function() end, + tiles = {"3d_armor_trans.png"}, +}) + minetest.register_node("3d_armor_stand:armor_stand", { - description = "Armor stand", + description = S("Armor stand"), drawtype = "mesh", mesh = "3d_armor_stand.obj", - tiles = {"default_wood.png", "default_steel_block.png"}, + tiles = {"3d_armor_stand.png"}, paramtype = "light", paramtype2 = "facedir", walkable = false, selection_box = { type = "fixed", - fixed = {-0.5,-0.5,-0.5, 0.5,1.4,0.5} + fixed = { + {-0.25, -0.4375, -0.25, 0.25, 1.4, 0.25}, + {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5}, + }, }, groups = {choppy=2, oddly_breakable_by_hand=2}, sounds = default.node_sound_wood_defaults(), on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", armor_stand_formspec) - meta:set_string("infotext", "Armor Stand") + meta:set_string("infotext", S("Armor Stand")) local inv = meta:get_inventory() for _, element in pairs(elements) do inv:set_size("armor_"..element, 1) @@ -114,8 +181,9 @@ minetest.register_node("3d_armor_stand:armor_stand", { end return true end, - after_place_node = function(pos) + after_place_node = function(pos, placer) minetest.add_entity(pos, "3d_armor_stand:armor_entity") + add_hidden_node(pos, placer) end, allow_metadata_inventory_put = function(pos, listname, index, stack) local def = stack:get_definition() or {} @@ -136,81 +204,102 @@ minetest.register_node("3d_armor_stand:armor_stand", { end, after_destruct = function(pos) update_entity(pos) + remove_hidden_node(pos) end, on_blast = function(pos) - local object = get_stand_object(pos) - if object then - object:remove() - end - minetest.after(1, function(pos) - update_entity(pos) - end, pos) + drop_armor(pos) + armor.drop_armor(pos, "3d_armor_stand:armor_stand") + minetest.remove_node(pos) end, }) -local function has_locked_armor_stand_privilege(meta, player) - local name = "" - if player then - if minetest.check_player_privs(player, "protection_bypass") then - return true - end - name = player:get_player_name() - end - if name ~= meta:get_string("owner") then - return false - end - return true -end - -local node = {} -for k,v in pairs(minetest.registered_nodes["3d_armor_stand:armor_stand"]) do - node[k] = v -end -node.description = "Locked " .. node.description -node.allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos) - if not has_locked_armor_stand_privilege(meta, player) then - return 0 - end - local def = stack:get_definition() or {} - local groups = def.groups or {} - if groups[listname] then - return 1 - end - return 0 -end -node.allow_metadata_inventory_take = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos) - if not has_locked_armor_stand_privilege(meta, player) then - return 0 - end - return stack:get_count() -end -node.on_construct = function(pos) +minetest.register_node("3d_armor_stand:locked_armor_stand", { + description = S("Locked Armor stand"), + drawtype = "mesh", + mesh = "3d_armor_stand.obj", + tiles = {"3d_armor_stand_locked.png"}, + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + selection_box = { + type = "fixed", + fixed = { + {-0.25, -0.4375, -0.25, 0.25, 1.4, 0.25}, + {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5}, + }, + }, + groups = {choppy=2, oddly_breakable_by_hand=2}, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", armor_stand_formspec) - meta:set_string("infotext", "Armor Stand") + meta:set_string("infotext", S("Armor Stand")) meta:set_string("owner", "") local inv = meta:get_inventory() for _, element in pairs(elements) do inv:set_size("armor_"..element, 1) end - end -node.after_place_node = function(pos, placer) - minetest.add_entity(pos, "3d_armor_stand:armor_entity") - local meta = minetest.get_meta(pos) - meta:set_string("owner", placer:get_player_name() or "") - meta:set_string("infotext", "Armor Stand (owned by " .. - meta:get_string("owner") .. ")") -end -minetest.register_node("3d_armor_stand:locked_armor_stand", node) + end, + can_dig = function(pos, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + for _, element in pairs(elements) do + if not inv:is_empty("armor_"..element) then + return false + end + end + return true + end, + after_place_node = function(pos, placer) + minetest.add_entity(pos, "3d_armor_stand:armor_entity") + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", S("Armor Stand (owned by @1)", meta:get_string("owner"))) + add_hidden_node(pos, placer) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not has_locked_armor_stand_privilege(meta, player) then + return 0 + end + local def = stack:get_definition() or {} + local groups = def.groups or {} + if groups[listname] then + return 1 + end + return 0 + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not has_locked_armor_stand_privilege(meta, player) then + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_move = function(pos) + return 0 + end, + on_metadata_inventory_put = function(pos) + update_entity(pos) + end, + on_metadata_inventory_take = function(pos) + update_entity(pos) + end, + after_destruct = function(pos) + update_entity(pos) + remove_hidden_node(pos) + end, + on_blast = function(pos) + -- Not affected by TNT + end, +}) minetest.register_entity("3d_armor_stand:armor_entity", { physical = true, visual = "mesh", mesh = "3d_armor_entity.obj", visual_size = {x=1, y=1}, - collisionbox = {-0.1,-0.4,-0.1, 0.1,1.3,0.1}, + collisionbox = {0,0,0,0,0,0}, textures = {"3d_armor_trans.png"}, pos = nil, timer = 0, @@ -221,30 +310,34 @@ minetest.register_entity("3d_armor_stand:armor_entity", { update_entity(pos) end end, - on_step = function(self, dtime) - if not self.pos then - return - end - self.timer = self.timer + dtime - if self.timer > 1 then - self.timer = 0 - local pos = self.object:getpos() - if pos then - if vector.equals(self.pos, pos) then - return - end - end - update_entity(self.pos) + on_blast = function(self, damage) + local drops = {} + local node = minetest.get_node(self.pos) + if node.name == "3d_armor_stand:armor_stand" then + drop_armor(self.pos) self.object:remove() end + return false, false, drops end, }) +minetest.register_abm({ + nodenames = {"3d_armor_stand:locked_armor_stand", "3d_armor_stand:armor_stand"}, + interval = 15, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local num + num = #minetest.get_objects_inside_radius(pos, 0.5) + if num > 0 then return end + update_entity(pos) + end +}) + minetest.register_craft({ output = "3d_armor_stand:armor_stand", recipe = { - {"", "default:fence_wood", ""}, - {"", "default:fence_wood", ""}, + {"", "group:fence", ""}, + {"", "group:fence", ""}, {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, } }) @@ -255,4 +348,3 @@ minetest.register_craft({ {"3d_armor_stand:armor_stand", "default:steel_ingot"}, } }) - diff --git a/mods/3d_armor/3d_armor_stand/models/3d_armor_stand.obj b/mods/3d_armor/3d_armor_stand/models/3d_armor_stand.obj index 89f3793..0df6dc7 100644 --- a/mods/3d_armor/3d_armor_stand/models/3d_armor_stand.obj +++ b/mods/3d_armor/3d_armor_stand/models/3d_armor_stand.obj @@ -1,191 +1,280 @@ -# Blender v2.73 (sub 0) OBJ File: '3d_armor_stand.blend' +# Blender v2.72 (sub 0) OBJ File: '' # www.blender.org mtllib 3d_armor_stand.mtl -o Player_Cube -v 0.062500 1.312500 -0.062500 -v 0.062500 1.312500 0.062500 -v -0.062500 1.312500 -0.062500 -v -0.062500 1.312500 0.062500 -v -0.187500 -0.437504 0.062500 -v -0.187500 -0.437504 -0.062500 -v -0.187500 0.937500 0.062500 -v -0.187500 0.937500 -0.062500 -v -0.250000 0.250000 0.062500 -v -0.250000 0.250000 -0.062500 -v -0.250000 0.125003 0.062500 -v -0.250000 0.125003 -0.062500 -v 0.250000 0.250000 0.062500 -v 0.250000 0.250000 -0.062500 -v 0.250000 0.125003 0.062500 -v 0.250000 0.125003 -0.062500 -v -0.062500 -0.437504 -0.062500 -v -0.062500 -0.437504 0.062500 -v -0.062500 0.937500 0.062500 -v -0.062500 0.937500 -0.062500 -v 0.062500 0.250000 0.062500 -v 0.062500 0.250000 -0.062500 -v 0.187500 0.250000 -0.062500 -v 0.187500 0.250000 0.062500 -v 0.187500 0.937500 -0.062500 -v 0.187500 0.937500 0.062500 -v 0.187500 -0.437504 -0.062500 -v 0.187500 -0.437504 0.062500 -v 0.062500 -0.437504 -0.062500 -v 0.062500 -0.437504 0.062500 -v 0.062500 0.937500 0.062500 -v 0.062500 0.937500 -0.062500 -v -0.062500 0.812500 -0.062500 -v -0.187500 0.812500 -0.062500 -v -0.062500 0.812500 0.062500 -v -0.187500 0.812500 0.062500 -v 0.062500 0.812500 -0.062500 -v 0.187500 0.812500 -0.062500 -v 0.187500 0.812500 0.062500 -v 0.062500 0.812500 0.062500 -v 0.375000 0.812500 0.062500 -v 0.375000 0.812500 -0.062500 -v 0.375000 0.937500 0.062500 -v 0.375000 0.937500 -0.062500 -v 0.500000 -0.437500 -0.500000 -v 0.500000 -0.437500 0.500000 +o Armor_Stand_Player_Cube_Stand +v 0.062500 0.125002 -0.062500 +v 0.062500 -0.437500 -0.062500 +v 0.062500 -0.437500 0.062500 +v 0.062500 0.125002 0.062500 +v -0.187500 0.250004 0.062500 +v -0.187500 0.250004 -0.062500 +v -0.250000 0.250004 -0.062500 +v -0.250000 0.250004 0.062500 +v -0.062500 -0.437500 -0.062500 +v -0.062500 -0.437500 0.062500 +v -0.187500 -0.437500 0.062500 +v -0.187500 -0.437500 -0.062500 +v -0.187500 0.125002 0.062500 +v -0.187500 0.125002 -0.062500 +v -0.187500 0.937504 0.062500 +v -0.187500 0.937504 -0.062500 +v -0.375000 0.937504 -0.062500 +v -0.375000 0.937504 0.062500 +v -0.062500 0.125002 0.062500 +v 0.187500 0.125002 -0.062500 +v 0.187500 -0.437500 -0.062500 +v -0.062500 0.125002 -0.062500 +v -0.250000 0.125007 -0.062500 +v -0.250000 0.125007 0.062500 +v 0.187500 -0.437500 0.062500 +v 0.187500 0.125002 0.062500 +v -0.062500 0.937504 0.062500 +v -0.187500 0.812504 0.062500 +v -0.062500 0.812504 0.062500 +v -0.062500 0.937504 -0.062500 +v 0.187500 0.250004 -0.062500 +v 0.187500 0.250004 0.062500 +v 0.250000 0.250004 0.062500 +v 0.250000 0.250004 -0.062500 +v 0.250000 0.125007 0.062500 +v 0.250000 0.125007 -0.062500 +v 0.187500 0.812504 0.062500 +v 0.187500 0.812504 -0.062500 +v 0.375000 0.812504 -0.062500 +v 0.375000 0.812504 0.062500 +v 0.187500 0.937504 -0.062500 +v 0.187500 0.937504 0.062500 +v 0.375000 0.937504 0.062500 +v 0.375000 0.937504 -0.062500 +v 0.062500 0.937504 -0.062500 +v 0.062500 0.937504 0.062500 +v -0.062500 0.812504 -0.062500 +v -0.187500 0.812504 -0.062500 +v 0.062500 0.812504 -0.062500 +v 0.062500 0.812504 0.062500 +v -0.375000 0.812504 -0.062500 +v -0.375000 0.812504 0.062500 +v -0.062500 0.250004 0.062500 +v 0.062500 0.250004 0.062500 +v 0.062500 0.250004 -0.062500 +v -0.062500 0.250004 -0.062500 +v -0.062500 1.312504 -0.062500 +v 0.062500 1.312504 -0.062500 +v -0.062500 1.312504 0.062500 +v 0.062500 1.312504 0.062500 v -0.500000 -0.437500 -0.500000 v -0.500000 -0.437500 0.500000 -v -0.062500 0.250000 -0.062500 -v -0.187500 0.250000 -0.062500 -v -0.062500 0.250000 0.062500 -v -0.187500 0.250000 0.062500 -v -0.375000 0.937500 0.062500 -v -0.375000 0.937500 -0.062500 -v -0.375000 0.812500 -0.062500 -v -0.375000 0.812500 0.062500 +v 0.500000 -0.437500 0.500000 +v 0.500000 -0.437500 -0.500000 +v -0.500000 -0.500000 -0.500000 v 0.500000 -0.500000 -0.500000 v 0.500000 -0.500000 0.500000 -v -0.500000 -0.500000 -0.500000 v -0.500000 -0.500000 0.500000 -v 0.187500 0.124998 0.062500 -v 0.187500 0.124998 -0.062500 -v 0.062500 0.124998 0.062500 -v 0.062500 0.124998 -0.062500 -v -0.062500 0.124998 -0.062500 -v -0.187500 0.124998 -0.062500 -v -0.062500 0.124998 0.062500 -v -0.187500 0.124998 0.062500 -vt 0.000000 0.000000 -vt 0.875000 0.000000 -vt 0.875000 0.250000 -vt 0.000000 0.250000 -vt 0.125000 0.500000 -vt 0.125000 0.750000 -vt -0.000000 0.750000 -vt -0.000000 0.500000 -vt 0.750000 0.000000 -vt 1.000000 0.000000 -vt 1.000000 0.250000 -vt 0.750000 0.250000 -vt 0.375000 0.500000 -vt 0.375000 0.750000 -vt 0.875000 0.750000 -vt 0.875000 1.000000 -vt 0.000000 1.000000 -vt 0.875000 0.500000 -vt 0.750000 0.500000 -vt 1.000000 0.500000 -vt 1.000000 0.750000 -vt 0.750000 0.750000 -vt 0.625000 1.000000 -vt 0.375000 1.000000 -vt 0.625000 0.750000 -vt 0.625000 0.500000 -vt 0.250000 0.500000 -vt 0.250000 0.750000 -vt 0.625000 0.250000 -vt 0.625000 -0.000000 -vt 0.250000 0.250000 -vt 0.250000 0.000000 -vt 0.375000 0.250000 -vt 0.250000 1.000000 -vt 1.000000 1.000000 -vt 0.750000 1.000000 -vt 0.375000 -0.000000 -vt 0.125000 0.250000 -vt 0.125000 1.000000 -vt 0.125000 0.000000 -vt -0.000000 0.937500 -vt 1.000000 0.937500 -vt 0.937500 0.000000 -vt 0.937500 1.000000 -vt 1.000000 0.062500 -vt 0.000000 0.062500 +vt 0.062500 0.140625 vt 0.062500 0.000000 -vt 0.062500 1.000000 -g Player_Cube_Stand +vt 0.093750 0.000000 +vt 0.093750 0.140625 +vt 0.140625 0.234375 +vt 0.140625 0.203125 +vt 0.156250 0.203125 +vt 0.156250 0.234375 +vt 0.093750 0.171875 +vt 0.062500 0.171875 +vt 0.218750 0.140625 +vt 0.187500 0.140625 +vt 0.187500 0.000000 +vt 0.218750 0.000000 +vt 0.078125 0.437500 +vt 0.078125 0.468750 +vt 0.031250 0.468750 +vt 0.031250 0.437500 +vt 0.250000 0.140625 +vt 0.250000 0.000000 +vt 0.031250 0.140625 +vt 0.031250 0.000000 +vt 0.156250 0.140625 +vt 0.156250 0.000000 +vt 0.187500 0.203125 +vt 0.156250 0.171875 +vt 0.187500 0.171875 +vt 0.125000 0.000000 +vt 0.125000 0.140625 +vt 0.000000 0.140625 +vt 0.000000 0.000000 +vt 0.328125 0.437500 +vt 0.296875 0.437500 +vt 0.296875 0.406250 +vt 0.328125 0.406250 +vt 0.109375 0.437500 +vt 0.109375 0.468750 +vt 0.046875 0.203125 +vt 0.046875 0.234375 +vt 0.031250 0.234375 +vt 0.031250 0.203125 +vt 0.000000 0.203125 +vt 0.000000 0.171875 +vt 0.031250 0.171875 +vt 0.265625 0.468750 +vt 0.265625 0.437500 +vt 0.218750 0.437500 +vt 0.218750 0.468750 +vt 0.218750 0.171875 +vt 0.171875 0.468750 +vt 0.171875 0.437500 +vt 0.078125 0.406250 +vt 0.031250 0.406250 +vt 0.140625 0.468750 +vt 0.140625 0.437500 +vt 0.140625 0.406250 +vt 0.171875 0.406250 +vt 0.109375 0.406250 +vt 0.359375 0.437500 +vt 0.359375 0.406250 +vt 0.390625 0.406250 +vt 0.390625 0.437500 +vt 0.437500 0.406250 +vt 0.437500 0.437500 +vt 0.000000 0.437500 +vt 0.000000 0.406250 +vt 0.250000 0.437500 +vt 0.218750 0.406250 +vt 0.250000 0.406250 +vt 0.359375 0.468750 +vt 0.406250 0.468750 +vt 0.406250 0.437500 +vt 0.109375 0.234375 +vt 0.078125 0.234375 +vt 0.078125 0.203125 +vt 0.109375 0.203125 +vt 0.062500 0.468750 +vt 0.062500 0.562500 +vt 0.031250 0.562500 +vt 0.328125 0.468750 +vt 0.296875 0.468750 +vt 0.062500 0.593750 +vt 0.031250 0.593750 +vt 0.093750 0.468750 +vt 0.093750 0.562500 +vt 0.125000 0.468750 +vt 0.125000 0.562500 +vt 0.000000 0.562500 +vt 0.000000 0.468750 +vt 0.078125 0.171875 +vt 0.046875 0.171875 +vt 0.265625 0.203125 +vt 0.265625 0.171875 +vt 0.296875 0.171875 +vt 0.296875 0.203125 +vt 0.265625 0.234375 +vt 0.281250 0.234375 +vt 0.281250 0.203125 +vt 0.312500 0.171875 +vt 0.312500 0.203125 +vt 0.140625 0.171875 +vt 0.171875 0.234375 +vt 0.171875 0.203125 +vt 0.109375 0.171875 +vt 0.234375 0.203125 +vt 0.203125 0.203125 +vt 0.203125 0.171875 +vt 0.234375 0.171875 +vt 0.234375 0.234375 +vt 0.203125 0.234375 +vt 0.062500 0.375000 +vt 0.062500 0.234375 +vt 0.093750 0.234375 +vt 0.093750 0.375000 +vt 0.031250 0.375000 +vt 0.125000 0.234375 +vt 0.125000 0.375000 +vt 0.000000 0.375000 +vt 0.000000 0.234375 +vt 0.218750 0.375000 +vt 0.187500 0.375000 +vt 0.187500 0.234375 +vt 0.218750 0.234375 +vt 0.250000 0.375000 +vt 0.250000 0.234375 +vt 0.156250 0.375000 +vt 0.250000 1.000000 +vt 0.250000 0.750000 +vt 0.500000 0.750000 +vt 0.500000 1.000000 +vt 0.750000 0.750000 +vt 0.750000 1.000000 +vt 0.750000 0.734375 +vt 1.000000 0.734375 +vt 1.000000 0.750000 +vt 0.000000 0.750000 +vt 0.000000 0.734375 +vt 0.250000 0.734375 +vt 0.500000 0.734375 usemtl Stand s off -f 64/1 29/2 30/3 63/4 -f 52/5 50/6 10/7 9/8 -f 17/9 18/10 5/11 6/12 -f 68/3 66/2 6/1 5/4 -f 7/13 8/14 54/7 53/8 -f 67/15 68/16 5/17 18/7 -f 62/4 27/3 29/18 64/8 -f 66/3 65/18 17/8 6/4 -f 9/19 10/20 12/21 11/22 -f 63/7 30/15 28/16 61/17 -f 65/18 67/15 18/7 17/8 -f 61/8 28/18 27/15 62/7 -f 19/23 7/24 36/14 35/25 -f 8/14 7/13 19/26 20/25 -f 23/15 24/18 13/20 14/21 -f 13/8 15/27 16/28 14/7 -f 39/29 38/30 42/10 41/11 -f 29/31 27/4 28/1 30/32 -f 25/28 26/27 43/26 44/25 -f 38/12 25/19 44/13 42/33 -f 25/28 32/7 31/8 26/27 -f 8/26 20/13 33/33 34/29 -f 25/19 38/12 37/11 32/20 -f 31/17 40/7 39/28 26/34 -f 26/34 39/28 41/25 43/23 -f 43/7 41/28 42/34 44/17 -f 53/22 54/21 55/35 56/36 -f 36/14 7/24 53/17 56/7 -f 8/26 34/29 55/11 54/20 -f 34/37 36/33 56/4 55/1 -f 51/13 21/26 22/25 49/14 -f 20/4 3/12 1/19 32/8 -f 40/15 31/16 19/23 35/25 -f 35/29 33/30 37/2 40/3 -f 33/33 20/13 32/5 37/38 -f 3/14 4/24 2/23 1/25 -f 19/12 4/4 3/1 20/9 -f 31/36 2/17 4/7 19/22 -f 32/22 1/7 2/8 31/19 -f 23/5 62/38 64/33 22/13 -f 21/14 63/24 61/39 24/6 -f 61/3 62/2 16/10 15/11 -f 62/38 23/5 14/8 16/4 -f 24/6 61/39 15/17 13/7 -f 50/18 66/3 12/11 10/20 -f 66/40 68/38 11/4 12/1 -f 50/18 49/26 65/29 66/3 -f 51/25 52/15 68/16 67/23 -f 68/16 52/15 9/21 11/35 -f 49/26 22/13 64/33 65/29 -f 51/25 67/23 63/24 21/14 -f 67/33 65/37 64/30 63/29 -f 37/1 22/2 21/3 40/4 -f 38/4 23/3 22/18 37/8 -f 40/7 21/15 24/16 39/17 -f 39/8 24/18 23/15 38/7 -f 36/2 34/3 50/4 52/1 -f 35/15 36/16 52/17 51/7 -f 34/3 33/18 49/8 50/4 -f 33/18 35/15 51/7 49/8 -g Player_Cube_Base +f 1/1 2/2 3/3 4/4 +f 5/5 6/6 7/7 8/8 +f 9/1 10/4 11/9 12/10 +f 13/11 14/12 12/13 11/14 +f 15/15 16/16 17/17 18/18 +f 19/19 13/11 11/14 10/20 +f 2/2 1/1 20/21 21/22 +f 14/12 22/23 9/24 12/13 +f 8/25 7/7 23/26 24/27 +f 4/4 3/3 25/28 26/29 +f 22/23 19/29 10/28 9/24 +f 26/30 25/31 21/22 20/21 +f 27/32 15/33 28/34 29/35 +f 16/16 15/15 27/36 30/37 +f 31/38 32/39 33/40 34/41 +f 33/42 35/43 36/44 34/41 +f 37/45 38/46 39/47 40/48 +f 2/49 21/27 25/12 3/11 +f 41/50 42/51 43/47 44/48 +f 38/52 41/15 44/18 39/53 +f 41/50 45/54 46/55 42/51 +f 16/51 30/55 47/56 48/57 +f 41/15 38/52 49/58 45/36 +f 46/59 50/60 37/61 42/62 +f 42/62 37/61 40/63 43/64 +f 43/65 40/66 39/53 44/18 +f 18/67 17/47 51/68 52/69 +f 28/34 15/33 18/67 52/69 +f 16/51 48/57 51/68 17/47 +f 48/59 28/70 52/71 51/72 +f 53/73 54/74 55/75 56/76 +f 30/77 57/78 58/79 45/17 +f 50/60 46/59 27/32 29/35 +f 29/80 47/32 49/33 50/81 +f 47/56 30/55 45/36 49/58 +f 57/78 59/82 60/83 58/79 +f 27/84 59/85 57/78 30/77 +f 46/86 60/87 59/85 27/84 +f 45/17 58/79 60/88 46/89 +f 1/90 55/75 31/38 20/91 +f 54/92 4/93 26/94 32/95 +f 26/92 20/96 36/97 35/98 +f 20/91 31/38 34/41 36/44 +f 32/95 26/94 35/99 33/100 +f 6/6 14/101 23/26 7/7 +f 14/102 13/103 24/7 23/8 +f 6/6 56/76 22/104 14/101 +f 53/105 5/106 13/107 19/108 +f 13/107 5/106 8/25 24/27 +f 1/90 22/104 56/76 55/75 +f 53/105 19/108 4/93 54/92 +f 1/109 4/105 19/106 22/110 +f 49/111 55/112 54/113 50/114 +f 38/115 31/40 55/112 49/111 +f 50/114 54/113 32/116 37/117 +f 37/118 32/119 31/40 38/115 +f 28/120 48/121 6/122 5/123 +f 29/124 28/120 5/123 53/125 +f 48/121 47/126 56/8 6/122 +f 47/126 29/117 53/116 56/8 usemtl Base -f 47/17 48/1 46/10 45/35 -f 59/1 57/10 58/35 60/17 -f 48/17 60/41 58/42 46/35 -f 46/43 58/10 57/35 45/44 -f 47/1 45/10 57/45 59/46 -f 48/47 47/48 59/17 60/1 +f 61/127 62/128 63/129 64/130 +f 65/129 66/131 67/132 68/130 +f 62/131 68/133 67/134 63/135 +f 63/136 67/137 66/138 64/128 +f 61/129 64/128 66/138 65/139 +f 62/131 61/129 65/139 68/133 diff --git a/mods/3d_armor/3d_armor_stand/models/3d_armor_stand.png b/mods/3d_armor/3d_armor_stand/models/3d_armor_stand.png new file mode 100644 index 0000000..aeb26de Binary files /dev/null and b/mods/3d_armor/3d_armor_stand/models/3d_armor_stand.png differ diff --git a/mods/3d_armor/3d_armor_stand/models/3d_armor_stand_locked.png b/mods/3d_armor/3d_armor_stand/models/3d_armor_stand_locked.png new file mode 100644 index 0000000..3ee08b4 Binary files /dev/null and b/mods/3d_armor/3d_armor_stand/models/3d_armor_stand_locked.png differ diff --git a/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_feet.png b/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_feet.png index d04f9e3..2427a60 100644 Binary files a/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_feet.png and b/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_feet.png differ diff --git a/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_head.png b/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_head.png index 228c08e..5676e0b 100644 Binary files a/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_head.png and b/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_head.png differ diff --git a/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_legs.png b/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_legs.png index 66ec357..1d8d4c1 100644 Binary files a/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_legs.png and b/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_legs.png differ diff --git a/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_torso.png b/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_torso.png index af95ec7..ef134f8 100644 Binary files a/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_torso.png and b/mods/3d_armor/3d_armor_stand/textures/3d_armor_stand_torso.png differ diff --git a/mods/3d_armor/LICENSE.md b/mods/3d_armor/LICENSE.md index d383270..56c93cd 100644 --- a/mods/3d_armor/LICENSE.md +++ b/mods/3d_armor/LICENSE.md @@ -1,11 +1,9 @@ 3D Armor - Visible Player Armor =============================== -Default Item Textures (C) Cisoun - WTFPL +License Source Code: Copyright (C) 2013-2018 Stuart Jones - LGPL v2.1 -Armor Textures: Copyright (C) 2013 Ryan Jones - CC-BY-SA - -Source Code: Copyright (C) 2013 Stuart Jones - LGPL +Armor Textures: Copyright (C) 2017-2018 davidthecreator - CC-BY-SA 3.0 Special credit to Jordach and MirceaKitsune for providing the default 3d character model. diff --git a/mods/3d_armor/README.md b/mods/3d_armor/README.md index 556f1a7..088ed22 100644 --- a/mods/3d_armor/README.md +++ b/mods/3d_armor/README.md @@ -1,15 +1,30 @@ -Modpack - 3d Armor [0.4.4] -========================== +Modpack - 3d Armor [0.4.12] +=========================== + +### Table of Contents + + + + +- [[mod] Visible Player Armor [3d_armor]](#mod-visible-player-armor-3d_armor) +- [[mod] Visible Wielded Items [wieldview]](#mod-visible-wielded-items-wieldview) +- [[mod] Shields [shields]](#mod-shields-shields) +- [[mod] 3d Armor Stand [3d_armor_stand]](#mod-3d-armor-stand-3d_armor_stand) + + + [mod] Visible Player Armor [3d_armor] ------------------------------------- -depends: default +Minetest Version: 0.4.16 - 0.4.17.1 -recommends: inventory_plus or unified_inventory (use only one) +Game: minetest_game and many derivatives + +Depends: default Adds craftable armor that is visible to other players. Each armor item worn contributes to -a player's armor group level making them less vulnerable to weapons. +a player's armor group level making them less vulnerable to attack. Armor takes damage when a player is hurt, however, many armor items offer a 'stackable' percentage chance of restoring the lost health points. Overall armor level is boosted by 10% @@ -19,24 +34,36 @@ Fire protection has been added by TenPlus1 and in use when ethereal mod is found armor has been enabled. each piece of armor offers 1 fire protection, level 1 protects against torches, level 2 against crystal spikes, 3 for fire and 5 protects when in lava. -Compatible with player skins [skins] by Zeg9 and Player Textures [player_textures] by PilzAdam +Compatible with sfinv, inventory plus or unified inventory by enabling the appropriate +inventory module, [3d_armor_sfinv], [3d_armor_ip] and [3d_armor_ui] respectively. +Also compatible with [smart_inventory] without the need for additional modules. + +built in support player skins [skins] by Zeg9 and Player Textures [player_textures] by PilzAdam and [simple_skins] by TenPlus1. Armor can be configured by adding a file called armor.conf in 3d_armor mod or world directory. see armor.conf.example for all available options. +For mod installation instructions, please visit: http://wiki.minetest.com/wiki/Installing_Mods + [mod] Visible Wielded Items [wieldview] --------------------------------------- -depends: 3d_armor +Depends: 3d_armor Makes hand wielded items visible to other players. [mod] Shields [shields] -------------------------------------- +----------------------- -depends: 3d_armor +Depends: 3d_armor Originally a part of 3d_armor, shields have been re-included as an optional extra. If you do not want shields then simply remove the shields folder from the modpack. +[mod] 3d Armor Stand [3d_armor_stand] +------------------------------------- + +Depends: 3d_armor + +Adds a chest-like armor stand for armor storage and display. diff --git a/mods/3d_armor/description.txt b/mods/3d_armor/description.txt new file mode 100644 index 0000000..2da5ba4 --- /dev/null +++ b/mods/3d_armor/description.txt @@ -0,0 +1 @@ +Visible player armor & wielded items. diff --git a/mods/3d_armor/preview_gen.py b/mods/3d_armor/preview_gen.py new file mode 100644 index 0000000..a18954d --- /dev/null +++ b/mods/3d_armor/preview_gen.py @@ -0,0 +1,81 @@ +#!/usr/bin/python + +import os +import sys +import Image + +try : + arg = sys.argv[1] +except IndexError : + print "Usage: preview_gen.py " + sys.exit(1) + +try : + index = open(arg, "r") +except IOError : + print "Failed to open index file%s" %s (arg) + sys.exit(1) + +preview = [] + +for line in index.readlines() : + if ":" in line : + line = line.rstrip('\n') + preview.append(line.split(':')) + +print "Generating preview images..." +for fn, place in preview : + try : + imi = Image.open(fn) + except IOError : + print "Failed to open %s" % (fn) + sys.exit(1) + + w, h = imi.size + if h != w / 2: + print "Incompatible texture size %s" % (fn) + sys.exit(1) + + s = w / 64 + imo = Image.new("RGBA", (16 * s, 32 * s)) + + if place == "all" or place == "head" : + face = (40 * s, 8 * s, 48 * s, 16 * s) + side_l = (56 * s, 8 * s, 57 * s, 16 * s) + side_r = (63 * s, 8 * s, 64 * s, 16 * s) + imo.paste(imi.crop(side_l), (4 * s, 0, 5 * s, 8 * s)) + imo.paste(imi.crop(side_r), (11 * s, 0, 12 * s, 8 * s)) + imo.paste(imi.crop(face), (4 * s, 0, 12 * s, 8 * s)) + + if place == "all" or place == "torso" : + arm = (44 * s, 20 * s, 48 * s, 32 * s) + body = (20 * s, 20 * s, 28 * s, 32 * s) + imo.paste(imi.crop(arm), (0 * s, 8 * s, 4 * s, 20 * s)) + imo.paste(imi.crop(arm).transpose(Image.FLIP_LEFT_RIGHT), + (12 * s, 8 * s, 16 * s, 20 * s)) + imo.paste(imi.crop(body), (4 * s, 8 * s, 12 * s, 20 * s)) + + if place == "all" or place == "legs" : + leg = (4 * s, 20 * s, 8 * s, 32 * s) + imo.paste(imi.crop(leg), (4 * s, 20 * s, 8 * s, 32 * s)) + imo.paste(imi.crop(leg).transpose(Image.FLIP_LEFT_RIGHT), + (8 * s, 20 * s, 12 * s, 32 * s)) + + if place == "all" or place == "feet" : + boot = (20 * s, 4 * s, 24 * s, 11 * s) + imo.paste(imi.crop(boot), (4 * s, 25 * s, 8 * s, 32 * s)) + imo.paste(imi.crop(boot).transpose(Image.FLIP_LEFT_RIGHT), + (8 * s, 25 * s, 12 * s, 32 * s)) + + size = (32 * s, 64 * s) + imo = imo.resize(size) + + if place == "shield" : + shield = (0, 0, 16 * s, 16 * s) + imo.paste(imi.crop(shield), (16 * s, 32 * s, 32 * s, 48 * s)) + + outfile = fn.replace(".png", "_preview.png") + imo.save(outfile) + print outfile + + diff --git a/mods/3d_armor/screenshot.png b/mods/3d_armor/screenshot.png new file mode 100644 index 0000000..c1f9e58 Binary files /dev/null and b/mods/3d_armor/screenshot.png differ diff --git a/mods/3d_armor/shields/LICENSE.txt b/mods/3d_armor/shields/LICENSE.txt new file mode 100644 index 0000000..15e2345 --- /dev/null +++ b/mods/3d_armor/shields/LICENSE.txt @@ -0,0 +1,8 @@ +[mod] Shields [shields] +======================= + +License Source Code: Copyright (C) 2013-2018 Stuart Jones - LGPL v2.1 + +License Textures: Copyright (C) 2017-2018 davidthecreator - CC-BY-SA 3.0 + +https://github.com/daviddoesminetest/3d-armors-new-textures diff --git a/mods/3d_armor/shields/README.txt b/mods/3d_armor/shields/README.txt index 3146bcb..5a72097 100644 --- a/mods/3d_armor/shields/README.txt +++ b/mods/3d_armor/shields/README.txt @@ -1,6 +1,16 @@ +[mod] Shields [shields] +======================= + Adds shields to 3d_armor Depends: 3d_armor Originally a part of 3d_armor, shields have been re-included as an optional extra. If you do not what shields then simply remove the shields folder from the modpack. + +Shields Configuration +--------------------- + +Override the following default settings by adding them to your minetest.conf file. + +shields_disable_sounds = false diff --git a/mods/3d_armor/shields/description.txt b/mods/3d_armor/shields/description.txt new file mode 100644 index 0000000..cb378bb --- /dev/null +++ b/mods/3d_armor/shields/description.txt @@ -0,0 +1 @@ +Adds visible shields to 3d armor. diff --git a/mods/3d_armor/shields/init.lua b/mods/3d_armor/shields/init.lua index c5f7dc7..ccfbc65 100644 --- a/mods/3d_armor/shields/init.lua +++ b/mods/3d_armor/shields/init.lua @@ -1,13 +1,35 @@ -local use_moreores = minetest.get_modpath("moreores") +-- support for i18n dofile(minetest.get_modpath("shields").."/tutorial.lua") dofile(minetest.get_modpath("shields").."/tutorial_craft.lua") --- Regisiter Shields +local S = armor_i18n.gettext +local disable_sounds = minetest.settings:get_bool("shields_disable_sounds") +local use_moreores = minetest.get_modpath("moreores") +local function play_sound_effect(player, name) + if not disable_sounds and player then + local pos = player:getpos() + if pos then + minetest.sound_play(name, { + pos = pos, + max_hear_distance = 10, + gain = 0.5, + }) + end + end +end + +if minetest.global_exists("armor") and armor.elements then + table.insert(armor.elements, "shield") + local mult = armor.config.level_multiplier or 1 + armor.config.level_multiplier = mult * 0.9 +end + +-- Regisiter Shields minetest.register_tool("shields:shield_admin", { description = "Admin Shield Mode 1 (no speed and no jump)", inventory_image = "shields_inv_shield_admin.png^technic_tool_mode1.png", wield_image = "shields_inv_shield_admin.png", - groups = {armor_shield=5000, armor_heal=2500, armor_use=0, armor_fire=2000}, + groups = {armor_shield=20, armor_heal=25, armor_use=0, armor_fire=1, armor_water=0.2}, wear = 0, on_use = function(itemstack, user, pointed_thing) local keys = user:get_player_control() @@ -22,7 +44,7 @@ minetest.register_tool("shields:shield_admin2", { description = "Admin Shield Mode 2 (speed and no jump)", inventory_image = "shields_inv_shield_admin.png^technic_tool_mode2.png", wield_image = "shields_inv_shield_admin.png", - groups = {armor_shield=5000, armor_heal=2500, armor_use=0, armor_fire=2000, physics_speed=0.25}, + groups = {armor_shield=20, armor_heal=25, armor_use=0, armor_fire=1, physics_speed=0.25, armor_water=0.2}, wear = 0, on_use = function(itemstack, user, pointed_thing) local keys = user:get_player_control() @@ -37,7 +59,7 @@ minetest.register_tool("shields:shield_admin3", { description = "Admin Shield Mode 3 (no speed and jump)", inventory_image = "shields_inv_shield_admin.png^technic_tool_mode3.png", wield_image = "shields_inv_shield_admin.png", - groups = {armor_shield=5000, armor_heal=2500, armor_use=0, armor_fire=2000, physics_jump=0.25}, + groups = {armor_shield=20, armor_heal=25, armor_use=0, armor_fire=1, physics_jump=0.25, armor_water=0.2}, wear = 0, on_use = function(itemstack, user, pointed_thing) local keys = user:get_player_control() @@ -52,7 +74,7 @@ minetest.register_tool("shields:shield_admin4", { description = "Admin Shield Mode 4 (speed and jump)", inventory_image = "shields_inv_shield_admin.png^technic_tool_mode4.png", wield_image = "shields_inv_shield_admin.png", - groups = {armor_shield=5000, armor_heal=2500, armor_use=0, armor_fire=2000, physics_jump=0.25, physics_speed=0.25}, + groups = {armor_shield=20, armor_heal=25, armor_use=0, armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2}, wear = 0, on_use = function(itemstack, user, pointed_thing) local keys = user:get_player_control() @@ -62,100 +84,3 @@ minetest.register_tool("shields:shield_admin4", { return itemstack end, }) - - - - - - - - - -if ARMOR_MATERIALS.wood then - minetest.register_tool("shields:shield_wood", { - description = "Wooden Shield", - inventory_image = "shields_inv_shield_wood.png", - groups = {armor_shield=10, armor_heal=0, armor_use=2000}, - wear = 0, - }) - minetest.register_tool("shields:shield_enhanced_wood", { - description = "Enhanced Wood Shield", - inventory_image = "shields_inv_shield_enhanced_wood.png", - groups = {armor_shield=15, armor_heal=1, armor_use=200}, - wear = 0, - }) -end - -if ARMOR_MATERIALS.cactus then - minetest.register_tool("shields:shield_cactus", { - description = "Cactus Shield", - inventory_image = "shields_inv_shield_cactus.png", - groups = {armor_shield=7, armor_heal=2, armor_use=200}, - wear = 0, - }) - minetest.register_tool("shields:shield_enhanced_cactus", { - description = "Enhanced Cactus Shield", - inventory_image = "shields_inv_shield_enhanced_cactus.png", - groups = {armor_shield=20, armor_heal=4, armor_use=100}, - wear = 0, - }) -end - -if ARMOR_MATERIALS.steel then - minetest.register_tool("shields:shield_steel", { - description = "Steel Shield", - inventory_image = "shields_inv_shield_steel.png", - groups = {armor_shield=20, armor_heal=4, armor_use=100}, - wear = 0, - }) -end - -if ARMOR_MATERIALS.bronze then - minetest.register_tool("shields:shield_bronze", { - description = "Bronze Shield", - inventory_image = "shields_inv_shield_bronze.png", - groups = {armor_shield=40, armor_heal=8, armor_use=75}, - wear = 0, - }) -end - -if ARMOR_MATERIALS.diamond then - minetest.register_tool("shields:shield_diamond", { - description = "Diamond Shield", - inventory_image = "shields_inv_shield_diamond.png", - groups = {armor_shield=20, armor_heal=2, armor_use=200}, - wear = 0, - }) -end - -if ARMOR_MATERIALS.gold then - minetest.register_tool("shields:shield_gold", { - description = "Gold Shield", - inventory_image = "shields_inv_shield_gold.png", - groups = {armor_shield=40, armor_heal=8, armor_use=50}, - wear = 0, - }) -end - -if ARMOR_MATERIALS.mithril then - minetest.register_tool("shields:shield_mithril", { - description = "Mithril Shield", - inventory_image = "shields_inv_shield_mithril.png", - groups = {armor_shield=80, armor_heal=16, armor_use=25}, - wear = 0, - }) -end - -if ARMOR_MATERIALS.crystal then - minetest.register_tool("shields:shield_crystal", { - description = "Crystal Shield", - inventory_image = "shields_inv_shield_crystal.png", - groups = {armor_shield=200, armor_heal=100, armor_use=0, armor_fire=1}, - wear = 0, - }) -end - -minetest.after(0, function() - table.insert(armor.elements, "shield") -end) - diff --git a/mods/3d_armor/shields/textures/preview_index.txt b/mods/3d_armor/shields/textures/preview_index.txt new file mode 100644 index 0000000..4408c61 --- /dev/null +++ b/mods/3d_armor/shields/textures/preview_index.txt @@ -0,0 +1,11 @@ +shields/textures/shields_shield_wood.png:shield +shields/textures/shields_shield_enhanced_wood.png:shield +shields/textures/shields_shield_cactus.png:shield +shields/textures/shields_shield_enhanced_cactus.png:shield +shields/textures/shields_shield_steel.png:shield +shields/textures/shields_shield_bronze.png:shield +shields/textures/shields_shield_gold.png:shield +shields/textures/shields_shield_diamond.png:shield +shields/textures/shields_shield_mithril.png:shield +shields/textures/shields_shield_crystal.png:shield +shields/textures/shields_shield_admin.png:shield diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega1.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega1.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega1.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega1.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega10.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega10.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega10.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega10.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega10_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega10_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega10_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega10_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega11.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega11.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega11.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega11.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega11_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega11_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega11_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega11_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega12.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega12.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega12.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega12.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega12_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega12_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega12_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega12_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega13.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega13.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega13.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega13.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega13_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega13_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega13_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega13_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega14.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega14.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega14.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega14.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega14_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega14_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega14_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega14_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega15.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega15.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega15.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega15.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega15_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega15_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega15_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega15_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega16.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega16.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega16.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega16.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega16_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega16_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega16_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega16_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega17.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega17.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega17.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega17.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega17_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega17_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega17_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega17_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega18.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega18.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega18.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega18.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega18_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega18_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega18_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega18_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega19.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega19.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega19.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega19.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega19_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega19_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega19_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega19_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega1_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega1_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega1_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega1_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega2.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega2.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega2.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega2.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega20.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega20.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega20.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega20.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega20_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega20_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega20_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega20_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega21.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega21.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega21.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega21.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega21_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega21_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega21_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega21_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega22.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega22.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega22.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega22.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega22_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega22_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega22_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega22_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega23.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega23.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega23.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega23.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega23_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega23_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega23_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega23_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega24.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega24.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega24.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega24.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega24_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega24_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega24_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega24_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega25.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega25.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega25.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega25.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega25_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega25_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega25_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega25_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega2_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega2_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega2_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega2_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega3.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega3.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega3.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega3.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega3_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega3_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega3_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega3_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega4.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega4.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega4.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega4.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega4_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega4_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega4_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega4_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega5.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega5.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega5.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega5.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega5_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega5_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega5_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega5_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega6.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega6.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega6.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega6.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega6_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega6_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega6_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega6_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega7.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega7.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega7.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega7.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega7_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega7_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega7_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega7_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega8.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega8.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega8.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega8.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega8_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega8_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega8_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega8_preview.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega9.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega9.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega9.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega9.png diff --git a/mods/3d_armor/shields/models/shields_cloudshield_mega9_preview.png b/mods/3d_armor/shields/textures/shields_cloudshield_mega9_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_cloudshield_mega9_preview.png rename to mods/3d_armor/shields/textures/shields_cloudshield_mega9_preview.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega1.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega1.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega1.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega1.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega10.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega10.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega10.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega10.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega11.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega11.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega11.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega11.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega12.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega12.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega12.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega12.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega13.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega13.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega13.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega13.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega14.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega14.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega14.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega14.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega15.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega15.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega15.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega15.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega16.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega16.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega16.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega16.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega17.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega17.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega17.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega17.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega18.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega18.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega18.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega18.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega19.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega19.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega19.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega19.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega2.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega2.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega2.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega2.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega20.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega20.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega20.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega20.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega21.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega21.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega21.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega21.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega22.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega22.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega22.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega22.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega23.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega23.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega23.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega23.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega24.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega24.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega24.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega24.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega25.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega25.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega25.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega25.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega3.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega3.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega3.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega3.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega4.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega4.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega4.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega4.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega5.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega5.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega5.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega5.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega6.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega6.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega6.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega6.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega7.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega7.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega7.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega7.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega8.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega8.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega8.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega8.png diff --git a/mods/3d_armor/shields/models/shields_inv_cloudshield_mega9.png b/mods/3d_armor/shields/textures/shields_inv_cloudshield_mega9.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_cloudshield_mega9.png rename to mods/3d_armor/shields/textures/shields_inv_cloudshield_mega9.png diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_admin.png b/mods/3d_armor/shields/textures/shields_inv_shield_admin.png index ae5ab7d..0b0637e 100644 Binary files a/mods/3d_armor/shields/textures/shields_inv_shield_admin.png and b/mods/3d_armor/shields/textures/shields_inv_shield_admin.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_bronze.png b/mods/3d_armor/shields/textures/shields_inv_shield_bronze.png index 67bac0f..af47896 100644 Binary files a/mods/3d_armor/shields/textures/shields_inv_shield_bronze.png and b/mods/3d_armor/shields/textures/shields_inv_shield_bronze.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_cactus.png b/mods/3d_armor/shields/textures/shields_inv_shield_cactus.png index 00d1d58..d5c9ae4 100644 Binary files a/mods/3d_armor/shields/textures/shields_inv_shield_cactus.png and b/mods/3d_armor/shields/textures/shields_inv_shield_cactus.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_crystal.png b/mods/3d_armor/shields/textures/shields_inv_shield_crystal.png index 1ec1981..ebb73db 100644 Binary files a/mods/3d_armor/shields/textures/shields_inv_shield_crystal.png and b/mods/3d_armor/shields/textures/shields_inv_shield_crystal.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_diamond.png b/mods/3d_armor/shields/textures/shields_inv_shield_diamond.png index ea7c567..0e79d97 100644 Binary files a/mods/3d_armor/shields/textures/shields_inv_shield_diamond.png and b/mods/3d_armor/shields/textures/shields_inv_shield_diamond.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_cactus.png b/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_cactus.png index 39436cd..c5dc4d0 100644 Binary files a/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_cactus.png and b/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_cactus.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_wood.png b/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_wood.png index 058e042..13baede 100644 Binary files a/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_wood.png and b/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_wood.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_gold.png b/mods/3d_armor/shields/textures/shields_inv_shield_gold.png index 8995834..d0bd027 100644 Binary files a/mods/3d_armor/shields/textures/shields_inv_shield_gold.png and b/mods/3d_armor/shields/textures/shields_inv_shield_gold.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_mithril.png b/mods/3d_armor/shields/textures/shields_inv_shield_mithril.png index d32665a..a55fb00 100644 Binary files a/mods/3d_armor/shields/textures/shields_inv_shield_mithril.png and b/mods/3d_armor/shields/textures/shields_inv_shield_mithril.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_steel.png b/mods/3d_armor/shields/textures/shields_inv_shield_steel.png index 178b507..5417632 100644 Binary files a/mods/3d_armor/shields/textures/shields_inv_shield_steel.png and b/mods/3d_armor/shields/textures/shields_inv_shield_steel.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_wood.png b/mods/3d_armor/shields/textures/shields_inv_shield_wood.png index dcbe933..407533f 100644 Binary files a/mods/3d_armor/shields/textures/shields_inv_shield_wood.png and b/mods/3d_armor/shields/textures/shields_inv_shield_wood.png differ diff --git a/mods/3d_armor/shields/models/shields_inv_supershield1.png b/mods/3d_armor/shields/textures/shields_inv_supershield1.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_supershield1.png rename to mods/3d_armor/shields/textures/shields_inv_supershield1.png diff --git a/mods/3d_armor/shields/models/shields_inv_supershield2.png b/mods/3d_armor/shields/textures/shields_inv_supershield2.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_supershield2.png rename to mods/3d_armor/shields/textures/shields_inv_supershield2.png diff --git a/mods/3d_armor/shields/models/shields_inv_supershield3.png b/mods/3d_armor/shields/textures/shields_inv_supershield3.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_supershield3.png rename to mods/3d_armor/shields/textures/shields_inv_supershield3.png diff --git a/mods/3d_armor/shields/models/shields_inv_supershield4.png b/mods/3d_armor/shields/textures/shields_inv_supershield4.png similarity index 100% rename from mods/3d_armor/shields/models/shields_inv_supershield4.png rename to mods/3d_armor/shields/textures/shields_inv_supershield4.png diff --git a/mods/3d_armor/shields/textures/shields_shield_admin.png b/mods/3d_armor/shields/textures/shields_shield_admin.png index 430c3e3..764c3bb 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_admin.png and b/mods/3d_armor/shields/textures/shields_shield_admin.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_admin_preview.png b/mods/3d_armor/shields/textures/shields_shield_admin_preview.png index 762c2d2..1d64766 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_admin_preview.png and b/mods/3d_armor/shields/textures/shields_shield_admin_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_bronze.png b/mods/3d_armor/shields/textures/shields_shield_bronze.png index 89d6799..d2a3561 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_bronze.png and b/mods/3d_armor/shields/textures/shields_shield_bronze.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_bronze_preview.png b/mods/3d_armor/shields/textures/shields_shield_bronze_preview.png index 5f9ca7b..3942471 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_bronze_preview.png and b/mods/3d_armor/shields/textures/shields_shield_bronze_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_cactus.png b/mods/3d_armor/shields/textures/shields_shield_cactus.png index 8679aa5..889ac94 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_cactus.png and b/mods/3d_armor/shields/textures/shields_shield_cactus.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_cactus_preview.png b/mods/3d_armor/shields/textures/shields_shield_cactus_preview.png index ae83661..1b46f1e 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_cactus_preview.png and b/mods/3d_armor/shields/textures/shields_shield_cactus_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_crystal.png b/mods/3d_armor/shields/textures/shields_shield_crystal.png index 888bc5a..03882e8 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_crystal.png and b/mods/3d_armor/shields/textures/shields_shield_crystal.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_crystal_preview.png b/mods/3d_armor/shields/textures/shields_shield_crystal_preview.png index 299776f..8dc632e 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_crystal_preview.png and b/mods/3d_armor/shields/textures/shields_shield_crystal_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_diamond.png b/mods/3d_armor/shields/textures/shields_shield_diamond.png index e4938f9..d1641b7 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_diamond.png and b/mods/3d_armor/shields/textures/shields_shield_diamond.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_diamond_preview.png b/mods/3d_armor/shields/textures/shields_shield_diamond_preview.png index afd004e..87fd958 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_diamond_preview.png and b/mods/3d_armor/shields/textures/shields_shield_diamond_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus.png b/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus.png index 50d7673..13884ff 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus.png and b/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus_preview.png b/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus_preview.png index b15df06..d8227a8 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus_preview.png and b/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_enhanced_wood.png b/mods/3d_armor/shields/textures/shields_shield_enhanced_wood.png index 14bd057..64f5331 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_enhanced_wood.png and b/mods/3d_armor/shields/textures/shields_shield_enhanced_wood.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_enhanced_wood_preview.png b/mods/3d_armor/shields/textures/shields_shield_enhanced_wood_preview.png index 9298383..97ca378 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_enhanced_wood_preview.png and b/mods/3d_armor/shields/textures/shields_shield_enhanced_wood_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_gold.png b/mods/3d_armor/shields/textures/shields_shield_gold.png index b198d18..e1aecfd 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_gold.png and b/mods/3d_armor/shields/textures/shields_shield_gold.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_gold_preview.png b/mods/3d_armor/shields/textures/shields_shield_gold_preview.png index 66d8f2e..103e0bc 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_gold_preview.png and b/mods/3d_armor/shields/textures/shields_shield_gold_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_mithril.png b/mods/3d_armor/shields/textures/shields_shield_mithril.png index 2fb622e..2e14503 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_mithril.png and b/mods/3d_armor/shields/textures/shields_shield_mithril.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_mithril_preview.png b/mods/3d_armor/shields/textures/shields_shield_mithril_preview.png index 45306e3..8adb978 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_mithril_preview.png and b/mods/3d_armor/shields/textures/shields_shield_mithril_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_steel.png b/mods/3d_armor/shields/textures/shields_shield_steel.png index cfe58a1..22ddb07 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_steel.png and b/mods/3d_armor/shields/textures/shields_shield_steel.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_steel_preview.png b/mods/3d_armor/shields/textures/shields_shield_steel_preview.png index 0a3d36a..96fbf9a 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_steel_preview.png and b/mods/3d_armor/shields/textures/shields_shield_steel_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_wood.png b/mods/3d_armor/shields/textures/shields_shield_wood.png index baf092d..129f9f0 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_wood.png and b/mods/3d_armor/shields/textures/shields_shield_wood.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_wood_preview.png b/mods/3d_armor/shields/textures/shields_shield_wood_preview.png index b446e4e..d167738 100644 Binary files a/mods/3d_armor/shields/textures/shields_shield_wood_preview.png and b/mods/3d_armor/shields/textures/shields_shield_wood_preview.png differ diff --git a/mods/3d_armor/shields/models/shields_supershield1.png b/mods/3d_armor/shields/textures/shields_supershield1.png similarity index 100% rename from mods/3d_armor/shields/models/shields_supershield1.png rename to mods/3d_armor/shields/textures/shields_supershield1.png diff --git a/mods/3d_armor/shields/models/shields_supershield1_preview.png b/mods/3d_armor/shields/textures/shields_supershield1_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_supershield1_preview.png rename to mods/3d_armor/shields/textures/shields_supershield1_preview.png diff --git a/mods/3d_armor/shields/models/shields_supershield2.png b/mods/3d_armor/shields/textures/shields_supershield2.png similarity index 100% rename from mods/3d_armor/shields/models/shields_supershield2.png rename to mods/3d_armor/shields/textures/shields_supershield2.png diff --git a/mods/3d_armor/shields/models/shields_supershield2_preview.png b/mods/3d_armor/shields/textures/shields_supershield2_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_supershield2_preview.png rename to mods/3d_armor/shields/textures/shields_supershield2_preview.png diff --git a/mods/3d_armor/shields/models/shields_supershield3.png b/mods/3d_armor/shields/textures/shields_supershield3.png similarity index 100% rename from mods/3d_armor/shields/models/shields_supershield3.png rename to mods/3d_armor/shields/textures/shields_supershield3.png diff --git a/mods/3d_armor/shields/models/shields_supershield3_preview.png b/mods/3d_armor/shields/textures/shields_supershield3_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_supershield3_preview.png rename to mods/3d_armor/shields/textures/shields_supershield3_preview.png diff --git a/mods/3d_armor/shields/models/shields_supershield4.png b/mods/3d_armor/shields/textures/shields_supershield4.png similarity index 100% rename from mods/3d_armor/shields/models/shields_supershield4.png rename to mods/3d_armor/shields/textures/shields_supershield4.png diff --git a/mods/3d_armor/shields/models/shields_supershield4_preview.png b/mods/3d_armor/shields/textures/shields_supershield4_preview.png similarity index 100% rename from mods/3d_armor/shields/models/shields_supershield4_preview.png rename to mods/3d_armor/shields/textures/shields_supershield4_preview.png diff --git a/mods/3d_armor/shields/tutorial.lua b/mods/3d_armor/shields/tutorial.lua index a0e8d09..7ad6b6d 100644 --- a/mods/3d_armor/shields/tutorial.lua +++ b/mods/3d_armor/shields/tutorial.lua @@ -8,7 +8,7 @@ for i=1,20 do minetest.register_tool("shields:shield_mega"..i, { description = "Megashield lv."..i.."\nShield-lv."..i, inventory_image = "shields_inv_shield_mega"..i..".png", - groups = {armor_shield=i, armor_heal=0, armor_use=0, armor_fire=0.2*i}, + groups = {armor_shield=i*0.1, armor_heal=0, armor_use=0, armor_fire=0.005*i}, wear = 0, }) end @@ -16,7 +16,7 @@ for i=1,25 do minetest.register_tool("shields:cloudshield_mega"..i, { description = "Cloudshield lv."..i.."\nShield-lv."..(i+20), inventory_image = "shields_inv_cloudshield_mega"..i..".png", - groups = {armor_shield=20+i, armor_heal=1, armor_use=0, armor_fire=0.2*(i+20)}, + groups = {armor_shield=(20+i)*0.1, armor_heal=1, armor_use=0, armor_fire=0.005*(i+20)}, wear = 0, }) end @@ -24,7 +24,7 @@ for i=1,4 do minetest.register_tool("shields:supershield"..i, { description = "Supershield lv."..i.."\nShield-lv."..(i+45), inventory_image = "shields_inv_supershield"..i..".png", - groups = {armor_shield=45+i, armor_heal=2, armor_use=0, armor_fire=0.2*(i+45)}, + groups = {armor_shield=(45+i)*0.1, armor_heal=2, armor_use=0, armor_fire=0.005*(i+45)}, wear = 0, }) end @@ -32,7 +32,7 @@ for i=1,2 do minetest.register_tool("shields:uraniumshield"..i, { description = "Uraniumshield lv."..i.."\nShield-lv."..(i+49), inventory_image = "shields_inv_uraniumshield"..i..".png", - groups = {armor_shield=49+i, armor_heal=3, armor_use=0, armor_fire=0.2*(i+49)}, + groups = {armor_shield=(49+i)*0.1, armor_heal=3, armor_use=0, armor_fire=0.005*(i+49)}, wear = 0, }) end @@ -40,7 +40,7 @@ for i=1,12 do minetest.register_tool("shields:energyshield"..i, { description = "Energyshield lv."..i.."\nShield-lv."..(i+51), inventory_image = "shields_inv_energyshield"..i..".png", - groups = {armor_shield=51+i, armor_heal=4, armor_use=0, armor_fire=0.2*(i+51)}, + groups = {armor_shield=(51+i)*0.1, armor_heal=4, armor_use=0, armor_fire=0.005*(i+51)}, wear = 0, }) end @@ -48,7 +48,7 @@ for i=1,7 do minetest.register_tool("shields:superenergyshield"..i, { description = "Superenergyshield lv."..i.."\nShield-lv."..(i+63), inventory_image = "shields_inv_superenergyshield"..i..".png", - groups = {armor_shield=63+i, armor_heal=5, armor_use=0, armor_fire=0.2*(i+63)}, + groups = {armor_shield=(63+i)*0.1, armor_heal=5, armor_use=0, armor_fire=0.005*(i+63)}, wear = 0, }) end @@ -56,7 +56,7 @@ for i=1,5 do minetest.register_tool("shields:kristallshield"..i, { description = "Crystalshield lv."..i.."\nShield-lv."..(i+70), inventory_image = "shields_inv_kristallshield"..i..".png", - groups = {armor_shield=70+i, armor_heal=6, armor_use=0, armor_fire=0.2*(i+70)}, + groups = {armor_shield=(70+i)*0.1, armor_heal=6, armor_use=0, armor_fire=0.005*(i+70)}, wear = 0, }) end @@ -64,21 +64,21 @@ for i=1,25 do minetest.register_tool("shields:ultrashield"..i, { description = "Ultrashield lv."..i.."\nShield-lv."..(i+75), inventory_image = "shields_inv_ultrashield"..i..".png", - groups = {armor_shield=75+i, armor_heal=7, armor_use=0, armor_fire=0.2*(i+75)}, + groups = {armor_shield=(75+i)*0.1, armor_heal=7, armor_use=0, armor_fire=0.005*(i+75)}, wear = 0, }) end minetest.register_tool("shields:superultrashield", { description = "Superultrashield\nShield-lv.101", inventory_image = "shields_inv_superultrashield.png", - groups = {armor_shield=101, armor_heal=8, armor_use=0,armor_fire=20.2}, + groups = {armor_shield=10.1, armor_heal=8, armor_use=0,armor_fire=0.505}, wear = 0, }) for i=1,4 do minetest.register_tool("shields:arenashield"..i, { description = "Arenashield lv."..i.."\nShield-lv."..(i+101), inventory_image = "shields_inv_arenashield"..i..".png", - groups = {armor_shield=101+i, armor_heal=9, armor_use=0, armor_fire=0.2*(i+101)}, + groups = {armor_shield=(101+i)*0.1, armor_heal=9, armor_use=0, armor_fire=0.005*(i+101)}, wear = 0, }) end @@ -86,7 +86,7 @@ for i=1,10 do minetest.register_tool("shields:titanshield"..i, { description = "Titanshield lv."..i.."\nShield-lv."..(i+105), inventory_image = "shields_inv_titanshield"..i..".png", - groups = {armor_shield=105+i, armor_heal=10, armor_use=0, armor_fire=0.2*(i+105)}, + groups = {armor_shield=(105+i)*0.1, armor_heal=10, armor_use=0, armor_fire=0.005*(i+105)}, wear = 0, }) end @@ -94,14 +94,14 @@ for i=1,6 do minetest.register_tool("shields:legendenshield"..i, { description = "Legendshield lv."..i.."\nShield-lv."..(i+115), inventory_image = "shields_inv_legendenshield"..i..".png", - groups = {armor_shield=115+i, armor_heal=11, armor_use=0, armor_fire=0.2*(i+115)}, + groups = {armor_shield=(115+i)*0.1, armor_heal=11, armor_use=0, armor_fire=0.005*(i+115)}, wear = 0, }) end minetest.register_tool("shields:superlegendenshield", { description = "Superlegendshield Mode 1 (no speed and no jump)\nShield-lv.122", inventory_image = "shields_inv_superlegendenshield.png^technic_tool_mode1.png", - groups = {armor_shield=122, armor_heal=12, armor_use=0,armor_fire=24.4}, + groups = {armor_shield=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, armor_water=0.2}, wear = 0, wield_image = "shields_inv_superlegendenshield.png", on_use = function(itemstack, user, pointed_thing) @@ -115,7 +115,7 @@ minetest.register_tool("shields:superlegendenshield", { minetest.register_tool("shields:superlegendenshield2", { description = "Superlegendshield Mode 2 (speed and no jump)\nShield-lv.122", inventory_image = "shields_inv_superlegendenshield.png^technic_tool_mode2.png", - groups = {armor_shield=122, armor_heal=12, armor_use=0,armor_fire=24.4, physics_speed=0.25}, + groups = {armor_shield=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_speed=0.25, armor_water=0.2}, wear = 0, wield_image = "shields_inv_superlegendenshield.png", on_use = function(itemstack, user, pointed_thing) @@ -129,7 +129,7 @@ minetest.register_tool("shields:superlegendenshield2", { minetest.register_tool("shields:superlegendenshield3", { description = "Superlegendshield Mode 3 (no speed and jump)\nShield-lv.122", inventory_image = "shields_inv_superlegendenshield.png^technic_tool_mode3.png", - groups = {armor_shield=122, armor_heal=12, armor_use=0,armor_fire=24.4, physics_jump=0.25}, + groups = {armor_shield=12.2, armor_heal=12, armor_use=0,armor_fire=0.61, physics_jump=0.25, armor_water=0.2}, wear = 0, wield_image = "shields_inv_superlegendenshield.png", on_use = function(itemstack, user, pointed_thing) @@ -143,7 +143,7 @@ minetest.register_tool("shields:superlegendenshield3", { minetest.register_tool("shields:superlegendenshield4", { description = "Superlegendshield Mode 4 (speed and jump)\nShield-lv.122", inventory_image = "shields_inv_superlegendenshield.png^technic_tool_mode4.png", - groups = {armor_shield=122, armor_heal=12, armor_use=0,armor_fire=24.4, physics_jump=0.25, physics_speed=0.25}, + 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}, wear = 0, wield_image = "shields_inv_superlegendenshield.png", on_use = function(itemstack, user, pointed_thing) @@ -158,7 +158,7 @@ minetest.register_tool("shields:superlegendenshield4", { minetest.register_tool("shields:regnumshield", { description = "Regnumshield Mode 1 (no speed and no jump)\nShield-lv.MAX", inventory_image = "shields_inv_regnumshield.png^technic_tool_mode1.png", - groups = {armor_shield=150, armor_heal=15, armor_use=0,armor_fire=30}, + groups = {armor_shield=15.0, armor_heal=15, armor_use=0,armor_fire=1, armor_water=0.2}, wear = 0, wield_image = "shields_inv_regnumshield.png", on_use = function(itemstack, user, pointed_thing) @@ -172,7 +172,7 @@ minetest.register_tool("shields:regnumshield", { minetest.register_tool("shields:regnumshield2", { description = "Regnumshield Mode 2 (speed and no jump)\nShield-lv.MAX", inventory_image = "shields_inv_regnumshield.png^technic_tool_mode2.png", - groups = {armor_shield=150, armor_heal=15, armor_use=0,armor_fire=30, physics_speed=0.25}, + groups = {armor_shield=15.0, armor_heal=15, armor_use=0,armor_fire=1, physics_speed=0.25, armor_water=0.2}, wear = 0, wield_image = "shields_inv_regnumshield.png", on_use = function(itemstack, user, pointed_thing) @@ -186,7 +186,7 @@ minetest.register_tool("shields:regnumshield2", { minetest.register_tool("shields:regnumshield3", { description = "Regnumshield Mode 3 (no speed and jump)\nShield-lv.MAX", inventory_image = "shields_inv_regnumshield.png^technic_tool_mode3.png", - groups = {armor_shield=150, armor_heal=15, armor_use=0,armor_fire=30, physics_jump=0.25}, + groups = {armor_shield=15.0, armor_heal=15, armor_use=0,armor_fire=1, physics_jump=0.25, armor_water=0.2}, wear = 0, wield_image = "shields_inv_regnumshield.png", on_use = function(itemstack, user, pointed_thing) @@ -200,7 +200,7 @@ minetest.register_tool("shields:regnumshield3", { minetest.register_tool("shields:regnumshield4", { description = "Regnumshield Mode 4 (speed and jump)\nShield-lv.MAX", inventory_image = "shields_inv_regnumshield.png^technic_tool_mode4.png", - groups = {armor_shield=150, armor_heal=15, armor_use=0,armor_fire=30, physics_jump=0.25, physics_speed=0.25}, + groups = {armor_shield=15.0, armor_heal=15, armor_use=0,armor_fire=1, physics_jump=0.25, physics_speed=0.25, armor_water=0.2}, wear = 0, wield_image = "shields_inv_regnumshield.png", on_use = function(itemstack, user, pointed_thing) diff --git a/mods/3d_armor/technic_armor/README.txt b/mods/3d_armor/technic_armor/README.txt deleted file mode 100644 index dff2255..0000000 --- a/mods/3d_armor/technic_armor/README.txt +++ /dev/null @@ -1,6 +0,0 @@ -Adds tin, silver and technic materials to 3d_armor. -Requires technic mod to be installed for craft registration. - -Depends: 3d_armor - -Source code and textures by poet.nohit diff --git a/mods/3d_armor/technic_armor/depends.txt b/mods/3d_armor/technic_armor/depends.txt deleted file mode 100644 index b6cac21..0000000 --- a/mods/3d_armor/technic_armor/depends.txt +++ /dev/null @@ -1 +0,0 @@ -3d_armor diff --git a/mods/3d_armor/technic_armor/init.lua b/mods/3d_armor/technic_armor/init.lua deleted file mode 100644 index 499c27e..0000000 --- a/mods/3d_armor/technic_armor/init.lua +++ /dev/null @@ -1,48 +0,0 @@ -if minetest.get_modpath("technic") then - local stats = { - brass = { name="Brass", armor=20, heal=10, use=50 }, - cast = { name="Cast Iron", armor=40, heal=15, use=250 }, - carbon = { name="Carbon Steel", armor=50, heal=20, use=50,}, - stainless = { name="Stainless Steel", armor=50, heal=20, use=50 }, - } - local mats = { - brass="technic:brass_ingot", - cast="technic:cast_iron_ingot", - carbon="technic:carbon_steel_ingot", - stainless="technic:stainless_steel_ingot", - } - if minetest.get_modpath("moreores") then - stats.tin = { name="Tin", armor=40, heal=15, use=250 } - stats.silver = { name="Silver", armor=20, heal=4, use=50 } - mats.tin = "moreores:tin_ingot" - mats.silver = "moreores:silver_ingot" - end - - for k, v in pairs(stats) do - minetest.register_tool("technic_armor:helmet_"..k, { - description = v.name.." Helmet", - inventory_image = "technic_armor_inv_helmet_"..k..".png", - groups = {armor_head=math.floor(5*v.armor), armor_heal=v.heal, armor_use=v.use, armor_fire=v.fire}, - wear = 0, - }) - minetest.register_tool("technic_armor:chestplate_"..k, { - description = v.name.." Chestplate", - inventory_image = "technic_armor_inv_chestplate_"..k..".png", - groups = {armor_torso=math.floor(8*v.armor), armor_heal=v.heal, armor_use=v.use, armor_fire=v.fire}, - wear = 0, - }) - minetest.register_tool("technic_armor:leggings_"..k, { - description = v.name.." Leggings", - inventory_image = "technic_armor_inv_leggings_"..k..".png", - groups = {armor_legs=math.floor(7*v.armor), armor_heal=v.heal, armor_use=v.use, armor_fire=v.fire}, - wear = 0, - }) - minetest.register_tool("technic_armor:boots_"..k, { - description = v.name.." Boots", - inventory_image = "technic_armor_inv_boots_"..k..".png", - groups = {armor_feet=math.floor(4*v.armor), armor_heal=v.heal, armor_use=v.use, armor_fire=v.fire}, - wear = 0, - }) - end -end - diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_brass.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_brass.png deleted file mode 100644 index a54b970..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_boots_brass.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_brass_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_brass_preview.png deleted file mode 100644 index b054d4f..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_boots_brass_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_carbon.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_carbon.png deleted file mode 100644 index 379cc8e..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_boots_carbon.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_carbon_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_carbon_preview.png deleted file mode 100644 index 8d7e480..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_boots_carbon_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_cast.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_cast.png deleted file mode 100644 index 5aa0aaa..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_boots_cast.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_cast_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_cast_preview.png deleted file mode 100644 index 22699f2..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_boots_cast_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_silver.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_silver.png deleted file mode 100644 index 1af5ccc..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_boots_silver.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_silver_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_silver_preview.png deleted file mode 100644 index 01e0caf..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_boots_silver_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_stainless.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_stainless.png deleted file mode 100644 index eaa86c4..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_boots_stainless.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_stainless_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_stainless_preview.png deleted file mode 100644 index 53cc9e7..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_boots_stainless_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_tin.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_tin.png deleted file mode 100644 index 11c740a..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_boots_tin.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_tin_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_tin_preview.png deleted file mode 100644 index b1085af..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_boots_tin_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_brass.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_brass.png deleted file mode 100644 index d123aff..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_brass.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_brass_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_brass_preview.png deleted file mode 100644 index 94c2a47..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_brass_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_carbon.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_carbon.png deleted file mode 100644 index 7f2b9f1..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_carbon.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_carbon_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_carbon_preview.png deleted file mode 100644 index da747e5..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_carbon_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_cast.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_cast.png deleted file mode 100644 index 6fa0628..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_cast.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_cast_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_cast_preview.png deleted file mode 100644 index bfbd4ec..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_cast_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_silver.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_silver.png deleted file mode 100644 index 6790049..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_silver.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_silver_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_silver_preview.png deleted file mode 100644 index abf63b6..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_silver_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_stainless.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_stainless.png deleted file mode 100644 index c2db5f6..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_stainless.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_stainless_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_stainless_preview.png deleted file mode 100644 index 1266e6e..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_stainless_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_tin.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_tin.png deleted file mode 100644 index 562354e..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_tin.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_tin_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_tin_preview.png deleted file mode 100644 index 362a4ad..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_tin_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_brass.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_brass.png deleted file mode 100644 index b8f38d7..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_brass.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_brass_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_brass_preview.png deleted file mode 100644 index cd625f4..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_brass_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_carbon.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_carbon.png deleted file mode 100644 index e8fdf84..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_carbon.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_carbon_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_carbon_preview.png deleted file mode 100644 index 02a67b8..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_carbon_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_cast.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_cast.png deleted file mode 100644 index 840d1b1..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_cast.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_cast_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_cast_preview.png deleted file mode 100644 index c8d30c5..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_cast_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_silver.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_silver.png deleted file mode 100644 index 0c26eb3..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_silver.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_silver_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_silver_preview.png deleted file mode 100644 index a1d33d7..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_silver_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_stainless.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_stainless.png deleted file mode 100644 index 865ebf8..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_stainless.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_stainless_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_stainless_preview.png deleted file mode 100644 index d08cc69..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_stainless_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_tin.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_tin.png deleted file mode 100644 index 8497bf1..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_tin.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_tin_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_tin_preview.png deleted file mode 100644 index efb95be..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_tin_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_brass.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_brass.png deleted file mode 100644 index 145d6c3..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_brass.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_carbon.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_carbon.png deleted file mode 100644 index dbf043f..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_carbon.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_cast.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_cast.png deleted file mode 100644 index ba33d07..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_cast.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_silver.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_silver.png deleted file mode 100644 index 7af9003..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_silver.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_stainless.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_stainless.png deleted file mode 100644 index 6d114e7..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_stainless.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_tin.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_tin.png deleted file mode 100644 index 6fbc5b3..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_tin.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_brass.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_brass.png deleted file mode 100644 index 4984954..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_brass.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_carbon.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_carbon.png deleted file mode 100644 index b921799..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_carbon.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_cast.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_cast.png deleted file mode 100644 index 5e6749e..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_cast.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_silver.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_silver.png deleted file mode 100644 index 442caa2..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_silver.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_stainless.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_stainless.png deleted file mode 100644 index 5462100..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_stainless.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_tin.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_tin.png deleted file mode 100644 index eeb7328..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_tin.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_brass.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_brass.png deleted file mode 100644 index e56ec30..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_brass.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_carbon.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_carbon.png deleted file mode 100644 index fc2a592..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_carbon.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_cast.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_cast.png deleted file mode 100644 index 15092c1..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_cast.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_silver.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_silver.png deleted file mode 100644 index 4a17003..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_silver.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_stainless.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_stainless.png deleted file mode 100644 index 1cc480e..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_stainless.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_tin.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_tin.png deleted file mode 100644 index c37cb75..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_tin.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_brass.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_brass.png deleted file mode 100644 index 876bf7c..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_brass.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_carbon.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_carbon.png deleted file mode 100644 index e4673a9..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_carbon.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_cast.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_cast.png deleted file mode 100644 index df61ca6..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_cast.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_silver.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_silver.png deleted file mode 100644 index ad8c91b..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_silver.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_stainless.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_stainless.png deleted file mode 100644 index 7e4feaf..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_stainless.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_tin.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_tin.png deleted file mode 100644 index bbaeb6a..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_tin.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_brass.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_brass.png deleted file mode 100644 index f9c84fd..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_brass.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_brass_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_brass_preview.png deleted file mode 100644 index 05048e3..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_brass_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_carbon.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_carbon.png deleted file mode 100644 index 2c83e23..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_carbon.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_carbon_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_carbon_preview.png deleted file mode 100644 index 9fb6391..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_carbon_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_cast.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_cast.png deleted file mode 100644 index e7ca67f..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_cast.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_cast_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_cast_preview.png deleted file mode 100644 index 67dd933..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_cast_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_silver.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_silver.png deleted file mode 100644 index 6ae30f3..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_silver.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_silver_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_silver_preview.png deleted file mode 100644 index 0f6ecd2..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_silver_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_stainless.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_stainless.png deleted file mode 100644 index 5eab543..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_stainless.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_stainless_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_stainless_preview.png deleted file mode 100644 index 6504d9d..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_stainless_preview.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_tin.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_tin.png deleted file mode 100644 index 5973135..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_tin.png and /dev/null differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_tin_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_tin_preview.png deleted file mode 100644 index a6d105f..0000000 Binary files a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_tin_preview.png and /dev/null differ diff --git a/mods/3d_armor/wieldview/LICENSE.txt b/mods/3d_armor/wieldview/LICENSE.txt new file mode 100644 index 0000000..fff42d8 --- /dev/null +++ b/mods/3d_armor/wieldview/LICENSE.txt @@ -0,0 +1,5 @@ +[mod] visible wielded items [wieldview] +======================================= + +License Source Code: Copyright (C) 2013-2018 Stuart Jones - LGPL v2.1 + diff --git a/mods/3d_armor/wieldview/README.txt b/mods/3d_armor/wieldview/README.txt index cffae46..ffa5ef0 100644 --- a/mods/3d_armor/wieldview/README.txt +++ b/mods/3d_armor/wieldview/README.txt @@ -1,7 +1,7 @@ [mod] visible wielded items [wieldview] ======================================= -depends: default, 3d_armor +Depends on: 3d_armor Makes hand wielded items visible to other players. @@ -13,3 +13,11 @@ wieldview_update_time = 2 # Show nodes as tiles, disabled by default wieldview_node_tiles = false + +Info for modders +################ + +Wield image transformation: To apply a simple transformation to the item in +hand, add the group “wieldview_transform” to the item definition. The group +rating equals one of the numbers used for the [transform texture modifier +of the Lua API. diff --git a/mods/3d_armor/wieldview/depends.txt b/mods/3d_armor/wieldview/depends.txt index 585cc7a..b6cac21 100644 --- a/mods/3d_armor/wieldview/depends.txt +++ b/mods/3d_armor/wieldview/depends.txt @@ -1,2 +1 @@ -default 3d_armor diff --git a/mods/3d_armor/wieldview/description.txt b/mods/3d_armor/wieldview/description.txt new file mode 100644 index 0000000..0d51ad9 --- /dev/null +++ b/mods/3d_armor/wieldview/description.txt @@ -0,0 +1 @@ +Makes hand wielded items visible to other players. diff --git a/mods/3d_armor/wieldview/init.lua b/mods/3d_armor/wieldview/init.lua index 7a5a619..45f9fca 100644 --- a/mods/3d_armor/wieldview/init.lua +++ b/mods/3d_armor/wieldview/init.lua @@ -1,13 +1,13 @@ local time = 0 -local update_time = tonumber(minetest.setting_get("wieldview_update_time")) +local update_time = tonumber(minetest.settings:get("wieldview_update_time")) if not update_time then update_time = 2 - minetest.setting_set("wieldview_update_time", tostring(update_time)) + minetest.settings:set("wieldview_update_time", tostring(update_time)) end -local node_tiles = minetest.setting_getbool("wieldview_node_tiles") +local node_tiles = minetest.settings:get_bool("wieldview_node_tiles") if not node_tiles then node_tiles = false - minetest.setting_set("wieldview_node_tiles", "false") + minetest.settings:set("wieldview_node_tiles", "false") end wieldview = { @@ -29,8 +29,15 @@ wieldview.get_item_texture = function(self, item) texture = minetest.inventorycube(minetest.registered_items[item].tiles[1]) end end - if wieldview.transform[item] then - texture = texture.."^[transform"..wieldview.transform[item] + -- Get item image transformation, first from group, then from transform.lua + local transform = minetest.get_item_group(item, "wieldview_transform") + if transform == 0 then + transform = wieldview.transform[item] + end + if transform then + -- This actually works with groups ratings because transform1, transform2, etc. + -- have meaning and transform0 is used for identidy, so it can be ignored + texture = texture.."^[transform"..tostring(transform) end end return texture diff --git a/mods/creative/inventory.lua b/mods/creative/inventory.lua index 0aad92b..0acee72 100644 --- a/mods/creative/inventory.lua +++ b/mods/creative/inventory.lua @@ -183,6 +183,7 @@ creative.register_tab("nodes", "Nodes", minetest.registered_nodes) creative.register_tab("tools", "Tools", minetest.registered_tools) creative.register_tab("craftitems", "Items", minetest.registered_craftitems) + local old_homepage_name = sfinv.get_homepage_name function sfinv.get_homepage_name(player) if creative.is_enabled_for(player:get_player_name()) then diff --git a/mods/inventory_plus/inventory_plus/init.lua b/mods/inventory_plus/inventory_plus/init.lua index a1a9b7f..952093c 100644 --- a/mods/inventory_plus/inventory_plus/init.lua +++ b/mods/inventory_plus/inventory_plus/init.lua @@ -134,21 +134,22 @@ inventory_plus.get_formspec = function(player,page) local formspec = "" local x,y=ox,oy for _, i in ipairs(inventory_plus.buttons[player:get_player_name()]) do - formspec = formspec .. "image_button[0,0;1.6,1.6;inventory_plus_inven.png;inven;]" + --formspec = formspec --.. "image_button[0,0;1.6,1.6;inventory_plus_inven.png;inven;]" x=x+1 if x >= ox+mx then y = y+1 x = ox end end - formspec = formspec .. "label[0.3,1.5;selection]" + --formspec = formspec .. "label[0.3,1.5;selection]" return formspec end -- craft page if page=="main" then if minetest.setting_getbool("creative_mode") then + sfinv.set_player_inventory_formspec(player) return player:get_inventory_formspec() - .. get_buttons(6,0,2) + --.. get_buttons(6,0,2) else return inventory_plus.inventory[player:get_player_name()] .. get_buttons(0,0,3) diff --git a/mods/mobs/api.lua b/mods/mobs/api.lua index 0a37448..722d773 100644 --- a/mods/mobs/api.lua +++ b/mods/mobs/api.lua @@ -1,32 +1,20 @@ --- Mobs Api - -mobs = {} -mobs.mod = "redo" -mobs.version = "20180126" - - --- Intllib +-- Intllib and CMI support check local MP = minetest.get_modpath(minetest.get_current_modname()) local S, NS = dofile(MP .. "/intllib.lua") -mobs.intllib = S - - --- CMI support check local use_cmi = minetest.global_exists("cmi") - --- Invisibility mod check -mobs.invis = {} -if minetest.global_exists("invisibility") then - mobs.invis = invisibility -end - +mobs = { + mod = "redo", + version = "20190124", + intllib = S, + invis = minetest.global_exists("invisibility") and invisibility or {}, +} -- creative check -local creative_mode_cache = minetest.settings:get_bool("creative_mode") +local creative_cache = minetest.settings:get_bool("creative_mode") function mobs.is_creative(name) - return creative_mode_cache or minetest.check_player_privs(name, {creative = true}) + return creative_cache or minetest.check_player_privs(name, {creative = true}) end @@ -60,7 +48,7 @@ local mobs_drop_items = minetest.settings:get_bool("mobs_drop_items") ~= false local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false local creative = minetest.settings:get_bool("creative_mode") local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false -local remove_far = minetest.settings:get_bool("remove_far_mobs") +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) @@ -75,9 +63,7 @@ if peaceful_only then end -- calculate aoc range for mob count -local aosrb = tonumber(minetest.settings:get("active_object_send_range_blocks")) -local abr = tonumber(minetest.settings:get("active_block_range")) -local aoc_range = max(aosrb, abr) * 16 +local aoc_range = tonumber(minetest.settings:get("active_block_range")) * 16 -- pathfinding settings local enable_pathfinding = true @@ -92,9 +78,76 @@ local node_snowblock = "default:snowblock" 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 + fly_in = "air", + owner = "", + order = "", + jump_height = 4, -- was 6 + lifetimer = 180, -- 3 minutes + physical = true, + collisionbox = {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, + visual_size = {x = 1, y = 1}, + makes_footstep_sound = false, + view_range = 5, + walk_velocity = 1, + run_velocity = 2, + light_damage = 0, + light_damage_min = 14, + light_damage_max = 15, + water_damage = 0, + lava_damage = 0, + suffocation = 2, + fall_damage = 1, + fall_speed = -10, -- must be lower than -2 (default: -10) + drops = {}, + armor = 100, + sounds = {}, + jump = true, + knock_back = true, + walk_chance = 50, + attack_chance = 5, + passive = false, + blood_amount = 5, + blood_texture = "mobs_blood.png", + shoot_offset = 0, + floats = 1, -- floats in water by default + replace_offset = 0, + timer = 0, + metadata3 = 0, + env_damage_timer = 0, -- only used when state = "attack" + tamed = false, + pause_timer = 0, + horny = false, + hornytimer = 0, + child = false, + gotten = false, + health = 0, + reach = 3, + htimer = 0, + docile_by_day = false, + time_of_day = 0.5, + fear_height = 0, + runaway_timer = 0, + immune_to = {}, + explosion_timer = 3, + allow_fuse_reset = true, + stop_to_explode = true, + dogshoot_count = 0, + dogshoot_count_max = 5, + dogshoot_count2_max = 5, + group_attack = false, + attack_monsters = false, + attack_animals = false, + attack_players = true, + attack_npcs = true, + facing_fence = false, + _cmi_is_mob = true, +} +local mob_class_meta = {__index = mob_class} -- play sound -local mob_sound = function(self, sound) +function mob_class:mob_sound(sound) if sound then minetest.sound_play(sound, { @@ -107,7 +160,7 @@ end -- attack player/mob -local do_attack = function(self, player) +function mob_class:do_attack(player) if self.state == "attack" then return @@ -117,54 +170,144 @@ local do_attack = function(self, player) self.state = "attack" if random(0, 100) < 90 then - mob_sound(self, self.sounds.war_cry) + self:mob_sound(self.sounds.war_cry) end end +-- calculate distance +local get_distance = function(a, b) + + local x, y, z = a.x - b.x, a.y - b.y, a.z - b.z + + return square(x * x + y * y + z * z) +end + + +-- collision function based on jordan4ibanez' open_ai mod +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 + + local pos2 = object:get_pos() + local vec = {x = pos.x - pos2.x, z = pos.z - pos2.z} + + x = x + vec.x + z = z + vec.z + end + end + + return({x, z}) +end + + -- move mob in facing direction -local set_velocity = function(self, v) +function mob_class:set_velocity(v) + + local c_x, c_y = 0, 0 + + -- can mob be pushed, if so calculate direction + if self.pushable then + 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 - self.object:setvelocity({ - x = sin(yaw) * -v, - y = self.object:getvelocity().y, - z = cos(yaw) * v + self.object:set_velocity({ + x = (sin(yaw) * -v) + c_x, + y = self.object:get_velocity().y, + z = (cos(yaw) * v) + c_y, }) end +-- global version of above function +function mobs:set_velocity(entity, v) + mob_class.set_velocity(entity, v) +end + -- calculate mob velocity -local get_velocity = function(self) +function mob_class:get_velocity() - local v = self.object:getvelocity() + local v = self.object:get_velocity() return (v.x * v.x + v.z * v.z) ^ 0.5 end -- set and return valid yaw -local set_yaw = function(self, yaw) +function mob_class:set_yaw(yaw, delay) if not yaw or yaw ~= yaw then yaw = 0 end - self:setyaw(yaw) + delay = delay or 0 - return yaw + if delay == 0 then + self.object:set_yaw(yaw) + return yaw + end + + self.target_yaw = yaw + self.delay = delay + + return self.target_yaw +end + +-- global function to set mob yaw +function mobs:yaw(entity, yaw, delay) + mob_class.set_yaw(entity, yaw, delay) end -- set defined animation -local set_animation = function(self, anim) +function mob_class:set_animation(anim) 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" + and string.find(self.animation.current, anim) then + return + end + + -- check for more than one animation + local num = 0 + + for n = 1, 4 do + + if self.animation[anim .. n .. "_start"] + and self.animation[anim .. n .. "_end"] then + num = n + end + end + + -- choose random animation from set + if num > 0 then + num = random(0, num) + anim = anim .. (num ~= 0 and num or "") + end + if anim == self.animation.current or not self.animation[anim .. "_start"] or not self.animation[anim .. "_end"] then @@ -180,24 +323,14 @@ local set_animation = function(self, anim) 0, self.animation[anim .. "_loop"] ~= false) end - -- above function exported for mount.lua -function mobs:set_animation(self, anim) - set_animation(self, anim) -end - - --- calculate distance -local get_distance = function(a, b) - - local x, y, z = a.x - b.x, a.y - b.y, a.z - b.z - - return square(x * x + y * y + z * z) +function mobs:set_animation(entity, anim) + mob_class.set_animation(entity, anim) end -- check line of sight (BrunoMine) -local line_of_sight = function(self, pos1, pos2, stepsize) +function mob_class:line_of_sight(pos1, pos2, stepsize) stepsize = stepsize or 1 @@ -228,8 +361,8 @@ local line_of_sight = function(self, pos1, pos2, stepsize) -- It continues to advance in the line of sight in search of a real -- obstruction which counts as 'normal' nodebox. while minetest.registered_nodes[nn] - and (minetest.registered_nodes[nn].walkable == false - or minetest.registered_nodes[nn].drawtype == "nodebox") do + and (minetest.registered_nodes[nn].walkable == false) do +-- or minetest.registered_nodes[nn].drawtype == "nodebox") do -- Check if you can still move forward if td < ad + stepsize then @@ -267,16 +400,101 @@ local line_of_sight = function(self, pos1, pos2, stepsize) end --- are we flying in what we are suppose to? (taikedz) -local flight_check = function(self, pos_w) +-- check line of sight (by BrunoMine, tweaked by Astrobe) +function mob_class:NEW_line_of_sight(pos1, pos2, stepsize) - local nod = self.standing_in - local def = minetest.registered_nodes[nod] + if not pos1 or not pos2 then return end + + stepsize = stepsize or 1 + + local stepv = vector.multiply(vector.direction(pos1, pos2), stepsize) + + local s, pos = minetest.line_of_sight(pos1, pos2, stepsize) + + -- normal walking and flying mobs can see you through air + if s == true then return true end + + -- New pos1 to be analyzed + local npos1 = {x = pos1.x, y = pos1.y, z = pos1.z} + + local r, pos = minetest.line_of_sight(npos1, pos2, stepsize) + + -- Checks the return + if r == true then return true end + + -- Nodename found + 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. + 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) + + if get_distance(npos1, pos2) < stepsize then return true end + + -- scan again + r, pos = minetest.line_of_sight(npos1, pos2, stepsize) + + if r == true then return true end + + -- New Nodename found + nn = minetest.get_node(pos).name + end + + return false +end + +-- global function +function mobs:line_of_sight(entity, pos1, pos2, stepsize) + + return mob_class.line_of_sight(entity, pos1, pos2, stepsize) +end + + +function mob_class:attempt_flight_correction() + + if self:flight_check() 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 searchnodes = self.fly_in + + if type(searchnodes) == "string" then + searchnodes = {self.fly_in} + end + + 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) + + 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) + + self.object:set_velocity( + vector.multiply(escape_direction, self.run_velocity)) + + return true +end + + +-- are we flying in what we are suppose to? (taikedz) +function mob_class:flight_check() + + local def = minetest.registered_nodes[self.standing_in] if not def then return false end -- nil check if type(self.fly_in) == "string" - and nod == self.fly_in then + and self.standing_in == self.fly_in then return true @@ -284,7 +502,7 @@ local flight_check = function(self, pos_w) for _,fly_in in pairs(self.fly_in) do - if nod == fly_in then + if self.standing_in == fly_in then return true end @@ -302,6 +520,57 @@ local flight_check = function(self, pos_w) end +-- if self.stay_near set then check periodically for nodes and turn to face/move +function mob_class:do_stay_near() + + if not self.stay_near then return false end + + local pos = self.object:get_pos() + local searchnodes = self.stay_near[1] + local chance = self.stay_near[2] or 10 + + if random(1, chance) > 1 then + return false + end + + if type(searchnodes) == "string" then + searchnodes = {self.stay_near[1]} + end + + 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) + + 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) + + self:set_animation("walk") + + self:set_velocity(self.walk_velocity) + + return true +end + + -- custom particle effects local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow) @@ -331,7 +600,7 @@ end -- update nametag colour -local update_tag = function(self) +function mob_class:update_tag() local col = "#00FF00" local qua = self.hp_max / 4 @@ -352,12 +621,16 @@ local update_tag = function(self) nametag = self.nametag, nametag_color = col }) - end -- drop items -local item_drop = function(self, cooked) +function mob_class:item_drop() + + -- 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 @@ -365,20 +638,22 @@ local item_drop = function(self, cooked) -- 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 obj, item, num local pos = self.object:get_pos() - self.drops = self.drops or {} -- nil check - for n = 1, #self.drops do if random(1, self.drops[n].chance) == 1 then - num = random(self.drops[n].min or 1, self.drops[n].max or 1) + num = random(self.drops[n].min or 0, self.drops[n].max or 1) item = self.drops[n].name - -- cook items when true - if cooked then + -- cook items on a hot death + if self.cause_of_death.hot then local output = minetest.get_craft_result({ method = "cooking", width = 1, items = {item}}) @@ -388,16 +663,22 @@ local item_drop = function(self, cooked) end end - -- add item if it exists - obj = minetest.add_item(pos, ItemStack(item .. " " .. num)) + -- only drop rare items (drops.min=0) if killed by player + if death_by_player then + obj = minetest.add_item(pos, ItemStack(item .. " " .. num)) + + elseif self.drops[n].min ~= 0 then + obj = minetest.add_item(pos, ItemStack(item .. " " .. num)) + end if obj and obj:get_luaentity() then - obj:setvelocity({ + obj:set_velocity({ x = random(-10, 10) / 9, y = 6, z = random(-10, 10) / 9, }) + elseif obj then obj:remove() -- item does not exist end @@ -409,7 +690,7 @@ end -- check if mob is dead or only hurt -local check_for_death = function(self, cause, cmi_cause) +function mob_class:check_for_death(cmi_cause) -- has health actually changed? if self.health == self.old_health and self.health > 0 then @@ -421,7 +702,7 @@ local check_for_death = function(self, cause, cmi_cause) -- still got some health? play hurt sound if self.health > 0 then - mob_sound(self, self.sounds.damage) + self:mob_sound(self.sounds.damage) -- make sure health isn't higher than max if self.health > self.hp_max then @@ -439,27 +720,25 @@ local check_for_death = function(self, cause, cmi_cause) self.htimer = 2 self.nametag = "♥ " .. self.health .. " / " .. self.hp_max - update_tag(self) + self:update_tag() end return false end - -- dropped cooked item if mob died in lava - if cause == "lava" then - item_drop(self, true) - else - item_drop(self, nil) - end + self.cause_of_death = cmi_cause - mob_sound(self, self.sounds.death) + -- drop items + self:item_drop() + + self:mob_sound(self.sounds.death) local pos = self.object:get_pos() -- execute custom death function if self.on_die then - self.on_die(self, pos) + self:on_die(pos) if use_cmi then cmi.notify_die(self.object, cmi_cause) @@ -485,12 +764,12 @@ local check_for_death = function(self, cause, cmi_cause) self.blinktimer = 0 self.passive = true self.state = "die" - set_velocity(self, 0) - set_animation(self, "die") + self:set_velocity(0) + self:set_animation("die") minetest.after(length, function(self) - if use_cmi then + if use_cmi and self.object:get_luaentity() then cmi.notify_die(self.object, cmi_cause) end @@ -511,24 +790,8 @@ local check_for_death = function(self, cause, cmi_cause) end --- check if within physical map limits (-30911 to 30927) -local within_limits = function(pos, radius) - - if (pos.x - radius) > -30913 - and (pos.x + radius) < 30928 - and (pos.y - radius) > -30913 - and (pos.y + radius) < 30928 - and (pos.z - radius) > -30913 - and (pos.z + radius) < 30928 then - return true -- within limits - end - - return false -- beyond limits -end - - -- is mob facing a cliff -local is_at_cliff = function(self) +function mob_class:is_at_cliff() if self.fear_height == 0 then -- 0 for no falling protection! return false @@ -563,12 +826,12 @@ local node_ok = function(pos, fallback) return node end - return minetest.registered_nodes[fallback] -- {name = fallback} + return minetest.registered_nodes[fallback] end -- environmental damage (water, lava, fire, light etc.) -local do_env_damage = function(self) +function mob_class:do_env_damage() -- feed/tame text timer (so mob 'full' messages dont spam chat) if self.htimer > 0 then @@ -581,47 +844,33 @@ local do_env_damage = function(self) self.nametag = self.nametag2 self.nametag2 = nil - update_tag(self) + self:update_tag() end local pos = self.object:get_pos() self.time_of_day = minetest.get_timeofday() - -- remove mob if beyond map limits - if not within_limits(pos, 0) then + -- remove mob if standing inside ignore node + if self.standing_in == "ignore" then self.object:remove() return end - -- bright light harms mob - if self.light_damage ~= 0 --- and pos.y > 0 --- and self.time_of_day > 0.2 --- and self.time_of_day < 0.8 - and (minetest.get_node_light(pos) or 0) > 12 then + -- is mob light sensative, or scared of the dark :P + if self.light_damage ~= 0 then - self.health = self.health - self.light_damage + local light = minetest.get_node_light(pos) or 0 - effect(pos, 5, "tnt_smoke.png") + if light >= self.light_damage_min + and light <= self.light_damage_max then - if check_for_death(self, "light", {type = "light"}) then return end - end + self.health = self.health - self.light_damage - local y_level = self.collisionbox[2] + effect(pos, 5, "tnt_smoke.png") - if self.child then - y_level = self.collisionbox[2] * 0.5 - end - - -- what is mob standing in? - pos.y = pos.y + y_level + 0.25 -- foot level - self.standing_in = node_ok(pos, "air").name --- print ("standing in " .. self.standing_in) - - -- don't fall when on ignore, just stand still - if self.standing_in == "ignore" then - self.object:setvelocity({x = 0, y = 0, z = 0}) + if self:check_for_death({type = "light"}) then return end + end end local nodef = minetest.registered_nodes[self.standing_in] @@ -638,15 +887,16 @@ local do_env_damage = function(self) effect(pos, 5, "bubble.png", nil, nil, 1, nil) - if check_for_death(self, "water", {type = "environment", + if self:check_for_death({type = "environment", pos = pos, node = self.standing_in}) then return end end - -- lava or fire + -- lava or fire or ignition source elseif self.lava_damage - and (nodef.groups.lava - or self.standing_in == node_fire - or self.standing_in == node_permanent_flame) then + 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 @@ -654,8 +904,8 @@ local do_env_damage = function(self) effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) - if check_for_death(self, "lava", {type = "environment", - pos = pos, node = self.standing_in}) then return end + if self:check_for_death({type = "environment", + pos = pos, node = self.standing_in, hot = true}) then return end end -- damage_per_second node check @@ -665,7 +915,7 @@ local do_env_damage = function(self) effect(pos, 5, "tnt_smoke.png") - if check_for_death(self, "dps", {type = "environment", + if self:check_for_death({type = "environment", pos = pos, node = self.standing_in}) then return end end --[[ @@ -677,21 +927,22 @@ local do_env_damage = function(self) self.health = self.health - self.suffocation - if check_for_death(self, "suffocation", {type = "environment", + if self:check_for_death({type = "environment", pos = pos, node = self.standing_in}) then return end end ]] - check_for_death(self, "", {type = "unknown"}) + self:check_for_death({type = "unknown"}) end -- jump if facing a solid node (not fences or gates) -local do_jump = function(self) +function mob_class:do_jump() if not self.jump or self.jump_height == 0 or self.fly - or self.child then + or self.child + or self.order == "stand" then return false end @@ -699,8 +950,8 @@ local do_jump = function(self) -- something stopping us while moving? if self.state ~= "stand" - and get_velocity(self) > 0.5 - and self.object:getvelocity().y ~= 0 then + and self:get_velocity() > 0.5 + and self.object:get_velocity().y ~= 0 then return false end @@ -742,21 +993,50 @@ local do_jump = function(self) if not nod.name:find("fence") and not nod.name:find("gate") then - local v = self.object:getvelocity() + local v = self.object:get_velocity() v.y = self.jump_height - set_animation(self, "jump") -- only when defined + self:set_animation("jump") -- only when defined - self.object:setvelocity(v) + self.object:set_velocity(v) -if get_velocity(self) > 0 then - mob_sound(self, self.sounds.jump) -end + -- when in air move forward + minetest.after(0.3, function(self, v) + + if self.object:get_luaentity() then + + self.object:set_acceleration({ + x = v.x * 2,--1.5, + y = 0, + z = v.z * 2,--1.5 + }) + end + end, self, v) + + if self:get_velocity() > 0 then + self:mob_sound(self.sounds.jump) + end else self.facing_fence = true 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 + + self.jump_count = (self.jump_count or 0) + 1 +--print ("----", self.jump_count) + if self.jump_count == 4 then + + local yaw = self.object:get_yaw() or 0 + + yaw = self:set_yaw(yaw + 1.35, 8) +--print ("---- turn") + self.jump_count = 0 + end + end + return true end @@ -777,6 +1057,7 @@ local entity_physics = function(pos, radius) obj_pos = objs[n]:get_pos() dist = get_distance(pos, obj_pos) + if dist < 1 then dist = 1 end local damage = floor((4 / dist) * radius) @@ -792,7 +1073,7 @@ end -- should mob follow what I'm holding ? -local follow_holding = function(self, clicker) +function mob_class:follow_holding(clicker) if mobs.invis[clicker:get_player_name()] then return false @@ -822,7 +1103,7 @@ end -- find two animals of same type and breed if nearby and horny -local breed = function(self) +function mob_class:breed() -- child takes 240 seconds before growing into adult if self.child == true then @@ -847,7 +1128,7 @@ local breed = function(self) self.on_grown(self) else -- jump when fully grown so as not to fall into ground - self.object:setvelocity({ + self.object:set_velocity({ x = 0, y = self.jump_height, z = 0 @@ -923,13 +1204,17 @@ local breed = function(self) ent.hornytimer = 41 -- spawn baby - minetest.after(5, function() + minetest.after(5, function(self, ent) + + if not self.object:get_luaentity() then + return + end -- custom breed function if self.on_breed then -- when false skip going any further - if self.on_breed(self, ent) == false then + if self:on_breed(ent) == false then return end else @@ -973,7 +1258,7 @@ local breed = function(self) ent2.child = true ent2.tamed = true ent2.owner = self.owner - end) + end, self, ent) num = 0 @@ -985,13 +1270,13 @@ end -- find and replace what mob is looking for (grass, wheat etc.) -local replace = function(self, pos) +function mob_class:replace(pos) if not mobs_griefing or not self.replace_rate or not self.replace_what or self.child == true - or self.object:getvelocity().y ~= 0 + or self.object:get_velocity().y ~= 0 or random(1, self.replace_rate) > 1 then return end @@ -1022,25 +1307,18 @@ local replace = function(self, pos) local on_replace_return if self.on_replace then - on_replace_return = self.on_replace(self, pos, oldnode, newnode) + on_replace_return = self:on_replace(pos, oldnode, newnode) end if on_replace_return ~= false then - minetest.set_node(pos, {name = with}) - - -- when cow/sheep eats grass, replace wool and milk - if self.gotten == true then - self.gotten = false - self.object:set_properties(self) - end end end end -- check if daytime and also if mob is docile during daylight hours -local day_docile = function(self) +function mob_class:day_docile() if self.docile_by_day == false then @@ -1055,13 +1333,18 @@ local day_docile = function(self) end --- path finding and smart mob routine by rnd -local smart_mobs = function(self, s, p, dist, dtime) +local los_switcher = false +local height_switcher = false + +-- 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 = self.attack:get_pos() + -- is it becoming stuck? - if abs(s1.x - s.x) + abs(s1.z - s.z) < 1.5 then + if abs(s1.x - s.x) + abs(s1.z - s.z) < .5 then self.path.stuck_timer = self.path.stuck_timer + dtime else self.path.stuck_timer = 0 @@ -1069,12 +1352,82 @@ local smart_mobs = function(self, s, p, dist, dtime) self.path.lastpos = {x = s.x, y = s.y, z = s.z} - -- im stuck, search for path - if (self.path.stuck_timer > stuck_timeout and not self.path.following) - or (self.path.stuck_timer > stuck_path_timeout and self.path.following) then + local use_pathfind = false + local has_lineofsight = minetest.line_of_sight( + {x = s.x, y = (s.y) + .5, z = s.z}, + {x = target_pos.x, y = (target_pos.y) + 1.5, z = target_pos.z}, .2) + -- im stuck, search for path + if not has_lineofsight then + + if los_switcher == true then + use_pathfind = true + los_switcher = false + end -- cannot see target! + else + if los_switcher == false then + + los_switcher = true + use_pathfind = false + + minetest.after(1, function(self) + + if self.object:get_luaentity() then + + if has_lineofsight then + self.path.following = false + end + end + end, self) + end -- can see target! + end + + if (self.path.stuck_timer > stuck_timeout and not self.path.following) then + + use_pathfind = true self.path.stuck_timer = 0 + minetest.after(1, function(self) + + if self.object:get_luaentity() then + + if has_lineofsight then + self.path.following = false + end + end + end, self) + end + + if (self.path.stuck_timer > stuck_path_timeout and self.path.following) then + + use_pathfind = true + self.path.stuck_timer = 0 + + minetest.after(1, function(self) + + if self.object:get_luaentity() then + + if has_lineofsight then + self.path.following = false + end + end + end, self) + end + + if abs(vector.subtract(s,target_pos).y) > self.stepheight then + + if height_switcher then + use_pathfind = true + height_switcher = false + end + else + if not height_switcher then + use_pathfind = false + height_switcher = true + end + end + + if use_pathfind then -- lets try find a path, first take care of positions -- since pathfinder is very sensitive local sheight = self.collisionbox[5] - self.collisionbox[2] @@ -1102,18 +1455,29 @@ local smart_mobs = function(self, s, p, dist, dtime) local dropheight = 6 if self.fear_height ~= 0 then dropheight = self.fear_height end --- self.path.way = minetest.find_path(s, p1, 16, 2, 6, "Dijkstra") - self.path.way = minetest.find_path(s, p1, 16, self.stepheight, dropheight, "A*_noprefetch") + self.path.way = minetest.find_path(s, p1, 16, self.stepheight, dropheight, "Dijkstra") - -- attempt to unstick mob that is "daydreaming" - self.object:setpos({ - x = s.x + 0.1 * (random() * 2 - 1), - y = s.y + 1, - z = s.z + 0.1 * (random() * 2 - 1) - }) +--[[ + -- show path using particles + if self.path.way and #self.path.way > 0 then + print ("-- path length:" .. tonumber(#self.path.way)) + for _,pos in pairs(self.path.way) do + minetest.add_particle({ + pos = pos, + velocity = {x=0, y=0, z=0}, + acceleration = {x=0, y=0, z=0}, + expirationtime = 1, + size = 4, + collisiondetection = false, + vertical = false, + texture = "heart.png", + }) + end + end +]] self.state = "" - do_attack(self, self.attack) + self:do_attack(self.attack) -- no path found, try something else if not self.path.way then @@ -1162,7 +1526,7 @@ local smart_mobs = function(self, s, p, dist, dtime) end s.y = s.y - sheight - self.object:setpos({x = s.x, y = s.y + 2, z = s.z}) + self.object:set_pos({x = s.x, y = s.y + 2, z = s.z}) else -- dig 2 blocks to make door toward player direction @@ -1179,11 +1543,11 @@ local smart_mobs = function(self, s, p, dist, dtime) local ndef1 = minetest.registered_nodes[node1] if node1 ~= "air" - and node1 ~= "ignore" - and ndef1 - and not ndef1.groups.level - and not ndef1.groups.unbreakable - and not ndef1.groups.liquid then + and node1 ~= "ignore" + and ndef1 + and not ndef1.groups.level + and not ndef1.groups.unbreakable + and not ndef1.groups.liquid then minetest.add_item(p1, ItemStack(node1)) minetest.set_node(p1, {name = "air"}) @@ -1212,12 +1576,11 @@ local smart_mobs = function(self, s, p, dist, dtime) self.path.stuck_timer = stuck_timeout - 2 -- frustration! cant find the damn path :( - mob_sound(self, self.sounds.random) + --self:mob_sound(self.sounds.random) else -- yay i found path - mob_sound(self, self.sounds.attack) - - set_velocity(self, self.walk_velocity) + self:mob_sound(self.sounds.war_cry) + self:set_velocity(self.walk_velocity) -- follow path now that it has it self.path.following = true @@ -1246,114 +1609,83 @@ local specific_attack = function(list, what) end --- monster find someone to attack -local monster_attack = function(self) +-- general attack function for all mobs ========== +function mob_class:general_attack() - if self.type ~= "monster" - or not damage_enabled - or creative + -- return if already attacking, passive or docile during day + if self.passive or self.state == "attack" - or day_docile(self) then + or self:day_docile() then return end local s = self.object:get_pos() - local p, sp, dist - local player, obj, min_player - local type, name = "", "" - local min_dist = self.view_range + 1 local objs = minetest.get_objects_inside_radius(s, self.view_range) + -- remove entities we aren't interested in for n = 1, #objs do + local ent = objs[n]:get_luaentity() + + -- are we a player? if objs[n]:is_player() then - if mobs.invis[ objs[n]:get_player_name() ] then - - type = "" - else - player = objs[n] - type = "player" - name = "player" + -- if player invisible or mob not setup to attack then remove from list + if 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 + objs[n] = nil +--print("- pla", n) end + + -- or are we a mob? + elseif ent and ent._cmi_is_mob then + + -- remove mobs not to attack + if self.name == ent.name + 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 + objs[n] = nil +--print("- mob", n, self.name, ent.name) + end + + -- remove all other entities else - obj = objs[n]:get_luaentity() - - if obj then - player = obj.object - type = obj.type - name = obj.name or "" - end - end - - -- find specific mob to attack, failing that attack player/npc/animal - if specific_attack(self.specific_attack, name) - and (type == "player" or type == "npc" - or (type == "animal" and self.attack_animals == true)) then - - s = self.object:get_pos() - p = player:get_pos() - sp = s - - -- aim higher to make looking up hills more realistic - p.y = p.y + 1 - sp.y = sp.y + 1 - - dist = get_distance(p, s) - - if dist < self.view_range then - -- field of view check goes here - - -- choose closest player to attack - if line_of_sight(self, sp, p, 2) == true - and dist < min_dist then - min_dist = dist - min_player = player - end - end +--print(" -obj", n) + objs[n] = nil end end - -- attack player - if min_player then - do_attack(self, min_player) - end -end - - --- npc, find closest monster to attack -local npc_attack = function(self) - - if self.type ~= "npc" - or not self.attacks_monsters - or self.state == "attack" then - return - end - - local p, sp, obj, min_player - local s = self.object:get_pos() + local p, sp, dist, min_player local min_dist = self.view_range + 1 - local objs = minetest.get_objects_inside_radius(s, self.view_range) - for n = 1, #objs do + -- go through remaining entities and select closest + for _,player in pairs(objs) do - obj = objs[n]:get_luaentity() + p = player:get_pos() + sp = s - if obj and obj.type == "monster" then + dist = get_distance(p, s) - p = obj.object:get_pos() + -- aim higher to make looking up hills more realistic + p.y = p.y + 1 + sp.y = sp.y + 1 - dist = get_distance(p, s) - - if dist < min_dist then - min_dist = dist - min_player = obj.object - end + -- 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 + min_dist = dist + min_player = player end end - if min_player then - do_attack(self, min_player) + -- attack closest player or mob + if min_player and random(1, 100) > self.attack_chance then + self:do_attack(min_player) end end @@ -1369,7 +1701,7 @@ local specific_runaway = function(list, what) -- found entity on list to attack? for no = 1, #list do - if list[no] == what or list[no] == "player" then + if list[no] == what then return true end end @@ -1379,16 +1711,15 @@ end -- find someone to runaway from -local runaway_from = function(self) +function mob_class:do_runaway_from() if not self.runaway_from then return end local s = self.object:get_pos() - local p, sp, dist - local player, obj, min_player - local type, name = "", "" + local p, sp, dist, pname + local player, obj, min_player, name local min_dist = self.view_range + 1 local objs = minetest.get_objects_inside_radius(s, self.view_range) @@ -1396,12 +1727,14 @@ local runaway_from = function(self) if objs[n]:is_player() then - if mobs.invis[ objs[n]:get_player_name() ] then + pname = objs[n]:get_player_name() - type = "" + if mobs.invis[pname] + or self.owner == pname then + + name = "" else player = objs[n] - type = "player" name = "player" end else @@ -1409,7 +1742,6 @@ local runaway_from = function(self) if obj then player = obj.object - type = obj.type name = obj.name or "" end end @@ -1418,7 +1750,6 @@ local runaway_from = function(self) if name ~= "" and name ~= self.name and specific_runaway(self.runaway_from, name) then - s = self.object:get_pos() p = player:get_pos() sp = s @@ -1428,20 +1759,15 @@ local runaway_from = function(self) dist = get_distance(p, s) - if dist < self.view_range then - -- field of view check goes here - - -- choose closest player/mpb to runaway from - if line_of_sight(self, sp, p, 2) == true - and dist < min_dist then - min_dist = dist - min_player = player - end + -- choose closest player/mob to runaway from + if dist < min_dist + and self:line_of_sight(sp, p, 2) == true then + min_dist = dist + min_player = player end end end - -- attack player if min_player then local lp = player:get_pos() @@ -1457,7 +1783,7 @@ local runaway_from = function(self) yaw = yaw + pi end - yaw = set_yaw(self.object, yaw) + yaw = self:set_yaw(yaw, 4) self.state = "runaway" self.runaway_timer = 3 self.following = nil @@ -1466,7 +1792,7 @@ end -- follow player if owner or holding item, if fish outta water then flop -local follow_flop = function(self) +function mob_class:follow_flop() -- find player to follow if (self.follow ~= "" @@ -1505,7 +1831,7 @@ local follow_flop = function(self) -- stop following player if not holding specific item if self.following and self.following:is_player() - and follow_holding(self, self.following) == false then + and self:follow_holding(self.following) == false then self.following = nil end @@ -1543,20 +1869,20 @@ local follow_flop = function(self) if p.x > s.x then yaw = yaw + pi end - yaw = set_yaw(self.object, yaw) + yaw = self:set_yaw(yaw, 6) -- anyone but standing npc's can move along if dist > self.reach and self.order ~= "stand" then - set_velocity(self, self.walk_velocity) + self:set_velocity(self.walk_velocity) if self.walk_chance ~= 0 then - set_animation(self, "walk") + self:set_animation("walk") end else - set_velocity(self, 0) - set_animation(self, "stand") + self:set_velocity(0) + self:set_animation("stand") end return @@ -1566,13 +1892,15 @@ local follow_flop = function(self) -- 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 flight_check(self, s) then + + if not self:attempt_flight_correction() then self.state = "flop" - self.object:setvelocity({x = 0, y = -5, z = 0}) + self.object:set_velocity({x = 0, y = -5, z = 0}) - set_animation(self, "stand") + self:set_animation("stand") return elseif self.state == "flop" then @@ -1583,7 +1911,7 @@ end -- dogshoot attack switch and counter function -local dogswitch = function(self, dtime) +function mob_class:dogswitch(dtime) -- switch mode not activated if not self.dogshoot_switch @@ -1612,7 +1940,7 @@ end -- execute current state (stand, walk, run, attacks) -local do_states = function(self, dtime) +function mob_class:do_states(dtime) local yaw = self.object:get_yaw() or 0 @@ -1647,34 +1975,22 @@ local do_states = function(self, dtime) yaw = yaw + random(-0.5, 0.5) end - yaw = set_yaw(self.object, yaw) + yaw = self:set_yaw(yaw, 8) end - set_velocity(self, 0) - set_animation(self, "stand") + self:set_velocity(0) + self:set_animation("stand") - -- npc's ordered to stand stay standing - if self.type ~= "npc" - or self.order ~= "stand" then + -- mobs ordered to stand stay standing + if self.order ~= "stand" + and self.walk_chance ~= 0 + and self.facing_fence ~= true + and random(1, 100) <= self.walk_chance + and self:is_at_cliff() == false then - if self.walk_chance ~= 0 - and self.facing_fence ~= true - and random(1, 100) <= self.walk_chance - and is_at_cliff(self) == false then - - set_velocity(self, self.walk_velocity) - self.state = "walk" - set_animation(self, "walk") - - -- fly up/down randomly for flying mobs - if self.fly and random(1, 100) <= self.walk_chance then - - local v = self.object:getvelocity() - local ud = random(-1, 2) / 9 - - self.object:setvelocity({x = v.x, y = ud, z = v.z}) - end - end + self:set_velocity(self.walk_velocity) + self.state = "walk" + self:set_animation("walk") end elseif self.state == "walk" then @@ -1721,9 +2037,9 @@ local do_states = function(self, dtime) if lp.x > s.x then yaw = yaw + pi end -- look towards land and jump/move in that direction - yaw = set_yaw(self.object, yaw) - do_jump(self) - set_velocity(self, self.walk_velocity) + yaw = self:set_yaw(yaw, 6) + self:do_jump() + self:set_velocity(self.walk_velocity) else yaw = yaw + random(-0.5, 0.5) end @@ -1740,36 +2056,36 @@ local do_states = function(self, dtime) if lp.x > s.x then yaw = yaw + pi end end - yaw = set_yaw(self.object, yaw) + yaw = self:set_yaw(yaw, 8) -- otherwise randomly turn elseif random(1, 100) <= 30 then yaw = yaw + random(-0.5, 0.5) - yaw = set_yaw(self.object, yaw) + yaw = self:set_yaw(yaw, 8) end -- stand for great fall in front - local temp_is_cliff = is_at_cliff(self) + local temp_is_cliff = self:is_at_cliff() if self.facing_fence == true or temp_is_cliff or random(1, 100) <= 30 then - set_velocity(self, 0) + self:set_velocity(0) self.state = "stand" - set_animation(self, "stand") + self:set_animation("stand") else - set_velocity(self, self.walk_velocity) + self:set_velocity(self.walk_velocity) - if flight_check(self) + if self:flight_check() and self.animation and self.animation.fly_start and self.animation.fly_end then - set_animation(self, "fly") + self:set_animation("fly") else - set_animation(self, "walk") + self:set_animation("walk") end end @@ -1780,14 +2096,15 @@ local do_states = function(self, dtime) -- stop after 5 seconds or when at cliff if self.runaway_timer > 5 - or is_at_cliff(self) then + or self:is_at_cliff() + or self.order == "stand" then self.runaway_timer = 0 - set_velocity(self, 0) + self:set_velocity(0) self.state = "stand" - set_animation(self, "stand") + self:set_animation("stand") else - set_velocity(self, self.run_velocity) - set_animation(self, "walk") + self:set_velocity(self.run_velocity) + self:set_animation("walk") end -- attack routines (explode, dogfight, shoot, dogshoot) @@ -1798,7 +2115,7 @@ local do_states = function(self, dtime) local p = self.attack:get_pos() or s local dist = get_distance(p, s) - -- stop attacking if player or out of range + -- stop attacking if player invisible or out of range if dist > self.view_range or not self.attack or not self.attack:get_pos() @@ -1807,12 +2124,13 @@ local do_states = function(self, dtime) -- print(" ** stop attacking **", dist, self.view_range) self.state = "stand" - set_velocity(self, 0) - set_animation(self, "stand") + self:set_velocity(0) + self:set_animation("stand") self.attack = nil self.v_start = false self.timer = 0 self.blinktimer = 0 + self.path.way = nil return end @@ -1828,27 +2146,46 @@ local do_states = function(self, dtime) if p.x > s.x then yaw = yaw + pi end - yaw = set_yaw(self.object, yaw) + yaw = self:set_yaw(yaw) + + local node_break_radius = self.explosion_radius or 1 + local entity_damage_radius = self.explosion_damage_radius + or (node_break_radius * 2) + + -- start timer when in reach and line of sight + if not self.v_start + and dist <= self.reach + and self:line_of_sight(s, p, 2) then - -- start timer when inside reach - if dist < self.reach and not self.v_start then self.v_start = true self.timer = 0 self.blinktimer = 0 + self:mob_sound(self.sounds.fuse) -- print ("=== explosion timer started", self.explosion_timer) + + -- stop timer if out of reach or direct line of sight + elseif self.allow_fuse_reset + and self.v_start + and (dist > self.reach + or not self:line_of_sight(s, p, 2)) then + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.blinkstatus = false + self.object:settexturemod("") end - -- walk right up to player when timer active - if dist < 1.5 and self.v_start then - set_velocity(self, 0) + -- walk right up to player unless the timer is active + if self.v_start and (self.stop_to_explode or dist < 1.5) then + self:set_velocity(0) else - set_velocity(self, self.run_velocity) + self:set_velocity(self.run_velocity) end if self.animation and self.animation.run_start then - set_animation(self, "run") + self:set_animation("run") else - set_animation(self, "walk") + self:set_animation("walk") end if self.v_start then @@ -1874,14 +2211,12 @@ local do_states = function(self, dtime) if self.timer > self.explosion_timer then local pos = self.object:get_pos() - local radius = self.explosion_radius or 1 - local damage_radius = radius -- dont damage anything if area protected or next to water if minetest.find_node_near(pos, 1, {"group:water"}) or minetest.is_protected(pos, "") then - damage_radius = 0 + node_break_radius = 1 end self.object:remove() @@ -1890,8 +2225,8 @@ local do_states = function(self, dtime) and not minetest.is_protected(pos, "") then tnt.boom(pos, { - radius = radius, - damage_radius = damage_radius, + radius = node_break_radius, + damage_radius = entity_damage_radius, sound = self.sounds.explode, }) else @@ -1902,8 +2237,8 @@ local do_states = function(self, dtime) max_hear_distance = self.sounds.distance or 32 }) - entity_physics(pos, damage_radius) - effect(pos, 32, "tnt_smoke.png", radius * 3, radius * 5, radius, 1, 0) + entity_physics(pos, entity_damage_radius) + effect(pos, 32, "tnt_smoke.png", nil, nil, node_break_radius, 1, 0) end return @@ -1911,8 +2246,8 @@ local do_states = function(self, dtime) end elseif self.attack_type == "dogfight" - or (self.attack_type == "dogshoot" and dogswitch(self, dtime) == 2) - or (self.attack_type == "dogshoot" and dist <= self.reach and dogswitch(self) == 0) then + or (self.attack_type == "dogshoot" and self:dogswitch(dtime) == 2) + or (self.attack_type == "dogshoot" and dist <= self.reach and self:dogswitch() == 0) then if self.fly and dist > self.reach then @@ -1921,13 +2256,13 @@ local do_states = function(self, dtime) local me_y = floor(p1.y) local p2 = p local p_y = floor(p2.y + 1) - local v = self.object:getvelocity() + local v = self.object:get_velocity() - if flight_check(self, s) then + if self:flight_check() then if me_y < p_y then - self.object:setvelocity({ + self.object:set_velocity({ x = v.x, y = 1 * self.walk_velocity, z = v.z @@ -1935,7 +2270,7 @@ local do_states = function(self, dtime) elseif me_y > p_y then - self.object:setvelocity({ + self.object:set_velocity({ x = v.x, y = -1 * self.walk_velocity, z = v.z @@ -1944,7 +2279,7 @@ local do_states = function(self, dtime) else if me_y < p_y then - self.object:setvelocity({ + self.object:set_velocity({ x = v.x, y = 0.01, z = v.z @@ -1952,7 +2287,7 @@ local do_states = function(self, dtime) elseif me_y > p_y then - self.object:setvelocity({ + self.object:set_velocity({ x = v.x, y = -0.01, z = v.z @@ -1999,7 +2334,7 @@ local do_states = function(self, dtime) if p.x > s.x then yaw = yaw + pi end - yaw = set_yaw(self.object, yaw) + yaw = self:set_yaw(yaw) -- move towards enemy if beyond mob reach if dist > self.reach then @@ -2008,25 +2343,25 @@ local do_states = function(self, dtime) if self.pathfinding -- only if mob has pathfinding enabled and enable_pathfinding then - smart_mobs(self, s, p, dist, dtime) + self:smart_mobs(s, p, dist, dtime) end - if is_at_cliff(self) then + if self:is_at_cliff() then - set_velocity(self, 0) - set_animation(self, "stand") + self:set_velocity(0) + self:set_animation("stand") else if self.path.stuck then - set_velocity(self, self.walk_velocity) + self:set_velocity(self.walk_velocity) else - set_velocity(self, self.run_velocity) + self:set_velocity(self.run_velocity) end if self.animation and self.animation.run_start then - set_animation(self, "run") + self:set_animation("run") else - set_animation(self, "walk") + self:set_animation("walk") end end @@ -2036,7 +2371,7 @@ local do_states = function(self, dtime) self.path.stuck_timer = 0 self.path.following = false -- not stuck anymore - set_velocity(self, 0) + self:set_velocity(0) if not self.custom_attack then @@ -2044,12 +2379,12 @@ local do_states = function(self, dtime) self.timer = 0 - if self.double_melee_attack - and random(1, 2) == 1 then - set_animation(self, "punch2") - else - set_animation(self, "punch") - end +-- if self.double_melee_attack +-- and random(1, 2) == 1 then +-- self:set_animation("punch2") +-- else + self:set_animation("punch") +-- end local p2 = p local s2 = s @@ -2057,10 +2392,10 @@ local do_states = function(self, dtime) p2.y = p2.y + .5 s2.y = s2.y + .5 - if line_of_sight(self, p2, s2) == true then + if self:line_of_sight(p2, s2) == true then -- play attack sound - mob_sound(self, self.sounds.attack) + self:mob_sound(self.sounds.attack) -- punch player (or what player is attached to) local attached = self.attack:get_attach() @@ -2079,14 +2414,14 @@ local do_states = function(self, dtime) self.timer = 0 - self.custom_attack(self, p) + self:custom_attack(p) end end end elseif self.attack_type == "shoot" - or (self.attack_type == "dogshoot" and dogswitch(self, dtime) == 1) - or (self.attack_type == "dogshoot" and dist > self.reach and dogswitch(self) == 0) then + or (self.attack_type == "dogshoot" and self:dogswitch(dtime) == 1) + or (self.attack_type == "dogshoot" and dist > self.reach and self:dogswitch() == 0) then p.y = p.y - .5 s.y = s.y + .5 @@ -2102,19 +2437,19 @@ local do_states = function(self, dtime) if p.x > s.x then yaw = yaw + pi end - yaw = set_yaw(self.object, yaw) + yaw = self:set_yaw(yaw) - set_velocity(self, 0) + self:set_velocity(0) if self.shoot_interval and self.timer > self.shoot_interval and random(1, 100) <= 60 then self.timer = 0 - set_animation(self, "shoot") + self:set_animation("shoot") -- play shoot attack sound - mob_sound(self, self.sounds.shoot_attack) + self:mob_sound(self.sounds.shoot_attack) local p = self.object:get_pos() @@ -2136,7 +2471,7 @@ local do_states = function(self, dtime) vec.y = vec.y * (v / amount) vec.z = vec.z * (v / amount) - obj:setvelocity(vec) + obj:set_velocity(vec) end end end @@ -2145,19 +2480,19 @@ end -- falling and fall damage -local falling = function(self, pos) +function mob_class:falling(pos) - if self.fly then + if self.fly or self.disable_falling then return end -- floating in water (or falling) - local v = self.object:getvelocity() + local v = self.object:get_velocity() if v.y > 0 then -- apply gravity when moving up - self.object:setacceleration({ + self.object:set_acceleration({ x = 0, y = -10, z = 0 @@ -2166,25 +2501,25 @@ local falling = function(self, pos) elseif v.y <= 0 and v.y > self.fall_speed then -- fall downwards at set speed - self.object:setacceleration({ + self.object:set_acceleration({ x = 0, y = self.fall_speed, z = 0 }) else -- stop accelerating once max fall speed hit - self.object:setacceleration({x = 0, y = 0, z = 0}) + self.object:set_acceleration({x = 0, y = 0, z = 0}) end -- in water then float up --- if minetest.registered_nodes[node_ok(pos).name].groups.liquid then - if minetest.registered_nodes[node_ok(pos).name].groups.water then + if self.standing_in + and minetest.registered_nodes[self.standing_in].groups.water then if self.floats == 1 then - self.object:setacceleration({ + self.object:set_acceleration({ x = 0, - y = -self.fall_speed / (max(1, v.y) ^ 2), + y = -self.fall_speed / (max(1, v.y) ^ 8), -- 8 was 2 z = 0 }) end @@ -2192,7 +2527,7 @@ local falling = function(self, pos) -- fall damage onto solid ground if self.fall_damage == 1 - and self.object:getvelocity().y == 0 then + and self.object:get_velocity().y == 0 then local d = (self.old_y or 0) - self.object:get_pos().y @@ -2202,7 +2537,7 @@ local falling = function(self, pos) effect(pos, 5, "tnt_smoke.png", 1, 2, 2, nil) - if check_for_death(self, "fall", {type = "fall"}) then + if self:check_for_death({type = "fall"}) then return end end @@ -2213,22 +2548,22 @@ local falling = function(self, pos) end +-- is Took Ranks mod active? +local tr = minetest.get_modpath("toolranks") + -- deal damage and effects when mob punched -local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) - - -- custom punch function - if self.do_punch then - - -- when false skip going any further - if self.do_punch(self, hitter, tflp, tool_caps, dir) == false then - return - end - end +function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) -- mob health check --- if self.health <= 0 then --- return --- end + if self.health <= 0 then + return + end + + -- custom punch function + if self.do_punch + and self:do_punch(hitter, tflp, tool_capabilities, dir) == false then + return + end -- error checking when mod profiling is enabled if not tool_capabilities then @@ -2243,9 +2578,8 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) return end - - -- weapon wear local weapon = hitter:get_wielded_item() + local weapon_def = weapon:get_definition() or {} local punch_interval = 1.4 -- calculate mob damage @@ -2280,10 +2614,14 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- check for tool immunity or special damage for n = 1, #self.immune_to do - if self.immune_to[n][1] == weapon:get_name() then + if self.immune_to[n][1] == weapon_def.name then damage = self.immune_to[n][2] or 0 break + + -- if "all" then no tool does 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 @@ -2295,39 +2633,57 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- print ("Mob Damage is", damage) - if use_cmi then - - local cancel = cmi.notify_punch(self.object, hitter, tflp, tool_capabilities, dir, damage) - - if cancel then return end + if use_cmi + and cmi.notify_punch(self.object, hitter, tflp, tool_capabilities, dir, damage) then + return end -- add weapon wear - if tool_capabilities then - punch_interval = tool_capabilities.full_punch_interval or 1.4 + punch_interval = tool_capabilities.full_punch_interval or 1.4 + + --[[ toolrank support + local wear = floor((punch_interval / 75) * 9000) + + if mobs.is_creative(hitter:get_player_name()) then + + if tr then + wear = 1 + else + wear = 0 + end end + + if tr then + if weapon_def.original_description then + toolranks.new_afteruse(weapon, hitter, nil, {wear = wear}) + end + else + weapon:add_wear(wear) + end + + hitter:set_wielded_item(weapon) +--]] -- only play hit sound and show blood effects if damage is 1 or over if damage >= 1 then -- weapon sounds - if weapon:get_definition().sounds ~= nil then + if weapon_def.sounds then - local s = random(0, #weapon:get_definition().sounds) + local s = random(0, #weapon_def.sounds) - minetest.sound_play(weapon:get_definition().sounds[s], { - object = self.object, --hitter, + minetest.sound_play(weapon_def.sounds[s], { + object = self.object, max_hear_distance = 8 }) else minetest.sound_play("default_punch", { - object = self.object, --hitter, + object = self.object, max_hear_distance = 5 }) end -- blood_particles - if self.blood_amount > 0 - and not disable_blood then + if not disable_blood and self.blood_amount > 0 then local pos = self.object:get_pos() @@ -2347,24 +2703,23 @@ local mob_punch = function(self, 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 - self.health = self.health - floor(damage) + self.health = self.health - floor(damage) end - -- exit here if dead, special item check - if weapon:get_name() == "mobs:pick_lava" then - if check_for_death(self, "lava", {type = "punch", - puncher = hitter}) then - return - end - else - if check_for_death(self, "hit", {type = "punch", - puncher = hitter}) then - return - 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 end --[[ add healthy afterglow when hit (can cause hit lag with larger textures) - core.after(0.1, function() + minetest.after(0.1, function() + + if not self.object:get_luaentity() then return end + self.object:settexturemod("^[colorize:#c9900070") core.after(0.3, function() @@ -2372,43 +2727,40 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) end) end) ]] - -- knock back effect (only on full punch) - if self.knock_back > 0 - and tflp >= punch_interval then - - local v = self.object:getvelocity() - local r = 1.4 - min(punch_interval, 1.4) - local kb = r * 5 - local up = 2 - - -- if already in air then dont go up anymore when hit - if v.y > 0 - or self.fly then - up = 0 - end - - -- direction error check - dir = dir or {x = 0, y = 0, z = 0} - - -- check if tool already has specific knockback value - if tool_capabilities.damage_groups["knockback"] then - kb = tool_capabilities.damage_groups["knockback"] - else - kb = kb * 1.5 - end - - self.object:setvelocity({ - x = dir.x * kb, - y = up, - z = dir.z * kb - }) - - self.pause_timer = 0.25 - end 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() + local kb = damage or 1 + local up = 2 + + -- if already in air then dont go up anymore when hit + if v.y > 0 + or self.fly then + up = 0 + end + + -- direction error check + 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) + + self.object:set_velocity({ + x = dir.x * kb, + y = up, + z = dir.z * kb + }) + + self.pause_timer = 0.25 + end + -- if skittish then run away - if self.runaway == true then + if self.runaway == true + and self.order ~= "stand" then local lp = hitter:get_pos() local s = self.object:get_pos() @@ -2424,7 +2776,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) yaw = yaw + pi end - yaw = set_yaw(self.object, yaw) + yaw = self:set_yaw(yaw, 6) self.state = "runaway" self.runaway_timer = 0 self.following = nil @@ -2436,12 +2788,13 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) if self.passive == false and self.state ~= "flop" and self.child == false + and self.attack_players == true and hitter:get_player_name() ~= self.owner and not mobs.invis[ name ] then -- attack whoever punched mob self.state = "" - do_attack(self, hitter) + self:do_attack(hitter) -- alert others to the attack local objs = minetest.get_objects_inside_radius(hitter:get_pos(), self.view_range) @@ -2451,19 +2804,19 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) obj = objs[n]:get_luaentity() - if obj then + if obj and obj._cmi_is_mob then -- only alert members of same mob if obj.group_attack == true and obj.state ~= "attack" and obj.owner ~= name and obj.name == self.name then - do_attack(obj, hitter) + obj:do_attack(hitter) end -- have owned mobs attack player threat if obj.owner == name and obj.owner_loyal then - do_attack(obj, self.object) + obj:do_attack(self.object) end end end @@ -2472,7 +2825,7 @@ end -- get entity staticdata -local mob_staticdata = function(self) +function mob_class:get_staticdata() -- remove mob when out of range unless tamed if remove_far @@ -2524,7 +2877,7 @@ end -- activate mob and reload settings -local mob_activate = function(self, staticdata, def, dtime) +function mob_class:mob_activate(staticdata, def, dtime) -- remove monsters in peaceful mode if self.type == "monster" @@ -2548,11 +2901,11 @@ local mob_activate = function(self, staticdata, def, dtime) if not self.base_texture then -- compatiblity with old simple mobs textures - if type(def.textures[1]) == "string" then + if def.textures and type(def.textures[1]) == "string" then def.textures = {def.textures} end - self.base_texture = def.textures[random(1, #def.textures)] + self.base_texture = def.textures and def.textures[random(1, #def.textures)] self.base_mesh = def.mesh self.base_size = self.visual_size self.base_colbox = self.collisionbox @@ -2635,7 +2988,7 @@ local mob_activate = function(self, staticdata, def, dtime) self.collisionbox = colbox self.selectionbox = selbox self.visual_size = vis_size - self.standing_in = "" + self.standing_in = "air" -- check existing nametag if not self.nametag then @@ -2644,7 +2997,7 @@ local mob_activate = function(self, staticdata, def, dtime) -- set anything changed above self.object:set_properties(self) - if self.name == "mobs:dog" then + 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"}}) @@ -2779,9 +3132,9 @@ local mob_activate = function(self, staticdata, def, dtime) self.jump = false end end - set_yaw(self.object, (random(0, 360) - 180) / 180 * pi) - update_tag(self) - set_animation(self, "stand") + self:set_yaw((random(0, 360) - 180) / 180 * pi, 6) + self:update_tag() + self:set_animation("stand") -- run on_spawn function if found if self.on_spawn and not self.on_spawn_run then @@ -2802,9 +3155,49 @@ local mob_activate = function(self, staticdata, def, dtime) end +-- handle mob lifetimer and expiration +function mob_class:mob_expire(pos, dtime) + + -- when lifetimer expires remove mob (except npc and tamed) + if self.type ~= "npc" + and not self.tamed + and self.state ~= "attack" + and remove_far ~= true + and self.lifetimer < 20000 then + + self.lifetimer = self.lifetimer - dtime + + if self.lifetimer <= 0 then + + -- only despawn away from player + local objs = minetest.get_objects_inside_radius(pos, 15) + + for n = 1, #objs do + + if objs[n]:is_player() then + + self.lifetimer = 20 + + return + end + end + +-- minetest.log("action", +-- S("lifetimer expired, removed @1", self.name)) + + effect(pos, 15, "tnt_smoke.png", 2, 4, 2, 0) + + self.object:remove() + + return + end + end +end + + -- main mob function -local mob_step = function(self, dtime) - self.metadata3 = self.metadata3 + dtime +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 @@ -3156,42 +3549,70 @@ local mob_step = function(self, dtime) local pos = self.object:get_pos() local yaw = 0 - -- when lifetimer expires remove mob (except npc and tamed) - if self.type ~= "npc" - and not self.tamed - and self.state ~= "attack" - and remove_far ~= true - and self.lifetimer < 20000 then + -- get node at foot level every quarter second + self.node_timer = (self.node_timer or 0) + dtime - self.lifetimer = self.lifetimer - dtime + if self.node_timer > 0.25 then - if self.lifetimer <= 0 then + self.node_timer = 0 - -- only despawn away from player - local objs = minetest.get_objects_inside_radius(pos, 15) + local y_level = self.collisionbox[2] - for n = 1, #objs do + if self.child then + y_level = self.collisionbox[2] * 0.5 + end - if objs[n]:is_player() then + -- 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.lifetimer = 20 + -- check for mob expiration (0.25 instead of dtime since were in a timer) + self:mob_expire(pos, 0.25) + end - return + -- check if falling, flying, floating + self:falling(pos) + + -- smooth rotation by ThomasMonroe314 + + if self.delay and self.delay > 0 then + + local yaw = self.object:get_yaw() + + if self.delay == 1 then + yaw = self.target_yaw + else + local dif = abs(yaw - self.target_yaw) + + if yaw > self.target_yaw then + + if dif > pi then + dif = 2 * pi - dif -- need to add + yaw = yaw + dif / self.delay + else + yaw = yaw - dif / self.delay -- need to subtract + end + + elseif yaw < self.target_yaw then + + if dif > pi then + dif = 2 * pi - dif + yaw = yaw - dif / self.delay -- need to subtract + else + yaw = yaw + dif / self.delay -- need to add end end --- minetest.log("action", --- S("lifetimer expired, removed @1", self.name)) - - effect(pos, 15, "tnt_smoke.png", 2, 4, 2, 0) - - self.object:remove() - - return + if yaw > (pi * 2) then yaw = yaw - (pi * 2) end + if yaw < 0 then yaw = yaw + (pi * 2) end end + + self.delay = self.delay - 1 + self.object:set_yaw(yaw) end - falling(self, pos) + -- end rotation -- knockback timer if self.pause_timer > 0 then @@ -3205,7 +3626,7 @@ local mob_step = function(self, dtime) if self.do_custom then -- when false skip going any further - if self.do_custom(self, dtime) == false then + if self:do_custom(dtime) == false then return end end @@ -3227,12 +3648,9 @@ local mob_step = function(self, dtime) self.timer = 1 end - -- node replace check (cow eats grass etc.) - replace(self, pos) - -- mob plays random sound at times if random(1, 100) == 1 then - mob_sound(self, self.sounds.random) + self:mob_sound(self.sounds.random) end -- environmental damage timer (every 1 second) @@ -3243,39 +3661,29 @@ local mob_step = function(self, dtime) self.env_damage_timer = 0 - do_env_damage(self) + -- check for environmental damage (water, fire, lava etc.) + self:do_env_damage() + + -- node replace check (cow eats grass etc.) + self:replace(pos) end - monster_attack(self) + self:general_attack() - npc_attack(self) + self:breed() - breed(self) + self:follow_flop() - follow_flop(self) + self:do_states(dtime) - do_states(self, dtime) + self:do_jump() - do_jump(self) - - runaway_from(self) + self:do_runaway_from(self) + self:do_stay_near() end --- default function when mobs are blown up with TNT -local do_tnt = function(obj, damage) - - --print ("----- Damage", damage) - - obj.object:punch(obj.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = damage}, - }, nil) - - return false, true, {} -end - function update(self, clicker) if self.name == "mobs:dog" then if self.owner ~= clicker:get_player_name() then @@ -3532,6 +3940,20 @@ function update(self, clicker) end end +-- default function when mobs are blown up with TNT +function mob_class:on_blast(damage) + + --print ("----- Damage", damage) + + self.object:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = damage}, + }, nil) + + return false, true, {} +end + + mobs.spawning_mobs = {} -- register mob entity @@ -3539,126 +3961,112 @@ function mobs:register_mob(name, def) mobs.spawning_mobs[name] = true -minetest.register_entity(name, { +minetest.register_entity(name, setmetatable({ - stepheight = def.stepheight or 1.1, -- was 0.6 + stepheight = def.stepheight, name = name, type = def.type, attack_type = def.attack_type, fly = def.fly, - fly_in = def.fly_in or "air", - owner = def.owner or "", - order = def.order or "", + fly_in = def.fly_in, + owner = def.owner, + order = def.order, on_die = def.on_die, do_custom = def.do_custom, - jump_height = def.jump_height or 4, -- was 6 + 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 - lifetimer = def.lifetimer or 180, -- 3 minutes + lifetimer = def.lifetimer, hp_min = max(1, (def.hp_min or 5) * difficulty), hp_max = max(1, (def.hp_max or 10) * difficulty), - physical = true, collisionbox = def.collisionbox, selectionbox = def.selectionbox or def.collisionbox, visual = def.visual, - visual_size = def.visual_size or {x = 1, y = 1}, + visual_size = def.visual_size, mesh = def.mesh, - makes_footstep_sound = def.makes_footstep_sound or false, - view_range = def.view_range or 5, - walk_velocity = def.walk_velocity or 1, - run_velocity = def.run_velocity or 2, + makes_footstep_sound = def.makes_footstep_sound, + view_range = def.view_range, + walk_velocity = def.walk_velocity, + run_velocity = def.run_velocity, damage = max(0, (def.damage or 0) * difficulty), - light_damage = def.light_damage or 0, - water_damage = def.water_damage or 0, - lava_damage = def.lava_damage or 0, - suffocation = def.suffocation or 2, - fall_damage = def.fall_damage or 1, - fall_speed = def.fall_speed or -10, -- must be lower than -2 (default: -10) - drops = def.drops or {}, - armor = def.armor or 100, + light_damage = def.light_damage, + light_damage_min = def.light_damage_min, + light_damage_max = def.light_damage_max, + water_damage = def.water_damage, + lava_damage = def.lava_damage, + suffocation = def.suffocation, + fall_damage = def.fall_damage, + fall_speed = def.fall_speed, + drops = def.drops, + armor = def.armor, on_rightclick = def.on_rightclick, arrow = def.arrow, shoot_interval = def.shoot_interval, - sounds = def.sounds or {}, + sounds = def.sounds, animation = def.animation, follow = def.follow, - jump = def.jump ~= false, - walk_chance = def.walk_chance or 50, - attacks_monsters = def.attacks_monsters or false, - group_attack = def.group_attack or false, - passive = def.passive or false, - knock_back = def.knock_back or 3, - blood_amount = def.blood_amount or 5, - blood_texture = def.blood_texture or "mobs_blood.png", - shoot_offset = def.shoot_offset or 0, - floats = def.floats or 1, -- floats in water by default + jump = def.jump, + walk_chance = def.walk_chance, + attack_chance = def.attack_chance, + passive = def.passive, + knock_back = def.knock_back, + blood_amount = def.blood_amount, + blood_texture = def.blood_texture, + shoot_offset = def.shoot_offset, + floats = def.floats, replace_rate = def.replace_rate, replace_what = def.replace_what, replace_with = def.replace_with, - replace_offset = def.replace_offset or 0, + replace_offset = def.replace_offset, on_replace = def.on_replace, - timer = 0, - metadata = def.metadata, - metadata2 = def.metadata2, - metadata3 = 0, - env_damage_timer = 0, -- only used when state = "attack" - tamed = false, - pause_timer = 0, - horny = false, - hornytimer = 0, - child = false, - gotten = false, - health = 0, - reach = def.reach or 3, - htimer = 0, + reach = def.reach, texture_list = def.textures, child_texture = def.child_texture, - docile_by_day = def.docile_by_day or false, - time_of_day = 0.5, - fear_height = def.fear_height or 0, + docile_by_day = def.docile_by_day, + fear_height = def.fear_height, runaway = def.runaway, - runaway_timer = 0, pathfinding = def.pathfinding, - immune_to = def.immune_to or {}, + immune_to = def.immune_to, explosion_radius = def.explosion_radius, - explosion_timer = def.explosion_timer or 3, + explosion_damage_radius = def.explosion_damage_radius, + explosion_timer = def.explosion_timer, + allow_fuse_reset = def.allow_fuse_reset, + stop_to_explode = def.stop_to_explode, custom_attack = def.custom_attack, double_melee_attack = def.double_melee_attack, dogshoot_switch = def.dogshoot_switch, - dogshoot_count = 0, - dogshoot_count_max = def.dogshoot_count_max or 5, - dogshoot_count2_max = def.dogshoot_count2_max or (def.dogshoot_count_max or 5), - attack_animals = def.attack_animals or false, + dogshoot_count_max = def.dogshoot_count_max, + dogshoot_count2_max = def.dogshoot_count2_max or def.dogshoot_count_max, + group_attack = def.group_attack, + attack_monsters = def.attacks_monsters or def.attack_monsters, + attack_animals = def.attack_animals, + attack_players = def.attack_players, + attack_npcs = def.attack_npcs, specific_attack = def.specific_attack, runaway_from = def.runaway_from, owner_loyal = def.owner_loyal, - facing_fence = false, - _cmi_is_mob = true, + pushable = def.pushable, + stay_near = def.stay_near, + metadata = def.metadata, + metadata2 = def.metadata2, on_spawn = def.on_spawn, - on_blast = def.on_blast or do_tnt, - - on_step = mob_step, + on_blast = def.on_blast, -- class redifinition do_punch = def.do_punch, - on_punch = mob_punch, - on_breed = def.on_breed, on_grown = def.on_grown, - on_rightclick = function(self, clicker) + on_rightclick = function(self, clicker) update(self, clicker) end, on_activate = function(self, staticdata, dtime) - return mob_activate(self, staticdata, def, dtime) + return self:mob_activate(staticdata, def, dtime) end, - - get_staticdata = function(self) - return mob_staticdata(self) - end, - on_receive_fields = function(self, fields, sender) + + on_receive_fields = function(self, fields, sender) if self.owner == sender:get_player_name() then if fields.leave then @@ -3746,7 +4154,8 @@ minetest.register_entity(name, { end end end, -}) + +}, mob_class_meta)) end -- END mobs:register_mob function @@ -3754,36 +4163,35 @@ end -- END mobs:register_mob function -- count how many mobs of one type are inside an area local count_mobs = function(pos, type) - local num_type = 0 - local num_total = 0 - local objs = minetest.get_objects_inside_radius(pos, aoc_range) + local total = 0 + local objs = minetest.get_objects_inside_radius(pos, aoc_range * 2) + local ent for n = 1, #objs do if not objs[n]:is_player() then - local obj = objs[n]:get_luaentity() + ent = objs[n]:get_luaentity() -- count mob type and add to total also - if obj and obj.name and obj.name == type then - - num_type = num_type + 1 - num_total = num_total + 1 - - -- add to total mobs - elseif obj and obj.name and obj.health ~= nil then - - num_total = num_total + 1 + if ent and ent.name and ent.name == type then + total = total + 1 end end end - return num_type, num_total + return total end -- global functions +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) @@ -3806,7 +4214,8 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, end minetest.log("action", - string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc)) + string.format("[mobs] Chance setting for %s changed to %s (total: %s)", + name, chance, aoc)) end @@ -3828,10 +4237,22 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, return end - -- do not spawn if too many of same mob in area - if active_object_count_wider >= max_per_block - or count_mobs(pos, name) >= aoc then ---print ("--- too many entities", name, aoc, active_object_count_wider) + -- 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 >= max_per_block then +--print("--- too many entities in area", active_object_count_wider) + return + end + + -- get total number of this mob in area + local num_mob = count_mobs(pos, name) + + if num_mob >= aoc then +--print ("--- too many " .. name .. " in area", num_mob .. "/" .. aoc) return end @@ -3858,24 +4279,6 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, -- spawn above node pos.y = pos.y + 1 - -- only spawn away from player - local objs = minetest.get_objects_inside_radius(pos, 10) - - for n = 1, #objs do - - if objs[n]:is_player() then ---print ("--- player too close", name) - return - end - 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 - -- are we spawning within height limits? if pos.y > max_height or pos.y < min_height then @@ -3892,9 +4295,22 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, return end + -- only spawn away from player + local objs = minetest.get_objects_inside_radius(pos, 10) + + for n = 1, #objs do + + if objs[n]:is_player() then +--print ("--- player too close", name) + return + end + end + -- do we have enough height clearance to spawn mob? local ent = minetest.registered_entities[name] - local height = max(0, math.ceil(ent.collisionbox[5] - ent.collisionbox[2]) - 1) + local height = max(1, math.ceil( + (ent.collisionbox[5] or 0.25) - + (ent.collisionbox[2] or -0.25) - 1)) for n = 0, height do @@ -3906,6 +4322,13 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, end 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 + -- spawn mob half block higher than ground pos.y = pos.y + 0.5 @@ -3937,21 +4360,20 @@ end -- MarkBu's spawn function function mobs:spawn(def) - local name = def.name - local nodes = def.nodes or {"group:soil", "group:stone"} - local neighbors = def.neighbors or {"air"} - local min_light = def.min_light or 0 - local max_light = def.max_light or 15 - local interval = def.interval or 30 - local chance = def.chance or 5000 - local active_object_count = def.active_object_count or 1 - local min_height = def.min_height or -31000 - local max_height = def.max_height or 31000 - local day_toggle = def.day_toggle - local on_spawn = def.on_spawn - - mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, interval, - chance, active_object_count, min_height, max_height, day_toggle, on_spawn) + mobs:spawn_specific( + def.name, + def.nodes or {"group:soil", "group:stone"}, + def.neighbors or {"air"}, + def.min_light or 0, + def.max_light or 15, + def.interval or 30, + def.chance or 5000, + def.active_object_count or 1, + def.min_height or -31000, + def.max_height or 31000, + def.day_toggle, + def.on_spawn + ) end @@ -3971,7 +4393,7 @@ function mobs:register_arrow(name, def) hit_node = def.hit_node, hit_mob = def.hit_mob, drop = def.drop or false, -- drops arrow as registered item when true - collisionbox = {0, 0, 0, 0, 0, 0}, -- remove box around arrows + collisionbox = def.collisionbox or {0, 0, 0, 0, 0, 0}, timer = 0, switch = 0, owner_id = def.owner_id, @@ -3981,6 +4403,9 @@ function mobs:register_arrow(name, def) on_activate = def.on_activate, + 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 @@ -3988,8 +4413,7 @@ function mobs:register_arrow(name, def) local pos = self.object:get_pos() if self.switch == 0 - or self.timer > 150 - or not within_limits(pos, 0) then + or self.timer > 150 then self.object:remove() ; -- print ("removed arrow") @@ -4019,7 +4443,7 @@ function mobs:register_arrow(name, def) if minetest.registered_nodes[node].walkable then - self.hit_node(self, pos, node) + self:hit_node(pos, node) if self.drop == true then @@ -4043,7 +4467,7 @@ function mobs:register_arrow(name, def) if self.hit_player and player:is_player() then - self.hit_player(self, player) + self:hit_player(player) self.object:remove() ; -- print ("hit player") return end @@ -4056,7 +4480,7 @@ function mobs:register_arrow(name, def) and tostring(player) ~= self.owner_id and entity.name ~= self.object:get_luaentity().name then - self.hit_mob(self, player) + self:hit_mob(player) self.object:remove() ; --print ("hit mob") @@ -4073,8 +4497,9 @@ end -- compatibility function function mobs:explosion(pos, radius) - local self = {sounds = {}} - self.sounds.explode = "tnt_explode" + + local self = {sounds = {explode = "tnt_explode"}} + mobs:boom(self, pos, radius) end @@ -4089,6 +4514,7 @@ function mobs:safe_boom(self, pos, radius) }) entity_physics(pos, radius) + effect(pos, 32, "tnt_smoke.png", radius * 3, radius * 5, radius, 1, 0) end @@ -4153,7 +4579,6 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) end if pos - and within_limits(pos, 0) and not minetest.is_protected(pos, placer:get_player_name()) then if not minetest.registered_entities[mob] then @@ -4200,7 +4625,6 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) end if pos - and within_limits(pos, 0) and not minetest.is_protected(pos, placer:get_player_name()) then if not minetest.registered_entities[mob] then @@ -4232,8 +4656,44 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) end +-- force capture a mob if space available in inventory, or drop as spawn egg +function mobs:force_capture(self, clicker) + + -- add special mob egg with all mob information + local new_stack = ItemStack(self.name .. "_set") + + local tmp = {} + + for _,stat in pairs(self) do + local t = type(stat) + if t ~= "function" + and t ~= "nil" + and t ~= "userdata" then + tmp[_] = self[_] + end + end + + local data_str = minetest.serialize(tmp) + + new_stack:set_metadata(data_str) + + local inv = clicker:get_inventory() + + if inv:room_for_item("main", new_stack) then + inv:add_item("main", new_stack) + else + minetest.add_item(clicker:get_pos(), new_stack) + end + + self.object:remove() + + self:mob_sound("default_place_node_hard") +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() @@ -4265,7 +4725,7 @@ function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, minetest.chat_send_player(name, S("Not tamed!")) - return true -- false + return false end -- cannot pick up if not owner @@ -4274,7 +4734,7 @@ function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, minetest.chat_send_player(name, S("@1 is owner!", self.owner)) - return true -- false + return false end if clicker:get_inventory():room_for_item("main", mobname) then @@ -4304,7 +4764,7 @@ function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, end -- calculate chance.. add to inventory if successful? - if chance > 0 and random(1, 100) <= chance then + if chance and chance > 0 and random(1, 100) <= chance then -- default mob egg local new_stack = ItemStack(mobname) @@ -4341,13 +4801,20 @@ function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, self.object:remove() - mob_sound(self, "default_place_node_hard") + self:mob_sound("default_place_node_hard") + return new_stack - else + -- when chance above fails or set to 0, miss! + elseif chance and chance ~= 0 then minetest.chat_send_player(name, S("Missed!")) - mob_sound(self, "mobs_swing") + self:mob_sound("mobs_swing") + return false + + -- when chance set to nil always return a miss (used for npc walk/follow) + elseif not chance then + return false end end @@ -4387,7 +4854,7 @@ function mobs:protect(self, clicker) effect(self.object:get_pos(), 25, "mobs_protect_particle.png", 0.5, 4, 2, 15) - mob_sound(self, "mobs_spell") + self:mob_sound("mobs_spell") return true end @@ -4399,12 +4866,9 @@ local mob_sta = {} -- feeding, taming and breeding (thanks blert2112) function mobs:feed_tame(self, clicker, feed_count, breed, tame) - if not self.follow then - return false - end - -- can eat/tame with item in hand - if follow_holding(self, clicker) then + if self.follow + and self:follow_holding(clicker) then -- if not in creative then take item if not mobs.is_creative(clicker:get_player_name()) then @@ -4435,7 +4899,7 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) self.object:set_hp(self.health) - update_tag(self) + self:update_tag() -- make children grow quicker if self.child == true then @@ -4447,6 +4911,7 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) -- feed and tame self.food = (self.food or 0) + 1 + if self.food >= feed_count then self.food = 0 @@ -4455,8 +4920,6 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) self.horny = true end - self.gotten = false - if tame then if self.tamed == false then @@ -4473,7 +4936,7 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) end -- make sound when fed so many times - mob_sound(self, self.sounds.random) + self:mob_sound(self.sounds.random) end return true @@ -4496,13 +4959,13 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) 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;" .. minetest.formspec_escape(S("Rename")) .. "]") - + .. "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")) .. "]") end return false - end @@ -4521,6 +4984,13 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) return end + -- make sure nametag is being used to name mob + local item = player:get_wielded_item() + + if item:get_name() ~= "mobs:nametag" then + return + end + -- limit name entered to 64 characters long if string.len(fields.name) > 64 then fields.name = string.sub(fields.name, 1, 64) @@ -4529,7 +4999,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) -- update nametag mob_obj[name].nametag = fields.name - update_tag(mob_obj[name]) + mob_obj[name]:update_tag() -- if not in creative then take item if not mobs.is_creative(name) then @@ -4542,7 +5012,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) -- reset external variables mob_obj[name] = nil mob_sta[name] = nil - end end) @@ -4558,12 +5027,10 @@ function mobs:alias_mob(old_name, new_name) physical = false, - on_step = function(self) - - local pos = self.object:get_pos() + on_activate = function(self) if minetest.registered_entities[new_name] then - minetest.add_entity(pos, new_name) + minetest.add_entity(self.object:get_pos(), new_name) end self.object:remove() diff --git a/mods/mobs/api_old.lua b/mods/mobs/api_old.lua index 7db26f4..0a37448 100644 --- a/mods/mobs/api_old.lua +++ b/mods/mobs/api_old.lua @@ -1,35 +1,35 @@ --- Mobs Api (4th June 2017) +-- Mobs Api mobs = {} mobs.mod = "redo" -mobs.version = "20170604" +mobs.version = "20180126" -- Intllib -local S - -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function(s, a, ...) a = {a, ...} - return s:gsub("@(%d+)", function(n) - return a[tonumber(n)] - end) - end - -end - +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/intllib.lua") mobs.intllib = S +-- CMI support check +local use_cmi = minetest.global_exists("cmi") + + -- Invisibility mod check mobs.invis = {} -if rawget(_G, "invisibility") then +if minetest.global_exists("invisibility") then mobs.invis = invisibility end +-- creative check +local creative_mode_cache = minetest.settings:get_bool("creative_mode") +function mobs.is_creative(name) + return creative_mode_cache or minetest.check_player_privs(name, {creative = true}) +end + + -- localize math functions local pi = math.pi local square = math.sqrt @@ -52,19 +52,31 @@ end -- Load settings -local damage_enabled = minetest.setting_getbool("enable_damage") -local peaceful_only = minetest.setting_getbool("only_peaceful_mobs") -local disable_blood = minetest.setting_getbool("mobs_disable_blood") -local creative = minetest.setting_getbool("creative_mode") -local spawn_protected = tonumber(minetest.setting_get("mobs_spawn_protected")) or 1 -local remove_far = minetest.setting_getbool("remove_far_mobs") -local difficulty = tonumber(minetest.setting_get("mob_difficulty")) or 1.0 -local show_health = minetest.setting_getbool("mob_show_health") ~= false -local max_per_block = tonumber(minetest.setting_get("max_objects_per_block") or 99) +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") +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) + +-- Peaceful mode message so players will know there are no monsters +if peaceful_only then + minetest.register_on_joinplayer(function(player) + minetest.chat_send_player(player:get_player_name(), + S("** Peaceful Mode Active - No Monsters Will Spawn")) + end) +end -- calculate aoc range for mob count -local aosrb = tonumber(minetest.setting_get("active_object_send_range_blocks")) -local abr = tonumber(minetest.setting_get("active_block_range")) +local aosrb = tonumber(minetest.settings:get("active_object_send_range_blocks")) +local abr = tonumber(minetest.settings:get("active_block_range")) local aoc_range = max(aosrb, abr) * 16 -- pathfinding settings @@ -72,6 +84,14 @@ local enable_pathfinding = true local stuck_timeout = 3 -- how long before mob gets stuck in place and starts searching local stuck_path_timeout = 10 -- how long will mob follow path before giving up +-- default nodes +local node_fire = "fire:basic_flame" +local node_permanent_flame = "fire:permanent_flame" +local node_ice = "default:ice" +local node_snowblock = "default:snowblock" +local node_snow = "default:snow" +mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "default:dirt" + -- play sound local mob_sound = function(self, sound) @@ -105,7 +125,7 @@ end -- move mob in facing direction local set_velocity = function(self, v) - local yaw = (self.object:getyaw() or 0) + self.rotate + local yaw = (self.object:get_yaw() or 0) + self.rotate self.object:setvelocity({ x = sin(yaw) * -v, @@ -115,7 +135,7 @@ local set_velocity = function(self, v) end --- get overall speed of mob +-- calculate mob velocity local get_velocity = function(self) local v = self.object:getvelocity() @@ -124,7 +144,7 @@ local get_velocity = function(self) end --- set yaw +-- set and return valid yaw local set_yaw = function(self, yaw) if not yaw or yaw ~= yaw then @@ -140,7 +160,8 @@ end -- set defined animation local set_animation = function(self, anim) - if not self.animation then return end + if not self.animation + or not anim then return end self.animation.current = self.animation.current or "" @@ -154,19 +175,19 @@ local set_animation = function(self, anim) 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) - + y = self.animation[anim .. "_end"]}, + 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(anim) +function mobs:set_animation(self, anim) set_animation(self, anim) end --- this is a faster way to calculate distance +-- calculate distance local get_distance = function(a, b) local x, y, z = a.x - b.x, a.y - b.y, a.z - b.z @@ -250,9 +271,12 @@ end local flight_check = function(self, pos_w) local nod = self.standing_in + local def = minetest.registered_nodes[nod] + + if not def then return false end -- nil check if type(self.fly_in) == "string" - and (nod == self.fly_in or nod == self.fly_in:gsub("_source", "_flowing")) then + and nod == self.fly_in then return true @@ -260,24 +284,32 @@ local flight_check = function(self, pos_w) for _,fly_in in pairs(self.fly_in) do - if nod == fly_in or nod == fly_in:gsub("_source", "_flowing") then + if nod == fly_in then return true end end end + -- stops mobs getting stuck inside stairs and plantlike nodes + if def.drawtype ~= "airlike" + and def.drawtype ~= "liquid" + and def.drawtype ~= "flowingliquid" then + return true + end + return false end --- particle effects -local effect = function(pos, amount, texture, min_size, max_size, radius, gravity) +-- custom particle effects +local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow) radius = radius or 2 min_size = min_size or 0.5 max_size = max_size or 1 gravity = gravity or -10 + glow = glow or 0 minetest.add_particlespawner({ amount = amount, @@ -293,6 +325,7 @@ local effect = function(pos, amount, texture, min_size, max_size, radius, gravit minsize = min_size, maxsize = max_size, texture = texture, + glow = glow, }) end @@ -326,8 +359,14 @@ end -- drop items local item_drop = function(self, cooked) + -- 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 + local obj, item, num - local pos = self.object:getpos() + local pos = self.object:get_pos() self.drops = self.drops or {} -- nil check @@ -335,7 +374,7 @@ local item_drop = function(self, cooked) if random(1, self.drops[n].chance) == 1 then - num = random(self.drops[n].min, self.drops[n].max) + num = random(self.drops[n].min or 1, self.drops[n].max or 1) item = self.drops[n].name -- cook items when true @@ -370,7 +409,7 @@ end -- check if mob is dead or only hurt -local check_for_death = function(self, cause) +local check_for_death = function(self, cause, cmi_cause) -- has health actually changed? if self.health == self.old_health and self.health > 0 then @@ -394,7 +433,8 @@ local check_for_death = function(self, cause) self.nametag2 = self.nametag or "" end - if show_health then + if show_health + and (cmi_cause and cmi_cause.type == "punch") then self.htimer = 2 self.nametag = "♥ " .. self.health .. " / " .. self.hp_max @@ -405,6 +445,7 @@ local check_for_death = function(self, cause) return false end + -- dropped cooked item if mob died in lava if cause == "lava" then item_drop(self, true) else @@ -413,12 +454,17 @@ local check_for_death = function(self, cause) mob_sound(self, self.sounds.death) - local pos = self.object:getpos() + local pos = self.object:get_pos() -- execute custom death function if self.on_die then self.on_die(self, pos) + + if use_cmi then + cmi.notify_die(self.object, cmi_cause) + end + self.object:remove() return true @@ -429,6 +475,10 @@ local check_for_death = function(self, cause) 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) + self.attack = nil self.v_start = false self.timer = 0 @@ -438,10 +488,20 @@ local check_for_death = function(self, cause) set_velocity(self, 0) set_animation(self, "die") - minetest.after(2, function(self) + minetest.after(length, function(self) + + if use_cmi then + cmi.notify_die(self.object, cmi_cause) + end + self.object:remove() end, self) else + + if use_cmi then + cmi.notify_die(self.object, cmi_cause) + end + self.object:remove() end @@ -474,10 +534,10 @@ local is_at_cliff = function(self) return false end - local yaw = self.object:getyaw() + 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:getpos() + local pos = self.object:get_pos() local ypos = pos.y + self.collisionbox[2] -- just above floor if minetest.line_of_sight( @@ -495,23 +555,19 @@ end -- get node but use fallback for nil or unknown local node_ok = function(pos, fallback) - fallback = fallback or "default:dirt" + fallback = fallback or mobs.fallback_node local node = minetest.get_node_or_nil(pos) - if not node then - return minetest.registered_nodes[fallback] - end - - if minetest.registered_nodes[node.name] then + if node and minetest.registered_nodes[node.name] then return node end - return minetest.registered_nodes[fallback] + return minetest.registered_nodes[fallback] -- {name = fallback} end --- environmental damage (water, lava, fire, light) +-- environmental damage (water, lava, fire, light etc.) local do_env_damage = function(self) -- feed/tame text timer (so mob 'full' messages dont spam chat) @@ -528,7 +584,7 @@ local do_env_damage = function(self) update_tag(self) end - local pos = self.object:getpos() + local pos = self.object:get_pos() self.time_of_day = minetest.get_timeofday() @@ -538,76 +594,94 @@ local do_env_damage = function(self) return end - -- daylight above ground + -- bright light harms mob if self.light_damage ~= 0 - and pos.y > 0 - and self.time_of_day > 0.2 - and self.time_of_day < 0.8 +-- and pos.y > 0 +-- and self.time_of_day > 0.2 +-- and self.time_of_day < 0.8 and (minetest.get_node_light(pos) or 0) > 12 then self.health = self.health - self.light_damage effect(pos, 5, "tnt_smoke.png") - if check_for_death(self, "light") then return end + if check_for_death(self, "light", {type = "light"}) then return end + end + + local y_level = self.collisionbox[2] + + if self.child then + y_level = self.collisionbox[2] * 0.5 end -- what is mob standing in? - pos.y = pos.y + self.collisionbox[2] + 0.1 -- foot level + pos.y = pos.y + y_level + 0.25 -- foot level self.standing_in = node_ok(pos, "air").name -- print ("standing in " .. self.standing_in) -- don't fall when on ignore, just stand still if self.standing_in == "ignore" then self.object:setvelocity({x = 0, y = 0, z = 0}) - --print ("--- stopping on ignore") end - if self.water_damage ~= 0 - or self.lava_damage ~= 0 then + local nodef = minetest.registered_nodes[self.standing_in] - local nodef = minetest.registered_nodes[self.standing_in] + pos.y = pos.y + 1 -- for particle effect position - pos.y = pos.y + 1 + -- water + if self.water_damage + and nodef.groups.water then - -- water - if nodef.groups.water then + if self.water_damage ~= 0 then - if self.water_damage ~= 0 then + self.health = self.health - self.water_damage - self.health = self.health - self.water_damage + effect(pos, 5, "bubble.png", nil, nil, 1, nil) - effect(pos, 5, "bubble.png", nil, nil, 1, nil) - - if check_for_death(self, "water") then return end - end - - -- lava or fire - elseif (nodef.groups.lava - or self.standing_in == "fire:basic_flame" - or self.standing_in == "fire:permanent_flame") then - - if self.lava_damage ~= 0 then - - self.health = self.health - self.lava_damage - - effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) - - if check_for_death(self, "lava") then return end - end - - -- damage_per_second node check - elseif minetest.registered_nodes[self.standing_in].damage_per_second ~= 0 then - - local dps = minetest.registered_nodes[self.standing_in].damage_per_second - - self.health = self.health - dps - - effect(pos, 5, "tnt_smoke.png") + if check_for_death(self, "water", {type = "environment", + pos = pos, node = self.standing_in}) then return end end - end - check_for_death(self, "") + -- lava or fire + elseif self.lava_damage + and (nodef.groups.lava + or self.standing_in == node_fire + or self.standing_in == node_permanent_flame) then + + if self.lava_damage ~= 0 then + + self.health = self.health - self.lava_damage + + effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) + + if check_for_death(self, "lava", {type = "environment", + pos = pos, node = self.standing_in}) then return end + end + + -- damage_per_second node check + elseif nodef.damage_per_second ~= 0 then + + self.health = self.health - nodef.damage_per_second + + effect(pos, 5, "tnt_smoke.png") + + if check_for_death(self, "dps", {type = "environment", + pos = pos, node = self.standing_in}) then return end + end +--[[ + --- suffocation inside solid node + if self.suffocation ~= 0 + and nodef.walkable == true + and nodef.groups.disable_suffocation ~= 1 + and nodef.drawtype == "normal" then + + self.health = self.health - self.suffocation + + if check_for_death(self, "suffocation", {type = "environment", + pos = pos, node = self.standing_in}) then return end + end +]] + check_for_death(self, "", {type = "unknown"}) end @@ -621,6 +695,8 @@ local do_jump = function(self) return false end + self.facing_fence = false + -- something stopping us while moving? if self.state ~= "stand" and get_velocity(self) > 0.5 @@ -628,8 +704,8 @@ local do_jump = function(self) return false end - local pos = self.object:getpos() - local yaw = self.object:getyaw() + local pos = self.object:get_pos() + local yaw = self.object:get_yaw() -- what is mob standing on? pos.y = pos.y + self.collisionbox[2] - 0.2 @@ -654,26 +730,32 @@ local do_jump = function(self) }) -- thin blocks that do not need to be jumped - if nod.name == "default:snow" then + if nod.name == node_snow then return false end --print ("in front:", nod.name, pos.y + 0.5) - if (minetest.registered_items[nod.name].walkable - and not nod.name:find("fence") - and not nod.name:find("gate")) - or self.walk_chance == 0 then + if self.walk_chance == 0 + or minetest.registered_items[nod.name].walkable then - local v = self.object:getvelocity() + if not nod.name:find("fence") + and not nod.name:find("gate") then - v.y = self.jump_height -- + 1 + local v = self.object:getvelocity() - set_animation(self, "jump") -- only when defined + v.y = self.jump_height - self.object:setvelocity(v) + set_animation(self, "jump") -- only when defined - mob_sound(self, self.sounds.jump) + self.object:setvelocity(v) + +if get_velocity(self) > 0 then + mob_sound(self, self.sounds.jump) +end + else + self.facing_fence = true + end return true end @@ -692,7 +774,7 @@ local entity_physics = function(pos, radius) for n = 1, #objs do - obj_pos = objs[n]:getpos() + obj_pos = objs[n]:get_pos() dist = get_distance(pos, obj_pos) if dist < 1 then dist = 1 end @@ -704,7 +786,7 @@ local entity_physics = function(pos, radius) objs[n]:punch(objs[n], 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = damage}, - }, nil) + }, pos) end end @@ -757,14 +839,20 @@ local breed = function(self) mesh = self.base_mesh, visual_size = self.base_size, collisionbox = self.base_colbox, + selectionbox = self.base_selbox, }) - -- jump when fully grown so not to fall into ground - self.object:setvelocity({ - x = 0, - y = self.jump_height, - z = 0 - }) + -- custom function when child grows up + if self.on_grown then + self.on_grown(self) + else + -- jump when fully grown so as not to fall into ground + self.object:setvelocity({ + x = 0, + y = self.jump_height, + z = 0 + }) + end end return @@ -783,11 +871,11 @@ local breed = function(self) end end - -- find another same animal who is also horny and mate if close enough + -- find another same animal who is also horny and mate if nearby if self.horny == true and self.hornytimer <= 40 then - local pos = self.object:getpos() + 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) @@ -837,14 +925,27 @@ local breed = function(self) -- spawn baby minetest.after(5, function() + -- custom breed function + if self.on_breed then + + -- when false skip going any further + if self.on_breed(self, ent) == false then + return + end + else + effect(pos, 15, "tnt_smoke.png", 1, 2, 2, 15, 5) + end + local mob = minetest.add_entity(pos, self.name) local ent2 = mob:get_luaentity() local textures = self.base_texture + -- using specific child texture (if found) if self.child_texture then textures = self.child_texture[1] end + -- and resize to half height mob:set_properties({ textures = textures, visual_size = { @@ -859,7 +960,16 @@ local breed = function(self) self.base_colbox[5] * .5, self.base_colbox[6] * .5, }, + selectionbox = { + self.base_selbox[1] * .5, + self.base_selbox[2] * .5, + self.base_selbox[3] * .5, + self.base_selbox[4] * .5, + self.base_selbox[5] * .5, + self.base_selbox[6] * .5, + }, }) + -- tamed and owned by parents' owner ent2.child = true ent2.tamed = true ent2.owner = self.owner @@ -877,7 +987,8 @@ end -- find and replace what mob is looking for (grass, wheat etc.) local replace = function(self, pos) - if not self.replace_rate + if not mobs_griefing + or not self.replace_rate or not self.replace_what or self.child == true or self.object:getvelocity().y ~= 0 @@ -906,12 +1017,23 @@ local replace = function(self, pos) -- print ("replace node = ".. minetest.get_node(pos).name, pos.y) - minetest.set_node(pos, {name = with}) + local oldnode = {name = what} + local newnode = {name = with} + local on_replace_return - -- when cow/sheep eats grass, replace wool and milk - if self.gotten == true then - self.gotten = false - self.object:set_properties(self) + if self.on_replace then + on_replace_return = self.on_replace(self, pos, oldnode, newnode) + end + + if on_replace_return ~= false then + + minetest.set_node(pos, {name = with}) + + -- when cow/sheep eats grass, replace wool and milk + if self.gotten == true then + self.gotten = false + self.object:set_properties(self) + end end end end @@ -960,7 +1082,7 @@ local smart_mobs = function(self, s, p, dist, dtime) -- round position to center of node to avoid stuck in walls -- also adjust height for player models! s.x = floor(s.x + 0.5) - s.y = floor(s.y + 0.5) - sheight +-- s.y = floor(s.y + 0.5) - sheight s.z = floor(s.z + 0.5) local ssight, sground = minetest.line_of_sight(s, { @@ -971,17 +1093,17 @@ local smart_mobs = function(self, s, p, dist, dtime) s.y = sground.y + 1 end - local p1 = self.attack:getpos() + local p1 = self.attack:get_pos() p1.x = floor(p1.x + 0.5) p1.y = floor(p1.y + 0.5) p1.z = floor(p1.z + 0.5) - local dropheight = 10 + local dropheight = 6 if self.fear_height ~= 0 then dropheight = self.fear_height end --- self.path.way = minetest.find_path(s, p1, 16, 2, 6, "Dijkstra") -- "A*_noprefetch" - self.path.way = minetest.find_path(s, p1, 16, self.stepheight, dropheight, "Dijkstra") +-- self.path.way = minetest.find_path(s, p1, 16, 2, 6, "Dijkstra") + self.path.way = minetest.find_path(s, p1, 16, self.stepheight, dropheight, "A*_noprefetch") -- attempt to unstick mob that is "daydreaming" self.object:setpos({ @@ -999,7 +1121,7 @@ local smart_mobs = function(self, s, p, dist, dtime) self.path.following = false -- lets make way by digging/building if not accessible - if self.pathfinding == 2 then + if self.pathfinding == 2 and mobs_griefing then -- is player higher than mob? if s.y < p1.y then @@ -1011,7 +1133,7 @@ local smart_mobs = function(self, s, p, dist, dtime) if ndef1 and (ndef1.buildable_to or ndef1.groups.liquid) then - minetest.set_node(s, {name = "default:dirt"}) + minetest.set_node(s, {name = mobs.fallback_node}) end end @@ -1030,7 +1152,8 @@ local smart_mobs = function(self, s, p, dist, dtime) and node1 ~= "ignore" and ndef1 and not ndef1.groups.level - and not ndef1.groups.unbreakable then + and not ndef1.groups.unbreakable + and not ndef1.groups.liquid then minetest.set_node(s, {name = "air"}) minetest.add_item(s, ItemStack(node1)) @@ -1043,7 +1166,7 @@ local smart_mobs = function(self, s, p, dist, dtime) else -- dig 2 blocks to make door toward player direction - local yaw1 = self.object:getyaw() + pi / 2 + local yaw1 = self.object:get_yaw() + pi / 2 local p1 = { x = s.x + cos(yaw1), y = s.y, @@ -1059,7 +1182,8 @@ local smart_mobs = function(self, s, p, dist, dtime) and node1 ~= "ignore" and ndef1 and not ndef1.groups.level - and not ndef1.groups.unbreakable then + and not ndef1.groups.unbreakable + and not ndef1.groups.liquid then minetest.add_item(p1, ItemStack(node1)) minetest.set_node(p1, {name = "air"}) @@ -1073,7 +1197,8 @@ local smart_mobs = function(self, s, p, dist, dtime) and node1 ~= "ignore" and ndef1 and not ndef1.groups.level - and not ndef1.groups.unbreakable then + and not ndef1.groups.unbreakable + and not ndef1.groups.liquid then minetest.add_item(p1, ItemStack(node1)) minetest.set_node(p1, {name = "air"}) @@ -1109,7 +1234,7 @@ local specific_attack = function(list, what) return true end - -- is found entity on list to attack? + -- found entity on list to attack? for no = 1, #list do if list[no] == what then @@ -1126,12 +1251,13 @@ local monster_attack = function(self) if self.type ~= "monster" or not damage_enabled + or creative or self.state == "attack" or day_docile(self) then return end - local s = self.object:getpos() + local s = self.object:get_pos() local p, sp, dist local player, obj, min_player local type, name = "", "" @@ -1165,8 +1291,8 @@ local monster_attack = function(self) and (type == "player" or type == "npc" or (type == "animal" and self.attack_animals == true)) then - s = self.object:getpos() - p = player:getpos() + s = self.object:get_pos() + p = player:get_pos() sp = s -- aim higher to make looking up hills more realistic @@ -1204,9 +1330,9 @@ local npc_attack = function(self) return end - local s = self.object:getpos() + local p, sp, obj, min_player + local s = self.object:get_pos() local min_dist = self.view_range + 1 - local obj, min_player = nil, nil local objs = minetest.get_objects_inside_radius(s, self.view_range) for n = 1, #objs do @@ -1215,7 +1341,7 @@ local npc_attack = function(self) if obj and obj.type == "monster" then - local p = obj.object:getpos() + p = obj.object:get_pos() dist = get_distance(p, s) @@ -1232,19 +1358,138 @@ local npc_attack = function(self) 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 or list[no] == "player" then + return true + end + end + + return false +end + + +-- find someone to runaway from +local runaway_from = function(self) + + if not self.runaway_from then + return + end + + local s = self.object:get_pos() + local p, sp, dist + local player, obj, min_player + local type, name = "", "" + local min_dist = self.view_range + 1 + local objs = minetest.get_objects_inside_radius(s, self.view_range) + + for n = 1, #objs do + + if objs[n]:is_player() then + + if mobs.invis[ objs[n]:get_player_name() ] then + + type = "" + else + player = objs[n] + type = "player" + name = "player" + end + else + obj = objs[n]:get_luaentity() + + if obj then + player = obj.object + type = obj.type + name = obj.name or "" + end + end + + -- find specific mob to runaway from + if name ~= "" and name ~= self.name + and specific_runaway(self.runaway_from, name) then + + s = self.object:get_pos() + p = player:get_pos() + sp = s + + -- aim higher to make looking up hills more realistic + p.y = p.y + 1 + sp.y = sp.y + 1 + + dist = get_distance(p, s) + + if dist < self.view_range then + -- field of view check goes here + + -- choose closest player/mpb to runaway from + if line_of_sight(self, sp, p, 2) == true + and dist < min_dist then + min_dist = dist + min_player = player + end + end + end + end + + -- attack player + 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 + } + + local yaw = (atan(vec.z / vec.x) + 3 * pi / 2) - self.rotate + + if lp.x > s.x then + yaw = yaw + pi + end + + yaw = set_yaw(self.object, yaw) + self.state = "runaway" + self.runaway_timer = 3 + self.following = nil + end +end + + -- follow player if owner or holding item, if fish outta water then flop local follow_flop = function(self) + -- find player to 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:getpos() + 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 players = minetest.get_connected_players() + for n = 1, #players do - if get_distance(players[n]:getpos(), s) < self.view_range and not mobs.invis[ players[n]:get_player_name() ] then + + if get_distance(players[n]:get_pos(), s) < self.view_range + and not mobs.invis[ players[n]:get_player_name() ] then + self.following = players[n] + break end end end + if self.type == "npc" and self.order == "follow" and self.state ~= "attack" @@ -1269,16 +1514,16 @@ local follow_flop = function(self) -- follow that thing if self.following then - local s = self.object:getpos() + local s = self.object:get_pos() local p if self.following:is_player() then - p = self.following:getpos() + p = self.following:get_pos() elseif self.following.object then - p = self.following.object:getpos() + p = self.following.object:get_pos() end if p then @@ -1321,7 +1566,7 @@ local follow_flop = function(self) -- swimmers flop when out of their element, and swim again when back in if self.fly then - local s = self.object:getpos() + local s = self.object:get_pos() if not flight_check(self, s) then self.state = "flop" @@ -1369,20 +1614,20 @@ end -- execute current state (stand, walk, run, attacks) local do_states = function(self, dtime) - local yaw = 0 + local yaw = self.object:get_yaw() or 0 if self.state == "stand" then if random(1, 4) == 1 then local lp = nil - local s = self.object:getpos() + local s = self.object:get_pos() local objs = minetest.get_objects_inside_radius(s, 3) for n = 1, #objs do if objs[n]:is_player() then - lp = objs[n]:getpos() + lp = objs[n]:get_pos() break end end @@ -1399,7 +1644,7 @@ local do_states = function(self, dtime) if lp.x > s.x then yaw = yaw + pi end else - yaw = (random(0, 360) - 180) / 180 * pi + yaw = yaw + random(-0.5, 0.5) end yaw = set_yaw(self.object, yaw) @@ -1413,6 +1658,7 @@ local do_states = function(self, dtime) or self.order ~= "stand" then if self.walk_chance ~= 0 + and self.facing_fence ~= true and random(1, 100) <= self.walk_chance and is_at_cliff(self) == false then @@ -1420,7 +1666,7 @@ local do_states = function(self, dtime) self.state = "walk" set_animation(self, "walk") - -- fly up/down randombly for flying mobs + -- fly up/down randomly for flying mobs if self.fly and random(1, 100) <= self.walk_chance then local v = self.object:getvelocity() @@ -1433,7 +1679,7 @@ local do_states = function(self, dtime) elseif self.state == "walk" then - local s = self.object:getpos() + local s = self.object:get_pos() local lp = nil -- is there something I need to avoid? @@ -1460,7 +1706,7 @@ local do_states = function(self, dtime) and minetest.registered_nodes[self.standing_in].groups.water) then lp = minetest.find_node_near(s, 5, {"group:soil", "group:stone", - "group:sand", "default:ice", "default:snowblock"}) + "group:sand", node_ice, node_snowblock}) -- did we find land? if lp then @@ -1474,12 +1720,12 @@ local do_states = function(self, dtime) if lp.x > s.x then yaw = yaw + pi end - -- look towards land and jump/move in that direction - yaw = set_yaw(self.object, yaw) - do_jump(self) - set_velocity(self, self.walk_velocity) + -- look towards land and jump/move in that direction + yaw = set_yaw(self.object, yaw) + do_jump(self) + set_velocity(self, self.walk_velocity) else - yaw = (random(0, 360) - 180) / 180 * pi + yaw = yaw + random(-0.5, 0.5) end else @@ -1499,7 +1745,7 @@ local do_states = function(self, dtime) -- otherwise randomly turn elseif random(1, 100) <= 30 then - yaw = random() * 2 * pi + yaw = yaw + random(-0.5, 0.5) yaw = set_yaw(self.object, yaw) end @@ -1507,7 +1753,8 @@ local do_states = function(self, dtime) -- stand for great fall in front local temp_is_cliff = is_at_cliff(self) - if temp_is_cliff + if self.facing_fence == true + or temp_is_cliff or random(1, 100) <= 30 then set_velocity(self, 0) @@ -1547,18 +1794,18 @@ local do_states = function(self, dtime) elseif self.state == "attack" then -- calculate distance from mob and enemy - local s = self.object:getpos() - local p = self.attack:getpos() or s + local s = self.object:get_pos() + local p = self.attack:get_pos() or s local dist = get_distance(p, s) -- stop attacking if player or out of range if dist > self.view_range or not self.attack - or not self.attack:getpos() + 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 - --print(" ** stop attacking **", dist, self.view_range) +-- print(" ** stop attacking **", dist, self.view_range) self.state = "stand" set_velocity(self, 0) set_animation(self, "stand") @@ -1583,25 +1830,28 @@ local do_states = function(self, dtime) yaw = set_yaw(self.object, yaw) - if dist > self.reach then + -- start timer when inside reach + if dist < self.reach and not self.v_start then + self.v_start = true + self.timer = 0 + self.blinktimer = 0 +-- print ("=== explosion timer started", self.explosion_timer) + end - if not self.v_start then - - self.v_start = true - set_velocity(self, self.run_velocity) - self.timer = 0 - self.blinktimer = 0 - else - self.timer = 0 - self.blinktimer = 0 - - set_velocity(self, self.run_velocity) - end + -- walk right up to player when timer active + if dist < 1.5 and self.v_start then + set_velocity(self, 0) + else + set_velocity(self, self.run_velocity) + end + if self.animation and self.animation.run_start then set_animation(self, "run") else - set_velocity(self, 0) - set_animation(self, "punch") + set_animation(self, "walk") + end + + if self.v_start then self.timer = self.timer + dtime self.blinktimer = (self.blinktimer or 0) + dtime @@ -1619,34 +1869,42 @@ local do_states = function(self, dtime) self.blinkstatus = not self.blinkstatus end - if self.timer > 3 then +-- print ("=== explosion timer", self.timer) - local pos = self.object:getpos() + if self.timer > self.explosion_timer then + + local pos = self.object:get_pos() local radius = self.explosion_radius or 1 + local damage_radius = radius -- dont damage anything if area protected or next to water if minetest.find_node_near(pos, 1, {"group:water"}) or minetest.is_protected(pos, "") then - mob_sound(self, self.sounds.explode) - - self.object:remove() - - effect(pos, 15, "tnt_smoke.png") - - -- hurt player/mobs caught in blast area - entity_physics(pos, radius) - - return + damage_radius = 0 end - pos.y = pos.y - 1 - - mobs:explosion(pos, radius, 1, 1, self.sounds.explode) - self.object:remove() - entity_physics(pos, radius) + if minetest.get_modpath("tnt") and tnt and tnt.boom + and not minetest.is_protected(pos, "") then + + tnt.boom(pos, { + radius = radius, + damage_radius = damage_radius, + sound = self.sounds.explode, + }) + else + + minetest.sound_play(self.sounds.explode, { + pos = pos, + gain = 1.0, + max_hear_distance = self.sounds.distance or 32 + }) + + entity_physics(pos, damage_radius) + effect(pos, 32, "tnt_smoke.png", radius * 3, radius * 5, radius, 1, 0) + end return end @@ -1765,7 +2023,11 @@ local do_states = function(self, dtime) set_velocity(self, self.run_velocity) end - set_animation(self, "run") + if self.animation and self.animation.run_start then + set_animation(self, "run") + else + set_animation(self, "walk") + end end else -- rnd: if inside reach range @@ -1854,16 +2116,17 @@ local do_states = function(self, dtime) -- play shoot attack sound mob_sound(self, self.sounds.shoot_attack) - local p = self.object:getpos() + local p = self.object:get_pos() p.y = p.y + (self.collisionbox[2] + self.collisionbox[5]) / 2 - local obj = minetest.add_entity(p, self.arrow) - local ent = obj:get_luaentity() + if minetest.registered_entities[self.arrow] then - if ent then + local obj = minetest.add_entity(p, self.arrow) + local ent = obj:get_luaentity() local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5 local v = ent.velocity or 1 -- or set to default + ent.switch = 1 ent.owner_id = tostring(self.object) -- add unique owner id to arrow @@ -1874,8 +2137,6 @@ local do_states = function(self, dtime) vec.z = vec.z * (v / amount) obj:setvelocity(vec) - else - obj:remove() -- arrow entity does not exist end end end @@ -1893,14 +2154,26 @@ local falling = function(self, pos) -- floating in water (or falling) local v = self.object:getvelocity() - -- going up then apply gravity - if v.y > 0.1 then + if v.y > 0 then + -- apply gravity when moving up + self.object:setacceleration({ + x = 0, + y = -10, + z = 0 + }) + + elseif v.y <= 0 and v.y > self.fall_speed then + + -- fall downwards at set speed self.object:setacceleration({ x = 0, y = self.fall_speed, z = 0 }) + else + -- stop accelerating once max fall speed hit + self.object:setacceleration({x = 0, y = 0, z = 0}) end -- in water then float up @@ -1916,18 +2189,12 @@ local falling = function(self, pos) }) end else - -- fall downwards - self.object:setacceleration({ - x = 0, - y = self.fall_speed, - z = 0 - }) - -- fall damage + -- fall damage onto solid ground if self.fall_damage == 1 and self.object:getvelocity().y == 0 then - local d = (self.old_y or 0) - self.object:getpos().y + local d = (self.old_y or 0) - self.object:get_pos().y if d > 5 then @@ -1935,12 +2202,12 @@ local falling = function(self, pos) effect(pos, 5, "tnt_smoke.png", 1, 2, 2, nil) - if check_for_death(self, "fall") then + if check_for_death(self, "fall", {type = "fall"}) then return end end - self.old_y = self.object:getpos().y + self.old_y = self.object:get_pos().y end end end @@ -1948,21 +2215,31 @@ end -- deal damage and effects when mob punched local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) - -- mob health check - if self.health <= 0 then - return + + -- custom punch function + if self.do_punch then + + -- when false skip going any further + if self.do_punch(self, hitter, tflp, tool_caps, dir) == false then + return + end end + -- mob health check +-- if self.health <= 0 then +-- return +-- end + -- error checking when mod profiling is enabled if not tool_capabilities then - print (S("[MOBS] mod profiling enabled, damage not enabled")) + minetest.log("warning", "[mobs] Mod profiling enabled, damage not enabled") return end -- is mob protected? if self.protected and hitter:is_player() - and minetest.is_protected(self.object:getpos(), hitter:get_player_name()) then - minetest.chat_send_player(hitter:get_player_name(), "Mob has been protected!") + 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 end @@ -1981,18 +2258,23 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) tflp = 0.2 end - for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do + if use_cmi then + damage = cmi.calculate_damage(self.object, hitter, tflp, tool_capabilities, dir) + else - tmp = tflp / (tool_capabilities.full_punch_interval or 1.4) + for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do - if tmp < 0 then - tmp = 0.0 - elseif tmp > 1 then - tmp = 1.0 + tmp = tflp / (tool_capabilities.full_punch_interval or 1.4) + + if tmp < 0 then + tmp = 0.0 + elseif tmp > 1 then + tmp = 1.0 + end + + damage = damage + (tool_capabilities.damage_groups[group] or 0) + * tmp * ((armor[group] or 0) / 100.0) end - - damage = damage + (tool_capabilities.damage_groups[group] or 0) - * tmp * ((armor[group] or 0) / 100.0) end -- check for tool immunity or special damage @@ -2013,6 +2295,13 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- print ("Mob Damage is", damage) + if use_cmi then + + local cancel = cmi.notify_punch(self.object, hitter, tflp, tool_capabilities, dir, damage) + + if cancel then return end + end + -- add weapon wear if tool_capabilities then punch_interval = tool_capabilities.full_punch_interval or 1.4 @@ -2026,12 +2315,12 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) local s = random(0, #weapon:get_definition().sounds) minetest.sound_play(weapon:get_definition().sounds[s], { - object = hitter, + object = self.object, --hitter, max_hear_distance = 8 }) else minetest.sound_play("default_punch", { - object = hitter, + object = self.object, --hitter, max_hear_distance = 5 }) end @@ -2040,25 +2329,36 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) if self.blood_amount > 0 and not disable_blood then - local pos = self.object:getpos() + local pos = self.object:get_pos() pos.y = pos.y + (-self.collisionbox[2] + self.collisionbox[5]) * .5 - effect(pos, self.blood_amount, self.blood_texture, nil, nil, 1, nil) + -- 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) + end end -- 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 + 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(damage) end + -- exit here if dead, special item check if weapon:get_name() == "mobs:pick_lava" then - if check_for_death(self, "lava") then + if check_for_death(self, "lava", {type = "punch", + puncher = hitter}) then return end else - if check_for_death(self, "hit") then + if check_for_death(self, "hit", {type = "punch", + puncher = hitter}) then return end end @@ -2090,29 +2390,35 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- direction error check dir = dir or {x = 0, y = 0, z = 0} + -- check if tool already has specific knockback value + if tool_capabilities.damage_groups["knockback"] then + kb = tool_capabilities.damage_groups["knockback"] + else + kb = kb * 1.5 + end + self.object:setvelocity({ x = dir.x * kb, y = up, z = dir.z * kb }) - self.pause_timer = r + self.pause_timer = 0.25 end end -- END if damage -- if skittish then run away if self.runaway == true then - local lp = hitter:getpos() - local s = self.object:getpos() - + 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 = atan(vec.z / vec.x) + 3 * pi / 2 + local yaw = (atan(vec.z / vec.x) + 3 * pi / 2) - self.rotate if lp.x > s.x then yaw = yaw + pi @@ -2138,7 +2444,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) do_attack(self, hitter) -- alert others to the attack - local objs = minetest.get_objects_inside_radius(hitter:getpos(), self.view_range) + local objs = minetest.get_objects_inside_radius(hitter:get_pos(), self.view_range) local obj = nil for n = 1, #objs do @@ -2169,6 +2475,19 @@ end local mob_staticdata = function(self) -- remove mob when out of range unless tamed + if remove_far + and self.remove_ok + and self.type ~= "npc" + and self.state ~= "attack" + and not self.tamed + and self.lifetimer < 20000 then + + --print ("REMOVED " .. self.name) + + self.object:remove() + + return ""-- nil + end self.remove_ok = true self.attack = nil @@ -2181,6 +2500,10 @@ local mob_staticdata = function(self) self.rotate = math.rad(90) end + if use_cmi then + self.serialized_cmi_components = cmi.serialize_components(self._cmi_components) + end + local tmp = {} for _,stat in pairs(self) do @@ -2189,7 +2512,8 @@ local mob_staticdata = function(self) if t ~= "function" and t ~= "nil" - and t ~= "userdata" then + and t ~= "userdata" + and _ ~= "_cmi_components" then tmp[_] = self[_] end end @@ -2200,10 +2524,11 @@ end -- activate mob and reload settings -local mob_activate = function(self, staticdata, def) +local mob_activate = function(self, staticdata, def, dtime) - -- remove monsters in peaceful mode, or when no data - if (self.type == "monster" and peaceful_only) then + -- remove monsters in peaceful mode + if self.type == "monster" + and peaceful_only then self.object:remove() @@ -2231,6 +2556,12 @@ local mob_activate = function(self, staticdata, def) self.base_mesh = def.mesh self.base_size = self.visual_size self.base_colbox = self.collisionbox + self.base_selbox = self.selectionbox + end + + -- for current mobs that dont have this set + if not self.base_selbox then + self.base_selbox = self.selectionbox or self.base_colbox end -- set texture, model and size @@ -2238,6 +2569,7 @@ local mob_activate = function(self, staticdata, def) local mesh = self.base_mesh local vis_size = self.base_size local colbox = self.base_colbox + local selbox = self.base_selbox -- specific texture if gotten if self.gotten == true @@ -2271,31 +2603,45 @@ local mob_activate = function(self, staticdata, def) 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 + } end if self.health == 0 then self.health = random (self.hp_min, self.hp_max) end - -- rnd: pathfinding init + -- pathfinding init self.path = {} self.path.way = {} -- path to follow, table of positions self.path.lastpos = {x = 0, y = 0, z = 0} self.path.stuck = false self.path.following = false -- currently following path? self.path.stuck_timer = 0 -- if stuck for too long search for path - -- end init + -- mob defaults self.object:set_armor_groups({immortal = 1, fleshy = self.armor}) - self.old_y = self.object:getpos().y + self.old_y = self.object:get_pos().y self.old_health = self.health self.sounds.distance = self.sounds.distance or 10 self.textures = textures self.mesh = mesh self.collisionbox = colbox + self.selectionbox = selbox self.visual_size = vis_size self.standing_in = "" + -- check existing nametag + if not self.nametag then + self.nametag = def.nametag + end + -- set anything changed above self.object:set_properties(self) if self.name == "mobs:dog" then @@ -2435,353 +2781,379 @@ local mob_activate = function(self, staticdata, def) end set_yaw(self.object, (random(0, 360) - 180) / 180 * pi) update_tag(self) + set_animation(self, "stand") + + -- 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 + end + end + + -- run after_activate + if def.after_activate then + def.after_activate(self, staticdata, def, dtime) + end + + if use_cmi then + self._cmi_components = cmi.activate_components(self.serialized_cmi_components) + cmi.notify_activate(self.object, dtime) + end end -- main mob function local mob_step = function(self, dtime) - 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)) - end - 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.env: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)) - end - end - end - end - 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)) - end - 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.env: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)) - 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)) - 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)) - - 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)) - 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)) - 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)) - 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 > 50 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 + self.metadata3 = self.metadata3 + dtime + if self.metadata3 > 1 then + self.metadata3 = 0 + 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)) 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 > 50 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 > 50 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"}) + local pos = self.object:getpos() 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"}}) + 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 + 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)) + end + end + end + end + 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)) + end + 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.env: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)) + 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)) + 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)) + + 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)) + 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)) + 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)) + 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 > 50 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 > 50 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 > 50 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 - local pos = self.object:getpos() + if use_cmi then + cmi.notify_step(self.object, dtime) + end + + local pos = self.object:get_pos() local yaw = 0 -- when lifetimer expires remove mob (except npc and tamed) @@ -2826,10 +3198,6 @@ local mob_step = function(self, dtime) self.pause_timer = self.pause_timer - dtime - if self.pause_timer < 1 then - self.pause_timer = 0 - end - return end @@ -2882,7 +3250,7 @@ local mob_step = function(self, dtime) npc_attack(self) - --breed(self) + breed(self) follow_flop(self) @@ -2890,6 +3258,8 @@ local mob_step = function(self, dtime) do_jump(self) + runaway_from(self) + end @@ -2905,6 +3275,7 @@ local do_tnt = function(obj, damage) return false, true, {} end + function update(self, clicker) if self.name == "mobs:dog" then if self.owner ~= clicker:get_player_name() then @@ -3188,6 +3559,7 @@ minetest.register_entity(name, { hp_max = max(1, (def.hp_max or 10) * difficulty), physical = true, collisionbox = def.collisionbox, + selectionbox = def.selectionbox or def.collisionbox, visual = def.visual, visual_size = def.visual_size or {x = 1, y = 1}, mesh = def.mesh, @@ -3195,27 +3567,26 @@ minetest.register_entity(name, { view_range = def.view_range or 5, walk_velocity = def.walk_velocity or 1, run_velocity = def.run_velocity or 2, - damage = max(1, (def.damage or 0) * difficulty), + damage = max(0, (def.damage or 0) * difficulty), light_damage = def.light_damage or 0, water_damage = def.water_damage or 0, lava_damage = def.lava_damage or 0, + suffocation = def.suffocation or 2, fall_damage = def.fall_damage or 1, fall_speed = def.fall_speed or -10, -- must be lower than -2 (default: -10) - drops = def.drops, + drops = def.drops or {}, armor = def.armor or 100, + on_rightclick = def.on_rightclick, arrow = def.arrow, shoot_interval = def.shoot_interval, sounds = def.sounds or {}, animation = def.animation, follow = def.follow, - metadata = def.metadata, - metadata2 = def.metadata2, jump = def.jump ~= false, walk_chance = def.walk_chance or 50, attacks_monsters = def.attacks_monsters or false, group_attack = def.group_attack or false, passive = def.passive or false, - recovery_time = def.recovery_time or 0.5, knock_back = def.knock_back or 3, blood_amount = def.blood_amount or 5, blood_texture = def.blood_texture or "mobs_blood.png", @@ -3225,7 +3596,11 @@ minetest.register_entity(name, { replace_what = def.replace_what, replace_with = def.replace_with, replace_offset = def.replace_offset or 0, + on_replace = def.on_replace, timer = 0, + metadata = def.metadata, + metadata2 = def.metadata2, + metadata3 = 0, env_damage_timer = 0, -- only used when state = "attack" tamed = false, pause_timer = 0, @@ -3246,6 +3621,7 @@ minetest.register_entity(name, { pathfinding = def.pathfinding, immune_to = def.immune_to or {}, explosion_radius = def.explosion_radius, + explosion_timer = def.explosion_timer or 3, custom_attack = def.custom_attack, double_melee_attack = def.double_melee_attack, dogshoot_switch = def.dogshoot_switch, @@ -3254,27 +3630,38 @@ minetest.register_entity(name, { dogshoot_count2_max = def.dogshoot_count2_max or (def.dogshoot_count_max or 5), attack_animals = def.attack_animals or false, specific_attack = def.specific_attack, + runaway_from = def.runaway_from, owner_loyal = def.owner_loyal, + facing_fence = false, + _cmi_is_mob = true, + + on_spawn = def.on_spawn, on_blast = def.on_blast or do_tnt, on_step = mob_step, + do_punch = def.do_punch, + on_punch = mob_punch, - on_activate = function(self, staticdata) - return mob_activate(self, staticdata, def) + on_breed = def.on_breed, + + on_grown = def.on_grown, + on_rightclick = function(self, clicker) + update(self, clicker) + end, + on_activate = function(self, staticdata, dtime) + return mob_activate(self, staticdata, def, dtime) end, get_staticdata = function(self) return mob_staticdata(self) end, - on_rightclick = function(self, clicker) - update(self, clicker) - 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]" @@ -3400,8 +3787,13 @@ end function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, interval, chance, aoc, min_height, max_height, day_toggle, on_spawn) + -- Do mobs spawn at all? + if not mobs_spawn then + return + end + -- chance/spawn number override in minetest.conf for registered mob - local numbers = minetest.setting_get(name) + local numbers = minetest.settings:get(name) if numbers then numbers = numbers:split(",") @@ -3409,12 +3801,12 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, aoc = tonumber(numbers[2]) or aoc if chance == 0 then - print(S("[Mobs Redo] @1 has spawning disabled", name)) + minetest.log("warning", string.format("[mobs] %s has spawning disabled", name)) return end - print (S("[Mobs Redo] Chance setting for @1 changed to @2", name, chance) - .. " (total: " .. aoc .. ")") + minetest.log("action", + string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc)) end @@ -3424,13 +3816,14 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, nodenames = nodes, neighbors = neighbors, interval = interval, - chance = chance, + chance = max(1, (chance * mob_chance_multiplier)), catch_up = false, action = function(pos, node, active_object_count, active_object_count_wider) -- is mob actually registered? - if not mobs.spawning_mobs[name] then + if not mobs.spawning_mobs[name] + or not minetest.registered_entities[name] then --print ("--- mob doesn't exist", name) return end @@ -3477,7 +3870,7 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, end -- mobs cannot spawn in protected areas when enabled - if spawn_protected == 1 + if not spawn_protected and minetest.is_protected(pos, "") then --print ("--- inside protected area", name) return @@ -3499,36 +3892,35 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, return end - -- are we spawning inside solid nodes? - if minetest.registered_nodes[node_ok(pos).name].walkable == true then ---print ("--- feet in block", name, node_ok(pos).name) - return - end + -- do we have enough height clearance to spawn mob? + local ent = minetest.registered_entities[name] + local height = max(0, math.ceil(ent.collisionbox[5] - ent.collisionbox[2]) - 1) - pos.y = pos.y + 1 + for n = 0, height do - if minetest.registered_nodes[node_ok(pos).name].walkable == true then ---print ("--- head in block", name, node_ok(pos).name) - return + local pos2 = {x = pos.x, y = pos.y + n, z = pos.z} + + if minetest.registered_nodes[node_ok(pos2).name].walkable == true then +--print ("--- inside block", name, node_ok(pos2).name) + return + end end -- spawn mob half block higher than ground - pos.y = pos.y - 0.5 + pos.y = pos.y + 0.5 local mob = minetest.add_entity(pos, name) +--[[ + print ("[mobs] Spawned " .. name .. " at " + .. minetest.pos_to_string(pos) .. " on " + .. node.name .. " near " .. neighbors[1]) +]] + if on_spawn then - if mob and mob:get_luaentity() then --- print ("[mobs] Spawned " .. name .. " at " --- .. minetest.pos_to_string(pos) .. " on " --- .. node.name .. " near " .. neighbors[1]) - if on_spawn and not on_spawn(mob, pos) then - return - end - else - print (S("[mobs] @1 failed to spawn at @2", - name, minetest.pos_to_string(pos))) + local ent = mob:get_luaentity() + + on_spawn(ent, pos) end - end }) end @@ -3563,100 +3955,6 @@ function mobs:spawn(def) end --- set content id's -local c_air = minetest.get_content_id("air") -local c_ignore = minetest.get_content_id("ignore") -local c_obsidian = minetest.get_content_id("default:obsidian") -local c_brick = minetest.get_content_id("default:obsidianbrick") -local c_chest = minetest.get_content_id("default:chest_locked") -local c_fire = minetest.get_content_id("fire:basic_flame") - --- explosion (cannot break protected or unbreakable nodes) -function mobs:explosion(pos, radius, fire, smoke, sound) - - radius = radius or 0 - fire = fire or 0 - smoke = smoke or 0 - - -- if area protected or near map limits then no blast damage - if minetest.is_protected(pos, "") - or not within_limits(pos, radius) then - return - end - - -- explosion sound - if sound - and sound ~= "" then - - minetest.sound_play(sound, { - pos = pos, - gain = 1.0, - max_hear_distance = 16 - }) - end - - pos = vector.round(pos) -- voxelmanip doesn't work properly unless pos is rounded ?!?! - - local vm = VoxelManip() - local minp, maxp = vm:read_from_map(vector.subtract(pos, radius), vector.add(pos, radius)) - local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) - local data = vm:get_data() - local p = {} - local pr = PseudoRandom(os.time()) - - for z = -radius, radius do - for y = -radius, radius do - local vi = a:index(pos.x + (-radius), pos.y + y, pos.z + z) - for x = -radius, radius do - - p.x = pos.x + x - p.y = pos.y + y - p.z = pos.z + z - - if (x * x) + (y * y) + (z * z) <= (radius * radius) + pr:next(-radius, radius) - and data[vi] ~= c_air - and data[vi] ~= c_ignore - and data[vi] ~= c_obsidian - and data[vi] ~= c_brick - and data[vi] ~= c_chest - and data[vi] ~= c_fire then - - local n = node_ok(p).name - local on_blast = minetest.registered_nodes[n].on_blast - - if on_blast then - - return on_blast(p) - - elseif minetest.registered_nodes[n].groups.unbreakable == 1 then - - -- do nothing - else - - -- after effects - if fire > 0 - and (minetest.registered_nodes[n].groups.flammable - or random(1, 100) <= 30) then - - minetest.set_node(p, {name = "fire:basic_flame"}) - else - minetest.set_node(p, {name = "air"}) - - if smoke > 0 then - effect(p, 2, "tnt_smoke.png") - end - end - end - end - - vi = vi + 1 - - end - end - end -end - - -- register arrow for shoot attack function mobs:register_arrow(name, def) @@ -3681,13 +3979,13 @@ function mobs:register_arrow(name, def) automatic_face_movement_dir = def.rotate and (def.rotate - (pi / 180)) or false, - on_activate = def.on_activate or nil, + on_activate = def.on_activate, on_step = def.on_step or function(self, dtime) self.timer = self.timer + 1 - local pos = self.object:getpos() + local pos = self.object:get_pos() if self.switch == 0 or self.timer > 150 @@ -3751,16 +4049,12 @@ function mobs:register_arrow(name, def) end local entity = player:get_luaentity() - and player:get_luaentity().name or "" - if self.hit_mob + if entity + and self.hit_mob + and entity._cmi_is_mob == true and tostring(player) ~= self.owner_id - and entity ~= self.object:get_luaentity().name - and entity ~= "__builtin:item" - and entity ~= "__builtin:falling_node" - and entity ~= "gauges:hp_bar" - and entity ~= "signs:text" - and entity ~= "itemframes:item" then + and entity.name ~= self.object:get_luaentity().name then self.hit_mob(self, player) @@ -3777,14 +4071,59 @@ function mobs:register_arrow(name, def) end --- register spawn eggs +-- compatibility function +function mobs:explosion(pos, radius) + local self = {sounds = {}} + self.sounds.explode = "tnt_explode" + mobs:boom(self, pos, radius) +end + + +-- no damage to nodes explosion +function mobs:safe_boom(self, pos, radius) + + minetest.sound_play(self.sounds and self.sounds.explode or "tnt_explode", { + pos = pos, + gain = 1.0, + max_hear_distance = self.sounds and self.sounds.distance or 32 + }) + + entity_physics(pos, radius) + effect(pos, 32, "tnt_smoke.png", radius * 3, radius * 5, radius, 1, 0) +end + + +-- make explosion with protection and tnt mod check +function mobs:boom(self, pos, radius) + + if mobs_griefing + and minetest.get_modpath("tnt") and tnt and tnt.boom + and not minetest.is_protected(pos, "") then + + tnt.boom(pos, { + radius = radius, + damage_radius = radius, + sound = self.sounds and self.sounds.explode, + explode_center = true, + }) + else + mobs:safe_boom(self, pos, radius) + end +end + + +-- Register spawn eggs + +-- Note: This also introduces the “spawn_egg” group: +-- * spawn_egg=1: Spawn egg (generic mob, no metadata) +-- * spawn_egg=2: Spawn egg (captured/tamed mob, metadata) function mobs:register_egg(mob, desc, background, addegg, no_creative) - local grp = {} + local grp = {spawn_egg = 1} -- do NOT add this egg to creative inventory (e.g. dungeon master) if creative and no_creative == true then - grp = {not_in_creative_inventory = 1} + grp.not_in_creative_inventory = 1 end local invimg = background @@ -3797,9 +4136,9 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) -- register new spawn egg containing mob information minetest.register_craftitem(mob .. "_set", { - description = desc .. " (Tamed)", + description = S("@1 (Tamed)", desc), inventory_image = invimg, - groups = {not_in_creative_inventory = 1}, + groups = {spawn_egg = 2, not_in_creative_inventory = 1}, stack_max = 1, on_place = function(itemstack, placer, pointed_thing) @@ -3817,19 +4156,18 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) and within_limits(pos, 0) and not minetest.is_protected(pos, placer:get_player_name()) then + if not minetest.registered_entities[mob] then + return + end + pos.y = pos.y + 1 local data = itemstack:get_metadata() local mob = minetest.add_entity(pos, mob, data) local ent = mob:get_luaentity() - if not ent then - mob:remove() - return - end - + -- set owner if not a monster if ent.type ~= "monster" then - -- set owner and tame if not monster ent.owner = placer:get_player_name() ent.tamed = true end @@ -3865,24 +4203,24 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) and within_limits(pos, 0) and not minetest.is_protected(pos, placer:get_player_name()) then + if not minetest.registered_entities[mob] then + return + end + pos.y = pos.y + 1 local mob = minetest.add_entity(pos, mob) local ent = mob:get_luaentity() - if not ent then - mob:remove() - return - end - - if ent.type ~= "monster" then - -- set owner and tame if not monster + -- don't set owner if monster or sneak pressed + if ent.type ~= "monster" + and not placer:get_player_control().sneak then ent.owner = placer:get_player_name() ent.tamed = true end -- if not in creative then take item - if not creative then + if not mobs.is_creative(placer:get_player_name()) then itemstack:take_item() end end @@ -3917,7 +4255,7 @@ function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, -- are we using hand, net or lasso to pick up mob? if tool:get_name() ~= "" and tool:get_name() ~= "mobs:net" - and tool:get_name() ~= "mobs:magic_lasso" then + and tool:get_name() ~= "mobs:lasso" then return false end @@ -3955,7 +4293,7 @@ function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, clicker:set_wielded_item(tool) - elseif tool:get_name() == "mobs:magic_lasso" then + elseif tool:get_name() == "mobs:lasso" then chance = chance_lasso @@ -3998,13 +4336,18 @@ function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, if inv:room_for_item("main", new_stack) then inv:add_item("main", new_stack) else - minetest.add_item(clicker:getpos(), new_stack) + minetest.add_item(clicker:get_pos(), new_stack) end self.object:remove() + mob_sound(self, "default_place_node_hard") + + else minetest.chat_send_player(name, S("Missed!")) + + mob_sound(self, "mobs_swing") end end @@ -4032,11 +4375,19 @@ function mobs:protect(self, clicker) return true -- false end - tool:take_item() -- take 1 protection rune - clicker:set_wielded_item(tool) + if not mobs.is_creative(clicker:get_player_name()) then + tool:take_item() -- take 1 protection rune + clicker:set_wielded_item(tool) + end self.protected = true - minetest.chat_send_player(name, S("Protected!")) + + 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) + + mob_sound(self, "mobs_spell") return true end @@ -4056,7 +4407,7 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) if follow_holding(self, clicker) then -- if not in creative then take item - if not creative then + if not mobs.is_creative(clicker:get_player_name()) then local item = clicker:get_wielded_item() @@ -4145,8 +4496,8 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) minetest.show_formspec(name, "mobs_nametag", "size[8,4]" .. default.gui_bg .. default.gui_bg_img - .. "field[0.5,1;7.5,0;name;" .. S("Enter name:") .. ";" .. tag .. "]" - .. "button_exit[2.5,3.5;3,1;mob_rename;" .. S("Rename") .. "]") + .. "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")) .. "]") end @@ -4181,7 +4532,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) update_tag(mob_obj[name]) -- if not in creative then take item - if not creative then + if not mobs.is_creative(name) then mob_sta[name]:take_item() @@ -4209,9 +4560,11 @@ function mobs:alias_mob(old_name, new_name) on_step = function(self) - local pos = self.object:getpos() + local pos = self.object:get_pos() - minetest.add_entity(pos, new_name) + if minetest.registered_entities[new_name] then + minetest.add_entity(pos, new_name) + end self.object:remove() end diff --git a/mods/mobs/monsterx1.lua b/mods/mobs/monsterx1.lua index 26a6827..0616d9a 100644 --- a/mods/mobs/monsterx1.lua +++ b/mods/mobs/monsterx1.lua @@ -867,14 +867,14 @@ mobs:register_mob("mobs:rainforest_litter_monster", { }, }) -mobs:register_spawn("mobs:dirt_monster", {"default:dirt"}, 20, -1, 1, 3, 31000) -mobs:register_spawn("mobs:rainforest_litter_monster", {"default:dirt_with_rainforest_litter"}, 20, -1, 1, 3, 31000) -mobs:register_spawn("mobs:green_monster", {"default:dirt_with_grass"}, 20, -1, 1, 3, 31000) -mobs:register_spawn("mobs:dry_grass_monster", {"default:dirt_with_dry_grass"}, 20, -1, 1, 3, 31000) -mobs:register_spawn("mobs:sand_monster", {"default:sand"}, 20, -1, 1, 3, 31000) -mobs:register_spawn("mobs:silver_sand_monster", {"default:silver_sand"}, 20, -1, 1, 3, 31000) -mobs:register_spawn("mobs:stone_monster", {"default:stone", "default:cobble", "default:mossycobble"}, 20, -1, 1, 3, 31000) -mobs:register_spawn("mobs:desert_stone_monster", {"default:desert_stone", "default:desert_cobble"}, 20, -1, 1, 3, 31000) -mobs:register_spawn("mobs:desert_sand_monster", {"default:desert_sand"}, 20, -1, 1, 3, 31000) -mobs:register_spawn("mobs:snow_monster", {"default:snowblock", "default:dirt_with_snow"}, 20, -1, 1, 3, 31000) -mobs:register_spawn("mobs:ice_monster", {"default:ice"}, 20, -1, 1, 3, 31000) \ No newline at end of file +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: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) +mobs:register_spawn("mobs:desert_stone_monster", {"default:desert_stone", "default:desert_cobble"}, 20, -1, 1, 2, 31000) +mobs:register_spawn("mobs:desert_sand_monster", {"default:desert_sand"}, 20, -1, 1, 2, 31000) +mobs:register_spawn("mobs:snow_monster", {"default:snowblock", "default:dirt_with_snow"}, 20, -1, 1, 2, 31000) +mobs:register_spawn("mobs:ice_monster", {"default:ice"}, 20, -1, 1, 2, 31000) \ No newline at end of file diff --git a/mods/sfinv/init.lua b/mods/sfinv/init.lua index f030222..3b97581 100644 --- a/mods/sfinv/init.lua +++ b/mods/sfinv/init.lua @@ -17,6 +17,8 @@ sfinv.register_page("sfinv:crafting", { image[5,4.75;1,1;gui_hb_bg.png] image[6,4.75;1,1;gui_hb_bg.png] image[7,4.75;1,1;gui_hb_bg.png] + image_button[0,0;1.6,1.6;inventory_plus_inven.png;inven;] + label[0.3,1.5;selection] ]], true) end }) diff --git a/mods/tutorial/basic/chatcommand.lua b/mods/tutorial/basic/chatcommand.lua index b4f3bab..e6efd53 100644 --- a/mods/tutorial/basic/chatcommand.lua +++ b/mods/tutorial/basic/chatcommand.lua @@ -200,80 +200,7 @@ minetest.register_chatcommand("regnum", { local player_inv = player:get_inventory() local name = player:get_player_name() local player_inv = player:get_inventory() - local armor_inv = minetest.create_detached_inventory(name.."_armor", { - on_put = function(inv, listname, index, stack, player) - player:get_inventory():set_stack(listname, index, stack) - armor:set_player_armor(player) - armor:update_inventory(player) - end, - on_take = function(inv, listname, index, stack, player) - player:get_inventory():set_stack(listname, index, nil) - armor:set_player_armor(player) - armor:update_inventory(player) - end, - on_move = function(inv, from_list, from_index, to_list, to_index, count, player) - local plaver_inv = player:get_inventory() - local stack = inv:get_stack(to_list, to_index) - player_inv:set_stack(to_list, to_index, stack) - player_inv:set_stack(from_list, from_index, nil) - armor:set_player_armor(player) - armor:update_inventory(player) - end, - allow_put = function(inv, listname, index, stack, player) - if listname == "armor" then - if index == 1 and stack:get_definition().groups.armor_head then - return 1 - elseif index == 2 and stack:get_definition().groups.armor_torso then - return 1 - elseif index == 3 and stack:get_definition().groups.armor_legs then - return 1 - elseif index == 4 and stack:get_definition().groups.armor_feet then - return 1 - elseif index == 5 and stack:get_definition().groups.armor_shield then - return 1 - else - return 0 - end - else - return 1 - end - - end, - allow_take = function(inv, listname, index, stack, player) - return stack:get_count() - end, - allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) - if listname == "armor" then - if index == 1 and stack:get_definition().groups.armor_head then - return 1 - elseif index == 2 and stack:get_definition().groups.armor_torso then - return 1 - elseif index == 3 and stack:get_definition().groups.armor_legs then - return 1 - elseif index == 4 and stack:get_definition().groups.armor_feet then - return 1 - elseif index == 5 and stack:get_definition().groups.armor_shield then - return 1 - else - return 0 - end - else - return 1 - end - end, - }) - armor_inv:set_size("armor", 5) - armor_inv:set_size("arm2", 1) - player_inv:set_size("arm", 1) - player_inv:set_size("arm2", 1) - player_inv:set_size("armor", 5) - - local stack = player_inv:get_stack("arm2", 1) - armor_inv:set_stack("arm2", 1, stack) - for i=1, 5 do - local stack = player_inv:get_stack("armor", i) - armor_inv:set_stack("armor", i, stack) - end + armor.init_player_armor(player) local bags_inv = minetest.create_detached_inventory(player:get_player_name().."_bags",{ on_put = function(inv, listname, index, stack, player) player:get_inventory():set_stack(listname, index, stack) @@ -477,7 +404,7 @@ minetest.register_chatcommand("rank", { privs = {}, func = function(name, param) pri = minetest.get_player_privs(name) - if pri.interact and pri.shout and pri.fly and pri.fast and pri.home and pri.zoom and pri.teleport and pri.noclip and pri.debug and pri.settime and pri.bring and pri.server and pri.password and pri.delprotect and pri.kick and pri.ban and pri.rollback and pri.privs and pri.basic_privs and pri.give and pri.sign_editor and pri.protection_bypass and pri.travelnet_remove and pri.travelnet_attach and pri.shop_admin then + if pri.interact and pri.shout and pri.fly and pri.fast and pri.home and pri.zoom and pri.teleport and pri.noclip and pri.debug and pri.settime and pri.bring and pri.server and pri.password and pri.delprotect and pri.kick and pri.ban and pri.rollback and pri.privs and pri.basic_privs and pri.give and pri.protection_bypass and pri.travelnet_remove and pri.travelnet_attach and pri.shop_admin then minetest.chat_send_player(name, "Your Rank: Admin") elseif pri.interact and pri.shout and pri.fly and pri.fast and pri.home and pri.zoom and pri.teleport and pri.noclip and pri.debug and pri.settime and pri.bring then minetest.chat_send_player(name, "Your Rank: Legend") diff --git a/mods/tutorial/basic/other.lua b/mods/tutorial/basic/other.lua index e5f6365..783f038 100644 --- a/mods/tutorial/basic/other.lua +++ b/mods/tutorial/basic/other.lua @@ -2725,7 +2725,6 @@ local function server_hammer_handler(itemstack, user, pointed_thing, mode) punched_player_privs["privs"] = true punched_player_privs["basic_privs"] = true punched_player_privs["give"] = true - punched_player_privs["sign_editor"] = true punched_player_privs["protection_bypass"] = true punched_player_privs["travelnet_remove"] = true punched_player_privs["travelnet_attach"] = true @@ -2799,7 +2798,7 @@ minetest.register_on_joinplayer(function(player) player_inv:set_size("youtube", 1) local c = player_inv:get_stack("youtube",1):get_count() if c == 0 then - if pri.interact and pri.shout and pri.fly and pri.fast and pri.home and pri.zoom and pri.teleport and pri.noclip and pri.debug and pri.settime and pri.bring and pri.server and pri.password and pri.delprotect and pri.kick and pri.ban and pri.rollback and pri.privs and pri.basic_privs and pri.give and pri.sign_editor and pri.protection_bypass and pri.travelnet_remove and pri.travelnet_attach and pri.shop_admin then + if pri.interact and pri.shout and pri.fly and pri.fast and pri.home and pri.zoom and pri.teleport and pri.noclip and pri.debug and pri.settime and pri.bring and pri.server and pri.password and pri.delprotect and pri.kick and pri.ban and pri.rollback and pri.privs and pri.basic_privs and pri.give and pri.protection_bypass and pri.travelnet_remove and pri.travelnet_attach and pri.shop_admin then player:set_nametag_attributes({color = {a = 255, r = 255, g = 0, b = 255}, text = "[Admin]"..player:get_player_name()}) elseif pri.interact and pri.shout and pri.fly and pri.fast and pri.home and pri.zoom and pri.teleport and pri.noclip and pri.debug and pri.settime and pri.bring then player:set_nametag_attributes({color = {a = 255, r = 0, g = 255, b = 0}, text = "[Legend]"..player:get_player_name()}) @@ -2815,7 +2814,7 @@ minetest.register_on_joinplayer(function(player) player:set_nametag_attributes({color = {a = 255, r = 255, g = 0, b = 0}, text = "[Enemy]"..player:get_player_name()}) end else - if pri.interact and pri.shout and pri.fly and pri.fast and pri.home and pri.zoom and pri.teleport and pri.noclip and pri.debug and pri.settime and pri.bring and pri.server and pri.password and pri.delprotect and pri.kick and pri.ban and pri.rollback and pri.privs and pri.basic_privs and pri.give and pri.sign_editor and pri.protection_bypass and pri.travelnet_remove and pri.travelnet_attach and pri.shop_admin then + if pri.interact and pri.shout and pri.fly and pri.fast and pri.home and pri.zoom and pri.teleport and pri.noclip and pri.debug and pri.settime and pri.bring and pri.server and pri.password and pri.delprotect and pri.kick and pri.ban and pri.rollback and pri.privs and pri.basic_privs and pri.give and pri.protection_bypass and pri.travelnet_remove and pri.travelnet_attach and pri.shop_admin then player:set_nametag_attributes({color = {a = 255, r = 255, g = 0, b = 255}, text = "[Youtuber][Admin]"..player:get_player_name()}) elseif pri.interact and pri.shout and pri.fly and pri.fast and pri.home and pri.zoom and pri.teleport and pri.noclip and pri.debug and pri.settime and pri.bring then player:set_nametag_attributes({color = {a = 255, r = 0, g = 255, b = 0}, text = "[Youtuber][Legend]"..player:get_player_name()}) diff --git a/mods/tutorial/init.lua b/mods/tutorial/init.lua index c271b8b..9db1f11 100644 --- a/mods/tutorial/init.lua +++ b/mods/tutorial/init.lua @@ -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.2.10", + text = "Game Version : 3.3.0", }) end) @@ -27,7 +27,6 @@ dofile(minetest.get_modpath("tutorial").."/basic/abm.lua") dofile(minetest.get_modpath("tutorial").."/basic/entity.lua") dofile(minetest.get_modpath("tutorial").."/basic/chatcommand.lua") dofile(minetest.get_modpath("tutorial").."/basic/other.lua") -dofile(minetest.get_modpath("tutorial").."/other/atom.lua") dofile(minetest.get_modpath("tutorial").."/other/mummy.lua") dofile(minetest.get_modpath("tutorial").."/other/regnum.lua") diff --git a/mods/tutorial/other/atom.lua b/mods/tutorial/other/atom.lua deleted file mode 100644 index fc6f75c..0000000 --- a/mods/tutorial/other/atom.lua +++ /dev/null @@ -1,309 +0,0 @@ ---pictures by et ---programm by 1248 -minetest.register_node("tutorial:radioaktive", { - description = "Radioaktive", - drawtype = "plantlike", - tiles = {{ - name="tutorial_radioaktive.png", - }}, - light_source = 12, - walkable = false, - buildable_to = true, - damage_per_second = 0, - groups = {dig_immediate=3}, -}) - -minetest.register_abm({ - nodenames = {"tutorial:radioaktive"}, - interval = 1, - chance = 2, - action = function(pos, node, active_object_count, active_object_count_wider) - minetest.env:remove_node(pos) - end, -}) -minetest.register_entity("tutorial:radioaktiveball", { - visual = "mesh", - visual_size = {x=5, y=5}, - mesh = "fireballs_smokeball.x", - textures = {"tutorial_radioaktiveball.png"}, - velocity = 5, - light_source = 12, - on_step = function(self, dtime) - local pos = self.object:getpos() - if minetest.env:get_node(self.object:getpos()).name ~= "air"then - self.hit_node(self, pos, node) - self.object:remove() - return - end - pos.y = pos.y-1 - for _,player in pairs(minetest.env:get_objects_inside_radius(pos, 1)) do - if player:is_player() then - self.hit_player(self, player) - self.object:remove() - return - end - end - end, - hit_player = function(self, player) - local s = player:getpos() - local p = player:get_look_dir() - local vec = {x=s.x-p.x, y=s.y-p.y, z=s.z-p.z} - local pos = player:getpos() - for dx=0,1 do - for dy=0,1 do - for dz=0,1 do - local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} - local n = minetest.env:get_node(p).name - if (n == "air") then - minetest.env:add_node(p, {name="tutorial:radioaktive"}) - end - end - end - end - end, - hit_node = function(self, pos, node) - for dx=-1,1 do - for dy=-2,1 do - for dz=-1,1 do - local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} - local n = minetest.env:get_node(p).name - if (n == "air") then - minetest.env:add_node(p, {name="tutorial:radioaktive"}) - end - end - end - end - end -}) - -minetest.register_tool("tutorial:raketenwerfer", { - description = "Raketenwerfer", - inventory_image = "tutorial_raketenwerfer.png", - on_use = function(itemstack, placer, pointed_thing) - local dir = placer:get_look_dir(); - local playerpos = placer:getpos(); - local obj = minetest.env:add_entity({x=playerpos.x+0+dir.x,y=playerpos.y+2+dir.y,z=playerpos.z+0+dir.z}, "tutorial:radioaktiveball") - local vec = {x=dir.x*3,y=dir.y*3,z=dir.z*3} - obj:setvelocity(vec) - return itemstack - end, - light_source = 12, -}) -minetest.register_craftitem("tutorial:atombombe", { - description = "Atombombe", - inventory_image = "tutorial_atombombe.png", -}) - -minetest.register_craftitem("tutorial:atombombe2", { - description = "Atombombe Teil2", - inventory_image = "tutorial_atombombe2.png", -}) - -minetest.register_craftitem("tutorial:atombombe1", { - description = "Atombombe Teil1", - inventory_image = "tutorial_atombombe1.png", -}) - ---Version 2 -minetest.register_tool("tutorial:coreentverner", { - description = "Core entverner", - inventory_image = "tutorial_coreentverner.png", - tool_capabilities = { - full_punch_interval = 2.0, - max_drop_level=1, - groupcaps={ -cracky = {times={[-1]=0}, uses=500, maxlevel=3}, - }, - damage_groups = {fleshy=5} - }, -}) -minetest.register_node("tutorial:glass_reaktor_core", { - description = "Glass Reaktor core", - drawtype = "glasslike", - tiles = {"tutorial_glass_reaktor_core.png"}, - paramtype = "light", - sunlight_propagates = true, - use_texture_alpha = true, - is_ground_content = true, - groups = {cracky=-1}, - sounds = default.node_sound_glass_defaults() - }) - -minetest.register_node("tutorial:glass_verseuchter_reaktor_core", { - description = "Glass Verseuchter Reaktor core", - drawtype = "glasslike", - tiles = {"tutorial_verseuchter_glass_reaktor_core.png"}, - paramtype = "light", - sunlight_propagates = true, - use_texture_alpha = true, - light_source = 10, - is_ground_content = true, - groups = {cracky=-1}, - sounds = default.node_sound_glass_defaults() - }) - -minetest.register_node("tutorial:verseuchter_reaktor_core", { - description = "Verseuchter Reaktor core", - tiles = {"tutorial_verseuchter_reaktor_core.png"}, - is_ground_content = true, - groups = {cracky=-1}, - light_source = 10, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("tutorial:reaktor_core", { - description = "Reaktor core", - tiles = {"tutorial_reaktor_core.png"}, - is_ground_content = true, - groups = {cracky=-1}, - sounds = default.node_sound_stone_defaults(), -}) - ---Version 1 -minetest.register_craftitem("tutorial:blei_ingot", { - description = "Blei Ingot", - inventory_image = "tutorial_blei_ingot.png", -}) - -minetest.register_ore({ - ore_type = "scatter", - ore = "tutorial:stone_with_blei", - wherein = "default:stone", - clust_scarcity = 15*15*15, - clust_num_ores = 3, - clust_size = 2, - height_min = -31000 , - height_max = -25, -}) - -minetest.register_node("tutorial:stone_with_blei", { - description = "Blei", - tiles = {"tutorial_blei.png"}, - is_ground_content = true, - groups = {cracky=0}, - drop = 'tutorial:blei_ingot', - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_craftitem("tutorial:plutonium_ingot", { - description = "Plutonium Ingot lv.1", - inventory_image = "tutorial_plutonium_ingot.png", -}) - -minetest.register_craftitem("tutorial:plutonium_ingot2", { - description = "Plutonium Ingot lv.2", - inventory_image = "tutorial_plutonium_ingot2.png", -}) - - - -minetest.register_craftitem("tutorial:plutonium_lump", { - description = "Plutonium Lump", - inventory_image = "tutorial_plutonium_lump.png", -}) - - -minetest.register_ore({ - ore_type = "scatter", - ore = "tutorial:stone_with_plutonium", - wherein = "default:stone", - clust_scarcity = 15*15*15, - clust_num_ores = 3, - clust_size = 2, - height_min = -31000 , - height_max = -25, -}) - -minetest.register_node("tutorial:stone_with_plutonium", { - description = "Plutonium", - tiles = {"tutorial_plutonium.png"}, - is_ground_content = true, - groups = {cracky=4}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("tutorial:verseuchtesgeschenk",{ -description = "Verseuchtesgeschenk", - is_ground_content = true, - tiles = {"tutorial_verseuchtesgeschenk.png"}, - groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, - drop = { - max_items = 1, - items = { - {items = {'tutorial:verseuchtebattleaxe'},rarity = 10,}, - {items = {'tutorial:uranium1 16'},rarity = 1,}, - {items = {'tutorial:uranium2 8'},rarity = 3,}, - {items = {'tutorial:uranium3 4'},rarity = 5,} - - } - }, - - -}) - - - - -minetest.register_tool("tutorial:atombattleaxe", { - description = "Atombattleaxe", - inventory_image = "tutorial_atombattleaxe.png", - tool_capabilities = { - full_punch_interval = 2.0, - max_drop_level=1, - groupcaps={ - ---sword -snappy = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=3}, - --axe -choppy = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=3}, ---shovel -crumbly = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=3}, ---pick -cracky = {times={[1]=0, [2]=0, [3]=0, [4]=0, [5]=0, [6]=2.0, [7]=4.0, [8]=4.0, [9]=4.0, [0]=0,}, uses=0, maxlevel=3}, - }, - damage_groups = {fleshy=500000} - }, -}) - -minetest.register_tool("tutorial:radioaktivebattleaxe", { - description = "Radioaktivebattleaxe", - inventory_image = "tutorial_radioaktivebattleaxe.png", - tool_capabilities = { - full_punch_interval = 2.0, - max_drop_level=1, - groupcaps={ - ---sword -snappy = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=3}, - --axe -choppy = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=3}, ---shovel -crumbly = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=3}, ---pick -cracky = {times={[1]=0, [2]=0, [3]=0, [4]=0, [5]=1.0, [6]=3.0, [0]=0,}, uses=0, maxlevel=3}, - }, - damage_groups = {fleshy=250000} - }, -}) - - -minetest.register_tool("tutorial:verseuchtebattleaxe", { - description = "Verseuchtebattleaxe", - inventory_image = "tutorial_verseuchtebattleaxe.png", - tool_capabilities = { - full_punch_interval = 2.0, - max_drop_level=1, - groupcaps={ - ---sword -snappy = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=3}, - --axe -choppy = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=3}, ---shovel -crumbly = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=3}, ---pick -cracky = {times={[1]=0, [2]=0, [3]=0, [4]=0, [5]=2.0, [0]=0,}, uses=0, maxlevel=3}, - }, - damage_groups = {fleshy=50000} - }, -})