diff --git a/game.conf b/game.conf new file mode 100644 index 0000000..68a6dd6 --- /dev/null +++ b/game.conf @@ -0,0 +1 @@ +name = blockcolor diff --git a/menu/header.png b/menu/header.png new file mode 100644 index 0000000..3152cc7 Binary files /dev/null and b/menu/header.png differ diff --git a/menu/icon.png b/menu/icon.png new file mode 100644 index 0000000..6e72af2 Binary files /dev/null and b/menu/icon.png differ diff --git a/minetest.conf b/minetest.conf new file mode 100644 index 0000000..81bde00 --- /dev/null +++ b/minetest.conf @@ -0,0 +1,41 @@ +#--------------------------------------------------------------------- +# Use By Game Blockcolor +#--------------------------------------------------------------------- + +-- Colors for Nodes, Decorates and Hotbar + +-- 8 Colors + +-- color1 = 292421 -- (Black) +-- color2 = 0000FF -- (Blue) +-- color3 = 00FF00 -- (Green) +-- color4 = F5F5F5 -- (White) +-- color5 = FF6103 -- (Orange) +-- color6 = FF0000 -- (Red) +-- color7 = FFFF00 -- (Yellow) +-- color8 = FF69B4 -- (Pink) + +-- End + +default_privs = shout,home,fly,fast,interact +creative_mode = true +enable_damage = false +only_peaceful_mobs = false +enable_pvp = false +enable_tnt = false +disable_fire = false +fire_enabled = false + +# extras mod settings +playerhotbar = 8 +playerbox = 1 +playerboxsize = 128 +pingkick = 1 +autorollback = 0 +isplayer = 0 +recrafting = 0 +safepvp = 0 + +# player visibility? +player_transfer_distance = 50 +unlimited_player_transfer_distance = false diff --git a/mods/Cars/airboat/README.txt b/mods/Cars/airboat/README.txt new file mode 100644 index 0000000..90f395d --- /dev/null +++ b/mods/Cars/airboat/README.txt @@ -0,0 +1,37 @@ +airboat 0.1.8 by paramat +For Minetest 0.4.16 and later. Compatible with MT 5.0.0-dev. +Depends: default + +Licenses +-------- +Source code: MIT +Media (textures and nodebox design): CC0 1.0 + +Note about textures and crafting +-------------------------------- +This mod is fully functional but does not currently have a crafting recipe or +detailed textures. The textures are templates for you to add detail to. +The airboat is available in the creative inventory or by using the /giveme chat +command. + +Usage +----- +Third-person camera mode is recommended when travelling for a better view. +The airboat can be placed on any node, including liquids. It can land on, and +will float in, a liquid. + +Controls +-------- +Right mouse button = Enter or exit airboat when pointing at airboat. +Forward = Speed up. + Slow down when moving backwards. +Forward + backward = Enable cruise mode: Airboat will accelerate to maximum + forward speed and remain at that speed without needing to + hold the forward key. +Backward = Slow down. + Speed up when moving backwards. + Disable cruise mode. +Left = Turn left. +Right = Turn right. +Jump/up = Ascend. +Sneak/down = Descend. diff --git a/mods/Cars/airboat/depends.txt b/mods/Cars/airboat/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/Cars/airboat/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/Cars/airboat/init.lua b/mods/Cars/airboat/init.lua new file mode 100644 index 0000000..50a1860 --- /dev/null +++ b/mods/Cars/airboat/init.lua @@ -0,0 +1,312 @@ +local source_list = { + {"black", "Darkened", "292421", 40, 36, 33}, + {"blue", "Blue", "0000FF", 0, 0, 255}, + {"green", "Green", "00FF00", 0, 255, 0}, + {"white", "White", "F5F5F5", 245, 245, 245}, + {"orange", "Orange", "FF6103", 255, 97, 3}, + {"red", "Red", "FF0000", 255, 0, 0}, + {"yellow", "Yellow", "FFFF00", 255, 255, 0}, + {"pink", "pink", "FF69B4", 255, 105, 180} +} + +for i in ipairs(source_list) do + local color = source_list[i][1] + local description = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +-- Functions + +local function get_sign(i) + if i == 0 then + return 0 + else + return i / math.abs(i) + end +end + + +local function get_velocity(v, yaw, y) + local x = -math.sin(yaw) * v + local z = math.cos(yaw) * v + return {x = x, y = y, z = z} +end + + +local function get_v(v) + return math.sqrt(v.x ^ 2 + v.z ^ 2) +end + + +-- Airboat entity + +local airboat = { + initial_properties = { + physical = true, + collide_with_objects = false, -- Workaround fix for a MT engine bug + collisionbox = {-0.85, -1.5, -0.85, 0.85, 1.5, 0.85}, + visual = "wielditem", + visual_size = {x = 2.0, y = 2.0}, -- Scale up of nodebox is these * 1.5 + textures = {"airboat:airboat_nodebox" ..color}, + }, + + -- Custom fields + driver = nil, + removed = false, + v = 0, + vy = 0, + rot = 0, + auto = false, +} + + +function airboat.on_rightclick(self, clicker) + if not clicker or not clicker:is_player() then + return + end + local name = clicker:get_player_name() + if self.driver and name == self.driver then + -- Detach + self.driver = nil + self.auto = false + clicker:set_detach() + default.player_attached[name] = false + default.player_set_animation(clicker, "stand" , 30) + local pos = clicker:getpos() + minetest.after(0.1, function() + clicker:setpos(pos) + end) + elseif not self.driver then + -- Attach + local attach = clicker:get_attach() + if attach and attach:get_luaentity() then + local luaentity = attach:get_luaentity() + if luaentity.driver then + luaentity.driver = nil + end + clicker:set_detach() + end + self.driver = name + clicker:set_attach(self.object, "", + {x = 0, y = -2, z = 0}, {x = 0, y = 0, z = 0}) + default.player_attached[name] = true + minetest.after(0.2, function() + default.player_set_animation(clicker, "sit" , 30) + end) + clicker:set_look_horizontal(self.object:getyaw()) + end +end + + +function airboat.on_activate(self, staticdata, dtime_s) + self.object:set_armor_groups({immortal = 1}) +end + + +function airboat.on_punch(self, puncher) + if not puncher or not puncher:is_player() or self.removed then + return + end + + local name = puncher:get_player_name() + if self.driver and name == self.driver then + -- Detach + self.driver = nil + puncher:set_detach() + default.player_attached[name] = false + end + if not self.driver then + -- Move to inventory + self.removed = true + local inv = puncher:get_inventory() + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(name)) + or not inv:contains_item("main", "airboat:airboat" ..color) then + local leftover = inv:add_item("main", "airboat:airboat" ..color) + if not leftover:is_empty() then + minetest.add_item(self.object:getpos(), leftover) + end + end + minetest.after(0.1, function() + self.object:remove() + end) + end +end + + +function airboat.on_step(self, dtime) + self.v = get_v(self.object:getvelocity()) * get_sign(self.v) + self.vy = self.object:getvelocity().y + + -- Controls + if self.driver then + local driver_objref = minetest.get_player_by_name(self.driver) + if driver_objref then + local ctrl = driver_objref:get_player_control() + if ctrl.up and ctrl.down then + if not self.auto then + self.auto = true + minetest.chat_send_player(self.driver, + "[airboat] Cruise on") + end + elseif ctrl.down then + self.v = self.v - 0.1 + if self.auto then + self.auto = false + minetest.chat_send_player(self.driver, + "[airboat] Cruise off") + end + elseif ctrl.up or self.auto then + self.v = self.v + 0.1 + end + if ctrl.left then + self.rot = self.rot + 0.001 + elseif ctrl.right then + self.rot = self.rot - 0.001 + end + if ctrl.jump then + self.vy = self.vy + 0.075 + elseif ctrl.sneak then + self.vy = self.vy - 0.075 + end + else + -- Player left server while driving + -- In MT 5.0.0 use 'airboat:on_detach_child()' to do this + self.driver = nil + self.auto = false + minetest.log("warning", "[airboat] Driver left server while" .. + " driving. This may cause some 'Pushing ObjectRef to" .. + " removed/deactivated object' warnings.") + end + end + + -- Early return for stationary vehicle + if self.v == 0 and self.rot == 0 and self.vy == 0 then + self.object:setpos(self.object:getpos()) + return + end + + -- Reduction and limiting of linear speed + local s = get_sign(self.v) + self.v = self.v - 0.02 * s + if s ~= get_sign(self.v) then + self.v = 0 + end + if math.abs(self.v) > 6 then + self.v = 6 * get_sign(self.v) + end + + -- Reduction and limiting of rotation + local sr = get_sign(self.rot) + self.rot = self.rot - 0.0003 * sr + if sr ~= get_sign(self.rot) then + self.rot = 0 + end + if math.abs(self.rot) > 0.015 then + self.rot = 0.015 * get_sign(self.rot) + end + + -- Reduction and limiting of vertical speed + local sy = get_sign(self.vy) + self.vy = self.vy - 0.03 * sy + if sy ~= get_sign(self.vy) then + self.vy = 0 + end + if math.abs(self.vy) > 4 then + self.vy = 4 * get_sign(self.vy) + end + + local new_acce = {x = 0, y = 0, z = 0} + -- Bouyancy in liquids + local p = self.object:getpos() + p.y = p.y - 1.5 + local def = minetest.registered_nodes[minetest.get_node(p).name] + if def and (def.liquidtype == "source" or def.liquidtype == "flowing") then + new_acce = {x = 0, y = 10, z = 0} + end + + self.object:setpos(self.object:getpos()) + self.object:setvelocity(get_velocity(self.v, self.object:getyaw(), self.vy)) + self.object:setacceleration(new_acce) + self.object:setyaw(self.object:getyaw() + (1 + dtime) * self.rot) +end + + +minetest.register_entity("airboat:airboat" ..color , airboat) + + +-- Craftitem + +minetest.register_craftitem("airboat:airboat" .. color, { + description = "Airboat" .. color, + inventory_image = "airboat_airboat_inv.png^[colorize:#"..colour..":70", +wield_image = "none.png", + wield_scale = {x = 4, y = 4, z = 4}, + liquids_pointable = true, + + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + + -- Run any on_rightclick function of pointed node instead + if udef and udef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + if pointed_thing.type ~= "node" then + return itemstack + end + + pointed_thing.under.y = pointed_thing.under.y + 2 + local airboat = minetest.add_entity(pointed_thing.under, + "airboat:airboat" ..color) + if airboat then + if placer then + airboat:setyaw(placer:get_look_horizontal()) + end + local player_name = placer and placer:get_player_name() or "" + if not (creative and creative.is_enabled_for and + creative.is_enabled_for(player_name)) then + itemstack:take_item() + end + end + return itemstack + end, +}) + + +-- Nodebox for entity wielditem visual + +minetest.register_node("airboat:airboat_nodebox" .. color, { + description = "Airboat Nodebox" .. color, + tiles = { -- Top, base, right, left, front, back + "airboat_airboat_top.png^[colorize:#"..colour..":70", + "airboat_airboat_base.png^[colorize:#"..colour..":70", + "airboat_airboat_right.png^[colorize:#"..colour..":70", + "airboat_airboat_left.png^[colorize:#"..colour..":70", + "airboat_airboat_front.png^[colorize:#"..colour..":70", + "airboat_airboat_back.png^[colorize:#"..colour..":70", + }, + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { -- Widmin, heimin, lenmin, widmax, heimax, lenmax + {-0.271, -0.167, -0.5, 0.271, 0.375, 0.5}, -- Envelope + {-0.167, -0.5, -0.25, 0.167, -0.167, 0.25}, -- Gondola + {-0.021, 0.375, -0.5, 0.021, 0.5, -0.25}, -- Top fin + {-0.021, -0.292, -0.5, 0.021, -0.167, -0.25}, -- Base fin + {-0.396, 0.083, -0.5, -0.271, 0.125, -0.25}, -- Left fin + { 0.271, 0.083, -0.5, 0.396, 0.125, -0.25}, -- Right fin + }, + }, + groups = {not_in_creative_inventory = 1}, +}) + +end diff --git a/mods/Cars/airboat/license.txt b/mods/Cars/airboat/license.txt new file mode 100644 index 0000000..39d6fbd --- /dev/null +++ b/mods/Cars/airboat/license.txt @@ -0,0 +1,57 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2018 paramat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +License of media (textures) +--------------------------- + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +Paramat + +No Copyright + +The person who associated a work with this deed has dedicated the work to the +public domain by waiving all of his or her rights to the work worldwide under +copyright law, including all related and neighboring rights, to the extent +allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial +purposes, all without asking permission. See Other Information below. + +Other Information: + +In no way are the patent or trademark rights of any person affected by CC0, nor +are the rights that other persons may have in the work or in how the work is +used, such as publicity or privacy rights. + +Unless expressly stated otherwise, the person who associated a work with this +deed makes no warranties about the work, and disclaims liability for all uses +of the work, to the fullest extent permitted by applicable law. + +When using or citing the work, you should not imply endorsement by the author +or the affirmer. + +For more details: +https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/mods/Cars/airboat/mod.conf b/mods/Cars/airboat/mod.conf new file mode 100644 index 0000000..573fd09 --- /dev/null +++ b/mods/Cars/airboat/mod.conf @@ -0,0 +1 @@ +name = airboat diff --git a/mods/Cars/airboat/textures/airboat_airboat_back.png b/mods/Cars/airboat/textures/airboat_airboat_back.png new file mode 100644 index 0000000..520f4c6 Binary files /dev/null and b/mods/Cars/airboat/textures/airboat_airboat_back.png differ diff --git a/mods/Cars/airboat/textures/airboat_airboat_base.png b/mods/Cars/airboat/textures/airboat_airboat_base.png new file mode 100644 index 0000000..92b52b4 Binary files /dev/null and b/mods/Cars/airboat/textures/airboat_airboat_base.png differ diff --git a/mods/Cars/airboat/textures/airboat_airboat_front.png b/mods/Cars/airboat/textures/airboat_airboat_front.png new file mode 100644 index 0000000..b24b0ef Binary files /dev/null and b/mods/Cars/airboat/textures/airboat_airboat_front.png differ diff --git a/mods/Cars/airboat/textures/airboat_airboat_inv.png b/mods/Cars/airboat/textures/airboat_airboat_inv.png new file mode 100644 index 0000000..87b95e1 Binary files /dev/null and b/mods/Cars/airboat/textures/airboat_airboat_inv.png differ diff --git a/mods/Cars/airboat/textures/airboat_airboat_left.png b/mods/Cars/airboat/textures/airboat_airboat_left.png new file mode 100644 index 0000000..896c645 Binary files /dev/null and b/mods/Cars/airboat/textures/airboat_airboat_left.png differ diff --git a/mods/Cars/airboat/textures/airboat_airboat_right.png b/mods/Cars/airboat/textures/airboat_airboat_right.png new file mode 100644 index 0000000..2f1c3c8 Binary files /dev/null and b/mods/Cars/airboat/textures/airboat_airboat_right.png differ diff --git a/mods/Cars/airboat/textures/airboat_airboat_top.png b/mods/Cars/airboat/textures/airboat_airboat_top.png new file mode 100644 index 0000000..e4ce3f6 Binary files /dev/null and b/mods/Cars/airboat/textures/airboat_airboat_top.png differ diff --git a/mods/Cars/carts/README.txt b/mods/Cars/carts/README.txt new file mode 100644 index 0000000..31ce644 --- /dev/null +++ b/mods/Cars/carts/README.txt @@ -0,0 +1,22 @@ +Carts (formerly boost_cart) +========================== + +Carts, based almost entirely on the mod boost_cart [1], which +itself is based on (and fully compatible with) the carts mod [2]. + +The model was originally designed by stujones11 [3] (CC-0). + +Cart textures are based on original work from PixelBOX (WTFPL). + + +[1] https://github.com/SmallJoker/boost_cart/ +[2] https://github.com/PilzAdam/carts/ +[3] https://github.com/stujones11/railcart/ + + +Features +---------- +- A fast cart for your railway or roller coaster (up to 7 m/s!) +- Boost and brake rails +- Rail junction switching with the 'right-left' walking keys +- Handbrake with the 'back' key diff --git a/mods/Cars/carts/cart_entity.lua b/mods/Cars/carts/cart_entity.lua new file mode 100644 index 0000000..9e9cd41 --- /dev/null +++ b/mods/Cars/carts/cart_entity.lua @@ -0,0 +1,430 @@ + +color1 = minetest.setting_get("color1") or "292421" +color2 = minetest.setting_get("color2") or "0000FF" +color3 = minetest.setting_get("color3") or "00FF00" +color4 = minetest.setting_get("color4") or "F5F5F5" +color5 = minetest.setting_get("color5") or "FF6103" +color6 = minetest.setting_get("color6") or "FF0000" +color7 = minetest.setting_get("color7") or "FFFF00" +color8 = minetest.setting_get("color8") or "FF69B4" + +local source_list = { + {"black", "Color1", color1, 40, 36, 33}, + {"blue", "Color2", color2, 0, 0, 255}, + {"green", "Color3", color3, 0, 255, 0}, + {"white", "Color4", color4, 245, 245, 245}, + {"orange", "Color5", color5, 255, 97, 3}, + {"red", "Color6", color6, 255, 0, 0}, + {"yellow", "Color7", color7, 255, 255, 0}, + {"pink", "Color8", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local color = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +local cart_entity = { + physical = false, -- otherwise going uphill breaks + collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + visual = "mesh", + mesh = "carts_cart.b3d", + visual_size = {x=1, y=1}, + + textures = { +"carts.png^[colorize:#"..colour..":70" +}, + + driver = nil, + punched = false, -- used to re-send velocity and position + velocity = {x=0, y=0, z=0}, -- only used on punch + old_dir = {x=1, y=0, z=0}, -- random value to start the cart on punch + old_pos = nil, + old_switch = 0, + railtype = nil, + attached_items = {} +} + +function cart_entity:on_rightclick(clicker) + if not clicker or not clicker:is_player() then + return + end + local player_name = clicker:get_player_name() + if self.driver and player_name == self.driver then + self.driver = nil + carts:manage_attachment(clicker, nil) + elseif not self.driver then + self.driver = player_name + carts:manage_attachment(clicker, self.object) + end +end + +function cart_entity:on_activate(staticdata, dtime_s) + self.object:set_armor_groups({immortal=1}) + if string.sub(staticdata, 1, string.len("return")) ~= "return" then + return + end + local data = minetest.deserialize(staticdata) + if not data or type(data) ~= "table" then + return + end + self.railtype = data.railtype + if data.old_dir then + self.old_dir = data.old_dir + end + if data.old_vel then + self.old_vel = data.old_vel + end +end + +function cart_entity:get_staticdata() + return minetest.serialize({ + railtype = self.railtype, + old_dir = self.old_dir, + old_vel = self.old_vel + }) +end + +function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) + local pos = self.object:getpos() + if not self.railtype then + local node = minetest.get_node(pos).name + self.railtype = minetest.get_item_group(node, "connect_to_raillike") + end + -- Punched by non-player + if not puncher or not puncher:is_player() then + local cart_dir = carts:get_rail_direction(pos, self.old_dir, nil, nil, self.railtype) + if vector.equals(cart_dir, {x=0, y=0, z=0}) then + return + end + self.velocity = vector.multiply(cart_dir, 2) + self.punched = true + return + end + -- Player digs cart by sneak-punch + if puncher:get_player_control().sneak then + if self.sound_handle then + minetest.sound_stop(self.sound_handle) + end + -- Detach driver and items + if self.driver then + if self.old_pos then + self.object:setpos(self.old_pos) + end + local player = minetest.get_player_by_name(self.driver) + carts:manage_attachment(player, nil) + end + for _,obj_ in ipairs(self.attached_items) do + if obj_ then + obj_:set_detach() + end + end + -- Pick up cart + local inv = puncher:get_inventory() + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(puncher:get_player_name())) + or not inv:contains_item("main", "carts:cart" .. color) then + local leftover = inv:add_item("main", "carts:cart" .. color) + -- If no room in inventory add a replacement cart to the world + if not leftover:is_empty() then + minetest.add_item(self.object:getpos(), leftover) + end + end + self.object:remove() + return + end + -- Player punches cart to alter velocity + local vel = self.object:getvelocity() + if puncher:get_player_name() == self.driver then + if math.abs(vel.x + vel.z) > carts.punch_speed_max then + return + end + end + + local punch_dir = carts:velocity_to_dir(puncher:get_look_dir()) + punch_dir.y = 0 + local cart_dir = carts:get_rail_direction(pos, punch_dir, nil, nil, self.railtype) + if vector.equals(cart_dir, {x=0, y=0, z=0}) then + return + end + + local punch_interval = 1 + if tool_capabilities and tool_capabilities.full_punch_interval then + punch_interval = tool_capabilities.full_punch_interval + end + time_from_last_punch = math.min(time_from_last_punch or punch_interval, punch_interval) + local f = 2 * (time_from_last_punch / punch_interval) + + self.velocity = vector.multiply(cart_dir, f) + self.old_dir = cart_dir + self.punched = true +end + +local function rail_on_step_event(handler, obj, dtime) + if handler then + handler(obj, dtime) + end +end + +-- sound refresh interval = 1.0sec +local function rail_sound(self, dtime) + if not self.sound_ttl then + self.sound_ttl = 1.0 + return + elseif self.sound_ttl > 0 then + self.sound_ttl = self.sound_ttl - dtime + return + end + self.sound_ttl = 1.0 + if self.sound_handle then + local handle = self.sound_handle + self.sound_handle = nil + minetest.after(0.2, minetest.sound_stop, handle) + end + local vel = self.object:getvelocity() + local speed = vector.length(vel) + if speed > 0 then + self.sound_handle = minetest.sound_play( + "carts_cart_moving", { + object = self.object, + gain = (speed / carts.speed_max) / 2, + loop = true, + }) + end +end + +local function get_railparams(pos) + local node = minetest.get_node(pos) + return carts.railparams[node.name] or {} +end + +local function rail_on_step(self, dtime) + local vel = self.object:getvelocity() + if self.punched then + vel = vector.add(vel, self.velocity) + self.object:setvelocity(vel) + self.old_dir.y = 0 + elseif vector.equals(vel, {x=0, y=0, z=0}) then + return + end + + local pos = self.object:getpos() + local update = {} + + -- stop cart if velocity vector flips + if self.old_vel and self.old_vel.y == 0 and + (self.old_vel.x * vel.x < 0 or self.old_vel.z * vel.z < 0) then + self.old_vel = {x = 0, y = 0, z = 0} + self.old_pos = pos + self.object:setvelocity(vector.new()) + self.object:setacceleration(vector.new()) + rail_on_step_event(get_railparams(pos).on_step, self, dtime) + return + end + self.old_vel = vector.new(vel) + + if self.old_pos and not self.punched then + local flo_pos = vector.round(pos) + local flo_old = vector.round(self.old_pos) + if vector.equals(flo_pos, flo_old) then + -- Do not check one node multiple times + return + end + end + + local ctrl, player + + -- Get player controls + if self.driver then + player = minetest.get_player_by_name(self.driver) + if player then + ctrl = player:get_player_control() + end + end + + if self.old_pos then + -- Detection for "skipping" nodes + local found_path = carts:pathfinder( + pos, self.old_pos, self.old_dir, ctrl, self.old_switch, self.railtype + ) + + if not found_path then + -- No rail found: reset back to the expected position + pos = vector.new(self.old_pos) + update.pos = true + end + end + + local cart_dir = carts:velocity_to_dir(vel) + local railparams + + -- dir: New moving direction of the cart + -- switch_keys: Currently pressed L/R key, used to ignore the key on the next rail node + local dir, switch_keys = carts:get_rail_direction( + pos, cart_dir, ctrl, self.old_switch, self.railtype + ) + + local new_acc = {x=0, y=0, z=0} + if vector.equals(dir, {x=0, y=0, z=0}) then + vel = {x = 0, y = 0, z = 0} + pos = vector.round(pos) + update.pos = true + update.vel = true + else + -- Direction change detected + if not vector.equals(dir, self.old_dir) then + vel = vector.multiply(dir, math.abs(vel.x + vel.z)) + update.vel = true + if dir.y ~= self.old_dir.y then + pos = vector.round(pos) + update.pos = true + end + end + -- Center on the rail + if dir.z ~= 0 and math.floor(pos.x + 0.5) ~= pos.x then + pos.x = math.floor(pos.x + 0.5) + update.pos = true + end + if dir.x ~= 0 and math.floor(pos.z + 0.5) ~= pos.z then + pos.z = math.floor(pos.z + 0.5) + update.pos = true + end + + -- Slow down or speed up.. + local acc = dir.y * -4.0 + + -- Get rail for corrected position + railparams = get_railparams(pos) + + -- no need to check for railparams == nil since we always make it exist. + local speed_mod = railparams.acceleration + if speed_mod and speed_mod ~= 0 then + -- Try to make it similar to the original carts mod + acc = acc + speed_mod + else + -- Handbrake or coast + if ctrl and ctrl.down then + acc = acc - 3 + else + acc = acc - 0.4 + end + end + + new_acc = vector.multiply(dir, acc) + end + + -- Limits + local max_vel = carts.speed_max + for _, v in pairs({"x","y","z"}) do + if math.abs(vel[v]) > max_vel then + vel[v] = carts:get_sign(vel[v]) * max_vel + new_acc[v] = 0 + update.vel = true + end + end + + self.object:setacceleration(new_acc) + self.old_pos = vector.new(pos) + if not vector.equals(dir, {x=0, y=0, z=0}) then + self.old_dir = vector.new(dir) + end + self.old_switch = switch_keys + + if self.punched then + -- Collect dropped items + for _, obj_ in pairs(minetest.get_objects_inside_radius(pos, 1)) do + if not obj_:is_player() and + obj_:get_luaentity() and + not obj_:get_luaentity().physical_state and + obj_:get_luaentity().name == "__builtin:item" then + + obj_:set_attach(self.object, "", {x=0, y=0, z=0}, {x=0, y=0, z=0}) + self.attached_items[#self.attached_items + 1] = obj_ + end + end + self.punched = false + update.vel = true + end + + railparams = railparams or get_railparams(pos) + + if not (update.vel or update.pos) then + rail_on_step_event(railparams.on_step, self, dtime) + return + end + + local yaw = 0 + if self.old_dir.x < 0 then + yaw = 0.5 + elseif self.old_dir.x > 0 then + yaw = 1.5 + elseif self.old_dir.z < 0 then + yaw = 1 + end + self.object:setyaw(yaw * math.pi) + + local anim = {x=0, y=0} + if dir.y == -1 then + anim = {x=1, y=1} + elseif dir.y == 1 then + anim = {x=2, y=2} + end + self.object:set_animation(anim, 1, 0) + + self.object:setvelocity(vel) + if update.pos then + self.object:setpos(pos) + end + + -- call event handler + rail_on_step_event(railparams.on_step, self, dtime) +end + +function cart_entity:on_step(dtime) + rail_on_step(self, dtime) + rail_sound(self, dtime) +end + +minetest.register_entity("carts:cart" .. color, cart_entity) + +minetest.register_craftitem("carts:cart" .. color, { + description = color .. "Cart (Sneak+Click to pick up)", +inventory_image = "cart.png^[colorize:#"..colour..":70", +wield_image = "none.png", + wield_scale = {x=1,y=1,z=0.5}, + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + if not pointed_thing.type == "node" then + return + end + if carts:is_rail(pointed_thing.under) then + minetest.add_entity(pointed_thing.under, "carts:cart" .. color) + elseif carts:is_rail(pointed_thing.above) then + minetest.add_entity(pointed_thing.above, "carts:cart" .. color) + else + return + end + + minetest.sound_play({name = "default_place_node_metal", gain = 0.5}, + {pos = pointed_thing.above}) + + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then + itemstack:take_item() + end + return itemstack + end, +}) + +end diff --git a/mods/Cars/carts/depends.txt b/mods/Cars/carts/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/Cars/carts/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/Cars/carts/functions.lua b/mods/Cars/carts/functions.lua new file mode 100644 index 0000000..a471719 --- /dev/null +++ b/mods/Cars/carts/functions.lua @@ -0,0 +1,221 @@ +function carts:get_sign(z) + if z == 0 then + return 0 + else + return z / math.abs(z) + end +end + +function carts:manage_attachment(player, obj) + if not player then + return + end + local status = obj ~= nil + local player_name = player:get_player_name() + if default.player_attached[player_name] == status then + return + end + default.player_attached[player_name] = status + + if status then + player:set_attach(obj, "", {x=0, y=6, z=0}, {x=0, y=0, z=0}) + player:set_eye_offset({x=0, y=-4, z=0},{x=0, y=-4, z=0}) + else + player:set_detach() + player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) + end +end + +function carts:velocity_to_dir(v) + if math.abs(v.x) > math.abs(v.z) then + return {x=carts:get_sign(v.x), y=carts:get_sign(v.y), z=0} + else + return {x=0, y=carts:get_sign(v.y), z=carts:get_sign(v.z)} + end +end + +function carts:is_rail(pos, railtype) + local node = minetest.get_node(pos).name + if node == "ignore" then + local vm = minetest.get_voxel_manip() + local emin, emax = vm:read_from_map(pos, pos) + local area = VoxelArea:new{ + MinEdge = emin, + MaxEdge = emax, + } + local data = vm:get_data() + local vi = area:indexp(pos) + node = minetest.get_name_from_content_id(data[vi]) + end + if minetest.get_item_group(node, "rail") == 0 then + return false + end + if not railtype then + return true + end + return minetest.get_item_group(node, "connect_to_raillike") == railtype +end + +function carts:check_front_up_down(pos, dir_, check_up, railtype) + local dir = vector.new(dir_) + local cur + + -- Front + dir.y = 0 + cur = vector.add(pos, dir) + if carts:is_rail(cur, railtype) then + return dir + end + -- Up + if check_up then + dir.y = 1 + cur = vector.add(pos, dir) + if carts:is_rail(cur, railtype) then + return dir + end + end + -- Down + dir.y = -1 + cur = vector.add(pos, dir) + if carts:is_rail(cur, railtype) then + return dir + end + return nil +end + +function carts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) + local pos = vector.round(pos_) + local cur + local left_check, right_check = true, true + + -- Check left and right + local left = {x=0, y=0, z=0} + local right = {x=0, y=0, z=0} + if dir.z ~= 0 and dir.x == 0 then + left.x = -dir.z + right.x = dir.z + elseif dir.x ~= 0 and dir.z == 0 then + left.z = dir.x + right.z = -dir.x + end + + if ctrl then + if old_switch == 1 then + left_check = false + elseif old_switch == 2 then + right_check = false + end + if ctrl.left and left_check then + cur = carts:check_front_up_down(pos, left, false, railtype) + if cur then + return cur, 1 + end + left_check = false + end + if ctrl.right and right_check then + cur = carts:check_front_up_down(pos, right, false, railtype) + if cur then + return cur, 2 + end + right_check = true + end + end + + -- Normal + cur = carts:check_front_up_down(pos, dir, true, railtype) + if cur then + return cur + end + + -- Left, if not already checked + if left_check then + cur = carts:check_front_up_down(pos, left, false, railtype) + if cur then + return cur + end + end + + -- Right, if not already checked + if right_check then + cur = carts:check_front_up_down(pos, right, false, railtype) + if cur then + return cur + end + end + + -- Backwards + if not old_switch then + cur = carts:check_front_up_down(pos, { + x = -dir.x, + y = dir.y, + z = -dir.z + }, true, railtype) + if cur then + return cur + end + end + + return {x=0, y=0, z=0} +end + +function carts:pathfinder(pos_, old_pos, old_dir, ctrl, pf_switch, railtype) + local pos = vector.round(pos_) + local pf_pos = vector.round(old_pos) + local pf_dir = vector.new(old_dir) + + for i = 1, 3 do + if vector.equals(pf_pos, pos) then + -- Success! Cart moved on correctly + return true + end + + pf_dir, pf_switch = carts:get_rail_direction(pf_pos, pf_dir, ctrl, pf_switch, railtype) + if vector.equals(pf_dir, {x=0, y=0, z=0}) then + -- No way forwards + return false + end + + pf_pos = vector.add(pf_pos, pf_dir) + end + -- Cart not found + return false +end + +function carts:register_rail(name, def_overwrite, railparams) + local def = { + drawtype = "raillike", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + sounds = default.node_sound_metal_defaults() + } + for k, v in pairs(def_overwrite) do + def[k] = v + end + if not def.inventory_image then + def.wield_image = def.tiles[1] + def.inventory_image = def.tiles[1] + end + + if railparams then + carts.railparams[name] = table.copy(railparams) + end + + minetest.register_node(name, def) +end + +function carts:get_rail_groups(additional_groups) + -- Get the default rail groups and add more when a table is given + local groups = {dig_immediate = 2, attached_node = 1, rail = 1, connect_to_raillike = 1} + if type(additional_groups) == "table" then + for k, v in pairs(additional_groups) do + groups[k] = v + end + end + return groups +end diff --git a/mods/Cars/carts/init.lua b/mods/Cars/carts/init.lua new file mode 100644 index 0000000..53b33cc --- /dev/null +++ b/mods/Cars/carts/init.lua @@ -0,0 +1,20 @@ + +carts = {} +carts.modpath = minetest.get_modpath("carts") +carts.railparams = {} + +-- Maximal speed of the cart in m/s (min = -1) +carts.speed_max = 7 +-- Set to -1 to disable punching the cart from inside (min = -1) +carts.punch_speed_max = 5 + + +dofile(carts.modpath.."/functions.lua") +dofile(carts.modpath.."/rails.lua") + +-- Support for non-default games +if not default.player_attached then + default.player_attached = {} +end + +dofile(carts.modpath.."/cart_entity.lua") diff --git a/mods/Cars/carts/license.txt b/mods/Cars/carts/license.txt new file mode 100644 index 0000000..6c5beb4 --- /dev/null +++ b/mods/Cars/carts/license.txt @@ -0,0 +1,54 @@ + +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 SmallJoker +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media +----------------- + +CC-0, see: https://creativecommons.org/share-your-work/public-domain/cc0/, except +if other license is mentioned. + + +Authors +--------- +Originally from PixelBOX (Gambit): + carts_cart_side.png + carts_cart_top.png + carts_cart_front.png* + carts_cart.png* + +sofar + stujones11: + carts_cart.b3d and carts_cart.blend + +hexafraction, modified by sofar + carts_rail_*.png + +http://www.freesound.org/people/YleArkisto/sounds/253159/ - YleArkisto - CC-BY-3.0 + carts_cart_moving.*.ogg diff --git a/mods/Cars/carts/models/carts_cart.b3d b/mods/Cars/carts/models/carts_cart.b3d new file mode 100644 index 0000000..4e7eba3 Binary files /dev/null and b/mods/Cars/carts/models/carts_cart.b3d differ diff --git a/mods/Cars/carts/rails.lua b/mods/Cars/carts/rails.lua new file mode 100644 index 0000000..9b7a5a0 --- /dev/null +++ b/mods/Cars/carts/rails.lua @@ -0,0 +1,44 @@ +color1 = minetest.setting_get("color1") or "292421" +color2 = minetest.setting_get("color2") or "0000FF" +color3 = minetest.setting_get("color3") or "00FF00" +color4 = minetest.setting_get("color4") or "F5F5F5" +color5 = minetest.setting_get("color5") or "FF6103" +color6 = minetest.setting_get("color6") or "FF0000" +color7 = minetest.setting_get("color7") or "FFFF00" +color8 = minetest.setting_get("color8") or "FF69B4" + +local source_list = { + {"black", "Color1", color1, 40, 36, 33}, + {"blue", "Color2", color2, 0, 0, 255}, + {"green", "Color3", color3, 0, 255, 0}, + {"white", "Color4", color4, 245, 245, 245}, + {"orange", "Color5", color5, 255, 97, 3}, + {"red", "Color6", color6, 255, 0, 0}, + {"yellow", "Color7", color7, 255, 255, 0}, + {"pink", "Color8", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local color = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +minetest.register_alias("carts:rail", "carts:railwhite") + +carts:register_rail("carts:rail" .. color, { + description = color .. "rail", +inventory_image = "carts_rail_straight_pwr.png^[colorize:#"..colour..":70", +wield_image = "color_hand" .. color .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + tiles = { + "carts_rail_straight_pwr.png^[colorize:#"..colour..":70", "carts_rail_curved_pwr.png^[colorize:#"..colour..":70", + "carts_rail_t_junction_pwr.png^[colorize:#"..colour..":70", +"carts_rail_crossing_pwr.png^[colorize:#"..colour..":70" + }, + groups = carts:get_rail_groups(), +}, {acceleration = 5}) + +end diff --git a/mods/Cars/carts/sounds/carts_cart_moving.1.ogg b/mods/Cars/carts/sounds/carts_cart_moving.1.ogg new file mode 100644 index 0000000..869e765 Binary files /dev/null and b/mods/Cars/carts/sounds/carts_cart_moving.1.ogg differ diff --git a/mods/Cars/carts/sounds/carts_cart_moving.2.ogg b/mods/Cars/carts/sounds/carts_cart_moving.2.ogg new file mode 100644 index 0000000..b4cc508 Binary files /dev/null and b/mods/Cars/carts/sounds/carts_cart_moving.2.ogg differ diff --git a/mods/Cars/carts/sounds/carts_cart_moving.3.ogg b/mods/Cars/carts/sounds/carts_cart_moving.3.ogg new file mode 100644 index 0000000..e19a782 Binary files /dev/null and b/mods/Cars/carts/sounds/carts_cart_moving.3.ogg differ diff --git a/mods/Cars/carts/textures/cart.png b/mods/Cars/carts/textures/cart.png new file mode 100644 index 0000000..51e5f6a Binary files /dev/null and b/mods/Cars/carts/textures/cart.png differ diff --git a/mods/Cars/carts/textures/carts.png b/mods/Cars/carts/textures/carts.png new file mode 100644 index 0000000..7ee4a5e Binary files /dev/null and b/mods/Cars/carts/textures/carts.png differ diff --git a/mods/Cars/carts/textures/carts_rail_crossing_pwr.png b/mods/Cars/carts/textures/carts_rail_crossing_pwr.png new file mode 100644 index 0000000..cb7913a Binary files /dev/null and b/mods/Cars/carts/textures/carts_rail_crossing_pwr.png differ diff --git a/mods/Cars/carts/textures/carts_rail_curved_pwr.png b/mods/Cars/carts/textures/carts_rail_curved_pwr.png new file mode 100644 index 0000000..908b141 Binary files /dev/null and b/mods/Cars/carts/textures/carts_rail_curved_pwr.png differ diff --git a/mods/Cars/carts/textures/carts_rail_straight_pwr.png b/mods/Cars/carts/textures/carts_rail_straight_pwr.png new file mode 100644 index 0000000..4fb6981 Binary files /dev/null and b/mods/Cars/carts/textures/carts_rail_straight_pwr.png differ diff --git a/mods/Cars/carts/textures/carts_rail_t_junction_pwr.png b/mods/Cars/carts/textures/carts_rail_t_junction_pwr.png new file mode 100644 index 0000000..ed9b731 Binary files /dev/null and b/mods/Cars/carts/textures/carts_rail_t_junction_pwr.png differ diff --git a/mods/Cars/driftcar/README.txt b/mods/Cars/driftcar/README.txt new file mode 100644 index 0000000..8f5101b --- /dev/null +++ b/mods/Cars/driftcar/README.txt @@ -0,0 +1,34 @@ +driftcar 0.1.12 by paramat +For Minetest 0.4.16 and later. Compatible with Minetest 5.0.0-dev. +Depends: default + +Licenses +-------- +Source code: MIT +Media (textures and car nodebox): CC BY-SA 3.0 + +Description +----------- +A vehicle using some physics modelling for more realistic behaviour. + +Usage +----- +Due to client->server->client control delay this mod is best used in +singleplayer or in local multiplayer. +Intensive mods that cause long server lags, such as Lua mapgen mods, will affect +the responsiveness of the vehicle, even in singleplayer. + +There is no crafting recipe, the vehicle can be found in the creative inventory. +Third-person camera mode is recommended when driving for a better view. +If parameter 'AVIEW' in the 'init.lua' file is set to 'true', view is +automatically set to vehicle velocity direction. + +Controls +-------- +Right mouse button = Enter or exit car when pointing at car. +Forward = Speed up. + Slow down when moving backwards. +Backward = Slow down. + Speed up when moving backwards. +Left = Rotate anticlockwise. +Right = Rotate clockwise. diff --git a/mods/Cars/driftcar/depends.txt b/mods/Cars/driftcar/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/Cars/driftcar/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/Cars/driftcar/init.lua b/mods/Cars/driftcar/init.lua new file mode 100644 index 0000000..13f2249 --- /dev/null +++ b/mods/Cars/driftcar/init.lua @@ -0,0 +1,469 @@ +-- Parameters + +local AVIEW = false -- Autorotate view to velocity direction +local GRIP = 6 -- Maximum linear and lateral acceleration, in nodes/s^2 +local SZTORQ = 16 -- Car speed where motor torque drops to zero, in nodes/s +local DRAG = 0.03 -- Air drag +local ROLRES = 0.3 -- Rolling resistence +local GRAV = 9.81 -- Acceleration of gravity, in nodes/s^2 +-- Turn parameters, in radians/s or radians/s^2 +local TINIT = 0.36 -- Initial turn speed on first control input +local TACC = 0.12 -- Turn acceleration on control input +local TMAX = 2.4 -- Maximum turn speed +local TDEC = 0.24 -- Turn deceleration on no control input + +-- End of parameters + +local source_list = { + {"black", "Darkened", "292421", 40, 36, 33}, + {"blue", "Blue", "0000FF", 0, 0, 255}, + {"green", "Green", "00FF00", 0, 255, 0}, + {"white", "White", "F5F5F5", 245, 245, 245}, + {"orange", "Orange", "FF6103", 255, 97, 3}, + {"red", "Red", "FF0000", 255, 0, 0}, + {"yellow", "Yellow", "FFFF00", 255, 255, 0}, + {"pink", "pink", "FF69B4", 255, 105, 180} +} + +for i in ipairs(source_list) do + local name = source_list[i][1] + local description = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +-- Constants + +local sztorqmf = SZTORQ - 4 + + +-- Functions + +local function get_sign(n) + if n == 0 then + return 0 + else + return n / math.abs(n) + end +end + + +local function get_vecmag(vec) + return math.sqrt(vec.x ^ 2 + vec.z ^ 2) +end + +local function get_theta(vec) -- returns 0 to PI * 2 + if vec.z == 0 then + return 0 + end + if vec.z < 0 then + return math.atan(-vec.x / vec.z) + math.pi + end + if vec.x > 0 then + return math.atan(-vec.x / vec.z) + math.pi * 2 + end + return math.atan(-vec.x / vec.z) +end + +local function get_veccomp(vecmag, theta, y) + local x = -math.sin(theta) * vecmag + local z = math.cos(theta) * vecmag + return {x = x, y = y, z = z} +end + + +local function wrap_yaw(yaw) -- wrap to 0 to PI * 2 + local fmod = math.fmod(yaw, math.pi * 2) + if fmod < 0 then + return fmod + math.pi * 2 + end + return fmod +end + +local function angbet(theta1, theta2) -- theta1 relative to theta2, -PI to PI + local ang = theta1 - theta2 + if ang < -math.pi then + return ang + math.pi * 2 + end + if ang > math.pi then + return ang - math.pi * 2 + end + return ang +end + +local function add_smoke_particle(pos, player_name) + minetest.add_particle({ + pos = pos, + velocity = {x = 0, y = 0, z = 0}, + acceleration = {x = 0, y = 0, z = 0}, + expirationtime = 0.25, + size = 2.8, + collisiondetection = false, + collision_removal = false, + vertical = false, + texture = "driftcar_smoke.png", + playername = player_name, + }) +end + +-- Entity + +local car = { + initial_properties = { + physical = true, + collide_with_objects = false, -- Fixes a MT 0.4.16 engine bug + collisionbox = {-0.53, -0.75, -0.53, 0.53, 0.75, 0.53}, + visual = "wielditem", + visual_size = {x = 1.0, y = 1.0}, -- Scale up of nodebox is these * 1.5 + textures = {"driftcar:driftcar_nodebox" .. name}, + stepheight = 0.6, + }, + + -- Custom fields + driver = nil, + removed = false, + rot = 0, +} + +function car.on_rightclick(self, clicker) + if not clicker or not clicker:is_player() then + return + end + local name = clicker:get_player_name() + if self.driver and name == self.driver then + -- Detach + self.driver = nil + clicker:set_detach() + default.player_attached[name] = false + default.player_set_animation(clicker, "stand" , 30) + local pos = clicker:getpos() + minetest.after(0.1, function() + clicker:setpos(pos) + end) + elseif not self.driver then + -- Attach + local attach = clicker:get_attach() + if attach and attach:get_luaentity() then + local luaentity = attach:get_luaentity() + if luaentity.driver then + luaentity.driver = nil + end + clicker:set_detach() + end + self.driver = name + clicker:set_attach(self.object, "", + {x = 0, y = -1, z = 0}, {x = 0, y = -1, z = 0}) + default.player_attached[name] = true + minetest.after(0.2, function() + default.player_set_animation(clicker, "sit" , 30) + end) + clicker:set_look_horizontal(self.object:getyaw()) + end +end + +function car.on_activate(self, staticdata, dtime_s) + self.object:set_armor_groups({immortal = 1}) +end + +function car.on_punch(self, puncher) + if not puncher or not puncher:is_player() or self.removed then + return + end + + local name = puncher:get_player_name() + if self.driver and name == self.driver then + -- Detach + self.driver = nil + puncher:set_detach() + default.player_attached[name] = false + end + if not self.driver then + -- Move to inventory + self.removed = true + local inv = puncher:get_inventory() + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(name)) + or not inv:contains_item("main", "driftcar:driftcar" .. name) then + + end + minetest.after(0.1, function() + self.object:remove() + end) + end +end + +function car.on_step(self, dtime) + local vel = self.object:getvelocity() + local velmag = get_vecmag(vel) + -- Early return for near-stationary vehicle with no driver + if not self.driver and velmag < 0.01 and vel.y == 0 then + self.object:setpos(self.object:getpos()) + self.object:setvelocity({x = 0, y = 0, z = 0}) + self.object:setacceleration({x = 0, y = 0, z = 0}) + return + end + + -- Angle of yaw relative to velocity, -PI to PI + local yawrtvel = angbet( + wrap_yaw(self.object:getyaw()), + get_theta(vel) + ) + -- Velocity component linear to car + local linvel = math.cos(yawrtvel) * velmag + -- Touch ground bool + local under_pos = self.object:getpos() + under_pos.y = under_pos.y - 1.4 + local node_under = minetest.get_node(under_pos) + local nodedef_under = minetest.registered_nodes[node_under.name] + local touch = nodedef_under.walkable + + -- Torque acceleration applied linear to car + local taccmag = 0 + + -- Controls + if self.driver and touch then + local driver_objref = minetest.get_player_by_name(self.driver) + if driver_objref then + local ctrl = driver_objref:get_player_control() + if ctrl.up or ctrl.down then + -- Torque multiplier applied above 4nps to replicate reduction of + -- motor torque with rotation speed. + local torm = 1 + local abslinvel = math.abs(linvel) + if abslinvel > 4 then + torm = (SZTORQ - abslinvel) / sztorqmf + end + + if ctrl.up then + taccmag = GRIP * torm + elseif ctrl.down then + taccmag = -GRIP * torm + end + end + else + -- Player left server while driving + -- In MT 5.0.0 use 'airboat:on_detach_child()' to do this + self.driver = nil + minetest.log("warning", "[driftcar] Driver left server while" .. + " driving. This may cause some 'Pushing ObjectRef to" .. + " removed/deactivated object' warnings.") + end + end + + -- Early return for near-stationary vehicle with driver + if taccmag == 0 and velmag < 0.01 and vel.y == 0 then + self.object:setpos(self.object:getpos()) + self.object:setvelocity({x = 0, y = 0, z = 0}) + self.object:setacceleration({x = 0, y = 0, z = 0}) + return + end + + -- Allows fast reduction of turn when no turn control + local noturnctrl = true + + if self.driver and touch then + local driver_objref = minetest.get_player_by_name(self.driver) + if driver_objref then + local ctrl = driver_objref:get_player_control() + if ctrl.left then + if self.rot == 0 then + self.rot = TINIT + else + self.rot = self.rot + TACC + end + noturnctrl = false + elseif ctrl.right then + if self.rot == 0 then + self.rot = -TINIT + else + self.rot = self.rot - TACC + end + noturnctrl = false + end + + if AVIEW then + driver_objref:set_look_horizontal(get_theta(vel)) + end + else + -- Player left server while driving + -- In MT 5.0.0 use 'airboat:on_detach_child()' to do this + self.driver = nil + end + end + + -- If no turn control adjust turn towards zero + local sr = get_sign(self.rot) + if noturnctrl and touch then + self.rot = self.rot - TDEC * sr + if sr ~= get_sign(self.rot) then + self.rot = 0 + end + end + -- Limit turn + if math.abs(self.rot) > TMAX then + self.rot = TMAX * get_sign(self.rot) + end + + -- Acceleration caused by 4 Forces + + -- 1. Drag is proportional to velocity, assuming laminar flow + local dragacc = vector.multiply(vel, -DRAG) + + -- 2. Rolling resistence is constant + local rraccmag = 0 + if touch then + if linvel > 0 then + rraccmag = -ROLRES + elseif linvel < 0 then + rraccmag = ROLRES + end + end + --local rracc = get_veccomp(rraccmag, self.object:getyaw(), 0) + + -- 3. Wheel torque acceleration + --local tacc = get_veccomp(taccmag, self.object:getyaw(), 0) + + -- Combine taccmag and rraccmag since same direction + local trracc = get_veccomp(taccmag + rraccmag, self.object:getyaw(), 0) + + -- 4. Tire lateral friction + -- Velocity component lateral to car + local tlfacc = {x = 0, y = 0, z = 0} + if touch then + local latvel = math.sin(yawrtvel) * velmag + local tlfaccmag = math.min(math.max(latvel * 32, -GRIP), GRIP) + tlfacc = get_veccomp(tlfaccmag, self.object:getyaw() + math.pi / 2, 0) + + -- Tire smoke + if self.driver and math.random() < -0.05 + math.abs(latvel) / 30 then + local opos = self.object:getpos() + opos.y = opos.y - 0.5 + local yaw = self.object:getyaw() + local yaw1 = yaw + math.pi * 0.25 + local yaw2 = yaw + math.pi * 0.75 + + local srcomp1x = -math.sin(yaw1) + local srcomp1z = math.cos(yaw1) + local srcomp2x = -math.sin(yaw2) + local srcomp2z = math.cos(yaw2) + + add_smoke_particle({ + x = opos.x + srcomp1x, + y = opos.y, + z = opos.z + srcomp1z + }, self.driver) + add_smoke_particle({ + x = opos.x - srcomp1x, + y = opos.y, + z = opos.z - srcomp1z + }, self.driver) + add_smoke_particle({ + x = opos.x + srcomp2x, + y = opos.y, + z = opos.z + srcomp2z + }, self.driver) + add_smoke_particle({ + x = opos.x - srcomp2x, + y = opos.y, + z = opos.z - srcomp2z + }, self.driver) + end + end + + local new_acc = { + x = trracc.x + dragacc.x + tlfacc.x, + y = trracc.y + dragacc.y + tlfacc.y - GRAV, + z = trracc.z + dragacc.z + tlfacc.z, + } + -- Turn multiplier + local turm = 1 + -- Reduce turn below 4nps + if velmag < 4 then + turm = velmag / 4 + end + -- Limit dtime to avoid too much turn + dtime = math.min(dtime, 0.2) + + self.object:setpos(self.object:getpos()) + self.object:setvelocity(self.object:getvelocity()) + self.object:setacceleration(new_acc) + self.object:setyaw(wrap_yaw(self.object:getyaw() + self.rot * dtime * turm)) +end + +-- Register entity + +minetest.register_entity("driftcar:driftcar" .. name, car) + +-- Craftitem + +minetest.register_craftitem("driftcar:driftcar" .. name, { + description = "Drift Car" .. name, + inventory_image = "cars.png^[colorize:#"..colour..":70", + wield_image = "none.png", + wield_scale = {x = 2, y = 2, z = 2}, + + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + + -- Run any on_rightclick function of pointed node instead + if udef and udef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + if pointed_thing.type ~= "node" then + return itemstack + end + + pointed_thing.under.y = pointed_thing.under.y + 1.25 + local car = minetest.add_entity(pointed_thing.under, + "driftcar:driftcar" .. name) + if car then + if placer then + car:setyaw(placer:get_look_horizontal()) + end + local player_name = placer and placer:get_player_name() or "" + if not (creative and creative.is_enabled_for and + creative.is_enabled_for(player_name)) then + itemstack:take_item() + end + end + return itemstack + end, +}) + + +-- Nodebox + +minetest.register_node("driftcar:driftcar_nodebox" ..name, { + description = "Drift Car Nodebox" ..name, + tiles = { -- Top, base, right, left, front, back + "driftcar_top.png^[colorize:#"..colour..":70", + "driftcar_base.png^[colorize:#"..colour..":70", + "driftcar_right.png^[colorize:#"..colour..":70", + "driftcar_left.png^[colorize:#"..colour..":70", + "driftcar_front.png^[colorize:#"..colour..":70", + "driftcar_back.png^[colorize:#"..colour..":70", + }, + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { -- Widmin, heimin, lenmin, widmax, heimax, lenmax + {-0.5, 0.125, -0.5, 0.5, 0.5, 0.4375}, -- Upper + {-0.5, -0.375, -0.5, 0.5, 0.125, 0.5}, -- Lower + {-0.5, -0.5, -0.5, -0.3125, -0.375, -0.1875}, -- Wheels + {0.3125, -0.5, -0.5, 0.5, -0.375, -0.1875}, + {-0.5, -0.5, 0.1875, -0.3125, -0.375, 0.5}, + {0.3125, -0.5, 0.1875, 0.5, -0.375, 0.5}, + }, + }, + groups = {not_in_creative_inventory = 1}, +}) + +end diff --git a/mods/Cars/driftcar/license.txt b/mods/Cars/driftcar/license.txt new file mode 100644 index 0000000..0ade7c2 --- /dev/null +++ b/mods/Cars/driftcar/license.txt @@ -0,0 +1,61 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2018 paramat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +License of media (textures) +--------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2018 paramat + +You are free to: + +Share — copy and redistribute the material in any medium or format +Adapt — remix, transform, and build upon the material for any purpose, even commercially. + +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/Cars/driftcar/mod.conf b/mods/Cars/driftcar/mod.conf new file mode 100644 index 0000000..f02d626 --- /dev/null +++ b/mods/Cars/driftcar/mod.conf @@ -0,0 +1 @@ +name = driftcar diff --git a/mods/Cars/driftcar/textures/driftcar_back.png b/mods/Cars/driftcar/textures/driftcar_back.png new file mode 100644 index 0000000..5d6f520 Binary files /dev/null and b/mods/Cars/driftcar/textures/driftcar_back.png differ diff --git a/mods/Cars/driftcar/textures/driftcar_base.png b/mods/Cars/driftcar/textures/driftcar_base.png new file mode 100644 index 0000000..18eca26 Binary files /dev/null and b/mods/Cars/driftcar/textures/driftcar_base.png differ diff --git a/mods/Cars/driftcar/textures/driftcar_front.png b/mods/Cars/driftcar/textures/driftcar_front.png new file mode 100644 index 0000000..108248a Binary files /dev/null and b/mods/Cars/driftcar/textures/driftcar_front.png differ diff --git a/mods/Cars/driftcar/textures/driftcar_left.png b/mods/Cars/driftcar/textures/driftcar_left.png new file mode 100644 index 0000000..442c041 Binary files /dev/null and b/mods/Cars/driftcar/textures/driftcar_left.png differ diff --git a/mods/Cars/driftcar/textures/driftcar_right.png b/mods/Cars/driftcar/textures/driftcar_right.png new file mode 100644 index 0000000..5fe768b Binary files /dev/null and b/mods/Cars/driftcar/textures/driftcar_right.png differ diff --git a/mods/Cars/driftcar/textures/driftcar_smoke.png b/mods/Cars/driftcar/textures/driftcar_smoke.png new file mode 100644 index 0000000..2b367f2 Binary files /dev/null and b/mods/Cars/driftcar/textures/driftcar_smoke.png differ diff --git a/mods/Cars/driftcar/textures/driftcar_top.png b/mods/Cars/driftcar/textures/driftcar_top.png new file mode 100644 index 0000000..50fe9ab Binary files /dev/null and b/mods/Cars/driftcar/textures/driftcar_top.png differ diff --git a/mods/Cars/hotairballoon/README.md b/mods/Cars/hotairballoon/README.md new file mode 100644 index 0000000..454cafa --- /dev/null +++ b/mods/Cars/hotairballoon/README.md @@ -0,0 +1,125 @@ +# Minetest mod: Flying Carpet +by Wuzzy + +Version: 0.6.0 + +## Introduction +Quickly explore the vast terrain with the magical flying carpet. But only the skilled users can master its speed, the fools will crash and hurt themselves. + +The carpet flies fast horizontally, but very slowly is it able to move vertically. It constantly reduces your mana resources (if Mana mod is enabled) and will wear out over time. + +## Dependencies +The mod does not depend on anything but it adds some features if certain mods +are available: + +* `default` and `wool` (in Minetest Game): Adds a crafting recipe +* `mana`: Using the flying carpet costs mana +* `doc_items`: Adds in-game help for the flying carpet +* `doc_identifier`: Support for the lookup tool + +Obtaining +--------- +In Minetest Game (and most similar subgames), you can craft the flying carpet using the +following recipe: + + Red Wool, Yellow Wool, Red Wool + Mese Crystal, Gold Ingot, Mese Crystal + +In MineClone 2, replace the mese cystals with redstone. + +Subgames other than Minetest Game *might* work if they have been forked from it. +If you use an entirely different subgame, you might be able to obtain it in a different +way provided by the subgame. If all else fails, you can obtain it by “cheating”, using +the server command “`/giveme flying_carpet:carpet`” (requires “`give`” privilege). + +## How to use +Look to the desired initial flight direction and place the carpet on any flat surface which is not inside a liquid. Make sure it has enough space (3×2×3), then place it. + +Right-click the carpet to sit on it and depart. Note you can not enter the flying carpet if you are currently in any other vehicle (e.g. boat). +You can also not enter a flying carpet if it is going fast. + +The flying carpet has a basic movement speed which the flying carpet is aiming to reach; thus, the carpet flies without your intervention. Use the speed keys to change the speed for a while; they apply only for as long as you hold down the keys. As soon as you release the keys, the carpet will go back to its basic speed again. + +Flying the carpet is a bit tricky, because it flies fast, you can't fully brake and the turning speed is rather low. Be careful not to crash into the landscape! + +If the carpet is under a certain critical speed, it loses its magic and just drops on the ground. +There is a short “grace period” at the beginning of the flight where this minimum speed limit does not apply. +You can tell by the color of the particles emitted by the flying carpet whether you are critically slow. If the particles are yellow, everything is okay, +but if they become red this means the carpet is going dangerously slow and you should speed up; if you slow down even more you might risk for the flying carpet +to fail. + +The flying carpet also fails immediately if you crash into the landscape. +If you crash while being fast, you may also take damage. There is also fall damage, but with the carpet it is greatly reduced compared to a “normal” drop. +Your carpet will also stop working if your mana resources are depleted (only if Mana mod is installed and active). +When your carpet stopped working, you have to collect the carpet (punch it) and place it again. + +If you fly directly down onto a flat solid ground, your flying carpet will come to a halt quickly due to +friction. + +Your carpet can not fly into liquids from above, but it can fly into them from the side or even below. +But the speed in liquids is greatly reduced and your carpet will likely fail. + +## Long-term usage +Your carpet is not indestructible! Long flights, scratching and crashes will wear out the carpet over +time and it might get destroyed eventually. + +Crash-landing at high speeds will deal major damage, so you should avoid crashing at all costs. +Sliding on the surface will deal a minor wear but it is often negligible. + +A constant wear is also caused by flying, but very slowly. + +If you always fly perfectly, you could use a single flying carpet for about 12 hours. Fly safe to make +the most of your flying carpet! + +On high wear levels, the carpet will emit black particles behind it which will increase in number +with its wear. As long there are only a few black particles, you're still good as long as you don't +crash-land. You should get a replacement soon. If the number of black particles is about the +same as the yellow/red particles, the wear has reached a very high level. + +On a critical wear level, the carpet will emit a very annoying loud noise while flying. This is the final +warning, you will have roughly five minutes worth of flight until the carpet finally disintegrates under +your feet! You should land as soon as possible. + +Additionally, a flying carpet will disintegrate and is lost forever if it stands still and has no user +for 1 minute. + +## Controls +* Up: Hold down to speed up +* Down: Hold down to slow down +* Left: Turn left +* Right: Turn right +* Jump: Ascend +* Sneak: Descend +* Right click carpet: Sit on carpet / Get off the carpet +* Punch carpet: + * While flying: Stop flying immediately + * While not flying: Take it + +Note: Collecting and entering a flying carpet is not possible while it is moving fast. + +## Licenses +This mod free software. + +### License of source code +MIT License + +### Authors and licenses of media files +- `flying_carpet_model.obj`: Wuzzy, MIT License +- `flying_carpet_flight.ogg`: MIT License +- `flying_carpet_out_of_energy.ogg`: by p0ss, CC BY-SA 3.0 +- `flying_carpet_almost_dead.ogg`: by John, MIT License +- `flying_carpet_place.ogg`: Unknown authors and Wuzzy (compilation of Public Domain sounds), MIT License +- `flying_carpet_take.ogg`: Julien Matthey, modified by Wuzzy, MIT License +- `flying_carpet_surface.png`: Roman Zacharij and Wuzzy, MIT License +- `flying_carpet_wield.png`: Roman Zacharij and Wuzzy, MIT License +- `flying_carpet_inventory.png`: Roman Zacharij and Wuzzy, MIT License +- `flying_carpet_slide.ogg`: crcavol, MIT License +- `flying_carpet_magic_smoke.png`: Wuzzy, MIT License +- `flying_carpet_smoke.png.png`: Wuzzy. MIT License +- `flying_carpet_star.png`: Wuzzy, MIT License +- `flying_carpet_star_warning.png`: Wuzzy, MIT License +- `flying_carpet_star_death_warning.png`: Wuzzy, MIT License +- `flying_carpet_death.png`: Wuzzy, MIT License + +### License references +* [CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/) diff --git a/mods/Cars/hotairballoon/config.lua b/mods/Cars/hotairballoon/config.lua new file mode 100644 index 0000000..a16331f --- /dev/null +++ b/mods/Cars/hotairballoon/config.lua @@ -0,0 +1,7 @@ +hotairballoon = {} + +--If you want to be available only through /giveme or at admin shops, set this to false. +hotairballoon.crafts = true + +--If you want to be only one use, set this to true. +hotairballoon.one_use = false diff --git a/mods/Cars/hotairballoon/init.lua b/mods/Cars/hotairballoon/init.lua new file mode 100644 index 0000000..b94f37e --- /dev/null +++ b/mods/Cars/hotairballoon/init.lua @@ -0,0 +1,187 @@ +color1 = minetest.setting_get("color1") or "292421" +color2 = minetest.setting_get("color2") or "0000FF" +color3 = minetest.setting_get("color3") or "00FF00" +color4 = minetest.setting_get("color4") or "F5F5F5" +color5 = minetest.setting_get("color5") or "FF6103" +color6 = minetest.setting_get("color6") or "FF0000" +color7 = minetest.setting_get("color7") or "FFFF00" +color8 = minetest.setting_get("color8") or "FF69B4" + +local source_list = { + {"black", "Color1", color1, 40, 36, 33}, + {"blue", "Color2", color2, 0, 0, 255}, + {"green", "Color3", color3, 0, 255, 0}, + {"white", "Color4", color4, 245, 245, 245}, + {"orange", "Color5", color5, 255, 97, 3}, + {"red", "Color6", color6, 255, 0, 0}, + {"yellow", "Color7", color7, 255, 255, 0}, + {"pink", "Color8", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local color = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +dofile(minetest.get_modpath("hotairballoon") .. "/config.lua") + +local function get_sign(i) + if i == 0 then + return 0 + else + return i/math.abs(i) + end +end + +local carpet = { + physical = true, + collisionbox = {-.99,-0.1,-.99, .99,0.5,.99}, + collide_with_objects = true, + visual = "mesh", + mesh = "hotair.b3d", + textures = {"hotair_w.png^[colorize:#"..colour..":70"}, + driver = nil, + yaw=0, + vx=0, + vy=0, + vz=0, +} + +function carpet:on_rightclick(clicker) + if not clicker or not clicker:is_player() then + return + end + local name = clicker:get_player_name() + if self.driver and clicker == self.driver then + clicker:set_detach() + self.driver = nil + default.player_attached[name] = false + default.player_set_animation(clicker, "stand" , 10) + if hotairballoon.one_use == true then + self.object:remove() + end + elseif not self.driver then + self.driver = clicker + clicker:set_attach(self.object, "", {x=-4,y=10.1,z=0}, {x=0,y=90,z=0}) + default.player_attached[name] = true + minetest.after(0.2, function() + default.player_set_animation(clicker, "sit" , 10) + end) + self.object:setyaw(clicker:get_look_yaw()-math.pi/2) + end +end + +function carpet:on_activate(staticdata, dtime_s) + self.object:set_armor_groups({immortal = 1}) + if staticdata then + self.v = tonumber(staticdata) + end +end + +function carpet:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) + if not self.driver then self.object:remove() end + if puncher and puncher:is_player() and not self.driver and not minetest.setting_getbool("creative_mode") then + puncher:get_inventory():add_item("main", "hotairballoon:hotair" .. color) + end +end + +function carpet:on_step(dtime) + if self.driver then + self.yaw = self.driver:get_look_yaw() + local yaw = self.object:getyaw() + self.vx = self.object:getvelocity().x + self.vy = self.object:getvelocity().y + self.vz = self.object:getvelocity().z + local ctrl = self.driver:get_player_control() + --Forward/backward + if ctrl.up then + self.vx = self.vx + math.cos(yaw)*0.4 + self.vz = self.vz + math.sin(yaw)*0.4 + end + if ctrl.down then + self.vx = self.vx-math.cos(yaw)*0.4 + self.vz = self.vz-math.sin(yaw)*0.4 + end + --Left/right + if ctrl.left then + self.object:setyaw(self.object:getyaw()+math.pi/60+dtime*math.pi/60) + end + if ctrl.right then + self.object:setyaw(self.object:getyaw()-math.pi/60-dtime*math.pi/60) + end + --up/down + if ctrl.jump then + if self.vy < 1.5 then + self.vy = self.vy+0.3 + end + end + if ctrl.sneak then + if self.vy>-1.5 then + self.vy = self.vy-0.6 + end + end + -- + end + if self.vx==0 and self.vz==0 and self.vy==0 then + return + end + --Decelerating + local sx=get_sign(self.vx) + self.vx = self.vx - 0.02*sx + local sz=get_sign(self.vz) + self.vz = self.vz - 0.02*sz + local sy=get_sign(self.vy) + self.vy = self.vy-0.01*sy + + --Stop + if sx ~= get_sign(self.vx) then + self.vx = 0 + end + if sz ~= get_sign(self.vz) then + self.vz = 0 + end + if sy ~= get_sign(self.vy) then + self.vy = 0 + end + + --Speed limit + if math.abs(self.vx) > 87 then + self.vx = 87*get_sign(self.vx) + end + if math.abs(self.vz) > 87 then + self.vz = 87*get_sign(self.vz) + end + if math.abs(self.vy) > 87 then + self.vz = 87*get_sign(self.vy) + end + + self.object:setvelocity({x=self.vx, y=self.vy,z=self.vz}) +end +minetest.register_entity("hotairballoon:hotair" .. color , carpet) + +minetest.register_craftitem("hotairballoon:hotair" .. color, { + description = color .."Hot Air Balloon", + inventory_image = "hotair_inv.png^[colorize:#"..colour..":70", + wield_image = "none.png", + liquids_pointable = false, + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + if minetest.get_node(pointed_thing.above).name ~= "air" then + return + end + pointed_thing.under.y = pointed_thing.under.y + 1 + minetest.add_entity(pointed_thing.under, "hotairballoon:hotair" .. color) + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + return itemstack + end, +}) + +end diff --git a/mods/Cars/hotairballoon/models/hotair.b3d b/mods/Cars/hotairballoon/models/hotair.b3d new file mode 100644 index 0000000..f995e38 Binary files /dev/null and b/mods/Cars/hotairballoon/models/hotair.b3d differ diff --git a/mods/Cars/hotairballoon/textures/hotair_inv.png b/mods/Cars/hotairballoon/textures/hotair_inv.png new file mode 100644 index 0000000..5b691ea Binary files /dev/null and b/mods/Cars/hotairballoon/textures/hotair_inv.png differ diff --git a/mods/Cars/hotairballoon/textures/hotair_w.png b/mods/Cars/hotairballoon/textures/hotair_w.png new file mode 100644 index 0000000..9231428 Binary files /dev/null and b/mods/Cars/hotairballoon/textures/hotair_w.png differ diff --git a/mods/Cars/hovercraft/LICENSE.txt b/mods/Cars/hovercraft/LICENSE.txt new file mode 100644 index 0000000..9baa488 --- /dev/null +++ b/mods/Cars/hovercraft/LICENSE.txt @@ -0,0 +1,15 @@ +Hovercraft for Minetest [hovercraft] +==================================== + +Source Code: Copyright (C) 2013 Stuart Jones - LGPL + +Tetxures: Copyright (C) 2013 Stuart Jones - CC-BY-SA + +Models: Copyright (C) 2013 Stuart Jones - CC-BY-SA + +Sounds: freesound.org + + Rocket Boost Engine Loop by qubodup - CC0 + CARTOON-BING-LOW by kantouth - CC-BY-3.0 + All other sounds: Copyright Stuart Jones - CC-BY-SA + diff --git a/mods/Cars/hovercraft/README.txt b/mods/Cars/hovercraft/README.txt new file mode 100644 index 0000000..3c7f8b3 --- /dev/null +++ b/mods/Cars/hovercraft/README.txt @@ -0,0 +1,29 @@ +Hovercraft for Minetest [hovercraft] +==================================== + +A fun alternative mode of transport for Minetest. + +Controls +======== + + Forward (W) Thrust + Jump (Space) Jump + Mouse Move Rotate + Sneak (Shift) Sit (only visible in multiplayer) + +Know Issues +=========== + +'Bouncing' into thin air: This can simply be the result of server lag, +even in singleplayer mode, the client and server can get out of sync. +Solution, be patient, allow the environment to fully load before preceding. + +Problems with bouncing in air and generally getting stuck, being pulled +underwater and all manner of other weirdness can also be caused by a rather +nasty entity duplication bug in minetest itself. The only solution here is +to track down and remove any duplicate entities or by running /clearobjects + +Entity Duplication: See above. This usually occurs when you move a given +distance from where the entity was originally placed. The only solution +right now is to restrict the hovercraft to a certain area. For example, +create a sunken race track the hovercraft cannot physically escape from. diff --git a/mods/Cars/hovercraft/depends.txt b/mods/Cars/hovercraft/depends.txt new file mode 100644 index 0000000..9bc856f --- /dev/null +++ b/mods/Cars/hovercraft/depends.txt @@ -0,0 +1,2 @@ +default +color diff --git a/mods/Cars/hovercraft/hover.lua b/mods/Cars/hovercraft/hover.lua new file mode 100644 index 0000000..20723f2 --- /dev/null +++ b/mods/Cars/hovercraft/hover.lua @@ -0,0 +1,184 @@ +hover = {} + +function hover:register_hovercraft(name, def) + minetest.register_entity(name, { + wield_image = "none.png", + physical = true, + collisionbox = {-0.8,0,-0.8, 0.8,1.2,0.8}, + visual = "mesh", + mesh = "hovercraft.x", + textures = def.textures, + max_speed = def.max_speed, + acceleration = def.acceleration, + deceleration = def.deceleration, + jump_velocity = def.jump_velocity, + fall_velocity = def.fall_velocity, + bounce = def.bounce, + player = nil, + sound = nil, + thrust = 0, + velocity = {x=0, y=0, z=0}, + last_pos = {x=0, y=0, z=0}, + timer = 0, + on_activate = function(self, staticdata, dtime_s) + self.object:set_armor_groups({immortal=1}) + self.object:set_animation({x=0, y=24}, 30) + end, + on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir) + if self.player then + return + end + if self.sound then + minetest.sound_stop(self.sound) + end + self.object:remove() + if puncher and puncher:is_player() then + puncher:get_inventory():add_item("main", name) + end + end, + on_rightclick = function(self, clicker) + if not clicker or not clicker:is_player() then + return + end + local pos = self.object:getpos() + if self.player and clicker == self.player then + if self.sound then + minetest.sound_stop(self.sound) + minetest.sound_play("hovercraft_thrust_fade", {object = self.object}) + self.sound = nil + end + self.thrust = 0 + self.player = nil + self.object:set_animation({x=0, y=0}, 30) + clicker:set_animation({x=0, y=0}) + clicker:set_detach() + elseif not self.player then + self.player = clicker + clicker:set_attach(self.object, "", {x=-2,y=16.5,z=0}, {x=0,y=90,z=0}) + clicker:set_animation({x=81, y=81}) + local yaw = clicker:get_look_yaw() + self.object:setyaw(yaw) + self.yaw = yaw + pos.y = pos.y + 0.5 + minetest.sound_play("hovercraft_jump", {object = self.object}) + self.object:set_animation({x=0, y=0}) + end + self.last_pos = vector.new(pos) + self.object:setpos(pos) + end, + on_step = function(self, dtime) + self.timer = self.timer + dtime + if self.player then + local yaw = self.player:get_look_yaw() + if not yaw then + return + end + self.object:setyaw(yaw) + local ctrl = self.player:get_player_control() + if ctrl.up then + if self.thrust < self.max_speed then + self.thrust = self.thrust + self.acceleration + end + local velocity = hover:get_velocity(self.thrust, self.velocity.y, 0, yaw) + if velocity.x <= self.velocity.x - self.acceleration then + self.velocity.x = self.velocity.x - self.acceleration + elseif velocity.x >= self.velocity.x + self.acceleration then + self.velocity.x = self.velocity.x + self.acceleration + end + if velocity.z <= self.velocity.z - self.acceleration then + self.velocity.z = self.velocity.z - self.acceleration + elseif velocity.z >= self.velocity.z + self.acceleration then + self.velocity.z = self.velocity.z + self.acceleration + end + if not self.sound then + self.object:set_animation({x=25, y=75}, 30) + self.sound = minetest.sound_play("hovercraft_thrust_loop", { + object = self.object, + loop = true, + }) + end + elseif self.thrust > 0 then + self.thrust = self.thrust - 0.1 + if self.sound then + minetest.sound_stop(self.sound) + minetest.sound_play("hovercraft_thrust_fade", {object = self.object}) + self.sound = nil + end + else + self.object:set_animation({x=0, y=0}) + self.thrust = 0 + end + if ctrl.jump and self.velocity.y == 0 then + self.velocity.y = self.jump_velocity + self.timer = 0 + minetest.sound_play("hovercraft_jump", {object = self.object}) + end + if ctrl.sneak then + self.player:set_animation({x=81, y=81}) + end + end + local pos = self.object:getpos() + if self.timer > 0.5 then + local node = minetest.env:get_node({x=pos.x, y=pos.y-0.5, z=pos.z}) + if node.name == "air" or node.name == "ignore" then + self.velocity.y = 0 - self.fall_velocity + else + self.velocity.y = 0 + pos.y = math.floor(pos.y) + 0.5 + self.object:setpos(pos) + end + self.timer = 0 + end + if self.last_pos.x == pos.x and math.abs(self.velocity.x) > 0.5 then + self.velocity.x = self.velocity.x * (0 - self.bounce) + self.thrust = 0 + minetest.sound_play("hovercraft_bounce", {object = self.object}) + end + if self.last_pos.z == pos.z and math.abs(self.velocity.z) > 0.5 then + self.velocity.z = self.velocity.z * (0 - self.bounce) + self.thrust = 0 + minetest.sound_play("hovercraft_bounce", {object = self.object}) + end + self.last_pos = vector.new(pos) + if self.thrust < 1 then + if self.velocity.x > self.deceleration then + self.velocity.x = self.velocity.x - self.deceleration + elseif self.velocity.x < 0 - self.deceleration then + self.velocity.x = self.velocity.x + self.deceleration + else + self.velocity.x = 0 + end + if self.velocity.z > self.deceleration then + self.velocity.z = self.velocity.z - self.deceleration + elseif self.velocity.z < 0 - self.deceleration then + self.velocity.z = self.velocity.z + self.deceleration + else + self.velocity.z = 0 + end + end + self.object:setvelocity(self.velocity) + end, + }) + minetest.register_craftitem(name, { + description = def.description, + wield_image = "none.png", + inventory_image = def.inventory_image, + liquids_pointable = true, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + pointed_thing.under.y = pointed_thing.under.y + 0.5 + minetest.env:add_entity(pointed_thing.under, name) + itemstack:take_item() + return itemstack + end, + }) +end + +function hover:get_velocity(vx, vy, vz, yaw) + local x = math.cos(yaw) * vx + math.cos(math.pi / 2 + yaw) * vz + local z = math.sin(yaw) * vx + math.sin(math.pi / 2 + yaw) * vz + return {x=x, y=vy, z=z} +end + diff --git a/mods/Cars/hovercraft/init.lua b/mods/Cars/hovercraft/init.lua new file mode 100644 index 0000000..7ed04c0 --- /dev/null +++ b/mods/Cars/hovercraft/init.lua @@ -0,0 +1,44 @@ +color1 = minetest.setting_get("color1") or "292421" +color2 = minetest.setting_get("color2") or "0000FF" +color3 = minetest.setting_get("color3") or "00FF00" +color4 = minetest.setting_get("color4") or "F5F5F5" +color5 = minetest.setting_get("color5") or "FF6103" +color6 = minetest.setting_get("color6") or "FF0000" +color7 = minetest.setting_get("color7") or "FFFF00" +color8 = minetest.setting_get("color8") or "FF69B4" + +local source_list = { + {"black", "Color1", color1, 40, 36, 33}, + {"blue", "Color2", color2, 0, 0, 255}, + {"green", "Color3", color3, 0, 255, 0}, + {"white", "Color4", color4, 245, 245, 245}, + {"orange", "Color5", color5, 255, 97, 3}, + {"red", "Color6", color6, 255, 0, 0}, + {"yellow", "Color7", color7, 255, 255, 0}, + {"pink", "Color8", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local color = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +dofile(minetest.get_modpath("hovercraft").."/hover.lua") + +hover:register_hovercraft("hovercraft:hover_" .. color,{ + description = color .."Hovercraft", + textures = {"hovercraft.png^[colorize:#"..colour..":70"}, + wield_image = "none.png", + inventory_image = "hovercraft_inv.png^[colorize:#"..colour..":70", + max_speed = 10, + acceleration = 0.25, + deceleration = 0.05, + jump_velocity = 4.0, + fall_velocity = 1.0, + bounce = 0.5, +}) + +end diff --git a/mods/Cars/hovercraft/models/hovercraft.blend b/mods/Cars/hovercraft/models/hovercraft.blend new file mode 100644 index 0000000..a66e458 Binary files /dev/null and b/mods/Cars/hovercraft/models/hovercraft.blend differ diff --git a/mods/Cars/hovercraft/models/hovercraft.x b/mods/Cars/hovercraft/models/hovercraft.x new file mode 100644 index 0000000..d40912d --- /dev/null +++ b/mods/Cars/hovercraft/models/hovercraft.x @@ -0,0 +1,2132 @@ +xof 0303txt 0032 + +template XSkinMeshHeader { + <3cf169ce-ff7c-44ab-93c0-f78f62d172e2> + WORD nMaxSkinWeightsPerVertex; + WORD nMaxSkinWeightsPerFace; + WORD nBones; +} + +template SkinWeights { + <6f0d123b-bad2-4167-a0d0-80224f25fabb> + STRING transformNodeName; + DWORD nWeights; + array DWORD vertexIndices[nWeights]; + array float weights[nWeights]; + Matrix4x4 matrixOffset; +} + +Frame Root { + FrameTransformMatrix { + 1.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 1.000000, 0.000000, + 0.000000, 1.000000,-0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 1.000000;; + } + Frame Armature { + FrameTransformMatrix { + 1.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 1.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 1.000000, 0.000000, + 0.000000, 0.000000, 3.500000, 1.000000;; + } + Frame Armature_Body { + FrameTransformMatrix { + 1.000000,-0.000000,-0.000000, 0.000000, + 0.000000, 0.000000, 1.000000, 0.000000, + -0.000000,-1.000000, 0.000000, 0.000000, + -0.000000, 0.000000,-2.459941, 1.000000;; + } + Frame Armature_Thruster { + FrameTransformMatrix { + 0.000000, 0.000000,-1.000000, 0.000000, + -1.000000, 0.000000,-0.000000, 0.000000, + 0.000000, 1.000000, 0.000000, 0.000000, + -4.639344, 8.859941, 0.000000, 1.000000;; + } + } //End of Armature_Thruster + } //End of Armature_Body + Frame Hovercraft { + FrameTransformMatrix { + -0.000003,-4.000000, 0.000000, 0.000000, + 4.000000,-0.000003, 0.000000, 0.000000, + 0.000000, 0.000000, 2.581575, 0.000000, + 0.000000, 0.000000,-0.500000, 1.000000;; + } + Mesh { //Mesh Mesh + 184; + -1.874999;-1.875000;-0.774721;, + 1.875000;-1.874998;-0.774721;, + 1.874998; 1.875000;-0.774721;, + -1.875000; 1.874998;-0.774721;, + 1.874999; 1.874999; 0.387360;, + 1.875000;-1.874999; 0.387360;, + -1.874998;-1.875000; 0.387360;, + -1.874999; 1.874999; 0.387360;, + 1.874998; 1.875000;-0.774721;, + 1.874999; 1.874999; 0.387360;, + -1.874999; 1.874999; 0.387360;, + -1.875000; 1.874998;-0.774721;, + 1.875000;-1.874998;-0.774721;, + 1.875000;-1.874999; 0.387360;, + 1.874999; 1.874999; 0.387360;, + 1.874998; 1.875000;-0.774721;, + -1.874999;-1.875000;-0.774721;, + -1.874998;-1.875000; 0.387360;, + 1.875000;-1.874999; 0.387360;, + 1.875000;-1.874998;-0.774721;, + -1.874998;-1.875000; 0.387360;, + -1.874999;-1.875000;-0.774721;, + -1.875000; 1.874998;-0.774721;, + -1.874999; 1.874999; 0.387360;, + -1.999998;-2.000000;-0.581041;, + 2.000000;-1.999998;-0.581041;, + 1.999998; 2.000000;-0.581041;, + -2.000000; 1.999998;-0.581041;, + 1.999999; 1.999999; 0.193680;, + 2.000000;-1.999999; 0.193680;, + -1.999998;-2.000000; 0.193680;, + -1.999999; 1.999999; 0.193680;, + 1.999998; 2.000000;-0.581041;, + 1.999999; 1.999999; 0.193680;, + -1.999999; 1.999999; 0.193680;, + -2.000000; 1.999998;-0.581041;, + 2.000000;-1.999998;-0.581041;, + 2.000000;-1.999999; 0.193680;, + 1.999999; 1.999999; 0.193680;, + 1.999998; 2.000000;-0.581041;, + -1.999998;-2.000000;-0.581041;, + -1.999998;-2.000000; 0.193680;, + 2.000000;-1.999999; 0.193680;, + 2.000000;-1.999998;-0.581041;, + -1.999998;-2.000000; 0.193680;, + -1.999998;-2.000000;-0.581041;, + -2.000000; 1.999998;-0.581041;, + -1.999999; 1.999999; 0.193680;, + 0.500000;-1.000000; 3.200000;, + 0.500000;-2.000000; 3.200000;, + -0.500000;-2.000000; 3.200000;, + -0.500000;-1.000000; 3.200000;, + 0.500000;-2.000000; 1.700000;, + -0.500000;-2.000000; 1.700000;, + -0.500000;-2.000000; 3.200000;, + 0.500000;-2.000000; 3.200000;, + -0.500000;-2.000000; 1.700000;, + -0.500000;-1.000000; 1.700000;, + -0.500000;-1.000000; 3.200000;, + -0.500000;-2.000000; 3.200000;, + 0.500000;-2.000000; 3.200000;, + 0.500000;-1.000000; 3.200000;, + 0.500000;-1.000000; 1.700000;, + 0.500000;-2.000000; 1.700000;, + 0.500000;-1.000000; 3.200000;, + -0.500000;-1.000000; 3.200000;, + -0.500000;-1.000000; 1.700000;, + 0.500000;-1.000000; 1.700000;, + -0.500000;-2.000000; 1.700000;, + 0.500000;-2.000000; 1.700000;, + 0.500000;-1.000000; 1.700000;, + -0.500000;-1.000000; 1.700000;, + 1.000000; 1.000000; 0.676959;, + 1.000000; 0.999999; 1.100000;, + -1.000000; 1.000000; 1.100000;, + -1.000000; 1.000000; 0.676959;, + -1.000000;-1.000000; 1.100000;, + -1.000000;-1.000000; 0.677000;, + -1.000000; 1.000000; 0.676959;, + -1.000000; 1.000000; 1.100000;, + -1.000000;-1.000000; 0.677000;, + -1.000000;-1.000000; 1.100000;, + 0.999999;-1.000001; 1.100000;, + 0.999999;-1.000000; 0.677000;, + 0.999999;-1.000000; 0.677000;, + 0.999999;-1.000001; 1.100000;, + 1.000000; 0.999999; 1.100000;, + 1.000000; 1.000000; 0.676959;, + 0.999999;-1.000001; 1.100000;, + -1.000000;-1.000000; 1.100000;, + -1.000000; 1.000000; 1.100000;, + 1.000000; 0.999999; 1.100000;, + -0.500000;-1.000000; 0.677000;, + -0.500000;-1.000000; 2.900000;, + -0.750000;-1.000000; 2.900000;, + -0.750000;-1.000000; 0.677000;, + -0.750000;-1.500000; 2.900000;, + -0.750000;-1.500000; 0.677000;, + -0.750000;-1.000000; 0.677000;, + -0.750000;-1.000000; 2.900000;, + -0.500000;-1.500000; 0.677000;, + -0.500000;-1.500000; 2.900000;, + -0.500000;-1.000000; 2.900000;, + -0.500000;-1.000000; 0.677000;, + -0.500000;-1.500000; 2.900000;, + -0.750000;-1.500000; 2.900000;, + -0.750000;-1.000000; 2.900000;, + -0.500000;-1.000000; 2.900000;, + -0.750000;-1.500000; 2.900000;, + -0.500000;-1.500000; 2.900000;, + -0.500000;-1.500000; 0.677000;, + -0.750000;-1.500000; 0.677000;, + -1.500000;-1.500000; 0.387000;, + -1.500000; 1.500000; 0.387000;, + -1.500000; 1.500000; 0.677000;, + -1.500000;-1.500000; 0.677000;, + 1.500001; 1.499999; 0.387000;, + 1.499999;-1.500001; 0.387000;, + 1.499999;-1.500001; 0.677000;, + 1.500001; 1.499999; 0.677000;, + -1.500000; 1.500000; 0.677000;, + -1.500000; 1.500000; 0.387000;, + 1.500001; 1.499999; 0.387000;, + 1.500001; 1.499999; 0.677000;, + -1.000000; 1.500000; 0.677122;, + 1.000000; 1.500000; 0.676959;, + 1.000000; 1.000000; 0.676959;, + -1.000000; 1.000000; 0.676959;, + 0.999999;-1.000000; 0.677000;, + 0.999999;-1.500001; 0.677000;, + -1.000000;-1.500000; 0.677000;, + -1.000000;-1.000000; 0.677000;, + 1.499999;-1.500001; 0.387000;, + -1.500000;-1.500000; 0.387000;, + -1.500000;-1.500000; 0.677000;, + 1.499999;-1.500001; 0.677000;, + -1.500000; 1.500000; 0.677000;, + -1.000000; 1.500000; 0.677122;, + -1.000000;-1.500000; 0.677000;, + -1.500000;-1.500000; 0.677000;, + 0.499519;-1.500000; 2.900000;, + 0.750000;-1.500000; 2.900000;, + 0.750000;-1.500000; 0.677000;, + 0.499519;-1.500000; 0.677000;, + 0.750000;-1.500000; 2.900000;, + 0.499519;-1.500000; 2.900000;, + 0.499519;-1.000000; 2.900000;, + 0.750000;-1.000000; 2.900000;, + 0.750000;-1.500000; 0.677000;, + 0.750000;-1.500000; 2.900000;, + 0.750000;-1.000000; 2.900000;, + 0.750000;-1.000000; 0.677000;, + 0.499519;-1.500000; 2.900000;, + 0.499519;-1.500000; 0.677000;, + 0.499519;-1.000000; 0.677000;, + 0.499519;-1.000000; 2.900000;, + 0.750000;-1.000000; 0.677000;, + 0.750000;-1.000000; 2.900000;, + 0.499519;-1.000000; 2.900000;, + 0.499519;-1.000000; 0.677000;, + -0.374998;-1.875001; 1.898066;, + 0.375002;-1.875000; 1.898066;, + 0.375001;-1.125000; 1.898066;, + -0.374999;-1.125001; 1.898066;, + 0.375002;-1.875000; 2.982676;, + 0.375001;-1.125000; 2.982676;, + 0.375001;-1.125000; 1.898066;, + 0.375002;-1.875000; 1.898066;, + -0.374998;-1.875001; 1.898066;, + -0.374999;-1.125001; 1.898066;, + -0.374999;-1.125001; 2.982676;, + -0.374998;-1.875001; 2.982676;, + 0.375002;-1.875000; 1.898066;, + -0.374998;-1.875001; 1.898066;, + -0.374998;-1.875001; 2.982676;, + 0.375002;-1.875000; 2.982676;, + 0.375001;-1.125000; 2.982676;, + 0.375002;-1.875000; 2.982676;, + -0.374998;-1.875001; 2.982676;, + -0.374999;-1.125001; 2.982676;, + 1.499999;-1.500001; 0.677000;, + 0.999999;-1.500001; 0.677000;, + 1.000000; 1.500000; 0.676959;, + 1.500001; 1.499999; 0.677000;; + 46; + 4;0;1;2;3;, + 4;4;5;6;7;, + 4;8;9;10;11;, + 4;12;13;14;15;, + 4;16;17;18;19;, + 4;20;21;22;23;, + 4;24;25;26;27;, + 4;28;29;30;31;, + 4;32;33;34;35;, + 4;36;37;38;39;, + 4;40;41;42;43;, + 4;44;45;46;47;, + 4;48;49;50;51;, + 4;52;53;54;55;, + 4;56;57;58;59;, + 4;60;61;62;63;, + 4;64;65;66;67;, + 4;68;69;70;71;, + 4;72;73;74;75;, + 4;76;77;78;79;, + 4;80;81;82;83;, + 4;84;85;86;87;, + 4;88;89;90;91;, + 4;92;93;94;95;, + 4;96;97;98;99;, + 4;100;101;102;103;, + 4;104;105;106;107;, + 4;108;109;110;111;, + 4;112;113;114;115;, + 4;116;117;118;119;, + 4;120;121;122;123;, + 4;124;125;126;127;, + 4;128;129;130;131;, + 4;132;133;134;135;, + 4;136;137;138;139;, + 4;140;141;142;143;, + 4;144;145;146;147;, + 4;148;149;150;151;, + 4;152;153;154;155;, + 4;156;157;158;159;, + 4;160;161;162;163;, + 4;164;165;166;167;, + 4;168;169;170;171;, + 4;172;173;174;175;, + 4;176;177;178;179;, + 4;180;181;182;183;; + MeshNormals { //Mesh Normals + 184; + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000; 1.000000;, + 0.000000; 0.000000; 1.000000;, + 0.000000; 0.000000; 1.000000;, + 0.000000; 0.000000; 1.000000;, + -0.000000; 1.000000; 0.000000;, + -0.000000; 1.000000; 0.000000;, + -0.000000; 1.000000; 0.000000;, + -0.000000; 1.000000; 0.000000;, + 1.000000; 0.000000;-0.000000;, + 1.000000; 0.000000;-0.000000;, + 1.000000; 0.000000;-0.000000;, + 1.000000; 0.000000;-0.000000;, + 0.000000;-1.000000;-0.000000;, + 0.000000;-1.000000;-0.000000;, + 0.000000;-1.000000;-0.000000;, + 0.000000;-1.000000;-0.000000;, + -1.000000;-0.000000; 0.000001;, + -1.000000;-0.000000; 0.000001;, + -1.000000;-0.000000; 0.000001;, + -1.000000;-0.000000; 0.000001;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000; 1.000000;, + 0.000000; 0.000000; 1.000000;, + 0.000000; 0.000000; 1.000000;, + 0.000000; 0.000000; 1.000000;, + -0.000000; 1.000000; 0.000000;, + -0.000000; 1.000000; 0.000000;, + -0.000000; 1.000000; 0.000000;, + -0.000000; 1.000000; 0.000000;, + 1.000000; 0.000000;-0.000001;, + 1.000000; 0.000000;-0.000001;, + 1.000000; 0.000000;-0.000001;, + 1.000000; 0.000000;-0.000001;, + 0.000000;-1.000000;-0.000001;, + 0.000000;-1.000000;-0.000001;, + 0.000000;-1.000000;-0.000001;, + 0.000000;-1.000000;-0.000001;, + -1.000000;-0.000000; 0.000001;, + -1.000000;-0.000000; 0.000001;, + -1.000000;-0.000000; 0.000001;, + -1.000000;-0.000000; 0.000001;, + 0.000000; 0.000000; 1.000000;, + 0.000000; 0.000000; 1.000000;, + 0.000000; 0.000000; 1.000000;, + 0.000000; 0.000000; 1.000000;, + 0.000000;-1.000000; 0.000000;, + 0.000000;-1.000000; 0.000000;, + 0.000000;-1.000000; 0.000000;, + 0.000000;-1.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + 1.000000; 0.000000; 0.000000;, + 1.000000; 0.000000; 0.000000;, + 1.000000; 0.000000; 0.000000;, + 1.000000; 0.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + -1.000000; 0.000000;-0.000000;, + -1.000000; 0.000000;-0.000000;, + -1.000000; 0.000000;-0.000000;, + -1.000000; 0.000000;-0.000000;, + -0.000000;-1.000000;-0.000000;, + -0.000000;-1.000000;-0.000000;, + -0.000000;-1.000000;-0.000000;, + -0.000000;-1.000000;-0.000000;, + 1.000000;-0.000001;-0.000000;, + 1.000000;-0.000001;-0.000000;, + 1.000000;-0.000001;-0.000000;, + 1.000000;-0.000001;-0.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + 1.000000;-0.000000; 0.000000;, + 1.000000;-0.000000; 0.000000;, + 1.000000;-0.000000; 0.000000;, + 1.000000;-0.000000; 0.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-1.000000;-0.000000;, + 0.000000;-1.000000;-0.000000;, + 0.000000;-1.000000;-0.000000;, + 0.000000;-1.000000;-0.000000;, + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + 1.000000;-0.000001; 0.000000;, + 1.000000;-0.000001; 0.000000;, + 1.000000;-0.000001; 0.000000;, + 1.000000;-0.000001; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000041;-0.000162; 1.000000;, + 0.000041;-0.000162; 1.000000;, + 0.000041;-0.000162; 1.000000;, + 0.000041;-0.000162; 1.000000;, + 0.000000; 0.000000; 1.000000;, + 0.000000; 0.000000; 1.000000;, + 0.000000; 0.000000; 1.000000;, + 0.000000; 0.000000; 1.000000;, + -0.000001;-1.000000; 0.000000;, + -0.000001;-1.000000; 0.000000;, + -0.000001;-1.000000; 0.000000;, + -0.000001;-1.000000; 0.000000;, + -0.000122;-0.000020; 1.000000;, + -0.000122;-0.000020; 1.000000;, + -0.000122;-0.000020; 1.000000;, + -0.000122;-0.000020; 1.000000;, + 0.000000;-1.000000;-0.000000;, + 0.000000;-1.000000;-0.000000;, + 0.000000;-1.000000;-0.000000;, + 0.000000;-1.000000;-0.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 1.000000;-0.000000; 0.000000;, + 1.000000;-0.000000; 0.000000;, + 1.000000;-0.000000; 0.000000;, + 1.000000;-0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 1.000000; 0.000001; 0.000000;, + 1.000000; 0.000001; 0.000000;, + 1.000000; 0.000001; 0.000000;, + 1.000000; 0.000001; 0.000000;, + -1.000000;-0.000001; 0.000000;, + -1.000000;-0.000001; 0.000000;, + -1.000000;-0.000001; 0.000000;, + -1.000000;-0.000001; 0.000000;, + 0.000001;-1.000000; 0.000000;, + 0.000001;-1.000000; 0.000000;, + 0.000001;-1.000000; 0.000000;, + 0.000001;-1.000000; 0.000000;, + 0.000000; 0.000000; 1.000000;, + 0.000000; 0.000000; 1.000000;, + 0.000000; 0.000000; 1.000000;, + 0.000000; 0.000000; 1.000000;, + -0.000041; 0.000007; 1.000000;, + -0.000041; 0.000007; 1.000000;, + -0.000041; 0.000007; 1.000000;, + -0.000041; 0.000007; 1.000000;; + 46; + 4;0;1;2;3;, + 4;4;5;6;7;, + 4;8;9;10;11;, + 4;12;13;14;15;, + 4;16;17;18;19;, + 4;20;21;22;23;, + 4;24;25;26;27;, + 4;28;29;30;31;, + 4;32;33;34;35;, + 4;36;37;38;39;, + 4;40;41;42;43;, + 4;44;45;46;47;, + 4;48;49;50;51;, + 4;52;53;54;55;, + 4;56;57;58;59;, + 4;60;61;62;63;, + 4;64;65;66;67;, + 4;68;69;70;71;, + 4;72;73;74;75;, + 4;76;77;78;79;, + 4;80;81;82;83;, + 4;84;85;86;87;, + 4;88;89;90;91;, + 4;92;93;94;95;, + 4;96;97;98;99;, + 4;100;101;102;103;, + 4;104;105;106;107;, + 4;108;109;110;111;, + 4;112;113;114;115;, + 4;116;117;118;119;, + 4;120;121;122;123;, + 4;124;125;126;127;, + 4;128;129;130;131;, + 4;132;133;134;135;, + 4;136;137;138;139;, + 4;140;141;142;143;, + 4;144;145;146;147;, + 4;148;149;150;151;, + 4;152;153;154;155;, + 4;156;157;158;159;, + 4;160;161;162;163;, + 4;164;165;166;167;, + 4;168;169;170;171;, + 4;172;173;174;175;, + 4;176;177;178;179;, + 4;180;181;182;183;; + } //End of Mesh Normals + MeshMaterialList { //Mesh Material List + 1; + 46; + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0;; + Material Hovercraft { + 0.640000; 0.640000; 0.640000; 1.000000;; + 96.078431; + 1.000000; 1.000000; 1.000000;; + 0.000000; 0.000000; 0.000000;; + } + } //End of Mesh Material List + MeshTextureCoords { //Mesh UV Coordinates + 184; + 0.031250; 0.531250;, + 0.468750; 0.531250;, + 0.468750; 0.968750;, + 0.031250; 0.968750;, + 0.031250; 0.531250;, + 0.468750; 0.531250;, + 0.468750; 0.968750;, + 0.031250; 0.968750;, + 0.531250; 0.968750;, + 0.531250; 0.781250;, + 0.968750; 0.781250;, + 0.968750; 0.968750;, + 0.968750; 0.718750;, + 0.968750; 0.531250;, + 0.531250; 0.531250;, + 0.531250; 0.718750;, + 0.531250; 0.968750;, + 0.531250; 0.781250;, + 0.968750; 0.781250;, + 0.968750; 0.968750;, + 0.968750; 0.531250;, + 0.968750; 0.718750;, + 0.531250; 0.718750;, + 0.531250; 0.531250;, + 0.000000; 0.500000;, + 0.500000; 0.500000;, + 0.500000; 1.000000;, + 0.000000; 1.000000;, + 0.000000; 0.500000;, + 0.500000; 0.500000;, + 0.500000; 1.000000;, + 0.000000; 1.000000;, + 0.500000; 0.968750;, + 0.500000; 0.812500;, + 1.000000; 0.812500;, + 1.000000; 0.968750;, + 1.000000; 0.718750;, + 1.000000; 0.562500;, + 0.500000; 0.562500;, + 0.500000; 0.718750;, + 0.500000; 0.968750;, + 0.500000; 0.812500;, + 1.000000; 0.812500;, + 1.000000; 0.968750;, + 1.000000; 0.562500;, + 1.000000; 0.718750;, + 0.500000; 0.718750;, + 0.500000; 0.562500;, + 0.625000; 0.000000;, + 0.750000; 0.000000;, + 0.750000; 0.125000;, + 0.625000; 0.125000;, + 0.875000; 0.250000;, + 0.750000; 0.250000;, + 0.750000; 0.125000;, + 0.875000; 0.125000;, + 0.625000; 0.125000;, + 0.500000; 0.125000;, + 0.500000; 0.000000;, + 0.625000; 0.000000;, + 0.875000; 0.125000;, + 0.750000; 0.125000;, + 0.750000; 0.000000;, + 0.875000; 0.000000;, + 0.625000; 0.125000;, + 0.750000; 0.125000;, + 0.750000; 0.250000;, + 0.625000; 0.250000;, + 1.000000; 0.000000;, + 1.000000; 0.125000;, + 0.875000; 0.125000;, + 0.875000; 0.000000;, + 0.078125; 0.125000;, + 0.125000; 0.125000;, + 0.125000; 0.375000;, + 0.078125; 0.375000;, + 0.375000; 0.078125;, + 0.375000; 0.125000;, + 0.125000; 0.125000;, + 0.125000; 0.078125;, + 0.421875; 0.375000;, + 0.375000; 0.375000;, + 0.375000; 0.125000;, + 0.421875; 0.125000;, + 0.375000; 0.421875;, + 0.375000; 0.375000;, + 0.125000; 0.375000;, + 0.125000; 0.421875;, + 0.375000; 0.125000;, + 0.375000; 0.375000;, + 0.125000; 0.375000;, + 0.125000; 0.125000;, + 0.500000; 0.500000;, + 0.500000; 0.296875;, + 0.546875; 0.296875;, + 0.546875; 0.500000;, + 0.609375; 0.296875;, + 0.609375; 0.500000;, + 0.546875; 0.500000;, + 0.546875; 0.296875;, + 0.718750; 0.500000;, + 0.718750; 0.296875;, + 0.656250; 0.296875;, + 0.656250; 0.500000;, + 0.609375; 0.250000;, + 0.609375; 0.296875;, + 0.546875; 0.296875;, + 0.546875; 0.250000;, + 0.609375; 0.296875;, + 0.656250; 0.296875;, + 0.656250; 0.500000;, + 0.609375; 0.500000;, + 0.937500; 0.531250;, + 0.562500; 0.531250;, + 0.562500; 0.500000;, + 0.937500; 0.500000;, + 0.562500; 0.531250;, + 0.937500; 0.531250;, + 0.937500; 0.500000;, + 0.562500; 0.500000;, + 0.937500; 0.750000;, + 0.937500; 0.781250;, + 0.562500; 0.781250;, + 0.562500; 0.750000;, + 0.000000; 0.375000;, + 0.000000; 0.125000;, + 0.078125; 0.125000;, + 0.078125; 0.375000;, + 0.421875; 0.125000;, + 0.500000; 0.125000;, + 0.500000; 0.375000;, + 0.421875; 0.375000;, + 0.937500; 0.781250;, + 0.562500; 0.781250;, + 0.562500; 0.750000;, + 0.937500; 0.750000;, + 0.062500; 0.078125;, + 0.062500; 0.000000;, + 0.437500; 0.000000;, + 0.437500; 0.078125;, + 0.859375; 0.296875;, + 0.812500; 0.296875;, + 0.812500; 0.500000;, + 0.859375; 0.500000;, + 0.859375; 0.250000;, + 0.859375; 0.296875;, + 0.921875; 0.296875;, + 0.921875; 0.250000;, + 0.750000; 0.500000;, + 0.750000; 0.296875;, + 0.812500; 0.296875;, + 0.812500; 0.500000;, + 0.859375; 0.296875;, + 0.859375; 0.500000;, + 0.921875; 0.500000;, + 0.921875; 0.296875;, + 0.968750; 0.500000;, + 0.968750; 0.296875;, + 0.921875; 0.296875;, + 0.921875; 0.500000;, + 0.609375; 0.140625;, + 0.609375; 0.234375;, + 0.515625; 0.234375;, + 0.515625; 0.140625;, + 0.609375; 0.234375;, + 0.515625; 0.234375;, + 0.515625; 0.140625;, + 0.609375; 0.140625;, + 0.609375; 0.234375;, + 0.515625; 0.234375;, + 0.515625; 0.140625;, + 0.609375; 0.140625;, + 0.984375; 0.234375;, + 0.890625; 0.234375;, + 0.890625; 0.140625;, + 0.984375; 0.140625;, + 0.515625; 0.140625;, + 0.609375; 0.140625;, + 0.609375; 0.234375;, + 0.515625; 0.234375;, + 0.062500; 0.421875;, + 0.062500; 0.500000;, + 0.437500; 0.500000;, + 0.437500; 0.421875;; + } //End of Mesh UV Coordinates + XSkinMeshHeader { + 1; + 3; + 2; + } + SkinWeights { + "Armature_Thruster"; + 20; + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + -4.000000, 0.000002, 0.000000, 0.000000, + -0.000002,-4.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 2.581575, 0.000000, + -0.000000,-4.639344,-6.900000, 1.000000;; + } //End of Armature_Thruster Skin Weights + SkinWeights { + "Armature_Body"; + 164; + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 180, + 181, + 182, + 183; + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000, + 1.000000; + -0.000003,-0.000000, 4.000000, 0.000000, + 4.000000, 0.000000, 0.000003, 0.000000, + -0.000000, 2.581575, 0.000000, 0.000000, + 0.000000, 1.959941, 0.000000, 1.000000;; + } //End of Armature_Body Skin Weights + } //End of Mesh Mesh + } //End of Hovercraft + } //End of Armature +} //End of Root Frame +AnimationSet { + Animation { + {Armature} + AnimationKey { //Position + 2; + 76; + 0;3; 0.000000, 0.000000, 3.500000;;, + 1;3; 0.000000, 0.000000, 3.500000;;, + 2;3; 0.000000, 0.000000, 3.500000;;, + 3;3; 0.000000, 0.000000, 3.500000;;, + 4;3; 0.000000, 0.000000, 3.500000;;, + 5;3; 0.000000, 0.000000, 3.500000;;, + 6;3; 0.000000, 0.000000, 3.500000;;, + 7;3; 0.000000, 0.000000, 3.500000;;, + 8;3; 0.000000, 0.000000, 3.500000;;, + 9;3; 0.000000, 0.000000, 3.500000;;, + 10;3; 0.000000, 0.000000, 3.500000;;, + 11;3; 0.000000, 0.000000, 3.500000;;, + 12;3; 0.000000, 0.000000, 3.500000;;, + 13;3; 0.000000, 0.000000, 3.500000;;, + 14;3; 0.000000, 0.000000, 3.500000;;, + 15;3; 0.000000, 0.000000, 3.500000;;, + 16;3; 0.000000, 0.000000, 3.500000;;, + 17;3; 0.000000, 0.000000, 3.500000;;, + 18;3; 0.000000, 0.000000, 3.500000;;, + 19;3; 0.000000, 0.000000, 3.500000;;, + 20;3; 0.000000, 0.000000, 3.500000;;, + 21;3; 0.000000, 0.000000, 3.500000;;, + 22;3; 0.000000, 0.000000, 3.500000;;, + 23;3; 0.000000, 0.000000, 3.500000;;, + 24;3; 0.000000, 0.000000, 3.500000;;, + 25;3; 0.000000, 0.000000, 3.500000;;, + 26;3; 0.000000, 0.000000, 3.500000;;, + 27;3; 0.000000, 0.000000, 3.500000;;, + 28;3; 0.000000, 0.000000, 3.500000;;, + 29;3; 0.000000, 0.000000, 3.500000;;, + 30;3; 0.000000, 0.000000, 3.500000;;, + 31;3; 0.000000, 0.000000, 3.500000;;, + 32;3; 0.000000, 0.000000, 3.500000;;, + 33;3; 0.000000, 0.000000, 3.500000;;, + 34;3; 0.000000, 0.000000, 3.500000;;, + 35;3; 0.000000, 0.000000, 3.500000;;, + 36;3; 0.000000, 0.000000, 3.500000;;, + 37;3; 0.000000, 0.000000, 3.500000;;, + 38;3; 0.000000, 0.000000, 3.500000;;, + 39;3; 0.000000, 0.000000, 3.500000;;, + 40;3; 0.000000, 0.000000, 3.500000;;, + 41;3; 0.000000, 0.000000, 3.500000;;, + 42;3; 0.000000, 0.000000, 3.500000;;, + 43;3; 0.000000, 0.000000, 3.500000;;, + 44;3; 0.000000, 0.000000, 3.500000;;, + 45;3; 0.000000, 0.000000, 3.500000;;, + 46;3; 0.000000, 0.000000, 3.500000;;, + 47;3; 0.000000, 0.000000, 3.500000;;, + 48;3; 0.000000, 0.000000, 3.500000;;, + 49;3; 0.000000, 0.000000, 3.500000;;, + 50;3; 0.000000, 0.000000, 3.500000;;, + 51;3; 0.000000, 0.000000, 3.500000;;, + 52;3; 0.000000, 0.000000, 3.500000;;, + 53;3; 0.000000, 0.000000, 3.500000;;, + 54;3; 0.000000, 0.000000, 3.500000;;, + 55;3; 0.000000, 0.000000, 3.500000;;, + 56;3; 0.000000, 0.000000, 3.500000;;, + 57;3; 0.000000, 0.000000, 3.500000;;, + 58;3; 0.000000, 0.000000, 3.500000;;, + 59;3; 0.000000, 0.000000, 3.500000;;, + 60;3; 0.000000, 0.000000, 3.500000;;, + 61;3; 0.000000, 0.000000, 3.500000;;, + 62;3; 0.000000, 0.000000, 3.500000;;, + 63;3; 0.000000, 0.000000, 3.500000;;, + 64;3; 0.000000, 0.000000, 3.500000;;, + 65;3; 0.000000, 0.000000, 3.500000;;, + 66;3; 0.000000, 0.000000, 3.500000;;, + 67;3; 0.000000, 0.000000, 3.500000;;, + 68;3; 0.000000, 0.000000, 3.500000;;, + 69;3; 0.000000, 0.000000, 3.500000;;, + 70;3; 0.000000, 0.000000, 3.500000;;, + 71;3; 0.000000, 0.000000, 3.500000;;, + 72;3; 0.000000, 0.000000, 3.500000;;, + 73;3; 0.000000, 0.000000, 3.500000;;, + 74;3; 0.000000, 0.000000, 3.500000;;, + 75;3; 0.000000, 0.000000, 3.500000;;; + } + AnimationKey { //Rotation + 0; + 76; + 0;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 1;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 2;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 3;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 4;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 5;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 6;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 7;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 8;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 9;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 10;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 11;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 12;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 13;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 14;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 15;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 16;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 17;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 18;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 19;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 20;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 21;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 22;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 23;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 24;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 25;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 26;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 27;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 28;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 29;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 30;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 31;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 32;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 33;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 34;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 35;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 36;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 37;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 38;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 39;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 40;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 41;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 42;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 43;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 44;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 45;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 46;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 47;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 48;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 49;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 50;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 51;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 52;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 53;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 54;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 55;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 56;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 57;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 58;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 59;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 60;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 61;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 62;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 63;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 64;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 65;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 66;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 67;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 68;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 69;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 70;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 71;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 72;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 73;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 74;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 75;4; -1.000000, 0.000000, 0.000000, 0.000000;;; + } + AnimationKey { //Scale + 1; + 76; + 0;3; 1.000000, 1.000000, 1.000000;;, + 1;3; 1.000000, 1.000000, 1.000000;;, + 2;3; 1.000000, 1.000000, 1.000000;;, + 3;3; 1.000000, 1.000000, 1.000000;;, + 4;3; 1.000000, 1.000000, 1.000000;;, + 5;3; 1.000000, 1.000000, 1.000000;;, + 6;3; 1.000000, 1.000000, 1.000000;;, + 7;3; 1.000000, 1.000000, 1.000000;;, + 8;3; 1.000000, 1.000000, 1.000000;;, + 9;3; 1.000000, 1.000000, 1.000000;;, + 10;3; 1.000000, 1.000000, 1.000000;;, + 11;3; 1.000000, 1.000000, 1.000000;;, + 12;3; 1.000000, 1.000000, 1.000000;;, + 13;3; 1.000000, 1.000000, 1.000000;;, + 14;3; 1.000000, 1.000000, 1.000000;;, + 15;3; 1.000000, 1.000000, 1.000000;;, + 16;3; 1.000000, 1.000000, 1.000000;;, + 17;3; 1.000000, 1.000000, 1.000000;;, + 18;3; 1.000000, 1.000000, 1.000000;;, + 19;3; 1.000000, 1.000000, 1.000000;;, + 20;3; 1.000000, 1.000000, 1.000000;;, + 21;3; 1.000000, 1.000000, 1.000000;;, + 22;3; 1.000000, 1.000000, 1.000000;;, + 23;3; 1.000000, 1.000000, 1.000000;;, + 24;3; 1.000000, 1.000000, 1.000000;;, + 25;3; 1.000000, 1.000000, 1.000000;;, + 26;3; 1.000000, 1.000000, 1.000000;;, + 27;3; 1.000000, 1.000000, 1.000000;;, + 28;3; 1.000000, 1.000000, 1.000000;;, + 29;3; 1.000000, 1.000000, 1.000000;;, + 30;3; 1.000000, 1.000000, 1.000000;;, + 31;3; 1.000000, 1.000000, 1.000000;;, + 32;3; 1.000000, 1.000000, 1.000000;;, + 33;3; 1.000000, 1.000000, 1.000000;;, + 34;3; 1.000000, 1.000000, 1.000000;;, + 35;3; 1.000000, 1.000000, 1.000000;;, + 36;3; 1.000000, 1.000000, 1.000000;;, + 37;3; 1.000000, 1.000000, 1.000000;;, + 38;3; 1.000000, 1.000000, 1.000000;;, + 39;3; 1.000000, 1.000000, 1.000000;;, + 40;3; 1.000000, 1.000000, 1.000000;;, + 41;3; 1.000000, 1.000000, 1.000000;;, + 42;3; 1.000000, 1.000000, 1.000000;;, + 43;3; 1.000000, 1.000000, 1.000000;;, + 44;3; 1.000000, 1.000000, 1.000000;;, + 45;3; 1.000000, 1.000000, 1.000000;;, + 46;3; 1.000000, 1.000000, 1.000000;;, + 47;3; 1.000000, 1.000000, 1.000000;;, + 48;3; 1.000000, 1.000000, 1.000000;;, + 49;3; 1.000000, 1.000000, 1.000000;;, + 50;3; 1.000000, 1.000000, 1.000000;;, + 51;3; 1.000000, 1.000000, 1.000000;;, + 52;3; 1.000000, 1.000000, 1.000000;;, + 53;3; 1.000000, 1.000000, 1.000000;;, + 54;3; 1.000000, 1.000000, 1.000000;;, + 55;3; 1.000000, 1.000000, 1.000000;;, + 56;3; 1.000000, 1.000000, 1.000000;;, + 57;3; 1.000000, 1.000000, 1.000000;;, + 58;3; 1.000000, 1.000000, 1.000000;;, + 59;3; 1.000000, 1.000000, 1.000000;;, + 60;3; 1.000000, 1.000000, 1.000000;;, + 61;3; 1.000000, 1.000000, 1.000000;;, + 62;3; 1.000000, 1.000000, 1.000000;;, + 63;3; 1.000000, 1.000000, 1.000000;;, + 64;3; 1.000000, 1.000000, 1.000000;;, + 65;3; 1.000000, 1.000000, 1.000000;;, + 66;3; 1.000000, 1.000000, 1.000000;;, + 67;3; 1.000000, 1.000000, 1.000000;;, + 68;3; 1.000000, 1.000000, 1.000000;;, + 69;3; 1.000000, 1.000000, 1.000000;;, + 70;3; 1.000000, 1.000000, 1.000000;;, + 71;3; 1.000000, 1.000000, 1.000000;;, + 72;3; 1.000000, 1.000000, 1.000000;;, + 73;3; 1.000000, 1.000000, 1.000000;;, + 74;3; 1.000000, 1.000000, 1.000000;;, + 75;3; 1.000000, 1.000000, 1.000000;;; + } + } + Animation { + {Armature_Body} + AnimationKey { //Position + 2; + 76; + 0;3; -0.000000, 0.000000,-2.459941;;, + 1;3; -0.000000, 0.000000,-2.455327;;, + 2;3; -0.000000, 0.000000,-2.441401;;, + 3;3; -0.000000, 0.000000,-2.418439;;, + 4;3; -0.000000, 0.000000,-2.387453;;, + 5;3; -0.000000, 0.000000,-2.350351;;, + 6;3; -0.000000, 0.000000,-2.309918;;, + 7;3; -0.000000, 0.000000,-2.269489;;, + 8;3; -0.000000, 0.000000,-2.232396;;, + 9;3; -0.000000, 0.000000,-2.201421;;, + 10;3; -0.000000, 0.000000,-2.178471;;, + 11;3; -0.000000, 0.000000,-2.164552;;, + 12;3; -0.000000, 0.000000,-2.159941;;, + 13;3; -0.000000, 0.000000,-2.164208;;, + 14;3; -0.000000, 0.000000,-2.175990;;, + 15;3; -0.000000, 0.000000,-2.194004;;, + 16;3; -0.000000, 0.000000,-2.217200;;, + 17;3; -0.000000, 0.000000,-2.244668;;, + 18;3; -0.000000, 0.000000,-2.275574;;, + 19;3; -0.000000, 0.000000,-2.309081;;, + 20;3; -0.000000, 0.000000,-2.344266;;, + 21;3; -0.000000, 0.000000,-2.379952;;, + 22;3; -0.000000, 0.000000,-2.414374;;, + 23;3; -0.000000, 0.000000,-2.444181;;, + 24;3; -0.000000, 0.000000,-2.459941;;, + 25;3; -0.000000, 0.000000,-2.459941;;, + 26;3; -0.000000, 0.000000,-2.459941;;, + 27;3; -0.000000, 0.000000,-2.459941;;, + 28;3; -0.000000, 0.000000,-2.459941;;, + 29;3; -0.000000, 0.000000,-2.459941;;, + 30;3; -0.000000, 0.000000,-2.459941;;, + 31;3; -0.000000, 0.000000,-2.459941;;, + 32;3; -0.000000, 0.000000,-2.459941;;, + 33;3; -0.000000, 0.000000,-2.459941;;, + 34;3; -0.000000, 0.000000,-2.459941;;, + 35;3; -0.000000, 0.000000,-2.459941;;, + 36;3; -0.000000, 0.000000,-2.459941;;, + 37;3; -0.000000, 0.000000,-2.459941;;, + 38;3; -0.000000, 0.000000,-2.459941;;, + 39;3; -0.000000, 0.000000,-2.459941;;, + 40;3; -0.000000, 0.000000,-2.459941;;, + 41;3; -0.000000, 0.000000,-2.459941;;, + 42;3; -0.000000, 0.000000,-2.459941;;, + 43;3; -0.000000, 0.000000,-2.459941;;, + 44;3; -0.000000, 0.000000,-2.459941;;, + 45;3; -0.000000, 0.000000,-2.459941;;, + 46;3; -0.000000, 0.000000,-2.459941;;, + 47;3; -0.000000, 0.000000,-2.459941;;, + 48;3; -0.000000, 0.000000,-2.459941;;, + 49;3; -0.000000, 0.000000,-2.459941;;, + 50;3; -0.000000, 0.000000,-2.459941;;, + 51;3; -0.000000, 0.000000,-2.459941;;, + 52;3; -0.000000, 0.000000,-2.459941;;, + 53;3; -0.000000, 0.000000,-2.459941;;, + 54;3; -0.000000, 0.000000,-2.459941;;, + 55;3; -0.000000, 0.000000,-2.459941;;, + 56;3; -0.000000, 0.000000,-2.459941;;, + 57;3; -0.000000, 0.000000,-2.459941;;, + 58;3; -0.000000, 0.000000,-2.459941;;, + 59;3; -0.000000, 0.000000,-2.459941;;, + 60;3; -0.000000, 0.000000,-2.459941;;, + 61;3; -0.000000, 0.000000,-2.459941;;, + 62;3; -0.000000, 0.000000,-2.459941;;, + 63;3; -0.000000, 0.000000,-2.459941;;, + 64;3; -0.000000, 0.000000,-2.459941;;, + 65;3; -0.000000, 0.000000,-2.459941;;, + 66;3; -0.000000, 0.000000,-2.459941;;, + 67;3; -0.000000, 0.000000,-2.459941;;, + 68;3; -0.000000, 0.000000,-2.459941;;, + 69;3; -0.000000, 0.000000,-2.459941;;, + 70;3; -0.000000, 0.000000,-2.459941;;, + 71;3; -0.000000, 0.000000,-2.459941;;, + 72;3; -0.000000, 0.000000,-2.459941;;, + 73;3; -0.000000, 0.000000,-2.459941;;, + 74;3; -0.000000, 0.000000,-2.459941;;, + 75;3; -0.000000, 0.000000,-2.459941;;; + } + AnimationKey { //Rotation + 0; + 76; + 0;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 1;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 2;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 3;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 4;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 5;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 6;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 7;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 8;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 9;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 10;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 11;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 12;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 13;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 14;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 15;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 16;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 17;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 18;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 19;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 20;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 21;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 22;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 23;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 24;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 25;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 26;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 27;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 28;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 29;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 30;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 31;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 32;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 33;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 34;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 35;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 36;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 37;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 38;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 39;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 40;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 41;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 42;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 43;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 44;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 45;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 46;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 47;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 48;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 49;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 50;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 51;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 52;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 53;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 54;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 55;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 56;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 57;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 58;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 59;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 60;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 61;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 62;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 63;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 64;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 65;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 66;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 67;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 68;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 69;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 70;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 71;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 72;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 73;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 74;4; -0.707107, 0.707107, 0.000000,-0.000000;;, + 75;4; -0.707107, 0.707107, 0.000000,-0.000000;;; + } + AnimationKey { //Scale + 1; + 76; + 0;3; 1.000000, 1.000000, 1.000000;;, + 1;3; 1.000000, 1.000000, 1.000000;;, + 2;3; 1.000000, 1.000000, 1.000000;;, + 3;3; 1.000000, 1.000000, 1.000000;;, + 4;3; 1.000000, 1.000000, 1.000000;;, + 5;3; 1.000000, 1.000000, 1.000000;;, + 6;3; 1.000000, 1.000000, 1.000000;;, + 7;3; 1.000000, 1.000000, 1.000000;;, + 8;3; 1.000000, 1.000000, 1.000000;;, + 9;3; 1.000000, 1.000000, 1.000000;;, + 10;3; 1.000000, 1.000000, 1.000000;;, + 11;3; 1.000000, 1.000000, 1.000000;;, + 12;3; 1.000000, 1.000000, 1.000000;;, + 13;3; 1.000000, 1.000000, 1.000000;;, + 14;3; 1.000000, 1.000000, 1.000000;;, + 15;3; 1.000000, 1.000000, 1.000000;;, + 16;3; 1.000000, 1.000000, 1.000000;;, + 17;3; 1.000000, 1.000000, 1.000000;;, + 18;3; 1.000000, 1.000000, 1.000000;;, + 19;3; 1.000000, 1.000000, 1.000000;;, + 20;3; 1.000000, 1.000000, 1.000000;;, + 21;3; 1.000000, 1.000000, 1.000000;;, + 22;3; 1.000000, 1.000000, 1.000000;;, + 23;3; 1.000000, 1.000000, 1.000000;;, + 24;3; 1.000000, 1.000000, 1.000000;;, + 25;3; 1.000000, 1.000000, 1.000000;;, + 26;3; 1.000000, 1.000000, 1.000000;;, + 27;3; 1.000000, 1.000000, 1.000000;;, + 28;3; 1.000000, 1.000000, 1.000000;;, + 29;3; 1.000000, 1.000000, 1.000000;;, + 30;3; 1.000000, 1.000000, 1.000000;;, + 31;3; 1.000000, 1.000000, 1.000000;;, + 32;3; 1.000000, 1.000000, 1.000000;;, + 33;3; 1.000000, 1.000000, 1.000000;;, + 34;3; 1.000000, 1.000000, 1.000000;;, + 35;3; 1.000000, 1.000000, 1.000000;;, + 36;3; 1.000000, 1.000000, 1.000000;;, + 37;3; 1.000000, 1.000000, 1.000000;;, + 38;3; 1.000000, 1.000000, 1.000000;;, + 39;3; 1.000000, 1.000000, 1.000000;;, + 40;3; 1.000000, 1.000000, 1.000000;;, + 41;3; 1.000000, 1.000000, 1.000000;;, + 42;3; 1.000000, 1.000000, 1.000000;;, + 43;3; 1.000000, 1.000000, 1.000000;;, + 44;3; 1.000000, 1.000000, 1.000000;;, + 45;3; 1.000000, 1.000000, 1.000000;;, + 46;3; 1.000000, 1.000000, 1.000000;;, + 47;3; 1.000000, 1.000000, 1.000000;;, + 48;3; 1.000000, 1.000000, 1.000000;;, + 49;3; 1.000000, 1.000000, 1.000000;;, + 50;3; 1.000000, 1.000000, 1.000000;;, + 51;3; 1.000000, 1.000000, 1.000000;;, + 52;3; 1.000000, 1.000000, 1.000000;;, + 53;3; 1.000000, 1.000000, 1.000000;;, + 54;3; 1.000000, 1.000000, 1.000000;;, + 55;3; 1.000000, 1.000000, 1.000000;;, + 56;3; 1.000000, 1.000000, 1.000000;;, + 57;3; 1.000000, 1.000000, 1.000000;;, + 58;3; 1.000000, 1.000000, 1.000000;;, + 59;3; 1.000000, 1.000000, 1.000000;;, + 60;3; 1.000000, 1.000000, 1.000000;;, + 61;3; 1.000000, 1.000000, 1.000000;;, + 62;3; 1.000000, 1.000000, 1.000000;;, + 63;3; 1.000000, 1.000000, 1.000000;;, + 64;3; 1.000000, 1.000000, 1.000000;;, + 65;3; 1.000000, 1.000000, 1.000000;;, + 66;3; 1.000000, 1.000000, 1.000000;;, + 67;3; 1.000000, 1.000000, 1.000000;;, + 68;3; 1.000000, 1.000000, 1.000000;;, + 69;3; 1.000000, 1.000000, 1.000000;;, + 70;3; 1.000000, 1.000000, 1.000000;;, + 71;3; 1.000000, 1.000000, 1.000000;;, + 72;3; 1.000000, 1.000000, 1.000000;;, + 73;3; 1.000000, 1.000000, 1.000000;;, + 74;3; 1.000000, 1.000000, 1.000000;;, + 75;3; 1.000000, 1.000000, 1.000000;;; + } + } + Animation { + {Armature_Thruster} + AnimationKey { //Position + 2; + 76; + 0;3; -4.639344, 8.859941, 0.000000;;, + 1;3; -4.639344, 8.859941, 0.000000;;, + 2;3; -4.639344, 8.859941, 0.000000;;, + 3;3; -4.639344, 8.859941, 0.000000;;, + 4;3; -4.639344, 8.859941, 0.000000;;, + 5;3; -4.639344, 8.859941, 0.000000;;, + 6;3; -4.639344, 8.859941, 0.000000;;, + 7;3; -4.639344, 8.859941, 0.000000;;, + 8;3; -4.639344, 8.859941, 0.000000;;, + 9;3; -4.639344, 8.859941, 0.000000;;, + 10;3; -4.639344, 8.859941, 0.000000;;, + 11;3; -4.639344, 8.859941, 0.000000;;, + 12;3; -4.639344, 8.859941, 0.000000;;, + 13;3; -4.639344, 8.859941, 0.000000;;, + 14;3; -4.639344, 8.859941, 0.000000;;, + 15;3; -4.639344, 8.859941, 0.000000;;, + 16;3; -4.639344, 8.859941, 0.000000;;, + 17;3; -4.639344, 8.859941, 0.000000;;, + 18;3; -4.639344, 8.859941, 0.000000;;, + 19;3; -4.639344, 8.859941, 0.000000;;, + 20;3; -4.639344, 8.859941, 0.000000;;, + 21;3; -4.639344, 8.859941, 0.000000;;, + 22;3; -4.639344, 8.859941, 0.000000;;, + 23;3; -4.639344, 8.859941, 0.000000;;, + 24;3; -4.639344, 8.859941, 0.000000;;, + 25;3; -4.639344, 8.859941, 0.000000;;, + 26;3; -4.751536, 8.859941, 0.000000;;, + 27;3; -4.926180, 8.859941, 0.000000;;, + 28;3; -5.116801, 8.859941, 0.000000;;, + 29;3; -5.313328, 8.859941, 0.000000;;, + 30;3; -5.511499, 8.859941, 0.000000;;, + 31;3; -5.708984, 8.859941, 0.000000;;, + 32;3; -5.904290, 8.859941, 0.000000;;, + 33;3; -6.096343, 8.859941, 0.000000;;, + 34;3; -6.284297, 8.859941, 0.000000;;, + 35;3; -6.467437, 8.859941, 0.000000;;, + 36;3; -6.645113, 8.859941, 0.000000;;, + 37;3; -6.816706, 8.859941, 0.000000;;, + 38;3; -6.981606, 8.859941, 0.000000;;, + 39;3; -7.139187, 8.859941, 0.000000;;, + 40;3; -7.288791, 8.859941, 0.000000;;, + 41;3; -7.429712, 8.859941, 0.000000;;, + 42;3; -7.561180, 8.859941, 0.000000;;, + 43;3; -7.682340, 8.859941, 0.000000;;, + 44;3; -7.792232, 8.859941, 0.000000;;, + 45;3; -7.889764, 8.859941, 0.000000;;, + 46;3; -7.973680, 8.859941, 0.000000;;, + 47;3; -8.042510, 8.859941, 0.000000;;, + 48;3; -8.094524, 8.859941, 0.000000;;, + 49;3; -8.127645, 8.859941, 0.000000;;, + 50;3; -8.139342, 8.859941, 0.000000;;, + 51;3; -8.127024, 8.859941, 0.000000;;, + 52;3; -8.089846, 8.859941, 0.000000;;, + 53;3; -8.027658, 8.859941, 0.000000;;, + 54;3; -7.940606, 8.859941, 0.000000;;, + 55;3; -7.829194, 8.859941, 0.000000;;, + 56;3; -7.694356, 8.859941, 0.000000;;, + 57;3; -7.537523, 8.859941, 0.000000;;, + 58;3; -7.360665, 8.859941, 0.000000;;, + 59;3; -7.166321, 8.859941, 0.000000;;, + 60;3; -6.957588, 8.859941, 0.000000;;, + 61;3; -6.738070, 8.859941, 0.000000;;, + 62;3; -6.511783, 8.859941, 0.000000;;, + 63;3; -6.283020, 8.859941, 0.000000;;, + 64;3; -6.056183, 8.859941, 0.000000;;, + 65;3; -5.835609, 8.859941, 0.000000;;, + 66;3; -5.625397, 8.859941, 0.000000;;, + 67;3; -5.429261, 8.859941, 0.000000;;, + 68;3; -5.250427, 8.859941, 0.000000;;, + 69;3; -5.091565, 8.859941, 0.000000;;, + 70;3; -4.954775, 8.859941, 0.000000;;, + 71;3; -4.841600, 8.859941, 0.000000;;, + 72;3; -4.753072, 8.859941, 0.000000;;, + 73;3; -4.689772, 8.859941, 0.000000;;, + 74;3; -4.651900, 8.859941, 0.000000;;, + 75;3; -4.639344, 8.859941, 0.000000;;; + } + AnimationKey { //Rotation + 0; + 76; + 0;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 1;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 2;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 3;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 4;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 5;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 6;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 7;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 8;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 9;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 10;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 11;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 12;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 13;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 14;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 15;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 16;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 17;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 18;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 19;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 20;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 21;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 22;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 23;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 24;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 25;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 26;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 27;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 28;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 29;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 30;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 31;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 32;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 33;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 34;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 35;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 36;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 37;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 38;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 39;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 40;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 41;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 42;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 43;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 44;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 45;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 46;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 47;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 48;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 49;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 50;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 51;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 52;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 53;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 54;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 55;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 56;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 57;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 58;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 59;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 60;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 61;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 62;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 63;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 64;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 65;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 66;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 67;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 68;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 69;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 70;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 71;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 72;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 73;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 74;4; -0.500000,-0.500000, 0.500000, 0.500000;;, + 75;4; -0.500000,-0.500000, 0.500000, 0.500000;;; + } + AnimationKey { //Scale + 1; + 76; + 0;3; 1.000000, 1.000000, 1.000000;;, + 1;3; 1.000000, 1.000000, 1.000000;;, + 2;3; 1.000000, 1.000000, 1.000000;;, + 3;3; 1.000000, 1.000000, 1.000000;;, + 4;3; 1.000000, 1.000000, 1.000000;;, + 5;3; 1.000000, 1.000000, 1.000000;;, + 6;3; 1.000000, 1.000000, 1.000000;;, + 7;3; 1.000000, 1.000000, 1.000000;;, + 8;3; 1.000000, 1.000000, 1.000000;;, + 9;3; 1.000000, 1.000000, 1.000000;;, + 10;3; 1.000000, 1.000000, 1.000000;;, + 11;3; 1.000000, 1.000000, 1.000000;;, + 12;3; 1.000000, 1.000000, 1.000000;;, + 13;3; 1.000000, 1.000000, 1.000000;;, + 14;3; 1.000000, 1.000000, 1.000000;;, + 15;3; 1.000000, 1.000000, 1.000000;;, + 16;3; 1.000000, 1.000000, 1.000000;;, + 17;3; 1.000000, 1.000000, 1.000000;;, + 18;3; 1.000000, 1.000000, 1.000000;;, + 19;3; 1.000000, 1.000000, 1.000000;;, + 20;3; 1.000000, 1.000000, 1.000000;;, + 21;3; 1.000000, 1.000000, 1.000000;;, + 22;3; 1.000000, 1.000000, 1.000000;;, + 23;3; 1.000000, 1.000000, 1.000000;;, + 24;3; 1.000000, 1.000000, 1.000000;;, + 25;3; 1.000000, 1.000000, 1.000000;;, + 26;3; 1.000000, 1.000000, 1.000000;;, + 27;3; 1.000000, 1.000000, 1.000000;;, + 28;3; 1.000000, 1.000000, 1.000000;;, + 29;3; 1.000000, 1.000000, 1.000000;;, + 30;3; 1.000000, 1.000000, 1.000000;;, + 31;3; 1.000000, 1.000000, 1.000000;;, + 32;3; 1.000000, 1.000000, 1.000000;;, + 33;3; 1.000000, 1.000000, 1.000000;;, + 34;3; 1.000000, 1.000000, 1.000000;;, + 35;3; 1.000000, 1.000000, 1.000000;;, + 36;3; 1.000000, 1.000000, 1.000000;;, + 37;3; 1.000000, 1.000000, 1.000000;;, + 38;3; 1.000000, 1.000000, 1.000000;;, + 39;3; 1.000000, 1.000000, 1.000000;;, + 40;3; 1.000000, 1.000000, 1.000000;;, + 41;3; 1.000000, 1.000000, 1.000000;;, + 42;3; 1.000000, 1.000000, 1.000000;;, + 43;3; 1.000000, 1.000000, 1.000000;;, + 44;3; 1.000000, 1.000000, 1.000000;;, + 45;3; 1.000000, 1.000000, 1.000000;;, + 46;3; 1.000000, 1.000000, 1.000000;;, + 47;3; 1.000000, 1.000000, 1.000000;;, + 48;3; 1.000000, 1.000000, 1.000000;;, + 49;3; 1.000000, 1.000000, 1.000000;;, + 50;3; 1.000000, 1.000000, 1.000000;;, + 51;3; 1.000000, 1.000000, 1.000000;;, + 52;3; 1.000000, 1.000000, 1.000000;;, + 53;3; 1.000000, 1.000000, 1.000000;;, + 54;3; 1.000000, 1.000000, 1.000000;;, + 55;3; 1.000000, 1.000000, 1.000000;;, + 56;3; 1.000000, 1.000000, 1.000000;;, + 57;3; 1.000000, 1.000000, 1.000000;;, + 58;3; 1.000000, 1.000000, 1.000000;;, + 59;3; 1.000000, 1.000000, 1.000000;;, + 60;3; 1.000000, 1.000000, 1.000000;;, + 61;3; 1.000000, 1.000000, 1.000000;;, + 62;3; 1.000000, 1.000000, 1.000000;;, + 63;3; 1.000000, 1.000000, 1.000000;;, + 64;3; 1.000000, 1.000000, 1.000000;;, + 65;3; 1.000000, 1.000000, 1.000000;;, + 66;3; 1.000000, 1.000000, 1.000000;;, + 67;3; 1.000000, 1.000000, 1.000000;;, + 68;3; 1.000000, 1.000000, 1.000000;;, + 69;3; 1.000000, 1.000000, 1.000000;;, + 70;3; 1.000000, 1.000000, 1.000000;;, + 71;3; 1.000000, 1.000000, 1.000000;;, + 72;3; 1.000000, 1.000000, 1.000000;;, + 73;3; 1.000000, 1.000000, 1.000000;;, + 74;3; 1.000000, 1.000000, 1.000000;;, + 75;3; 1.000000, 1.000000, 1.000000;;; + } + } + Animation { + {Hovercraft} + AnimationKey { //Position + 2; + 76; + 0;3; 0.000000, 0.000000,-0.500000;;, + 1;3; 0.000000, 0.000000,-0.500000;;, + 2;3; 0.000000, 0.000000,-0.500000;;, + 3;3; 0.000000, 0.000000,-0.500000;;, + 4;3; 0.000000, 0.000000,-0.500000;;, + 5;3; 0.000000, 0.000000,-0.500000;;, + 6;3; 0.000000, 0.000000,-0.500000;;, + 7;3; 0.000000, 0.000000,-0.500000;;, + 8;3; 0.000000, 0.000000,-0.500000;;, + 9;3; 0.000000, 0.000000,-0.500000;;, + 10;3; 0.000000, 0.000000,-0.500000;;, + 11;3; 0.000000, 0.000000,-0.500000;;, + 12;3; 0.000000, 0.000000,-0.500000;;, + 13;3; 0.000000, 0.000000,-0.500000;;, + 14;3; 0.000000, 0.000000,-0.500000;;, + 15;3; 0.000000, 0.000000,-0.500000;;, + 16;3; 0.000000, 0.000000,-0.500000;;, + 17;3; 0.000000, 0.000000,-0.500000;;, + 18;3; 0.000000, 0.000000,-0.500000;;, + 19;3; 0.000000, 0.000000,-0.500000;;, + 20;3; 0.000000, 0.000000,-0.500000;;, + 21;3; 0.000000, 0.000000,-0.500000;;, + 22;3; 0.000000, 0.000000,-0.500000;;, + 23;3; 0.000000, 0.000000,-0.500000;;, + 24;3; 0.000000, 0.000000,-0.500000;;, + 25;3; 0.000000, 0.000000,-0.500000;;, + 26;3; 0.000000, 0.000000,-0.500000;;, + 27;3; 0.000000, 0.000000,-0.500000;;, + 28;3; 0.000000, 0.000000,-0.500000;;, + 29;3; 0.000000, 0.000000,-0.500000;;, + 30;3; 0.000000, 0.000000,-0.500000;;, + 31;3; 0.000000, 0.000000,-0.500000;;, + 32;3; 0.000000, 0.000000,-0.500000;;, + 33;3; 0.000000, 0.000000,-0.500000;;, + 34;3; 0.000000, 0.000000,-0.500000;;, + 35;3; 0.000000, 0.000000,-0.500000;;, + 36;3; 0.000000, 0.000000,-0.500000;;, + 37;3; 0.000000, 0.000000,-0.500000;;, + 38;3; 0.000000, 0.000000,-0.500000;;, + 39;3; 0.000000, 0.000000,-0.500000;;, + 40;3; 0.000000, 0.000000,-0.500000;;, + 41;3; 0.000000, 0.000000,-0.500000;;, + 42;3; 0.000000, 0.000000,-0.500000;;, + 43;3; 0.000000, 0.000000,-0.500000;;, + 44;3; 0.000000, 0.000000,-0.500000;;, + 45;3; 0.000000, 0.000000,-0.500000;;, + 46;3; 0.000000, 0.000000,-0.500000;;, + 47;3; 0.000000, 0.000000,-0.500000;;, + 48;3; 0.000000, 0.000000,-0.500000;;, + 49;3; 0.000000, 0.000000,-0.500000;;, + 50;3; 0.000000, 0.000000,-0.500000;;, + 51;3; 0.000000, 0.000000,-0.500000;;, + 52;3; 0.000000, 0.000000,-0.500000;;, + 53;3; 0.000000, 0.000000,-0.500000;;, + 54;3; 0.000000, 0.000000,-0.500000;;, + 55;3; 0.000000, 0.000000,-0.500000;;, + 56;3; 0.000000, 0.000000,-0.500000;;, + 57;3; 0.000000, 0.000000,-0.500000;;, + 58;3; 0.000000, 0.000000,-0.500000;;, + 59;3; 0.000000, 0.000000,-0.500000;;, + 60;3; 0.000000, 0.000000,-0.500000;;, + 61;3; 0.000000, 0.000000,-0.500000;;, + 62;3; 0.000000, 0.000000,-0.500000;;, + 63;3; 0.000000, 0.000000,-0.500000;;, + 64;3; 0.000000, 0.000000,-0.500000;;, + 65;3; 0.000000, 0.000000,-0.500000;;, + 66;3; 0.000000, 0.000000,-0.500000;;, + 67;3; 0.000000, 0.000000,-0.500000;;, + 68;3; 0.000000, 0.000000,-0.500000;;, + 69;3; 0.000000, 0.000000,-0.500000;;, + 70;3; 0.000000, 0.000000,-0.500000;;, + 71;3; 0.000000, 0.000000,-0.500000;;, + 72;3; 0.000000, 0.000000,-0.500000;;, + 73;3; 0.000000, 0.000000,-0.500000;;, + 74;3; 0.000000, 0.000000,-0.500000;;, + 75;3; 0.000000, 0.000000,-0.500000;;; + } + AnimationKey { //Rotation + 0; + 76; + 0;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 1;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 2;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 3;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 4;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 5;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 6;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 7;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 8;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 9;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 10;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 11;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 12;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 13;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 14;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 15;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 16;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 17;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 18;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 19;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 20;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 21;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 22;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 23;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 24;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 25;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 26;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 27;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 28;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 29;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 30;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 31;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 32;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 33;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 34;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 35;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 36;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 37;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 38;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 39;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 40;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 41;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 42;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 43;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 44;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 45;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 46;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 47;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 48;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 49;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 50;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 51;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 52;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 53;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 54;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 55;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 56;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 57;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 58;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 59;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 60;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 61;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 62;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 63;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 64;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 65;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 66;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 67;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 68;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 69;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 70;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 71;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 72;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 73;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 74;4; -0.707107, 0.000000, 0.000000,-0.707107;;, + 75;4; -0.707107, 0.000000, 0.000000,-0.707107;;; + } + AnimationKey { //Scale + 1; + 76; + 0;3; 4.000000, 4.000000, 2.581575;;, + 1;3; 4.000000, 4.000000, 2.581575;;, + 2;3; 4.000000, 4.000000, 2.581575;;, + 3;3; 4.000000, 4.000000, 2.581575;;, + 4;3; 4.000000, 4.000000, 2.581575;;, + 5;3; 4.000000, 4.000000, 2.581575;;, + 6;3; 4.000000, 4.000000, 2.581575;;, + 7;3; 4.000000, 4.000000, 2.581575;;, + 8;3; 4.000000, 4.000000, 2.581575;;, + 9;3; 4.000000, 4.000000, 2.581575;;, + 10;3; 4.000000, 4.000000, 2.581575;;, + 11;3; 4.000000, 4.000000, 2.581575;;, + 12;3; 4.000000, 4.000000, 2.581575;;, + 13;3; 4.000000, 4.000000, 2.581575;;, + 14;3; 4.000000, 4.000000, 2.581575;;, + 15;3; 4.000000, 4.000000, 2.581575;;, + 16;3; 4.000000, 4.000000, 2.581575;;, + 17;3; 4.000000, 4.000000, 2.581575;;, + 18;3; 4.000000, 4.000000, 2.581575;;, + 19;3; 4.000000, 4.000000, 2.581575;;, + 20;3; 4.000000, 4.000000, 2.581575;;, + 21;3; 4.000000, 4.000000, 2.581575;;, + 22;3; 4.000000, 4.000000, 2.581575;;, + 23;3; 4.000000, 4.000000, 2.581575;;, + 24;3; 4.000000, 4.000000, 2.581575;;, + 25;3; 4.000000, 4.000000, 2.581575;;, + 26;3; 4.000000, 4.000000, 2.581575;;, + 27;3; 4.000000, 4.000000, 2.581575;;, + 28;3; 4.000000, 4.000000, 2.581575;;, + 29;3; 4.000000, 4.000000, 2.581575;;, + 30;3; 4.000000, 4.000000, 2.581575;;, + 31;3; 4.000000, 4.000000, 2.581575;;, + 32;3; 4.000000, 4.000000, 2.581575;;, + 33;3; 4.000000, 4.000000, 2.581575;;, + 34;3; 4.000000, 4.000000, 2.581575;;, + 35;3; 4.000000, 4.000000, 2.581575;;, + 36;3; 4.000000, 4.000000, 2.581575;;, + 37;3; 4.000000, 4.000000, 2.581575;;, + 38;3; 4.000000, 4.000000, 2.581575;;, + 39;3; 4.000000, 4.000000, 2.581575;;, + 40;3; 4.000000, 4.000000, 2.581575;;, + 41;3; 4.000000, 4.000000, 2.581575;;, + 42;3; 4.000000, 4.000000, 2.581575;;, + 43;3; 4.000000, 4.000000, 2.581575;;, + 44;3; 4.000000, 4.000000, 2.581575;;, + 45;3; 4.000000, 4.000000, 2.581575;;, + 46;3; 4.000000, 4.000000, 2.581575;;, + 47;3; 4.000000, 4.000000, 2.581575;;, + 48;3; 4.000000, 4.000000, 2.581575;;, + 49;3; 4.000000, 4.000000, 2.581575;;, + 50;3; 4.000000, 4.000000, 2.581575;;, + 51;3; 4.000000, 4.000000, 2.581575;;, + 52;3; 4.000000, 4.000000, 2.581575;;, + 53;3; 4.000000, 4.000000, 2.581575;;, + 54;3; 4.000000, 4.000000, 2.581575;;, + 55;3; 4.000000, 4.000000, 2.581575;;, + 56;3; 4.000000, 4.000000, 2.581575;;, + 57;3; 4.000000, 4.000000, 2.581575;;, + 58;3; 4.000000, 4.000000, 2.581575;;, + 59;3; 4.000000, 4.000000, 2.581575;;, + 60;3; 4.000000, 4.000000, 2.581575;;, + 61;3; 4.000000, 4.000000, 2.581575;;, + 62;3; 4.000000, 4.000000, 2.581575;;, + 63;3; 4.000000, 4.000000, 2.581575;;, + 64;3; 4.000000, 4.000000, 2.581575;;, + 65;3; 4.000000, 4.000000, 2.581575;;, + 66;3; 4.000000, 4.000000, 2.581575;;, + 67;3; 4.000000, 4.000000, 2.581575;;, + 68;3; 4.000000, 4.000000, 2.581575;;, + 69;3; 4.000000, 4.000000, 2.581575;;, + 70;3; 4.000000, 4.000000, 2.581575;;, + 71;3; 4.000000, 4.000000, 2.581575;;, + 72;3; 4.000000, 4.000000, 2.581575;;, + 73;3; 4.000000, 4.000000, 2.581575;;, + 74;3; 4.000000, 4.000000, 2.581575;;, + 75;3; 4.000000, 4.000000, 2.581575;;; + } + } +} //End of AnimationSet diff --git a/mods/Cars/hovercraft/sounds/hovercraft_bounce.ogg b/mods/Cars/hovercraft/sounds/hovercraft_bounce.ogg new file mode 100644 index 0000000..ec63515 Binary files /dev/null and b/mods/Cars/hovercraft/sounds/hovercraft_bounce.ogg differ diff --git a/mods/Cars/hovercraft/sounds/hovercraft_jump.ogg b/mods/Cars/hovercraft/sounds/hovercraft_jump.ogg new file mode 100644 index 0000000..851c42a Binary files /dev/null and b/mods/Cars/hovercraft/sounds/hovercraft_jump.ogg differ diff --git a/mods/Cars/hovercraft/sounds/hovercraft_thrust_fade.ogg b/mods/Cars/hovercraft/sounds/hovercraft_thrust_fade.ogg new file mode 100644 index 0000000..f60dd23 Binary files /dev/null and b/mods/Cars/hovercraft/sounds/hovercraft_thrust_fade.ogg differ diff --git a/mods/Cars/hovercraft/sounds/hovercraft_thrust_loop.ogg b/mods/Cars/hovercraft/sounds/hovercraft_thrust_loop.ogg new file mode 100644 index 0000000..f99ad99 Binary files /dev/null and b/mods/Cars/hovercraft/sounds/hovercraft_thrust_loop.ogg differ diff --git a/mods/Cars/hovercraft/textures/hovercraft.png b/mods/Cars/hovercraft/textures/hovercraft.png new file mode 100644 index 0000000..d35bd8b Binary files /dev/null and b/mods/Cars/hovercraft/textures/hovercraft.png differ diff --git a/mods/Cars/hovercraft/textures/hovercraft_inv.png b/mods/Cars/hovercraft/textures/hovercraft_inv.png new file mode 100644 index 0000000..a2e03c7 Binary files /dev/null and b/mods/Cars/hovercraft/textures/hovercraft_inv.png differ diff --git a/mods/Cars/modpack.txt b/mods/Cars/modpack.txt new file mode 100644 index 0000000..e69de29 diff --git a/mods/Cars/spaceship/README.txt b/mods/Cars/spaceship/README.txt new file mode 100644 index 0000000..e1c225d --- /dev/null +++ b/mods/Cars/spaceship/README.txt @@ -0,0 +1,43 @@ + +Spaceship'Mod by Mrchiantos + +spaceship'Model by Viktor Hahn (Viktor.Hahn@web.de) +airboat 0.1.8 by paramat + +For Minetest 0.4.16 and later. Compatible with MT 5.0.0-dev. +Depends: default + +Licenses +-------- +Source code: MIT +Spaceship Model : CC By 3.0 +Media (textures and nodebox design): CC0 1.0 + +Note about textures and crafting +-------------------------------- +This mod is fully functional but does not currently have a crafting recipe or +detailed textures. The textures are templates for you to add detail to. +The airboat is available in the creative inventory or by using the /giveme chat +command. + +Usage +----- +Third-person camera mode is recommended when travelling for a better view. +The airboat can be placed on any node, including liquids. It can land on, and +will float in, a liquid. + +Controls +-------- +Right mouse button = Enter or exit airboat when pointing at airboat. +Forward = Speed up. + Slow down when moving backwards. +Forward + backward = Enable cruise mode: Airboat will accelerate to maximum + forward speed and remain at that speed without needing to + hold the forward key. +Backward = Slow down. + Speed up when moving backwards. + Disable cruise mode. +Left = Turn left. +Right = Turn right. +Jump/up = Ascend. +Sneak/down = Descend. diff --git a/mods/Cars/spaceship/depends.txt b/mods/Cars/spaceship/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/Cars/spaceship/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/Cars/spaceship/init.lua b/mods/Cars/spaceship/init.lua new file mode 100644 index 0000000..5064331 --- /dev/null +++ b/mods/Cars/spaceship/init.lua @@ -0,0 +1,294 @@ +local source_list = { + {"black", "Darkened", "292421"}, + {"blue", "Blue", "0000FF"}, + {"green", "Green", "00FF00"}, + {"white", "White", "F5F5F5"}, + {"orange", "Orange", "FF6103"}, + {"red", "Red", "FF0000"}, + {"yellow", "Yellow", "FFFF00"}, + {"pink", "pink", "FF69B4"} +} + +for i in ipairs(source_list) do + local color = source_list[i][1] + local description = source_list[i][2] + local colour = source_list[i][3] + +-- Functions + +local function get_sign(i) + if i == 0 then + return 0 + else + return i / math.abs(i) + end +end + + +local function get_velocity(v, yaw, y) + local x = -math.sin(yaw) * v + local z = math.cos(yaw) * v + return {x = x, y = y, z = z} +end + + +local function get_v(v) + return math.sqrt(v.x ^ 2 + v.z ^ 2) +end + + +-- Spaceship entity + +local spaceship = { + initial_properties = { + physical = true, + collide_with_objects = false, -- Workaround fix for a MT engine bug + collisionbox = {-2, -1.5, -2.25, 2, 1.5, 3.5}, + visual = "wielditem", + visual_size = {x = 0.25, y = 0.25}, -- Scale up of nodebox is these * 1.5 + textures = {"spaceship:spaceship_nodebox" ..color}, + }, + + -- Custom fields + driver = nil, + removed = false, + v = 0, + vy = 0, + rot = 0, + auto = false, +} + + +function spaceship.on_rightclick(self, clicker) + if not clicker or not clicker:is_player() then + return + end + local name = clicker:get_player_name() + if self.driver and name == self.driver then + -- Detach + self.driver = nil + self.auto = false + clicker:set_detach() + default.player_attached[name] = false + default.player_set_animation(clicker, "stand" , 30) + local pos = clicker:getpos() + minetest.after(0.1, function() + clicker:setpos(pos) + end) + elseif not self.driver then + -- Attach + local attach = clicker:get_attach() + if attach and attach:get_luaentity() then + local luaentity = attach:get_luaentity() + if luaentity.driver then + luaentity.driver = nil + end + clicker:set_detach() + end + self.driver = name + clicker:set_attach(self.object, "", + {x = 0, y = -2, z = 0}, {x = 0, y = 0, z = 0}) + default.player_attached[name] = true + minetest.after(0.2, function() + default.player_set_animation(clicker, "sit" , 30) + end) + clicker:set_look_horizontal(self.object:getyaw()) + end +end + + +function spaceship.on_activate(self, staticdata, dtime_s) + self.object:set_armor_groups({immortal = 1}) +end + + +function spaceship.on_punch(self, puncher) + if not puncher or not puncher:is_player() or self.removed then + return + end + + local name = puncher:get_player_name() + if self.driver and name == self.driver then + -- Detach + self.driver = nil + puncher:set_detach() + default.player_attached[name] = false + end + if not self.driver then + -- Move to inventory + self.removed = true + local inv = puncher:get_inventory() + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(name)) + or not inv:contains_item("main", "spaceship:spaceship" ..color) then + local leftover = inv:add_item("main", "spaceship:spaceship" ..color) + if not leftover:is_empty() then + minetest.add_item(self.object:getpos(), leftover) + end + end + minetest.after(0.1, function() + self.object:remove() + end) + end +end + + +function spaceship.on_step(self, dtime) + self.v = get_v(self.object:getvelocity()) * get_sign(self.v) + self.vy = self.object:getvelocity().y + + -- Controls + if self.driver then + local driver_objref = minetest.get_player_by_name(self.driver) + if driver_objref then + local ctrl = driver_objref:get_player_control() + if ctrl.up and ctrl.down then + if not self.auto then + self.auto = true + minetest.chat_send_player(self.driver, + "[spaceship] Cruise on") + end + elseif ctrl.down then + self.v = self.v - 0.1 + if self.auto then + self.auto = false + minetest.chat_send_player(self.driver, + "[spaceship] Cruise off") + end + elseif ctrl.up or self.auto then + self.v = self.v + 0.1 + end + if ctrl.left then + self.rot = self.rot + 0.001 + elseif ctrl.right then + self.rot = self.rot - 0.001 + end + if ctrl.jump then + self.vy = self.vy + 0.075 + elseif ctrl.sneak then + self.vy = self.vy - 0.075 + end + else + -- Player left server while driving + -- In MT 5.0.0 use 'spaceship:on_detach_child()' to do this + self.driver = nil + self.auto = false + minetest.log("warning", "[spaceship] Driver left server while" .. + " driving. This may cause some 'Pushing ObjectRef to" .. + " removed/deactivated object' warnings.") + end + end + + -- Early return for stationary vehicle + if self.v == 0 and self.rot == 0 and self.vy == 0 then + self.object:setpos(self.object:getpos()) + return + end + + -- Reduction and limiting of linear speed + local s = get_sign(self.v) + self.v = self.v - 0.02 * s + if s ~= get_sign(self.v) then + self.v = 0 + end + if math.abs(self.v) > 6 then + self.v = 6 * get_sign(self.v) + end + + -- Reduction and limiting of rotation + local sr = get_sign(self.rot) + self.rot = self.rot - 0.0003 * sr + if sr ~= get_sign(self.rot) then + self.rot = 0 + end + if math.abs(self.rot) > 0.015 then + self.rot = 0.015 * get_sign(self.rot) + end + + -- Reduction and limiting of vertical speed + local sy = get_sign(self.vy) + self.vy = self.vy - 0.03 * sy + if sy ~= get_sign(self.vy) then + self.vy = 0 + end + if math.abs(self.vy) > 4 then + self.vy = 4 * get_sign(self.vy) + end + + local new_acce = {x = 0, y = 0, z = 0} + -- Bouyancy in liquids + local p = self.object:getpos() + p.y = p.y - 1.5 + local def = minetest.registered_nodes[minetest.get_node(p).name] + if def and (def.liquidtype == "source" or def.liquidtype == "flowing") then + new_acce = {x = 0, y = 10, z = 0} + end + + self.object:setpos(self.object:getpos()) + self.object:setvelocity(get_velocity(self.v, self.object:getyaw(), self.vy)) + self.object:setacceleration(new_acce) + self.object:setyaw(self.object:getyaw() + (1 + dtime) * self.rot) +end + + +minetest.register_entity("spaceship:spaceship" ..color , spaceship) + + +-- Craftitem + +minetest.register_craftitem("spaceship:spaceship" .. color, { + description = "spaceship" .. color, + inventory_image = "spaceship_spaceship_inv.png^[colorize:#"..colour..":70", +wield_image = "none.png", + wield_scale = {x = 4, y = 4, z = 4}, + liquids_pointable = true, + + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + + -- Run any on_rightclick function of pointed node instead + if udef and udef.on_rightclick and + not (placer and placer:is_player() and + placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + if pointed_thing.type ~= "node" then + return itemstack + end + + pointed_thing.under.y = pointed_thing.under.y + 2 + local spaceship = minetest.add_entity(pointed_thing.under, + "spaceship:spaceship" ..color) + if spaceship then + if placer then + spaceship:setyaw(placer:get_look_horizontal()) + end + local player_name = placer and placer:get_player_name() or "" + if not (creative and creative.is_enabled_for and + creative.is_enabled_for(player_name)) then + itemstack:take_item() + end + end + return itemstack + end, +}) + + +-- Nodebox for entity wielditem visual + +minetest.register_node("spaceship:spaceship_nodebox" .. color, { + description = "Spaceship Nodebox" .. color, + tiles = { -- Top, base, right, left, front, back + "color_white.png^[colorize:#"..colour..":70", + }, + paramtype = "light", + drawtype = "mesh", + mesh = "spaceship.obj", + groups = {not_in_creative_inventory = 1}, +}) + +end diff --git a/mods/Cars/spaceship/license.txt b/mods/Cars/spaceship/license.txt new file mode 100644 index 0000000..b8d5123 --- /dev/null +++ b/mods/Cars/spaceship/license.txt @@ -0,0 +1,65 @@ +License of model spaceship +-------------------------- + +This work, made by Viktor Hahn (Viktor.Hahn@web.de), is +licensed under the Creative Commons Attribution 3.0 Unported License. +http://creativecommons.org/licenses/by/3.0/ + + +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2018 paramat + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +License of media (textures) +--------------------------- + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +Paramat + +No Copyright + +The person who associated a work with this deed has dedicated the work to the +public domain by waiving all of his or her rights to the work worldwide under +copyright law, including all related and neighboring rights, to the extent +allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial +purposes, all without asking permission. See Other Information below. + +Other Information: + +In no way are the patent or trademark rights of any person affected by CC0, nor +are the rights that other persons may have in the work or in how the work is +used, such as publicity or privacy rights. + +Unless expressly stated otherwise, the person who associated a work with this +deed makes no warranties about the work, and disclaims liability for all uses +of the work, to the fullest extent permitted by applicable law. + +When using or citing the work, you should not imply endorsement by the author +or the affirmer. + +For more details: +https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/mods/Cars/spaceship/mod.conf b/mods/Cars/spaceship/mod.conf new file mode 100644 index 0000000..91e9fc5 --- /dev/null +++ b/mods/Cars/spaceship/mod.conf @@ -0,0 +1 @@ +name = spaceship \ No newline at end of file diff --git a/mods/Cars/spaceship/textures/color_white.png b/mods/Cars/spaceship/textures/color_white.png new file mode 100644 index 0000000..a6c6ff8 Binary files /dev/null and b/mods/Cars/spaceship/textures/color_white.png differ diff --git a/mods/Cars/spaceship/textures/none.png b/mods/Cars/spaceship/textures/none.png new file mode 100644 index 0000000..07f7b0e Binary files /dev/null and b/mods/Cars/spaceship/textures/none.png differ diff --git a/mods/Cars/spaceship/textures/spaceship_spaceship_inv.png b/mods/Cars/spaceship/textures/spaceship_spaceship_inv.png new file mode 100644 index 0000000..7588a5d Binary files /dev/null and b/mods/Cars/spaceship/textures/spaceship_spaceship_inv.png differ diff --git a/mods/Cars/surfboard/README.md b/mods/Cars/surfboard/README.md new file mode 100644 index 0000000..089a5a5 --- /dev/null +++ b/mods/Cars/surfboard/README.md @@ -0,0 +1,2 @@ +# minetest-surfboard +Surfboard mod for Minetest. https://minetest.net/ diff --git a/mods/Cars/surfboard/README.txt b/mods/Cars/surfboard/README.txt new file mode 100644 index 0000000..fc21782 --- /dev/null +++ b/mods/Cars/surfboard/README.txt @@ -0,0 +1,15 @@ +Surfboards, forked from boats by archfan +======================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by PilzAdam (MIT) +Various Minetest developers and contributors (MIT) + +Authors of media (textures and model) +------------------------------------- +Textures: Zeg9 (CC BY-SA 3.0) +Model: thetoon and Zeg9 (CC BY-SA 3.0), + modified by PavelS(SokolovPavel) (CC BY-SA 3.0), + modified by sofar (CC BY-SA 3.0) diff --git a/mods/Cars/surfboard/depends.txt b/mods/Cars/surfboard/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/Cars/surfboard/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/Cars/surfboard/init.lua b/mods/Cars/surfboard/init.lua new file mode 100644 index 0000000..4b1cd0e --- /dev/null +++ b/mods/Cars/surfboard/init.lua @@ -0,0 +1,264 @@ +local source_list = { + {"black", "Darkened", "292421", 40, 36, 33}, + {"blue", "Blue", "0000FF", 0, 0, 255}, + {"green", "Green", "00FF00", 0, 255, 0}, + {"white", "White", "F5F5F5", 245, 245, 245}, + {"orange", "Orange", "FF6103", 255, 97, 3}, + {"red", "Red", "FF0000", 255, 0, 0}, + {"yellow", "Yellow", "FFFF00", 255, 255, 0}, + {"pink", "pink", "FF69B4", 255, 105, 180} +} + +for i in ipairs(source_list) do + local color = source_list[i][1] + local description = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + + +-- +-- Helper functions +-- + +local function is_water(pos) + local nn = minetest.get_node(pos).name + return minetest.get_item_group(nn, "water") ~= 0 +end + + +local function get_sign(i) + if i == 0 then + return 0 + else + return i / math.abs(i) + end +end + + +local function get_velocity(v, yaw, y) + local x = -math.sin(yaw) * v + local z = math.cos(yaw) * v + return {x = x, y = y, z = z} +end + + +local function get_v(v) + return math.sqrt(v.x ^ 2 + v.z ^ 2) +end + +-- +-- Boat entity +-- + +local surfboard = { + physical = true, + -- Warning: Do not change the position of the collisionbox top surface, + -- lowering it causes the surfboard to fall through the world if underwater + collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5}, + visual = "mesh", + mesh = "surfboard.x", + textures = {"color_white.png^[colorize:#"..colour..":70"}, + driver = nil, + v = 0, + last_v = 0, + removed = false +} + + +function surfboard.on_rightclick(self, clicker) + if not clicker or not clicker:is_player() then + return + end + local name = clicker:get_player_name() + if self.driver and clicker == self.driver then + self.driver = nil + clicker:set_detach() + default.player_attached[name] = false + default.player_set_animation(clicker, "stand" , 30) + local pos = clicker:getpos() + pos = {x = pos.x, y = pos.y + 0.2, z = pos.z} + minetest.after(0.1, function() + clicker:setpos(pos) + end) + elseif not self.driver then + local attach = clicker:get_attach() + if attach and attach:get_luaentity() then + local luaentity = attach:get_luaentity() + if luaentity.driver then + luaentity.driver = nil + end + clicker:set_detach() + end + self.driver = clicker + clicker:set_attach(self.object, "", + {x = 0, y = 10, z = 0}, {x = 0, y = 0, z = 0}) + default.player_attached[name] = true + minetest.after(0.2, function() + default.player_set_animation(clicker, "stand" , 0) + end) + clicker:set_look_horizontal(self.object:getyaw()) + end +end + + +function surfboard.on_activate(self, staticdata, dtime_s) + self.object:set_armor_groups({immortal = 1}) + if staticdata then + self.v = tonumber(staticdata) + end + self.last_v = self.v +end + + +function surfboard.get_staticdata(self) + return tostring(self.v) +end + + +function surfboard.on_punch(self, puncher) + if not puncher or not puncher:is_player() or self.removed then + return + end + if self.driver and puncher == self.driver then + self.driver = nil + puncher:set_detach() + default.player_attached[puncher:get_player_name()] = false + end + if not self.driver then + self.removed = true + local inv = puncher:get_inventory() + -- delay remove to ensure player is detached + minetest.after(0.1, function() + self.object:remove() + end) + end +end + +function surfboard.on_step(self, dtime) + self.v = get_v(self.object:getvelocity()) * get_sign(self.v) + if self.driver then + local ctrl = self.driver:get_player_control() + local yaw = self.object:getyaw() + if ctrl.up then + self.v = self.v + 0.1 + elseif ctrl.down then + self.v = self.v - 0.1 + end + if ctrl.left then + if self.v < 0 then + self.object:setyaw(yaw - (1 + dtime) * 0.03) + else + self.object:setyaw(yaw + (1 + dtime) * 0.03) + end + elseif ctrl.right then + if self.v < 0 then + self.object:setyaw(yaw + (1 + dtime) * 0.03) + else + self.object:setyaw(yaw - (1 + dtime) * 0.03) + end + end + end + local velo = self.object:getvelocity() + if self.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then + self.object:setpos(self.object:getpos()) + return + end + local s = get_sign(self.v) + self.v = self.v - 0.02 * s + if s ~= get_sign(self.v) then + self.object:setvelocity({x = 0, y = 0, z = 0}) + self.v = 0 + return + end + if math.abs(self.v) > 5 then + self.v = 5 * get_sign(self.v) + end + + local p = self.object:getpos() + p.y = p.y - 0.5 + local new_velo + local new_acce = {x = 0, y = 0, z = 0} + if not is_water(p) then + local nodedef = minetest.registered_nodes[minetest.get_node(p).name] + if (not nodedef) or nodedef.walkable then + self.v = 0 + new_acce = {x = 0, y = 1, z = 0} + else + new_acce = {x = 0, y = -9.8, z = 0} + end + new_velo = get_velocity(self.v, self.object:getyaw(), + self.object:getvelocity().y) + self.object:setpos(self.object:getpos()) + else + p.y = p.y + 1 + if is_water(p) then + local y = self.object:getvelocity().y + if y >= 5 then + y = 5 + elseif y < 0 then + new_acce = {x = 0, y = 20, z = 0} + else + new_acce = {x = 0, y = 5, z = 0} + end + new_velo = get_velocity(self.v, self.object:getyaw(), y) + self.object:setpos(self.object:getpos()) + else + new_acce = {x = 0, y = 0, z = 0} + if math.abs(self.object:getvelocity().y) < 1 then + local pos = self.object:getpos() + pos.y = math.floor(pos.y) + 0.5 + self.object:setpos(pos) + new_velo = get_velocity(self.v, self.object:getyaw(), 0) + else + new_velo = get_velocity(self.v, self.object:getyaw(), + self.object:getvelocity().y) + self.object:setpos(self.object:getpos()) + end + end + end + self.object:setvelocity(new_velo) + self.object:setacceleration(new_acce) +end + +minetest.register_entity("surfboard:board" .. color, surfboard) + +minetest.register_craftitem("surfboard:board" .. color, { + description = "Surfboard" .. color, + inventory_image = "surfboard.png^[colorize:#"..colour..":70", + wield_image = "none.png^[colorize:#"..colour..":70", + wield_scale = {x = 2, y = 2, z = 1}, + liquids_pointable = true, + groups = {flammable = 2}, + + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + if pointed_thing.type ~= "node" then + return itemstack + end + if not is_water(pointed_thing.under) then + return itemstack + end + pointed_thing.under.y = pointed_thing.under.y + 0.5 + boat = minetest.add_entity(pointed_thing.under, "surfboard:board" .. color) + if boat then + boat:setyaw(placer:get_look_horizontal()) + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then + itemstack:take_item() + end + end + return itemstack + end, +}) + +end diff --git a/mods/Cars/surfboard/license.txt b/mods/Cars/surfboard/license.txt new file mode 100644 index 0000000..d4afe75 --- /dev/null +++ b/mods/Cars/surfboard/license.txt @@ -0,0 +1,63 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures and model) +-------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2012-2016 Zeg9 +Copyright (C) 2012-2016 thetoon +Copyright (C) 2012-2016 PavelS(SokolovPavel) +Copyright (C) 2016 sofar (sofar@foo-projects.org) + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/Cars/surfboard/models/surfboard.x b/mods/Cars/surfboard/models/surfboard.x new file mode 100644 index 0000000..775423e --- /dev/null +++ b/mods/Cars/surfboard/models/surfboard.x @@ -0,0 +1,2392 @@ +xof 0303txt 0032 + +Frame Root { + FrameTransformMatrix { + 1.000000, 0.000000, 0.000000, 0.000000, + 0.000000,-0.000000, 1.000000, 0.000000, + 0.000000, 1.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 1.000000;; + } + Frame Cube { + FrameTransformMatrix { + -0.000000,10.394503, 0.000000, 0.000000, + -3.929046,-0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.392905, 0.000000, + 0.000000, 0.000000, 0.000000, 1.000000;; + } + Mesh { // Cube mesh + 784; + -0.996151;-0.299703;-1.000000;, + -0.996151;-0.499505;-1.000000;, + -1.149405;-0.168470;-1.000000;, + -1.149405;-0.101082;-1.000000;, + -0.996151;-0.299703; 1.000000;, + -1.149405;-0.101082; 1.000000;, + -1.149405;-0.168470; 1.000000;, + -0.996151;-0.499505; 1.000000;, + 1.149405;-0.101082;-1.000000;, + 1.149404;-0.101082; 1.000000;, + 1.149404;-0.168470; 1.000000;, + 1.149405;-0.168470;-1.000000;, + -0.996151;-0.499505;-1.000000;, + -0.996151;-0.499505; 1.000000;, + -1.149405;-0.168470; 1.000000;, + -1.149405;-0.168470;-1.000000;, + -1.149404; 0.101082;-1.000000;, + -1.149405; 0.101082; 1.000000;, + -1.149405; 0.168470; 1.000000;, + -1.149404; 0.168470;-1.000000;, + -0.996151; 0.499505; 1.000000;, + -0.996150; 0.499505;-1.000000;, + -1.149404; 0.168470;-1.000000;, + -1.149405; 0.168470; 1.000000;, + 1.149405; 0.168470; 1.000000;, + 1.149405; 0.168470;-1.000000;, + 0.996151; 0.499505;-1.000000;, + 0.996151; 0.499505; 1.000000;, + 0.996151; 0.499505; 1.000000;, + 0.996151; 0.499505;-1.000000;, + 0.842897; 0.693839;-1.000000;, + 0.842897; 0.693839; 1.000000;, + 0.842897; 0.693839; 1.000000;, + 0.842897; 0.693839;-1.000000;, + 0.689643; 0.804442;-1.000000;, + 0.689643; 0.804442; 1.000000;, + 0.689643; 0.804442; 1.000000;, + 0.689643; 0.804442;-1.000000;, + 0.536389; 0.910389;-1.000000;, + 0.536389; 0.910388; 1.000000;, + 0.536389; 0.910388; 1.000000;, + 0.536389; 0.910389;-1.000000;, + 0.383135; 0.983469;-1.000000;, + 0.383135; 0.983469; 1.000000;, + 0.383135; 0.983469; 1.000000;, + 0.383135; 0.983469;-1.000000;, + 0.229881; 1.000000;-1.000000;, + 0.229881; 1.000000; 1.000000;, + 0.229881; 1.000000; 1.000000;, + 0.229881; 1.000000;-1.000000;, + 0.076627; 1.010235;-1.000000;, + 0.076627; 1.010234; 1.000000;, + 0.076627; 1.010234; 1.000000;, + 0.076627; 1.010235;-1.000000;, + -0.076627; 1.010235;-1.000000;, + -0.076627; 1.010234; 1.000000;, + -0.076627; 1.010234; 1.000000;, + -0.076627; 1.010235;-1.000000;, + -0.229881; 1.000000;-1.000000;, + -0.229881; 1.000000; 1.000000;, + -0.229881; 1.000000; 1.000000;, + -0.229881; 1.000000;-1.000000;, + -0.383135; 0.983469;-1.000000;, + -0.383135; 0.983469; 1.000000;, + -0.383135; 0.983469; 1.000000;, + -0.383135; 0.983469;-1.000000;, + -0.536389; 0.910389;-1.000000;, + -0.536389; 0.910389; 1.000000;, + -0.536389; 0.910389; 1.000000;, + -0.536389; 0.910389;-1.000000;, + -0.689643; 0.804442;-1.000000;, + -0.689643; 0.804442; 1.000000;, + -0.689643; 0.804442; 1.000000;, + -0.689643; 0.804442;-1.000000;, + -0.842897; 0.693839;-1.000000;, + -0.842897; 0.693839; 1.000000;, + -0.842897; 0.693839; 1.000000;, + -0.842897; 0.693839;-1.000000;, + -0.996150; 0.499505;-1.000000;, + -0.996151; 0.499505; 1.000000;, + 1.149405;-0.168470;-1.000000;, + 1.149404;-0.168470; 1.000000;, + 0.996150;-0.499506; 1.000000;, + 0.996151;-0.499505;-1.000000;, + 0.996151;-0.499505;-1.000000;, + 0.996150;-0.499506; 1.000000;, + 0.842896;-0.693839; 1.000000;, + 0.842897;-0.693839;-1.000000;, + 0.842897;-0.693839;-1.000000;, + 0.842896;-0.693839; 1.000000;, + 0.689642;-0.804442; 1.000000;, + 0.689643;-0.804442;-1.000000;, + 0.689643;-0.804442;-1.000000;, + 0.689642;-0.804442; 1.000000;, + 0.536388;-0.910389; 1.000000;, + 0.536389;-0.910389;-1.000000;, + 0.536389;-0.910389;-1.000000;, + 0.536388;-0.910389; 1.000000;, + 0.383134;-0.983469; 1.000000;, + 0.383135;-0.983469;-1.000000;, + 0.383135;-0.983469;-1.000000;, + 0.383134;-0.983469; 1.000000;, + 0.229880;-1.000000; 1.000000;, + 0.229881;-1.000000;-1.000000;, + 0.229881;-1.000000;-1.000000;, + 0.229880;-1.000000; 1.000000;, + 0.076626;-1.010235; 1.000000;, + 0.076627;-1.010235;-1.000000;, + 0.076627;-1.010235;-1.000000;, + 0.076626;-1.010235; 1.000000;, + -0.076628;-1.010235; 1.000000;, + -0.076627;-1.010235;-1.000000;, + -0.076627;-1.010235;-1.000000;, + -0.076628;-1.010235; 1.000000;, + -0.229882;-1.000000; 1.000000;, + -0.229881;-1.000000;-1.000000;, + -0.229881;-1.000000;-1.000000;, + -0.229882;-1.000000; 1.000000;, + -0.383136;-0.983469; 1.000000;, + -0.383135;-0.983469;-1.000000;, + -0.383135;-0.983469;-1.000000;, + -0.383136;-0.983469; 1.000000;, + -0.536390;-0.910388; 1.000000;, + -0.536389;-0.910389;-1.000000;, + -0.536389;-0.910389;-1.000000;, + -0.536390;-0.910388; 1.000000;, + -0.689644;-0.804441; 1.000000;, + -0.689643;-0.804442;-1.000000;, + -0.689643;-0.804442;-1.000000;, + -0.689644;-0.804441; 1.000000;, + -0.842897;-0.693838; 1.000000;, + -0.842897;-0.693839;-1.000000;, + -0.842897;-0.693839;-1.000000;, + -0.842897;-0.693838; 1.000000;, + -0.996151;-0.499505; 1.000000;, + -0.996151;-0.499505;-1.000000;, + 1.149404;-0.101082; 1.000000;, + 0.996150;-0.299704; 1.000000;, + 0.996150;-0.499506; 1.000000;, + 1.149404;-0.168470; 1.000000;, + 0.996150;-0.299704; 1.000000;, + 0.842896;-0.416304; 1.000000;, + 0.842896;-0.693839; 1.000000;, + 0.996150;-0.499506; 1.000000;, + 0.842896;-0.416304; 1.000000;, + 0.689642;-0.482665; 1.000000;, + 0.689642;-0.804442; 1.000000;, + 0.842896;-0.693839; 1.000000;, + 0.689642;-0.482665; 1.000000;, + 0.536388;-0.546233; 1.000000;, + 0.536388;-0.910389; 1.000000;, + 0.689642;-0.804442; 1.000000;, + 0.536388;-0.546233; 1.000000;, + 0.383134;-0.590082; 1.000000;, + 0.383134;-0.983469; 1.000000;, + 0.536388;-0.910389; 1.000000;, + 0.383134;-0.590082; 1.000000;, + 0.229881;-0.600000; 1.000000;, + 0.229880;-1.000000; 1.000000;, + 0.383134;-0.983469; 1.000000;, + 0.229881;-0.600000; 1.000000;, + 0.076627;-0.606141; 1.000000;, + 0.076626;-1.010235; 1.000000;, + 0.229880;-1.000000; 1.000000;, + 0.076627;-0.606141; 1.000000;, + -0.076627;-0.606141; 1.000000;, + -0.076628;-1.010235; 1.000000;, + 0.076626;-1.010235; 1.000000;, + -0.076627;-0.606141; 1.000000;, + -0.229881;-0.600000; 1.000000;, + -0.229882;-1.000000; 1.000000;, + -0.076628;-1.010235; 1.000000;, + -0.229881;-0.600000; 1.000000;, + -0.383135;-0.590081; 1.000000;, + -0.383136;-0.983469; 1.000000;, + -0.229882;-1.000000; 1.000000;, + -0.383135;-0.590081; 1.000000;, + -0.536389;-0.546233; 1.000000;, + -0.536390;-0.910388; 1.000000;, + -0.383136;-0.983469; 1.000000;, + -0.536389;-0.546233; 1.000000;, + -0.689643;-0.482665; 1.000000;, + -0.689644;-0.804441; 1.000000;, + -0.536390;-0.910388; 1.000000;, + -0.689643;-0.482665; 1.000000;, + -0.842897;-0.416303; 1.000000;, + -0.842897;-0.693838; 1.000000;, + -0.689644;-0.804441; 1.000000;, + -0.842897;-0.416303; 1.000000;, + -0.996151;-0.299703; 1.000000;, + -0.996151;-0.499505; 1.000000;, + -0.842897;-0.693838; 1.000000;, + 1.149405;-0.101082;-1.000000;, + 1.149405;-0.168470;-1.000000;, + 0.996151;-0.499505;-1.000000;, + 0.996151;-0.299703;-1.000000;, + 0.996151;-0.299703;-1.000000;, + 0.996151;-0.499505;-1.000000;, + 0.842897;-0.693839;-1.000000;, + 0.842897;-0.416303;-1.000000;, + 0.842897;-0.416303;-1.000000;, + 0.842897;-0.693839;-1.000000;, + 0.689643;-0.804442;-1.000000;, + 0.689643;-0.482665;-1.000000;, + 0.689643;-0.482665;-1.000000;, + 0.689643;-0.804442;-1.000000;, + 0.536389;-0.910389;-1.000000;, + 0.536389;-0.546233;-1.000000;, + 0.536389;-0.546233;-1.000000;, + 0.536389;-0.910389;-1.000000;, + 0.383135;-0.983469;-1.000000;, + 0.383135;-0.590081;-1.000000;, + 0.383135;-0.590081;-1.000000;, + 0.383135;-0.983469;-1.000000;, + 0.229881;-1.000000;-1.000000;, + 0.229881;-0.600000;-1.000000;, + 0.229881;-0.600000;-1.000000;, + 0.229881;-1.000000;-1.000000;, + 0.076627;-1.010235;-1.000000;, + 0.076627;-0.606141;-1.000000;, + 0.076627;-0.606141;-1.000000;, + 0.076627;-1.010235;-1.000000;, + -0.076627;-1.010235;-1.000000;, + -0.076627;-0.606141;-1.000000;, + -0.076627;-0.606141;-1.000000;, + -0.076627;-1.010235;-1.000000;, + -0.229881;-1.000000;-1.000000;, + -0.229881;-0.600000;-1.000000;, + -0.229881;-0.600000;-1.000000;, + -0.229881;-1.000000;-1.000000;, + -0.383135;-0.983469;-1.000000;, + -0.383135;-0.590081;-1.000000;, + -0.383135;-0.590081;-1.000000;, + -0.383135;-0.983469;-1.000000;, + -0.536389;-0.910389;-1.000000;, + -0.536389;-0.546233;-1.000000;, + -0.536389;-0.546233;-1.000000;, + -0.536389;-0.910389;-1.000000;, + -0.689643;-0.804442;-1.000000;, + -0.689643;-0.482665;-1.000000;, + -0.689643;-0.482665;-1.000000;, + -0.689643;-0.804442;-1.000000;, + -0.842897;-0.693839;-1.000000;, + -0.842897;-0.416303;-1.000000;, + -0.842897;-0.416303;-1.000000;, + -0.842897;-0.693839;-1.000000;, + -0.996151;-0.499505;-1.000000;, + -0.996151;-0.299703;-1.000000;, + -0.842897; 0.693839;-1.000000;, + -0.842897; 0.416303;-1.000000;, + -0.996151; 0.299703;-1.000000;, + -0.996150; 0.499505;-1.000000;, + -0.842897; 0.416303;-1.000000;, + -0.842897; 0.138768;-1.000000;, + -0.996151; 0.099901;-1.000000;, + -0.996151; 0.299703;-1.000000;, + -0.842897; 0.138768;-1.000000;, + -0.842897;-0.138768;-1.000000;, + -0.842897;-0.138768;-3.687105;, + -0.842897; 0.138768;-3.687105;, + -0.842897;-0.138768;-1.000000;, + -0.842897;-0.416303;-1.000000;, + -0.996151;-0.299703;-1.000000;, + -0.996151;-0.099901;-1.000000;, + -0.689643; 0.804442;-1.000000;, + -0.689643; 0.482665;-1.000000;, + -0.842897; 0.416303;-1.000000;, + -0.842897; 0.693839;-1.000000;, + -0.689643; 0.482665;-1.000000;, + -0.689643; 0.160888;-1.000000;, + -0.842897; 0.138768;-1.000000;, + -0.842897; 0.416303;-1.000000;, + -0.689643; 0.160888;-1.000000;, + -0.689643;-0.160888;-1.000000;, + -0.842897;-0.138768;-1.000000;, + -0.842897; 0.138768;-1.000000;, + -0.689643;-0.160888;-1.000000;, + -0.689643;-0.482665;-1.000000;, + -0.842897;-0.416303;-1.000000;, + -0.842897;-0.138768;-1.000000;, + -0.536389; 0.910389;-1.000000;, + -0.536389; 0.546233;-1.000000;, + -0.689643; 0.482665;-1.000000;, + -0.689643; 0.804442;-1.000000;, + -0.536389; 0.546233;-1.000000;, + -0.536389; 0.182078;-1.000000;, + -0.689643; 0.160888;-1.000000;, + -0.689643; 0.482665;-1.000000;, + -0.536389; 0.182078;-1.000000;, + -0.536389;-0.182078;-1.000000;, + -0.689643;-0.160888;-1.000000;, + -0.689643; 0.160888;-1.000000;, + -0.536389;-0.182078;-1.000000;, + -0.536389;-0.546233;-1.000000;, + -0.689643;-0.482665;-1.000000;, + -0.689643;-0.160888;-1.000000;, + -0.383135; 0.983469;-1.000000;, + -0.383135; 0.590081;-1.000000;, + -0.536389; 0.546233;-1.000000;, + -0.536389; 0.910389;-1.000000;, + -0.383135; 0.590081;-1.000000;, + -0.383135; 0.196694;-1.000000;, + -0.536389; 0.182078;-1.000000;, + -0.536389; 0.546233;-1.000000;, + -0.383135; 0.196694;-1.000000;, + -0.383135;-0.196694;-1.000000;, + -0.536389;-0.182078;-1.000000;, + -0.536389; 0.182078;-1.000000;, + -0.383135;-0.196694;-1.000000;, + -0.383135;-0.590081;-1.000000;, + -0.536389;-0.546233;-1.000000;, + -0.536389;-0.182078;-1.000000;, + -0.229881; 1.000000;-1.000000;, + -0.229881; 0.600000;-1.000000;, + -0.383135; 0.590081;-1.000000;, + -0.383135; 0.983469;-1.000000;, + -0.229881; 0.600000;-1.000000;, + -0.229881; 0.200000;-1.000000;, + -0.383135; 0.196694;-1.000000;, + -0.383135; 0.590081;-1.000000;, + -0.229881; 0.200000;-1.000000;, + -0.229881;-0.200000;-1.000000;, + -0.383135;-0.196694;-1.000000;, + -0.383135; 0.196694;-1.000000;, + -0.229881;-0.200000;-1.000000;, + -0.229881;-0.600000;-1.000000;, + -0.383135;-0.590081;-1.000000;, + -0.383135;-0.196694;-1.000000;, + -0.076627; 1.010235;-1.000000;, + -0.076627; 0.606141;-1.000000;, + -0.229881; 0.600000;-1.000000;, + -0.229881; 1.000000;-1.000000;, + -0.076627; 0.606141;-1.000000;, + -0.076627; 0.202047;-1.000000;, + -0.229881; 0.200000;-1.000000;, + -0.229881; 0.600000;-1.000000;, + -0.076627; 0.202047;-1.000000;, + -0.076627;-0.202047;-1.000000;, + -0.229881;-0.200000;-1.000000;, + -0.229881; 0.200000;-1.000000;, + -0.076627;-0.202047;-1.000000;, + -0.076627;-0.606141;-1.000000;, + -0.229881;-0.600000;-1.000000;, + -0.229881;-0.200000;-1.000000;, + 0.076627; 1.010235;-1.000000;, + 0.076627; 0.606141;-1.000000;, + -0.076627; 0.606141;-1.000000;, + -0.076627; 1.010235;-1.000000;, + 0.076627; 0.606141;-1.000000;, + 0.076627; 0.202047;-1.000000;, + -0.076627; 0.202047;-1.000000;, + -0.076627; 0.606141;-1.000000;, + 0.076627; 0.202047;-1.000000;, + 0.076627;-0.202047;-1.000000;, + -0.076627;-0.202047;-1.000000;, + -0.076627; 0.202047;-1.000000;, + 0.076627;-0.202047;-1.000000;, + 0.076627;-0.606141;-1.000000;, + -0.076627;-0.606141;-1.000000;, + -0.076627;-0.202047;-1.000000;, + 0.229881; 1.000000;-1.000000;, + 0.229881; 0.600000;-1.000000;, + 0.076627; 0.606141;-1.000000;, + 0.076627; 1.010235;-1.000000;, + 0.229881; 0.600000;-1.000000;, + 0.229881; 0.200000;-1.000000;, + 0.076627; 0.202047;-1.000000;, + 0.076627; 0.606141;-1.000000;, + 0.229881; 0.200000;-1.000000;, + 0.229881;-0.200000;-1.000000;, + 0.076627;-0.202047;-1.000000;, + 0.076627; 0.202047;-1.000000;, + 0.229881;-0.200000;-1.000000;, + 0.229881;-0.600000;-1.000000;, + 0.076627;-0.606141;-1.000000;, + 0.076627;-0.202047;-1.000000;, + 0.383135; 0.983469;-1.000000;, + 0.383135; 0.590081;-1.000000;, + 0.229881; 0.600000;-1.000000;, + 0.229881; 1.000000;-1.000000;, + 0.383135; 0.590081;-1.000000;, + 0.383135; 0.196694;-1.000000;, + 0.229881; 0.200000;-1.000000;, + 0.229881; 0.600000;-1.000000;, + 0.383135; 0.196694;-1.000000;, + 0.383135;-0.196694;-1.000000;, + 0.229881;-0.200000;-1.000000;, + 0.229881; 0.200000;-1.000000;, + 0.383135;-0.196694;-1.000000;, + 0.383135;-0.590081;-1.000000;, + 0.229881;-0.600000;-1.000000;, + 0.229881;-0.200000;-1.000000;, + 0.536389; 0.910389;-1.000000;, + 0.536389; 0.546233;-1.000000;, + 0.383135; 0.590081;-1.000000;, + 0.383135; 0.983469;-1.000000;, + 0.536389; 0.546233;-1.000000;, + 0.536389; 0.182078;-1.000000;, + 0.383135; 0.196694;-1.000000;, + 0.383135; 0.590081;-1.000000;, + 0.536389; 0.182078;-1.000000;, + 0.536389;-0.182078;-1.000000;, + 0.383135;-0.196694;-1.000000;, + 0.383135; 0.196694;-1.000000;, + 0.536389;-0.182078;-1.000000;, + 0.536389;-0.546233;-1.000000;, + 0.383135;-0.590081;-1.000000;, + 0.383135;-0.196694;-1.000000;, + 0.689643; 0.804442;-1.000000;, + 0.689643; 0.482665;-1.000000;, + 0.536389; 0.546233;-1.000000;, + 0.536389; 0.910389;-1.000000;, + 0.689643; 0.482665;-1.000000;, + 0.689643; 0.160888;-1.000000;, + 0.536389; 0.182078;-1.000000;, + 0.536389; 0.546233;-1.000000;, + 0.689643; 0.160888;-1.000000;, + 0.689643;-0.160888;-1.000000;, + 0.536389;-0.182078;-1.000000;, + 0.536389; 0.182078;-1.000000;, + 0.689643;-0.160888;-1.000000;, + 0.689643;-0.482665;-1.000000;, + 0.536389;-0.546233;-1.000000;, + 0.536389;-0.182078;-1.000000;, + 0.842897; 0.693839;-1.000000;, + 0.842897; 0.416303;-1.000000;, + 0.689643; 0.482665;-1.000000;, + 0.689643; 0.804442;-1.000000;, + 0.842897; 0.416303;-1.000000;, + 0.842897; 0.138768;-1.000000;, + 0.689643; 0.160888;-1.000000;, + 0.689643; 0.482665;-1.000000;, + 0.842897; 0.138768;-1.000000;, + 0.842897;-0.138768;-1.000000;, + 0.689643;-0.160888;-1.000000;, + 0.689643; 0.160888;-1.000000;, + 0.842897;-0.138768;-1.000000;, + 0.842897;-0.416303;-1.000000;, + 0.689643;-0.482665;-1.000000;, + 0.689643;-0.160888;-1.000000;, + 0.996151; 0.499505;-1.000000;, + 0.996151; 0.299703;-1.000000;, + 0.842897; 0.416303;-1.000000;, + 0.842897; 0.693839;-1.000000;, + 0.996151; 0.299703;-1.000000;, + 0.996151; 0.099901;-1.000000;, + 0.842897; 0.138768;-1.000000;, + 0.842897; 0.416303;-1.000000;, + 0.996151; 0.099901;-1.000000;, + 0.996151;-0.099901;-1.000000;, + 0.842897;-0.138768;-1.000000;, + 0.842897; 0.138768;-1.000000;, + 0.996151;-0.099901;-1.000000;, + 0.996151;-0.299703;-1.000000;, + 0.842897;-0.416303;-1.000000;, + 0.842897;-0.138768;-1.000000;, + 1.149405; 0.168470;-1.000000;, + 1.149405; 0.101082;-1.000000;, + 0.996151; 0.299703;-1.000000;, + 0.996151; 0.499505;-1.000000;, + 1.149405; 0.101082;-1.000000;, + 1.149405; 0.033694;-1.000000;, + 0.996151; 0.099901;-1.000000;, + 0.996151; 0.299703;-1.000000;, + 1.149405; 0.033694;-1.000000;, + 1.149405;-0.033694;-1.000000;, + 0.996151;-0.099901;-1.000000;, + 0.996151; 0.099901;-1.000000;, + 1.149405;-0.033694;-1.000000;, + 1.149405;-0.101082;-1.000000;, + 0.996151;-0.299703;-1.000000;, + 0.996151;-0.099901;-1.000000;, + -0.842897; 0.693839; 1.000000;, + -0.996151; 0.499505; 1.000000;, + -0.996151; 0.299703; 1.000000;, + -0.842897; 0.416303; 1.000000;, + -0.842897; 0.416303; 1.000000;, + -0.996151; 0.299703; 1.000000;, + -0.996151; 0.099901; 1.000000;, + -0.842897; 0.138768; 1.000000;, + -0.842897; 0.138768; 1.000000;, + -0.996151; 0.099901; 1.000000;, + -0.996151;-0.099901; 1.000000;, + -0.842897;-0.138768; 1.000000;, + -0.842897;-0.138768; 1.000000;, + -0.996151;-0.099901; 1.000000;, + -0.996151;-0.299703; 1.000000;, + -0.842897;-0.416303; 1.000000;, + -0.689643; 0.804442; 1.000000;, + -0.842897; 0.693839; 1.000000;, + -0.842897; 0.416303; 1.000000;, + -0.689643; 0.482665; 1.000000;, + -0.689643; 0.482665; 1.000000;, + -0.842897; 0.416303; 1.000000;, + -0.842897; 0.138768; 1.000000;, + -0.689643; 0.160888; 1.000000;, + -0.689643; 0.160888; 1.000000;, + -0.842897; 0.138768; 1.000000;, + -0.842897;-0.138768; 1.000000;, + -0.689643;-0.160888; 1.000000;, + -0.689643;-0.160888; 1.000000;, + -0.842897;-0.138768; 1.000000;, + -0.842897;-0.416303; 1.000000;, + -0.689643;-0.482665; 1.000000;, + -0.536389; 0.910389; 1.000000;, + -0.689643; 0.804442; 1.000000;, + -0.689643; 0.482665; 1.000000;, + -0.536389; 0.546233; 1.000000;, + -0.536389; 0.546233; 1.000000;, + -0.689643; 0.482665; 1.000000;, + -0.689643; 0.160888; 1.000000;, + -0.536389; 0.182078; 1.000000;, + -0.536389; 0.182078; 1.000000;, + -0.689643; 0.160888; 1.000000;, + -0.689643;-0.160888; 1.000000;, + -0.536389;-0.182078; 1.000000;, + -0.536389;-0.182078; 1.000000;, + -0.689643;-0.160888; 1.000000;, + -0.689643;-0.482665; 1.000000;, + -0.536389;-0.546233; 1.000000;, + -0.383135; 0.983469; 1.000000;, + -0.536389; 0.910389; 1.000000;, + -0.536389; 0.546233; 1.000000;, + -0.383135; 0.590081; 1.000000;, + -0.383135; 0.590081; 1.000000;, + -0.536389; 0.546233; 1.000000;, + -0.536389; 0.182078; 1.000000;, + -0.383135; 0.196694; 1.000000;, + -0.383135; 0.196694; 1.000000;, + -0.536389; 0.182078; 1.000000;, + -0.536389;-0.182078; 1.000000;, + -0.383135;-0.196694; 1.000000;, + -0.383135;-0.196694; 1.000000;, + -0.536389;-0.182078; 1.000000;, + -0.536389;-0.546233; 1.000000;, + -0.383135;-0.590081; 1.000000;, + -0.229881; 1.000000; 1.000000;, + -0.383135; 0.983469; 1.000000;, + -0.383135; 0.590081; 1.000000;, + -0.229881; 0.600000; 1.000000;, + -0.229881; 0.600000; 1.000000;, + -0.383135; 0.590081; 1.000000;, + -0.383135; 0.196694; 1.000000;, + -0.229881; 0.200000; 1.000000;, + -0.229881; 0.200000; 1.000000;, + -0.383135; 0.196694; 1.000000;, + -0.383135;-0.196694; 1.000000;, + -0.229881;-0.200000; 1.000000;, + -0.229881;-0.200000; 1.000000;, + -0.383135;-0.196694; 1.000000;, + -0.383135;-0.590081; 1.000000;, + -0.229881;-0.600000; 1.000000;, + -0.076627; 1.010234; 1.000000;, + -0.229881; 1.000000; 1.000000;, + -0.229881; 0.600000; 1.000000;, + -0.076627; 0.606141; 1.000000;, + -0.076627; 0.606141; 1.000000;, + -0.229881; 0.600000; 1.000000;, + -0.229881; 0.200000; 1.000000;, + -0.076627; 0.202047; 1.000000;, + -0.076627; 0.202047; 1.000000;, + -0.229881; 0.200000; 1.000000;, + -0.229881;-0.200000; 1.000000;, + -0.076627;-0.202047; 1.000000;, + -0.076627;-0.202047; 1.000000;, + -0.229881;-0.200000; 1.000000;, + -0.229881;-0.600000; 1.000000;, + -0.076627;-0.606141; 1.000000;, + 0.076627; 1.010234; 1.000000;, + -0.076627; 1.010234; 1.000000;, + -0.076627; 0.606141; 1.000000;, + 0.076627; 0.606141; 1.000000;, + 0.076627; 0.606141; 1.000000;, + -0.076627; 0.606141; 1.000000;, + -0.076627; 0.202047; 1.000000;, + 0.076627; 0.202047; 1.000000;, + 0.076627; 0.202047; 1.000000;, + -0.076627; 0.202047; 1.000000;, + -0.076627;-0.202047; 1.000000;, + 0.076627;-0.202047; 1.000000;, + 0.076627;-0.202047; 1.000000;, + -0.076627;-0.202047; 1.000000;, + -0.076627;-0.606141; 1.000000;, + 0.076627;-0.606141; 1.000000;, + 0.229881; 1.000000; 1.000000;, + 0.076627; 1.010234; 1.000000;, + 0.076627; 0.606141; 1.000000;, + 0.229881; 0.600000; 1.000000;, + 0.229881; 0.600000; 1.000000;, + 0.076627; 0.606141; 1.000000;, + 0.076627; 0.202047; 1.000000;, + 0.229881; 0.200000; 1.000000;, + 0.229881; 0.200000; 1.000000;, + 0.076627; 0.202047; 1.000000;, + 0.076627;-0.202047; 1.000000;, + 0.229881;-0.200000; 1.000000;, + 0.229881;-0.200000; 1.000000;, + 0.076627;-0.202047; 1.000000;, + 0.076627;-0.606141; 1.000000;, + 0.229881;-0.600000; 1.000000;, + 0.383135; 0.983469; 1.000000;, + 0.229881; 1.000000; 1.000000;, + 0.229881; 0.600000; 1.000000;, + 0.383135; 0.590081; 1.000000;, + 0.383135; 0.590081; 1.000000;, + 0.229881; 0.600000; 1.000000;, + 0.229881; 0.200000; 1.000000;, + 0.383135; 0.196694; 1.000000;, + 0.383135; 0.196694; 1.000000;, + 0.229881; 0.200000; 1.000000;, + 0.229881;-0.200000; 1.000000;, + 0.383135;-0.196694; 1.000000;, + 0.383135;-0.196694; 1.000000;, + 0.229881;-0.200000; 1.000000;, + 0.229881;-0.600000; 1.000000;, + 0.383134;-0.590082; 1.000000;, + 0.536389; 0.910388; 1.000000;, + 0.383135; 0.983469; 1.000000;, + 0.383135; 0.590081; 1.000000;, + 0.536389; 0.546233; 1.000000;, + 0.536389; 0.546233; 1.000000;, + 0.383135; 0.590081; 1.000000;, + 0.383135; 0.196694; 1.000000;, + 0.536389; 0.182078; 1.000000;, + 0.536389; 0.182078; 1.000000;, + 0.383135; 0.196694; 1.000000;, + 0.383135;-0.196694; 1.000000;, + 0.536389;-0.182078; 1.000000;, + 0.536389;-0.182078; 1.000000;, + 0.383135;-0.196694; 1.000000;, + 0.383134;-0.590082; 1.000000;, + 0.536388;-0.546233; 1.000000;, + 0.689643; 0.804442; 1.000000;, + 0.536389; 0.910388; 1.000000;, + 0.536389; 0.546233; 1.000000;, + 0.689643; 0.482665; 1.000000;, + 0.689643; 0.482665; 1.000000;, + 0.536389; 0.546233; 1.000000;, + 0.536389; 0.182078; 1.000000;, + 0.689643; 0.160888; 1.000000;, + 0.689643; 0.160888; 1.000000;, + 0.536389; 0.182078; 1.000000;, + 0.536389;-0.182078; 1.000000;, + 0.689643;-0.160889; 1.000000;, + 0.689643;-0.160889; 1.000000;, + 0.536389;-0.182078; 1.000000;, + 0.536388;-0.546233; 1.000000;, + 0.689642;-0.482665; 1.000000;, + 0.842897; 0.693839; 1.000000;, + 0.689643; 0.804442; 1.000000;, + 0.689643; 0.482665; 1.000000;, + 0.842897; 0.416303; 1.000000;, + 0.842897; 0.416303; 1.000000;, + 0.689643; 0.482665; 1.000000;, + 0.689643; 0.160888; 1.000000;, + 0.842897; 0.138767; 1.000000;, + 0.842897; 0.138767; 1.000000;, + 0.689643; 0.160888; 1.000000;, + 0.689643;-0.160889; 1.000000;, + 0.842897;-0.138768; 1.000000;, + 0.842897;-0.138768; 1.000000;, + 0.689643;-0.160889; 1.000000;, + 0.689642;-0.482665; 1.000000;, + 0.842896;-0.416304; 1.000000;, + 0.996151; 0.499505; 1.000000;, + 0.842897; 0.693839; 1.000000;, + 0.842897; 0.416303; 1.000000;, + 0.996151; 0.299703; 1.000000;, + 0.996151; 0.299703; 1.000000;, + 0.842897; 0.416303; 1.000000;, + 0.842897; 0.138767; 1.000000;, + 0.996151; 0.099901; 1.000000;, + 0.996151; 0.099901; 1.000000;, + 0.842897; 0.138767; 1.000000;, + 0.842897;-0.138768; 1.000000;, + 0.996151;-0.099901; 1.000000;, + 0.996151;-0.099901; 1.000000;, + 0.842897;-0.138768; 1.000000;, + 0.842896;-0.416304; 1.000000;, + 0.996150;-0.299704; 1.000000;, + 1.149405; 0.168470; 1.000000;, + 0.996151; 0.499505; 1.000000;, + 0.996151; 0.299703; 1.000000;, + 1.149405; 0.101082; 1.000000;, + 1.149405; 0.101082; 1.000000;, + 0.996151; 0.299703; 1.000000;, + 0.996151; 0.099901; 1.000000;, + 1.149405; 0.033694; 1.000000;, + 1.149405; 0.033694; 1.000000;, + 0.996151; 0.099901; 1.000000;, + 0.996151;-0.099901; 1.000000;, + 1.149404;-0.033694; 1.000000;, + 1.149404;-0.033694; 1.000000;, + 0.996151;-0.099901; 1.000000;, + 0.996150;-0.299704; 1.000000;, + 1.149404;-0.101082; 1.000000;, + -1.149405;-0.168470;-1.000000;, + -1.149405;-0.168470; 1.000000;, + -1.149405;-0.101082; 1.000000;, + -1.149405;-0.101082;-1.000000;, + -1.149405;-0.101082;-1.000000;, + -1.149405;-0.101082; 1.000000;, + -1.149405;-0.033694; 1.000000;, + -1.149405;-0.033694;-1.000000;, + -1.149405;-0.033694;-1.000000;, + -1.149405;-0.033694; 1.000000;, + -1.149405; 0.033694; 1.000000;, + -1.149404; 0.033694;-1.000000;, + -1.149404; 0.033694;-1.000000;, + -1.149405; 0.033694; 1.000000;, + -1.149405; 0.101082; 1.000000;, + -1.149404; 0.101082;-1.000000;, + 1.149405; 0.168470;-1.000000;, + 1.149405; 0.168470; 1.000000;, + 1.149405; 0.101082; 1.000000;, + 1.149405; 0.101082;-1.000000;, + 1.149405; 0.101082;-1.000000;, + 1.149405; 0.101082; 1.000000;, + 1.149405; 0.033694; 1.000000;, + 1.149405; 0.033694;-1.000000;, + 1.149405; 0.033694;-1.000000;, + 1.149405; 0.033694; 1.000000;, + 1.149404;-0.033694; 1.000000;, + 1.149405;-0.033694;-1.000000;, + 1.149405;-0.033694;-1.000000;, + 1.149404;-0.033694; 1.000000;, + 1.149404;-0.101082; 1.000000;, + 1.149405;-0.101082;-1.000000;, + -0.996151; 0.499505; 1.000000;, + -1.149405; 0.168470; 1.000000;, + -1.149405; 0.101082; 1.000000;, + -0.996151; 0.299703; 1.000000;, + -0.996151; 0.299703; 1.000000;, + -1.149405; 0.101082; 1.000000;, + -1.149405; 0.033694; 1.000000;, + -0.996151; 0.099901; 1.000000;, + -0.996151; 0.099901; 1.000000;, + -1.149405; 0.033694; 1.000000;, + -1.149405;-0.033694; 1.000000;, + -0.996151;-0.099901; 1.000000;, + -0.996151;-0.099901; 1.000000;, + -1.149405;-0.033694; 1.000000;, + -1.149405;-0.101082; 1.000000;, + -0.996151;-0.299703; 1.000000;, + -0.996150; 0.499505;-1.000000;, + -0.996151; 0.299703;-1.000000;, + -1.149404; 0.101082;-1.000000;, + -1.149404; 0.168470;-1.000000;, + -0.996151; 0.299703;-1.000000;, + -0.996151; 0.099901;-1.000000;, + -1.149404; 0.033694;-1.000000;, + -1.149404; 0.101082;-1.000000;, + -0.996151;-0.099901;-1.000000;, + -1.149405;-0.033694;-1.000000;, + -1.149405;-0.033694;-3.687105;, + -0.996151;-0.099901;-3.687105;, + -0.996151;-0.099901;-1.000000;, + -0.996151;-0.299703;-1.000000;, + -1.149405;-0.101082;-1.000000;, + -1.149405;-0.033694;-1.000000;, + -0.842897; 0.138768;-3.687105;, + -0.842897;-0.138768;-3.687105;, + -0.996151;-0.099901;-3.687105;, + -0.996151; 0.099901;-3.687105;, + -0.996151; 0.099901;-3.687105;, + -0.996151;-0.099901;-3.687105;, + -1.149405;-0.033694;-3.687105;, + -1.149404; 0.033694;-3.687105;, + -0.996151; 0.099901;-1.000000;, + -0.842897; 0.138768;-1.000000;, + -0.842897; 0.138768;-3.687105;, + -0.996151; 0.099901;-3.687105;, + -1.149405;-0.033694;-1.000000;, + -1.149404; 0.033694;-1.000000;, + -1.149404; 0.033694;-3.687105;, + -1.149405;-0.033694;-3.687105;, + -1.149404; 0.033694;-1.000000;, + -0.996151; 0.099901;-1.000000;, + -0.996151; 0.099901;-3.687105;, + -1.149404; 0.033694;-3.687105;, + -0.842897;-0.138768;-1.000000;, + -0.996151;-0.099901;-1.000000;, + -0.996151;-0.099901;-3.687105;, + -0.842897;-0.138768;-3.687105;; + 196; + 4;3,2,1,0;, + 4;7,6,5,4;, + 4;11,10,9,8;, + 4;15,14,13,12;, + 4;19,18,17,16;, + 4;23,22,21,20;, + 4;27,26,25,24;, + 4;31,30,29,28;, + 4;35,34,33,32;, + 4;39,38,37,36;, + 4;43,42,41,40;, + 4;47,46,45,44;, + 4;51,50,49,48;, + 4;55,54,53,52;, + 4;59,58,57,56;, + 4;63,62,61,60;, + 4;67,66,65,64;, + 4;71,70,69,68;, + 4;75,74,73,72;, + 4;79,78,77,76;, + 4;83,82,81,80;, + 4;87,86,85,84;, + 4;91,90,89,88;, + 4;95,94,93,92;, + 4;99,98,97,96;, + 4;103,102,101,100;, + 4;107,106,105,104;, + 4;111,110,109,108;, + 4;115,114,113,112;, + 4;119,118,117,116;, + 4;123,122,121,120;, + 4;127,126,125,124;, + 4;131,130,129,128;, + 4;135,134,133,132;, + 4;139,138,137,136;, + 4;143,142,141,140;, + 4;147,146,145,144;, + 4;151,150,149,148;, + 4;155,154,153,152;, + 4;159,158,157,156;, + 4;163,162,161,160;, + 4;167,166,165,164;, + 4;171,170,169,168;, + 4;175,174,173,172;, + 4;179,178,177,176;, + 4;183,182,181,180;, + 4;187,186,185,184;, + 4;191,190,189,188;, + 4;195,194,193,192;, + 4;199,198,197,196;, + 4;203,202,201,200;, + 4;207,206,205,204;, + 4;211,210,209,208;, + 4;215,214,213,212;, + 4;219,218,217,216;, + 4;223,222,221,220;, + 4;227,226,225,224;, + 4;231,230,229,228;, + 4;235,234,233,232;, + 4;239,238,237,236;, + 4;243,242,241,240;, + 4;247,246,245,244;, + 4;251,250,249,248;, + 4;255,254,253,252;, + 4;259,258,257,256;, + 4;263,262,261,260;, + 4;267,266,265,264;, + 4;271,270,269,268;, + 4;275,274,273,272;, + 4;279,278,277,276;, + 4;283,282,281,280;, + 4;287,286,285,284;, + 4;291,290,289,288;, + 4;295,294,293,292;, + 4;299,298,297,296;, + 4;303,302,301,300;, + 4;307,306,305,304;, + 4;311,310,309,308;, + 4;315,314,313,312;, + 4;319,318,317,316;, + 4;323,322,321,320;, + 4;327,326,325,324;, + 4;331,330,329,328;, + 4;335,334,333,332;, + 4;339,338,337,336;, + 4;343,342,341,340;, + 4;347,346,345,344;, + 4;351,350,349,348;, + 4;355,354,353,352;, + 4;359,358,357,356;, + 4;363,362,361,360;, + 4;367,366,365,364;, + 4;371,370,369,368;, + 4;375,374,373,372;, + 4;379,378,377,376;, + 4;383,382,381,380;, + 4;387,386,385,384;, + 4;391,390,389,388;, + 4;395,394,393,392;, + 4;399,398,397,396;, + 4;403,402,401,400;, + 4;407,406,405,404;, + 4;411,410,409,408;, + 4;415,414,413,412;, + 4;419,418,417,416;, + 4;423,422,421,420;, + 4;427,426,425,424;, + 4;431,430,429,428;, + 4;435,434,433,432;, + 4;439,438,437,436;, + 4;443,442,441,440;, + 4;447,446,445,444;, + 4;451,450,449,448;, + 4;455,454,453,452;, + 4;459,458,457,456;, + 4;463,462,461,460;, + 4;467,466,465,464;, + 4;471,470,469,468;, + 4;475,474,473,472;, + 4;479,478,477,476;, + 4;483,482,481,480;, + 4;487,486,485,484;, + 4;491,490,489,488;, + 4;495,494,493,492;, + 4;499,498,497,496;, + 4;503,502,501,500;, + 4;507,506,505,504;, + 4;511,510,509,508;, + 4;515,514,513,512;, + 4;519,518,517,516;, + 4;523,522,521,520;, + 4;527,526,525,524;, + 4;531,530,529,528;, + 4;535,534,533,532;, + 4;539,538,537,536;, + 4;543,542,541,540;, + 4;547,546,545,544;, + 4;551,550,549,548;, + 4;555,554,553,552;, + 4;559,558,557,556;, + 4;563,562,561,560;, + 4;567,566,565,564;, + 4;571,570,569,568;, + 4;575,574,573,572;, + 4;579,578,577,576;, + 4;583,582,581,580;, + 4;587,586,585,584;, + 4;591,590,589,588;, + 4;595,594,593,592;, + 4;599,598,597,596;, + 4;603,602,601,600;, + 4;607,606,605,604;, + 4;611,610,609,608;, + 4;615,614,613,612;, + 4;619,618,617,616;, + 4;623,622,621,620;, + 4;627,626,625,624;, + 4;631,630,629,628;, + 4;635,634,633,632;, + 4;639,638,637,636;, + 4;643,642,641,640;, + 4;647,646,645,644;, + 4;651,650,649,648;, + 4;655,654,653,652;, + 4;659,658,657,656;, + 4;663,662,661,660;, + 4;667,666,665,664;, + 4;671,670,669,668;, + 4;675,674,673,672;, + 4;679,678,677,676;, + 4;683,682,681,680;, + 4;687,686,685,684;, + 4;691,690,689,688;, + 4;695,694,693,692;, + 4;699,698,697,696;, + 4;703,702,701,700;, + 4;707,706,705,704;, + 4;711,710,709,708;, + 4;715,714,713,712;, + 4;719,718,717,716;, + 4;723,722,721,720;, + 4;727,726,725,724;, + 4;731,730,729,728;, + 4;735,734,733,732;, + 4;739,738,737,736;, + 4;743,742,741,740;, + 4;747,746,745,744;, + 4;751,750,749,748;, + 4;755,754,753,752;, + 4;759,758,757,756;, + 4;763,762,761,760;, + 4;767,766,765,764;, + 4;771,770,769,768;, + 4;775,774,773,772;, + 4;779,778,777,776;, + 4;783,782,781,780;; + MeshNormals { // Cube normals + 196; + -0.000000; 0.000000;-1.000000;, + -0.000000; 0.000000; 1.000000;, + 1.000000;-0.000002; 0.000000;, + -0.907470;-0.420116;-0.000000;, + -1.000000; 0.000001;-0.000000;, + -0.907470; 0.420116;-0.000000;, + 0.907470; 0.420116;-0.000000;, + 0.785211; 0.619228;-0.000000;, + 0.585211; 0.810881;-0.000000;, + 0.568658; 0.822574;-0.000000;, + 0.430425; 0.902626; 0.000000;, + 0.107244; 0.994233; 0.000000;, + 0.066634; 0.997777; 0.000000;, + 0.000000; 1.000000; 0.000000;, + -0.066634; 0.997777; 0.000000;, + -0.107244; 0.994233; 0.000000;, + -0.430425; 0.902626; 0.000000;, + -0.568658; 0.822574; 0.000000;, + -0.585211; 0.810881;-0.000000;, + -0.785211; 0.619228;-0.000000;, + 0.907470;-0.420116; 0.000000;, + 0.785211;-0.619228; 0.000000;, + 0.585211;-0.810881; 0.000000;, + 0.568658;-0.822574; 0.000000;, + 0.430426;-0.902626; 0.000000;, + 0.107244;-0.994233;-0.000000;, + 0.066634;-0.997777;-0.000000;, + -0.000000;-1.000000;-0.000000;, + -0.066634;-0.997777;-0.000000;, + -0.107244;-0.994233; 0.000000;, + -0.430426;-0.902626;-0.000000;, + -0.568658;-0.822574;-0.000000;, + -0.585211;-0.810881;-0.000000;, + -0.785211;-0.619228;-0.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + -0.000000; 0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + -0.000000; 0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + -0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000;-0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + -0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 1.000000;-0.000000; 0.000000;, + 0.000000; 0.000000;-1.000000;, + -0.000000; 0.000000;-1.000000;, + -0.000000; 0.000000;-1.000000;, + -0.000000; 0.000000;-1.000000;, + -0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000;-0.000000;-1.000000;, + 0.000000;-0.000000;-1.000000;, + 0.000000;-0.000000;-1.000000;, + 0.000000;-0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + -0.000000; 0.000000;-1.000000;, + -0.000000; 0.000000;-1.000000;, + -0.000000; 0.000000;-1.000000;, + -0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + -0.000000; 0.000000; 1.000000;, + -0.000000; 0.000000; 1.000000;, + -0.000000; 0.000000; 1.000000;, + -0.000000; 0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + -0.000000; 0.000000; 1.000000;, + -0.000000; 0.000000; 1.000000;, + -0.000000; 0.000000; 1.000000;, + -0.000000; 0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + -1.000000; 0.000002;-0.000000;, + -1.000000; 0.000002;-0.000000;, + -1.000000; 0.000001;-0.000000;, + -1.000000; 0.000001;-0.000000;, + 1.000000;-0.000002;-0.000000;, + 1.000000;-0.000002;-0.000000;, + 1.000000;-0.000002; 0.000000;, + 1.000000;-0.000001; 0.000000;, + -0.000000; 0.000000; 1.000000;, + -0.000000; 0.000000; 1.000000;, + -0.000000; 0.000000; 1.000000;, + -0.000000; 0.000000; 1.000000;, + -0.000000; 0.000000;-1.000000;, + -0.000000; 0.000000;-1.000000;, + -0.396584;-0.917998; 0.000000;, + -0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + -0.245827; 0.969314; 0.000000;, + -1.000000; 0.000002; 0.000000;, + -0.396584; 0.917998; 0.000000;, + -0.245828;-0.969314; 0.000000;; + 196; + 4;0,0,0,0;, + 4;1,1,1,1;, + 4;2,2,2,2;, + 4;3,3,3,3;, + 4;4,4,4,4;, + 4;5,5,5,5;, + 4;6,6,6,6;, + 4;7,7,7,7;, + 4;8,8,8,8;, + 4;9,9,9,9;, + 4;10,10,10,10;, + 4;11,11,11,11;, + 4;12,12,12,12;, + 4;13,13,13,13;, + 4;14,14,14,14;, + 4;15,15,15,15;, + 4;16,16,16,16;, + 4;17,17,17,17;, + 4;18,18,18,18;, + 4;19,19,19,19;, + 4;20,20,20,20;, + 4;21,21,21,21;, + 4;22,22,22,22;, + 4;23,23,23,23;, + 4;24,24,24,24;, + 4;25,25,25,25;, + 4;26,26,26,26;, + 4;27,27,27,27;, + 4;28,28,28,28;, + 4;29,29,29,29;, + 4;30,30,30,30;, + 4;31,31,31,31;, + 4;32,32,32,32;, + 4;33,33,33,33;, + 4;34,34,34,34;, + 4;35,35,35,35;, + 4;36,36,36,36;, + 4;37,37,37,37;, + 4;38,38,38,38;, + 4;39,39,39,39;, + 4;40,40,40,40;, + 4;41,41,41,41;, + 4;42,42,42,42;, + 4;43,43,43,43;, + 4;44,44,44,44;, + 4;45,45,45,45;, + 4;46,46,46,46;, + 4;47,47,47,47;, + 4;48,48,48,48;, + 4;49,49,49,49;, + 4;50,50,50,50;, + 4;51,51,51,51;, + 4;52,52,52,52;, + 4;53,53,53,53;, + 4;54,54,54,54;, + 4;55,55,55,55;, + 4;56,56,56,56;, + 4;57,57,57,57;, + 4;58,58,58,58;, + 4;59,59,59,59;, + 4;60,60,60,60;, + 4;61,61,61,61;, + 4;62,62,62,62;, + 4;63,63,63,63;, + 4;64,64,64,64;, + 4;65,65,65,65;, + 4;66,66,66,66;, + 4;67,67,67,67;, + 4;68,68,68,68;, + 4;69,69,69,69;, + 4;70,70,70,70;, + 4;71,71,71,71;, + 4;72,72,72,72;, + 4;73,73,73,73;, + 4;74,74,74,74;, + 4;75,75,75,75;, + 4;76,76,76,76;, + 4;77,77,77,77;, + 4;78,78,78,78;, + 4;79,79,79,79;, + 4;80,80,80,80;, + 4;81,81,81,81;, + 4;82,82,82,82;, + 4;83,83,83,83;, + 4;84,84,84,84;, + 4;85,85,85,85;, + 4;86,86,86,86;, + 4;87,87,87,87;, + 4;88,88,88,88;, + 4;89,89,89,89;, + 4;90,90,90,90;, + 4;91,91,91,91;, + 4;92,92,92,92;, + 4;93,93,93,93;, + 4;94,94,94,94;, + 4;95,95,95,95;, + 4;96,96,96,96;, + 4;97,97,97,97;, + 4;98,98,98,98;, + 4;99,99,99,99;, + 4;100,100,100,100;, + 4;101,101,101,101;, + 4;102,102,102,102;, + 4;103,103,103,103;, + 4;104,104,104,104;, + 4;105,105,105,105;, + 4;106,106,106,106;, + 4;107,107,107,107;, + 4;108,108,108,108;, + 4;109,109,109,109;, + 4;110,110,110,110;, + 4;111,111,111,111;, + 4;112,112,112,112;, + 4;113,113,113,113;, + 4;114,114,114,114;, + 4;115,115,115,115;, + 4;116,116,116,116;, + 4;117,117,117,117;, + 4;118,118,118,118;, + 4;119,119,119,119;, + 4;120,120,120,120;, + 4;121,121,121,121;, + 4;122,122,122,122;, + 4;123,123,123,123;, + 4;124,124,124,124;, + 4;125,125,125,125;, + 4;126,126,126,126;, + 4;127,127,127,127;, + 4;128,128,128,128;, + 4;129,129,129,129;, + 4;130,130,130,130;, + 4;131,131,131,131;, + 4;132,132,132,132;, + 4;133,133,133,133;, + 4;134,134,134,134;, + 4;135,135,135,135;, + 4;136,136,136,136;, + 4;137,137,137,137;, + 4;138,138,138,138;, + 4;139,139,139,139;, + 4;140,140,140,140;, + 4;141,141,141,141;, + 4;142,142,142,142;, + 4;143,143,143,143;, + 4;144,144,144,144;, + 4;145,145,145,145;, + 4;146,146,146,146;, + 4;147,147,147,147;, + 4;148,148,148,148;, + 4;149,149,149,149;, + 4;150,150,150,150;, + 4;151,151,151,151;, + 4;152,152,152,152;, + 4;153,153,153,153;, + 4;154,154,154,154;, + 4;155,155,155,155;, + 4;156,156,156,156;, + 4;157,157,157,157;, + 4;158,158,158,158;, + 4;159,159,159,159;, + 4;160,160,160,160;, + 4;161,161,161,161;, + 4;162,162,162,162;, + 4;163,163,163,163;, + 4;164,164,164,164;, + 4;165,165,165,165;, + 4;166,166,166,166;, + 4;167,167,167,167;, + 4;168,168,168,168;, + 4;169,169,169,169;, + 4;170,170,170,170;, + 4;171,171,171,171;, + 4;172,172,172,172;, + 4;173,173,173,173;, + 4;174,174,174,174;, + 4;175,175,175,175;, + 4;176,176,176,176;, + 4;177,177,177,177;, + 4;178,178,178,178;, + 4;179,179,179,179;, + 4;180,180,180,180;, + 4;181,181,181,181;, + 4;182,182,182,182;, + 4;183,183,183,183;, + 4;184,184,184,184;, + 4;185,185,185,185;, + 4;186,186,186,186;, + 4;187,187,187,187;, + 4;188,188,188,188;, + 4;189,189,189,189;, + 4;190,190,190,190;, + 4;191,191,191,191;, + 4;192,192,192,192;, + 4;193,193,193,193;, + 4;194,194,194,194;, + 4;195,195,195,195;; + } // End of Cube normals + MeshTextureCoords { // Cube UV coordinates + 784; + 0.001925; 0.649852;, + 0.001925; 0.749753;, + -0.074702; 0.584235;, + -0.074702; 0.550541;, + 0.001924; 0.649851;, + -0.074702; 0.550541;, + -0.074703; 0.584235;, + 0.001924; 0.749752;, + 0.252489; 1.000000;, + 0.252489; 0.643683;, + 0.087481; 0.643683;, + 0.087482; 1.000000;, + -0.723098; 1.000000;, + -0.723097; 0.643683;, + 0.087482; 0.643683;, + 0.087482; 1.000000;, + 0.747511; 1.000000;, + 0.747511; 0.643683;, + 0.912519; 0.643683;, + 0.912519; 1.000000;, + 1.723099; 0.643683;, + 1.723098; 1.000000;, + 0.912519; 1.000000;, + 0.912519; 0.643683;, + 0.912518; 0.643683;, + 0.912519; 1.000000;, + 1.723098; 1.000000;, + 1.723098; 0.643683;, + 1.723098; 0.643683;, + 1.723098; 1.000000;, + 2.198947; 1.000000;, + 2.198946; 0.643683;, + 2.563935; 0.643683;, + 2.563934; 1.000000;, + 2.188673; 1.000000;, + 2.188674; 0.643683;, + 2.188674; 1.000000;, + 2.188673; 1.356317;, + 1.813412; 1.356317;, + 1.813413; 1.000000;, + 1.813413; 1.000000;, + 1.813412; 1.356317;, + 1.438152; 1.356317;, + 1.438153; 1.000000;, + 1.438153; 1.000000;, + 1.438152; 1.356317;, + 1.062891; 1.356317;, + 1.062892; 1.000000;, + 1.062892; 1.000000;, + 1.062891; 1.356317;, + 0.687631; 1.356317;, + 0.687631; 1.000000;, + 0.687631; 0.643683;, + 0.687631; 1.000000;, + 0.312370; 1.000000;, + 0.312371; 0.643683;, + 0.312371; 0.643683;, + 0.312370; 1.000000;, + -0.062890; 1.000000;, + -0.062890; 0.643683;, + -0.062890; 1.000000;, + -0.062890; 1.356317;, + -0.438151; 1.356317;, + -0.438151; 1.000000;, + -0.438151; 1.000000;, + -0.438151; 1.356317;, + -0.813411; 1.356317;, + -0.813411; 1.000000;, + -0.813411; 1.000000;, + -0.813411; 1.356317;, + -1.188672; 1.356317;, + -1.188672; 1.000000;, + -1.188672; 1.000000;, + -1.188672; 1.356317;, + -1.563932; 1.356317;, + -1.563933; 1.000000;, + 2.198947; 0.643683;, + 2.198947; 1.000000;, + 1.723098; 1.000000;, + 1.723099; 0.643683;, + 0.087482; 1.000000;, + 0.087481; 0.643683;, + -0.723099; 0.643683;, + -0.723098; 1.000000;, + -0.723098; 1.000000;, + -0.723099; 0.643683;, + -1.198948; 0.643683;, + -1.198947; 1.000000;, + 2.563934; 1.000000;, + 2.563932; 0.643683;, + 2.188671; 0.643683;, + 2.188673; 1.000000;, + 2.188673; 1.000000;, + 2.188671; 0.643683;, + 1.813410; 0.643683;, + 1.813412; 1.000000;, + 1.813412; 1.000000;, + 1.813410; 0.643683;, + 1.438150; 0.643683;, + 1.438152; 1.000000;, + 1.438152; 1.000000;, + 1.438150; 0.643683;, + 1.062889; 0.643683;, + 1.062891; 1.000000;, + 1.062891; 1.000000;, + 1.062889; 0.643683;, + 0.687629; 0.643683;, + 0.687630; 1.000000;, + 0.687630; 1.000000;, + 0.687629; 0.643683;, + 0.312368; 0.643683;, + 0.312370; 1.000000;, + 0.312370; 1.000000;, + 0.312368; 0.643683;, + -0.062892; 0.643683;, + -0.062891; 1.000000;, + -0.062891; 1.000000;, + -0.062892; 0.643683;, + -0.438153; 0.643683;, + -0.438152; 1.000000;, + -0.438152; 1.000000;, + -0.438153; 0.643683;, + -0.813414; 0.643683;, + -0.813412; 1.000000;, + -0.813412; 1.000000;, + -0.813414; 0.643683;, + -1.188674; 0.643683;, + -1.188673; 1.000000;, + -1.188673; 1.000000;, + -1.188674; 0.643683;, + -1.563935; 0.643683;, + -1.563933; 1.000000;, + -1.198946; 1.000000;, + -1.198946; 0.643683;, + -0.723097; 0.643683;, + -0.723098; 1.000000;, + 0.074702; 0.550541;, + -0.001925; 0.649852;, + -0.001925; 0.749753;, + 0.074702; 0.584235;, + 0.998075; 0.649852;, + 0.921448; 0.708152;, + 0.921448; 0.846920;, + 0.998075; 0.749753;, + 0.921448; 0.708152;, + 0.844821; 0.741333;, + 0.844821; 0.902221;, + 0.921448; 0.846920;, + 0.844821; 0.741333;, + 0.768194; 0.773117;, + 0.768194; 0.955194;, + 0.844821; 0.902221;, + 0.768194; 0.773117;, + 0.691567; 0.795041;, + 0.691567; 0.991735;, + 0.768194; 0.955194;, + 0.691567; 0.795041;, + 0.614940; 0.800000;, + 0.614940; 1.000000;, + 0.691567; 0.991735;, + 0.614940; 0.800000;, + 0.538313; 0.803070;, + 0.538313; 1.005117;, + 0.614940; 1.000000;, + 0.538313; 0.803070;, + 0.461686; 0.803070;, + 0.461686; 1.005117;, + 0.538313; 1.005117;, + 0.461686; 0.803070;, + 0.385059; 0.800000;, + 0.385059; 1.000000;, + 0.461686; 1.005117;, + 0.385059; 0.800000;, + 0.308432; 0.795041;, + 0.308432; 0.991734;, + 0.385059; 1.000000;, + 0.308432; 0.795041;, + 0.231805; 0.773116;, + 0.231805; 0.955194;, + 0.308432; 0.991734;, + 0.231805; 0.773116;, + 0.155178; 0.741332;, + 0.155178; 0.902221;, + 0.231805; 0.955194;, + 0.155178; 0.741332;, + 0.078551; 0.708152;, + 0.078551; 0.846919;, + 0.155178; 0.902221;, + 0.078551; 0.708152;, + 0.001924; 0.649851;, + 0.001924; 0.749752;, + 0.078551; 0.846919;, + 0.074702; 0.550541;, + 0.074702; 0.584235;, + -0.001925; 0.749753;, + -0.001925; 0.649852;, + 0.998075; 0.649852;, + 0.998075; 0.749753;, + 0.921448; 0.846919;, + 0.921448; 0.708152;, + 0.921448; 0.708152;, + 0.921448; 0.846919;, + 0.844821; 0.902221;, + 0.844821; 0.741333;, + 0.844821; 0.741333;, + 0.844821; 0.902221;, + 0.768194; 0.955194;, + 0.768194; 0.773117;, + 0.768194; 0.773117;, + 0.768194; 0.955194;, + 0.691567; 0.991735;, + 0.691567; 0.795041;, + 0.691567; 0.795041;, + 0.691567; 0.991735;, + 0.614940; 1.000000;, + 0.614940; 0.800000;, + 0.614940; 0.800000;, + 0.614940; 1.000000;, + 0.538313; 1.005117;, + 0.538314; 0.803070;, + 0.538314; 0.803070;, + 0.538313; 1.005117;, + 0.461686; 1.005117;, + 0.461686; 0.803070;, + 0.461686; 0.803070;, + 0.461686; 1.005117;, + 0.385059; 1.000000;, + 0.385060; 0.800000;, + 0.385060; 0.800000;, + 0.385059; 1.000000;, + 0.308432; 0.991735;, + 0.308432; 0.795041;, + 0.308432; 0.795041;, + 0.308432; 0.991735;, + 0.231805; 0.955194;, + 0.231806; 0.773117;, + 0.231806; 0.773117;, + 0.231805; 0.955194;, + 0.155178; 0.902221;, + 0.155179; 0.741333;, + 0.155179; 0.741333;, + 0.155178; 0.902221;, + 0.078552; 0.846919;, + 0.078552; 0.708152;, + 0.078552; 0.708152;, + 0.078552; 0.846919;, + 0.001925; 0.749753;, + 0.001925; 0.649852;, + 0.078552; 0.153081;, + 0.078552; 0.291848;, + 0.001925; 0.350148;, + 0.001925; 0.250247;, + 0.078552; 0.291848;, + 0.078552; 0.430616;, + 0.001925; 0.450049;, + 0.001925; 0.350148;, + 0.654094; 0.441631;, + 0.365143; 0.441631;, + 0.365143; 0.828379;, + 0.654094; 0.828379;, + 0.078552; 0.569384;, + 0.078552; 0.708152;, + 0.001925; 0.649852;, + 0.001925; 0.549951;, + 0.155179; 0.097779;, + 0.155179; 0.258667;, + 0.078552; 0.291848;, + 0.078552; 0.153081;, + 0.155179; 0.258667;, + 0.155179; 0.419556;, + 0.078552; 0.430616;, + 0.078552; 0.291848;, + 0.155179; 0.419556;, + 0.155179; 0.580444;, + 0.078552; 0.569384;, + 0.078552; 0.430616;, + 0.155179; 0.580444;, + 0.155179; 0.741333;, + 0.078552; 0.708152;, + 0.078552; 0.569384;, + 0.231806; 0.044806;, + 0.231806; 0.226883;, + 0.155179; 0.258667;, + 0.155179; 0.097779;, + 0.231806; 0.226883;, + 0.231806; 0.408961;, + 0.155179; 0.419556;, + 0.155179; 0.258667;, + 0.231806; 0.408961;, + 0.231806; 0.591039;, + 0.155179; 0.580444;, + 0.155179; 0.419556;, + 0.231806; 0.591039;, + 0.231806; 0.773117;, + 0.155179; 0.741333;, + 0.155179; 0.580444;, + 0.308433; 0.008265;, + 0.308433; 0.204959;, + 0.231806; 0.226883;, + 0.231806; 0.044806;, + 0.308433; 0.204959;, + 0.308433; 0.401653;, + 0.231806; 0.408961;, + 0.231806; 0.226883;, + 0.308433; 0.401653;, + 0.308433; 0.598347;, + 0.231806; 0.591039;, + 0.231806; 0.408961;, + 0.308433; 0.598347;, + 0.308432; 0.795041;, + 0.231806; 0.773117;, + 0.231806; 0.591039;, + 0.385060; 1.000000;, + 0.385060; 1.200000;, + 0.308433; 1.204959;, + 0.308433; 1.008265;, + 0.385060; 0.200000;, + 0.385060; 0.400000;, + 0.308433; 0.401653;, + 0.308433; 0.204959;, + 0.385060; 0.400000;, + 0.385060; 0.600000;, + 0.308433; 0.598347;, + 0.308433; 0.401653;, + 0.385060; 0.600000;, + 0.385060; 0.800000;, + 0.308432; 0.795041;, + 0.308433; 0.598347;, + 0.461687; 0.994883;, + 0.461687; 1.196930;, + 0.385060; 1.200000;, + 0.385060; 1.000000;, + 0.461687; 0.196930;, + 0.461687; 0.398977;, + 0.385060; 0.400000;, + 0.385060; 0.200000;, + 0.461687; 0.398977;, + 0.461687; 0.601023;, + 0.385060; 0.600000;, + 0.385060; 0.400000;, + 0.461687; 0.601023;, + 0.461686; 0.803070;, + 0.385060; 0.800000;, + 0.385060; 0.600000;, + 0.538314; 0.994883;, + 0.538314; 1.196930;, + 0.461687; 1.196930;, + 0.461687; 0.994883;, + 0.538314; 0.196930;, + 0.538314; 0.398977;, + 0.461687; 0.398977;, + 0.461687; 0.196930;, + 0.538314; 0.398977;, + 0.538314; 0.601023;, + 0.461687; 0.601023;, + 0.461687; 0.398977;, + 0.538314; 0.601023;, + 0.538314; 0.803070;, + 0.461686; 0.803070;, + 0.461687; 0.601023;, + 0.614941; 1.000000;, + 0.614941; 1.200000;, + 0.538314; 1.196930;, + 0.538314; 0.994883;, + 0.614941; 0.200000;, + 0.614941; 0.400000;, + 0.538314; 0.398977;, + 0.538314; 0.196930;, + 0.614941; 0.400000;, + 0.614941; 0.600000;, + 0.538314; 0.601023;, + 0.538314; 0.398977;, + 0.614941; 0.600000;, + 0.614940; 0.800000;, + 0.538314; 0.803070;, + 0.538314; 0.601023;, + 0.691568; 0.008265;, + 0.691568; 0.204959;, + 0.614941; 0.200000;, + 0.614941; 0.000000;, + 0.691568; 0.204959;, + 0.691567; 0.401653;, + 0.614941; 0.400000;, + 0.614941; 0.200000;, + 0.691567; 0.401653;, + 0.691567; 0.598347;, + 0.614941; 0.600000;, + 0.614941; 0.400000;, + 0.691567; 0.598347;, + 0.691567; 0.795041;, + 0.614940; 0.800000;, + 0.614941; 0.600000;, + 0.768194; 0.044806;, + 0.768194; 0.226883;, + 0.691568; 0.204959;, + 0.691568; 0.008265;, + 0.768194; 0.226883;, + 0.768194; 0.408961;, + 0.691567; 0.401653;, + 0.691568; 0.204959;, + 0.768194; 0.408961;, + 0.768194; 0.591039;, + 0.691567; 0.598347;, + 0.691567; 0.401653;, + 0.768194; 0.591039;, + 0.768194; 0.773117;, + 0.691567; 0.795041;, + 0.691567; 0.598347;, + 0.844821; 0.097779;, + 0.844821; 0.258667;, + 0.768194; 0.226883;, + 0.768194; 0.044806;, + 0.844821; 0.258667;, + 0.844821; 0.419556;, + 0.768194; 0.408961;, + 0.768194; 0.226883;, + 0.844821; 0.419556;, + 0.844821; 0.580444;, + 0.768194; 0.591039;, + 0.768194; 0.408961;, + 0.844821; 0.580444;, + 0.844821; 0.741333;, + 0.768194; 0.773117;, + 0.768194; 0.591039;, + 0.921448; 0.153081;, + 0.921448; 0.291848;, + 0.844821; 0.258667;, + 0.844821; 0.097779;, + 0.921448; 0.291848;, + 0.921448; 0.430616;, + 0.844821; 0.419556;, + 0.844821; 0.258667;, + 0.921448; 0.430616;, + 0.921448; 0.569384;, + 0.844821; 0.580444;, + 0.844821; 0.419556;, + 0.921448; 0.569384;, + 0.921448; 0.708152;, + 0.844821; 0.741333;, + 0.844821; 0.580444;, + 0.998075; 0.250247;, + 0.998075; 0.350148;, + 0.921448; 0.291848;, + 0.921448; 0.153081;, + 0.998075; 0.350148;, + 0.998075; 0.450049;, + 0.921448; 0.430616;, + 0.921448; 0.291848;, + 0.998075; 0.450049;, + 0.998075; 0.549951;, + 0.921448; 0.569384;, + 0.921448; 0.430616;, + 0.998075; 0.549951;, + 0.998075; 0.649852;, + 0.921448; 0.708152;, + 0.921448; 0.569384;, + 0.074702; 0.415765;, + 0.074702; 0.449459;, + -0.001925; 0.350148;, + -0.001925; 0.250247;, + 0.074702; 0.449459;, + 0.074702; 0.483153;, + -0.001925; 0.450049;, + -0.001925; 0.350148;, + 0.074702; 0.483153;, + 0.074702; 0.516847;, + -0.001925; 0.549951;, + -0.001925; 0.450049;, + 0.074702; 0.516847;, + 0.074702; 0.550541;, + -0.001925; 0.649852;, + -0.001925; 0.549951;, + 0.078552; 0.153081;, + 0.001925; 0.250247;, + 0.001925; 0.350148;, + 0.078552; 0.291848;, + 0.078552; 0.291848;, + 0.001925; 0.350148;, + 0.001925; 0.450049;, + 0.078552; 0.430616;, + 0.078552; 0.430616;, + 0.001925; 0.450049;, + 0.001924; 0.549950;, + 0.078551; 0.569384;, + 0.078551; 0.569384;, + 0.001924; 0.549950;, + 0.001924; 0.649851;, + 0.078551; 0.708152;, + 0.155179; 0.097779;, + 0.078552; 0.153081;, + 0.078552; 0.291848;, + 0.155179; 0.258667;, + 0.155179; 0.258667;, + 0.078552; 0.291848;, + 0.078552; 0.430616;, + 0.155178; 0.419556;, + 0.155178; 0.419556;, + 0.078552; 0.430616;, + 0.078551; 0.569384;, + 0.155178; 0.580444;, + 0.155178; 0.580444;, + 0.078551; 0.569384;, + 0.078551; 0.708152;, + 0.155178; 0.741332;, + 0.231806; 0.044806;, + 0.155179; 0.097779;, + 0.155179; 0.258667;, + 0.231806; 0.226883;, + 0.231806; 0.226883;, + 0.155179; 0.258667;, + 0.155178; 0.419556;, + 0.231805; 0.408961;, + 0.231805; 0.408961;, + 0.155178; 0.419556;, + 0.155178; 0.580444;, + 0.231805; 0.591039;, + 0.231805; 0.591039;, + 0.155178; 0.580444;, + 0.155178; 0.741332;, + 0.231805; 0.773116;, + 0.308433; 0.008265;, + 0.231806; 0.044806;, + 0.231806; 0.226883;, + 0.308433; 0.204959;, + 0.308433; 0.204959;, + 0.231806; 0.226883;, + 0.231805; 0.408961;, + 0.308432; 0.401653;, + 0.308432; 0.401653;, + 0.231805; 0.408961;, + 0.231805; 0.591039;, + 0.308432; 0.598347;, + 0.308432; 0.598347;, + 0.231805; 0.591039;, + 0.231805; 0.773116;, + 0.308432; 0.795041;, + 0.385060; 0.000000;, + 0.308433; 0.008265;, + 0.308433; 0.204959;, + 0.385060; 0.200000;, + 0.385060; 0.200000;, + 0.308433; 0.204959;, + 0.308432; 0.401653;, + 0.385059; 0.400000;, + 0.385059; 0.400000;, + 0.308432; 0.401653;, + 0.308432; 0.598347;, + 0.385059; 0.600000;, + 0.385059; 0.600000;, + 0.308432; 0.598347;, + 0.308432; 0.795041;, + 0.385059; 0.800000;, + 0.461687; 0.994883;, + 0.385060; 1.000000;, + 0.385060; 1.200000;, + 0.461687; 1.196930;, + 0.461687; 0.196930;, + 0.385060; 0.200000;, + 0.385059; 0.400000;, + 0.461686; 0.398977;, + 0.461686; 0.398977;, + 0.385059; 0.400000;, + 0.385059; 0.600000;, + 0.461686; 0.601024;, + 0.461686; 0.601024;, + 0.385059; 0.600000;, + 0.385059; 0.800000;, + 0.461686; 0.803070;, + 0.538314; 0.994883;, + 0.461687; 0.994883;, + 0.461687; 1.196930;, + 0.538314; 1.196930;, + 0.538314; 0.196930;, + 0.461687; 0.196930;, + 0.461686; 0.398977;, + 0.538313; 0.398977;, + 0.538313; 0.398977;, + 0.461686; 0.398977;, + 0.461686; 0.601024;, + 0.538313; 0.601024;, + 0.538313; 0.601024;, + 0.461686; 0.601024;, + 0.461686; 0.803070;, + 0.538313; 0.803070;, + 0.614941; 0.000000;, + 0.538314;-0.005117;, + 0.538314; 0.196930;, + 0.614941; 0.200000;, + 0.614941; 0.200000;, + 0.538314; 0.196930;, + 0.538313; 0.398977;, + 0.614940; 0.400000;, + 0.614940; 0.400000;, + 0.538313; 0.398977;, + 0.538313; 0.601024;, + 0.614940; 0.600000;, + 0.614940; 0.600000;, + 0.538313; 0.601024;, + 0.538313; 0.803070;, + 0.614940; 0.800000;, + 0.691568; 0.008266;, + 0.614941; 0.000000;, + 0.614941; 0.200000;, + 0.691568; 0.204959;, + 0.691568; 0.204959;, + 0.614941; 0.200000;, + 0.614940; 0.400000;, + 0.691567; 0.401653;, + 0.691567; 0.401653;, + 0.614940; 0.400000;, + 0.614940; 0.600000;, + 0.691567; 0.598347;, + 0.691567; 0.598347;, + 0.614940; 0.600000;, + 0.614940; 0.800000;, + 0.691567; 0.795041;, + 0.768195; 0.044806;, + 0.691568; 0.008266;, + 0.691568; 0.204959;, + 0.768195; 0.226884;, + 0.768195; 0.226884;, + 0.691568; 0.204959;, + 0.691567; 0.401653;, + 0.768194; 0.408961;, + 0.768194; 0.408961;, + 0.691567; 0.401653;, + 0.691567; 0.598347;, + 0.768194; 0.591039;, + 0.768194; 0.591039;, + 0.691567; 0.598347;, + 0.691567; 0.795041;, + 0.768194; 0.773117;, + 0.844822; 0.097779;, + 0.768195; 0.044806;, + 0.768195; 0.226884;, + 0.844822; 0.258668;, + 0.844822; 0.258668;, + 0.768195; 0.226884;, + 0.768194; 0.408961;, + 0.844821; 0.419556;, + 0.844821; 0.419556;, + 0.768194; 0.408961;, + 0.768194; 0.591039;, + 0.844821; 0.580444;, + 0.844821; 0.580444;, + 0.768194; 0.591039;, + 0.768194; 0.773117;, + 0.844821; 0.741333;, + 0.921449; 0.153081;, + 0.844822; 0.097779;, + 0.844822; 0.258668;, + 0.921449; 0.291848;, + 0.921449; 0.291848;, + 0.844822; 0.258668;, + 0.844821; 0.419556;, + 0.921448; 0.430616;, + 0.921448; 0.430616;, + 0.844821; 0.419556;, + 0.844821; 0.580444;, + 0.921448; 0.569384;, + 0.921448; 0.569384;, + 0.844821; 0.580444;, + 0.844821; 0.741333;, + 0.921448; 0.708152;, + 0.998076; 0.250247;, + 0.921449; 0.153081;, + 0.921449; 0.291848;, + 0.998076; 0.350149;, + 0.998076; 0.350149;, + 0.921449; 0.291848;, + 0.921448; 0.430616;, + 0.998075; 0.450050;, + 0.998075; 0.450050;, + 0.921448; 0.430616;, + 0.921448; 0.569384;, + 0.998075; 0.549951;, + 0.998075; 0.549951;, + 0.921448; 0.569384;, + 0.921448; 0.708152;, + 0.998075; 0.649852;, + 0.074703; 0.415765;, + -0.001924; 0.250247;, + -0.001924; 0.350149;, + 0.074703; 0.449459;, + 0.074703; 0.449459;, + -0.001924; 0.350149;, + -0.001925; 0.450050;, + 0.074702; 0.483153;, + 0.074702; 0.483153;, + -0.001925; 0.450050;, + -0.001925; 0.549951;, + 0.074702; 0.516847;, + 0.074702; 0.516847;, + -0.001925; 0.549951;, + -0.001925; 0.649852;, + 0.074702; 0.550541;, + 0.087482; 1.000000;, + 0.087482; 0.643683;, + 0.252489; 0.643683;, + 0.252489; 1.000000;, + 0.252489; 1.000000;, + 0.252489; 0.643683;, + 0.417496; 0.643683;, + 0.417496; 1.000000;, + 0.417496; 1.000000;, + 0.417496; 0.643683;, + 0.582504; 0.643683;, + 0.582504; 1.000000;, + 0.582504; 1.000000;, + 0.582504; 0.643683;, + 0.747511; 0.643683;, + 0.747511; 1.000000;, + 0.912519; 1.000000;, + 0.912518; 0.643683;, + 0.747511; 0.643683;, + 0.747511; 1.000000;, + 0.747511; 1.000000;, + 0.747511; 0.643683;, + 0.582503; 0.643683;, + 0.582504; 1.000000;, + 0.582504; 1.000000;, + 0.582503; 0.643683;, + 0.417496; 0.643683;, + 0.417496; 1.000000;, + 0.417496; 1.000000;, + 0.417496; 0.643683;, + 0.252489; 0.643683;, + 0.252489; 1.000000;, + 0.001925; 0.250247;, + -0.074702; 0.415765;, + -0.074702; 0.449459;, + 0.001925; 0.350148;, + 0.001925; 0.350148;, + -0.074702; 0.449459;, + -0.074702; 0.483153;, + 0.001925; 0.450049;, + 0.001925; 0.450049;, + -0.074702; 0.483153;, + -0.074702; 0.516847;, + 0.001924; 0.549950;, + 0.001924; 0.549950;, + -0.074702; 0.516847;, + -0.074702; 0.550541;, + 0.001924; 0.649851;, + 0.001925; 0.250247;, + 0.001925; 0.350148;, + -0.074702; 0.449459;, + -0.074702; 0.415765;, + 0.001925; 0.350148;, + 0.001925; 0.450049;, + -0.074702; 0.483153;, + -0.074702; 0.449459;, + -0.527506; 0.441631;, + -0.687063; 0.441631;, + -0.687063; 0.828379;, + -0.527506; 0.828379;, + 0.001925; 0.549951;, + 0.001925; 0.649852;, + -0.074702; 0.550541;, + -0.074702; 0.516847;, + 0.078552; 0.430616;, + 0.078552; 0.569384;, + 0.001925; 0.549951;, + 0.001925; 0.450049;, + 0.001925; 0.450049;, + 0.001925; 0.549951;, + -0.074702; 0.516847;, + -0.074702; 0.483153;, + -0.527506; 0.441631;, + -0.367948; 0.441631;, + -0.367948; 0.828379;, + -0.527506; 0.828379;, + 0.474539; 0.441631;, + 0.544698; 0.441631;, + 0.544698; 0.828379;, + 0.474539; 0.828379;, + 1.395201; 0.441631;, + 1.554758; 0.441631;, + 1.554758; 0.828379;, + 1.395201; 0.828379;, + -0.367948; 0.441631;, + -0.527506; 0.441631;, + -0.527506; 0.828379;, + -0.367948; 0.828379;; + } // End of Cube UV coordinates + MeshMaterialList { // Cube material list + 1; + 196; + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0; + Material Material { + 0.640000; 0.640000; 0.640000; 1.000000;; + 96.078431; + 0.500000; 0.500000; 0.500000;; + 0.000000; 0.000000; 0.000000;; + TextureFilename {"default_wood.png";} + } + } // End of Cube material list + } // End of Cube mesh + } // End of Cube +} // End of Root diff --git a/mods/Decorations/abritorch/LICENSE.txt b/mods/Decorations/abritorch/LICENSE.txt new file mode 100644 index 0000000..abfe82d --- /dev/null +++ b/mods/Decorations/abritorch/LICENSE.txt @@ -0,0 +1,38 @@ + +Textures: +Original torch textures from minetest_game/default +Recoloured textures and edits by Shara RedCat + +Torch model: +License: CC-BY 3.0 +Attribution: BlockMen, from https://github.com/BlockMen/torches + +Code: +License: MIT (https://opensource.org/licenses/MIT) +By Shara RedCat + + + +--- + +The MIT License (MIT) + +Copyright (c) 2017 Shara RedCat + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/mods/Decorations/abritorch/depends.txt b/mods/Decorations/abritorch/depends.txt new file mode 100644 index 0000000..22ed7be --- /dev/null +++ b/mods/Decorations/abritorch/depends.txt @@ -0,0 +1,2 @@ +default +color \ No newline at end of file diff --git a/mods/Decorations/abritorch/init.lua b/mods/Decorations/abritorch/init.lua new file mode 100644 index 0000000..eabc371 --- /dev/null +++ b/mods/Decorations/abritorch/init.lua @@ -0,0 +1,3 @@ +local modpath = minetest.get_modpath("abritorch").. DIR_DELIM + +dofile(modpath.."torches.lua") \ No newline at end of file diff --git a/mods/Decorations/abritorch/textures/abritorch_torch_on_floor_animated_white.png b/mods/Decorations/abritorch/textures/abritorch_torch_on_floor_animated_white.png new file mode 100644 index 0000000..3e1d42a Binary files /dev/null and b/mods/Decorations/abritorch/textures/abritorch_torch_on_floor_animated_white.png differ diff --git a/mods/Decorations/abritorch/textures/abritorch_torch_on_floor_white.png b/mods/Decorations/abritorch/textures/abritorch_torch_on_floor_white.png new file mode 100644 index 0000000..308f2a5 Binary files /dev/null and b/mods/Decorations/abritorch/textures/abritorch_torch_on_floor_white.png differ diff --git a/mods/Decorations/abritorch/textures/none.png b/mods/Decorations/abritorch/textures/none.png new file mode 100644 index 0000000..07f7b0e Binary files /dev/null and b/mods/Decorations/abritorch/textures/none.png differ diff --git a/mods/Decorations/abritorch/torches.lua b/mods/Decorations/abritorch/torches.lua new file mode 100644 index 0000000..109f70a --- /dev/null +++ b/mods/Decorations/abritorch/torches.lua @@ -0,0 +1,134 @@ + +color1 = minetest.setting_get("color1") or "292421" +color2 = minetest.setting_get("color2") or "0000FF" +color3 = minetest.setting_get("color3") or "00FF00" +color4 = minetest.setting_get("color4") or "F5F5F5" +color5 = minetest.setting_get("color5") or "FF6103" +color6 = minetest.setting_get("color6") or "FF0000" +color7 = minetest.setting_get("color7") or "FFFF00" +color8 = minetest.setting_get("color8") or "FF69B4" + +local source_list = { + {"black", "Color1", color1, 40, 36, 33}, + {"blue", "Color2", color2, 0, 0, 255}, + {"green", "Color3", color3, 0, 255, 0}, + {"white", "Color4", color4, 245, 245, 245}, + {"orange", "Color5", color5, 255, 97, 3}, + {"red", "Color6", color6, 255, 0, 0}, + {"yellow", "Color7", color7, 255, 255, 0}, + {"pink", "Color8", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local name = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +local enable_ceiling = true + + minetest.register_craftitem("abritorch:torch_" .. name, { + description = desc.." Torch", + inventory_image = "torch.png^[colorize:#"..colour..":70", + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + liquids_pointable = false, + on_place = function(itemstack, placer, pointed_thing) + local above = pointed_thing.above + local under = pointed_thing.under + local wdir = minetest.dir_to_wallmounted({x = under.x - above.x, y = under.y - above.y, z = under.z - above.z}) + if wdir < 1 and not enable_ceiling then + return itemstack + end + local fakestack = itemstack + local retval = false + if wdir <= 1 then + retval = fakestack:set_name("abritorch:floor_"..name) + else + retval = fakestack:set_name("abritorch:wall_"..name) + end + if not retval then + return itemstack + end + itemstack, retval = minetest.item_place(fakestack, placer, pointed_thing, param2) + itemstack:set_name("abritorch:torch_"..name) + + return itemstack + end + }) + + minetest.register_node("abritorch:floor_"..name, { + description = desc.." Torch", + inventory_image = "torch.png^[colorize:#"..colour..":70", + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + drawtype = "mesh", + mesh = "torch_floor.obj", + tiles = { + { + name = "abritorch_torch_on_floor_animated_white.png^[colorize:#"..colour..":70", + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} + } + }, + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + light_source = 13, + groups = {choppy=2, dig_immediate=3, flammable=1, not_in_creative_inventory=1, attached_node=1, torch=1}, + selection_box = { + type = "wallmounted", + wall_top = {-1/16, -2/16, -1/16, 1/16, 0.5, 1/16}, + wall_bottom = {-1/16, -0.5, -1/16, 1/16, 2/16, 1/16}, + }, + }) + + minetest.register_node("abritorch:wall_"..name, { + inventory_image = "torch.png^[colorize:#"..colour..":70", + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + drawtype = "mesh", + mesh = "torch_wall.obj", + tiles = { + { + name = "abritorch_torch_on_floor_animated_white.png^[colorize:#"..colour..":70", + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} + } + }, + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + light_source = 13, + groups = {choppy=2, dig_immediate=3, flammable=1, not_in_creative_inventory=1, attached_node=1, torch=1}, + selection_box = { + type = "wallmounted", + wall_top = {-0.1, -0.1, -0.1, 0.1, 0.5, 0.1}, + wall_bottom = {-0.1, -0.5, -0.1, 0.1, 0.1, 0.1}, + wall_side = {-0.5, -0.3, -0.1, -0.2, 0.3, 0.1}, + }, + }) + + minetest.register_abm({ + nodenames = {"abritorch:torch_"..name}, + interval = 1, + chance = 1, + action = function(pos) + local n = minetest.get_node(pos) + local def = minetest.registered_nodes[n.name] + if n and def then + local wdir = n.param2 + local node_name = "abritorch:wall_"..name + if wdir < 1 and not enable_ceiling then + minetest.remove_node(pos) + return + elseif wdir <= 1 then + node_name = "abritorch:floor_"..name + end + minetest.set_node(pos, {name = node_name, param2 = wdir}) + end + end + }) +end diff --git a/mods/Decorations/beacon/README.md b/mods/Decorations/beacon/README.md new file mode 100644 index 0000000..8a73c1c --- /dev/null +++ b/mods/Decorations/beacon/README.md @@ -0,0 +1,9 @@ +Beacon in Block (LGPLv2.1) (Mrchiantos) + +This mod is made with Beacon'Mod and Block in Block + +Beacon (WTFPL) : https://forum.minetest.net/viewtopic.php?t=12041 (AgentNagel42) + +Block in Block (LGPLv2.1) : https://github.com/TumeniNodes/block_in_block (TuemiNodes) + +Calinou (CC BY-SA 3.0): default_glass_detail.png diff --git a/mods/Decorations/beacon/beamgen.lua b/mods/Decorations/beacon/beamgen.lua new file mode 100644 index 0000000..851c598 --- /dev/null +++ b/mods/Decorations/beacon/beamgen.lua @@ -0,0 +1,40 @@ +color1 = minetest.setting_get("color1") or "292421" +color2 = minetest.setting_get("color2") or "0000FF" +color3 = minetest.setting_get("color3") or "00FF00" +color4 = minetest.setting_get("color4") or "F5F5F5" +color5 = minetest.setting_get("color5") or "FF6103" +color6 = minetest.setting_get("color6") or "FF0000" +color7 = minetest.setting_get("color7") or "FFFF00" +color8 = minetest.setting_get("color8") or "FF69B4" + +local source_list = { + {"black", "Color1", color1}, + {"blue", "Color2", color2}, + {"green", "Color3", color3}, + {"white", "Color4", color4}, + {"orange", "Color5", color5}, + {"red", "Color6", color6}, + {"yellow", "Color7", color7}, + {"pink", "Color8", color8} +} + +for i in ipairs(source_list) do + local color = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + + +minetest.register_abm({ + nodenames = {"beacon:" .. color}, + interval = 5, + chance = 1, + action = function(pos) + pos.y = pos.y + 1 + minetest.add_node(pos, {name="beacon:"..color.."base"}) + for i=1,179 do + minetest.add_node({x=pos.x, y=pos.y+i, z=pos.z}, {name="beacon:"..color.."beam"}) + end + end, +}) + +end diff --git a/mods/Decorations/beacon/beaminit.lua b/mods/Decorations/beacon/beaminit.lua new file mode 100644 index 0000000..2295e95 --- /dev/null +++ b/mods/Decorations/beacon/beaminit.lua @@ -0,0 +1,73 @@ +color1 = minetest.setting_get("color1") or "292421" +color2 = minetest.setting_get("color2") or "0000FF" +color3 = minetest.setting_get("color3") or "00FF00" +color4 = minetest.setting_get("color4") or "F5F5F5" +color5 = minetest.setting_get("color5") or "FF6103" +color6 = minetest.setting_get("color6") or "FF0000" +color7 = minetest.setting_get("color7") or "FFFF00" +color8 = minetest.setting_get("color8") or "FF69B4" + +local source_list = { + {"black", "Color1", color1}, + {"blue", "Color2", color2}, + {"green", "Color3", color3}, + {"white", "Color4", color4}, + {"orange", "Color5", color5}, + {"red", "Color6", color6}, + {"yellow", "Color7", color7}, + {"pink", "Color8", color8} +} + +for i in ipairs(source_list) do + local color = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + +--Blue Beam +minetest.register_node("beacon:"..color.."base", { + visual_scale = 1.0, + drawtype = "plantlike", + tiles = {"beam.png^[colorize:#"..colour..":70" }, + paramtype = "light", + walkable = false, + diggable = false, + light_source = 13, + groups = {not_in_creative_inventory=1} +}) + +minetest.register_node("beacon:"..color.."beam", { + visual_scale = 1.0, + drawtype = "plantlike", + tiles = {"beam.png^[colorize:#"..colour..":70"}, + paramtype = "light", + walkable = false, + diggable = false, + light_source = 50, + groups = {not_in_creative_inventory=1} +}) + +minetest.register_abm({ + nodenames = {"beacon:"..color.."base"}, --makes small particles emanate from the beginning of a beam + interval = 1, + chance = 2, + action = function(pos, node) + minetest.add_particlespawner( + 32, --amount + 4, --time + {x=pos.x-0.25, y=pos.y-0.25, z=pos.z-0.25}, --minpos + {x=pos.x+0.25, y=pos.y+0.25, z=pos.z+0.25}, --maxpos + {x=-0.8, y=-0.8, z=-0.8}, --minvel + {x=0.8, y=0.8, z=0.8}, --maxvel + {x=0,y=0,z=0}, --minacc + {x=0,y=0,z=0}, --maxacc + 0.5, --minexptime + 1, --maxexptime + 1, --minsize + 2, --maxsize + false, --collisiondetection + "particle.png^[colorize:#"..colour..":70" --texture + ) + end, +}) + +end diff --git a/mods/Decorations/beacon/depends.txt b/mods/Decorations/beacon/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/Decorations/beacon/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/Decorations/beacon/description.txt b/mods/Decorations/beacon/description.txt new file mode 100644 index 0000000..973923e --- /dev/null +++ b/mods/Decorations/beacon/description.txt @@ -0,0 +1 @@ +Mix of 2 mods : Beacon and Block in block diff --git a/mods/Decorations/beacon/init.lua b/mods/Decorations/beacon/init.lua new file mode 100644 index 0000000..d78efbb --- /dev/null +++ b/mods/Decorations/beacon/init.lua @@ -0,0 +1,97 @@ +--Beacons v1.1 for minetest // block_in_block | October 2018 TumeniNodes + +--load other scripts +dofile(minetest.get_modpath("beacon").."/beaminit.lua") +dofile(minetest.get_modpath("beacon").."/beamgen.lua") + +color1 = minetest.setting_get("color1") or "292421" +color2 = minetest.setting_get("color2") or "0000FF" +color3 = minetest.setting_get("color3") or "00FF00" +color4 = minetest.setting_get("color4") or "F5F5F5" +color5 = minetest.setting_get("color5") or "FF6103" +color6 = minetest.setting_get("color6") or "FF0000" +color7 = minetest.setting_get("color7") or "FFFF00" +color8 = minetest.setting_get("color8") or "FF69B4" + +local source_list = { + {"black", "Color1", color1}, + {"blue", "Color2", color2}, + {"green", "Color3", color3}, + {"white", "Color4", color4}, + {"orange", "Color5", color5}, + {"red", "Color6", color6}, + {"yellow", "Color7", color7}, + {"pink", "Color8", color8} +} + +for i in ipairs(source_list) do + local color = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + +--code for "unactivated beacon" +minetest.register_node("beacon:empty", { + description = "Unactivated Beacon", + wield_image = "color_handwhite.png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = 'beaconoff.png^[colorize:#'..colour..':70', + tiles = {"color_white.png", "default_glass.png"}, + light_source = 3, + groups = {cracky=3,oddly_breakable_by_hand=3}, +}) + +minetest.register_node("beacon:off" .. color , { + description = "Beacon" .. color, + drawtype = "mesh", + light_source = 13, + mesh = "block_in_block.obj", + wield_image = "color_hand" .. color .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = 'beaconoff.png^[colorize:#'..colour..':70', + tiles = {"color_white.png^[colorize:#"..colour..":70","default_glass.png"}, + paramtype = "light", + is_ground_content = false, + groups = {cracky = 3}, + sounds = default.node_sound_stone_defaults(), + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + } + }, +on_destruct = function(pos) + for i=1,180 do + minetest.remove_node({x=pos.x, y=pos.y+i, z=pos.z}) + end + end +}) + +minetest.register_node("beacon:" .. color , { + description = "Beacon" .. color, + drawtype = "mesh", + light_source = 13, + mesh = "block_in_block.obj", + wield_image = "color_hand" .. color .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = 'beaconon.png^[colorize:#'..colour..':70', + tiles = {"color_white.png^[colorize:#"..colour..":70", "default_glass.png"}, + paramtype = "light", + is_ground_content = false, + groups = {cracky = 3}, + sounds = default.node_sound_stone_defaults(), + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + } + }, +on_destruct = function(pos) + for i=1,180 do + minetest.remove_node({x=pos.x, y=pos.y+i, z=pos.z}) + end + end +}) + +end + +print("[OK] Beacons") diff --git a/mods/Decorations/beacon/mod.conf b/mods/Decorations/beacon/mod.conf new file mode 100644 index 0000000..c82a5f4 --- /dev/null +++ b/mods/Decorations/beacon/mod.conf @@ -0,0 +1 @@ +name = beacon diff --git a/mods/Decorations/beacon/models/block_in_block.blend b/mods/Decorations/beacon/models/block_in_block.blend new file mode 100644 index 0000000..91b9802 Binary files /dev/null and b/mods/Decorations/beacon/models/block_in_block.blend differ diff --git a/mods/Decorations/beacon/models/block_in_block.mtl b/mods/Decorations/beacon/models/block_in_block.mtl new file mode 100644 index 0000000..7c46f1d --- /dev/null +++ b/mods/Decorations/beacon/models/block_in_block.mtl @@ -0,0 +1,24 @@ +# Blender MTL File: 'block_in_block.blend' +# Material Count: 2 + +newmtl Material.001 +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.042654 0.137327 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 +map_Kd /home/paul/Homer/minetest/games/minetest_game/mods/default/textures/default_obsidian_glass.png + +newmtl Material.002 +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.283146 0.640000 0.030032 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 +map_Kd /home/paul/Homer/minetest/games/minetest_game/mods/default/textures/default_gold_block.png diff --git a/mods/Decorations/beacon/textures/beam.png b/mods/Decorations/beacon/textures/beam.png new file mode 100644 index 0000000..c7e0357 Binary files /dev/null and b/mods/Decorations/beacon/textures/beam.png differ diff --git a/mods/Decorations/beacon/textures/color_white.png b/mods/Decorations/beacon/textures/color_white.png new file mode 100644 index 0000000..a6c6ff8 Binary files /dev/null and b/mods/Decorations/beacon/textures/color_white.png differ diff --git a/mods/Decorations/beacon/textures/default_glass.png b/mods/Decorations/beacon/textures/default_glass.png new file mode 100644 index 0000000..da25402 Binary files /dev/null and b/mods/Decorations/beacon/textures/default_glass.png differ diff --git a/mods/Decorations/beacon/textures/particle.png b/mods/Decorations/beacon/textures/particle.png new file mode 100644 index 0000000..520c165 Binary files /dev/null and b/mods/Decorations/beacon/textures/particle.png differ diff --git a/mods/Decorations/beds/README.txt b/mods/Decorations/beds/README.txt new file mode 100644 index 0000000..da42da3 --- /dev/null +++ b/mods/Decorations/beds/README.txt @@ -0,0 +1,47 @@ +===BEDS MOD for MINETEST-C55=== +by PilzAdam & thefamilygrog66 + +Introduction: +This mods brings beds to Minetest. You can use them to sleep at night +to prevent attacks by evil mobs. + +How to install: +Unzip the archive an place it in minetest-base-directory/mods/minetest/ +if you have a windows client or a linux run-in-place client. If you have +a linux system-wide instalation place it in ~/.minetest/mods/minetest/. +If you want to install this mod only in one world create the folder +worldmods/ in your worlddirectory. +For further information or help see: +http://wiki.minetest.com/wiki/Installing_Mods + +How to use the mod: +Craft a bed like this: +white wool white wool white wool +stick stick +After placing it anywhere you can go to sleep with a leftklick with your +hand on the bed. If it is night a chatmessage wishs you "Good night" and +you sleep until the next morning. To go outside the bed it is recommended +to hit the bed again with a leftklick (it also works if you just go away +but its not so safe). +After dying the player will respawn at the last bed he has slept. + +License: +Sourcecode: WTFPL (see below) +Graphics: WTFPL (see below) + +See also: +http://minetest.net/ + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/mods/Decorations/beds/depends.txt b/mods/Decorations/beds/depends.txt new file mode 100644 index 0000000..22ed7be --- /dev/null +++ b/mods/Decorations/beds/depends.txt @@ -0,0 +1,2 @@ +default +color \ No newline at end of file diff --git a/mods/Decorations/beds/init.lua b/mods/Decorations/beds/init.lua new file mode 100644 index 0000000..68053b0 --- /dev/null +++ b/mods/Decorations/beds/init.lua @@ -0,0 +1,175 @@ +local player_in_bed = 0 + +local beds_list = { + {"black", "Darkened", color1, 40, 36, 33}, + {"blue", "Blue", color2, 0, 0, 255}, + {"green", "Green", color3, 0, 255, 0}, + {"white", "White", color4, 245, 245, 245}, + {"orange", "Orange", color5, 255, 97, 3}, + {"red", "Red", color6, 255, 0, 0}, + {"yellow", "Yellow", color7, 255, 255, 0}, + {"pink", "Pink", color8, 255, 105, 180} +} + +for i in ipairs(beds_list) do + local colour = beds_list[i][1] + local beddesc= beds_list[i][2] +local colour2 = beds_list[i][3] + + minetest.register_node("beds:bed_bottom_"..colour, { + description = beddesc, + drawtype = "nodebox", + tiles = {"color_white.png^[colorize:#"..colour2..":70", "color_orange.png", "color_orange.png", "color_orange.png", "color_orange.png", "color_orange.png"}, +wield_image = "color_hand" .. colour .. ".png", + wield_scale = {x=1,y=1,z=0.5}, +inventory_image = "beds.png^[colorize:#".. colour2 .. ":70", + paramtype = "light", + paramtype2 = "facedir", + stack_max = 1, + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + sounds = default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = { + -- bed + {-0.5, -0.25, -0.5, 0.5, 0, 0.5}, + {-0.4375, 0, 0.1, -0.4375, 0, 0.1}, + -- legs + {-0.5, -0.5, -0.5, -0.4, -0.25, -0.4}, + {0.4, -0.25, -0.4, 0.5, -0.5, -0.5}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.3125, 1.5}, + } + }, + + after_place_node = function(pos, placer, itemstack) + local node = minetest.env:get_node(pos) + local p = {x=pos.x, y=pos.y, z=pos.z} + local param2 = node.param2 + node.name = "beds:bed_top_"..colour + if param2 == 0 then + pos.z = pos.z+1 + elseif param2 == 1 then + pos.x = pos.x+1 + elseif param2 == 2 then + pos.z = pos.z-1 + elseif param2 == 3 then + pos.x = pos.x-1 + end + if minetest.registered_nodes[minetest.env:get_node(pos).name].buildable_to then + minetest.env:set_node(pos, node) + else + minetest.env:remove_node(p) + return true + end + end, + + on_destruct = function(pos) + local node = minetest.env:get_node(pos) + local param2 = node.param2 + if param2 == 0 then + pos.z = pos.z+1 + elseif param2 == 1 then + pos.x = pos.x+1 + elseif param2 == 2 then + pos.z = pos.z-1 + elseif param2 == 3 then + pos.x = pos.x-1 + end + if( minetest.env:get_node({x=pos.x, y=pos.y, z=pos.z}).name == "beds:bed_top_"..colour ) then + if( minetest.env:get_node({x=pos.x, y=pos.y, z=pos.z}).param2 == param2 ) then + minetest.env:remove_node(pos) + end + end + end, + + + }) + + minetest.register_node("beds:bed_top_"..colour, { + drawtype = "nodebox", + tiles = {"beds_bed_top_top.png^[colorize:#"..colour2..":70", "color_orange.png", "color_orange.png", "color_orange.png", "color_orange.png", "color_orange.png"}, + paramtype = "light", + paramtype2 = "facedir", +wield_image = "color_hand" .. colour .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + sounds = default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = { + -- bed + {-0.5, -0.25, -0.5, 0.5, 0, 0.5}, + {-0.4375, 0, 0.05, 0.4375, 0.10, 0.45}, + + -- legs + {-0.4, -0.5, 0.4, -0.5, -0.25, 0.5}, + {0.5, -0.25, 0.5, 0.4, -0.5, 0.4}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {0, 0, 0, 0, 0, 0}, + } + }, + }) + + minetest.register_alias("beds:bed_"..colour, "beds:bed_bottom_"..colour) + +end + +beds_player_spawns = {} +local file = io.open(minetest.get_worldpath().."/beds_player_spawns", "r") +if file then + beds_player_spawns = minetest.deserialize(file:read("*all")) + file:close() +end + +local timer = 0 +local wait = false +minetest.register_globalstep(function(dtime) + if timer<2 then + timer = timer+dtime + return + end + timer = 0 + + local players = #minetest.get_connected_players() + if players == player_in_bed and players ~= 0 then + if minetest.env:get_timeofday() < 0.2 or minetest.env:get_timeofday() > 0.805 then + if not wait then + minetest.chat_send_all("Good night!!!") + minetest.after(2, function() + minetest.env:set_timeofday(0.23) + wait = false + end) + wait = true + for _,player in ipairs(minetest.get_connected_players()) do + beds_player_spawns[player:get_player_name()] = player:getpos() + end + local file = io.open(minetest.get_worldpath().."/beds_player_spawns", "w") + if file then + file:write(minetest.serialize(beds_player_spawns)) + file:close() + end + end + end + end +end) + +minetest.register_on_respawnplayer(function(player) + local name = player:get_player_name() + if beds_player_spawns[name] then + player:setpos(beds_player_spawns[name]) + return true + end +end) + +if minetest.setting_get("log_mods") then + minetest.log("action", "beds loaded") +end diff --git a/mods/Decorations/beds/textures/beds_bed.png b/mods/Decorations/beds/textures/beds_bed.png new file mode 100644 index 0000000..c9a6851 Binary files /dev/null and b/mods/Decorations/beds/textures/beds_bed.png differ diff --git a/mods/Decorations/beds/textures/beds_bed1.png b/mods/Decorations/beds/textures/beds_bed1.png new file mode 100644 index 0000000..1b8e8e6 Binary files /dev/null and b/mods/Decorations/beds/textures/beds_bed1.png differ diff --git a/mods/Decorations/beds/textures/beds_bed_side.png b/mods/Decorations/beds/textures/beds_bed_side.png new file mode 100644 index 0000000..a6a4283 Binary files /dev/null and b/mods/Decorations/beds/textures/beds_bed_side.png differ diff --git a/mods/Decorations/beds/textures/beds_bed_side_top_l.png b/mods/Decorations/beds/textures/beds_bed_side_top_l.png new file mode 100644 index 0000000..6ea0202 Binary files /dev/null and b/mods/Decorations/beds/textures/beds_bed_side_top_l.png differ diff --git a/mods/Decorations/beds/textures/beds_bed_side_top_r.png b/mods/Decorations/beds/textures/beds_bed_side_top_r.png new file mode 100644 index 0000000..140c10b Binary files /dev/null and b/mods/Decorations/beds/textures/beds_bed_side_top_r.png differ diff --git a/mods/Decorations/beds/textures/beds_bed_top_front.png b/mods/Decorations/beds/textures/beds_bed_top_front.png new file mode 100644 index 0000000..530f543 Binary files /dev/null and b/mods/Decorations/beds/textures/beds_bed_top_front.png differ diff --git a/mods/Decorations/beds/textures/beds_bed_top_top.png b/mods/Decorations/beds/textures/beds_bed_top_top.png new file mode 100644 index 0000000..d327a5d Binary files /dev/null and b/mods/Decorations/beds/textures/beds_bed_top_top.png differ diff --git a/mods/Decorations/castle_gates/.gitattributes b/mods/Decorations/castle_gates/.gitattributes new file mode 100644 index 0000000..bdb0cab --- /dev/null +++ b/mods/Decorations/castle_gates/.gitattributes @@ -0,0 +1,17 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/mods/Decorations/castle_gates/.gitignore b/mods/Decorations/castle_gates/.gitignore new file mode 100644 index 0000000..cd2946a --- /dev/null +++ b/mods/Decorations/castle_gates/.gitignore @@ -0,0 +1,47 @@ +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# ========================= +# Operating System Files +# ========================= + +# OSX +# ========================= + +.DS_Store +.AppleDouble +.LSOverride + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk diff --git a/mods/Decorations/castle_gates/LICENSE b/mods/Decorations/castle_gates/LICENSE new file mode 100644 index 0000000..5c3c583 --- /dev/null +++ b/mods/Decorations/castle_gates/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Minetest Mods Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/mods/Decorations/castle_gates/README.txt b/mods/Decorations/castle_gates/README.txt new file mode 100644 index 0000000..113bd89 --- /dev/null +++ b/mods/Decorations/castle_gates/README.txt @@ -0,0 +1,11 @@ +Castle Gates + +Licence: MIT + +see: LICENSE + +=-=-=-=-=-=-=-=-=-= + +This is a mod all about creating castle gates and dungeons. It contains dungeon doors and bars, and also a set of nodes for constructing larger swinging and sliding gates. + +This allows the construction of portcullises and drawbridges as well as conventional swinging doors. Use the screwdriver to reorient gate pieces as needed for these purposes. diff --git a/mods/Decorations/castle_gates/api.txt b/mods/Decorations/castle_gates/api.txt new file mode 100644 index 0000000..8d8b4d6 --- /dev/null +++ b/mods/Decorations/castle_gates/api.txt @@ -0,0 +1,76 @@ +This document is intended primarily for modders interested in adding their own gate nodes and gate types. + +This mod allows for additional gate nodes to be defined in other dependent mods that will work seamlessly with existing gate nodes. The following is a minimalist example that shows a node using all of the features offered by this mod's gate API: + +minetest.register_node("castle_gates:example_gate_piece", { + description = "Example gate", + groups = {castle_gate = 1}, + tiles = {"default_wood.png"}, + paramtype2 = "facedir", + on_rightclick = castle_gates.trigger_gate, + _gate_edges = {"right"=true}, + _gate_hinge = {axis="top", offset={"front","left"}}, +}) + +The key features are: + +* paramtype2 = "facedir" (mandatory) +* "castle_gate" group membership (mandatory) +* on_rightclick = castle_gates.trigger_gate (optional, but recommended) +* _gate_edges = (optional) +* _gate_hinge = (optional) + + +Paramtype2 +========== + +All gate pieces must be orientable via facedir. + +Castle_gate group +================= + +When a gate is triggered by right-clicking on a gate node, the gate code does a "flood fill" operation to find all connected gate nodes. This flood fill operation looks for adjacent nodes that belong to the same castle_gate group, so all gate nodes need to belong to this group. + +Gates defined in this mod all belong to castle_gate=1. + +on_rightclick +============= + +The castle_gates.trigger_gate method is a right-click handler that will trigger the movement of the gate. If you want your gate pieces to respond to a player's right click by opening, use this call to make the gate magic happen. + +Note that if you wish you can embed the call to The castle_gates.trigger_gate inside your own on_rightclick function, so that for example you could make a "locked" gate that will only respond to specific players (you may wish to use a different castle_gate group ID for such a gate). Or you can omit this function, in which case the gate piece will still move with the rest of the gate but right-clicking on it will not trigger the gate's movement. + +_gate_edges +=========== + +This is an optional property you can put on a gate node's definition to prevent flood-fill from extending beyond this node in a particular direction. This is useful if, for example, you want players to be able to build double doors that would otherwise connect together when both doors are closed. + +It consists of a table with directions defined as edges set to true. You can use this template: + +_gate_edges = {right=false, left=false, top=false, bottom=false} + +("front" and "back" are also possible but are unlikely to be of any real use) + +Note that the flood-fill search for gate nodes will flow *around* an edge piece if a path exists, the mere fact that there's an edge piece does not guarantee that the door node beyond the edge will not be considered part of the same door as it. + +_gate_hinge +=========== + +The hinge definition for a node def is of the following form: + +_gate_hinge = {axis=, offset=} + + is one of "top", "bottom", "left", "right", "front" or "back". +Top/bottom, left/right and front/back are interchangeable pairings as far as this code is concerned. +These directions are relative to the orientation of the block. Existing gates use "top", so for +maximum compatibility it's advised that new gate hinges are defined with the same axis. + + is optional. If it is not defined, the gate hinge will try to rotate around the center of the node. + + can be a single direction ("top", "bottom", "left", "right", "front", "back"). If a single direction is +given the hinge will try to rotate around the center of the node that lies in that direction relative to the hinge node. + + can also be a pair of directions given in a table. This is how the *edge* of a node can be made into the +center of rotation. For example, existing gate hinges in this mod have the offset {"front","left"}. This means that the +gate will try to rotate around the center of the edge of the node where the front and left faces intersect. +You should only use direction pairs that form a 90 degree angle. \ No newline at end of file diff --git a/mods/Decorations/castle_gates/class_pointset.lua b/mods/Decorations/castle_gates/class_pointset.lua new file mode 100644 index 0000000..3cbbd89 --- /dev/null +++ b/mods/Decorations/castle_gates/class_pointset.lua @@ -0,0 +1,101 @@ +-- A simple special-purpose class, this is used for building up sets of three-dimensional points for fast reference + +Pointset = {} +Pointset.__index = Pointset + +function Pointset.create() + local set = {} + setmetatable(set,Pointset) + set.points = {} + return set +end + +function Pointset:set(x, y, z, value) + -- sets a value in the 3D array "points". + if self.points[x] == nil then + self.points[x] = {} + end + if self.points[x][y] == nil then + self.points[x][y] = {} + end + self.points[x][y][z] = value +end + +function Pointset:set_if_not_in(excluded, x, y, z, value) + -- If a value is not already set for this point in the 3D array "excluded", set it in "points" + if excluded:get(x, y, z) ~= nil then + return + end + self:set(x, y, z, value) +end + +function Pointset:get(x, y, z) + -- return a value from the 3D array "points" + if self.points[x] == nil or self.points[x][y] == nil then + return nil + end + return self.points[x][y][z] +end + +function Pointset:set_pos(pos, value) + self:set(pos.x, pos.y, pos.z, value) +end + +function Pointset:set_pos_if_not_in(excluded, pos, value) + self:set_if_not_in(excluded, pos.x, pos.y, pos.z, value) +end + +function Pointset:get_pos(pos) + return self:get(pos.x, pos.y, pos.z) +end + +function Pointset:pop() + -- returns a point that's in the 3D array, and then removes it. + local pos = {} + local ytable + local ztable + local val + + local count = 0 + for _ in pairs(self.points) do count = count + 1 end + if count == 0 then + return nil + end + + pos.x, ytable = next(self.points) + pos.y, ztable = next(ytable) + pos.z, val = next(ztable) + + self.points[pos.x][pos.y][pos.z] = nil + + count = 0 + for _ in pairs(self.points[pos.x][pos.y]) do count = count + 1 end + if count == 0 then + self.points[pos.x][pos.y] = nil + end + + count = 0 + for _ in pairs(self.points[pos.x]) do count = count + 1 end + if count == 0 then + self.points[pos.x] = nil + end + + return pos, val +end + +function Pointset:get_pos_list(value) + -- Returns a list of all points with the given value in standard Minetest vector format. If no value is provided, returns all points + local outlist = {} + for x, ytable in ipairs(self.points) do + for y, ztable in ipairs(ytable) do + for z, val in ipairs(ztable) do + if (value == nil and val ~= nil ) or val == value then + table.insert(outlist, {x=x, y=y, z=z}) + end + end + end + end + return outlist +end + + \ No newline at end of file diff --git a/mods/Decorations/castle_gates/depends.txt b/mods/Decorations/castle_gates/depends.txt new file mode 100644 index 0000000..acb8d9e --- /dev/null +++ b/mods/Decorations/castle_gates/depends.txt @@ -0,0 +1,6 @@ +default +castle_masonry? +doors? +xpanes? +intllib? +doc? \ No newline at end of file diff --git a/mods/Decorations/castle_gates/description.txt b/mods/Decorations/castle_gates/description.txt new file mode 100644 index 0000000..2399226 --- /dev/null +++ b/mods/Decorations/castle_gates/description.txt @@ -0,0 +1 @@ +This is a mod all about creating castles and castle dungeons. Many of the nodes are used for the outer-walls or dungeons. diff --git a/mods/Decorations/castle_gates/gate_functions.lua b/mods/Decorations/castle_gates/gate_functions.lua new file mode 100644 index 0000000..5d1e6b7 --- /dev/null +++ b/mods/Decorations/castle_gates/gate_functions.lua @@ -0,0 +1,390 @@ +local MP = minetest.get_modpath(minetest.get_current_modname()) +dofile(MP.."/class_pointset.lua") + +-- Given a facedir, returns a set of all the corresponding directions +local get_dirs = function(facedir) + local dirs = {} + local top = {[0]={x=0, y=1, z=0}, + {x=0, y=0, z=1}, + {x=0, y=0, z=-1}, + {x=1, y=0, z=0}, + {x=-1, y=0, z=0}, + {x=0, y=-1, z=0}} + dirs.back = minetest.facedir_to_dir(facedir) + dirs.top = top[math.floor(facedir/4)] + dirs.right = { + x=dirs.top.y*dirs.back.z - dirs.back.y*dirs.top.z, + y=dirs.top.z*dirs.back.x - dirs.back.z*dirs.top.x, + z=dirs.top.x*dirs.back.y - dirs.back.x*dirs.top.y + } + dirs.front = vector.multiply(dirs.back, -1) + dirs.bottom = vector.multiply(dirs.top, -1) + dirs.left = vector.multiply(dirs.right, -1) + return dirs +end + +-- Returns the axis that dir points along +local dir_to_axis = function(dir) + if dir.x ~= 0 then + return "x" + elseif dir.y ~= 0 then + return "y" + else + return "z" + end +end + +-- Given a hinge definition, turns it into an axis and placement that can be used by the door rotation. +local interpret_hinge = function(hinge_def, pos, node_dirs) + local axis = dir_to_axis(node_dirs[hinge_def.axis]) + + local placement + if type(hinge_def.offset) == "string" then + placement = vector.add(pos, node_dirs[hinge_def.offset]) + elseif type(hinge_def.offset) == "table" then + placement = vector.new(0,0,0) + local divisor = 0 + for _, val in pairs(hinge_def.offset) do + placement = vector.add(placement, node_dirs[val]) + divisor = divisor + 1 + end + placement = vector.add(pos, vector.divide(placement, divisor)) + else + placement = pos + end + + return axis, placement +end + + +-------------------------------------------------------------------------- +-- Rotation (slightly more complex than sliding) + +local facedir_rotate = { + ['x'] = { + [-1] = {[0]=4, 5, 6, 7, 22, 23, 20, 21, 0, 1, 2, 3, 13, 14, 15, 12, 19, 16, 17, 18, 10, 11, 8, 9}, -- 270 degrees + [1] = {[0]=8, 9, 10, 11, 0, 1, 2, 3, 22, 23, 20, 21, 15, 12, 13, 14, 17, 18, 19, 16, 6, 7, 4, 5}, -- 90 degrees + }, + ['y'] = { + [-1] = {[0]=3, 0, 1, 2, 19, 16, 17, 18, 15, 12, 13, 14, 7, 4, 5, 6, 11, 8, 9, 10, 21, 22, 23, 20}, -- 270 degrees + [1] = {[0]=1, 2, 3, 0, 13, 14, 15, 12, 17, 18, 19, 16, 9, 10, 11, 8, 5, 6, 7, 4, 23, 20, 21, 22}, -- 90 degrees + }, + ['z'] = { + [-1] = {[0]=16, 17, 18, 19, 5, 6, 7, 4, 11, 8, 9, 10, 0, 1, 2, 3, 20, 21, 22, 23, 12, 13, 14, 15}, -- 270 degrees + [1] = {[0]=12, 13, 14, 15, 7, 4, 5, 6, 9, 10, 11, 8, 20, 21, 22, 23, 0, 1, 2, 3, 16, 17, 18, 19}, -- 90 degrees + } +} + --90 degrees CW about x-axis: (x, y, z) -> (x, -z, y) + --90 degrees CCW about x-axis: (x, y, z) -> (x, z, -y) + --90 degrees CW about y-axis: (x, y, z) -> (-z, y, x) + --90 degrees CCW about y-axis: (x, y, z) -> (z, y, -x) + --90 degrees CW about z-axis: (x, y, z) -> (y, -x, z) + --90 degrees CCW about z-axis: (x, y, z) -> (-y, x, z) +local rotate_pos = function(axis, direction, pos) + if axis == "x" then + if direction < 0 then + return {x= pos.x, y= -pos.z, z= pos.y} + else + return {x= pos.x, y= pos.z, z= -pos.y} + end + elseif axis == "y" then + if direction < 0 then + return {x= -pos.z, y= pos.y, z= pos.x} + else + return {x= pos.z, y= pos.y, z= -pos.x} + end + else + if direction < 0 then + return {x= -pos.y, y= pos.x, z= pos.z} + else + return {x= pos.y, y= -pos.x, z= pos.z} + end + end +end + +local rotate_pos_displaced = function(pos, origin, axis, direction) + -- position in space relative to origin + local newpos = vector.subtract(pos, origin) + newpos = rotate_pos(axis, direction, newpos) + -- Move back to original reference frame + return vector.add(newpos, origin) +end + +local get_buildable_to = function(pos) + return minetest.registered_nodes[minetest.get_node(pos).name].buildable_to +end + + +local get_door_layout = function(pos, facedir, player) + -- This method does a flood-fill looking for all nodes that meet the following criteria: + -- belongs to a "castle_gate" group + -- has the same "back" direction as the initial node + -- is accessible via up, down, left or right directions unless one of those directions goes through an edge that one of the two nodes has marked as a gate edge + local door = {} + + door.all = {} + door.contains_protected_node = false + door.directions = get_dirs(facedir) + door.previous_move = minetest.get_meta(pos):get_string("previous_move") + + -- temporary pointsets used while searching + local to_test = Pointset.create() + local tested = Pointset.create() + local can_slide_to = Pointset.create() + + local castle_gate_group_value -- this will be populated from the first gate node we encounter, which will be the one that was clicked on + + to_test:set_pos(pos, true) + + local test_pos, _ = to_test:pop() + while test_pos ~= nil do + tested:set_pos(test_pos, true) -- track nodes we've looked at + local test_node = minetest.get_node(test_pos) + + if test_node.name == "ignore" then + --array is next to unloaded nodes, too dangerous to do anything. Abort. + return nil + end + + if minetest.is_protected(test_pos, player:get_player_name()) and not minetest.check_player_privs(player, "protection_bypass") then + door.contains_protected_node = true + end + + local test_node_def = minetest.registered_nodes[test_node.name] + can_slide_to:set_pos(test_pos, test_node_def.buildable_to == true) + + if test_node_def.paramtype2 == "facedir" then -- prospective door nodes need to be of type facedir + local test_node_dirs = get_dirs(test_node.param2) + local coplanar = vector.equals(test_node_dirs.back, door.directions.back) -- the "back" vector needs to point in the same direction as the rest of the door + + if castle_gate_group_value == nil and test_node_def.groups.castle_gate ~= nil then + castle_gate_group_value = test_node_def.groups.castle_gate -- read the group value from the first gate node encountered + end + + if coplanar and test_node_def.groups.castle_gate == castle_gate_group_value then + local entry = {["pos"] = test_pos, ["node"] = test_node} + table.insert(door.all, entry) -- it's definitely a gate node of some sort. + if test_node_def._gate_hinge ~= nil then -- it's a hinge type of node, need to do extra work + local axis, placement = interpret_hinge(test_node_def._gate_hinge, test_pos, test_node_dirs) + if door.hinge == nil then -- this is the first hinge we've encountered. + door.hinge = {axis=axis, placement=placement} + door.directions = test_node_dirs -- force the door as a whole to use the same reference frame as the first hinge + elseif door.hinge.axis ~= axis then -- there was a previous hinge. Do they rotate on the same axis? + return nil -- Misaligned hinge axes, door cannot rotate. + else + local axis_dir = {x=0, y=0, z=0} + axis_dir[axis] = 1 + local displacement = vector.normalize(vector.subtract(placement, door.hinge.placement)) -- check if this new hinge is displaced relative to the first hinge on any axis other than the rotation axis + if not (vector.equals(displacement, axis_dir) or vector.equals(displacement, vector.multiply(axis_dir, -1))) then + return nil -- Misaligned hinge offset, door cannot rotate. + end + end + end + + can_slide_to:set_pos(test_pos, true) -- since this is part of the door, other parts of the door can slide into it + + local test_directions = {"top", "bottom", "left", "right"} + for _, dir in pairs(test_directions) do + local adjacent_pos = vector.add(test_pos, door.directions[dir]) + local adjacent_node = minetest.get_node(adjacent_pos) + local adjacent_def = minetest.registered_nodes[adjacent_node.name] + can_slide_to:set_pos(adjacent_pos, adjacent_def.buildable_to == true or adjacent_def.groups.castle_gate) + + if test_node_def._gate_edges == nil or not test_node_def._gate_edges[dir] then -- if we ourselves are an edge node, don't look in the direction we're an edge in + if tested:get_pos(adjacent_pos) == nil then -- don't look at nodes that have already been looked at + if adjacent_def.paramtype2 == "facedir" then -- all doors are facedir nodes so we can pre-screen some targets + + local edge_points_back_at_test_pos = false + -- Look at the adjacent node's definition. If it's got gate edges, check if they point back at us. + if adjacent_def._gate_edges ~= nil then + local adjacent_directions = get_dirs(adjacent_node.param2) + for dir, val in pairs(adjacent_def._gate_edges) do + if vector.equals(vector.add(adjacent_pos, adjacent_directions[dir]), test_pos) then + edge_points_back_at_test_pos = true + break + end + end + end + + if not edge_points_back_at_test_pos then + to_test:set_pos(adjacent_pos, true) + end + end + end + end + end + end + end + + test_pos, _ = to_test:pop() + end + + if door.hinge == nil then + --sliding door, evaluate which directions it can go + door.can_slide = {top=true, bottom=true, left=true, right=true} + for _,door_node in pairs(door.all) do + door.can_slide.top = door.can_slide.top and can_slide_to:get_pos(vector.add(door_node.pos, door.directions.top)) + door.can_slide.bottom = door.can_slide.bottom and can_slide_to:get_pos(vector.add(door_node.pos, door.directions.bottom)) + door.can_slide.left = door.can_slide.left and can_slide_to:get_pos(vector.add(door_node.pos, door.directions.left)) + door.can_slide.right = door.can_slide.right and can_slide_to:get_pos(vector.add(door_node.pos, door.directions.right)) + end + else + --rotating door, evaluate which direction it can go. Slightly more complicated. + local origin = door.hinge.placement + local axis = door.hinge.axis + local backfront = dir_to_axis(door.directions.back) + local leftright = dir_to_axis(door.directions.right) + + door.swings = {} + + for _, direction in pairs({-1, 1}) do + door.swings[direction] = true + for _, door_node in pairs(door.all) do + origin[axis] = door_node.pos[axis] + if not vector.equals(door_node.pos, origin) then -- There's no obstruction if the node is literally located along the rotation axis + local newpos = rotate_pos_displaced(door_node.pos, origin, axis, direction) + local newnode = minetest.get_node(newpos) + local newdef = minetest.registered_nodes[newnode.name] + if not newdef.buildable_to then -- check if the destination node is free. + door.swings[direction] = false + break + end + + local swing_corner = {} -- the corner of the square "arc" that a Minetest gate swings through + local scan_dir + swing_corner[axis] = door_node.pos[axis] + swing_corner[backfront] = newpos[backfront] + swing_corner[leftright] = door_node.pos[leftright] + if not (vector.equals(newpos, swing_corner) or vector.equals(door_node.pos, swing_corner)) then -- we're right next to the hinge, no need for further testing + scan_dir = vector.direction(newpos, swing_corner) -- get the direction from the new door position toward the swing corner + repeat + newpos = vector.add(newpos, scan_dir) -- we start with newpos on the destination node, which has already been tested. + if not get_buildable_to(newpos) then + door.swings[direction] = false + end + until vector.equals(newpos, swing_corner) or door.swings[direction] == false + + if not (vector.equals(newpos, door_node.pos) or door.swings[direction] == false) then + scan_dir = vector.direction(newpos, door_node.pos) + newpos = vector.add(newpos, scan_dir) -- the first step here is a freebie since we've already checked swing_corner + while not (vector.equals(newpos, door_node.pos) or door.swings[direction] == false) do + if not get_buildable_to(newpos) then + door.swings[direction] = false + end + newpos = vector.add(newpos, scan_dir) + end + end + end + end + + if door.swings[direction] == false then + break + end + + end + end + end + return door +end + + +local slide_gate = function(door, direction) + for _, door_node in pairs(door.all) do + door_node.pos = vector.add(door_node.pos, door.directions[direction]) + end + door.previous_move = direction +end + +local rotate_door = function (door, direction) + if not door.swings[direction] then + return false + end + + local origin = door.hinge.placement + local axis = door.hinge.axis + + for _, door_node in pairs(door.all) do + door_node.pos = rotate_pos_displaced(door_node.pos, origin, axis, direction) + door_node.node.param2 = facedir_rotate[axis][direction][door_node.node.param2] + end + return true +end + + +---------------------------------------------------------------------------------------------------- +-- When creating new gate pieces use this as the "on_rightclick" method of their node definitions +-- if you want the player to be able to trigger the gate by clicking on that particular node. +-- If you just want the node to move with the gate and not trigger it this isn't necessary, +-- only the "castle_gate" group is needed for that. + +castle_gates.trigger_gate = function(pos, node, player) + local door = get_door_layout(pos, node.param2, player) + + if door ~= nil then + for _, door_node in pairs(door.all) do + minetest.set_node(door_node.pos, {name="air"}) + end + + local door_moved = false + if door.can_slide ~= nil then -- this is a sliding door + if door.previous_move == "top" and door.can_slide.top then + slide_gate(door, "top") + door_moved = true + elseif door.previous_move == "bottom" and door.can_slide.bottom then + slide_gate(door, "bottom") + door_moved = true + elseif door.previous_move == "left" and door.can_slide.left then + slide_gate(door, "left") + door_moved = true + elseif door.previous_move == "right" and door.can_slide.right then + slide_gate(door, "right") + door_moved = true + end + + if not door_moved then -- reverse door's direction for next time + if door.previous_move == "top" and door.can_slide.bottom then + door.previous_move = "bottom" + elseif door.previous_move == "bottom" and door.can_slide.top then + door.previous_move = "top" + elseif door.previous_move == "left" and door.can_slide.right then + door.previous_move = "right" + elseif door.previous_move == "right" and door.can_slide.left then + door.previous_move = "left" + else + -- find any open direction + for slide_dir, enabled in pairs(door.can_slide) do + if enabled then + door.previous_move = slide_dir + break + end + end + end + end + elseif door.hinge ~= nil then -- this is a hinged door + if door.previous_move == "deosil" then + door_moved = rotate_door(door, 1) + elseif door.previous_move == "widdershins" then + door_moved = rotate_door(door, -1) + end + + if not door_moved then + if door.previous_move == "deosil" then + door.previous_move = "widdershins" + else + door.previous_move = "deosil" + end + end + end + + for _, door_node in pairs(door.all) do + minetest.set_node(door_node.pos, door_node.node) + minetest.get_meta(door_node.pos):set_string("previous_move", door.previous_move) + end + + if door_moved then + minetest.after(1, function() + castle_gates.trigger_gate(door.all[1].pos, door.all[1].node, player) + end) + end + end +end \ No newline at end of file diff --git a/mods/Decorations/castle_gates/gates.lua b/mods/Decorations/castle_gates/gates.lua new file mode 100644 index 0000000..db16753 --- /dev/null +++ b/mods/Decorations/castle_gates/gates.lua @@ -0,0 +1,112 @@ +-- internationalization boilerplate +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP.."/intllib.lua") + +color1 = minetest.setting_get("color1") or "292421" +color2 = minetest.setting_get("color2") or "0000FF" +color3 = minetest.setting_get("color3") or "00FF00" +color4 = minetest.setting_get("color4") or "F5F5F5" +color5 = minetest.setting_get("color5") or "FF6103" +color6 = minetest.setting_get("color6") or "FF0000" +color7 = minetest.setting_get("color7") or "FFFF00" +color8 = minetest.setting_get("color8") or "FF69B4" + +local source_list = { + {"black", "Color1", color1, 40, 36, 33}, + {"blue", "Color2", color2, 0, 0, 255}, + {"green", "Color3", color3, 0, 255, 0}, + {"white", "Color4", color4, 245, 245, 245}, + {"orange", "Color5", color5, 255, 97, 3}, + {"red", "Color6", color6, 255, 0, 0}, + {"yellow", "Color7", color7, 255, 255, 0}, + {"pink", "Color8", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local color = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +-- Herse + +minetest.register_node("castle_gates:herse" .. color, { + drawtype = "nodebox", + description = S("Portcullis Bars"), + groups = {castle_gate = 1, choppy = 1, flow_through = 1}, + wield_image = "color_hand" .. color .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "cgherse.png^[colorize:#"..colour..":70", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + sounds = default.node_sound_wood_defaults(), + paramtype = "light", + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = { + {-0.125, -0.5, -0.5, 0.125, 0.5, -0.25}, -- middle bar + {-0.5, -0.5, -0.5, -0.375, 0.5, -0.25}, -- side bar + {0.375, -0.5, -0.5, 0.5, 0.5, -0.25}, -- side bar + {-0.375, 0.1875, -0.4375, 0.375, 0.3125, -0.3125}, -- crosspiece + {-0.375, -0.3125, -0.4375, 0.375, -0.1875, -0.3125}, -- crosspiece + } + }, + on_rightclick = castle_gates.trigger_gate, +}) + +-- Door + +minetest.register_node("castle_gates:door" ..color ,{ + drawtype = "nodebox", + description = S("Gate Door Edge"), + groups = {choppy = 1, castle_gate = 1}, + wield_image = "color_hand" .. color .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "cgdoor.png^[colorize:#"..colour..":70", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + sounds = default.node_sound_wood_defaults(), + paramtype = "light", + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, -0.25}, + } + }, + _gate_edges = {right=true}, + on_rightclick = castle_gates.trigger_gate, +}) + + +-- Border Door + +minetest.register_node("castle_gates:border" ..color , { + drawtype = "nodebox", + description = S("Gate Door With Hinge"), + wield_image = "color_hand" .. color .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "cgborder.png^[colorize:#"..colour..":70", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + sounds = default.node_sound_wood_defaults(), + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy = 1, castle_gate = 1}, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, -0.25}, + {-10/16, -4/16, -10/16, -6/16, 4/16, -6/16}, + } + }, + collision_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, -0.25}, + }, + + _gate_hinge = {axis="top", offset={"front","left"}}, + on_rightclick = castle_gates.trigger_gate, +}) + +end diff --git a/mods/Decorations/castle_gates/init.lua b/mods/Decorations/castle_gates/init.lua new file mode 100644 index 0000000..6ca881c --- /dev/null +++ b/mods/Decorations/castle_gates/init.lua @@ -0,0 +1,6 @@ +castle_gates = {} + +local modpath = minetest.get_modpath(minetest.get_current_modname()) +dofile(modpath.."/gate_functions.lua") +dofile(modpath.."/gates.lua") + diff --git a/mods/Decorations/castle_gates/intllib.lua b/mods/Decorations/castle_gates/intllib.lua new file mode 100644 index 0000000..6669d72 --- /dev/null +++ b/mods/Decorations/castle_gates/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/Decorations/castle_gates/locale/es.po b/mods/Decorations/castle_gates/locale/es.po new file mode 100644 index 0000000..c102161 --- /dev/null +++ b/mods/Decorations/castle_gates/locale/es.po @@ -0,0 +1,261 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-03-01 23:41-0700\n" +"PO-Revision-Date: 2017-04-28 11:56-0400\n" +"Last-Translator: Carlos Barraza\n" +"Language-Team: LANGUAGE \n" +"Language: Español\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: doc.lua:11 +msgid "Heavy wooden bars designed to prevent entry even to siege equipment." +msgstr "" +"Barras de madera pesadas diseñadas para evitar la entrada incluso a equipo de " +"asedio" + +#: doc.lua:12 +msgid "" +"Place these bars in a structure together and they will slide as a unified " +"gate when clicked on." +msgstr "" +"Coloque estas barras en una estructura juntas y se deslizarán como si " +"estuvieran unidas cuando se le hace clic" + +#: doc.lua:14 +msgid "" +"The bottom edge of a portcullis gate, with knobs to lock securely into the " +"floor." +msgstr "" +"Es el borde inferior de una puerta rastrillo, con perillas para bloquearla con " +"seguridad en el piso" + +#: doc.lua:15 +msgid "" +"This block can be used to define the edge of a portcullius that meets up " +"with another gate, should you have an arrangement like that. Otherwise it's " +"just decorative." +msgstr "" +"Este bloque puede ser usado para definir el borde de una puerta rastrillo " +"que esta cerca de otra puerta, si tiene varias puertas independientes, " +"de lo contrario es simplemente decorativo" + +#: doc.lua:17 +msgid "A basic gate panel." +msgstr "Un panel básico de puerta" + +#: doc.lua:18 +msgid "" +"This gate segment will move in unison with adjoining gate segments when " +"right-clicked." +msgstr "" +"Este segmento de puerta se moverá junto con los demas segmentos de puerta " +"adyacente cuando se haga clic con el botón derecho del ratón" + +#: doc.lua:20 +msgid "A gate panel with a defined edge." +msgstr "Un panel de puerta con un borde." + +#: doc.lua:21 +msgid "" +"The darkened edge of this panel marks the edge of the gate it's a part of. " +"You can use these when building double doors to ensure the two parts swing " +"separately, for example. Note that edges aren't strictly necessary for gates " +"that stand alone." +msgstr "" +"El borde oscurecido de este panel marca el limite de la puerta." +"Usted puede utilizar estos bloques para construir puertas dobles para asegurar " +"que las dos puertas funcionen por separado, por ejemplo. Tenga en cuenta que " +"los bordes no son estrictamente necesarios para las puertas individuales" + +#: doc.lua:23 +msgid "A gate edge with a handle." +msgstr "Un panel de puerta con pestillo" + +#: doc.lua:24 +msgid "" +"The handle is basically decorative, a door this size can be swung by " +"clicking anywhere on it. But the darkened edge of this panel is useful for " +"defining the edge of a gate when it abuts a partner to the side." +msgstr "" +"El pestillo es básicamente decorativo, una puerta de este tamaño se puede " +"abrir haciendo clic en cualquier parte de ella. Pero el borde oscuro de este " +"panel es útil para definir el borde de la puerta cuando hay otra puerta al " +"lado." + +#: doc.lua:26 +msgid "A hinged gate segment that allows a gate to swing." +msgstr "Un segmento de puerta con bisagra permite que la puerta se abra." + +#: doc.lua:27 +msgid "" +"If you have more than one hinge in your gate, make sure the hinges line up " +"correctly otherwise the gate will not be able to swing. The hinge is the " +"protruding block along the edge of the gate panel." +msgstr "" +"Si tiene más de una bisagra en su puerta, asegúrese de que las bisagras se " +"alineen correctamente, de lo contrario la puerta no será capaz de abrirse. " +"la bisagra es el bloque sobresaliente a lo largo del borde del panel de la " +"puerta." + +#: doc.lua:29 +msgid "A block with a slot to allow an adjacent sliding gate through." +msgstr "" +"Un bloque con una ranura en el medio para que una puerta deslizante pueda " +"pasar a través de ella." + +#: doc.lua:30 +msgid "" +"This block is designed to extend into a neighboring node that a sliding gate " +"passes through, to provide a tight seal for the gate to move through without " +"allowing anything else to squeeze in." +msgstr "" +"Este bloque está diseñado para un nodo pueda deslizarse a travéz de este, para " +"proporcionar un cierre hermético que solo deja pasar la puerta sin permitir " +"entrar nada mas." + +#: doc.lua:32 +msgid "" +"A block that extends into an adjacent node to provide a tight seal for a " +"large gate." +msgstr "" +"Un bloque con una ranura en el lado para que una puerta deslizante pueda " +"pasar a través de ella." + +#: doc.lua:33 +msgid "" +"Two nodes cannot occupy the same space, but this block extends into a " +"neighboring node's space to allow for gates to form a tight seal. It can be " +"used with sliding gates or swinging gates." +msgstr "" +"Dos nodos no pueden utilizar el mismo espacio, pero este nodo se extiende al " +"espacio de un nodo vecino para permitir que las puertas formen un cierre " +"hermético. Puede utilizarse con puertas deslizantes y con las puertas que se " +"abren rotando." + +#: doc.lua:37 +msgid "Gates" +msgstr "Puertas" + +#: doc.lua:38 +msgid "" +"Gates are large multi-node constructions that swing on hinges or slide out " +"of the way when triggered." +msgstr "" +"Las puertas grandes son construcciones multi nodo que se abren usando bisagras " +"o se deslizan hacia arriba cuando se activan" + +#: doc.lua:43 +msgid "Gate construction" +msgstr "Construcción de Puertas" + +#: doc.lua:45 +msgid "" +"Gates are multi-node constructions, usually (though not always) consisting " +"of multiple node types that fit together into a unified whole. The " +"orientation of gate nodes is significant, so a screwdriver will be a helpful " +"tool when constructing gates.\n" +"\n" +"A gate's extent is determined by a \"flood fill\" operation. When you " +"trigger a gate block, all compatible neighboring blocks will be considered " +"part of the same structure and will move in unison. Only gate blocks that " +"are aligned with each other will be considered part of the same gate. If you " +"wish to build adjoining gates (for example, a large pair of double doors " +"that meet in the center) you'll need to make use of gate edge blocks to " +"prevent it all from being considered one big door. Note that if your gate " +"does not abut any other gates you don't actually need to define its edges " +"this way - you don't have to use edge blocks in this case.\n" +"\n" +"If a gate has no hinge nodes it will be considered a sliding gate. When " +"triggered, the gate code will search for a direction that the gate can slide " +"in and will move it in that direction at a rate of one block-length per " +"second. Once it reaches an obstruction it will stop, and when triggered " +"again it will try sliding in the opposite direction.\n" +"\n" +"If a gate has hinge nodes then triggering it will cause the gate to try " +"swinging around the hinge. If the gate has multiple hinges and they don't " +"line up properly the gate will be unable to move. Note that the gate can " +"only exist in 90-degree increments of orientation, but the gate still looks " +"for obstructions in the region it is swinging through and will not swing if " +"there's something in the way." +msgstr "" +"Las puertas son generalmente construcciones multi nodo (aunque no siempre), " +"que consisten de múltiples tipos de nodos que se acomodan en un todo " +"unificado. La orientación de los nodos de la puerta es importante, por lo que " +"un destornillador será útil para construir las puertas.\n" +"\n" +"La extención de una puerta se determina mediante una operación de \"Llenado de " +"Inundación\". Al activar un bloque de la puerta, todos los bloques vecinos " +"compatibles se considerán parte de la misma estructura y se moveran al unísono. " +"Sólo los bloques de compuerta que estén alineados entre sí se considerarán " +"parte de la misma puerta. Si desea construir puertas adyacentes (por ejemplo, " +"un gran par de puertas dobles que se abran en el centro) tendrá que hacer uso " +"de bloques de borde de puerta para evitar que todo sea considerado solo una " +"gran puerta. Tenga en cuenta que si su puerta no se apoya en ninguna otra " +"puerta, no necesita usar los bordes de puerta en este caso.\n" +"\n" +"Si una puerta no tiene nodos de bisagra se considerará una puerta deslizante. " +"Cuando se ejecuta el codigo de la puerta buscará una dirección en la que la " +"puerta pueda deslizarse y se moverá en esa dirección a una velocidad de un " +"bloque por segundo. Una vez que llega a una obstrucción se detendrá, y cuando " +"se ejecute de nuevo tratará de deslizarse en la dirección opuesta.\n" +"\n" +"Si una puerta tiene nodos de bisagra, entonces al activar la puerta tratara de " +"girar al rededor de la bisagra. Si la puerta tiene bisagras múltiples y no " +"estan bien alineadas, la puerta no podrá moverse. Tenga en cuenta que la " +"puerta sólo puede existir en incrementos de 90 grados de orientación, pero la " +"puerta todavía busca obstrucciones en la región que está moviéndose y no " +"girara si hay algo en el camino." + + +#: doors.lua:8 +msgid "Oak Door" +msgstr "Puerta de Roble" + +#: doors.lua:22 +msgid "Jail Door" +msgstr "Puerta de Cárcel" + +#: doors.lua:43 +msgid "Jail Bars" +msgstr "" + +#: gate_slots.lua:36 +msgid "Stonebrick" +msgstr "Ladrillo de Piedra" + +#: gate_slots.lua:45 +msgid "@1 Gate Slot" +msgstr "Espacio para Puerta de @1" + +#: gate_slots.lua:70 +msgid "@1 Gate Slot Reverse" +msgstr "Espacio para Puerta Invertido de @1" + +#: gates.lua:7 +msgid "Portcullis Bars" +msgstr "Barras de la Puerta Rastrillo" + +#: gates.lua:37 +msgid "Portcullis Bottom" +msgstr "Terminación de la Puerta Rastrillo" + +#: gates.lua:104 +msgid "Gate Door" +msgstr "Porción de la Puerta" + +#: gates.lua:136 +msgid "Gate Door Edge" +msgstr "Borde de la Puerta" + +#: gates.lua:175 +msgid "Gate Door With Handle" +msgstr "Pestillo de la Puerta" + +#: gates.lua:218 +msgid "Gate Door With Hinge" +msgstr "Bisagra de la Puerta" diff --git a/mods/Decorations/castle_gates/locale/it.po b/mods/Decorations/castle_gates/locale/it.po new file mode 100644 index 0000000..8b5a169 --- /dev/null +++ b/mods/Decorations/castle_gates/locale/it.po @@ -0,0 +1,274 @@ +# ITALIAN LOCALE FILE FOR THE CASTLE GATES MODULE +# Copyright (C) 2017 Philipbenr And DanDuncombe +# This file is distributed under the same license as the CASTLE GATES package. +# Hamlet , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Castle Gates\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-03-01 23:41-0700\n" +"PO-Revision-Date: 2017-09-26 23:51+0100\n" +"Last-Translator: Hamlet \n" +"Language-Team: \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" + +#: doc.lua:11 +msgid "Heavy wooden bars designed to prevent entry even to siege equipment." +msgstr "" +"Pesanti sbarre di legno progettate per impedire l'accesso perfino " +"all'equipaggiamento da assedio." + +#: doc.lua:12 +msgid "" +"Place these bars in a structure together and they will slide as a unified " +"gate when clicked on." +msgstr "" +"Componete una struttura mettendo insieme queste sbarre ed esse scorreranno " +"come un'unica saracinesca quando ci si cliccherà sopra." + +#: doc.lua:14 +msgid "" +"The bottom edge of a portcullis gate, with knobs to lock securely into the " +"floor." +msgstr "" +"La parte inferiore di una saracinesca, con puntali per bloccarsi saldamente " +"nel pavimento." + +#: doc.lua:15 +msgid "" +"This block can be used to define the edge of a portcullius that meets up " +"with another gate, should you have an arrangement like that. Otherwise it's " +"just decorative." +msgstr "" +"Questo blocco può essere usato per definire l'estremità di una saracinesca " +"che si incontra con un'altra, se doveste avere una tale disposizione. " +"Altrimenti è solo decorativo." + +#: doc.lua:17 +msgid "A basic gate panel." +msgstr "Un pannello di base per cancelli, porte e portoni." + +#: doc.lua:18 +msgid "" +"This gate segment will move in unison with adjoining gate segments when " +"right-clicked." +msgstr "" +"Questo segmento si muoverà all'unisono con altri segmenti adiacenti quando " +"cliccato col tasto destro." + +#: doc.lua:20 +msgid "A gate panel with a defined edge." +msgstr "" +"Un pannello per cancelli, porte e portoni avente un'estremità definita." + +#: doc.lua:21 +msgid "" +"The darkened edge of this panel marks the edge of the gate it's a part of. " +"You can use these when building double doors to ensure the two parts swing " +"separately, for example. Note that edges aren't strictly necessary for gates " +"that stand alone." +msgstr "" +"L'estremità annerita di questo pannello contrassegna il bordo del cancello, " +"porta o portone di cui fa parte. Per esempio potete usarla quando costruite " +"doppi battenti per assicurarvi che le due parti ruotino separatamente. Si " +"noti che queste estremità non sono strettamente necessarie per cancelli, " +"porte e portoni a battente singolo." + +#: doc.lua:23 +msgid "A gate edge with a handle." +msgstr "Una estremità di cancello, porta o portone con una maniglia." + +#: doc.lua:24 +msgid "" +"The handle is basically decorative, a door this size can be swung by " +"clicking anywhere on it. But the darkened edge of this panel is useful for " +"defining the edge of a gate when it abuts a partner to the side." +msgstr "" +"Fondamentalmente la maniglia è decorativa, un cancello o porta di queste " +"dimensioni possono essere aperti cliccando un punto qualunque su di essi. Ma " +"il bordo annerito di questo pannello è utile per stabilire la fine di un " +"battente quando confina con un altro." + +#: doc.lua:26 +msgid "A hinged gate segment that allows a gate to swing." +msgstr "" +"Un segmento di cancello, porta o portone provvisto di un cardine che ne " +"consente la rotazione." + +#: doc.lua:27 +msgid "" +"If you have more than one hinge in your gate, make sure the hinges line up " +"correctly otherwise the gate will not be able to swing. The hinge is the " +"protruding block along the edge of the gate panel." +msgstr "" +"Se avete più di un cardine nel vostro cancello, porta o portone, accertatevi " +"che siano allineati correttamente altrimenti non potrà ruotare. Il cardine è " +"la protuberanza lungo il bordo del pannello." + +#: doc.lua:29 +msgid "A block with a slot to allow an adjacent sliding gate through." +msgstr "" +"Un blocco provvisto di una fessura per consentire a una porta scorrevole di " +"scivolarci attraverso." + +#: doc.lua:30 +msgid "" +"This block is designed to extend into a neighboring node that a sliding gate " +"passes through, to provide a tight seal for the gate to move through without " +"allowing anything else to squeeze in." +msgstr "" +"Questo blocco è progettato per estendersi in un nodo vicino attraverso cui " +"scivoli una porta scorrevole, per fornire una chiusura ermetica alla porta o " +"saracinesca che gli passa attraverso senza permettere a niente altro di " +"intrufolarvisi." + +#: doc.lua:32 +msgid "" +"A block that extends into an adjacent node to provide a tight seal for a " +"large gate." +msgstr "" +"Un blocco che si estende in un nodo adiacente per fornire una chiusura " +"ermetica per un portone." + +#: doc.lua:33 +msgid "" +"Two nodes cannot occupy the same space, but this block extends into a " +"neighboring node's space to allow for gates to form a tight seal. It can be " +"used with sliding gates or swinging gates." +msgstr "" +"Due nodi non possono occupare lo stesso spazio, ma questo blocco si estende " +"nello spazio di un nodo vicino per consentire a cancelli, porte, portoni e " +"saracinesche di formare una chiusura ermetica. Può essere usato con porte " +"scorrevoli o a rotazione." + +#: doc.lua:37 +msgid "Gates" +msgstr "Cancelli, porte, portoni e saracinesche" + +#: doc.lua:38 +msgid "" +"Gates are large multi-node constructions that swing on hinges or slide out " +"of the way when triggered." +msgstr "" +"Cancelli, porte, portoni e saracinesche sono costruzioni multi-nodo che " +"quando vengono attivate ruotano su dei cardini o scivolano via." + +#: doc.lua:43 +msgid "Gate construction" +msgstr "Costruzione di cancelli, porte, portoni e saracinesche" + +#: doc.lua:45 +msgid "" +"Gates are multi-node constructions, usually (though not always) consisting " +"of multiple node types that fit together into a unified whole. The " +"orientation of gate nodes is significant, so a screwdriver will be a helpful " +"tool when constructing gates.\n" +"\n" +"A gate's extent is determined by a \"flood fill\" operation. When you " +"trigger a gate block, all compatible neighboring blocks will be considered " +"part of the same structure and will move in unison. Only gate blocks that " +"are aligned with each other will be considered part of the same gate. If you " +"wish to build adjoining gates (for example, a large pair of double doors " +"that meet in the center) you'll need to make use of gate edge blocks to " +"prevent it all from being considered one big door. Note that if your gate " +"does not abut any other gates you don't actually need to define its edges " +"this way - you don't have to use edge blocks in this case.\n" +"\n" +"If a gate has no hinge nodes it will be considered a sliding gate. When " +"triggered, the gate code will search for a direction that the gate can slide " +"in and will move it in that direction at a rate of one block-length per " +"second. Once it reaches an obstruction it will stop, and when triggered " +"again it will try sliding in the opposite direction.\n" +"\n" +"If a gate has hinge nodes then triggering it will cause the gate to try " +"swinging around the hinge. If the gate has multiple hinges and they don't " +"line up properly the gate will be unable to move. Note that the gate can " +"only exist in 90-degree increments of orientation, but the gate still looks " +"for obstructions in the region it is swinging through and will not swing if " +"there's something in the way." +msgstr "" +"Cancelli, porte, portoni e saracinesche sono costruzioni multi-nodo, di " +"solito (anche se non sempre) costituite da molteplici tipi di nodi che si " +"uniscono in un tutt'uno. L'orientamento è importante, perciò un cacciavite " +"sarà uno strumento utile quando si costruiscono cancelli, porte, ecc.\n" +"\n" +"L'estensione di cancelli e simili è stabilita da un'operazione \"flood fill" +"\" (allagamento riempitivo). Quando attivate un blocco di cancello, tutte le " +"parti limitrofe compatibili verranno considerate parte della stessa " +"struttura e si muoveranno all'unisono. Solamente i blocchi che sono " +"allineati l'un l'altro saranno considerati come parte dello stesso cancello. " +"Se desiderate costruire cancelli confinanti (per esempio, un paio di grossi " +"battenti che si incontrano nel mezzo) dovrete fare uso dei blocchi-estremità " +"per impedire che il tutto sia considerato come un'unica grossa porta. Si " +"noti che se il vostro cancello non confina con nessun altro non avete la " +"necessità di definirne le estremità in questo modo - in questo caso non è " +"necessario che usiate blocchi-estremità.\n" +"\n" +"Se un cancello, ecc. non ha nodi coi cardini sarà considerato come " +"scorrevole. Quando attivato, il programma del cancello cercherà una " +"direzione in cui possa scivolare e lo muoverà in quella direzione al passo " +"della distanza di un nodo al secondo. Quando raggiungerà un ostacolo si " +"fermerà, e quando attivato ancora tenterà di scorrere nella direzione " +"opposta.\n" +"\n" +"Se un cancello, ecc. ha dei nodi coi cardini, attivandolo lo si farà ruotare " +"attorno al cardine. Se il cancello ha più cardini e questi non sono " +"allineati correttamente non riuscirà a muoversi. Si noti che il cancello può " +"svilupparsi solo in incrementi di 90° di orientamento, e controllerà la " +"presenza di ostacoli nella zona in cui ruota e non ruoterà se c'è qualcosa " +"di mezzo." + +#: doors.lua:8 +msgid "Oak Door" +msgstr "Porta di quercia" + +#: doors.lua:22 +msgid "Jail Door" +msgstr "Porta della prigione" + +#: doors.lua:43 +msgid "Jail Bars" +msgstr "Sbarre della prigione" + +#: gate_slots.lua:36 +msgid "Stonebrick" +msgstr "Mattoni di pietra" + +#: gate_slots.lua:45 +msgid "@1 Gate Slot" +msgstr "Alloggio di @1 per cancelli, porte, portoni e saracinesche" + +#: gate_slots.lua:70 +msgid "@1 Gate Slot Reverse" +msgstr "" +"Rovescio dell'alloggio di @1 per cancelli, porte, portoni e saracinesche." + +#: gates.lua:7 +msgid "Portcullis Bars" +msgstr "Sbarre della saracinesca" + +#: gates.lua:37 +msgid "Portcullis Bottom" +msgstr "Estremità inferiore della saracinesca" + +#: gates.lua:104 +msgid "Gate Door" +msgstr "Segmento di cancello, porta o portone" + +#: gates.lua:136 +msgid "Gate Door Edge" +msgstr "Estremità di cancello, porta o portone" + +#: gates.lua:175 +msgid "Gate Door With Handle" +msgstr "Cancello, porta o portone con maniglia" + +#: gates.lua:218 +msgid "Gate Door With Hinge" +msgstr "Cancello, porta o portone con cardine" diff --git a/mods/Decorations/castle_gates/locale/template.pot b/mods/Decorations/castle_gates/locale/template.pot new file mode 100644 index 0000000..2122c17 --- /dev/null +++ b/mods/Decorations/castle_gates/locale/template.pot @@ -0,0 +1,202 @@ +# 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-03-01 23:41-0700\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" + +#: doc.lua:11 +msgid "Heavy wooden bars designed to prevent entry even to siege equipment." +msgstr "" + +#: doc.lua:12 +msgid "" +"Place these bars in a structure together and they will slide as a unified " +"gate when clicked on." +msgstr "" + +#: doc.lua:14 +msgid "" +"The bottom edge of a portcullis gate, with knobs to lock securely into the " +"floor." +msgstr "" + +#: doc.lua:15 +msgid "" +"This block can be used to define the edge of a portcullius that meets up " +"with another gate, should you have an arrangement like that. Otherwise it's " +"just decorative." +msgstr "" + +#: doc.lua:17 +msgid "A basic gate panel." +msgstr "" + +#: doc.lua:18 +msgid "" +"This gate segment will move in unison with adjoining gate segments when " +"right-clicked." +msgstr "" + +#: doc.lua:20 +msgid "A gate panel with a defined edge." +msgstr "" + +#: doc.lua:21 +msgid "" +"The darkened edge of this panel marks the edge of the gate it's a part of. " +"You can use these when building double doors to ensure the two parts swing " +"separately, for example. Note that edges aren't strictly necessary for gates " +"that stand alone." +msgstr "" + +#: doc.lua:23 +msgid "A gate edge with a handle." +msgstr "" + +#: doc.lua:24 +msgid "" +"The handle is basically decorative, a door this size can be swung by " +"clicking anywhere on it. But the darkened edge of this panel is useful for " +"defining the edge of a gate when it abuts a partner to the side." +msgstr "" + +#: doc.lua:26 +msgid "A hinged gate segment that allows a gate to swing." +msgstr "" + +#: doc.lua:27 +msgid "" +"If you have more than one hinge in your gate, make sure the hinges line up " +"correctly otherwise the gate will not be able to swing. The hinge is the " +"protruding block along the edge of the gate panel." +msgstr "" + +#: doc.lua:29 +msgid "A block with a slot to allow an adjacent sliding gate through." +msgstr "" + +#: doc.lua:30 +msgid "" +"This block is designed to extend into a neighboring node that a sliding gate " +"passes through, to provide a tight seal for the gate to move through without " +"allowing anything else to squeeze in." +msgstr "" + +#: doc.lua:32 +msgid "" +"A block that extends into an adjacent node to provide a tight seal for a " +"large gate." +msgstr "" + +#: doc.lua:33 +msgid "" +"Two nodes cannot occupy the same space, but this block extends into a " +"neighboring node's space to allow for gates to form a tight seal. It can be " +"used with sliding gates or swinging gates." +msgstr "" + +#: doc.lua:37 +msgid "Gates" +msgstr "" + +#: doc.lua:38 +msgid "" +"Gates are large multi-node constructions that swing on hinges or slide out " +"of the way when triggered." +msgstr "" + +#: doc.lua:43 +msgid "Gate construction" +msgstr "" + +#: doc.lua:45 +msgid "" +"Gates are multi-node constructions, usually (though not always) consisting " +"of multiple node types that fit together into a unified whole. The " +"orientation of gate nodes is significant, so a screwdriver will be a helpful " +"tool when constructing gates.\n" +"\n" +"A gate's extent is determined by a \"flood fill\" operation. When you " +"trigger a gate block, all compatible neighboring blocks will be considered " +"part of the same structure and will move in unison. Only gate blocks that " +"are aligned with each other will be considered part of the same gate. If you " +"wish to build adjoining gates (for example, a large pair of double doors " +"that meet in the center) you'll need to make use of gate edge blocks to " +"prevent it all from being considered one big door. Note that if your gate " +"does not abut any other gates you don't actually need to define its edges " +"this way - you don't have to use edge blocks in this case.\n" +"\n" +"If a gate has no hinge nodes it will be considered a sliding gate. When " +"triggered, the gate code will search for a direction that the gate can slide " +"in and will move it in that direction at a rate of one block-length per " +"second. Once it reaches an obstruction it will stop, and when triggered " +"again it will try sliding in the opposite direction.\n" +"\n" +"If a gate has hinge nodes then triggering it will cause the gate to try " +"swinging around the hinge. If the gate has multiple hinges and they don't " +"line up properly the gate will be unable to move. Note that the gate can " +"only exist in 90-degree increments of orientation, but the gate still looks " +"for obstructions in the region it is swinging through and will not swing if " +"there's something in the way." +msgstr "" + +#: doors.lua:8 +msgid "Oak Door" +msgstr "" + +#: doors.lua:22 +msgid "Jail Door" +msgstr "" + +#: doors.lua:43 +msgid "Jail Bars" +msgstr "" + +#: gate_slots.lua:36 +msgid "Stonebrick" +msgstr "" + +#: gate_slots.lua:45 +msgid "@1 Gate Slot" +msgstr "" + +#: gate_slots.lua:70 +msgid "@1 Gate Slot Reverse" +msgstr "" + +#: gates.lua:7 +msgid "Portcullis Bars" +msgstr "" + +#: gates.lua:37 +msgid "Portcullis Bottom" +msgstr "" + +#: gates.lua:104 +msgid "Gate Door" +msgstr "" + +#: gates.lua:136 +msgid "Gate Door Edge" +msgstr "" + +#: gates.lua:175 +msgid "Gate Door With Handle" +msgstr "" + +#: gates.lua:218 +msgid "Gate Door With Hinge" +msgstr "" diff --git a/mods/Decorations/castle_gates/mod.conf b/mods/Decorations/castle_gates/mod.conf new file mode 100644 index 0000000..1ad7f80 --- /dev/null +++ b/mods/Decorations/castle_gates/mod.conf @@ -0,0 +1 @@ +name = castle_gates diff --git a/mods/Decorations/castle_gates/textures/LICENSE.txt b/mods/Decorations/castle_gates/textures/LICENSE.txt new file mode 100644 index 0000000..38224f3 --- /dev/null +++ b/mods/Decorations/castle_gates/textures/LICENSE.txt @@ -0,0 +1,11 @@ +16 px textures based on Castle mod +original textures by Philipner + +License Textures: Napiophelios - CC-BY-SA 3.0 + +-castle_door_jail.png +-castle_door_oak.png +-castle_jail_door_inv.png +-castle_jailbars.png +-castle_oak_door_inv.png +-castle_steel.png diff --git a/mods/Decorations/castle_gates/textures/castle_door_edge_mask.png b/mods/Decorations/castle_gates/textures/castle_door_edge_mask.png new file mode 100644 index 0000000..59ae96b Binary files /dev/null and b/mods/Decorations/castle_gates/textures/castle_door_edge_mask.png differ diff --git a/mods/Decorations/castle_gates/textures/castle_door_handle_mask.png b/mods/Decorations/castle_gates/textures/castle_door_handle_mask.png new file mode 100644 index 0000000..6417aaf Binary files /dev/null and b/mods/Decorations/castle_gates/textures/castle_door_handle_mask.png differ diff --git a/mods/Decorations/castle_gates/textures/castle_door_jail.png b/mods/Decorations/castle_gates/textures/castle_door_jail.png new file mode 100644 index 0000000..0d4f7bf Binary files /dev/null and b/mods/Decorations/castle_gates/textures/castle_door_jail.png differ diff --git a/mods/Decorations/castle_gates/textures/castle_door_oak.png b/mods/Decorations/castle_gates/textures/castle_door_oak.png new file mode 100644 index 0000000..2282fb2 Binary files /dev/null and b/mods/Decorations/castle_gates/textures/castle_door_oak.png differ diff --git a/mods/Decorations/castle_gates/textures/castle_door_side_mask.png b/mods/Decorations/castle_gates/textures/castle_door_side_mask.png new file mode 100644 index 0000000..039803c Binary files /dev/null and b/mods/Decorations/castle_gates/textures/castle_door_side_mask.png differ diff --git a/mods/Decorations/castle_gates/textures/castle_jail_door_inv.png b/mods/Decorations/castle_gates/textures/castle_jail_door_inv.png new file mode 100644 index 0000000..5121fb8 Binary files /dev/null and b/mods/Decorations/castle_gates/textures/castle_jail_door_inv.png differ diff --git a/mods/Decorations/castle_gates/textures/castle_jailbars.png b/mods/Decorations/castle_gates/textures/castle_jailbars.png new file mode 100644 index 0000000..e2cc911 Binary files /dev/null and b/mods/Decorations/castle_gates/textures/castle_jailbars.png differ diff --git a/mods/Decorations/castle_gates/textures/castle_oak_door_inv.png b/mods/Decorations/castle_gates/textures/castle_oak_door_inv.png new file mode 100644 index 0000000..1122d51 Binary files /dev/null and b/mods/Decorations/castle_gates/textures/castle_oak_door_inv.png differ diff --git a/mods/Decorations/castle_gates/textures/castle_portcullis_mask.png b/mods/Decorations/castle_gates/textures/castle_portcullis_mask.png new file mode 100644 index 0000000..ac5d8e2 Binary files /dev/null and b/mods/Decorations/castle_gates/textures/castle_portcullis_mask.png differ diff --git a/mods/Decorations/castle_gates/textures/castle_steel.png b/mods/Decorations/castle_gates/textures/castle_steel.png new file mode 100644 index 0000000..28ecd60 Binary files /dev/null and b/mods/Decorations/castle_gates/textures/castle_steel.png differ diff --git a/mods/Decorations/castle_shields/LICENSE b/mods/Decorations/castle_shields/LICENSE new file mode 100644 index 0000000..456d091 --- /dev/null +++ b/mods/Decorations/castle_shields/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Minetest Mods Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/mods/Decorations/castle_shields/README.txt b/mods/Decorations/castle_shields/README.txt new file mode 100644 index 0000000..e2b85ce --- /dev/null +++ b/mods/Decorations/castle_shields/README.txt @@ -0,0 +1,25 @@ +=-=-=-=-=-=-=-=-=-= + +Castles Mod +by: Philipbenr And DanDuncombe + +=-=-=-=-=-=-=-=-=-= + +Licence: MIT + +see: LICENSE + +=-=-=-=-=-=-=-=-=-= + +This mod adds decorative wall-mounted shields. It comes with three default shields, but it's very easy to mix and match the colours and patterns to generate additional shields for your server; see default_shields.lua for a good place to insert your own, or make use of the castle_shields.register_shield method in your own mods. + +The three default shields were defined thusly: + +castle_shields.register_shield("shield_1", "Mounted Shield", "red", "blue", "slash") +castle_shields.register_shield("shield_2", "Mounted Shield", "cyan", "yellow", "chevron") +castle_shields.register_shield("shield_3", "Mounted Shield", "grey", "green", "cross") + +The following colors are permitted: + "black", "blue", "brown", "cyan", "dark_green", "dark_grey", "green", "grey", "magenta", "orange", "pink", "red", "violet", "white", "yellow" +The following patterns are permitted: + "slash", "chevron", "cross" \ No newline at end of file diff --git a/mods/Decorations/castle_shields/depends.txt b/mods/Decorations/castle_shields/depends.txt new file mode 100644 index 0000000..6b3b872 --- /dev/null +++ b/mods/Decorations/castle_shields/depends.txt @@ -0,0 +1,3 @@ +default +color +intllib? diff --git a/mods/Decorations/castle_shields/description.txt b/mods/Decorations/castle_shields/description.txt new file mode 100644 index 0000000..8cd8630 --- /dev/null +++ b/mods/Decorations/castle_shields/description.txt @@ -0,0 +1 @@ +Adds decorative wall shields diff --git a/mods/Decorations/castle_shields/init.lua b/mods/Decorations/castle_shields/init.lua new file mode 100644 index 0000000..2c6099a --- /dev/null +++ b/mods/Decorations/castle_shields/init.lua @@ -0,0 +1,78 @@ +castle_shields = {} + +color1 = minetest.setting_get("color1") or "292421" +color2 = minetest.setting_get("color2") or "0000FF" +color3 = minetest.setting_get("color3") or "00FF00" +color4 = minetest.setting_get("color4") or "F5F5F5" +color5 = minetest.setting_get("color5") or "FF6103" +color6 = minetest.setting_get("color6") or "FF0000" +color7 = minetest.setting_get("color7") or "FFFF00" +color8 = minetest.setting_get("color8") or "FF69B4" + +local source_list = { + {"black", "Color1", color1, 40, 36, 33}, + {"blue", "Color2", color2, 0, 0, 255}, + {"green", "Color3", color3, 0, 255, 0}, + {"white", "Color4", color4, 245, 245, 245}, + {"orange", "Color5", color5, 255, 97, 3}, + {"red", "Color6", color6, 255, 0, 0}, + {"yellow", "Color7", color7, 255, 255, 0}, + {"pink", "Color8", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local color = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +-- internationalization boilerplate +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP.."/intllib.lua") + +castle_shields.register_shield = function(name, desc, background_color, foreground_color, mask) + + local tile_side = "color_white.png^[colorize:#"..colour..":70" + local tile_front = "color_white.png^[colorize:#"..colour..":70^(color_black.png^[mask:castle_shield_mask_"..mask..".png)" + + + minetest.register_node(minetest.get_current_modname()..":"..name, { + description = desc, + tiles = {tile_side, tile_side, tile_side, tile_side, "color_black.png", tile_front}, + wield_image = "color_hand" .. color .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "shield"..mask..".png^[colorize:#"..colour..":70", + drawtype="nodebox", + paramtype2 = "facedir", + paramtype = "light", + groups={cracky=3}, + sounds = default.node_sound_metal_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.500000,-0.125000,0.375000,0.500000,0.500000,0.500000}, + {-0.437500,-0.312500,0.375000,0.425000,0.500000,0.500000}, + {-0.312500,-0.437500,0.375000,0.312500,0.500000,0.500000}, + {-0.187500,-0.500000,0.375000,0.187500,0.500000,0.500000}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.500000,-0.500000,0.375000,0.500000,0.500000,0.500000}, + }, + }, + }) + +-- method parameters are name, desc, background_color, foreground_color, pattern + +end + +castle_shields.register_shield("shield_slash" .. color, S("Mounted Shield"), color, "white", "slash") +castle_shields.register_shield("shield_chevron" .. color, S("Mounted Shield"), color, "white", "chevron") +castle_shields.register_shield("shield_cross" .. color, S("Mounted Shield"), color, "white", "cross") + + +end diff --git a/mods/Decorations/castle_shields/intllib.lua b/mods/Decorations/castle_shields/intllib.lua new file mode 100644 index 0000000..6669d72 --- /dev/null +++ b/mods/Decorations/castle_shields/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/Decorations/castle_shields/locale/it.po b/mods/Decorations/castle_shields/locale/it.po new file mode 100644 index 0000000..be34709 --- /dev/null +++ b/mods/Decorations/castle_shields/locale/it.po @@ -0,0 +1,23 @@ +# ITALIAN LOCALE FILE FOR THE CASTLE SHIELDS MODULE +# Copyright (C) 2017 Philipbenr And DanDuncombe +# This file is distributed under the same license as the CASTLE SHIELDS package. +# Hamlet , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Castle Shields\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-25 14:47-0700\n" +"PO-Revision-Date: 2017-09-10 22:38+0100\n" +"Last-Translator: H4mlet \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: it\n" +"X-Generator: Poedit 1.6.10\n" + +#: init.lua:6 init.lua:41 init.lua:75 +msgid "Mounted Shield" +msgstr "Scudo appeso" diff --git a/mods/Decorations/castle_shields/locale/template.pot b/mods/Decorations/castle_shields/locale/template.pot new file mode 100644 index 0000000..bfb347c --- /dev/null +++ b/mods/Decorations/castle_shields/locale/template.pot @@ -0,0 +1,21 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-25 14:47-0700\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: init.lua:6 init.lua:41 init.lua:75 +msgid "Mounted Shield" +msgstr "" diff --git a/mods/Decorations/castle_shields/mod.conf b/mods/Decorations/castle_shields/mod.conf new file mode 100644 index 0000000..5df74cc --- /dev/null +++ b/mods/Decorations/castle_shields/mod.conf @@ -0,0 +1 @@ +name = castle_shields diff --git a/mods/Decorations/castle_shields/textures/castle_shield_mask_chevron.png b/mods/Decorations/castle_shields/textures/castle_shield_mask_chevron.png new file mode 100644 index 0000000..59ffa37 Binary files /dev/null and b/mods/Decorations/castle_shields/textures/castle_shield_mask_chevron.png differ diff --git a/mods/Decorations/castle_shields/textures/castle_shield_mask_cross.png b/mods/Decorations/castle_shields/textures/castle_shield_mask_cross.png new file mode 100644 index 0000000..a032ef4 Binary files /dev/null and b/mods/Decorations/castle_shields/textures/castle_shield_mask_cross.png differ diff --git a/mods/Decorations/castle_shields/textures/castle_shield_mask_slash.png b/mods/Decorations/castle_shields/textures/castle_shield_mask_slash.png new file mode 100644 index 0000000..1bd1174 Binary files /dev/null and b/mods/Decorations/castle_shields/textures/castle_shield_mask_slash.png differ diff --git a/mods/Decorations/castle_shields/textures/none.png b/mods/Decorations/castle_shields/textures/none.png new file mode 100644 index 0000000..07f7b0e Binary files /dev/null and b/mods/Decorations/castle_shields/textures/none.png differ diff --git a/mods/Decorations/castle_shields/textures/shieldchevron.png b/mods/Decorations/castle_shields/textures/shieldchevron.png new file mode 100644 index 0000000..59ffa37 Binary files /dev/null and b/mods/Decorations/castle_shields/textures/shieldchevron.png differ diff --git a/mods/Decorations/castle_shields/textures/shieldcross.png b/mods/Decorations/castle_shields/textures/shieldcross.png new file mode 100644 index 0000000..a032ef4 Binary files /dev/null and b/mods/Decorations/castle_shields/textures/shieldcross.png differ diff --git a/mods/Decorations/castle_shields/textures/shieldslash.png b/mods/Decorations/castle_shields/textures/shieldslash.png new file mode 100644 index 0000000..1bd1174 Binary files /dev/null and b/mods/Decorations/castle_shields/textures/shieldslash.png differ diff --git a/mods/Decorations/comboblock/depends.txt b/mods/Decorations/comboblock/depends.txt new file mode 100644 index 0000000..37e8e61 --- /dev/null +++ b/mods/Decorations/comboblock/depends.txt @@ -0,0 +1 @@ +stairs diff --git a/mods/Decorations/comboblock/init.lua b/mods/Decorations/comboblock/init.lua new file mode 100644 index 0000000..1f39565 --- /dev/null +++ b/mods/Decorations/comboblock/init.lua @@ -0,0 +1,96 @@ +comboblock = {index = { + ["color:blue"] = "stairs:slab_blue", + ["color:black"] = "stairs:slab_black", + ["color:green"] = "stairs:slab_green", + ["color:red"] = "stairs:slab_red", + ["color:yellow"] = "stairs:slab_yellow", + ["color:orange"] = "stairs:slab_orange", + ["color:pink"] = "stairs:slab_pink", + ["color:white"] = "stairs:slab_white", + + }} +local creative = minetest.setting_getbool("creative_mode") +for k,v1 in pairs(comboblock.index) do + local v1_def = minetest.registered_nodes[v1] + local v1_groups = table.copy(v1_def.groups) + v1_groups.not_in_creative_inventory = 1 + local v1_tiles = table.copy(v1_def.tiles) + if not v1_tiles[2] then + v1_tiles[2] = v1_tiles[1] + end + if not v1_tiles[3] then + v1_tiles[3] = v1_tiles[2] + end + if not v1_tiles[4] then + v1_tiles[4] = v1_tiles[3] + end + if not v1_tiles[5] then + v1_tiles[5] = v1_tiles[4] + end + if not v1_tiles[6] then + v1_tiles[6] = v1_tiles[5] + end + for _,v2 in pairs(comboblock.index) do + if v1 ~= v2 then + local v2_def = minetest.registered_nodes[v2] + local v2_tiles = table.copy(v2_def.tiles) + if not v2_tiles[2] then + v2_tiles[2] = v2_tiles[1] + end + if not v2_tiles[3] then + v2_tiles[3] = v2_tiles[2] + end + if not v2_tiles[4] then + v2_tiles[4] = v2_tiles[3] + end + if not v2_tiles[5] then + v2_tiles[5] = v2_tiles[4] + end + if not v2_tiles[6] then + v2_tiles[6] = v2_tiles[5] + end + minetest.register_node("comboblock:"..v1:split(":")[2].."_onc_"..v2:split(":")[2], { + description = v1_def.description.." on "..v2_def.description, + tiles = {v1_tiles[1], v2_tiles[2]}, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "mesh", + mesh = "test.obj", + sounds = v1_def.sounds, + groups = v1_groups, + drop = v1, + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = v2, param2 = oldnode.param2}) + end + }) + end + end + minetest.override_item(v1, { + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.under + if pointed_thing.type ~= "node" or minetest.is_protected(pos, placer:get_player_name()) then + return + end + local node = minetest.get_node(pos) + if node.name == v1 then + minetest.swap_node(pos, {name = k, param2 = 0}) + if not creative then + itemstack:take_item() + return itemstack + end + else + for _,v in pairs(comboblock.index) do + if node.name == v then + minetest.swap_node(pos, {name = "comboblock:"..v1:split(":")[2].."_onc_"..v:split(":")[2], param2 = node.param2}) + if not creative then + itemstack:take_item() + return itemstack + end + return + end + end + return minetest.item_place(itemstack, placer, pointed_thing, param2) + end + end, + }) +end diff --git a/mods/Decorations/comboblock/readme.txt b/mods/Decorations/comboblock/readme.txt new file mode 100644 index 0000000..a7a5df8 --- /dev/null +++ b/mods/Decorations/comboblock/readme.txt @@ -0,0 +1,31 @@ +Comboblock Fork for Blockcolor (Mrchiantos) +Comboblock Original (pithydon) + +License (Model) : CcO with Help MinetestVideo, Thank man. + +License (source code) : +======================================================================= +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/mods/Decorations/combostair/depends.txt b/mods/Decorations/combostair/depends.txt new file mode 100644 index 0000000..37e8e61 --- /dev/null +++ b/mods/Decorations/combostair/depends.txt @@ -0,0 +1 @@ +stairs diff --git a/mods/Decorations/combostair/init.lua b/mods/Decorations/combostair/init.lua new file mode 100644 index 0000000..06e5f69 --- /dev/null +++ b/mods/Decorations/combostair/init.lua @@ -0,0 +1,113 @@ +combostair = {index = { + ["color:blue"] = "stairs:stair_blue", + ["color:black"] = "stairs:stair_black", + ["color:green"] = "stairs:stair_green", + ["color:red"] = "stairs:stair_red", + ["color:yellow"] = "stairs:stair_yellow", + ["color:orange"] = "stairs:stair_orange", + ["color:pink"] = "stairs:stair_pink", + ["color:white"] = "stairs:stair_white", + + }} +local creative = minetest.setting_getbool("creative_mode") +for k,v1 in pairs(combostair.index) do + local v1_def = minetest.registered_nodes[v1] + local v1_groups = table.copy(v1_def.groups) + v1_groups.not_in_creative_inventory = 1 + local v1_tiles = table.copy(v1_def.tiles) + if not v1_tiles[2] then + v1_tiles[2] = v1_tiles[1] + end + if not v1_tiles[3] then + v1_tiles[3] = v1_tiles[2] + end + if not v1_tiles[4] then + v1_tiles[4] = v1_tiles[3] + end + if not v1_tiles[5] then + v1_tiles[5] = v1_tiles[4] + end + if not v1_tiles[6] then + v1_tiles[6] = v1_tiles[5] + end + for _,v2 in pairs(combostair.index) do + if v1 ~= v2 then + local v2_def = minetest.registered_nodes[v2] + local v2_tiles = table.copy(v2_def.tiles) + if not v2_tiles[2] then + v2_tiles[2] = v2_tiles[1] + end + if not v2_tiles[3] then + v2_tiles[3] = v2_tiles[2] + end + if not v2_tiles[4] then + v2_tiles[4] = v2_tiles[3] + end + if not v2_tiles[5] then + v2_tiles[5] = v2_tiles[4] + end + if not v2_tiles[6] then + v2_tiles[6] = v2_tiles[5] + end + minetest.register_node("combostair:"..v1:split(":")[2].."_onc_"..v2:split(":")[2], { + description = v1_def.description.." on "..v2_def.description, + tiles = {v1_tiles[1], v2_tiles[2]}, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "mesh", + mesh = "stair.obj", + + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + }, + }, + + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + }, + }, + + sounds = v1_def.sounds, + groups = v1_groups, + drop = v1, + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name = v2, param2 = oldnode.param2}) + end + }) + end + end + minetest.override_item(v1, { + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.under + if pointed_thing.type ~= "node" or minetest.is_protected(pos, placer:get_player_name()) then + return + end + local node = minetest.get_node(pos) + if node.name == v1 then + minetest.swap_node(pos, {name = k, param2 = 0}) + if not creative then + itemstack:take_item() + return itemstack + end + else + for _,v in pairs(combostair.index) do + if node.name == v then + minetest.swap_node(pos, {name = "combostair:"..v1:split(":")[2].."_onc_"..v:split(":")[2], param2 = node.param2}) + if not creative then + itemstack:take_item() + return itemstack + end + return + end + end + return minetest.item_place(itemstack, placer, pointed_thing, param2) + end + end, + }) +end diff --git a/mods/Decorations/combostair/readme.txt b/mods/Decorations/combostair/readme.txt new file mode 100644 index 0000000..a7a5df8 --- /dev/null +++ b/mods/Decorations/combostair/readme.txt @@ -0,0 +1,31 @@ +Comboblock Fork for Blockcolor (Mrchiantos) +Comboblock Original (pithydon) + +License (Model) : CcO with Help MinetestVideo, Thank man. + +License (source code) : +======================================================================= +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/mods/Decorations/factory_bridges/LICENSE b/mods/Decorations/factory_bridges/LICENSE new file mode 100644 index 0000000..19e3071 --- /dev/null +++ b/mods/Decorations/factory_bridges/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +(This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.) + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random + Hacker. + + {signature of Ty Coon}, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/mods/Decorations/factory_bridges/crafts.lua b/mods/Decorations/factory_bridges/crafts.lua new file mode 100644 index 0000000..ea964a9 --- /dev/null +++ b/mods/Decorations/factory_bridges/crafts.lua @@ -0,0 +1,371 @@ +minetest.register_craft({output = FB.NAME..":i00 200", + recipe ={ + { "", "", "default:steel_ingot", }, + { "", "default:steel_ingot", "", }, + { "default:steel_ingot", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":i01 350", + recipe ={ + { "default:steel_ingot", "default:steel_ingot", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":i02", + recipe ={ + { FB.NAME..":i01", FB.NAME..":i01", FB.NAME..":i01", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b00 10", + recipe ={ + { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot", }, + }, +}) + +minetest.register_craft({output = FB.NAME..":a01", + recipe ={ + { "", FB.NAME..":i01", "", }, + { "", FB.NAME..":i00", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":a05", + recipe ={ + { "", FB.NAME..":i02", "", }, + { FB.NAME..":i00", "", FB.NAME..":i00", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":a13", + recipe ={ + { "", FB.NAME..":i02", FB.NAME..":i00", }, + { "", FB.NAME..":i00", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":a14", + recipe ={ + { FB.NAME..":i00", FB.NAME..":i02", "", }, + { "", FB.NAME..":i00", "", }, + { "", "", "", }, + }, +}) + +minetest.register_craft({output = FB.NAME..":a02", + recipe ={ + { FB.NAME..":a01", "", FB.NAME..":a01", }, + { "", "", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":a03", + recipe ={ + { FB.NAME..":a01", "", FB.NAME..":a01", }, + { "", "", "", }, + { "", "", FB.NAME..":a01", }, + }, +}) +minetest.register_craft({output = FB.NAME..":a04", + recipe ={ + { FB.NAME..":a01", "", FB.NAME..":a01", }, + { "", "", "", }, + { FB.NAME..":a01", "", FB.NAME..":a01", }, + }, +}) +minetest.register_craft({output = FB.NAME..":a06", + recipe ={ + { "", FB.NAME..":a05", "", }, + { "", "", "", }, + { "", "", FB.NAME..":a01", }, + }, +}) +minetest.register_craft({output = FB.NAME..":a07", + recipe ={ + { "", FB.NAME..":a05", "", }, + { "", "", "", }, + { FB.NAME..":a01", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":a08", + recipe ={ + { "", FB.NAME..":a05", "", }, + { "", "", "", }, + { FB.NAME..":a01", "", FB.NAME..":a01", }, + }, +}) +minetest.register_craft({output = FB.NAME..":a09", + recipe ={ + { "", FB.NAME..":a05", "", }, + { FB.NAME..":a05", "", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":a10", + recipe ={ + { "", FB.NAME..":a05", "", }, + { FB.NAME..":a05", "", "", }, + { "", "", FB.NAME..":a01", }, + }, +}) +minetest.register_craft({output = FB.NAME..":a11", + recipe ={ + { "", "", "", }, + { FB.NAME..":a05", "", FB.NAME..":a05", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":a12", + recipe ={ + { "", FB.NAME..":a05", "", }, + { FB.NAME..":a05", "", FB.NAME..":a05", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":a15", + recipe ={ + { "", "", "", }, + { FB.NAME..":a13", "", FB.NAME..":a14", }, + { "", "", "", }, + }, +}) + +minetest.register_craft({output = FB.NAME..":b01", + recipe ={ + { FB.NAME..":a01", "", "", }, + { "", FB.NAME..":b00", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b02", + recipe ={ + { FB.NAME..":a01", "", FB.NAME..":a01", }, + { "", FB.NAME..":b00", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b03", + recipe ={ + { FB.NAME..":a01", "", FB.NAME..":a01", }, + { "", FB.NAME..":b00", "", }, + { "", "", FB.NAME..":a01", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b04", + recipe ={ + { FB.NAME..":a01", "", FB.NAME..":a01", }, + { "", FB.NAME..":b00", "", }, + { FB.NAME..":a01", "", FB.NAME..":a01", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b05", + recipe ={ + { "", FB.NAME..":a05", "", }, + { "", FB.NAME..":b00", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b06", + recipe ={ + { "", FB.NAME..":a05", "", }, + { "", FB.NAME..":b00", "", }, + { "", "", FB.NAME..":a01", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b07", + recipe ={ + { "", FB.NAME..":a05", "", }, + { "", FB.NAME..":b00", "", }, + { FB.NAME..":a01", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b08", + recipe ={ + { "", FB.NAME..":a05", "", }, + { "", FB.NAME..":b00", "", }, + { FB.NAME..":a01", "", FB.NAME..":a01", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b09", + recipe ={ + { "", FB.NAME..":a05", "", }, + { FB.NAME..":a05", FB.NAME..":b00", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b10", + recipe ={ + { "", FB.NAME..":a05", "", }, + { FB.NAME..":a05", FB.NAME..":b00", "", }, + { "", "", FB.NAME..":a01", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b11", + recipe ={ + { "", "", "", }, + { FB.NAME..":a05", FB.NAME..":b00", FB.NAME..":a05", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b12", + recipe ={ + { "", FB.NAME..":a05", "", }, + { FB.NAME..":a05", FB.NAME..":b00", FB.NAME..":a05", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b02", + recipe ={ + { "", FB.NAME..":a02", "", }, + { "", FB.NAME..":b00", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b03", + recipe ={ + { "", FB.NAME..":a03", "", }, + { "", FB.NAME..":b00", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b04", + recipe ={ + { "", FB.NAME..":a04", "", }, + { "", FB.NAME..":b00", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b06", + recipe ={ + { "", FB.NAME..":a06", "", }, + { "", FB.NAME..":b00", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b07", + recipe ={ + { "", FB.NAME..":a07", "", }, + { "", FB.NAME..":b00", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b08", + recipe ={ + { "", FB.NAME..":a08", "", }, + { "", FB.NAME..":b00", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b09", + recipe ={ + { "", FB.NAME..":a09", "", }, + { "", FB.NAME..":b00", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b10", + recipe ={ + { "", FB.NAME..":a10", "", }, + { "", FB.NAME..":b00", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b11", + recipe ={ + { "", FB.NAME..":a11", "", }, + { "", FB.NAME..":b00", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":b12", + recipe ={ + { "", FB.NAME..":a12", "", }, + { "", FB.NAME..":b00", "", }, + { "", "", "", }, + }, +}) + +minetest.register_craft({output = FB.NAME..":c00 2", + recipe ={ + { FB.NAME..":i02", FB.NAME..":b00", "", }, + { FB.NAME..":b00", FB.NAME..":i02", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":c01", + recipe ={ + { "", "", "", }, + { FB.NAME..":a13", FB.NAME..":c00", "", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":c02", + recipe ={ + { "", "", "", }, + { "", FB.NAME..":c00", FB.NAME..":a14", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":c03", + recipe ={ + { "", "", "", }, + { FB.NAME..":a13", FB.NAME..":c00", FB.NAME..":a14", }, + { "", "", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":c03", + recipe ={ + { "", FB.NAME..":a15", "", }, + { "", FB.NAME..":c00", "", }, + { "", "", "", }, + }, +}) + +minetest.register_craft({output = FB.NAME..":d00", + recipe ={ + { "", FB.NAME..":i02", "", }, + { FB.NAME..":i02", FB.NAME..":b00", FB.NAME..":i02", }, + { "", FB.NAME..":i02", "", }, + }, +}) + +minetest.register_craft({output = FB.NAME..":s00", + recipe ={ + { "", FB.NAME..":i00", "", }, + { FB.NAME..":i02", "", FB.NAME..":i02", }, + { "", FB.NAME..":i00", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":s01", + recipe ={ + { FB.NAME..":i02", FB.NAME..":i02", FB.NAME..":i02", }, + { FB.NAME..":i02", FB.NAME..":s00", FB.NAME..":i02", }, + { FB.NAME..":i02", FB.NAME..":i02", FB.NAME..":i02", }, + }, +}) +minetest.register_craft({output = FB.NAME..":s02", + recipe ={ + { FB.NAME..":i02", FB.NAME..":i02", FB.NAME..":i02", }, + { FB.NAME..":i02", "", FB.NAME..":i02", }, + { FB.NAME..":i02", FB.NAME..":i02", FB.NAME..":i02", }, + }, +}) +minetest.register_craft({output = FB.NAME..":s03", + recipe ={ + { FB.NAME..":i02", "", "", }, + { FB.NAME..":i02", FB.NAME..":s00", "", }, + { FB.NAME..":i02", FB.NAME..":i02", "", }, + }, +}) +minetest.register_craft({output = FB.NAME..":s04", + recipe ={ + { "", "", FB.NAME..":i02", }, + { "", FB.NAME..":s00", FB.NAME..":i02", }, + { "", FB.NAME..":i02", FB.NAME..":i02", }, + }, +}) +minetest.register_craft({output = FB.NAME..":s05", + recipe ={ + { "", "", "", }, + { "", FB.NAME..":s00", "", }, + { FB.NAME..":i02", "", FB.NAME..":i02", }, + }, +}) diff --git a/mods/Decorations/factory_bridges/depends.txt b/mods/Decorations/factory_bridges/depends.txt new file mode 100644 index 0000000..a535659 --- /dev/null +++ b/mods/Decorations/factory_bridges/depends.txt @@ -0,0 +1,3 @@ +default +intllib? +color \ No newline at end of file diff --git a/mods/Decorations/factory_bridges/description.txt b/mods/Decorations/factory_bridges/description.txt new file mode 100644 index 0000000..45541e3 --- /dev/null +++ b/mods/Decorations/factory_bridges/description.txt @@ -0,0 +1 @@ +This a fork'mod Factory Bridges for Blockcolor with add Colors to ladders, stair and trap. I not use all nodes and models. diff --git a/mods/Decorations/factory_bridges/init.lua b/mods/Decorations/factory_bridges/init.lua new file mode 100644 index 0000000..542657b --- /dev/null +++ b/mods/Decorations/factory_bridges/init.lua @@ -0,0 +1,13 @@ +FB = {} +FB.NAME = "factory_bridges" + +if (minetest.get_modpath("intllib")) then + FB.LOCAL = intllib.Getter() +else + FB.LOCAL = function(s) return s end +end + +dofile(minetest.get_modpath(FB.NAME).."/models.lua") +dofile(minetest.get_modpath(FB.NAME).."/nodes.lua") +dofile(minetest.get_modpath(FB.NAME).."/items.lua") +dofile(minetest.get_modpath(FB.NAME).."/crafts.lua") \ No newline at end of file diff --git a/mods/Decorations/factory_bridges/items.lua b/mods/Decorations/factory_bridges/items.lua new file mode 100644 index 0000000..5d99f76 --- /dev/null +++ b/mods/Decorations/factory_bridges/items.lua @@ -0,0 +1,14 @@ +minetest.register_craftitem(FB.NAME..":i00", { + description = FB.LOCAL("i00"), + inventory_image = FB.NAME.."_i00.png", +}) + +minetest.register_craftitem(FB.NAME..":i01", { + description = FB.LOCAL("i01"), + inventory_image = FB.NAME.."_i01.png", +}) + +minetest.register_craftitem(FB.NAME..":i02", { + description = FB.LOCAL("i02"), + inventory_image = FB.NAME.."_i02.png", +}) diff --git a/mods/Decorations/factory_bridges/locale/en.txt b/mods/Decorations/factory_bridges/locale/en.txt new file mode 100644 index 0000000..1209102 --- /dev/null +++ b/mods/Decorations/factory_bridges/locale/en.txt @@ -0,0 +1,45 @@ +### nodes.lua ### +a01 = Railing & pole (set 1) +a02 = Railing & pole (set 2) +a03 = Railing & pole (set 3) +a04 = Railing & pole (set 4) +a05 = Railing & pole (set 5) +a06 = Railing & pole (set 6) +a07 = Railing & pole (set 7) +a08 = Railing & pole (set 8) +a09 = Railing & pole (set 9) +a10 = Railing & pole (set 10) +a11 = Railing & pole (set 11) +a12 = Railing & pole (set 12) +a13 = Railing & pole (set 13) +a14 = Railing & pole (set 14) +a15 = Railing & pole (set 15) +b00 = Steel slab +b01 = Steel slab with railing (version 1) +b02 = Steel slab with railing (version 2) +b03 = Steel slab with railing (version 3) +b04 = Steel slab with railing (version 4) +b05 = Steel slab with railing (version 5) +b06 = Steel slab with railing (version 6) +b07 = Steel slab with railing (version 7) +b08 = Steel slab with railing (version 8) +b09 = Steel slab with railing (version 9) +b10 = Steel slab with railing (version 10) +b11 = Steel slab with railing (version 11) +b12 = Steel slab with railing (version 12) +c00 = Steel stair +c01 = Steel stair with left railing +c02 = Steel stair with right railing +c03 = Steel stair with double railing +d00 = Steel trapdoor +d01 = Steel trapdoor (open) +s00 = Steel ladder +s01 = Steel ladder with railing +s02 = Steel ladder with railing (exit) +s03 = Steel ladder with railing (right-exit) +s04 = Steel ladder with railing (left-exit) +s05 = Steel ladder with railing (double-exit) +### items.lua ### +i00 = Rebar +i01 = Handrail +i02 = Long handrail diff --git a/mods/Decorations/factory_bridges/locale/ru.txt b/mods/Decorations/factory_bridges/locale/ru.txt new file mode 100644 index 0000000..4af2a94 --- /dev/null +++ b/mods/Decorations/factory_bridges/locale/ru.txt @@ -0,0 +1,45 @@ +### nodes.lua ### +a01 = Перила и стойки (комплект 1) +a02 = Перила и стойки (комплект 2) +a03 = Перила и стойки (комплект 3) +a04 = Перила и стойки (комплект 4) +a05 = Перила и стойки (комплект 5) +a06 = Перила и стойки (комплект 6) +a07 = Перила и стойки (комплект 7) +a08 = Перила и стойки (комплект 8) +a09 = Перила и стойки (комплект 9) +a10 = Перила и стойки (комплект 10) +a11 = Перила и стойки (комплект 11) +a12 = Перила и стойки (комплект 12) +a13 = Перила и стойки (комплект 13) +a14 = Перила и стойки (комплект 14) +a15 = Перила и стойки (комплект 15) +b00 = Стальная площадка +b01 = Площадка с перилами (вариант 1) +b02 = Площадка с перилами (вариант 2) +b03 = Площадка с перилами (вариант 3) +b04 = Площадка с перилами (вариант 4) +b05 = Площадка с перилами (вариант 5) +b06 = Площадка с перилами (вариант 6) +b07 = Площадка с перилами (вариант 7) +b08 = Площадка с перилами (вариант 8) +b09 = Площадка с перилами (вариант 9) +b10 = Площадка с перилами (вариант 10) +b11 = Площадка с перилами (вариант 11) +b12 = Площадка с перилами (вариант 12) +c00 = Стальные ступеньки +c01 = Стальные ступеньки с левым поручнем +c02 = Стальные ступеньки с правым поручнем +c03 = Стальные ступеньки с двойным поручнем +d00 = Стальной люк +d01 = Стальной люк (открытый) +s00 = Вертикальная лестница +s01 = Закрытая вертикальная лестница +s02 = Выход с лестницы +s03 = Закрытая лестница с выходом направо +s04 = Закрытая лестница с выходом налево +s05 = Закрытая лестница с двусторонним выходом +### items.lua ### +i00 = Арматура +i01 = Поручень +i02 = Длинный поручень diff --git a/mods/Decorations/factory_bridges/models.lua b/mods/Decorations/factory_bridges/models.lua new file mode 100644 index 0000000..8fb70db --- /dev/null +++ b/mods/Decorations/factory_bridges/models.lua @@ -0,0 +1,384 @@ +local s = {l = -0.5, m = 0, h = 0.5, s = 0.01} -- размеры +local e = {} -- элементы +-- x_min y_min z_min x_max y_max z2_max +-- { s.l+000*s.s, s.l+000*s.s, s.l+000*s.s, s.h-000*s.s, s.h-000*s.s, s.h-000*s.s, }, --e.[0] +e.a = { -- 1 x 1 x 0.03 + { s.l+000*s.s, s.l+000*s.s, s.l+000*s.s, s.h-000*s.s, s.l+003*s.s, s.h-000*s.s, }, --e.a[01] нижняя плита + } +e.b = { -- 1 x 0.5 x 0.03 + { s.l+000*s.s, s.l+000*s.s, s.l+000*s.s, s.h-000*s.s, s.l+003*s.s, s.m+000*s.s, }, --e.b[01] нижняя ступенька + { s.l+000*s.s, s.m+000*s.s, s.m+000*s.s, s.h-000*s.s, s.m+003*s.s, s.h-000*s.s, }, --e.b[02] верхняя ступенька + } +e.c = { -- 0.44 x 0.44 x 0.03 + { s.l+006*s.s, s.l+000*s.s, s.l+006*s.s, s.h-006*s.s, s.l+003*s.s, s.h-006*s.s, }, --e.c[01] крышка люка (закрытая) + { s.l+006*s.s, s.l+006*s.s, s.h-006*s.s, s.h-006*s.s, s.h-006*s.s, s.h-003*s.s, }, --e.c[02] крышка люка (открытая) + } +e.d = { -- 1 x 0.06 x 0.03 + { s.l+000*s.s, s.l+000*s.s, s.h-006*s.s, s.h-000*s.s, s.l+003*s.s, s.h-000*s.s, }, --e.d[01] борт люка дальний + { s.h-006*s.s, s.l+000*s.s, s.l+000*s.s, s.h-000*s.s, s.l+003*s.s, s.h-000*s.s, }, --e.d[02] борт люка правый + { s.l+000*s.s, s.l+000*s.s, s.l+000*s.s, s.h-000*s.s, s.l+003*s.s, s.l+006*s.s, }, --e.d[03] борт люка ближний + { s.l+000*s.s, s.l+000*s.s, s.l+000*s.s, s.l+006*s.s, s.l+003*s.s, s.h-000*s.s, }, --e.d[04] борт люка левый + { s.l+000*s.s, s.h-003*s.s, s.h-006*s.s, s.h-000*s.s, s.h-000*s.s, s.h-000*s.s, }, --e.d[05] поручень дальний + { s.h-006*s.s, s.h-003*s.s, s.l+000*s.s, s.h-000*s.s, s.h-000*s.s, s.h-000*s.s, }, --e.d[06] поручень правый + { s.l+000*s.s, s.h-003*s.s, s.l+000*s.s, s.h-000*s.s, s.h-000*s.s, s.l+006*s.s, }, --e.d[07] поручень ближний + { s.l+000*s.s, s.h-003*s.s, s.l+000*s.s, s.l+006*s.s, s.h-000*s.s, s.h-000*s.s, }, --e.d[08] поручень левый + { s.l+000*s.s, s.l+000*s.s, s.h-006*s.s, s.l+003*s.s, s.h-000*s.s, s.h-000*s.s }, --e.d[09] левая дальняя стойка (для вертикальных лестниц) + { s.h-003*s.s, s.l+000*s.s, s.h-006*s.s, s.h+000*s.s, s.h-000*s.s, s.h-000*s.s }, --e.d[10] правая дальняя стойка (для вертикальных лестниц) + { s.l+000*s.s, s.l+000*s.s, s.m+000*s.s, s.l+003*s.s, s.h-000*s.s, s.m-006*s.s }, --e.d[11] левая ближняя стойка (для вертикальных лестниц) + { s.h-003*s.s, s.l+000*s.s, s.m+000*s.s, s.h+000*s.s, s.h-000*s.s, s.m-006*s.s }, --e.d[12] правая ближняя стойка (для вертикальных лестниц) + { s.m-003*s.s, s.l+000*s.s, s.l+000*s.s, s.m+003*s.s, s.h-000*s.s, s.l+003*s.s }, --e.d[13] центральная ближняя стойка (для вертикальных лестниц) + { s.l+003*s.s, s.l+022*s.s, s.l+003*s.s, s.l+006*s.s, s.l+028*s.s, s.h-000*s.s }, --e.d[14] (для вертикальных лестниц) + { s.l+003*s.s, s.h-028*s.s, s.l+003*s.s, s.l+006*s.s, s.h-022*s.s, s.h-000*s.s }, --e.d[15] (для вертикальных лестниц) + { s.h-006*s.s, s.l+022*s.s, s.l+003*s.s, s.h-003*s.s, s.l+028*s.s, s.h-000*s.s }, --e.d[16] (для вертикальных лестниц) + { s.h-006*s.s, s.h-028*s.s, s.l+003*s.s, s.h-003*s.s, s.h-022*s.s, s.h-000*s.s }, --e.d[17] (для вертикальных лестниц) + { s.l+003*s.s, s.l+022*s.s, s.l+003*s.s, s.h-003*s.s, s.l+028*s.s, s.l+006*s.s }, --e.d[18] (для вертикальных лестниц) + { s.l+003*s.s, s.h-028*s.s, s.l+003*s.s, s.h-003*s.s, s.h-022*s.s, s.l+006*s.s }, --e.d[19] (для вертикальных лестниц) + } +e.e = { -- 1 x 0.04 x 0.04 + { s.l+001*s.s, s.l+000*s.s, s.h-005*s.s, s.l+005*s.s, s.h-000*s.s, s.h-001*s.s, }, --e.e[01] стойка угловая левая дальняя + { s.h-005*s.s, s.l+000*s.s, s.h-005*s.s, s.h-001*s.s, s.h-000*s.s, s.h-001*s.s, }, --e.e[02] стойка угловая правая дальняя + { s.h-005*s.s, s.l+000*s.s, s.l+001*s.s, s.h-001*s.s, s.h-000*s.s, s.l+005*s.s, }, --e.e[03] стойка угловая правая ближняя + { s.l+001*s.s, s.l+000*s.s, s.l+001*s.s, s.l+005*s.s, s.h-000*s.s, s.l+005*s.s, }, --e.e[04] стойка угловая левая ближняя + { s.l+023*s.s, s.l+000*s.s, s.h-005*s.s, s.l+027*s.s, s.h-000*s.s, s.h-001*s.s, }, --e.e[05] стойка дальняя левая + { s.h-027*s.s, s.l+000*s.s, s.h-005*s.s, s.h-023*s.s, s.h-000*s.s, s.h-001*s.s, }, --e.e[06] стойка дальняя правая + { s.h-005*s.s, s.l+000*s.s, s.l+023*s.s, s.h-001*s.s, s.h-000*s.s, s.l+027*s.s, }, --e.e[07] стойка правая дальняя + { s.h-005*s.s, s.l+000*s.s, s.h-027*s.s, s.h-001*s.s, s.h-000*s.s, s.h-023*s.s, }, --e.e[08] стойка правая ближняя + { s.h-027*s.s, s.l+000*s.s, s.l+001*s.s, s.h-023*s.s, s.h-000*s.s, s.l+005*s.s, }, --e.e[09] стойка ближняя правая + { s.l+023*s.s, s.l+000*s.s, s.l+001*s.s, s.l+027*s.s, s.h-000*s.s, s.l+005*s.s, }, --e.e[10] стойка ближняя левая + { s.l+001*s.s, s.l+000*s.s, s.l+023*s.s, s.l+005*s.s, s.h-000*s.s, s.l+027*s.s, }, --e.e[11] стойка левая ближняя + { s.l+001*s.s, s.l+000*s.s, s.h-027*s.s, s.l+005*s.s, s.h-000*s.s, s.h-023*s.s, }, --e.e[12] стойка левая дальняя + { s.l+000*s.s, s.l+023*s.s, s.h-005*s.s, s.h-000*s.s, s.l+027*s.s, s.h-001*s.s }, --e.e[13] перекладина нижняя (для вертикальных лестниц) + { s.l+000*s.s, s.h-027*s.s, s.h-005*s.s, s.h-000*s.s, s.h-023*s.s, s.h-001*s.s }, --e.e[14] перекладина верхняя (для вертикальных лестниц) + } +e.f = { -- 0.06 x 0.06 x 0.03 + { s.l+000*s.s, s.h-003*s.s, s.h-006*s.s, s.l+006*s.s, s.h-000*s.s, s.h-000*s.s, }, --e.f[01] уголок поручней левый дальний + { s.h-006*s.s, s.h-003*s.s, s.h-006*s.s, s.h-000*s.s, s.h-000*s.s, s.h-000*s.s, }, --e.f[02] уголок поручней правый дальний + { s.h-006*s.s, s.h-003*s.s, s.l+000*s.s, s.h-000*s.s, s.h-000*s.s, s.l+006*s.s, }, --e.f[03] уголок поручней правый ближний + { s.l+000*s.s, s.h-003*s.s, s.l+000*s.s, s.l+006*s.s, s.h-000*s.s, s.l+006*s.s, }, --e.f[04] уголок поручней левый ближний + } +e.g = { -- 0.06 x 0.03 x 0.03 + { s.l+024*s.s, s.l+003*s.s, s.h-006*s.s, s.l+030*s.s, s.l+006*s.s, s.h-003*s.s, }, --e.g[01] петля люка левая + { s.h-030*s.s, s.l+003*s.s, s.h-006*s.s, s.h-024*s.s, s.l+006*s.s, s.h-003*s.s, }, --e.g[02] петля люка правая + } +e.h = { -- 1.24 x 0.04 x 0.04 + { s.l+001*s.s, s.l+000*s.s, s.l+023*s.s, s.l+005*s.s, s.h+024*s.s, s.l+027*s.s }, --e.h[1] стойка левая ближняя (для ступеньки) + { s.l+001*s.s, s.m+000*s.s, s.h-027*s.s, s.l+005*s.s, s.h+075*s.s, s.h-023*s.s }, --e.h[2] стойка левая дальняя (для ступеньки) + { s.h-001*s.s, s.l+000*s.s, s.l+023*s.s, s.h-005*s.s, s.h+024*s.s, s.l+027*s.s }, --e.h[3] стойка правая ближняя (для ступеньки) + { s.h-001*s.s, s.m+000*s.s, s.h-027*s.s, s.h-005*s.s, s.h+075*s.s, s.h-023*s.s }, --e.h[4] стойка правая дальняя (для ступеньки) + } +e.i = { + { s.l+000*s.s, s.h+000*s.s, s.l+000*s.s, s.l+006*s.s, s.h+003*s.s, s.l+003*s.s }, --e.i[01] левый поручень... + { s.l+000*s.s, s.h+003*s.s, s.l+003*s.s, s.l+006*s.s, s.h+006*s.s, s.l+006*s.s }, + { s.l+000*s.s, s.h+006*s.s, s.l+006*s.s, s.l+006*s.s, s.h+009*s.s, s.l+009*s.s }, + { s.l+000*s.s, s.h+009*s.s, s.l+009*s.s, s.l+006*s.s, s.h+012*s.s, s.l+012*s.s }, + { s.l+000*s.s, s.h+012*s.s, s.l+012*s.s, s.l+006*s.s, s.h+015*s.s, s.l+015*s.s }, + { s.l+000*s.s, s.h+015*s.s, s.l+015*s.s, s.l+006*s.s, s.h+018*s.s, s.l+018*s.s }, + { s.l+000*s.s, s.h+018*s.s, s.l+018*s.s, s.l+006*s.s, s.h+021*s.s, s.l+021*s.s }, + { s.l+000*s.s, s.h+021*s.s, s.l+021*s.s, s.l+006*s.s, s.h+024*s.s, s.l+024*s.s }, + { s.l+000*s.s, s.h+024*s.s, s.l+024*s.s, s.l+006*s.s, s.h+027*s.s, s.l+027*s.s }, + { s.l+000*s.s, s.h+027*s.s, s.l+027*s.s, s.l+006*s.s, s.h+030*s.s, s.l+030*s.s }, + { s.l+000*s.s, s.h+030*s.s, s.l+030*s.s, s.l+006*s.s, s.h+033*s.s, s.l+033*s.s }, + { s.l+000*s.s, s.h+033*s.s, s.l+033*s.s, s.l+006*s.s, s.h+036*s.s, s.l+036*s.s }, + { s.l+000*s.s, s.h+036*s.s, s.l+036*s.s, s.l+006*s.s, s.h+039*s.s, s.l+039*s.s }, + { s.l+000*s.s, s.h+039*s.s, s.l+039*s.s, s.l+006*s.s, s.h+042*s.s, s.l+042*s.s }, + { s.l+000*s.s, s.h+042*s.s, s.l+042*s.s, s.l+006*s.s, s.h+045*s.s, s.l+045*s.s }, + { s.l+000*s.s, s.h+045*s.s, s.l+045*s.s, s.l+006*s.s, s.h+048*s.s, s.l+048*s.s }, + { s.l+000*s.s, s.h+048*s.s, s.l+048*s.s, s.l+006*s.s, s.h+051*s.s, s.l+051*s.s }, + { s.l+000*s.s, s.h+051*s.s, s.l+051*s.s, s.l+006*s.s, s.h+054*s.s, s.l+054*s.s }, + { s.l+000*s.s, s.h+054*s.s, s.l+054*s.s, s.l+006*s.s, s.h+057*s.s, s.l+057*s.s }, + { s.l+000*s.s, s.h+057*s.s, s.l+057*s.s, s.l+006*s.s, s.h+060*s.s, s.l+060*s.s }, + { s.l+000*s.s, s.h+060*s.s, s.l+060*s.s, s.l+006*s.s, s.h+063*s.s, s.l+063*s.s }, + { s.l+000*s.s, s.h+063*s.s, s.l+063*s.s, s.l+006*s.s, s.h+066*s.s, s.l+066*s.s }, + { s.l+000*s.s, s.h+066*s.s, s.l+066*s.s, s.l+006*s.s, s.h+069*s.s, s.l+069*s.s }, + { s.l+000*s.s, s.h+069*s.s, s.l+069*s.s, s.l+006*s.s, s.h+072*s.s, s.l+072*s.s }, + { s.l+000*s.s, s.h+072*s.s, s.l+072*s.s, s.l+006*s.s, s.h+075*s.s, s.l+075*s.s }, + { s.l+000*s.s, s.h+075*s.s, s.l+075*s.s, s.l+006*s.s, s.h+078*s.s, s.l+078*s.s }, + { s.l+000*s.s, s.h+078*s.s, s.l+078*s.s, s.l+006*s.s, s.h+081*s.s, s.l+081*s.s }, + { s.l+000*s.s, s.h+081*s.s, s.l+081*s.s, s.l+006*s.s, s.h+084*s.s, s.l+084*s.s }, + { s.l+000*s.s, s.h+084*s.s, s.l+084*s.s, s.l+006*s.s, s.h+087*s.s, s.l+087*s.s }, + { s.l+000*s.s, s.h+087*s.s, s.l+087*s.s, s.l+006*s.s, s.h+090*s.s, s.l+090*s.s }, + { s.l+000*s.s, s.h+090*s.s, s.l+090*s.s, s.l+006*s.s, s.h+093*s.s, s.l+093*s.s }, + { s.l+000*s.s, s.h+093*s.s, s.l+093*s.s, s.l+006*s.s, s.h+096*s.s, s.l+096*s.s }, + { s.l+000*s.s, s.h+096*s.s, s.l+096*s.s, s.l+006*s.s, s.h+100*s.s, s.l+100*s.s }, --e.i[33] + { s.h-000*s.s, s.h+000*s.s, s.l+000*s.s, s.h-006*s.s, s.h+003*s.s, s.l+003*s.s }, --e.i[34] правый поручень... + { s.h-000*s.s, s.h+003*s.s, s.l+003*s.s, s.h-006*s.s, s.h+006*s.s, s.l+006*s.s }, + { s.h-000*s.s, s.h+006*s.s, s.l+006*s.s, s.h-006*s.s, s.h+009*s.s, s.l+009*s.s }, + { s.h-000*s.s, s.h+009*s.s, s.l+009*s.s, s.h-006*s.s, s.h+012*s.s, s.l+012*s.s }, + { s.h-000*s.s, s.h+012*s.s, s.l+012*s.s, s.h-006*s.s, s.h+015*s.s, s.l+015*s.s }, + { s.h-000*s.s, s.h+015*s.s, s.l+015*s.s, s.h-006*s.s, s.h+018*s.s, s.l+018*s.s }, + { s.h-000*s.s, s.h+018*s.s, s.l+018*s.s, s.h-006*s.s, s.h+021*s.s, s.l+021*s.s }, + { s.h-000*s.s, s.h+021*s.s, s.l+021*s.s, s.h-006*s.s, s.h+024*s.s, s.l+024*s.s }, + { s.h-000*s.s, s.h+024*s.s, s.l+024*s.s, s.h-006*s.s, s.h+027*s.s, s.l+027*s.s }, + { s.h-000*s.s, s.h+027*s.s, s.l+027*s.s, s.h-006*s.s, s.h+030*s.s, s.l+030*s.s }, + { s.h-000*s.s, s.h+030*s.s, s.l+030*s.s, s.h-006*s.s, s.h+033*s.s, s.l+033*s.s }, + { s.h-000*s.s, s.h+033*s.s, s.l+033*s.s, s.h-006*s.s, s.h+036*s.s, s.l+036*s.s }, + { s.h-000*s.s, s.h+036*s.s, s.l+036*s.s, s.h-006*s.s, s.h+039*s.s, s.l+039*s.s }, + { s.h-000*s.s, s.h+039*s.s, s.l+039*s.s, s.h-006*s.s, s.h+042*s.s, s.l+042*s.s }, + { s.h-000*s.s, s.h+042*s.s, s.l+042*s.s, s.h-006*s.s, s.h+045*s.s, s.l+045*s.s }, + { s.h-000*s.s, s.h+045*s.s, s.l+045*s.s, s.h-006*s.s, s.h+048*s.s, s.l+048*s.s }, + { s.h-000*s.s, s.h+048*s.s, s.l+048*s.s, s.h-006*s.s, s.h+051*s.s, s.l+051*s.s }, + { s.h-000*s.s, s.h+051*s.s, s.l+051*s.s, s.h-006*s.s, s.h+054*s.s, s.l+054*s.s }, + { s.h-000*s.s, s.h+054*s.s, s.l+054*s.s, s.h-006*s.s, s.h+057*s.s, s.l+057*s.s }, + { s.h-000*s.s, s.h+057*s.s, s.l+057*s.s, s.h-006*s.s, s.h+060*s.s, s.l+060*s.s }, + { s.h-000*s.s, s.h+060*s.s, s.l+060*s.s, s.h-006*s.s, s.h+063*s.s, s.l+063*s.s }, + { s.h-000*s.s, s.h+063*s.s, s.l+063*s.s, s.h-006*s.s, s.h+066*s.s, s.l+066*s.s }, + { s.h-000*s.s, s.h+066*s.s, s.l+066*s.s, s.h-006*s.s, s.h+069*s.s, s.l+069*s.s }, + { s.h-000*s.s, s.h+069*s.s, s.l+069*s.s, s.h-006*s.s, s.h+072*s.s, s.l+072*s.s }, + { s.h-000*s.s, s.h+072*s.s, s.l+072*s.s, s.h-006*s.s, s.h+075*s.s, s.l+075*s.s }, + { s.h-000*s.s, s.h+075*s.s, s.l+075*s.s, s.h-006*s.s, s.h+078*s.s, s.l+078*s.s }, + { s.h-000*s.s, s.h+078*s.s, s.l+078*s.s, s.h-006*s.s, s.h+081*s.s, s.l+081*s.s }, + { s.h-000*s.s, s.h+081*s.s, s.l+081*s.s, s.h-006*s.s, s.h+084*s.s, s.l+084*s.s }, + { s.h-000*s.s, s.h+084*s.s, s.l+084*s.s, s.h-006*s.s, s.h+087*s.s, s.l+087*s.s }, + { s.h-000*s.s, s.h+087*s.s, s.l+087*s.s, s.h-006*s.s, s.h+090*s.s, s.l+090*s.s }, + { s.h-000*s.s, s.h+090*s.s, s.l+090*s.s, s.h-006*s.s, s.h+093*s.s, s.l+093*s.s }, + { s.h-000*s.s, s.h+093*s.s, s.l+093*s.s, s.h-006*s.s, s.h+096*s.s, s.l+096*s.s }, + { s.h-000*s.s, s.h+096*s.s, s.l+096*s.s, s.h-006*s.s, s.h+100*s.s, s.l+100*s.s }, --e.i[66] + } +e.j = { + { s.l+000*s.s, s.l+000*s.s, s.l+012*s.s, s.l+001*s.s, s.l+003*s.s, s.l+033*s.s }, --e.j[01] левое крепление... + { s.l+000*s.s, s.l+003*s.s, s.l+015*s.s, s.l+001*s.s, s.l+006*s.s, s.l+035*s.s }, + { s.l+000*s.s, s.l+006*s.s, s.l+018*s.s, s.l+001*s.s, s.l+009*s.s, s.l+038*s.s }, + { s.l+000*s.s, s.l+009*s.s, s.l+021*s.s, s.l+001*s.s, s.l+012*s.s, s.l+041*s.s }, + { s.l+000*s.s, s.l+012*s.s, s.l+024*s.s, s.l+001*s.s, s.l+015*s.s, s.l+044*s.s }, + { s.l+000*s.s, s.l+015*s.s, s.l+027*s.s, s.l+001*s.s, s.l+018*s.s, s.l+047*s.s }, + { s.l+000*s.s, s.l+018*s.s, s.l+030*s.s, s.l+001*s.s, s.l+021*s.s, s.l+050*s.s }, + { s.l+000*s.s, s.l+021*s.s, s.l+033*s.s, s.l+001*s.s, s.l+024*s.s, s.l+053*s.s }, + { s.l+000*s.s, s.l+024*s.s, s.l+036*s.s, s.l+001*s.s, s.l+027*s.s, s.l+056*s.s }, + { s.l+000*s.s, s.l+027*s.s, s.l+039*s.s, s.l+001*s.s, s.l+030*s.s, s.l+059*s.s }, + { s.l+000*s.s, s.l+030*s.s, s.l+041*s.s, s.l+001*s.s, s.l+033*s.s, s.l+062*s.s }, + { s.l+000*s.s, s.l+033*s.s, s.l+044*s.s, s.l+001*s.s, s.l+036*s.s, s.l+065*s.s }, + { s.l+000*s.s, s.l+036*s.s, s.l+047*s.s, s.l+001*s.s, s.l+039*s.s, s.l+068*s.s }, + { s.l+000*s.s, s.l+039*s.s, s.l+050*s.s, s.l+001*s.s, s.l+042*s.s, s.l+071*s.s }, + { s.l+000*s.s, s.l+042*s.s, s.l+053*s.s, s.l+001*s.s, s.l+045*s.s, s.l+074*s.s }, + { s.l+000*s.s, s.l+045*s.s, s.l+056*s.s, s.l+001*s.s, s.l+048*s.s, s.l+077*s.s }, + { s.l+000*s.s, s.l+048*s.s, s.l+059*s.s, s.l+001*s.s, s.l+051*s.s, s.l+080*s.s }, + { s.l+000*s.s, s.l+051*s.s, s.l+062*s.s, s.l+001*s.s, s.l+054*s.s, s.l+083*s.s }, + { s.l+000*s.s, s.l+054*s.s, s.l+065*s.s, s.l+001*s.s, s.l+057*s.s, s.l+086*s.s }, + { s.l+000*s.s, s.l+057*s.s, s.l+068*s.s, s.l+001*s.s, s.l+060*s.s, s.l+089*s.s }, + { s.l+000*s.s, s.l+060*s.s, s.l+071*s.s, s.l+001*s.s, s.l+063*s.s, s.l+092*s.s }, + { s.l+000*s.s, s.l+063*s.s, s.l+074*s.s, s.l+001*s.s, s.l+066*s.s, s.l+095*s.s }, + { s.l+000*s.s, s.l+066*s.s, s.l+077*s.s, s.l+001*s.s, s.l+069*s.s, s.l+098*s.s }, + { s.l+000*s.s, s.l+069*s.s, s.l+080*s.s, s.l+001*s.s, s.l+072*s.s, s.l+101*s.s }, + { s.l+000*s.s, s.l+072*s.s, s.l+083*s.s, s.l+001*s.s, s.l+075*s.s, s.l+104*s.s }, + { s.l+000*s.s, s.l+075*s.s, s.l+086*s.s, s.l+001*s.s, s.l+078*s.s, s.l+107*s.s }, + { s.l+000*s.s, s.l+078*s.s, s.l+089*s.s, s.l+001*s.s, s.l+081*s.s, s.l+110*s.s }, + { s.l+000*s.s, s.l+081*s.s, s.l+092*s.s, s.l+001*s.s, s.l+084*s.s, s.l+113*s.s }, + { s.l+000*s.s, s.l+084*s.s, s.l+095*s.s, s.l+001*s.s, s.l+087*s.s, s.l+116*s.s }, + { s.l+000*s.s, s.l+087*s.s, s.l+098*s.s, s.l+001*s.s, s.l+090*s.s, s.l+119*s.s }, + { s.l+000*s.s, s.l+090*s.s, s.l+101*s.s, s.l+001*s.s, s.l+093*s.s, s.l+121*s.s }, + { s.l+000*s.s, s.l+093*s.s, s.l+104*s.s, s.l+001*s.s, s.l+096*s.s, s.l+124*s.s }, + { s.l+000*s.s, s.l+096*s.s, s.l+107*s.s, s.l+001*s.s, s.l+099*s.s, s.l+127*s.s }, + { s.l+000*s.s, s.l+099*s.s, s.l+110*s.s, s.l+001*s.s, s.l+102*s.s, s.l+130*s.s }, --e.j[34] + { s.h-000*s.s, s.l+000*s.s, s.l+012*s.s, s.h-001*s.s, s.l+003*s.s, s.l+033*s.s }, --e.j[35] правое крепление + { s.h-000*s.s, s.l+003*s.s, s.l+015*s.s, s.h-001*s.s, s.l+006*s.s, s.l+035*s.s }, + { s.h-000*s.s, s.l+006*s.s, s.l+018*s.s, s.h-001*s.s, s.l+009*s.s, s.l+038*s.s }, + { s.h-000*s.s, s.l+009*s.s, s.l+021*s.s, s.h-001*s.s, s.l+012*s.s, s.l+041*s.s }, + { s.h-000*s.s, s.l+012*s.s, s.l+024*s.s, s.h-001*s.s, s.l+015*s.s, s.l+044*s.s }, + { s.h-000*s.s, s.l+015*s.s, s.l+027*s.s, s.h-001*s.s, s.l+018*s.s, s.l+047*s.s }, + { s.h-000*s.s, s.l+018*s.s, s.l+030*s.s, s.h-001*s.s, s.l+021*s.s, s.l+050*s.s }, + { s.h-000*s.s, s.l+021*s.s, s.l+033*s.s, s.h-001*s.s, s.l+024*s.s, s.l+053*s.s }, + { s.h-000*s.s, s.l+024*s.s, s.l+036*s.s, s.h-001*s.s, s.l+027*s.s, s.l+056*s.s }, + { s.h-000*s.s, s.l+027*s.s, s.l+039*s.s, s.h-001*s.s, s.l+030*s.s, s.l+059*s.s }, + { s.h-000*s.s, s.l+030*s.s, s.l+041*s.s, s.h-001*s.s, s.l+033*s.s, s.l+062*s.s }, + { s.h-000*s.s, s.l+033*s.s, s.l+044*s.s, s.h-001*s.s, s.l+036*s.s, s.l+065*s.s }, + { s.h-000*s.s, s.l+036*s.s, s.l+047*s.s, s.h-001*s.s, s.l+039*s.s, s.l+068*s.s }, + { s.h-000*s.s, s.l+039*s.s, s.l+050*s.s, s.h-001*s.s, s.l+042*s.s, s.l+071*s.s }, + { s.h-000*s.s, s.l+042*s.s, s.l+053*s.s, s.h-001*s.s, s.l+045*s.s, s.l+074*s.s }, + { s.h-000*s.s, s.l+045*s.s, s.l+056*s.s, s.h-001*s.s, s.l+048*s.s, s.l+077*s.s }, + { s.h-000*s.s, s.l+048*s.s, s.l+059*s.s, s.h-001*s.s, s.l+051*s.s, s.l+080*s.s }, + { s.h-000*s.s, s.l+051*s.s, s.l+062*s.s, s.h-001*s.s, s.l+054*s.s, s.l+083*s.s }, + { s.h-000*s.s, s.l+054*s.s, s.l+065*s.s, s.h-001*s.s, s.l+057*s.s, s.l+086*s.s }, + { s.h-000*s.s, s.l+057*s.s, s.l+068*s.s, s.h-001*s.s, s.l+060*s.s, s.l+089*s.s }, + { s.h-000*s.s, s.l+060*s.s, s.l+071*s.s, s.h-001*s.s, s.l+063*s.s, s.l+092*s.s }, + { s.h-000*s.s, s.l+063*s.s, s.l+074*s.s, s.h-001*s.s, s.l+066*s.s, s.l+095*s.s }, + { s.h-000*s.s, s.l+066*s.s, s.l+077*s.s, s.h-001*s.s, s.l+069*s.s, s.l+098*s.s }, + { s.h-000*s.s, s.l+069*s.s, s.l+080*s.s, s.h-001*s.s, s.l+072*s.s, s.l+101*s.s }, + { s.h-000*s.s, s.l+072*s.s, s.l+083*s.s, s.h-001*s.s, s.l+075*s.s, s.l+104*s.s }, + { s.h-000*s.s, s.l+075*s.s, s.l+086*s.s, s.h-001*s.s, s.l+078*s.s, s.l+107*s.s }, + { s.h-000*s.s, s.l+078*s.s, s.l+089*s.s, s.h-001*s.s, s.l+081*s.s, s.l+110*s.s }, + { s.h-000*s.s, s.l+081*s.s, s.l+092*s.s, s.h-001*s.s, s.l+084*s.s, s.l+113*s.s }, + { s.h-000*s.s, s.l+084*s.s, s.l+095*s.s, s.h-001*s.s, s.l+087*s.s, s.l+116*s.s }, + { s.h-000*s.s, s.l+087*s.s, s.l+098*s.s, s.h-001*s.s, s.l+090*s.s, s.l+119*s.s }, + { s.h-000*s.s, s.l+090*s.s, s.l+101*s.s, s.h-001*s.s, s.l+093*s.s, s.l+121*s.s }, + { s.h-000*s.s, s.l+093*s.s, s.l+104*s.s, s.h-001*s.s, s.l+096*s.s, s.l+124*s.s }, + { s.h-000*s.s, s.l+096*s.s, s.l+107*s.s, s.h-001*s.s, s.l+099*s.s, s.l+127*s.s }, + { s.h-000*s.s, s.l+099*s.s, s.l+110*s.s, s.h-001*s.s, s.l+102*s.s, s.l+130*s.s }, --e.j[68] + } + +e.k = { -- 1.24 x 0.04 x 0.04 + { s.l+001*s.s, s.l-100*s.s, s.l+023*s.s, s.l+005*s.s, s.l+024*s.s, s.l+027*s.s }, --e.h[1] стойка левая ближняя (для ступеньки) + { s.l+001*s.s, s.l-050*s.s, s.h-027*s.s, s.l+005*s.s, s.l+075*s.s, s.h-023*s.s }, --e.h[2] стойка левая дальняя (для ступеньки) + { s.h-001*s.s, s.l-100*s.s, s.l+023*s.s, s.h-005*s.s, s.l+024*s.s, s.l+027*s.s }, --e.h[3] стойка правая ближняя (для ступеньки) + { s.h-001*s.s, s.l-050*s.s, s.h-027*s.s, s.h-005*s.s, s.l+075*s.s, s.h-023*s.s }, --e.h[4] стойка правая дальняя (для ступеньки) + } +e.l = { + { s.l+000*s.s, s.l+000*s.s, s.l+000*s.s, s.l+006*s.s, s.l+003*s.s, s.l+003*s.s }, --e.i[01] левый поручень... + { s.l+000*s.s, s.l+003*s.s, s.l+003*s.s, s.l+006*s.s, s.l+006*s.s, s.l+006*s.s }, + { s.l+000*s.s, s.l+006*s.s, s.l+006*s.s, s.l+006*s.s, s.l+009*s.s, s.l+009*s.s }, + { s.l+000*s.s, s.l+009*s.s, s.l+009*s.s, s.l+006*s.s, s.l+012*s.s, s.l+012*s.s }, + { s.l+000*s.s, s.l+012*s.s, s.l+012*s.s, s.l+006*s.s, s.l+015*s.s, s.l+015*s.s }, + { s.l+000*s.s, s.l+015*s.s, s.l+015*s.s, s.l+006*s.s, s.l+018*s.s, s.l+018*s.s }, + { s.l+000*s.s, s.l+018*s.s, s.l+018*s.s, s.l+006*s.s, s.l+021*s.s, s.l+021*s.s }, + { s.l+000*s.s, s.l+021*s.s, s.l+021*s.s, s.l+006*s.s, s.l+024*s.s, s.l+024*s.s }, + { s.l+000*s.s, s.l+024*s.s, s.l+024*s.s, s.l+006*s.s, s.l+027*s.s, s.l+027*s.s }, + { s.l+000*s.s, s.l+027*s.s, s.l+027*s.s, s.l+006*s.s, s.l+030*s.s, s.l+030*s.s }, + { s.l+000*s.s, s.l+030*s.s, s.l+030*s.s, s.l+006*s.s, s.l+033*s.s, s.l+033*s.s }, + { s.l+000*s.s, s.l+033*s.s, s.l+033*s.s, s.l+006*s.s, s.l+036*s.s, s.l+036*s.s }, + { s.l+000*s.s, s.l+036*s.s, s.l+036*s.s, s.l+006*s.s, s.l+039*s.s, s.l+039*s.s }, + { s.l+000*s.s, s.l+039*s.s, s.l+039*s.s, s.l+006*s.s, s.l+042*s.s, s.l+042*s.s }, + { s.l+000*s.s, s.l+042*s.s, s.l+042*s.s, s.l+006*s.s, s.l+045*s.s, s.l+045*s.s }, + { s.l+000*s.s, s.l+045*s.s, s.l+045*s.s, s.l+006*s.s, s.l+048*s.s, s.l+048*s.s }, + { s.l+000*s.s, s.l+048*s.s, s.l+048*s.s, s.l+006*s.s, s.l+051*s.s, s.l+051*s.s }, + { s.l+000*s.s, s.l+051*s.s, s.l+051*s.s, s.l+006*s.s, s.l+054*s.s, s.l+054*s.s }, + { s.l+000*s.s, s.l+054*s.s, s.l+054*s.s, s.l+006*s.s, s.l+057*s.s, s.l+057*s.s }, + { s.l+000*s.s, s.l+057*s.s, s.l+057*s.s, s.l+006*s.s, s.l+060*s.s, s.l+060*s.s }, + { s.l+000*s.s, s.l+060*s.s, s.l+060*s.s, s.l+006*s.s, s.l+063*s.s, s.l+063*s.s }, + { s.l+000*s.s, s.l+063*s.s, s.l+063*s.s, s.l+006*s.s, s.l+066*s.s, s.l+066*s.s }, + { s.l+000*s.s, s.l+066*s.s, s.l+066*s.s, s.l+006*s.s, s.l+069*s.s, s.l+069*s.s }, + { s.l+000*s.s, s.l+069*s.s, s.l+069*s.s, s.l+006*s.s, s.l+072*s.s, s.l+072*s.s }, + { s.l+000*s.s, s.l+072*s.s, s.l+072*s.s, s.l+006*s.s, s.l+075*s.s, s.l+075*s.s }, + { s.l+000*s.s, s.l+075*s.s, s.l+075*s.s, s.l+006*s.s, s.l+078*s.s, s.l+078*s.s }, + { s.l+000*s.s, s.l+078*s.s, s.l+078*s.s, s.l+006*s.s, s.l+081*s.s, s.l+081*s.s }, + { s.l+000*s.s, s.l+081*s.s, s.l+081*s.s, s.l+006*s.s, s.l+084*s.s, s.l+084*s.s }, + { s.l+000*s.s, s.l+084*s.s, s.l+084*s.s, s.l+006*s.s, s.l+087*s.s, s.l+087*s.s }, + { s.l+000*s.s, s.l+087*s.s, s.l+087*s.s, s.l+006*s.s, s.l+090*s.s, s.l+090*s.s }, + { s.l+000*s.s, s.l+090*s.s, s.l+090*s.s, s.l+006*s.s, s.l+093*s.s, s.l+093*s.s }, + { s.l+000*s.s, s.l+093*s.s, s.l+093*s.s, s.l+006*s.s, s.l+096*s.s, s.l+096*s.s }, + { s.l+000*s.s, s.l+096*s.s, s.l+096*s.s, s.l+006*s.s, s.l+100*s.s, s.l+100*s.s }, --e.i[33] + { s.h-000*s.s, s.l+000*s.s, s.l+000*s.s, s.h-006*s.s, s.l+003*s.s, s.l+003*s.s }, --e.i[34] правый поручень... + { s.h-000*s.s, s.l+003*s.s, s.l+003*s.s, s.h-006*s.s, s.l+006*s.s, s.l+006*s.s }, + { s.h-000*s.s, s.l+006*s.s, s.l+006*s.s, s.h-006*s.s, s.l+009*s.s, s.l+009*s.s }, + { s.h-000*s.s, s.l+009*s.s, s.l+009*s.s, s.h-006*s.s, s.l+012*s.s, s.l+012*s.s }, + { s.h-000*s.s, s.l+012*s.s, s.l+012*s.s, s.h-006*s.s, s.l+015*s.s, s.l+015*s.s }, + { s.h-000*s.s, s.l+015*s.s, s.l+015*s.s, s.h-006*s.s, s.l+018*s.s, s.l+018*s.s }, + { s.h-000*s.s, s.l+018*s.s, s.l+018*s.s, s.h-006*s.s, s.l+021*s.s, s.l+021*s.s }, + { s.h-000*s.s, s.l+021*s.s, s.l+021*s.s, s.h-006*s.s, s.l+024*s.s, s.l+024*s.s }, + { s.h-000*s.s, s.l+024*s.s, s.l+024*s.s, s.h-006*s.s, s.l+027*s.s, s.l+027*s.s }, + { s.h-000*s.s, s.l+027*s.s, s.l+027*s.s, s.h-006*s.s, s.l+030*s.s, s.l+030*s.s }, + { s.h-000*s.s, s.l+030*s.s, s.l+030*s.s, s.h-006*s.s, s.l+033*s.s, s.l+033*s.s }, + { s.h-000*s.s, s.l+033*s.s, s.l+033*s.s, s.h-006*s.s, s.l+036*s.s, s.l+036*s.s }, + { s.h-000*s.s, s.l+036*s.s, s.l+036*s.s, s.h-006*s.s, s.l+039*s.s, s.l+039*s.s }, + { s.h-000*s.s, s.l+039*s.s, s.l+039*s.s, s.h-006*s.s, s.l+042*s.s, s.l+042*s.s }, + { s.h-000*s.s, s.l+042*s.s, s.l+042*s.s, s.h-006*s.s, s.l+045*s.s, s.l+045*s.s }, + { s.h-000*s.s, s.l+045*s.s, s.l+045*s.s, s.h-006*s.s, s.l+048*s.s, s.l+048*s.s }, + { s.h-000*s.s, s.l+048*s.s, s.l+048*s.s, s.h-006*s.s, s.l+051*s.s, s.l+051*s.s }, + { s.h-000*s.s, s.l+051*s.s, s.l+051*s.s, s.h-006*s.s, s.l+054*s.s, s.l+054*s.s }, + { s.h-000*s.s, s.l+054*s.s, s.l+054*s.s, s.h-006*s.s, s.l+057*s.s, s.l+057*s.s }, + { s.h-000*s.s, s.l+057*s.s, s.l+057*s.s, s.h-006*s.s, s.l+060*s.s, s.l+060*s.s }, + { s.h-000*s.s, s.l+060*s.s, s.l+060*s.s, s.h-006*s.s, s.l+063*s.s, s.l+063*s.s }, + { s.h-000*s.s, s.l+063*s.s, s.l+063*s.s, s.h-006*s.s, s.l+066*s.s, s.l+066*s.s }, + { s.h-000*s.s, s.l+066*s.s, s.l+066*s.s, s.h-006*s.s, s.l+069*s.s, s.l+069*s.s }, + { s.h-000*s.s, s.l+069*s.s, s.l+069*s.s, s.h-006*s.s, s.l+072*s.s, s.l+072*s.s }, + { s.h-000*s.s, s.l+072*s.s, s.l+072*s.s, s.h-006*s.s, s.l+075*s.s, s.l+075*s.s }, + { s.h-000*s.s, s.l+075*s.s, s.l+075*s.s, s.h-006*s.s, s.l+078*s.s, s.l+078*s.s }, + { s.h-000*s.s, s.l+078*s.s, s.l+078*s.s, s.h-006*s.s, s.l+081*s.s, s.l+081*s.s }, + { s.h-000*s.s, s.l+081*s.s, s.l+081*s.s, s.h-006*s.s, s.l+084*s.s, s.l+084*s.s }, + { s.h-000*s.s, s.l+084*s.s, s.l+084*s.s, s.h-006*s.s, s.l+087*s.s, s.l+087*s.s }, + { s.h-000*s.s, s.l+087*s.s, s.l+087*s.s, s.h-006*s.s, s.l+090*s.s, s.l+090*s.s }, + { s.h-000*s.s, s.l+090*s.s, s.l+090*s.s, s.h-006*s.s, s.l+093*s.s, s.l+093*s.s }, + { s.h-000*s.s, s.l+093*s.s, s.l+093*s.s, s.h-006*s.s, s.l+096*s.s, s.l+096*s.s }, + { s.h-000*s.s, s.l+096*s.s, s.l+096*s.s, s.h-006*s.s, s.l+100*s.s, s.l+100*s.s }, --e.i[66] + } + +FB.MODELS = {} + +FB.MODELS.A01 = {e.e[01], e.f[01]} -- одна угловая стойка +FB.MODELS.A02 = {e.e[01], e.f[01], e.e[02], e.f[02]} -- две угловых стойки +FB.MODELS.A03 = {e.e[01], e.f[01], e.e[02], e.f[02], e.e[03], e.f[03]} -- три угловых стойки +FB.MODELS.A04 = {e.e[01], e.f[01], e.e[02], e.f[02], e.e[03], e.f[03], e.e[04], e.f[04]} -- четыре угловых стойки +FB.MODELS.A05 = {e.e[05], e.e[06], e.d[05]} -- дальние перила +FB.MODELS.A06 = {e.e[05], e.e[06], e.d[05], e.e[03], e.f[03]} -- дальние перила и угловая правая ближняя стойка +FB.MODELS.A07 = {e.e[05], e.e[06], e.d[05], e.e[04], e.f[04]} -- дальние перила и угловая левая ближняя стойка +FB.MODELS.A08 = {e.e[05], e.e[06], e.d[05], e.e[03], e.f[03], e.e[04], e.f[04]} -- дальние перила и угловые ближние стойки +FB.MODELS.A09 = {e.e[05], e.e[06], e.d[05], e.e[11], e.e[12], e.d[08]} -- дальние и левые перила +FB.MODELS.A10 = {e.e[05], e.e[06], e.d[05], e.e[11], e.e[12], e.d[08], e.e[03], e.f[03]} -- дальние и левые перила и угловая правая ближняя стойка +FB.MODELS.A11 = {e.e[07], e.e[08], e.d[06], e.e[11], e.e[12], e.d[08]} -- правые и левые перила +FB.MODELS.A12 = {e.e[07], e.e[08], e.d[06], e.e[11], e.e[12], e.d[08], e.e[05], e.e[06], e.d[05]} -- правые, левые и дальние перила +FB.MODELS.A13 = {e.k[01], e.k[02], -- наклонный левый поручень + e.l[01], e.l[02], e.l[03], e.l[04], e.l[05], e.l[06], e.l[07], e.l[08], e.l[09], e.l[10], e.l[11], + e.l[12], e.l[13], e.l[14], e.l[15], e.l[16], e.l[17], e.l[18], e.l[19], e.l[20], e.l[21], e.l[22], + e.l[23], e.l[24], e.l[25], e.l[26], e.l[27], e.l[28], e.l[29], e.l[30], e.l[31], e.l[32], e.l[33], + } +FB.MODELS.A14 = {e.k[03], e.k[04], -- наклонный правый поручень + e.l[34], e.l[35], e.l[36], e.l[37], e.l[38], e.l[39], e.l[40], e.l[41], e.l[42], e.l[43], e.l[44], + e.l[45], e.l[46], e.l[47], e.l[48], e.l[49], e.l[50], e.l[51], e.l[52], e.l[53], e.l[54], e.l[55], + e.l[56], e.l[57], e.l[58], e.l[59], e.l[60], e.l[61], e.l[62], e.l[63], e.l[64], e.l[65], e.l[66], + } +FB.MODELS.A15 = {e.k[01], e.k[02], e.k[03], e.k[04], -- наклонный двойной поручень + e.l[01], e.l[02], e.l[03], e.l[04], e.l[05], e.l[06], e.l[07], e.l[08], e.l[09], e.l[10], e.l[11], + e.l[12], e.l[13], e.l[14], e.l[15], e.l[16], e.l[17], e.l[18], e.l[19], e.l[20], e.l[21], e.l[22], + e.l[23], e.l[24], e.l[25], e.l[26], e.l[27], e.l[28], e.l[29], e.l[30], e.l[31], e.l[32], e.l[33], + e.l[34], e.l[35], e.l[36], e.l[37], e.l[38], e.l[39], e.l[40], e.l[41], e.l[42], e.l[43], e.l[44], + e.l[45], e.l[46], e.l[47], e.l[48], e.l[49], e.l[50], e.l[51], e.l[52], e.l[53], e.l[54], e.l[55], + e.l[56], e.l[57], e.l[58], e.l[59], e.l[60], e.l[61], e.l[62], e.l[63], e.l[64], e.l[65], e.l[66], + } + + +FB.MODELS.B00 = {e.a[01]} -- нижняя плита +FB.MODELS.B01 = {e.a[01], e.e[01], e.f[01]} -- одна угловая стойка +FB.MODELS.B02 = {e.a[01], e.e[01], e.f[01], e.e[02], e.f[02]} -- две угловых стойки +FB.MODELS.B03 = {e.a[01], e.e[01], e.f[01], e.e[02], e.f[02], e.e[03], e.f[03]} -- три угловых стойки +FB.MODELS.B04 = {e.a[01], e.e[01], e.f[01], e.e[02], e.f[02], e.e[03], e.f[03], e.e[04], e.f[04]} -- четыре угловых стойки +FB.MODELS.B05 = {e.a[01], e.e[05], e.e[06], e.d[05]} -- дальние перила +FB.MODELS.B06 = {e.a[01], e.e[05], e.e[06], e.d[05], e.e[03], e.f[03]} -- дальние перила и угловая правая ближняя стойка +FB.MODELS.B07 = {e.a[01], e.e[05], e.e[06], e.d[05], e.e[04], e.f[04]} -- дальние перила и угловая левая ближняя стойка +FB.MODELS.B08 = {e.a[01], e.e[05], e.e[06], e.d[05], e.e[03], e.f[03], e.e[04], e.f[04]} -- дальние перила и угловые ближние стойки +FB.MODELS.B09 = {e.a[01], e.e[05], e.e[06], e.d[05], e.e[11], e.e[12], e.d[08]} -- дальние и левые перила +FB.MODELS.B10 = {e.a[01], e.e[05], e.e[06], e.d[05], e.e[11], e.e[12], e.d[08], e.e[03], e.f[03]} -- дальние и левые перила и угловая правая ближняя стойка +FB.MODELS.B11 = {e.a[01], e.e[07], e.e[08], e.d[06], e.e[11], e.e[12], e.d[08]} -- правые и левые перила +FB.MODELS.B12 = {e.a[01], e.e[07], e.e[08], e.d[06], e.e[11], e.e[12], e.d[08], e.e[05], e.e[06], e.d[05]} -- правые, левые и дальние перила + +FB.MODELS.C00 = {e.b[01], e.b[02], -- ступеньки + e.j[01], e.j[02], e.j[03], e.j[04], e.j[05], e.j[06], e.j[07], e.j[08], e.j[09], e.j[10], e.j[11], + e.j[12], e.j[13], e.j[14], e.j[15], e.j[16], e.j[17], e.j[18], e.j[19], e.j[20], e.j[21], e.j[22], + e.j[23], e.j[24], e.j[25], e.j[26], e.j[27], e.j[28], e.j[29], e.j[30], e.j[31], e.j[32], e.j[33], e.j[34], + e.j[35], e.j[36], e.j[37], e.j[38], e.j[39], e.j[40], e.j[41], e.j[42], e.j[43], e.j[44], e.j[45], + e.j[46], e.j[47], e.j[48], e.j[49], e.j[50], e.j[51], e.j[52], e.j[53], e.j[54], e.j[55], e.j[56], + e.j[57], e.j[58], e.j[59], e.j[60], e.j[61], e.j[62], e.j[63], e.j[64], e.j[65], e.j[66], e.j[67], e.j[68], + } +FB.MODELS.C01 = {e.b[01], e.b[02], e.h[01], e.h[02], -- ступеньки с левым поручнем + e.j[01], e.j[02], e.j[03], e.j[04], e.j[05], e.j[06], e.j[07], e.j[08], e.j[09], e.j[10], e.j[11], + e.j[12], e.j[13], e.j[14], e.j[15], e.j[16], e.j[17], e.j[18], e.j[19], e.j[20], e.j[21], e.j[22], + e.j[23], e.j[24], e.j[25], e.j[26], e.j[27], e.j[28], e.j[29], e.j[30], e.j[31], e.j[32], e.j[33], e.j[34], + e.j[35], e.j[36], e.j[37], e.j[38], e.j[39], e.j[40], e.j[41], e.j[42], e.j[43], e.j[44], e.j[45], + e.j[46], e.j[47], e.j[48], e.j[49], e.j[50], e.j[51], e.j[52], e.j[53], e.j[54], e.j[55], e.j[56], + e.j[57], e.j[58], e.j[59], e.j[60], e.j[61], e.j[62], e.j[63], e.j[64], e.j[65], e.j[66], e.j[67], e.j[68], + e.i[01], e.i[02], e.i[03], e.i[04], e.i[05], e.i[06], e.i[07], e.i[08], e.i[09], e.i[10], e.i[11], + e.i[12], e.i[13], e.i[14], e.i[15], e.i[16], e.i[17], e.i[18], e.i[19], e.i[20], e.i[21], e.i[22], + e.i[23], e.i[24], e.i[25], e.i[26], e.i[27], e.i[28], e.i[29], e.i[30], e.i[31], e.i[32], e.i[33], + } +FB.MODELS.C02 = {e.b[01], e.b[02], e.h[03], e.h[04], -- ступеньки с правым поручнем + e.j[01], e.j[02], e.j[03], e.j[04], e.j[05], e.j[06], e.j[07], e.j[08], e.j[09], e.j[10], e.j[11], + e.j[12], e.j[13], e.j[14], e.j[15], e.j[16], e.j[17], e.j[18], e.j[19], e.j[20], e.j[21], e.j[22], + e.j[23], e.j[24], e.j[25], e.j[26], e.j[27], e.j[28], e.j[29], e.j[30], e.j[31], e.j[32], e.j[33], e.j[34], + e.j[35], e.j[36], e.j[37], e.j[38], e.j[39], e.j[40], e.j[41], e.j[42], e.j[43], e.j[44], e.j[45], + e.j[46], e.j[47], e.j[48], e.j[49], e.j[50], e.j[51], e.j[52], e.j[53], e.j[54], e.j[55], e.j[56], + e.j[57], e.j[58], e.j[59], e.j[60], e.j[61], e.j[62], e.j[63], e.j[64], e.j[65], e.j[66], e.j[67], e.j[68], + e.i[34], e.i[35], e.i[36], e.i[37], e.i[38], e.i[39], e.i[40], e.i[41], e.i[42], e.i[43], e.i[44], + e.i[45], e.i[46], e.i[47], e.i[48], e.i[49], e.i[50], e.i[51], e.i[52], e.i[53], e.i[54], e.i[55], + e.i[56], e.i[57], e.i[58], e.i[59], e.i[60], e.i[61], e.i[62], e.i[63], e.i[64], e.i[65], e.i[66], + } +FB.MODELS.C03 = {e.b[01], e.b[02], e.h[01], e.h[02], e.h[03], e.h[04], -- ступеньки с обоими поручнями + e.j[01], e.j[02], e.j[03], e.j[04], e.j[05], e.j[06], e.j[07], e.j[08], e.j[09], e.j[10], e.j[11], + e.j[12], e.j[13], e.j[14], e.j[15], e.j[16], e.j[17], e.j[18], e.j[19], e.j[20], e.j[21], e.j[22], + e.j[23], e.j[24], e.j[25], e.j[26], e.j[27], e.j[28], e.j[29], e.j[30], e.j[31], e.j[32], e.j[33], e.j[34], + e.j[35], e.j[36], e.j[37], e.j[38], e.j[39], e.j[40], e.j[41], e.j[42], e.j[43], e.j[44], e.j[45], + e.j[46], e.j[47], e.j[48], e.j[49], e.j[50], e.j[51], e.j[52], e.j[53], e.j[54], e.j[55], e.j[56], + e.j[57], e.j[58], e.j[59], e.j[60], e.j[61], e.j[62], e.j[63], e.j[64], e.j[65], e.j[66], e.j[67], e.j[68], + e.i[01], e.i[02], e.i[03], e.i[04], e.i[05], e.i[06], e.i[07], e.i[08], e.i[09], e.i[10], e.i[11], + e.i[12], e.i[13], e.i[14], e.i[15], e.i[16], e.i[17], e.i[18], e.i[19], e.i[20], e.i[21], e.i[22], + e.i[23], e.i[24], e.i[25], e.i[26], e.i[27], e.i[28], e.i[29], e.i[30], e.i[31], e.i[32], e.i[33], + e.i[34], e.i[35], e.i[36], e.i[37], e.i[38], e.i[39], e.i[40], e.i[41], e.i[42], e.i[43], e.i[44], + e.i[45], e.i[46], e.i[47], e.i[48], e.i[49], e.i[50], e.i[51], e.i[52], e.i[53], e.i[54], e.i[55], + e.i[56], e.i[57], e.i[58], e.i[59], e.i[60], e.i[61], e.i[62], e.i[63], e.i[64], e.i[65], e.i[66], + } + +FB.MODELS.D00 = {e.c[01], e.g[01], e.g[02], e.d[01], e.d[02], e.d[03], e.d[04]} -- люк закрытый +FB.MODELS.D01 = {e.c[02], e.g[01], e.g[02], e.d[01], e.d[02], e.d[03], e.d[04]} -- люк открытый + +FB.MODELS.S00 = {e.d[09], e.d[10], e.e[13], e.e[14]} -- открытая вертикальная лестница +FB.MODELS.S01 = {e.d[09], e.d[10], e.e[13], e.e[14], e.d[11], e.d[12], e.d[13], e.d[14], e.d[15], e.d[16], e.d[17], e.d[18], e.d[19]} -- закрытая вертикальная лестница +FB.MODELS.S02 = {e.d[09], e.d[10], e.d[11], e.d[12], e.d[13], e.d[06], e.d[07], e.d[08]} -- верх вертикальной лестницы +FB.MODELS.S03 = {e.d[09], e.d[10], e.e[13], e.e[14], e.d[11], e.d[13], e.d[08], e.d[07]} -- закрытая вертикальная лестница с выходом направо +FB.MODELS.S04 = {e.d[09], e.d[10], e.e[13], e.e[14], e.d[12], e.d[13], e.d[06], e.d[07]} -- закрытая вертикальная лестница с выходом налево +FB.MODELS.S05 = {e.d[09], e.d[10], e.e[13], e.e[14], e.d[13], e.d[07]} -- закрытая вертикальная лестница с выходами направо и налево diff --git a/mods/Decorations/factory_bridges/nodes.lua b/mods/Decorations/factory_bridges/nodes.lua new file mode 100644 index 0000000..e3ba9e1 --- /dev/null +++ b/mods/Decorations/factory_bridges/nodes.lua @@ -0,0 +1,93 @@ + +color1 = minetest.setting_get("color1") or "292421" +color2 = minetest.setting_get("color2") or "0000FF" +color3 = minetest.setting_get("color3") or "00FF00" +color4 = minetest.setting_get("color4") or "F5F5F5" +color5 = minetest.setting_get("color5") or "FF6103" +color6 = minetest.setting_get("color6") or "FF0000" +color7 = minetest.setting_get("color7") or "FFFF00" +color8 = minetest.setting_get("color8") or "FF69B4" + +local source_list = { + {"black", "Color1", color1, 40, 36, 33}, + {"blue", "Color2", color2, 0, 0, 255}, + {"green", "Color3", color3, 0, 255, 0}, + {"white", "Color4", color4, 245, 245, 245}, + {"orange", "Color5", color5, 255, 97, 3}, + {"red", "Color6", color6, 255, 0, 0}, + {"yellow", "Color7", color7, 255, 255, 0}, + {"pink", "Color8", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local color = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +minetest.register_node(FB.NAME..":stair" .. color, { + description = FB.LOCAL("c00"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky = 2}, + wield_image = "color_hand" .. color .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "fbstair.png^[colorize:#"..colour..":70", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + node_box = {type = "fixed", fixed = FB.MODELS.C00}, +}) + +minetest.register_node(FB.NAME..":trap1" .. color, { + description = FB.LOCAL("d00"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky = 2}, + wield_image = "color_hand" .. color .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "fbtrap.png^[colorize:#"..colour..":70", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + node_box = {type = "fixed", fixed = FB.MODELS.D00}, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + minetest.set_node(pos, {name=FB.NAME..":trap2" ..color, param2=node.param2}) + end, +}) + +minetest.register_node(FB.NAME..":trap2" .. color, { + description = FB.LOCAL("d01"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=2, not_in_creative_inventory = 1}, + wield_image = "color_hand" .. color .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "fbtrap.png^[colorize:#"..colour..":70", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + node_box = {type = "fixed", fixed = FB.MODELS.D01}, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + minetest.set_node(pos, {name=FB.NAME..":trap1" ..color, param2=node.param2}) + end, + drop = FB.NAME..":d00", +}) + +minetest.register_node(FB.NAME..":ladder" .. color, { + description = FB.LOCAL("s00"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + climbable = true, + groups = {cracky = 2}, + wield_image = "color_hand" .. color .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "fbladder.png^[colorize:#"..colour..":70", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + node_box = {type = "fixed", fixed = FB.MODELS.S00}, +}) + +-- minetest.register_alias(FB.NAME..":a00", FB.NAME..":a01") +-- minetest.register_alias(FB.NAME..":s06", FB.NAME..":c03") + +end diff --git a/mods/Decorations/factory_bridges/textures/color_white.png b/mods/Decorations/factory_bridges/textures/color_white.png new file mode 100644 index 0000000..a6c6ff8 Binary files /dev/null and b/mods/Decorations/factory_bridges/textures/color_white.png differ diff --git a/mods/Decorations/factory_bridges/textures/fbladder.png b/mods/Decorations/factory_bridges/textures/fbladder.png new file mode 100644 index 0000000..d0a5d2e Binary files /dev/null and b/mods/Decorations/factory_bridges/textures/fbladder.png differ diff --git a/mods/Decorations/factory_bridges/textures/fbstair.png b/mods/Decorations/factory_bridges/textures/fbstair.png new file mode 100644 index 0000000..44e061b Binary files /dev/null and b/mods/Decorations/factory_bridges/textures/fbstair.png differ diff --git a/mods/Decorations/factory_bridges/textures/fbtrap.png b/mods/Decorations/factory_bridges/textures/fbtrap.png new file mode 100644 index 0000000..f76df02 Binary files /dev/null and b/mods/Decorations/factory_bridges/textures/fbtrap.png differ diff --git a/mods/Decorations/factory_bridges/textures/none.png b/mods/Decorations/factory_bridges/textures/none.png new file mode 100644 index 0000000..07f7b0e Binary files /dev/null and b/mods/Decorations/factory_bridges/textures/none.png differ diff --git a/mods/Decorations/flags/depends.txt b/mods/Decorations/flags/depends.txt new file mode 100644 index 0000000..22ed7be --- /dev/null +++ b/mods/Decorations/flags/depends.txt @@ -0,0 +1,2 @@ +default +color \ No newline at end of file diff --git a/mods/Decorations/flags/description.txt b/mods/Decorations/flags/description.txt new file mode 100644 index 0000000..8b2a801 --- /dev/null +++ b/mods/Decorations/flags/description.txt @@ -0,0 +1 @@ +A mod for add Flags \ No newline at end of file diff --git a/mods/Decorations/flags/init.lua b/mods/Decorations/flags/init.lua new file mode 100644 index 0000000..16da766 --- /dev/null +++ b/mods/Decorations/flags/init.lua @@ -0,0 +1,51 @@ +color1 = minetest.setting_get("color1") or "292421" +color2 = minetest.setting_get("color2") or "0000FF" +color3 = minetest.setting_get("color3") or "00FF00" +color4 = minetest.setting_get("color4") or "F5F5F5" +color5 = minetest.setting_get("color5") or "FF6103" +color6 = minetest.setting_get("color6") or "FF0000" +color7 = minetest.setting_get("color7") or "FFFF00" +color8 = minetest.setting_get("color8") or "FF69B4" + +local source_list = { + {"black", "Color1", color1, 40, 36, 33}, + {"blue", "Color2", color2, 0, 0, 255}, + {"green", "Color3", color3, 0, 255, 0}, + {"white", "Color4", color4, 245, 245, 245}, + {"orange", "Color5", color5, 255, 97, 3}, + {"red", "Color6", color6, 255, 0, 0}, + {"yellow", "Color7", color7, 255, 255, 0}, + {"pink", "Color8", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local name = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +minetest.register_node("flags:" ..name, { + description = ("Flag"), + drawtype = "torchlike", + visual_scale = 3.0, + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "flag.png^[colorize:#"..colour..":70", + tiles = {"flags.png^[colorize:#"..colour..":70"}, + use_texture_alpha = true, + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + light_source = 5, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -0.4, 0.5} + }, + groups = {cracky=3,dig_immediate=3}, +}) + +end diff --git a/mods/Decorations/flags/intllib.lua b/mods/Decorations/flags/intllib.lua new file mode 100644 index 0000000..6669d72 --- /dev/null +++ b/mods/Decorations/flags/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/Decorations/flags/license.txt b/mods/Decorations/flags/license.txt new file mode 100644 index 0000000..d2a1a3a --- /dev/null +++ b/mods/Decorations/flags/license.txt @@ -0,0 +1,61 @@ + + +License for Code +---------------- + +Copyright (C) 2016-2017 D00Med + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Updates and help: +Wuzzy(aka Wuzzy2) +Thomas--S +zaoqi + +License for Textures, Models +--------------------------------------- + +CC BY-SA 3.0 UNPORTED. Created by D00Med + +policecar.b3d- CC BY-SA 3.0 UNPORTED. Created by Kdog14 and D00Med + +geep.b3d, vehicles_geep.png - CC BY-SA 3.0 UNPORTED. Created by Kdog14 + +License for sounds: +CC BY-NC 3.0 oniwe https://freesound.org/people/oniwe/sounds/32316/ + +shot.ogg - CC BY-NC 3.0 by Kibblesbob http://soundbible.com/1804-M4A1-Single.html + +ambulance.ogg - CC BY-SA 4.0 by Demircimehmed https://commons.wikimedia.org/wiki/File:AmbulanceSound1.wav + +--License of lib_mount: +-- Minetest mod: lib_mount +-- ======================= +-- by blert2112 + +-- Based on the Boats mod by PilzAdam. + + +-- ----------------------------------------------------------- +-- ----------------------------------------------------------- + + +-- Minetest Game mod: boats +-- ======================== +-- by PilzAdam + +-- License of source code: +-- ----------------------- +-- WTFPL \ No newline at end of file diff --git a/mods/Decorations/flags/locale/fr.txt b/mods/Decorations/flags/locale/fr.txt new file mode 100644 index 0000000..2d61af9 --- /dev/null +++ b/mods/Decorations/flags/locale/fr.txt @@ -0,0 +1,65 @@ +# Translation by Papou30 +Ambulance = Ambulance +Armor plating = Blindage +Aston Maaton (white) = Aston Maaton (blanc) +Building glass = Verre de construction +Bullet = Cartouche +Car Body = Corps de voiture +Car sign = Affiche de voiture +Checkered sign = Signe à damier +Checkered surface = Surface à carreaux +Concrete = Béton +Engine = Moteur +Fewawi (blue) = Fewawi (bleu) +Fewawi (red) = Fewawi (rouge) +Fire truck = Camion de pompiers +Flag = Drapeau +Geep = Geep +Gun turret = Tourelle d'arme à feu +Hazard stipes = Stipes de danger +Jet = Jet +Jet Engine = Moteur à réaction +Lambogoni (grey) = Lambogoni (gris) +Lambogoni (yellow) = Lambogoni (jaune) +Masda (orange) = Masda (orange) +Masda (pink) = Masda (rose) +Missile = Missile +Musting (purple) = Musting (violet) +Musting (white) = Musting (blanc) +Nizzan (brown) = Nizzan (marron) +Nizzan (green) = Nizzan (vert) +Nyancat sign = Affiche de Nyancat +Parachute = Parachute +Plane = Avion +Police Car (US) = Voiture de police (US) +Pooshe (red) = Pooshe (rouge) +Pooshe (yellow) = Pooshe (jaune) +Propeller = Hélice +Rc (use with missiles) = Rc (utiliser pour les missiles) +Road Surface Slab = Dalle de la surface de la route +Road Surface Stair = Escalier de surface de route +Road surface = Surface de la route +Road surface (double stripe) = Surface de la route (double bande) +Road surface (stripe) = Surface de la route (bande) +Road surface (white stripes) = Surface de la route (rayures blanches) +Road surface (yellow stripes) = Surface de la route (bandes jaunes) +Speedboat = Speedboat +Tank = Tank +Tunnel Lights = Lumières de tunnel +Turning Arrows(left) = Flèches pour tourné a gauche +Turning Arrows(right) = Flèches pour tourné a droite +Ute (clean) = Ute (propre) +Ute (dirty) = Ute (sale) +Vehicle Gun = Arme pour véhicule +Wheel = Roue +Wings = Ailes +arrows(left) = Flèches(gauche) +arrows(right) = Flèche(droite) +mt sign = Panneau mt +neon arrows (left) = flèches au néon (à gauche) +neon arrows (right) = flèches au néon (à droite) +pacman sign = Panneau pacman +scifi_nodes sign = Panneau scifi_nodes +tyre stack = pile de pneu +whee sign = signe de plaisir + diff --git a/mods/Decorations/flags/locale/ms.txt b/mods/Decorations/flags/locale/ms.txt new file mode 100644 index 0000000..736939a --- /dev/null +++ b/mods/Decorations/flags/locale/ms.txt @@ -0,0 +1,64 @@ +# Malay translation by muhdnurhidayat +Ambulance = Ambulans +Armor plating = Plat perisai +Aston Maaton (white) = Aston Maaton (putih) +Building glass = Kaca bangunan +Bullet = Peluru +Car Body = Badan Kereta +Car sign = Tanda kereta +Checkered sign = Tanda corak dam +Checkered surface = Permukaan corak dam +Concrete = Konkrit +Engine = Enjin +Fewawi (blue) = Fewawi (biru) +Fewawi (red) = Fewawi (merah) +Fire truck = Jentera bomba +Flag = Bendera pelepas +Geep = Jip +Gun turret = Turet penembak +Hazard stipes = Jalur bahaya +Jet = Jet +Jet Engine = Enjin Jet +Lambogoni (grey) = Lambogoni (kelabu) +Lambogoni (yellow) = Lambogoni (kuning) +Masda (orange) = Masda (jingga) +Masda (pink) = Masda (merah jambu) +Missile = Misil +Musting (purple) = Musting (ungu) +Musting (white) = Musting (putih) +Nizzan (brown) = Nizzan (perang) +Nizzan (green) = Nizzan (hijau) +Nyancat sign = Tanda nyancat +Parachute = Payung Terjun +Plane = Kapal terbang +Police Car (US) = Kereta Polis (AS) +Pooshe (red) = Pooshe (merah) +Pooshe (yellow) = Pooshe (kuning) +Propeller = Kipas +Rc (use with missiles) = Alat kawalan jauh (guna dengan misil) +Road Surface Slab = Papak Permukaan Jalan +Road Surface Stair = Tangga Permukaan Jalan +Road surface = Permukaan Jalan +Road surface (double stripe) = Permukaan Jalan (garisan berkembar) +Road surface (stripe) = Permukaan Jalan (garisan pembahagi) +Road surface (white stripes) = Permukaan Jalan (garisan berjalur putih) +Road surface (yellow stripes) = Permukaan Jalan (garisan berjalur kuning) +Speedboat = Bot Laju +Tank = Kereta Kebal +Tunnel Lights = Lampu Terowong +Turning Arrows(left) = Anak Panah Belok (kiri) +Turning Arrows(right) = Anak Panah Belok (Kanan) +Ute (clean) = Ute (bersih) +Ute (dirty) = Ute (kotor) +Vehicle Gun = Meriam Kenderaan +Wheel = Tayar +Wings = Sayap +arrows(left) = Anak Panah (kiri) +arrows(right) = Anak Panah (kanan) +mt sign = Tanda mt +neon arrows (left) = Anak panah neon (kiri) +neon arrows (right) = Anak panah neon (kanan) +pacman sign = Tanda pacman +scifi_nodes sign = Tanda scifi_nodes +tyre stack = Tindanan tayar +whee sign = Tanda whee diff --git a/mods/Decorations/flags/locale/template.txt b/mods/Decorations/flags/locale/template.txt new file mode 100644 index 0000000..d9250d6 --- /dev/null +++ b/mods/Decorations/flags/locale/template.txt @@ -0,0 +1,64 @@ +# Template +Ambulance = +Armor plating = +Aston Maaton (white) = +Building glass = +Bullet = +Car Body = +Car sign = +Checkered sign = +Checkered surface = +Concrete = +Engine = +Fewawi (blue) = +Fewawi (red) = +Fire truck = +Flag = +Geep = +Gun turret = +Hazard stipes = +Jet = +Jet Engine = +Lambogoni (grey) = +Lambogoni (yellow) = +Masda (orange) = +Masda (pink) = +Missile = +Musting (purple) = +Musting (white) = +Nizzan (brown) = +Nizzan (green) = +Nyancat sign = +Parachute = +Plane = +Police Car (US) = +Pooshe (red) = +Pooshe (yellow) = +Propeller = +Rc (use with missiles) = +Road Surface Slab = +Road Surface Stair = +Road surface = +Road surface (double stripe) = +Road surface (stripe) = +Road surface (white stripes) = +Road surface (yellow stripes) = +Speedboat = +Tank = +Tunnel Lights = +Turning Arrows(left) = +Turning Arrows(right) = +Ute (clean) = +Ute (dirty) = +Vehicle Gun = +Wheel = +Wings = +arrows(left) = +arrows(right) = +mt sign = +neon arrows (left) = +neon arrows (right) = +pacman sign = +scifi_nodes sign = +tyre stack = +whee sign diff --git a/mods/Decorations/flags/locale/zh_CN.txt b/mods/Decorations/flags/locale/zh_CN.txt new file mode 100644 index 0000000..02f1147 --- /dev/null +++ b/mods/Decorations/flags/locale/zh_CN.txt @@ -0,0 +1,64 @@ +# Translation by Zaoqi +Ambulance = 救护车 +Armor plating = 装甲 +Aston Maaton (white) = 阿斯顿Maaton(白色) +Building glass = 建筑玻璃 +Bullet = 子弹 +Car Body = 车身 +Car sign = 汽车标志 +Checkered sign = 网格 +Checkered surface = 网格方块 +Concrete = 混凝土 +Engine = 引擎 +Fewawi (blue) = 法哇力(蓝色) +Fewawi (red) = 法哇力(红色) +Fire truck = 消防车 +Flag = 国旗 +Geep = G普 +Gun turret = 炮塔 +Hazard stipes = 红白块 +Jet = 飞机 +Jet Engine = 喷气发动机 +Lambogoni (grey) = 兰不基尼(灰色) +Lambogoni (yellow) = 兰不基尼(黄色) +Masda (orange) = 马四达(橘色) +Masda (pink) = 马四达(粉红色) +Missile = 导弹 +Musting (purple) = 野咪(紫色) +Musting (white) = 野咪(白色) +Nizzan (brown) = Nizzan(棕色) +Nizzan (green) = Nizzan(绿色) +Nyancat sign = Nyancat标志 +Parachute = 降落伞 +Plane = 飞机 +Police Car (US) = 警车(美国) +Pooshe (red) = 破时捷(红色) +Pooshe (yellow) = 破时捷(黄色) +Propeller = 螺旋桨 +Rc (use with missiles) = 遥控器(使用导弹) +Road Surface Slab = 路面半砖 +Road Surface Stair = 路面楼梯 +Road surface = 路面 +Road surface (double stripe) = 路面(双条纹) +Road surface (stripe) = 路面(条纹) +Road surface (white stripes) = 路面(白色条纹) +Road surface (yellow stripes) = 路面(黄色条纹) +Speedboat = 快艇 +Tank = 坦克 +Tunnel Lights = 隧道灯 +Turning Arrows(left) = 转向箭头(左) +Turning Arrows(right) = 转向箭头(右) +Ute (clean) = 轻型货车(干净的) +Ute (dirty) = 轻型货车(脏的) +Vehicle Gun = 车辆的枪 +Wheel = 轮胎 +Wings = 翅膀 +arrows(left) = 箭头(左) +arrows(right) = 箭头(右) +mt sign = Minetest标志 +neon arrows (left) = 霓虹灯箭头(左) +neon arrows (right) = 霓虹灯箭头(右) +pacman sign = 吃豆子标志 +scifi_nodes sign = scifi_nodes标志 +tyre stack = 轮胎堆 +whee sign = wheee标志 diff --git a/mods/Decorations/flags/readme.txt b/mods/Decorations/flags/readme.txt new file mode 100644 index 0000000..cd3f935 --- /dev/null +++ b/mods/Decorations/flags/readme.txt @@ -0,0 +1,104 @@ +How to drive/pilot/etc.: + +Basic controls: +All vehicles are steered by looking around. +You can use the forward button(same as you would use for walking), to move the vehicles, but only some will be able to reverse. For example, cars can reverse but planes cannot. + +Boosts: +Some vehicles can have a small boost when the 'use/aux1' key is held. It will only last for a limited time and it will not recharge whilst the key is still held down. + +Weapons: +Vehicles can also use weapons, for example the jet and tank, which will fire a missile when 'sneak' is pressed. They require a missile to be in the drivers inventory to do this. It is possible to have a second weapon, fired with 'use/aux1', but currently only the assault suit does this. It can use both bullets and missiles. The gun turret uses bullets. + +Flight/Jumping/Hovering: +Some vehicles can fly, for example the jet. The jet will move upward when the driver looks up, or when the driver presses 'jump'. Using the jump key does not work very well at the moment. The plane is a bit differrent; It will hold it's height when 'jump' is pressed. +It is also possible for vehicles to jump or hover for a small amount of time. Currently only the Assault suit does this. + +Boats and watercraft: +The speed boat can be used on water, but if it is driven onto land it will stop completely. If you are lucky you can move back into water, but be careful because this does not always work. + +The Lightcycles: +The Lightcycles can place light barriers when 'sneak' is pressed. If the barrier from one type hits the other type, the vehicle will explode + +Other things: +Vehicles will explode if they touch lava, so be careful. +Don't drive cars or planes etc. into water! they will sink. +If you do get a vehicle in a tricky spot, you can punch it whilst driving and it will be dropped. + +The API: +vehicles.object_drive is the function used for the movement of vehicles. +It should be used in this format: +vehicles.object_drive(entity, dtime, { +}) + +In the above case, entity is used in place of an entity or object. If the function was to be used inside on_step for an entity, 'entity' would be replaced with 'self.object' +The table should contain the relevant variables listed below. The function is written so that these are all somewhat optional. + +speed: This defines the speed of the vehicle, if unset it will be '10' + +fixed: Setting this to 'true' will disable movement from the vehicle + +decell: This defines the decelleration of the vehicle. The default is 0 + +shoots: If true then the vehicle can shoot with 'sneak'(arrow must be defined, default is false) + +arrow: This should be the entity name for the weapon fired (default is nil) (requires an item with the name arrow_name.."_item" to be in the drivers inventory) + +reload_time: how long it takes before the weapon can be fired again (default is 1) + +shoot_y: y offset of the weapon, default is 1.5 + +shoot_angle: This will make the weapon shoot at a differrent vertical angle (default is 0) + +infinite_arrow: if this is set then the vehicle won't need an arrow item to be in the inventory + +arrow2/reload_time2/shoots2/shoot_y2/infinite_arrow2: same as above but fired with 'use/aux1' + +jump: can be either 'hover' or 'jump' (default is nil). Hover lasts longer than jump. + +fly: if true then the vehicle will fly (default is false) + +fly_mode: can be either 'hold' or 'rise' (default is 'hold'). hold will keep the vehicle in place when 'jump' is pressed, and 'rise' will cause the vehicle to rise when the same key is pressed. + +rise_speed: dependant on fly_mode being set to 'rise'. Defines the speed at which the vehicle will rise. (default is 0.1) + +gravity: the gravity acting on the vehicle. This should be positive. (default is 1) + +boost: if set to 'true' then the vehicle can boost with 'use/aux1' (default is false) + +boost_duration: dependant on 'boost'. Determines how long a boost will last (default is 5). + +boost_charge: dependant on 'boost'. Determines how long it takes before boost can be used again (default is 4) + +boost_effect: particle texture that will fly out from behind the vehicle whilst boosting (default is nil) + +hover_speed: the speed at which the vehicle will hover if 'jump' is set to 'hover' (default is 1.5) + +jump_speed: the speed at which the vehicle will jump if 'jump' is set to 'jump' (default is 5) + +simple_vehicle: removes all functionality except basic movement, use to reduce lag. (not implemented yet), default is false + +is_watercraft: if set to true then the vehicle won't be stopped by water. +it will act like a boat unless swims is true. (default is false) + +swims: will allow the vehicle to move underwater (not yet implemented) (default is false) + +driving_sound: name of the sound file that will play when the vehicle is driving (default is nil) + +sound_duration: !VERY IMPORTANT! if there is a driving sound then this should match it's duration. If this is not set then the sound could overlap and increase in volume (default is 5) + +extra_yaw: use this if the model has incorrect rotation. It will rotate the model so it faces the right way whilst being driven (default is 0) + +moving_anim/stand_anim/jump_anim/shoot_anim/shoot_anim2: animations for actions. Can be set individually. (default is nil) + +place_node: name of the node that is placed by the vehicle (default is nil) + +place_chance: nodes are placed when a random number between place_chance and 1 is equal to 1 (default is 1) + +place_trigger: if true the vehicle will place the node defined by place_node when 'sneak' is pressed. (default is false) + +death_node: name of the node that will make the vehicle explode, default is nil + +destroy_node: name of the node that is destroyed if it toughes the vehicle, default is nil + + diff --git a/mods/Decorations/flags/textures/2018_09_29_034840.png b/mods/Decorations/flags/textures/2018_09_29_034840.png new file mode 100644 index 0000000..775accf Binary files /dev/null and b/mods/Decorations/flags/textures/2018_09_29_034840.png differ diff --git a/mods/Decorations/flags/textures/flag.png b/mods/Decorations/flags/textures/flag.png new file mode 100644 index 0000000..5a48a8b Binary files /dev/null and b/mods/Decorations/flags/textures/flag.png differ diff --git a/mods/Decorations/flags/textures/flags.png b/mods/Decorations/flags/textures/flags.png new file mode 100644 index 0000000..5a48a8b Binary files /dev/null and b/mods/Decorations/flags/textures/flags.png differ diff --git a/mods/Decorations/flowers/CREDITS b/mods/Decorations/flowers/CREDITS new file mode 100644 index 0000000..8be7ff7 --- /dev/null +++ b/mods/Decorations/flowers/CREDITS @@ -0,0 +1 @@ +Flower textures by erlehmann diff --git a/mods/Decorations/flowers/depends.txt b/mods/Decorations/flowers/depends.txt new file mode 100644 index 0000000..22ed7be --- /dev/null +++ b/mods/Decorations/flowers/depends.txt @@ -0,0 +1,2 @@ +default +color \ No newline at end of file diff --git a/mods/Decorations/flowers/init.lua b/mods/Decorations/flowers/init.lua new file mode 100644 index 0000000..038ae83 --- /dev/null +++ b/mods/Decorations/flowers/init.lua @@ -0,0 +1,43 @@ +--[[ +-- Flowers mod by ironzorg +--]] + +local source_list = { + {"black", "Darkened", color1, 40, 36, 33}, + {"blue", "Blue", color2, 0, 0, 255}, + {"green", "Green", color3, 0, 255, 0}, + {"white", "White", color4, 245, 245, 245}, + {"orange", "Orange", color5, 255, 97, 3}, + {"red", "Red", color6, 255, 0, 0}, + {"yellow", "Yellow", color7, 255, 255, 0}, + {"pink", "pink", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local name = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + + minetest.register_node('flowers:' .. name , { + drawtype = 'plantlike', + tiles = { 'flower_white.png^[colorize:#'..colour..':70' }, + inventory_image = 'flowers.png^[colorize:#'..colour..':70', + sunlight_propagates = true, + paramtype = 'light', + description = desc .. " Flower color", + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + groups = {snappy = 2, choppy = 2, wool = 2}, + oddly_breakable_by_hand = 1, + dig_immediate = 3, + waving = 1, + walkable = false, + buildable_to = true, + sounds = default.node_sound_leaves_defaults(), + + }) + +end diff --git a/mods/Decorations/flowers/textures/flower_white.png b/mods/Decorations/flowers/textures/flower_white.png new file mode 100644 index 0000000..b22d6d4 Binary files /dev/null and b/mods/Decorations/flowers/textures/flower_white.png differ diff --git a/mods/Decorations/hdb/README.txt b/mods/Decorations/hdb/README.txt new file mode 100644 index 0000000..b8a95c1 --- /dev/null +++ b/mods/Decorations/hdb/README.txt @@ -0,0 +1,11 @@ +This is a modify modpack Homedecor for Blockcolor (HDB). + +Add Colors for Computers +Add Colors for Desk + +Depend Color Mod BlockColor for Textures. + +-- + +Homedecor Desk : Vanessa Ezekowitz // Licenses: * For the lua code, LGPL. +Decorative Computers : Diego Martínez License : WTFPL diff --git a/mods/Decorations/hdb/depends.txt b/mods/Decorations/hdb/depends.txt new file mode 100644 index 0000000..9bc856f --- /dev/null +++ b/mods/Decorations/hdb/depends.txt @@ -0,0 +1,2 @@ +default +color diff --git a/mods/Decorations/hdb/init.lua b/mods/Decorations/hdb/init.lua new file mode 100644 index 0000000..d482d49 --- /dev/null +++ b/mods/Decorations/hdb/init.lua @@ -0,0 +1,119 @@ +local desk_cbox = { type = "fixed", fixed = { -0.5, -0.5, -0.5, 1.5, 0.5, 0.5 }} + +local armoire_cbox = {type = "fixed",fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 }} + +local bench_cbox = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.25, 1.5, 0, 0.5 }, + {-0.5, -0.5, 0.45, 1.5, 0.5, 0.5 }, + } +} + +-- HomeDecor Blockcolor + +local source_list = { + {"black", "white", color1, 40, 36, 33}, + {"blue", "white", color2, 0, 0, 255}, + {"green", "white", color3, 0, 255, 0}, + {"white", "black", color4, 245, 245, 245}, + {"orange", "black", color5, 255, 97, 3}, + {"red", "white", color6, 255, 0, 0}, + {"yellow", "black", color7, 255, 255, 0}, + {"pink", "white", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local color = source_list[i][1] + local color2 = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +minetest.register_node("hdb:frigo" .. color, { + description = "frigo" .. color, + drawtype = "mesh", + mesh = "hdb_frigo.obj", +tiles = {"color_white.png^[colorize:#"..colour..":70","color_" ..color2.. ".png", "color_" ..color2.. ".png", "color_white.png^[colorize:#"..colour..":70"}, + inventory_image = 'frigo.png^[colorize:#'..colour..':70', + wield_image = "color_hand" .. color .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + paramtype = "light", + paramtype2 = "facedir", +collision_box = armoire_cbox, + selection_box = armoire_cbox, + groups = {cracky=3, oddly_breakable_by_hand=2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, +}) + +minetest.register_node("hdb:bench" .. color, { + description = "bench" .. color, + drawtype = "mesh", + mesh = "hdb_bench.obj", + tiles = {"color_white.png^[colorize:#"..colour..":70","color_" ..color2.. ".png", "color_" ..color2.. ".png", "color_white.png^[colorize:#"..colour..":70"}, + inventory_image = 'bench.png^[colorize:#'..colour..':70', + wield_image = "color_hand" .. color .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + paramtype = "light", + paramtype2 = "facedir", +collision_box = bench_cbox, + selection_box = bench_cbox, + groups = {cracky=3, oddly_breakable_by_hand=2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, +}) + +minetest.register_node("hdb:armoire" .. color, { + description = "armoire" .. color, + drawtype = "mesh", + mesh = "hdb_armoire.obj", + tiles = {"color_white.png^[colorize:#"..colour..":70","color_" ..color2.. ".png", "color_" ..color2.. ".png", "color_white.png^[colorize:#"..colour..":70"}, + inventory_image = 'armoire.png^[colorize:#'..colour..':70', + wield_image = "color_hand" .. color .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + paramtype = "light", + paramtype2 = "facedir", +collision_box = armoire_cbox, + selection_box = armoire_cbox, + groups = {cracky=3, oddly_breakable_by_hand=2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, +}) + +-- on_rotate = screwdriver.rotate_simple + +minetest.register_node("hdb:desk" .. color, { + description = "Desk" .. color, + drawtype = "mesh", + mesh = "hdb_desk.obj", + tiles = {"color_white.png^[colorize:#"..colour..":70","color_" ..color2.. ".png", "color_" ..color2.. ".png", "color_white.png^[colorize:#"..colour..":70"}, + inventory_image = 'desk.png^[colorize:#'..colour..':70', + wield_image = "color_hand" .. color .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + paramtype = "light", + paramtype2 = "facedir", +collision_box = desk_cbox, + selection_box = desk_cbox, + groups = {cracky=3, oddly_breakable_by_hand=2}, + sounds = default.node_sound_stone_defaults(), + on_place = minetest.rotate_node, +}) + +minetest.register_node("hdb:computer" .. color , { + description = "Computer" .. color, +inventory_image = 'computer.png^[colorize:#'..colour..':70', + wield_image = "color_hand" .. color .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + drawtype = "mesh", + mesh = "hdb_pc.obj", +tiles = {"color_white.png^[colorize:#"..colour..":70","color_" ..color2.. ".png", "color_" ..color2.. ".png", "color_white.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=3, oddly_breakable_by_hand=2}, + sounds = default.node_sound_stone_defaults(), + on_place = minetest.rotate_node, +}) + +end diff --git a/mods/Decorations/hdb/textures/overlay.png b/mods/Decorations/hdb/textures/overlay.png new file mode 100644 index 0000000..fa399d5 Binary files /dev/null and b/mods/Decorations/hdb/textures/overlay.png differ diff --git a/mods/Decorations/ma_pops_furniture/depends.txt b/mods/Decorations/ma_pops_furniture/depends.txt new file mode 100644 index 0000000..9bc856f --- /dev/null +++ b/mods/Decorations/ma_pops_furniture/depends.txt @@ -0,0 +1,2 @@ +default +color diff --git a/mods/Decorations/ma_pops_furniture/init.lua b/mods/Decorations/ma_pops_furniture/init.lua new file mode 100644 index 0000000..5a73f60 --- /dev/null +++ b/mods/Decorations/ma_pops_furniture/init.lua @@ -0,0 +1,5 @@ +ma_pops_furniture = {} + +dofile(minetest.get_modpath('ma_pops_furniture')..'/nodes.lua') + +local MP = minetest.get_modpath(minetest.get_current_modname()) diff --git a/mods/Decorations/ma_pops_furniture/nodes.lua b/mods/Decorations/ma_pops_furniture/nodes.lua new file mode 100644 index 0000000..afde400 --- /dev/null +++ b/mods/Decorations/ma_pops_furniture/nodes.lua @@ -0,0 +1,139 @@ + +-- Chair + +local chair_table = { --name, material, invimg, colour + +{'White Chair', 'white', 'color_white.png', color4}, +{'Black Chair', 'black', 'color_black.png', color1}, +{'Red Chair', 'red', 'color_red.png', color6}, +{'Orange Chair', 'orange', 'color_orange.png', color5}, +{'Yellow Chair', 'yellow', 'color_yellow.png', color7}, +{'Pink Chair', 'pink', 'color_pink.png', color8}, +{'Green Chair', 'green', 'color_green.png', color3}, +{'Blue Chair', 'blue', 'color_blue.png', color2}, + +} + +for i in ipairs (chair_table) do + local name = chair_table[i][1] + local material = chair_table[i][2] + local invimg = chair_table[i][3] + local colour = chair_table[i][4] + +minetest.register_node('ma_pops_furniture:chair_'..material, { + description = name, + drawtype = 'nodebox', +wield_image = "color_hand" .. material .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "chair.png^[colorize:#"..colour..":70", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + groups = {choppy=2, oddly_breakably_by_hand=2, furniture=1, flammable=1}, + paramtype = 'light', + paramtype2 = 'facedir', + sounds = default.node_sound_wood_defaults(), + + node_box = { + type = "fixed", + fixed = { + {-0.375, -0.5, -0.4375, -0.1875, 0, -0.25}, -- NodeBox1 + {-0.375, -0.5, 0.25, -0.1875, 0, 0.4375}, -- NodeBox2 + {0.1875, -0.5, 0.25, 0.375, 0, 0.4375}, -- NodeBox3 + {0.1875, -0.5, -0.4375, 0.375, 0, -0.25}, -- NodeBox4 + {-0.375, 0, -0.4375, 0.375, 0.1875, 0.4375}, -- NodeBox5 + {-0.375, 0.1875, 0.3125, 0.375, 0.875, 0.4375}, -- NodeBox6 + } + } +}) +end + +-- Table + +local table_table = { --name, material, invimg, colour + +{'White Table', 'white', 'color_white.png', color4}, +{'Black Table', 'black', 'color_black.png', color1}, +{'Red Table', 'red', 'color_red.png', color6}, +{'Orange Table', 'orange', 'color_orange.png', color5}, +{'Yellow Table', 'yellow', 'color_yellow.png', color7}, +{'Pink Table', 'pink', 'color_pink.png', color8}, +{'Green Table', 'green', 'color_green.png', color3}, +{'Blue Table', 'blue', 'color_blue.png', color2}, + +} + +for i in ipairs (table_table) do + local name = table_table[i][1] + local material = table_table[i][2] + local invimg = table_table[i][3] + local colour = table_table[i][4] + +minetest.register_node('ma_pops_furniture:table_'..material, { + description = name, +wield_image = "color_hand" .. material .. ".png", +wield_scale = {x=1,y=1,z=0.5}, +inventory_image = "table.png^[colorize:#"..colour..":70", + drawtype = 'nodebox', + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + groups = {snappy = 2, oddly_breakable_by_hand = 2, furniture = 1, flammable = 1}, + paramtype = 'light', + paramtype2 = 'facedir', + sounds = default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.125, -0.5, -0.125, 0.125, 0.3125, 0.125}, -- NodeBox2 + {-0.5, 0.3125, -0.5, 0.5, 0.5, 0.5}, -- NodeBox3 + } + } +}) +end + +-- Chair + +local chair2_table = { --name, material, invimg, colour + +{'White Sofa', 'white', 'color_white.png', color4}, +{'Black Sofa', 'black', 'color_black.png', color1}, +{'Red Sofa', 'red', 'color_red.png', color6}, +{'Orange Sofa', 'orange', 'color_orange.png', color5}, +{'Yellow Sofa', 'yellow', 'color_yellow.png', color7}, +{'Pink Sofa', 'pink', 'color_pink.png', color8}, +{'Green Sofa', 'green', 'color_green.png', color3}, +{'Blue Sofa', 'blue', 'color_blue.png', color2}, + +} + +for i in ipairs (chair2_table) do + local name = chair2_table[i][1] + local material = chair2_table[i][2] + local invimg = chair2_table[i][3] + local colour = chair2_table[i][4] + +minetest.register_node('ma_pops_furniture:chair2_'..material, { + description = name, + drawtype = 'nodebox', +wield_image = "color_hand" .. material .. ".png", +wield_scale = {x=1,y=1,z=0.5}, +inventory_image = "sofas.png^[colorize:#"..colour..":70", +tiles = {"color_white.png^[colorize:#"..colour..":70"}, + groups = {choppy=2, oddly_breakably_by_hand=2, furniture=1, flammable=1}, + paramtype = 'light', + paramtype2 = 'facedir', + sounds = default.node_sound_wood_defaults(), + + node_box = { + type = "fixed", + fixed = { + {-0.4, -0.5, -0.4, -0.3, -0.4, -0.3}, + {-0.4, -0.5, 0.4, -0.3, -0.4, 0.3}, + {0.4, -0.5, 0.4, 0.3, -0.4, 0.3}, + {0.4, -0.5, -0.4, 0.3, -0.4, -0.3}, + ----------------------------------- + {-0.450, -0.4, -0.450, 0.450, 0.1, 0.450}, + {-0.5, 0.1, -0.5, -0.3, 0.3, 0.0}, + {0.5, 0.1, -0.5, 0.3, 0.3, 0.0}, + {0.450, 0.1, -0.0, -0.450, 0.5, 0.450}, + }, + } +}) +end diff --git a/mods/Decorations/ma_pops_furniture/sounds/mp_blast.ogg b/mods/Decorations/ma_pops_furniture/sounds/mp_blast.ogg new file mode 100644 index 0000000..ff19a2e Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/sounds/mp_blast.ogg differ diff --git a/mods/Decorations/ma_pops_furniture/sounds/mp_glass.ogg b/mods/Decorations/ma_pops_furniture/sounds/mp_glass.ogg new file mode 100644 index 0000000..393cc37 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/sounds/mp_glass.ogg differ diff --git a/mods/Decorations/ma_pops_furniture/sounds/mp_radio_static.ogg b/mods/Decorations/ma_pops_furniture/sounds/mp_radio_static.ogg new file mode 100644 index 0000000..08ddc59 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/sounds/mp_radio_static.ogg differ diff --git a/mods/Decorations/ma_pops_furniture/sounds/mp_rainbow.ogg b/mods/Decorations/ma_pops_furniture/sounds/mp_rainbow.ogg new file mode 100644 index 0000000..b729688 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/sounds/mp_rainbow.ogg differ diff --git a/mods/Decorations/ma_pops_furniture/sounds/mp_smoke_detector.ogg b/mods/Decorations/ma_pops_furniture/sounds/mp_smoke_detector.ogg new file mode 100644 index 0000000..0067125 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/sounds/mp_smoke_detector.ogg differ diff --git a/mods/Decorations/ma_pops_furniture/sounds/mp_static.ogg b/mods/Decorations/ma_pops_furniture/sounds/mp_static.ogg new file mode 100644 index 0000000..08ddc59 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/sounds/mp_static.ogg differ diff --git a/mods/Decorations/ma_pops_furniture/textures/breadslice.png b/mods/Decorations/ma_pops_furniture/textures/breadslice.png new file mode 100644 index 0000000..2d04ab0 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/breadslice.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_TV.png b/mods/Decorations/ma_pops_furniture/textures/mp_TV.png new file mode 100644 index 0000000..f648d02 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_TV.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_b.png b/mods/Decorations/ma_pops_furniture/textures/mp_b.png new file mode 100644 index 0000000..ef031a8 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_b.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_blinds.png b/mods/Decorations/ma_pops_furniture/textures/mp_blinds.png new file mode 100644 index 0000000..e70f95c Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_blinds.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_breadslice.png b/mods/Decorations/ma_pops_furniture/textures/mp_breadslice.png new file mode 100644 index 0000000..2d04ab0 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_breadslice.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_camp_back.png b/mods/Decorations/ma_pops_furniture/textures/mp_camp_back.png new file mode 100644 index 0000000..c4fd041 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_camp_back.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_camp_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_camp_bottom.png new file mode 100644 index 0000000..583ed9f Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_camp_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_camp_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_camp_front.png new file mode 100644 index 0000000..ffe77e2 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_camp_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_camp_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_camp_left.png new file mode 100644 index 0000000..c4fd041 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_camp_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_camp_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_camp_right.png new file mode 100644 index 0000000..c4fd041 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_camp_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_camp_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_camp_top.png new file mode 100644 index 0000000..1d32af1 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_camp_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_cb.png b/mods/Decorations/ma_pops_furniture/textures/mp_cb.png new file mode 100644 index 0000000..adc15a9 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_cb.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_ceiling_light_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_ceiling_light_bottom.png new file mode 100644 index 0000000..b037fb0 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_ceiling_light_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_ceiling_light_side.png b/mods/Decorations/ma_pops_furniture/textures/mp_ceiling_light_side.png new file mode 100644 index 0000000..492a802 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_ceiling_light_side.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_cf.png b/mods/Decorations/ma_pops_furniture/textures/mp_cf.png new file mode 100644 index 0000000..6224045 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_cf.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_chair_acacia_wood.png b/mods/Decorations/ma_pops_furniture/textures/mp_chair_acacia_wood.png new file mode 100644 index 0000000..3987e3f Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_chair_acacia_wood.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_chair_aspen_wood.png b/mods/Decorations/ma_pops_furniture/textures/mp_chair_aspen_wood.png new file mode 100644 index 0000000..9bb7106 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_chair_aspen_wood.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_chair_junglewood.png b/mods/Decorations/ma_pops_furniture/textures/mp_chair_junglewood.png new file mode 100644 index 0000000..9ee3ae8 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_chair_junglewood.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_chair_pine_wood.png b/mods/Decorations/ma_pops_furniture/textures/mp_chair_pine_wood.png new file mode 100644 index 0000000..779c49b Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_chair_pine_wood.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_chair_stone.png b/mods/Decorations/ma_pops_furniture/textures/mp_chair_stone.png new file mode 100644 index 0000000..1c085ec Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_chair_stone.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_chair_wood.png b/mods/Decorations/ma_pops_furniture/textures/mp_chair_wood.png new file mode 100644 index 0000000..c8371a7 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_chair_wood.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_channel_blast.png b/mods/Decorations/ma_pops_furniture/textures/mp_channel_blast.png new file mode 100644 index 0000000..0361c10 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_channel_blast.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_channel_cube.png b/mods/Decorations/ma_pops_furniture/textures/mp_channel_cube.png new file mode 100644 index 0000000..eaf02a4 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_channel_cube.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_channel_rainbow.png b/mods/Decorations/ma_pops_furniture/textures/mp_channel_rainbow.png new file mode 100644 index 0000000..2a5d59b Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_channel_rainbow.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_channel_static.png b/mods/Decorations/ma_pops_furniture/textures/mp_channel_static.png new file mode 100644 index 0000000..fc2bd6b Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_channel_static.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_cof_back.png b/mods/Decorations/ma_pops_furniture/textures/mp_cof_back.png new file mode 100644 index 0000000..82b1090 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_cof_back.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_cof_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_cof_bottom.png new file mode 100644 index 0000000..d7d6694 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_cof_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_cof_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_cof_front.png new file mode 100644 index 0000000..c61d8a6 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_cof_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_cof_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_cof_left.png new file mode 100644 index 0000000..f393481 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_cof_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_cof_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_cof_right.png new file mode 100644 index 0000000..6fb4f61 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_cof_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_cof_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_cof_top.png new file mode 100644 index 0000000..c975c99 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_cof_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_corn_r_back.png b/mods/Decorations/ma_pops_furniture/textures/mp_corn_r_back.png new file mode 100644 index 0000000..e43af63 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_corn_r_back.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_corn_r_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_corn_r_bottom.png new file mode 100644 index 0000000..57c1359 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_corn_r_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_corn_r_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_corn_r_front.png new file mode 100644 index 0000000..7ddcf28 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_corn_r_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_corn_r_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_corn_r_left.png new file mode 100644 index 0000000..7ddcf28 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_corn_r_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_corn_r_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_corn_r_right.png new file mode 100644 index 0000000..7ddcf28 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_corn_r_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_corn_r_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_corn_r_top.png new file mode 100644 index 0000000..f385e5e Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_corn_r_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_curtainb.png b/mods/Decorations/ma_pops_furniture/textures/mp_curtainb.png new file mode 100644 index 0000000..72d5c62 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_curtainb.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_curtains.png b/mods/Decorations/ma_pops_furniture/textures/mp_curtains.png new file mode 100644 index 0000000..ed1991d Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_curtains.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_cutting_board.png b/mods/Decorations/ma_pops_furniture/textures/mp_cutting_board.png new file mode 100644 index 0000000..fb9946e Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_cutting_board.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_db_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_db_bottom.png new file mode 100644 index 0000000..d14e2a0 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_db_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_db_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_db_front.png new file mode 100644 index 0000000..d52b19e Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_db_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_db_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_db_left.png new file mode 100644 index 0000000..f607f68 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_db_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_db_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_db_right.png new file mode 100644 index 0000000..b1c2aac Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_db_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_db_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_db_top.png new file mode 100644 index 0000000..183e0b6 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_db_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_dw_back.png b/mods/Decorations/ma_pops_furniture/textures/mp_dw_back.png new file mode 100644 index 0000000..3f9b174 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_dw_back.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_dw_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_dw_bottom.png new file mode 100644 index 0000000..cd29478 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_dw_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_dw_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_dw_front.png new file mode 100644 index 0000000..f16cfc1 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_dw_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_dw_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_dw_left.png new file mode 100644 index 0000000..70d9bb1 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_dw_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_dw_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_dw_right.png new file mode 100644 index 0000000..c137351 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_dw_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_dw_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_dw_top.png new file mode 100644 index 0000000..6737b51 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_dw_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_enc_back.png b/mods/Decorations/ma_pops_furniture/textures/mp_enc_back.png new file mode 100644 index 0000000..16168df Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_enc_back.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_enc_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_enc_bottom.png new file mode 100644 index 0000000..ee205a8 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_enc_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_enc_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_enc_front.png new file mode 100644 index 0000000..9083b4e Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_enc_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_enc_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_enc_left.png new file mode 100644 index 0000000..6961f43 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_enc_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_enc_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_enc_right.png new file mode 100644 index 0000000..35bb7c4 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_enc_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_enc_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_enc_top.png new file mode 100644 index 0000000..f385e5e Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_enc_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_f.png b/mods/Decorations/ma_pops_furniture/textures/mp_f.png new file mode 100644 index 0000000..6c49601 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_f.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_fireplace.png b/mods/Decorations/ma_pops_furniture/textures/mp_fireplace.png new file mode 100644 index 0000000..54c30cb Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_fireplace.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_fridge_back.png b/mods/Decorations/ma_pops_furniture/textures/mp_fridge_back.png new file mode 100644 index 0000000..273be54 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_fridge_back.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_fridge_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_fridge_bottom.png new file mode 100644 index 0000000..16d09ca Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_fridge_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_fridge_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_fridge_front.png new file mode 100644 index 0000000..4ac0e14 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_fridge_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_fridge_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_fridge_left.png new file mode 100644 index 0000000..1f5b3c8 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_fridge_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_fridge_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_fridge_right.png new file mode 100644 index 0000000..93c1b9c Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_fridge_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_fridge_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_fridge_top.png new file mode 100644 index 0000000..02b24d0 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_fridge_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_froz_back.png b/mods/Decorations/ma_pops_furniture/textures/mp_froz_back.png new file mode 100644 index 0000000..273be54 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_froz_back.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_froz_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_froz_bottom.png new file mode 100644 index 0000000..43ab54f Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_froz_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_froz_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_froz_front.png new file mode 100644 index 0000000..d587c6e Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_froz_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_froz_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_froz_left.png new file mode 100644 index 0000000..a8642e7 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_froz_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_froz_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_froz_right.png new file mode 100644 index 0000000..883559a Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_froz_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_froz_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_froz_top.png new file mode 100644 index 0000000..6db1a36 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_froz_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_grif_sides.png b/mods/Decorations/ma_pops_furniture/textures/mp_grif_sides.png new file mode 100644 index 0000000..2d4c74c Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_grif_sides.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_grif_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_grif_top.png new file mode 100644 index 0000000..1097a34 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_grif_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_grills.png b/mods/Decorations/ma_pops_furniture/textures/mp_grills.png new file mode 100644 index 0000000..f75c7ef Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_grills.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_grillt.png b/mods/Decorations/ma_pops_furniture/textures/mp_grillt.png new file mode 100644 index 0000000..38ecaae Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_grillt.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_grillton.png b/mods/Decorations/ma_pops_furniture/textures/mp_grillton.png new file mode 100644 index 0000000..b6b71a8 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_grillton.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_hammer.png b/mods/Decorations/ma_pops_furniture/textures/mp_hammer.png new file mode 100644 index 0000000..2af679a Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_hammer.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_hw_back.png b/mods/Decorations/ma_pops_furniture/textures/mp_hw_back.png new file mode 100644 index 0000000..019a669 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_hw_back.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_hw_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_hw_bottom.png new file mode 100644 index 0000000..56a5acc Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_hw_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_hw_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_hw_front.png new file mode 100644 index 0000000..019a669 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_hw_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_hw_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_hw_left.png new file mode 100644 index 0000000..8db1163 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_hw_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_hw_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_hw_right.png new file mode 100644 index 0000000..9dd3a36 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_hw_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_hw_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_hw_top.png new file mode 100644 index 0000000..d05e4f4 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_hw_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_itembirdbath.png b/mods/Decorations/ma_pops_furniture/textures/mp_itembirdbath.png new file mode 100644 index 0000000..93af8da Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_itembirdbath.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_knife.png b/mods/Decorations/ma_pops_furniture/textures/mp_knife.png new file mode 100644 index 0000000..8a495ae Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_knife.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_knob_back.png b/mods/Decorations/ma_pops_furniture/textures/mp_knob_back.png new file mode 100644 index 0000000..0a07897 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_knob_back.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_knob_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_knob_bottom.png new file mode 100644 index 0000000..c0cc0a9 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_knob_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_knob_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_knob_front.png new file mode 100644 index 0000000..0a07897 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_knob_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_knob_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_knob_left.png new file mode 100644 index 0000000..7cf78e6 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_knob_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_knob_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_knob_right.png new file mode 100644 index 0000000..d97eab2 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_knob_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_knob_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_knob_top.png new file mode 100644 index 0000000..a5d67fb Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_knob_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_lb.png b/mods/Decorations/ma_pops_furniture/textures/mp_lb.png new file mode 100644 index 0000000..735548f Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_lb.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_light_off.png b/mods/Decorations/ma_pops_furniture/textures/mp_light_off.png new file mode 100644 index 0000000..f4038c2 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_light_off.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_light_on.png b/mods/Decorations/ma_pops_furniture/textures/mp_light_on.png new file mode 100644 index 0000000..c65be58 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_light_on.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_light_wall.png b/mods/Decorations/ma_pops_furniture/textures/mp_light_wall.png new file mode 100644 index 0000000..02b24d0 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_light_wall.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_ls.png b/mods/Decorations/ma_pops_furniture/textures/mp_ls.png new file mode 100644 index 0000000..a017076 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_ls.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_lt.png b/mods/Decorations/ma_pops_furniture/textures/mp_lt.png new file mode 100644 index 0000000..c69c3ab Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_lt.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mask.png b/mods/Decorations/ma_pops_furniture/textures/mp_mask.png new file mode 100644 index 0000000..ec47286 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mask.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_med_back.png b/mods/Decorations/ma_pops_furniture/textures/mp_med_back.png new file mode 100644 index 0000000..688d070 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_med_back.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_med_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_med_front.png new file mode 100644 index 0000000..e677aa0 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_med_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mirror_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_bottom.png new file mode 100644 index 0000000..3cf396f Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mirror_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_front.png new file mode 100644 index 0000000..42f46ec Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mirror_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_left.png new file mode 100644 index 0000000..26315d5 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mirror_open_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_open_bottom.png new file mode 100644 index 0000000..4c3f158 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_open_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mirror_open_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_open_front.png new file mode 100644 index 0000000..b528755 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_open_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mirror_open_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_open_left.png new file mode 100644 index 0000000..a12a7e5 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_open_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mirror_open_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_open_right.png new file mode 100644 index 0000000..7e8faa9 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_open_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mirror_open_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_open_top.png new file mode 100644 index 0000000..ecf8123 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_open_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mirror_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_right.png new file mode 100644 index 0000000..f69431c Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mirror_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_top.png new file mode 100644 index 0000000..3e72cb4 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mirror_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mw_back.png b/mods/Decorations/ma_pops_furniture/textures/mp_mw_back.png new file mode 100644 index 0000000..02087b1 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mw_back.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mw_bar.png b/mods/Decorations/ma_pops_furniture/textures/mp_mw_bar.png new file mode 100644 index 0000000..ba516e7 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mw_bar.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mw_bar_on.png b/mods/Decorations/ma_pops_furniture/textures/mp_mw_bar_on.png new file mode 100644 index 0000000..65e3ffd Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mw_bar_on.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mw_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_mw_bottom.png new file mode 100644 index 0000000..9f48829 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mw_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mw_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_mw_front.png new file mode 100644 index 0000000..189d72e Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mw_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mw_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_mw_left.png new file mode 100644 index 0000000..e692807 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mw_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mw_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_mw_right.png new file mode 100644 index 0000000..40083f2 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mw_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_mw_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_mw_top.png new file mode 100644 index 0000000..1a56385 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_mw_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_oven_back.png b/mods/Decorations/ma_pops_furniture/textures/mp_oven_back.png new file mode 100644 index 0000000..6737b51 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_oven_back.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_oven_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_oven_bottom.png new file mode 100644 index 0000000..6737b51 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_oven_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_oven_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_oven_front.png new file mode 100644 index 0000000..9f60361 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_oven_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_oven_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_oven_left.png new file mode 100644 index 0000000..600fc6c Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_oven_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_oven_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_oven_right.png new file mode 100644 index 0000000..c489295 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_oven_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_oven_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_oven_top.png new file mode 100644 index 0000000..4e5c5d8 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_oven_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_r_cb.png b/mods/Decorations/ma_pops_furniture/textures/mp_r_cb.png new file mode 100644 index 0000000..b9e8a79 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_r_cb.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_r_cf.png b/mods/Decorations/ma_pops_furniture/textures/mp_r_cf.png new file mode 100644 index 0000000..4608de7 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_r_cf.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_radio_back.png b/mods/Decorations/ma_pops_furniture/textures/mp_radio_back.png new file mode 100644 index 0000000..1b66a17 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_radio_back.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_radio_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_radio_bottom.png new file mode 100644 index 0000000..4009a53 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_radio_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_radio_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_radio_front.png new file mode 100644 index 0000000..c0061b6 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_radio_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_radio_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_radio_left.png new file mode 100644 index 0000000..b6b12a3 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_radio_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_radio_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_radio_right.png new file mode 100644 index 0000000..aa5e244 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_radio_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_radio_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_radio_top.png new file mode 100644 index 0000000..eff5247 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_radio_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_s.png b/mods/Decorations/ma_pops_furniture/textures/mp_s.png new file mode 100644 index 0000000..7ba186a Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_s.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_shears.png b/mods/Decorations/ma_pops_furniture/textures/mp_shears.png new file mode 100644 index 0000000..c567a2f Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_shears.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_shk_back.png b/mods/Decorations/ma_pops_furniture/textures/mp_shk_back.png new file mode 100644 index 0000000..7c6d54e Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_shk_back.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_shk_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_shk_bottom.png new file mode 100644 index 0000000..2c6a3b3 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_shk_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_shk_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_shk_front.png new file mode 100644 index 0000000..a693d14 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_shk_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_shk_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_shk_left.png new file mode 100644 index 0000000..b9202fe Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_shk_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_shk_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_shk_right.png new file mode 100644 index 0000000..c91e817 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_shk_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_shk_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_shk_top.png new file mode 100644 index 0000000..9b8183d Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_shk_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_showbas_sides.png b/mods/Decorations/ma_pops_furniture/textures/mp_showbas_sides.png new file mode 100644 index 0000000..1d6bb5a Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_showbas_sides.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_showbas_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_showbas_top.png new file mode 100644 index 0000000..8acf7e8 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_showbas_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_si.png b/mods/Decorations/ma_pops_furniture/textures/mp_si.png new file mode 100644 index 0000000..40b4118 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_si.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_sink_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_sink_top.png new file mode 100644 index 0000000..7b98f85 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_sink_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_sofa.png b/mods/Decorations/ma_pops_furniture/textures/mp_sofa.png new file mode 100644 index 0000000..ca1fd6f Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_sofa.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_t.png b/mods/Decorations/ma_pops_furniture/textures/mp_t.png new file mode 100644 index 0000000..b8d8811 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_t.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_table_stone.png b/mods/Decorations/ma_pops_furniture/textures/mp_table_stone.png new file mode 100644 index 0000000..07087eb Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_table_stone.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_table_wood.png b/mods/Decorations/ma_pops_furniture/textures/mp_table_wood.png new file mode 100644 index 0000000..e390d27 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_table_wood.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_table_wood_acacia.png b/mods/Decorations/ma_pops_furniture/textures/mp_table_wood_acacia.png new file mode 100644 index 0000000..06921fd Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_table_wood_acacia.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_table_wood_aspen.png b/mods/Decorations/ma_pops_furniture/textures/mp_table_wood_aspen.png new file mode 100644 index 0000000..e282d59 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_table_wood_aspen.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_table_wood_jungle.png b/mods/Decorations/ma_pops_furniture/textures/mp_table_wood_jungle.png new file mode 100644 index 0000000..270c7f7 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_table_wood_jungle.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_table_wood_pine.png b/mods/Decorations/ma_pops_furniture/textures/mp_table_wood_pine.png new file mode 100644 index 0000000..bae817c Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_table_wood_pine.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_back.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_back.png new file mode 100644 index 0000000..908bf93 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_back.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_back_bread.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_back_bread.png new file mode 100644 index 0000000..b0e637a Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_back_bread.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_back_side.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_back_side.png new file mode 100644 index 0000000..358d0f5 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_back_side.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_back_toast.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_back_toast.png new file mode 100644 index 0000000..8f4cb1a Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_back_toast.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_bottom.png new file mode 100644 index 0000000..efc46b0 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_front.png new file mode 100644 index 0000000..47a5dc3 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_front_bread.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_front_bread.png new file mode 100644 index 0000000..88e2926 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_front_bread.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_front_side.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_front_side.png new file mode 100644 index 0000000..b6677b8 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_front_side.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_front_toast.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_front_toast.png new file mode 100644 index 0000000..bec7153 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_front_toast.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_left.png new file mode 100644 index 0000000..562c5a3 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_left_bread.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_left_bread.png new file mode 100644 index 0000000..eb9b86d Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_left_bread.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_left_toast.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_left_toast.png new file mode 100644 index 0000000..dc15ef8 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_left_toast.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_left_toast_side.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_left_toast_side.png new file mode 100644 index 0000000..215eb57 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_left_toast_side.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_right.png new file mode 100644 index 0000000..0aa9bbc Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_right_bread.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_right_bread.png new file mode 100644 index 0000000..c3e559f Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_right_bread.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_right_toast.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_right_toast.png new file mode 100644 index 0000000..dabbabe Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_right_toast.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_top.png new file mode 100644 index 0000000..7023850 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_top_bread.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_top_bread.png new file mode 100644 index 0000000..ab43a77 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_top_bread.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_top_bread_on.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_top_bread_on.png new file mode 100644 index 0000000..c254ef8 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_top_bread_on.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toas_top_toast.png b/mods/Decorations/ma_pops_furniture/textures/mp_toas_top_toast.png new file mode 100644 index 0000000..c58d277 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toas_top_toast.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_toast.png b/mods/Decorations/ma_pops_furniture/textures/mp_toast.png new file mode 100644 index 0000000..acbe34a Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_toast.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_top.png new file mode 100644 index 0000000..14af858 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_tp_back.png b/mods/Decorations/ma_pops_furniture/textures/mp_tp_back.png new file mode 100644 index 0000000..ac01469 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_tp_back.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_tp_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_tp_bottom.png new file mode 100644 index 0000000..ae3332e Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_tp_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_tp_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_tp_front.png new file mode 100644 index 0000000..77d00e5 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_tp_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_tp_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_tp_left.png new file mode 100644 index 0000000..0745276 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_tp_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_tp_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_tp_right.png new file mode 100644 index 0000000..f92629c Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_tp_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_tp_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_tp_top.png new file mode 100644 index 0000000..4dac23f Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_tp_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_up_bottom.png b/mods/Decorations/ma_pops_furniture/textures/mp_up_bottom.png new file mode 100644 index 0000000..84de2ad Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_up_bottom.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_up_front.png b/mods/Decorations/ma_pops_furniture/textures/mp_up_front.png new file mode 100644 index 0000000..7c3ed20 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_up_front.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_up_left.png b/mods/Decorations/ma_pops_furniture/textures/mp_up_left.png new file mode 100644 index 0000000..b747e4d Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_up_left.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_up_right.png b/mods/Decorations/ma_pops_furniture/textures/mp_up_right.png new file mode 100644 index 0000000..5449515 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_up_right.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_up_top.png b/mods/Decorations/ma_pops_furniture/textures/mp_up_top.png new file mode 100644 index 0000000..3facae9 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_up_top.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_vcr_off.png b/mods/Decorations/ma_pops_furniture/textures/mp_vcr_off.png new file mode 100644 index 0000000..3b1158b Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_vcr_off.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_vcr_on.png b/mods/Decorations/ma_pops_furniture/textures/mp_vcr_on.png new file mode 100644 index 0000000..afeb0f7 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_vcr_on.png differ diff --git a/mods/Decorations/ma_pops_furniture/textures/mp_wool_coloured_rainbow.png b/mods/Decorations/ma_pops_furniture/textures/mp_wool_coloured_rainbow.png new file mode 100644 index 0000000..22e80b0 Binary files /dev/null and b/mods/Decorations/ma_pops_furniture/textures/mp_wool_coloured_rainbow.png differ diff --git a/mods/Decorations/modpack.txt b/mods/Decorations/modpack.txt new file mode 100644 index 0000000..e69de29 diff --git a/mods/Decorations/signs_lib/.gitignore b/mods/Decorations/signs_lib/.gitignore new file mode 100644 index 0000000..01a1fe5 --- /dev/null +++ b/mods/Decorations/signs_lib/.gitignore @@ -0,0 +1,7 @@ +# temporary files +*~ + +# eclipse project files +.project +.settings +.buildpath diff --git a/mods/Decorations/signs_lib/copyright.txt b/mods/Decorations/signs_lib/copyright.txt new file mode 100644 index 0000000..68fa549 --- /dev/null +++ b/mods/Decorations/signs_lib/copyright.txt @@ -0,0 +1,8 @@ +Most code and all textures by Vanessa Ezekowitz. + +Some code copied and modified from the game's default mods (especially +doors) and ironzorg's flowers mod. + +Licenses: +* For the lua code, BSD. +* For all images and everything else, WTFPL. diff --git a/mods/Decorations/signs_lib/depends.txt b/mods/Decorations/signs_lib/depends.txt new file mode 100644 index 0000000..fbb8367 --- /dev/null +++ b/mods/Decorations/signs_lib/depends.txt @@ -0,0 +1,6 @@ +default +color +intllib? +screwdriver? +keyword_interact? +craft_guide? diff --git a/mods/Decorations/signs_lib/description.txt b/mods/Decorations/signs_lib/description.txt new file mode 100644 index 0000000..d157852 --- /dev/null +++ b/mods/Decorations/signs_lib/description.txt @@ -0,0 +1 @@ +Adds signs with readable text. diff --git a/mods/Decorations/signs_lib/encoding.lua b/mods/Decorations/signs_lib/encoding.lua new file mode 100644 index 0000000..16e35fe --- /dev/null +++ b/mods/Decorations/signs_lib/encoding.lua @@ -0,0 +1,265 @@ +-- encoding borrowed from signs_lib mod of https://github.com/lord-server/lord + +local ansi_decode = { + [128] = "\208\130", + [129] = "\208\131", + [130] = "\226\128\154", + [131] = "\209\147", + [132] = "\226\128\158", + [133] = "\226\128\166", + [134] = "\226\128\160", + [135] = "\226\128\161", + [136] = "\226\130\172", + [137] = "\226\128\176", + [138] = "\208\137", + [139] = "\226\128\185", + [140] = "\208\138", + [141] = "\208\140", + [142] = "\208\139", + [143] = "\208\143", + [144] = "\209\146", + [145] = "\226\128\152", + [146] = "\226\128\153", + [147] = "\226\128\156", + [148] = "\226\128\157", + [149] = "\226\128\162", + [150] = "\226\128\147", + [151] = "\226\128\148", + [152] = "\194\152", + [153] = "\226\132\162", + [154] = "\209\153", + [155] = "\226\128\186", + [156] = "\209\154", + [157] = "\209\156", + [158] = "\209\155", + [159] = "\209\159", + [160] = "\194\160", + [161] = "\209\142", + [162] = "\209\158", + [163] = "\208\136", + [164] = "\194\164", + [165] = "\210\144", + [166] = "\194\166", + [167] = "\194\167", + [168] = "\208\129", + [169] = "\194\169", + [170] = "\208\132", + [171] = "\194\171", + [172] = "\194\172", + [173] = "\194\173", + [174] = "\194\174", + [175] = "\208\135", + [176] = "\194\176", + [177] = "\194\177", + [178] = "\208\134", + [179] = "\209\150", + [180] = "\210\145", + [181] = "\194\181", + [182] = "\194\182", + [183] = "\194\183", + [184] = "\209\145", + [185] = "\226\132\150", + [186] = "\209\148", + [187] = "\194\187", + [188] = "\209\152", + [189] = "\208\133", + [190] = "\209\149", + [191] = "\209\151" +} +local utf8_decode = { + [128] = { + [147] = "\150", + [148] = "\151", + [152] = "\145", + [153] = "\146", + [154] = "\130", + [156] = "\147", + [157] = "\148", + [158] = "\132", + [160] = "\134", + [161] = "\135", + [162] = "\149", + [166] = "\133", + [176] = "\137", + [185] = "\139", + [186] = "\155" + }, + [130] = {[172] = "\136"}, + [132] = {[150] = "\185", [162] = "\153"}, + [194] = { + [152] = "\152", + [160] = "\160", + [164] = "\164", + [166] = "\166", + [167] = "\167", + [169] = "\169", + [171] = "\171", + [172] = "\172", + [173] = "\173", + [174] = "\174", + [176] = "\176", + [177] = "\177", + [181] = "\181", + [182] = "\182", + [183] = "\183", + [187] = "\187" + }, + [208] = { + [129] = "\168", + [130] = "\128", + [131] = "\129", + [132] = "\170", + [133] = "\189", + [134] = "\178", + [135] = "\175", + [136] = "\163", + [137] = "\138", + [138] = "\140", + [139] = "\142", + [140] = "\141", + [143] = "\143", + [144] = "\192", + [145] = "\193", + [146] = "\194", + [147] = "\195", + [148] = "\196", + [149] = "\197", + [150] = "\198", + [151] = "\199", + [152] = "\200", + [153] = "\201", + [154] = "\202", + [155] = "\203", + [156] = "\204", + [157] = "\205", + [158] = "\206", + [159] = "\207", + [160] = "\208", + [161] = "\209", + [162] = "\210", + [163] = "\211", + [164] = "\212", + [165] = "\213", + [166] = "\214", + [167] = "\215", + [168] = "\216", + [169] = "\217", + [170] = "\218", + [171] = "\219", + [172] = "\220", + [173] = "\221", + [174] = "\222", + [175] = "\223", + [176] = "\224", + [177] = "\225", + [178] = "\226", + [179] = "\227", + [180] = "\228", + [181] = "\229", + [182] = "\230", + [183] = "\231", + [184] = "\232", + [185] = "\233", + [186] = "\234", + [187] = "\235", + [188] = "\236", + [189] = "\237", + [190] = "\238", + [191] = "\239" + }, + [209] = { + [128] = "\240", + [129] = "\241", + [130] = "\242", + [131] = "\243", + [132] = "\244", + [133] = "\245", + [134] = "\246", + [135] = "\247", + [136] = "\248", + [137] = "\249", + [138] = "\250", + [139] = "\251", + [140] = "\252", + [141] = "\253", + [142] = "\254", + [143] = "\255", + [144] = "\161", + [145] = "\184", + [146] = "\144", + [147] = "\131", + [148] = "\186", + [149] = "\190", + [150] = "\179", + [151] = "\191", + [152] = "\188", + [153] = "\154", + [154] = "\156", + [155] = "\158", + [156] = "\157", + [158] = "\162", + [159] = "\159" + }, + [210] = {[144] = "\165", [145] = "\180"} +} + +local nmdc = { + [36] = "$", + [124] = "|" +} + +function AnsiToUtf8(s) + local r, b = "" + for i = 1, s and s:len() or 0 do + b = s:byte(i) + if b < 128 then + r = r .. string.char(b) + else + if b > 239 then + r = r .. "\209" .. string.char(b - 112) + elseif b > 191 then + r = r .. "\208" .. string.char(b - 48) + elseif ansi_decode[b] then + r = r .. ansi_decode[b] + else + r = r .. "_" + end + end + end + return r +end + +function Utf8ToAnsi(s) + local a, j, r, b = 0, 0, "" + for i = 1, s and s:len() or 0 do + b = s:byte(i) + if b < 128 then + if nmdc[b] then + r = r .. nmdc[b] + else + r = r .. string.char(b) + end + elseif a == 2 then + a, j = a - 1, b + elseif a == 1 then + --if j == nil or b == nil then return r end + --print(j) + --print(b) + --local ansi = utf8_decode[j] + --if ansi == nil then return r end + --if ansi[b] == nil then return r end + if utf8_decode[j] then + if utf8_decode[j][b] then + a, r = a - 1, r .. utf8_decode[j][b] + end + end + elseif b == 226 then + a = 2 + elseif b == 194 or b == 208 or b == 209 or b == 210 then + j, a = b, 1 + else + r = r .. "_" + end + end + return r +end diff --git a/mods/Decorations/signs_lib/init.lua b/mods/Decorations/signs_lib/init.lua new file mode 100644 index 0000000..472dad0 --- /dev/null +++ b/mods/Decorations/signs_lib/init.lua @@ -0,0 +1,999 @@ +-- This mod provides the visible text on signs library used by Home Decor +-- and perhaps other mods at some point in the future. Forked from thexyz's/ +-- PilzAdam's original text-on-signs mod and rewritten by Vanessa Ezekowitz +-- and Diego Martinez + +-- textpos = { +-- { delta = {entity position for 0° yaw}, exact yaw expression } +-- { delta = {entity position for 180° yaw}, exact yaw expression } +-- { delta = {entity position for 270° yaw}, exact yaw expression } +-- { delta = {entity position for 90° yaw}, exact yaw expression } +-- } +-- Made colored metal signs optionals +local enable_colored_metal_signs = true + +-- CWz's keyword interact mod uses this setting. +local current_keyword = minetest.settings:get("interact_keyword") or "iaccept" + +signs_lib = {} +signs_lib.path = minetest.get_modpath(minetest.get_current_modname()) +screwdriver = screwdriver or {} + +-- Load support for intllib. +local S, NS = dofile(signs_lib.path .. "/intllib.lua") +signs_lib.gettext = S + +-- text encoding +dofile(signs_lib.path .. "/encoding.lua"); + +signs_lib.wallmounted_rotate = function(pos, node, user, mode, new_param2) + if mode ~= screwdriver.ROTATE_AXIS then return false end + minetest.swap_node(pos, {name = node.name, param2 = (node.param2 + 1) % 6}) + for _, v in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do + local e = v:get_luaentity() + if e and e.name == "signs:text" then + v:remove() + end + end + signs_lib.update_sign(pos) + return true +end + +signs_lib.modpath = minetest.get_modpath("signs_lib") + +local DEFAULT_TEXT_SCALE = {x=0.8, y=0.5} + +signs_lib.regular_wall_sign_model = { + nodebox = { + type = "wallmounted", + wall_side = { -0.5, -0.25, -0.4375, -0.4375, 0.375, 0.4375 }, + wall_bottom = { -0.4375, -0.5, -0.25, 0.4375, -0.4375, 0.375 }, + wall_top = { -0.4375, 0.4375, -0.375, 0.4375, 0.5, 0.25 } + }, + textpos = { + nil, + nil, + {delta = { x = 0.41, y = 0.07, z = 0 }, yaw = math.pi / -2}, + {delta = { x = -0.41, y = 0.07, z = 0 }, yaw = math.pi / 2}, + {delta = { x = 0, y = 0.07, z = 0.41 }, yaw = 0}, + {delta = { x = 0, y = 0.07, z = -0.41 }, yaw = math.pi}, + } +} + +signs_lib.metal_wall_sign_model = { + nodebox = { + type = "fixed", + fixed = {-0.4375, -0.25, 0.4375, 0.4375, 0.375, 0.5} + }, + textpos = { + {delta = { x = 0, y = 0.07, z = 0.41 }, yaw = 0}, + {delta = { x = 0.41, y = 0.07, z = 0 }, yaw = math.pi / -2}, + {delta = { x = 0, y = 0.07, z = -0.41 }, yaw = math.pi}, + {delta = { x = -0.41, y = 0.07, z = 0 }, yaw = math.pi / 2}, + } +} + +signs_lib.yard_sign_model = { + nodebox = { + type = "fixed", + fixed = { + {-0.4375, -0.25, -0.0625, 0.4375, 0.375, 0}, + {-0.0625, -0.5, -0.0625, 0.0625, -0.1875, 0}, + } + }, + textpos = { + {delta = { x = 0, y = 0.07, z = -0.08 }, yaw = 0}, + {delta = { x = -0.08, y = 0.07, z = 0 }, yaw = math.pi / -2}, + {delta = { x = 0, y = 0.07, z = 0.08 }, yaw = math.pi}, + {delta = { x = 0.08, y = 0.07, z = 0 }, yaw = math.pi / 2}, + } +} + +signs_lib.hanging_sign_model = { + nodebox = { + type = "fixed", + fixed = { + {-0.4375, -0.3125, -0.0625, 0.4375, 0.3125, 0}, + {-0.4375, 0.25, -0.03125, 0.4375, 0.5, -0.03125}, + } + }, + textpos = { + {delta = { x = 0, y = -0.02, z = -0.08 }, yaw = 0}, + {delta = { x = -0.08, y = -0.02, z = 0 }, yaw = math.pi / -2}, + {delta = { x = 0, y = -0.02, z = 0.08 }, yaw = math.pi}, + {delta = { x = 0.08, y = -0.02, z = 0 }, yaw = math.pi / 2}, + } +} + +signs_lib.sign_post_model = { + nodebox = { + type = "fixed", + fixed = { + {-0.4375, -0.25, -0.1875, 0.4375, 0.375, -0.125}, + {-0.125, -0.5, -0.125, 0.125, 0.5, 0.125}, + } + }, + textpos = { + {delta = { x = 0, y = 0.07, z = -0.2 }, yaw = 0}, + {delta = { x = -0.2, y = 0.07, z = 0 }, yaw = math.pi / -2}, + {delta = { x = 0, y = 0.07, z = 0.2 }, yaw = math.pi}, + {delta = { x = 0.2, y = 0.07, z = 0 }, yaw = math.pi / 2}, + } +} + +-- the list of standard sign nodes + +signs_lib.sign_node_list = { + "signs:sign_wall_green", + "signs:sign_wall_yellow", + "signs:sign_wall_red", + "signs:sign_wall_white", + "signs:sign_wall_black", + "signs:sign_wall_orange", + "signs:sign_wall_blue", + "signs:sign_wall_pink", +} + +local default_sign, default_sign_image + +-- Default sign was renamed in 0.4.14. Support both & old versions. +if minetest.registered_nodes["default:sign_wall_wood"] then + default_sign = "default:sign_wall_wood" + default_sign_image = "default_sign_wood.png" +else + default_sign = "default:sign_wall" + default_sign_image = "default_sign_wall.png" +end + +default_sign_metal = "default:sign_wall_steel" +default_sign_metal_image = "default_sign_steel.png" + +--table copy + +function signs_lib.table_copy(t) + local nt = { }; + for k, v in pairs(t) do + if type(v) == "table" then + nt[k] = signs_lib.table_copy(v) + else + nt[k] = v + end + end + return nt +end + +-- infinite stacks + +if not minetest.settings:get_bool("creative_mode") then + signs_lib.expect_infinite_stacks = false +else + signs_lib.expect_infinite_stacks = true +end + +-- CONSTANTS + +-- Path to the textures. +local TP = signs_lib.path .. "/textures" +-- Font file formatter +local CHAR_FILE = "%s_%02x.png" +-- Fonts path +local CHAR_PATH = TP .. "/" .. CHAR_FILE + +-- Font name. +local font_name = "hdf" + +-- Lots of overkill here. KISS advocates, go away, shoo! ;) -- kaeza + +local PNG_HDR = string.char(0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A) + +-- check if a file does exist +-- to avoid reopening file after checking again +-- pass TRUE as second argument +function file_exists(name, return_handle, mode) + mode = mode or "r"; + local f = io.open(name, mode) + if f ~= nil then + if (return_handle) then + return f + end + io.close(f) + return true + else + return false + end +end + +-- Read the image size from a PNG file. +-- Returns image_w, image_h. +-- Only the LSB is read from each field! +local function read_image_size(filename) + local f = file_exists(filename, true, "rb") + -- file might not exist (don't crash the game) + if (not f) then + return 0, 0 + end + f:seek("set", 0x0) + local hdr = f:read(string.len(PNG_HDR)) + if hdr ~= PNG_HDR then + f:close() + return + end + f:seek("set", 0x13) + local ws = f:read(1) + f:seek("set", 0x17) + local hs = f:read(1) + f:close() + return ws:byte(), hs:byte() +end + +-- Set by build_char_db() +local LINE_HEIGHT +local SIGN_WIDTH +local COLORBGW, COLORBGH + +-- Size of the canvas, in characters. +-- Please note that CHARS_PER_LINE is multiplied by the average character +-- width to get the total width of the canvas, so for proportional fonts, +-- either more or fewer characters may fit on a line. +local CHARS_PER_LINE = 20 +local NUMBER_OF_LINES = 6 + +-- 6 rows, max 80 chars per, plus a bit of fudge to +-- avoid excess trimming (e.g. due to color codes) + +local MAX_INPUT_CHARS = 600 + +-- This holds the individual character widths. +-- Indexed by the actual character (e.g. charwidth["A"]) +local charwidth + +-- helper functions to trim sign text input/output + +local function trim_input(text) + return text:sub(1, math.min(MAX_INPUT_CHARS, text:len())) +end + +local function build_char_db() + + charwidth = { } + + -- To calculate average char width. + local total_width = 0 + local char_count = 0 + + for c = 32, 255 do + local w, h = read_image_size(CHAR_PATH:format(font_name, c)) + if w and h then + local ch = string.char(c) + charwidth[ch] = w + total_width = total_width + w + char_count = char_count + 1 + end + end + + COLORBGW, COLORBGH = read_image_size(TP.."/slc_n.png") + assert(COLORBGW and COLORBGH, "error reading bg dimensions") + LINE_HEIGHT = COLORBGH + + -- XXX: Is there a better way to calc this? + SIGN_WIDTH = math.floor((total_width / char_count) * CHARS_PER_LINE) + +end + +local sign_groups = {choppy=2, dig_immediate=2} + +local fences_with_sign = { } + +-- some local helper functions + +local function split_lines_and_words_old(text) + local lines = { } + local line = { } + if not text then return end + for word in text:gmatch("%S+") do + if word == "|" then + table.insert(lines, line) + if #lines >= NUMBER_OF_LINES then break end + line = { } + elseif word == "\\|" then + table.insert(line, "|") + else + table.insert(line, word) + end + end + table.insert(lines, line) + return lines +end + +local function split_lines_and_words(text) + if not text then return end + text = string.gsub(text, "@KEYWORD", current_keyword) + local lines = { } + for _, line in ipairs(text:split("\n")) do + table.insert(lines, line:split(" ")) + end + return lines +end + +local math_max = math.max + +local function fill_line(x, y, w, c) + c = c or "0" + local tex = { } + for xx = 0, math.max(0, w), COLORBGW do + table.insert(tex, (":%d,%d=slc_%s.png"):format(x + xx, y, c)) + end + return table.concat(tex) +end + +-- make char texture file name +-- if texture file does not exist use fallback texture instead +local function char_tex(font_name, ch) + local c = ch:byte() + local exists, tex = file_exists(CHAR_PATH:format(font_name, c)) + if exists and c ~= 14 then + tex = CHAR_FILE:format(font_name, c) + else + tex = CHAR_FILE:format(font_name, 0x0) + end + return tex, exists +end + +local function make_line_texture(line, lineno, pos) + + local width = 0 + local maxw = 0 + + local words = { } + local n = minetest.registered_nodes[minetest.get_node(pos).name] + local default_color = n.default_color or 0 + + local cur_color = tonumber(default_color, 16) + + -- We check which chars are available here. + for word_i, word in ipairs(line) do + local chars = { } + local ch_offs = 0 + local word_l = #word + local i = 1 + while i <= word_l do + local c = word:sub(i, i) + if c == "#" then + local cc = tonumber(word:sub(i+1, i+1), 16) + if cc then + i = i + 1 + cur_color = cc + end + else + local w = charwidth[c] + if w then + width = width + w + 1 + if width >= (SIGN_WIDTH - charwidth[" "]) then + width = 0 + else + maxw = math_max(width, maxw) + end + if #chars < MAX_INPUT_CHARS then + table.insert(chars, { + off = ch_offs, + tex = char_tex(font_name, c), + col = ("%X"):format(cur_color), + }) + end + ch_offs = ch_offs + w + end + end + i = i + 1 + end + width = width + charwidth[" "] + 1 + maxw = math_max(width, maxw) + table.insert(words, { chars=chars, w=ch_offs }) + end + + -- Okay, we actually build the "line texture" here. + + local texture = { } + + local start_xpos = math.floor((SIGN_WIDTH - maxw) / 2) + + local xpos = start_xpos + local ypos = (LINE_HEIGHT * lineno) + + cur_color = nil + + for word_i, word in ipairs(words) do + local xoffs = (xpos - start_xpos) + if (xoffs > 0) and ((xoffs + word.w) > maxw) then + table.insert(texture, fill_line(xpos, ypos, maxw, "n")) + xpos = start_xpos + ypos = ypos + LINE_HEIGHT + lineno = lineno + 1 + if lineno >= NUMBER_OF_LINES then break end + table.insert(texture, fill_line(xpos, ypos, maxw, cur_color)) + end + for ch_i, ch in ipairs(word.chars) do + if ch.col ~= cur_color then + cur_color = ch.col + table.insert(texture, fill_line(xpos + ch.off, ypos, maxw, cur_color)) + end + table.insert(texture, (":%d,%d=%s"):format(xpos + ch.off, ypos, ch.tex)) + end + table.insert( + texture, + (":%d,%d="):format(xpos + word.w, ypos) .. char_tex(font_name, " ") + ) + xpos = xpos + word.w + charwidth[" "] + if xpos >= (SIGN_WIDTH + charwidth[" "]) then break end + end + + table.insert(texture, fill_line(xpos, ypos, maxw, "n")) + table.insert(texture, fill_line(start_xpos, ypos + LINE_HEIGHT, maxw, "n")) + + return table.concat(texture), lineno +end + +local function make_sign_texture(lines, pos) + local texture = { ("[combine:%dx%d"):format(SIGN_WIDTH, LINE_HEIGHT * NUMBER_OF_LINES) } + local lineno = 0 + for i = 1, #lines do + if lineno >= NUMBER_OF_LINES then break end + local linetex, ln = make_line_texture(lines[i], lineno, pos) + table.insert(texture, linetex) + lineno = ln + 1 + end + table.insert(texture, "^[makealpha:0,0,0") + return table.concat(texture, "") +end + +local function set_obj_text(obj, text, new, pos) + local split = new and split_lines_and_words or split_lines_and_words_old + local text_ansi = Utf8ToAnsi(text) + local n = minetest.registered_nodes[minetest.get_node(pos).name] + local text_scale = (n and n.text_scale) or DEFAULT_TEXT_SCALE + obj:set_properties({ + textures={make_sign_texture(split(text_ansi), pos)}, + visual_size = text_scale, + }) +end + +signs_lib.construct_sign = function(pos, locked) + local meta = minetest.get_meta(pos) + meta:set_string( + "formspec", + "size[6,4]".. + "textarea[0,-0.3;6.5,3;text;;${text}]".. + "button_exit[2,3.4;2,1;ok;"..S("Write").."]".. + "") + meta:set_string("infotext", "") +end + +signs_lib.destruct_sign = function(pos) + local objects = minetest.get_objects_inside_radius(pos, 0.5) + for _, v in ipairs(objects) do + local e = v:get_luaentity() + if e and e.name == "signs:text" then + v:remove() + end + end +end + +local function make_infotext(text) + text = trim_input(text) + local lines = split_lines_and_words(text) or {} + local lines2 = { } + for _, line in ipairs(lines) do + table.insert(lines2, (table.concat(line, " "):gsub("#[0-9a-fA-F]", ""):gsub("##", "#"))) + end + return table.concat(lines2, "\n") +end + +signs_lib.update_sign = function(pos, fields, owner) + + -- First, check if the interact keyword from CWz's mod is being set, + -- or has been changed since the last restart... + + local meta = minetest.get_meta(pos) + local stored_text = meta:get_string("text") or "" + current_keyword = rawget(_G, "mki_interact_keyword") or current_keyword + + if fields then -- ...we're editing the sign. + if fields.text and string.find(dump(fields.text), "@KEYWORD") then + meta:set_string("keyword", current_keyword) + else + meta:set_string("keyword", nil) + end + elseif string.find(dump(stored_text), "@KEYWORD") then -- we need to check if the password is being set/changed + + local stored_keyword = meta:get_string("keyword") + if stored_keyword and stored_keyword ~= "" and stored_keyword ~= current_keyword then + signs_lib.destruct_sign(pos) + meta:set_string("keyword", current_keyword) + local ownstr = "" + if owner then ownstr = S("Locked sign, owned by @1\n", owner) end + meta:set_string("infotext", ownstr..string.gsub(make_infotext(stored_text), "@KEYWORD", current_keyword).." ") + end + end + + local new + + if fields then + + fields.text = trim_input(fields.text) + + local ownstr = "" + if owner then ownstr = S("Locked sign, owned by @1\n", owner) end + + meta:set_string("infotext", ownstr..string.gsub(make_infotext(fields.text), "@KEYWORD", current_keyword).." ") + meta:set_string("text", fields.text) + + meta:set_int("__signslib_new_format", 1) + new = true + else + new = (meta:get_int("__signslib_new_format") ~= 0) + end + local text = meta:get_string("text") + if text == nil then return end + local objects = minetest.get_objects_inside_radius(pos, 0.5) + local found + for _, v in ipairs(objects) do + local e = v:get_luaentity() + if e and e.name == "signs:text" then + if found then + v:remove() + else + set_obj_text(v, text, new, pos) + found = true + end + end + end + if found then + return + end + + -- if there is no entity + local sign_info + local signnode = minetest.get_node(pos) + local signname = signnode.name + local textpos = minetest.registered_nodes[signname].textpos + if textpos then + sign_info = textpos[minetest.get_node(pos).param2 + 1] + elseif signnode.name == "signs:sign_yard" then + sign_info = signs_lib.yard_sign_model.textpos[minetest.get_node(pos).param2 + 1] + elseif signnode.name == "signs:sign_hanging" then + sign_info = signs_lib.hanging_sign_model.textpos[minetest.get_node(pos).param2 + 1] + elseif string.find(signnode.name, "sign_wall") then + if signnode.name == default_sign + or signnode.name == default_sign_metal + or signnode.name == "locked_sign:sign_wall_locked" then + sign_info = signs_lib.regular_wall_sign_model.textpos[minetest.get_node(pos).param2 + 1] + else + sign_info = signs_lib.metal_wall_sign_model.textpos[minetest.get_node(pos).param2 + 1] + end + else -- ...it must be a sign on a fence post. + sign_info = signs_lib.sign_post_model.textpos[minetest.get_node(pos).param2 + 1] + end + if sign_info == nil then + return + end + local text = minetest.add_entity({x = pos.x + sign_info.delta.x, + y = pos.y + sign_info.delta.y, + z = pos.z + sign_info.delta.z}, "signs:text") + text:setyaw(sign_info.yaw) +end + +-- What kind of sign do we need to place, anyway? + +function signs_lib.determine_sign_type(itemstack, placer, pointed_thing, locked) + local name + name = minetest.get_node(pointed_thing.under).name + if fences_with_sign[name] then + if minetest.is_protected(pointed_thing.under, placer:get_player_name()) then + minetest.record_protection_violation(pointed_thing.under, + placer:get_player_name()) + return itemstack + end + else + name = minetest.get_node(pointed_thing.above).name + local def = minetest.registered_nodes[name] + if not def.buildable_to then + return itemstack + end + if minetest.is_protected(pointed_thing.above, placer:get_player_name()) then + minetest.record_protection_violation(pointed_thing.above, + placer:get_player_name()) + return itemstack + end + end + + local node=minetest.get_node(pointed_thing.under) + + if minetest.registered_nodes[node.name] and + minetest.registered_nodes[node.name].on_rightclick and + not placer:get_player_control().sneak then + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack, pointed_thing) + else + local above = pointed_thing.above + local under = pointed_thing.under + local dir = {x = under.x - above.x, + y = under.y - above.y, + z = under.z - above.z} + + local wdir = minetest.dir_to_wallmounted(dir) + + local placer_pos = placer:getpos() + if placer_pos then + dir = { + x = above.x - placer_pos.x, + y = above.y - placer_pos.y, + z = above.z - placer_pos.z + } + end + + local fdir = minetest.dir_to_facedir(dir) + local pt_name = minetest.get_node(under).name + local signname = itemstack:get_name() + + if fences_with_sign[pt_name] and signname == default_sign then + minetest.add_node(under, {name = fences_with_sign[pt_name], param2 = fdir}) + elseif wdir == 0 and signname == default_sign then + minetest.add_node(above, {name = "signs:sign_hanging", param2 = fdir}) + elseif wdir == 1 and signname == default_sign then + minetest.add_node(above, {name = "signs:sign_yard", param2 = fdir}) + elseif signname == default_sign_metal then + minetest.add_node(above, {name = signname, param2 = wdir }) + elseif signname ~= default_sign + and signname ~= default_sign_metal + and signname ~= "locked_sign:sign_wall_locked" then -- it's a signs_lib colored metal wall sign. + minetest.add_node(above, {name = signname, param2 = fdir}) + else -- it must be a default or locked wooden wall sign + minetest.add_node(above, {name = signname, param2 = wdir }) -- note it's wallmounted here! + if locked then + local meta = minetest.get_meta(above) + local owner = placer:get_player_name() + meta:set_string("owner", owner) + end + end + + if not signs_lib.expect_infinite_stacks then + itemstack:take_item() + end + return itemstack + end +end + +function signs_lib.receive_fields(pos, formname, fields, sender, lock) + if minetest.is_protected(pos, sender:get_player_name()) then + minetest.record_protection_violation(pos, + sender:get_player_name()) + return + end + local lockstr = lock and S("locked ") or "" + if fields and fields.text and fields.ok then + minetest.log("action", S("@1 wrote \"@2\" to @3sign at @4", + (sender:get_player_name() or ""), + fields.text:gsub('\\', '\\\\'):gsub("\n", "\\n"), + lockstr, + minetest.pos_to_string(pos) + )) + if lock then + signs_lib.update_sign(pos, fields, sender:get_player_name()) + else + signs_lib.update_sign(pos, fields) + end + end +end + +-- metal, colored signs +if enable_colored_metal_signs then + -- array : color, translated color, default text color + + local sign_colors = { + {"green", S("green"), "f", color3}, + {"yellow", S("yellow"), "0", color7}, + {"red", S("red"), "f", color6}, + {"white", S("white"), "4", color4}, + {"black", S("black"), "0", color1}, + {"orange", S("orange"), "0", color5}, + {"blue", S("blue"), "f", color2}, + {"pink", S("pink"), "f", color8}, + } + + for i, color in ipairs(sign_colors) do + minetest.register_node(":signs:sign_wall_"..color[1], { + description = S("Sign (@1, metal)", color[2]), + inventory_image = "signs.png^[colorize:#"..color[4]..":70", + wield_image = "color_hand" .. color[1] .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + node_placement_prediction = "", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = signs_lib.metal_wall_sign_model.nodebox, + tiles = { + "signs_metal_tb.png", + "signs_metal_tb.png", + "signs_metal_sides.png", + "signs_metal_sides.png", + "signs_metal_back.png", + "color_white.png^[colorize:#"..color[4]..":70" + }, + default_color = color[3], + groups = sign_groups, + on_place = function(itemstack, placer, pointed_thing) + return signs_lib.determine_sign_type(itemstack, placer, pointed_thing) + end, + on_construct = function(pos) + signs_lib.construct_sign(pos) + end, + on_destruct = function(pos) + signs_lib.destruct_sign(pos) + end, + on_receive_fields = function(pos, formname, fields, sender) + signs_lib.receive_fields(pos, formname, fields, sender) + end, + on_punch = function(pos, node, puncher) + signs_lib.update_sign(pos) + end, + }) + end +end + +local signs_text_on_activate + +signs_text_on_activate = function(self) + local pos = self.object:getpos() + local meta = minetest.get_meta(pos) + local text = meta:get_string("text") + local new = (meta:get_int("__signslib_new_format") ~= 0) + if text and minetest.registered_nodes[minetest.get_node(pos).name] then + text = trim_input(text) + set_obj_text(self.object, text, new, pos) + end +end + +minetest.register_entity(":signs:text", { + collisionbox = { 0, 0, 0, 0, 0, 0 }, + visual = "upright_sprite", + textures = {}, + + on_activate = signs_text_on_activate, +}) + +-- And the good stuff here! :-) + +function signs_lib.register_fence_with_sign(fencename, fencewithsignname) + local def = minetest.registered_nodes[fencename] + local def_sign = minetest.registered_nodes[fencewithsignname] + if not (def and def_sign) then + minetest.log("warning", "[signs_lib] "..S("Attempt to register unknown node as fence")) + return + end + def = signs_lib.table_copy(def) + def_sign = signs_lib.table_copy(def_sign) + fences_with_sign[fencename] = fencewithsignname + + def_sign.on_place = function(itemstack, placer, pointed_thing, ...) + local node_above = minetest.get_node_or_nil(pointed_thing.above) + local node_under = minetest.get_node_or_nil(pointed_thing.under) + local def_above = node_above and minetest.registered_nodes[node_above.name] + local def_under = node_under and minetest.registered_nodes[node_under.name] + local fdir = minetest.dir_to_facedir(placer:get_look_dir()) + local playername = placer:get_player_name() + + if minetest.is_protected(pointed_thing.under, playername) then + minetest.record_protection_violation(pointed_thing.under, playername) + return itemstack + end + + if minetest.is_protected(pointed_thing.above, playername) then + minetest.record_protection_violation(pointed_thing.above, playername) + return itemstack + end + + if def_under and def_under.on_rightclick then + return def_under.on_rightclick(pointed_thing.under, node_under, placer, itemstack, pointed_thing) or itemstack + elseif def_under and def_under.buildable_to then + minetest.add_node(pointed_thing.under, {name = fencename, param2 = fdir}) + if not signs_lib.expect_infinite_stacks then + itemstack:take_item() + end + placer:set_wielded_item(itemstack) + elseif def_above and def_above.buildable_to then + minetest.add_node(pointed_thing.above, {name = fencename, param2 = fdir}) + if not signs_lib.expect_infinite_stacks then + itemstack:take_item() + end + placer:set_wielded_item(itemstack) + end + return itemstack + end + def_sign.on_construct = function(pos, ...) + signs_lib.construct_sign(pos) + end + def_sign.on_destruct = function(pos, ...) + signs_lib.destruct_sign(pos) + end + def_sign.on_receive_fields = function(pos, formname, fields, sender) + signs_lib.receive_fields(pos, formname, fields, sender) + end + def_sign.on_punch = function(pos, node, puncher, ...) + signs_lib.update_sign(pos) + end + local fencename = fencename + def_sign.after_dig_node = function(pos, node, ...) + node.name = fencename + minetest.add_node(pos, node) + end + def_sign.drop = default_sign + minetest.register_node(":"..fencename, def) + minetest.register_node(":"..fencewithsignname, def_sign) + table.insert(signs_lib.sign_node_list, fencewithsignname) + minetest.log("verbose", S("Registered @1 and @2", fencename, fencewithsignname)) +end + +build_char_db() + +minetest.register_alias("homedecor:fence_wood_with_sign", "signs:sign_post") +minetest.register_alias("sign_wall_locked", "locked_sign:sign_wall_locked") + +signs_lib.register_fence_with_sign("default:fence_wood", "signs:sign_post") + +-- restore signs' text after /clearobjects and the like, the next time +-- a block is reloaded by the server. + +minetest.register_lbm({ + nodenames = signs_lib.sign_node_list, + name = "signs_lib:restore_sign_text", + label = "Restore sign text", + run_at_every_load = true, + action = function(pos, node) + signs_lib.update_sign(pos) + end +}) + +-- locked sign + +minetest.register_craft({ + output = "locked_sign:sign_wall_locked", + recipe = { + {default_sign}, + {"default:steel_ingot"}, + }, +}) + +-- craft recipes for the metal signs +if enable_colored_metal_signs then + + minetest.register_craft( { + output = "signs:sign_wall_green", + recipe = { + { "dye:dark_green", "dye:white", "dye:dark_green" }, + { "", default_sign_metal, "" } + }, + }) + + minetest.register_craft( { + output = "signs:sign_wall_green 2", + recipe = { + { "dye:dark_green", "dye:white", "dye:dark_green" }, + { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" } + }, + }) + + minetest.register_craft( { + output = "signs:sign_wall_yellow", + recipe = { + { "dye:yellow", "dye:black", "dye:yellow" }, + { "", default_sign_metal, "" } + }, + }) + + minetest.register_craft( { + output = "signs:sign_wall_yellow 2", + recipe = { + { "dye:yellow", "dye:black", "dye:yellow" }, + { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" } + }, + }) + + minetest.register_craft( { + output = "signs:sign_wall_red", + recipe = { + { "dye:red", "dye:white", "dye:red" }, + { "", default_sign_metal, "" } + }, + }) + + minetest.register_craft( { + output = "signs:sign_wall_red 2", + recipe = { + { "dye:red", "dye:white", "dye:red" }, + { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" } + }, + }) + + minetest.register_craft( { + output = "signs:sign_wall_white_red", + recipe = { + { "dye:white", "dye:red", "dye:white" }, + { "", default_sign_metal, "" } + }, + }) + + minetest.register_craft( { + output = "signs:sign_wall_white_red 2", + recipe = { + { "dye:white", "dye:red", "dye:white" }, + { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" } + }, + }) + + minetest.register_craft( { + output = "signs:sign_wall_white_black", + recipe = { + { "dye:white", "dye:black", "dye:white" }, + { "", default_sign_metal, "" } + }, + }) + + minetest.register_craft( { + output = "signs:sign_wall_white_black 2", + recipe = { + { "dye:white", "dye:black", "dye:white" }, + { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" } + }, + }) + + minetest.register_craft( { + output = "signs:sign_wall_orange", + recipe = { + { "dye:orange", "dye:black", "dye:orange" }, + { "", default_sign_metal, "" } + }, + }) + + minetest.register_craft( { + output = "signs:sign_wall_orange 2", + recipe = { + { "dye:orange", "dye:black", "dye:orange" }, + { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" } + }, + }) + + minetest.register_craft( { + output = "signs:sign_wall_blue", + recipe = { + { "dye:blue", "dye:white", "dye:blue" }, + { "", default_sign_metal, "" } + }, + }) + + minetest.register_craft( { + output = "signs:sign_wall_blue 2", + recipe = { + { "dye:blue", "dye:white", "dye:blue" }, + { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" } + }, + }) + + minetest.register_craft( { + output = "signs:sign_wall_brown", + recipe = { + { "dye:brown", "dye:white", "dye:brown" }, + { "", default_sign_metal, "" } + }, + }) + + minetest.register_craft( { + output = "signs:sign_wall_brown 2", + recipe = { + { "dye:brown", "dye:white", "dye:brown" }, + { "steel:sheet_metal", "steel:sheet_metal", "steel:sheet_metal" } + }, + }) +end + +if minetest.settings:get("log_mods") then + minetest.log("action", S("[MOD] signs loaded")) +end diff --git a/mods/Decorations/signs_lib/intllib.lua b/mods/Decorations/signs_lib/intllib.lua new file mode 100644 index 0000000..6669d72 --- /dev/null +++ b/mods/Decorations/signs_lib/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/Decorations/signs_lib/locale/de.po b/mods/Decorations/signs_lib/locale/de.po new file mode 100644 index 0000000..a2f4150 --- /dev/null +++ b/mods/Decorations/signs_lib/locale/de.po @@ -0,0 +1,97 @@ +# German Translation for the signs_lib mod. +# Copyright (C) 2018 Vanessa Ezekowitz +# This file is distributed under the same license as the signs_lib package. +# Xanthin, 2017. +# CodeXP , 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-31 18:31+0200\n" +"PO-Revision-Date: 2018-03-24 22:00+0100\n" +"Last-Translator: CodeXP \n" +"Language-Team: \n" +"Language: de\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" + +#: init.lua +msgid "Write" +msgstr "schreiben" + +#: init.lua +msgid "Locked sign, owned by @1\n" +msgstr "gesperrter Schild, gehört @1\n" + +#: init.lua +msgid "locked " +msgstr "gesperrt " + +#: init.lua +#, fuzzy +msgid "@1 wrote \"@2\" to @3sign at @4" +msgstr "@1 schrieb \"@2\" auf das @3Schild bei @4" + +#: init.lua +msgid "Sign" +msgstr "Schild" + +#: init.lua +msgid "Can edit all locked signs" +msgstr "Kann alle gesperrte Schilder bearbeiten" + +#: init.lua +msgid "Locked Sign" +msgstr "gesperrter Schild" + +#: init.lua +msgid "green" +msgstr "grün" + +#: init.lua +msgid "yellow" +msgstr "gelb" + +#: init.lua +msgid "red" +msgstr "rot" + +#: init.lua +msgid "white_red" +msgstr "weißrot" + +#: init.lua +msgid "white_black" +msgstr "schwarzweiß" + +#: init.lua +msgid "orange" +msgstr "orange" + +#: init.lua +msgid "blue" +msgstr "blau" + +#: init.lua +msgid "brown" +msgstr "braun" + +#: init.lua +msgid "Sign (@1, metal)" +msgstr "Schild (@1, Metall)" + +#: init.lua +msgid "Attempt to register unknown node as fence" +msgstr "Versuch ein unbekanntes Element als Zaun zu registrieren" + +#: init.lua +msgid "Registered @1 and @2" +msgstr "Registrierte @1 und @2" + +#: init.lua +msgid "[MOD] signs loaded" +msgstr "[MOD] Schilder-Mod geladen" diff --git a/mods/Decorations/signs_lib/locale/es.po b/mods/Decorations/signs_lib/locale/es.po new file mode 100644 index 0000000..8579937 --- /dev/null +++ b/mods/Decorations/signs_lib/locale/es.po @@ -0,0 +1,95 @@ +# 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-07-31 18:22+0200\n" +"PO-Revision-Date: 2017-07-31 18:30+0200\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 1.8.12\n" +"Last-Translator: Carlos Barraza\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: es\n" + +#: init.lua +msgid "Locked sign, owned by @1\n" +msgstr "" + +#: init.lua +msgid "locked " +msgstr "bloqueada " + +#: init.lua +msgid "@1 wrote \"@2\" to @3sign at @4" +msgstr "@1 escribio \"@2\" en el cartel @3en @4" + +#: init.lua +msgid "Sign" +msgstr "Letrero" + +#: init.lua +msgid "Can edit all locked signs" +msgstr "" + +#: init.lua +#, fuzzy +msgid "Locked Sign" +msgstr "Letrero bloqueada" + +#: init.lua +msgid "green" +msgstr "verde" + +#: init.lua +msgid "yellow" +msgstr "amarillo" + +#: init.lua +msgid "red" +msgstr "rojo" + +#: init.lua +#, fuzzy +msgid "white_red" +msgstr "rojo y blanco" + +#: init.lua +#, fuzzy +msgid "white_black" +msgstr "negro y blanco" + +#: init.lua +msgid "orange" +msgstr "naranja" + +#: init.lua +msgid "blue" +msgstr "azul" + +#: init.lua +msgid "brown" +msgstr "marrón" + +#: init.lua +#, fuzzy +msgid "Sign (@1, metal)" +msgstr "Letrero (@1, metal)" + +#: init.lua +msgid "Attempt to register unknown node as fence" +msgstr "" + +#: init.lua +msgid "Registered @1 and @2" +msgstr "Registrado @1 y @2" + +#: init.lua +msgid "[MOD] signs loaded" +msgstr "[MOD] signs cargados" diff --git a/mods/Decorations/signs_lib/locale/fr.po b/mods/Decorations/signs_lib/locale/fr.po new file mode 100644 index 0000000..a503574 --- /dev/null +++ b/mods/Decorations/signs_lib/locale/fr.po @@ -0,0 +1,91 @@ +# 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-07-31 18:13+0200\n" +"PO-Revision-Date: 2017-07-31 18:22+0200\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 1.8.12\n" +"Last-Translator: fat115 \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Language: fr\n" + +#: init.lua +msgid "Locked sign, owned by @1\n" +msgstr "Panneau verrouillé, appartient à @1\n" + +#: init.lua +msgid "locked " +msgstr "verrouillé " + +#: init.lua +msgid "@1 wrote \"@2\" to @3sign at @4" +msgstr "@1 a écrit \"@2\" sur le panneau @3en @4" + +#: init.lua +msgid "Sign" +msgstr "Panneau" + +#: init.lua +msgid "Can edit all locked signs" +msgstr "Peut modifier les panneaux verrouillés" + +#: init.lua +msgid "Locked Sign" +msgstr "Panneau (verrouillé)" + +#: init.lua +msgid "green" +msgstr "vert" + +#: init.lua +msgid "yellow" +msgstr "jaune" + +#: init.lua +msgid "red" +msgstr "rouge" + +#: init.lua +msgid "white_red" +msgstr "rouge et blanc" + +#: init.lua +msgid "white_black" +msgstr "noir et blanc" + +#: init.lua +msgid "orange" +msgstr "orange" + +#: init.lua +msgid "blue" +msgstr "bleu" + +#: init.lua +msgid "brown" +msgstr "marron" + +#: init.lua +msgid "Sign (@1, metal)" +msgstr "Panneau (@1, métal)" + +#: init.lua +msgid "Attempt to register unknown node as fence" +msgstr "Tentative d'enregistrer un nœud inconnu comme barrière" + +#: init.lua +msgid "Registered @1 and @2" +msgstr "Enregistrement de @1 et @" + +#: init.lua +msgid "[MOD] signs loaded" +msgstr "[MOD] signs chargé" diff --git a/mods/Decorations/signs_lib/locale/ms.po b/mods/Decorations/signs_lib/locale/ms.po new file mode 100644 index 0000000..da11512 --- /dev/null +++ b/mods/Decorations/signs_lib/locale/ms.po @@ -0,0 +1,91 @@ +# 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-07-31 18:00+0200\n" +"PO-Revision-Date: 2017-11-17 02:38+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.4\n" +"Last-Translator: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Language: ms\n" + +#: init.lua +msgid "Locked sign, owned by @1\n" +msgstr "Papan tanda berkunci, milik @1\n" + +#: init.lua +msgid "locked " +msgstr "berkunci " + +#: init.lua +msgid "@1 wrote \"@2\" to @3sign at @4" +msgstr "@1 menulis \"@2\" atas papan tanda @3dekat @4" + +#: init.lua +msgid "Sign" +msgstr "Papan Tanda" + +#: init.lua +msgid "Can edit all locked signs" +msgstr "Boleh sunting semua papan tanda berkunci" + +#: init.lua +msgid "Locked Sign" +msgstr "Papan Tanda Berkunci" + +#: init.lua +msgid "green" +msgstr "hijau" + +#: init.lua +msgid "yellow" +msgstr "kuning" + +#: init.lua +msgid "red" +msgstr "merah" + +#: init.lua +msgid "white_red" +msgstr "putih_merah" + +#: init.lua +msgid "white_black" +msgstr "putih_hitam" + +#: init.lua +msgid "orange" +msgstr "jingga" + +#: init.lua +msgid "blue" +msgstr "biru" + +#: init.lua +msgid "brown" +msgstr "perang" + +#: init.lua +msgid "Sign (@1, metal)" +msgstr "Papan Tanda (@1, logam)" + +#: init.lua +msgid "Attempt to register unknown node as fence" +msgstr "Cuba untuk mendaftar nod tidak diketahui sebagai pagar" + +#: init.lua +msgid "Registered @1 and @2" +msgstr "Telah daftar @1 dan @2" + +#: init.lua +msgid "[MOD] signs loaded" +msgstr "[MODS] signs telah dimuatkan" diff --git a/mods/Decorations/signs_lib/locale/ru.po b/mods/Decorations/signs_lib/locale/ru.po new file mode 100644 index 0000000..9cd01aa --- /dev/null +++ b/mods/Decorations/signs_lib/locale/ru.po @@ -0,0 +1,94 @@ +# Russian Translation for the signs_lib mod. +# Copyright (C) 2018 Vanessa Ezekowitz +# This file is distributed under the same license as the signs_lib package. +# CodeXP , 2018. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: signs_lib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-03-24 22:23+0100\n" +"PO-Revision-Date: \n" +"Last-Translator: CodeXP \n" +"Language-Team: \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: init.lua +msgid "Write" +msgstr "записать" + +#: init.lua +msgid "Locked sign, owned by @1\n" +msgstr "защищенная табличка, пренадлежит @1\n" + +#: init.lua +msgid "locked " +msgstr "защищенный " + +#: init.lua +msgid "@1 wrote \"@2\" to @3sign at @4" +msgstr "@1 записал \"@2\" в @3sign на @4" + +#: init.lua +msgid "Sign" +msgstr "табличка" + +#: init.lua +msgid "Can edit all locked signs" +msgstr "Может редактировать все защищенные таблички" + +#: init.lua +msgid "Locked Sign" +msgstr "защищенная табличка" + +#: init.lua +msgid "green" +msgstr "зеленая" + +#: init.lua +msgid "yellow" +msgstr "желтая" + +#: init.lua +msgid "red" +msgstr "красная" + +#: init.lua +msgid "white_red" +msgstr "краснобелая" + +#: init.lua +msgid "white_black" +msgstr "чернобелая" + +#: init.lua +msgid "orange" +msgstr "оранжевая" + +#: init.lua +msgid "blue" +msgstr "синея" + +#: init.lua +msgid "brown" +msgstr "коричневая" + +#: init.lua +msgid "Sign (@1, metal)" +msgstr "Табличка (@1, металл)" + +#: init.lua +msgid "Attempt to register unknown node as fence" +msgstr "Попытка зарегистрировать неизвестный узел как забор" + +#: init.lua +msgid "Registered @1 and @2" +msgstr "Зарегистрировано @1 для @2" + +#: init.lua +msgid "[MOD] signs loaded" +msgstr "[MOD] мод табличек загружен" diff --git a/mods/Decorations/signs_lib/locale/template.pot b/mods/Decorations/signs_lib/locale/template.pot new file mode 100644 index 0000000..e277437 --- /dev/null +++ b/mods/Decorations/signs_lib/locale/template.pot @@ -0,0 +1,94 @@ +# LANGUAGE Translation for the signs_lib mod. +# Copyright (C) 2018 Vanessa Ezekowitz +# This file is distributed under the same license as the signs_lib package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: signs_lib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-03-24 22:23+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: init.lua +msgid "Write" +msgstr "" + +#: init.lua +msgid "Locked sign, owned by @1\n" +msgstr "" + +#: init.lua +msgid "locked " +msgstr "" + +#: init.lua +msgid "@1 wrote \"@2\" to @3sign at @4" +msgstr "" + +#: init.lua +msgid "Sign" +msgstr "" + +#: init.lua +msgid "Can edit all locked signs" +msgstr "" + +#: init.lua +msgid "Locked Sign" +msgstr "" + +#: init.lua +msgid "green" +msgstr "" + +#: init.lua +msgid "yellow" +msgstr "" + +#: init.lua +msgid "red" +msgstr "" + +#: init.lua +msgid "white_red" +msgstr "" + +#: init.lua +msgid "white_black" +msgstr "" + +#: init.lua +msgid "orange" +msgstr "" + +#: init.lua +msgid "blue" +msgstr "" + +#: init.lua +msgid "brown" +msgstr "" + +#: init.lua +msgid "Sign (@1, metal)" +msgstr "" + +#: init.lua +msgid "Attempt to register unknown node as fence" +msgstr "" + +#: init.lua +msgid "Registered @1 and @2" +msgstr "" + +#: init.lua +msgid "[MOD] signs loaded" +msgstr "" diff --git a/mods/Decorations/signs_lib/mod.conf b/mods/Decorations/signs_lib/mod.conf new file mode 100644 index 0000000..c8937d0 --- /dev/null +++ b/mods/Decorations/signs_lib/mod.conf @@ -0,0 +1 @@ +name = signs_lib diff --git a/mods/Decorations/signs_lib/textures/bg_signs_lib.jpg b/mods/Decorations/signs_lib/textures/bg_signs_lib.jpg new file mode 100644 index 0000000..4b72268 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/bg_signs_lib.jpg differ diff --git a/mods/Decorations/signs_lib/textures/hdf_00.png b/mods/Decorations/signs_lib/textures/hdf_00.png new file mode 100644 index 0000000..ec762d5 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_00.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_20.png b/mods/Decorations/signs_lib/textures/hdf_20.png new file mode 100644 index 0000000..465982d Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_20.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_21.png b/mods/Decorations/signs_lib/textures/hdf_21.png new file mode 100644 index 0000000..01929d4 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_21.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_22.png b/mods/Decorations/signs_lib/textures/hdf_22.png new file mode 100644 index 0000000..2acde25 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_22.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_23.png b/mods/Decorations/signs_lib/textures/hdf_23.png new file mode 100644 index 0000000..ace1437 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_23.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_24.png b/mods/Decorations/signs_lib/textures/hdf_24.png new file mode 100644 index 0000000..909b015 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_24.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_25.png b/mods/Decorations/signs_lib/textures/hdf_25.png new file mode 100644 index 0000000..30a7829 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_25.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_26.png b/mods/Decorations/signs_lib/textures/hdf_26.png new file mode 100644 index 0000000..d29936c Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_26.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_27.png b/mods/Decorations/signs_lib/textures/hdf_27.png new file mode 100644 index 0000000..9844e92 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_27.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_28.png b/mods/Decorations/signs_lib/textures/hdf_28.png new file mode 100644 index 0000000..4810d75 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_28.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_29.png b/mods/Decorations/signs_lib/textures/hdf_29.png new file mode 100644 index 0000000..e5ff2b7 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_29.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_2a.png b/mods/Decorations/signs_lib/textures/hdf_2a.png new file mode 100644 index 0000000..5408897 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_2a.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_2b.png b/mods/Decorations/signs_lib/textures/hdf_2b.png new file mode 100644 index 0000000..9ad7d9e Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_2b.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_2c.png b/mods/Decorations/signs_lib/textures/hdf_2c.png new file mode 100644 index 0000000..cb3eae0 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_2c.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_2d.png b/mods/Decorations/signs_lib/textures/hdf_2d.png new file mode 100644 index 0000000..c252f37 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_2d.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_2e.png b/mods/Decorations/signs_lib/textures/hdf_2e.png new file mode 100644 index 0000000..d3aab5b Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_2e.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_2f.png b/mods/Decorations/signs_lib/textures/hdf_2f.png new file mode 100644 index 0000000..48c25f2 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_2f.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_30.png b/mods/Decorations/signs_lib/textures/hdf_30.png new file mode 100644 index 0000000..56ec3e7 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_30.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_31.png b/mods/Decorations/signs_lib/textures/hdf_31.png new file mode 100644 index 0000000..c526e86 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_31.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_32.png b/mods/Decorations/signs_lib/textures/hdf_32.png new file mode 100644 index 0000000..339d933 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_32.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_33.png b/mods/Decorations/signs_lib/textures/hdf_33.png new file mode 100644 index 0000000..aba5466 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_33.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_34.png b/mods/Decorations/signs_lib/textures/hdf_34.png new file mode 100644 index 0000000..9e71d10 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_34.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_35.png b/mods/Decorations/signs_lib/textures/hdf_35.png new file mode 100644 index 0000000..c12370f Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_35.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_36.png b/mods/Decorations/signs_lib/textures/hdf_36.png new file mode 100644 index 0000000..bebb32a Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_36.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_37.png b/mods/Decorations/signs_lib/textures/hdf_37.png new file mode 100644 index 0000000..73d9bb9 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_37.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_38.png b/mods/Decorations/signs_lib/textures/hdf_38.png new file mode 100644 index 0000000..baf7f6f Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_38.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_39.png b/mods/Decorations/signs_lib/textures/hdf_39.png new file mode 100644 index 0000000..9572947 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_39.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_3a.png b/mods/Decorations/signs_lib/textures/hdf_3a.png new file mode 100644 index 0000000..23ba0cd Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_3a.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_3b.png b/mods/Decorations/signs_lib/textures/hdf_3b.png new file mode 100644 index 0000000..c4b467f Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_3b.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_3c.png b/mods/Decorations/signs_lib/textures/hdf_3c.png new file mode 100644 index 0000000..566ba49 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_3c.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_3d.png b/mods/Decorations/signs_lib/textures/hdf_3d.png new file mode 100644 index 0000000..50e6c6f Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_3d.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_3e.png b/mods/Decorations/signs_lib/textures/hdf_3e.png new file mode 100644 index 0000000..090f8ca Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_3e.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_3f.png b/mods/Decorations/signs_lib/textures/hdf_3f.png new file mode 100644 index 0000000..dce4727 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_3f.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_40.png b/mods/Decorations/signs_lib/textures/hdf_40.png new file mode 100644 index 0000000..65533fd Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_40.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_41.png b/mods/Decorations/signs_lib/textures/hdf_41.png new file mode 100644 index 0000000..e30c27c Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_41.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_42.png b/mods/Decorations/signs_lib/textures/hdf_42.png new file mode 100644 index 0000000..28d480b Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_42.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_43.png b/mods/Decorations/signs_lib/textures/hdf_43.png new file mode 100644 index 0000000..db57d8d Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_43.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_44.png b/mods/Decorations/signs_lib/textures/hdf_44.png new file mode 100644 index 0000000..cca9575 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_44.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_45.png b/mods/Decorations/signs_lib/textures/hdf_45.png new file mode 100644 index 0000000..07e772b Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_45.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_46.png b/mods/Decorations/signs_lib/textures/hdf_46.png new file mode 100644 index 0000000..24de187 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_46.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_47.png b/mods/Decorations/signs_lib/textures/hdf_47.png new file mode 100644 index 0000000..0deef83 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_47.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_48.png b/mods/Decorations/signs_lib/textures/hdf_48.png new file mode 100644 index 0000000..f85b4ae Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_48.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_49.png b/mods/Decorations/signs_lib/textures/hdf_49.png new file mode 100644 index 0000000..1f02728 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_49.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_4a.png b/mods/Decorations/signs_lib/textures/hdf_4a.png new file mode 100644 index 0000000..b2f7bef Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_4a.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_4b.png b/mods/Decorations/signs_lib/textures/hdf_4b.png new file mode 100644 index 0000000..e8d52d6 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_4b.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_4c.png b/mods/Decorations/signs_lib/textures/hdf_4c.png new file mode 100644 index 0000000..94d7d48 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_4c.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_4d.png b/mods/Decorations/signs_lib/textures/hdf_4d.png new file mode 100644 index 0000000..0ee8eb4 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_4d.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_4e.png b/mods/Decorations/signs_lib/textures/hdf_4e.png new file mode 100644 index 0000000..8ff83d6 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_4e.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_4f.png b/mods/Decorations/signs_lib/textures/hdf_4f.png new file mode 100644 index 0000000..b278ccc Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_4f.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_50.png b/mods/Decorations/signs_lib/textures/hdf_50.png new file mode 100644 index 0000000..33b52fd Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_50.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_51.png b/mods/Decorations/signs_lib/textures/hdf_51.png new file mode 100644 index 0000000..e69de29 diff --git a/mods/Decorations/signs_lib/textures/hdf_52.png b/mods/Decorations/signs_lib/textures/hdf_52.png new file mode 100644 index 0000000..acb395e Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_52.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_53.png b/mods/Decorations/signs_lib/textures/hdf_53.png new file mode 100644 index 0000000..028f284 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_53.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_54.png b/mods/Decorations/signs_lib/textures/hdf_54.png new file mode 100644 index 0000000..3bd0a2b Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_54.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_55.png b/mods/Decorations/signs_lib/textures/hdf_55.png new file mode 100644 index 0000000..81643f9 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_55.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_56.png b/mods/Decorations/signs_lib/textures/hdf_56.png new file mode 100644 index 0000000..8726f5b Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_56.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_57.png b/mods/Decorations/signs_lib/textures/hdf_57.png new file mode 100644 index 0000000..5e8d9d0 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_57.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_58.png b/mods/Decorations/signs_lib/textures/hdf_58.png new file mode 100644 index 0000000..2abbda3 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_58.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_59.png b/mods/Decorations/signs_lib/textures/hdf_59.png new file mode 100644 index 0000000..ff45093 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_59.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_5a.png b/mods/Decorations/signs_lib/textures/hdf_5a.png new file mode 100644 index 0000000..5c706ce Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_5a.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_5b.png b/mods/Decorations/signs_lib/textures/hdf_5b.png new file mode 100644 index 0000000..2592f1f Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_5b.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_5c.png b/mods/Decorations/signs_lib/textures/hdf_5c.png new file mode 100644 index 0000000..406d634 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_5c.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_5d.png b/mods/Decorations/signs_lib/textures/hdf_5d.png new file mode 100644 index 0000000..a5efa37 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_5d.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_5e.png b/mods/Decorations/signs_lib/textures/hdf_5e.png new file mode 100644 index 0000000..7f610d8 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_5e.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_5f.png b/mods/Decorations/signs_lib/textures/hdf_5f.png new file mode 100644 index 0000000..07cce5a Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_5f.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_60.png b/mods/Decorations/signs_lib/textures/hdf_60.png new file mode 100644 index 0000000..cd4e0fb Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_60.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_61.png b/mods/Decorations/signs_lib/textures/hdf_61.png new file mode 100644 index 0000000..dc019ba Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_61.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_62.png b/mods/Decorations/signs_lib/textures/hdf_62.png new file mode 100644 index 0000000..285d0b2 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_62.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_63.png b/mods/Decorations/signs_lib/textures/hdf_63.png new file mode 100644 index 0000000..8781b8a Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_63.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_64.png b/mods/Decorations/signs_lib/textures/hdf_64.png new file mode 100644 index 0000000..16c9a28 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_64.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_65.png b/mods/Decorations/signs_lib/textures/hdf_65.png new file mode 100644 index 0000000..810d9c9 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_65.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_66.png b/mods/Decorations/signs_lib/textures/hdf_66.png new file mode 100644 index 0000000..411ca57 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_66.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_67.png b/mods/Decorations/signs_lib/textures/hdf_67.png new file mode 100644 index 0000000..d8820dd Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_67.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_68.png b/mods/Decorations/signs_lib/textures/hdf_68.png new file mode 100644 index 0000000..5b51d05 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_68.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_69.png b/mods/Decorations/signs_lib/textures/hdf_69.png new file mode 100644 index 0000000..55f1a22 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_69.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_6a.png b/mods/Decorations/signs_lib/textures/hdf_6a.png new file mode 100644 index 0000000..c20e222 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_6a.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_6b.png b/mods/Decorations/signs_lib/textures/hdf_6b.png new file mode 100644 index 0000000..fc34fc5 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_6b.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_6c.png b/mods/Decorations/signs_lib/textures/hdf_6c.png new file mode 100644 index 0000000..1f02728 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_6c.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_6d.png b/mods/Decorations/signs_lib/textures/hdf_6d.png new file mode 100644 index 0000000..6c0ae93 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_6d.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_6e.png b/mods/Decorations/signs_lib/textures/hdf_6e.png new file mode 100644 index 0000000..4f4dec7 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_6e.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_6f.png b/mods/Decorations/signs_lib/textures/hdf_6f.png new file mode 100644 index 0000000..921c611 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_6f.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_70.png b/mods/Decorations/signs_lib/textures/hdf_70.png new file mode 100644 index 0000000..8202199 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_70.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_71.png b/mods/Decorations/signs_lib/textures/hdf_71.png new file mode 100644 index 0000000..c02171f Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_71.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_72.png b/mods/Decorations/signs_lib/textures/hdf_72.png new file mode 100644 index 0000000..757b9c8 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_72.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_73.png b/mods/Decorations/signs_lib/textures/hdf_73.png new file mode 100644 index 0000000..e38497d Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_73.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_74.png b/mods/Decorations/signs_lib/textures/hdf_74.png new file mode 100644 index 0000000..10f9cfa Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_74.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_75.png b/mods/Decorations/signs_lib/textures/hdf_75.png new file mode 100644 index 0000000..377416b Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_75.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_76.png b/mods/Decorations/signs_lib/textures/hdf_76.png new file mode 100644 index 0000000..dc558d3 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_76.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_77.png b/mods/Decorations/signs_lib/textures/hdf_77.png new file mode 100644 index 0000000..6a14298 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_77.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_78.png b/mods/Decorations/signs_lib/textures/hdf_78.png new file mode 100644 index 0000000..38b4be0 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_78.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_79.png b/mods/Decorations/signs_lib/textures/hdf_79.png new file mode 100644 index 0000000..8859fb4 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_79.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_7a.png b/mods/Decorations/signs_lib/textures/hdf_7a.png new file mode 100644 index 0000000..c42c84a Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_7a.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_7b.png b/mods/Decorations/signs_lib/textures/hdf_7b.png new file mode 100644 index 0000000..c0ee072 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_7b.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_7c.png b/mods/Decorations/signs_lib/textures/hdf_7c.png new file mode 100644 index 0000000..6e9949d Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_7c.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_7d.png b/mods/Decorations/signs_lib/textures/hdf_7d.png new file mode 100644 index 0000000..6162caa Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_7d.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_7e.png b/mods/Decorations/signs_lib/textures/hdf_7e.png new file mode 100644 index 0000000..ec762d5 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_7e.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_a8.png b/mods/Decorations/signs_lib/textures/hdf_a8.png new file mode 100644 index 0000000..75d1495 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_a8.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_b8.png b/mods/Decorations/signs_lib/textures/hdf_b8.png new file mode 100644 index 0000000..c8215a1 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_b8.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_b9.png b/mods/Decorations/signs_lib/textures/hdf_b9.png new file mode 100644 index 0000000..765437a Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_b9.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_c0.png b/mods/Decorations/signs_lib/textures/hdf_c0.png new file mode 100644 index 0000000..fe3e380 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_c0.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_c1.png b/mods/Decorations/signs_lib/textures/hdf_c1.png new file mode 100644 index 0000000..f589c1c Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_c1.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_c2.png b/mods/Decorations/signs_lib/textures/hdf_c2.png new file mode 100644 index 0000000..ea6043a Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_c2.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_c3.png b/mods/Decorations/signs_lib/textures/hdf_c3.png new file mode 100644 index 0000000..1cc88a8 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_c3.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_c4.png b/mods/Decorations/signs_lib/textures/hdf_c4.png new file mode 100644 index 0000000..1006dff Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_c4.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_c5.png b/mods/Decorations/signs_lib/textures/hdf_c5.png new file mode 100644 index 0000000..85c9b92 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_c5.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_c6.png b/mods/Decorations/signs_lib/textures/hdf_c6.png new file mode 100644 index 0000000..7e5b16c Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_c6.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_c7.png b/mods/Decorations/signs_lib/textures/hdf_c7.png new file mode 100644 index 0000000..6303b0e Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_c7.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_c8.png b/mods/Decorations/signs_lib/textures/hdf_c8.png new file mode 100644 index 0000000..e8ece15 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_c8.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_c9.png b/mods/Decorations/signs_lib/textures/hdf_c9.png new file mode 100644 index 0000000..d3dc073 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_c9.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_ca.png b/mods/Decorations/signs_lib/textures/hdf_ca.png new file mode 100644 index 0000000..a940065 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_ca.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_cb.png b/mods/Decorations/signs_lib/textures/hdf_cb.png new file mode 100644 index 0000000..fa96d93 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_cb.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_cc.png b/mods/Decorations/signs_lib/textures/hdf_cc.png new file mode 100644 index 0000000..0c66142 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_cc.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_cd.png b/mods/Decorations/signs_lib/textures/hdf_cd.png new file mode 100644 index 0000000..5677f03 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_cd.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_ce.png b/mods/Decorations/signs_lib/textures/hdf_ce.png new file mode 100644 index 0000000..9314974 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_ce.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_cf.png b/mods/Decorations/signs_lib/textures/hdf_cf.png new file mode 100644 index 0000000..fb6dee9 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_cf.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_d0.png b/mods/Decorations/signs_lib/textures/hdf_d0.png new file mode 100644 index 0000000..74b0c17 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_d0.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_d1.png b/mods/Decorations/signs_lib/textures/hdf_d1.png new file mode 100644 index 0000000..5197b0f Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_d1.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_d2.png b/mods/Decorations/signs_lib/textures/hdf_d2.png new file mode 100644 index 0000000..744f4eb Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_d2.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_d3.png b/mods/Decorations/signs_lib/textures/hdf_d3.png new file mode 100644 index 0000000..048856b Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_d3.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_d4.png b/mods/Decorations/signs_lib/textures/hdf_d4.png new file mode 100644 index 0000000..49e7b8c Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_d4.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_d5.png b/mods/Decorations/signs_lib/textures/hdf_d5.png new file mode 100644 index 0000000..f2df843 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_d5.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_d6.png b/mods/Decorations/signs_lib/textures/hdf_d6.png new file mode 100644 index 0000000..8f77483 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_d6.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_d7.png b/mods/Decorations/signs_lib/textures/hdf_d7.png new file mode 100644 index 0000000..20164b9 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_d7.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_d8.png b/mods/Decorations/signs_lib/textures/hdf_d8.png new file mode 100644 index 0000000..72861b0 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_d8.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_d9.png b/mods/Decorations/signs_lib/textures/hdf_d9.png new file mode 100644 index 0000000..497b45e Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_d9.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_da.png b/mods/Decorations/signs_lib/textures/hdf_da.png new file mode 100644 index 0000000..1c24540 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_da.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_db.png b/mods/Decorations/signs_lib/textures/hdf_db.png new file mode 100644 index 0000000..e750c0e Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_db.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_dc.png b/mods/Decorations/signs_lib/textures/hdf_dc.png new file mode 100644 index 0000000..ce2e197 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_dc.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_dd.png b/mods/Decorations/signs_lib/textures/hdf_dd.png new file mode 100644 index 0000000..bbb07bd Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_dd.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_de.png b/mods/Decorations/signs_lib/textures/hdf_de.png new file mode 100644 index 0000000..4c59047 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_de.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_df.png b/mods/Decorations/signs_lib/textures/hdf_df.png new file mode 100644 index 0000000..7c29dde Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_df.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_e0.png b/mods/Decorations/signs_lib/textures/hdf_e0.png new file mode 100644 index 0000000..93d4b14 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_e0.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_e1.png b/mods/Decorations/signs_lib/textures/hdf_e1.png new file mode 100644 index 0000000..7bf2382 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_e1.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_e2.png b/mods/Decorations/signs_lib/textures/hdf_e2.png new file mode 100644 index 0000000..66b116a Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_e2.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_e3.png b/mods/Decorations/signs_lib/textures/hdf_e3.png new file mode 100644 index 0000000..5b0a418 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_e3.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_e4.png b/mods/Decorations/signs_lib/textures/hdf_e4.png new file mode 100644 index 0000000..e3ec02d Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_e4.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_e5.png b/mods/Decorations/signs_lib/textures/hdf_e5.png new file mode 100644 index 0000000..09b431a Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_e5.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_e6.png b/mods/Decorations/signs_lib/textures/hdf_e6.png new file mode 100644 index 0000000..777b8cd Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_e6.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_e7.png b/mods/Decorations/signs_lib/textures/hdf_e7.png new file mode 100644 index 0000000..9da7dab Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_e7.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_e8.png b/mods/Decorations/signs_lib/textures/hdf_e8.png new file mode 100644 index 0000000..d7279ae Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_e8.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_e9.png b/mods/Decorations/signs_lib/textures/hdf_e9.png new file mode 100644 index 0000000..4d40313 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_e9.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_ea.png b/mods/Decorations/signs_lib/textures/hdf_ea.png new file mode 100644 index 0000000..2533ec1 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_ea.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_eb.png b/mods/Decorations/signs_lib/textures/hdf_eb.png new file mode 100644 index 0000000..4ef9129 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_eb.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_ec.png b/mods/Decorations/signs_lib/textures/hdf_ec.png new file mode 100644 index 0000000..18e859b Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_ec.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_ed.png b/mods/Decorations/signs_lib/textures/hdf_ed.png new file mode 100644 index 0000000..edd951d Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_ed.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_ee.png b/mods/Decorations/signs_lib/textures/hdf_ee.png new file mode 100644 index 0000000..813e1f7 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_ee.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_ef.png b/mods/Decorations/signs_lib/textures/hdf_ef.png new file mode 100644 index 0000000..f2f24d2 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_ef.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_f0.png b/mods/Decorations/signs_lib/textures/hdf_f0.png new file mode 100644 index 0000000..697286c Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_f0.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_f1.png b/mods/Decorations/signs_lib/textures/hdf_f1.png new file mode 100644 index 0000000..01c1e64 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_f1.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_f2.png b/mods/Decorations/signs_lib/textures/hdf_f2.png new file mode 100644 index 0000000..df2aaa3 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_f2.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_f3.png b/mods/Decorations/signs_lib/textures/hdf_f3.png new file mode 100644 index 0000000..e09cf75 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_f3.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_f4.png b/mods/Decorations/signs_lib/textures/hdf_f4.png new file mode 100644 index 0000000..2c0853b Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_f4.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_f5.png b/mods/Decorations/signs_lib/textures/hdf_f5.png new file mode 100644 index 0000000..fd21a81 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_f5.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_f6.png b/mods/Decorations/signs_lib/textures/hdf_f6.png new file mode 100644 index 0000000..189a96f Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_f6.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_f7.png b/mods/Decorations/signs_lib/textures/hdf_f7.png new file mode 100644 index 0000000..87b2eca Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_f7.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_f8.png b/mods/Decorations/signs_lib/textures/hdf_f8.png new file mode 100644 index 0000000..3c195aa Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_f8.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_f9.png b/mods/Decorations/signs_lib/textures/hdf_f9.png new file mode 100644 index 0000000..9fb54ba Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_f9.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_fa.png b/mods/Decorations/signs_lib/textures/hdf_fa.png new file mode 100644 index 0000000..da72b46 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_fa.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_fb.png b/mods/Decorations/signs_lib/textures/hdf_fb.png new file mode 100644 index 0000000..6cfd0fe Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_fb.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_fc.png b/mods/Decorations/signs_lib/textures/hdf_fc.png new file mode 100644 index 0000000..c8c6918 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_fc.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_fd.png b/mods/Decorations/signs_lib/textures/hdf_fd.png new file mode 100644 index 0000000..9130ccd Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_fd.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_fe.png b/mods/Decorations/signs_lib/textures/hdf_fe.png new file mode 100644 index 0000000..5165296 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_fe.png differ diff --git a/mods/Decorations/signs_lib/textures/hdf_ff.png b/mods/Decorations/signs_lib/textures/hdf_ff.png new file mode 100644 index 0000000..a1a1f10 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/hdf_ff.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_back.png b/mods/Decorations/signs_lib/textures/signs_back.png new file mode 100644 index 0000000..db33dee Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_back.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_blue_front.png b/mods/Decorations/signs_lib/textures/signs_blue_front.png new file mode 100644 index 0000000..65ed6ea Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_blue_front.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_blue_inv.png b/mods/Decorations/signs_lib/textures/signs_blue_inv.png new file mode 100644 index 0000000..3f5a0ce Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_blue_inv.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_bottom.png b/mods/Decorations/signs_lib/textures/signs_bottom.png new file mode 100644 index 0000000..38961f0 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_bottom.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_brown_front.png b/mods/Decorations/signs_lib/textures/signs_brown_front.png new file mode 100644 index 0000000..343bf30 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_brown_front.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_brown_inv.png b/mods/Decorations/signs_lib/textures/signs_brown_inv.png new file mode 100644 index 0000000..3c0d02b Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_brown_inv.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_front.png b/mods/Decorations/signs_lib/textures/signs_front.png new file mode 100644 index 0000000..2e61435 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_front.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_green_front.png b/mods/Decorations/signs_lib/textures/signs_green_front.png new file mode 100644 index 0000000..45c6e0f Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_green_front.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_green_inv.png b/mods/Decorations/signs_lib/textures/signs_green_inv.png new file mode 100644 index 0000000..24ca5a8 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_green_inv.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_hanging_back.png b/mods/Decorations/signs_lib/textures/signs_hanging_back.png new file mode 100644 index 0000000..7cf39a2 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_hanging_back.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_hanging_bottom.png b/mods/Decorations/signs_lib/textures/signs_hanging_bottom.png new file mode 100644 index 0000000..7b2af4d Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_hanging_bottom.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_hanging_front.png b/mods/Decorations/signs_lib/textures/signs_hanging_front.png new file mode 100644 index 0000000..bdc745e Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_hanging_front.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_hanging_side.png b/mods/Decorations/signs_lib/textures/signs_hanging_side.png new file mode 100644 index 0000000..8498d67 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_hanging_side.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_hanging_top.png b/mods/Decorations/signs_lib/textures/signs_hanging_top.png new file mode 100644 index 0000000..1c08f91 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_hanging_top.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_locked_inv.png b/mods/Decorations/signs_lib/textures/signs_locked_inv.png new file mode 100644 index 0000000..3c0554a Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_locked_inv.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_metal_back.png b/mods/Decorations/signs_lib/textures/signs_metal_back.png new file mode 100644 index 0000000..48420b2 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_metal_back.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_metal_sides.png b/mods/Decorations/signs_lib/textures/signs_metal_sides.png new file mode 100644 index 0000000..b7b4526 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_metal_sides.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_metal_tb.png b/mods/Decorations/signs_lib/textures/signs_metal_tb.png new file mode 100644 index 0000000..9a264f0 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_metal_tb.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_orange_front.png b/mods/Decorations/signs_lib/textures/signs_orange_front.png new file mode 100644 index 0000000..633b19a Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_orange_front.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_orange_inv.png b/mods/Decorations/signs_lib/textures/signs_orange_inv.png new file mode 100644 index 0000000..5a813ae Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_orange_inv.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_post_back.png b/mods/Decorations/signs_lib/textures/signs_post_back.png new file mode 100644 index 0000000..829b844 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_post_back.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_post_bottom.png b/mods/Decorations/signs_lib/textures/signs_post_bottom.png new file mode 100644 index 0000000..bea83e3 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_post_bottom.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_post_front.png b/mods/Decorations/signs_lib/textures/signs_post_front.png new file mode 100644 index 0000000..02a0e59 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_post_front.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_post_side.png b/mods/Decorations/signs_lib/textures/signs_post_side.png new file mode 100644 index 0000000..95d7a69 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_post_side.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_post_top.png b/mods/Decorations/signs_lib/textures/signs_post_top.png new file mode 100644 index 0000000..6b251f6 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_post_top.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_red_front.png b/mods/Decorations/signs_lib/textures/signs_red_front.png new file mode 100644 index 0000000..7986203 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_red_front.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_red_inv.png b/mods/Decorations/signs_lib/textures/signs_red_inv.png new file mode 100644 index 0000000..af4597d Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_red_inv.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_side.png b/mods/Decorations/signs_lib/textures/signs_side.png new file mode 100644 index 0000000..ab6db9e Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_side.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_top.png b/mods/Decorations/signs_lib/textures/signs_top.png new file mode 100644 index 0000000..aa86aa8 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_top.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_wall_sign.png b/mods/Decorations/signs_lib/textures/signs_wall_sign.png new file mode 100644 index 0000000..2f1c168 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_wall_sign.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_wall_sign_locked.png b/mods/Decorations/signs_lib/textures/signs_wall_sign_locked.png new file mode 100644 index 0000000..7061167 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_wall_sign_locked.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_wall_sign_metal.png b/mods/Decorations/signs_lib/textures/signs_wall_sign_metal.png new file mode 100644 index 0000000..7eff1a6 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_wall_sign_metal.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_white_black_front.png b/mods/Decorations/signs_lib/textures/signs_white_black_front.png new file mode 100644 index 0000000..0c6e49f Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_white_black_front.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_white_black_inv.png b/mods/Decorations/signs_lib/textures/signs_white_black_inv.png new file mode 100644 index 0000000..1d37504 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_white_black_inv.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_white_red_front.png b/mods/Decorations/signs_lib/textures/signs_white_red_front.png new file mode 100644 index 0000000..48216c9 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_white_red_front.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_white_red_inv.png b/mods/Decorations/signs_lib/textures/signs_white_red_inv.png new file mode 100644 index 0000000..52ac3c8 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_white_red_inv.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_yellow_front.png b/mods/Decorations/signs_lib/textures/signs_yellow_front.png new file mode 100644 index 0000000..4ce9082 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_yellow_front.png differ diff --git a/mods/Decorations/signs_lib/textures/signs_yellow_inv.png b/mods/Decorations/signs_lib/textures/signs_yellow_inv.png new file mode 100644 index 0000000..86af53d Binary files /dev/null and b/mods/Decorations/signs_lib/textures/signs_yellow_inv.png differ diff --git a/mods/Decorations/signs_lib/textures/slc_0.png b/mods/Decorations/signs_lib/textures/slc_0.png new file mode 100644 index 0000000..17c6631 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/slc_0.png differ diff --git a/mods/Decorations/signs_lib/textures/slc_1.png b/mods/Decorations/signs_lib/textures/slc_1.png new file mode 100644 index 0000000..3cbbbe6 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/slc_1.png differ diff --git a/mods/Decorations/signs_lib/textures/slc_2.png b/mods/Decorations/signs_lib/textures/slc_2.png new file mode 100644 index 0000000..f86ae90 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/slc_2.png differ diff --git a/mods/Decorations/signs_lib/textures/slc_3.png b/mods/Decorations/signs_lib/textures/slc_3.png new file mode 100644 index 0000000..1938911 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/slc_3.png differ diff --git a/mods/Decorations/signs_lib/textures/slc_4.png b/mods/Decorations/signs_lib/textures/slc_4.png new file mode 100644 index 0000000..cdcb302 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/slc_4.png differ diff --git a/mods/Decorations/signs_lib/textures/slc_5.png b/mods/Decorations/signs_lib/textures/slc_5.png new file mode 100644 index 0000000..57ff7b5 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/slc_5.png differ diff --git a/mods/Decorations/signs_lib/textures/slc_6.png b/mods/Decorations/signs_lib/textures/slc_6.png new file mode 100644 index 0000000..de15f52 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/slc_6.png differ diff --git a/mods/Decorations/signs_lib/textures/slc_7.png b/mods/Decorations/signs_lib/textures/slc_7.png new file mode 100644 index 0000000..a38eb42 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/slc_7.png differ diff --git a/mods/Decorations/signs_lib/textures/slc_8.png b/mods/Decorations/signs_lib/textures/slc_8.png new file mode 100644 index 0000000..b0e5941 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/slc_8.png differ diff --git a/mods/Decorations/signs_lib/textures/slc_9.png b/mods/Decorations/signs_lib/textures/slc_9.png new file mode 100644 index 0000000..d2a0974 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/slc_9.png differ diff --git a/mods/Decorations/signs_lib/textures/slc_A.png b/mods/Decorations/signs_lib/textures/slc_A.png new file mode 100644 index 0000000..bed719c Binary files /dev/null and b/mods/Decorations/signs_lib/textures/slc_A.png differ diff --git a/mods/Decorations/signs_lib/textures/slc_B.png b/mods/Decorations/signs_lib/textures/slc_B.png new file mode 100644 index 0000000..f1f9d26 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/slc_B.png differ diff --git a/mods/Decorations/signs_lib/textures/slc_C.png b/mods/Decorations/signs_lib/textures/slc_C.png new file mode 100644 index 0000000..1822a5d Binary files /dev/null and b/mods/Decorations/signs_lib/textures/slc_C.png differ diff --git a/mods/Decorations/signs_lib/textures/slc_D.png b/mods/Decorations/signs_lib/textures/slc_D.png new file mode 100644 index 0000000..a9f06c4 Binary files /dev/null and b/mods/Decorations/signs_lib/textures/slc_D.png differ diff --git a/mods/Decorations/signs_lib/textures/slc_E.png b/mods/Decorations/signs_lib/textures/slc_E.png new file mode 100644 index 0000000..d73776b Binary files /dev/null and b/mods/Decorations/signs_lib/textures/slc_E.png differ diff --git a/mods/Decorations/signs_lib/textures/slc_F.png b/mods/Decorations/signs_lib/textures/slc_F.png new file mode 100644 index 0000000..e59813b Binary files /dev/null and b/mods/Decorations/signs_lib/textures/slc_F.png differ diff --git a/mods/Decorations/signs_lib/textures/slc_n.png b/mods/Decorations/signs_lib/textures/slc_n.png new file mode 100644 index 0000000..8f59c9b Binary files /dev/null and b/mods/Decorations/signs_lib/textures/slc_n.png differ diff --git a/mods/Decorations/trampoline/README.txt b/mods/Decorations/trampoline/README.txt new file mode 100644 index 0000000..66abe89 --- /dev/null +++ b/mods/Decorations/trampoline/README.txt @@ -0,0 +1,12 @@ +Trampoline Mod for Blockcolor +----------------------------- +By Zorman2000 (c) 2018 +Original textures from the xdecor Minetest mod by kilbith + +#Description +This mod adds a simple trampoline to BlockColor. It is best used if falling from above. + +#License +Code: GPL version 3 +Textures: WTFPL +Original textures from xdecor Minetest mod by kilbith, the textures were re-colored into a few shades of white and gray to adapt for using the colorize texture modifier. \ No newline at end of file diff --git a/mods/Decorations/trampoline/depends.txt b/mods/Decorations/trampoline/depends.txt new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/mods/Decorations/trampoline/depends.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/mods/Decorations/trampoline/init.lua b/mods/Decorations/trampoline/init.lua new file mode 100644 index 0000000..77c98ca --- /dev/null +++ b/mods/Decorations/trampoline/init.lua @@ -0,0 +1,48 @@ +-- Trampoline mod by Zorman2000 +-- Code based on carpets mod included in BlockColor and a modification +-- of the original trampoline node found on xdecor mod by kilbith + +color1 = minetest.setting_get("color1") or "292421" +color2 = minetest.setting_get("color2") or "0000FF" +color3 = minetest.setting_get("color3") or "00FF00" +color4 = minetest.setting_get("color4") or "F5F5F5" +color5 = minetest.setting_get("color5") or "FF6103" +color6 = minetest.setting_get("color6") or "FF0000" +color7 = minetest.setting_get("color7") or "FFFF00" +color8 = minetest.setting_get("color8") or "FF69B4" + +local source_list = { + {"black", "Color1", color1, 40, 36, 33}, + {"blue", "Color2", color2, 0, 0, 255}, + {"green", "Color3", color3, 0, 255, 0}, + {"white", "Color4", color4, 245, 245, 245}, + {"orange", "Color5", color5, 255, 97, 3}, + {"red", "Color6", color6, 255, 0, 0}, + {"yellow", "Color7", color7, 255, 255, 0}, + {"pink", "Color8", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local color = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + + minetest.register_node("trampoline:"..color, { + description = desc.."Trampoline", + inventory_image = 'trampo.png^[colorize:#'..colour..':70', + wield_image = "color_hand" .. color .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + tiles = {"trampoline.png^[colorize:#"..colour..":70", "trampoline.png^[colorize:#"..colour..":70", "trampoline_sides.png^[colorize:#"..colour..":70"}, + groups = {cracky=3, oddly_breakable_by_hand=1, fall_damage_add_percent=-100, bouncy=99}, + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + } + }) + +end diff --git a/mods/Decorations/trampoline/textures/trampoline.png b/mods/Decorations/trampoline/textures/trampoline.png new file mode 100644 index 0000000..11e2c82 Binary files /dev/null and b/mods/Decorations/trampoline/textures/trampoline.png differ diff --git a/mods/Decorations/trampoline/textures/trampoline_sides.png b/mods/Decorations/trampoline/textures/trampoline_sides.png new file mode 100644 index 0000000..c1875cc Binary files /dev/null and b/mods/Decorations/trampoline/textures/trampoline_sides.png differ diff --git a/mods/Decorations/trees/README.md b/mods/Decorations/trees/README.md new file mode 100644 index 0000000..29cb7f4 --- /dev/null +++ b/mods/Decorations/trees/README.md @@ -0,0 +1,2 @@ +# trees +Trees obj mod diff --git a/mods/Decorations/trees/depends.txt b/mods/Decorations/trees/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/Decorations/trees/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/Decorations/trees/init.lua b/mods/Decorations/trees/init.lua new file mode 100644 index 0000000..fed6ecc --- /dev/null +++ b/mods/Decorations/trees/init.lua @@ -0,0 +1,174 @@ +color1 = minetest.setting_get("color1") or "292421" +color2 = minetest.setting_get("color2") or "0000FF" +color3 = minetest.setting_get("color3") or "00FF00" +color4 = minetest.setting_get("color4") or "F5F5F5" +color5 = minetest.setting_get("color5") or "FF6103" +color6 = minetest.setting_get("color6") or "FF0000" +color7 = minetest.setting_get("color7") or "FFFF00" +color8 = minetest.setting_get("color8") or "FF69B4" + +local source_list = { + {"black", "Color1", color1, 40, 36, 33}, + {"blue", "Color2", color2, 0, 0, 255}, + {"green", "Color3", color3, 0, 255, 0}, + {"white", "Color4", color4, 245, 245, 245}, + {"orange", "Color5", color5, 255, 97, 3}, + {"red", "Color6", color6, 255, 0, 0}, + {"yellow", "Color7", color7, 255, 255, 0}, + {"pink", "Color8", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local name = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +minetest.register_node("trees:big_cactus_" .. name, { + description = desc .. " color", + + paramtype = "light", + drawtype = "mesh", + mesh = "cactus.obj", +visual_scale = 4, +wield_image = "color_hand" .. name .. ".png", +wield_scale = {x=1,y=1,z=0.5}, +inventory_image = "color_white.png^[colorize:#"..colour..":70", + +tiles = { +"color_white.png^[colorize:#"..colour..":70", +}, + +selection_box = { +type = "fixed", +fixed = { 0.40, -0.5, 0, -4.75, 13, -5.25}, +}, + +collision_box = { +type = "fixed", +fixed = { 0.40, -0.5, 0, -4.75, 13, -5.25}, +}, + + is_ground_content = true, + groups = {snappy = 2, choppy = 2, wool = 2}, + sounds = default.node_sound_defaults(), + oddly_breakable_by_hand = 1, + dig_immediate = 3, + + }) + +minetest.register_node("trees:big_" .. name, { + description = desc .. " color", + + paramtype = "light", + drawtype = "mesh", + mesh = "tree.obj", +visual_scale = 4, +wield_image = "color_hand" .. name .. ".png", +wield_scale = {x=1,y=1,z=0.5}, +inventory_image = "bigtrees.png^[colorize:#"..colour..":70", + +tiles = { +"color_white.png^[colorize:#"..colour..":70", +"color_white.png", +"color_white.png", +"color_white.png", +"color_white.png^[colorize:#"..colour..":70", +}, + +selection_box = { +type = "fixed", +fixed = { 0.40, -0.5, 0, -4.75, 13, -5.25}, +}, + +collision_box = { +type = "fixed", +fixed = { 0.40, -0.5, 0, -4.75, 13, -5.25}, +}, + + is_ground_content = true, + groups = {snappy = 2, choppy = 2, wool = 2}, + sounds = default.node_sound_defaults(), + oddly_breakable_by_hand = 1, + dig_immediate = 3, + + }) + +minetest.register_node("trees:normal_" .. name, { + description = desc .. " color", + + paramtype = "light", + drawtype = "mesh", + mesh = "tree.obj", +visual_scale = 2, +wield_image = "color_hand" .. name .. ".png", +wield_scale = {x=1,y=1,z=0.5}, +inventory_image = "normaltrees.png^[colorize:#"..colour..":70", + +tiles = { +"color_white.png^[colorize:#"..colour..":70", +"color_white.png", +"color_white.png", +"color_white.png", +"color_white.png^[colorize:#"..colour..":70", +}, + +selection_box = { +type = "fixed", +fixed = { 0.2, -0.5, 0, -2.4, 6.5, -2.5}, +}, + +collision_box = { +type = "fixed", +fixed = { 0.2, -0.5, 0, -2.4, 6.5, -2.5}, +}, + + is_ground_content = true, + groups = {snappy = 2, choppy = 2, wool = 2}, + sounds = default.node_sound_defaults(), + oddly_breakable_by_hand = 1, + dig_immediate = 3, + + }) + +minetest.register_node("trees:small_" .. name, { + description = desc .. " color", + + paramtype = "light", + drawtype = "mesh", + mesh = "tree.obj", +visual_scale = 1, +wield_image = "color_hand" .. name .. ".png", +wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "smalltrees.png^[colorize:#"..colour..":70", + +tiles = { +"color_white.png^[colorize:#"..colour..":70", +"color_white.png", +"color_white.png", +"color_white.png", +"color_white.png^[colorize:#"..colour..":70", +}, + +selection_box = { +type = "fixed", +fixed = { 0.1, -0.5, 0, -1.2, 3.25, -1.25}, +}, + +collision_box = { +type = "fixed", +fixed = { 0.1, -0.5, 0, -1.2, 3.25, -1.25}, +}, + + is_ground_content = true, + groups = {snappy = 2, choppy = 2, wool = 2}, + sounds = default.node_sound_defaults(), + oddly_breakable_by_hand = 1, + dig_immediate = 3, + + }) + + +end diff --git a/mods/Decorations/trees/license.txt b/mods/Decorations/trees/license.txt new file mode 100644 index 0000000..dfbd241 --- /dev/null +++ b/mods/Decorations/trees/license.txt @@ -0,0 +1,38 @@ +License for Textures Peak : CCO + +color_yellow.png +color_orange.png +color_blue.png +color_green.png +color_pink.png +color_red.png +color_white.png +color_black.png + +https://creativecommons.org/publicdomain/zero/1.0/deed.fr + +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/Decorations/trees/models/License.txt b/mods/Decorations/trees/models/License.txt new file mode 100644 index 0000000..6476512 --- /dev/null +++ b/mods/Decorations/trees/models/License.txt @@ -0,0 +1,20 @@ + +######################################################################### + + by Kenney Vleugels for Kenney (www.kenney.nl) + + ------------------------------ + + License (Creative Commons Zero, CC0) + http://creativecommons.org/publicdomain/zero/1.0/ + + You may use these graphics in personal and commercial projects. + Credit (Kenney or www.kenney.nl) would be nice but is not mandatory. + + ------------------------------ + + Donate: http://donate.kenney.nl/ + Request: http://request.kenney.nl/ + + +######################################################################### \ No newline at end of file diff --git a/mods/Menu/inventory_plus/animals.lua b/mods/Menu/inventory_plus/animals.lua new file mode 100644 index 0000000..221efd0 --- /dev/null +++ b/mods/Menu/inventory_plus/animals.lua @@ -0,0 +1,23 @@ +-- Adult & Baby + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.panda then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'mobs_animal:adultpanda') +player:get_inventory():add_item('main', 'mobs_animal:babypanda') + +player:get_inventory():add_item('main', 'mobs_animal:adultpig') +player:get_inventory():add_item('main', 'mobs_animal:babypig') + +player:get_inventory():add_item('main', 'mobs_animal:adultalien') +player:get_inventory():add_item('main', 'mobs_animal:babyalien') + +player:get_inventory():add_item('main', 'mobs:lasso') +player:get_inventory():add_item('main', 'mobs:nametag') + +end +end +) diff --git a/mods/Menu/inventory_plus/build.lua b/mods/Menu/inventory_plus/build.lua new file mode 100644 index 0000000..e8676ba --- /dev/null +++ b/mods/Menu/inventory_plus/build.lua @@ -0,0 +1,528 @@ +-- Start Builds Nodes + +-- Edge + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.edge then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'slope:edge_white') +player:get_inventory():add_item('main', 'slope:edge_black') +player:get_inventory():add_item('main', 'slope:edge_red') +player:get_inventory():add_item('main', 'slope:edge_orange') +player:get_inventory():add_item('main', 'slope:edge_yellow') +player:get_inventory():add_item('main', 'slope:edge_pink') +player:get_inventory():add_item('main', 'slope:edge_green') +player:get_inventory():add_item('main', 'slope:edge_blue') + +end +end +) + +-- Edge Corner + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.edgecorner then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'slope:edgecorner_white') +player:get_inventory():add_item('main', 'slope:edgecorner_black') +player:get_inventory():add_item('main', 'slope:edgecorner_red') +player:get_inventory():add_item('main', 'slope:edgecorner_orange') +player:get_inventory():add_item('main', 'slope:edgecorner_yellow') +player:get_inventory():add_item('main', 'slope:edgecorner_pink') +player:get_inventory():add_item('main', 'slope:edgecorner_green') +player:get_inventory():add_item('main', 'slope:edgecorner_blue') + +end +end +) + +-- FullPipe + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.fullpipe then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'fullpipe:block_white') +player:get_inventory():add_item('main', 'fullpipe:block_black') +player:get_inventory():add_item('main', 'fullpipe:block_red') +player:get_inventory():add_item('main', 'fullpipe:block_orange') +player:get_inventory():add_item('main', 'fullpipe:block_yellow') +player:get_inventory():add_item('main', 'fullpipe:block_pink') +player:get_inventory():add_item('main', 'fullpipe:block_green') +player:get_inventory():add_item('main', 'fullpipe:block_blue') + +end +end +) + +-- FullPipe Border + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.fullpipeborder then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'fullpipe:border_white') +player:get_inventory():add_item('main', 'fullpipe:border_black') +player:get_inventory():add_item('main', 'fullpipe:border_red') +player:get_inventory():add_item('main', 'fullpipe:border_orange') +player:get_inventory():add_item('main', 'fullpipe:border_yellow') +player:get_inventory():add_item('main', 'fullpipe:border_pink') +player:get_inventory():add_item('main', 'fullpipe:border_green') +player:get_inventory():add_item('main', 'fullpipe:border_blue') + +end +end +) + +-- Arcs + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.arc then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'pkarcs:white_arc') +player:get_inventory():add_item('main', 'pkarcs:black_arc') +player:get_inventory():add_item('main', 'pkarcs:red_arc') +player:get_inventory():add_item('main', 'pkarcs:orange_arc') +player:get_inventory():add_item('main', 'pkarcs:yellow_arc') +player:get_inventory():add_item('main', 'pkarcs:pink_arc') +player:get_inventory():add_item('main', 'pkarcs:green_arc') +player:get_inventory():add_item('main', 'pkarcs:blue_arc') + +end +end +) + +-- Arcs In + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.inarc then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'pkarcs:white_inarc') +player:get_inventory():add_item('main', 'pkarcs:black_inarc') +player:get_inventory():add_item('main', 'pkarcs:red_inarc') +player:get_inventory():add_item('main', 'pkarcs:orange_inarc') +player:get_inventory():add_item('main', 'pkarcs:yellow_inarc') +player:get_inventory():add_item('main', 'pkarcs:pink_inarc') +player:get_inventory():add_item('main', 'pkarcs:green_inarc') +player:get_inventory():add_item('main', 'pkarcs:blue_inarc') + +end +end +) + +-- Arcs Out + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.outarc then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'pkarcs:white_outarc') +player:get_inventory():add_item('main', 'pkarcs:black_outarc') +player:get_inventory():add_item('main', 'pkarcs:red_outarc') +player:get_inventory():add_item('main', 'pkarcs:orange_outarc') +player:get_inventory():add_item('main', 'pkarcs:yellow_outarc') +player:get_inventory():add_item('main', 'pkarcs:pink_outarc') +player:get_inventory():add_item('main', 'pkarcs:green_outarc') +player:get_inventory():add_item('main', 'pkarcs:blue_outarc') + +end +end +) + +-- Sphere + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.sphere then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'slope:sphere_white') +player:get_inventory():add_item('main', 'slope:sphere_black') +player:get_inventory():add_item('main', 'slope:sphere_red') +player:get_inventory():add_item('main', 'slope:sphere_orange') +player:get_inventory():add_item('main', 'slope:sphere_yellow') +player:get_inventory():add_item('main', 'slope:sphere_pink') +player:get_inventory():add_item('main', 'slope:sphere_green') +player:get_inventory():add_item('main', 'slope:sphere_blue') + +end +end +) + +-- Cone + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.cone then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'slope:cone_white') +player:get_inventory():add_item('main', 'slope:cone_black') +player:get_inventory():add_item('main', 'slope:cone_red') +player:get_inventory():add_item('main', 'slope:cone_orange') +player:get_inventory():add_item('main', 'slope:cone_yellow') +player:get_inventory():add_item('main', 'slope:cone_pink') +player:get_inventory():add_item('main', 'slope:cone_green') +player:get_inventory():add_item('main', 'slope:cone_blue') + +end +end +) + +-- OutCorner + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.outcorner then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'slope:ocorner_white') +player:get_inventory():add_item('main', 'slope:ocorner_black') +player:get_inventory():add_item('main', 'slope:ocorner_red') +player:get_inventory():add_item('main', 'slope:ocorner_orange') +player:get_inventory():add_item('main', 'slope:ocorner_yellow') +player:get_inventory():add_item('main', 'slope:ocorner_pink') +player:get_inventory():add_item('main', 'slope:ocorner_green') +player:get_inventory():add_item('main', 'slope:ocorner_blue') + +end +end +) + +-- Incorner + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.incorner then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'slope:icorner_white') +player:get_inventory():add_item('main', 'slope:icorner_black') +player:get_inventory():add_item('main', 'slope:icorner_red') +player:get_inventory():add_item('main', 'slope:icorner_orange') +player:get_inventory():add_item('main', 'slope:icorner_yellow') +player:get_inventory():add_item('main', 'slope:icorner_pink') +player:get_inventory():add_item('main', 'slope:icorner_green') +player:get_inventory():add_item('main', 'slope:icorner_blue') + +end +end +) + +-- Triangle + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.triangle then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'slope:slope_white') +player:get_inventory():add_item('main', 'slope:slope_black') +player:get_inventory():add_item('main', 'slope:slope_red') +player:get_inventory():add_item('main', 'slope:slope_orange') +player:get_inventory():add_item('main', 'slope:slope_yellow') +player:get_inventory():add_item('main', 'slope:slope_pink') +player:get_inventory():add_item('main', 'slope:slope_green') +player:get_inventory():add_item('main', 'slope:slope_blue') + +end +end +) + +-- Long + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.long then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'slope:slopelong_white') +player:get_inventory():add_item('main', 'slope:slopelong_black') +player:get_inventory():add_item('main', 'slope:slopelong_red') +player:get_inventory():add_item('main', 'slope:slopelong_orange') +player:get_inventory():add_item('main', 'slope:slopelong_yellow') +player:get_inventory():add_item('main', 'slope:slopelong_pink') +player:get_inventory():add_item('main', 'slope:slopelong_green') +player:get_inventory():add_item('main', 'slope:slopelong_blue') + +end +end +) + +-- Cylinder + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.cylinder then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'slope:cylinder_white') +player:get_inventory():add_item('main', 'slope:cylinder_black') +player:get_inventory():add_item('main', 'slope:cylinder_red') +player:get_inventory():add_item('main', 'slope:cylinder_orange') +player:get_inventory():add_item('main', 'slope:cylinder_yellow') +player:get_inventory():add_item('main', 'slope:cylinder_pink') +player:get_inventory():add_item('main', 'slope:cylinder_green') +player:get_inventory():add_item('main', 'slope:cylinder_blue') + +end +end +) + +-- Fence + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.fence then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'fence:white') +player:get_inventory():add_item('main', 'fence:black') +player:get_inventory():add_item('main', 'fence:red') +player:get_inventory():add_item('main', 'fence:orange') +player:get_inventory():add_item('main', 'fence:yellow') +player:get_inventory():add_item('main', 'fence:pink') +player:get_inventory():add_item('main', 'fence:green') +player:get_inventory():add_item('main', 'fence:blue') + +end +end +) + +-- Trapdoor + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.trapdoor then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'doors:trapdoor_white') +player:get_inventory():add_item('main', 'doors:trapdoor_black') +player:get_inventory():add_item('main', 'doors:trapdoor_red') +player:get_inventory():add_item('main', 'doors:trapdoor_orange') +player:get_inventory():add_item('main', 'doors:trapdoor_yellow') +player:get_inventory():add_item('main', 'doors:trapdoor_pink') +player:get_inventory():add_item('main', 'doors:trapdoor_green') +player:get_inventory():add_item('main', 'doors:trapdoor_blue') + +end +end +) + +-- Carpets + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.carpets then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'carpet:white') +player:get_inventory():add_item('main', 'carpet:black') +player:get_inventory():add_item('main', 'carpet:red') +player:get_inventory():add_item('main', 'carpet:orange') +player:get_inventory():add_item('main', 'carpet:yellow') +player:get_inventory():add_item('main', 'carpet:pink') +player:get_inventory():add_item('main', 'carpet:green') +player:get_inventory():add_item('main', 'carpet:blue') + +end +end +) + +-- Doors + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.doors then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'doors:door_white') +player:get_inventory():add_item('main', 'doors:door_black') +player:get_inventory():add_item('main', 'doors:door_red') +player:get_inventory():add_item('main', 'doors:door_orange') +player:get_inventory():add_item('main', 'doors:door_yellow') +player:get_inventory():add_item('main', 'doors:door_pink') +player:get_inventory():add_item('main', 'doors:door_green') +player:get_inventory():add_item('main', 'doors:door_blue') + +end +end +) + +-- Waters + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.waters then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'water:white_water_source') +player:get_inventory():add_item('main', 'water:black_water_source') +player:get_inventory():add_item('main', 'water:red_water_source') +player:get_inventory():add_item('main', 'water:orange_water_source') +player:get_inventory():add_item('main', 'water:yellow_water_source') +player:get_inventory():add_item('main', 'water:pink_water_source') +player:get_inventory():add_item('main', 'water:green_water_source') +player:get_inventory():add_item('main', 'water:blue_water_source') + +end +end +) + +-- Lights + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.lights then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'light:white') +player:get_inventory():add_item('main', 'light:black') +player:get_inventory():add_item('main', 'light:red') +player:get_inventory():add_item('main', 'light:orange') +player:get_inventory():add_item('main', 'light:yellow') +player:get_inventory():add_item('main', 'light:pink') +player:get_inventory():add_item('main', 'light:green') +player:get_inventory():add_item('main', 'light:blue') + +end +end +) + +-- Blocks + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.blocks then --main page + +player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'color:white') +player:get_inventory():add_item('main', 'color:black') +player:get_inventory():add_item('main', 'color:red') +player:get_inventory():add_item('main', 'color:orange') +player:get_inventory():add_item('main', 'color:yellow') +player:get_inventory():add_item('main', 'color:pink') +player:get_inventory():add_item('main', 'color:green') +player:get_inventory():add_item('main', 'color:blue') + +end +end +) + +-- Windows + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.windows then --main page + +player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'glass:white') +player:get_inventory():add_item('main', 'glass:black') +player:get_inventory():add_item('main', 'glass:red') +player:get_inventory():add_item('main', 'glass:orange') +player:get_inventory():add_item('main', 'glass:yellow') +player:get_inventory():add_item('main', 'glass:pink') +player:get_inventory():add_item('main', 'glass:green') +player:get_inventory():add_item('main', 'glass:blue') + +end +end +) + +-- Stairs + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.stairs then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'stairs:stair_white') +player:get_inventory():add_item('main', 'stairs:stair_black') +player:get_inventory():add_item('main', 'stairs:stair_red') +player:get_inventory():add_item('main', 'stairs:stair_orange') +player:get_inventory():add_item('main', 'stairs:stair_yellow') +player:get_inventory():add_item('main', 'stairs:stair_pink') +player:get_inventory():add_item('main', 'stairs:stair_green') +player:get_inventory():add_item('main', 'stairs:stair_blue') + +end +end +) + +-- Top Slabs + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.tslabs then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'stackslabs:top_slabwhite') +player:get_inventory():add_item('main', 'stackslabs:top_slabblack') +player:get_inventory():add_item('main', 'stackslabs:top_slabred') +player:get_inventory():add_item('main', 'stackslabs:top_slaborange') +player:get_inventory():add_item('main', 'stackslabs:top_slabyellow') +player:get_inventory():add_item('main', 'stackslabs:top_slabpink') +player:get_inventory():add_item('main', 'stackslabs:top_slabgreen') +player:get_inventory():add_item('main', 'stackslabs:top_slabblue') + +end +end +) + +-- Bottom Slabs + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.slabs then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'stairs:slab_white') +player:get_inventory():add_item('main', 'stairs:slab_black') +player:get_inventory():add_item('main', 'stairs:slab_red') +player:get_inventory():add_item('main', 'stairs:slab_orange') +player:get_inventory():add_item('main', 'stairs:slab_yellow') +player:get_inventory():add_item('main', 'stairs:slab_pink') +player:get_inventory():add_item('main', 'stairs:slab_green') +player:get_inventory():add_item('main', 'stairs:slab_blue') + +end +end +) + +-- End Build Nodes diff --git a/mods/Menu/inventory_plus/decoration.lua b/mods/Menu/inventory_plus/decoration.lua new file mode 100644 index 0000000..2003008 --- /dev/null +++ b/mods/Menu/inventory_plus/decoration.lua @@ -0,0 +1,527 @@ +-- Light in Block + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.beaconoff then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'beacon:offwhite') +player:get_inventory():add_item('main', 'beacon:offblack') +player:get_inventory():add_item('main', 'beacon:offred') +player:get_inventory():add_item('main', 'beacon:offorange') +player:get_inventory():add_item('main', 'beacon:offyellow') +player:get_inventory():add_item('main', 'beacon:offpink') +player:get_inventory():add_item('main', 'beacon:offgreen') +player:get_inventory():add_item('main', 'beacon:offblue') + +end +end +) + +-- Beacon in Block + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.beacon then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'beacon:white') +player:get_inventory():add_item('main', 'beacon:black') +player:get_inventory():add_item('main', 'beacon:red') +player:get_inventory():add_item('main', 'beacon:orange') +player:get_inventory():add_item('main', 'beacon:yellow') +player:get_inventory():add_item('main', 'beacon:pink') +player:get_inventory():add_item('main', 'beacon:green') +player:get_inventory():add_item('main', 'beacon:blue') + +end +end +) + +-- Trampolines + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.trampoline then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'trampoline:white') +player:get_inventory():add_item('main', 'trampoline:black') +player:get_inventory():add_item('main', 'trampoline:red') +player:get_inventory():add_item('main', 'trampoline:orange') +player:get_inventory():add_item('main', 'trampoline:yellow') +player:get_inventory():add_item('main', 'trampoline:pink') +player:get_inventory():add_item('main', 'trampoline:green') +player:get_inventory():add_item('main', 'trampoline:blue') + +end +end +) + +-- Flags + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.flags then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'flags:white') +player:get_inventory():add_item('main', 'flags:black') +player:get_inventory():add_item('main', 'flags:red') +player:get_inventory():add_item('main', 'flags:orange') +player:get_inventory():add_item('main', 'flags:yellow') +player:get_inventory():add_item('main', 'flags:pink') +player:get_inventory():add_item('main', 'flags:green') +player:get_inventory():add_item('main', 'flags:blue') + +end +end +) + +-- Shield Slash + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.shieldslash then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'castle_shields:shield_slashwhite') +player:get_inventory():add_item('main', 'castle_shields:shield_slashblack') +player:get_inventory():add_item('main', 'castle_shields:shield_slashred') +player:get_inventory():add_item('main', 'castle_shields:shield_slashorange') +player:get_inventory():add_item('main', 'castle_shields:shield_slashyellow') +player:get_inventory():add_item('main', 'castle_shields:shield_slashpink') +player:get_inventory():add_item('main', 'castle_shields:shield_slashgreen') +player:get_inventory():add_item('main', 'castle_shields:shield_slashblue') + +end +end +) + +-- Shield Chevron + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.shieldchevron then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'castle_shields:shield_chevronwhite') +player:get_inventory():add_item('main', 'castle_shields:shield_chevronblack') +player:get_inventory():add_item('main', 'castle_shields:shield_chevronred') +player:get_inventory():add_item('main', 'castle_shields:shield_chevronorange') +player:get_inventory():add_item('main', 'castle_shields:shield_chevronyellow') +player:get_inventory():add_item('main', 'castle_shields:shield_chevronpink') +player:get_inventory():add_item('main', 'castle_shields:shield_chevrongreen') +player:get_inventory():add_item('main', 'castle_shields:shield_chevronblue') + +end +end +) + +-- Shield Cross + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.shieldcross then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'castle_shields:shield_crosswhite') +player:get_inventory():add_item('main', 'castle_shields:shield_crossblack') +player:get_inventory():add_item('main', 'castle_shields:shield_crossred') +player:get_inventory():add_item('main', 'castle_shields:shield_crossorange') +player:get_inventory():add_item('main', 'castle_shields:shield_crossyellow') +player:get_inventory():add_item('main', 'castle_shields:shield_crosspink') +player:get_inventory():add_item('main', 'castle_shields:shield_crossgreen') +player:get_inventory():add_item('main', 'castle_shields:shield_crossblue') + +end +end +) + + +-- Torch + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.torch then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'abritorch:torch_white') +player:get_inventory():add_item('main', 'abritorch:torch_black') +player:get_inventory():add_item('main', 'abritorch:torch_red') +player:get_inventory():add_item('main', 'abritorch:torch_orange') +player:get_inventory():add_item('main', 'abritorch:torch_yellow') +player:get_inventory():add_item('main', 'abritorch:torch_pink') +player:get_inventory():add_item('main', 'abritorch:torch_green') +player:get_inventory():add_item('main', 'abritorch:torch_blue') + +end +end +) + +-- CGherse (Castle Gates Herse) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.cgherse then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'castle_gates:hersewhite') +player:get_inventory():add_item('main', 'castle_gates:herseblack') +player:get_inventory():add_item('main', 'castle_gates:hersered') +player:get_inventory():add_item('main', 'castle_gates:herseorange') +player:get_inventory():add_item('main', 'castle_gates:herseyellow') +player:get_inventory():add_item('main', 'castle_gates:hersepink') +player:get_inventory():add_item('main', 'castle_gates:hersegreen') +player:get_inventory():add_item('main', 'castle_gates:herseblue') + +end +end +) + +-- CGborder (Castle Gates Border) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.cgborder then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'castle_gates:borderwhite') +player:get_inventory():add_item('main', 'castle_gates:borderblack') +player:get_inventory():add_item('main', 'castle_gates:borderred') +player:get_inventory():add_item('main', 'castle_gates:borderorange') +player:get_inventory():add_item('main', 'castle_gates:borderyellow') +player:get_inventory():add_item('main', 'castle_gates:borderpink') +player:get_inventory():add_item('main', 'castle_gates:bordergreen') +player:get_inventory():add_item('main', 'castle_gates:borderblue') + +end +end +) + +-- CGdoor (Castle Gates Door) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.cgdoor then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'castle_gates:doorwhite') +player:get_inventory():add_item('main', 'castle_gates:doorblack') +player:get_inventory():add_item('main', 'castle_gates:doorred') +player:get_inventory():add_item('main', 'castle_gates:doororange') +player:get_inventory():add_item('main', 'castle_gates:dooryellow') +player:get_inventory():add_item('main', 'castle_gates:doorpink') +player:get_inventory():add_item('main', 'castle_gates:doorgreen') +player:get_inventory():add_item('main', 'castle_gates:doorblue') + +end +end +) + +-- FBladder (Factory Bridges Ladder) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.fbladder then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'factory_bridges:ladderwhite') +player:get_inventory():add_item('main', 'factory_bridges:ladderblack') +player:get_inventory():add_item('main', 'factory_bridges:ladderred') +player:get_inventory():add_item('main', 'factory_bridges:ladderorange') +player:get_inventory():add_item('main', 'factory_bridges:ladderyellow') +player:get_inventory():add_item('main', 'factory_bridges:ladderpink') +player:get_inventory():add_item('main', 'factory_bridges:laddergreen') +player:get_inventory():add_item('main', 'factory_bridges:ladderblue') + +end +end +) + +-- FBstair (Factory Bridges Stair) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.fbstair then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'factory_bridges:stairwhite') +player:get_inventory():add_item('main', 'factory_bridges:stairblack') +player:get_inventory():add_item('main', 'factory_bridges:stairred') +player:get_inventory():add_item('main', 'factory_bridges:stairorange') +player:get_inventory():add_item('main', 'factory_bridges:stairyellow') +player:get_inventory():add_item('main', 'factory_bridges:stairpink') +player:get_inventory():add_item('main', 'factory_bridges:stairgreen') +player:get_inventory():add_item('main', 'factory_bridges:stairblue') + +end +end +) + +-- FBtrap (Factory Bridges Trap) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.fbtrap then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'factory_bridges:trap1white') +player:get_inventory():add_item('main', 'factory_bridges:trap1black') +player:get_inventory():add_item('main', 'factory_bridges:trap1red') +player:get_inventory():add_item('main', 'factory_bridges:trap1orange') +player:get_inventory():add_item('main', 'factory_bridges:trap1yellow') +player:get_inventory():add_item('main', 'factory_bridges:trap1pink') +player:get_inventory():add_item('main', 'factory_bridges:trap1green') +player:get_inventory():add_item('main', 'factory_bridges:trap1blue') + +end +end +) + +-- Frigos + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.frigo then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'hdb:frigowhite') +player:get_inventory():add_item('main', 'hdb:frigoblack') +player:get_inventory():add_item('main', 'hdb:frigored') +player:get_inventory():add_item('main', 'hdb:frigoorange') +player:get_inventory():add_item('main', 'hdb:frigoyellow') +player:get_inventory():add_item('main', 'hdb:frigopink') +player:get_inventory():add_item('main', 'hdb:frigogreen') +player:get_inventory():add_item('main', 'hdb:frigoblue') + +end +end +) + +-- Cabinets + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.armoire then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'hdb:armoirewhite') +player:get_inventory():add_item('main', 'hdb:armoireblack') +player:get_inventory():add_item('main', 'hdb:armoirered') +player:get_inventory():add_item('main', 'hdb:armoireorange') +player:get_inventory():add_item('main', 'hdb:armoireyellow') +player:get_inventory():add_item('main', 'hdb:armoirepink') +player:get_inventory():add_item('main', 'hdb:armoiregreen') +player:get_inventory():add_item('main', 'hdb:armoireblue') + +end +end +) + +-- Benchs + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.bench then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'hdb:benchwhite') +player:get_inventory():add_item('main', 'hdb:benchblack') +player:get_inventory():add_item('main', 'hdb:benchred') +player:get_inventory():add_item('main', 'hdb:benchorange') +player:get_inventory():add_item('main', 'hdb:benchyellow') +player:get_inventory():add_item('main', 'hdb:benchpink') +player:get_inventory():add_item('main', 'hdb:benchgreen') +player:get_inventory():add_item('main', 'hdb:benchblue') + +end +end +) + + +-- Computers + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.computers then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'hdb:computerwhite') +player:get_inventory():add_item('main', 'hdb:computerblack') +player:get_inventory():add_item('main', 'hdb:computerred') +player:get_inventory():add_item('main', 'hdb:computerorange') +player:get_inventory():add_item('main', 'hdb:computeryellow') +player:get_inventory():add_item('main', 'hdb:computerpink') +player:get_inventory():add_item('main', 'hdb:computergreen') +player:get_inventory():add_item('main', 'hdb:computerblue') + +end +end +) + + +-- Desks + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.desks then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'hdb:deskwhite') +player:get_inventory():add_item('main', 'hdb:deskblack') +player:get_inventory():add_item('main', 'hdb:deskred') +player:get_inventory():add_item('main', 'hdb:deskorange') +player:get_inventory():add_item('main', 'hdb:deskyellow') +player:get_inventory():add_item('main', 'hdb:deskpink') +player:get_inventory():add_item('main', 'hdb:deskgreen') +player:get_inventory():add_item('main', 'hdb:deskblue') + +end +end +) + +-- Beds + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.beds then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'beds:bed_bottom_white') +player:get_inventory():add_item('main', 'beds:bed_bottom_black') +player:get_inventory():add_item('main', 'beds:bed_bottom_red') +player:get_inventory():add_item('main', 'beds:bed_bottom_orange') +player:get_inventory():add_item('main', 'beds:bed_bottom_yellow') +player:get_inventory():add_item('main', 'beds:bed_bottom_pink') +player:get_inventory():add_item('main', 'beds:bed_bottom_green') +player:get_inventory():add_item('main', 'beds:bed_bottom_blue') + +end +end +) + +-- Signs + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.signs then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'signs:sign_wall_white') +player:get_inventory():add_item('main', 'signs:sign_wall_black') +player:get_inventory():add_item('main', 'signs:sign_wall_red') +player:get_inventory():add_item('main', 'signs:sign_wall_orange') +player:get_inventory():add_item('main', 'signs:sign_wall_yellow') +player:get_inventory():add_item('main', 'signs:sign_wall_pink') +player:get_inventory():add_item('main', 'signs:sign_wall_green') +player:get_inventory():add_item('main', 'signs:sign_wall_blue') + +end +end +) + +-- Table + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.table then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'ma_pops_furniture:table_white') +player:get_inventory():add_item('main', 'ma_pops_furniture:table_black') +player:get_inventory():add_item('main', 'ma_pops_furniture:table_red') +player:get_inventory():add_item('main', 'ma_pops_furniture:table_orange') +player:get_inventory():add_item('main', 'ma_pops_furniture:table_yellow') +player:get_inventory():add_item('main', 'ma_pops_furniture:table_pink') +player:get_inventory():add_item('main', 'ma_pops_furniture:table_green') +player:get_inventory():add_item('main', 'ma_pops_furniture:table_blue') + +end +end +) + +-- Chair2 + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.sofas then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'ma_pops_furniture:chair2_white') +player:get_inventory():add_item('main', 'ma_pops_furniture:chair2_black') +player:get_inventory():add_item('main', 'ma_pops_furniture:chair2_red') +player:get_inventory():add_item('main', 'ma_pops_furniture:chair2_orange') +player:get_inventory():add_item('main', 'ma_pops_furniture:chair2_yellow') +player:get_inventory():add_item('main', 'ma_pops_furniture:chair2_pink') +player:get_inventory():add_item('main', 'ma_pops_furniture:chair2_green') +player:get_inventory():add_item('main', 'ma_pops_furniture:chair2_blue') + +end +end +) + +-- Chair + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.chair then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'ma_pops_furniture:chair_white') +player:get_inventory():add_item('main', 'ma_pops_furniture:chair_black') +player:get_inventory():add_item('main', 'ma_pops_furniture:chair_red') +player:get_inventory():add_item('main', 'ma_pops_furniture:chair_orange') +player:get_inventory():add_item('main', 'ma_pops_furniture:chair_yellow') +player:get_inventory():add_item('main', 'ma_pops_furniture:chair_pink') +player:get_inventory():add_item('main', 'ma_pops_furniture:chair_green') +player:get_inventory():add_item('main', 'ma_pops_furniture:chair_blue') + +end +end +) + +-- Flowers + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.flowers then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'flowers:white') +player:get_inventory():add_item('main', 'flowers:black') +player:get_inventory():add_item('main', 'flowers:red') +player:get_inventory():add_item('main', 'flowers:orange') +player:get_inventory():add_item('main', 'flowers:yellow') +player:get_inventory():add_item('main', 'flowers:pink') +player:get_inventory():add_item('main', 'flowers:green') +player:get_inventory():add_item('main', 'flowers:blue') + +end +end +) diff --git a/mods/Menu/inventory_plus/depends.txt b/mods/Menu/inventory_plus/depends.txt new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/mods/Menu/inventory_plus/depends.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/mods/Menu/inventory_plus/init.lua b/mods/Menu/inventory_plus/init.lua new file mode 100644 index 0000000..a44f58d --- /dev/null +++ b/mods/Menu/inventory_plus/init.lua @@ -0,0 +1,2 @@ +dofile(minetest.get_modpath("inventory_plus") .. "/menu.lua") +dofile(minetest.get_modpath("inventory_plus") .. "/stuff.lua") diff --git a/mods/Menu/inventory_plus/menu.lua b/mods/Menu/inventory_plus/menu.lua new file mode 100644 index 0000000..5f9ecb8 --- /dev/null +++ b/mods/Menu/inventory_plus/menu.lua @@ -0,0 +1,436 @@ + --[[ + +Inventory Plus for Minetest + +Copyright (c) 2012 cornernote, Brett O'Donnell +Source Code: https://github.com/cornernote/minetest-inventory_plus +License: BSD-3-Clause https://raw.github.com/cornernote/minetest-inventory_plus/master/LICENSE + +Edited by TenPlus1 (23rd March 2016) + +]]-- + +-- expose api +inventory_plus = {} + +-- define buttons +inventory_plus.buttons = {} + +-- default inventory page +inventory_plus.default = minetest.settings:get("inventory_default") or "main" + +-- register_button +inventory_plus.register_button = function(player, name, label) + + local player_name = player:get_player_name() + + if inventory_plus.buttons[player_name] == nil then + inventory_plus.buttons[player_name] = {} + end + + inventory_plus.buttons[player_name][name] = label +end + +-- set_inventory_formspec +inventory_plus.set_inventory_formspec = function(player, formspec) + + -- error checking + if not formspec then + return + end + + if minetest.settings:get_bool("creative_mode") then + + -- if creative mode is on then wait a bit + minetest.after(0.01,function() + player:set_inventory_formspec(formspec) + end) + else + player:set_inventory_formspec(formspec) + end +end + +-- create detached inventory for trashcan +local trashInv = minetest.create_detached_inventory( + "trash", { + on_put = function(inv, toList, toIndex, stack, player) + inv:set_stack(toList, toIndex, ItemStack(nil)) + end + }) + +trashInv:set_size("main", 1) + +-- get_formspec +inventory_plus.get_formspec = function(player, page) + + if not player then + return + end + + -- default inventory page + local formspec = "size[8,7.5]" + .. default.gui_bg + .. default.gui_bg_img + .. "" + + -- nodes page + if page == "nodes" then + + local inv = player:get_inventory() or nil + + if not inv then + print ("NO INVENTORY FOUND") + return + end + + formspec = formspec + + .. "image_button_exit[0,0.5;1,1;gui_hotbar_selected.png^blocks.png;blocks;]" + .. "image_button_exit[1,0.5;1,1;gui_hotbar_selected.png^stairs.png;stairs;]" + .. "image_button_exit[2,0.5;1,1;gui_hotbar_selected.png^slabs.png;slabs;]" + .. "image_button_exit[3,0.5;1,1;gui_hotbar_selected.png^windows.png;windows;]" + .. "image_button_exit[4,0.5;1,1;gui_hotbar_selected.png^lights.png;lights;]" + .. "image_button_exit[5,0.5;1,1;gui_hotbar_selected.png^waters.png;waters;]" + .. "image_button_exit[6,0.5;1,1;gui_hotbar_selected.png^doors.png;doors;] " + .. "image_button_exit[7,0.5;1,1;gui_hotbar_selected.png^carpets.png;carpets;]" + .. "image_button_exit[0,2.5;1,1;gui_hotbar_selected.png^trapdoor.png;trapdoor;]" + .. "image_button_exit[1,2.5;1,1;gui_hotbar_selected.png^fence.png;fence;]" + .. "image_button_exit[2,2.5;1,1;gui_hotbar_selected.png^cylinder.png;cylinder;]" + .. "image_button_exit[3,2.5;1,1;gui_hotbar_selected.png^triangle.png;triangle;]" + .. "image_button_exit[4,2.5;1,1;gui_hotbar_selected.png^long.png;long;]" + .. "image_button_exit[5,2.5;1,1;gui_hotbar_selected.png^cone.png;cone;]" + .. "image_button_exit[6,2.5;1,1;gui_hotbar_selected.png^sphere.png;sphere;]" + .. "image_button_exit[7,2.5;1,1;gui_hotbar_selected.png^cornera.png;outcorner;]" + .. "image_button_exit[0,4.5;1,1;gui_hotbar_selected.png^cornerb.png;incorner;]" + .. "image_button_exit[1,4.5;1,1;gui_hotbar_selected.png^arc.png;arc;]" + .. "image_button_exit[2,4.5;1,1;gui_hotbar_selected.png^arcin.png;inarc;]" + .. "image_button_exit[3,4.5;1,1;gui_hotbar_selected.png^arcout.png;outarc;]" + .. "image_button_exit[4,4.5;1,1;gui_hotbar_selected.png^fullpipe.png;fullpipe;]" + .. "image_button_exit[5,4.5;1,1;gui_hotbar_selected.png^fullpipeborder.png;fullpipeborder;]" + .. "image_button_exit[6,4.5;1,1;gui_hotbar_selected.png^edge.png;edge;]" + .. "image_button[7,4.5;1,1;gui_hotbar_selected.png^droite.png;nodes2;]" + + .. "image_button[0,6.5;1,1;gui_hotbar_selected.png^gauche.png;main;]" + .. "image_button_exit[1,6.5;1,1;gui_hotbar_selected.png^rotate.png;rotate;]" + .. "image_button_exit[2,6.5;1,1;gui_hotbar_selected.png^nones.png;none;]" + +.. "" + + end + +-- nodes page2 + + if page == "nodes2" then + + local inv = player:get_inventory() or nil + + if not inv then + print ("NO INVENTORY FOUND") + return + end + + formspec = formspec + +-- .. "image_button_exit[0,0.5;1,1;nctwoedge.png;nct;]" +-- .. "label[0.1,1;Node-T]" + +-- .. "image_button_exit[1,0.5;1,1;nccross.png;nccross;]" +-- .. "label[1.1,1;Cross]" + + .. "image_button_exit[0,0.5;1,1;gui_hotbar_selected.png^edgecorner.png;edgecorner;]" + +.. "image_button[0,6.5;1,1;gui_hotbar_selected.png^gauche.png;nodes;]" +.. "image_button_exit[1,6.5;1,1;gui_hotbar_selected.png^rotate.png;rotate;]" +.. "image_button_exit[2,6.5;1,1;gui_hotbar_selected.png^nones.png;none;]" + +.. "" + + end + + if page == "animals" then + + local inv = player:get_inventory() or nil + + if not inv then + print ("NO INVENTORY FOUND") + return + end + + formspec = formspec + + +.. "image_button_exit[0,0.5;1,1;gui_hotbar_selected.png^mobs_chicken_egg_overlay.png;panda;]" + +.. "image_button[0,6.5;1,1;gui_hotbar_selected.png^gauche.png;main;]" + +.. "" + + end + +-- furnitures page + +if page == "furnitures" then + + local inv = player:get_inventory() or nil + + if not inv then + print ("NO INVENTORY FOUND") + return + end + + formspec = formspec + +.. "image_button_exit[0,0.5;1,1;gui_hotbar_selected.png^chair.png;chair;]" +.. "image_button_exit[1,0.5;1,1;gui_hotbar_selected.png^sofas.png;sofas;]" +.. "image_button_exit[2,0.5;1,1;gui_hotbar_selected.png^table.png;table;]" +.. "image_button_exit[3,0.5;1,1;gui_hotbar_selected.png^signs.png;signs;]" +.. "image_button_exit[4,0.5;1,1;gui_hotbar_selected.png^beds.png;beds;]" +.. "image_button_exit[5,0.5;1,1;gui_hotbar_selected.png^flowers.png;flowers;]" +.. "image_button_exit[6,0.5;1,1;gui_hotbar_selected.png^flag.png;flags;]" +.. "image_button_exit[7,0.5;1,1;gui_hotbar_selected.png^computer.png;computers;]" +.. "image_button_exit[0,2.5;1,1;gui_hotbar_selected.png^desk.png;desks;]" +.. "image_button_exit[1,2.5;1,1;gui_hotbar_selected.png^bench.png;bench;]" +.. "image_button_exit[2,2.5;1,1;gui_hotbar_selected.png^armoire.png;armoire;]" +.. "image_button_exit[3,2.5;1,1;gui_hotbar_selected.png^frigo.png;frigo;]" +.. "image_button_exit[4,2.5;1,1;gui_hotbar_selected.png^fbtrap.png;fbtrap;]" +.. "image_button_exit[5,2.5;1,1;gui_hotbar_selected.png^fbstair.png;fbstair;]" +.. "image_button_exit[6,2.5;1,1;gui_hotbar_selected.png^fbladder.png;fbladder;]" +.. "image_button_exit[7,2.5;1,1;gui_hotbar_selected.png^cgherse.png;cgherse;]" +.. "image_button_exit[0,4.5;1,1;gui_hotbar_selected.png^cgborder.png;cgborder;]" +.. "image_button_exit[1,4.5;1,1;gui_hotbar_selected.png^cgdoor.png;cgdoor;]" +-- .. "image_button_exit[2,4.5;1,1;gui_hotbar_selected.png^slabs.png;tslabs;]" +.. "image_button_exit[2,4.5;1,1;gui_hotbar_selected.png^torch.png;torch;]" +.. "image_button_exit[3,4.5;1,1;gui_hotbar_selected.png^shieldcross.png;shieldcross;]" +.. "image_button_exit[4,4.5;1,1;gui_hotbar_selected.png^shieldslash.png;shieldslash;]" +.. "image_button_exit[5,4.5;1,1;gui_hotbar_selected.png^shieldchevron.png;shieldchevron;]" +.."image_button_exit[6,4.5;1,1;gui_hotbar_selected.png^trampo.png;trampoline;]" + +.. "image_button[7,4.5;1,1;gui_hotbar_selected.png^droite.png;furnitures2;]" + + .. "image_button[0,6.5;1,1;gui_hotbar_selected.png^gauche.png;main;]" + .. "image_button_exit[1,6.5;1,1;gui_hotbar_selected.png^rotate.png;rotate;]" + .. "image_button_exit[2,6.5;1,1;gui_hotbar_selected.png^nones.png;none;]" + .. "" + + end + +-- furnitures page2 + + if page == "furnitures2" then + + local inv = player:get_inventory() or nil + + if not inv then + print ("NO INVENTORY FOUND") + return + end + + formspec = formspec + +.. "image_button_exit[0,0.5;1,1;gui_hotbar_selected.png^beaconon.png;beacon;]" +.. "image_button_exit[1,0.5;1,1;gui_hotbar_selected.png^beaconoff.png;beaconoff;]" + +.. "image_button[0,6.5;1,1;gui_hotbar_selected.png^gauche.png;furnitures;]" +.. "image_button_exit[1,6.5;1,1;gui_hotbar_selected.png^rotate.png;rotate;]" +.. "image_button_exit[2,6.5;1,1;gui_hotbar_selected.png^nones.png;none;]" + +.. "" + + end + + +-- Cars + + if page == "vehicules" then + + local inv = player:get_inventory() or nil + + if not inv then + print ("NO INVENTORY FOUND") + return + end + + formspec = formspec + + .. "image_button_exit[0,0.5;1,1;gui_hotbar_selected.png^cars.png;cars;]" + .. "image_button_exit[1,0.5;1,1;gui_hotbar_selected.png^surfboard.png;surfboard;]" +.. "image_button_exit[2,0.5;1,1;gui_hotbar_selected.png^airboat_airboat_inv.png;airboat;]" +.. "image_button_exit[3,0.5;1,1;gui_hotbar_selected.png^spaceship_spaceship_inv.png;spaceship;]" +.. "image_button_exit[4,0.5;1,1;gui_hotbar_selected.png^hovercraft_inv.png;hovercraft;]" +.. "image_button_exit[5,0.5;1,1;gui_hotbar_selected.png^hotair_inv.png;hotairballoon;]" +.. "image_button_exit[6,0.5;1,1;gui_hotbar_selected.png^cart.png;carts;]" +.. "image_button_exit[7,0.5;1,1;gui_hotbar_selected.png^carts_rail_straight_pwr.png;rails;]" + +.. "image_button[0,6.5;1,1;gui_hotbar_selected.png^gauche.png;main;]" +.. "image_button_exit[1,6.5;1,1;gui_hotbar_selected.png^rotate.png;rotate;]" +.. "image_button_exit[2,6.5;1,1;gui_hotbar_selected.png^nones.png;none;]" + +.. "" + + end + +if page == "planets" then + + local inv = player:get_inventory() or nil + + if not inv then + print ("NO INVENTORY FOUND") + return + end + + formspec = formspec + + .. "image_button_exit[0,0.5;1,1;gui_hotbar_selected.png^mmars.png;mars;]" + .. "image_button_exit[1,0.5;1,1;gui_hotbar_selected.png^moon.png;moon;]" + .. "image_button_exit[2,0.5;1,1;gui_hotbar_selected.png^earth.png;earth;]" + + .. "image_button[0,6.5;1,1;gui_hotbar_selected.png^gauche.png;main;]" + +.. "" + + end + +if page == "trees" then + + local inv = player:get_inventory() or nil + + if not inv then + print ("NO INVENTORY FOUND") + return + end + + formspec = formspec + + .. "image_button_exit[0,0.5;1,1;gui_hotbar_selected.png^smalltrees.png;smalltrees;]" + .. "image_button_exit[1,0.5;1,1;gui_hotbar_selected.png^normaltrees.png;normaltrees;]" + .. "image_button_exit[2,0.5;1,1;gui_hotbar_selected.png^bigtrees.png;bigtrees;]" + + .. "image_button[0,6.5;1,1;gui_hotbar_selected.png^gauche.png;main;]" + +.. "" + + end + + -- main page + if page == "main" then + + -- buttons + local x, y = 2, 0 + + for k, v in pairs(inventory_plus.buttons[player:get_player_name()]) do + + formspec = formspec + +.. "image_button[2,0.5;4,1;gui_hotbar_selected.png;character_creator;Skin]" +.. "image_button[2,1.5;4,1;gui_hotbar_selected.png;vehicules;Vehicules]" + +.. "image_button[2,2.5;4,1;gui_hotbar_selected.png;trees;Tree]" +.. "image_button[2,3.5;4,1;gui_hotbar_selected.png;animals;Animals]" + +.. "image_button[2,4.5;4,1;gui_hotbar_selected.png;nodes;Build]" +.. "image_button[2,5.5;4,1;gui_hotbar_selected.png;furnitures;Decorations]" + +.. "image_button_exit[2,6.5;4,1;gui_hotbar_selected.png;quit;Back To Game]" + + x = x +y = y + 1 + end + end + + return formspec +end + +-- register_on_joinplayer +minetest.register_on_joinplayer(function(player) + + minetest.after(1, function() + + inventory_plus.set_inventory_formspec(player, + inventory_plus.get_formspec(player, inventory_plus.default)) + end) +end) + +-- register_on_player_receive_fields +minetest.register_on_player_receive_fields(function(player, formname, fields) + + -- main + + if fields.main then + + inventory_plus.set_inventory_formspec(player, + inventory_plus.get_formspec(player, "main")) + + return + end + + -- craft + if fields.nodes then + + inventory_plus.set_inventory_formspec(player, + inventory_plus.get_formspec(player, "nodes")) + + return + end + +if fields.nodes2 then + + inventory_plus.set_inventory_formspec(player, + inventory_plus.get_formspec(player, "nodes2")) + + return + end + + if fields.furnitures then + + inventory_plus.set_inventory_formspec(player, + inventory_plus.get_formspec(player, "furnitures")) + + return + end + +if fields.furnitures2 then + + inventory_plus.set_inventory_formspec(player, + inventory_plus.get_formspec(player, "furnitures2")) + + return + end + +if fields.vehicules then + + inventory_plus.set_inventory_formspec(player, + inventory_plus.get_formspec(player, "vehicules")) + + return + end + +if fields.trees then + + inventory_plus.set_inventory_formspec(player, + inventory_plus.get_formspec(player, "trees")) + + return + end + +if fields.animals then + +inventory_plus.set_inventory_formspec(player, +inventory_plus.get_formspec(player, "animals")) + +return +end + + + -- creative + if fields.creative_prev + or fields.creative_next then + + minetest.after(0.1, function() + + inventory_plus.set_inventory_formspec(player, + inventory_plus.get_formspec(player, "creative")) + end) + + return + end +end) diff --git a/mods/Menu/inventory_plus/noncubic.lua b/mods/Menu/inventory_plus/noncubic.lua new file mode 100644 index 0000000..bc92600 --- /dev/null +++ b/mods/Menu/inventory_plus/noncubic.lua @@ -0,0 +1,49 @@ +-- Start Non Cubic + +-- noncubic:slope_ + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.ncslope then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'noncubic:slope_white') +player:get_inventory():add_item('main', 'noncubic:slope_black') +player:get_inventory():add_item('main', 'noncubic:slope_red') +player:get_inventory():add_item('main', 'noncubic:slope_orange') +player:get_inventory():add_item('main', 'noncubic:slope_yellow') +player:get_inventory():add_item('main', 'noncubic:slope_pink') +player:get_inventory():add_item('main', 'noncubic:slope_green') +player:get_inventory():add_item('main', 'noncubic:slope_blue') + +end +end +) + +-- noncubic:slope_lying_ +-- noncubic:slope_upsdown_ +-- noncubic:slope_edge_ +-- noncubic:slope_inner_edge_ +-- noncubic:slope_upsdown_edge_ +-- noncubic:slope_upsdown_inner_edge_ +-- noncubic:pyramid_ +-- noncubic:spike_ +-- noncubic:onecurvededge_ +-- noncubic:twocurvededge_ +-- noncubic:cylinder_ +-- noncubic:cylinder_horizontal_ +-- noncubic:cylinder_sphere_ +-- noncubic:element_straight_ +-- noncubic:element_edge_ +-- noncubic:element_t_ +-- noncubic:element_cross_ +-- noncubic:element_end_ +-- noncubic:element_straight_double_ +-- noncubic:element_edge_double_ +-- noncubic:element_t_double_ +-- noncubic:element_cross_double_ +-- noncubic:element_end_double_ +-- noncubic:stick_ + +-- End Non Cubic \ No newline at end of file diff --git a/mods/Menu/inventory_plus/planets.lua b/mods/Menu/inventory_plus/planets.lua new file mode 100644 index 0000000..6411888 --- /dev/null +++ b/mods/Menu/inventory_plus/planets.lua @@ -0,0 +1,72 @@ +-- Start Planet + +-- Earth + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() +if fields.earth then --main page + +earth_command = {} +earth_command.pos = {x=0, y=27, z=0} + + local player = minetest.get_player_by_name(name) + if player == nil then + -- just a check to prevent the server crashing + return false + end + local pos = player:getpos() + + player:setpos(earth_command.pos) + minetest.chat_send_player(name, "Teleported to Earth!") + +end +end +) + +-- Earth + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() +if fields.mars then --main page + +earth_command = {} +earth_command.pos = {x=0, y=7027, z=0} + + local player = minetest.get_player_by_name(name) + if player == nil then + -- just a check to prevent the server crashing + return false + end + local pos = player:getpos() + + player:setpos(earth_command.pos) + minetest.chat_send_player(name, "Teleported to Mars!") + +end +end +) + +-- Moon + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() +if fields.moon then --main page + +moon_command = {} +moon_command.pos = {x=0, y=5027, z=0} + + local player = minetest.get_player_by_name(name) + if player == nil then + -- just a check to prevent the server crashing + return false + end + local pos = player:getpos() + + player:setpos(moon_command.pos) + minetest.chat_send_player(name, "Teleported to Moon!") + +end +end +) + +-- End Planets diff --git a/mods/Menu/inventory_plus/stuff.lua b/mods/Menu/inventory_plus/stuff.lua new file mode 100644 index 0000000..689f7b1 --- /dev/null +++ b/mods/Menu/inventory_plus/stuff.lua @@ -0,0 +1,26 @@ +-- Stuff + +dofile(minetest.get_modpath("inventory_plus") .. "/build.lua") +dofile(minetest.get_modpath("inventory_plus") .. "/decoration.lua") +dofile(minetest.get_modpath("inventory_plus") .. "/tools.lua") +dofile(minetest.get_modpath("inventory_plus") .. "/trees.lua") +dofile(minetest.get_modpath("inventory_plus") .. "/planets.lua") +dofile(minetest.get_modpath("inventory_plus") .. "/vehicules.lua") +dofile(minetest.get_modpath("inventory_plus") .. "/animals.lua") + +-- Initial Stuff and Delete Legacy Stuff + +minetest.register_on_joinplayer(function(player) + +player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'flowers:white') +player:get_inventory():add_item('main', 'flowers:black') +player:get_inventory():add_item('main', 'flowers:red') +player:get_inventory():add_item('main', 'flowers:orange') +player:get_inventory():add_item('main', 'flowers:yellow') +player:get_inventory():add_item('main', 'flowers:pink') +player:get_inventory():add_item('main', 'flowers:green') +player:get_inventory():add_item('main', 'flowers:blue') + +end) diff --git a/mods/Menu/inventory_plus/textures/arc.png b/mods/Menu/inventory_plus/textures/arc.png new file mode 100644 index 0000000..77b83a3 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/arc.png differ diff --git a/mods/Menu/inventory_plus/textures/arcin.png b/mods/Menu/inventory_plus/textures/arcin.png new file mode 100644 index 0000000..a2b1dc3 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/arcin.png differ diff --git a/mods/Menu/inventory_plus/textures/arcout.png b/mods/Menu/inventory_plus/textures/arcout.png new file mode 100644 index 0000000..c51678e Binary files /dev/null and b/mods/Menu/inventory_plus/textures/arcout.png differ diff --git a/mods/Menu/inventory_plus/textures/armoire.png b/mods/Menu/inventory_plus/textures/armoire.png new file mode 100644 index 0000000..2dfb36b Binary files /dev/null and b/mods/Menu/inventory_plus/textures/armoire.png differ diff --git a/mods/Menu/inventory_plus/textures/beaconoff.png b/mods/Menu/inventory_plus/textures/beaconoff.png new file mode 100644 index 0000000..1178bb2 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/beaconoff.png differ diff --git a/mods/Menu/inventory_plus/textures/beaconon.png b/mods/Menu/inventory_plus/textures/beaconon.png new file mode 100644 index 0000000..d82b51e Binary files /dev/null and b/mods/Menu/inventory_plus/textures/beaconon.png differ diff --git a/mods/Menu/inventory_plus/textures/beds.png b/mods/Menu/inventory_plus/textures/beds.png new file mode 100644 index 0000000..81d7bc3 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/beds.png differ diff --git a/mods/Menu/inventory_plus/textures/bench.png b/mods/Menu/inventory_plus/textures/bench.png new file mode 100644 index 0000000..3f57dc8 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/bench.png differ diff --git a/mods/Menu/inventory_plus/textures/bigtrees.png b/mods/Menu/inventory_plus/textures/bigtrees.png new file mode 100644 index 0000000..36085ad Binary files /dev/null and b/mods/Menu/inventory_plus/textures/bigtrees.png differ diff --git a/mods/Menu/inventory_plus/textures/blocks.png b/mods/Menu/inventory_plus/textures/blocks.png new file mode 100644 index 0000000..f5ba664 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/blocks.png differ diff --git a/mods/Menu/inventory_plus/textures/carpets.png b/mods/Menu/inventory_plus/textures/carpets.png new file mode 100644 index 0000000..4b56949 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/carpets.png differ diff --git a/mods/Menu/inventory_plus/textures/cars.png b/mods/Menu/inventory_plus/textures/cars.png new file mode 100644 index 0000000..2dba0a3 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/cars.png differ diff --git a/mods/Menu/inventory_plus/textures/cgborder.png b/mods/Menu/inventory_plus/textures/cgborder.png new file mode 100644 index 0000000..d21d935 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/cgborder.png differ diff --git a/mods/Menu/inventory_plus/textures/cgdoor.png b/mods/Menu/inventory_plus/textures/cgdoor.png new file mode 100644 index 0000000..be96361 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/cgdoor.png differ diff --git a/mods/Menu/inventory_plus/textures/cgherse.png b/mods/Menu/inventory_plus/textures/cgherse.png new file mode 100644 index 0000000..71e431e Binary files /dev/null and b/mods/Menu/inventory_plus/textures/cgherse.png differ diff --git a/mods/Menu/inventory_plus/textures/chair.png b/mods/Menu/inventory_plus/textures/chair.png new file mode 100644 index 0000000..b7f9621 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/chair.png differ diff --git a/mods/Menu/inventory_plus/textures/computer.png b/mods/Menu/inventory_plus/textures/computer.png new file mode 100644 index 0000000..7d516e3 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/computer.png differ diff --git a/mods/Menu/inventory_plus/textures/cone.png b/mods/Menu/inventory_plus/textures/cone.png new file mode 100644 index 0000000..794cf92 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/cone.png differ diff --git a/mods/Menu/inventory_plus/textures/cornera.png b/mods/Menu/inventory_plus/textures/cornera.png new file mode 100644 index 0000000..cda6430 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/cornera.png differ diff --git a/mods/Menu/inventory_plus/textures/cornerb.png b/mods/Menu/inventory_plus/textures/cornerb.png new file mode 100644 index 0000000..b0051e9 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/cornerb.png differ diff --git a/mods/Menu/inventory_plus/textures/cylinder.png b/mods/Menu/inventory_plus/textures/cylinder.png new file mode 100644 index 0000000..839df94 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/cylinder.png differ diff --git a/mods/Menu/inventory_plus/textures/desk.png b/mods/Menu/inventory_plus/textures/desk.png new file mode 100644 index 0000000..ed920b2 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/desk.png differ diff --git a/mods/Menu/inventory_plus/textures/doors.png b/mods/Menu/inventory_plus/textures/doors.png new file mode 100644 index 0000000..3441dbd Binary files /dev/null and b/mods/Menu/inventory_plus/textures/doors.png differ diff --git a/mods/Menu/inventory_plus/textures/droite.png b/mods/Menu/inventory_plus/textures/droite.png new file mode 100644 index 0000000..8eeda55 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/droite.png differ diff --git a/mods/Menu/inventory_plus/textures/earth.png b/mods/Menu/inventory_plus/textures/earth.png new file mode 100644 index 0000000..4944495 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/earth.png differ diff --git a/mods/Menu/inventory_plus/textures/edge.png b/mods/Menu/inventory_plus/textures/edge.png new file mode 100644 index 0000000..3e6a837 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/edge.png differ diff --git a/mods/Menu/inventory_plus/textures/edgecorner.png b/mods/Menu/inventory_plus/textures/edgecorner.png new file mode 100644 index 0000000..7a249ff Binary files /dev/null and b/mods/Menu/inventory_plus/textures/edgecorner.png differ diff --git a/mods/Menu/inventory_plus/textures/fence.png b/mods/Menu/inventory_plus/textures/fence.png new file mode 100644 index 0000000..62d36eb Binary files /dev/null and b/mods/Menu/inventory_plus/textures/fence.png differ diff --git a/mods/Menu/inventory_plus/textures/flowers.png b/mods/Menu/inventory_plus/textures/flowers.png new file mode 100644 index 0000000..23582c0 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/flowers.png differ diff --git a/mods/Menu/inventory_plus/textures/frigo.png b/mods/Menu/inventory_plus/textures/frigo.png new file mode 100644 index 0000000..9333eb4 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/frigo.png differ diff --git a/mods/Menu/inventory_plus/textures/fullpipe.png b/mods/Menu/inventory_plus/textures/fullpipe.png new file mode 100644 index 0000000..cd44bda Binary files /dev/null and b/mods/Menu/inventory_plus/textures/fullpipe.png differ diff --git a/mods/Menu/inventory_plus/textures/fullpipeborder.png b/mods/Menu/inventory_plus/textures/fullpipeborder.png new file mode 100644 index 0000000..1b877e2 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/fullpipeborder.png differ diff --git a/mods/Menu/inventory_plus/textures/gauche.png b/mods/Menu/inventory_plus/textures/gauche.png new file mode 100644 index 0000000..4ecf2bf Binary files /dev/null and b/mods/Menu/inventory_plus/textures/gauche.png differ diff --git a/mods/Menu/inventory_plus/textures/lights.png b/mods/Menu/inventory_plus/textures/lights.png new file mode 100644 index 0000000..b5facba Binary files /dev/null and b/mods/Menu/inventory_plus/textures/lights.png differ diff --git a/mods/Menu/inventory_plus/textures/long.png b/mods/Menu/inventory_plus/textures/long.png new file mode 100644 index 0000000..d6bafd2 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/long.png differ diff --git a/mods/Menu/inventory_plus/textures/mmars.png b/mods/Menu/inventory_plus/textures/mmars.png new file mode 100644 index 0000000..e4d4e3e Binary files /dev/null and b/mods/Menu/inventory_plus/textures/mmars.png differ diff --git a/mods/Menu/inventory_plus/textures/mobs.png b/mods/Menu/inventory_plus/textures/mobs.png new file mode 100644 index 0000000..bdd5267 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/mobs.png differ diff --git a/mods/Menu/inventory_plus/textures/moon.png b/mods/Menu/inventory_plus/textures/moon.png new file mode 100644 index 0000000..af82895 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/moon.png differ diff --git a/mods/Menu/inventory_plus/textures/noncubic.png b/mods/Menu/inventory_plus/textures/noncubic.png new file mode 100644 index 0000000..f9ad7bf Binary files /dev/null and b/mods/Menu/inventory_plus/textures/noncubic.png differ diff --git a/mods/Menu/inventory_plus/textures/nones.png b/mods/Menu/inventory_plus/textures/nones.png new file mode 100644 index 0000000..52fd316 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/nones.png differ diff --git a/mods/Menu/inventory_plus/textures/normaltrees.png b/mods/Menu/inventory_plus/textures/normaltrees.png new file mode 100644 index 0000000..a6bb41d Binary files /dev/null and b/mods/Menu/inventory_plus/textures/normaltrees.png differ diff --git a/mods/Menu/inventory_plus/textures/protect.png b/mods/Menu/inventory_plus/textures/protect.png new file mode 100644 index 0000000..c235a60 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/protect.png differ diff --git a/mods/Menu/inventory_plus/textures/rotate.png b/mods/Menu/inventory_plus/textures/rotate.png new file mode 100644 index 0000000..301a7a2 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/rotate.png differ diff --git a/mods/Menu/inventory_plus/textures/signs.png b/mods/Menu/inventory_plus/textures/signs.png new file mode 100644 index 0000000..c13c4dd Binary files /dev/null and b/mods/Menu/inventory_plus/textures/signs.png differ diff --git a/mods/Menu/inventory_plus/textures/slabs.png b/mods/Menu/inventory_plus/textures/slabs.png new file mode 100644 index 0000000..b59ed11 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/slabs.png differ diff --git a/mods/Menu/inventory_plus/textures/slabtop.png b/mods/Menu/inventory_plus/textures/slabtop.png new file mode 100644 index 0000000..8be7022 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/slabtop.png differ diff --git a/mods/Menu/inventory_plus/textures/smalltrees.png b/mods/Menu/inventory_plus/textures/smalltrees.png new file mode 100644 index 0000000..31de8d7 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/smalltrees.png differ diff --git a/mods/Menu/inventory_plus/textures/sofas.png b/mods/Menu/inventory_plus/textures/sofas.png new file mode 100644 index 0000000..2442b77 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/sofas.png differ diff --git a/mods/Menu/inventory_plus/textures/sphere.png b/mods/Menu/inventory_plus/textures/sphere.png new file mode 100644 index 0000000..d1bdc5d Binary files /dev/null and b/mods/Menu/inventory_plus/textures/sphere.png differ diff --git a/mods/Menu/inventory_plus/textures/stairs.png b/mods/Menu/inventory_plus/textures/stairs.png new file mode 100644 index 0000000..2442b77 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/stairs.png differ diff --git a/mods/Menu/inventory_plus/textures/surfboard.png b/mods/Menu/inventory_plus/textures/surfboard.png new file mode 100644 index 0000000..3143546 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/surfboard.png differ diff --git a/mods/Menu/inventory_plus/textures/table.png b/mods/Menu/inventory_plus/textures/table.png new file mode 100644 index 0000000..e8ffffc Binary files /dev/null and b/mods/Menu/inventory_plus/textures/table.png differ diff --git a/mods/Menu/inventory_plus/textures/tapestry.png b/mods/Menu/inventory_plus/textures/tapestry.png new file mode 100644 index 0000000..41008f5 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/tapestry.png differ diff --git a/mods/Menu/inventory_plus/textures/tapestryl.png b/mods/Menu/inventory_plus/textures/tapestryl.png new file mode 100644 index 0000000..c43eac7 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/tapestryl.png differ diff --git a/mods/Menu/inventory_plus/textures/tapestryvl.png b/mods/Menu/inventory_plus/textures/tapestryvl.png new file mode 100644 index 0000000..2c15324 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/tapestryvl.png differ diff --git a/mods/Menu/inventory_plus/textures/time.png b/mods/Menu/inventory_plus/textures/time.png new file mode 100644 index 0000000..00b59ee Binary files /dev/null and b/mods/Menu/inventory_plus/textures/time.png differ diff --git a/mods/Menu/inventory_plus/textures/torch.png b/mods/Menu/inventory_plus/textures/torch.png new file mode 100644 index 0000000..2074d68 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/torch.png differ diff --git a/mods/Menu/inventory_plus/textures/trampo.png b/mods/Menu/inventory_plus/textures/trampo.png new file mode 100644 index 0000000..70eb487 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/trampo.png differ diff --git a/mods/Menu/inventory_plus/textures/trapdoor.png b/mods/Menu/inventory_plus/textures/trapdoor.png new file mode 100644 index 0000000..b72e6d8 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/trapdoor.png differ diff --git a/mods/Menu/inventory_plus/textures/triangle.png b/mods/Menu/inventory_plus/textures/triangle.png new file mode 100644 index 0000000..1b0f1b6 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/triangle.png differ diff --git a/mods/Menu/inventory_plus/textures/waters.png b/mods/Menu/inventory_plus/textures/waters.png new file mode 100644 index 0000000..518c8ae Binary files /dev/null and b/mods/Menu/inventory_plus/textures/waters.png differ diff --git a/mods/Menu/inventory_plus/textures/windows.png b/mods/Menu/inventory_plus/textures/windows.png new file mode 100644 index 0000000..4987548 Binary files /dev/null and b/mods/Menu/inventory_plus/textures/windows.png differ diff --git a/mods/Menu/inventory_plus/tools.lua b/mods/Menu/inventory_plus/tools.lua new file mode 100644 index 0000000..a6c9d5c --- /dev/null +++ b/mods/Menu/inventory_plus/tools.lua @@ -0,0 +1,29 @@ +-- Start Tools + +-- Delete Stuff + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.none then --main page + + player:get_inventory():set_list("main", {}) + +end +end +) + +-- Rotate + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.rotate then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'screwdriver:screwdriver') + +end +end +) + +-- End Tools \ No newline at end of file diff --git a/mods/Menu/inventory_plus/trees.lua b/mods/Menu/inventory_plus/trees.lua new file mode 100644 index 0000000..a28a365 --- /dev/null +++ b/mods/Menu/inventory_plus/trees.lua @@ -0,0 +1,65 @@ + +-- Normal Trees + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.normaltrees then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'trees:normal_white') +player:get_inventory():add_item('main', 'trees:normal_black') +player:get_inventory():add_item('main', 'trees:normal_red') +player:get_inventory():add_item('main', 'trees:normal_orange') +player:get_inventory():add_item('main', 'trees:normal_yellow') +player:get_inventory():add_item('main', 'trees:normal_pink') +player:get_inventory():add_item('main', 'trees:normal_green') +player:get_inventory():add_item('main', 'trees:normal_blue') + +end +end +) + + +-- Small Trees + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.smalltrees then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'trees:small_white') +player:get_inventory():add_item('main', 'trees:small_black') +player:get_inventory():add_item('main', 'trees:small_red') +player:get_inventory():add_item('main', 'trees:small_orange') +player:get_inventory():add_item('main', 'trees:small_yellow') +player:get_inventory():add_item('main', 'trees:small_pink') +player:get_inventory():add_item('main', 'trees:small_green') +player:get_inventory():add_item('main', 'trees:small_blue') + +end +end +) + +-- Big Trees + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.bigtrees then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'trees:big_white') +player:get_inventory():add_item('main', 'trees:big_black') +player:get_inventory():add_item('main', 'trees:big_red') +player:get_inventory():add_item('main', 'trees:big_orange') +player:get_inventory():add_item('main', 'trees:big_yellow') +player:get_inventory():add_item('main', 'trees:big_pink') +player:get_inventory():add_item('main', 'trees:big_green') +player:get_inventory():add_item('main', 'trees:big_blue') + +end +end +) + diff --git a/mods/Menu/inventory_plus/vehicules.lua b/mods/Menu/inventory_plus/vehicules.lua new file mode 100644 index 0000000..33f6a2c --- /dev/null +++ b/mods/Menu/inventory_plus/vehicules.lua @@ -0,0 +1,167 @@ +-- Spaceship + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.spaceship then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'spaceship:spaceshipwhite') +player:get_inventory():add_item('main', 'spaceship:spaceshipblack') +player:get_inventory():add_item('main', 'spaceship:spaceshipred') +player:get_inventory():add_item('main', 'spaceship:spaceshiporange') +player:get_inventory():add_item('main', 'spaceship:spaceshipyellow') +player:get_inventory():add_item('main', 'spaceship:spaceshippink') +player:get_inventory():add_item('main', 'spaceship:spaceshipgreen') +player:get_inventory():add_item('main', 'spaceship:spaceshipblue') + +end +end +) + +-- Rails (Carts) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.rails then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'carts:railwhite') +player:get_inventory():add_item('main', 'carts:railblack') +player:get_inventory():add_item('main', 'carts:railred') +player:get_inventory():add_item('main', 'carts:railorange ') +player:get_inventory():add_item('main', 'carts:railyellow') +player:get_inventory():add_item('main', 'carts:railpink') +player:get_inventory():add_item('main', 'carts:railgreen') +player:get_inventory():add_item('main', 'carts:railblue') + +end +end +) + +-- Carts + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.carts then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'carts:cartwhite') +player:get_inventory():add_item('main', 'carts:cartblack') +player:get_inventory():add_item('main', 'carts:cartred') +player:get_inventory():add_item('main', 'carts:cartorange ') +player:get_inventory():add_item('main', 'carts:cartyellow') +player:get_inventory():add_item('main', 'carts:cartpink') +player:get_inventory():add_item('main', 'carts:cartgreen') +player:get_inventory():add_item('main', 'carts:cartblue') + +end +end +) + +-- HotairBalloon + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.hotairballoon then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'hotairballoon:hotairwhite') +player:get_inventory():add_item('main', 'hotairballoon:hotairblack') +player:get_inventory():add_item('main', 'hotairballoon:hotairred') +player:get_inventory():add_item('main', 'hotairballoon:hotairorange ') +player:get_inventory():add_item('main', 'hotairballoon:hotairyellow') +player:get_inventory():add_item('main', 'hotairballoon:hotairpink') +player:get_inventory():add_item('main', 'hotairballoon:hotairgreen') +player:get_inventory():add_item('main', 'hotairballoon:hotairblue') + +end +end +) + +-- Hovercraft + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.hovercraft then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'hovercraft:hover_white') +player:get_inventory():add_item('main', 'hovercraft:hover_black') +player:get_inventory():add_item('main', 'hovercraft:hover_red') +player:get_inventory():add_item('main', 'hovercraft:hover_orange') +player:get_inventory():add_item('main', 'hovercraft:hover_yellow') +player:get_inventory():add_item('main', 'hovercraft:hover_pink') +player:get_inventory():add_item('main', 'hovercraft:hover_green') +player:get_inventory():add_item('main', 'hovercraft:hover_blue') + +end +end +) + +-- Airboat + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.airboat then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'airboat:airboatwhite') +player:get_inventory():add_item('main', 'airboat:airboatblack') +player:get_inventory():add_item('main', 'airboat:airboatred') +player:get_inventory():add_item('main', 'airboat:airboatorange') +player:get_inventory():add_item('main', 'airboat:airboatyellow') +player:get_inventory():add_item('main', 'airboat:airboatpink') +player:get_inventory():add_item('main', 'airboat:airboatgreen') +player:get_inventory():add_item('main', 'airboat:airboatblue') + +end +end +) + +-- Cars + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.cars then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'driftcar:driftcarwhite') +player:get_inventory():add_item('main', 'driftcar:driftcarblack') +player:get_inventory():add_item('main', 'driftcar:driftcarred') +player:get_inventory():add_item('main', 'driftcar:driftcarorange') +player:get_inventory():add_item('main', 'driftcar:driftcaryellow') +player:get_inventory():add_item('main', 'driftcar:driftcarpink') +player:get_inventory():add_item('main', 'driftcar:driftcargreen') +player:get_inventory():add_item('main', 'driftcar:driftcarblue') + +end +end +) + +-- SurfBoard + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.surfboard then --main page + + player:get_inventory():set_list("main", {}) + +player:get_inventory():add_item('main', 'surfboard:boardwhite') +player:get_inventory():add_item('main', 'surfboard:boardblack') +player:get_inventory():add_item('main', 'surfboard:boardred') +player:get_inventory():add_item('main', 'surfboard:boardorange') +player:get_inventory():add_item('main', 'surfboard:boardyellow') +player:get_inventory():add_item('main', 'surfboard:boardpink') +player:get_inventory():add_item('main', 'surfboard:boardgreen') +player:get_inventory():add_item('main', 'surfboard:boardblue') + +end +end +) diff --git a/mods/Menu/modpack.txt b/mods/Menu/modpack.txt new file mode 100644 index 0000000..e69de29 diff --git a/mods/Mobs/mobs/api.lua b/mods/Mobs/mobs/api.lua new file mode 100644 index 0000000..6a2bdf1 --- /dev/null +++ b/mods/Mobs/mobs/api.lua @@ -0,0 +1,3945 @@ + +-- Mobs Api + +mobs = {} +mobs.mod = "redo" +mobs.version = "20180701" + + +-- Intllib +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 + + +-- 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 +local sin = math.sin +local cos = math.cos +local abs = math.abs +local min = math.min +local max = math.max +local atann = math.atan +local random = math.random +local floor = math.floor +local atan = function(x) + if not x or x ~= x then + --error("atan bassed NaN") + return 0 + else + return atann(x) + end +end + + +-- Load settings +local damage_enabled = minetest.settings:get_bool("enable_damage") +local mobs_spawn = minetest.settings:get_bool("mobs_spawn") ~= false +local peaceful_only = minetest.settings:get_bool("only_peaceful_mobs") +local disable_blood = minetest.settings:get_bool("mobs_disable_blood") +local mobs_drop_items = minetest.settings:get_bool("mobs_drop_items") ~= false +local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false +local creative = minetest.settings:get_bool("creative_mode") +local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false +local remove_far = minetest.settings:get_bool("remove_far_mobs") ~= false +local difficulty = tonumber(minetest.settings:get("mob_difficulty")) or 1.0 +local show_health = minetest.settings:get_bool("mob_show_health") ~= false +local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 99) +local mob_chance_multiplier = tonumber(minetest.settings:get("mob_chance_multiplier") or 1) + +-- 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.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 +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) + + if sound then + minetest.sound_play(sound, { + object = self.object, + gain = 1.0, + max_hear_distance = self.sounds.distance + }) + end +end + + +-- attack player/mob +local do_attack = function(self, player) + + if self.state == "attack" then + return + end + + self.attack = player + self.state = "attack" + + if random(0, 100) < 90 then + mob_sound(self, self.sounds.war_cry) + end +end + + +-- move mob in facing direction +local set_velocity = function(self, v) + + -- do not move if mob 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:set_velocity({ + x = sin(yaw) * -v, + y = self.object:get_velocity().y, + z = cos(yaw) * v + }) +end + + +-- calculate mob velocity +local get_velocity = function(self) + + 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, delay) + + if not yaw or yaw ~= yaw then + yaw = 0 + end + + delay = delay or 0 + + 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(self, yaw, delay) + set_yaw(self, yaw, delay) +end + + +-- set defined animation +local set_animation = function(self, anim) + + if not self.animation + or not anim then return end + + self.animation.current = self.animation.current or "" + + if anim == self.animation.current + or not self.animation[anim .. "_start"] + or not self.animation[anim .. "_end"] then + return + end + + self.animation.current = 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, + 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) +end + + +-- check line of sight (BrunoMine) +local line_of_sight = function(self, pos1, pos2, stepsize) + + stepsize = stepsize or 1 + + 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 + + -- Target Distance (td) to travel + local td = get_distance(pos1, pos2) + + -- Actual Distance (ad) traveled + local ad = 0 + + -- 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 + + -- Check if you can still move forward + if td < ad + stepsize then + return true -- Reached the target + end + + -- Moves the analyzed pos + local d = get_distance(pos1, pos2) + + npos1.x = ((pos2.x - pos1.x) / d * stepsize) + pos1.x + npos1.y = ((pos2.y - pos1.y) / d * stepsize) + pos1.y + npos1.z = ((pos2.z - pos1.z) / d * stepsize) + pos1.z + + -- NaN checks + if d == 0 + or npos1.x ~= npos1.x + or npos1.y ~= npos1.y + or npos1.z ~= npos1.z then + return false + end + + ad = ad + stepsize + + -- 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 + + +-- are we flying in what we are suppose to? (taikedz) +local flight_check = function(self, pos_w) + + local def = minetest.registered_nodes[self.standing_in] + + if not def then return false end -- nil check + + if type(self.fly_in) == "string" + and self.standing_in == self.fly_in then + + return true + + elseif type(self.fly_in) == "table" then + + for _,fly_in in pairs(self.fly_in) do + + if self.standing_in == fly_in then + + return true + end + end + end + + -- stops mobs getting stuck inside stairs and plantlike nodes + if def.drawtype ~= "airlike" + and def.drawtype ~= "liquid" + and def.drawtype ~= "flowingliquid" then + return true + end + + return false +end + + +-- 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, + time = 0.25, + minpos = pos, + maxpos = pos, + minvel = {x = -radius, y = -radius, z = -radius}, + maxvel = {x = radius, y = radius, z = radius}, + minacc = {x = 0, y = gravity, z = 0}, + maxacc = {x = 0, y = gravity, z = 0}, + minexptime = 0.1, + maxexptime = 1, + minsize = min_size, + maxsize = max_size, + texture = texture, + glow = glow, + }) +end + + +-- update nametag colour +local update_tag = function(self) + + local col = "#00FF00" + local qua = self.hp_max / 4 + + if self.health <= floor(qua * 3) then + col = "#FFFF00" + end + + if self.health <= floor(qua * 2) then + col = "#FF6600" + end + + if self.health <= floor(qua) then + col = "#FF0000" + end + + self.object:set_properties({ + nametag = self.nametag, + nametag_color = col + }) + +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: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) + item = self.drops[n].name + + -- cook items when true + if cooked then + + local output = minetest.get_craft_result({ + method = "cooking", width = 1, items = {item}}) + + if output and output.item and not output.item:is_empty() then + item = output.item:get_name() + end + end + + -- add item if it exists + obj = minetest.add_item(pos, ItemStack(item .. " " .. num)) + + if obj and obj:get_luaentity() then + + 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 + end + end + + self.drops = {} +end + + +-- check if mob is dead or only hurt +local check_for_death = function(self, cause, cmi_cause) + + -- has health actually changed? + if self.health == self.old_health and self.health > 0 then + return + end + + self.old_health = self.health + + -- still got some health? play hurt sound + if self.health > 0 then + + mob_sound(self, self.sounds.damage) + + -- make sure health isn't higher than max + if self.health > self.hp_max then + self.health = self.hp_max + end + + -- backup nametag so we can show health stats + if not self.nametag2 then + self.nametag2 = self.nametag or "" + end + + if show_health + and (cmi_cause and cmi_cause.type == "punch") then + + self.htimer = 2 + self.nametag = "♥ " .. self.health .. " / " .. self.hp_max + + update_tag(self) + 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 + + mob_sound(self, self.sounds.death) + + 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 + end + + -- default death function and die animation (if defined) + if self.animation + and self.animation.die_start + and self.animation.die_end then + + local frames = self.animation.die_end - self.animation.die_start + local speed = self.animation.die_speed or 15 + local length = max(frames / speed, 0) + + self.attack = nil + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.passive = true + self.state = "die" + set_velocity(self, 0) + set_animation(self, "die") + + minetest.after(length, function(self) + + if use_cmi and self.object:get_luaentity() 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 + + effect(pos, 20, "tnt_smoke.png") + + return true +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) + + if self.fear_height == 0 then -- 0 for no falling protection! + return false + end + + local yaw = self.object:get_yaw() + local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) + local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) + local pos = self.object:get_pos() + local ypos = pos.y + self.collisionbox[2] -- just above floor + + if minetest.line_of_sight( + {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, + {x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z} + , 1) then + + return true + end + + return false +end + + +-- get node but use fallback for nil or unknown +local node_ok = function(pos, fallback) + + fallback = fallback or mobs.fallback_node + + local node = minetest.get_node_or_nil(pos) + + if node and minetest.registered_nodes[node.name] then + return node + end + + return minetest.registered_nodes[fallback] +end + + +-- environmental damage (water, lava, fire, light etc.) +local do_env_damage = function(self) + + -- feed/tame text timer (so mob 'full' messages dont spam chat) + if self.htimer > 0 then + self.htimer = self.htimer - 1 + end + + -- reset nametag after showing health stats + if self.htimer < 1 and self.nametag2 then + + self.nametag = self.nametag2 + self.nametag2 = nil + + update_tag(self) + 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 + 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 + + self.health = self.health - self.light_damage + + effect(pos, 5, "tnt_smoke.png") + + 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 + 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:set_velocity({x = 0, y = 0, z = 0}) + end + + local nodef = minetest.registered_nodes[self.standing_in] + + pos.y = pos.y + 1 -- for particle effect position + + -- water + if self.water_damage + and nodef.groups.water then + + if self.water_damage ~= 0 then + + self.health = self.health - self.water_damage + + effect(pos, 5, "bubble.png", nil, nil, 1, nil) + + if check_for_death(self, "water", {type = "environment", + pos = pos, node = self.standing_in}) then return end + end + + -- 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 + + +-- jump if facing a solid node (not fences or gates) +local do_jump = function(self) + + if not self.jump + or self.jump_height == 0 + or self.fly + or self.child + or self.order == "stand" then + return false + end + + self.facing_fence = false + + -- something stopping us while moving? + if self.state ~= "stand" + and get_velocity(self) > 0.5 + and self.object:get_velocity().y ~= 0 then + return false + end + + 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 + + local nod = node_ok(pos) + +--print ("standing on:", nod.name, pos.y) + + if minetest.registered_nodes[nod.name].walkable == false then + return false + end + + -- where is front + local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) + local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) + + -- what is in front of mob? + local nod = node_ok({ + x = pos.x + dir_x, + y = pos.y + 0.5, + z = pos.z + dir_z + }) + + -- thin blocks that do not need to be jumped + if nod.name == node_snow then + return false + end + +--print ("in front:", nod.name, pos.y + 0.5) + + if self.walk_chance == 0 + or minetest.registered_items[nod.name].walkable then + + if not nod.name:find("fence") + and not nod.name:find("gate") then + + local v = self.object:get_velocity() + + v.y = self.jump_height + + set_animation(self, "jump") -- only when defined + + self.object:set_velocity(v) + + -- 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 get_velocity(self) > 0 then + mob_sound(self, self.sounds.jump) + end + else + self.facing_fence = true + end + + return true + end + + return false +end + + +-- blast damage to entities nearby (modified from TNT mod) +local entity_physics = function(pos, radius) + + radius = radius * 2 + + local objs = minetest.get_objects_inside_radius(pos, radius) + local obj_pos, dist + + for n = 1, #objs do + + 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) + local ent = objs[n]:get_luaentity() + + -- punches work on entities AND players + objs[n]:punch(objs[n], 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = damage}, + }, pos) + end +end + + +-- should mob follow what I'm holding ? +local follow_holding = function(self, clicker) + + if mobs.invis[clicker:get_player_name()] then + return false + end + + local item = clicker:get_wielded_item() + local t = type(self.follow) + + -- single item + if t == "string" + and item:get_name() == self.follow then + return true + + -- multiple items + elseif t == "table" then + + for no = 1, #self.follow do + + if self.follow[no] == item:get_name() then + return true + end + end + end + + return false +end + + +-- find two animals of same type and breed if nearby and horny +local breed = function(self) + + -- child takes 240 seconds before growing into adult + if self.child == true then + + self.hornytimer = self.hornytimer + 1 + + if self.hornytimer > 240 then + + self.child = false + self.hornytimer = 0 + + self.object:set_properties({ + textures = self.base_texture, + mesh = self.base_mesh, + visual_size = self.base_size, + collisionbox = self.base_colbox, + selectionbox = self.base_selbox, + }) + + -- 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:set_velocity({ + x = 0, + y = self.jump_height, + z = 0 + }) + end + end + + return + end + + -- horny animal can mate for 40 seconds, + -- afterwards horny animal cannot mate again for 200 seconds + if self.horny == true + and self.hornytimer < 240 then + + self.hornytimer = self.hornytimer + 1 + + if self.hornytimer >= 240 then + self.hornytimer = 0 + self.horny = false + end + end + + -- 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:get_pos() + + effect({x = pos.x, y = pos.y + 1, z = pos.z}, 8, "heart.png", 3, 4, 1, 0.1) + + local objs = minetest.get_objects_inside_radius(pos, 3) + local num = 0 + local ent = nil + + for n = 1, #objs do + + ent = objs[n]:get_luaentity() + + -- check for same animal with different colour + local canmate = false + + if ent then + + if ent.name == self.name then + canmate = true + else + local entname = string.split(ent.name,":") + local selfname = string.split(self.name,":") + + if entname[1] == selfname[1] then + entname = string.split(entname[2],"_") + selfname = string.split(selfname[2],"_") + + if entname[1] == selfname[1] then + canmate = true + end + end + end + end + + if ent + and canmate == true + and ent.horny == true + and ent.hornytimer <= 40 then + num = num + 1 + end + + -- found your mate? then have a baby + if num > 1 then + + self.hornytimer = 41 + ent.hornytimer = 41 + + -- spawn baby + 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 + 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 = { + x = self.base_size.x * .5, + y = self.base_size.y * .5, + }, + collisionbox = { + self.base_colbox[1] * .5, + self.base_colbox[2] * .5, + self.base_colbox[3] * .5, + self.base_colbox[4] * .5, + self.base_colbox[5] * .5, + self.base_colbox[6] * .5, + }, + 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 + end, self, ent) + + num = 0 + + break + end + end + end +end + + +-- find and replace what mob is looking for (grass, wheat etc.) +local replace = function(self, pos) + + if not mobs_griefing + or not self.replace_rate + or not self.replace_what + or self.child == true + or self.object:get_velocity().y ~= 0 + or random(1, self.replace_rate) > 1 then + return + end + + local what, with, y_offset + + if type(self.replace_what[1]) == "table" then + + local num = random(#self.replace_what) + + what = self.replace_what[num][1] or "" + with = self.replace_what[num][2] or "" + y_offset = self.replace_what[num][3] or 0 + else + what = self.replace_what + with = self.replace_with or "" + y_offset = self.replace_offset or 0 + end + + pos.y = pos.y + y_offset + + if #minetest.find_nodes_in_area(pos, pos, what) > 0 then + +-- print ("replace node = ".. minetest.get_node(pos).name, pos.y) + + local oldnode = {name = what} + local newnode = {name = with} + local on_replace_return + + if self.on_replace then + on_replace_return = self.on_replace(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 + + +-- check if daytime and also if mob is docile during daylight hours +local day_docile = function(self) + + if self.docile_by_day == false then + + return false + + elseif self.docile_by_day == true + and self.time_of_day > 0.2 + and self.time_of_day < 0.8 then + + return true + end +end + + +local los_switcher = false +local height_switcher = false + +-- path finding and smart mob routine by rnd, line_of_sight and other edits by Elkien3 +local smart_mobs = function(self, 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) < .5 then + self.path.stuck_timer = self.path.stuck_timer + dtime + else + self.path.stuck_timer = 0 + end + + self.path.lastpos = {x = s.x, y = s.y, z = s.z} + + 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 math.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] + + -- round position to center of node to avoid stuck in walls + -- also adjust height for player models! + s.x = floor(s.x + 0.5) +-- s.y = floor(s.y + 0.5) - sheight + s.z = floor(s.z + 0.5) + + local ssight, sground = minetest.line_of_sight(s, { + x = s.x, y = s.y - 4, z = s.z}, 1) + + -- determine node above ground + if not ssight then + s.y = sground.y + 1 + end + + 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 = 6 + if self.fear_height ~= 0 then dropheight = self.fear_height end + + self.path.way = minetest.find_path(s, p1, 16, self.stepheight, dropheight, "Dijkstra") +--[[ + -- 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) + + -- no path found, try something else + if not self.path.way then + + self.path.following = false + + -- lets make way by digging/building if not accessible + if self.pathfinding == 2 and mobs_griefing then + + -- is player higher than mob? + if s.y < p1.y then + + -- build upwards + if not minetest.is_protected(s, "") then + + local ndef1 = minetest.registered_nodes[self.standing_in] + + if ndef1 and (ndef1.buildable_to or ndef1.groups.liquid) then + + minetest.set_node(s, {name = mobs.fallback_node}) + end + end + + local sheight = math.ceil(self.collisionbox[5]) + 1 + + -- assume mob is 2 blocks high so it digs above its head + s.y = s.y + sheight + + -- remove one block above to make room to jump + if not minetest.is_protected(s, "") then + + local node1 = node_ok(s, "air").name + 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 + + minetest.set_node(s, {name = "air"}) + minetest.add_item(s, ItemStack(node1)) + + end + end + + s.y = s.y - sheight + self.object:set_pos({x = s.x, y = s.y + 2, z = s.z}) + + else -- dig 2 blocks to make door toward player direction + + local yaw1 = self.object:get_yaw() + pi / 2 + local p1 = { + x = s.x + cos(yaw1), + y = s.y, + z = s.z + sin(yaw1) + } + + if not minetest.is_protected(p1, "") then + + local node1 = node_ok(p1, "air").name + 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 + + minetest.add_item(p1, ItemStack(node1)) + minetest.set_node(p1, {name = "air"}) + end + + p1.y = p1.y + 1 + node1 = node_ok(p1, "air").name + 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 + + minetest.add_item(p1, ItemStack(node1)) + minetest.set_node(p1, {name = "air"}) + end + + end + end + end + + -- will try again in 2 second + self.path.stuck_timer = stuck_timeout - 2 + + -- frustration! cant find the damn path :( + mob_sound(self, self.sounds.random) + else + -- yay i found path + mob_sound(self, self.sounds.war_cry) + set_velocity(self, self.walk_velocity) + + -- follow path now that it has it + self.path.following = true + end + end +end + + +-- specific attacks +local specific_attack = function(list, what) + + -- no list so attack default (player, animals etc.) + if list == nil then + return true + end + + -- found entity on list to attack? + for no = 1, #list do + + if list[no] == what then + return true + end + end + + return false +end + + +-- general attack function for all mobs ========== +local general_attack = function(self) + + -- return if already attacking, passive or docile during day + if self.passive + or self.state == "attack" + or day_docile(self) then + return + end + + local s = self.object:get_pos() + 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 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 +--print(" -obj", n) + objs[n] = nil + end + end + + local p, sp, dist, min_player + local min_dist = self.view_range + 1 + + -- go through remaining entities and select closest + for _,player in pairs(objs) do + + p = player:get_pos() + sp = s + + dist = get_distance(p, s) + + -- aim higher to make looking up hills more realistic + p.y = p.y + 1 + sp.y = sp.y + 1 + + -- choose closest player to attack that isnt self + if dist ~= 0 + and dist < min_dist + and line_of_sight(self, sp, p, 2) == true then + min_dist = dist + min_player = player + end + end + + -- attack closest player or mob + if min_player then + do_attack(self, min_player) + end +end + + +-- specific runaway +local specific_runaway = function(list, what) + + -- no list so do not run + if list == nil then + return false + end + + -- found entity on list to attack? + for no = 1, #list do + + if list[no] == what then + return true + end + end + + return false +end + + +-- find someone to runaway from +local runaway_from = function(self) + + if not self.runaway_from then + return + end + + local s = self.object:get_pos() + 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) + + for n = 1, #objs do + + if objs[n]:is_player() then + + pname = objs[n]:get_player_name() + + if mobs.invis[pname] + or self.owner == pname then + + name = "" + else + player = objs[n] + name = "player" + end + else + obj = objs[n]:get_luaentity() + + if obj then + player = obj.object + 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 + + 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) + + -- choose closest player/mob to runaway from + if dist < min_dist + and line_of_sight(self, sp, p, 2) == true then + min_dist = dist + min_player = player + end + end + end + + 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, yaw, 4) + 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:get_pos() + local players = minetest.get_connected_players() + + for n = 1, #players do + + if get_distance(players[n]:get_pos(), s) < self.view_range + and not mobs.invis[ players[n]:get_player_name() ] then + + self.following = players[n] + + break + end + end + end + + if self.type == "npc" + and self.order == "follow" + and self.state ~= "attack" + and self.owner ~= "" then + + -- npc stop following player if not owner + if self.following + and self.owner + and self.owner ~= self.following:get_player_name() then + self.following = nil + end + else + -- stop following player if not holding specific item + if self.following + and self.following:is_player() + and follow_holding(self, self.following) == false then + self.following = nil + end + + end + + -- follow that thing + if self.following then + + local s = self.object:get_pos() + local p + + if self.following:is_player() then + + p = self.following:get_pos() + + elseif self.following.object then + + p = self.following.object:get_pos() + end + + if p then + + local dist = get_distance(p, s) + + -- dont follow if out of range + if dist > self.view_range then + self.following = nil + else + local vec = { + x = p.x - s.x, + z = p.z - s.z + } + + local yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if p.x > s.x then yaw = yaw + pi end + + yaw = set_yaw(self, 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) + + if self.walk_chance ~= 0 then + set_animation(self, "walk") + end + else + set_velocity(self, 0) + set_animation(self, "stand") + end + + return + end + end + end + + -- 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 + + self.state = "flop" + self.object:set_velocity({x = 0, y = -5, z = 0}) + + set_animation(self, "stand") + + return + elseif self.state == "flop" then + self.state = "stand" + end + end +end + + +-- dogshoot attack switch and counter function +local dogswitch = function(self, dtime) + + -- switch mode not activated + if not self.dogshoot_switch + or not dtime then + return 0 + end + + self.dogshoot_count = self.dogshoot_count + dtime + + if (self.dogshoot_switch == 1 + and self.dogshoot_count > self.dogshoot_count_max) + or (self.dogshoot_switch == 2 + and self.dogshoot_count > self.dogshoot_count2_max) then + + self.dogshoot_count = 0 + + if self.dogshoot_switch == 1 then + self.dogshoot_switch = 2 + else + self.dogshoot_switch = 1 + end + end + + return self.dogshoot_switch +end + + +-- execute current state (stand, walk, run, attacks) +local do_states = function(self, dtime) + + 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: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]:get_pos() + break + end + end + + -- look at any players nearby, otherwise turn randomly + if lp then + + local vec = { + x = lp.x - s.x, + z = lp.z - s.z + } + + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if lp.x > s.x then yaw = yaw + pi end + else + yaw = yaw + random(-0.5, 0.5) + end + + yaw = set_yaw(self, yaw, 8) + end + + set_velocity(self, 0) + set_animation(self, "stand") + + -- npc's ordered to stand stay standing + if self.type ~= "npc" + 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 + + 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:get_velocity() + local ud = random(-1, 2) / 9 + + self.object:set_velocity({x = v.x, y = ud, z = v.z}) + end--]] + end + end + + elseif self.state == "walk" then + + local s = self.object:get_pos() + local lp = nil + + -- is there something I need to avoid? + if self.water_damage > 0 + and self.lava_damage > 0 then + + lp = minetest.find_node_near(s, 1, {"group:water", "group:lava"}) + + elseif self.water_damage > 0 then + + lp = minetest.find_node_near(s, 1, {"group:water"}) + + elseif self.lava_damage > 0 then + + lp = minetest.find_node_near(s, 1, {"group:lava"}) + end + + if lp then + + -- if mob in water or lava then look for land + if (self.lava_damage + and minetest.registered_nodes[self.standing_in].groups.lava) + or (self.water_damage + and minetest.registered_nodes[self.standing_in].groups.water) then + + lp = minetest.find_node_near(s, 5, {"group:soil", "group:stone", + "group:sand", node_ice, node_snowblock}) + + -- did we find land? + if lp then + + local vec = { + x = lp.x - s.x, + z = lp.z - s.z + } + + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if lp.x > s.x then yaw = yaw + pi end + + -- look towards land and jump/move in that direction + yaw = set_yaw(self, yaw, 6) + do_jump(self) + set_velocity(self, self.walk_velocity) + else + yaw = yaw + random(-0.5, 0.5) + end + + else + + local vec = { + x = lp.x - s.x, + z = lp.z - s.z + } + + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if lp.x > s.x then yaw = yaw + pi end + end + + yaw = set_yaw(self, yaw, 8) + + -- otherwise randomly turn + elseif random(1, 100) <= 30 then + + yaw = yaw + random(-0.5, 0.5) + + yaw = set_yaw(self, yaw, 8) + end + + -- stand for great fall in front + local temp_is_cliff = is_at_cliff(self) + + if self.facing_fence == true + or temp_is_cliff + or random(1, 100) <= 30 then + + set_velocity(self, 0) + self.state = "stand" + set_animation(self, "stand") + else + set_velocity(self, self.walk_velocity) + + if flight_check(self) + and self.animation + and self.animation.fly_start + and self.animation.fly_end then + set_animation(self, "fly") + else + set_animation(self, "walk") + end + end + + -- runaway when punched + elseif self.state == "runaway" then + + self.runaway_timer = self.runaway_timer + 1 + + -- stop after 5 seconds or when at cliff + if self.runaway_timer > 5 + or is_at_cliff(self) then + self.runaway_timer = 0 + set_velocity(self, 0) + self.state = "stand" + set_animation(self, "stand") + else + set_velocity(self, self.run_velocity) + set_animation(self, "walk") + end + + -- attack routines (explode, dogfight, shoot, dogshoot) + elseif self.state == "attack" then + + -- calculate distance from mob and enemy + local s = self.object:get_pos() + local p = self.attack:get_pos() or s + local dist = get_distance(p, s) + + -- stop attacking if player invisible or out of range + if dist > self.view_range + or not self.attack + or not self.attack:get_pos() + or self.attack:get_hp() <= 0 + or (self.attack:is_player() and mobs.invis[ self.attack:get_player_name() ]) then + +-- print(" ** stop attacking **", dist, self.view_range) + self.state = "stand" + set_velocity(self, 0) + set_animation(self, "stand") + self.attack = nil + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.path.way = nil + + return + end + + if self.attack_type == "explode" then + + local vec = { + x = p.x - s.x, + z = p.z - s.z + } + + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if p.x > s.x then yaw = yaw + pi end + + yaw = set_yaw(self, 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 line_of_sight(self, s, p, 2) then + + self.v_start = true + self.timer = 0 + self.blinktimer = 0 + mob_sound(self, 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 line_of_sight(self, 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 unless the timer is active + if self.v_start and (self.stop_to_explode or dist < 1.5) 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_animation(self, "walk") + end + + if self.v_start then + + self.timer = self.timer + dtime + self.blinktimer = (self.blinktimer or 0) + dtime + + if self.blinktimer > 0.2 then + + self.blinktimer = 0 + + if self.blinkstatus then + self.object:settexturemod("") + else + self.object:settexturemod("^[brighten") + end + + self.blinkstatus = not self.blinkstatus + end + +-- print ("=== explosion timer", self.timer) + + if self.timer > self.explosion_timer then + + local pos = self.object:get_pos() + + -- 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 + + node_break_radius = 1 + end + + self.object:remove() + + if minetest.get_modpath("tnt") and tnt and tnt.boom + and not minetest.is_protected(pos, "") then + + tnt.boom(pos, { + radius = node_break_radius, + damage_radius = entity_damage_radius, + sound = self.sounds.explode, + }) + else + + minetest.sound_play(self.sounds.explode, { + pos = pos, + gain = 1.0, + max_hear_distance = self.sounds.distance or 32 + }) + + entity_physics(pos, entity_damage_radius) + effect(pos, 32, "tnt_smoke.png", nil, nil, node_break_radius, 1, 0) + end + + return + end + 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 + + if self.fly + and dist > self.reach then + + local p1 = s + local me_y = floor(p1.y) + local p2 = p + local p_y = floor(p2.y + 1) + local v = self.object:get_velocity() + + if flight_check(self, s) then + + if me_y < p_y then + + self.object:set_velocity({ + x = v.x, + y = 1 * self.walk_velocity, + z = v.z + }) + + elseif me_y > p_y then + + self.object:set_velocity({ + x = v.x, + y = -1 * self.walk_velocity, + z = v.z + }) + end + else + if me_y < p_y then + + self.object:set_velocity({ + x = v.x, + y = 0.01, + z = v.z + }) + + elseif me_y > p_y then + + self.object:set_velocity({ + x = v.x, + y = -0.01, + z = v.z + }) + end + end + + end + + -- rnd: new movement direction + if self.path.following + and self.path.way + and self.attack_type ~= "dogshoot" then + + -- no paths longer than 50 + if #self.path.way > 50 + or dist < self.reach then + self.path.following = false + return + end + + local p1 = self.path.way[1] + + if not p1 then + self.path.following = false + return + end + + if abs(p1.x-s.x) + abs(p1.z - s.z) < 0.6 then + -- reached waypoint, remove it from queue + table.remove(self.path.way, 1) + end + + -- set new temporary target + p = {x = p1.x, y = p1.y, z = p1.z} + end + + local vec = { + x = p.x - s.x, + z = p.z - s.z + } + + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if p.x > s.x then yaw = yaw + pi end + + yaw = set_yaw(self, yaw) + + -- move towards enemy if beyond mob reach + if dist > self.reach then + + -- path finding by rnd + if self.pathfinding -- only if mob has pathfinding enabled + and enable_pathfinding then + + smart_mobs(self, s, p, dist, dtime) + end + + if is_at_cliff(self) then + + set_velocity(self, 0) + set_animation(self, "stand") + else + + if self.path.stuck then + set_velocity(self, self.walk_velocity) + else + set_velocity(self, self.run_velocity) + end + + 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 + + self.path.stuck = false + self.path.stuck_timer = 0 + self.path.following = false -- not stuck anymore + + set_velocity(self, 0) + + if not self.custom_attack then + + if self.timer > 1 then + + self.timer = 0 + + if self.double_melee_attack + and random(1, 2) == 1 then + set_animation(self, "punch2") + else + set_animation(self, "punch") + end + + local p2 = p + local s2 = s + + p2.y = p2.y + .5 + s2.y = s2.y + .5 + + if line_of_sight(self, p2, s2) == true then + + -- play attack sound + mob_sound(self, self.sounds.attack) + + -- punch player (or what player is attached to) + local attached = self.attack:get_attach() + if attached then + self.attack = attached + end + self.attack:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = self.damage} + }, nil) + end + end + else -- call custom attack every second + if self.custom_attack + and self.timer > 1 then + + self.timer = 0 + + self.custom_attack(self, 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 + + p.y = p.y - .5 + s.y = s.y + .5 + + local dist = get_distance(p, s) + local vec = { + x = p.x - s.x, + y = p.y - s.y, + z = p.z - s.z + } + + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if p.x > s.x then yaw = yaw + pi end + + yaw = set_yaw(self, yaw) + + set_velocity(self, 0) + + if self.shoot_interval + and self.timer > self.shoot_interval + and random(1, 100) <= 60 then + + self.timer = 0 + set_animation(self, "shoot") + + -- play shoot attack sound + mob_sound(self, self.sounds.shoot_attack) + + local p = self.object:get_pos() + + p.y = p.y + (self.collisionbox[2] + self.collisionbox[5]) / 2 + + if minetest.registered_entities[self.arrow] 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 + + -- offset makes shoot aim accurate + vec.y = vec.y + self.shoot_offset + vec.x = vec.x * (v / amount) + vec.y = vec.y * (v / amount) + vec.z = vec.z * (v / amount) + + obj:set_velocity(vec) + end + end + end + end +end + + +-- falling and fall damage +local falling = function(self, pos) + + if self.fly then + return + end + + -- floating in water (or falling) + local v = self.object:get_velocity() + + if v.y > 0 then + + -- apply gravity when moving up + self.object:set_acceleration({ + x = 0, + y = -10, + z = 0 + }) + + elseif v.y <= 0 and v.y > self.fall_speed then + + -- fall downwards at set speed + self.object:set_acceleration({ + x = 0, + y = self.fall_speed, + z = 0 + }) + else + -- stop accelerating once max fall speed hit + self.object:set_acceleration({x = 0, y = 0, z = 0}) + end + + -- in water then float up + if minetest.registered_nodes[self.standing_in].groups.water then + + if self.floats == 1 then + + self.object:set_acceleration({ + x = 0, + y = -self.fall_speed / (max(1, v.y) ^ 8), -- 8 was 2 + z = 0 + }) + end + else + + -- fall damage onto solid ground + if self.fall_damage == 1 + and self.object:get_velocity().y == 0 then + + local d = (self.old_y or 0) - self.object:get_pos().y + + if d > 5 then + + self.health = self.health - floor(d - 5) + + effect(pos, 5, "tnt_smoke.png", 1, 2, 2, nil) + + if check_for_death(self, "fall", {type = "fall"}) then + return + end + end + + self.old_y = self.object:get_pos().y + end + end +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_capabilities, 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 + 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:get_pos(), hitter:get_player_name()) then + minetest.chat_send_player(hitter:get_player_name(), S("Mob has been protected!")) + return + end + + + -- weapon wear + local weapon = hitter:get_wielded_item() + local punch_interval = 1.4 + + -- calculate mob damage + local damage = 0 + local armor = self.object:get_armor_groups() or {} + local tmp + + -- quick error check incase it ends up 0 (serialize.h check test) + if tflp == 0 then + tflp = 0.2 + end + + if use_cmi then + damage = cmi.calculate_damage(self.object, hitter, tflp, tool_capabilities, dir) + else + + for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do + + 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 + end + + -- check for tool immunity or special damage + for n = 1, #self.immune_to do + + if self.immune_to[n][1] == weapon:get_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 + + -- healing + if damage <= -1 then + self.health = self.health - floor(damage) + return + end + +-- 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 + end + + if weapon:get_definition() + and weapon:get_definition().tool_capabilities then + + -- 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:get_definition() + and weapon:get_definition().original_description then + weapon:add_wear(toolranks.new_afteruse(weapon, hitter, nil, {wear = wear})) + end + else + weapon:add_wear(wear) + end + + hitter:set_wielded_item(weapon) + end + + -- 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 + + local s = random(0, #weapon:get_definition().sounds) + + minetest.sound_play(weapon:get_definition().sounds[s], { + object = self.object, --hitter, + max_hear_distance = 8 + }) + else + minetest.sound_play("default_punch", { + object = self.object, --hitter, + max_hear_distance = 5 + }) + end + + -- blood_particles + if self.blood_amount > 0 + and not disable_blood then + + local pos = self.object:get_pos() + + pos.y = pos.y + (-self.collisionbox[2] + self.collisionbox[5]) * .5 + + -- 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 + self.health = self.health - floor(damage) + + -- 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 + end + + --[[ add healthy afterglow when hit (can cause hit lag with larger textures) + minetest.after(0.1, function() + + if not self.object:get_luaentity() then return end + + self.object:settexturemod("^[colorize:#c9900070") + + core.after(0.3, function() + self.object:settexturemod("") + end) + end) ]] + + -- knock back effect (only on full punch) + if self.knock_back + and tflp >= punch_interval then + + local v = self.object:get_velocity() + 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:set_velocity({ + x = dir.x * kb, + y = up, + z = dir.z * kb + }) + + self.pause_timer = 0.25 + end + end -- END if damage + + -- if skittish then run away + if self.runaway == true then + + local lp = hitter:get_pos() + local s = self.object:get_pos() + local vec = { + x = lp.x - s.x, + y = lp.y - s.y, + z = lp.z - s.z + } + + local yaw = (atan(vec.z / vec.x) + 3 * pi / 2) - self.rotate + + if lp.x > s.x then + yaw = yaw + pi + end + + yaw = set_yaw(self, yaw, 6) + self.state = "runaway" + self.runaway_timer = 0 + self.following = nil + end + + local name = hitter:get_player_name() or "" + + -- attack puncher and call other mobs for help + 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) + + -- alert others to the attack + local objs = minetest.get_objects_inside_radius(hitter:get_pos(), self.view_range) + local obj = nil + + for n = 1, #objs do + + obj = objs[n]:get_luaentity() + + 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) + end + + -- have owned mobs attack player threat + if obj.owner == name and obj.owner_loyal then + do_attack(obj, self.object) + end + end + end + end +end + + +-- get entity staticdata +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 + self.following = nil + self.state = "stand" + + -- used to rotate older mobs + if self.drawtype + and self.drawtype == "side" then + 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 + + local t = type(stat) + + if t ~= "function" + and t ~= "nil" + and t ~= "userdata" + and _ ~= "_cmi_components" then + tmp[_] = self[_] + end + end + + --print('===== '..self.name..'\n'.. dump(tmp)..'\n=====\n') + return minetest.serialize(tmp) +end + + +-- activate mob and reload settings +local mob_activate = function(self, staticdata, def, dtime) + + -- remove monsters in peaceful mode + if self.type == "monster" + and peaceful_only then + + self.object:remove() + + return + end + + -- load entity variables + local tmp = minetest.deserialize(staticdata) + + if tmp then + for _,stat in pairs(tmp) do + self[_] = stat + end + end + + -- select random texture, set model and size + if not self.base_texture then + + -- compatiblity with old simple mobs textures + if type(def.textures[1]) == "string" then + def.textures = {def.textures} + end + + self.base_texture = def.textures[random(1, #def.textures)] + 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 + local textures = self.base_texture + 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 + and def.gotten_texture then + textures = def.gotten_texture + end + + -- specific mesh if gotten + if self.gotten == true + and def.gotten_mesh then + mesh = def.gotten_mesh + end + + -- set child objects to half size + if self.child == true then + + vis_size = { + x = self.base_size.x * .5, + y = self.base_size.y * .5, + } + + if def.child_texture then + textures = def.child_texture[1] + end + + colbox = { + self.base_colbox[1] * .5, + self.base_colbox[2] * .5, + self.base_colbox[3] * .5, + self.base_colbox[4] * .5, + self.base_colbox[5] * .5, + self.base_colbox[6] * .5 + } + 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 + + -- 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 + + -- mob defaults + self.object:set_armor_groups({immortal = 1, fleshy = self.armor}) + self.old_y = self.object:get_pos().y + self.old_health = self.health + self.sounds.distance = self.sounds.distance or 10 + self.textures = textures + self.mesh = mesh + self.collisionbox = colbox + self.selectionbox = selbox + self.visual_size = vis_size + self.standing_in = "air" + + -- check existing nametag + if not self.nametag then + self.nametag = def.nametag + end + + -- set anything changed above + self.object:set_properties(self) + set_yaw(self, (random(0, 360) - 180) / 180 * pi, 6) + 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 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) + 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 + + -- get node at foot level every quarter second + self.node_timer = (self.node_timer or 0) + dtime + + if self.node_timer > 0.25 then + + self.node_timer = 0 + + local y_level = self.collisionbox[2] + + if self.child then + y_level = self.collisionbox[2] * 0.5 + end + + -- 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) + end + + -- check if falling, flying, floating + falling(self, 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 + + 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 + + -- end rotation + + -- knockback timer + if self.pause_timer > 0 then + + self.pause_timer = self.pause_timer - dtime + + return + end + + -- run custom function (defined in mob lua file) + if self.do_custom then + + -- when false skip going any further + if self.do_custom(self, dtime) == false then + return + end + end + + -- attack timer + self.timer = self.timer + dtime + + if self.state ~= "attack" then + + if self.timer < 1 then + return + end + + self.timer = 0 + end + + -- never go over 100 + if self.timer > 100 then + self.timer = 1 + end + + -- mob plays random sound at times + if random(1, 100) == 1 then + mob_sound(self, self.sounds.random) + end + + -- environmental damage timer (every 1 second) + self.env_damage_timer = self.env_damage_timer + dtime + + if (self.state == "attack" and self.env_damage_timer > 1) + or self.state ~= "attack" then + + self.env_damage_timer = 0 + + -- check for environmental damage (water, fire, lava etc.) + do_env_damage(self) + + -- node replace check (cow eats grass etc.) + replace(self, pos) + end + + general_attack(self) + + breed(self) + + follow_flop(self) + + do_states(self, dtime) + + do_jump(self) + + runaway_from(self) + +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 + + +mobs.spawning_mobs = {} + +-- register mob entity +function mobs:register_mob(name, def) + + mobs.spawning_mobs[name] = true + +minetest.register_entity(name, { + + stepheight = def.stepheight or 1.1, -- was 0.6 + 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 "", + on_die = def.on_die, + do_custom = def.do_custom, + jump_height = def.jump_height or 4, -- was 6 + 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 + 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 or {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, + selectionbox = def.selectionbox or def.collisionbox, + visual = def.visual, + visual_size = def.visual_size or {x = 1, y = 1}, + 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, + 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, + on_rightclick = def.on_rightclick, + arrow = def.arrow, + shoot_interval = def.shoot_interval, + sounds = def.sounds or {}, + animation = def.animation, + follow = def.follow, + jump = def.jump ~= false, + walk_chance = def.walk_chance or 50, + passive = def.passive or false, + knock_back = def.knock_back ~= false, + 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 + replace_rate = def.replace_rate, + replace_what = def.replace_what, + replace_with = def.replace_with, + replace_offset = def.replace_offset or 0, + on_replace = def.on_replace, + timer = 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, + 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, + runaway = def.runaway, + runaway_timer = 0, + pathfinding = def.pathfinding, + immune_to = def.immune_to or {}, + explosion_radius = def.explosion_radius, + explosion_damage_radius = def.explosion_damage_radius, + explosion_timer = def.explosion_timer or 3, + allow_fuse_reset = def.allow_fuse_reset ~= false, + stop_to_explode = def.stop_to_explode ~= false, + 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), + group_attack = def.group_attack or false, + attack_monsters = def.attacks_monsters or def.attack_monsters or false, + attack_animals = def.attack_animals or false, + attack_players = def.attack_players ~= false, + attack_npcs = def.attack_npcs ~= 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_breed = def.on_breed, + + on_grown = def.on_grown, + + on_activate = function(self, staticdata, dtime) + return mob_activate(self, staticdata, def, dtime) + end, + + get_staticdata = function(self) + return mob_staticdata(self) + end, + +}) + +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) + + for n = 1, #objs do + + if not objs[n]:is_player() then + + local obj = 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 + end + end + end + + return num_type, num_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) + + -- 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.settings:get(name) + + if numbers then + numbers = numbers:split(",") + chance = tonumber(numbers[1]) or chance + aoc = tonumber(numbers[2]) or aoc + + if chance == 0 then + minetest.log("warning", string.format("[mobs] %s has spawning disabled", name)) + return + end + + minetest.log("action", + string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc)) + + end + + minetest.register_abm({ + + label = name .. " spawning", + nodenames = nodes, + neighbors = neighbors, + interval = interval, + chance = max(1, (chance * mob_chance_multiplier)), + catch_up = false, + + action = function(pos, node, active_object_count, active_object_count_wider) + + -- is mob actually registered? + if not mobs.spawning_mobs[name] + or not minetest.registered_entities[name] then +--print ("--- mob doesn't exist", name) + return + end + + -- additional custom checks for spawning mob + if mobs:spawn_abm_check(pos, node, name) == true then + 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) + return + end + + -- if toggle set to nil then ignore day/night check + if day_toggle ~= nil then + + local tod = (minetest.get_timeofday() or 0) * 24000 + + if tod > 4500 and tod < 19500 then + -- daylight, but mob wants night + if day_toggle == false then +--print ("--- mob needs night", name) + return + end + else + -- night time but mob wants day + if day_toggle == true then +--print ("--- mob needs day", name) + return + end + end + end + + -- spawn above node + pos.y = pos.y + 1 + + -- are we spawning within height limits? + if pos.y > max_height + or pos.y < min_height then +--print ("--- height limits not met", name, pos.y) + return + end + + -- are light levels ok? + local light = minetest.get_node_light(pos) + if not light + or light > max_light + or light < min_light then +--print ("--- light limits not met", name, light) + return + end + + -- only spawn away from player + local objs = minetest.get_objects_inside_radius(pos, 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) + + for n = 0, height do + + 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 + + -- 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 + + 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 + + local ent = mob:get_luaentity() + + on_spawn(ent, pos) + end + end + }) +end + + +-- compatibility with older mob registration +function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_object_count, max_height, day_toggle) + + mobs:spawn_specific(name, nodes, {"air"}, min_light, max_light, 30, + chance, active_object_count, -31000, max_height, day_toggle) +end + + +-- MarkBu's spawn function +function mobs:spawn(def) + + 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 + + +-- register arrow for shoot attack +function mobs:register_arrow(name, def) + + if not name or not def then return end -- errorcheck + + minetest.register_entity(name, { + + physical = false, + visual = def.visual, + visual_size = def.visual_size, + textures = def.textures, + velocity = def.velocity, + hit_player = def.hit_player, + 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 + timer = 0, + switch = 0, + owner_id = def.owner_id, + rotate = def.rotate, + automatic_face_movement_dir = def.rotate + and (def.rotate - (pi / 180)) or false, + + on_activate = def.on_activate, + + on_step = def.on_step or function(self, dtime) + + self.timer = self.timer + 1 + + local pos = self.object:get_pos() + + if self.switch == 0 + or self.timer > 150 + or not within_limits(pos, 0) then + + self.object:remove() ; -- print ("removed arrow") + + return + end + + -- does arrow have a tail (fireball) + if def.tail + and def.tail == 1 + and def.tail_texture then + + minetest.add_particle({ + pos = pos, + velocity = {x = 0, y = 0, z = 0}, + acceleration = {x = 0, y = 0, z = 0}, + expirationtime = def.expire or 0.25, + collisiondetection = false, + texture = def.tail_texture, + size = def.tail_size or 5, + glow = def.glow or 0, + }) + end + + if self.hit_node then + + local node = node_ok(pos).name + + if minetest.registered_nodes[node].walkable then + + self.hit_node(self, pos, node) + + if self.drop == true then + + pos.y = pos.y + 1 + + self.lastpos = (self.lastpos or pos) + + minetest.add_item(self.lastpos, self.object:get_luaentity().name) + end + + self.object:remove() ; -- print ("hit node") + + return + end + end + + if self.hit_player or self.hit_mob then + + for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.0)) do + + if self.hit_player + and player:is_player() then + + self.hit_player(self, player) + self.object:remove() ; -- print ("hit player") + return + end + + local entity = player:get_luaentity() + + if entity + and self.hit_mob + and entity._cmi_is_mob == true + and tostring(player) ~= self.owner_id + and entity.name ~= self.object:get_luaentity().name then + + self.hit_mob(self, player) + + self.object:remove() ; --print ("hit mob") + + return + end + end + end + + self.lastpos = pos + end + }) +end + + +-- 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 = {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 + end + + local invimg = background + + if addegg == 1 then + invimg = "mobs_chicken_egg.png^(" .. invimg .. + "^[mask:mobs_chicken_egg_overlay.png)" + end + + -- register new spawn egg containing mob information + minetest.register_craftitem(mob .. "_set", { + + description = S("@1 (Tamed)", desc), + inventory_image = invimg, + groups = {spawn_egg = 2, not_in_creative_inventory = 1}, + stack_max = 1, + + on_place = function(itemstack, placer, pointed_thing) + + local pos = pointed_thing.above + + -- am I clicking on something with existing on_rightclick function? + local under = minetest.get_node(pointed_thing.under) + local def = minetest.registered_nodes[under.name] + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, under, placer, itemstack) + 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 + 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() + + -- set owner if not a monster + if ent.type ~= "monster" then + ent.owner = placer:get_player_name() + ent.tamed = true + end + + -- since mob is unique we remove egg once spawned + itemstack:take_item() + end + + return itemstack + end, + }) + + + -- register old stackable mob egg + minetest.register_craftitem(mob, { + + description = desc, + inventory_image = invimg, + groups = grp, + + on_place = function(itemstack, placer, pointed_thing) + + local pos = pointed_thing.above + + -- am I clicking on something with existing on_rightclick function? + local under = minetest.get_node(pointed_thing.under) + local def = minetest.registered_nodes[under.name] + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, under, placer, itemstack) + 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 + return + end + + pos.y = pos.y + 1 + + local mob = minetest.add_entity(pos, mob) + local ent = mob:get_luaentity() + + -- 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 mobs.is_creative(placer:get_player_name()) then + itemstack:take_item() + end + end + + return itemstack + end, + }) + +end + + +-- capture critter (thanks to blert2112 for idea) +function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, force_take, replacewith) + + if self.child + or not clicker:is_player() + or not clicker:get_inventory() then + return false + end + + -- get name of clicked mob + local mobname = self.name + + -- if not nil change what will be added to inventory + if replacewith then + mobname = replacewith + end + + local name = clicker:get_player_name() + local tool = clicker:get_wielded_item() + + -- 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:lasso" then + return false + end + + -- is mob tamed? + if self.tamed == false + and force_take == false then + + minetest.chat_send_player(name, S("Not tamed!")) + + return true -- false + end + + -- cannot pick up if not owner + if self.owner ~= name + and force_take == false then + + minetest.chat_send_player(name, S("@1 is owner!", self.owner)) + + return true -- false + end + + if clicker:get_inventory():room_for_item("main", mobname) then + + -- was mob clicked with hand, net, or lasso? + local chance = 0 + + if tool:get_name() == "" then + chance = chance_hand + + elseif tool:get_name() == "mobs:net" then + + chance = chance_net + + clicker:set_wielded_item(tool) + + elseif tool:get_name() == "mobs:lasso" then + + chance = chance_lasso + + clicker:set_wielded_item(tool) + + end + + -- default mob egg + local new_stack = ItemStack(mobname) + + -- add special mob egg with all mob information + -- unless 'replacewith' contains new item to use + if not replacewith then + + new_stack = ItemStack(mobname .. "_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) + end + + 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() + + mob_sound(self, "default_place_node_hard") + + end + + return true +end + + +-- protect tamed mob with rune item +function mobs:protect(self, clicker) + + local name = clicker:get_player_name() + local tool = clicker:get_wielded_item() + + if tool:get_name() ~= "mobs:protector" then + return false + end + + if self.tamed == false then + minetest.chat_send_player(name, S("Not tamed!")) + return true -- false + end + + if self.protected == true then + minetest.chat_send_player(name, S("Already protected!")) + return true -- false + end + + 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 + + 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 + + +local mob_obj = {} +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 not in creative then take item + if not mobs.is_creative(clicker:get_player_name()) then + + local item = clicker:get_wielded_item() + + item:take_item() + + clicker:set_wielded_item(item) + end + + -- increase health + self.health = self.health + 4 + + if self.health >= self.hp_max then + + self.health = self.hp_max + + if self.htimer < 1 then + + minetest.chat_send_player(clicker:get_player_name(), + S("@1 at full health (@2)", + self.name:split(":")[2], tostring(self.health))) + + self.htimer = 5 + end + end + + self.object:set_hp(self.health) + + update_tag(self) + + -- make children grow quicker + if self.child == true then + + self.hornytimer = self.hornytimer + 20 + + return true + end + + -- feed and tame + self.food = (self.food or 0) + 1 + if self.food >= feed_count then + + self.food = 0 + + if breed and self.hornytimer == 0 then + self.horny = true + end + + self.gotten = false + + if tame then + + if self.tamed == false then + minetest.chat_send_player(clicker:get_player_name(), + S("@1 has been tamed!", + self.name:split(":")[2])) + end + + self.tamed = true + + if not self.owner or self.owner == "" then + self.owner = clicker:get_player_name() + end + end + + -- make sound when fed so many times + mob_sound(self, self.sounds.random) + end + + return true + end + + local item = clicker:get_wielded_item() + + -- if mob has been tamed you can name it with a nametag + if item:get_name() == "mobs:nametag" + and clicker:get_player_name() == self.owner then + + local name = clicker:get_player_name() + + -- store mob and nametag stack in external variables + mob_obj[name] = self + mob_sta[name] = item + + local tag = self.nametag or "" + + minetest.show_formspec(name, "mobs_nametag", "size[8,4]" + .. default.gui_bg + .. default.gui_bg_img + .. "field[0.5,1;7.5,0;name;" .. minetest.formspec_escape(S("Enter name:")) .. ";" .. tag .. "]" + .. "button_exit[2.5,3.5;3,1;mob_rename;" .. minetest.formspec_escape(S("Rename")) .. "]") + end + + return false +end + + +-- inspired by blockmen's nametag mod +minetest.register_on_player_receive_fields(function(player, formname, fields) + + -- right-clicked with nametag and name entered? + if formname == "mobs_nametag" + and fields.name + and fields.name ~= "" then + + local name = player:get_player_name() + + if not mob_obj[name] + or not mob_obj[name].object then + 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) + end + + -- update nametag + mob_obj[name].nametag = fields.name + + update_tag(mob_obj[name]) + + -- if not in creative then take item + if not mobs.is_creative(name) then + + mob_sta[name]:take_item() + + player:set_wielded_item(mob_sta[name]) + end + + -- reset external variables + mob_obj[name] = nil + mob_sta[name] = nil + end +end) + + +-- compatibility function for old entities to new modpack entities +function mobs:alias_mob(old_name, new_name) + + -- spawn egg + minetest.register_alias(old_name, new_name) + + -- entity + minetest.register_entity(":" .. old_name, { + + physical = false, + + on_step = function(self) + + if minetest.registered_entities[new_name] then + minetest.add_entity(self.object:get_pos(), new_name) + end + + self.object:remove() + end + }) +end diff --git a/mods/Mobs/mobs/api.lua_testspawn b/mods/Mobs/mobs/api.lua_testspawn new file mode 100644 index 0000000..471df35 --- /dev/null +++ b/mods/Mobs/mobs/api.lua_testspawn @@ -0,0 +1,3985 @@ + +-- Mobs Api + +mobs = {} +mobs.mod = "redo" +mobs.version = "20180623" + + +-- Intllib +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 + + +-- 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 +local sin = math.sin +local cos = math.cos +local abs = math.abs +local min = math.min +local max = math.max +local atann = math.atan +local random = math.random +local floor = math.floor +local atan = function(x) + if not x or x ~= x then + --error("atan bassed NaN") + return 0 + else + return atann(x) + end +end + + +-- Load settings +local damage_enabled = minetest.settings:get_bool("enable_damage") +local mobs_spawn = minetest.settings:get_bool("mobs_spawn") ~= false +local peaceful_only = minetest.settings:get_bool("only_peaceful_mobs") +local disable_blood = minetest.settings:get_bool("mobs_disable_blood") +local mobs_drop_items = minetest.settings:get_bool("mobs_drop_items") ~= false +local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false +local creative = minetest.settings:get_bool("creative_mode") +local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false +local remove_far = minetest.settings:get_bool("remove_far_mobs") ~= false +local difficulty = tonumber(minetest.settings:get("mob_difficulty")) or 1.0 +local show_health = minetest.settings:get_bool("mob_show_health") ~= false +local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 99) +local mob_chance_multiplier = tonumber(minetest.settings:get("mob_chance_multiplier") or 1) + +-- 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.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 +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) + + if sound then + minetest.sound_play(sound, { + object = self.object, + gain = 1.0, + max_hear_distance = self.sounds.distance + }) + end +end + + +-- attack player/mob +local do_attack = function(self, player) + + if self.state == "attack" then + return + end + + self.attack = player + self.state = "attack" + + if random(0, 100) < 90 then + mob_sound(self, self.sounds.war_cry) + end +end + + +-- move mob in facing direction +local set_velocity = function(self, v) + + -- do not move if mob has been ordered to stay + if self.order == "stand" then + self.object:setvelocity({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 + }) +end + + +-- calculate mob velocity +local get_velocity = function(self) + + local v = self.object:getvelocity() + + return (v.x * v.x + v.z * v.z) ^ 0.5 +end + + +-- set and return valid yaw +local set_yaw = function(self, yaw, delay) + + if not yaw or yaw ~= yaw then + yaw = 0 + end + + delay = delay or 0 + + 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(self, yaw, delay) + set_yaw(self, yaw, delay) +end + + +-- set defined animation +local set_animation = function(self, anim) + + if not self.animation + or not anim then return end + + self.animation.current = self.animation.current or "" + + if anim == self.animation.current + or not self.animation[anim .. "_start"] + or not self.animation[anim .. "_end"] then + return + end + + self.animation.current = 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, + 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) +end + + +-- check line of sight (BrunoMine) +local line_of_sight = function(self, pos1, pos2, stepsize) + + stepsize = stepsize or 1 + + 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 + + -- Target Distance (td) to travel + local td = get_distance(pos1, pos2) + + -- Actual Distance (ad) traveled + local ad = 0 + + -- 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 + + -- Check if you can still move forward + if td < ad + stepsize then + return true -- Reached the target + end + + -- Moves the analyzed pos + local d = get_distance(pos1, pos2) + + npos1.x = ((pos2.x - pos1.x) / d * stepsize) + pos1.x + npos1.y = ((pos2.y - pos1.y) / d * stepsize) + pos1.y + npos1.z = ((pos2.z - pos1.z) / d * stepsize) + pos1.z + + -- NaN checks + if d == 0 + or npos1.x ~= npos1.x + or npos1.y ~= npos1.y + or npos1.z ~= npos1.z then + return false + end + + ad = ad + stepsize + + -- 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 + + +-- are we flying in what we are suppose to? (taikedz) +local flight_check = function(self, pos_w) + + local def = minetest.registered_nodes[self.standing_in] + + if not def then return false end -- nil check + + if type(self.fly_in) == "string" + and self.standing_in == self.fly_in then + + return true + + elseif type(self.fly_in) == "table" then + + for _,fly_in in pairs(self.fly_in) do + + if self.standing_in == fly_in then + + return true + end + end + end + + -- stops mobs getting stuck inside stairs and plantlike nodes + if def.drawtype ~= "airlike" + and def.drawtype ~= "liquid" + and def.drawtype ~= "flowingliquid" then + return true + end + + return false +end + + +-- 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, + time = 0.25, + minpos = pos, + maxpos = pos, + minvel = {x = -radius, y = -radius, z = -radius}, + maxvel = {x = radius, y = radius, z = radius}, + minacc = {x = 0, y = gravity, z = 0}, + maxacc = {x = 0, y = gravity, z = 0}, + minexptime = 0.1, + maxexptime = 1, + minsize = min_size, + maxsize = max_size, + texture = texture, + glow = glow, + }) +end + + +-- update nametag colour +local update_tag = function(self) + + local col = "#00FF00" + local qua = self.hp_max / 4 + + if self.health <= floor(qua * 3) then + col = "#FFFF00" + end + + if self.health <= floor(qua * 2) then + col = "#FF6600" + end + + if self.health <= floor(qua) then + col = "#FF0000" + end + + self.object:set_properties({ + nametag = self.nametag, + nametag_color = col + }) + +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: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) + item = self.drops[n].name + + -- cook items when true + if cooked then + + local output = minetest.get_craft_result({ + method = "cooking", width = 1, items = {item}}) + + if output and output.item and not output.item:is_empty() then + item = output.item:get_name() + end + end + + -- add item if it exists + obj = minetest.add_item(pos, ItemStack(item .. " " .. num)) + + if obj and obj:get_luaentity() then + + obj:setvelocity({ + x = random(-10, 10) / 9, + y = 6, + z = random(-10, 10) / 9, + }) + elseif obj then + obj:remove() -- item does not exist + end + end + end + + self.drops = {} +end + + +-- check if mob is dead or only hurt +local check_for_death = function(self, cause, cmi_cause) + + -- has health actually changed? + if self.health == self.old_health and self.health > 0 then + return + end + + self.old_health = self.health + + -- still got some health? play hurt sound + if self.health > 0 then + + mob_sound(self, self.sounds.damage) + + -- make sure health isn't higher than max + if self.health > self.hp_max then + self.health = self.hp_max + end + + -- backup nametag so we can show health stats + if not self.nametag2 then + self.nametag2 = self.nametag or "" + end + + if show_health + and (cmi_cause and cmi_cause.type == "punch") then + + self.htimer = 2 + self.nametag = "♥ " .. self.health .. " / " .. self.hp_max + + update_tag(self) + 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 + + mob_sound(self, self.sounds.death) + + 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 + end + + -- default death function and die animation (if defined) + if self.animation + and self.animation.die_start + and self.animation.die_end then + + local frames = self.animation.die_end - self.animation.die_start + local speed = self.animation.die_speed or 15 + local length = max(frames / speed, 0) + + self.attack = nil + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.passive = true + self.state = "die" + set_velocity(self, 0) + set_animation(self, "die") + + minetest.after(length, function(self) + + if use_cmi and self.object:get_luaentity() 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 + + effect(pos, 20, "tnt_smoke.png") + + return true +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) + + if self.fear_height == 0 then -- 0 for no falling protection! + return false + end + + local yaw = self.object:get_yaw() + local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) + local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) + local pos = self.object:get_pos() + local ypos = pos.y + self.collisionbox[2] -- just above floor + + if minetest.line_of_sight( + {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, + {x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z} + , 1) then + + return true + end + + return false +end + + +-- get node but use fallback for nil or unknown +local node_ok = function(pos, fallback) + + fallback = fallback or mobs.fallback_node + + local node = minetest.get_node_or_nil(pos) + + if node and minetest.registered_nodes[node.name] then + return node + end + + return minetest.registered_nodes[fallback] +end + + +-- environmental damage (water, lava, fire, light etc.) +local do_env_damage = function(self) + + -- feed/tame text timer (so mob 'full' messages dont spam chat) + if self.htimer > 0 then + self.htimer = self.htimer - 1 + end + + -- reset nametag after showing health stats + if self.htimer < 1 and self.nametag2 then + + self.nametag = self.nametag2 + self.nametag2 = nil + + update_tag(self) + 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 + 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 + + self.health = self.health - self.light_damage + + effect(pos, 5, "tnt_smoke.png") + + 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 + 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}) + end + + local nodef = minetest.registered_nodes[self.standing_in] + + pos.y = pos.y + 1 -- for particle effect position + + -- water + if self.water_damage + and nodef.groups.water then + + if self.water_damage ~= 0 then + + self.health = self.health - self.water_damage + + effect(pos, 5, "bubble.png", nil, nil, 1, nil) + + if check_for_death(self, "water", {type = "environment", + pos = pos, node = self.standing_in}) then return end + end + + -- 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 + + +-- jump if facing a solid node (not fences or gates) +local do_jump = function(self) + + if not self.jump + or self.jump_height == 0 + or self.fly + or self.child + or self.order == "stand" then + return false + end + + self.facing_fence = false + + -- something stopping us while moving? + if self.state ~= "stand" + and get_velocity(self) > 0.5 + and self.object:getvelocity().y ~= 0 then + return false + end + + 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 + + local nod = node_ok(pos) + +--print ("standing on:", nod.name, pos.y) + + if minetest.registered_nodes[nod.name].walkable == false then + return false + end + + -- where is front + local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) + local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) + + -- what is in front of mob? + local nod = node_ok({ + x = pos.x + dir_x, + y = pos.y + 0.5, + z = pos.z + dir_z + }) + + -- thin blocks that do not need to be jumped + if nod.name == node_snow then + return false + end + +--print ("in front:", nod.name, pos.y + 0.5) + + if self.walk_chance == 0 + or minetest.registered_items[nod.name].walkable then + + if not nod.name:find("fence") + and not nod.name:find("gate") then + + local v = self.object:getvelocity() + + v.y = self.jump_height + + set_animation(self, "jump") -- only when defined + + self.object:setvelocity(v) + + -- 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 get_velocity(self) > 0 then + mob_sound(self, self.sounds.jump) + end + else + self.facing_fence = true + end + + return true + end + + return false +end + + +-- blast damage to entities nearby (modified from TNT mod) +local entity_physics = function(pos, radius) + + radius = radius * 2 + + local objs = minetest.get_objects_inside_radius(pos, radius) + local obj_pos, dist + + for n = 1, #objs do + + 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) + local ent = objs[n]:get_luaentity() + + -- punches work on entities AND players + objs[n]:punch(objs[n], 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = damage}, + }, pos) + end +end + + +-- should mob follow what I'm holding ? +local follow_holding = function(self, clicker) + + if mobs.invis[clicker:get_player_name()] then + return false + end + + local item = clicker:get_wielded_item() + local t = type(self.follow) + + -- single item + if t == "string" + and item:get_name() == self.follow then + return true + + -- multiple items + elseif t == "table" then + + for no = 1, #self.follow do + + if self.follow[no] == item:get_name() then + return true + end + end + end + + return false +end + + +-- find two animals of same type and breed if nearby and horny +local breed = function(self) + + -- child takes 240 seconds before growing into adult + if self.child == true then + + self.hornytimer = self.hornytimer + 1 + + if self.hornytimer > 240 then + + self.child = false + self.hornytimer = 0 + + self.object:set_properties({ + textures = self.base_texture, + mesh = self.base_mesh, + visual_size = self.base_size, + collisionbox = self.base_colbox, + selectionbox = self.base_selbox, + }) + + -- 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 + end + + -- horny animal can mate for 40 seconds, + -- afterwards horny animal cannot mate again for 200 seconds + if self.horny == true + and self.hornytimer < 240 then + + self.hornytimer = self.hornytimer + 1 + + if self.hornytimer >= 240 then + self.hornytimer = 0 + self.horny = false + end + end + + -- 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:get_pos() + + effect({x = pos.x, y = pos.y + 1, z = pos.z}, 8, "heart.png", 3, 4, 1, 0.1) + + local objs = minetest.get_objects_inside_radius(pos, 3) + local num = 0 + local ent = nil + + for n = 1, #objs do + + ent = objs[n]:get_luaentity() + + -- check for same animal with different colour + local canmate = false + + if ent then + + if ent.name == self.name then + canmate = true + else + local entname = string.split(ent.name,":") + local selfname = string.split(self.name,":") + + if entname[1] == selfname[1] then + entname = string.split(entname[2],"_") + selfname = string.split(selfname[2],"_") + + if entname[1] == selfname[1] then + canmate = true + end + end + end + end + + if ent + and canmate == true + and ent.horny == true + and ent.hornytimer <= 40 then + num = num + 1 + end + + -- found your mate? then have a baby + if num > 1 then + + self.hornytimer = 41 + ent.hornytimer = 41 + + -- spawn baby + 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 + 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 = { + x = self.base_size.x * .5, + y = self.base_size.y * .5, + }, + collisionbox = { + self.base_colbox[1] * .5, + self.base_colbox[2] * .5, + self.base_colbox[3] * .5, + self.base_colbox[4] * .5, + self.base_colbox[5] * .5, + self.base_colbox[6] * .5, + }, + 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 + end, self, ent) + + num = 0 + + break + end + end + end +end + + +-- find and replace what mob is looking for (grass, wheat etc.) +local replace = function(self, 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 random(1, self.replace_rate) > 1 then + return + end + + local what, with, y_offset + + if type(self.replace_what[1]) == "table" then + + local num = random(#self.replace_what) + + what = self.replace_what[num][1] or "" + with = self.replace_what[num][2] or "" + y_offset = self.replace_what[num][3] or 0 + else + what = self.replace_what + with = self.replace_with or "" + y_offset = self.replace_offset or 0 + end + + pos.y = pos.y + y_offset + + if #minetest.find_nodes_in_area(pos, pos, what) > 0 then + +-- print ("replace node = ".. minetest.get_node(pos).name, pos.y) + + local oldnode = {name = what} + local newnode = {name = with} + local on_replace_return + + if self.on_replace then + on_replace_return = self.on_replace(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 + + +-- check if daytime and also if mob is docile during daylight hours +local day_docile = function(self) + + if self.docile_by_day == false then + + return false + + elseif self.docile_by_day == true + and self.time_of_day > 0.2 + and self.time_of_day < 0.8 then + + return true + end +end + + +local los_switcher = false +local height_switcher = false + +-- path finding and smart mob routine by rnd, line_of_sight and other edits by Elkien3 +local smart_mobs = function(self, 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) < .5 then + self.path.stuck_timer = self.path.stuck_timer + dtime + else + self.path.stuck_timer = 0 + end + + self.path.lastpos = {x = s.x, y = s.y, z = s.z} + + 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 math.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] + + -- round position to center of node to avoid stuck in walls + -- also adjust height for player models! + s.x = floor(s.x + 0.5) +-- s.y = floor(s.y + 0.5) - sheight + s.z = floor(s.z + 0.5) + + local ssight, sground = minetest.line_of_sight(s, { + x = s.x, y = s.y - 4, z = s.z}, 1) + + -- determine node above ground + if not ssight then + s.y = sground.y + 1 + end + + 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 = 6 + if self.fear_height ~= 0 then dropheight = self.fear_height end + + self.path.way = minetest.find_path(s, p1, 16, self.stepheight, dropheight, "Dijkstra") +--[[ + -- 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) + + -- no path found, try something else + if not self.path.way then + + self.path.following = false + + -- lets make way by digging/building if not accessible + if self.pathfinding == 2 and mobs_griefing then + + -- is player higher than mob? + if s.y < p1.y then + + -- build upwards + if not minetest.is_protected(s, "") then + + local ndef1 = minetest.registered_nodes[self.standing_in] + + if ndef1 and (ndef1.buildable_to or ndef1.groups.liquid) then + + minetest.set_node(s, {name = mobs.fallback_node}) + end + end + + local sheight = math.ceil(self.collisionbox[5]) + 1 + + -- assume mob is 2 blocks high so it digs above its head + s.y = s.y + sheight + + -- remove one block above to make room to jump + if not minetest.is_protected(s, "") then + + local node1 = node_ok(s, "air").name + 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 + + minetest.set_node(s, {name = "air"}) + minetest.add_item(s, ItemStack(node1)) + + end + end + + s.y = s.y - sheight + self.object:setpos({x = s.x, y = s.y + 2, z = s.z}) + + else -- dig 2 blocks to make door toward player direction + + local yaw1 = self.object:get_yaw() + pi / 2 + local p1 = { + x = s.x + cos(yaw1), + y = s.y, + z = s.z + sin(yaw1) + } + + if not minetest.is_protected(p1, "") then + + local node1 = node_ok(p1, "air").name + 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 + + minetest.add_item(p1, ItemStack(node1)) + minetest.set_node(p1, {name = "air"}) + end + + p1.y = p1.y + 1 + node1 = node_ok(p1, "air").name + 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 + + minetest.add_item(p1, ItemStack(node1)) + minetest.set_node(p1, {name = "air"}) + end + + end + end + end + + -- will try again in 2 second + self.path.stuck_timer = stuck_timeout - 2 + + -- frustration! cant find the damn path :( + mob_sound(self, self.sounds.random) + else + -- yay i found path + mob_sound(self, self.sounds.war_cry) + set_velocity(self, self.walk_velocity) + + -- follow path now that it has it + self.path.following = true + end + end +end + + +-- specific attacks +local specific_attack = function(list, what) + + -- no list so attack default (player, animals etc.) + if list == nil then + return true + end + + -- found entity on list to attack? + for no = 1, #list do + + if list[no] == what then + return true + end + end + + return false +end + + +-- monster find someone to attack +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: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 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 + + p = player:get_pos() + sp = s + + dist = get_distance(p, s) + + -- aim higher to make looking up hills more realistic + p.y = p.y + 1 + sp.y = sp.y + 1 + + + -- choose closest player to attack + if dist < min_dist + and line_of_sight(self, sp, p, 2) == true then + min_dist = dist + min_player = player + end + 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, dist + local s = self.object:get_pos() + local min_dist = self.view_range + 1 + local objs = minetest.get_objects_inside_radius(s, self.view_range) + + for n = 1, #objs do + + obj = objs[n]:get_luaentity() + + if obj and obj.type == "monster" then + + p = obj.object:get_pos() + sp = s + + dist = get_distance(p, s) + + -- aim higher to make looking up hills more realistic + p.y = p.y + 1 + sp.y = sp.y + 1 + + if dist < min_dist + and line_of_sight(self, sp, p, 2) == true then + min_dist = dist + min_player = obj.object + end + end + end + + if min_player then + do_attack(self, min_player) + end +end + + +-- specific runaway +local specific_runaway = function(list, what) + + -- no list so do not run + if list == nil then + return false + end + + -- found entity on list to attack? + for no = 1, #list do + + if list[no] == what then + return true + end + end + + return false +end + + +-- find someone to runaway from +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() ] + or self.owner == 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 + + 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) + + + -- choose closest player/mpb to runaway from + if dist < min_dist + and line_of_sight(self, sp, p, 2) == true then + min_dist = dist + min_player = player + end + end + end + + 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, yaw, 4) + 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:get_pos() + local players = minetest.get_connected_players() + + for n = 1, #players do + + if get_distance(players[n]:get_pos(), s) < self.view_range + and not mobs.invis[ players[n]:get_player_name() ] then + + self.following = players[n] + + break + end + end + end + + if self.type == "npc" + and self.order == "follow" + and self.state ~= "attack" + and self.owner ~= "" then + + -- npc stop following player if not owner + if self.following + and self.owner + and self.owner ~= self.following:get_player_name() then + self.following = nil + end + else + -- stop following player if not holding specific item + if self.following + and self.following:is_player() + and follow_holding(self, self.following) == false then + self.following = nil + end + + end + + -- follow that thing + if self.following then + + local s = self.object:get_pos() + local p + + if self.following:is_player() then + + p = self.following:get_pos() + + elseif self.following.object then + + p = self.following.object:get_pos() + end + + if p then + + local dist = get_distance(p, s) + + -- dont follow if out of range + if dist > self.view_range then + self.following = nil + else + local vec = { + x = p.x - s.x, + z = p.z - s.z + } + + local yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if p.x > s.x then yaw = yaw + pi end + + yaw = set_yaw(self, 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) + + if self.walk_chance ~= 0 then + set_animation(self, "walk") + end + else + set_velocity(self, 0) + set_animation(self, "stand") + end + + return + end + end + end + + -- 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 + + self.state = "flop" + self.object:setvelocity({x = 0, y = -5, z = 0}) + + set_animation(self, "stand") + + return + elseif self.state == "flop" then + self.state = "stand" + end + end +end + + +-- dogshoot attack switch and counter function +local dogswitch = function(self, dtime) + + -- switch mode not activated + if not self.dogshoot_switch + or not dtime then + return 0 + end + + self.dogshoot_count = self.dogshoot_count + dtime + + if (self.dogshoot_switch == 1 + and self.dogshoot_count > self.dogshoot_count_max) + or (self.dogshoot_switch == 2 + and self.dogshoot_count > self.dogshoot_count2_max) then + + self.dogshoot_count = 0 + + if self.dogshoot_switch == 1 then + self.dogshoot_switch = 2 + else + self.dogshoot_switch = 1 + end + end + + return self.dogshoot_switch +end + + +-- execute current state (stand, walk, run, attacks) +local do_states = function(self, dtime) + + 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: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]:get_pos() + break + end + end + + -- look at any players nearby, otherwise turn randomly + if lp then + + local vec = { + x = lp.x - s.x, + z = lp.z - s.z + } + + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if lp.x > s.x then yaw = yaw + pi end + else + yaw = yaw + random(-0.5, 0.5) + end + + yaw = set_yaw(self, yaw, 8) + end + + set_velocity(self, 0) + set_animation(self, "stand") + + -- npc's ordered to stand stay standing + if self.type ~= "npc" + 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 + + 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 + end + + elseif self.state == "walk" then + + local s = self.object:get_pos() + local lp = nil + + -- is there something I need to avoid? + if self.water_damage > 0 + and self.lava_damage > 0 then + + lp = minetest.find_node_near(s, 1, {"group:water", "group:lava"}) + + elseif self.water_damage > 0 then + + lp = minetest.find_node_near(s, 1, {"group:water"}) + + elseif self.lava_damage > 0 then + + lp = minetest.find_node_near(s, 1, {"group:lava"}) + end + + if lp then + + -- if mob in water or lava then look for land + if (self.lava_damage + and minetest.registered_nodes[self.standing_in].groups.lava) + or (self.water_damage + and minetest.registered_nodes[self.standing_in].groups.water) then + + lp = minetest.find_node_near(s, 5, {"group:soil", "group:stone", + "group:sand", node_ice, node_snowblock}) + + -- did we find land? + if lp then + + local vec = { + x = lp.x - s.x, + z = lp.z - s.z + } + + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if lp.x > s.x then yaw = yaw + pi end + + -- look towards land and jump/move in that direction + yaw = set_yaw(self, yaw, 6) + do_jump(self) + set_velocity(self, self.walk_velocity) + else + yaw = yaw + random(-0.5, 0.5) + end + + else + + local vec = { + x = lp.x - s.x, + z = lp.z - s.z + } + + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if lp.x > s.x then yaw = yaw + pi end + end + + yaw = set_yaw(self, yaw, 8) + + -- otherwise randomly turn + elseif random(1, 100) <= 30 then + + yaw = yaw + random(-0.5, 0.5) + + yaw = set_yaw(self, yaw, 8) + end + + -- stand for great fall in front + local temp_is_cliff = is_at_cliff(self) + + if self.facing_fence == true + or temp_is_cliff + or random(1, 100) <= 30 then + + set_velocity(self, 0) + self.state = "stand" + set_animation(self, "stand") + else + set_velocity(self, self.walk_velocity) + + if flight_check(self) + and self.animation + and self.animation.fly_start + and self.animation.fly_end then + set_animation(self, "fly") + else + set_animation(self, "walk") + end + end + + -- runaway when punched + elseif self.state == "runaway" then + + self.runaway_timer = self.runaway_timer + 1 + + -- stop after 5 seconds or when at cliff + if self.runaway_timer > 5 + or is_at_cliff(self) then + self.runaway_timer = 0 + set_velocity(self, 0) + self.state = "stand" + set_animation(self, "stand") + else + set_velocity(self, self.run_velocity) + set_animation(self, "walk") + end + + -- attack routines (explode, dogfight, shoot, dogshoot) + elseif self.state == "attack" then + + -- calculate distance from mob and enemy + local s = self.object:get_pos() + local p = self.attack:get_pos() or s + local dist = get_distance(p, s) + + -- stop attacking if player invisible or out of range + if dist > self.view_range + or not self.attack + or not self.attack:get_pos() + or self.attack:get_hp() <= 0 + or (self.attack:is_player() and mobs.invis[ self.attack:get_player_name() ]) then + +-- print(" ** stop attacking **", dist, self.view_range) + self.state = "stand" + set_velocity(self, 0) + set_animation(self, "stand") + self.attack = nil + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.path.way = nil + + return + end + + if self.attack_type == "explode" then + + local vec = { + x = p.x - s.x, + z = p.z - s.z + } + + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if p.x > s.x then yaw = yaw + pi end + + yaw = set_yaw(self, 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 line_of_sight(self, s, p, 2) then + + self.v_start = true + self.timer = 0 + self.blinktimer = 0 + mob_sound(self, 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 line_of_sight(self, 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 unless the timer is active + if self.v_start and (self.stop_to_explode or dist < 1.5) 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_animation(self, "walk") + end + + if self.v_start then + + self.timer = self.timer + dtime + self.blinktimer = (self.blinktimer or 0) + dtime + + if self.blinktimer > 0.2 then + + self.blinktimer = 0 + + if self.blinkstatus then + self.object:settexturemod("") + else + self.object:settexturemod("^[brighten") + end + + self.blinkstatus = not self.blinkstatus + end + +-- print ("=== explosion timer", self.timer) + + if self.timer > self.explosion_timer then + + local pos = self.object:get_pos() + + -- 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 + + node_break_radius = 1 + end + + self.object:remove() + + if minetest.get_modpath("tnt") and tnt and tnt.boom + and not minetest.is_protected(pos, "") then + + tnt.boom(pos, { + radius = node_break_radius, + damage_radius = entity_damage_radius, + sound = self.sounds.explode, + }) + else + + minetest.sound_play(self.sounds.explode, { + pos = pos, + gain = 1.0, + max_hear_distance = self.sounds.distance or 32 + }) + + entity_physics(pos, entity_damage_radius) + effect(pos, 32, "tnt_smoke.png", nil, nil, node_break_radius, 1, 0) + end + + return + end + 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 + + if self.fly + and dist > self.reach then + + local p1 = s + local me_y = floor(p1.y) + local p2 = p + local p_y = floor(p2.y + 1) + local v = self.object:getvelocity() + + if flight_check(self, s) then + + if me_y < p_y then + + self.object:setvelocity({ + x = v.x, + y = 1 * self.walk_velocity, + z = v.z + }) + + elseif me_y > p_y then + + self.object:setvelocity({ + x = v.x, + y = -1 * self.walk_velocity, + z = v.z + }) + end + else + if me_y < p_y then + + self.object:setvelocity({ + x = v.x, + y = 0.01, + z = v.z + }) + + elseif me_y > p_y then + + self.object:setvelocity({ + x = v.x, + y = -0.01, + z = v.z + }) + end + end + + end + + -- rnd: new movement direction + if self.path.following + and self.path.way + and self.attack_type ~= "dogshoot" then + + -- no paths longer than 50 + if #self.path.way > 50 + or dist < self.reach then + self.path.following = false + return + end + + local p1 = self.path.way[1] + + if not p1 then + self.path.following = false + return + end + + if abs(p1.x-s.x) + abs(p1.z - s.z) < 0.6 then + -- reached waypoint, remove it from queue + table.remove(self.path.way, 1) + end + + -- set new temporary target + p = {x = p1.x, y = p1.y, z = p1.z} + end + + local vec = { + x = p.x - s.x, + z = p.z - s.z + } + + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if p.x > s.x then yaw = yaw + pi end + + yaw = set_yaw(self, yaw) + + -- move towards enemy if beyond mob reach + if dist > self.reach then + + -- path finding by rnd + if self.pathfinding -- only if mob has pathfinding enabled + and enable_pathfinding then + + smart_mobs(self, s, p, dist, dtime) + end + + if is_at_cliff(self) then + + set_velocity(self, 0) + set_animation(self, "stand") + else + + if self.path.stuck then + set_velocity(self, self.walk_velocity) + else + set_velocity(self, self.run_velocity) + end + + 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 + + self.path.stuck = false + self.path.stuck_timer = 0 + self.path.following = false -- not stuck anymore + + set_velocity(self, 0) + + if not self.custom_attack then + + if self.timer > 1 then + + self.timer = 0 + + if self.double_melee_attack + and random(1, 2) == 1 then + set_animation(self, "punch2") + else + set_animation(self, "punch") + end + + local p2 = p + local s2 = s + + p2.y = p2.y + .5 + s2.y = s2.y + .5 + + if line_of_sight(self, p2, s2) == true then + + -- play attack sound + mob_sound(self, self.sounds.attack) + + -- punch player (or what player is attached to) + local attached = self.attack:get_attach() + if attached then + self.attack = attached + end + self.attack:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = self.damage} + }, nil) + end + end + else -- call custom attack every second + if self.custom_attack + and self.timer > 1 then + + self.timer = 0 + + self.custom_attack(self, 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 + + p.y = p.y - .5 + s.y = s.y + .5 + + local dist = get_distance(p, s) + local vec = { + x = p.x - s.x, + y = p.y - s.y, + z = p.z - s.z + } + + yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + + if p.x > s.x then yaw = yaw + pi end + + yaw = set_yaw(self, yaw) + + set_velocity(self, 0) + + if self.shoot_interval + and self.timer > self.shoot_interval + and random(1, 100) <= 60 then + + self.timer = 0 + set_animation(self, "shoot") + + -- play shoot attack sound + mob_sound(self, self.sounds.shoot_attack) + + local p = self.object:get_pos() + + p.y = p.y + (self.collisionbox[2] + self.collisionbox[5]) / 2 + + if minetest.registered_entities[self.arrow] 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 + + -- offset makes shoot aim accurate + vec.y = vec.y + self.shoot_offset + vec.x = vec.x * (v / amount) + vec.y = vec.y * (v / amount) + vec.z = vec.z * (v / amount) + + obj:setvelocity(vec) + end + end + end + end +end + + +-- falling and fall damage +local falling = function(self, pos) + + if self.fly then + return + end + + -- floating in water (or falling) + local v = self.object:getvelocity() + + 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 + if minetest.registered_nodes[self.standing_in].groups.water then + + if self.floats == 1 then + + self.object:setacceleration({ + x = 0, + y = -self.fall_speed / (max(1, v.y) ^ 8), -- 8 was 2 + z = 0 + }) + end + else + + -- 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:get_pos().y + + if d > 5 then + + self.health = self.health - floor(d - 5) + + effect(pos, 5, "tnt_smoke.png", 1, 2, 2, nil) + + if check_for_death(self, "fall", {type = "fall"}) then + return + end + end + + self.old_y = self.object:get_pos().y + end + end +end + + +-- 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_capabilities, 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 + 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:get_pos(), hitter:get_player_name()) then + minetest.chat_send_player(hitter:get_player_name(), S("Mob has been protected!")) + return + end + + + -- weapon wear + local weapon = hitter:get_wielded_item() + local punch_interval = 1.4 + + -- calculate mob damage + local damage = 0 + local armor = self.object:get_armor_groups() or {} + local tmp + + -- quick error check incase it ends up 0 (serialize.h check test) + if tflp == 0 then + tflp = 0.2 + end + + if use_cmi then + damage = cmi.calculate_damage(self.object, hitter, tflp, tool_capabilities, dir) + else + + for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do + + 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 + end + + -- check for tool immunity or special damage + for n = 1, #self.immune_to do + + if self.immune_to[n][1] == weapon:get_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 + + -- healing + if damage <= -1 then + self.health = self.health - floor(damage) + return + end + +-- 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 + end + + if weapon:get_definition() + and weapon:get_definition().tool_capabilities then + + weapon:add_wear(floor((punch_interval / 75) * 9000)) + hitter:set_wielded_item(weapon) + end + + -- 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 + + local s = random(0, #weapon:get_definition().sounds) + + minetest.sound_play(weapon:get_definition().sounds[s], { + object = self.object, --hitter, + max_hear_distance = 8 + }) + else + minetest.sound_play("default_punch", { + object = self.object, --hitter, + max_hear_distance = 5 + }) + end + + -- blood_particles + if self.blood_amount > 0 + and not disable_blood then + + local pos = self.object:get_pos() + + pos.y = pos.y + (-self.collisionbox[2] + self.collisionbox[5]) * .5 + + -- 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 + self.health = self.health - floor(damage) + + -- 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 + end + + --[[ add healthy afterglow when hit (can cause hit lag with larger textures) + minetest.after(0.1, function() + + if not self.object:get_luaentity() then return end + + self.object:settexturemod("^[colorize:#c9900070") + + core.after(0.3, function() + self.object:settexturemod("") + end) + end) ]] + + -- knock back effect (only on full punch) + if self.knock_back + 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 + + -- if skittish then run away + if self.runaway == true then + + local lp = hitter:get_pos() + local s = self.object:get_pos() + local vec = { + x = lp.x - s.x, + y = lp.y - s.y, + z = lp.z - s.z + } + + local yaw = (atan(vec.z / vec.x) + 3 * pi / 2) - self.rotate + + if lp.x > s.x then + yaw = yaw + pi + end + + yaw = set_yaw(self, yaw, 6) + self.state = "runaway" + self.runaway_timer = 0 + self.following = nil + end + + local name = hitter:get_player_name() or "" + + -- attack puncher and call other mobs for help + if self.passive == false + and self.state ~= "flop" + and self.child == false + and hitter:get_player_name() ~= self.owner + and not mobs.invis[ name ] then + + -- attack whoever punched mob + self.state = "" + do_attack(self, hitter) + + -- alert others to the attack + local objs = minetest.get_objects_inside_radius(hitter:get_pos(), self.view_range) + local obj = nil + + for n = 1, #objs do + + obj = objs[n]:get_luaentity() + + if obj 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) + end + + -- have owned mobs attack player threat + if obj.owner == name and obj.owner_loyal then + do_attack(obj, self.object) + end + end + end + end +end + + +-- get entity staticdata +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 + self.following = nil + self.state = "stand" + + -- used to rotate older mobs + if self.drawtype + and self.drawtype == "side" then + 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 + + local t = type(stat) + + if t ~= "function" + and t ~= "nil" + and t ~= "userdata" + and _ ~= "_cmi_components" then + tmp[_] = self[_] + end + end + + --print('===== '..self.name..'\n'.. dump(tmp)..'\n=====\n') + return minetest.serialize(tmp) +end + + +-- activate mob and reload settings +local mob_activate = function(self, staticdata, def, dtime) + + -- remove monsters in peaceful mode + if self.type == "monster" + and peaceful_only then + + self.object:remove() + + return + end + + -- load entity variables + local tmp = minetest.deserialize(staticdata) + + if tmp then + for _,stat in pairs(tmp) do + self[_] = stat + end + end + + -- select random texture, set model and size + if not self.base_texture then + + -- compatiblity with old simple mobs textures + if type(def.textures[1]) == "string" then + def.textures = {def.textures} + end + + self.base_texture = def.textures[random(1, #def.textures)] + 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 + local textures = self.base_texture + 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 + and def.gotten_texture then + textures = def.gotten_texture + end + + -- specific mesh if gotten + if self.gotten == true + and def.gotten_mesh then + mesh = def.gotten_mesh + end + + -- set child objects to half size + if self.child == true then + + vis_size = { + x = self.base_size.x * .5, + y = self.base_size.y * .5, + } + + if def.child_texture then + textures = def.child_texture[1] + end + + colbox = { + self.base_colbox[1] * .5, + self.base_colbox[2] * .5, + self.base_colbox[3] * .5, + self.base_colbox[4] * .5, + self.base_colbox[5] * .5, + self.base_colbox[6] * .5 + } + 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 + + -- 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 + + -- mob defaults + self.object:set_armor_groups({immortal = 1, fleshy = self.armor}) + self.old_y = self.object:get_pos().y + self.old_health = self.health + self.sounds.distance = self.sounds.distance or 10 + self.textures = textures + self.mesh = mesh + self.collisionbox = colbox + self.selectionbox = selbox + self.visual_size = vis_size + self.standing_in = "air" + + -- check existing nametag + if not self.nametag then + self.nametag = def.nametag + end + + -- set anything changed above + self.object:set_properties(self) + set_yaw(self, (random(0, 360) - 180) / 180 * pi, 6) + 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 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) + 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 + + -- get node at foot level every quarter second + self.node_timer = (self.node_timer or 0) + dtime + + if self.node_timer > 0.25 then + + self.node_timer = 0 + + local y_level = self.collisionbox[2] + + if self.child then + y_level = self.collisionbox[2] * 0.5 + end + + -- 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) + end + + -- check if falling, flying, floating + falling(self, 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 + + 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 + + -- end rotation + + -- knockback timer + if self.pause_timer > 0 then + + self.pause_timer = self.pause_timer - dtime + + return + end + + -- run custom function (defined in mob lua file) + if self.do_custom then + + -- when false skip going any further + if self.do_custom(self, dtime) == false then + return + end + end + + -- attack timer + self.timer = self.timer + dtime + + if self.state ~= "attack" then + + if self.timer < 1 then + return + end + + self.timer = 0 + end + + -- never go over 100 + if self.timer > 100 then + self.timer = 1 + end + + -- mob plays random sound at times + if random(1, 100) == 1 then + mob_sound(self, self.sounds.random) + end + + -- environmental damage timer (every 1 second) + self.env_damage_timer = self.env_damage_timer + dtime + + if (self.state == "attack" and self.env_damage_timer > 1) + or self.state ~= "attack" then + + self.env_damage_timer = 0 + + -- check for environmental damage (water, fire, lava etc.) + do_env_damage(self) + + -- node replace check (cow eats grass etc.) + replace(self, pos) + end + + monster_attack(self) + + npc_attack(self) + + breed(self) + + follow_flop(self) + + do_states(self, dtime) + + do_jump(self) + + runaway_from(self) + +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 + + +mobs.spawning_mobs = {} + +-- register mob entity +function mobs:register_mob(name, def) + + mobs.spawning_mobs[name] = true + +minetest.register_entity(name, { + + stepheight = def.stepheight or 1.1, -- was 0.6 + 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 "", + on_die = def.on_die, + do_custom = def.do_custom, + jump_height = def.jump_height or 4, -- was 6 + 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 + 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 or {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, + selectionbox = def.selectionbox or def.collisionbox, + visual = def.visual, + visual_size = def.visual_size or {x = 1, y = 1}, + 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, + 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, + on_rightclick = def.on_rightclick, + arrow = def.arrow, + shoot_interval = def.shoot_interval, + sounds = def.sounds or {}, + 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 ~= false, + 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 + replace_rate = def.replace_rate, + replace_what = def.replace_what, + replace_with = def.replace_with, + replace_offset = def.replace_offset or 0, + on_replace = def.on_replace, + timer = 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, + 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, + runaway = def.runaway, + runaway_timer = 0, + pathfinding = def.pathfinding, + immune_to = def.immune_to or {}, + explosion_radius = def.explosion_radius, + explosion_damage_radius = def.explosion_damage_radius, + explosion_timer = def.explosion_timer or 3, + allow_fuse_reset = def.allow_fuse_reset ~= false, + stop_to_explode = def.stop_to_explode ~= false, + 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, + 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_breed = def.on_breed, + + on_grown = def.on_grown, + + on_activate = function(self, staticdata, dtime) + return mob_activate(self, staticdata, def, dtime) + end, + + get_staticdata = function(self) + return mob_staticdata(self) + end, + +}) + +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) + + for n = 1, #objs do + + if not objs[n]:is_player() then + + local obj = 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 + end + end + end + + return num_type, num_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 + + +local function player_near(pos, radius) + + local objs = minetest.get_objects_inside_radius(pos, radius) + + for n = 1, #objs do + + if objs[n]:is_player() then + return true + end + end + + return false +end + + +local function daycheck(day_toggle) + + if day_toggle ~= nil then + + local tod = (minetest.get_timeofday() or 0) * 24000 + + if tod > 4500 and tod < 19500 then + + if day_toggle == false then + return false -- mob requires night + end + else + if day_toggle == true then + return false -- mob requires day + end + end + end + + return true -- mob doesn't care +end + + +local function is_protected(pos) + + if not spawn_protected + and minetest.is_protected(pos, "") then + return true -- protected area + end + + return false -- mobs can spawn +end + + +local interval = 30 +local timer = 0 +local spawning_mobs = {} + +minetest.register_globalstep(function(dtime) + + if not mobs_spawn then + return + end + + timer = timer + dtime + if timer < interval then + return + end + timer = 0 + + for _,player in ipairs(minetest.get_connected_players()) do + + if player:get_hp() > 0 then + + local pos = player:getpos() + local area, pos2, light, obj, base + + for _,mob in ipairs(spawning_mobs) do + + area = nil + + if minetest.registered_entities[mob.name] + and random(1, mob.chance) == 1 then + + area = minetest.find_nodes_in_area_under_air( + {x = pos.x - 20, y = pos.y - 20, z = pos.z - 20}, + {x = pos.x + 20, y = pos.y + 20, z = pos.z + 20}, + mob.nodes) + end + + if area and #area > 0 then + + pos2 = area[math.random(1, #area)] + base = minetest.registered_entities[mob.name].collisionbox[5] + pos2.y = pos2.y + 1 + base + + light = minetest.get_node_light(pos2) or -1 + + if pos2.y >= mob.min_height + and pos2.y <= mob.max_height + and light >= mob.min_light + and light <= mob.max_light + and daycheck(mob.day_toggle) + and minetest.find_node_near(pos2, 1, mob.neighbors) + and count_mobs(pos2, mob.name) < mob.total + and not player_near(pos2, 10) + and not is_protected(pos2) then + +print ("--- Spawned ", mob.name, minetest.pos_to_string(pos2), mob.chance) + + obj = minetest.add_entity(pos2, mob.name) + + if mob.on_spawn then + mob.on_spawn(obj:get_luaentity(), pos2) + end + else +print ("--- Cannot spawn ", mob.name) + end + end + end + end + end +end) + + +function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, + interval, chance, aoc, min_height, max_height, day_toggle, on_spawn) + + -- chance/spawn number override in minetest.conf for registered mob + local numbers = minetest.settings:get(name) + + if numbers then + numbers = numbers:split(",") + chance = tonumber(numbers[1]) or chance + aoc = tonumber(numbers[2]) or aoc + + if chance == 0 then + minetest.log("warning", string.format("[mobs] %s has spawning disabled", name)) + return + end + + minetest.log("action", + string.format("[mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc)) + end + + -- change old chance values to be more useable by new spawn routine + if chance > 999 then + chance = max(1, chance / 1000) + end + + -- adjust for mob chance multiplier + chance = max(1, chance * mob_chance_multiplier) + + -- add mob to table for spawning with routine above + table.insert(spawning_mobs, { + name = name, + nodes = nodes, + neighbors = neighbors, + chance = chance, + min_height = min_height, + max_height = max_height, + min_light = min_light, + max_light = max_light, + total = aoc, + day_toggle = day_toggle, + on_spawn = on_spawn, + }) +end + + +-- compatibility with older mob registration +function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_object_count, max_height, day_toggle) + + mobs:spawn_specific(name, nodes, {"air"}, min_light, max_light, 30, + chance, active_object_count, -31000, max_height, day_toggle) +end + + +-- MarkBu's spawn function +function mobs:spawn(def) + + 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 + + +-- register arrow for shoot attack +function mobs:register_arrow(name, def) + + if not name or not def then return end -- errorcheck + + minetest.register_entity(name, { + + physical = false, + visual = def.visual, + visual_size = def.visual_size, + textures = def.textures, + velocity = def.velocity, + hit_player = def.hit_player, + 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 + timer = 0, + switch = 0, + owner_id = def.owner_id, + rotate = def.rotate, + automatic_face_movement_dir = def.rotate + and (def.rotate - (pi / 180)) or false, + + on_activate = def.on_activate, + + on_step = def.on_step or function(self, dtime) + + self.timer = self.timer + 1 + + local pos = self.object:get_pos() + + if self.switch == 0 + or self.timer > 150 + or not within_limits(pos, 0) then + + self.object:remove() ; -- print ("removed arrow") + + return + end + + -- does arrow have a tail (fireball) + if def.tail + and def.tail == 1 + and def.tail_texture then + + minetest.add_particle({ + pos = pos, + velocity = {x = 0, y = 0, z = 0}, + acceleration = {x = 0, y = 0, z = 0}, + expirationtime = def.expire or 0.25, + collisiondetection = false, + texture = def.tail_texture, + size = def.tail_size or 5, + glow = def.glow or 0, + }) + end + + if self.hit_node then + + local node = node_ok(pos).name + + if minetest.registered_nodes[node].walkable then + + self.hit_node(self, pos, node) + + if self.drop == true then + + pos.y = pos.y + 1 + + self.lastpos = (self.lastpos or pos) + + minetest.add_item(self.lastpos, self.object:get_luaentity().name) + end + + self.object:remove() ; -- print ("hit node") + + return + end + end + + if self.hit_player or self.hit_mob then + + for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.0)) do + + if self.hit_player + and player:is_player() then + + self.hit_player(self, player) + self.object:remove() ; -- print ("hit player") + return + end + + local entity = player:get_luaentity() + + if entity + and self.hit_mob + and entity._cmi_is_mob == true + and tostring(player) ~= self.owner_id + and entity.name ~= self.object:get_luaentity().name then + + self.hit_mob(self, player) + + self.object:remove() ; --print ("hit mob") + + return + end + end + end + + self.lastpos = pos + end + }) +end + + +-- 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 = {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 + end + + local invimg = background + + if addegg == 1 then + invimg = "mobs_chicken_egg.png^(" .. invimg .. + "^[mask:mobs_chicken_egg_overlay.png)" + end + + -- register new spawn egg containing mob information + minetest.register_craftitem(mob .. "_set", { + + description = S("@1 (Tamed)", desc), + inventory_image = invimg, + groups = {spawn_egg = 2, not_in_creative_inventory = 1}, + stack_max = 1, + + on_place = function(itemstack, placer, pointed_thing) + + local pos = pointed_thing.above + + -- am I clicking on something with existing on_rightclick function? + local under = minetest.get_node(pointed_thing.under) + local def = minetest.registered_nodes[under.name] + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, under, placer, itemstack) + 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 + 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() + + -- set owner if not a monster + if ent.type ~= "monster" then + ent.owner = placer:get_player_name() + ent.tamed = true + end + + -- since mob is unique we remove egg once spawned + itemstack:take_item() + end + + return itemstack + end, + }) + + + -- register old stackable mob egg + minetest.register_craftitem(mob, { + + description = desc, + inventory_image = invimg, + groups = grp, + + on_place = function(itemstack, placer, pointed_thing) + + local pos = pointed_thing.above + + -- am I clicking on something with existing on_rightclick function? + local under = minetest.get_node(pointed_thing.under) + local def = minetest.registered_nodes[under.name] + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, under, placer, itemstack) + 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 + return + end + + pos.y = pos.y + 1 + + local mob = minetest.add_entity(pos, mob) + local ent = mob:get_luaentity() + + -- 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 mobs.is_creative(placer:get_player_name()) then + itemstack:take_item() + end + end + + return itemstack + end, + }) + +end + + +-- capture critter (thanks to blert2112 for idea) +function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, force_take, replacewith) + + if self.child + or not clicker:is_player() + or not clicker:get_inventory() then + return false + end + + -- get name of clicked mob + local mobname = self.name + + -- if not nil change what will be added to inventory + if replacewith then + mobname = replacewith + end + + local name = clicker:get_player_name() + local tool = clicker:get_wielded_item() + + -- 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:lasso" then + return false + end + + -- is mob tamed? + if self.tamed == false + and force_take == false then + + minetest.chat_send_player(name, S("Not tamed!")) + + return true -- false + end + + -- cannot pick up if not owner + if self.owner ~= name + and force_take == false then + + minetest.chat_send_player(name, S("@1 is owner!", self.owner)) + + return true -- false + end + + if clicker:get_inventory():room_for_item("main", mobname) then + + -- was mob clicked with hand, net, or lasso? + local chance = 0 + + if tool:get_name() == "" then + chance = chance_hand + + elseif tool:get_name() == "mobs:net" then + + chance = chance_net + + tool:add_wear(4000) -- 17 uses + + clicker:set_wielded_item(tool) + + elseif tool:get_name() == "mobs:lasso" then + + chance = chance_lasso + + tool:add_wear(650) -- 100 uses + + clicker:set_wielded_item(tool) + + end + + -- calculate chance.. add to inventory if successful? + if chance > 0 and random(1, 100) <= chance then + + -- default mob egg + local new_stack = ItemStack(mobname) + + -- add special mob egg with all mob information + -- unless 'replacewith' contains new item to use + if not replacewith then + + new_stack = ItemStack(mobname .. "_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) + end + + 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() + + mob_sound(self, "default_place_node_hard") + + elseif chance ~= 0 then + minetest.chat_send_player(name, S("Missed!")) + + mob_sound(self, "mobs_swing") + end + end + + return true +end + + +-- protect tamed mob with rune item +function mobs:protect(self, clicker) + + local name = clicker:get_player_name() + local tool = clicker:get_wielded_item() + + if tool:get_name() ~= "mobs:protector" then + return false + end + + if self.tamed == false then + minetest.chat_send_player(name, S("Not tamed!")) + return true -- false + end + + if self.protected == true then + minetest.chat_send_player(name, S("Already protected!")) + return true -- false + end + + 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 + + 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 + + +local mob_obj = {} +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 not in creative then take item + if not mobs.is_creative(clicker:get_player_name()) then + + local item = clicker:get_wielded_item() + + item:take_item() + + clicker:set_wielded_item(item) + end + + -- increase health + self.health = self.health + 4 + + if self.health >= self.hp_max then + + self.health = self.hp_max + + if self.htimer < 1 then + + minetest.chat_send_player(clicker:get_player_name(), + S("@1 at full health (@2)", + self.name:split(":")[2], tostring(self.health))) + + self.htimer = 5 + end + end + + self.object:set_hp(self.health) + + update_tag(self) + + -- make children grow quicker + if self.child == true then + + self.hornytimer = self.hornytimer + 20 + + return true + end + + -- feed and tame + self.food = (self.food or 0) + 1 + if self.food >= feed_count then + + self.food = 0 + + if breed and self.hornytimer == 0 then + self.horny = true + end + + self.gotten = false + + if tame then + + if self.tamed == false then + minetest.chat_send_player(clicker:get_player_name(), + S("@1 has been tamed!", + self.name:split(":")[2])) + end + + self.tamed = true + + if not self.owner or self.owner == "" then + self.owner = clicker:get_player_name() + end + end + + -- make sound when fed so many times + mob_sound(self, self.sounds.random) + end + + return true + end + + local item = clicker:get_wielded_item() + + -- if mob has been tamed you can name it with a nametag + if item:get_name() == "mobs:nametag" + and clicker:get_player_name() == self.owner then + + local name = clicker:get_player_name() + + -- store mob and nametag stack in external variables + mob_obj[name] = self + mob_sta[name] = item + + local tag = self.nametag or "" + + minetest.show_formspec(name, "mobs_nametag", "size[8,4]" + .. default.gui_bg + .. default.gui_bg_img + .. "field[0.5,1;7.5,0;name;" .. minetest.formspec_escape(S("Enter name:")) .. ";" .. tag .. "]" + .. "button_exit[2.5,3.5;3,1;mob_rename;" .. minetest.formspec_escape(S("Rename")) .. "]") + end + + return false +end + + +-- inspired by blockmen's nametag mod +minetest.register_on_player_receive_fields(function(player, formname, fields) + + -- right-clicked with nametag and name entered? + if formname == "mobs_nametag" + and fields.name + and fields.name ~= "" then + + local name = player:get_player_name() + + if not mob_obj[name] + or not mob_obj[name].object then + 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) + end + + -- update nametag + mob_obj[name].nametag = fields.name + + update_tag(mob_obj[name]) + + -- if not in creative then take item + if not mobs.is_creative(name) then + + mob_sta[name]:take_item() + + player:set_wielded_item(mob_sta[name]) + end + + -- reset external variables + mob_obj[name] = nil + mob_sta[name] = nil + end +end) + + +-- compatibility function for old entities to new modpack entities +function mobs:alias_mob(old_name, new_name) + + -- spawn egg + minetest.register_alias(old_name, new_name) + + -- entity + minetest.register_entity(":" .. old_name, { + + physical = false, + + on_step = function(self) + + if minetest.registered_entities[new_name] then + minetest.add_entity(self.object:get_pos(), new_name) + end + + self.object:remove() + end + }) +end diff --git a/mods/Mobs/mobs/api.txt b/mods/Mobs/mobs/api.txt new file mode 100644 index 0000000..74e99db --- /dev/null +++ b/mods/Mobs/mobs/api.txt @@ -0,0 +1,722 @@ + +Mobs Redo API +============= + +Welcome to the world of mobs in minetest and hopefully an easy guide to defining +your own mobs and having them appear in your worlds. + + +Registering Mobs +---------------- + +To register a mob and have it ready for use requires the following function: + + mobs:register_mob(name, definition) + +The 'name' of a mob usually starts with the mod name it's running from followed +by it's own name e.g. + + "mobs_monster:sand_monster" or "mymod:totally_awesome_beast" + +... and the 'definition' is a table which holds all of the settings and +functions needed for the mob to work properly which contains the following: + + 'nametag' contains the name which is shown above mob. + 'type' holds the type of mob that inhabits your world e.g. + "animal" usually docile and walking around. + "monster" attacks player or npc on sight. + "npc" walk around and will defend themselves if hit first, they + kill monsters. + 'hp_min' has the minimum health value the mob can spawn with. + 'hp_max' has the maximum health value the mob can spawn with. + 'armor' holds strength of mob, 100 is normal, lower is more powerful + and needs more hits and better weapons to kill. + 'passive' when true allows animals to defend themselves when hit, + otherwise they amble onwards. + 'walk_velocity' is the speed that your mob can walk around. + 'run_velocity' is the speed your mob can run with, usually when attacking. + 'walk_chance' has a 0-100 chance value your mob will walk from standing, + set to 0 for jumping mobs only. + 'jump' when true allows your mob to jump updwards. + 'jump_height' holds the height your mob can jump, 0 to disable jumping. + 'stepheight' height of a block that your mob can easily walk up onto, + defaults to 1.1. + 'fly' when true allows your mob to fly around instead of walking. + 'fly_in' holds the node name that the mob flies (or swims) around + in e.g. "air" or "default:water_source". + 'runaway' if true causes animals to turn and run away when hit. + 'view_range' how many nodes in distance the mob can see a player. + 'damage' how many health points the mob does to a player or another + mob when melee attacking. + 'knock_back' when true has mobs falling backwards when hit, the greater + the damage the more they move back. + 'fear_height' is how high a cliff or edge has to be before the mob stops + walking, 0 to turn off height fear. + 'fall_speed' has the maximum speed the mob can fall at, default is -10. + 'fall_damage' when true causes falling to inflict damage. + 'water_damage' holds the damage per second infliced to mobs when standing in + water. + 'lava_damage' holds the damage per second inflicted to mobs when standing + in lava or fire. + 'light_damage' holds the damage per second inflicted to mobs when it's too + bright (above 13 light). + 'suffocation' when true causes mobs to suffocate inside solid blocks. + 'floats' when set to 1 mob will float in water, 0 has them sink. + 'follow' mobs follow player when holding any of the items which appear + on this table, the same items can be fed to a mob to tame or + breed e.g. {"farming:wheat", "default:apple"} + + 'reach' is how far the mob can attack player when standing + nearby, default is 3 nodes. + 'docile_by_day' when true has mobs wandering around during daylight + hours and only attacking player at night or when + provoked. + 'attack_monsters' when true mob will attack monsters. + 'attack_animals' when true mob will attack animals. + 'attack_npcs' when true mob will attack npcs within range. + 'attack_players' when true mob will attack players nearby. + 'owner_loyal' when true non-docile tamed mobs attack anything player + punches when nearby. + 'group_attack' when true has same mob type grouping together to attack + offender. + 'attack_type' tells the api what a mob does when attacking the player + or another mob: + 'dogfight' is a melee attack when player is within mob reach. + 'shoot' has mob shoot pre-defined arrows at player when inside + view_range. + 'dogshoot' has melee attack when inside reach and shoot attack + when inside view_range. + 'explode' causes mob to stop and explode when inside reach. + 'explosion_radius' the radius of explosion node destruction, + defaults to 1 + 'explosion_damage_radius' the radius of explosion entity & player damage, + defaults to explosion_radius * 2 + 'explosion_timer' number of seconds before mob explodes while its target + is still inside reach or explosion_damage_radius, + defaults to 3. + 'allow_fuse_reset' Allow 'explode' attack_type to reset fuse and resume + chasing if target leaves the blast radius or line of + sight. Defaults to true. + 'stop_to_explode' When set to true (default), mob must stop and wait for + explosion_timer in order to explode. If false, mob will + continue chasing. + 'arrow' holds the pre-defined arrow object to shoot when + attacking. + 'dogshoot_switch' allows switching between attack types by using timers + (1 for shoot, 2 for dogfight) + 'dogshoot_count_max' contains how many seconds before switching from + dogfight to shoot. + 'dogshoot_count2_max' contains how many seconds before switching from shoot + to dogfight. + 'shoot_interval' has the number of seconds between shots. + 'shoot_offset' holds the y position added as to where the + arrow/fireball appears on mob. + 'specific_attack' has a table of entity names that mob can also attack + e.g. {"player", "mobs_animal:chicken"}. + 'runaway_from' contains a table with mob names to run away from, add + "player" to list to runaway from player also. + 'blood_amount' contains the number of blood droplets to appear when + mob is hit. + 'blood_texture' has the texture name to use for droplets e.g. + "mobs_blood.png", or table {"blood1.png", "blood2.png"} + 'pathfinding' set to 1 for mobs to use pathfinder feature to locate + player, set to 2 so they can build/break also (only + works with dogfight attack and when 'mobs_griefing' + in minetest.conf is not false). + 'immune_to' is a table that holds specific damage when being hit by + certain items e.g. + {"default:sword_wood", 0} -- causes no damage. + {"default:gold_lump", -10} -- heals by 10 health points. + {"default:coal_block", 20} -- 20 damage when hit on head with coal blocks. + {"all"} -- stops all weapons causing damage apart from those on list. + + 'makes_footstep_sound' when true you can hear mobs walking. + 'sounds' this is a table with sounds of the mob + 'distance' maximum distance sounds can be heard, default is 10. + 'random' random sound that plays during gameplay. + 'war_cry' what you hear when mob starts to attack player. + 'attack' what you hear when being attacked. + 'shoot_attack' sound played when mob shoots. + 'damage' sound heard when mob is hurt. + 'death' played when mob is killed. + 'jump' played when mob jumps. + 'fuse' sound played when mob explode timer starts. + 'explode' sound played when mob explodes. + + 'drops' table of items that are dropped when mob is killed, fields are: + 'name' name of item to drop. + 'chance' chance of drop, 1 for always, 2 for 1-in-2 chance etc. + 'min' minimum number of items dropped. + 'max' maximum number of items dropped. + + 'visual' holds the look of the mob you wish to create: + 'cube' looks like a normal node + 'sprite' sprite which looks same from all angles. + 'upright_sprite' flat model standing upright. + 'wielditem' how it looks when player holds it in hand. + 'mesh' uses separate object file to define mob. + 'visual_size' has the size of the mob, defaults to {x = 1, y = 1} + 'collisionbox' has the box in which mob can be interacted with the + world e.g. {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5} + 'selectionbox' has the box in which player can interact with mob + 'textures' holds a table list of textures to be used for mob, or you + could use multiple lists inside another table for random + selection e.g. { {"texture1.png"}, {"texture2.png"} } + 'child_texture' holds the texture table for when baby mobs are used. + 'gotten_texture' holds the texture table for when self.gotten value is + true, used for milking cows or shearing sheep. + 'mesh' holds the name of the external object used for mob model + e.g. "mobs_cow.b3d" + 'gotten_mesh" holds the name of the external object used for when + self.gotten is true for mobs. + 'rotate' custom model rotation, 0 = front, 90 = side, 180 = back, + 270 = other side. + 'double_melee_attack' when true has the api choose between 'punch' and + 'punch2' animations. + + 'animation' holds a table containing animation names and settings for use with mesh models: + 'stand_start' start frame for when mob stands still. + 'stand_end' end frame of stand animation. + 'stand_speed' speed of animation in frames per second. + 'walk_start' when mob is walking around. + 'walk_end' + 'walk_speed' + 'run_start' when a mob runs or attacks. + 'run_end' + 'run_speed' + 'fly_start' when a mob is flying. + 'fly_end' + 'fly_speed' + 'punch_start' when a mob melee attacks. + 'punch_end' + 'punch_speed' + 'punch2_start' alternative melee attack animation. + 'punch2_end' + 'punch2_speed' + 'shoot_start' shooting animation. + 'shoot_end' + 'shoot_speed' + 'die_start' death animation + 'die_end' + 'die_speed' + 'die_loop' when set to false stops the animation looping. + + Using '_loop = false' setting will stop any of the above animations from + looping. + + 'speed_normal' is used for animation speed for compatibility with some + older mobs. + + +Node Replacement +---------------- + +Mobs can look around for specific nodes as they walk and replace them to mimic +eating. + + 'replace_what' group of items to replace e.g. + {"farming:wheat_8", "farming:carrot_8"} + or you can use the specific options of what, with and + y offset by using this instead: + { + {"group:grass", "air", 0}, + {"default:dirt_with_grass", "default:dirt", -1} + } + 'replace_with' replace with what e.g. "air" or in chickens case "mobs:egg" + 'replace_rate' how random should the replace rate be (typically 10) + 'replace_offset' +/- value to check specific node to replace + + 'on_replace(self, pos, oldnode, newnode)' is called when mob is about to + replace a node. + 'self' ObjectRef of mob + 'pos' Position of node to replace + 'oldnode' Current node + 'newnode' What the node will become after replacing + + If false is returned, the mob will not replace the node. + + By default, replacing sets self.gotten to true and resets the object + properties. + + +Custom Definition Functions +--------------------------- + +Along with the above mob registry settings we can also use custom functions to +enhance mob functionality and have them do many interesting things: + + 'on_die' a function that is called when the mob is killed the + parameters are (self, pos) + 'on_rightclick' its same as in minetest.register_entity() + 'on_blast' is called when an explosion happens near mob when using TNT + functions, parameters are (object, damage) and returns + (do_damage, do_knockback, drops) + 'on_spawn' is a custom function that runs on mob spawn with 'self' as + variable, return true at end of function to run only once. + 'after_activate' is a custom function that runs once mob has been activated + with these paramaters (self, staticdata, def, dtime) + 'on_breed' called when two similar mobs breed, paramaters are + (parent1, parent2) objects, return false to stop child from + being resized and owner/tamed flags and child textures being + applied. Function itself must spawn new child mob. + 'on_grown' is called when a child mob has grown up, only paramater is + (self). + 'do_punch' called when mob is punched with paramaters (self, hitter, + time_from_last_punch, tool_capabilities, direction), return + false to stop punch damage and knockback from taking place. + 'custom_attack' when set this function is called instead of the normal mob + melee attack, parameters are (self, to_attack). + 'on_die' a function that is called when mob is killed (self, pos) + 'do_custom' a custom function that is called every tick while mob is + active and which has access to all of the self.* variables + e.g. (self.health for health or self.standing_in for node + status), return with 'false' to skip remainder of mob API. + + +Internal Variables +------------------ + +The mob api also has some preset variables and functions that it will remember +for each mob. + + 'self.health' contains current health of mob (cannot exceed + self.hp_max) + 'self.texture_list' contains list of all mob textures + 'self.child_texture' contains mob child texture when growing up + 'self.base_texture' contains current skin texture which was randomly + selected from textures list + 'self.gotten' this is used for obtaining milk from cow and wool from + sheep + 'self.horny' when animal fed enough it is set to true and animal can + breed with same animal + 'self.hornytimer' background timer that controls breeding functions and + mob childhood timings + 'self.child' used for when breeding animals have child, will use + child_texture and be half size + 'self.owner' string used to set owner of npc mobs, typically used for + dogs + 'self.order' set to "follow" or "stand" so that npc will follow owner + or stand it's ground + 'self.nametag' contains the name of the mob which it can show above + + +Spawning Mobs in World +---------------------- + +mobs:register_spawn(name, nodes, max_light, min_light, chance, + active_object_count, max_height, day_toggle) + +mobs:spawn_specfic(name, nodes, neighbors, min_light, max_light, interval, + chance, active_object_count, min_height, max_height, day_toggle, on_spawn) + +These functions register a spawn algorithm for the mob. Without this function +the call the mobs won't spawn. + + 'name' is the name of the animal/monster + 'nodes' is a list of nodenames on that the animal/monster can + spawn on top of + 'neighbors' is a list of nodenames on that the animal/monster will + spawn beside (default is {"air"} for + mobs:register_spawn) + 'max_light' is the maximum of light + 'min_light' is the minimum of light + 'interval' is same as in register_abm() (default is 30 for + mobs:register_spawn) + 'chance' is same as in register_abm() + 'active_object_count' number of this type of mob to spawn at one time inside + map area + 'min_height' is the minimum height the mob can spawn + 'max_height' is the maximum height the mob can spawn + 'day_toggle' true for day spawning, false for night or nil for + anytime + 'on_spawn' is a custom function which runs after mob has spawned + and gives self and pos values. + +A simpler way to handle mob spawns has been added with the mobs:spawn(def) +command which uses above names to make settings clearer: + + mobs:spawn({name = "mobs_monster:tree_monster", + nodes = {"group:leaves"}, + max_light = 7, + }) + + +For each mob that spawns with this function is a field in mobs.spawning_mobs. +It tells if the mob should spawn or not. Default is true. So other mods can +only use the API of this mod by disabling the spawning of the default mobs in +this mod. + + +mobs:spawn_abm_check(pos, node, name) + +This global function can be changed to contain additional checks for mobs to +spawn e.g. mobs that spawn only in specific areas and the like. By returning +true the mob will not spawn. + + 'pos' holds the position of the spawning mob + 'node' contains the node the mob is spawning on top of + 'name' is the name of the animal/monster + + +Making Arrows +------------- + +mobs:register_arrow(name, definition) + +This function registers a arrow for mobs with the attack type shoot. + + 'name' is the name of the arrow + 'definition' is a table with the following values: + 'visual' same is in minetest.register_entity() + 'visual_size' same is in minetest.register_entity() + 'textures' same is in minetest.register_entity() + 'velocity' the velocity of the arrow + 'drop' if set to true any arrows hitting a node will drop as item + 'hit_player' a function that is called when the arrow hits a player; + this function should hurt the player, the parameters are + (self, player) + 'hit_mob' a function that is called when the arrow hits a mob; + this function should hurt the mob, the parameters are + (self, player) + 'hit_node' a function that is called when the arrow hits a node, the + parameters are (self, pos, node) + 'tail' when set to 1 adds a trail or tail to mob arrows + 'tail_texture' texture string used for above effect + 'tail_size' has size for above texture (defaults to between 5 and 10) + 'expire' contains float value for how long tail appears for + (defaults to 0.25) + 'glow' has value for how brightly tail glows 1 to 10 (default is + 0 for no glow) + 'rotate' integer value in degrees to rotate arrow + 'on_step' is a custom function when arrow is active, nil for + default. + + +Spawn Eggs +---------- + +mobs:register_egg(name, description, background, addegg, no_creative) + +This function registers a spawn egg which can be used by admin to properly spawn in a mob. + + 'name' this is the name of your new mob to spawn e.g. "mob:sheep" + 'description' the name of the new egg you are creating e.g. "Spawn Sheep" + 'background' the texture displayed for the egg in inventory + 'addegg' would you like an egg image in front of your texture (1 = yes, + 0 = no) + 'no_creative' when set to true this stops spawn egg appearing in creative + mode for destructive mobs like Dungeon Masters. + + +Explosion Function +------------------ + +mobs:explosion(pos, radius) -- DEPRECATED!!! use mobs:boom() instead + +mobs:boom(self, pos, radius) + 'self' mob entity + 'pos' centre position of explosion + 'radius' radius of explosion (typically set to 3) + +This function generates an explosion which removes nodes in a specific radius +and damages any entity caught inside the blast radius. Protection will limit +node destruction but not entity damage. + + +Capturing Mobs +-------------- + +mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, + force_take, replacewith) + +This function is generally called inside the on_rightclick section of the mob +api code, it provides a chance of capturing the mob by hand, using the net or +lasso items, and can also have the player take the mob by force if tamed and +replace with another item entirely. + + 'self' mob information + 'clicker' player information + 'chance_hand' chance of capturing mob by hand (1 to 100) 0 to disable + 'chance_net' chance of capturing mob using net (1 to 100) 0 to disable + 'chance_lasso' chance of capturing mob using magic lasso (1 to 100) 0 to + disable + 'force_take' take mob by force, even if tamed (true or false) + 'replacewith' once captured replace mob with this item instead (overrides + new mob eggs with saved information) + + +Feeding and Taming/Breeding +--------------------------- + +mobs:feed_tame(self, clicker, feed_count, breed, tame) + +This function allows the mob to be fed the item inside self.follow be it apple, +wheat or whatever a set number of times and be tamed or bred as a result. +Will return true when mob is fed with item it likes. + + 'self' mob information + 'clicker' player information + 'feed_count' number of times mob must be fed to tame or breed + 'breed' true or false stating if mob can be bred and a child created + afterwards + 'tame' true or false stating if mob can be tamed so player can pick + them up + + +Protecting Mobs +--------------- + +mobs:protect(self, clicker) + +This function can be used to right-click any tamed mob with mobs:protector item, +this will protect the mob from harm inside of a protected area from other +players. Will return true when mob right-clicked with mobs:protector item. + + 'self' mob information + 'clicker' player information + + +Riding Mobs +----------- + +Mobs can now be ridden by players and the following shows its functions and +usage: + + +mobs:attach(self, player) + +This function attaches a player to the mob so it can be ridden. + + 'self' mob information + 'player' player information + + +mobs:detach(player, offset) + +This function will detach the player currently riding a mob to an offset +position. + + 'player' player information + 'offset' position table containing offset values + + +mobs:drive(self, move_animation, stand_animation, can_fly, dtime) + +This function allows an attached player to move the mob around and animate it at +same time. + + 'self' mob information + 'move_animation' string containing movement animation e.g. "walk" + 'stand_animation' string containing standing animation e.g. "stand" + 'can_fly' if true then jump and sneak controls will allow mob to fly + up and down + 'dtime' tick time used inside drive function + + +mobs:fly(self, dtime, speed, can_shoot, arrow_entity, move_animation, stand_animation) + +This function allows an attached player to fly the mob around using directional +controls. + + 'self' mob information + 'dtime' tick time used inside fly function + 'speed' speed of flight + 'can_shoot' true if mob can fire arrow (sneak and left mouse button + fires) + 'arrow_entity' name of arrow entity used for firing + 'move_animation' string containing name of pre-defined animation e.g. "walk" + or "fly" etc. + 'stand_animation' string containing name of pre-defined animation e.g. + "stand" or "blink" etc. + +Note: animation names above are from the pre-defined animation lists inside mob +registry without extensions. + + +mobs:set_animation(self, name) + +This function sets the current animation for mob, defaulting to "stand" if not +found. + + 'self' mob information + 'name' name of animation + + +Certain variables need to be set before using the above functions: + + 'self.v2' toggle switch used to define below values for the + first time + 'self.max_speed_forward' max speed mob can move forward + 'self.max_speed_reverse' max speed mob can move backwards + 'self.accel' acceleration speed + 'self.terrain_type' integer containing terrain mob can walk on + (1 = water, 2 or 3 = land) + 'self.driver_attach_at' position offset for attaching player to mob + 'self.driver_eye_offset' position offset for attached player view + 'self.driver_scale' sets driver scale for mobs larger than {x=1, y=1} + + +External Settings for "minetest.conf" +------------------------------------ + + 'enable_damage' if true monsters will attack players (default is true) + 'only_peaceful_mobs' if true only animals will spawn in game (default is + false) + 'mobs_disable_blood' if false blood effects appear when mob is hit (default + is false) + 'mobs_spawn_protected' if set to false then mobs will not spawn in protected + areas (default is true) + 'remove_far_mobs' if true then untamed mobs that are outside players + visual range will be removed (default is true) + 'mobname' can change specific mob chance rate (0 to disable) and + spawn number e.g. mobs_animal:cow = 1000,5 + 'mob_difficulty' sets difficulty level (health and hit damage + multiplied by this number), defaults to 1.0. + 'mob_show_health' if false then punching mob will not show health status + (true by default) + 'mob_chance_multiplier' multiplies chance of all mobs spawning and can be set + to 0.5 to have mobs spawn more or 2.0 to spawn less. + e.g. 1 in 7000 * 0.5 = 1 in 3500 so better odds of + spawning. + 'mobs_spawn' if false then mobs no longer spawn without spawner or + spawn egg. + 'mobs_drop_items' when false mobs no longer drop items when they die. + 'mobs_griefing' when false mobs cannot break blocks when using either + pathfinding level 2, replace functions or mobs:boom + function. + +Players can override the spawn chance for each mob registered by adding a line +to their minetest.conf file with a new value, the lower the value the more each +mob will spawn e.g. + +mobs_animal:sheep_chance 11000 +mobs_monster:sand_monster_chance 100 + + +Rideable Horse Example Mob +-------------------------- + +mobs:register_mob("mob_horse:horse", { + type = "animal", + visual = "mesh", + visual_size = {x = 1.20, y = 1.20}, + mesh = "mobs_horse.x", + collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.25, 0.4}, + animation = { + speed_normal = 15, + speed_run = 30, + stand_start = 25, + stand_end = 75, + walk_start = 75, + walk_end = 100, + run_start = 75, + run_end = 100, + }, + textures = { + {"mobs_horse.png"}, + {"mobs_horsepeg.png"}, + {"mobs_horseara.png"} + }, + fear_height = 3, + runaway = true, + fly = false, + walk_chance = 60, + view_range = 5, + follow = {"farming:wheat"}, + passive = true, + hp_min = 12, + hp_max = 16, + armor = 200, + lava_damage = 5, + fall_damage = 5, + water_damage = 1, + makes_footstep_sound = true, + drops = { + {name = "mobs:meat_raw", chance = 1, min = 2, max = 3} + }, + sounds = { + random = "horse_neigh.ogg", + damage = "horse_whinney.ogg", + }, + + do_custom = function(self, dtime) + + -- set needed values if not already present + if not self.v2 then + self.v2 = 0 + self.max_speed_forward = 6 + self.max_speed_reverse = 2 + self.accel = 6 + self.terrain_type = 3 + self.driver_attach_at = {x = 0, y = 20, z = -2} + self.driver_eye_offset = {x = 0, y = 3, z = 0} + self.driver_scale = {x = 1, y = 1} + end + + -- if driver present allow control of horse + if self.driver then + + mobs.drive(self, "walk", "stand", false, dtime) + + return false -- skip rest of mob functions + end + + return true + end, + + on_die = function(self, pos) + + -- drop saddle when horse is killed while riding + -- also detach from horse properly + if self.driver then + minetest.add_item(pos, "mobs:saddle") + mobs.detach(self.driver, {x = 1, y = 0, z = 1}) + end + + end, + + on_rightclick = function(self, clicker) + + -- make sure player is clicking + if not clicker or not clicker:is_player() then + return + end + + -- feed, tame or heal horse + if mobs:feed_tame(self, clicker, 10, true, true) then + return + end + + -- make sure tamed horse is being clicked by owner only + if self.tamed and self.owner == clicker:get_player_name() then + + local inv = clicker:get_inventory() + + -- detatch player already riding horse + if self.driver and clicker == self.driver then + + mobs.detach(clicker, {x = 1, y = 0, z = 1}) + + -- add saddle back to inventory + if inv:room_for_item("main", "mobs:saddle") then + inv:add_item("main", "mobs:saddle") + else + minetest.add_item(clicker.getpos(), "mobs:saddle") + end + + -- attach player to horse + elseif not self.driver + and clicker:get_wielded_item():get_name() == "mobs:saddle" then + + self.object:set_properties({stepheight = 1.1}) + mobs.attach(self, clicker) + + -- take saddle from inventory + inv:remove_item("main", "mobs:saddle") + end + end + + -- used to capture horse with magic lasso + mobs:capture_mob(self, clicker, 0, 0, 80, false, nil) + end +}) diff --git a/mods/Mobs/mobs/crafts.lua b/mods/Mobs/mobs/crafts.lua new file mode 100644 index 0000000..0bf42ad --- /dev/null +++ b/mods/Mobs/mobs/crafts.lua @@ -0,0 +1,184 @@ + +local S = mobs.intllib + +-- name tag +minetest.register_craftitem("mobs:nametag", { + description = S("Name Tag"), + inventory_image = "mobs_nametag.png", + groups = {flammable = 2}, +}) + +if minetest.get_modpath("dye") and minetest.get_modpath("farming") then + minetest.register_craft({ + type = "shapeless", + output = "mobs:nametag", + recipe = {"default:paper", "dye:black", "farming:string"}, + }) +end + +-- leather +minetest.register_craftitem("mobs:leather", { + description = S("Leather"), + inventory_image = "mobs_leather.png", + groups = {flammable = 2}, +}) + +-- raw meat +minetest.register_craftitem("mobs:meat_raw", { + description = S("Raw Meat"), + inventory_image = "mobs_meat_raw.png", + on_use = minetest.item_eat(3), + groups = {food_meat_raw = 1, flammable = 2}, +}) + +-- cooked meat +minetest.register_craftitem("mobs:meat", { + description = S("Meat"), + inventory_image = "mobs_meat.png", + on_use = minetest.item_eat(8), + groups = {food_meat = 1, flammable = 2}, +}) + +minetest.register_craft({ + type = "cooking", + output = "mobs:meat", + recipe = "mobs:meat_raw", + cooktime = 5, +}) + +-- lasso +minetest.register_tool("mobs:lasso", { + description = S("Lasso (right-click animal to put in inventory)"), + inventory_image = "mobs_magic_lasso.png", + groups = {flammable = 2}, +}) + +if minetest.get_modpath("farming") then + minetest.register_craft({ + output = "mobs:lasso", + recipe = { + {"farming:string", "", "farming:string"}, + {"", "default:diamond", ""}, + {"farming:string", "", "farming:string"}, + } + }) +end + +minetest.register_alias("mobs:magic_lasso", "mobs:lasso") + +-- net +minetest.register_tool("mobs:net", { + description = S("Net (right-click animal to put in inventory)"), + inventory_image = "mobs_net.png", + groups = {flammable = 2}, +}) + +if minetest.get_modpath("farming") then + minetest.register_craft({ + output = "mobs:net", + recipe = { + {"group:stick", "", "group:stick"}, + {"group:stick", "", "group:stick"}, + {"farming:string", "group:stick", "farming:string"}, + } + }) +end + +-- shears (right click to shear animal) +minetest.register_tool("mobs:shears", { + description = S("Steel Shears (right-click to shear)"), + inventory_image = "mobs_shears.png", + groups = {flammable = 2}, +}) + +minetest.register_craft({ + output = 'mobs:shears', + recipe = { + {'', 'default:steel_ingot', ''}, + {'', 'group:stick', 'default:steel_ingot'}, + } +}) + +-- protection rune +minetest.register_craftitem("mobs:protector", { + description = S("Mob Protection Rune"), + inventory_image = "mobs_protector.png", + groups = {flammable = 2}, +}) + +minetest.register_craft({ + output = "mobs:protector", + recipe = { + {"default:stone", "default:stone", "default:stone"}, + {"default:stone", "default:goldblock", "default:stone"}, + {"default:stone", "default:stone", "default:stone"}, + } +}) + +-- saddle +minetest.register_craftitem("mobs:saddle", { + description = S("Saddle"), + inventory_image = "mobs_saddle.png", + groups = {flammable = 2}, +}) + +minetest.register_craft({ + output = "mobs:saddle", + recipe = { + {"mobs:leather", "mobs:leather", "mobs:leather"}, + {"mobs:leather", "default:steel_ingot", "mobs:leather"}, + {"mobs:leather", "default:steel_ingot", "mobs:leather"}, + } +}) + +-- mob fence (looks like normal fence but collision is 2 high) +default.register_fence("mobs:fence_wood", { + description = S("Mob Fence"), + texture = "default_wood.png", + material = "default:fence_wood", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 1.9, 0.5}, + }, + }, +}) + +-- items that can be used as fuel +minetest.register_craft({ + type = "fuel", + recipe = "mobs:nametag", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "mobs:lasso", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "mobs:net", + burntime = 8, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "mobs:leather", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "mobs:saddle", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "mobs:fence_wood", + burntime = 7, +}) diff --git a/mods/Mobs/mobs/depends.txt b/mods/Mobs/mobs/depends.txt new file mode 100644 index 0000000..2f20802 --- /dev/null +++ b/mods/Mobs/mobs/depends.txt @@ -0,0 +1,9 @@ +default +tnt? +dye? +farming? +invisibility? +intllib? +lucky_block? +cmi? +toolranks? diff --git a/mods/Mobs/mobs/description.txt b/mods/Mobs/mobs/description.txt new file mode 100644 index 0000000..919852a --- /dev/null +++ b/mods/Mobs/mobs/description.txt @@ -0,0 +1 @@ +Adds a mob api for mods to add animals or monsters etc. \ No newline at end of file diff --git a/mods/Mobs/mobs/init.lua b/mods/Mobs/mobs/init.lua new file mode 100644 index 0000000..f63fb16 --- /dev/null +++ b/mods/Mobs/mobs/init.lua @@ -0,0 +1,19 @@ + +local path = minetest.get_modpath("mobs") + +-- Mob API +dofile(path .. "/api.lua") + +-- Rideable Mobs +dofile(path .. "/mount.lua") + +-- Mob Items +dofile(path .. "/crafts.lua") + +-- Mob Spawner +dofile(path .. "/spawner.lua") + +-- Lucky Blocks +dofile(path .. "/lucky_block.lua") + +minetest.log("action", "[MOD] Mobs Redo loaded") diff --git a/mods/Mobs/mobs/intllib.lua b/mods/Mobs/mobs/intllib.lua new file mode 100644 index 0000000..6669d72 --- /dev/null +++ b/mods/Mobs/mobs/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/Mobs/mobs/license.txt b/mods/Mobs/mobs/license.txt new file mode 100644 index 0000000..fec6f6a --- /dev/null +++ b/mods/Mobs/mobs/license.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 TenPlus1 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/mods/Mobs/mobs/locale/de_DE.po b/mods/Mobs/mobs/locale/de_DE.po new file mode 100644 index 0000000..210990d --- /dev/null +++ b/mods/Mobs/mobs/locale/de_DE.po @@ -0,0 +1,131 @@ +# Mobs Redo translation. +# Copyright (C) 2017 TenPlus1 +# This file is distributed under the same license as the mobs package. +# Wuzzy , 2017 +# +msgid "" +msgstr "" +"Project-Id-Version: mobs\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-02 16:48+0200\n" +"PO-Revision-Date: 2017-07-02 14:27+0200\n" +"Last-Translator: Wuzzy \n" +"Language-Team: \n" +"Language: de_DE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: api.lua +msgid "** Peaceful Mode Active - No Monsters Will Spawn" +msgstr "" + +#: api.lua +msgid "Mob has been protected!" +msgstr "Kreatur wurde geschützt!" + +#: api.lua +msgid "@1 (Tamed)" +msgstr "@1 (Gezähmt)" + +#: api.lua +msgid "Not tamed!" +msgstr "Nicht gezähmt!" + +#: api.lua +msgid "@1 is owner!" +msgstr "@1 ist der Besitzer!" + +#: api.lua +msgid "Missed!" +msgstr "Daneben!" + +#: api.lua +msgid "Already protected!" +msgstr "Bereits geschützt!" + +#: api.lua +msgid "@1 at full health (@2)" +msgstr "@1 bei voller Gesundheit (@2)" + +#: api.lua +msgid "@1 has been tamed!" +msgstr "@1 wurde gezähmt!" + +#: api.lua +msgid "Enter name:" +msgstr "Namen eingeben:" + +#: api.lua +msgid "Rename" +msgstr "Umbenennen" + +#: crafts.lua +msgid "Name Tag" +msgstr "Namensschild" + +#: crafts.lua +msgid "Leather" +msgstr "Leder" + +#: crafts.lua +msgid "Raw Meat" +msgstr "Rohes Fleisch" + +#: crafts.lua +msgid "Meat" +msgstr "Fleisch" + +#: crafts.lua +msgid "Lasso (right-click animal to put in inventory)" +msgstr "Lasso (Rechtsklick auf Tier, um es zu nehmen)" + +#: crafts.lua +msgid "Net (right-click animal to put in inventory)" +msgstr "Netz (Rechtsklick auf Tier, um es zu nehmen)" + +#: crafts.lua +msgid "Steel Shears (right-click to shear)" +msgstr "Stahlschere (Rechtsklick zum Scheren)" + +#: crafts.lua +msgid "Mob Protection Rune" +msgstr "Kreaturschutzrune" + +#: crafts.lua +msgid "Saddle" +msgstr "Sattel" + +#: crafts.lua +msgid "Mob Fence" +msgstr "Kreaturen Zaun" + +#: spawner.lua +msgid "Mob Spawner" +msgstr "Kreaturenspawner" + +#: spawner.lua +msgid "Mob MinLight MaxLight Amount PlayerDist" +msgstr "Kreatur MinLicht MaxLicht Menge SpielerEntfng" + +#: spawner.lua +msgid "Spawner Not Active (enter settings)" +msgstr "Nicht aktiv (Einstellungen eingeben)" + +#: spawner.lua +msgid "Spawner Active (@1)" +msgstr "Spawner aktiv (@1)" + +#: spawner.lua +msgid "Mob Spawner settings failed!" +msgstr "Kreaturenspawner-Einstellungen gescheitert!" + +#: spawner.lua +msgid "" +"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " +"distance[1-20] y_offset[-10 to 10]”" +msgstr "" +"Syntax: „name min_licht[0-14] max_licht[0-14] max_mobs_im_gebiet[0 zum " +"Deaktivieren] distanz[1-20] y_versatz[-10 bis 10]“" diff --git a/mods/Mobs/mobs/locale/es.po b/mods/Mobs/mobs/locale/es.po new file mode 100644 index 0000000..849db66 --- /dev/null +++ b/mods/Mobs/mobs/locale/es.po @@ -0,0 +1,128 @@ +# Mobs Redo translation. +# Copyright (C) 2017 TenPlus1 +# This file is distributed under the same license as the mobs package. +# Wuzzy , 2017 +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-16 16:48+0200\n" +"PO-Revision-Date: 2017-07-16 16:48+0200\n" +"Last-Translator: Aleks \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: api.lua +msgid "** Peaceful Mode Active - No Monsters Will Spawn" +msgstr "" + +#: api.lua +msgid "Mob has been protected!" +msgstr "El mob ha sido protegido!" + +#: api.lua +msgid "@1 (Tamed)" +msgstr "@1 (Domesticado)" + +#: api.lua +msgid "Not tamed!" +msgstr "No domesticado!" + +#: api.lua +msgid "@1 is owner!" +msgstr "@1 es el dueño!" + +#: api.lua +msgid "Missed!" +msgstr "Perdido!" + +#: api.lua +msgid "Already protected!" +msgstr "Ya está protegido!" + +#: api.lua +msgid "@1 at full health (@2)" +msgstr "@1 con salud llena (@2)" + +#: api.lua +msgid "@1 has been tamed!" +msgstr "@1 ha sido domesticado!" + +#: api.lua +msgid "Enter name:" +msgstr "Ingrese nombre:" + +#: api.lua +msgid "Rename" +msgstr "Renombrar" + +#: crafts.lua +msgid "Name Tag" +msgstr "Nombrar etiqueta" + +#: crafts.lua +msgid "Leather" +msgstr "Cuero" + +#: crafts.lua +msgid "Raw Meat" +msgstr "Carne cruda" + +#: crafts.lua +msgid "Meat" +msgstr "Carne" + +#: crafts.lua +msgid "Lasso (right-click animal to put in inventory)" +msgstr "Lazo (click derecho en animal para colocar en inventario)" + +#: crafts.lua +msgid "Net (right-click animal to put in inventory)" +msgstr "Red (click derecho en animal para colocar en inventario)" + +#: crafts.lua +msgid "Steel Shears (right-click to shear)" +msgstr "Tijera de acero (click derecho para esquilar)" + +#: crafts.lua +msgid "Mob Protection Rune" +msgstr "Runa de protección de Mob" + +#: crafts.lua +msgid "Saddle" +msgstr "Montura" + +#: crafts.lua +msgid "Mob Fence" +msgstr "" + +#: spawner.lua +msgid "Mob Spawner" +msgstr "Generador de Mob" + +#: spawner.lua +msgid "Mob MinLight MaxLight Amount PlayerDist" +msgstr "Mob LuzMin LuzMax Cantidad DistJugador" + +#: spawner.lua +msgid "Spawner Not Active (enter settings)" +msgstr "Generador no activo (ingrese config)" + +#: spawner.lua +msgid "Spawner Active (@1)" +msgstr "Generador activo (@1)" + +#: spawner.lua +msgid "Mob Spawner settings failed!" +msgstr "Configuracion de generador de Mob falló!" + +#: spawner.lua +msgid "" +"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " +"distance[1-20] y_offset[-10 to 10]”" +msgstr "Sintaxis: “nombre luz_min[0-14] luz_max[0-14] max_mobs_en_area[0 para deshabilitar] " +"distancia[1-20] compensacion[-10 a 10]”" diff --git a/mods/Mobs/mobs/locale/fr.po b/mods/Mobs/mobs/locale/fr.po new file mode 100644 index 0000000..25b920c --- /dev/null +++ b/mods/Mobs/mobs/locale/fr.po @@ -0,0 +1,129 @@ +# 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-07-29 09:13+0200\n" +"PO-Revision-Date: 2017-07-29 09:20+0200\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 1.8.12\n" +"Last-Translator: fat115 \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Language: fr\n" + +#: api.lua +msgid "** Peaceful Mode Active - No Monsters Will Spawn" +msgstr "** Mode pacifique activé - Aucun monstre ne sera généré" + +#: api.lua +msgid "Mob has been protected!" +msgstr "L'animal a été protégé !" + +#: api.lua +msgid "@1 (Tamed)" +msgstr "@1 (apprivoisé)" + +#: api.lua +msgid "Not tamed!" +msgstr "Non-apprivoisé !" + +#: api.lua +msgid "@1 is owner!" +msgstr "Appartient à @1 !" + +#: api.lua +msgid "Missed!" +msgstr "Raté !" + +#: api.lua +msgid "Already protected!" +msgstr "Déjà protégé !" + +#: api.lua +msgid "@1 at full health (@2)" +msgstr "@1 est en pleine forme (@2) " + +#: api.lua +msgid "@1 has been tamed!" +msgstr "@1 a été apprivoisé ! " + +#: api.lua +msgid "Enter name:" +msgstr "Saisissez un nom :" + +#: api.lua +msgid "Rename" +msgstr "Renommer" + +#: crafts.lua +msgid "Name Tag" +msgstr "Étiquette pour collier" + +#: crafts.lua +msgid "Leather" +msgstr "Cuir" + +#: crafts.lua +msgid "Raw Meat" +msgstr "Viande crue" + +#: crafts.lua +msgid "Meat" +msgstr "Viande" + +#: crafts.lua +msgid "Lasso (right-click animal to put in inventory)" +msgstr "Lasso (clic droit sur l'animal pour le mettre dans l'inventaire)" + +#: crafts.lua +msgid "Net (right-click animal to put in inventory)" +msgstr "Filet (clic droit sur l'animal pour le mettre dans l'inventaire)" + +#: crafts.lua +msgid "Steel Shears (right-click to shear)" +msgstr "Ciseaux à laine (clic droit pour tondre)" + +#: crafts.lua +msgid "Mob Protection Rune" +msgstr "Rune de protection des animaux" + +#: crafts.lua +msgid "Saddle" +msgstr "Selle" + +#: crafts.lua +msgid "Mob Fence" +msgstr "Clôture à animaux" + +#: spawner.lua +msgid "Mob Spawner" +msgstr "Générateur de mob" + +#: spawner.lua +msgid "Mob MinLight MaxLight Amount PlayerDist" +msgstr "Mob MinLumière MaxLumière Quantité DistanceJoueur" + +#: spawner.lua +msgid "Spawner Not Active (enter settings)" +msgstr "Générateur non actif (entrez les paramètres)" + +#: spawner.lua +msgid "Spawner Active (@1)" +msgstr "Générateur actif (@1)" + +#: spawner.lua +msgid "Mob Spawner settings failed!" +msgstr "Echec des paramètres du générateur" + +#: spawner.lua +msgid "" +"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " +"distance[1-20] y_offset[-10 to 10]”" +msgstr "Syntaxe : “nom min_lumière[0-14] max_lumière[0-14] max_mobs_dans_zone[0 pour désactiver] distance[1-20] décalage_y[-10 à 10]“" diff --git a/mods/Mobs/mobs/locale/it.po b/mods/Mobs/mobs/locale/it.po new file mode 100644 index 0000000..a439f6d --- /dev/null +++ b/mods/Mobs/mobs/locale/it.po @@ -0,0 +1,131 @@ +# ITALIAN LOCALE FILE FOR THE MOBS REDO MODULE +# Copyright (c) 2014 Krupnov Pavel and 2016 TenPlus1 +# This file is distributed under the same license as the MOBS REDO package. +# Hamlet , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Italian locale file for the Mobs Redo module\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-02 16:48+0200\n" +"PO-Revision-Date: 2017-08-18 12:18+0100\n" +"Last-Translator: H4mlet \n" +"Language-Team: \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" + +#: api.lua +msgid "** Peaceful Mode Active - No Monsters Will Spawn" +msgstr "" + +#: api.lua +msgid "Mob has been protected!" +msgstr "Il mob è stato protetto!" + +#: api.lua +msgid "@1 (Tamed)" +msgstr "@1 (Addomesticat*)" + +#: api.lua +msgid "Not tamed!" +msgstr "Non addomesticat*!" + +#: api.lua +msgid "@1 is owner!" +msgstr "Proprietari* @1!" + +#: api.lua +msgid "Missed!" +msgstr "Mancat*!" + +#: api.lua +msgid "Already protected!" +msgstr "Già protett*!" + +#: api.lua +msgid "@1 at full health (@2)" +msgstr "@1 in piena salute (@2)" + +#: api.lua +msgid "@1 has been tamed!" +msgstr "@1 è stat* addomesticat*!" + +#: api.lua +msgid "Enter name:" +msgstr "Inserire il nome:" + +#: api.lua +msgid "Rename" +msgstr "Rinominare" + +#: crafts.lua +msgid "Name Tag" +msgstr "Targhetta" + +#: crafts.lua +msgid "Leather" +msgstr "Pelle" + +#: crafts.lua +msgid "Raw Meat" +msgstr "Carne cruda" + +#: crafts.lua +msgid "Meat" +msgstr "Carne" + +#: crafts.lua +msgid "Lasso (right-click animal to put in inventory)" +msgstr "Lazo (click di destro per mettere l'animale nell'inventario)" + +#: crafts.lua +msgid "Net (right-click animal to put in inventory)" +msgstr "Rete (click destro per mettere l'animale nell'inventario)" + +#: crafts.lua +msgid "Steel Shears (right-click to shear)" +msgstr "Cesoie d'acciaio (click destro per tosare)" + +#: crafts.lua +msgid "Mob Protection Rune" +msgstr "Runa di protezione per mob" + +#: crafts.lua +msgid "Saddle" +msgstr "Sella" + +#: crafts.lua +msgid "Mob Fence" +msgstr "" + +#: spawner.lua +msgid "Mob Spawner" +msgstr "Generatore di mob" + +#: spawner.lua +msgid "Mob MinLight MaxLight Amount PlayerDist" +msgstr "Mob LuceMin LuceMax Ammontare DistGiocat." + +#: spawner.lua +msgid "Spawner Not Active (enter settings)" +msgstr "Generatore inattivo (inserire le impostazioni)" + +#: spawner.lua +msgid "Spawner Active (@1)" +msgstr "Generatore attivo (@1)" + +#: spawner.lua +msgid "Mob Spawner settings failed!" +msgstr "Impostazioni del generatore di mob fallite!" + +#: spawner.lua +msgid "" +"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " +"distance[1-20] y_offset[-10 to 10]”" +msgstr "" +"Sintassi: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 per " +"disabilitare] distance[1-20] y_offset[-10 to 10]”" diff --git a/mods/Mobs/mobs/locale/ms.po b/mods/Mobs/mobs/locale/ms.po new file mode 100644 index 0000000..a2a31f3 --- /dev/null +++ b/mods/Mobs/mobs/locale/ms.po @@ -0,0 +1,131 @@ +# 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: 2018-02-05 23:40+0800\n" +"PO-Revision-Date: 2018-02-05 23:51+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" + +#: api.lua +msgid "** Peaceful Mode Active - No Monsters Will Spawn" +msgstr "** Mod Aman Diaktifkan - Tiada Raksasa Akan Muncul" + +#: api.lua +msgid "Mob has been protected!" +msgstr "Mob telah pun dilindungi!" + +#: api.lua +msgid "@1 (Tamed)" +msgstr "@1 (Jinak)" + +#: api.lua +msgid "Not tamed!" +msgstr "Belum dijinakkan!" + +#: api.lua +msgid "@1 is owner!" +msgstr "Ini hak milik @1!" + +#: api.lua +msgid "Missed!" +msgstr "Terlepas!" + +#: api.lua +msgid "Already protected!" +msgstr "Telah dilindungi!" + +#: api.lua +msgid "@1 at full health (@2)" +msgstr "Mata kesihatan @1 telah penuh (@2)" + +#: api.lua +msgid "@1 has been tamed!" +msgstr "@1 telah dijinakkan!" + +#: api.lua +msgid "Enter name:" +msgstr "Masukkan nama:" + +#: api.lua +msgid "Rename" +msgstr "Namakan semula" + +#: crafts.lua +msgid "Name Tag" +msgstr "Tanda Nama" + +#: crafts.lua +msgid "Leather" +msgstr "Kulit" + +#: crafts.lua +msgid "Raw Meat" +msgstr "Daging Mentah" + +#: crafts.lua +msgid "Meat" +msgstr "Daging Bakar" + +#: crafts.lua +msgid "Lasso (right-click animal to put in inventory)" +msgstr "Tanjul (klik-kanan haiwan untuk masukkan ke inventori)" + +#: crafts.lua +msgid "Net (right-click animal to put in inventory)" +msgstr "Jaring (klik-kanan haiwan untuk masukkan ke inventori)" + +#: crafts.lua +msgid "Steel Shears (right-click to shear)" +msgstr "Ketam Keluli (klik-kanan untuk mengetam bulu biri-biri)" + +#: crafts.lua +msgid "Mob Protection Rune" +msgstr "Rune Perlindungan Mob" + +#: crafts.lua +msgid "Saddle" +msgstr "Pelana" + +#: crafts.lua +msgid "Mob Fence" +msgstr "Pagar Mob" + +#: spawner.lua +msgid "Mob Spawner" +msgstr "Pewujud Mob" + +#: spawner.lua +msgid "Mob MinLight MaxLight Amount PlayerDist" +msgstr "Mob CahayaMin CahayaMax Amaun JarakPemain" + +#: spawner.lua +msgid "Spawner Not Active (enter settings)" +msgstr "Pewujud Mob Tidak Aktif (masukkan tetapan)" + +#: spawner.lua +msgid "Spawner Active (@1)" +msgstr "Pewujud Mob Aktif (@1)" + +#: spawner.lua +msgid "Mob Spawner settings failed!" +msgstr "Penetapan Pewujud Mob gagal!" + +#: spawner.lua +msgid "" +"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " +"distance[1-20] y_offset[-10 to 10]”" +msgstr "" +"Sintaks: \"nama cahaya_minimum[0-14] cahaya_maksimum[0-14] " +"amaun_mob_maksimum[0 untuk lumpuhkan] jarak[1-20] ketinggian[-10 hingga 10]\"" diff --git a/mods/Mobs/mobs/locale/pt.po b/mods/Mobs/mobs/locale/pt.po new file mode 100644 index 0000000..b52afd6 --- /dev/null +++ b/mods/Mobs/mobs/locale/pt.po @@ -0,0 +1,133 @@ +# 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: mobs\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-02 16:48+0200\n" +"PO-Revision-Date: 2017-07-02 14:55+0200\n" +"Last-Translator: Wuzzy \n" +"Language-Team: \n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: api.lua +msgid "** Peaceful Mode Active - No Monsters Will Spawn" +msgstr "" + +#: api.lua +msgid "Mob has been protected!" +msgstr "" + +#: api.lua +msgid "@1 (Tamed)" +msgstr "" + +#: api.lua +msgid "Not tamed!" +msgstr "Indomesticado!" + +#: api.lua +msgid "@1 is owner!" +msgstr "Dono @1!" + +#: api.lua +msgid "Missed!" +msgstr "Faltou!" + +#: api.lua +msgid "Already protected!" +msgstr "" + +#: api.lua +msgid "@1 at full health (@2)" +msgstr "@1 em plena saude (@2)" + +#: api.lua +msgid "@1 has been tamed!" +msgstr "@1 foi domesticado!" + +#: api.lua +msgid "Enter name:" +msgstr "Insira um nome:" + +#: api.lua +msgid "Rename" +msgstr "Renomear" + +#: crafts.lua +msgid "Name Tag" +msgstr "Etiqueta" + +#: crafts.lua +msgid "Leather" +msgstr "Couro" + +#: crafts.lua +msgid "Raw Meat" +msgstr "Carne crua" + +#: crafts.lua +msgid "Meat" +msgstr "Carne" + +#: crafts.lua +#, fuzzy +msgid "Lasso (right-click animal to put in inventory)" +msgstr "Laço (clique-direito no animal para por no inventario)" + +#: crafts.lua +msgid "Net (right-click animal to put in inventory)" +msgstr "Net (clique-direito no animal para por no inventario)" + +#: crafts.lua +msgid "Steel Shears (right-click to shear)" +msgstr "Tesoura de Aço (clique-direito para tosquiar)" + +#: crafts.lua +msgid "Mob Protection Rune" +msgstr "" + +#: crafts.lua +msgid "Saddle" +msgstr "" + +#: crafts.lua +msgid "Mob Fence" +msgstr "" + +#: spawner.lua +msgid "Mob Spawner" +msgstr "Spawnador de Mob" + +#: spawner.lua +msgid "Mob MinLight MaxLight Amount PlayerDist" +msgstr "Mob LuzMinima LuzMaxima Valor DistJogador" + +#: spawner.lua +msgid "Spawner Not Active (enter settings)" +msgstr "Spawnador Inativo (configurar)" + +#: spawner.lua +msgid "Spawner Active (@1)" +msgstr "Spawnador Ativo (@1)" + +#: spawner.lua +msgid "Mob Spawner settings failed!" +msgstr "Configuraçao de Spawnador do Mob falhou!" + +#: spawner.lua +#, fuzzy +msgid "" +"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " +"distance[1-20] y_offset[-10 to 10]”" +msgstr "" +"> nome luz_min[0-14] luz_max[0-14] max_mobs_na_area[0 para desabilitar] " +"distancia[1-20] y_offset[-10 a 10]" diff --git a/mods/Mobs/mobs/locale/ru.po b/mods/Mobs/mobs/locale/ru.po new file mode 100644 index 0000000..6cde7ef --- /dev/null +++ b/mods/Mobs/mobs/locale/ru.po @@ -0,0 +1,129 @@ +# Russian translation for the mobs_redo mod. +# Copyright (C) 2018 TenPlus1 +# This file is distributed under the same license as the mobs_redo package. +# Oleg720 , 2017. +# CodeXP , 2018. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-13 15:47+0200\n" +"PO-Revision-Date: 2018-03-23 22:22+0100\n" +"Last-Translator: CodeXP \n" +"Language-Team: \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: api.lua +msgid "** Peaceful Mode Active - No Monsters Will Spawn" +msgstr "** Мирный модус активирован - монстры не спаунятся" + +#: api.lua +msgid "Mob has been protected!" +msgstr "Моб защищен!" + +#: api.lua +msgid "@1 (Tamed)" +msgstr "@1 (Прирученный)" + +#: api.lua +msgid "Not tamed!" +msgstr "Не прирученный" + +#: api.lua +msgid "@1 is owner!" +msgstr "@1 владелец" + +#: api.lua +msgid "Missed!" +msgstr "Промазал!" + +#: api.lua +msgid "Already protected!" +msgstr "Уже защищен!" + +#: api.lua +msgid "@1 at full health (@2)" +msgstr "@1 при полном здоровье (@2)" + +#: api.lua +msgid "@1 has been tamed!" +msgstr "@1 приручен" + +#: api.lua +msgid "Enter name:" +msgstr "Введите имя:" + +#: api.lua +msgid "Rename" +msgstr "Переименовать" + +#: crafts.lua +msgid "Name Tag" +msgstr "Новый тэг" + +#: crafts.lua +msgid "Leather" +msgstr "Кожа" + +#: crafts.lua +msgid "Raw Meat" +msgstr "Сырое мясо" + +#: crafts.lua +msgid "Meat" +msgstr "Мясо" + +#: crafts.lua +msgid "Lasso (right-click animal to put in inventory)" +msgstr "Лассо (Правый клик - положить животное в инвентарь)" + +#: crafts.lua +msgid "Net (right-click animal to put in inventory)" +msgstr "Сеть (Правый клик - положить животное в инвентарь)" + +#: crafts.lua +msgid "Steel Shears (right-click to shear)" +msgstr "Ножницы (Правый клик - подстричь)" + +#: crafts.lua +msgid "Mob Protection Rune" +msgstr "Защитная руна мобов" + +#: crafts.lua +msgid "Saddle" +msgstr "Седло" + +#: crafts.lua +msgid "Mob Fence" +msgstr "Забор от мобов" + +#: spawner.lua +msgid "Mob Spawner" +msgstr "Спаунер моба" + +#: spawner.lua +msgid "Mob MinLight MaxLight Amount PlayerDist" +msgstr "" + +#: spawner.lua +msgid "Spawner Not Active (enter settings)" +msgstr "Спаунер не активен (введите настройки)" + +#: spawner.lua +msgid "Spawner Active (@1)" +msgstr "Активные спаунер (@1)" + +#: spawner.lua +msgid "Mob Spawner settings failed!" +msgstr "Настройки спаунера моба провалились" + +#: spawner.lua +msgid "" +"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " +"distance[1-20] y_offset[-10 to 10]”" +msgstr "" diff --git a/mods/Mobs/mobs/locale/template.pot b/mods/Mobs/mobs/locale/template.pot new file mode 100644 index 0000000..e69de29 diff --git a/mods/Mobs/mobs/locale/tr.po b/mods/Mobs/mobs/locale/tr.po new file mode 100644 index 0000000..10688e2 --- /dev/null +++ b/mods/Mobs/mobs/locale/tr.po @@ -0,0 +1,133 @@ +# 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: mobs\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-02 16:48+0200\n" +"PO-Revision-Date: 2017-07-02 14:56+0200\n" +"Last-Translator: Wuzzy \n" +"Language-Team: \n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: api.lua +msgid "** Peaceful Mode Active - No Monsters Will Spawn" +msgstr "" + +#: api.lua +msgid "Mob has been protected!" +msgstr "" + +#: api.lua +msgid "@1 (Tamed)" +msgstr "" + +#: api.lua +msgid "Not tamed!" +msgstr "Evcil değil!" + +#: api.lua +msgid "@1 is owner!" +msgstr "Sahibi @1!" + +#: api.lua +msgid "Missed!" +msgstr "Kaçırdın!" + +#: api.lua +msgid "Already protected!" +msgstr "" + +#: api.lua +msgid "@1 at full health (@2)" +msgstr "@1 tam canında (@2)" + +#: api.lua +msgid "@1 has been tamed!" +msgstr "@1 tamamen evcilleştirilmiştir!" + +#: api.lua +msgid "Enter name:" +msgstr "İsim gir:" + +#: api.lua +msgid "Rename" +msgstr "Yeniden adlandır" + +#: crafts.lua +msgid "Name Tag" +msgstr "İsim etiketi" + +#: crafts.lua +msgid "Leather" +msgstr "Deri" + +#: crafts.lua +msgid "Raw Meat" +msgstr "Çiğ et" + +#: crafts.lua +msgid "Meat" +msgstr "Et" + +#: crafts.lua +#, fuzzy +msgid "Lasso (right-click animal to put in inventory)" +msgstr "Kement (hayvana sağ tıklayarak envantere koy)" + +#: crafts.lua +msgid "Net (right-click animal to put in inventory)" +msgstr "Ağ (hayvana sağ tıklayarak envantere koy)" + +#: crafts.lua +msgid "Steel Shears (right-click to shear)" +msgstr "Çelik makas (sağ tıklayarak kes)" + +#: crafts.lua +msgid "Mob Protection Rune" +msgstr "" + +#: crafts.lua +msgid "Saddle" +msgstr "" + +#: crafts.lua +msgid "Mob Fence" +msgstr "Canavar Yaratıcı" + +#: spawner.lua +msgid "Mob Spawner" +msgstr "Canavar Yaratıcı" + +#: spawner.lua +msgid "Mob MinLight MaxLight Amount PlayerDist" +msgstr "Mob MinIşık MaxIşık Miktar OyuncuMesafesi" + +#: spawner.lua +msgid "Spawner Not Active (enter settings)" +msgstr "Yaratıcı aktif değil (ayarlara gir)" + +#: spawner.lua +msgid "Spawner Active (@1)" +msgstr "Yaratıcı aktif (@1)" + +#: spawner.lua +msgid "Mob Spawner settings failed!" +msgstr "Yaratıcı ayarları uygulanamadı." + +#: spawner.lua +#, fuzzy +msgid "" +"Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] " +"distance[1-20] y_offset[-10 to 10]”" +msgstr "" +"> isim min_isik[0-14] max_isik[0-14] alandaki_max_canavar_sayisi[kapatmak " +"icin 0] mesafe[1-20] y_cikinti[-10 ve 10 arası]" diff --git a/mods/Mobs/mobs/lucky_block.lua b/mods/Mobs/mobs/lucky_block.lua new file mode 100644 index 0000000..8cf20ed --- /dev/null +++ b/mods/Mobs/mobs/lucky_block.lua @@ -0,0 +1,17 @@ + +if minetest.get_modpath("lucky_block") then + + lucky_block:add_blocks({ + {"dro", {"mobs:meat_raw"}, 5}, + {"dro", {"mobs:meat"}, 5}, + {"dro", {"mobs:nametag"}, 1}, + {"dro", {"mobs:leather"}, 5}, + {"dro", {"default:stick"}, 10}, + {"dro", {"mobs:net"}, 1}, + {"dro", {"mobs:lasso"}, 1}, + {"dro", {"mobs:shears"}, 1}, + {"dro", {"mobs:protector"}, 1}, + {"dro", {"mobs:fence_wood"}, 10}, + {"lig"}, + }) +end diff --git a/mods/Mobs/mobs/mod.conf b/mods/Mobs/mobs/mod.conf new file mode 100644 index 0000000..f3a3ad7 --- /dev/null +++ b/mods/Mobs/mobs/mod.conf @@ -0,0 +1 @@ +name = mobs diff --git a/mods/Mobs/mobs/mount.lua b/mods/Mobs/mobs/mount.lua new file mode 100644 index 0000000..d1f5841 --- /dev/null +++ b/mods/Mobs/mobs/mount.lua @@ -0,0 +1,448 @@ + +-- lib_mount by Blert2112 (edited by TenPlus1) + +local enable_crash = false +local crash_threshold = 6.5 -- ignored if enable_crash=false + +------------------------------------------------------------------------------ + +-- +-- Helper functions +-- + +local node_ok = function(pos, fallback) + + fallback = fallback or mobs.fallback_node + + local node = minetest.get_node_or_nil(pos) + + if node and minetest.registered_nodes[node.name] then + return node + end + + return {name = fallback} +end + + +local function node_is(pos) + + local node = node_ok(pos) + + if node.name == "air" then + return "air" + end + + if minetest.get_item_group(node.name, "lava") ~= 0 then + return "lava" + end + + if minetest.get_item_group(node.name, "liquid") ~= 0 then + return "liquid" + end + + if minetest.registered_nodes[node.name].walkable == true then + return "walkable" + end + + return "other" +end + + +local function get_sign(i) + + i = i or 0 + + if i == 0 then + return 0 + else + return i / math.abs(i) + end +end + + +local function get_velocity(v, yaw, y) + + local x = -math.sin(yaw) * v + local z = math.cos(yaw) * v + + return {x = x, y = y, z = z} +end + + +local function get_v(v) + return math.sqrt(v.x * v.x + v.z * v.z) +end + + +local function force_detach(player) + + local attached_to = player:get_attach() + + if not attached_to then + return + end + + local entity = attached_to:get_luaentity() + + if entity.driver + and entity.driver == player then + + entity.driver = nil + end + + player:set_detach() + default.player_attached[player:get_player_name()] = false + player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + default.player_set_animation(player, "stand" , 30) + player:set_properties({visual_size = {x = 1, y = 1} }) + +end + +------------------------------------------------------------------------------- + + +minetest.register_on_leaveplayer(function(player) + force_detach(player) +end) + +minetest.register_on_shutdown(function() + local players = minetest.get_connected_players() + for i = 1, #players do + force_detach(players[i]) + end +end) + +minetest.register_on_dieplayer(function(player) + force_detach(player) + return true +end) + +------------------------------------------------------------------------------- + +function mobs.attach(entity, player) + + local attach_at, eye_offset = {}, {} + + entity.player_rotation = entity.player_rotation or {x = 0, y = 0, z = 0} + entity.driver_attach_at = entity.driver_attach_at or {x = 0, y = 0, z = 0} + entity.driver_eye_offset = entity.driver_eye_offset or {x = 0, y = 0, z = 0} + entity.driver_scale = entity.driver_scale or {x = 1, y = 1} + + local rot_view = 0 + + if entity.player_rotation.y == 90 then + rot_view = math.pi/2 + end + + attach_at = entity.driver_attach_at + eye_offset = entity.driver_eye_offset + entity.driver = player + + force_detach(player) + + player:set_attach(entity.object, "", attach_at, entity.player_rotation) + default.player_attached[player:get_player_name()] = true + player:set_eye_offset(eye_offset, {x = 0, y = 0, z = 0}) + + player:set_properties({ + visual_size = { + x = entity.driver_scale.x, + y = entity.driver_scale.y + } + }) + + minetest.after(0.2, function() + default.player_set_animation(player, "sit" , 30) + end) + + --player:set_look_yaw(entity.object:get_yaw() - rot_view) + player:set_look_horizontal(entity.object:get_yaw() - rot_view) +end + + +function mobs.detach(player, offset) + + force_detach(player) + + default.player_set_animation(player, "stand" , 30) + + local pos = player:get_pos() + + pos = {x = pos.x + offset.x, y = pos.y + 0.2 + offset.y, z = pos.z + offset.z} + + minetest.after(0.1, function() + player:set_pos(pos) + end) +end + + +function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) + + local rot_steer, rot_view = math.pi/2, 0 + + if entity.player_rotation.y == 90 then + rot_steer, rot_view = 0, math.pi/2 + end + + local acce_y = 0 + local velo = entity.object:get_velocity() + + entity.v = get_v(velo) * get_sign(entity.v) + + -- process controls + if entity.driver then + +--print ("---velo", get_v(velo)) + + local ctrl = entity.driver:get_player_control() + + -- move forwards + if ctrl.up then + + entity.v = entity.v + entity.accel / 10 + + -- move backwards + elseif ctrl.down then + + if entity.max_speed_reverse == 0 and entity.v == 0 then + return + end + + entity.v = entity.v - entity.accel / 10 + end + + -- fix mob rotation + entity.object:set_yaw(entity.driver:get_look_horizontal() - entity.rotate) + + if can_fly then + + -- fly up + if ctrl.jump then + velo.y = velo.y + 1 + if velo.y > entity.accel then velo.y = entity.accel end + + elseif velo.y > 0 then + velo.y = velo.y - 0.1 + if velo.y < 0 then velo.y = 0 end + end + + -- fly down + if ctrl.sneak then + velo.y = velo.y - 1 + if velo.y < -entity.accel then velo.y = -entity.accel end + + elseif velo.y < 0 then + velo.y = velo.y + 0.1 + if velo.y > 0 then velo.y = 0 end + end + + else + + -- jump + if ctrl.jump then + + if velo.y == 0 then + velo.y = velo.y + entity.jump_height + acce_y = acce_y + (acce_y * 3) + 1 + end + end + + end + end + + -- if not moving then set animation and return + if entity.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then + + if stand_anim then + mobs:set_animation(entity, stand_anim) + end + + return + end + + -- set moving animation + if moving_anim then + mobs:set_animation(entity, moving_anim) + end + + -- Stop! + local s = get_sign(entity.v) + + entity.v = entity.v - 0.02 * s + + if s ~= get_sign(entity.v) then + + entity.object:set_velocity({x = 0, y = 0, z = 0}) + entity.v = 0 + return + end + + -- enforce speed limit forward and reverse + local max_spd = entity.max_speed_reverse + + if get_sign(entity.v) >= 0 then + max_spd = entity.max_speed_forward + end + + if math.abs(entity.v) > max_spd then + entity.v = entity.v - get_sign(entity.v) + end + + -- Set position, velocity and acceleration + local p = entity.object:get_pos() + local new_velo = {x = 0, y = 0, z = 0} + local new_acce = {x = 0, y = -9.8, z = 0} + + p.y = p.y - 0.5 + + local ni = node_is(p) + local v = entity.v + + if ni == "air" then + + if can_fly == true then + new_acce.y = 0 + end + + elseif ni == "liquid" or ni == "lava" then + + if ni == "lava" and entity.lava_damage ~= 0 then + + entity.lava_counter = (entity.lava_counter or 0) + dtime + + if entity.lava_counter > 1 then + + minetest.sound_play("default_punch", { + object = entity.object, + max_hear_distance = 5 + }) + + entity.object:punch(entity.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = entity.lava_damage} + }, nil) + + entity.lava_counter = 0 + end + end + + if entity.terrain_type == 2 + or entity.terrain_type == 3 then + + new_acce.y = 0 + p.y = p.y + 1 + + if node_is(p) == "liquid" then + + if velo.y >= 5 then + velo.y = 5 + elseif velo.y < 0 then + new_acce.y = 20 + else + new_acce.y = 5 + end + else + if math.abs(velo.y) < 1 then + local pos = entity.object:get_pos() + pos.y = math.floor(pos.y) + 0.5 + entity.object:set_pos(pos) + velo.y = 0 + end + end + else + v = v * 0.25 + end + end + + new_velo = get_velocity(v, entity.object:get_yaw() - rot_view, velo.y) + new_acce.y = new_acce.y + acce_y + + entity.object:set_velocity(new_velo) + entity.object:set_acceleration(new_acce) + + -- CRASH! + if enable_crash then + + local intensity = entity.v2 - v + + if intensity >= crash_threshold then + +--print("----------- crash", intensity) + + entity.object:punch(entity.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = intensity} + }, nil) + + end + end + + entity.v2 = v +end + + +-- directional flying routine by D00Med (edited by TenPlus1) + +function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) + + local ctrl = entity.driver:get_player_control() + local velo = entity.object:get_velocity() + local dir = entity.driver:get_look_dir() + local yaw = entity.driver:get_look_horizontal() + 1.57 -- offset fix between old and new commands + local rot_steer, rot_view = math.pi / 2, 0 + + if entity.player_rotation.y == 90 then + rot_steer, rot_view = 0, math.pi / 2 + end + + if ctrl.up then + entity.object:set_velocity({ + x = dir.x * speed, + y = dir.y * speed + 2, + z = dir.z * speed + }) + + elseif ctrl.down then + entity.object:set_velocity({ + x = -dir.x * speed, + y = dir.y * speed + 2, + z = -dir.z * speed + }) + + elseif not ctrl.down or ctrl.up or ctrl.jump then + entity.object:set_velocity({x = 0, y = -2, z = 0}) + end + + entity.object:set_yaw(yaw + math.pi + math.pi / 2 - entity.rotate) + + -- firing arrows + if ctrl.LMB and ctrl.sneak and shoots then + + local pos = entity.object:get_pos() + local obj = minetest.add_entity({ + x = pos.x + 0 + dir.x * 2.5, + y = pos.y + 1.5 + dir.y, + z = pos.z + 0 + dir.z * 2.5}, arrow) + + local ent = obj:get_luaentity() + if ent then + ent.switch = 1 -- for mob specific arrows + ent.owner_id = tostring(entity.object) -- so arrows dont hurt entity you are riding + local vec = {x = dir.x * 6, y = dir.y * 6, z = dir.z * 6} + local yaw = entity.driver:get_look_horizontal() + obj:set_yaw(yaw + math.pi / 2) + obj:set_velocity(vec) + else + obj:remove() + end + end + + -- change animation if stopped + if velo.x == 0 and velo.y == 0 and velo.z == 0 then + + mobs:set_animation(entity, stand_anim) + else + -- moving animation + mobs:set_animation(entity, moving_anim) + end +end diff --git a/mods/Mobs/mobs/readme.MD b/mods/Mobs/mobs/readme.MD new file mode 100644 index 0000000..a9e0fc9 --- /dev/null +++ b/mods/Mobs/mobs/readme.MD @@ -0,0 +1,79 @@ + +MOBS REDO for MINETEST + +Built from PilzAdam's original Simple Mobs with additional mobs by KrupnoPavel, Zeg9, ExeterDad and AspireMint. + + +This mod contains the API only for adding your own mobs into the world, so please use the additional modpacks to add animals, monsters etc. + + +https://forum.minetest.net/viewtopic.php?f=11&t=9917 + + +Crafts: + + - Nametag (paper, black dye, string) can be used right-click on a tamed mob to give them a name. + - Nets can be used to right-click tamed mobs to pick them up and place inside inventory as a spawn egg. + - Magic Lasso is similar to nets but with a better chance of picking up larger mobs. + - Shears are used to right-click sheep and return 1-3 wool. + - Protection Rune lets you protect tamed mobs from harm by other players + +Lucky Blocks: 9 + + +Changelog: +- 1.44- Added ToolRanks support for swords when attacking mobs +- 1.43- Better 0.4.16 compatibility, added general attack function and settings +- 1.42- Added "all" option to immune_to table, tidied floating mobs to be less intensive +- 1.41- Mob pathfinding has been updated thanks to Elkien3 +- 1.40- Updated to use newer functions, requires Minetest 0.4.16+ to work. +- 1.39- Added 'on_breed', 'on_grown' and 'do_punch' custom functions per mob +- 1.38- Better entity checking, nametag setting and on_spawn function added to mob registry, tweaked light damage +- 1.37- Added support for Raymoo's CMI (common mob interface) mod: https://forum.minetest.net/viewtopic.php?f=9&t=15448 +- 1.36- Death check added, if mob dies in fire/lava/with lava pick then drops are cooked +- 1.35- Added owner_loyal flag for owned mobs to attack player enemies, also fixed group_attack +- 1.34- Added function to fly mob using directional movement (thanks D00Med for flying code) +- 1.33- Added functions to mount ride mobs (mobs.attach, mobs.detach, mobs.drive) many thanks to Blert2112 +- 1.32- Added new spawn check to count specific mobs AND new minetest.conf setting to chance spawn chance and numbers, added ability to protect tamed mobs +- 1.31- Added 'attack_animals' and 'specific_attack' flags for custom monster attacks, also 'mob_difficulty' .conf setting to make mobs harder. +- 1.30- Added support for invisibility mod (mobs cant attack what they cant see), tweaked and tidied code +- 1.29- Split original Mobs Redo into a modpack to make it easier to disable mob sets (animal, monster, npc) or simply use the Api itself for your own mod +- 1.28- New damage system added with ability for mob to be immune to weapons or healed by them :) +- 1.27- Added new sheep, lava flan and spawn egg textures. New Lava Pick tool smelts what you dig. New atan checking function. +- 1.26- Pathfinding feature added thanks to rnd, when monsters attack they become scary smart in finding you :) also, beehive produces honey now :) +- 1.25- Mobs no longer spawn within 12 blocks of player or despawn within same range, spawners now have player detection, Code tidy and tweak. +- 1.24- Added feature where certain animals run away when punched (runaway = true in mob definition) +- 1.23- Added mob spawner block for admin to setup spawners in-game (place and right click to enter settings) +- 1.22- Added ability to name tamed animals and npc using nametags, also npc will attack anyone who punches them apart from owner +- 1.21- Added some more error checking to reduce serialize.h error and added height checks for falling off cliffs (thanks cmdskp) +- 1.20- Error checking added to remove bad mobs, out of map limit mobs and stop serialize.h error +- 1.19- Chickens now drop egg items instead of placing the egg, also throwing eggs result in 1/8 chance of spawning chick +- 1.18- Added docile_by_day flag so that monsters will not attack automatically during daylight hours unless hit first +- 1.17- Added 'dogshoot' attack type, shoots when out of reach, melee attack when in reach, also api tweaks and self.reach added +- 1.16- Mobs follow multiple items now, Npc's can breed +- 1.15- Added Feeding/Taming/Breeding function, right-click to pick up any sheep with X mark on them and replace with new one to fix compatibility. +- 1.14- All .self variables saved in staticdata, Fixed self.health bug +- 1.13- Added capture function (thanks blert2112) chance of picking up mob with hand; net; magic lasso, replaced some .x models with newer .b3d one's +- 1.12- Added animal ownership so that players cannot steal your tamed animals +- 1.11- Added flying mobs (and swimming), fly=true and fly_in="air" or "deafult:water_source" for fishy +- 1,10- Footstep removed (use replace), explosion routine added for exploding mobs. +- 1.09- reworked breeding routine, added mob rotation value, added footstep feature, added jumping mobs with sounds feature, added magic lasso for picking up animals +- 1.08- Mob throwing attack has been rehauled so that they can damage one another, also drops and on_die function added +- 1.07- Npc's can now be set to follow player or stand by using self.order and self.owner variables +- beta- Npc mob added, kills monsters, attacks player when punched, right click with food to heal or gold lump for drop +- 1.06- Changed recovery times after breeding, and time taken to grow up (can be sped up by feeding baby animal) +- 1.05- Added ExeterDad's bunny's which can be picked up and tamed with 4 carrots from farming redo or farming_plus, also shears added to get wool from sheep and lastly Jordach/BSD's kitten +- 1.04- Added mating for sheep, cows and hogs... feed animals to make horny and hope for a baby which is half size, will grow up quick though :) +- 1.03- Added mob drop/replace feature so that chickens can drop eggs, cow/sheep can eat grass/wheat etc. +- 1.02- Sheared sheep are remembered and spawn shaven, Warthogs will attack when threatened, Api additions +- 1.01- Mobs that suffer fall damage or die in water/lava/sunlight will now drop items +- 1.0 - more work on Api so that certain mobs can float in water while some sink like a brick :) +- 0.9 - Spawn eggs added for all mobs (admin only, cannot be placed in protected areas)... Api tweaked +- 0.8 - Added sounds to monster mobs (thanks Cyberpangolin for the sfx) and also chicken sound +- 0.7 - mobs.protected switch added to api.lua, when set to 1 mobs no longer spawn in protected areas, also bug fixes +- 0.6 - Api now supports multi-textured mobs, e.g oerkki, dungeon master, rats and chickens have random skins when spawning (sheep fix TODO), also new Honey block +- 0.5 - Mobs now float in water, die from falling, and some code improvements +- 0.4 - Dungeon Masters and Mese Monsters have much better aim due to shoot_offset, also they can both shoot through nodes that aren't walkable (flowers, grass etc) plus new sheep sound :) +- 0.3 - Added LOTT's Spider mob, made Cobwebs, added KPavel's Bee with Honey and Beehives (made texture), Warthogs now have sound and can be tamed, taming of shaved sheep or milked cow with 8 wheat so it will not despawn, many bug fixes :) +- 0.2 - Cooking bucket of milk into cheese now returns empty bucket +- 0.1 - Initial Release diff --git a/mods/Mobs/mobs/settingtypes.txt b/mods/Mobs/mobs/settingtypes.txt new file mode 100644 index 0000000..0821437 --- /dev/null +++ b/mods/Mobs/mobs/settingtypes.txt @@ -0,0 +1,29 @@ +# If false then mobs no longer spawn in world without spawner or spawn egg +mobs_spawn (Spawn Mobs) bool true + +# If enabled then monsters no longer spawn in world +only_peaceful_mobs (Only spawn peaceful Mobs) bool false + +# If enabled then punching mobs no longer shows blood effects +mobs_disable_blood (Disable Mob blood) bool false + +# If disabled then Mobs no longer destroy world blocks +mobs_griefing (Griefing Mobs) bool true + +# If false then Mobs no longer spawn inside player protected areas +mobs_spawn_protected (Spawn Mobs in protected areas) bool true + +# If true Mobs will be removed once a map chunk is out of view +remove_far_mobs (Remove far Mobs) bool true + +# Sets Mob difficulty level by multiplying punch damage +mob_difficulty (Mob difficulty) float 1.0 + +# If disabled health status no longer appears above Mob when punched +mob_show_health (Show Mob health) bool true + +# Contains a value used to multiply Mob spawn values +mob_chance_multiplier (Mob chance multiplier) float 1.0 + +# When false Mob no longer drop items when killed +mobs_drop_items (Mob drops) bool true diff --git a/mods/Mobs/mobs/sounds/default_punch.ogg b/mods/Mobs/mobs/sounds/default_punch.ogg new file mode 100644 index 0000000..28a500b Binary files /dev/null and b/mods/Mobs/mobs/sounds/default_punch.ogg differ diff --git a/mods/Mobs/mobs/sounds/license.txt b/mods/Mobs/mobs/sounds/license.txt new file mode 100644 index 0000000..3b160fe --- /dev/null +++ b/mods/Mobs/mobs/sounds/license.txt @@ -0,0 +1,7 @@ +Creative Commons sounds from Freesound.org + +mobs_swing.ogg by qubodup + - http://freesound.org/people/qubodup/sounds/60012/ + +mobs_spell.ogg by littlerobotsoundfactory + - http://freesound.org/people/LittleRobotSoundFactory/sounds/270396/ diff --git a/mods/Mobs/mobs/sounds/mobs_spell.ogg b/mods/Mobs/mobs/sounds/mobs_spell.ogg new file mode 100644 index 0000000..455b54f Binary files /dev/null and b/mods/Mobs/mobs/sounds/mobs_spell.ogg differ diff --git a/mods/Mobs/mobs/sounds/mobs_swing.ogg b/mods/Mobs/mobs/sounds/mobs_swing.ogg new file mode 100644 index 0000000..ffe6a9c Binary files /dev/null and b/mods/Mobs/mobs/sounds/mobs_swing.ogg differ diff --git a/mods/Mobs/mobs/spawner.lua b/mods/Mobs/mobs/spawner.lua new file mode 100644 index 0000000..ca75dee --- /dev/null +++ b/mods/Mobs/mobs/spawner.lua @@ -0,0 +1,181 @@ + +-- intllib +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/intllib.lua") + +-- mob spawner + +local spawner_default = "mobs_animal:pumba 10 15 0 0" + +minetest.register_node("mobs:spawner", { + tiles = {"mob_spawner.png"}, + drawtype = "glasslike", + paramtype = "light", + walkable = true, + description = S("Mob Spawner"), + groups = {cracky = 1}, + + on_construct = function(pos) + + local meta = minetest.get_meta(pos) + + -- text entry formspec + meta:set_string("formspec", + "field[text;" .. S("Mob MinLight MaxLight Amount PlayerDist") .. ";${command}]") + meta:set_string("infotext", S("Spawner Not Active (enter settings)")) + meta:set_string("command", spawner_default) + end, + + on_right_click = function(pos, placer) + + if minetest.is_protected(pos, placer:get_player_name()) then + return + end + end, + + on_receive_fields = function(pos, formname, fields, sender) + + if not fields.text or fields.text == "" then + return + end + + local meta = minetest.get_meta(pos) + local comm = fields.text:split(" ") + local name = sender:get_player_name() + + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return + end + + local mob = comm[1] -- mob to spawn + local mlig = tonumber(comm[2]) -- min light + local xlig = tonumber(comm[3]) -- max light + local num = tonumber(comm[4]) -- total mobs in area + local pla = tonumber(comm[5]) -- player distance (0 to disable) + local yof = tonumber(comm[6]) or 0 -- Y offset to spawn mob + + if mob and mob ~= "" and mobs.spawning_mobs[mob] == true + and num and num >= 0 and num <= 10 + and mlig and mlig >= 0 and mlig <= 15 + and xlig and xlig >= 0 and xlig <= 15 + and pla and pla >=0 and pla <= 20 + and yof and yof > -10 and yof < 10 then + + meta:set_string("command", fields.text) + meta:set_string("infotext", S("Spawner Active (@1)", mob)) + + else + minetest.chat_send_player(name, S("Mob Spawner settings failed!")) + minetest.chat_send_player(name, + S("Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] distance[1-20] y_offset[-10 to 10]”")) + end + end, +}) + + +local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 99) + +-- spawner abm +minetest.register_abm({ + label = "Mob spawner node", + nodenames = {"mobs:spawner"}, + interval = 10, + chance = 4, + catch_up = false, + + action = function(pos, node, active_object_count, active_object_count_wider) + + -- return if too many entities already + if active_object_count_wider >= max_per_block then + return + end + + -- get meta and command + local meta = minetest.get_meta(pos) + local comm = meta:get_string("command"):split(" ") + + -- get settings from command + local mob = comm[1] + local mlig = tonumber(comm[2]) + local xlig = tonumber(comm[3]) + local num = tonumber(comm[4]) + local pla = tonumber(comm[5]) or 0 + local yof = tonumber(comm[6]) or 0 + + -- if amount is 0 then do nothing + if num == 0 then + return + end + + -- are we spawning a registered mob? + if not mobs.spawning_mobs[mob] then + --print ("--- mob doesn't exist", mob) + return + end + + -- check objects inside 9x9 area around spawner + local objs = minetest.get_objects_inside_radius(pos, 9) + local count = 0 + local ent = nil + + -- count mob objects of same type in area + for k, obj in ipairs(objs) do + + ent = obj:get_luaentity() + + if ent and ent.name and ent.name == mob then + count = count + 1 + end + end + + -- is there too many of same type? + if count >= num then + return + end + + -- spawn mob if player detected and in range + if pla > 0 then + + local in_range = 0 + local objs = minetest.get_objects_inside_radius(pos, pla) + + for _,oir in pairs(objs) do + + if oir:is_player() then + + in_range = 1 + + break + end + end + + -- player not found + if in_range == 0 then + return + end + end + + -- find air blocks within 5 nodes of spawner + local air = minetest.find_nodes_in_area( + {x = pos.x - 5, y = pos.y + yof, z = pos.z - 5}, + {x = pos.x + 5, y = pos.y + yof, z = pos.z + 5}, + {"air"}) + + -- spawn in random air block + if air and #air > 0 then + + local pos2 = air[math.random(#air)] + local lig = minetest.get_node_light(pos2) or 0 + + pos2.y = pos2.y + 0.5 + + -- only if light levels are within range + if lig >= mlig and lig <= xlig + and minetest.registered_entities[mob] then + minetest.add_entity(pos2, mob) + end + end + + end +}) diff --git a/mods/Mobs/mobs/textures/mob_spawner.png b/mods/Mobs/mobs/textures/mob_spawner.png new file mode 100644 index 0000000..8f0ac39 Binary files /dev/null and b/mods/Mobs/mobs/textures/mob_spawner.png differ diff --git a/mods/Mobs/mobs/textures/mobs_blood.png b/mods/Mobs/mobs/textures/mobs_blood.png new file mode 100644 index 0000000..488b50f Binary files /dev/null and b/mods/Mobs/mobs/textures/mobs_blood.png differ diff --git a/mods/Mobs/mobs/textures/mobs_chicken_egg.png b/mods/Mobs/mobs/textures/mobs_chicken_egg.png new file mode 100644 index 0000000..be8a4e1 Binary files /dev/null and b/mods/Mobs/mobs/textures/mobs_chicken_egg.png differ diff --git a/mods/Mobs/mobs/textures/mobs_chicken_egg_overlay.png b/mods/Mobs/mobs/textures/mobs_chicken_egg_overlay.png new file mode 100644 index 0000000..e81716a Binary files /dev/null and b/mods/Mobs/mobs/textures/mobs_chicken_egg_overlay.png differ diff --git a/mods/Mobs/mobs/textures/mobs_leather.png b/mods/Mobs/mobs/textures/mobs_leather.png new file mode 100644 index 0000000..3205e5d Binary files /dev/null and b/mods/Mobs/mobs/textures/mobs_leather.png differ diff --git a/mods/Mobs/mobs/textures/mobs_magic_lasso.png b/mods/Mobs/mobs/textures/mobs_magic_lasso.png new file mode 100644 index 0000000..befdc11 Binary files /dev/null and b/mods/Mobs/mobs/textures/mobs_magic_lasso.png differ diff --git a/mods/Mobs/mobs/textures/mobs_meat.png b/mods/Mobs/mobs/textures/mobs_meat.png new file mode 100644 index 0000000..4c63fdd Binary files /dev/null and b/mods/Mobs/mobs/textures/mobs_meat.png differ diff --git a/mods/Mobs/mobs/textures/mobs_meat_raw.png b/mods/Mobs/mobs/textures/mobs_meat_raw.png new file mode 100644 index 0000000..0dea4ec Binary files /dev/null and b/mods/Mobs/mobs/textures/mobs_meat_raw.png differ diff --git a/mods/Mobs/mobs/textures/mobs_nametag.png b/mods/Mobs/mobs/textures/mobs_nametag.png new file mode 100644 index 0000000..74005b3 Binary files /dev/null and b/mods/Mobs/mobs/textures/mobs_nametag.png differ diff --git a/mods/Mobs/mobs/textures/mobs_net.png b/mods/Mobs/mobs/textures/mobs_net.png new file mode 100644 index 0000000..df7c3a6 Binary files /dev/null and b/mods/Mobs/mobs/textures/mobs_net.png differ diff --git a/mods/Mobs/mobs/textures/mobs_noentry_particle.png b/mods/Mobs/mobs/textures/mobs_noentry_particle.png new file mode 100644 index 0000000..87938ff Binary files /dev/null and b/mods/Mobs/mobs/textures/mobs_noentry_particle.png differ diff --git a/mods/Mobs/mobs/textures/mobs_protect_particle.png b/mods/Mobs/mobs/textures/mobs_protect_particle.png new file mode 100644 index 0000000..debe20c Binary files /dev/null and b/mods/Mobs/mobs/textures/mobs_protect_particle.png differ diff --git a/mods/Mobs/mobs/textures/mobs_protector.png b/mods/Mobs/mobs/textures/mobs_protector.png new file mode 100644 index 0000000..f3937b7 Binary files /dev/null and b/mods/Mobs/mobs/textures/mobs_protector.png differ diff --git a/mods/Mobs/mobs/textures/mobs_saddle.png b/mods/Mobs/mobs/textures/mobs_saddle.png new file mode 100644 index 0000000..e9d42f8 Binary files /dev/null and b/mods/Mobs/mobs/textures/mobs_saddle.png differ diff --git a/mods/Mobs/mobs/textures/mobs_shears.png b/mods/Mobs/mobs/textures/mobs_shears.png new file mode 100644 index 0000000..aa16f2e Binary files /dev/null and b/mods/Mobs/mobs/textures/mobs_shears.png differ diff --git a/mods/Mobs/mobs/textures/tnt_smoke.png b/mods/Mobs/mobs/textures/tnt_smoke.png new file mode 100644 index 0000000..488b50f Binary files /dev/null and b/mods/Mobs/mobs/textures/tnt_smoke.png differ diff --git a/mods/Mobs/mobs_animal/adultalien.lua b/mods/Mobs/mobs_animal/adultalien.lua new file mode 100644 index 0000000..db30bed --- /dev/null +++ b/mods/Mobs/mobs_animal/adultalien.lua @@ -0,0 +1,82 @@ + +local S = mobs.intllib + + +-- Model by AspireMint (CC BY-SA 3.0) + +mobs:register_mob("mobs_animal:adultalien", { +stepheight = 0.6, + type = "animal", + passive = true, + group_attack = false, + owner_loyal = true, + attack_npcs = false, + reach = 2, + damage = 0, + hp_min = 0, + hp_max = 0, + armor = 0, + collisionbox = {-0.9, -0.9, -0.9, 0.9, 0.9, 0.9}, + visual = "mesh", + visual_size = {x=2, y=2, z=2}, + mesh = "mobs_adult.b3d", + textures = { + {"mobs_alien.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "mobs_panda", + attack = "mobs_panda", + }, + walk_chance = 5, + walk_velocity = 0.5, + run_velocity = 1.5, + jump = false, + jump_height = 6, + follow = {"color:blue"}, + view_range = 8, + water_damage = 0, + lava_damage = 0, + light_damage = 0, + fear_height = 6, + animation = { + speed_normal = 15, + stand_start = 390, + stand_end = 450, + stand1_start = 0, + stand1_end = 0, + stand2_start = 1, + stand2_end = 1, + stand3_start = 2, + stand3_end = 2, + walk_start = 280, + walk_end = 340, + run_start = 10, + run_end = 70, + punch_start = 390, + punch_end = 450, + -- 0 = rest, 1 = hiding (covers eyes), 2 = surprised + }, + + + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 20, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 5, 50, false, nil) then return end + end, +}) + + mobs:spawn({ + name = "mobs_animal:adultalien", + nodes = {"color:red"}, + neighbors = {"group:grass"}, + min_light = 14, + interval = 60, + chance = 15000, + min_height = 0, + max_height = 31000, + day_toggle = true, + }) + +mobs:register_egg("mobs_animal:adultalien", S("AdultAlien"), "color_green.png", 1) diff --git a/mods/Mobs/mobs_animal/adultpanda.lua b/mods/Mobs/mobs_animal/adultpanda.lua new file mode 100644 index 0000000..b5cde75 --- /dev/null +++ b/mods/Mobs/mobs_animal/adultpanda.lua @@ -0,0 +1,82 @@ + +local S = mobs.intllib + + +-- Model by AspireMint (CC BY-SA 3.0) + +mobs:register_mob("mobs_animal:adultpanda", { +stepheight = 0.6, + type = "animal", + passive = true, + group_attack = false, + owner_loyal = true, + attack_npcs = false, + reach = 2, + damage = 0, + hp_min = 0, + hp_max = 0, + armor = 0, + collisionbox = {-0.9, -0.9, -0.9, 0.9, 0.9, 0.9}, + visual = "mesh", + visual_size = {x=2, y=2, z=2}, + mesh = "mobs_adult.b3d", + textures = { + {"mobs_panda.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "mobs_panda", + attack = "mobs_panda", + }, + walk_chance = 5, + walk_velocity = 0.5, + run_velocity = 1.5, + jump = false, + jump_height = 6, + follow = {"color:green"}, + view_range = 8, + water_damage = 0, + lava_damage = 0, + light_damage = 0, + fear_height = 6, + animation = { + speed_normal = 15, + stand_start = 390, + stand_end = 450, + stand1_start = 0, + stand1_end = 0, + stand2_start = 1, + stand2_end = 1, + stand3_start = 2, + stand3_end = 2, + walk_start = 280, + walk_end = 340, + run_start = 10, + run_end = 70, + punch_start = 390, + punch_end = 450, + -- 0 = rest, 1 = hiding (covers eyes), 2 = surprised + }, + + + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 20, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 5, 50, false, nil) then return end + end, +}) + + mobs:spawn({ + name = "mobs_animal:adultpanda", + nodes = {"comboblock:slab_green_onc_slab_orange"}, + neighbors = {"group:grass"}, + min_light = 14, + interval = 60, + chance = 15000, + min_height = 0, + max_height = 31000, + day_toggle = true, + }) + +mobs:register_egg("mobs_animal:adultpanda", S("AdultPanda"), "color_white.png", 1) diff --git a/mods/Mobs/mobs_animal/adultpig.lua b/mods/Mobs/mobs_animal/adultpig.lua new file mode 100644 index 0000000..c2c2085 --- /dev/null +++ b/mods/Mobs/mobs_animal/adultpig.lua @@ -0,0 +1,82 @@ + +local S = mobs.intllib + + +-- Model by AspireMint (CC BY-SA 3.0) + +mobs:register_mob("mobs_animal:adultpig", { +stepheight = 0.6, + type = "animal", + passive = true, + group_attack = false, + owner_loyal = true, + attack_npcs = false, + reach = 2, + damage = 0, + hp_min = 0, + hp_max = 0, + armor = 0, + collisionbox = {-0.9, -0.9, -0.9, 0.9, 0.9, 0.9}, + visual = "mesh", + visual_size = {x=2, y=2, z=2}, + mesh = "mobs_adult.b3d", + textures = { + {"mobs_pig.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "mobs_panda", + attack = "mobs_panda", + }, + walk_chance = 5, + walk_velocity = 0.5, + run_velocity = 1.5, + jump = false, + jump_height = 6, + follow = {"color:orange"}, + view_range = 8, + water_damage = 0, + lava_damage = 0, + light_damage = 0, + fear_height = 6, + animation = { + speed_normal = 15, + stand_start = 390, + stand_end = 450, + stand1_start = 0, + stand1_end = 0, + stand2_start = 1, + stand2_end = 1, + stand3_start = 2, + stand3_end = 2, + walk_start = 280, + walk_end = 340, + run_start = 10, + run_end = 70, + punch_start = 390, + punch_end = 450, + -- 0 = rest, 1 = hiding (covers eyes), 2 = surprised + }, + + + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 20, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 5, 50, false, nil) then return end + end, +}) + + mobs:spawn({ + name = "mobs_animal:adultpig", + nodes = {"comboblock:slab_green_onc_slab_orange"}, + neighbors = {"group:grass"}, + min_light = 14, + interval = 60, + chance = 15000, + min_height = 0, + max_height = 31000, + day_toggle = true, + }) + +mobs:register_egg("mobs_animal:adultpig", S("AdultPig"), "color_pink.png", 1) diff --git a/mods/Mobs/mobs_animal/babyalien.lua b/mods/Mobs/mobs_animal/babyalien.lua new file mode 100644 index 0000000..53dfb23 --- /dev/null +++ b/mods/Mobs/mobs_animal/babyalien.lua @@ -0,0 +1,79 @@ + +local S = mobs.intllib + + +-- Panda by AspireMint (CC BY-SA 3.0) + +mobs:register_mob("mobs_animal:babyalien", { +stepheight = 0.6, + type = "animal", + passive = true, + group_attack = false, + owner_loyal = true, + attack_npcs = false, + reach = 2, + damage = 0, + hp_min = 0, + hp_max = 0, + armor = 0, + collisionbox = {-0.4, -0.45, -0.4, 0.4, 0.45, 0.4}, + visual = "mesh", + mesh = "mobs_baby.b3d", + textures = { + {"mobs_alien.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "mobs_panda", + attack = "mobs_panda", + }, + walk_chance = 5, + walk_velocity = 0.5, + run_velocity = 1.5, + jump = false, + jump_height = 6, + follow = {"color:blue"}, + view_range = 8, + water_damage = 0, + lava_damage = 0, + light_damage = 0, + fear_height = 6, + animation = { + speed_normal = 15, + stand_start = 130, + stand_end = 270, + stand1_start = 0, + stand1_end = 0, + stand2_start = 1, + stand2_end = 1, + stand3_start = 2, + stand3_end = 2, + walk_start = 10, + walk_end = 70, + run_start = 10, + run_end = 70, + punch_start = 80, + punch_end = 120, + -- 0 = rest, 1 = hiding (covers eyes), 2 = surprised + }, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 20, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 5, 50, false, nil) then return end + end, +}) + + mobs:spawn({ + name = "mobs_animal:babyalien", + nodes = {"color:red"}, + neighbors = {"group:grass"}, + min_light = 14, + interval = 60, + chance = 15000, + min_height = 6500, + max_height = 31000, + day_toggle = true, + }) + +mobs:register_egg("mobs_animal:babyalien", S("BabyAlien"), "color_green.png", 1) diff --git a/mods/Mobs/mobs_animal/babypanda.lua b/mods/Mobs/mobs_animal/babypanda.lua new file mode 100644 index 0000000..2107a0f --- /dev/null +++ b/mods/Mobs/mobs_animal/babypanda.lua @@ -0,0 +1,79 @@ + +local S = mobs.intllib + + +-- Panda by AspireMint (CC BY-SA 3.0) + +mobs:register_mob("mobs_animal:babypanda", { +stepheight = 0.6, + type = "animal", + passive = true, + group_attack = false, + owner_loyal = true, + attack_npcs = false, + reach = 2, + damage = 0, + hp_min = 0, + hp_max = 0, + armor = 0, + visual = "mesh", + collisionbox = {-0.4, -0.45, -0.4, 0.4, 0.45, 0.4}, + mesh = "mobs_baby.b3d", + textures = { + {"mobs_panda.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "mobs_panda", + attack = "mobs_panda", + }, + walk_chance = 5, + walk_velocity = 0.5, + run_velocity = 1.5, + jump = false, + jump_height = 6, + follow = {"color:green"}, + view_range = 8, + water_damage = 0, + lava_damage = 0, + light_damage = 0, + fear_height = 6, + animation = { + speed_normal = 15, + stand_start = 130, + stand_end = 270, + stand1_start = 0, + stand1_end = 0, + stand2_start = 1, + stand2_end = 1, + stand3_start = 2, + stand3_end = 2, + walk_start = 10, + walk_end = 70, + run_start = 10, + run_end = 70, + punch_start = 80, + punch_end = 120, + -- 0 = rest, 1 = hiding (covers eyes), 2 = surprised + }, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 20, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 5, 50, false, nil) then return end + end, +}) + + mobs:spawn({ + name = "mobs_animal:babypanda", + nodes = {"comboblock:slab_green_onc_slab_orange"}, + neighbors = {"group:grass"}, + min_light = 14, + interval = 60, + chance = 15000, + min_height = 0, + max_height = 31000, + day_toggle = true, + }) + +mobs:register_egg("mobs_animal:babypanda", S("babyPanda"), "color_white.png", 1) diff --git a/mods/Mobs/mobs_animal/babypig.lua b/mods/Mobs/mobs_animal/babypig.lua new file mode 100644 index 0000000..fb3743d --- /dev/null +++ b/mods/Mobs/mobs_animal/babypig.lua @@ -0,0 +1,79 @@ + +local S = mobs.intllib + + +-- Model by AspireMint (CC BY-SA 3.0) + +mobs:register_mob("mobs_animal:babypig", { +stepheight = 0.6, + type = "animal", + passive = true, + group_attack = false, + owner_loyal = true, + attack_npcs = false, + reach = 2, + damage = 0, + hp_min = 0, + hp_max = 0, + armor = 0, + collisionbox = {-0.4, -0.45, -0.4, 0.4, 0.45, 0.4}, + visual = "mesh", + mesh = "mobs_baby.b3d", + textures = { + {"mobs_pig.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "mobs_panda", + attack = "mobs_panda", + }, + walk_chance = 5, + walk_velocity = 0.5, + run_velocity = 1.5, + jump = false, + jump_height = 6, + follow = {"color:orange"}, + view_range = 8, + water_damage = 0, + lava_damage = 0, + light_damage = 0, + fear_height = 6, + animation = { + speed_normal = 15, + stand_start = 130, + stand_end = 270, + stand1_start = 0, + stand1_end = 0, + stand2_start = 1, + stand2_end = 1, + stand3_start = 2, + stand3_end = 2, + walk_start = 10, + walk_end = 70, + run_start = 10, + run_end = 70, + punch_start = 80, + punch_end = 120, + -- 0 = rest, 1 = hiding (covers eyes), 2 = surprised + }, + on_rightclick = function(self, clicker) + + if mobs:feed_tame(self, clicker, 20, true, true) then return end + if mobs:protect(self, clicker) then return end + if mobs:capture_mob(self, clicker, 0, 5, 50, false, nil) then return end + end, +}) + + mobs:spawn({ + name = "mobs_animal:babypig", + nodes = {"comboblock:slab_green_onc_slab_orange"}, + neighbors = {"group:grass"}, + min_light = 14, + interval = 60, + chance = 15000, + min_height = 0, + max_height = 31000, + day_toggle = true, + }) + +mobs:register_egg("mobs_animal:babypig", S("BabyPig"), "color_pink.png", 1) diff --git a/mods/Mobs/mobs_animal/depends.txt b/mods/Mobs/mobs_animal/depends.txt new file mode 100644 index 0000000..cc03398 --- /dev/null +++ b/mods/Mobs/mobs_animal/depends.txt @@ -0,0 +1,2 @@ +default +mobs diff --git a/mods/Mobs/mobs_animal/description.txt b/mods/Mobs/mobs_animal/description.txt new file mode 100644 index 0000000..85afccd --- /dev/null +++ b/mods/Mobs/mobs_animal/description.txt @@ -0,0 +1 @@ +Adds farm animals. \ No newline at end of file diff --git a/mods/Mobs/mobs_animal/init.lua b/mods/Mobs/mobs_animal/init.lua new file mode 100644 index 0000000..f294ed8 --- /dev/null +++ b/mods/Mobs/mobs_animal/init.lua @@ -0,0 +1,20 @@ + +local path = minetest.get_modpath("mobs_animal") + +-- Load support for intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP.."/intllib.lua") +mobs.intllib = S + +-- Animals + +dofile(path .. "/adultpanda.lua") +dofile(path .. "/babypanda.lua") + +dofile(path .. "/adultpig.lua") +dofile(path .. "/babypig.lua") + +dofile(path .. "/adultalien.lua") +dofile(path .. "/babyalien.lua") + +print (("Panda, Pig and Alien are Here.")) diff --git a/mods/Mobs/mobs_animal/intllib.lua b/mods/Mobs/mobs_animal/intllib.lua new file mode 100644 index 0000000..6669d72 --- /dev/null +++ b/mods/Mobs/mobs_animal/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/Mobs/mobs_animal/license.txt b/mods/Mobs/mobs_animal/license.txt new file mode 100644 index 0000000..776968a --- /dev/null +++ b/mods/Mobs/mobs_animal/license.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Krupnov Pavel and 2016 TenPlus1 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/mods/Mobs/mobs_animal/locale/de.po b/mods/Mobs/mobs_animal/locale/de.po new file mode 100644 index 0000000..cd6d85e --- /dev/null +++ b/mods/Mobs/mobs_animal/locale/de.po @@ -0,0 +1,203 @@ +# 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-07-31 11:28+0200\n" +"PO-Revision-Date: 2016-06-10 08:58+0200\n" +"Last-Translator: Xanthin\n" +"Language-Team: \n" +"Language: de\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" + +#: bee.lua +msgid "Bee" +msgstr "Biene" + +#: bee.lua +msgid "Honey" +msgstr "Honig" + +#: bee.lua +msgid "Beehive" +msgstr "Bienenstock" + +#: bee.lua +msgid "Honey Block" +msgstr "Honigblock" + +#: bunny.lua +msgid "Bunny" +msgstr "Häschen" + +#: bunny.lua +msgid "Raw Rabbit" +msgstr "Rohes Kaninchen" + +#: bunny.lua +msgid "Cooked Rabbit" +msgstr "Gekochtes Kaninchen" + +#: bunny.lua +msgid "Rabbit Hide" +msgstr "Kaninchenfell" + +#: chicken.lua +msgid "Chicken" +msgstr "Huhn" + +#: chicken.lua +msgid "Chicken Egg" +msgstr "Hühnerei" + +#: chicken.lua +msgid "Fried Egg" +msgstr "Spiegelei" + +#: chicken.lua +msgid "Raw Chicken" +msgstr "Rohes Hühnchen" + +#: chicken.lua +msgid "Cooked Chicken" +msgstr "Gekochtes Hühnchen" + +#: chicken.lua +#, fuzzy +msgid "Feather" +msgstr "Feder" + +#: cow.lua +msgid "Cow already milked!" +msgstr "Kuh ist bereits gemolken!" + +#: cow.lua +msgid "Cow" +msgstr "Kuh" + +#: cow.lua +msgid "Bucket of Milk" +msgstr "Eimer Milch" + +#: cow.lua +msgid "Cheese" +msgstr "Käse" + +#: cow.lua +msgid "Cheese Block" +msgstr "Käseblock" + +#: init.lua +msgid "[MOD] Mobs Redo 'Animals' loaded" +msgstr "[MOD] Mobs Redo 'Animals' geladen" + +#: kitten.lua +msgid "Kitten" +msgstr "Kätzchen" + +#: penguin.lua +#, fuzzy +msgid "Penguin" +msgstr "Pinguin" + +#: rat.lua +msgid "Rat" +msgstr "Ratte" + +#: rat.lua +msgid "Cooked Rat" +msgstr "Gekochte Ratte" + +#: sheep.lua +msgid "Black" +msgstr "Schwarzes" + +#: sheep.lua +msgid "Blue" +msgstr "Blaues" + +#: sheep.lua +msgid "Brown" +msgstr "Braunes" + +#: sheep.lua +msgid "Cyan" +msgstr "Cyan" + +#: sheep.lua +msgid "Dark Green" +msgstr "Dunkelgrünes" + +#: sheep.lua +msgid "Dark Grey" +msgstr "Dunkelgraues" + +#: sheep.lua +msgid "Green" +msgstr "Grünes" + +#: sheep.lua +msgid "Grey" +msgstr "Graues" + +#: sheep.lua +msgid "Magenta" +msgstr "Magenta" + +#: sheep.lua +msgid "Orange" +msgstr "Oranges" + +#: sheep.lua +msgid "Pink" +msgstr "Pinkes" + +#: sheep.lua +msgid "Red" +msgstr "Rotes" + +#: sheep.lua +msgid "Violet" +msgstr "Violettes" + +#: sheep.lua +msgid "White" +msgstr "Weißes" + +#: sheep.lua +msgid "Yellow" +msgstr "Gelbes" + +#: sheep.lua +#, fuzzy +msgid "@1 Sheep" +msgstr "@1 Schaf" + +#: sheep.lua +msgid "Raw Mutton" +msgstr "Rohes Hammelfleisch" + +#: sheep.lua +#, fuzzy +msgid "Cooked Mutton" +msgstr "Gekochtes Hammelfleisch" + +#: warthog.lua +msgid "Warthog" +msgstr "Warzenschwein" + +#: warthog.lua +msgid "Raw Porkchop" +msgstr "Rohes Schweinekotelett" + +#: warthog.lua +msgid "Cooked Porkchop" +msgstr "Gekochtes Schweinekotelett" diff --git a/mods/Mobs/mobs_animal/locale/fr.po b/mods/Mobs/mobs_animal/locale/fr.po new file mode 100644 index 0000000..5c0d2f6 --- /dev/null +++ b/mods/Mobs/mobs_animal/locale/fr.po @@ -0,0 +1,202 @@ +# 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-07-31 11:28+0200\n" +"PO-Revision-Date: 2017-07-31 09:18+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" + +#: bee.lua +msgid "Bee" +msgstr "Abeille" + +#: bee.lua +msgid "Honey" +msgstr "Miel" + +#: bee.lua +msgid "Beehive" +msgstr "Ruche" + +#: bee.lua +msgid "Honey Block" +msgstr "Bloc de miel" + +#: bunny.lua +msgid "Bunny" +msgstr "Lapin" + +#: bunny.lua +msgid "Raw Rabbit" +msgstr "Lapin Cru" + +#: bunny.lua +#, fuzzy +msgid "Cooked Rabbit" +msgstr "Lapin Cuit" + +#: bunny.lua +msgid "Rabbit Hide" +msgstr "Fourrure de Lapin" + +#: chicken.lua +msgid "Chicken" +msgstr "Poule" + +#: chicken.lua +msgid "Chicken Egg" +msgstr "Œuf" + +#: chicken.lua +msgid "Fried Egg" +msgstr "Œuf au plat" + +#: chicken.lua +msgid "Raw Chicken" +msgstr "Poulet cru" + +#: chicken.lua +msgid "Cooked Chicken" +msgstr "Poulet cuit" + +#: chicken.lua +msgid "Feather" +msgstr "Plume" + +#: cow.lua +msgid "Cow already milked!" +msgstr "Vache déjà traite !" + +#: cow.lua +msgid "Cow" +msgstr "Vache" + +#: cow.lua +msgid "Bucket of Milk" +msgstr "Seau de lait" + +#: cow.lua +msgid "Cheese" +msgstr "Fromage" + +#: cow.lua +msgid "Cheese Block" +msgstr "Bloc de fromage" + +#: init.lua +msgid "[MOD] Mobs Redo 'Animals' loaded" +msgstr "[MOD] Mobs Redo 'Animals' chargé" + +#: kitten.lua +msgid "Kitten" +msgstr "Chaton" + +#: penguin.lua +msgid "Penguin" +msgstr "Manchot" + +#: rat.lua +msgid "Rat" +msgstr "Rat" + +#: rat.lua +msgid "Cooked Rat" +msgstr "Rat cuit" + +#: sheep.lua +msgid "Black" +msgstr "noir" + +#: sheep.lua +msgid "Blue" +msgstr "bleu" + +#: sheep.lua +msgid "Brown" +msgstr "marron" + +#: sheep.lua +msgid "Cyan" +msgstr "cyan" + +#: sheep.lua +msgid "Dark Green" +msgstr "vert foncé" + +#: sheep.lua +msgid "Dark Grey" +msgstr "gris foncé" + +#: sheep.lua +msgid "Green" +msgstr "vert" + +#: sheep.lua +msgid "Grey" +msgstr "gris" + +#: sheep.lua +msgid "Magenta" +msgstr "magenta" + +#: sheep.lua +msgid "Orange" +msgstr "orange" + +#: sheep.lua +msgid "Pink" +msgstr "rose" + +#: sheep.lua +msgid "Red" +msgstr "rouge" + +#: sheep.lua +msgid "Violet" +msgstr "violet" + +#: sheep.lua +msgid "White" +msgstr "blanc" + +#: sheep.lua +msgid "Yellow" +msgstr "jaune" + +#: sheep.lua +#, fuzzy +msgid "@1 Sheep" +msgstr "Mouton @1" + +#: sheep.lua +msgid "Raw Mutton" +msgstr "Mouton Cru" + +#: sheep.lua +#, fuzzy +msgid "Cooked Mutton" +msgstr "Mouton Cuit" + +#: warthog.lua +msgid "Warthog" +msgstr "Sanglier" + +#: warthog.lua +msgid "Raw Porkchop" +msgstr "Côte de sanglier crue" + +#: warthog.lua +msgid "Cooked Porkchop" +msgstr "Côte de sanglier cuite" diff --git a/mods/Mobs/mobs_animal/locale/it.po b/mods/Mobs/mobs_animal/locale/it.po new file mode 100644 index 0000000..8982f93 --- /dev/null +++ b/mods/Mobs/mobs_animal/locale/it.po @@ -0,0 +1,201 @@ +# ITALIAN LOCALE FILE FOR THE MOBS ANMAL MODULE +# Copyright (c) 2014 Krupnov Pavel and 2016 TenPlus1 +# This file is distributed under the same license as the MOBS ANIMAL package. +# Hamlet , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Italian localization file for the Mobs Animal mod\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-31 11:28+0200\n" +"PO-Revision-Date: 2017-08-18 00:56+0100\n" +"Last-Translator: H4mlet \n" +"Language-Team: \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" + +#: bee.lua +msgid "Bee" +msgstr "Ape" + +#: bee.lua +msgid "Honey" +msgstr "Miele" + +#: bee.lua +msgid "Beehive" +msgstr "Favo" + +#: bee.lua +msgid "Honey Block" +msgstr "Blocco di miele" + +#: bunny.lua +msgid "Bunny" +msgstr "Coniglietto" + +#: bunny.lua +msgid "Raw Rabbit" +msgstr "Coniglio Crudo" + +#: bunny.lua +#, fuzzy +msgid "Cooked Rabbit" +msgstr "Coniglio Cotto" + +#: bunny.lua +msgid "Rabbit Hide" +msgstr "Pelle di Coniglio" + +#: chicken.lua +msgid "Chicken" +msgstr "Gallina" + +#: chicken.lua +msgid "Chicken Egg" +msgstr "Uovo di gallina" + +#: chicken.lua +msgid "Fried Egg" +msgstr "Uovo fritto" + +#: chicken.lua +msgid "Raw Chicken" +msgstr "Pollo crudo" + +#: chicken.lua +msgid "Cooked Chicken" +msgstr "Pollo cotto" + +#: chicken.lua +msgid "Feather" +msgstr "Piuma" + +#: cow.lua +msgid "Cow already milked!" +msgstr "Mucca già munta!" + +#: cow.lua +msgid "Cow" +msgstr "Mucca" + +#: cow.lua +msgid "Bucket of Milk" +msgstr "Secchio di latte" + +#: cow.lua +msgid "Cheese" +msgstr "Formaggio" + +#: cow.lua +msgid "Cheese Block" +msgstr "Blocco di formaggio" + +#: init.lua +msgid "[MOD] Mobs Redo 'Animals' loaded" +msgstr "[MOD] Mobs Redo 'Animals' caricato" + +#: kitten.lua +msgid "Kitten" +msgstr "Gattino" + +#: penguin.lua +msgid "Penguin" +msgstr "Pinguino" + +#: rat.lua +msgid "Rat" +msgstr "Ratto" + +#: rat.lua +msgid "Cooked Rat" +msgstr "Ratto cotto" + +#: sheep.lua +msgid "Black" +msgstr "Nera" + +#: sheep.lua +msgid "Blue" +msgstr "Blu" + +#: sheep.lua +msgid "Brown" +msgstr "Marrone" + +#: sheep.lua +msgid "Cyan" +msgstr "Ciano" + +#: sheep.lua +msgid "Dark Green" +msgstr "Verde scuro" + +#: sheep.lua +msgid "Dark Grey" +msgstr "Grigio scuro" + +#: sheep.lua +msgid "Green" +msgstr "Verde" + +#: sheep.lua +msgid "Grey" +msgstr "Grigia" + +#: sheep.lua +msgid "Magenta" +msgstr "Magenta" + +#: sheep.lua +msgid "Orange" +msgstr "Arancione" + +#: sheep.lua +msgid "Pink" +msgstr "Rosa" + +#: sheep.lua +msgid "Red" +msgstr "Rossa" + +#: sheep.lua +msgid "Violet" +msgstr "Viola" + +#: sheep.lua +msgid "White" +msgstr "Bianca" + +#: sheep.lua +msgid "Yellow" +msgstr "Gialla" + +#: sheep.lua +msgid "@1 Sheep" +msgstr "Pecora @1" + +#: sheep.lua +msgid "Raw Mutton" +msgstr "Montone Crudo" + +#: sheep.lua +#, fuzzy +msgid "Cooked Mutton" +msgstr "Montone Cotto" + +#: warthog.lua +msgid "Warthog" +msgstr "Facocero" + +#: warthog.lua +msgid "Raw Porkchop" +msgstr "Bistecca di maiale cruda" + +#: warthog.lua +msgid "Cooked Porkchop" +msgstr "Bistecca di maiale cotta" diff --git a/mods/Mobs/mobs_animal/locale/ms.po b/mods/Mobs/mobs_animal/locale/ms.po new file mode 100644 index 0000000..38e896d --- /dev/null +++ b/mods/Mobs/mobs_animal/locale/ms.po @@ -0,0 +1,199 @@ +# 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: 2018-02-06 00:17+0800\n" +"PO-Revision-Date: 2018-02-06 00:25+0800\n" +"Last-Translator: MuhdNurHidayat (MNH48) \n" +"Language-Team: \n" +"Language: ms\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" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: bee.lua +msgid "Bee" +msgstr "Lebah" + +#: bee.lua +msgid "Honey" +msgstr "Madu" + +#: bee.lua +msgid "Beehive" +msgstr "Sarang Lebah" + +#: bee.lua +msgid "Honey Block" +msgstr "Blok Madu" + +#: bunny.lua +msgid "Bunny" +msgstr "Arnab" + +#: bunny.lua +msgid "Raw Rabbit" +msgstr "Daging Arnab Mentah" + +#: bunny.lua +msgid "Cooked Rabbit" +msgstr "Daging Arnab Bakar" + +#: bunny.lua +msgid "Rabbit Hide" +msgstr "Belulang Arnab" + +#: chicken.lua +msgid "Chicken" +msgstr "Ayam" + +#: chicken.lua +msgid "Chicken Egg" +msgstr "Telur Ayam" + +#: chicken.lua +msgid "Fried Egg" +msgstr "Telur Goreng" + +#: chicken.lua +msgid "Raw Chicken" +msgstr "Ayam Mentah" + +#: chicken.lua +msgid "Cooked Chicken" +msgstr "Ayam Bakar" + +#: chicken.lua +msgid "Feather" +msgstr "Bulu" + +#: cow.lua +msgid "Cow already milked!" +msgstr "Lembu telah diperah susunya!" + +#: cow.lua +msgid "Cow" +msgstr "Lembu" + +#: cow.lua +msgid "Bucket of Milk" +msgstr "Baldi Susu" + +#: cow.lua +msgid "Cheese" +msgstr "Keju" + +#: cow.lua +msgid "Cheese Block" +msgstr "Blok Keju" + +#: init.lua +msgid "[MOD] Mobs Redo 'Animals' loaded" +msgstr "[MODS] Mobs Redo 'Animals' telah dimuatkan" + +#: kitten.lua +msgid "Kitten" +msgstr "Anak Kucing" + +#: penguin.lua +msgid "Penguin" +msgstr "Penguin" + +#: rat.lua +msgid "Rat" +msgstr "Tikus" + +#: rat.lua +msgid "Cooked Rat" +msgstr "Tikus Bakar" + +#: sheep.lua +msgid "Black" +msgstr "Hitam" + +#: sheep.lua +msgid "Blue" +msgstr "Biru" + +#: sheep.lua +msgid "Brown" +msgstr "Perang" + +#: sheep.lua +msgid "Cyan" +msgstr "Sian" + +#: sheep.lua +msgid "Dark Green" +msgstr "Hijau Gelap" + +#: sheep.lua +msgid "Dark Grey" +msgstr "Kelabu Gelap" + +#: sheep.lua +msgid "Green" +msgstr "Hijau" + +#: sheep.lua +msgid "Grey" +msgstr "Kelabu" + +#: sheep.lua +msgid "Magenta" +msgstr "Merah Lembayung" + +#: sheep.lua +msgid "Orange" +msgstr "Jingga" + +#: sheep.lua +msgid "Pink" +msgstr "Merah Jambu" + +#: sheep.lua +msgid "Red" +msgstr "Merah" + +#: sheep.lua +msgid "Violet" +msgstr "Ungu" + +#: sheep.lua +msgid "White" +msgstr "Putih" + +#: sheep.lua +msgid "Yellow" +msgstr "Kuning" + +#: sheep.lua +msgid "@1 Sheep" +msgstr "Biri-biri @1" + +#: sheep.lua +msgid "Raw Mutton" +msgstr "Daging Biri-biri Mentah" + +#: sheep.lua +msgid "Cooked Mutton" +msgstr "Daging Biri-biri Bakar" + +#: warthog.lua +msgid "Warthog" +msgstr "Babi Hutan" + +#: warthog.lua +msgid "Raw Porkchop" +msgstr "Daging Babi Mentah" + +#: warthog.lua +msgid "Cooked Porkchop" +msgstr "Daging Babi Bakar" diff --git a/mods/Mobs/mobs_animal/locale/ru.po b/mods/Mobs/mobs_animal/locale/ru.po new file mode 100644 index 0000000..3aff715 --- /dev/null +++ b/mods/Mobs/mobs_animal/locale/ru.po @@ -0,0 +1,200 @@ +# 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-13 16:00 (UTC+5)\n" +"PO-Revision-Date: 2018-03-29 18:00 (UTC+5)\n" +"Last-Translator: Oleg720 \n" +"Language-Team: 720 Locales <>\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: bee.lua +msgid "Bee" +msgstr "Пчела" + +#: bee.lua +msgid "Honey" +msgstr "Мёд" + +#: bee.lua +msgid "Beehive" +msgstr "Улей" + +#: bee.lua +msgid "Honey Block" +msgstr "Блок мёда" + +#: bunny.lua +msgid "Bunny" +msgstr "Кролик" + +#: bunny.lua +msgid "Raw Rabbit" +msgstr "Сырой кролик" + +#: bunny.lua +#, fuzzy +msgid "Cooked Rabbit" +msgstr "Приготовленный кролик" + +#: bunny.lua +msgid "Rabbit Hide" +msgstr "Кролик скрыть" + +#: chicken.lua +msgid "Chicken" +msgstr "Курица" + +#: chicken.lua +msgid "Chicken Egg" +msgstr "Курино яйцо" + +#: chicken.lua +msgid "Fried Egg" +msgstr "Жареное яйцо" + +#: chicken.lua +msgid "Raw Chicken" +msgstr "Сырая курятина" + +#: chicken.lua +msgid "Cooked Chicken" +msgstr "Вареная курятина" + +#: chicken.lua +msgid "Feather" +msgstr "Перо" + +#: cow.lua +msgid "Cow already milked!" +msgstr "Корову уже подоили!" + +#: cow.lua +msgid "Cow" +msgstr "Корова" + +#: cow.lua +msgid "Bucket of Milk" +msgstr "Ведро молока" + +#: cow.lua +msgid "Cheese" +msgstr "Сыр" + +#: cow.lua +msgid "Cheese Block" +msgstr "Блок сыра" + +#: init.lua +msgid "[MOD] Mobs Redo 'Animals' loaded" +msgstr "[МОД] Mobs Redo 'Animals' загружен" + +#: kitten.lua +msgid "Kitten" +msgstr "Котенок" + +#: penguin.lua +msgid "Penguin" +msgstr "Пингвин" + +#: rat.lua +msgid "Rat" +msgstr "Крыса" + +#: rat.lua +msgid "Cooked Rat" +msgstr "Приготовленная крыса" + +#: sheep.lua +msgid "Black" +msgstr "Черный" + +#: sheep.lua +msgid "Blue" +msgstr "Синий" + +#: sheep.lua +msgid "Brown" +msgstr "Коричневый" + +#: sheep.lua +msgid "Cyan" +msgstr "Голубой" + +#: sheep.lua +msgid "Dark Green" +msgstr "Темно-зеленый" + +#: sheep.lua +msgid "Dark Grey" +msgstr "Темно-серый" + +#: sheep.lua +msgid "Green" +msgstr "Зеленый" + +#: sheep.lua +msgid "Grey" +msgstr "Серый" + +#: sheep.lua +msgid "Magenta" +msgstr "Пурпурный" + +#: sheep.lua +msgid "Orange" +msgstr "Оранжевый" + +#: sheep.lua +msgid "Pink" +msgstr "Розовый" + +#: sheep.lua +msgid "Red" +msgstr "Красный" + +#: sheep.lua +msgid "Violet" +msgstr "Фиолетовый" + +#: sheep.lua +msgid "White" +msgstr "Белый" + +#: sheep.lua +msgid "Yellow" +msgstr "Желтый" + +#: sheep.lua +msgid "@1 Sheep" +msgstr "@1 Овец" + +#: sheep.lua +msgid "Raw Mutton" +msgstr "сырой ягненок" + +#: sheep.lua +#, fuzzy +msgid "Cooked Mutton" +msgstr "приготовленный ягненок" + +#: warthog.lua +msgid "Warthog" +msgstr "Бородавочник" + +#: warthog.lua +msgid "Raw Porkchop" +msgstr "Отбивные из свинины" + +#: warthog.lua +msgid "Cooked Porkchop" +msgstr "Приготовленные отбивные" diff --git a/mods/Mobs/mobs_animal/locale/template.pot b/mods/Mobs/mobs_animal/locale/template.pot new file mode 100644 index 0000000..79f58ff --- /dev/null +++ b/mods/Mobs/mobs_animal/locale/template.pot @@ -0,0 +1,198 @@ +# 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-07-31 11:28+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" + +#: bee.lua +msgid "Bee" +msgstr "" + +#: bee.lua +msgid "Honey" +msgstr "" + +#: bee.lua +msgid "Beehive" +msgstr "" + +#: bee.lua +msgid "Honey Block" +msgstr "" + +#: bunny.lua +msgid "Bunny" +msgstr "" + +#: bunny.lua +msgid "Raw Rabbit" +msgstr "" + +#: bunny.lua +msgid "Cooked Rabbit" +msgstr "" + +#: bunny.lua +msgid "Rabbit Hide" +msgstr "" + +#: chicken.lua +msgid "Chicken" +msgstr "" + +#: chicken.lua +msgid "Chicken Egg" +msgstr "" + +#: chicken.lua +msgid "Fried Egg" +msgstr "" + +#: chicken.lua +msgid "Raw Chicken" +msgstr "" + +#: chicken.lua +msgid "Cooked Chicken" +msgstr "" + +#: chicken.lua +msgid "Feather" +msgstr "" + +#: cow.lua +msgid "Cow already milked!" +msgstr "" + +#: cow.lua +msgid "Cow" +msgstr "" + +#: cow.lua +msgid "Bucket of Milk" +msgstr "" + +#: cow.lua +msgid "Cheese" +msgstr "" + +#: cow.lua +msgid "Cheese Block" +msgstr "" + +#: init.lua +msgid "[MOD] Mobs Redo 'Animals' loaded" +msgstr "" + +#: kitten.lua +msgid "Kitten" +msgstr "" + +#: penguin.lua +msgid "Penguin" +msgstr "" + +#: rat.lua +msgid "Rat" +msgstr "" + +#: rat.lua +msgid "Cooked Rat" +msgstr "" + +#: sheep.lua +msgid "Black" +msgstr "" + +#: sheep.lua +msgid "Blue" +msgstr "" + +#: sheep.lua +msgid "Brown" +msgstr "" + +#: sheep.lua +msgid "Cyan" +msgstr "" + +#: sheep.lua +msgid "Dark Green" +msgstr "" + +#: sheep.lua +msgid "Dark Grey" +msgstr "" + +#: sheep.lua +msgid "Green" +msgstr "" + +#: sheep.lua +msgid "Grey" +msgstr "" + +#: sheep.lua +msgid "Magenta" +msgstr "" + +#: sheep.lua +msgid "Orange" +msgstr "" + +#: sheep.lua +msgid "Pink" +msgstr "" + +#: sheep.lua +msgid "Red" +msgstr "" + +#: sheep.lua +msgid "Violet" +msgstr "" + +#: sheep.lua +msgid "White" +msgstr "" + +#: sheep.lua +msgid "Yellow" +msgstr "" + +#: sheep.lua +msgid "@1 Sheep" +msgstr "" + +#: sheep.lua +msgid "Raw Mutton" +msgstr "" + +#: sheep.lua +msgid "Cooked Mutton" +msgstr "" + +#: warthog.lua +msgid "Warthog" +msgstr "" + +#: warthog.lua +msgid "Raw Porkchop" +msgstr "" + +#: warthog.lua +msgid "Cooked Porkchop" +msgstr "" diff --git a/mods/Mobs/mobs_animal/locale/tr.po b/mods/Mobs/mobs_animal/locale/tr.po new file mode 100644 index 0000000..f3c0b86 --- /dev/null +++ b/mods/Mobs/mobs_animal/locale/tr.po @@ -0,0 +1,202 @@ +# 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-07-31 11:28+0200\n" +"PO-Revision-Date: 2017-04-26 09:02+0200\n" +"Last-Translator: Admicos\n" +"Language-Team: \n" +"Language: tr\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" + +#: bee.lua +msgid "Bee" +msgstr "Arı" + +#: bee.lua +msgid "Honey" +msgstr "Bal" + +#: bee.lua +msgid "Beehive" +msgstr "Arı kovanı" + +#: bee.lua +msgid "Honey Block" +msgstr "Bal bloğu" + +#: bunny.lua +msgid "Bunny" +msgstr "Tavşan" + +#: bunny.lua +msgid "Raw Rabbit" +msgstr "çiğ tavşan" + +#: bunny.lua +#, fuzzy +msgid "Cooked Rabbit" +msgstr "pişmiş tavşan" + +#: bunny.lua +msgid "Rabbit Hide" +msgstr "tavşan kürkü" + +#: chicken.lua +msgid "Chicken" +msgstr "Tavuk" + +#: chicken.lua +msgid "Chicken Egg" +msgstr "Tavuk yumurtası " + +#: chicken.lua +msgid "Fried Egg" +msgstr "Kızarmış yumurta" + +#: chicken.lua +msgid "Raw Chicken" +msgstr "Çiğ tavuk" + +#: chicken.lua +msgid "Cooked Chicken" +msgstr "Pişmiş tavuk" + +#: chicken.lua +msgid "Feather" +msgstr "" + +#: cow.lua +msgid "Cow already milked!" +msgstr "İnekte süt yok!" + +#: cow.lua +msgid "Cow" +msgstr "İnek" + +#: cow.lua +msgid "Bucket of Milk" +msgstr "Süt kovası" + +#: cow.lua +msgid "Cheese" +msgstr "Peynir" + +#: cow.lua +msgid "Cheese Block" +msgstr "Peynir bloğu" + +#: init.lua +msgid "[MOD] Mobs Redo 'Animals' loaded" +msgstr "[MOD] Mobs Redo 'Hayvanlar' yüklendi" + +#: kitten.lua +msgid "Kitten" +msgstr "Yavru kedi" + +#: penguin.lua +msgid "Penguin" +msgstr "" + +#: rat.lua +msgid "Rat" +msgstr "Sıçan" + +#: rat.lua +msgid "Cooked Rat" +msgstr "Pişmiş sıçan" + +#: sheep.lua +msgid "Black" +msgstr "Siyah" + +#: sheep.lua +msgid "Blue" +msgstr "Mavi" + +#: sheep.lua +msgid "Brown" +msgstr "Kahverengi" + +#: sheep.lua +msgid "Cyan" +msgstr "Camgöbeği" + +#: sheep.lua +msgid "Dark Green" +msgstr "Koyu yeşil" + +#: sheep.lua +msgid "Dark Grey" +msgstr "Koyu gri" + +#: sheep.lua +msgid "Green" +msgstr "Yeşil" + +#: sheep.lua +msgid "Grey" +msgstr "Gri" + +#: sheep.lua +msgid "Magenta" +msgstr "Macenta" + +#: sheep.lua +msgid "Orange" +msgstr "Turuncu" + +#: sheep.lua +msgid "Pink" +msgstr "Pembe" + +#: sheep.lua +msgid "Red" +msgstr "Kırmızı" + +#: sheep.lua +msgid "Violet" +msgstr "Mor" + +#: sheep.lua +msgid "White" +msgstr "Beyaz" + +#: sheep.lua +msgid "Yellow" +msgstr "Sarı" + +#: sheep.lua +#, fuzzy +msgid "@1 Sheep" +msgstr "@1 Koyun" + +#: sheep.lua +msgid "Raw Mutton" +msgstr "çiğ kuzu" + +#: sheep.lua +#, fuzzy +msgid "Cooked Mutton" +msgstr "pişmiş kuzu" + +#: warthog.lua +msgid "Warthog" +msgstr "Domuz" + +#: warthog.lua +msgid "Raw Porkchop" +msgstr "Çiğ pirzola" + +#: warthog.lua +msgid "Cooked Porkchop" +msgstr "Pişmiş pirzola" diff --git a/mods/Mobs/mobs_animal/mod.conf b/mods/Mobs/mobs_animal/mod.conf new file mode 100644 index 0000000..e2080bc --- /dev/null +++ b/mods/Mobs/mobs_animal/mod.conf @@ -0,0 +1 @@ +name = mobs_animal diff --git a/mods/Mobs/mobs_animal/models/additional animations.txt b/mods/Mobs/mobs_animal/models/additional animations.txt new file mode 100644 index 0000000..0d036f9 --- /dev/null +++ b/mods/Mobs/mobs_animal/models/additional animations.txt @@ -0,0 +1,9 @@ +Human animations: + +static: +frame 3 - sleeping (on bed) + +animated: +280 - 340 : walking +350 - 380 : digging +390 - 450 : standing \ No newline at end of file diff --git a/mods/Mobs/mobs_animal/models/explained.png b/mods/Mobs/mobs_animal/models/explained.png new file mode 100644 index 0000000..2c55fb2 Binary files /dev/null and b/mods/Mobs/mobs_animal/models/explained.png differ diff --git a/mods/Mobs/mobs_animal/models/mobs_adult.b3d b/mods/Mobs/mobs_animal/models/mobs_adult.b3d new file mode 100644 index 0000000..9f4e294 Binary files /dev/null and b/mods/Mobs/mobs_animal/models/mobs_adult.b3d differ diff --git a/mods/Mobs/mobs_animal/models/mobs_baby.b3d b/mods/Mobs/mobs_animal/models/mobs_baby.b3d new file mode 100644 index 0000000..397be0c Binary files /dev/null and b/mods/Mobs/mobs_animal/models/mobs_baby.b3d differ diff --git a/mods/Mobs/mobs_animal/models/uvmap.png b/mods/Mobs/mobs_animal/models/uvmap.png new file mode 100644 index 0000000..05eb051 Binary files /dev/null and b/mods/Mobs/mobs_animal/models/uvmap.png differ diff --git a/mods/Mobs/mobs_animal/readme.md b/mods/Mobs/mobs_animal/readme.md new file mode 100644 index 0000000..275193d --- /dev/null +++ b/mods/Mobs/mobs_animal/readme.md @@ -0,0 +1,45 @@ +# ANIMAL MOBS + +### Bee +Tends to buzz around flowers and gives honey when killed, you can also right-click a bee to pick it up and place in inventory. 3x bee's in a row can craft a beehive. + +--- +### Bunny +Bunnies appear in green grass areas (prairie biome in ethereal) and can be tamed with 4 carrots or grass. Can also be picked up and placed in inventory and gives 1 raw rabbit and 1 rabbit hide when killed. + +--- +### Chicken +Found in green areas (bamboo biome in ethereal) and lays eggs on flat ground, Can be picked up and placed in inventory and gives 1-2 raw chicken when killed. Feed 8x wheat seed to breed. + +--- +### Cow +Wanders around eating grass/wheat and can be right-clicked with empty bucket to get milk. Cows will defend themselves when hit and can be right-clicked with 8x wheat to tame and breed. + +--- +### Kitten +Found on green grass these cute cats walk around and can be picked up and placed in inventory as pets or right-clicked with 4x live rats or raw fish (found in ethereal) and tamed. They can sometimes leave you little gifts of a hairball. + +--- +### Rat +Typically found around stone they can be picked up and cooked for eating. + +--- +### Sheep +Green grass and wheat munchers that can be clipped using shears to give 1-3 wool. Feed sheep 8x wheat to regrow wool, tame and breed. Right-click a tamed sheep with dye to change it's colour. Will drop 1-3 raw mutton when killed. + +--- +### Warthog +Warthogs unlike pigs defend themselves when hit and give 1-3 raw pork when killed, they can also be right-clicked with 8x apples to tame or breed. + +--- +### Penguin +These little guys can be found in glacier biomes on top of snow and have the ability to swim if they fall into water. + +--- +### Panda +These monochrome cuties spawn in Ethereal's bamboo biome and can be tamed with bamboo stalks :) Remember they have claws though. + +--- +*Note: After breeding, animals need to rest for 4 minutes and baby animals take 4 minutes to grow up, also feeding them helps them grow quicker...* + +#### Lucky Blocks: 15 diff --git a/mods/Mobs/mobs_animal/sounds/mobs_bee.ogg b/mods/Mobs/mobs_animal/sounds/mobs_bee.ogg new file mode 100644 index 0000000..5317518 Binary files /dev/null and b/mods/Mobs/mobs_animal/sounds/mobs_bee.ogg differ diff --git a/mods/Mobs/mobs_animal/sounds/mobs_chicken.ogg b/mods/Mobs/mobs_animal/sounds/mobs_chicken.ogg new file mode 100644 index 0000000..be64c94 Binary files /dev/null and b/mods/Mobs/mobs_animal/sounds/mobs_chicken.ogg differ diff --git a/mods/Mobs/mobs_animal/sounds/mobs_cow.ogg b/mods/Mobs/mobs_animal/sounds/mobs_cow.ogg new file mode 100644 index 0000000..e919c6b Binary files /dev/null and b/mods/Mobs/mobs_animal/sounds/mobs_cow.ogg differ diff --git a/mods/Mobs/mobs_animal/sounds/mobs_kitten.ogg b/mods/Mobs/mobs_animal/sounds/mobs_kitten.ogg new file mode 100644 index 0000000..021d3dc Binary files /dev/null and b/mods/Mobs/mobs_animal/sounds/mobs_kitten.ogg differ diff --git a/mods/Mobs/mobs_animal/sounds/mobs_panda.ogg b/mods/Mobs/mobs_animal/sounds/mobs_panda.ogg new file mode 100644 index 0000000..1c4c7d2 Binary files /dev/null and b/mods/Mobs/mobs_animal/sounds/mobs_panda.ogg differ diff --git a/mods/Mobs/mobs_animal/sounds/mobs_pig.ogg b/mods/Mobs/mobs_animal/sounds/mobs_pig.ogg new file mode 100644 index 0000000..e7c7591 Binary files /dev/null and b/mods/Mobs/mobs_animal/sounds/mobs_pig.ogg differ diff --git a/mods/Mobs/mobs_animal/sounds/mobs_pig_angry.ogg b/mods/Mobs/mobs_animal/sounds/mobs_pig_angry.ogg new file mode 100644 index 0000000..2a4f47b Binary files /dev/null and b/mods/Mobs/mobs_animal/sounds/mobs_pig_angry.ogg differ diff --git a/mods/Mobs/mobs_animal/sounds/mobs_rat.ogg b/mods/Mobs/mobs_animal/sounds/mobs_rat.ogg new file mode 100644 index 0000000..0e99267 Binary files /dev/null and b/mods/Mobs/mobs_animal/sounds/mobs_rat.ogg differ diff --git a/mods/Mobs/mobs_animal/sounds/mobs_sheep.ogg b/mods/Mobs/mobs_animal/sounds/mobs_sheep.ogg new file mode 100644 index 0000000..54f62cd Binary files /dev/null and b/mods/Mobs/mobs_animal/sounds/mobs_sheep.ogg differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_alien.png b/mods/Mobs/mobs_animal/textures/mobs_alien.png new file mode 100644 index 0000000..f348aea Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_alien.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_bee.png b/mods/Mobs/mobs_animal/textures/mobs_bee.png new file mode 100644 index 0000000..654515f Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_bee.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_bee_inv.png b/mods/Mobs/mobs_animal/textures/mobs_bee_inv.png new file mode 100644 index 0000000..94d5ace Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_bee_inv.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_beehive.png b/mods/Mobs/mobs_animal/textures/mobs_beehive.png new file mode 100644 index 0000000..7bd1401 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_beehive.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_bucket_milk.png b/mods/Mobs/mobs_animal/textures/mobs_bucket_milk.png new file mode 100644 index 0000000..c897957 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_bucket_milk.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_bunny_brown.png b/mods/Mobs/mobs_animal/textures/mobs_bunny_brown.png new file mode 100644 index 0000000..3a71d94 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_bunny_brown.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_bunny_evil.png b/mods/Mobs/mobs_animal/textures/mobs_bunny_evil.png new file mode 100644 index 0000000..683170d Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_bunny_evil.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_bunny_grey.png b/mods/Mobs/mobs_animal/textures/mobs_bunny_grey.png new file mode 100644 index 0000000..d41d6c1 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_bunny_grey.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_bunny_inv.png b/mods/Mobs/mobs_animal/textures/mobs_bunny_inv.png new file mode 100644 index 0000000..762b713 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_bunny_inv.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_bunny_white.png b/mods/Mobs/mobs_animal/textures/mobs_bunny_white.png new file mode 100644 index 0000000..0445e88 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_bunny_white.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_butter.png b/mods/Mobs/mobs_animal/textures/mobs_butter.png new file mode 100644 index 0000000..2e84349 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_butter.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_cheese.png b/mods/Mobs/mobs_animal/textures/mobs_cheese.png new file mode 100644 index 0000000..04e03d8 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_cheese.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_cheeseblock.png b/mods/Mobs/mobs_animal/textures/mobs_cheeseblock.png new file mode 100644 index 0000000..dfa7c18 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_cheeseblock.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_chick.png b/mods/Mobs/mobs_animal/textures/mobs_chick.png new file mode 100644 index 0000000..90994e5 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_chick.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_chicken.png b/mods/Mobs/mobs_animal/textures/mobs_chicken.png new file mode 100644 index 0000000..19cbd15 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_chicken.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_chicken_black.png b/mods/Mobs/mobs_animal/textures/mobs_chicken_black.png new file mode 100644 index 0000000..9f51a8a Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_chicken_black.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_chicken_cooked.png b/mods/Mobs/mobs_animal/textures/mobs_chicken_cooked.png new file mode 100644 index 0000000..bda35f3 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_chicken_cooked.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_chicken_egg_fried.png b/mods/Mobs/mobs_animal/textures/mobs_chicken_egg_fried.png new file mode 100644 index 0000000..ad144a5 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_chicken_egg_fried.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_chicken_feather.png b/mods/Mobs/mobs_animal/textures/mobs_chicken_feather.png new file mode 100644 index 0000000..b6ae211 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_chicken_feather.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_chicken_inv.png b/mods/Mobs/mobs_animal/textures/mobs_chicken_inv.png new file mode 100644 index 0000000..ccaca24 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_chicken_inv.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_chicken_raw.png b/mods/Mobs/mobs_animal/textures/mobs_chicken_raw.png new file mode 100644 index 0000000..3987a4a Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_chicken_raw.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_cooked_rat.png b/mods/Mobs/mobs_animal/textures/mobs_cooked_rat.png new file mode 100644 index 0000000..daad3be Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_cooked_rat.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_cow.png b/mods/Mobs/mobs_animal/textures/mobs_cow.png new file mode 100644 index 0000000..8656a7c Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_cow.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_cow2.png b/mods/Mobs/mobs_animal/textures/mobs_cow2.png new file mode 100644 index 0000000..68a8e5e Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_cow2.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_hairball.png b/mods/Mobs/mobs_animal/textures/mobs_hairball.png new file mode 100644 index 0000000..0628c95 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_hairball.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_honey_block.png b/mods/Mobs/mobs_animal/textures/mobs_honey_block.png new file mode 100644 index 0000000..8f05e77 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_honey_block.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_honey_inv.png b/mods/Mobs/mobs_animal/textures/mobs_honey_inv.png new file mode 100644 index 0000000..e70666d Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_honey_inv.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_kitten_ginger.png b/mods/Mobs/mobs_animal/textures/mobs_kitten_ginger.png new file mode 100644 index 0000000..1707c2e Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_kitten_ginger.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_kitten_inv.png b/mods/Mobs/mobs_animal/textures/mobs_kitten_inv.png new file mode 100644 index 0000000..6afa61f Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_kitten_inv.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_kitten_sandy.png b/mods/Mobs/mobs_animal/textures/mobs_kitten_sandy.png new file mode 100644 index 0000000..052f04e Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_kitten_sandy.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_kitten_splotchy.png b/mods/Mobs/mobs_animal/textures/mobs_kitten_splotchy.png new file mode 100644 index 0000000..1fad994 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_kitten_splotchy.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_kitten_striped.png b/mods/Mobs/mobs_animal/textures/mobs_kitten_striped.png new file mode 100644 index 0000000..4d1a0cc Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_kitten_striped.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_mutton_cooked.png b/mods/Mobs/mobs_animal/textures/mobs_mutton_cooked.png new file mode 100644 index 0000000..3189f67 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_mutton_cooked.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_mutton_raw.png b/mods/Mobs/mobs_animal/textures/mobs_mutton_raw.png new file mode 100644 index 0000000..622d84c Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_mutton_raw.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_panda.png b/mods/Mobs/mobs_animal/textures/mobs_panda.png new file mode 100644 index 0000000..21c3da8 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_panda.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_penguin.png b/mods/Mobs/mobs_animal/textures/mobs_penguin.png new file mode 100644 index 0000000..f7928d3 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_penguin.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_pig.png b/mods/Mobs/mobs_animal/textures/mobs_pig.png new file mode 100644 index 0000000..71212b9 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_pig.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_pork_cooked.png b/mods/Mobs/mobs_animal/textures/mobs_pork_cooked.png new file mode 100644 index 0000000..8d8c166 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_pork_cooked.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_pork_raw.png b/mods/Mobs/mobs_animal/textures/mobs_pork_raw.png new file mode 100644 index 0000000..c070c57 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_pork_raw.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_pumba.png b/mods/Mobs/mobs_animal/textures/mobs_pumba.png new file mode 100644 index 0000000..ce87f6a Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_pumba.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_rabbit_cooked.png b/mods/Mobs/mobs_animal/textures/mobs_rabbit_cooked.png new file mode 100644 index 0000000..310c904 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_rabbit_cooked.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_rabbit_hide.png b/mods/Mobs/mobs_animal/textures/mobs_rabbit_hide.png new file mode 100644 index 0000000..b45ad83 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_rabbit_hide.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_rabbit_raw.png b/mods/Mobs/mobs_animal/textures/mobs_rabbit_raw.png new file mode 100644 index 0000000..b5c3b7d Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_rabbit_raw.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_rat.png b/mods/Mobs/mobs_animal/textures/mobs_rat.png new file mode 100644 index 0000000..f83da08 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_rat.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_rat2.png b/mods/Mobs/mobs_animal/textures/mobs_rat2.png new file mode 100644 index 0000000..a8670df Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_rat2.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_rat_inventory.png b/mods/Mobs/mobs_animal/textures/mobs_rat_inventory.png new file mode 100644 index 0000000..a8d6151 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_rat_inventory.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_sheep_base.png b/mods/Mobs/mobs_animal/textures/mobs_sheep_base.png new file mode 100644 index 0000000..c3c2c4a Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_sheep_base.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_sheep_shaved.png b/mods/Mobs/mobs_animal/textures/mobs_sheep_shaved.png new file mode 100644 index 0000000..e9023a4 Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_sheep_shaved.png differ diff --git a/mods/Mobs/mobs_animal/textures/mobs_sheep_wool.png b/mods/Mobs/mobs_animal/textures/mobs_sheep_wool.png new file mode 100644 index 0000000..2dca0dc Binary files /dev/null and b/mods/Mobs/mobs_animal/textures/mobs_sheep_wool.png differ diff --git a/mods/Mobs/modpack.txt b/mods/Mobs/modpack.txt new file mode 100644 index 0000000..e69de29 diff --git a/mods/Nodes/carpet/README.txt b/mods/Nodes/carpet/README.txt new file mode 100644 index 0000000..50a8660 --- /dev/null +++ b/mods/Nodes/carpet/README.txt @@ -0,0 +1,28 @@ +Carpets Mod for Minetest. + +By Jordan Snelling, 2012 + +License, LGPL. + +WARNING: + +This mod utilizes the Wool Mod found in minetest_games as of 0.4.2rc-1. + +If you are ruuning 0.4.1 / 0.4.0 / 0.4-dev; + +please download my other mod; + +http://minetest.net/forum/viewtopic.php?pid=23855#p23855 + +16 colours; or; + +http://minetest.net/forum/viewtopic.php?pid=24066#p24066 + +32 colours with spawning flowers. + +----------------------- + +Notes: There is a reason why the mod is in a folder, it is far easier than to rename a zipball than it is to just have a mod folder, which is extracted with the SAME name. + +----------------------- + diff --git a/mods/Nodes/carpet/depends.txt b/mods/Nodes/carpet/depends.txt new file mode 100644 index 0000000..22ed7be --- /dev/null +++ b/mods/Nodes/carpet/depends.txt @@ -0,0 +1,2 @@ +default +color \ No newline at end of file diff --git a/mods/Nodes/carpet/init.lua b/mods/Nodes/carpet/init.lua new file mode 100644 index 0000000..d3deb6a --- /dev/null +++ b/mods/Nodes/carpet/init.lua @@ -0,0 +1,40 @@ +-- Carpet Mod! +-- By Jordan Snelling 2012 +-- License LGPL +-- This mod adds carpets into Minetest. + +local dyes = { + {"black", "Darkened", color1}, + {"blue", "Blue", color2}, + {"green", "Green", color3}, + {"white", "White", color4}, + {"orange", "Orange", color5}, + {"red", "Red", color6}, + {"yellow", "Yellow", color7}, + {"pink", "pink", color8} +} +for i = 1, #dyes do + local name, desc, colour = unpack(dyes[i]) + + minetest.register_node("carpet:" .. name, { + +description = desc .. " Carpet color", + drawtype = "raillike", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + wield_image = "color_hand" .. name .. ".png", + inventory_image = "carpets.png^[colorize:#"..colour..":70", + wield_scale = {x=1,y=1,z=0.5}, + paramtype = "light", + is_ground_content = true, + walkable = false, + buildable_to = true, + selection_box = { + type = "fixed", + + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + groups = {dig_immediate=3}, + + }) + +end diff --git a/mods/Nodes/color/README.txt b/mods/Nodes/color/README.txt new file mode 100644 index 0000000..cbd240f --- /dev/null +++ b/mods/Nodes/color/README.txt @@ -0,0 +1,8 @@ +Minetest Game mod: give_initial_stuff +===================================== +See license.txt for license information. + +Authors of source code +---------------------- +Perttu Ahola (celeron55) (MIT) +Various Minetest developers and contributors (MIT) diff --git a/mods/Nodes/color/depends.txt b/mods/Nodes/color/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/Nodes/color/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/Nodes/color/init.lua b/mods/Nodes/color/init.lua new file mode 100644 index 0000000..3b9f9e6 --- /dev/null +++ b/mods/Nodes/color/init.lua @@ -0,0 +1,45 @@ +color1 = minetest.setting_get("color1") or "292421" +color2 = minetest.setting_get("color2") or "0000FF" +color3 = minetest.setting_get("color3") or "00FF00" +color4 = minetest.setting_get("color4") or "F5F5F5" +color5 = minetest.setting_get("color5") or "FF6103" +color6 = minetest.setting_get("color6") or "FF0000" +color7 = minetest.setting_get("color7") or "FFFF00" +color8 = minetest.setting_get("color8") or "FF69B4" + +local source_list = { + {"black", "Color1", color1, 40, 36, 33}, + {"blue", "Color2", color2, 0, 0, 255}, + {"green", "Color3", color3, 0, 255, 0}, + {"white", "Color4", color4, 245, 245, 245}, + {"orange", "Color5", color5, 255, 97, 3}, + {"red", "Color6", color6, 255, 0, 0}, + {"yellow", "Color7", color7, 255, 255, 0}, + {"pink", "Color8", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local name = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + + minetest.register_node("color:" .. name, { + + description = desc .. " color", + + inventory_image = "blocks.png^[colorize:#"..colour..":70", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + is_ground_content = true, + groups = {snappy = 2, choppy = 2, wool = 2}, + sounds = default.node_sound_defaults(), + oddly_breakable_by_hand = 1, + dig_immediate = 3, + + }) + +end diff --git a/mods/Nodes/color/license.txt b/mods/Nodes/color/license.txt new file mode 100644 index 0000000..dfbd241 --- /dev/null +++ b/mods/Nodes/color/license.txt @@ -0,0 +1,38 @@ +License for Textures Peak : CCO + +color_yellow.png +color_orange.png +color_blue.png +color_green.png +color_pink.png +color_red.png +color_white.png +color_black.png + +https://creativecommons.org/publicdomain/zero/1.0/deed.fr + +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/Nodes/color/textures/color_black.png b/mods/Nodes/color/textures/color_black.png new file mode 100644 index 0000000..22e8ae6 Binary files /dev/null and b/mods/Nodes/color/textures/color_black.png differ diff --git a/mods/Nodes/color/textures/color_blue.png b/mods/Nodes/color/textures/color_blue.png new file mode 100644 index 0000000..d97055f Binary files /dev/null and b/mods/Nodes/color/textures/color_blue.png differ diff --git a/mods/Nodes/color/textures/color_green.png b/mods/Nodes/color/textures/color_green.png new file mode 100644 index 0000000..d677e80 Binary files /dev/null and b/mods/Nodes/color/textures/color_green.png differ diff --git a/mods/Nodes/color/textures/color_handblack.png b/mods/Nodes/color/textures/color_handblack.png new file mode 100644 index 0000000..356c56c Binary files /dev/null and b/mods/Nodes/color/textures/color_handblack.png differ diff --git a/mods/Nodes/color/textures/color_handblue.png b/mods/Nodes/color/textures/color_handblue.png new file mode 100644 index 0000000..b314209 Binary files /dev/null and b/mods/Nodes/color/textures/color_handblue.png differ diff --git a/mods/Nodes/color/textures/color_handgreen.png b/mods/Nodes/color/textures/color_handgreen.png new file mode 100644 index 0000000..b03934e Binary files /dev/null and b/mods/Nodes/color/textures/color_handgreen.png differ diff --git a/mods/Nodes/color/textures/color_handorange.png b/mods/Nodes/color/textures/color_handorange.png new file mode 100644 index 0000000..17998f2 Binary files /dev/null and b/mods/Nodes/color/textures/color_handorange.png differ diff --git a/mods/Nodes/color/textures/color_handpink.png b/mods/Nodes/color/textures/color_handpink.png new file mode 100644 index 0000000..fc39c53 Binary files /dev/null and b/mods/Nodes/color/textures/color_handpink.png differ diff --git a/mods/Nodes/color/textures/color_handred.png b/mods/Nodes/color/textures/color_handred.png new file mode 100644 index 0000000..40f1f0b Binary files /dev/null and b/mods/Nodes/color/textures/color_handred.png differ diff --git a/mods/Nodes/color/textures/color_handwhite.png b/mods/Nodes/color/textures/color_handwhite.png new file mode 100644 index 0000000..2efb0cb Binary files /dev/null and b/mods/Nodes/color/textures/color_handwhite.png differ diff --git a/mods/Nodes/color/textures/color_handyellow.png b/mods/Nodes/color/textures/color_handyellow.png new file mode 100644 index 0000000..aab471c Binary files /dev/null and b/mods/Nodes/color/textures/color_handyellow.png differ diff --git a/mods/Nodes/color/textures/color_no.png b/mods/Nodes/color/textures/color_no.png new file mode 100644 index 0000000..07f7b0e Binary files /dev/null and b/mods/Nodes/color/textures/color_no.png differ diff --git a/mods/Nodes/color/textures/color_orange.png b/mods/Nodes/color/textures/color_orange.png new file mode 100644 index 0000000..9f381c0 Binary files /dev/null and b/mods/Nodes/color/textures/color_orange.png differ diff --git a/mods/Nodes/color/textures/color_pink.png b/mods/Nodes/color/textures/color_pink.png new file mode 100644 index 0000000..ab1a21e Binary files /dev/null and b/mods/Nodes/color/textures/color_pink.png differ diff --git a/mods/Nodes/color/textures/color_red.png b/mods/Nodes/color/textures/color_red.png new file mode 100644 index 0000000..30d22fb Binary files /dev/null and b/mods/Nodes/color/textures/color_red.png differ diff --git a/mods/Nodes/color/textures/color_white.png b/mods/Nodes/color/textures/color_white.png new file mode 100644 index 0000000..a6c6ff8 Binary files /dev/null and b/mods/Nodes/color/textures/color_white.png differ diff --git a/mods/Nodes/color/textures/color_yellow.png b/mods/Nodes/color/textures/color_yellow.png new file mode 100644 index 0000000..9ad3a50 Binary files /dev/null and b/mods/Nodes/color/textures/color_yellow.png differ diff --git a/mods/Nodes/color/textures/description.txt b/mods/Nodes/color/textures/description.txt new file mode 100644 index 0000000..df47417 --- /dev/null +++ b/mods/Nodes/color/textures/description.txt @@ -0,0 +1,3 @@ +slightly improved textures for the game BlockColor +16x16 + diff --git a/mods/Nodes/color/textures/screenshot.png b/mods/Nodes/color/textures/screenshot.png new file mode 100644 index 0000000..270ce99 Binary files /dev/null and b/mods/Nodes/color/textures/screenshot.png differ diff --git a/mods/Nodes/doors/README.txt b/mods/Nodes/doors/README.txt new file mode 100644 index 0000000..9ad7093 --- /dev/null +++ b/mods/Nodes/doors/README.txt @@ -0,0 +1,84 @@ +Minetest Game mod: doors +======================== +See license.txt for license information. + +Authors of source code +---------------------- +Originally by PilzAdam (MIT) + +Modified by BlockMen (MIT): Added sounds, glass doors (glass, obsidian glass) and trapdoor. + +Modified by sofar (sofar@foo-projects.org) (MIT): +Added Steel trapdoor. +Re-implemented most of the door algorithms, added meshes, UV wrapped texture. +Added doors API to facilitate coding mods accessing and operating doors. +Added Fence Gate model, code, and sounds. + +Various Minetest developers and contributors (MIT) + + +Authors of media (textures) +--------------------------- +Following textures created by Fernando Zapata (CC BY-SA 3.0): + door_wood.png + door_wood_a.png + door_wood_a_r.png + door_wood_b.png + door_wood_b_r.png + +Following textures created by BlockMen (CC BY-SA 3.0): + door_trapdoor.png + door_obsidian_glass_side.png + +Following textures created by celeron55 (CC BY-SA 3.0): + door_glass_a.png + door_glass_b.png + +Following textures created by PenguinDad (CC BY-SA 4.0): + door_glass.png + door_obsidian_glass.png + +Following textures created by sofar (CC-BY-SA-3.0): + doors_trapdoor_steel.png + doors_trapdoor_steel_side.png + door_trapdoor_side.png + +Obsidian door textures by red-001 based on textures by Pilzadam and BlockMen (CC BY-SA 3.0): + door_obsidian_glass.png + +Glass door textures by red-001 based on textures by celeron55 (CC BY-SA 3.0): + door_glass.png + +All other textures (created by PilzAdam) (CC BY-SA 3.0): + +Door textures were converted to the new texture map by sofar, paramat and +red-001, under the same license as the originals. + + +Authors of media (models) +------------------------- +Door 3d models by sofar (CC-BY-SA-3.0) + - door_a.obj + - door_b.obj +Fence gate models by sofar (CC-BY-SA-3.0) + - fencegate_open.obj + - fencegate_closed.obj + + +Authors of media (sounds) +------------------------- +Opening-Sound created by CGEffex (CC BY 3.0), modified by BlockMen + door_open.ogg +Closing-Sound created by bennstir (CC BY 3.0) + door_close.ogg +fencegate_open.ogg: + http://www.freesound.org/people/mhtaylor67/sounds/126041/ - (CC0 1.0) +fencegate_close.ogg: + http://www.freesound.org/people/BarkersPinhead/sounds/274807/ - (CC-BY-3.0) + http://www.freesound.org/people/rivernile7/sounds/249573/ - (CC-BY-3.0) +Steel door sounds open & close (CC-BY-3.0) by HazMatt + - http://www.freesound.org/people/HazMattt/sounds/187283/ + doors_steel_door_open.ogg + doors_steel_door_close.ogg +doors_glass_door_open.ogg, doors_glass_door_close.ogg: + https://www.freesound.org/people/SkeetMasterFunk69/sounds/235546/ (CC0 1.0) diff --git a/mods/Nodes/doors/depends.txt b/mods/Nodes/doors/depends.txt new file mode 100644 index 0000000..9bc856f --- /dev/null +++ b/mods/Nodes/doors/depends.txt @@ -0,0 +1,2 @@ +default +color diff --git a/mods/Nodes/doors/init.lua b/mods/Nodes/doors/init.lua new file mode 100644 index 0000000..1422d17 --- /dev/null +++ b/mods/Nodes/doors/init.lua @@ -0,0 +1,777 @@ +-- our API object +doors = {} + +-- private data +local _doors = {} +_doors.registered_doors = {} +_doors.registered_trapdoors = {} + +local function replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("doors_owner") + if owner and owner ~= "" then + meta:set_string("owner", owner) + meta:set_string("doors_owner", "") + end +end + +-- returns an object to a door object or nil +function doors.get(pos) + local node_name = minetest.get_node(pos).name + if _doors.registered_doors[node_name] then + -- A normal upright door + return { + pos = pos, + open = function(self, player) + if self:state() then + return false + end + return _doors.door_toggle(self.pos, nil, player) + end, + close = function(self, player) + if not self:state() then + return false + end + return _doors.door_toggle(self.pos, nil, player) + end, + toggle = function(self, player) + return _doors.door_toggle(self.pos, nil, player) + end, + state = function(self) + local state = minetest.get_meta(self.pos):get_int("state") + return state %2 == 1 + end + } + elseif _doors.registered_trapdoors[node_name] then + -- A trapdoor + return { + pos = pos, + open = function(self, player) + if self:state() then + return false + end + return _doors.trapdoor_toggle(self.pos, nil, player) + end, + close = function(self, player) + if not self:state() then + return false + end + return _doors.trapdoor_toggle(self.pos, nil, player) + end, + toggle = function(self, player) + return _doors.trapdoor_toggle(self.pos, nil, player) + end, + state = function(self) + return minetest.get_node(self.pos).name:sub(-5) == "_open" + end + } + else + return nil + end +end + +-- this hidden node is placed on top of the bottom, and prevents +-- nodes from being placed in the top half of the door. +minetest.register_node("doors:hidden", { + description = "Hidden Door Segment", + -- can't use airlike otherwise falling nodes will turn to entities + -- and will be forever stuck until door is removed. + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + -- has to be walkable for falling nodes to stop falling. + walkable = true, + pointable = false, + diggable = false, + buildable_to = false, + floodable = false, + drop = "", + groups = {not_in_creative_inventory = 1}, + on_blast = function() end, + tiles = {"doors_blank.png"}, + -- 1px transparent block inside door hinge near node top. + node_box = { + type = "fixed", + fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32}, + }, + -- collision_box needed otherise selection box would be full node size + collision_box = { + type = "fixed", + fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32}, + }, +}) + +-- table used to aid door opening/closing +local transform = { + { + {v = "_a", param2 = 3}, + {v = "_a", param2 = 0}, + {v = "_a", param2 = 1}, + {v = "_a", param2 = 2}, + }, + { + {v = "_b", param2 = 1}, + {v = "_b", param2 = 2}, + {v = "_b", param2 = 3}, + {v = "_b", param2 = 0}, + }, + { + {v = "_b", param2 = 1}, + {v = "_b", param2 = 2}, + {v = "_b", param2 = 3}, + {v = "_b", param2 = 0}, + }, + { + {v = "_a", param2 = 3}, + {v = "_a", param2 = 0}, + {v = "_a", param2 = 1}, + {v = "_a", param2 = 2}, + }, +} + +function _doors.door_toggle(pos, node, clicker) + local meta = minetest.get_meta(pos) + node = node or minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + local name = def.door.name + + local state = meta:get_string("state") + if state == "" then + -- fix up lvm-placed right-hinged doors, default closed + if node.name:sub(-2) == "_b" then + state = 2 + else + state = 0 + end + else + state = tonumber(state) + end + + replace_old_owner_information(pos) + + if clicker and not default.can_interact_with_node(clicker, pos) then + return false + end + + -- until Lua-5.2 we have no bitwise operators :( + if state % 2 == 1 then + state = state - 1 + else + state = state + 1 + end + + local dir = node.param2 + if state % 2 == 0 then + minetest.sound_play(def.door.sounds[1], + {pos = pos, gain = 0.3, max_hear_distance = 10}) + else + minetest.sound_play(def.door.sounds[2], + {pos = pos, gain = 0.3, max_hear_distance = 10}) + end + + minetest.swap_node(pos, { + name = name .. transform[state + 1][dir+1].v, + param2 = transform[state + 1][dir+1].param2 + }) + meta:set_int("state", state) + + return true +end + + +local function on_place_node(place_to, newnode, + placer, oldnode, itemstack, pointed_thing) + -- Run script hook + for _, callback in ipairs(minetest.registered_on_placenodes) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + local place_to_copy = {x = place_to.x, y = place_to.y, z = place_to.z} + local newnode_copy = + {name = newnode.name, param1 = newnode.param1, param2 = newnode.param2} + local oldnode_copy = + {name = oldnode.name, param1 = oldnode.param1, param2 = oldnode.param2} + local pointed_thing_copy = { + type = pointed_thing.type, + above = vector.new(pointed_thing.above), + under = vector.new(pointed_thing.under), + ref = pointed_thing.ref, + } + callback(place_to_copy, newnode_copy, placer, + oldnode_copy, itemstack, pointed_thing_copy) + end +end + +local function can_dig_door(pos, digger) + replace_old_owner_information(pos) + if default.can_interact_with_node(digger, pos) then + return true + else + minetest.record_protection_violation(pos, digger:get_player_name()) + return false + end +end + +function doors.register(name, def) + if not name:find(":") then + name = "doors:" .. name + end + + -- replace old doors of this type automatically + minetest.register_lbm({ + name = ":doors:replace_" .. name:gsub(":", "_"), + nodenames = {name.."_b_1", name.."_b_2"}, + action = function(pos, node) + local l = tonumber(node.name:sub(-1)) + local meta = minetest.get_meta(pos) + local h = meta:get_int("right") + 1 + local p2 = node.param2 + local replace = { + {{type = "a", state = 0}, {type = "a", state = 3}}, + {{type = "b", state = 1}, {type = "b", state = 2}} + } + local new = replace[l][h] + -- retain infotext and doors_owner fields + minetest.swap_node(pos, {name = name .. "_" .. new.type, param2 = p2}) + meta:set_int("state", new.state) + -- properly place doors:hidden at the right spot + local p3 = p2 + if new.state >= 2 then + p3 = (p3 + 3) % 4 + end + if new.state % 2 == 1 then + if new.state >= 2 then + p3 = (p3 + 1) % 4 + else + p3 = (p3 + 3) % 4 + end + end + -- wipe meta on top node as it's unused + minetest.set_node({x = pos.x, y = pos.y + 1, z = pos.z}, + {name = "doors:hidden", param2 = p3}) + end + }) + + minetest.register_craftitem(":" .. name, { + description = def.description, + inventory_image = def.inventory_image, + wield_image = def.wield_image, + wield_scale = def.wield_scale, + + groups = table.copy(def.groups), + + on_place = function(itemstack, placer, pointed_thing) + local pos + + if not pointed_thing.type == "node" then + return itemstack + end + + local node = minetest.get_node(pointed_thing.under) + local pdef = minetest.registered_nodes[node.name] + if pdef and pdef.on_rightclick and + not placer:get_player_control().sneak then + return pdef.on_rightclick(pointed_thing.under, + node, placer, itemstack, pointed_thing) + end + + if pdef and pdef.buildable_to then + pos = pointed_thing.under + else + pos = pointed_thing.above + node = minetest.get_node(pos) + pdef = minetest.registered_nodes[node.name] + if not pdef or not pdef.buildable_to then + return itemstack + end + end + + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local top_node = minetest.get_node_or_nil(above) + local topdef = top_node and minetest.registered_nodes[top_node.name] + + if not topdef or not topdef.buildable_to then + return itemstack + end + + local pn = placer:get_player_name() + if minetest.is_protected(pos, pn) or minetest.is_protected(above, pn) then + return itemstack + end + + local dir = minetest.dir_to_facedir(placer:get_look_dir()) + + local ref = { + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, + } + + local aside = { + x = pos.x + ref[dir + 1].x, + y = pos.y + ref[dir + 1].y, + z = pos.z + ref[dir + 1].z, + } + + local state = 0 + if minetest.get_item_group(minetest.get_node(aside).name, "door") == 1 then + state = state + 2 + minetest.set_node(pos, {name = name .. "_b", param2 = dir}) + minetest.set_node(above, {name = "doors:hidden", param2 = (dir + 3) % 4}) + else + minetest.set_node(pos, {name = name .. "_a", param2 = dir}) + minetest.set_node(above, {name = "doors:hidden", param2 = dir}) + end + + local meta = minetest.get_meta(pos) + meta:set_int("state", state) + + if def.protected then + meta:set_string("owner", pn) + meta:set_string("infotext", "Owned by " .. pn) + end + + if not (creative and creative.is_enabled_for and creative.is_enabled_for(pn)) then + itemstack:take_item() + end + + minetest.sound_play(def.sounds.place, {pos = pos}) + + on_place_node(pos, minetest.get_node(pos), + placer, node, itemstack, pointed_thing) + + return itemstack + end + }) + def.inventory_image = nil + def.wield_image = nil +def.wield_scale = nil + + if def.recipe then + minetest.register_craft({ + output = name, + recipe = def.recipe, + }) + end + def.recipe = nil + + if not def.sounds then + def.sounds = default.node_sound_wood_defaults() + end + + if not def.sound_open then + def.sound_open = "doors_door_open" + end + + if not def.sound_close then + def.sound_close = "doors_door_close" + end + + def.groups.not_in_creative_inventory = 1 + def.groups.door = 1 + def.drop = name + def.door = { + name = name, + sounds = { def.sound_close, def.sound_open }, + } + + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + _doors.door_toggle(pos, node, clicker) + return itemstack + end + def.after_dig_node = function(pos, node, meta, digger) + minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z}) + minetest.check_for_falling({x = pos.x, y = pos.y + 1, z = pos.z}) + end + def.on_rotate = function(pos, node, user, mode, new_param2) + return false + end + + if def.protected then + def.can_dig = can_dig_door + def.on_blast = function() end + def.on_key_use = function(pos, player) + local door = doors.get(pos) + door:toggle(player) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pname = player:get_player_name() + + -- verify placer is owner of lockable door + if owner ~= pname then + minetest.record_protection_violation(pos, pname) + minetest.chat_send_player(pname, "You do not own this locked door.") + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, "a locked door", owner + end + else + def.on_blast = function(pos, intensity) + minetest.remove_node(pos) + -- hidden node doesn't get blasted away. + minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z}) + return {name} + end + end + + def.on_destruct = function(pos) + minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z}) + end + + def.drawtype = "mesh" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.sunlight_propagates = true + def.walkable = true + def.is_ground_content = false + def.buildable_to = false + def.selection_box = {type = "fixed", fixed = {-1/2,-1/2,-1/2,1/2,3/2,-6/16}} + def.collision_box = {type = "fixed", fixed = {-1/2,-1/2,-1/2,1/2,3/2,-6/16}} + + def.mesh = "door_a.obj" + minetest.register_node(":" .. name .. "_a", def) + + def.mesh = "door_b.obj" + minetest.register_node(":" .. name .. "_b", def) + + _doors.registered_doors[name .. "_a"] = true + _doors.registered_doors[name .. "_b"] = true +end + +local source_list = { + {"black", "Darkened", color1, 40, 36, 33}, + {"blue", "Blue", color2, 0, 0, 255}, + {"green", "Green", color3, 0, 255, 0}, + {"white", "White", color4, 245, 245, 245}, + {"orange", "Orange", color5, 255, 97, 3}, + {"red", "Red", color6, 255, 0, 0}, + {"yellow", "Yellow", color7, 255, 255, 0}, + {"pink", "pink", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local name = source_list[i][1] + local description = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +doors.register("door_" .. name , { + +alpha = 200, + tiles = {"doors_door_white.png^[colorize:#"..colour..":70"}, + description = name .. "Door", +wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, +inventory_image = "doors.png^[colorize:#"..colour..":70", + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), + sound_open = "doors_door_open", + sound_close = "doors_door_close", + +}) + +end + +-- Capture mods using the old API as best as possible. +function doors.register_door(name, def) + if def.only_placer_can_open then + def.protected = true + end + def.only_placer_can_open = nil + + local i = name:find(":") + local modname = name:sub(1, i - 1) + if not def.tiles then + if def.protected then + def.tiles = {{name = "doors_door_steel.png", backface_culling = true}} + else + def.tiles = {{name = "doors_door_wood.png", backface_culling = true}} + end + minetest.log("warning", modname .. " registered door \"" .. name .. "\" " .. + "using deprecated API method \"doors.register_door()\" but " .. + "did not provide the \"tiles\" parameter. A fallback tiledef " .. + "will be used instead.") + end + + doors.register(name, def) +end + +----trapdoor---- + +function _doors.trapdoor_toggle(pos, node, clicker) + node = node or minetest.get_node(pos) + + replace_old_owner_information(pos) + + if clicker and not default.can_interact_with_node(clicker, pos) then + return false + end + + local def = minetest.registered_nodes[node.name] + + if string.sub(node.name, -5) == "_open" then + minetest.sound_play(def.sound_close, + {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.swap_node(pos, {name = string.sub(node.name, 1, + string.len(node.name) - 5), param1 = node.param1, param2 = node.param2}) + else + minetest.sound_play(def.sound_open, + {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.swap_node(pos, {name = node.name .. "_open", + param1 = node.param1, param2 = node.param2}) + end +end + +function doors.register_trapdoor(name, def) + if not name:find(":") then + name = "doors:" .. name + end + + local name_closed = name + local name_opened = name.."_open" + + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + _doors.trapdoor_toggle(pos, node, clicker) + return itemstack + end + + -- Common trapdoor configuration + def.drawtype = "nodebox" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.is_ground_content = false + + if def.protected then + def.can_dig = can_dig_door + def.after_place_node = function(pos, placer, itemstack, pointed_thing) + local pn = placer:get_player_name() + local meta = minetest.get_meta(pos) + meta:set_string("owner", pn) + meta:set_string("infotext", "Owned by "..pn) + + return (creative and creative.is_enabled_for and creative.is_enabled_for(pn)) + end + + def.on_blast = function() end + def.on_key_use = function(pos, player) + local door = doors.get(pos) + door:toggle(player) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pname = player:get_player_name() + + -- verify placer is owner of lockable door + if owner ~= pname then + minetest.record_protection_violation(pos, pname) + minetest.chat_send_player(pname, "You do not own this trapdoor.") + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, "a locked trapdoor", owner + end + else + def.on_blast = function(pos, intensity) + minetest.remove_node(pos) + return {name} + end + end + + if not def.sounds then + def.sounds = default.node_sound_wood_defaults() + end + + if not def.sound_open then + def.sound_open = "doors_door_open" + end + + if not def.sound_close then + def.sound_close = "doors_door_close" + end + + local def_opened = table.copy(def) + local def_closed = table.copy(def) + + def_closed.node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} + } + def_closed.selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} + } + def_closed.tiles = {def.tile_front, + def.tile_front .. '^[transformFY', + def.tile_side, def.tile_side, + def.tile_side, def.tile_side} + + def_opened.node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} + } + def_opened.selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} + } + def_opened.tiles = {def.tile_side, def.tile_side, + def.tile_side .. '^[transform3', + def.tile_side .. '^[transform1', + def.tile_front .. '^[transform46', + def.tile_front .. '^[transform6'} + + def_opened.drop = name_closed + def_opened.groups.not_in_creative_inventory = 1 + + minetest.register_node(name_opened, def_opened) + minetest.register_node(name_closed, def_closed) + + _doors.registered_trapdoors[name_opened] = true + _doors.registered_trapdoors[name_closed] = true +end + +local source_list = { + {"black", "Darkened", color1, 40, 36, 33}, + {"blue", "Blue", color2, 0, 0, 255}, + {"green", "Green", color3, 0, 255, 0}, + {"white", "White", color4, 245, 245, 245}, + {"orange", "Orange", color5, 255, 97, 3}, + {"red", "Red", color6, 255, 0, 0}, + {"yellow", "Yellow", color7, 255, 255, 0}, + {"pink", "pink", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local name = source_list[i][1] + local description = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +doors.register_trapdoor("doors:trapdoor_" .. name , { + description = "Trapdoor", + tile_front = "color_white.png^[colorize:#"..colour..":70", + tile_side = "color_white.png^[colorize:#"..colour..":70", + wield_image = "color_hand" .. name ..".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "trapdoor.png^[colorize:#"..colour..":70", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, +}) + +end + +minetest.register_craft({ + output = 'doors:trapdoor 2', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'group:wood', 'group:wood', 'group:wood'}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'doors:trapdoor_steel', + recipe = { + {'default:steel_ingot', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot'}, + } +}) + + +----fence gate---- + +function doors.register_fencegate(name, def) + local fence = { + description = def.description, + drawtype = "mesh", + tiles = {def.texture}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + drop = name .. "_closed", + connect_sides = {"left", "right"}, + groups = def.groups, + sounds = def.sounds, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local node_def = minetest.registered_nodes[node.name] + minetest.swap_node(pos, {name = node_def.gate, param2 = node.param2}) + minetest.sound_play(node_def.sound, {pos = pos, gain = 0.3, + max_hear_distance = 8}) + return itemstack + end, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/4, 1/2, 1/2, 1/4}, + }, + } + + if not fence.sounds then + fence.sounds = default.node_sound_wood_defaults() + end + + fence.groups.fence = 1 + + local fence_closed = table.copy(fence) + fence_closed.mesh = "doors_fencegate_closed.obj" + fence_closed.gate = name .. "_open" + fence_closed.sound = "doors_fencegate_open" + fence_closed.collision_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/4, 1/2, 1/2, 1/4}, + } + + local fence_open = table.copy(fence) + fence_open.mesh = "doors_fencegate_open.obj" + fence_open.gate = name .. "_closed" + fence_open.sound = "doors_fencegate_close" + fence_open.groups.not_in_creative_inventory = 1 + fence_open.collision_box = { + type = "fixed", + fixed = {{-1/2, -1/2, -1/4, -3/8, 1/2, 1/4}, + {-1/2, -3/8, -1/2, -3/8, 3/8, 0}}, + } + + minetest.register_node(":" .. name .. "_closed", fence_closed) + minetest.register_node(":" .. name .. "_open", fence_open) + + minetest.register_craft({ + output = name .. "_closed", + recipe = { + {"default:stick", def.material, "default:stick"}, + {"default:stick", def.material, "default:stick"} + } + }) +end + +doors.register_fencegate("doors_smallwhite", { + description = "White Fence Gate", + texture = "color_white.png", + material = "color:white", + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} +}) + + + + + diff --git a/mods/Nodes/doors/license.txt b/mods/Nodes/doors/license.txt new file mode 100644 index 0000000..8ce73c4 --- /dev/null +++ b/mods/Nodes/doors/license.txt @@ -0,0 +1,164 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2015-2016 sofar (sofar@foo-projects.org) +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures, models and sounds) +----------------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2011-2016 Fernando Zapata +Copyright (C) 2014-2016 celeron55 +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2015-2016 sofar +Copyright (C) 2016 red-001 +Copyright (C) 2016 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ + +----------------------- + +Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +Copyright (C) 2014-2016 PenguinDad + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/4.0/ + +----------------------- + +Attribution 3.0 Unported (CC BY 3.0) +Copyright (C) 2014 CGEffex +Copyright (C) 2014 bennstir +Copyright (C) 2016 BarkersPinhead +Copyright (C) 2016 rivernile7 +Copyright (C) 2016 HazMatt + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by/3.0/ + +----------------------- + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +mhtaylor67 +SkeetMasterFunk69 + +No Copyright + +The person who associated a work with this deed has dedicated the work to the public +domain by waiving all of his or her rights to the work worldwide under copyright law, +including all related and neighboring rights, to the extent allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial purposes, all +without asking permission. See Other Information below. + +Other Information + +In no way are the patent or trademark rights of any person affected by CC0, nor are the +rights that other persons may have in the work or in how the work is used, such as +publicity or privacy rights. +Unless expressly stated otherwise, the person who associated a work with this deed makes +no warranties about the work, and disclaims liability for all uses of the work, to the +fullest extent permitted by applicable law. +When using or citing the work, you should not imply endorsement by the author or the +affirmer. + +For more details: +https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/mods/Nodes/doors/sounds/doors_door_close.ogg b/mods/Nodes/doors/sounds/doors_door_close.ogg new file mode 100644 index 0000000..c08399c Binary files /dev/null and b/mods/Nodes/doors/sounds/doors_door_close.ogg differ diff --git a/mods/Nodes/doors/sounds/doors_door_open.ogg b/mods/Nodes/doors/sounds/doors_door_open.ogg new file mode 100644 index 0000000..7df2826 Binary files /dev/null and b/mods/Nodes/doors/sounds/doors_door_open.ogg differ diff --git a/mods/Nodes/doors/textures/doors_blank.png b/mods/Nodes/doors/textures/doors_blank.png new file mode 100644 index 0000000..1914264 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_blank.png differ diff --git a/mods/Nodes/doors/textures/doors_door_black.png b/mods/Nodes/doors/textures/doors_door_black.png new file mode 100644 index 0000000..21172c7 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_door_black.png differ diff --git a/mods/Nodes/doors/textures/doors_door_blue.png b/mods/Nodes/doors/textures/doors_door_blue.png new file mode 100644 index 0000000..761696a Binary files /dev/null and b/mods/Nodes/doors/textures/doors_door_blue.png differ diff --git a/mods/Nodes/doors/textures/doors_door_glass.png b/mods/Nodes/doors/textures/doors_door_glass.png new file mode 100644 index 0000000..26c427b Binary files /dev/null and b/mods/Nodes/doors/textures/doors_door_glass.png differ diff --git a/mods/Nodes/doors/textures/doors_door_green.png b/mods/Nodes/doors/textures/doors_door_green.png new file mode 100644 index 0000000..5274c58 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_door_green.png differ diff --git a/mods/Nodes/doors/textures/doors_door_obsidian_glass.png b/mods/Nodes/doors/textures/doors_door_obsidian_glass.png new file mode 100644 index 0000000..07ac5b2 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_door_obsidian_glass.png differ diff --git a/mods/Nodes/doors/textures/doors_door_orange.png b/mods/Nodes/doors/textures/doors_door_orange.png new file mode 100644 index 0000000..1c827f0 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_door_orange.png differ diff --git a/mods/Nodes/doors/textures/doors_door_pink.png b/mods/Nodes/doors/textures/doors_door_pink.png new file mode 100644 index 0000000..08b7d9c Binary files /dev/null and b/mods/Nodes/doors/textures/doors_door_pink.png differ diff --git a/mods/Nodes/doors/textures/doors_door_red.png b/mods/Nodes/doors/textures/doors_door_red.png new file mode 100644 index 0000000..3ffa0f3 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_door_red.png differ diff --git a/mods/Nodes/doors/textures/doors_door_steel.png b/mods/Nodes/doors/textures/doors_door_steel.png new file mode 100644 index 0000000..f42f335 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_door_steel.png differ diff --git a/mods/Nodes/doors/textures/doors_door_white.png b/mods/Nodes/doors/textures/doors_door_white.png new file mode 100644 index 0000000..33ef07a Binary files /dev/null and b/mods/Nodes/doors/textures/doors_door_white.png differ diff --git a/mods/Nodes/doors/textures/doors_door_wood.png b/mods/Nodes/doors/textures/doors_door_wood.png new file mode 100644 index 0000000..7b18203 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_door_wood.png differ diff --git a/mods/Nodes/doors/textures/doors_door_yellow.png b/mods/Nodes/doors/textures/doors_door_yellow.png new file mode 100644 index 0000000..7063840 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_door_yellow.png differ diff --git a/mods/Nodes/doors/textures/doors_item_black.png b/mods/Nodes/doors/textures/doors_item_black.png new file mode 100644 index 0000000..b3e5764 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_item_black.png differ diff --git a/mods/Nodes/doors/textures/doors_item_blue.png b/mods/Nodes/doors/textures/doors_item_blue.png new file mode 100644 index 0000000..42137b1 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_item_blue.png differ diff --git a/mods/Nodes/doors/textures/doors_item_glass.png b/mods/Nodes/doors/textures/doors_item_glass.png new file mode 100644 index 0000000..791a58a Binary files /dev/null and b/mods/Nodes/doors/textures/doors_item_glass.png differ diff --git a/mods/Nodes/doors/textures/doors_item_green.png b/mods/Nodes/doors/textures/doors_item_green.png new file mode 100644 index 0000000..b95f2cf Binary files /dev/null and b/mods/Nodes/doors/textures/doors_item_green.png differ diff --git a/mods/Nodes/doors/textures/doors_item_obsidian_glass.png b/mods/Nodes/doors/textures/doors_item_obsidian_glass.png new file mode 100644 index 0000000..1026d43 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_item_obsidian_glass.png differ diff --git a/mods/Nodes/doors/textures/doors_item_orange.png b/mods/Nodes/doors/textures/doors_item_orange.png new file mode 100644 index 0000000..b0d522a Binary files /dev/null and b/mods/Nodes/doors/textures/doors_item_orange.png differ diff --git a/mods/Nodes/doors/textures/doors_item_pink.png b/mods/Nodes/doors/textures/doors_item_pink.png new file mode 100644 index 0000000..70db366 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_item_pink.png differ diff --git a/mods/Nodes/doors/textures/doors_item_red.png b/mods/Nodes/doors/textures/doors_item_red.png new file mode 100644 index 0000000..f23e7d1 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_item_red.png differ diff --git a/mods/Nodes/doors/textures/doors_item_steel.png b/mods/Nodes/doors/textures/doors_item_steel.png new file mode 100644 index 0000000..dd99e13 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_item_steel.png differ diff --git a/mods/Nodes/doors/textures/doors_item_white.png b/mods/Nodes/doors/textures/doors_item_white.png new file mode 100644 index 0000000..a11cba1 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_item_white.png differ diff --git a/mods/Nodes/doors/textures/doors_item_wood.png b/mods/Nodes/doors/textures/doors_item_wood.png new file mode 100644 index 0000000..e69de29 diff --git a/mods/Nodes/doors/textures/doors_item_yellow.png b/mods/Nodes/doors/textures/doors_item_yellow.png new file mode 100644 index 0000000..2bdab6e Binary files /dev/null and b/mods/Nodes/doors/textures/doors_item_yellow.png differ diff --git a/mods/Nodes/doors/textures/doors_trapdoor.png b/mods/Nodes/doors/textures/doors_trapdoor.png new file mode 100644 index 0000000..e92c8b2 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_trapdoor.png differ diff --git a/mods/Nodes/doors/textures/doors_trapdoor_side.png b/mods/Nodes/doors/textures/doors_trapdoor_side.png new file mode 100644 index 0000000..c45d870 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_trapdoor_side.png differ diff --git a/mods/Nodes/doors/textures/doors_trapdoor_steel.png b/mods/Nodes/doors/textures/doors_trapdoor_steel.png new file mode 100644 index 0000000..4ba507d Binary files /dev/null and b/mods/Nodes/doors/textures/doors_trapdoor_steel.png differ diff --git a/mods/Nodes/doors/textures/doors_trapdoor_steel_side.png b/mods/Nodes/doors/textures/doors_trapdoor_steel_side.png new file mode 100644 index 0000000..44c4344 Binary files /dev/null and b/mods/Nodes/doors/textures/doors_trapdoor_steel_side.png differ diff --git a/mods/Nodes/fence/cheapwood.lua b/mods/Nodes/fence/cheapwood.lua new file mode 100644 index 0000000..c162560 --- /dev/null +++ b/mods/Nodes/fence/cheapwood.lua @@ -0,0 +1,44 @@ +-- +-- Fence +-- + +local source_list = { + {"black", "Darkened", "292421", 40, 36, 33}, + {"blue", "Blue", "0000FF", 0, 0, 255}, + {"green", "Green", "00FF00", 0, 255, 0}, + {"white", "White", "F5F5F5", 245, 245, 245}, + {"orange", "Orange", "FF6103", 255, 97, 3}, + {"red", "Red", "FF0000", 255, 0, 0}, + {"yellow", "Yellow", "FFFF00", 255, 255, 0}, + {"pink", "pink", "FF69B4", 255, 105, 180} +} + +for i in ipairs(source_list) do + local name = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + + minetest.register_node("fence:" .. name, { + description = desc .. " Fence ", + wield_image = "color_hand" .. name .. ".png", + inventory_image = "fence.png^[colorize:#"..colour..":70", + wield_scale = {x=2,y=1.5,z=0.2}, + tiles = {"color_" .. name .. ".png"}, + drawtype = "fencelike", + paramtype = "light", + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, + }, + groups = {choppy=3,flammable=2}, + sounds = { + footstep = {name="wood_woodstep"}, + dig = {name="wood_woodtool"}, + place = {name="default_stoneplace"}, + }, +}) + +end diff --git a/mods/Nodes/fence/depends.txt b/mods/Nodes/fence/depends.txt new file mode 100644 index 0000000..22ed7be --- /dev/null +++ b/mods/Nodes/fence/depends.txt @@ -0,0 +1,2 @@ +default +color \ No newline at end of file diff --git a/mods/Nodes/fence/init.lua b/mods/Nodes/fence/init.lua new file mode 100644 index 0000000..c68bbda --- /dev/null +++ b/mods/Nodes/fence/init.lua @@ -0,0 +1,44 @@ +-- +-- Fence +-- + +local source_list = { + {"black", "Darkened", color1, 40, 36, 33}, + {"blue", "Blue", color2, 0, 0, 255}, + {"green", "Green", color3, 0, 255, 0}, + {"white", "White", color4, 245, 245, 245}, + {"orange", "Orange", color5, 255, 97, 3}, + {"red", "Red", color6, 255, 0, 0}, + {"yellow", "Yellow", color7, 255, 255, 0}, + {"pink", "pink", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local name = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + + minetest.register_node("fence:" .. name, { + description = desc .. " Fence ", + wield_image = "color_hand" .. name .. ".png", + inventory_image = "fence.png^[colorize:#"..colour..":70", + wield_scale = {x=1,y=1,z=0.5}, + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + drawtype = "fencelike", + paramtype = "light", + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, + }, + groups = {choppy=3,flammable=2}, + sounds = { + footstep = {name="wood_woodstep"}, + dig = {name="wood_woodtool"}, + place = {name="default_stoneplace"}, + }, +}) + +end diff --git a/mods/Nodes/fence/textures/fence_cheapwood.png b/mods/Nodes/fence/textures/fence_cheapwood.png new file mode 100644 index 0000000..1051a0f Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_amber.png b/mods/Nodes/fence/textures/fence_cheapwood_amber.png new file mode 100644 index 0000000..3bfcb6d Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_amber.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_black.png b/mods/Nodes/fence/textures/fence_cheapwood_black.png new file mode 100644 index 0000000..4bb64d9 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_black.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_blue.png b/mods/Nodes/fence/textures/fence_cheapwood_blue.png new file mode 100644 index 0000000..030386f Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_blue.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_brown.png b/mods/Nodes/fence/textures/fence_cheapwood_brown.png new file mode 100644 index 0000000..edfe729 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_brown.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_chartreuse.png b/mods/Nodes/fence/textures/fence_cheapwood_chartreuse.png new file mode 100644 index 0000000..734b86c Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_chartreuse.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_green.png b/mods/Nodes/fence/textures/fence_cheapwood_green.png new file mode 100644 index 0000000..aad0b91 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_green.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_inv.png b/mods/Nodes/fence/textures/fence_cheapwood_inv.png new file mode 100644 index 0000000..3ec688e Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_inv.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_inv_amber.png b/mods/Nodes/fence/textures/fence_cheapwood_inv_amber.png new file mode 100644 index 0000000..930b168 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_inv_amber.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_inv_black.png b/mods/Nodes/fence/textures/fence_cheapwood_inv_black.png new file mode 100644 index 0000000..fa55227 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_inv_black.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_inv_blue.png b/mods/Nodes/fence/textures/fence_cheapwood_inv_blue.png new file mode 100644 index 0000000..821b6c2 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_inv_blue.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_inv_brown.png b/mods/Nodes/fence/textures/fence_cheapwood_inv_brown.png new file mode 100644 index 0000000..434f0b3 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_inv_brown.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_inv_chartreuse.png b/mods/Nodes/fence/textures/fence_cheapwood_inv_chartreuse.png new file mode 100644 index 0000000..9877302 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_inv_chartreuse.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_inv_green.png b/mods/Nodes/fence/textures/fence_cheapwood_inv_green.png new file mode 100644 index 0000000..596b0a0 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_inv_green.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_inv_magenta.png b/mods/Nodes/fence/textures/fence_cheapwood_inv_magenta.png new file mode 100644 index 0000000..339870c Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_inv_magenta.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_inv_orange.png b/mods/Nodes/fence/textures/fence_cheapwood_inv_orange.png new file mode 100644 index 0000000..7c8a985 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_inv_orange.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_inv_purple.png b/mods/Nodes/fence/textures/fence_cheapwood_inv_purple.png new file mode 100644 index 0000000..046e1a8 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_inv_purple.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_inv_red.png b/mods/Nodes/fence/textures/fence_cheapwood_inv_red.png new file mode 100644 index 0000000..9737fc3 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_inv_red.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_inv_vermilion.png b/mods/Nodes/fence/textures/fence_cheapwood_inv_vermilion.png new file mode 100644 index 0000000..1bdbedf Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_inv_vermilion.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_inv_violet.png b/mods/Nodes/fence/textures/fence_cheapwood_inv_violet.png new file mode 100644 index 0000000..a8443eb Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_inv_violet.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_inv_viridian.png b/mods/Nodes/fence/textures/fence_cheapwood_inv_viridian.png new file mode 100644 index 0000000..afedc90 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_inv_viridian.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_inv_yellow.png b/mods/Nodes/fence/textures/fence_cheapwood_inv_yellow.png new file mode 100644 index 0000000..28ec1ad Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_inv_yellow.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_magenta.png b/mods/Nodes/fence/textures/fence_cheapwood_magenta.png new file mode 100644 index 0000000..a309e76 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_magenta.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_orange.png b/mods/Nodes/fence/textures/fence_cheapwood_orange.png new file mode 100644 index 0000000..c7f19d0 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_orange.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_purple.png b/mods/Nodes/fence/textures/fence_cheapwood_purple.png new file mode 100644 index 0000000..06a1e3d Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_purple.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_red.png b/mods/Nodes/fence/textures/fence_cheapwood_red.png new file mode 100644 index 0000000..a016394 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_red.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_vermilion.png b/mods/Nodes/fence/textures/fence_cheapwood_vermilion.png new file mode 100644 index 0000000..ae94240 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_vermilion.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_violet.png b/mods/Nodes/fence/textures/fence_cheapwood_violet.png new file mode 100644 index 0000000..6f16e3e Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_violet.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_viridian.png b/mods/Nodes/fence/textures/fence_cheapwood_viridian.png new file mode 100644 index 0000000..9f0c633 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_viridian.png differ diff --git a/mods/Nodes/fence/textures/fence_cheapwood_yellow.png b/mods/Nodes/fence/textures/fence_cheapwood_yellow.png new file mode 100644 index 0000000..3bfcb6d Binary files /dev/null and b/mods/Nodes/fence/textures/fence_cheapwood_yellow.png differ diff --git a/mods/Nodes/fence/textures/fence_space.png b/mods/Nodes/fence/textures/fence_space.png new file mode 100644 index 0000000..c2e8752 Binary files /dev/null and b/mods/Nodes/fence/textures/fence_space.png differ diff --git a/mods/Nodes/fullpipe/LICENSE b/mods/Nodes/fullpipe/LICENSE new file mode 100644 index 0000000..7205d6f --- /dev/null +++ b/mods/Nodes/fullpipe/LICENSE @@ -0,0 +1,504 @@ +GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +(This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.) + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random + Hacker. + + {signature of Ty Coon}, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/mods/Nodes/fullpipe/README.md b/mods/Nodes/fullpipe/README.md new file mode 100644 index 0000000..3244d1f --- /dev/null +++ b/mods/Nodes/fullpipe/README.md @@ -0,0 +1,41 @@ +FullPipe (columnia fork for Blockcolor) + +Changelog : + +- Delete Bottom, Add rotate in top node. +- Delete Crosslink and Linkdown, use a block color is good. +- Replace Textures use by Colors. + +======== + +Licences: + +FullPipe (2018 by Chiantos) is à fork of columnia for Blockcolor Game. + +Columnia (2014 by Glunggi) is a fork of stairs ..in principle is its stairs with other nodes. +So i will to keep the old stairs- Licenses for this chanced Mode.. include all of my chances. + +Minetest 0.4 mod: stairs +========================= + +License of source code: +----------------------- +Copyright (C) 2011-2012 Kahrl +Copyright (C) 2011-2012 celeron55, Perttu Ahola + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +http://www.gnu.org/licenses/lgpl-2.1.html + +License of media (textures and sounds) +-------------------------------------- +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +http://creativecommons.org/licenses/by-sa/3.0/ + +Authors of media files +----------------------- +Everything not listed in here: +Copyright (C) 2010-2012 celeron55, Perttu Ahola diff --git a/mods/Nodes/fullpipe/depends.txt b/mods/Nodes/fullpipe/depends.txt new file mode 100644 index 0000000..22ed7be --- /dev/null +++ b/mods/Nodes/fullpipe/depends.txt @@ -0,0 +1,2 @@ +default +color \ No newline at end of file diff --git a/mods/Nodes/fullpipe/init.lua b/mods/Nodes/fullpipe/init.lua new file mode 100644 index 0000000..4c76ed6 --- /dev/null +++ b/mods/Nodes/fullpipe/init.lua @@ -0,0 +1,91 @@ +-- Blockcolor 1.46.4 : pipefull by Chiantos ( Fork Columnia // 2018) + +-- Minetest 0.4 mod: columnia by Glunggi(former Stairs Copyright by(C) 2011-2012 Kahrl Copyright (C) 2011-2012 celeron55, Perttu Ahola) +-- See README.txt for licensing and other information. + +fullpipe = {} + +function fullpipe.register_pipe_border(subname, recipeitem, groups, images, description, inventorys, sounds) + minetest.register_node("fullpipe:border_" .. subname, { + wield_image = "color_hand" .. subname .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = inventorys, + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = true, + groups = groups, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.25, -0.5, -0.25, 0.25, 0.5, 0.25}, + {-0.5, 0.25, -0.5, 0.5, 0.5, 0.5}, + {-0.375, 0, -0.375, 0.375, 0.5, 0.375}, + }, + }, + + }) + +end + +function fullpipe.register_pipe_block(subname, recipeitem, groups, images, description, inventorys, sounds) + minetest.register_node("fullpipe:block_" .. subname, { + wield_image = "color_hand" .. subname .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = inventorys, + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = true, + groups = groups, + sounds = sounds, + node_box = { + type = "fixed", + fixed = {{-1/4, -1/2, -1/4, 1/4, 1/2, 1/4}}, + }, + }) + +end + +function fullpipe.register_pipe(subname, recipeitem, groups, images, desc_pipe_border, desc_pipe_block, inv_pipe_border, inv_pipe_block, sounds) + + fullpipe.register_pipe_border(subname, recipeitem, groups, images, desc_pipe_border, inv_pipe_border, sounds) + fullpipe.register_pipe_block(subname, recipeitem, groups, images, desc_pipe_block, inv_pipe_block, sounds) + +end + +local source_list = { + {"black", "Darkened", color1, 40, 36, 33}, + {"blue", "Blue", color2, 0, 0, 255}, + {"green", "Green", color3, 0, 255, 0}, + {"white", "White", color4, 245, 245, 245}, + {"orange", "Orange", color5, 255, 97, 3}, + {"red", "Red", color6, 255, 0, 0}, + {"yellow", "Yellow", color7, 255, 255, 0}, + {"pink", "Pink", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local name = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +fullpipe.register_pipe("" .. name .. "", "color:" .. name, + {cracky=3}, + {"color_white.png^[colorize:#"..colour..":70"}, + desc .. "FullPipe Border", + desc .. "FullPipe Block", + "fullpipeborder.png^[colorize:#"..colour..":70", + "fullpipe.png^[colorize:#"..colour..":70", + default.node_sound_stone_defaults() + ) + +end diff --git a/mods/Nodes/fullpipe/readme.txt b/mods/Nodes/fullpipe/readme.txt new file mode 100644 index 0000000..145fb05 --- /dev/null +++ b/mods/Nodes/fullpipe/readme.txt @@ -0,0 +1,27 @@ +Columnia (2014 by Glunggi) is a Fork of Stairs ..in principle is its Stairs with other Nodes. +So i will to keep the old Stairs- Licenses for this chanced Mode.. include all of my Chances. + +Minetest 0.4 mod: stairs +========================= + +License of source code: +----------------------- +Copyright (C) 2011-2012 Kahrl +Copyright (C) 2011-2012 celeron55, Perttu Ahola + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +http://www.gnu.org/licenses/lgpl-2.1.html + +License of media (textures and sounds) +-------------------------------------- +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +http://creativecommons.org/licenses/by-sa/3.0/ + +Authors of media files +----------------------- +Everything not listed in here: +Copyright (C) 2010-2012 celeron55, Perttu Ahola diff --git a/mods/Nodes/fullpipe/textures/columnia_blueprint.png b/mods/Nodes/fullpipe/textures/columnia_blueprint.png new file mode 100644 index 0000000..f1a1bb4 Binary files /dev/null and b/mods/Nodes/fullpipe/textures/columnia_blueprint.png differ diff --git a/mods/Nodes/fullpipe/textures/columnia_lamp.png b/mods/Nodes/fullpipe/textures/columnia_lamp.png new file mode 100644 index 0000000..702397e Binary files /dev/null and b/mods/Nodes/fullpipe/textures/columnia_lamp.png differ diff --git a/mods/Nodes/fullpipe/textures/columnia_lamp_inv.png b/mods/Nodes/fullpipe/textures/columnia_lamp_inv.png new file mode 100644 index 0000000..44bb9c4 Binary files /dev/null and b/mods/Nodes/fullpipe/textures/columnia_lamp_inv.png differ diff --git a/mods/Nodes/fullpipe/textures/columnia_rusty.png b/mods/Nodes/fullpipe/textures/columnia_rusty.png new file mode 100644 index 0000000..544430a Binary files /dev/null and b/mods/Nodes/fullpipe/textures/columnia_rusty.png differ diff --git a/mods/Nodes/fullpipe/textures/columnia_rusty_block.png b/mods/Nodes/fullpipe/textures/columnia_rusty_block.png new file mode 100644 index 0000000..fe6c122 Binary files /dev/null and b/mods/Nodes/fullpipe/textures/columnia_rusty_block.png differ diff --git a/mods/Nodes/glass/Readme.txt b/mods/Nodes/glass/Readme.txt new file mode 100644 index 0000000..cb7aba7 --- /dev/null +++ b/mods/Nodes/glass/Readme.txt @@ -0,0 +1,3 @@ +Coloured Glass by JBR +Code License: CC0 +Texture License: CC BY-SA 3.0 \ No newline at end of file diff --git a/mods/Nodes/glass/depends.txt b/mods/Nodes/glass/depends.txt new file mode 100644 index 0000000..22ed7be --- /dev/null +++ b/mods/Nodes/glass/depends.txt @@ -0,0 +1,2 @@ +default +color \ No newline at end of file diff --git a/mods/Nodes/glass/init.lua b/mods/Nodes/glass/init.lua new file mode 100644 index 0000000..fafd949 --- /dev/null +++ b/mods/Nodes/glass/init.lua @@ -0,0 +1,34 @@ +--[[ +Coloured Glass by JBR +Code License: CC0 +Texture License: CC BY-SA 3.0 +--]] + +local dyes = { + {"black", "Darkened", color1}, + {"blue", "Blue", color2}, + {"green", "Green", color3}, + {"white", "White", color4}, + {"orange", "Orange", color5}, + {"red", "Red", color6}, + {"yellow", "Yellow", color7}, + {"pink", "pink", color8} +} +for i = 1, #dyes do + local name, desc, colour = unpack(dyes[i]) + +minetest.register_node("glass:" .. name , { + description = name .. "Glass", + drawtype = "glasslike", + tiles = {"whiteglass.png^[colorize:#"..colour..":70"}, + inventory_image = "windows.png^[colorize:#"..colour..":70", + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + paramtype = "light", + use_texture_alpha = true, + sunlight_propagates = true, + sounds = default.node_sound_glass_defaults(), + groups = {cracky=3,oddly_breakable_by_hand=3}, +}) + +end diff --git a/mods/Nodes/glass/textures/blackglass.png b/mods/Nodes/glass/textures/blackglass.png new file mode 100644 index 0000000..da6dbd6 Binary files /dev/null and b/mods/Nodes/glass/textures/blackglass.png differ diff --git a/mods/Nodes/glass/textures/blueglass.png b/mods/Nodes/glass/textures/blueglass.png new file mode 100644 index 0000000..d7daba2 Binary files /dev/null and b/mods/Nodes/glass/textures/blueglass.png differ diff --git a/mods/Nodes/glass/textures/darkblueglass.png b/mods/Nodes/glass/textures/darkblueglass.png new file mode 100644 index 0000000..ad0fb84 Binary files /dev/null and b/mods/Nodes/glass/textures/darkblueglass.png differ diff --git a/mods/Nodes/glass/textures/greenglass.png b/mods/Nodes/glass/textures/greenglass.png new file mode 100644 index 0000000..c3a2c55 Binary files /dev/null and b/mods/Nodes/glass/textures/greenglass.png differ diff --git a/mods/Nodes/glass/textures/orangeglass.png b/mods/Nodes/glass/textures/orangeglass.png new file mode 100644 index 0000000..8037a1f Binary files /dev/null and b/mods/Nodes/glass/textures/orangeglass.png differ diff --git a/mods/Nodes/glass/textures/pinkglass.png b/mods/Nodes/glass/textures/pinkglass.png new file mode 100644 index 0000000..9d305ae Binary files /dev/null and b/mods/Nodes/glass/textures/pinkglass.png differ diff --git a/mods/Nodes/glass/textures/purpleglass.png b/mods/Nodes/glass/textures/purpleglass.png new file mode 100644 index 0000000..f193952 Binary files /dev/null and b/mods/Nodes/glass/textures/purpleglass.png differ diff --git a/mods/Nodes/glass/textures/redglass.png b/mods/Nodes/glass/textures/redglass.png new file mode 100644 index 0000000..e047fb0 Binary files /dev/null and b/mods/Nodes/glass/textures/redglass.png differ diff --git a/mods/Nodes/glass/textures/whiteglass.png b/mods/Nodes/glass/textures/whiteglass.png new file mode 100644 index 0000000..a6938d2 Binary files /dev/null and b/mods/Nodes/glass/textures/whiteglass.png differ diff --git a/mods/Nodes/glass/textures/yellowglass.png b/mods/Nodes/glass/textures/yellowglass.png new file mode 100644 index 0000000..67346d2 Binary files /dev/null and b/mods/Nodes/glass/textures/yellowglass.png differ diff --git a/mods/Nodes/light/README.txt b/mods/Nodes/light/README.txt new file mode 100644 index 0000000..cbd240f --- /dev/null +++ b/mods/Nodes/light/README.txt @@ -0,0 +1,8 @@ +Minetest Game mod: give_initial_stuff +===================================== +See license.txt for license information. + +Authors of source code +---------------------- +Perttu Ahola (celeron55) (MIT) +Various Minetest developers and contributors (MIT) diff --git a/mods/Nodes/light/depends.txt b/mods/Nodes/light/depends.txt new file mode 100644 index 0000000..22ed7be --- /dev/null +++ b/mods/Nodes/light/depends.txt @@ -0,0 +1,2 @@ +default +color \ No newline at end of file diff --git a/mods/Nodes/light/init.lua b/mods/Nodes/light/init.lua new file mode 100644 index 0000000..13a63b3 --- /dev/null +++ b/mods/Nodes/light/init.lua @@ -0,0 +1,30 @@ +local dyes = { + {"black", "Darkened", color1}, + {"blue", "Blue", color2}, + {"green", "Green", color3}, + {"white", "White", color4}, + {"orange", "Orange", color5}, + {"red", "Red", color6}, + {"yellow", "Yellow", color7}, + {"pink", "pink", color8} +} +for i = 1, #dyes do + local name, desc, colour = unpack(dyes[i]) + + minetest.register_node("light:" .. name, { + description = desc .. " light", + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "lights.png^[colorize:#"..colour..":70", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + paramtype = "light", + light_source = 14, + is_ground_content = true, + groups = {snappy = 2, choppy = 2, wool = 2}, + sounds = default.node_sound_defaults(), + oddly_breakable_by_hand = 1, + dig_immediate = 3, + + }) + +end diff --git a/mods/Nodes/light/license.txt b/mods/Nodes/light/license.txt new file mode 100644 index 0000000..8134c92 --- /dev/null +++ b/mods/Nodes/light/license.txt @@ -0,0 +1,25 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/Nodes/modpack.txt b/mods/Nodes/modpack.txt new file mode 100644 index 0000000..e69de29 diff --git a/mods/Nodes/noncubic/init.lua b/mods/Nodes/noncubic/init.lua new file mode 100644 index 0000000..c9284a7 --- /dev/null +++ b/mods/Nodes/noncubic/init.lua @@ -0,0 +1,1301 @@ +-- NonCubic Blocks MOD v1.4 +------------by yves_de_beck + + + + +-- HERE YOU CAN CHANGE THE DETAIL-LEVEL: +---------------------------------------- +detail_level = 16 + + +-- HERE YOU CAN DE/ACTIVATE BACKGROUND FOR MILLING MENU: +-------------------------------------------------------- +allow_menu_background = false + + +-- VAR DECLARATION: +------------------- +noncubic = {} + + +-- REGISTER NONCUBIC FORMS, CREATE MODELS AND RECIPES: +------------------------------------------------------ + +-- SLOPE +-------- +function noncubic.register_slope(subname, recipeitem, groups, images, description) + +local slopebox = {} +local detail = detail_level +for i = 0, detail-1 do + slopebox[i+1]={-0.5, (i/detail)-0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5} +end +minetest.register_node("noncubic:slope_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + node_box = { + type = "fixed", + fixed = slopebox, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:slope_' .. subname .. ' 6', + recipe = { + {recipeitem, "", ""}, + {recipeitem, recipeitem, ""}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + minetest.register_craft({ + output = 'noncubic:slope_' .. subname .. ' 6', + recipe = { + {"", "", recipeitem}, + {"", recipeitem, recipeitem}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + +end + + +-- SLOPE Lying +---------------- +function noncubic.register_slope_lying(subname, recipeitem, groups, images, description) + +local slopeboxlying = {} +local detail = detail_level +for i = 0, detail-1 do + slopeboxlying[i+1]={(i/detail)-0.5, -0.5, (i/detail)-0.5, (i/detail)-0.5+(1/detail), 0.5 , 0.5} +end +minetest.register_node("noncubic:slope_lying_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + node_box = { + type = "fixed", + fixed = slopeboxlying, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:slope_lying_' .. subname .. ' 1', + recipe = { + {"", "", ""}, + {"", 'noncubic:slope_' .. subname, ""}, + {"", "", ""}, + }, + }) + +end + + +-- SLOPE UPSIDE DOWN +-------------------- +function noncubic.register_slope_upsdown(subname, recipeitem, groups, images, description) + +if subname == "dirt" then +return +end + +local slopeupdwnbox = {} +local detail = detail_level +for i = 0, detail-1 do + slopeupdwnbox[i+1]={-0.5, (i/detail)-0.5, (-1*(i/detail))+0.5-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5} +end +minetest.register_node("noncubic:slope_upsdown_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + node_box = { + type = "fixed", + fixed = slopeupdwnbox, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:slope_upsdown_' .. subname .. ' 6', + recipe = { + {recipeitem, recipeitem, recipeitem}, + {"", recipeitem, recipeitem}, + {"", "", recipeitem}, + }, + }) + minetest.register_craft({ + output = 'noncubic:slope_upsdown_' .. subname .. ' 6', + recipe = { + {recipeitem, recipeitem, recipeitem}, + {recipeitem, recipeitem, ""}, + {recipeitem, "", ""}, + }, + }) + +end + + +-- SLOPE EDGE +------------- +function noncubic.register_slope_edge(subname, recipeitem, groups, images, description) + +local slopeboxedge = {} +local detail = detail_level +for i = 0, detail-1 do + slopeboxedge[i+1]={(i/detail)-0.5, -0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5} +end +minetest.register_node("noncubic:slope_edge_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + node_box = { + type = "fixed", + fixed = slopeboxedge, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:slope_edge_' .. subname .. ' 3', + recipe = { + {"", "", ""}, + {recipeitem, "", ""}, + {recipeitem, recipeitem, ""}, + }, + }) + minetest.register_craft({ + output = 'noncubic:slope_edge_' .. subname .. ' 3', + recipe = { + {"", "", ""}, + {"", "", recipeitem}, + {"", recipeitem, recipeitem}, + }, + }) + +end + + +-- SLOPE INNER EDGE +------------------- +function noncubic.register_slope_inner_edge(subname, recipeitem, groups, images, description) + +minetest.register_node("noncubic:slope_inner_edge_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + node_box = { + type = "fixed", + fixed = { + -- PART 1 + {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}, + {-0.45, -0.5, -0.5, 0.5, -0.4, 0.5}, + {-0.4, -0.5, -0.5, 0.5, -0.35, 0.5}, + {-0.35, -0.5, -0.5, 0.5, -0.3, 0.5}, + {-0.3, -0.5, -0.5, 0.5, -0.25, 0.5}, + {-0.25, -0.5, -0.5, 0.5, -0.2, 0.5}, + {-0.2, -0.5, -0.5, 0.5, -0.15, 0.5}, + {-0.15, -0.5, -0.5, 0.5, -0.1, 0.5}, + {-0.1, -0.5, -0.5, 0.5, -0.05, 0.5}, + {-0.05, -0.5, -0.5, 0.5, 0, 0.5}, + {0, -0.5, -0.5, 0.5, 0.05, 0.5}, + {0.05, -0.5, -0.5, 0.5, 0.1, 0.5}, + {0.1, -0.5, -0.5, 0.5, 0.15, 0.5}, + {0.15, -0.5, -0.5, 0.5, 0.2, 0.5}, + {0.2, -0.5, -0.5, 0.5, 0.25, 0.5}, + {0.25, -0.5, -0.5, 0.5, 0.3, 0.5}, + {0.3, -0.5, -0.5, 0.5, 0.35, 0.5}, + {0.35, -0.5, -0.5, 0.5, 0.4, 0.5}, + {0.4, -0.5, -0.5, 0.5, 0.45, 0.5}, + {0.45, -0.5, -0.5, 0.5, 0.5, 0.5}, + -- PART 2 + {-0.5, -0.5, -0.45, 0.5, -0.45, 0.5}, + {-0.5, -0.5, -0.4, 0.5, -0.4, 0.5}, + {-0.5, -0.5, -0.35, 0.5, -0.35, 0.5}, + {-0.5, -0.5, -0.3, 0.5, -0.3, 0.5}, + {-0.5, -0.5, -0.25, 0.5, -0.25, 0.5}, + {-0.5, -0.5, -0.2, 0.5, -0.2, 0.5}, + {-0.5, -0.5, -0.15, 0.5, -0.15, 0.5}, + {-0.5, -0.5, -0.1, 0.5, -0.1, 0.5}, + {-0.5, -0.5, -0.05, 0.5, -0.05, 0.5}, + {-0.5, -0.5, 0, 0.5, 0, 0.5}, + {-0.5, -0.5, 0.05, 0.5, 0.05, 0.5}, + {-0.5, -0.5, 0.1, 0.5, 0.1, 0.5}, + {-0.5, -0.5, 0.15, 0.5, 0.15, 0.5}, + {-0.5, -0.5, 0.2, 0.5, 0.2, 0.5}, + {-0.5, -0.5, .25, 0.5, 0.25, 0.5}, + {-0.5, -0.5, 0.3, 0.5, 0.3, 0.5}, + {-0.5, -0.5, 0.35, 0.5, 0.35, 0.5}, + {-0.5, -0.5, 0.4, 0.5, 0.4, 0.5}, + {-0.5, -0.5, 0.45, 0.5, 0.45, 0.5}, + {-0.5, -0.5, 0.5, 0.5, 0.5, 0.5}, + }, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:slope_inner_edge_' .. subname .. ' 3', + recipe = { + {"", "", recipeitem}, + {recipeitem, "", ""}, + {recipeitem, recipeitem, ""}, + }, + }) + minetest.register_craft({ + output = 'noncubic:slope_inner_edge_' .. subname .. ' 3', + recipe = { + {recipeitem, "", ""}, + {"", "", recipeitem}, + {"", recipeitem, recipeitem}, + }, + }) + +end + + +-- SLOPE EDGE UPSIDE DOWN +------------------------- +function noncubic.register_slope_upsdown_edge(subname, recipeitem, groups, images, description) + +if subname == "dirt" then +return +end + +local slopeupdwnboxedge = {} +local detail = detail_level +for i = 0, detail-1 do + slopeupdwnboxedge[i+1]={(-1*(i/detail))+0.5-(1/detail), (i/detail)-0.5, (-1*(i/detail))+0.5-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5} +end +minetest.register_node("noncubic:slope_upsdown_edge_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + node_box = { + type = "fixed", + fixed = slopeupdwnboxedge, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:slope_upsdown_edge_' .. subname .. ' 3', + recipe = { + {"", recipeitem, recipeitem}, + {"", "", recipeitem}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = 'noncubic:slope_upsdown_edge_' .. subname .. ' 3', + recipe = { + {recipeitem, recipeitem, ""}, + {recipeitem, "", ""}, + {"", "", ""}, + }, + }) + +end + + +-- SLOPE INNER EDGE UPSIDE DOWN +------------------------------- +function noncubic.register_slope_upsdown_inner_edge(subname, recipeitem, groups, images, description) + +if subname == "dirt" then +return +end + +minetest.register_node("noncubic:slope_upsdown_inner_edge_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + node_box = { + type = "fixed", + fixed = { + {0.45, -0.5, -0.5, 0.5, -0.45, 0.5}, + {0.4, -0.45, -0.5, 0.5, -0.4, 0.5}, + {0.35, -0.4, -0.5, 0.5, -0.35, 0.5}, + {0.3, -0.35, -0.5, 0.5, -0.3, 0.5}, + {0.25, -0.3, -0.5, 0.5, -0.25, 0.5}, + {0.2, -0.25, -0.5, 0.5, -0.2, 0.5}, + {0.15, -0.2, -0.5, 0.5, -0.15, 0.5}, + {0.1, -0.15, -0.5, 0.5, -0.1, 0.5}, + {0.05, -0.1, -0.5, 0.5, -0.05, 0.5}, + {0, -0.05, -0.5, 0.5, 0, 0.5}, + {-0.05, 0, -0.5, 0.5, 0.05, 0.5}, + {-0.1, 0.05, -0.5, 0.5, 0.1, 0.5}, + {-0.15, 0.1, -0.5, 0.5, 0.15, 0.5}, + {-0.2, 0.15, -0.5, 0.5, 0.2, 0.5}, + {-0.25, 0.2, -0.5, 0.5, 0.25, 0.5}, + {-0.3, 0.25, -0.5, 0.5, 0.3, 0.5}, + {-0.35, 0.3, -0.5, 0.5, 0.35, 0.5}, + {-0.4, 0.35, -0.5, 0.5, 0.4, 0.5}, + {-0.45, 0.4, -0.5, 0.5, 0.45, 0.5}, + {-0.5, 0.45, -0.5, 0.5, 0.5, 0.5}, + + {-0.5, -0.5, 0.45, 0.5, -0.45, 0.5}, + {-0.5, -0.45, 0.4, 0.5, -0.4, 0.5}, + {-0.5, -0.4, 0.35, 0.5, -0.35, 0.5}, + {-0.5, -0.35, 0.3, 0.5, -0.3, 0.5}, + {-0.5, -0.3, 0.25, 0.5, -0.25, 0.5}, + {-0.5, -0.25, 0.2, 0.5, -0.2, 0.5}, + {-0.5, -0.2, 0.15, 0.5, -0.15, 0.5}, + {-0.5, -0.15, 0.1, 0.5, -0.1, 0.5}, + {-0.5, -0.1, 0.05, 0.5, -0.05, 0.5}, + {-0.5, -0.05, 0, 0.5, 0, 0.5}, + {-0.5, 0, -0.05, 0.5, 0.05, 0.5}, + {-0.5, 0.05, -0.1, 0.5, 0.1, 0.5}, + {-0.5, 0.1, -0.15, 0.5, 0.15, 0.5}, + {-0.5, 0.15, -0.2, 0.5, 0.2, 0.5}, + {-0.5, 0.2, -0.25, 0.5, 0.25, 0.5}, + {-0.5, 0.25, -0.3, 0.5, 0.3, 0.5}, + {-0.5, 0.3, -0.35, 0.5, 0.35, 0.5}, + {-0.5, 0.35, -0.4, 0.5, 0.4, 0.5}, + {-0.5, 0.4, -0.45, 0.5, 0.45, 0.5}, + {-0.5, 0.45, -0.5, 0.5, 0.5, 0.5}, + + }, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:slope_upsdown_inner_edge_' .. subname .. ' 3', + recipe = { + {"", recipeitem, recipeitem}, + {"", "", recipeitem}, + {recipeitem, "", ""}, + }, + }) + minetest.register_craft({ + output = 'noncubic:slope_upsdown_inner_edge_' .. subname .. ' 3', + recipe = { + {recipeitem, recipeitem, ""}, + {recipeitem, "", ""}, + {"", "", recipeitem}, + }, + }) + +end + + +-- PYRAMID +---------- +function noncubic.register_pyramid(subname, recipeitem, groups, images, description) + +local pyrabox = {} +local detail = detail_level/2 +for i = 0, detail-1 do + pyrabox[i+1]={(i/detail/2)-0.5, (i/detail/2)-0.5, (i/detail/2)-0.5, 0.5-(i/detail/2), (i/detail/2)-0.5+(1/detail), 0.5-(i/detail/2)} +end +minetest.register_node("noncubic:pyramid_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + }, + node_box = { + type = "fixed", + fixed = pyrabox, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:pyramid_' .. subname .. ' 3', + recipe = { + {"", "", ""}, + {"", recipeitem, ""}, + {recipeitem, "", recipeitem}, + }, + }) + +end + + +-- SPIKE +-------- +function noncubic.register_spike(subname, recipeitem, groups, images, description) + +if subname == "dirt" then +return +end + +local spikebox = {} +local detail = detail_level +for i = 0, detail-1 do + spikebox[i+1]={(i/detail/2)-0.5, (i/detail/2)-0.5, (i/detail/2)-0.5, 0.5-(i/detail/2), (i/detail)-0.5+(1/detail), 0.5-(i/detail/2)} +end +minetest.register_node("noncubic:spike_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + node_box = { + type = "fixed", + fixed = spikebox, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:spike_' .. subname .. ' 5', + recipe = { + {"", recipeitem, ""}, + {recipeitem, "", recipeitem}, + {recipeitem, "", recipeitem}, + }, + }) + +end + + +-- Block one curved edge +------------------------ +function noncubic.register_onecurvededge(subname, recipeitem, groups, images, description) + +local quartercyclebox = {} +local detail = detail_level*2 +local sehne +for i = (detail/2)-1, detail-1 do + sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2)) + quartercyclebox[i]={-0.5, -0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, 0.5} +end +minetest.register_node("noncubic:onecurvededge_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + node_box = { + type = "fixed", + fixed = quartercyclebox, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:onecurvededge_' .. subname .. ' 8', + recipe = { + {"", recipeitem, recipeitem}, + {recipeitem, recipeitem, recipeitem}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + +end + + +-- Block two curved edges +------------------------- +function noncubic.register_twocurvededge(subname, recipeitem, groups, images, description) + +local quartercyclebox2 = {} +local detail = detail_level*2 +local sehne +for i = (detail/2)-1, detail-1 do + sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2)) + quartercyclebox2[i]={-sehne, -0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, 0.5} +end +minetest.register_node("noncubic:twocurvededge_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + node_box = { + type = "fixed", + fixed = quartercyclebox2, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:twocurvededge_' .. subname .. ' 3', + recipe = { + {"", "", ""}, + {'noncubic:onecurvededge_' .. subname, "", ""}, + {'noncubic:onecurvededge_' .. subname, 'noncubic:onecurvededge_' .. subname, ""}, + }, + }) + +end + + + +-- Cylinder +----------- +function noncubic.register_cylinder(subname, recipeitem, groups, images, description) + +if subname == "dirt" then +return +end + +local cylbox = {} +local detail = detail_level +local sehne +for i = 1, detail-1 do + sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2)) + cylbox[i]={(i/detail)-0.5, -0.5, -sehne, (i/detail)+(1/detail)-0.5, 0.5, sehne} +end +minetest.register_node("noncubic:cylinder_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + node_box = { + type = "fixed", + fixed = cylbox, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:cylinder_' .. subname .. ' 6', + recipe = { + {recipeitem, recipeitem, ""}, + {recipeitem, recipeitem, ""}, + {recipeitem, recipeitem, ""}, + }, + }) + minetest.register_craft({ + output = 'noncubic:cylinder_' .. subname .. ' 1', + recipe = { + {"", "", ""}, + {"", 'noncubic:cylinder_horizontal_' .. subname, ""}, + {"", "", ""}, + }, + }) + +end + + +-- Cylinder Horizontal +---------------------- +function noncubic.register_cylinder_horizontal(subname, recipeitem, groups, images, description) + +if subname == "dirt" then +return +end + +local cylbox_horizontal = {} +local detail = detail_level +local sehne +for i = 1, detail-1 do + sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2)) + cylbox_horizontal[i]={-0.5, (i/detail)-0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, sehne} +end +minetest.register_node("noncubic:cylinder_horizontal_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + node_box = { + type = "fixed", + fixed = cylbox_horizontal, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:cylinder_horizontal_' .. subname .. ' 6', + recipe = { + {"", "", ""}, + {recipeitem, recipeitem, recipeitem}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + minetest.register_craft({ + output = 'noncubic:cylinder_horizontal_' .. subname .. ' 1', + recipe = { + {"", "", ""}, + {"", 'noncubic:cylinder_' .. subname, ""}, + {"", "", ""}, + }, + }) + +end + + +-- Sphere +--------- +function noncubic.register_sphere(subname, recipeitem, groups, images, description) + +if subname == "dirt" then +return +end + +local spherebox = {} +local detail = detail_level +local sehne +for i = 1, detail-1 do + sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2)) + spherebox[i]={-sehne, (i/detail)-0.5, -sehne, sehne, (i/detail)+(1/detail)-0.5, sehne} +end +minetest.register_node("noncubic:cylinder_sphere_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + node_box = { + type = "fixed", + fixed = spherebox, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:cylinder_sphere_' .. subname .. ' 4', + recipe = { + {"", recipeitem, ""}, + {recipeitem, "", recipeitem}, + {"", recipeitem, ""}, + }, + }) + +end + + +-- Element straight +------------------- +function noncubic.register_element_straight(subname, recipeitem, groups, images, description) + +minetest.register_node("noncubic:element_straight_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.5, 0.3, 0, 0.5}, + }, + node_box = { + type = "fixed", + fixed = { + {-0.3, -0.5, -0.5, 0.3, 0, 0.5}, + }, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:element_straight_' .. subname .. ' 12', + recipe = { + {"", recipeitem, ""}, + {"", recipeitem, ""}, + {"", recipeitem, ""}, + }, + }) + +end + + +-- Element Edge +--------------- +function noncubic.register_element_edge(subname, recipeitem, groups, images, description) + +minetest.register_node("noncubic:element_edge_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = { + {-0.3, -0.5, -0.5, 0.3, 0, 0.3}, + {-0.5, -0.5, -0.3, -0.3, 0, 0.3}, + }, + }, + node_box = { + type = "fixed", + fixed = { + {-0.3, -0.5, -0.5, 0.3, 0, 0.3}, + {-0.5, -0.5, -0.3, -0.3, 0, 0.3}, + }, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:element_edge_' .. subname .. ' 10', + recipe = { + {recipeitem, recipeitem, recipeitem}, + {"", "", recipeitem}, + {"", "", recipeitem}, + }, + }) + +end + + +-- Element T +------------ +function noncubic.register_element_t(subname, recipeitem, groups, images, description) + +minetest.register_node("noncubic:element_t_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = { + {-0.3, -0.5, -0.5, 0.3, 0, 0.3}, + {-0.5, -0.5, -0.3, -0.3, 0, 0.3}, + {0.3, -0.5, -0.3, 0.5, 0, 0.3}, + }, + }, + node_box = { + type = "fixed", + fixed = { + {-0.3, -0.5, -0.5, 0.3, 0, 0.3}, + {-0.5, -0.5, -0.3, -0.3, 0, 0.3}, + {0.3, -0.5, -0.3, 0.5, 0, 0.3}, + }, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:element_t_' .. subname .. ' 8', + recipe = { + {"", "", ""}, + {recipeitem, recipeitem, recipeitem}, + {"", recipeitem, ""}, + }, + }) + +end + + +-- Element Cross +---------------- +function noncubic.register_element_cross(subname, recipeitem, groups, images, description) + +minetest.register_node("noncubic:element_cross_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = { + {0.3, -0.5, -0.3, 0.5, 0, 0.3}, + {-0.3, -0.5, -0.5, 0.3, 0, 0.5}, + {-0.5, -0.5, -0.3, -0.3, 0, 0.3}, + }, + }, + node_box = { + type = "fixed", + fixed = { + {0.3, -0.5, -0.3, 0.5, 0, 0.3}, + {-0.3, -0.5, -0.5, 0.3, 0, 0.5}, + {-0.5, -0.5, -0.3, -0.3, 0, 0.3}, + }, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:element_cross_' .. subname .. ' 10', + recipe = { + {"", recipeitem, ""}, + {recipeitem, recipeitem, recipeitem}, + {"", recipeitem, ""}, + }, + }) + +end + + +-- Element End +-------------- +function noncubic.register_element_end(subname, recipeitem, groups, images, description) + +minetest.register_node("noncubic:element_end_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.5}, + }, + node_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.5}, + }, + groups = groups, + }) + minetest.register_craft({ + output = 'noncubic:element_end_' .. subname .. ' 8', + recipe = { + {"", "", ""}, + {"", recipeitem, ""}, + {"", recipeitem, ""}, + }, + }) + +end + + +-- Element straight DOUBLE +-------------------------- +function noncubic.register_element_straight_double(subname3, recipeitem3, groups3, images3, description3) + +minetest.register_node("noncubic:element_straight_double_" .. subname3, { + description = description3, + drawtype = "nodebox", + tiles = images3, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5}, + }, + node_box = { + type = "fixed", + fixed = { + {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5}, + }, + }, + groups = groups3, + }) + minetest.register_craft({ + output = 'noncubic:element_straight_double_' .. subname3 .. ' 1', + recipe = { + {"", "", ""}, + {"", 'noncubic:element_straight_' .. recipeitem3, ""}, + {"", 'noncubic:element_straight_' .. recipeitem3, ""}, + }, + }) + +end + + +-- Element Edge DOUBLE +---------------------- +function noncubic.register_element_edge_double(subname3, recipeitem3, groups3, images3, description3) + +minetest.register_node("noncubic:element_edge_double_" .. subname3, { + description = description3, + drawtype = "nodebox", + tiles = images3, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = { + {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3}, + {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}, + }, + }, + node_box = { + type = "fixed", + fixed = { + {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3}, + {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}, + }, + }, + groups = groups3, + }) + minetest.register_craft({ + output = 'noncubic:element_edge_double_' .. subname3 .. ' 1', + recipe = { + {"", "", ""}, + {"", 'noncubic:element_edge_' .. recipeitem3, ""}, + {"", 'noncubic:element_edge_' .. recipeitem3, ""}, + }, + }) + +end + + +-- Element T DOUBLE +------------------- +function noncubic.register_element_t_double(subname3, recipeitem3, groups3, images3, description3) + +minetest.register_node("noncubic:element_t_double_" .. subname3, { + description = description3, + drawtype = "nodebox", + tiles = images3, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = { + {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3}, + {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}, + {0.3, -0.5, -0.3, 0.5, 0.5, 0.3}, + }, + }, + node_box = { + type = "fixed", + fixed = { + {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3}, + {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}, + {0.3, -0.5, -0.3, 0.5, 0.5, 0.3}, + }, + }, + groups = groups3, + }) + minetest.register_craft({ + output = 'noncubic:element_t_double_' .. subname3 .. ' 1', + recipe = { + {"", "", ""}, + {"", 'noncubic:element_t_' .. recipeitem3, ""}, + {"", 'noncubic:element_t_' .. recipeitem3, ""}, + }, + }) + +end + + +-- Element Cross Double +----------------------- +function noncubic.register_element_cross_double(subname3, recipeitem3, groups3, images3, description3) + +minetest.register_node("noncubic:element_cross_double_" .. subname3, { + description = description3, + drawtype = "nodebox", + tiles = images3, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = { + {0.3, -0.5, -0.3, 0.5, 0.5, 0.3}, + {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5}, + {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}, + }, + }, + node_box = { + type = "fixed", + fixed = { + {0.3, -0.5, -0.3, 0.5, 0.5, 0.3}, + {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5}, + {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}, + }, + }, + groups = groups3, + }) + minetest.register_craft({ + output = 'noncubic:element_cross_double_' .. subname3 .. ' 1', + recipe = { + {"", "", ""}, + {"", 'noncubic:element_cross_' .. recipeitem3, ""}, + {"", 'noncubic:element_cross_' .. recipeitem3, ""}, + }, + }) + +end + + +-- Element End Double +--------------------- +function noncubic.register_element_end_double(subname3, recipeitem3, groups3, images3, description3) + +minetest.register_node("noncubic:element_end_double_" .. subname3, { + description = description3, + drawtype = "nodebox", + tiles = images3, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5}, + }, + node_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5}, + }, + groups = groups3, + }) + minetest.register_craft({ + output = 'noncubic:element_end_double_' .. subname3 .. ' 1', + recipe = { + {"", "", ""}, + {"", 'noncubic:element_end_' .. recipeitem3, ""}, + {"", 'noncubic:element_end_' .. recipeitem3, ""}, + }, + }) + +end + + +-- STICK +-------- +function noncubic.register_stick(subname2, recipeitem2, groups2, images2, description2) + +minetest.register_node("noncubic:stick_" .. subname2, { + description = description2, + drawtype = "nodebox", + tiles = images2, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + selection_box = { + type = "fixed", + fixed = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15}, + }, + node_box = { + type = "fixed", + fixed = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15}, + }, + groups = groups2, + }) + minetest.register_craft({ + output = 'noncubic:stick_' .. subname2 .. ' 8', + recipe = { + {'default:stick', "", ""}, + {"", "", ""}, + {recipeitem2, "", ""}, + }, + }) + +end + + +local source_list = { + {"black", "Darkened", "292421", 40, 36, 33}, + {"blue", "Blue", "0000FF", 0, 0, 255}, + {"green", "Green", "00FF00", 0, 255, 0}, + {"white", "White", "F5F5F5", 245, 245, 245}, + {"orange", "Orange", "FF6103", 255, 97, 3}, + {"red", "Red", "FF0000", 255, 0, 0}, + {"yellow", "Yellow", "FFFF00", 255, 255, 0}, + {"pink", "pink", "FF69B4", 255, 105, 180} +} + +for i in ipairs(source_list) do + local color1 = source_list[i][1] + local color2 = source_list[i][2] + local color3 = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +-- REGISTER NEW NONCUBIC's PART 2: noncubic.register_element_end(subname, recipeitem, groups, images, desc_element_xyz) +----------------------------------------------------------------------------------------------------------------------- +function noncubic.register_slope_edge_etc(subname, recipeitem, groups, images, desc_slope, desc_slope_lying, desc_slope_upsdown, desc_slope_edge, desc_slope_inner_edge, desc_slope_upsdwn_edge, desc_slope_upsdwn_inner_edge, desc_pyramid, desc_spike, desc_onecurvededge, desc_twocurvededge, desc_cylinder, desc_cylinder_horizontal, desc_sphere, desc_element_straight, desc_element_edge, desc_element_t, desc_element_cross, desc_element_end) + noncubic.register_slope(subname, recipeitem, groups, images, desc_slope) + noncubic.register_slope_lying(subname, recipeitem, groups, images, desc_slope_lying) + noncubic.register_slope_upsdown(subname, recipeitem, groups, images, desc_slope_upsdown) + noncubic.register_slope_edge(subname, recipeitem, groups, images, desc_slope_edge) + noncubic.register_slope_inner_edge(subname, recipeitem, groups, images, desc_slope_inner_edge) + noncubic.register_slope_upsdown_edge(subname, recipeitem, groups, images, desc_slope_upsdwn_edge) + noncubic.register_slope_upsdown_inner_edge(subname, recipeitem, groups, images, desc_slope_upsdwn_inner_edge) + noncubic.register_pyramid(subname, recipeitem, groups, images, desc_pyramid) + noncubic.register_spike(subname, recipeitem, groups, images, desc_spike) + noncubic.register_onecurvededge(subname, recipeitem, groups, images, desc_onecurvededge) + noncubic.register_twocurvededge(subname, recipeitem, groups, images, desc_twocurvededge) + noncubic.register_cylinder(subname, recipeitem, groups, images, desc_cylinder) + noncubic.register_cylinder_horizontal(subname, recipeitem, groups, images, desc_cylinder_horizontal) + noncubic.register_sphere(subname, recipeitem, groups, images, desc_sphere) + noncubic.register_element_straight(subname, recipeitem, groups, images, desc_element_straight) + noncubic.register_element_edge(subname, recipeitem, groups, images, desc_element_edge) + noncubic.register_element_t(subname, recipeitem, groups, images, desc_element_t) + noncubic.register_element_cross(subname, recipeitem, groups, images, desc_element_cross) + noncubic.register_element_end(subname, recipeitem, groups, images, desc_element_end) +end + + +-- REGISTER MATERIALS AND PROPERTIES FOR NONCUBIC ELEMENTS: +----------------------------------------------------------- + +-- Red +------- +noncubic.register_slope_edge_etc("" .. color1 .. "", "color:" .. color1, + {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + {"color_" .. color1 .. ".png"}, + "Red Slope", + color1 .. "Slope Lying", + color1 .. "Slope Upside Down", + color1 .. "Slope Edge", + color1 .. "Slope Inner Edge", + color1 .. "Slope Upside Down Edge", + color1 .. "Slope Upside Down Inner Edge", + color1 .. "Pyramid", + color1 .. "Spike", + color1 .. "One Curved Edge Block", + color1 .. "Two Curved Edge Block", + color1 .. "Cylinder", + color1 .. "Cylinder Horizontal", + color1 .. "Sphere", + color1 .. "Element Straight", + color1 .. "Element Edge", + color1 .. "Element T", + color1 .. "Element Cross", + color1 .. "Element End") + +-- REGISTER STICKS: noncubic.register_xyz(subname2, recipeitem2, groups2, images2, desc_element_xyz) +------------------------------------------------------------------------------------------------------------ +function noncubic.register_stick_etc(subname2, recipeitem2, groups2, images2, desc_stick) + noncubic.register_stick(subname2, recipeitem2, groups2, images2, desc_stick) +end + +-- REGISTER MATERIALS AND PROPERTIES FOR STICKS: +------------------------------------------------ + +-- WOOD +------- +noncubic.register_stick_etc("wood", "default:wood", + {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + {"default_wood.png"}, + "Wooden Stick") +-- STONE +-------- +noncubic.register_stick_etc("stone", "default:stone", + {cracky=3}, + {"default_stone.png"}, + "Stone Stick") +-- COBBLE +--------- +noncubic.register_stick_etc("cobble", "default:cobble", + {cracky=3}, + {"default_cobble.png"}, + "Cobble Stick") +-- BRICK +-------- +noncubic.register_stick_etc("brick", "default:brick", + {cracky=3}, + {"default_brick.png"}, + "Brick Stick") +-- SANDSTONE +------------ +noncubic.register_stick_etc("sandstone", "default:sandstone", + {crumbly=2,cracky=2}, + {"default_sandstone.png"}, + "Sandstone Stick") +-- LEAVES +--------- +noncubic.register_stick_etc("leaves", "default:leaves", + {snappy=2,choppy=2,oddly_breakable_by_hand=3}, + {"bucharest_tree.png"}, + "Leaves Stick") +-- TREE +------- +noncubic.register_stick_etc("tree", "default:tree", + {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + {"default_tree.png"}, + "Tree Stick") +-- STEEL +-------- +noncubic.register_stick_etc("steel", "default:steelblock", + {snappy=1,bendy=2,cracky=1,melty=2,level=2}, + {"default_steel_block.png"}, + "Steel Stick") + +-- REGISTER DOUBLE ELEMNTS: noncubic.register_xyz(subname3, recipeitem3, groups3, images3, desc_element_xyz) +---------------------------------------------------------------------------------------------------- +function noncubic.register_elements(subname3, recipeitem3, groups3, images3, desc_element_straight_double, desc_element_edge_double, desc_element_t_double, desc_element_cross_double, desc_element_end_double) + noncubic.register_element_straight_double(subname3, recipeitem3, groups3, images3, desc_element_straight_double) + noncubic.register_element_edge_double(subname3, recipeitem3, groups3, images3, desc_element_edge_double) + noncubic.register_element_t_double(subname3, recipeitem3, groups3, images3, desc_element_t_double) + noncubic.register_element_cross_double(subname3, recipeitem3, groups3, images3, desc_element_cross_double) + noncubic.register_element_end_double(subname3, recipeitem3, groups3, images3, desc_element_end_double) +end + +-- REGISTER MATERIALS AND PROPERTIES FOR HALF AND NORMAL HEIGHT ELEMENTS: +------------------------------------------------------------------------- + +-- WOOD +------- +noncubic.register_elements(color1, "color:" ..color1, + {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + {"color_" .. color1 ..".png"}, + color1 .. " Element Straight Double", + color1 .. "Element Edge Double", + color1 .. "Element T Double", + color1 .. "Element Cross Double", + color1 .. "Element End Double") + +end diff --git a/mods/Nodes/noncubic/readme.txt b/mods/Nodes/noncubic/readme.txt new file mode 100644 index 0000000..5e2e978 --- /dev/null +++ b/mods/Nodes/noncubic/readme.txt @@ -0,0 +1,167 @@ +[MOD] NonCubicBlocks 1.4 - for Minetest v0.4 or later +--------------------------------------by yves_de_beck + + + +Install: +-------- +Simply copy the complete "noncubic" folder in the ..minetest-0.4.4-win32/mods/minetest/ directory. + + + +Dependence: +----------- +Default Stairs MOD (inkluding Minetest v0.4 or higher) + + + +For Slower PC's: +---------------- +You can change in the init.lua the 'detail_level = 20' lower (or higher for faster PC's) + +Example: 'detail_level = 16' works very well for older PC's and looks good. =D + + + +Recipes: +-------- + + +The Milling Machine Block: +-------------------------- +[cobble] [stick] [cobble] +[wood planks] [wood planks] [wood planks] +[stick] [nothing] [stick] + + +Craft NonCubics without Milling Machine: +---------------------------------------- +(o=nothing) +(x=regular stairblock of wood/stone/sandstone/cobble/brick, + Normal Block of leaves, tree ,steel or + dirt (only slope, slope edge, slope inner edge, pyramid, half sized elements)) + +Slope: +xoo oox +xxo oxx +xxx xxx + +Slope Lying: +(o=nothing) +(x=slope) +ooo +oxo +ooo + +Slope Upside Down: +xxx xxx +oxx xxo +oox xoo + +Slope Edge: +ooo ooo +xoo oox +xxo oxx + +Slope Inner Edge: +oox xoo +xoo oox +xxo oxx + +Slope Edge Upside Down: +oxx xxo +oox xoo +ooo ooo + +Slope Inner Edge Upside Down: +oxx xxo +oox xoo +xoo oox + +Pyramid: +ooo +oxo +xox + +Spike: +oxo +xox +xox + +Block one curved edge: +oxx +xxx +xxx + +Block two curved edge: +(o=nothing) +(x=block one curved edge) +ooo +xoo +xxo + +Cylinder Vertical: +xxo +xxo +xxo +(You can also craft one cylinder vertical + in a cylinder horizontal) + +Cylinder Horizontal: +ooo +xxx +xxx +(You can also craft one cylinder horizontal + in a cylinder vertical) + +Sphere: +oxo +xox +oxo + +Element Straight: +oxo +oxo +oxo + +Element Edge: +xxx +oox +oox + +Element T: +ooo +xxx +oxo + +Element Cross: +oxo +xxx +oxo + +Element End: +ooo +oxo +oxo + +---------------------------------------- + +For double height Elements simply craft: +(o=nothing) +(x=element Straight, Edge, T, Cross or Element End) +ooo +xoo +xoo + +---------------------------------------- + +Sticks: +(o=nothing) +(x=regular wood, stone, sandstone, cobble, brick, + Block of leaves, tree or steel) +(y=regular wooden stick) +yoo +ooo +xoo + +---------------------------------------- \ No newline at end of file diff --git a/mods/Nodes/noncubic/textures/Shapes.png b/mods/Nodes/noncubic/textures/Shapes.png new file mode 100644 index 0000000..0882657 Binary files /dev/null and b/mods/Nodes/noncubic/textures/Shapes.png differ diff --git a/mods/Nodes/noncubic/textures/Thumbs.db b/mods/Nodes/noncubic/textures/Thumbs.db new file mode 100644 index 0000000..7d4f935 Binary files /dev/null and b/mods/Nodes/noncubic/textures/Thumbs.db differ diff --git a/mods/Nodes/noncubic/textures/bucharest_tree.png b/mods/Nodes/noncubic/textures/bucharest_tree.png new file mode 100644 index 0000000..cc4b188 Binary files /dev/null and b/mods/Nodes/noncubic/textures/bucharest_tree.png differ diff --git a/mods/Nodes/noncubic/textures/cnc_bottom.png b/mods/Nodes/noncubic/textures/cnc_bottom.png new file mode 100644 index 0000000..e600cb1 Binary files /dev/null and b/mods/Nodes/noncubic/textures/cnc_bottom.png differ diff --git a/mods/Nodes/noncubic/textures/cnc_front.png b/mods/Nodes/noncubic/textures/cnc_front.png new file mode 100644 index 0000000..6cc0490 Binary files /dev/null and b/mods/Nodes/noncubic/textures/cnc_front.png differ diff --git a/mods/Nodes/noncubic/textures/cnc_side.png b/mods/Nodes/noncubic/textures/cnc_side.png new file mode 100644 index 0000000..1ecbbac Binary files /dev/null and b/mods/Nodes/noncubic/textures/cnc_side.png differ diff --git a/mods/Nodes/noncubic/textures/cnc_top.png b/mods/Nodes/noncubic/textures/cnc_top.png new file mode 100644 index 0000000..5123334 Binary files /dev/null and b/mods/Nodes/noncubic/textures/cnc_top.png differ diff --git a/mods/Nodes/noncubic/textures/cylinder_horizontal.png b/mods/Nodes/noncubic/textures/cylinder_horizontal.png new file mode 100644 index 0000000..670ecf2 Binary files /dev/null and b/mods/Nodes/noncubic/textures/cylinder_horizontal.png differ diff --git a/mods/Nodes/noncubic/textures/element_cross.png b/mods/Nodes/noncubic/textures/element_cross.png new file mode 100644 index 0000000..f2ad0b7 Binary files /dev/null and b/mods/Nodes/noncubic/textures/element_cross.png differ diff --git a/mods/Nodes/noncubic/textures/element_edge.png b/mods/Nodes/noncubic/textures/element_edge.png new file mode 100644 index 0000000..e6104cf Binary files /dev/null and b/mods/Nodes/noncubic/textures/element_edge.png differ diff --git a/mods/Nodes/noncubic/textures/element_end.png b/mods/Nodes/noncubic/textures/element_end.png new file mode 100644 index 0000000..6bc6837 Binary files /dev/null and b/mods/Nodes/noncubic/textures/element_end.png differ diff --git a/mods/Nodes/noncubic/textures/element_straight.png b/mods/Nodes/noncubic/textures/element_straight.png new file mode 100644 index 0000000..1648b7b Binary files /dev/null and b/mods/Nodes/noncubic/textures/element_straight.png differ diff --git a/mods/Nodes/noncubic/textures/element_t.png b/mods/Nodes/noncubic/textures/element_t.png new file mode 100644 index 0000000..0d49cd8 Binary files /dev/null and b/mods/Nodes/noncubic/textures/element_t.png differ diff --git a/mods/Nodes/noncubic/textures/full.png b/mods/Nodes/noncubic/textures/full.png new file mode 100644 index 0000000..d551a45 Binary files /dev/null and b/mods/Nodes/noncubic/textures/full.png differ diff --git a/mods/Nodes/noncubic/textures/half.png b/mods/Nodes/noncubic/textures/half.png new file mode 100644 index 0000000..51ebcd7 Binary files /dev/null and b/mods/Nodes/noncubic/textures/half.png differ diff --git a/mods/Nodes/noncubic/textures/milling_background.png b/mods/Nodes/noncubic/textures/milling_background.png new file mode 100644 index 0000000..6a9c2f4 Binary files /dev/null and b/mods/Nodes/noncubic/textures/milling_background.png differ diff --git a/mods/Nodes/noncubic/textures/onecurvededge.png b/mods/Nodes/noncubic/textures/onecurvededge.png new file mode 100644 index 0000000..46779fd Binary files /dev/null and b/mods/Nodes/noncubic/textures/onecurvededge.png differ diff --git a/mods/Nodes/noncubic/textures/pyramid.png b/mods/Nodes/noncubic/textures/pyramid.png new file mode 100644 index 0000000..5dc3322 Binary files /dev/null and b/mods/Nodes/noncubic/textures/pyramid.png differ diff --git a/mods/Nodes/noncubic/textures/slope_edge.png b/mods/Nodes/noncubic/textures/slope_edge.png new file mode 100644 index 0000000..785adf6 Binary files /dev/null and b/mods/Nodes/noncubic/textures/slope_edge.png differ diff --git a/mods/Nodes/noncubic/textures/slope_edge_upsdwn.png b/mods/Nodes/noncubic/textures/slope_edge_upsdwn.png new file mode 100644 index 0000000..5adb788 Binary files /dev/null and b/mods/Nodes/noncubic/textures/slope_edge_upsdwn.png differ diff --git a/mods/Nodes/noncubic/textures/slope_inner_edge.png b/mods/Nodes/noncubic/textures/slope_inner_edge.png new file mode 100644 index 0000000..906dd25 Binary files /dev/null and b/mods/Nodes/noncubic/textures/slope_inner_edge.png differ diff --git a/mods/Nodes/noncubic/textures/slope_inner_edge_upsdwn.png b/mods/Nodes/noncubic/textures/slope_inner_edge_upsdwn.png new file mode 100644 index 0000000..0ae0e14 Binary files /dev/null and b/mods/Nodes/noncubic/textures/slope_inner_edge_upsdwn.png differ diff --git a/mods/Nodes/noncubic/textures/slope_lying.png b/mods/Nodes/noncubic/textures/slope_lying.png new file mode 100644 index 0000000..377769a Binary files /dev/null and b/mods/Nodes/noncubic/textures/slope_lying.png differ diff --git a/mods/Nodes/noncubic/textures/slope_upsdwn.png b/mods/Nodes/noncubic/textures/slope_upsdwn.png new file mode 100644 index 0000000..b802b60 Binary files /dev/null and b/mods/Nodes/noncubic/textures/slope_upsdwn.png differ diff --git a/mods/Nodes/noncubic/textures/spike.png b/mods/Nodes/noncubic/textures/spike.png new file mode 100644 index 0000000..92e6e58 Binary files /dev/null and b/mods/Nodes/noncubic/textures/spike.png differ diff --git a/mods/Nodes/noncubic/textures/stick.png b/mods/Nodes/noncubic/textures/stick.png new file mode 100644 index 0000000..8dfe408 Binary files /dev/null and b/mods/Nodes/noncubic/textures/stick.png differ diff --git a/mods/Nodes/noncubic/textures/twocurvededge.png b/mods/Nodes/noncubic/textures/twocurvededge.png new file mode 100644 index 0000000..3219a90 Binary files /dev/null and b/mods/Nodes/noncubic/textures/twocurvededge.png differ diff --git a/mods/Nodes/pkarcs/depends.txt b/mods/Nodes/pkarcs/depends.txt new file mode 100644 index 0000000..9bc856f --- /dev/null +++ b/mods/Nodes/pkarcs/depends.txt @@ -0,0 +1,2 @@ +default +color diff --git a/mods/Nodes/pkarcs/description.txt b/mods/Nodes/pkarcs/description.txt new file mode 100644 index 0000000..c70916f --- /dev/null +++ b/mods/Nodes/pkarcs/description.txt @@ -0,0 +1,47 @@ +This mod adds arc-nodes to Minetest as well as arcs for inner and outer corners. + +Provided nodes: + +default:cobble +default:mossycobble + +default:stone +default:stonebrick +default:stone_block + +default:desert_cobble +default:desert_stone +default:desert_stonebrick +default:desert_stone_block + +default:sandstone +default:sandstonebrick +default:sandstone_block + +default:brick + +default:obsidian +default:obsidianbrick +default:obsidian_block + +default:wood +default:junglewood +default:pine_wood +default:acacia_wood +default:aspen_wood + + +To make arcs from nodes of your mod, put "pkarcs?" into your depends.txt, +and call this function in your init.lua: + +if minetest.get_modpath("pkarcs") then + pkarcs.register_node("your_mod:your_nodename") +end + +Tested with Minetest 0.4.15 + +--- + +PEAK +01-20-2017 + diff --git a/mods/Nodes/pkarcs/init.lua b/mods/Nodes/pkarcs/init.lua new file mode 100644 index 0000000..21315c7 --- /dev/null +++ b/mods/Nodes/pkarcs/init.lua @@ -0,0 +1,272 @@ + +pkarcs = {} + +function nb(n) + return n/16-1/2 +end + +local source_list = { + {"black", "Darkened", color1, 40, 36, 33}, + {"blue", "Blue", color2, 0, 0, 255}, + {"green", "Green", color3, 0, 255, 0}, + {"white", "White", color4, 245, 245, 245}, + {"orange", "Orange", color5, 255, 97, 3}, + {"red", "Red", color6, 255, 0, 0}, + {"yellow", "Yellow", color7, 255, 255, 0}, + {"pink", "Pink", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local color = source_list[i][1] +local nodename = source_list[i][1] +local name = source_list[i][1] + local desc = source_list[i][2] + local desc2 = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + + minetest.register_node("pkarcs:".. color .."_arc", { + description = desc2 .." Arc", + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { nb(0), nb(0), nb(0), nb(1), nb(16), nb(16) }, + { nb(1), nb(4), nb(0), nb(2), nb(16), nb(16) }, + { nb(2), nb(7), nb(0), nb(3), nb(16), nb(16) }, + { nb(3), nb(8), nb(0), nb(4), nb(16), nb(16) }, + { nb(4), nb(10), nb(0), nb(5), nb(16), nb(16) }, + { nb(5), nb(11), nb(0), nb(6), nb(16), nb(16) }, + { nb(6), nb(12), nb(0), nb(8), nb(16), nb(16) }, + { nb(8), nb(13), nb(0), nb(9), nb(16), nb(16) }, + { nb(9), nb(14), nb(0), nb(12), nb(16), nb(16) }, + { nb(12), nb(15), nb(0), nb(16), nb(16), nb(16) }, + } + }, + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + is_ground_content = true, + groups = {snappy = 2, choppy = 2, wool = 2}, + sounds = default.node_sound_defaults(), + oddly_breakable_by_hand = 1, + dig_immediate = 3, + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "arc.png^[colorize:#"..colour..":70", + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local p1 = pointed_thing.under + local p0 = pointed_thing.above + local param2 = 0 + + local placer_pos = placer:getpos() + if placer_pos then + local dir = { + x = p1.x - placer_pos.x, + y = p1.y - placer_pos.y, + z = p1.z - placer_pos.z + } + param2 = minetest.dir_to_facedir(dir) + end + + if p0.y-1 == p1.y then + param2 = param2 + 20 + if param2 == 21 then + param2 = 23 + elseif param2 == 23 then + param2 = 21 + end + end + + local NROT = 4 -- Number of possible "rotations" (4 Up down left right) + local rot = param2 % NROT + local wall = math.floor(param2/NROT) + if rot >=3 then + rot = 0 + else + rot = rot +1 + end + param2 = wall*NROT+rot + + return minetest.item_place(itemstack, placer, pointed_thing, param2) + end, + + }) + +-- outer arc + + minetest.register_node("pkarcs:"..nodename.."_outarc", { + description = desc.." Out Arc", + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { nb(0), nb(0), nb(16), nb(1), nb(16), nb(16-1) }, + { nb(0), nb(4), nb(16), nb(2), nb(16), nb(16-2) }, + { nb(0), nb(7), nb(16), nb(3), nb(16), nb(16-3) }, + { nb(0), nb(8), nb(16), nb(4), nb(16), nb(16-4) }, + { nb(0), nb(10), nb(16), nb(5), nb(16), nb(16-5) }, + { nb(0), nb(11), nb(16), nb(6), nb(16), nb(16-6) }, + { nb(0), nb(12), nb(16), nb(8), nb(16), nb(16-8) }, + { nb(0), nb(13), nb(16), nb(9), nb(16), nb(16-9) }, + { nb(0), nb(14), nb(16), nb(12), nb(16), nb(16-12) }, + { nb(0), nb(15), nb(16), nb(16), nb(16), nb(16-16) }, + } + }, + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + is_ground_content = true, + groups = {snappy = 2, choppy = 2, wool = 2}, + sounds = default.node_sound_defaults(), + oddly_breakable_by_hand = 1, + dig_immediate = 3, +wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "arcout.png^[colorize:#"..colour..":70", + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local p1 = pointed_thing.under + local p0 = pointed_thing.above + local param2 = 0 + + local placer_pos = placer:getpos() + if placer_pos then + local dir = { + x = p1.x - placer_pos.x, + y = p1.y - placer_pos.y, + z = p1.z - placer_pos.z + } + param2 = minetest.dir_to_facedir(dir) + end + + if p0.y-1 == p1.y then + param2 = param2 + 20 + if param2 == 21 then + param2 = 23 + elseif param2 == 23 then + param2 = 21 + end + end + + local NROT = 4 -- Number of possible "rotations" (4 Up down left right) + local rot = param2 % NROT + local wall = math.floor(param2/NROT) + if rot >=3 then + rot = 0 + else + rot = rot +1 + end + param2 = wall*NROT+rot + + return minetest.item_place(itemstack, placer, pointed_thing, param2) + end, + + }) + +-- inner arc + + minetest.register_node("pkarcs:"..nodename.."_inarc", { + description = desc.." In Arc", + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { nb(0), nb(0), nb(16), nb(1), nb(16), nb(0) }, + { nb(0), nb(0), nb(16), nb(16), nb(16), nb(16-1) }, + + { nb(0), nb(4), nb(16), nb(2), nb(16), nb(0) }, + { nb(0), nb(4), nb(16), nb(16), nb(16), nb(16-2) }, + + { nb(0), nb(7), nb(16), nb(3), nb(16), nb(0) }, + { nb(0), nb(7), nb(16), nb(16), nb(16), nb(16-3) }, + + { nb(0), nb(8), nb(16), nb(4), nb(16), nb(0) }, + { nb(0), nb(8), nb(16), nb(16), nb(16), nb(16-4) }, + + { nb(0), nb(10), nb(16), nb(5), nb(16), nb(0) }, + { nb(0), nb(10), nb(16), nb(16), nb(16), nb(16-5) }, + + { nb(0), nb(11), nb(16), nb(6), nb(16), nb(0) }, + { nb(0), nb(11), nb(16), nb(16), nb(16), nb(16-6) }, + + { nb(0), nb(12), nb(16), nb(8), nb(16), nb(0) }, + { nb(0), nb(12), nb(16), nb(16), nb(16), nb(16-8) }, + + { nb(0), nb(13), nb(16), nb(9), nb(16), nb(0) }, + { nb(0), nb(13), nb(16), nb(16), nb(16), nb(16-9) }, + + { nb(0), nb(14), nb(16), nb(12), nb(16), nb(0) }, + { nb(0), nb(14), nb(16), nb(16), nb(16), nb(16-12) }, + + { nb(0), nb(15), nb(16), nb(16), nb(16), nb(16-16) }, + } + }, + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + is_ground_content = true, + groups = {snappy = 2, choppy = 2, wool = 2}, + sounds = default.node_sound_defaults(), + oddly_breakable_by_hand = 1, + dig_immediate = 3, + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "arcin.png^[colorize:#"..colour..":70", + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local p1 = pointed_thing.under + local p0 = pointed_thing.above + local param2 = 0 + + local placer_pos = placer:getpos() + if placer_pos then + local dir = { + x = p1.x - placer_pos.x, + y = p1.y - placer_pos.y, + z = p1.z - placer_pos.z + } + param2 = minetest.dir_to_facedir(dir) + end + + if p0.y-1 == p1.y then + param2 = param2 + 20 + if param2 == 21 then + param2 = 23 + elseif param2 == 23 then + param2 = 21 + end + end + + local NROT = 4 -- Number of possible "rotations" (4 Up down left right) + local rot = param2 % NROT + local wall = math.floor(param2/NROT) + if rot >=3 then + rot = 0 + else + rot = rot +1 + end + param2 = wall*NROT+rot + + return minetest.item_place(itemstack, placer, pointed_thing, param2) + end, + + }) + + +end diff --git a/mods/Nodes/pkarcs/license.txt b/mods/Nodes/pkarcs/license.txt new file mode 100644 index 0000000..e69de29 diff --git a/mods/Nodes/pkarcs/mod.conf b/mods/Nodes/pkarcs/mod.conf new file mode 100644 index 0000000..e3b7fd9 --- /dev/null +++ b/mods/Nodes/pkarcs/mod.conf @@ -0,0 +1 @@ +name = pkarcs diff --git a/mods/Nodes/pkarcs/screenshots/crafting_arc.png b/mods/Nodes/pkarcs/screenshots/crafting_arc.png new file mode 100644 index 0000000..b7e1ef7 Binary files /dev/null and b/mods/Nodes/pkarcs/screenshots/crafting_arc.png differ diff --git a/mods/Nodes/pkarcs/screenshots/crafting_inner_arc.png b/mods/Nodes/pkarcs/screenshots/crafting_inner_arc.png new file mode 100644 index 0000000..9a58715 Binary files /dev/null and b/mods/Nodes/pkarcs/screenshots/crafting_inner_arc.png differ diff --git a/mods/Nodes/pkarcs/screenshots/crafting_outer_arc.png b/mods/Nodes/pkarcs/screenshots/crafting_outer_arc.png new file mode 100644 index 0000000..b2e2795 Binary files /dev/null and b/mods/Nodes/pkarcs/screenshots/crafting_outer_arc.png differ diff --git a/mods/Nodes/pkarcs/screenshots/screenshot_1.png b/mods/Nodes/pkarcs/screenshots/screenshot_1.png new file mode 100644 index 0000000..71015c4 Binary files /dev/null and b/mods/Nodes/pkarcs/screenshots/screenshot_1.png differ diff --git a/mods/Nodes/pkarcs/screenshots/screenshot_2.png b/mods/Nodes/pkarcs/screenshots/screenshot_2.png new file mode 100644 index 0000000..02bde8a Binary files /dev/null and b/mods/Nodes/pkarcs/screenshots/screenshot_2.png differ diff --git a/mods/Nodes/slope/blends/slope_test_blob_onetexture.blend b/mods/Nodes/slope/blends/slope_test_blob_onetexture.blend new file mode 100644 index 0000000..89c3064 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_blob_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_cone_onetexture.blend b/mods/Nodes/slope/blends/slope_test_cone_onetexture.blend new file mode 100644 index 0000000..646b940 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_cone_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_corner_pyramid_short_1_onetexture.blend b/mods/Nodes/slope/blends/slope_test_corner_pyramid_short_1_onetexture.blend new file mode 100644 index 0000000..c5cf234 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_corner_pyramid_short_1_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_corner_pyramid_short_2_onetexture.blend b/mods/Nodes/slope/blends/slope_test_corner_pyramid_short_2_onetexture.blend new file mode 100644 index 0000000..73536a0 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_corner_pyramid_short_2_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_corner_pyramid_tall_1_onetexture.blend b/mods/Nodes/slope/blends/slope_test_corner_pyramid_tall_1_onetexture.blend new file mode 100644 index 0000000..122faf9 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_corner_pyramid_tall_1_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_corner_pyramid_tall_2_onetexture.blend b/mods/Nodes/slope/blends/slope_test_corner_pyramid_tall_2_onetexture.blend new file mode 100644 index 0000000..8d82b15 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_corner_pyramid_tall_2_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_cylinder.blend b/mods/Nodes/slope/blends/slope_test_cylinder.blend new file mode 100644 index 0000000..6efada6 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_cylinder.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_cylinder_onetexture.blend b/mods/Nodes/slope/blends/slope_test_cylinder_onetexture.blend new file mode 100644 index 0000000..5fdadf7 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_cylinder_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_icorner.blend b/mods/Nodes/slope/blends/slope_test_icorner.blend new file mode 100644 index 0000000..93fb142 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_icorner.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_icorner_half_short_onetexture.blend b/mods/Nodes/slope/blends/slope_test_icorner_half_short_onetexture.blend new file mode 100644 index 0000000..ff06b4b Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_icorner_half_short_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_icorner_half_tall_onetexture.blend b/mods/Nodes/slope/blends/slope_test_icorner_half_tall_onetexture.blend new file mode 100644 index 0000000..1a64bff Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_icorner_half_tall_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_icorner_onetexture.blend b/mods/Nodes/slope/blends/slope_test_icorner_onetexture.blend new file mode 100644 index 0000000..617d107 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_icorner_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_ocorner.blend b/mods/Nodes/slope/blends/slope_test_ocorner.blend new file mode 100644 index 0000000..65122a1 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_ocorner.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_ocorner_onetexture.blend b/mods/Nodes/slope/blends/slope_test_ocorner_onetexture.blend new file mode 100644 index 0000000..bf7cf35 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_ocorner_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_ocorner_short_onetexture.blend b/mods/Nodes/slope/blends/slope_test_ocorner_short_onetexture.blend new file mode 100644 index 0000000..3740e0b Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_ocorner_short_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_pyramid_onetexture.blend b/mods/Nodes/slope/blends/slope_test_pyramid_onetexture.blend new file mode 100644 index 0000000..9958269 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_pyramid_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_pyramid_short_onetexture.blend b/mods/Nodes/slope/blends/slope_test_pyramid_short_onetexture.blend new file mode 100644 index 0000000..342d569 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_pyramid_short_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_quarter_round.blend b/mods/Nodes/slope/blends/slope_test_quarter_round.blend new file mode 100644 index 0000000..4ae25a4 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_quarter_round.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_quarter_round_corner.blend b/mods/Nodes/slope/blends/slope_test_quarter_round_corner.blend new file mode 100644 index 0000000..533616f Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_quarter_round_corner.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_quarter_round_corner_onetexture.blend b/mods/Nodes/slope/blends/slope_test_quarter_round_corner_onetexture.blend new file mode 100644 index 0000000..dc7377a Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_quarter_round_corner_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_quarter_round_onetexture.blend b/mods/Nodes/slope/blends/slope_test_quarter_round_onetexture.blend new file mode 100644 index 0000000..06490b1 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_quarter_round_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_slope.blend b/mods/Nodes/slope/blends/slope_test_slope.blend new file mode 100644 index 0000000..21a3718 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_slope.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_slope_long.blend b/mods/Nodes/slope/blends/slope_test_slope_long.blend new file mode 100644 index 0000000..34d5a7a Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_slope_long.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_slope_long_backhalf_onetexture.blend b/mods/Nodes/slope/blends/slope_test_slope_long_backhalf_onetexture.blend new file mode 100644 index 0000000..0d75d83 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_slope_long_backhalf_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_slope_long_fronthalf_onetexture.blend b/mods/Nodes/slope/blends/slope_test_slope_long_fronthalf_onetexture.blend new file mode 100644 index 0000000..9caccaa Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_slope_long_fronthalf_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_slope_long_onetexture.blend b/mods/Nodes/slope/blends/slope_test_slope_long_onetexture.blend new file mode 100644 index 0000000..9a27937 Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_slope_long_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_slope_onetexture.blend b/mods/Nodes/slope/blends/slope_test_slope_onetexture.blend new file mode 100644 index 0000000..d1b815b Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_slope_onetexture.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_sphere.blend b/mods/Nodes/slope/blends/slope_test_sphere.blend new file mode 100644 index 0000000..58137fd Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_sphere.blend differ diff --git a/mods/Nodes/slope/blends/slope_test_sphere_onetexture.blend b/mods/Nodes/slope/blends/slope_test_sphere_onetexture.blend new file mode 100644 index 0000000..2bfbc7d Binary files /dev/null and b/mods/Nodes/slope/blends/slope_test_sphere_onetexture.blend differ diff --git a/mods/Nodes/slope/depends.txt b/mods/Nodes/slope/depends.txt new file mode 100644 index 0000000..9bc856f --- /dev/null +++ b/mods/Nodes/slope/depends.txt @@ -0,0 +1,2 @@ +default +color diff --git a/mods/Nodes/slope/init.lua b/mods/Nodes/slope/init.lua new file mode 100644 index 0000000..dc06f29 --- /dev/null +++ b/mods/Nodes/slope/init.lua @@ -0,0 +1,447 @@ +local slope_cbox = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + {-0.5, -0.25, -0.25, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.25, 0.5}, + {-0.5, 0.25, 0.25, 0.5, 0.5, 0.5} + } +} + +local slope_cbox_long = { + type = "fixed", + fixed = { + {-0.5, -0.5, -1.5, 0.5, -0.375, 0.5}, -- NodeBox1 + {-0.5, -0.375, -1.25, 0.5, -0.25, 0.5}, -- NodeBox2 + {-0.5, -0.25, -1, 0.5, -0.125, 0.5}, -- NodeBox3 + {-0.5, -0.125, -0.75, 0.5, 0, 0.5}, -- NodeBox4 + {-0.5, 0, -0.5, 0.5, 0.125, 0.5}, -- NodeBox5 + {-0.5, 0.125, -0.25, 0.5, 0.25, 0.5}, -- NodeBox6 + {-0.5, 0.25, 0, 0.5, 0.375, 0.5}, -- NodeBox7 + {-0.5, 0.375, 0.25, 0.5, 0.5, 0.5}, -- NodeBox8 + } +} + +local icorner_cbox = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, -- NodeBox5 + {-0.5, -0.5, -0.25, 0.5, 0, 0.5}, -- NodeBox6 + {-0.5, -0.5, -0.5, 0.25, 0, 0.5}, -- NodeBox7 + {-0.5, 0, -0.5, 0, 0.25, 0.5}, -- NodeBox8 + {-0.5, 0, 0, 0.5, 0.25, 0.5}, -- NodeBox9 + {-0.5, 0.25, 0.25, 0.5, 0.5, 0.5}, -- NodeBox10 + {-0.5, 0.25, -0.5, -0.25, 0.5, 0.5}, -- NodeBox11 + } +} + +local ocorner_cbox = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + {-0.5, -0.25, -0.25, 0.25, 0, 0.5}, + {-0.5, 0, 0, 0, 0.25, 0.5}, + {-0.5, 0.25, 0.25, -0.25, 0.5, 0.5} + } +} + +local short_pyr_cbox = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.375, 0.5 }, + { -0.375, -0.375, -0.375, 0.375, -0.25, 0.375}, + { -0.25, -0.25, -0.25, 0.25, -0.125, 0.25}, + { -0.125, -0.125, -0.125, 0.125, 0, 0.125} + } +} + +local tall_pyr_cbox = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 }, + { -0.375, -0.25, -0.375, 0.375, 0, 0.375}, + { -0.25, 0, -0.25, 0.25, 0.25, 0.25}, + { -0.125, 0.25, -0.125, 0.125, 0.5, 0.125} + } +} + +local slope_fronthalf_cbox = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.375, 0.5}, -- NodeBox1 + {-0.5, -0.375, -0.25, 0.5, -0.25, 0.5}, -- NodeBox2 + {-0.5, -0.25, 0, 0.5, -0.125, 0.5}, -- NodeBox3 + {-0.5, -0.125, 0.25, 0.5, 0, 0.5}, -- NodeBox4 + } +} + +local slope_backhalf_cbox = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.125, 0.5}, -- NodeBox1 + {-0.5, 0.125, -0.25, 0.5, 0.25, 0.5}, -- NodeBox2 + {-0.5, 0.25, 0, 0.5, 0.375, 0.5}, -- NodeBox3 + {-0.5, 0.375, 0.25, 0.5, 0.5, 0.5}, -- NodeBox4 + } +} + + +local source_list = { + {"black", "Darkened", color1, 40, 36, 33}, + {"blue", "Blue", color2, 0, 0, 255}, + {"green", "Green", color3, 0, 255, 0}, + {"white", "White", color4, 245, 245, 245}, + {"orange", "Orange", color5, 255, 97, 3}, + {"red", "Red", color6, 255, 0, 0}, + {"yellow", "Yellow", color7, 255, 255, 0}, + {"pink", "pink", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local name = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +-- drawtype = "glasslike", + +-- Glass + +minetest.register_node("slope:edge_glass_" .. name, { + description = desc .. "glass edge", + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "edge.png^[colorize:#"..colour..":70", + drawtype = "mesh", + mesh = "slope_test_quarter_round_onetexture.obj", + tiles = {"whiteglass.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + use_texture_alpha = true, + sunlight_propagates = true, + groups = {cracky=3, oddly_breakable_by_hand=2}, + sounds = default.node_sound_glass_defaults(), + on_place = minetest.rotate_node, + }) + +minetest.register_node("slope:edgecorner_glass_" .. name, { + description = desc .. "edge", + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "edgecorner.png^[colorize:#"..colour..":70", + drawtype = "mesh", + mesh = "slope_test_quarter_round_corner_onetexture.obj", + tiles = {"whiteglass.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + use_texture_alpha = true, + sunlight_propagates = true, + groups = {cracky=3, oddly_breakable_by_hand=2}, + sounds = default.node_sound_stone_defaults(), + on_place = minetest.rotate_node, + }) + +minetest.register_node("slope:slope_glass_"..name, { + description = desc.. " slope", + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "triangle.png^[colorize:#"..colour..":70", + drawtype = "mesh", + mesh = "slope_test_slope.obj", + tiles = {"whiteglass.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + use_texture_alpha = true, + sunlight_propagates = true, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, + sounds = default.node_sound_defaults(), + on_place = minetest.rotate_node, + collision_box = slope_cbox, + selection_box = slope_cbox, + oddly_breakable_by_hand = 1, + dig_immediate = 3, + }) + + minetest.register_node("slope:ocorner_glass_"..name, { + description = desc.." slope (outer corner)", + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "cornera.png^[colorize:#"..colour..":70", + drawtype = "mesh", + mesh = "slope_test_ocorner.obj", + tiles = {"whiteglass.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + use_texture_alpha = true, + sunlight_propagates = true, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, + collision_box = ocorner_cbox, + selection_box = ocorner_cbox, + oddly_breakable_by_hand = 1, + dig_immediate = 3, + }) + minetest.register_node("slope:icorner_glass_"..name, { + description = desc.." slope (inner corner)", + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "cornerb.png^[colorize:#"..colour..":70", + drawtype = "mesh", + mesh = "slope_test_icorner.obj", + tiles = {"whiteglass.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + use_texture_alpha = true, + sunlight_propagates = true, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, + sounds = default.node_sound_defaults(), + on_place = minetest.rotate_node, + collision_box = ocorner_cbox, + selection_box = ocorner_cbox, + oddly_breakable_by_hand = 1, + dig_immediate = 3, + }) + + minetest.register_node("slope:slopelong_glass_"..name, { + description = desc.." long slope", + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "long.png^[colorize:#"..colour..":70", + drawtype = "mesh", + mesh = "slope_test_slope_long.obj", + tiles = {"whiteglass.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, + sounds = default.node_sound_defaults(), + use_texture_alpha = true, + sunlight_propagates = true, + on_place = minetest.rotate_node, + collision_box = slope_cbox_long, + selection_box = slope_cbox_long, + oddly_breakable_by_hand = 1, + dig_immediate = 3, + }) + + minetest.register_node("slope:cylinder_glass_"..name, { + description = desc.." cylinder", + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "cylinder.png^[colorize:#"..colour..":70", + drawtype = "mesh", + mesh = "slope_test_cylinder.obj", + tiles = {"whiteglass.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + use_texture_alpha = true, + sunlight_propagates = true, + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, + sounds = default.node_sound_defaults(), + on_place = minetest.rotate_node, + oddly_breakable_by_hand = 1, + dig_immediate = 3, + }) + + minetest.register_node("slope:cone_glass_"..name, { + description = desc.." cone", + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "cone.png^[colorize:#"..colour..":70", + drawtype = "mesh", + mesh = "slope_test_cone_onetexture.obj", + tiles = {"whiteglass.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + use_texture_alpha = true, + sunlight_propagates = true, + groups = {snappy=2, cracky=3, oddly_breakable_by_hand=2}, + sounds = default.node_sound_defaults(), + on_place = minetest.rotate_node, + selection_box = tall_pyr_cbox, + collision_box = tall_pyr_cbox, + oddly_breakable_by_hand = 1, + dig_immediate = 3, + }) + + minetest.register_node("slope:sphere_glass_"..name, { + description = desc.." sphere", + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "sphere.png^[colorize:#"..colour..":70", + drawtype = "mesh", + mesh = "slope_test_sphere_onetexture.obj", + tiles = {"whiteglass.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + use_texture_alpha = true, + sunlight_propagates = true, + groups = {snappy=2, cracky=3, oddly_breakable_by_hand=2}, + sounds = default.node_sound_defaults(), + oddly_breakable_by_hand = 1, + dig_immediate = 3, + }) + + +-- Normal + + minetest.register_node("slope:edge_" .. name, { + description = desc .. "edge", +wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, +inventory_image = "edge.png^[colorize:#"..colour..":70", + drawtype = "mesh", + mesh = "slope_test_quarter_round_onetexture.obj", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=3, oddly_breakable_by_hand=2}, + sounds = default.node_sound_stone_defaults(), + on_place = minetest.rotate_node, + }) + +minetest.register_node("slope:edgecorner_" .. name, { + description = desc .. "edge", +wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, +inventory_image = "edgecorner.png^[colorize:#"..colour..":70", + drawtype = "mesh", + mesh = "slope_test_quarter_round_corner_onetexture.obj", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=3, oddly_breakable_by_hand=2}, + sounds = default.node_sound_stone_defaults(), + on_place = minetest.rotate_node, + }) + +minetest.register_node("slope:slope_"..name, { + description = desc.. " slope", +wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, +inventory_image = "triangle.png^[colorize:#"..colour..":70", + drawtype = "mesh", + mesh = "slope_test_slope.obj", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, + sounds = default.node_sound_defaults(), + on_place = minetest.rotate_node, + collision_box = slope_cbox, + selection_box = slope_cbox, + oddly_breakable_by_hand = 1, + dig_immediate = 3, + }) + + minetest.register_node("slope:ocorner_"..name, { + description = desc.." slope (outer corner)", +wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, +inventory_image = "cornera.png^[colorize:#"..colour..":70", + drawtype = "mesh", + mesh = "slope_test_ocorner.obj", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, + collision_box = ocorner_cbox, + selection_box = ocorner_cbox, + oddly_breakable_by_hand = 1, + dig_immediate = 3, + }) + minetest.register_node("slope:icorner_"..name, { + description = desc.." slope (inner corner)", +wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, +inventory_image = "cornerb.png^[colorize:#"..colour..":70", + drawtype = "mesh", + mesh = "slope_test_icorner.obj", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, + sounds = default.node_sound_defaults(), + on_place = minetest.rotate_node, + collision_box = ocorner_cbox, + selection_box = ocorner_cbox, + oddly_breakable_by_hand = 1, + dig_immediate = 3, + }) + + minetest.register_node("slope:slopelong_"..name, { + description = desc.." long slope", +wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, +inventory_image = "long.png^[colorize:#"..colour..":70", + drawtype = "mesh", + mesh = "slope_test_slope_long.obj", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, + sounds = default.node_sound_defaults(), + on_place = minetest.rotate_node, + collision_box = slope_cbox_long, + selection_box = slope_cbox_long, + oddly_breakable_by_hand = 1, + dig_immediate = 3, + }) + + minetest.register_node("slope:cylinder_"..name, { + description = desc.." cylinder", +wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, +inventory_image = "cylinder.png^[colorize:#"..colour..":70", + drawtype = "mesh", + mesh = "slope_test_cylinder.obj", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, + sounds = default.node_sound_defaults(), + on_place = minetest.rotate_node, + oddly_breakable_by_hand = 1, + dig_immediate = 3, + }) + + minetest.register_node("slope:cone_"..name, { + description = desc.." cone", +wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, +inventory_image = "cone.png^[colorize:#"..colour..":70", + drawtype = "mesh", + mesh = "slope_test_cone_onetexture.obj", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2, cracky=3, oddly_breakable_by_hand=2}, + sounds = default.node_sound_defaults(), + on_place = minetest.rotate_node, + selection_box = tall_pyr_cbox, + collision_box = tall_pyr_cbox, + oddly_breakable_by_hand = 1, + dig_immediate = 3, + }) + + minetest.register_node("slope:sphere_"..name, { + description = desc.." sphere", +wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, +inventory_image = "sphere.png^[colorize:#"..colour..":70", + drawtype = "mesh", + mesh = "slope_test_sphere_onetexture.obj", + tiles = {"color_white.png^[colorize:#"..colour..":70"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2, cracky=3, oddly_breakable_by_hand=2}, + sounds = default.node_sound_defaults(), + oddly_breakable_by_hand = 1, + dig_immediate = 3, + }) + +end diff --git a/mods/Nodes/slope/textures/slope_test_cylinder.png b/mods/Nodes/slope/textures/slope_test_cylinder.png new file mode 100644 index 0000000..8b26cec Binary files /dev/null and b/mods/Nodes/slope/textures/slope_test_cylinder.png differ diff --git a/mods/Nodes/slope/textures/slope_test_icorner.png b/mods/Nodes/slope/textures/slope_test_icorner.png new file mode 100644 index 0000000..71b253e Binary files /dev/null and b/mods/Nodes/slope/textures/slope_test_icorner.png differ diff --git a/mods/Nodes/slope/textures/slope_test_icorner.xcf b/mods/Nodes/slope/textures/slope_test_icorner.xcf new file mode 100644 index 0000000..c4359db Binary files /dev/null and b/mods/Nodes/slope/textures/slope_test_icorner.xcf differ diff --git a/mods/Nodes/slope/textures/slope_test_ocorner.png b/mods/Nodes/slope/textures/slope_test_ocorner.png new file mode 100644 index 0000000..9887ba3 Binary files /dev/null and b/mods/Nodes/slope/textures/slope_test_ocorner.png differ diff --git a/mods/Nodes/slope/textures/slope_test_ocorner.xcf b/mods/Nodes/slope/textures/slope_test_ocorner.xcf new file mode 100644 index 0000000..289702a Binary files /dev/null and b/mods/Nodes/slope/textures/slope_test_ocorner.xcf differ diff --git a/mods/Nodes/slope/textures/slope_test_quarter_round.png b/mods/Nodes/slope/textures/slope_test_quarter_round.png new file mode 100644 index 0000000..6eae739 Binary files /dev/null and b/mods/Nodes/slope/textures/slope_test_quarter_round.png differ diff --git a/mods/Nodes/slope/textures/slope_test_quarter_round_corner.png b/mods/Nodes/slope/textures/slope_test_quarter_round_corner.png new file mode 100644 index 0000000..f366f24 Binary files /dev/null and b/mods/Nodes/slope/textures/slope_test_quarter_round_corner.png differ diff --git a/mods/Nodes/slope/textures/slope_test_slope.png b/mods/Nodes/slope/textures/slope_test_slope.png new file mode 100644 index 0000000..39c5856 Binary files /dev/null and b/mods/Nodes/slope/textures/slope_test_slope.png differ diff --git a/mods/Nodes/slope/textures/slope_test_slope.xcf b/mods/Nodes/slope/textures/slope_test_slope.xcf new file mode 100644 index 0000000..9421ccc Binary files /dev/null and b/mods/Nodes/slope/textures/slope_test_slope.xcf differ diff --git a/mods/Nodes/slope/textures/slope_test_slope_long.png b/mods/Nodes/slope/textures/slope_test_slope_long.png new file mode 100644 index 0000000..3791639 Binary files /dev/null and b/mods/Nodes/slope/textures/slope_test_slope_long.png differ diff --git a/mods/Nodes/slope/textures/slope_test_sphere.png b/mods/Nodes/slope/textures/slope_test_sphere.png new file mode 100644 index 0000000..c6c8136 Binary files /dev/null and b/mods/Nodes/slope/textures/slope_test_sphere.png differ diff --git a/mods/Nodes/stairs/README.txt b/mods/Nodes/stairs/README.txt new file mode 100644 index 0000000..d32cd71 --- /dev/null +++ b/mods/Nodes/stairs/README.txt @@ -0,0 +1,16 @@ +Minetest Game mod: stairs +========================= +See license.txt for license information. + +Authors of source code +---------------------- +Originally by Kahrl (LGPL 2.1) and +celeron55, Perttu Ahola (LGPL 2.1) +Various Minetest developers and contributors (LGPL 2.1) + +Authors of media (models) +------------------------- +Jean-Patrick G. (kilbith) (CC BY-SA 3.0): + stairs_stair.obj + + diff --git a/mods/Nodes/stairs/depends.txt b/mods/Nodes/stairs/depends.txt new file mode 100644 index 0000000..9430a5a --- /dev/null +++ b/mods/Nodes/stairs/depends.txt @@ -0,0 +1 @@ +color \ No newline at end of file diff --git a/mods/Nodes/stairs/init.lua b/mods/Nodes/stairs/init.lua new file mode 100644 index 0000000..8ddaa73 --- /dev/null +++ b/mods/Nodes/stairs/init.lua @@ -0,0 +1,362 @@ +-- Minetest 0.4 mod: stairs +-- See README.txt for licensing and other information. + + +-- Global namespace for functions + +stairs = {} + + +-- Register aliases for new pine node names + +minetest.register_alias("stairs:stair_pinewood", "stairs:stair_pine_wood") +minetest.register_alias("stairs:slab_pinewood", "stairs:slab_pine_wood") + + +-- Get setting for replace ABM + +local replace = minetest.settings:get_bool("enable_stairs_replace_abm") + +local function rotate_and_place(itemstack, placer, pointed_thing) + local p0 = pointed_thing.under + local p1 = pointed_thing.above + local param2 = 0 + + local placer_pos = placer:getpos() + if placer_pos then + param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) + end + + local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) + local fpos = finepos.y % 1 + + if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) + or (fpos < -0.5 and fpos > -0.999999999) then + param2 = param2 + 20 + if param2 == 21 then + param2 = 23 + elseif param2 == 23 then + param2 = 21 + end + end + return minetest.item_place(itemstack, placer, pointed_thing, param2) +end + +-- Register stairs. +-- Node will be called stairs:stair_ + +function stairs.register_stair(subname, recipeitem, groups, images, description, sounds, html) + groups.stair = 1 + minetest.register_node(":stairs:stair_" .. subname, { + description = description, + wield_image = "color_hand" .. subname .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + drawtype = "mesh", + inventory_image = "stairs.png^[colorize:#".. html ..":70", + mesh = "stairs_stair.obj", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = groups, + sounds = sounds, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + }, + }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + return rotate_and_place(itemstack, placer, pointed_thing) + end, + }) + + -- for replace ABM + if replace then + minetest.register_node(":stairs:stair_" .. subname .. "upside_down", { + replace_name = "stairs:stair_" .. subname, + groups = {slabs_replace = 1}, + }) + end + + if recipeitem then + minetest.register_craft({ + output = 'stairs:stair_' .. subname .. ' 8', + recipe = { + {recipeitem, "", ""}, + {recipeitem, recipeitem, ""}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Flipped recipe for the silly minecrafters + minetest.register_craft({ + output = 'stairs:stair_' .. subname .. ' 8', + recipe = { + {"", "", recipeitem}, + {"", recipeitem, recipeitem}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Fuel + local baseburntime = minetest.get_craft_result({ + method = "fuel", + width = 1, + items = {recipeitem} + }).time + if baseburntime > 0 then + minetest.register_craft({ + type = "fuel", + recipe = 'stairs:stair_' .. subname, + burntime = math.floor(baseburntime * 0.75), + }) + end + end +end + + +-- Slab facedir to placement 6d matching table +local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4} + +-- Register slabs. +-- Node will be called stairs:slab_ + +function stairs.register_slab(subname, recipeitem, groups, images, description, sounds, html) + groups.slab = 1 + minetest.register_node(":stairs:slab_" .. subname, { + description = description, + wield_image = "color_hand" .. subname .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "slabs.png^[colorize:#".. html ..":70", + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = groups, + sounds = sounds, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + }, + on_place = function(itemstack, placer, pointed_thing) + local under = minetest.get_node(pointed_thing.under) + local wield_item = itemstack:get_name() + local creative_enabled = (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) + + if under and under.name:find("stairs:slab_") then + -- place slab using under node orientation + local dir = minetest.dir_to_facedir(vector.subtract( + pointed_thing.above, pointed_thing.under), true) + + local p2 = under.param2 + + -- combine two slabs if possible + if slab_trans_dir[math.floor(p2 / 4)] == dir + and wield_item == under.name then + + if not recipeitem then + return itemstack + end + local player_name = placer:get_player_name() + if minetest.is_protected(pointed_thing.under, player_name) and not + minetest.check_player_privs(placer, "protection_bypass") then + minetest.record_protection_violation(pointed_thing.under, + player_name) + return + end + minetest.set_node(pointed_thing.under, {name = recipeitem, param2 = p2}) + if not creative_enabled then + itemstack:take_item() + end + return itemstack + end + + -- Placing a slab on an upside down slab should make it right-side up. + if p2 >= 20 and dir == 8 then + p2 = p2 - 20 + -- same for the opposite case: slab below normal slab + elseif p2 <= 3 and dir == 4 then + p2 = p2 + 20 + end + + -- else attempt to place node with proper param2 + minetest.item_place_node(ItemStack(wield_item), placer, pointed_thing, p2) + if not creative_enabled then + itemstack:take_item() + end + return itemstack + else + return rotate_and_place(itemstack, placer, pointed_thing) + end + end, + }) + + -- for replace ABM + if replace then + minetest.register_node(":stairs:slab_" .. subname .. "upside_down", { + replace_name = "stairs:slab_".. subname, + groups = {slabs_replace = 1}, + }) + end + + if recipeitem then + minetest.register_craft({ + output = 'stairs:slab_' .. subname .. ' 6', + recipe = { + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Fuel + local baseburntime = minetest.get_craft_result({ + method = "fuel", + width = 1, + items = {recipeitem} + }).time + if baseburntime > 0 then + minetest.register_craft({ + type = "fuel", + recipe = 'stairs:slab_' .. subname, + burntime = math.floor(baseburntime * 0.5), + }) + end + end +end + + +-- Optionally replace old "upside_down" nodes with new param2 versions. +-- Disabled by default. + +if replace then + minetest.register_abm({ + label = "Slab replace", + nodenames = {"group:slabs_replace"}, + interval = 16, + chance = 1, + action = function(pos, node) + node.name = minetest.registered_nodes[node.name].replace_name + node.param2 = node.param2 + 20 + if node.param2 == 21 then + node.param2 = 23 + elseif node.param2 == 23 then + node.param2 = 21 + end + minetest.set_node(pos, node) + end, + }) +end + + +-- Stair/slab registration function. +-- Nodes will be called stairs:{stair,slab}_ + +function stairs.register_stair_and_slab(subname, recipeitem, + groups, images, desc_stair, desc_slab, sounds, html) + stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds, html) + stairs.register_slab(subname, recipeitem, groups, images, desc_slab, sounds, html) +end + +-- Register default stairs and slabs + +stairs.register_stair_and_slab( + "blue", + "color:blue", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"color_white.png^[colorize:#"..color2..":70"}, + "Blue Stair", + "Blue Slab", + default.node_sound_wood_defaults(), + color2 +) + +stairs.register_stair_and_slab( + "red", + "color:red", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"color_white.png^[colorize:#"..color6..":70"}, + "Red Stair", + "Red Slab", + default.node_sound_wood_defaults(), + color6 +) + +stairs.register_stair_and_slab( + "white", + "color:white", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"color_white.png^[colorize:#"..color4..":70"}, + "White Stair", + "White Slab", + default.node_sound_wood_defaults(), + color4 +) + +stairs.register_stair_and_slab( + "black", + "color:black", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"color_white.png^[colorize:#"..color1..":70"}, + "Black Stair", + "Black Slab", + default.node_sound_wood_defaults(), + color1 +) + +stairs.register_stair_and_slab( + "green", + "color:green", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"color_white.png^[colorize:#"..color3..":70"}, + "Green Stair", + "Green Slab", + default.node_sound_wood_defaults(), + color3 +) + +stairs.register_stair_and_slab( + "yellow", + "color:yellow", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"color_white.png^[colorize:#"..color7..":70"}, + "Yellow Stair", + "Yellow Slab", + default.node_sound_wood_defaults(), + color7 +) + +stairs.register_stair_and_slab( + "orange", + "color:orange", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"color_white.png^[colorize:#"..color5..":70"}, + "Orange Stair", + "Orange Slab", + default.node_sound_wood_defaults(), + color5 +) + +stairs.register_stair_and_slab( + "pink", + "color:pink", + {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + {"color_white.png^[colorize:#"..color8..":70"}, + "Pink Stair", + "Pink Slab", + default.node_sound_wood_defaults(), + color8 +) diff --git a/mods/Nodes/stairs/license.txt b/mods/Nodes/stairs/license.txt new file mode 100644 index 0000000..8f16bbd --- /dev/null +++ b/mods/Nodes/stairs/license.txt @@ -0,0 +1,51 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011-2016 Kahrl +Copyright (C) 2011-2016 celeron55, Perttu Ahola +Copyright (C) 2012-2016 Various Minetest developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +See the GNU Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (models) +-------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2015-2016 Jean-Patrick G. (kilbith) + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/Nodes/water/depends.txt b/mods/Nodes/water/depends.txt new file mode 100644 index 0000000..22ed7be --- /dev/null +++ b/mods/Nodes/water/depends.txt @@ -0,0 +1,2 @@ +default +color \ No newline at end of file diff --git a/mods/Nodes/water/description.txt b/mods/Nodes/water/description.txt new file mode 100644 index 0000000..b29356e --- /dev/null +++ b/mods/Nodes/water/description.txt @@ -0,0 +1 @@ +Adds coloured water. \ No newline at end of file diff --git a/mods/Nodes/water/init.lua b/mods/Nodes/water/init.lua new file mode 100644 index 0000000..e16d150 --- /dev/null +++ b/mods/Nodes/water/init.lua @@ -0,0 +1,115 @@ + +local source_list = { + {"black", "Darkened", color1, 40, 36, 33}, + {"blue", "Blue", color2, 0, 0, 255}, + {"green", "Green", color3, 0, 255, 0}, + {"white", "White", color4, 245, 245, 245}, + {"orange", "Orange", color5, 255, 97, 3}, + {"red", "Red", color6, 255, 0, 0}, + {"yellow", "Yellow", color7, 255, 255, 0}, + {"pink", "pink", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local name = source_list[i][1] + local description = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + + minetest.register_node("water:"..name.."_water_source", { + description = description.." Water Source", + drawtype = "liquid", + tiles = { + { + name = "color_white.png^[colorize:#"..colour..":70", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + special_tiles = { + { + name = "color_white.png^[colorize:#"..colour..":70", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + backface_culling = false, + }, + }, + alpha = 200, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + wield_image = "color_hand" .. name .. ".png", + wield_scale = {x=1,y=1,z=0.5}, + inventory_image = "waters.png^[colorize:#"..colour..":70", + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "water:"..name.."_water_flowing", + liquid_alternative_source = "water:"..name.."_water_source", + liquid_viscosity = 1, + post_effect_color = {a = 50, r = red, g = green, b = blue}, + groups = {water = 3, liquid = 3, puts_out_fire = 1, cools_lava = 1}, + sounds = default.node_sound_water_defaults(), + }) + + minetest.register_node("water:"..name.."_water_flowing", { + description = description.." Flowing Water", + drawtype = "flowingliquid", + tiles = {"color_white.png^[colorize:#"..colour}, + special_tiles = { + { + name = "color_white.png^[colorize:#"..colour..":70", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + { + name = "color_white.png^[colorize:#"..colour..":70", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + alpha = 200, +inventory_image = "waters.png^[colorize:#"..colour..":70", + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "water:"..name.."_water_flowing", + liquid_alternative_source = "water:"..name.."_water_source", + liquid_viscosity = 1, + post_effect_color = {a = 50, r = red, g = green, b = blue}, + groups = {water = 3, liquid = 3, puts_out_fire = 1, + not_in_creative_inventory = 1, cools_lava = 1}, + sounds = default.node_sound_water_defaults(), + }) + +end diff --git a/mods/Nodes/water/license.txt b/mods/Nodes/water/license.txt new file mode 100644 index 0000000..15e0356 --- /dev/null +++ b/mods/Nodes/water/license.txt @@ -0,0 +1,39 @@ + +Textures: +rs_water.png +Based on default_water.png by Cisoun from minetest_game (CC BY-SA 3.0). + +rs_water_flowing_animated.png and rs_water_source_animated.png +Based on textures by RealBadAngel from minetest_game (CC BY-SA 3.0). + + +Code: +License: MIT (https://opensource.org/licenses/MIT) +By Shara RedCat + + + + +--- + +The MIT License (MIT) + +Copyright (c) 2017 Shara RedCat + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/mods/Nodes/water/mod.conf b/mods/Nodes/water/mod.conf new file mode 100644 index 0000000..cbfe8f9 --- /dev/null +++ b/mods/Nodes/water/mod.conf @@ -0,0 +1 @@ +name = water diff --git a/mods/Other/awards/LICENSE.txt b/mods/Other/awards/LICENSE.txt new file mode 100644 index 0000000..b9bc22e --- /dev/null +++ b/mods/Other/awards/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2013-8 rubenwardy + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/mods/Other/awards/README.md b/mods/Other/awards/README.md new file mode 100644 index 0000000..e570f0e --- /dev/null +++ b/mods/Other/awards/README.md @@ -0,0 +1,295 @@ +# Awards + +Adds awards/achievements to Minetest (plus a very good API). + +by [rubenwardy](https://rubenwardy.com), licensed under MIT. +With thanks to Wuzzy, kaeza, and MrIbby. + +Majority of awards are back ported from Calinou's old fork in Carbone, under same license. + + +# Introduction + +## Awards and Triggers + +An award is a single unlockable unit, registered like so: + +```lua +awards.register_award("mymod:award", { + description = "My Example Award", +}) +``` + +Awards are unlocked either using `awards.unlock()` or by a trigger being +fullfilled. A trigger is a condition which unlocks an award. Triggers are +registered at the same time as an award is registered: + +```lua +awards.register_award("mymod:award", { + description = "My Example Award", + trigger = { + type = "dig", + node = "default:stone", + target = 10, + }, +}) +``` + +The above trigger type is an example of a counted_key trigger: +rather than a single counter there's a counter per key - in this +case the key is the value of the `node` field. If you leave out +the key in a `counted_key` trigger, then the total will be used +instead. For example, here is an award which unlocks after you've +placed 10 nodes of any type: + +```lua +awards.register_award("mymod:award", { + description = "Place 10 nodes!", + trigger = { + type = "place", + target = 10, + }, +}) +``` + +You can also register an *Unlock Function*, which can return the name of an +award to unlock it: + +```lua +awards.register_award("mymod:award", { + title = "Lava Miner", + description = "Mine any block while being very close to lava.", +}) + +awards.register_on_dig(function(player, data) + local pos = player:get_pos() + if pos and (minetest.find_node_near(pos, 1, "default:lava_source") or + minetest.find_node_near(pos, 1, "default:lava_flowing")) then + return "mymod:award" + end + return nil +end) +``` + +The above is a bad example as you don't actually need the stats data given. +It would be better to register a `dignode` callback and call `awards.unlock()` +if the condition is met. + +## Trigger Types + +The trigger type is used to determine which event will cause the trigger will be +fulfilled. The awards mod comes with a number of predefined types, documented +in [Builtin Trigger Types](#builtin-trigger-types). + +Trigger types are registered like so: + +```lua +awards.register_trigger("chat", { + type = "counted", + progress = "@1/@2 chat messages", + auto_description = { "Send a chat message", "Chat @1 times" }, +}) + +minetest.register_on_chat_message(function(name, message) + local player = minetest.get_player_by_name(name) + if not player or string.find(message, "/") then + return + end + awards.notify_chat(player) +end) +``` + +A trigger type has a type as well, which determines how the data is stored and +also how the trigger is fulfilled. + +**Trigger Type Types:** + +* **custom** requires you handle the calling of awards.unlock() yourself. You also + need to implement on_register() yourself. You'll also probably want to implement + `on_register()` to catch awards registered with your trigger type. +* **counted** stores a single counter for each player which is incremented by calling + `trigger:notify(player)`. Good for homogenous actions like number of chat messages, + joins, and the like. +* **counted_key** stores a table of counters each indexed by a key. There is also + a total field (`__total`) which stores the sum of all counters. A counter is + incremented by calling `trigger:notify(player, key)`. This is good for things like + placing nodes or crafting items, where the key will be the item or node name. + If `key` is an item, then you should also add `key_is_item = true` to the + trigger type definition. + +As said, you could use a custom trigger if none of the other ones match your needs. +Here's an example. + +```lua +awards.register_trigger("foo", { + type = "custom", + progress = "@1/@2 foos", + auto_description = { "Do a foo", "Foo @1 times" }, +}) + +minetest.register_on_foo(function() + for _, trigger in pairs(awards.on.foo) do + -- trigger is either a trigger tables or + -- or an unlock function. + + -- some complex logic + if condition then + awards.unlock(trigger) + end + end +end) + +``` + +## Award Difficulty + +Difficulty is used to determine how awards are sorted in awards lists. + +If the award trigger is counted, ie: the trigger requires a `target` property, +then the difficulty multipler is timesd by `target` to get the overall difficulty. +If the award isn't a counted type then the difficulty multiplier is used as the +overal difficulty. Award difficulty affects how awards are sorted in a list - +more difficult awards are further down the list. + +In real terms, `difficulty` is a relative difficulty to do one unit of the trigger +if its counted, otherwise it's the relative difficulty of completely doing the +award (if not-counted). For the `dig` trigger type, 1 unit would be 1 node dug. + + +Actual code used to calculate award difficulty: + +```lua +local difficulty = def.difficulty or 1 +if def.trigger and def.trigger.target then + difficulty = difficulty * def.trigger.target +end +``` + + +# API + +* awards.register_award(name, def), the def table has the following fields: + * `title` - title of the award (defaults to name) + * `description` - longer description of the award, displayed in Awards tab + * `difficulty` - see [Award Difficulty](#award-difficulty). + * `requires` - list of awards that need to be unlocked before this one + is visible. + * `prizes` - list of items to give when you earn the award + * `secret` - boolean if this award is secret (i.e. showed on awards list) + * `sound` - `SimpleSoundSpec` table to play on unlock. + `false` to disable unlock sound. + * `icon` - the icon image, use default otherwise. + * `background` - the background image, use default otherwise. + * `trigger` - trigger definition, see [Builtin Trigger Types](#builtin-trigger-types). + * `on_unlock(name, def)` - callback on unlock. +* awards.register_trigger(name, def), the def table has the following fields: + * `type` - see [Trigger Types](#trigger-types). + * `progress` - used to format progress, defaults to "%1/%2". + * `auto_description` - a table of two elements. Each element is a format string. Element 1 is singular, element 2 is plural. Used for the award description (not title) if none is given. + * `on_register(award_def)` - called when an award registers with this type. + * "counted_key" only: + * `auto_description_total` - Used if the trigger is for the total. + * `get_key(self, def)` - get key for particular award, return nil for a total. + * `key_is_item` - true if the key is an item name. On notify(), + any watched groups will also be notified as `group:groupname` keys. +* awards.register_on_unlock(func(name, def)) + * name is the player name + * def is the award def. + * return true to cancel HUD +* awards.unlock(name, award) + * gives an award to a player + * name is the player name + +## Builtin Trigger Types + +Callbacks (register a function to be run) + +* dig type: Dig a node. + * node: the dug node type. If nil, all dug nodes are counted +* place type: Place a node. + * node: the placed node type. If nil, all placed nodes are counted +* craft type: Craft something. + * item: the crafted item type. If nil, all crafted items are counted +* death type: Die. + * reason: the death reason, one of the types in PlayerHPChangeReason (see lua_api.txt) + or nil for total deaths. +* chat type: Write a chat message. +* join type: Join the server. +* eat type: Eat an item. + * item: the eaten item type. If nil, all eaten items are counted + +(for all types) target - how many times to dig/place/craft/etc. + +Each type has a register function like so: + +* awards.register_on_TRIGGERTYPE(func(player, data)) + * data is the player stats data + * return award name or null + +### dig + +```lua +trigger = { + type = "dig", + node = "default:dirt", -- item, alias, or group + target = 50, +} +``` + +### place + +```lua +trigger = { + type = "place", + node = "default:dirt", -- item, alias, or group + target = 50, +} +``` + +### craft + +```lua +trigger = { + type = "craft", + item = "default:dirt", -- item, alias, or group + target = 50, +} +``` + +### death + +```lua +trigger = { + type = "death", + reason = "fall", + target = 5, +} +``` + +### chat + +```lua +trigger = { + type = "chat", + target = 100, +} +``` + +### join + +```lua +trigger = { + type = "join", + target = 100, +} +``` + +### eat + +```lua +trigger = { + type = "eat", + item = "default:apple", + target = 100, +} +``` diff --git a/mods/Other/awards/depends.txt b/mods/Other/awards/depends.txt new file mode 100644 index 0000000..c8f3f2d --- /dev/null +++ b/mods/Other/awards/depends.txt @@ -0,0 +1,14 @@ +intllib? +sfinv? +unified_inventory? +default? +stairs? +farming? +dye? +beds? +wool? +vessels? +moreblocks? +fire? +flowers? +nyancat? diff --git a/mods/Other/awards/init.lua b/mods/Other/awards/init.lua new file mode 100644 index 0000000..98f054a --- /dev/null +++ b/mods/Other/awards/init.lua @@ -0,0 +1,36 @@ +-- Copyright (c) 2013-18 rubenwardy. MIT. + +-- The global award namespace +awards = { + show_mode = "hud", + registered_triggers = {}, +} + +-- Internationalization support. +awards.gettext, awards.ngettext = dofile(minetest.get_modpath("awards").."/src/intllib.lua") + +-- Load files +dofile(minetest.get_modpath("awards").."/src/data.lua") +dofile(minetest.get_modpath("awards").."/src/api_awards.lua") +dofile(minetest.get_modpath("awards").."/src/api_triggers.lua") +dofile(minetest.get_modpath("awards").."/src/chat_commands.lua") +dofile(minetest.get_modpath("awards").."/src/gui.lua") +dofile(minetest.get_modpath("awards").."/src/triggers.lua") +dofile(minetest.get_modpath("awards").."/src/awards.lua") + +awards.load() +minetest.register_on_shutdown(awards.save) + + +-- Backwards compatibility +awards.give_achievement = awards.unlock +awards.getFormspec = awards.get_formspec +awards.showto = awards.show_to +awards.register_onDig = awards.register_on_dig +awards.register_onPlace = awards.register_on_place +awards.register_onDeath = awards.register_on_death +awards.register_onChat = awards.register_on_chat +awards.register_onJoin = awards.register_on_join +awards.register_onCraft = awards.register_on_craft +awards.def = awards.registered_awards +awards.register_achievement = awards.register_award diff --git a/mods/Other/awards/locale/de.po b/mods/Other/awards/locale/de.po new file mode 100644 index 0000000..38dbf2d --- /dev/null +++ b/mods/Other/awards/locale/de.po @@ -0,0 +1,824 @@ +# German translations for PACKAGE package. +# Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Wuzzy2, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-21 05:35-0300\n" +"PO-Revision-Date: 2017-02-21 04:19-0300\n" +"Last-Translator: Wuzzy2\n" +"Language-Team: German\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: api.lua +msgid "Secret Achievement Unlocked:" +msgstr "Geheime Auszeichnung erhalten:" + +#: api.lua +msgid "Achievement Unlocked:" +msgstr "Auszeichnung erhalten:" + +#: api.lua +#, lua-format +msgid "Secret Achievement Unlocked: %s" +msgstr "Geheime Auszeichnung erhalten: %s" + +#: api.lua +#, lua-format +msgid "Achievement Unlocked: %s" +msgstr "Auszeichnung erhalten: %s" + +#: api.lua +msgid "Secret Achievement Unlocked!" +msgstr "Geheime Auszeichnung erhalten!" + +#: api.lua +msgid "Achievement Unlocked!" +msgstr "Auszeichnung erhalten:" + +#: api.lua +msgid "Error: No awards available." +msgstr "Fehler: Keine Auszeichnungen vorhanden." + +#: api.lua +msgid "OK" +msgstr "OK" + +#: api.lua +msgid "(Secret Award)" +msgstr "(Geheime Auszeichnung)" + +#: api.lua +msgid "Unlock this award to find out what it is." +msgstr "Verdienen Sie sich diese Auszeichnung, um herauszufinden, was sie ist." + +#: api.lua +#, lua-format +msgid "%s (got)" +msgstr "%s (erhalten)" + +#: api.lua +msgid "You've disabled awards. Type /awards enable to reenable." +msgstr "" +"Sie haben die Auszeichnungen deaktiviert. Geben Sie »/awards enable« ein, um " +"sie wieder zu aktivieren." + +#: api.lua +msgid "You have not unlocked any awards." +msgstr "Sie haben noch keine Auszeichnungen." + +#: api.lua +#, lua-format +msgid "%s’s awards:" +msgstr "%ss Auszeichnungen:" + +#: api.lua chat_commands.lua +#, lua-format +msgid "%s: %s" +msgstr "%s: %s" + +#: sfinv.lua unified_inventory.lua +msgid "Awards" +msgstr "Auszeichnungen" + +#: triggers.lua +msgid "@1/@2 dug" +msgstr "@1/@2 abgebaut" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Mine: @2" +msgid_plural "Mine: @1×@2" +msgstr[0] "Bauen Sie einen Block ab: @2" +msgstr[1] "Bauen Sie Blöcke ab: @1×@2" + +#: triggers.lua +msgid "Mine @1 block." +msgid_plural "Mine @1 blocks." +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "@1/@2 placed" +msgstr "@1/@2 platziert" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Place: @2" +msgid_plural "Place: @1×@2" +msgstr[0] "Platzieren Sie einen Block: @2" +msgstr[1] "Platzieren Sie Blöcke: @1×@2" + +#: triggers.lua +msgid "Place a block." +msgid_plural "Place @1 blocks." +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "@1/@2 eaten" +msgstr "@1/@2 gegessen" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Eat: @2" +msgid_plural "Eat: @1×@2" +msgstr[0] "Essen Sie: @2" +msgstr[1] "Essen Sie: @1×@2" + +#: triggers.lua +msgid "Eat an item." +msgid_plural "Eat @1 items." +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "@1/@2 deaths" +msgstr "@1/@2 Tode" + +#: triggers.lua +msgid "Die." +msgid_plural "Die @1 times." +msgstr[0] "Sterben Sie." +msgstr[1] "Sterben Sie @1 mal." + +#: triggers.lua +msgid "@1/@2 chat messages" +msgstr "" + +#: triggers.lua +msgid "Write something in chat." +msgid_plural "Write @1 chat messages." +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "@1/@2 game joins" +msgstr "@1/@2 Spielen beigetreten" + +#: triggers.lua +msgid "Join the game." +msgid_plural "Join the game @1 times." +msgstr[0] "Treten Sie dem Spiel bei." +msgstr[1] "Treten Sie dem Spiel @1 mal bei." + +#: triggers.lua +msgid "@1/@2 crafted" +msgstr "@1/@2 gefertigt" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Craft: @2" +msgid_plural "Craft: @1×@2" +msgstr[0] "Fertigen Sie an: @2" +msgstr[1] "Fertigen Sie an: @1×@2" + +#: triggers.lua +msgid "Craft an item." +msgid_plural "Craft @1 items." +msgstr[0] "" +msgstr[1] "" + +#: init.lua +msgid "Saint-Maclou" +msgstr "Saint-Maclou" + +#: init.lua +msgid "Place 20 coal checkers." +msgstr "Platzieren Sie 20 Kohlenschachbrettmuster." + +#: init.lua +msgid "Castorama" +msgstr "Gießmeister" + +#: init.lua +msgid "Place 20 iron checkers." +msgstr "Platzieren Sie 20 Eisenschachbrettmuster." + +#: init.lua +msgid "Sam the Trapper" +msgstr "Sam der Fallensteller" + +#: init.lua +msgid "Place 2 trap stones." +msgstr "Platzieren Sie 2 Fallensteine." + +#: init.lua +msgid "Backpacker" +msgstr "Rucksacktourist" + +#: init.lua +msgid "Craft 4 large bags." +msgstr "Fertigen Sie 4 große Taschen." + +#: init.lua +msgid "Pyromaniac" +msgstr "Pyromane" + +#: init.lua +msgid "Craft 8 times flint and steel." +msgstr "Fertigen Sie 8 mal einen Feuerstein und Stahl an." + +#: init.lua +msgid "Firefighter" +msgstr "Feuerwehr" + +#: init.lua +msgid "Put out 1000 fires." +msgstr "Löschen Sie 1000 Flammen." + +#: init.lua +msgid "Light It Up" +msgstr "Licht an!" + +#: init.lua +msgid "Place 100 torches." +msgstr "Platzieren Sie 100 Fackeln." + +#: init.lua +msgid "Well Lit" +msgstr "Gut ausgeleuchtet" + +#: init.lua +msgid "Place 1,000 torches." +msgstr "Platzieren Sie 1000 Fackeln." + +#: init.lua +msgid "Really Well Lit" +msgstr "Sehr gute Beleuchtung" + +#: init.lua +msgid "Craft 10 mese lamps." +msgstr "Fertigen Sie 10 Meselampen." + +#: init.lua +msgid "Outpost" +msgstr "Außenposten" + +#: init.lua +msgid "Craft 200 stone bricks." +msgstr "Fertigen Sie 200 Steinziegel." + +#: init.lua +msgid "Watchtower" +msgstr "Wachturm" + +#: init.lua +msgid "Craft 800 stone bricks." +msgstr "Fertigen Sie 800 Steinziegel an." + +#: init.lua +msgid "Fortress" +msgstr "Burg" + +#: init.lua +msgid "Craft 3,200 stone bricks." +msgstr "Fertigen Sie 3200 Steinziegel." + +#: init.lua +msgid "Desert Dweller" +msgstr "Wüstenbewohner" + +#: init.lua +msgid "Craft 400 desert stone bricks." +msgstr "Fertigen Sie 400 Wüstensteinziegel." + +#: init.lua +msgid "Pharaoh" +msgstr "Pharao" + +#: init.lua +msgid "Craft 100 sandstone bricks." +msgstr "Fertigen Sie 100 Sandsteinziegel." + +#: init.lua +msgid "Little Library" +msgstr "Kleine Bücherei" + +#: init.lua +msgid "Craft 7 bookshelves." +msgstr "Fertigen Sie 7 Bücherregale." + +#: init.lua +msgid "Lava and Water" +msgstr "Lava und Wasser" + +#: init.lua +msgid "Mine your first obsidian." +msgstr "Bauen Sie Ihr erstes Obsidian ab." + +#: init.lua +msgid "Obsessed with Obsidian" +msgstr "Von Obsidian besessen" + +#: init.lua +msgid "Mine 50 obsidian." +msgstr "Bauen Sie 50 Obsidian ab." + +#: init.lua +msgid "Lava Miner" +msgstr "Lavagräber" + +#: init.lua +msgid "Mine any block while being very close to lava." +msgstr "" +"Bauen Sie einen beliebigen Block ab, während Sie sehr nahe an der Lava " +"stehen." + +#: init.lua +msgid "On The Way" +msgstr "Auf dem Weg" + +#: init.lua +msgid "Place 100 rails." +msgstr "Platzieren Sie 100 Gleise." + +#: init.lua +msgid "First Day in the Woods" +msgstr "Erster Tag im Wald" + +#: init.lua +msgid "Dig 6 tree blocks." +msgstr "Bauen Sie 6 Baumblöcke ab." + +#: init.lua +msgid "Lumberjack" +msgstr "Holzfäller" + +#: init.lua +msgid "Dig 36 tree blocks." +msgstr "Bauen Sie 36 Baumblöcke ab." + +#: init.lua +msgid "Semi-pro Lumberjack" +msgstr "Fortgeschrittener Holzfäller" + +#: init.lua +msgid "Dig 216 tree blocks." +msgstr "Bauen Sie 216 Baumblöcke ab." + +#: init.lua +msgid "Professional Lumberjack" +msgstr "Profiholzfäller" + +#: init.lua +msgid "Dig 1,296 tree blocks." +msgstr "Bauen Sie 1296 Baumblöcke ab." + +#: init.lua +msgid "Junglebaby" +msgstr "Dschungelbaby" + +#: init.lua +msgid "Dig 100 jungle tree blocks." +msgstr "Bauen Sie 100 Dschungelbaumblöcke ab." + +#: init.lua +msgid "Jungleman" +msgstr "Dschungelmann" + +#: init.lua +msgid "Dig 1,000 jungle tree blocks." +msgstr "Bauen Sie 1000 Dschungelbaumblöcke ab." + +#: init.lua +msgid "First Mese Find" +msgstr "Erster Mesefund" + +#: init.lua +msgid "Mine your first mese ore." +msgstr "Bauen Sie Ihr erstes Meseerz ab." + +#: init.lua +msgid "Mese Mastery" +msgstr "Mesemeister" + +#: init.lua +msgid "Mine a mese block." +msgstr "Bauen Sie einen Meseblock ab." + +#: init.lua +msgid "You’re a copper" +msgstr "Du Kupfer!" + +#: init.lua +msgid "Dig 1,000 copper ores." +msgstr "Bauen Sie 1000 Kupfererze ab." + +#: init.lua +msgid "A Cat in a Pop-Tart?!" +msgstr "Eine Katze im Pop-Tart?!" + +#: init.lua +msgid "Mine a nyan cat." +msgstr "Bauen Sie eine Nyan Cat ab." + +#: init.lua +msgid "Mini Miner" +msgstr "Berganfänger" + +#: init.lua +msgid "Dig 100 stone blocks." +msgstr "Bauen Sie 100 Steinblöcke ab." + +#: init.lua +msgid "Hardened Miner" +msgstr "Abhehärteter Bergarbeiter" + +#: init.lua +msgid "Dig 1,000 stone blocks." +msgstr "Bauen Sie 1000 Steine ab." + +#: init.lua +msgid "Master Miner" +msgstr "Profibergarbeiter" + +#: init.lua +msgid "Dig 10,000 stone blocks." +msgstr "Bauen Sie 10000 Steine ab." + +#: init.lua +msgid "Marchand De Sable" +msgstr "" + +#: init.lua +msgid "Dig 1,000 sand." +msgstr "Bauen Sie 1000 Sand ab." + +#: init.lua +msgid "Crafter of Sticks" +msgstr "Stockmacher" + +#: init.lua +msgid "Craft 100 sticks." +msgstr "Fertigen Sie 100 Stöcke." + +#: init.lua +msgid "Jungle Discoverer" +msgstr "Dschungelerkunder" + +#: init.lua +msgid "Mine your first jungle grass." +msgstr "Bauen Sie Ihr erstes Dschungelgras ab." + +#: init.lua +msgid "Grasslands Discoverer" +msgstr "Prärieerkunder" + +#: init.lua +msgid "Mine some grass." +msgstr "Bauen Sie etwas Gras ab." + +#: init.lua +msgid "Savannah Discoverer" +msgstr "Savannenerkunder" + +#: init.lua +msgid "Mine some dry grass." +msgstr "Bauen Sie etwas trockenes Gras ab." + +#: init.lua +msgid "Desert Discoverer" +msgstr "Wüstenerkunder" + +#: init.lua +msgid "Mine your first cactus." +msgstr "Bauen Sie Ihren ersten Kaktus ab." + +#: init.lua +msgid "Far Lands" +msgstr "Ferne Lande" + +#: init.lua +msgid "Mine your first dry shrub." +msgstr "Bauen Sie Ihren ersten vertrockneten Strauch ab." + +#: init.lua +msgid "Glacier Discoverer" +msgstr "Gletschererkunder" + +#: init.lua +msgid "Mine your first ice." +msgstr "Bauen Sie Ihr erstes Eis ab." + +#: init.lua +msgid "Very Simple Snow Man" +msgstr "Sehr simpler Schneemann" + +#: init.lua +msgid "Place two snow blocks." +msgstr "Platzieren Sie zwei Schneeblöcke." + +#: init.lua +msgid "First Gold Find" +msgstr "Erster Goldfund" + +#: init.lua +msgid "Mine your first gold ore." +msgstr "Bauen Sie Ihr erstes Golderz ab." + +#: init.lua +msgid "Gold Rush" +msgstr "Goldrausch" + +#: init.lua +msgid "Mine 45 gold ores." +msgstr "Bauen Sie 18 Diamanterze ab." + +#: init.lua +msgid "Wow, I am Diamonds!" +msgstr "Wow, ich bin Diamanten!" + +#: init.lua +msgid "Mine your first diamond ore." +msgstr "Bauen Sie Ihr erstes Diamanterz ab." + +#: init.lua +msgid "Girl's Best Friend" +msgstr "Bester Freund der Mädchen" + +#: init.lua +msgid "Mine 18 diamond ores." +msgstr "Bauen Sie 18 Diamanterze ab." + +#: init.lua +msgid "Hardest Block on Earth" +msgstr "Härtester Block der Welt" + +#: init.lua +msgid "Craft a diamond block." +msgstr "Fertigen Sie einen Diamantblock an." + +#: init.lua +msgid "In the Dungeon" +msgstr "Im Verlies" + +#: init.lua +msgid "Mine a mossy cobblestone." +msgstr "Bauen Sie ein bemoostes Kopfsteinpflaster ab." + +#: init.lua +msgid "Smelter" +msgstr "Schmelzer" + +#: init.lua +msgid "Craft 10 furnaces." +msgstr "Fertigen Sie 10 Öfen." + +#: init.lua +msgid "Treasurer" +msgstr "Schatzmeister" + +#: init.lua +msgid "Craft 15 chests." +msgstr "Fertigen Sie 15 Truhen." + +#: init.lua +msgid "Bankier" +msgstr "Bankier" + +#: init.lua +msgid "Craft 30 locked chests." +msgstr "Fertigen Sie 30 abgeschlossene Truhen." + +#: init.lua +msgid "Bricker" +msgstr "Ziegler" + +#: init.lua +msgid "Craft 200 brick blocks." +msgstr "Fertigen Sie 200 Ziegelblöcke." + +#: init.lua +msgid "House of Obsidian" +msgstr "Haus aus Obsidian" + +#: init.lua +msgid "Craft 100 obsidian bricks." +msgstr "Fertigen Sie 100 Obsidianziegel." + +#: init.lua +msgid "Build a Cave" +msgstr "Höhlenbauer" + +#: init.lua +msgid "Place 100 stone." +msgstr "Platzieren Sie 100 Steine." + +#: init.lua +msgid "Long Ladder" +msgstr "Lange Leiter" + +#: init.lua +msgid "Place 400 wooden ladders." +msgstr "Platzieren Sie 400 Holzleitern." + +#: init.lua +msgid "Industrial Age" +msgstr "Industriezeitalter" + +#: init.lua +msgid "Place 40 steel ladders." +msgstr "Platzieren Sie 40 Stahlleitern." + +#: init.lua +msgid "Yummy!" +msgstr "Lecker!" + +#: init.lua +msgid "Eat 80 apples." +msgstr "Essen Sie 80 Äpfel." + +#: init.lua +msgid "Glasser" +msgstr "Glasmacher" + +#: init.lua +msgid "Craft 14 vessels shelves." +msgstr "Fertigen Sie 14 Gefäßregale." + +#: init.lua +msgid "Farming Skills Acquired" +msgstr "Landwirtschaft erlernt" + +#: init.lua +msgid "Harvest a fully grown wheat plant." +msgstr "Ernten Sie eine voll ausgewachsene Getreidepflanze." + +#: init.lua +msgid "Field Worker" +msgstr "Feldarbeiter" + +#: init.lua +msgid "Harvest 25 fully grown wheat plants." +msgstr "Ernten Sie 25 voll ausgewachsene Getreidepflanzen." + +#: init.lua +msgid "Aspiring Farmer" +msgstr "Aufstrebender Bauer" + +#: init.lua +msgid "Harvest 125 fully grown wheat plants." +msgstr "Ernten Sie 125 voll ausgewachsene Getreidepflanzen." + +#: init.lua +msgid "Wheat Magnate" +msgstr "Getreidemagnat" + +#: init.lua +msgid "Harvest 625 fully grown wheat plants." +msgstr "Ernten Sie 625 voll ausgewachsene Getreidepflanzen." + +#: init.lua +msgid "Baker" +msgstr "Bäcker" + +#: init.lua +msgid "Eat 10 loaves of bread." +msgstr "Essen Sie 10 Brote." + +#: init.lua +msgid "Wool Over Your Eyes" +msgstr "Wollige Augen" + +#: init.lua +msgid "Craft 250 white wool." +msgstr "Fertigen Sie 250 weiße Wolle." + +#: init.lua +msgid "Hotelier" +msgstr "Hotelier" + +#: init.lua +msgid "Craft 15 fancy beds." +msgstr "Fertigen Sie 15 schicke Betten." + +#: init.lua +msgid "Filthy Rich" +msgstr "Stinkreich" + +#: init.lua +msgid "Craft 24 gold block stairs." +msgstr "Fertigen Sie 24 Goldblockstufen." + +#: init.lua +msgid "Roses Are Red" +msgstr "Rosen sind rot" + +#: init.lua +msgid "Craft 400 red dyes." +msgstr "Fertigen Sie 400 rote Farbstoffe." + +#: init.lua +msgid "Dandelions are Yellow" +msgstr "Löwenzahn ist gelb" + +#: init.lua +msgid "Craft 400 yellow dyes." +msgstr "Fertigen Sie 400 gelbe Farbstoffe." + +#: init.lua +msgid "Geraniums are Blue" +msgstr "Geranien sind blau" + +#: init.lua +msgid "Craft 400 blue dyes." +msgstr "Fertigen Sie 400 blaue Farbstoffe." + +#: init.lua +msgid "White Color Stock" +msgstr "Weißer Farbstoffvorrat" + +#: init.lua +msgid "Craft 100 white dyes." +msgstr "Fertigen Sie 100 weiße Farbstoffe." + +#: init.lua +msgid "Tasty Mushrooms" +msgstr "Leckere Pilze" + +#: init.lua +msgid "Eat 3 brown mushrooms." +msgstr "Essen Sie 3 braune Pilze." + +#: init.lua +msgid "Mushroom Lover" +msgstr "Pilzfreund" + +#: init.lua +msgid "Eat 33 brown mushrooms." +msgstr "Essen Sie 33 braune Pilze." + +#: init.lua +msgid "Underground Mushroom Farmer" +msgstr "Unterirdischer Pilzbauer" + +#: init.lua +msgid "Eat 333 brown mushrooms." +msgstr "Essen Sie 333 braune Pilze." + +#: init.lua +msgid "Builder" +msgstr "Bauarbeiter" + +#: init.lua +msgid "Constructor" +msgstr "Konstrukteur" + +#: init.lua +msgid "Architect" +msgstr "Architekt" + +#: init.lua +msgid "Master Architect" +msgstr "Meisterarchitekt" + +#: chat_commands.lua +msgid "[c|clear|disable|enable]" +msgstr "[c|clear|disable|enable]" + +#: chat_commands.lua +msgid "Show, clear, disable or enable your achievements" +msgstr "Zeigen, löschen, deaktivieren oder aktivieren Sie Ihre Auszeichnungen" + +#: chat_commands.lua +msgid "" +"All your awards and statistics have been cleared. You can now start again." +msgstr "" +"All Ihre Auszeichnugen und Statistiken wurden zurückgesetzt. Sie können nun " +"von vorne anfangen." + +#: chat_commands.lua +msgid "You have disabled your achievements." +msgstr "Sie haben Ihre Auszeichnungen deaktiviert." + +#: chat_commands.lua +msgid "You have enabled your achievements." +msgstr "Sie haben Ihre Auszeichnungen aktiviert." + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Show details of an achievement" +msgstr "Details einer Auszeichnung anzeigen" + +#: chat_commands.lua +msgid "Achievement not found." +msgstr "Auszeichnung nicht gefunden." + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Get the achievements statistics for the given player or yourself" +msgstr "Die Statistik der Auszeichnungen eines Spielers zeigen" diff --git a/mods/Other/awards/locale/es.po b/mods/Other/awards/locale/es.po new file mode 100644 index 0000000..a2d5958 --- /dev/null +++ b/mods/Other/awards/locale/es.po @@ -0,0 +1,825 @@ +# Spanish translations for PACKAGE package +# Traducciones al español para el paquete PACKAGE. +# Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Diego Martínez , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-21 05:35-0300\n" +"PO-Revision-Date: 2017-02-20 22:17-0300\n" +"Last-Translator: Diego Martínez \n" +"Language-Team: Spanish\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: api.lua +msgid "Secret Achievement Unlocked:" +msgstr "Logro secreto desbloqueado:" + +#: api.lua +msgid "Achievement Unlocked:" +msgstr "Logro desbloqueado:" + +#: api.lua +#, lua-format +msgid "Secret Achievement Unlocked: %s" +msgstr "Logro secreto desbloqueado: %s" + +#: api.lua +#, lua-format +msgid "Achievement Unlocked: %s" +msgstr "Logro desbloqueado: %s" + +#: api.lua +msgid "Secret Achievement Unlocked!" +msgstr "Logro secreto desbloqueado!" + +#: api.lua +msgid "Achievement Unlocked!" +msgstr "Logro desbloqueado!" + +#: api.lua +msgid "Error: No awards available." +msgstr "Error: No hay logros disponibles." + +#: api.lua +msgid "OK" +msgstr "Aceptar" + +#: api.lua +msgid "(Secret Award)" +msgstr "(Logro secreto)" + +#: api.lua +msgid "Unlock this award to find out what it is." +msgstr "Desbloquea éste logro para saber qué es." + +#: api.lua +#, lua-format +msgid "%s (got)" +msgstr "%s (obtenido)" + +#: api.lua +msgid "You've disabled awards. Type /awards enable to reenable." +msgstr "" +"Has deshabilitado los logros. Escribe \"/awards enable\" para reactivar." + +#: api.lua +msgid "You have not unlocked any awards." +msgstr "No has desbloqueado ningún logro." + +#: api.lua +#, lua-format +msgid "%s’s awards:" +msgstr "Logros de %s:" + +#: api.lua chat_commands.lua +#, lua-format +msgid "%s: %s" +msgstr "%s: %s" + +#: sfinv.lua unified_inventory.lua +msgid "Awards" +msgstr "Logros" + +#: triggers.lua +msgid "@1/@2 dug" +msgstr "@1/@2 excavados" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Mine: @2" +msgid_plural "Mine: @1×@2" +msgstr[0] "Excavar: @2" +msgstr[1] "Excavar: @1×@2" + +#: triggers.lua +msgid "Mine @1 block." +msgid_plural "Mine @1 blocks." +msgstr[0] "Excavar un bloque." +msgstr[1] "Excavar @1 bloques." + +#: triggers.lua +msgid "@1/@2 placed" +msgstr "@1/@2 colocados" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Place: @2" +msgid_plural "Place: @1×@2" +msgstr[0] "Colocar: @2" +msgstr[1] "Colocar: @1×@2" + +#: triggers.lua +msgid "Place a block." +msgid_plural "Place @1 blocks." +msgstr[0] "Colocar un bloque." +msgstr[1] "Colocar @1 bloques." + +#: triggers.lua +msgid "@1/@2 eaten" +msgstr "@1/@2 comidos" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Eat: @2" +msgid_plural "Eat: @1×@2" +msgstr[0] "Comer: @2" +msgstr[1] "Comer: @1×@2" + +#: triggers.lua +msgid "Eat an item." +msgid_plural "Eat @1 items." +msgstr[0] "Comer un objeto." +msgstr[1] "Comer @1 objetos." + +#: triggers.lua +msgid "@1/@2 deaths" +msgstr "@1/@2 muertes" + +#: triggers.lua +msgid "Die." +msgid_plural "Die @1 times." +msgstr[0] "Morir." +msgstr[1] "Morir @1 veces." + +#: triggers.lua +msgid "@1/@2 chat messages" +msgstr "@1/@2 conversaciones" + +#: triggers.lua +msgid "Write something in chat." +msgid_plural "Write @1 chat messages." +msgstr[0] "Escribir algo." +msgstr[1] "Escribir @1 mensajes." + +#: triggers.lua +msgid "@1/@2 game joins" +msgstr "@1/@2 veces unido" + +#: triggers.lua +msgid "Join the game." +msgid_plural "Join the game @1 times." +msgstr[0] "Unirse al juego." +msgstr[1] "Unirse al juego @1 veces." + +#: triggers.lua +msgid "@1/@2 crafted" +msgstr "@1/@2 elaborado" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Craft: @2" +msgid_plural "Craft: @1×@2" +msgstr[0] "Elaborar: @2" +msgstr[1] "Elaborar: %1×@2" + +#: triggers.lua +msgid "Craft an item." +msgid_plural "Craft @1 items." +msgstr[0] "Elaborar un objeto." +msgstr[1] "Elaborar @1 objetos." + +#: init.lua +msgid "Saint-Maclou" +msgstr "Saint-Maclou" + +#: init.lua +msgid "Place 20 coal checkers." +msgstr "Colocar 20 baldosas de ajedrez de carbón." + +#: init.lua +msgid "Castorama" +msgstr "Castorama" + +#: init.lua +msgid "Place 20 iron checkers." +msgstr "Colocar 20 baldosas de ajedrez de hierro." + +#: init.lua +msgid "Sam the Trapper" +msgstr "Sam el Atrapador" + +#: init.lua +msgid "Place 2 trap stones." +msgstr "Colocar 2 piedras trampa." + +#: init.lua +msgid "Backpacker" +msgstr "Mochilero" + +#: init.lua +msgid "Craft 4 large bags." +msgstr "Elaborar 4 bolsas grandes." + +#: init.lua +msgid "Pyromaniac" +msgstr "Piromaníaco" + +#: init.lua +msgid "Craft 8 times flint and steel." +msgstr "Elaborar pedernal y hierro 8 veces." + +#: init.lua +msgid "Firefighter" +msgstr "Bombero" + +#: init.lua +msgid "Put out 1000 fires." +msgstr "Apagar 1000 incendios." + +#: init.lua +msgid "Light It Up" +msgstr "Ilumínalo" + +#: init.lua +msgid "Place 100 torches." +msgstr "Colocar 100 antorchas." + +#: init.lua +msgid "Well Lit" +msgstr "Bien Iluminado" + +#: init.lua +msgid "Place 1,000 torches." +msgstr "Colocar 1.000 antorchas." + +#: init.lua +msgid "Really Well Lit" +msgstr "Realmente Bien Iluminado" + +#: init.lua +msgid "Craft 10 mese lamps." +msgstr "Elaborar 10 lámparas de MESE." + +#: init.lua +msgid "Outpost" +msgstr "Puesto de avanzada" + +#: init.lua +msgid "Craft 200 stone bricks." +msgstr "Elaborar 200 ladrillos de piedra." + +#: init.lua +msgid "Watchtower" +msgstr "Torre del vigía" + +#: init.lua +msgid "Craft 800 stone bricks." +msgstr "Elaborar 800 ladrillos de piedra." + +#: init.lua +msgid "Fortress" +msgstr "Fortaleza" + +#: init.lua +msgid "Craft 3,200 stone bricks." +msgstr "Elaborar 3.200 ladrillos de piedra." + +#: init.lua +msgid "Desert Dweller" +msgstr "Morador Desértico" + +#: init.lua +msgid "Craft 400 desert stone bricks." +msgstr "Elaborar 400 ladrillos de piedra desértica." + +#: init.lua +msgid "Pharaoh" +msgstr "Faraón" + +#: init.lua +msgid "Craft 100 sandstone bricks." +msgstr "Elaborar 200 ladrillos de arenisca." + +#: init.lua +msgid "Little Library" +msgstr "Pequeña Biblioteca" + +#: init.lua +msgid "Craft 7 bookshelves." +msgstr "Elaborar 7 libreros." + +#: init.lua +msgid "Lava and Water" +msgstr "Lava y Agua" + +#: init.lua +msgid "Mine your first obsidian." +msgstr "Excavar tu primera obsidiana." + +#: init.lua +msgid "Obsessed with Obsidian" +msgstr "Obsesionado con la Obsidiana" + +#: init.lua +msgid "Mine 50 obsidian." +msgstr "Excavar 50 obsidianas." + +#: init.lua +msgid "Lava Miner" +msgstr "Minero de Lava" + +#: init.lua +msgid "Mine any block while being very close to lava." +msgstr "Excavar un bloque cerca de lava." + +#: init.lua +msgid "On The Way" +msgstr "En Camino" + +#: init.lua +msgid "Place 100 rails." +msgstr "Colocar 100 rieles." + +#: init.lua +msgid "First Day in the Woods" +msgstr "Primer Día en el Bosque" + +#: init.lua +msgid "Dig 6 tree blocks." +msgstr "Cortar 6 árboles." + +#: init.lua +msgid "Lumberjack" +msgstr "Leñador" + +#: init.lua +msgid "Dig 36 tree blocks." +msgstr "Cortar 36 árboles." + +#: init.lua +msgid "Semi-pro Lumberjack" +msgstr "Leñador semi-profesional" + +#: init.lua +msgid "Dig 216 tree blocks." +msgstr "Cortar 216 árboles." + +#: init.lua +msgid "Professional Lumberjack" +msgstr "Leñador profesional" + +#: init.lua +msgid "Dig 1,296 tree blocks." +msgstr "Cortar 1.296 árboles." + +#: init.lua +msgid "Junglebaby" +msgstr "Bebé de la Selva" + +#: init.lua +msgid "Dig 100 jungle tree blocks." +msgstr "Cortar 100 árboles selváticos." + +#: init.lua +msgid "Jungleman" +msgstr "Hombre de la Selva" + +#: init.lua +msgid "Dig 1,000 jungle tree blocks." +msgstr "Cortar 1.000 árboles selváticos." + +#: init.lua +msgid "First Mese Find" +msgstr "Primer Encuentro de MESE" + +#: init.lua +msgid "Mine your first mese ore." +msgstr "Excava tu primer mineral de MESE." + +#: init.lua +msgid "Mese Mastery" +msgstr "Maestría de MESE" + +#: init.lua +msgid "Mine a mese block." +msgstr "Excava tu primer bloque de MESE." + +#: init.lua +msgid "You’re a copper" +msgstr "Eres un cobre" + +#: init.lua +msgid "Dig 1,000 copper ores." +msgstr "Excavar 1.000 minerales de cobre" + +#: init.lua +msgid "A Cat in a Pop-Tart?!" +msgstr "¡¿Un Gato en un Pop-Tart?!" + +#: init.lua +msgid "Mine a nyan cat." +msgstr "Excavar un Gato Nyan." + +#: init.lua +msgid "Mini Miner" +msgstr "Mini Minero" + +#: init.lua +msgid "Dig 100 stone blocks." +msgstr "Excavar 100 bloques de piedra." + +#: init.lua +msgid "Hardened Miner" +msgstr "Minero Curtido" + +#: init.lua +msgid "Dig 1,000 stone blocks." +msgstr "Excavar 1.000 bloques de piedra." + +#: init.lua +msgid "Master Miner" +msgstr "Minero Maestro" + +#: init.lua +msgid "Dig 10,000 stone blocks." +msgstr "Excavar 10.000 bloques de piedra." + +#: init.lua +msgid "Marchand De Sable" +msgstr "Marchand De Sable" + +#: init.lua +msgid "Dig 1,000 sand." +msgstr "Cavar 1.000 bloques de arena." + +#: init.lua +msgid "Crafter of Sticks" +msgstr "Elaborador de Varitas" + +#: init.lua +msgid "Craft 100 sticks." +msgstr "Elaborar 100 varitas." + +#: init.lua +msgid "Jungle Discoverer" +msgstr "Descubridor de Selva" + +#: init.lua +msgid "Mine your first jungle grass." +msgstr "Cortar tu primer pasto de selva." + +#: init.lua +msgid "Grasslands Discoverer" +msgstr "Descubridor de Praderas" + +#: init.lua +msgid "Mine some grass." +msgstr "Cortar un poco de pasto." + +#: init.lua +msgid "Savannah Discoverer" +msgstr "Descubridor de Savana" + +#: init.lua +msgid "Mine some dry grass." +msgstr "Cortar un poco de pasto seco." + +#: init.lua +msgid "Desert Discoverer" +msgstr "Descubridor del Desierto" + +#: init.lua +msgid "Mine your first cactus." +msgstr "Cortar tu primer cácto." + +#: init.lua +msgid "Far Lands" +msgstr "Tierras Lejanas" + +#: init.lua +msgid "Mine your first dry shrub." +msgstr "Cortar tu primer arbusto seco" + +#: init.lua +msgid "Glacier Discoverer" +msgstr "Descubridor del Glaciar" + +#: init.lua +msgid "Mine your first ice." +msgstr "Romper tu primer bloque de hielo." + +#: init.lua +msgid "Very Simple Snow Man" +msgstr "Muñeco de Nieve Muy Simple" + +#: init.lua +msgid "Place two snow blocks." +msgstr "Colocar dos bloques de nieve." + +#: init.lua +msgid "First Gold Find" +msgstr "Primer Encuentro de Oro" + +#: init.lua +msgid "Mine your first gold ore." +msgstr "Excavar tu primer pepita de oro." + +#: init.lua +msgid "Gold Rush" +msgstr "Fiebre del Oro" + +#: init.lua +msgid "Mine 45 gold ores." +msgstr "Excavar 45 pepitas de oro." + +#: init.lua +msgid "Wow, I am Diamonds!" +msgstr "¡Guau, Soy Diamantes!" + +#: init.lua +msgid "Mine your first diamond ore." +msgstr "Excava tu primer diamante." + +#: init.lua +msgid "Girl's Best Friend" +msgstr "El Mejor Amigo de Las Mujeres" + +#: init.lua +msgid "Mine 18 diamond ores." +msgstr "Excava 10 diamantes." + +#: init.lua +msgid "Hardest Block on Earth" +msgstr "El Bloque Más Duro Sobre La Tierra" + +#: init.lua +msgid "Craft a diamond block." +msgstr "Elaborar un bloque de diamante." + +#: init.lua +msgid "In the Dungeon" +msgstr "En Las Mazmorras" + +#: init.lua +msgid "Mine a mossy cobblestone." +msgstr "Excavar unos adoquines musgosos." + +#: init.lua +msgid "Smelter" +msgstr "Fundidor" + +#: init.lua +msgid "Craft 10 furnaces." +msgstr "Elaborar 10 hornos." + +#: init.lua +msgid "Treasurer" +msgstr "Tesorero" + +#: init.lua +msgid "Craft 15 chests." +msgstr "Elaborar 15 cofres." + +#: init.lua +msgid "Bankier" +msgstr "Banquero" + +#: init.lua +msgid "Craft 30 locked chests." +msgstr "Elaborar 30 bloques cerrados." + +#: init.lua +msgid "Bricker" +msgstr "Ladrillero" + +#: init.lua +msgid "Craft 200 brick blocks." +msgstr "Elaborar 200 bloques de ladrillo." + +#: init.lua +msgid "House of Obsidian" +msgstr "Casa de Obsidiana" + +#: init.lua +msgid "Craft 100 obsidian bricks." +msgstr "Elaborar 100 ladrillos de obsidiana." + +#: init.lua +msgid "Build a Cave" +msgstr "Construye Una Cueva" + +#: init.lua +msgid "Place 100 stone." +msgstr "Coloca 100 piedras." + +#: init.lua +msgid "Long Ladder" +msgstr "Escalerilla Larga" + +#: init.lua +msgid "Place 400 wooden ladders." +msgstr "Coloca 400 escalerillas de madera." + +#: init.lua +msgid "Industrial Age" +msgstr "Era Industrial" + +#: init.lua +msgid "Place 40 steel ladders." +msgstr "Coloca 40 escalerillas de acero." + +#: init.lua +msgid "Yummy!" +msgstr "¡Qué Rico!" + +#: init.lua +msgid "Eat 80 apples." +msgstr "Come 80 manzanas." + +# Intentionally marked as fuzzy. +#: init.lua +#, fuzzy +msgid "Glasser" +msgstr "Vidriero" + +#: init.lua +msgid "Craft 14 vessels shelves." +msgstr "Elabora 14 estanterías para botellas." + +#: init.lua +msgid "Farming Skills Acquired" +msgstr "Habilidades de Granja Adquiridas" + +#: init.lua +msgid "Harvest a fully grown wheat plant." +msgstr "Cosecha una plantas de trigo madura." + +#: init.lua +msgid "Field Worker" +msgstr "Trabajador de Campo" + +#: init.lua +msgid "Harvest 25 fully grown wheat plants." +msgstr "Cosecha 25 plantas de trigo maduras." + +#: init.lua +msgid "Aspiring Farmer" +msgstr "Aspirante a Granjero" + +#: init.lua +msgid "Harvest 125 fully grown wheat plants." +msgstr "Cosecha 125 plantas de trigo maduras." + +#: init.lua +msgid "Wheat Magnate" +msgstr "Magnate del Maíz" + +#: init.lua +msgid "Harvest 625 fully grown wheat plants." +msgstr "Cosecha 625 plantas de trigo maduras." + +#: init.lua +msgid "Baker" +msgstr "Panadero" + +#: init.lua +msgid "Eat 10 loaves of bread." +msgstr "Come 10 rebanadas de pan." + +#: init.lua +msgid "Wool Over Your Eyes" +msgstr "Lana Sobre Tus Ojos" + +#: init.lua +msgid "Craft 250 white wool." +msgstr "Elabora 250 bloques de lana blanca." + +#: init.lua +msgid "Hotelier" +msgstr "Hotelero" + +#: init.lua +msgid "Craft 15 fancy beds." +msgstr "Elabora 15 camas de lujo." + +#: init.lua +msgid "Filthy Rich" +msgstr "Sucio Rico" + +#: init.lua +msgid "Craft 24 gold block stairs." +msgstr "Elabora 24 escaleras de bloque de oro." + +#: init.lua +msgid "Roses Are Red" +msgstr "Las Rosas Son Rojas" + +#: init.lua +msgid "Craft 400 red dyes." +msgstr "Elabora 400 colorantes rojos." + +#: init.lua +msgid "Dandelions are Yellow" +msgstr "Los Dientes de León Son Amarillos" + +#: init.lua +msgid "Craft 400 yellow dyes." +msgstr "Elabora 400 colorantes amarillos." + +#: init.lua +msgid "Geraniums are Blue" +msgstr "Los Geranios Son Azules" + +#: init.lua +msgid "Craft 400 blue dyes." +msgstr "Elabora 400 colorantes azules." + +#: init.lua +msgid "White Color Stock" +msgstr "Reserva de Color Blanco" + +#: init.lua +msgid "Craft 100 white dyes." +msgstr "Elabora 100 colorantes blancos." + +#: init.lua +msgid "Tasty Mushrooms" +msgstr "Ricos Hongos" + +#: init.lua +msgid "Eat 3 brown mushrooms." +msgstr "Come 3 hongos marrones." + +#: init.lua +msgid "Mushroom Lover" +msgstr "Amante de los Hongos" + +#: init.lua +msgid "Eat 33 brown mushrooms." +msgstr "Come 33 hongos marrones." + +#: init.lua +msgid "Underground Mushroom Farmer" +msgstr "Granjero de Hongos Subterráneo" + +#: init.lua +msgid "Eat 333 brown mushrooms." +msgstr "Come 333 hongos marrones." + +# Nota: "Builder" y "Constructor" se traducen a "Constructor", +# así que lo traduje de ésta manera para diferenciar. +#: init.lua +msgid "Builder" +msgstr "Hacedor" + +#: init.lua +msgid "Constructor" +msgstr "Constructor" + +#: init.lua +msgid "Architect" +msgstr "Arquitecto" + +#: init.lua +msgid "Master Architect" +msgstr "Maestro Arquitecto" + +#: chat_commands.lua +msgid "[c|clear|disable|enable]" +msgstr "[c|clear|disable|enable]" + +#: chat_commands.lua +msgid "Show, clear, disable or enable your achievements" +msgstr "Mostrar, limpiar, deshabilitar o habilitar tus logros" + +#: chat_commands.lua +msgid "" +"All your awards and statistics have been cleared. You can now start again." +msgstr "" +"Todos tus logros y estadísticas han sido borrados. Puedes iniciar nuevamente." + +#: chat_commands.lua +msgid "You have disabled your achievements." +msgstr "Has deshabilitado tus logros." + +#: chat_commands.lua +msgid "You have enabled your achievements." +msgstr "Has habilitado tus logros." + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Show details of an achievement" +msgstr "Muestra los detalles de un logro" + +#: chat_commands.lua +msgid "Achievement not found." +msgstr "Logro no encontrado." + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Get the achievements statistics for the given player or yourself" +msgstr "Obtener las estadísticas y logros del jugador dado" diff --git a/mods/Other/awards/locale/fr.po b/mods/Other/awards/locale/fr.po new file mode 100644 index 0000000..e173437 --- /dev/null +++ b/mods/Other/awards/locale/fr.po @@ -0,0 +1,818 @@ +# French translations for PACKAGE package. +# Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# xisd, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-21 05:50-0300\n" +"PO-Revision-Date: 2017-02-21 05:50-0300\n" +"Last-Translator: xisd\n" +"Language-Team: French\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: api.lua +msgid "Secret Achievement Unlocked:" +msgstr "Réussite Secrète Débloquée :" + +#: api.lua +msgid "Achievement Unlocked:" +msgstr "Réussite Débloquée :" + +#: api.lua +#, lua-format +msgid "Secret Achievement Unlocked: %s" +msgstr "Réussite Secrète Débloquée : %s" + +#: api.lua +#, lua-format +msgid "Achievement Unlocked: %s" +msgstr "Réussite Débloquée : %s" + +#: api.lua +msgid "Secret Achievement Unlocked!" +msgstr "Réussite Secrète Débloquée !" + +#: api.lua +msgid "Achievement Unlocked!" +msgstr "Réussite Débloquée !" + +#: api.lua +msgid "Error: No awards available." +msgstr "Erreur : Aucun trophée disponible" + +#: api.lua +msgid "OK" +msgstr "OK" + +#: api.lua +msgid "(Secret Award)" +msgstr "(Trophée Secret)" + +#: api.lua +msgid "Unlock this award to find out what it is." +msgstr "Débloque ce trophée pour découvrir ce que c'est." + +#: api.lua +#, lua-format +msgid "%s (got)" +msgstr "%s (obtenu)" + +#: api.lua +msgid "You've disabled awards. Type /awards enable to reenable." +msgstr "Vous avez désactivé les trophées. Tapez '/awards enable' pour les réactiver." + +#: api.lua +msgid "You have not unlocked any awards." +msgstr "Vous n'avez encore débloqué aucun trophée." + +#: api.lua +#, lua-format +msgid "%s’s awards:" +msgstr "Les trophées de %s :" + +#: api.lua chat_commands.lua +#, lua-format +msgid "%s: %s" +msgstr "%s : %s" + +#: sfinv.lua unified_inventory.lua +msgid "Awards" +msgstr "Trophées" + +#: triggers.lua +msgid "@1/@2 dug" +msgstr "@1/@2 creusés" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Mine: @2" +msgid_plural "Mine: @1×@2" +msgstr[0] "Mine : @2" +msgstr[1] "Mine : @1×@2" + +#: triggers.lua +msgid "Mine @1 block." +msgid_plural "Mine @1 blocks." +msgstr[0] "Creuse @1 bloc." +msgstr[1] "Creuse @1 blocs." + +#: triggers.lua +msgid "@1/@2 placed" +msgstr "@1/@2 placés" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Place: @2" +msgid_plural "Place: @1×@2" +msgstr[0] "Place : @2" +msgstr[1] "Place : @1×@2" + +#: triggers.lua +msgid "Place a block." +msgid_plural "Place @1 blocks." +msgstr[0] "Place un bloc." +msgstr[1] "Place @1 blocs." + +#: triggers.lua +msgid "@1/@2 eaten" +msgstr "@1/@2 Mangés" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Eat: @2" +msgid_plural "Eat: @1×@2" +msgstr[0] "Mange : @2" +msgstr[1] "Mange : @1×@2" + +#: triggers.lua +msgid "Eat an item." +msgid_plural "Eat @1 items." +msgstr[0] "Mange quelque chose." +msgstr[1] "Mange @1 aliments." + +#: triggers.lua +msgid "@1/@2 deaths" +msgstr "@1/@2 morts" + +#: triggers.lua +msgid "Die." +msgid_plural "Die @1 times." +msgstr[0] "Mort·e." +msgstr[1] "Mort·e %d fois." + +#: triggers.lua +msgid "@1/@2 chat messages" +msgstr "@1/@2 messages du chat" + +#: triggers.lua +msgid "Write something in chat." +msgid_plural "Write @1 chat messages." +msgstr[0] "Écrit quelque chose dans le chat." +msgstr[1] "Écrit @1 messages dans le chat." + +#: triggers.lua +msgid "@1/@2 game joins" +msgstr "@1/@2 connexions" + +#: triggers.lua +msgid "Join the game." +msgid_plural "Join the game @1 times." +msgstr[0] "Connecte toi au jeu." +msgstr[1] "Connecte toi au jeu @1 fois." + +#: triggers.lua +msgid "@1/@2 crafted" +msgstr "@1/@2 craftés" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Craft: @2" +msgid_plural "Craft: @1×@2" +msgstr[0] "Fabrique : @2" +msgstr[1] "Fabrique : @1×@2" + +#: triggers.lua +msgid "Craft an item." +msgid_plural "Craft @1 items." +msgstr[0] "Confectionne un objet." +msgstr[1] "Confectionne @1 objets." + +#: init.lua +msgid "Saint-Maclou" +msgstr "Saint-Maclou" + +#: init.lua +msgid "Place 20 coal checkers." +msgstr "Place 20 damiers de charbon." + +#: init.lua +msgid "Castorama" +msgstr "Castorama" + +#: init.lua +msgid "Place 20 iron checkers." +msgstr "Place 20 damiers de fer." + +#: init.lua +msgid "Sam the Trapper" +msgstr "Sam le Trappeur" + +#: init.lua +msgid "Place 2 trap stones." +msgstr "Place 2 pièges de pierre." + +#: init.lua +msgid "Backpacker" +msgstr "Randonneu·r·se" + +#: init.lua +msgid "Craft 4 large bags." +msgstr "Confectionne 4 grands sacs" + +#: init.lua +msgid "Pyromaniac" +msgstr "Pyromane" + +#: init.lua +msgid "Craft 8 times flint and steel." +msgstr "Fabrique 8 silex et aciers." + +#: init.lua +msgid "Firefighter" +msgstr "Pompier" + +#: init.lua +msgid "Put out 1000 fires." +msgstr "Éteint 1000 feux." + +#: init.lua +msgid "Light It Up" +msgstr "Eclairé·e" + +#: init.lua +msgid "Place 100 torches." +msgstr "Place 100 torches." + +#: init.lua +msgid "Well Lit" +msgstr "Bien Éclairé" + +#: init.lua +msgid "Place 1,000 torches." +msgstr "Place 1000 torches." + +#: init.lua +msgid "Really Well Lit" +msgstr "Vraiment Bien Éclairé" + +#: init.lua +msgid "Craft 10 mese lamps." +msgstr "Fabrique 10 lampes de mese." + +#: init.lua +msgid "Outpost" +msgstr "Poste Avancé" + +#: init.lua +msgid "Craft 200 stone bricks." +msgstr "Confectionne 200 briques de pierre." + +#: init.lua +msgid "Watchtower" +msgstr "Tour de Garde" + +#: init.lua +msgid "Craft 800 stone bricks." +msgstr "Confectionne 800 briques de pierre." + +#: init.lua +msgid "Fortress" +msgstr "Forteresse" + +#: init.lua +msgid "Craft 3,200 stone bricks." +msgstr "Confectionne 3200 briques de pierre." + +#: init.lua +msgid "Desert Dweller" +msgstr "Habitant·e du Désert" + +#: init.lua +msgid "Craft 400 desert stone bricks." +msgstr "Confectionne 400 briques de pierre du désert." + +#: init.lua +msgid "Pharaoh" +msgstr "Pharaon" + +#: init.lua +msgid "Craft 100 sandstone bricks." +msgstr "Confectionne 100 briques de roche de sable." + +#: init.lua +msgid "Little Library" +msgstr "Petite Bibliothèque" + +#: init.lua +msgid "Craft 7 bookshelves." +msgstr "Fabrique 7 bibliothèques." + +#: init.lua +msgid "Lava and Water" +msgstr "La Lave et l'Eau" + +#: init.lua +msgid "Mine your first obsidian." +msgstr "Mine ton premier bloc d'obsidienne." + +#: init.lua +msgid "Obsessed with Obsidian" +msgstr "Obsédé·e par l'obsidienne" + +#: init.lua +msgid "Mine 50 obsidian." +msgstr "Mine 50 pierres d'obsidienne." + +#: init.lua +msgid "Lava Miner" +msgstr "Mineu·r·se de lave" + +#: init.lua +msgid "Mine any block while being very close to lava." +msgstr "Mine n'importe quel bloc à proximité de la lave." + +#: init.lua +msgid "On The Way" +msgstr "Sur La Voie" + +#: init.lua +msgid "Place 100 rails." +msgstr "Place 100 rails." + +#: init.lua +msgid "First Day in the Woods" +msgstr "Premier Jour dans les Bois" + +#: init.lua +msgid "Dig 6 tree blocks." +msgstr "Creuse 6 blocs d'arbre." + +#: init.lua +msgid "Lumberjack" +msgstr "Bûcheron·ne" + +#: init.lua +msgid "Dig 36 tree blocks." +msgstr "Creuse 36 blocs d'arbre." + +#: init.lua +msgid "Semi-pro Lumberjack" +msgstr "Bûcheron.ne. Semi-Professionnel.le." + +#: init.lua +msgid "Dig 216 tree blocks." +msgstr "Creuse 216 blocs d'arbre." + +#: init.lua +msgid "Professional Lumberjack" +msgstr "Bûcheron·ne Professionnel·le" + +#: init.lua +msgid "Dig 1,296 tree blocks." +msgstr "Creuse 1296 blocs d'arbre." + +#: init.lua +msgid "Junglebaby" +msgstr "Enfant de la Jungle" + +#: init.lua +msgid "Dig 100 jungle tree blocks." +msgstr "Creuse 100 blocs d'arbres de jungle." + +#: init.lua +msgid "Jungleman" +msgstr "Personne de la Jungle" + +#: init.lua +msgid "Dig 1,000 jungle tree blocks." +msgstr "Creuse 1000 blocs d'arbre de jungle." + +#: init.lua +msgid "First Mese Find" +msgstr "Première Pépite : Mese" + +#: init.lua +msgid "Mine your first mese ore." +msgstr "Mine ton premier minerai de mese." + +#: init.lua +msgid "Mese Mastery" +msgstr "Maîtrise de Mese" + +#: init.lua +msgid "Mine a mese block." +msgstr "Mine un bloc de mese." + +#: init.lua +msgid "You’re a copper" +msgstr "Faîtes Jouer les Cuivres" + +#: init.lua +msgid "Dig 1,000 copper ores." +msgstr "Creuse 1000 minerais de cuivre." + +#: init.lua +msgid "A Cat in a Pop-Tart?!" +msgstr "Un Chat dans un Pop-Tart ?!" + +#: init.lua +msgid "Mine a nyan cat." +msgstr "Mine un nyan cat." + +#: init.lua +msgid "Mini Miner" +msgstr "Mini Mineu·r·se" + +#: init.lua +msgid "Dig 100 stone blocks." +msgstr "Creuse 100 blocs de pierre." + +#: init.lua +msgid "Hardened Miner" +msgstr "Mineu·r·se Endurci·e" + +#: init.lua +msgid "Dig 1,000 stone blocks." +msgstr "Creuse 1000 blocs de pierre." + +#: init.lua +msgid "Master Miner" +msgstr "Maître·sse Mineu·r·se" + +#: init.lua +msgid "Dig 10,000 stone blocks." +msgstr "Creuse 10000 blocs de pierre." + +#: init.lua +msgid "Marchand De Sable" +msgstr "Marchand·e De Sable" + +#: init.lua +msgid "Dig 1,000 sand." +msgstr "Creuse 1000 blocs de sable." + +#: init.lua +msgid "Crafter of Sticks" +msgstr "Fabriquant·e de Bâtons." + +#: init.lua +msgid "Craft 100 sticks." +msgstr "Confectionne 100 bâtons." + +#: init.lua +msgid "Jungle Discoverer" +msgstr "Explorat·eur·rice de la Jungle" + +#: init.lua +msgid "Mine your first jungle grass." +msgstr "Ramasse ta première herbe de jungle." + +#: init.lua +msgid "Grasslands Discoverer" +msgstr "Découvreu·r·se de prairies" + +#: init.lua +msgid "Mine some grass." +msgstr "Ramasse de l'herbe." + +#: init.lua +msgid "Savannah Discoverer" +msgstr "Explorat·eur·rice de la Savanne" + +#: init.lua +msgid "Mine some dry grass." +msgstr "Ramasse de l'herbe sèche." + +#: init.lua +msgid "Desert Discoverer" +msgstr "Expolrat·eur·rice du Désert." + +#: init.lua +msgid "Mine your first cactus." +msgstr "Mine ton premier catus." + +#: init.lua +msgid "Far Lands" +msgstr "Terres Lointaines" + +#: init.lua +msgid "Mine your first dry shrub." +msgstr "Coupe ton premier arbuste sec." + +#: init.lua +msgid "Glacier Discoverer" +msgstr "Découvreu·r·se de glacier" + +#: init.lua +msgid "Mine your first ice." +msgstr "Creuse ton premier bloc de glace." + +#: init.lua +msgid "Very Simple Snow Man" +msgstr "Bonhomme de Neige Rudimentaire" + +#: init.lua +msgid "Place two snow blocks." +msgstr "Place deux blocs de neige." + +#: init.lua +msgid "First Gold Find" +msgstr "Première Pépite : Or" + +#: init.lua +msgid "Mine your first gold ore." +msgstr "Mine ton premier minerai d'or." + +#: init.lua +msgid "Gold Rush" +msgstr "Ruée vers l'Or" + +#: init.lua +msgid "Mine 45 gold ores." +msgstr "Mine 45 minerais d'or." + +#: init.lua +msgid "Wow, I am Diamonds!" +msgstr "Wow, Je suis Diamants!" + +#: init.lua +msgid "Mine your first diamond ore." +msgstr "Mine ton premier diamant." + +#: init.lua +#, fuzzy +msgid "Girl's Best Friend" +msgstr "Girl's Best Friend" + +#: init.lua +msgid "Mine 18 diamond ores." +msgstr "Mine 18 diamants." + +#: init.lua +msgid "Hardest Block on Earth" +msgstr "Le Bloc le Plus Dur du Monde" + +#: init.lua +msgid "Craft a diamond block." +msgstr "Confectionne un bloc de diamant." + +#: init.lua +msgid "In the Dungeon" +msgstr "Dans le Donjon" + +#: init.lua +msgid "Mine a mossy cobblestone." +msgstr "Mine un bloc de pavés moussus." + +#: init.lua +msgid "Smelter" +msgstr "Fondeu·r·se" + +#: init.lua +msgid "Craft 10 furnaces." +msgstr "Construis 10 fours." + +#: init.lua +msgid "Treasurer" +msgstr "Trésori·er·ère" + +#: init.lua +msgid "Craft 15 chests." +msgstr "Fabrique 15 coffres." + +#: init.lua +msgid "Bankier" +msgstr "Banqui·er·ère" + +#: init.lua +msgid "Craft 30 locked chests." +msgstr "Fabrique 30 coffres Verrouillés." + +#: init.lua +msgid "Bricker" +msgstr "Briqueu·r·se" + +#: init.lua +msgid "Craft 200 brick blocks." +msgstr "Confectionne 200 blocs de brique." + +#: init.lua +msgid "House of Obsidian" +msgstr "La Maison de L'Obsidienne" + +#: init.lua +msgid "Craft 100 obsidian bricks." +msgstr "Confectionne 100 briques d'obsidienne." + +#: init.lua +msgid "Build a Cave" +msgstr "Construis une grotte" + +#: init.lua +msgid "Place 100 stone." +msgstr "Place 100 pierres." + +#: init.lua +msgid "Long Ladder" +msgstr "Longue Echelle" + +#: init.lua +msgid "Place 400 wooden ladders." +msgstr "Place 400 échelles en bois." + +#: init.lua +msgid "Industrial Age" +msgstr "Âge Industriel" + +#: init.lua +msgid "Place 40 steel ladders." +msgstr "Place 40 échelles métalliques." + +#: init.lua +msgid "Yummy!" +msgstr "Miam !" + +#: init.lua +msgid "Eat 80 apples." +msgstr "Mange 80 pommes." + +#: init.lua +msgid "Glasser" +msgstr "Verri·er·ère" + +#: init.lua +msgid "Craft 14 vessels shelves." +msgstr "Fabrique 14 vaisseliers." + +#: init.lua +msgid "Farming Skills Acquired" +msgstr "Compétences Paysannes Acquises" + +#: init.lua +msgid "Harvest a fully grown wheat plant." +msgstr "Récolte un plant de blé à maturité." + +#: init.lua +msgid "Field Worker" +msgstr "Travailleu·r·se Agricole" + +#: init.lua +msgid "Harvest 25 fully grown wheat plants." +msgstr "Récolte 25 plants de blé à maturité." + +#: init.lua +msgid "Aspiring Farmer" +msgstr "Apprenti·e Fermi·er·ère" + +#: init.lua +msgid "Harvest 125 fully grown wheat plants." +msgstr "Récolte 125 plants de blé à maturité." + +#: init.lua +msgid "Wheat Magnate" +msgstr "Magnat·e du Blé" + +#: init.lua +msgid "Harvest 625 fully grown wheat plants." +msgstr "Récolte 625 plants de blé à maturité." + +#: init.lua +msgid "Baker" +msgstr "Boulang·er·ère" + +#: init.lua +msgid "Eat 10 loaves of bread." +msgstr "Mange 10 miches de pain." + +#: init.lua +msgid "Wool Over Your Eyes" +msgstr "De la Laines dans Tes Yeux" + +#: init.lua +msgid "Craft 250 white wool." +msgstr "Confectionne 250 blocs de laine blanche." + +#: init.lua +msgid "Hotelier" +msgstr "Hoteli·er·ère" + +#: init.lua +msgid "Craft 15 fancy beds." +msgstr "Construis 15 lits chics." + +#: init.lua +msgid "Filthy Rich" +msgstr "Richissime" + +#: init.lua +msgid "Craft 24 gold block stairs." +msgstr "Construis 24 escaliers en or." + +#: init.lua +msgid "Roses Are Red" +msgstr "Les Roses Sont Rouges" + +#: init.lua +msgid "Craft 400 red dyes." +msgstr "Prépare 400 teintures rouges." + +#: init.lua +msgid "Dandelions are Yellow" +msgstr "Les Pissenlits sont Jaunes." + +#: init.lua +msgid "Craft 400 yellow dyes." +msgstr "Prépare 400 teintures jaunes." + +#: init.lua +msgid "Geraniums are Blue" +msgstr "Les Geraniums Sont Bleus" + +#: init.lua +msgid "Craft 400 blue dyes." +msgstr "Prépare 400 teintures bleues." + +#: init.lua +msgid "White Color Stock" +msgstr "Chaussettes Blanches" + +#: init.lua +msgid "Craft 100 white dyes." +msgstr "Prépare 100 teintures blanches." + +#: init.lua +msgid "Tasty Mushrooms" +msgstr "Délicieux Champignons" + +#: init.lua +msgid "Eat 3 brown mushrooms." +msgstr "Mange 3 champignons marrons." + +#: init.lua +msgid "Mushroom Lover" +msgstr "Adorat·eur·rice de Champignons" + +#: init.lua +msgid "Eat 33 brown mushrooms." +msgstr "Mange 33 champignons marrons." + +#: init.lua +msgid "Underground Mushroom Farmer" +msgstr "Culture de Champignons en Cave" + +#: init.lua +msgid "Eat 333 brown mushrooms." +msgstr "Mange 333 champignons marrons." + +#: init.lua +msgid "Builder" +msgstr "Bâtisseu·r·se" + +#: init.lua +msgid "Constructor" +msgstr "Construct·eur·rice" + +#: init.lua +msgid "Architect" +msgstr "Architecte" + +#: init.lua +msgid "Master Architect" +msgstr "Maître·sse Architecte" + +#: chat_commands.lua +msgid "[c|clear|disable|enable]" +msgstr "[c|clear|disable|enable]" + +#: chat_commands.lua +msgid "Show, clear, disable or enable your achievements" +msgstr "Affiche, réinitialise, désactive ou active vos réussites." + +#: chat_commands.lua +msgid "All your awards and statistics have been cleared. You can now start again." +msgstr "Tous vos trophées et statistiques ont été réinitialisés. Vous pouvez recommencer à nouveau." + +#: chat_commands.lua +msgid "You have disabled your achievements." +msgstr "Vous avez désactivé vos réussites." + +#: chat_commands.lua +msgid "You have enabled your achievements." +msgstr "Vous avez activé vos réussites." + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Show details of an achievement" +msgstr "Afficher les détails d'une réussite" + +#: chat_commands.lua +msgid "Achievement not found." +msgstr "Réussite non trouvée." + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Get the achievements statistics for the given player or yourself" +msgstr "Obtenez les statistiques des réussites d'un joueur donné ou de vous-même" diff --git a/mods/Other/awards/locale/pt.po b/mods/Other/awards/locale/pt.po new file mode 100644 index 0000000..e28b909 --- /dev/null +++ b/mods/Other/awards/locale/pt.po @@ -0,0 +1,819 @@ +# Portuguese translations for Awards package. +# Copyright (C) 2018 +# This file is distributed under the same license as the Awards package. +# FIRST AUTHOR borgesdossantosbruno@gmail.com, 2018. +# BrunoMine, 2018 +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-21 05:50-0300\n" +"PO-Revision-Date: 2018-08-01 16:16-0300\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.0.6\n" +"Last-Translator: BrunoMine\n" +"Language: pt\n" + +#: api.lua +msgid "Secret Achievement Unlocked:" +msgstr "Conquista Secreta Desbloqueada:" + +#: api.lua +msgid "Achievement Unlocked:" +msgstr "Conquista Desbloqueada:" + +#: api.lua +#, lua-format +msgid "Secret Achievement Unlocked: %s" +msgstr "Conquista Secreta Desbloqueada: %s" + +#: api.lua +#, lua-format +msgid "Achievement Unlocked: %s" +msgstr "Conquista Desbloqueada: %s" + +#: api.lua +msgid "Secret Achievement Unlocked!" +msgstr "Conquista Secreta Desbloqueada!" + +#: api.lua +msgid "Achievement Unlocked!" +msgstr "Conquista Desbloqueada!" + +#: api.lua +msgid "Error: No awards available." +msgstr "Erro: Nenhuma conquista encontrada." + +#: api.lua +msgid "OK" +msgstr "OK" + +#: api.lua +msgid "(Secret Award)" +msgstr "(Conquista Secreta)" + +#: api.lua +msgid "Unlock this award to find out what it is." +msgstr "Desbloqueie essa conquista para descobrir o que significa." + +#: api.lua +#, lua-format +msgid "%s (got)" +msgstr "%s (obtido)" + +#: api.lua +msgid "You've disabled awards. Type /awards enable to reenable." +msgstr "Desabilitaste as conquistas. Digite /awards enable para reabilitar." + +#: api.lua +msgid "You have not unlocked any awards." +msgstr "Nenhuma conquista desbloqueada ainda." + +#: api.lua +#, lua-format +msgid "%s’s awards:" +msgstr "%s das conquistas:" + +#: api.lua chat_commands.lua +#, lua-format +msgid "%s: %s" +msgstr "%s: %s" + +#: sfinv.lua unified_inventory.lua +msgid "Awards" +msgstr "Conquistas" + +#: triggers.lua +msgid "@1/@2 dug" +msgstr "@1 de @2 obtidos" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Mine: @2" +msgid_plural "Mine: @1×@2" +msgstr[0] "Cavar: @2" +msgstr[1] "Minar: @1×@2" + +#: triggers.lua +msgid "Mine @1 block." +msgid_plural "Mine @1 blocks." +msgstr[0] "Cavar um bloco." +msgstr[1] "Cavar @1 blocos." + +#: triggers.lua +msgid "@1/@2 placed" +msgstr "@1 de @2 colocados" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Place: @2" +msgid_plural "Place: @1×@2" +msgstr[0] "Colocar: @2" +msgstr[1] "Place: @1×@2" + +#: triggers.lua +msgid "Place a block." +msgid_plural "Place @1 blocks." +msgstr[0] "Colocar um bloco." +msgstr[1] "Colocar @1 blocos." + +#: triggers.lua +msgid "@1/@2 eaten" +msgstr "@1 de @2 consumidos" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Eat: @2" +msgid_plural "Eat: @1×@2" +msgstr[0] "Consumir: @2" +msgstr[1] "Consumir: @1×@2" + +#: triggers.lua +msgid "Eat an item." +msgid_plural "Eat @1 items." +msgstr[0] "Consumir um item." +msgstr[1] "Consumir @1 itens." + +#: triggers.lua +msgid "@1/@2 deaths" +msgstr "@1 de @2 mortes" + +#: triggers.lua +msgid "Die." +msgid_plural "Die @1 times." +msgstr[0] "Morrer." +msgstr[1] "Morrer @1 vezes." + +#: triggers.lua +msgid "@1/@2 chat messages" +msgstr "@1 de @2" + +#: triggers.lua +msgid "Write something in chat." +msgid_plural "Write @1 chat messages." +msgstr[0] "Escrever algo no bate papo." +msgstr[1] "Escrever @1 mensagens no bate papo." + +#: triggers.lua +msgid "@1/@2 game joins" +msgstr "@1 de @2" + +#: triggers.lua +msgid "Join the game." +msgid_plural "Join the game @1 times." +msgstr[0] "Entre no jogo." +msgstr[1] "Entre no jogo @1 vezes." + +#: triggers.lua +msgid "@1/@2 crafted" +msgstr "@1 de @2 feitos" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Craft: @2" +msgid_plural "Craft: @1×@2" +msgstr[0] "Fazer @2" +msgstr[1] "Montar @2 @1 vezes" + +#: triggers.lua +msgid "Craft an item." +msgid_plural "Craft @1 items." +msgstr[0] "Fazer um item." +msgstr[1] "Fazer @1 itens." + +#: init.lua +msgid "Saint-Maclou" +msgstr "Saint-Maclou" + +#: init.lua +msgid "Place 20 coal checkers." +msgstr "" + +#: init.lua +msgid "Castorama" +msgstr "" + +#: init.lua +msgid "Place 20 iron checkers." +msgstr "" + +#: init.lua +msgid "Sam the Trapper" +msgstr "" + +#: init.lua +msgid "Place 2 trap stones." +msgstr "" + +#: init.lua +msgid "Backpacker" +msgstr "" + +#: init.lua +msgid "Craft 4 large bags." +msgstr "" + +#: init.lua +msgid "Pyromaniac" +msgstr "Piromaníaco" + +#: init.lua +msgid "Craft 8 times flint and steel." +msgstr "Montar acendedor de Ferro e Pederneira 8 vezes." + +#: init.lua +msgid "Firefighter" +msgstr "Bombeiro" + +#: init.lua +msgid "Put out 1000 fires." +msgstr "Apagar fogo 1000 vezes." + +#: init.lua +msgid "Light It Up" +msgstr "Ilumine Isso" + +#: init.lua +msgid "Place 100 torches." +msgstr "Colocar 100 tochas." + +#: init.lua +msgid "Well Lit" +msgstr "Bem Iluminado" + +#: init.lua +msgid "Place 1,000 torches." +msgstr "Colocar 1.000 tochas." + +#: init.lua +msgid "Really Well Lit" +msgstr "Realmente Bem Iluminado" + +#: init.lua +msgid "Craft 10 mese lamps." +msgstr "Fazer 10 lâmpadas de mese." + +#: init.lua +msgid "Outpost" +msgstr "Posto Avançado" + +#: init.lua +msgid "Craft 200 stone bricks." +msgstr "Fazer 200 tijolos de pedra." + +#: init.lua +msgid "Watchtower" +msgstr "Sentinela" + +#: init.lua +msgid "Craft 800 stone bricks." +msgstr "Fazer 800 tijolos de pedra." + +#: init.lua +msgid "Fortress" +msgstr "Fortaleza" + +#: init.lua +msgid "Craft 3,200 stone bricks." +msgstr "Fazer 3.200 tijolos de pedra." + +#: init.lua +msgid "Desert Dweller" +msgstr "Morador do Deserto" + +#: init.lua +msgid "Craft 400 desert stone bricks." +msgstr "Fazer 400 Tijolos de pedra do deserto." + +#: init.lua +msgid "Pharaoh" +msgstr "Faraó" + +#: init.lua +msgid "Craft 100 sandstone bricks." +msgstr "Fazer 100 tijolos de arenito." + +#: init.lua +msgid "Little Library" +msgstr "Pequena Biblioteca" + +#: init.lua +msgid "Craft 7 bookshelves." +msgstr "Fazer 7 estantes de livros." + +#: init.lua +msgid "Lava and Water" +msgstr "Lava e Água" + +#: init.lua +msgid "Mine your first obsidian." +msgstr "Cavar sua primeira obsidiana." + +#: init.lua +msgid "Obsessed with Obsidian" +msgstr "Obcecado por Obsidiana" + +#: init.lua +msgid "Mine 50 obsidian." +msgstr "Minerar 50 obsidianas." + +#: init.lua +msgid "Lava Miner" +msgstr "Minerador de Lava" + +#: init.lua +msgid "Mine any block while being very close to lava." +msgstr "Minerar qualquer bloco enquanto estiver mergulhado em lava." + +#: init.lua +msgid "On The Way" +msgstr "No Caminho" + +#: init.lua +msgid "Place 100 rails." +msgstr "Colocar 100 trilhos." + +#: init.lua +msgid "First Day in the Woods" +msgstr "Primeiro dia na Floresta" + +#: init.lua +msgid "Dig 6 tree blocks." +msgstr "Cortar 6 blocos de árvore." + +#: init.lua +msgid "Lumberjack" +msgstr "Lenhador" + +#: init.lua +msgid "Dig 36 tree blocks." +msgstr "Cortar 36 blocos de árvore." + +#: init.lua +msgid "Semi-pro Lumberjack" +msgstr "Lenhador Semi-Profissional" + +#: init.lua +msgid "Dig 216 tree blocks." +msgstr "Cortar 216 blocos de árvore." + +#: init.lua +msgid "Professional Lumberjack" +msgstr "Lenhador Profissional" + +#: init.lua +msgid "Dig 1,296 tree blocks." +msgstr "Cortar 1.296 blocos de árvore." + +#: init.lua +msgid "Junglebaby" +msgstr "Bebê Selvagem" + +#: init.lua +msgid "Dig 100 jungle tree blocks." +msgstr "Cortar 100 blocos de árvore selvagem." + +#: init.lua +msgid "Jungleman" +msgstr "Homem Selvagem" + +#: init.lua +msgid "Dig 1,000 jungle tree blocks." +msgstr "Cortar 1.000 blocos de árvore selvagem." + +#: init.lua +msgid "First Mese Find" +msgstr "Primeiro Mese" + +#: init.lua +msgid "Mine your first mese ore." +msgstr "Cavar seu primeiro mese." + +#: init.lua +msgid "Mese Mastery" +msgstr "Mestre do Mese" + +#: init.lua +msgid "Mine a mese block." +msgstr "Cavar um bloco de mese." + +#: init.lua +msgid "You’re a copper" +msgstr "Sou um Cobre" + +#: init.lua +msgid "Dig 1,000 copper ores." +msgstr "Minerar 1.000 cobres." + +#: init.lua +msgid "A Cat in a Pop-Tart?!" +msgstr "Um Gato em um Pop-Tart?!" + +#: init.lua +msgid "Mine a nyan cat." +msgstr "Capturar um gato nyan." + +#: init.lua +msgid "Mini Miner" +msgstr "Mini Minerador" + +#: init.lua +msgid "Dig 100 stone blocks." +msgstr "Minerar 100 blocos de pedra." + +#: init.lua +msgid "Hardened Miner" +msgstr "Minerador Avançado" + +#: init.lua +msgid "Dig 1,000 stone blocks." +msgstr "Minerar 1.000 blocos de pedra." + +#: init.lua +msgid "Master Miner" +msgstr "Minerador Mestre" + +#: init.lua +msgid "Dig 10,000 stone blocks." +msgstr "Minerar 10.000 blocos de pedra." + +#: init.lua +msgid "Marchand De Sable" +msgstr "Vendedor de Areia" + +#: init.lua +msgid "Dig 1,000 sand." +msgstr "Cavar 1.000 blocos de areia." + +#: init.lua +msgid "Crafter of Sticks" +msgstr "Rachador de Lenha" + +#: init.lua +msgid "Craft 100 sticks." +msgstr "Lenhar 100 gravetos." + +#: init.lua +msgid "Jungle Discoverer" +msgstr "Desbravador Selvagem" + +#: init.lua +msgid "Mine your first jungle grass." +msgstr "Cortar seu primeiro mato selvagem." + +#: init.lua +msgid "Grasslands Discoverer" +msgstr "Descobridor do Gramado" + +#: init.lua +msgid "Mine some grass." +msgstr "Minerar algum mato" + +#: init.lua +msgid "Savannah Discoverer" +msgstr "Descobridor da Savana" + +#: init.lua +msgid "Mine some dry grass." +msgstr "Minerar algum mato seco." + +#: init.lua +msgid "Desert Discoverer" +msgstr "Descobridor do Deserto" + +#: init.lua +msgid "Mine your first cactus." +msgstr "Cortar seu primeiro cacto." + +#: init.lua +msgid "Far Lands" +msgstr "Terras Distantes" + +#: init.lua +msgid "Mine your first dry shrub." +msgstr "Minerar seu primeiro arbusto seco." + +#: init.lua +msgid "Glacier Discoverer" +msgstr "Descobridor Glacial" + +#: init.lua +msgid "Mine your first ice." +msgstr "Quebrar seu primeiro bloco de gelo." + +#: init.lua +msgid "Very Simple Snow Man" +msgstr "Homem de Neve Muito Simples" + +#: init.lua +msgid "Place two snow blocks." +msgstr "Colocar 2 blocos de neve." + +#: init.lua +msgid "First Gold Find" +msgstr "Achei Ouro" + +#: init.lua +msgid "Mine your first gold ore." +msgstr "Minerar sua primeira de ouro." + +#: init.lua +msgid "Gold Rush" +msgstr "Corriga do Ouro" + +#: init.lua +msgid "Mine 45 gold ores." +msgstr "Minerar 45 de ouro." + +#: init.lua +msgid "Wow, I am Diamonds!" +msgstr "Uau, Diamante!" + +#: init.lua +msgid "Mine your first diamond ore." +msgstr "Minerar seu primeiro diamante." + +#: init.lua +msgid "Girl's Best Friend" +msgstr "Melhor Amigo da Menina" + +#: init.lua +msgid "Mine 18 diamond ores." +msgstr "Minere 18 diamantes." + +#: init.lua +msgid "Hardest Block on Earth" +msgstr "O Bloco mais Duro da Terra" + +#: init.lua +msgid "Craft a diamond block." +msgstr "Montar um bloco de diamante." + +#: init.lua +msgid "In the Dungeon" +msgstr "Na Masmorra" + +#: init.lua +msgid "Mine a mossy cobblestone." +msgstr "Minerar um pedregulho com musgo." + +#: init.lua +msgid "Smelter" +msgstr "Fundidor" + +#: init.lua +msgid "Craft 10 furnaces." +msgstr "Montar 10 fornos." + +#: init.lua +msgid "Treasurer" +msgstr "Tesoureiro" + +#: init.lua +msgid "Craft 15 chests." +msgstr "Montar 10 baús." + +#: init.lua +msgid "Bankier" +msgstr "Banqueiro" + +#: init.lua +msgid "Craft 30 locked chests." +msgstr "Montar 30 baús trancados." + +#: init.lua +msgid "Bricker" +msgstr "Tijoleiro" + +#: init.lua +msgid "Craft 200 brick blocks." +msgstr "Fazer 200 blocos de tijolo." + +#: init.lua +msgid "House of Obsidian" +msgstr "Casa de Obsidiana" + +#: init.lua +msgid "Craft 100 obsidian bricks." +msgstr "Montar 100 tijolos de obsidiana." + +#: init.lua +msgid "Build a Cave" +msgstr "Montar uma Caverna" + +#: init.lua +msgid "Place 100 stone." +msgstr "Colocar 100 pedras." + +#: init.lua +msgid "Long Ladder" +msgstr "Longa Escadaria" + +#: init.lua +msgid "Place 400 wooden ladders." +msgstr "Colocar 400 escadas de madeira." + +#: init.lua +msgid "Industrial Age" +msgstr "Era Industrial" + +#: init.lua +msgid "Place 40 steel ladders." +msgstr "Colocar 40 escadas de ferro." + +#: init.lua +msgid "Yummy!" +msgstr "Humm!" + +#: init.lua +msgid "Eat 80 apples." +msgstr "Comer 80 maçãs." + +#: init.lua +msgid "Glasser" +msgstr "Vidraceiro" + +#: init.lua +msgid "Craft 14 vessels shelves." +msgstr "Montar 14 estantes de frascos." + +#: init.lua +msgid "Farming Skills Acquired" +msgstr "Conhecimento de Cultivo Adquirido" + +#: init.lua +msgid "Harvest a fully grown wheat plant." +msgstr "Colher um trigo totalmente crescido." + +#: init.lua +msgid "Field Worker" +msgstr "Trabalhador do Campo" + +#: init.lua +msgid "Harvest 25 fully grown wheat plants." +msgstr "Colher 25 plantas trigos totalmente crescidos." + +#: init.lua +msgid "Aspiring Farmer" +msgstr "Fazendeiro Aspirante" + +#: init.lua +msgid "Harvest 125 fully grown wheat plants." +msgstr "Colher 125 plantas trigos totalmente crescidos." + +#: init.lua +msgid "Wheat Magnate" +msgstr "Magnata do Trigo" + +#: init.lua +msgid "Harvest 625 fully grown wheat plants." +msgstr "Colher 625 plantas trigos totalmente crescidos." + +#: init.lua +msgid "Baker" +msgstr "Padeiro" + +#: init.lua +msgid "Eat 10 loaves of bread." +msgstr "Comer 10 pães." + +#: init.lua +msgid "Wool Over Your Eyes" +msgstr "Lã Sobre Meus Olhos" + +#: init.lua +msgid "Craft 250 white wool." +msgstr "Tecer 250 lãs branca." + +#: init.lua +msgid "Hotelier" +msgstr "Hoteleiro" + +#: init.lua +msgid "Craft 15 fancy beds." +msgstr "Montar 15 camas chiques." + +#: init.lua +msgid "Filthy Rich" +msgstr "Muito Rico" + +#: init.lua +msgid "Craft 24 gold block stairs." +msgstr "Montar 24 escadas de bloco de ouro." + +#: init.lua +msgid "Roses Are Red" +msgstr "Rosas São Vermelhas" + +#: init.lua +msgid "Craft 400 red dyes." +msgstr "Fazer 400 tintas vermelhas." + +#: init.lua +msgid "Dandelions are Yellow" +msgstr "Dentes-de-Leões são Amarelos" + +#: init.lua +msgid "Craft 400 yellow dyes." +msgstr "Fazer 400 tintas amarelas." + +#: init.lua +msgid "Geraniums are Blue" +msgstr "Gerânios são Azuis" + +#: init.lua +msgid "Craft 400 blue dyes." +msgstr "Fazer 400 tintas azuis." + +#: init.lua +msgid "White Color Stock" +msgstr "Estoque de Cor Branca" + +#: init.lua +msgid "Craft 100 white dyes." +msgstr "Fazer 100 tintas brancas." + +#: init.lua +msgid "Tasty Mushrooms" +msgstr "Cogumelos Deliciosos" + +#: init.lua +msgid "Eat 3 brown mushrooms." +msgstr "Comer 3 cogumelos marrons." + +#: init.lua +msgid "Mushroom Lover" +msgstr "Amante de Cogumelo" + +#: init.lua +msgid "Eat 33 brown mushrooms." +msgstr "Comer 33 cogumelos marrons." + +#: init.lua +msgid "Underground Mushroom Farmer" +msgstr "Fazendeiro Subterrâneo de Cogumelos" + +#: init.lua +msgid "Eat 333 brown mushrooms." +msgstr "Comer 333 cogumelos marrons." + +#: init.lua +msgid "Builder" +msgstr "Construtor" + +#: init.lua +msgid "Constructor" +msgstr "Empreiteiro" + +#: init.lua +msgid "Architect" +msgstr "Arquiteto" + +#: init.lua +msgid "Master Architect" +msgstr "Arquiteto Mestre" + +#: chat_commands.lua +msgid "[c|clear|disable|enable]" +msgstr "[c|clear|disable|enable]" + +#: chat_commands.lua +msgid "Show, clear, disable or enable your achievements" +msgstr "Exibir, limpar, desabilitar ou habilitar suas conquistas" + +#: chat_commands.lua +msgid "All your awards and statistics have been cleared. You can now start again." +msgstr "Todas as suas conquistas e estatísticas foram limpas. Agora podes iniciar novamente." + +#: chat_commands.lua +msgid "You have disabled your achievements." +msgstr "Suas conquistas foram desabilitadas." + +#: chat_commands.lua +msgid "You have enabled your achievements." +msgstr "Suas conquistas foram habilitadas." + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Show details of an achievement" +msgstr "Mostra detalhes de uma conquista" + +#: chat_commands.lua +msgid "Achievement not found." +msgstr "Conquista não encontrada." + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Get the achievements statistics for the given player or yourself" +msgstr "Ver as estatísticas de conquistas de um jogador ou suas próprias" diff --git a/mods/Other/awards/locale/template.pot b/mods/Other/awards/locale/template.pot new file mode 100644 index 0000000..970ae7c --- /dev/null +++ b/mods/Other/awards/locale/template.pot @@ -0,0 +1,819 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-21 05:50-0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: api.lua +msgid "Secret Achievement Unlocked:" +msgstr "" + +#: api.lua +msgid "Achievement Unlocked:" +msgstr "" + +#: api.lua +#, lua-format +msgid "Secret Achievement Unlocked: %s" +msgstr "" + +#: api.lua +#, lua-format +msgid "Achievement Unlocked: %s" +msgstr "" + +#: api.lua +msgid "Secret Achievement Unlocked!" +msgstr "" + +#: api.lua +msgid "Achievement Unlocked!" +msgstr "" + +#: api.lua +msgid "Error: No awards available." +msgstr "" + +#: api.lua +msgid "OK" +msgstr "" + +#: api.lua +msgid "(Secret Award)" +msgstr "" + +#: api.lua +msgid "Unlock this award to find out what it is." +msgstr "" + +#: api.lua +#, lua-format +msgid "%s (got)" +msgstr "" + +#: api.lua +msgid "You've disabled awards. Type /awards enable to reenable." +msgstr "" + +#: api.lua +msgid "You have not unlocked any awards." +msgstr "" + +#: api.lua +#, lua-format +msgid "%s’s awards:" +msgstr "" + +#: api.lua chat_commands.lua +#, lua-format +msgid "%s: %s" +msgstr "" + +#: sfinv.lua unified_inventory.lua +msgid "Awards" +msgstr "" + +#: triggers.lua +msgid "@1/@2 dug" +msgstr "" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Mine: @2" +msgid_plural "Mine: @1×@2" +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "Mine @1 block." +msgid_plural "Mine @1 blocks." +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "@1/@2 placed" +msgstr "" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Place: @2" +msgid_plural "Place: @1×@2" +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "Place a block." +msgid_plural "Place @1 blocks." +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "@1/@2 eaten" +msgstr "" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Eat: @2" +msgid_plural "Eat: @1×@2" +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "Eat an item." +msgid_plural "Eat @1 items." +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "@1/@2 deaths" +msgstr "" + +#: triggers.lua +msgid "Die." +msgid_plural "Die @1 times." +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "@1/@2 chat messages" +msgstr "" + +#: triggers.lua +msgid "Write something in chat." +msgid_plural "Write @1 chat messages." +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "@1/@2 game joins" +msgstr "" + +#: triggers.lua +msgid "Join the game." +msgid_plural "Join the game @1 times." +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "@1/@2 crafted" +msgstr "" + +#. Translators: @1 is count, @2 is description. +#: triggers.lua +msgid "Craft: @2" +msgid_plural "Craft: @1×@2" +msgstr[0] "" +msgstr[1] "" + +#: triggers.lua +msgid "Craft an item." +msgid_plural "Craft @1 items." +msgstr[0] "" +msgstr[1] "" + +#: init.lua +msgid "Saint-Maclou" +msgstr "" + +#: init.lua +msgid "Place 20 coal checkers." +msgstr "" + +#: init.lua +msgid "Castorama" +msgstr "" + +#: init.lua +msgid "Place 20 iron checkers." +msgstr "" + +#: init.lua +msgid "Sam the Trapper" +msgstr "" + +#: init.lua +msgid "Place 2 trap stones." +msgstr "" + +#: init.lua +msgid "Backpacker" +msgstr "" + +#: init.lua +msgid "Craft 4 large bags." +msgstr "" + +#: init.lua +msgid "Pyromaniac" +msgstr "" + +#: init.lua +msgid "Craft 8 times flint and steel." +msgstr "" + +#: init.lua +msgid "Firefighter" +msgstr "" + +#: init.lua +msgid "Put out 1000 fires." +msgstr "" + +#: init.lua +msgid "Light It Up" +msgstr "" + +#: init.lua +msgid "Place 100 torches." +msgstr "" + +#: init.lua +msgid "Well Lit" +msgstr "" + +#: init.lua +msgid "Place 1,000 torches." +msgstr "" + +#: init.lua +msgid "Really Well Lit" +msgstr "" + +#: init.lua +msgid "Craft 10 mese lamps." +msgstr "" + +#: init.lua +msgid "Outpost" +msgstr "" + +#: init.lua +msgid "Craft 200 stone bricks." +msgstr "" + +#: init.lua +msgid "Watchtower" +msgstr "" + +#: init.lua +msgid "Craft 800 stone bricks." +msgstr "" + +#: init.lua +msgid "Fortress" +msgstr "" + +#: init.lua +msgid "Craft 3,200 stone bricks." +msgstr "" + +#: init.lua +msgid "Desert Dweller" +msgstr "" + +#: init.lua +msgid "Craft 400 desert stone bricks." +msgstr "" + +#: init.lua +msgid "Pharaoh" +msgstr "" + +#: init.lua +msgid "Craft 100 sandstone bricks." +msgstr "" + +#: init.lua +msgid "Little Library" +msgstr "" + +#: init.lua +msgid "Craft 7 bookshelves." +msgstr "" + +#: init.lua +msgid "Lava and Water" +msgstr "" + +#: init.lua +msgid "Mine your first obsidian." +msgstr "" + +#: init.lua +msgid "Obsessed with Obsidian" +msgstr "" + +#: init.lua +msgid "Mine 50 obsidian." +msgstr "" + +#: init.lua +msgid "Lava Miner" +msgstr "" + +#: init.lua +msgid "Mine any block while being very close to lava." +msgstr "" + +#: init.lua +msgid "On The Way" +msgstr "" + +#: init.lua +msgid "Place 100 rails." +msgstr "" + +#: init.lua +msgid "First Day in the Woods" +msgstr "" + +#: init.lua +msgid "Dig 6 tree blocks." +msgstr "" + +#: init.lua +msgid "Lumberjack" +msgstr "" + +#: init.lua +msgid "Dig 36 tree blocks." +msgstr "" + +#: init.lua +msgid "Semi-pro Lumberjack" +msgstr "" + +#: init.lua +msgid "Dig 216 tree blocks." +msgstr "" + +#: init.lua +msgid "Professional Lumberjack" +msgstr "" + +#: init.lua +msgid "Dig 1,296 tree blocks." +msgstr "" + +#: init.lua +msgid "Junglebaby" +msgstr "" + +#: init.lua +msgid "Dig 100 jungle tree blocks." +msgstr "" + +#: init.lua +msgid "Jungleman" +msgstr "" + +#: init.lua +msgid "Dig 1,000 jungle tree blocks." +msgstr "" + +#: init.lua +msgid "First Mese Find" +msgstr "" + +#: init.lua +msgid "Mine your first mese ore." +msgstr "" + +#: init.lua +msgid "Mese Mastery" +msgstr "" + +#: init.lua +msgid "Mine a mese block." +msgstr "" + +#: init.lua +msgid "You’re a copper" +msgstr "" + +#: init.lua +msgid "Dig 1,000 copper ores." +msgstr "" + +#: init.lua +msgid "A Cat in a Pop-Tart?!" +msgstr "" + +#: init.lua +msgid "Mine a nyan cat." +msgstr "" + +#: init.lua +msgid "Mini Miner" +msgstr "" + +#: init.lua +msgid "Dig 100 stone blocks." +msgstr "" + +#: init.lua +msgid "Hardened Miner" +msgstr "" + +#: init.lua +msgid "Dig 1,000 stone blocks." +msgstr "" + +#: init.lua +msgid "Master Miner" +msgstr "" + +#: init.lua +msgid "Dig 10,000 stone blocks." +msgstr "" + +#: init.lua +msgid "Marchand De Sable" +msgstr "" + +#: init.lua +msgid "Dig 1,000 sand." +msgstr "" + +#: init.lua +msgid "Crafter of Sticks" +msgstr "" + +#: init.lua +msgid "Craft 100 sticks." +msgstr "" + +#: init.lua +msgid "Jungle Discoverer" +msgstr "" + +#: init.lua +msgid "Mine your first jungle grass." +msgstr "" + +#: init.lua +msgid "Grasslands Discoverer" +msgstr "" + +#: init.lua +msgid "Mine some grass." +msgstr "" + +#: init.lua +msgid "Savannah Discoverer" +msgstr "" + +#: init.lua +msgid "Mine some dry grass." +msgstr "" + +#: init.lua +msgid "Desert Discoverer" +msgstr "" + +#: init.lua +msgid "Mine your first cactus." +msgstr "" + +#: init.lua +msgid "Far Lands" +msgstr "" + +#: init.lua +msgid "Mine your first dry shrub." +msgstr "" + +#: init.lua +msgid "Glacier Discoverer" +msgstr "" + +#: init.lua +msgid "Mine your first ice." +msgstr "" + +#: init.lua +msgid "Very Simple Snow Man" +msgstr "" + +#: init.lua +msgid "Place two snow blocks." +msgstr "" + +#: init.lua +msgid "First Gold Find" +msgstr "" + +#: init.lua +msgid "Mine your first gold ore." +msgstr "" + +#: init.lua +msgid "Gold Rush" +msgstr "" + +#: init.lua +msgid "Mine 45 gold ores." +msgstr "" + +#: init.lua +msgid "Wow, I am Diamonds!" +msgstr "" + +#: init.lua +msgid "Mine your first diamond ore." +msgstr "" + +#: init.lua +msgid "Girl's Best Friend" +msgstr "" + +#: init.lua +msgid "Mine 18 diamond ores." +msgstr "" + +#: init.lua +msgid "Hardest Block on Earth" +msgstr "" + +#: init.lua +msgid "Craft a diamond block." +msgstr "" + +#: init.lua +msgid "In the Dungeon" +msgstr "" + +#: init.lua +msgid "Mine a mossy cobblestone." +msgstr "" + +#: init.lua +msgid "Smelter" +msgstr "" + +#: init.lua +msgid "Craft 10 furnaces." +msgstr "" + +#: init.lua +msgid "Treasurer" +msgstr "" + +#: init.lua +msgid "Craft 15 chests." +msgstr "" + +#: init.lua +msgid "Bankier" +msgstr "" + +#: init.lua +msgid "Craft 30 locked chests." +msgstr "" + +#: init.lua +msgid "Bricker" +msgstr "" + +#: init.lua +msgid "Craft 200 brick blocks." +msgstr "" + +#: init.lua +msgid "House of Obsidian" +msgstr "" + +#: init.lua +msgid "Craft 100 obsidian bricks." +msgstr "" + +#: init.lua +msgid "Build a Cave" +msgstr "" + +#: init.lua +msgid "Place 100 stone." +msgstr "" + +#: init.lua +msgid "Long Ladder" +msgstr "" + +#: init.lua +msgid "Place 400 wooden ladders." +msgstr "" + +#: init.lua +msgid "Industrial Age" +msgstr "" + +#: init.lua +msgid "Place 40 steel ladders." +msgstr "" + +#: init.lua +msgid "Yummy!" +msgstr "" + +#: init.lua +msgid "Eat 80 apples." +msgstr "" + +#: init.lua +msgid "Glasser" +msgstr "" + +#: init.lua +msgid "Craft 14 vessels shelves." +msgstr "" + +#: init.lua +msgid "Farming Skills Acquired" +msgstr "" + +#: init.lua +msgid "Harvest a fully grown wheat plant." +msgstr "" + +#: init.lua +msgid "Field Worker" +msgstr "" + +#: init.lua +msgid "Harvest 25 fully grown wheat plants." +msgstr "" + +#: init.lua +msgid "Aspiring Farmer" +msgstr "" + +#: init.lua +msgid "Harvest 125 fully grown wheat plants." +msgstr "" + +#: init.lua +msgid "Wheat Magnate" +msgstr "" + +#: init.lua +msgid "Harvest 625 fully grown wheat plants." +msgstr "" + +#: init.lua +msgid "Baker" +msgstr "" + +#: init.lua +msgid "Eat 10 loaves of bread." +msgstr "" + +#: init.lua +msgid "Wool Over Your Eyes" +msgstr "" + +#: init.lua +msgid "Craft 250 white wool." +msgstr "" + +#: init.lua +msgid "Hotelier" +msgstr "" + +#: init.lua +msgid "Craft 15 fancy beds." +msgstr "" + +#: init.lua +msgid "Filthy Rich" +msgstr "" + +#: init.lua +msgid "Craft 24 gold block stairs." +msgstr "" + +#: init.lua +msgid "Roses Are Red" +msgstr "" + +#: init.lua +msgid "Craft 400 red dyes." +msgstr "" + +#: init.lua +msgid "Dandelions are Yellow" +msgstr "" + +#: init.lua +msgid "Craft 400 yellow dyes." +msgstr "" + +#: init.lua +msgid "Geraniums are Blue" +msgstr "" + +#: init.lua +msgid "Craft 400 blue dyes." +msgstr "" + +#: init.lua +msgid "White Color Stock" +msgstr "" + +#: init.lua +msgid "Craft 100 white dyes." +msgstr "" + +#: init.lua +msgid "Tasty Mushrooms" +msgstr "" + +#: init.lua +msgid "Eat 3 brown mushrooms." +msgstr "" + +#: init.lua +msgid "Mushroom Lover" +msgstr "" + +#: init.lua +msgid "Eat 33 brown mushrooms." +msgstr "" + +#: init.lua +msgid "Underground Mushroom Farmer" +msgstr "" + +#: init.lua +msgid "Eat 333 brown mushrooms." +msgstr "" + +#: init.lua +msgid "Builder" +msgstr "" + +#: init.lua +msgid "Constructor" +msgstr "" + +#: init.lua +msgid "Architect" +msgstr "" + +#: init.lua +msgid "Master Architect" +msgstr "" + +#: chat_commands.lua +msgid "[c|clear|disable|enable]" +msgstr "" + +#: chat_commands.lua +msgid "Show, clear, disable or enable your achievements" +msgstr "" + +#: chat_commands.lua +msgid "" +"All your awards and statistics have been cleared. You can now start again." +msgstr "" + +#: chat_commands.lua +msgid "You have disabled your achievements." +msgstr "" + +#: chat_commands.lua +msgid "You have enabled your achievements." +msgstr "" + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Show details of an achievement" +msgstr "" + +#: chat_commands.lua +msgid "Achievement not found." +msgstr "" + +#: chat_commands.lua +msgid "" +msgstr "" + +#: chat_commands.lua +msgid "Get the achievements statistics for the given player or yourself" +msgstr "" diff --git a/mods/Other/awards/mod.conf b/mods/Other/awards/mod.conf new file mode 100644 index 0000000..e3e83d6 --- /dev/null +++ b/mods/Other/awards/mod.conf @@ -0,0 +1,8 @@ +name = awards +title = Awards +author = rubenwardy +description = Adds awards to Minetest, and an API to register new ones. +optional_depends = intllib,sfinv,unified_inventory,default,stairs,farming,dye,beds,wool,vessels,moreblocks,fire,flowers,nyancat +license = MIT +forum = https://forum.minetest.net/viewtopic.php?t=4870 +version = 3.0.0 diff --git a/mods/Other/awards/screenshot.png b/mods/Other/awards/screenshot.png new file mode 100644 index 0000000..ab9e19e Binary files /dev/null and b/mods/Other/awards/screenshot.png differ diff --git a/mods/Other/awards/sounds/awards_got_generic.ogg b/mods/Other/awards/sounds/awards_got_generic.ogg new file mode 100644 index 0000000..88f5321 Binary files /dev/null and b/mods/Other/awards/sounds/awards_got_generic.ogg differ diff --git a/mods/Other/awards/src/api_awards.lua b/mods/Other/awards/src/api_awards.lua new file mode 100644 index 0000000..4147d43 --- /dev/null +++ b/mods/Other/awards/src/api_awards.lua @@ -0,0 +1,179 @@ +-- Copyright (c) 2013-18 rubenwardy. MIT. + +local S = awards.gettext + +function awards.register_award(name, def) + def.name = name + + -- Add Triggers + if def.trigger and def.trigger.type then + local tdef = awards.registered_triggers[def.trigger.type] + assert(tdef, "Trigger not found: " .. def.trigger.type) + tdef:on_register(def) + end + + function def:can_unlock(data) + if not self.requires then + return true + end + + for i=1, #self.requires do + if not data.unlocked[self.requires[i]] then + return false + end + end + return true + end + + -- Add Award + awards.registered_awards[name] = def + + local tdef = awards.registered_awards[name] + if def.description == nil and tdef.getDefaultDescription then + def.description = tdef:getDefaultDescription() + end +end + + +-- This function is called whenever a target condition is met. +-- It checks if a player already has that award, and if they do not, +-- it gives it to them +---------------------------------------------- +--awards.unlock(name, award) +-- name - the name of the player +-- award - the name of the award to give +function awards.unlock(name, award) + -- Access Player Data + local data = awards.player(name) + local awdef = awards.registered_awards[award] + assert(awdef, "Unable to unlock an award which doesn't exist!") + + if data.disabled or + (data.unlocked[award] and data.unlocked[award] == award) then + return + end + + if not awdef:can_unlock(data) then + minetest.log("warning", "can_unlock returned false in unlock of " .. + award .. " for " .. name) + return + end + + -- Unlock Award + minetest.log("action", name.." has unlocked award "..name) + data.unlocked[award] = award + awards.save() + + -- Give Prizes + if awdef and awdef.prizes then + for i = 1, #awdef.prizes do + local itemstack = ItemStack(awdef.prizes[i]) + if not itemstack:is_empty() then + local receiverref = minetest.get_player_by_name(name) + if receiverref then + receiverref:get_inventory():add_item("main", itemstack) + end + end + end + end + + -- Run callbacks + if awdef.on_unlock and awdef.on_unlock(name, awdef) then + return + end + for _, callback in pairs(awards.on_unlock) do + if callback(name, awdef) then + return + end + end + + -- Get Notification Settings + local title = awdef.title or award + local desc = awdef.description or "" + local background = awdef.background or "awards_bg_default.png" + local icon = awdef.icon or "awards_unknown.png" + local sound = awdef.sound + if sound == nil then + -- Explicit check for nil because sound could be `false` to disable it + sound = {name="awards_got_generic", gain=0.25} + end + + -- Do Notification + if sound then + -- Enforce sound delay to prevent sound spamming + local lastsound = data.lastsound + if lastsound == nil or os.difftime(os.time(), lastsound) >= 1 then + minetest.sound_play(sound, {to_player=name}) + data.lastsound = os.time() + end + end + + if awards.show_mode == "chat" then + local chat_announce + if awdef.secret then + chat_announce = S("Secret Award Unlocked: %s") + else + chat_announce = S("Award Unlocked: %s") + end + -- use the chat console to send it + minetest.chat_send_player(name, string.format(chat_announce, title)) + if desc~="" then + minetest.chat_send_player(name, desc) + end + else + local player = minetest.get_player_by_name(name) + local one = player:hud_add({ + hud_elem_type = "image", + name = "award_bg", + scale = {x = 2, y = 1}, + text = background, + position = {x = 0.5, y = 0.05}, + offset = {x = 0, y = 138}, + alignment = {x = 0, y = -1} + }) + local hud_announce + if awdef.secret then + hud_announce = S("Secret Award Unlocked!") + else + hud_announce = S("Award Unlocked!") + end + local two = player:hud_add({ + hud_elem_type = "text", + name = "award_au", + number = 0xFFFFFF, + scale = {x = 100, y = 20}, + text = hud_announce, + position = {x = 0.5, y = 0.05}, + offset = {x = 0, y = 45}, + alignment = {x = 0, y = -1} + }) + local three = player:hud_add({ + hud_elem_type = "text", + name = "award_title", + number = 0xFFFFFF, + scale = {x = 100, y = 20}, + text = title, + position = {x = 0.5, y = 0.05}, + offset = {x = 0, y = 100}, + alignment = {x = 0, y = -1} + }) + local four = player:hud_add({ + hud_elem_type = "image", + name = "award_icon", + scale = {x = 4, y = 4}, + text = icon, + position = {x = 0.5, y = 0.05}, + offset = {x = -200.5, y = 126}, + alignment = {x = 0, y = -1} + }) + minetest.after(4, function() + local player2 = minetest.get_player_by_name(name) + if player2 then + player2:hud_remove(one) + player2:hud_remove(two) + player2:hud_remove(three) + player2:hud_remove(four) + end + end) + end +end diff --git a/mods/Other/awards/src/api_triggers.lua b/mods/Other/awards/src/api_triggers.lua new file mode 100644 index 0000000..454c79e --- /dev/null +++ b/mods/Other/awards/src/api_triggers.lua @@ -0,0 +1,218 @@ +-- Copyright (c) 2013-18 rubenwardy. MIT. + +local S, NS = awards.gettext, awards.ngettext + +awards.registered_awards = {} +awards.on = {} +awards.on_unlock = {} + +local default_def = {} + +function default_def:run_callbacks(player, data, table_func) + for i = 1, #self.on do + local res = nil + local entry = self.on[i] + if type(entry) == "function" then + res = entry(player, data) + elseif type(entry) == "table" and entry.award then + res = table_func(entry) + end + + if res then + awards.unlock(player:get_player_name(), res) + end + end +end + +function awards.register_trigger(tname, tdef) + assert(type(tdef) == "table", + "Passing a callback to register_trigger is not supported in 3.0") + + tdef.name = tname + for key, value in pairs(default_def) do + tdef[key] = value + end + + if tdef.type == "counted" then + local old_reg = tdef.on_register + + function tdef:on_register(def) + local tmp = { + award = def.name, + target = def.trigger.target, + } + tdef.register(tmp) + + function def.getProgress(_, data) + local done = math.min(data[tname] or 0, tmp.target) + return { + perc = done / tmp.target, + label = S(tdef.progress, done, tmp.target), + } + end + + function def.getDefaultDescription(_) + local n = def.trigger.target + return NS(tdef.auto_description[1], tdef.auto_description[2], n, n) + end + + if old_reg then + return old_reg(tdef, def) + end + end + + function tdef.notify(player) + assert(player and player.is_player and player:is_player()) + local name = player:get_player_name() + local data = awards.player(name) + + -- Increment counter + local currentVal = (data[tname] or 0) + 1 + data[tname] = currentVal + + tdef:run_callbacks(player, data, function(entry) + if entry.target and entry.award and currentVal and + currentVal >= entry.target then + return entry.award + end + end) + end + + awards["notify_" .. tname] = tdef.notify + + elseif tdef.type == "counted_key" then + if tdef.key_is_item then + tdef.watched_groups = {} + end + + -- On award register + local old_reg = tdef.on_register + function tdef:on_register(def) + -- Register trigger + local tmp = { + award = def.name, + key = tdef:get_key(def), + target = def.trigger.target, + } + tdef.register(tmp) + + -- If group, add it to watch list + if tdef.key_is_item and tmp.key and tmp.key:sub(1, 6) == "group:" then + tdef.watched_groups[tmp.key:sub(7, #tmp.key)] = true + end + + -- Called to get progress values and labels + function def.getProgress(_, data) + data[tname] = data[tname] or {} + + local done + if tmp.key then + done = data[tname][tmp.key] or 0 + else + done = data[tname].__total or 0 + end + done = math.min(done, tmp.target) + + return { + perc = done / tmp.target, + label = S(tdef.progress, done, tmp.target), + } + end + + -- Build description if none is specificed by the award + function def.getDefaultDescription(_) + local n = def.trigger.target + if tmp.key then + local nname = tmp.key + return NS(tdef.auto_description[1], + tdef.auto_description[2], n, n, nname) + else + return NS(tdef.auto_description_total[1], + tdef.auto_description_total[2], n, n) + end + end + + -- Call on_register in trigger type definition + if old_reg then + return old_reg(tdef, def) + end + end + + function tdef.notify(player, key, n) + n = n or 1 + + if tdef.key_is_item and key:sub(1, 6) ~= "group:" then + local itemdef = minetest.registered_items[key] + if itemdef then + for groupname, _ in pairs(itemdef.groups or {}) do + if tdef.watched_groups[groupname] then + tdef.notify(player, "group:" .. groupname, n) + end + end + end + end + + assert(player and player.is_player and player:is_player() and key) + local name = player:get_player_name() + local data = awards.player(name) + + -- Increment counter + data[tname] = data[tname] or {} + local currentVal = (data[tname][key] or 0) + n + data[tname][key] = currentVal + if key:sub(1, 6) ~= "group:" then + data[tname].__total = (data[tname].__total or 0) + n + end + + tdef:run_callbacks(player, data, function(entry) + local current + if entry.key == key then + current = currentVal + elseif entry.key == nil then + current = data[tname].__total + else + return + end + + if current >= entry.target then + return entry.award + end + end) + end + + awards["notify_" .. tname] = tdef.notify + + elseif tdef.type and tdef.type ~= "custom" then + error("Unrecognised trigger type " .. tdef.type) + end + + awards.registered_triggers[tname] = tdef + + tdef.on = {} + tdef.register = function(func) + table.insert(tdef.on, func) + end + + -- Backwards compat + awards.on[tname] = tdef.on + awards['register_on_' .. tname] = tdef.register + return tdef +end + +function awards.increment_item_counter(data, field, itemname, count) + itemname = minetest.registered_aliases[itemname] or itemname + data[field][itemname] = (data[field][itemname] or 0) + 1 +end + +function awards.get_item_count(data, field, itemname) + itemname = minetest.registered_aliases[itemname] or itemname + return data[field][itemname] or 0 +end + +function awards.get_total_keyed_count(data, field) + return data[field].__total or 0 +end + +function awards.register_on_unlock(func) + table.insert(awards.on_unlock, func) +end diff --git a/mods/Other/awards/src/awards.lua b/mods/Other/awards/src/awards.lua new file mode 100644 index 0000000..e4b81dc --- /dev/null +++ b/mods/Other/awards/src/awards.lua @@ -0,0 +1,67 @@ +-- Copyright (c) 2013-18 rubenwardy and Wuzzy. MIT. + +color1 = minetest.setting_get("color1") or "292421" +color2 = minetest.setting_get("color2") or "0000FF" +color3 = minetest.setting_get("color3") or "00FF00" +color4 = minetest.setting_get("color4") or "F5F5F5" +color5 = minetest.setting_get("color5") or "FF6103" +color6 = minetest.setting_get("color6") or "FF0000" +color7 = minetest.setting_get("color7") or "FFFF00" +color8 = minetest.setting_get("color8") or "FF69B4" + +local source_list = { + {"black", "Color1", color1, 40, 36, 33}, + {"blue", "Color2", color2, 0, 0, 255}, + {"green", "Color3", color3, 0, 255, 0}, + {"white", "Color4", color4, 245, 245, 245}, + {"orange", "Color5", color5, 255, 97, 3}, + {"red", "Color6", color6, 255, 0, 0}, + {"yellow", "Color7", color7, 255, 255, 0}, + {"pink", "Color8", color8, 255, 105, 180} +} + +for i in ipairs(source_list) do + local color = source_list[i][1] + local desc = source_list[i][2] + local colour = source_list[i][3] + local red = source_list[i][4] + local green = source_list[i][5] + local blue = source_list[i][6] + +local S = awards.gettext + + awards.register_award("award_" .. color,{ + title = S("First " .. color), + description = S("Place 1 " .. color), + + trigger = { + type = "place", + node = "color:" .. color, + target = 1 + } + }) + +awards.register_award("award_999" .. color,{ + title = S("999 " .. color .. "s Blocks"), + description = S("Place 999 " .. color), + + trigger = { + type = "place", + node = "color:" .. color, + target = 999 + } + }) + +awards.register_award("award_dead" .. color,{ + title = S("Oh nooooo .... My " .. color), + description = S("Dig a " .. color), + + trigger = { + type = "dig", + node = "color:" .. color, + target = 1 + } + }) + + +end diff --git a/mods/Other/awards/src/chat_commands.lua b/mods/Other/awards/src/chat_commands.lua new file mode 100644 index 0000000..9c1580e --- /dev/null +++ b/mods/Other/awards/src/chat_commands.lua @@ -0,0 +1,61 @@ +-- Copyright (c) 2013-18 rubenwardy. MIT. + +local S = awards.gettext + +minetest.register_chatcommand("awards", { + params = S("[c|clear|disable|enable]"), + description = S("Show, clear, disable or enable your awards"), + func = function(name, param) + if param == "clear" then + awards.clear_player(name) + minetest.chat_send_player(name, + S("All your awards and statistics have been cleared. You can now start again.")) + elseif param == "disable" then + awards.disable(name) + minetest.chat_send_player(name, S("You have disabled awards.")) + elseif param == "enable" then + awards.enable(name) + minetest.chat_send_player(name, S("You have enabled awards.")) + elseif param == "c" then + awards.show_to(name, name, nil, true) + else + awards.show_to(name, name, nil, false) + end + + if (param == "disable" or param == "enable") and minetest.global_exists("sfinv") then + local player = minetest.get_player_by_name(name) + if player then + sfinv.set_player_inventory_formspec(player) + end + end + end +}) + +minetest.register_chatcommand("awd", { + params = S(""), + description = S("Show details of an award"), + func = function(name, param) + local def = awards.registered_awards[param] + if def then + minetest.chat_send_player(name, string.format(S("%s: %s"), def.title, def.description)) + else + minetest.chat_send_player(name, S("Award not found.")) + end + end +}) + +minetest.register_chatcommand("awpl", { + privs = { + server = true + }, + params = S(""), + description = S("Get the awards statistics for the given player or yourself"), + func = function(name, param) + if not param or param == "" then + param = name + end + minetest.chat_send_player(name, param) + local player = awards.player(param) + minetest.chat_send_player(name, dump(player)) + end +}) diff --git a/mods/Other/awards/src/data.lua b/mods/Other/awards/src/data.lua new file mode 100644 index 0000000..27ae5e3 --- /dev/null +++ b/mods/Other/awards/src/data.lua @@ -0,0 +1,111 @@ + +local storage = minetest.get_mod_storage() +local __player_data + +-- Table Save Load Functions +function awards.save() + storage:set_string("player_data", minetest.write_json(__player_data)) +end + +local function convert_data() + minetest.log("warning", "Importing awards data from previous version") + + local old_players = __player_data + __player_data = {} + for name, data in pairs(old_players) do + while name.name do + name = name.name + end + data.name = name + print("Converting data for " .. name) + + -- Just rename counted + local counted = { + chats = "chat", + deaths = "death", + joins = "join", + } + for from, to in pairs(counted) do + data[to] = data[from] + data[from] = nil + end + + data.death = { + unknown = data.death, + __total = data.death, + } + + -- Convert item db to new format + local counted_items = { + count = "dig", + place = "place", + craft = "craft", + } + for from, to in pairs(counted_items) do + local ret = {} + + local count = 0 + if data[from] then + for modname, items in pairs(data[from]) do + for itemname, value in pairs(items) do + itemname = modname .. ":" .. itemname + local key = minetest.registered_aliases[itemname] or itemname + ret[key] = value + count = count + value + end + end + end + + ret.__total = count + data[from] = nil + data[to] = ret + end + + __player_data[name] = data + end +end + +function awards.load() + local old_save_path = minetest.get_worldpath().."/awards.txt" + local file = io.open(old_save_path, "r") + if file then + local table = minetest.deserialize(file:read("*all")) + if type(table) == "table" then + __player_data = table + convert_data() + else + __player_data = {} + end + file:close() + os.rename(old_save_path, minetest.get_worldpath().."/awards.bk.txt") + awards.save() + else + __player_data = minetest.parse_json(storage:get_string("player_data")) or {} + end +end + +function awards.player(name) + assert(type(name) == "string") + local data = __player_data[name] or {} + __player_data[name] = data + + data.name = data.name or name + data.unlocked = data.unlocked or {} + return data +end + +function awards.player_or_nil(name) + return __player_data[name] +end + +function awards.enable(name) + awards.player(name).disabled = nil +end + +function awards.disable(name) + awards.player(name).disabled = true +end + +function awards.clear_player(name) + __player_data[name] = {} +end diff --git a/mods/Other/awards/src/gui.lua b/mods/Other/awards/src/gui.lua new file mode 100644 index 0000000..948a152 --- /dev/null +++ b/mods/Other/awards/src/gui.lua @@ -0,0 +1,285 @@ +-- Copyright (c) 2013-18 rubenwardy. MIT. + +local S = awards.gettext + +local function order_awards(name) + local hash_is_unlocked = {} + local retval = {} + + local data = awards.player(name) + if data and data.unlocked then + for awardname, _ in pairs(data.unlocked) do + local def = awards.registered_awards[awardname] + if def then + hash_is_unlocked[awardname] = true + local score = -100000 + + local difficulty = def.difficulty or 1 + if def.trigger and def.trigger.target then + difficulty = difficulty * def.trigger.target + end + score = score + difficulty + + retval[#retval + 1] = { + name = awardname, + def = def, + unlocked = true, + started = true, + score = score, + } + end + end + end + + for _, def in pairs(awards.registered_awards) do + if not hash_is_unlocked[def.name] and def:can_unlock(data) then + local started = false + local score = def.difficulty or 1 + if def.secret then + score = 1000000 + elseif def.trigger and def.trigger.target and def.getProgress then + local progress = def:getProgress(data).perc + score = score * (1 - progress) * def.trigger.target + if progress < 0.001 then + score = score + 100 + else + started = true + end + else + score = 100 + end + + retval[#retval + 1] = { + name = def.name, + def = def, + unlocked = false, + started = started, + score = score, + } + end + end + + table.sort(retval, function(a, b) + return a.score < b.score + end) + return retval +end + +function awards.get_formspec(name, to, sid) + local formspec = "" + local awards_list = order_awards(name) + local data = awards.player(name) + + if #awards_list == 0 then + formspec = formspec .. "label[3.9,1.5;"..minetest.formspec_escape(S("Error: No achivements available.")).."]" + formspec = formspec .. "button_exit[4.2,2.3;3,1;close;"..minetest.formspec_escape(S("OK")).."]" + return formspec + end + sid = awards_list[sid] and sid or 1 + + -- Sidebar + local sitem = awards_list[sid] + local sdef = sitem.def + if sdef and sdef.secret and not sitem.unlocked then + formspec = formspec .. "label[1,2.75;".. + minetest.formspec_escape(S("(Secret Award)")).."]".. + "image[1,0;3,3;awards_unknown.png]" + if sdef and sdef.description then + formspec = formspec .. "textarea[0.25,3.25;4.8,1.7;;".. + minetest.formspec_escape( + S("Unlock this award to find out what it is."))..";]" + end + else + local title = sitem.name + if sdef and sdef.title then + title = sdef.title + end + local status = "%s" + if sitem.unlocked then + status = S("%s (unlocked)") + end + + formspec = formspec .. "textarea[0.5,3.1;4.8,1.45;;" .. + string.format(status, minetest.formspec_escape(title)) .. + ";]" + + if sdef and sdef.icon then + formspec = formspec .. "image[0.6,0;3,3;" .. sdef.icon .. "]" + end + local barwidth = 3.95 + local perc = nil + local label = nil + if sdef.getProgress and data then + local res = sdef:getProgress(data) + perc = res.perc + label = res.label + end + if perc then + if perc > 1 then + perc = 1 + end + formspec = formspec .. "background[0,8.24;" .. barwidth ..",0.4;awards_progress_gray.png;false]" + formspec = formspec .. "background[0,8.24;" .. (barwidth * perc) ..",0.4;awards_progress_green.png;false]" + if label then + formspec = formspec .. "label[1.6,8.15;" .. minetest.formspec_escape(label) .. "]" + end + end + if sdef and sdef.description then + formspec = formspec .. "box[-0.05,3.75;3.9,4.2;#000]" + formspec = formspec .. "textarea[0.25,3.75;3.9,4.2;;" .. + minetest.formspec_escape(sdef.description) .. ";]" + end + end + + -- Create list box + formspec = formspec .. "textlist[4,0;3.8,8.6;awards;" + local first = true + for _, award in pairs(awards_list) do + local def = award.def + if def then + if not first then + formspec = formspec .. "," + end + first = false + + if def.secret and not award.unlocked then + formspec = formspec .. "#707070"..minetest.formspec_escape(S("(Secret Award)")) + else + local title = award.name + if def and def.title then + title = def.title + end + -- title = title .. " [" .. award.score .. "]" + if award.unlocked then + formspec = formspec .. minetest.formspec_escape(title) + elseif award.started then + formspec = formspec .. "#c0c0c0".. minetest.formspec_escape(title) + else + formspec = formspec .. "#a0a0a0".. minetest.formspec_escape(title) + end + end + end + end + return formspec .. ";"..sid.."]" +end + + +function awards.show_to(name, to, sid, text) + if name == "" or name == nil then + name = to + end + local data = awards.player(to) + if name == to and data.disabled then + minetest.chat_send_player(name, S("You've disabled awards. Type /awards enable to reenable.")) + return + end + if text then + local awards_list = order_awards(name) + if #awards_list == 0 then + minetest.chat_send_player(to, S("Error: No award available.")) + return + elseif not data or not data.unlocked then + minetest.chat_send_player(to, S("You have not unlocked any awards.")) + return + end + minetest.chat_send_player(to, string.format(S("%s’s awards:"), name)) + + for str, _ in pairs(data.unlocked) do + local def = awards.registered_awards[str] + if def then + if def.title then + if def.description then + minetest.chat_send_player(to, string.format(S("%s: %s"), def.title, def.description)) + else + minetest.chat_send_player(to, def.title) + end + else + minetest.chat_send_player(to, str) + end + end + end + else + local deco = "" + if minetest.global_exists("default") then + deco = default.gui_bg .. default.gui_bg_img + end + -- Show formspec to user + minetest.show_formspec(to,"awards:awards", + "size[8,8.6]" .. deco .. + awards.get_formspec(name, to, sid)) + end +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "awards:awards" then + return false + end + if fields.quit then + return true + end + local name = player:get_player_name() + if fields.awards then + local event = minetest.explode_textlist_event(fields.awards) + if event.type == "CHG" then + awards.show_to(name, name, event.index, false) + end + end + + return true +end) + +if minetest.get_modpath("sfinv") then + sfinv.register_page("awards:awards", { + title = S("Awards"), + on_enter = function(self, player, context) + context.awards_idx = 1 + end, + is_in_nav = function(self, player, context) + local data = awards.player(player:get_player_name()) + return not data.disabled + end, + get = function(self, player, context) + local name = player:get_player_name() + return sfinv.make_formspec(player, context, + awards.get_formspec(name, name, context.awards_idx), + false) + end, + on_player_receive_fields = function(self, player, context, fields) + if fields.awards then + local event = minetest.explode_textlist_event(fields.awards) + if event.type == "CHG" then + context.awards_idx = event.index + sfinv.set_player_inventory_formspec(player, context) + end + end + end + }) + + local function check_and_reshow(name) + local player = minetest.get_player_by_name(name) + if not player then + return + end + + local context = sfinv.get_or_create_context(player) + if context.page ~= "awards:awards" then + return + end + + sfinv.set_player_inventory_formspec(player, context) + end + + awards.register_on_unlock(check_and_reshow) +end + +if minetest.get_modpath("unified_inventory") ~= nil then + unified_inventory.register_button("awards", { + type = "image", + image = "awards_ui_icon.png", + tooltip = S("Awards"), + action = function(player) + local name = player:get_player_name() + awards.show_to(name, name, nil, false) + end, + }) +end diff --git a/mods/Other/awards/src/intllib.lua b/mods/Other/awards/src/intllib.lua new file mode 100644 index 0000000..c7af2c2 --- /dev/null +++ b/mods/Other/awards/src/intllib.lua @@ -0,0 +1,44 @@ +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext diff --git a/mods/Other/awards/src/triggers.lua b/mods/Other/awards/src/triggers.lua new file mode 100644 index 0000000..32a0b85 --- /dev/null +++ b/mods/Other/awards/src/triggers.lua @@ -0,0 +1,141 @@ +-- AWARDS +-- +-- Copyright (C) 2013-2015 rubenwardy +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU Lesser General Public License as published by +-- the Free Software Foundation; either version 2.1 of the License, or +-- (at your option) any later version. +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU Lesser General Public License for more details. +-- You should have received a copy of the GNU Lesser General Public License along +-- with this program; if not, write to the Free Software Foundation, Inc., +-- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +-- + + +awards.register_trigger("chat", { + type = "counted", + progress = "@1/@2 chat messages", + auto_description = { "Send a chat message", "Chat @1 times" }, +}) +minetest.register_on_chat_message(function(name, message) + local player = minetest.get_player_by_name(name) + if not player or string.find(message, "/") then + return + end + + awards.notify_chat(player) +end) + + +awards.register_trigger("join", { + type = "counted", + progress = "@1/@2 joins", + auto_description = { "Join once", "Join @1 times" }, +}) +minetest.register_on_joinplayer(awards.notify_join) + + +awards.register_trigger("death", { + type = "counted_key", + progress = "@1/@2 deaths", + auto_description = { "Die once of @2", "Die @1 times of @2" }, + auto_description_total = { "Die @1 times.", "Mine @1 times" }, + get_key = function(self, def) + return def.trigger.reason + end, +}) +minetest.register_on_dieplayer(function(player, reason) + if reason then + reason = reason.type + else + reason = "unknown" + end + awards.notify_death(player, reason) +end) + + +awards.register_trigger("dig", { + type = "counted_key", + progress = "@1/@2 dug", + auto_description = { "Mine: @2", "Mine: @1×@2" }, + auto_description_total = { "Mine @1 block.", "Mine @1 blocks." }, + get_key = function(self, def) + return minetest.registered_aliases[def.trigger.node] or def.trigger.node + end, + key_is_item = true, +}) +minetest.register_on_dignode(function(pos, node, player) + if not player or not pos or not node then + return + end + + local node_name = node.name + node_name = minetest.registered_aliases[node_name] or node_name + awards.notify_dig(player, node_name) +end) + + +awards.register_trigger("place", { + type = "counted_key", + progress = "@1/@2 placed", + auto_description = { "Place: @2", "Place: @1×@2" }, + auto_description_total = { "Place @1 block.", "Place @1 blocks." }, + get_key = function(self, def) + return minetest.registered_aliases[def.trigger.node] or def.trigger.node + end, + key_is_item = true, +}) +minetest.register_on_placenode(function(pos, node, player) + if not player or not pos or not node then + return + end + + local node_name = node.name + node_name = minetest.registered_aliases[node_name] or node_name + awards.notify_place(player, node_name) +end) + + +awards.register_trigger("craft", { + type = "counted_key", + progress = "@1/@2 crafted", + auto_description = { "Craft: @2", "Craft: @1×@2" }, + auto_description_total = { "Craft @1 item", "Craft @1 items." }, + get_key = function(self, def) + return minetest.registered_aliases[def.trigger.item] or def.trigger.item + end, + key_is_item = true, +}) +minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + if not player or itemstack:is_empty() then + return + end + + local itemname = itemstack:get_name() + itemname = minetest.registered_aliases[itemname] or itemname + awards.notify_craft(player, itemname, itemstack:get_count()) +end) + + +awards.register_trigger("eat", { + type = "counted_key", + progress = "@1/@2 eaten", + auto_description = { "Eat @2", "Eat @1×@2" }, + auto_description_total = { "Eat @1 item", "Eat @1 items." }, + get_key = function(self, def) + return minetest.registered_aliases[def.trigger.item] or def.trigger.item + end, + key_is_item = true, +}) +minetest.register_on_item_eat(function(_, _, itemstack, player, _) + if not player or itemstack:is_empty() then + return + end + + local itemname = itemstack:get_name() + itemname = minetest.registered_aliases[itemname] or itemname + awards.notify_craft(player, itemname, itemstack:get_count()) +end) diff --git a/mods/Other/awards/textures/awards_bg_default.png b/mods/Other/awards/textures/awards_bg_default.png new file mode 100644 index 0000000..df6e3df Binary files /dev/null and b/mods/Other/awards/textures/awards_bg_default.png differ diff --git a/mods/Other/awards/textures/awards_bg_mining.png b/mods/Other/awards/textures/awards_bg_mining.png new file mode 100644 index 0000000..f4163c5 Binary files /dev/null and b/mods/Other/awards/textures/awards_bg_mining.png differ diff --git a/mods/Other/awards/textures/awards_firefighter.png b/mods/Other/awards/textures/awards_firefighter.png new file mode 100644 index 0000000..7c2236b Binary files /dev/null and b/mods/Other/awards/textures/awards_firefighter.png differ diff --git a/mods/Other/awards/textures/awards_house.png b/mods/Other/awards/textures/awards_house.png new file mode 100644 index 0000000..e23e30d Binary files /dev/null and b/mods/Other/awards/textures/awards_house.png differ diff --git a/mods/Other/awards/textures/awards_level1.png b/mods/Other/awards/textures/awards_level1.png new file mode 100644 index 0000000..8f628f3 Binary files /dev/null and b/mods/Other/awards/textures/awards_level1.png differ diff --git a/mods/Other/awards/textures/awards_level2.png b/mods/Other/awards/textures/awards_level2.png new file mode 100644 index 0000000..9f9564f Binary files /dev/null and b/mods/Other/awards/textures/awards_level2.png differ diff --git a/mods/Other/awards/textures/awards_level3.png b/mods/Other/awards/textures/awards_level3.png new file mode 100644 index 0000000..8931454 Binary files /dev/null and b/mods/Other/awards/textures/awards_level3.png differ diff --git a/mods/Other/awards/textures/awards_level4.png b/mods/Other/awards/textures/awards_level4.png new file mode 100644 index 0000000..68e393f Binary files /dev/null and b/mods/Other/awards/textures/awards_level4.png differ diff --git a/mods/Other/awards/textures/awards_level5.png b/mods/Other/awards/textures/awards_level5.png new file mode 100644 index 0000000..d0a05bc Binary files /dev/null and b/mods/Other/awards/textures/awards_level5.png differ diff --git a/mods/Other/awards/textures/awards_level6.png b/mods/Other/awards/textures/awards_level6.png new file mode 100644 index 0000000..5c6482f Binary files /dev/null and b/mods/Other/awards/textures/awards_level6.png differ diff --git a/mods/Other/awards/textures/awards_level7.png b/mods/Other/awards/textures/awards_level7.png new file mode 100644 index 0000000..5e318d8 Binary files /dev/null and b/mods/Other/awards/textures/awards_level7.png differ diff --git a/mods/Other/awards/textures/awards_mese.png b/mods/Other/awards/textures/awards_mese.png new file mode 100644 index 0000000..3fc800e Binary files /dev/null and b/mods/Other/awards/textures/awards_mese.png differ diff --git a/mods/Other/awards/textures/awards_miniminer.png b/mods/Other/awards/textures/awards_miniminer.png new file mode 100644 index 0000000..45c7238 Binary files /dev/null and b/mods/Other/awards/textures/awards_miniminer.png differ diff --git a/mods/Other/awards/textures/awards_novicebuilder.png b/mods/Other/awards/textures/awards_novicebuilder.png new file mode 100644 index 0000000..f24d843 Binary files /dev/null and b/mods/Other/awards/textures/awards_novicebuilder.png differ diff --git a/mods/Other/awards/textures/awards_progress_gray.png b/mods/Other/awards/textures/awards_progress_gray.png new file mode 100644 index 0000000..a5fc6cb Binary files /dev/null and b/mods/Other/awards/textures/awards_progress_gray.png differ diff --git a/mods/Other/awards/textures/awards_progress_green.png b/mods/Other/awards/textures/awards_progress_green.png new file mode 100644 index 0000000..54b4e5d Binary files /dev/null and b/mods/Other/awards/textures/awards_progress_green.png differ diff --git a/mods/Other/awards/textures/awards_template.png b/mods/Other/awards/textures/awards_template.png new file mode 100644 index 0000000..b290454 Binary files /dev/null and b/mods/Other/awards/textures/awards_template.png differ diff --git a/mods/Other/awards/textures/awards_ui_bags.png b/mods/Other/awards/textures/awards_ui_bags.png new file mode 100644 index 0000000..4d6eb57 Binary files /dev/null and b/mods/Other/awards/textures/awards_ui_bags.png differ diff --git a/mods/Other/awards/textures/awards_ui_icon.png b/mods/Other/awards/textures/awards_ui_icon.png new file mode 100644 index 0000000..239ad71 Binary files /dev/null and b/mods/Other/awards/textures/awards_ui_icon.png differ diff --git a/mods/Other/awards/textures/awards_unknown.png b/mods/Other/awards/textures/awards_unknown.png new file mode 100644 index 0000000..b290454 Binary files /dev/null and b/mods/Other/awards/textures/awards_unknown.png differ diff --git a/mods/Other/awards/tools/updatepo.sh b/mods/Other/awards/tools/updatepo.sh new file mode 100644 index 0000000..74332e0 --- /dev/null +++ b/mods/Other/awards/tools/updatepo.sh @@ -0,0 +1,22 @@ +#! /bin/bash + +# To create a new translation: +# msginit --locale=ll_CC -o locale/ll_CC.po -i locale/template.pot + +cd "$(dirname "${BASH_SOURCE[0]}")/.."; + +# Extract translatable strings. +xgettext --from-code=UTF-8 \ + --keyword=S \ + --keyword=NS:1,2 \ + --keyword=N_ \ + --add-comments='Translators:' \ + --add-location=file \ + -o locale/template.pot \ + $(find . -name '*.lua') + +# Update translations. +find locale -name '*.po' | while read -r file; do + echo $file + msgmerge --update $file locale/template.pot; +done diff --git a/mods/Other/formspecs/README.txt b/mods/Other/formspecs/README.txt new file mode 100644 index 0000000..e69de29 diff --git a/mods/Other/formspecs/description.txt b/mods/Other/formspecs/description.txt new file mode 100644 index 0000000..22f9448 --- /dev/null +++ b/mods/Other/formspecs/description.txt @@ -0,0 +1,3 @@ +ActiveFormspecs is a self-contained API that provides secure session tracking, session-based state tables, and localized event handling of formspecs for individual mods as well as entire subgames + +For more information: https://forum.minetest.net/viewtopic.php?f=9&t=19303 diff --git a/mods/Other/formspecs/init.lua b/mods/Other/formspecs/init.lua new file mode 100644 index 0000000..43f2079 --- /dev/null +++ b/mods/Other/formspecs/init.lua @@ -0,0 +1,420 @@ +-------------------------------------------------------- +-- Minetest :: ActiveFormspecs Mod v2.4 (formspecs) +-- +-- See README.txt for licensing and release notes. +-- Copyright (c) 2016-2018, Leslie Ellen Krause +-- +-- ./games/just_test_tribute/mods/formspecs/init.lua +-------------------------------------------------------- + +print( "Loading ActiveFormspecs Mod" ) + +minetest.FORMSPEC_SIGEXIT = "true" -- player clicked exit button or pressed esc key (boolean for backward compatibility) +minetest.FORMSPEC_SIGQUIT = 1 -- player logged off +minetest.FORMSPEC_SIGKILL = 2 -- player was killed +minetest.FORMSPEC_SIGTERM = 3 -- server is shutting down +minetest.FORMSPEC_SIGPROC = 4 -- procedural closure +minetest.FORMSPEC_SIGTIME = 5 -- timeout reached + +local afs = { } -- obtain localized, protected namespace + +afs.forms = { } +afs.timers = { } +afs.session_id = 0 +afs.session_seed = math.random( 0, 65535 ) + +afs.stats = { active = 0, opened = 0, closed = 0 } + +afs.stats.on_open = function ( self ) + self.active = self.active + 1 + self.opened = self.opened + 1 +end + +afs.stats.on_close = function ( self ) + self.active = self.active - 1 + self.closed = self.closed + 1 +end + +----------------------------------------------------------------- +-- trigger callbacks at set intervals within timer queue +----------------------------------------------------------------- + +do + -- localize needed object references for efficiency + local get_us_time = minetest.get_us_time + local timers = afs.timers + local t_cur = get_us_time( ) + local t_off = -t_cur + + -- step monotonic clock with graceful 32-bit overflow + local step_clock = function( ) + local t_new = get_us_time( ) + + if t_new < t_cur then + t_off = t_off + 4294967290 + end + + t_cur = t_new + return t_off + t_new + end + afs.get_uptime = function( ) + return ( t_off + t_cur ) / 1000000 + end + + minetest.register_globalstep( function( dtime ) + local curtime = step_clock( ) / 1000000 + local idx = #timers + + -- iterate through table in reverse order to allow removal + while idx > 0 do + local self = timers[ idx ] + + if curtime >= self.exptime then + self.counter = self.counter + 1 + self.overrun = curtime - self.exptime + self.exptime = curtime + self.form.timeout + + self.form.newtime = math.floor( curtime ) + self.form.on_close( self.form.meta, self.form.player, { quit = minetest.FORMSPEC_SIGTIME } ) + + self.overrun = 0.0 + end + idx = idx - 1 + end + end ) +end + +----------------------------------------------------------------- +-- override node registrations for attached formspecs +----------------------------------------------------------------- + +local on_rightclick = function( pos, node, player ) + -- should be passing meta to on_open( ) and on_close( ) as first param? + -- local meta = { pos = pos, node = node } + local formspec = minetest.registered_nodes[ node.name ].on_open( pos, player ) + + if formspec then + local player_name = player:get_player_name( ) + minetest.create_form( pos, player_name, formspec, minetest.registered_nodes[ node.name ].on_close ) + afs.forms[ player_name ].origin = node.name + end +end + +local old_register_node = minetest.register_node +local old_override_item = minetest.override_item + +minetest.register_node = function ( name, def ) + if def.on_open and not def.on_rightclick then + def.on_rightclick = on_rightclick + end + old_register_node( name, def ) +end + +minetest.override_item = function ( name, def ) + if minetest.registered_nodes[ name ] and def.on_open then + def.on_rightclick = on_rightclick + end + old_override_item( name, def ) +end + +----------------------------------------------------------------- +-- trigger callbacks during formspec events +----------------------------------------------------------------- + +minetest.register_on_player_receive_fields( function( player, formname, fields ) + local player_name = player:get_player_name( ) + local form = afs.forms[ player_name ] + + -- perform a basic sanity check, since these shouldn't technically occur + if not form or player ~= form.player or formname ~= form.name then return end + + form.newtime = os.time( ) + form.on_close( form.meta, form.player, fields ) + + -- end current session when closing formspec + if fields.quit then + minetest.get_form_timer( player_name ).stop( ) + + afs.stats:on_close( ) + afs.forms[ player_name ] = nil + end +end ) + +----------------------------------------------------------------- +-- expose timer functionality within a helper object +----------------------------------------------------------------- + +minetest.get_form_timer = function ( player_name, form_name ) + local self = { } + local form = afs.forms[ player_name ] + + if not form or form_name and form_name ~= form.name then return end + + self.start = function ( timeout ) + if not form.timeout and timeout >= 0.5 then + local curtime = afs.get_uptime( ) + + form.timeout = timeout + table.insert( afs.timers, { form = form, counter = 0, oldtime = curtime, exptime = curtime + timeout, overrun = 0.0 } ) + end + end + self.stop = function ( ) + if not form.timeout then return end + + form.timeout = nil + + for i, v in ipairs( afs.timers ) do + if v.form == form then + table.remove( afs.timers, i ) + return + end + end + end + self.get_state = function ( ) + if not form.timeout then return end + + for i, v in ipairs( afs.timers ) do + local curtime = afs.get_uptime( ) + + if v.form == form then + return { elapsed = curtime - v.oldtime, remain = v.exptime - curtime, overrun = v.overrun, counter = v.counter } + end + end + end + + return self +end + +----------------------------------------------------------------- +-- open detached formspec with session-based state table +----------------------------------------------------------------- + +minetest.create_form = function ( meta, player_name, formspec, on_close ) + -- short circuit whenever required params are missing + if not player_name or not formspec or not on_close then return end + + if type( player_name ) ~= "string" then + player_name = player_name:get_player_name( ) + end + + local form = afs.forms[ player_name ] + + -- trigger previous callback before formspec closure + if form then + minetest.get_form_timer( player_name, form.name ).stop( ) + form.on_close( form.meta, form.player, { quit = minetest.FORMSPEC_SIGPROC } ) + afs.stats:on_close( ) + end + + -- start new session when opening formspec + afs.session_id = afs.session_id + 1 + + form = { } + form.id = afs.session_id + form.name = minetest.get_password_hash( player_name, afs.session_seed + afs.session_id ) + form.player = minetest.get_player_by_name( player_name ) + form.origin = string.match( debug.getinfo( 2 ).source, "^@.*[/\\]mods[/\\](.-)[/\\]" ) or "?" + form.on_close = on_close + form.meta = meta or { } + form.oldtime = math.floor( afs.get_uptime( ) ) + form.newtime = form.oldtime + + -- hidden elements only provide default, initial values + -- for state table and are always stripped afterward + formspec = string.gsub( formspec, "hidden%[(.-);(.-)%]", function( key, value ) + if form.meta[ key ] == nil then + local data, type = string.match( value, "^(.-);(.-)$" ) + + -- parse according to specified data type + if type == "string" or type == "" then + form.meta[ key ] = data + elseif type == "number" then + form.meta[ key ] = tonumber( data ) + elseif type == "boolean" then + form.meta[ key ] = ( { ["1"] = true, ["0"] = false, ["true"] = true, ["false"] = false } )[ data ] + elseif type == nil then + form.meta[ key ] = value -- default to string, if no data type specified + end + end + return "" -- strip hidden elements prior to showing formspec + end ) + + afs.forms[ player_name ] = form + afs.stats:on_open( ) + minetest.show_formspec( player_name, form.name, formspec ) + + return form.name +end + +minetest.update_form = function ( player, formspec ) + local pname = type( player ) == "string" and player or player:get_player_name( ) + local form = afs.forms[ pname ] + + if form then + minetest.show_formspec( pname, form.name, formspec ) + end +end + +minetest.destroy_form = function ( player ) + local pname = type( player ) == "string" and player or player:get_player_name( ) + local form = afs.forms[ pname ] + + if form then + minetest.close_formspec( pname, form.name ) + minetest.get_form_timer( pname ):stop( ) + + form.on_close( form.meta, form.player, { quit = minetest.FORMSPEC_SIGPROC } ) + + afs.stats:on_close( ) + afs.forms[ pname ] = nil + end +end + +----------------------------------------------------------------- +-- trigger callbacks after unexpected formspec closure +----------------------------------------------------------------- + +minetest.register_on_leaveplayer( function( player, is_timeout ) + local pname = player:get_player_name( ) + local form = afs.forms[ pname ] + + if form then + minetest.get_form_timer( pname, form.name ).stop( ) + + form.newtime = os.time( ) + form.on_close( form.meta, form.player, { quit = minetest.FORMSPEC_SIGQUIT } ) + + afs.stats:on_close( ) + afs.forms[ pname ] = nil + end +end ) + +minetest.register_on_dieplayer( function( player ) + local pname = player:get_player_name( ) + local form = afs.forms[ pname ] + + if form then + minetest.get_form_timer( pname, form.name ).stop( ) + + form.newtime = os.time( ) + form.on_close( form.meta, form.player, { quit = minetest.FORMSPEC_SIGKILL } ) + + afs.stats:on_close( ) + afs.forms[ pname ] = nil + end +end ) + +minetest.register_on_shutdown( function( ) + for _, form in pairs( afs.forms ) do + minetest.get_form_timer( form.player:get_player_name( ), form.name ).stop( ) + + form.newtime = os.time( ) + form.on_close( form.meta, form.player, { quit = minetest.FORMSPEC_SIGTERM } ) + + afs.stats:on_close( ) + end + afs.forms = { } +end ) + +----------------------------------------------------------------- +-- display realtime information about form sessions +----------------------------------------------------------------- + +minetest.register_chatcommand( "fs", { + description = "Display realtime information about form sessions", + privs = { server = true }, + func = function( pname, param ) + local page_idx = 1 + local page_size = 10 + local sorted_forms + + local get_sorted_forms = function( ) + local f = { } + for k, v in pairs( afs.forms ) do + table.insert( f, v ) + end + table.sort( f, function( a, b ) return a.id < b.id end ) + return f + end + local get_formspec = function( ) + local uptime = math.floor( afs.get_uptime( ) ) + + local formspec = "size[9.5,7.5]" + .. default.gui_bg + .. default.gui_bg_img + + .. "label[0.1,6.7;ActiveFormspecs v2.4]" + .. string.format( "label[0.1,0.0;%s]label[0.1,0.5;%d min %02d sec]", + minetest.colorize( "#888888", "uptime:" ), math.floor( uptime / 60 ), uptime % 60 ) + .. string.format( "label[5.6,0.0;%s]label[5.6,0.5;%d]", + minetest.colorize( "#888888", "active" ), afs.stats.active ) + .. string.format( "label[6.9,0.0;%s]label[6.9,0.5;%d]", + minetest.colorize( "#888888", "opened" ), afs.stats.opened ) + .. string.format( "label[8.2,0.0;%s]label[8.2,0.5;%d]", + minetest.colorize( "#888888", "closed" ), afs.stats.closed ) + + .. string.format( "label[0.5,1.5;%s]label[3.5,1.5;%s]label[6.9,1.5;%s]label[8.2,1.5;%s]", + minetest.colorize( "#888888", "player" ), + minetest.colorize( "#888888", "origin" ), + minetest.colorize( "#888888", "idletime" ), + minetest.colorize( "#888888", "lifetime" ) + ) + + .. "box[0,1.2;9.2,0.1;#111111]" + .. "box[0,6.2;9.2,0.1;#111111]" + + local num = 0 + for idx = ( page_idx - 1 ) * page_size + 1, math.min( page_idx * page_size, #sorted_forms ) do + local form = sorted_forms[ idx ] + + local player_name = form.player:get_player_name( ) + local lifetime = uptime - form.oldtime + local idletime = uptime - form.newtime + + local vert = 2.0 + num * 0.5 + + formspec = formspec + .. string.format( "button[0.1,%0.1f;0.5,0.3;del:%s;x]", vert + 0.1, player_name ) + .. string.format( "label[0.5,%0.1f;%s]", vert, player_name ) + .. string.format( "label[3.5,%0.1f;%s]", vert, form.origin ) + .. string.format( "label[6.9,%0.1f;%dm %02ds]", vert, math.floor( idletime / 60 ), idletime % 60 ) + .. string.format( "label[8.2,%0.1f;%dm %02ds]", vert, math.floor( lifetime / 60 ), lifetime % 60 ) + num = num + 1 + end + + formspec = formspec + .. "button[6.4,6.5;1,1;prev;<<]" + .. string.format( "label[7.4,6.7;%d of %d]", page_idx, math.max( 1, math.ceil( #sorted_forms / page_size ) ) ) + .. "button[8.4,6.5;1,1;next;>>]" + + return formspec + end + local on_close = function( meta, player, fields ) + if fields.quit == minetest.FORMSPEC_SIGTIME then + sorted_forms = get_sorted_forms( ) + minetest.update_form( pname, get_formspec( ) ) + + elseif fields.prev and page_idx > 1 then + page_idx = page_idx - 1 + minetest.update_form( pname, get_formspec( ) ) + + elseif fields.next and page_idx < #sorted_forms / page_size then + page_idx = page_idx + 1 + minetest.update_form( pname, get_formspec( ) ) + + else + local player_name = string.match( next( fields, nil ), "del:(.+)" ) + if player_name and afs.forms[ player_name ] then + minetest.destroy_form( player_name ) + end + end + end + + sorted_forms = get_sorted_forms( ) + + minetest.create_form( nil, pname, get_formspec( ), on_close ) + minetest.get_form_timer( pname ).start( 1 ) + + return true + end, +} ) diff --git a/mods/Other/formspecs/mod.conf b/mods/Other/formspecs/mod.conf new file mode 100644 index 0000000..30b2874 --- /dev/null +++ b/mods/Other/formspecs/mod.conf @@ -0,0 +1,4 @@ +name = formspecs +title = ActiveFormspecs +author = sorcerykid +license = MIT diff --git a/mods/Other/formspecs/samples.lua b/mods/Other/formspecs/samples.lua new file mode 100644 index 0000000..1453660 --- /dev/null +++ b/mods/Other/formspecs/samples.lua @@ -0,0 +1,96 @@ +------------------------------------------------------------------------------------------- +-- How to try this example: +-- 1) Move this file into a new "afs_test" directory under mods and rename it "init.lua". +-- 2) Create a "depends.txt" file in the new directory with the following lines of text: +-- nyancat +-- formspecs +-- 3) Launch your Minetest server and enable the "afs_test" mod. Then, login as usual! +------------------------------------------------------------------------------------------- + +minetest.register_privilege( "uptime", "View the uptime of the server interactively" ) + +local get_nyancat_formspec = function( meta ) + local uptime = minetest.get_server_uptime( ) + local formspec = "size[4,3]" + .. default.gui_bg_img + .. string.format( "label[0.5,0.5;%s %0.1f %s]", + minetest.colorize( "#FFFF00", "Server Uptime:" ), + meta.is_minutes == true and uptime / 60 or uptime, + meta.is_minutes == true and "mins" or "secs" + ) + .. "checkbox[0.5,1;is_minutes;Show Minutes;" .. tostring( meta.is_minutes ) .. "]" + .. "button[0.5,2;2.5,1;update;Refresh]" + .. "hidden[view_count;1;number]" + .. "hidden[view_limit;10;number]" -- limit the number of refreshes! + return formspec +end + +minetest.override_item( "nyancat:nyancat", { + description = "System Monitor", + + on_open = function( meta, player ) + local player_name = player:get_player_name( ) + + if meta.is_minutes == nil then meta.is_minutes = true end + + if minetest.check_player_privs( player, "uptime" ) then + return get_nyancat_formspec( meta ) + else + minetest.chat_send_player( player_name, "Your privileges are insufficient." ) + end + end, + on_close = function( meta, player, fields ) + local player_name = player:get_player_name( ) + + if not minetest.check_player_privs( player, "uptime" ) then return end + + if fields.update then + if meta.view_count == meta.view_limit then + minetest.destroy_form( player_name ) + minetest.chat_send_player( player_name, "You've exceeded the refresh limit." ) + else + meta.view_count = meta.view_count + 1 + minetest.update_form( player_name, get_nyancat_formspec( meta ) ) + end + + elseif fields.is_minutes then + meta.is_minutes = fields.is_minutes == "true" + minetest.update_form( player_name, get_nyancat_formspec( meta ) ) + end + end +} ) + +minetest.register_chatcommand( "uptime", { + description = "View the uptime of the server interactively", + func = function( player_name, param ) + local is_refresh = true + + local get_formspec = function( ) + local uptime = minetest.get_server_uptime( ) + + local formspec = "size[4,2]" + .. default.gui_bg_img + .. string.format( "label[0.5,0.5;%s %d secs]", + minetest.colorize( "#FFFF00", "Server Uptime:" ), uptime + ) + .. "checkbox[0.5,1;is_refresh;Auto Refresh;" .. tostring( is_refresh ) .. "]" + return formspec + end + local on_close = function( meta, player, fields ) + if fields.quit == minetest.FORMSPEC_SIGTIME then + minetest.update_form( player_name, get_formspec( ) ) + + elseif fields.is_refresh then + is_refresh = fields.is_refresh == "true" + if is_refresh == true then + minetest.get_form_timer( player_name ).start( 1 ) + else + minetest.get_form_timer( player_name ).stop( ) + end + end + end + + minetest.create_form( nil, player_name, get_formspec( ), on_close ) + minetest.get_form_timer( player_name ).start( 1 ) + end +} ) diff --git a/mods/Other/modpack.txt b/mods/Other/modpack.txt new file mode 100644 index 0000000..e69de29 diff --git a/mods/Other/nokill/init.lua b/mods/Other/nokill/init.lua new file mode 100644 index 0000000..c39f383 --- /dev/null +++ b/mods/Other/nokill/init.lua @@ -0,0 +1,34 @@ +-- Prevent certain players from killing / PvP + +minetest.register_privilege("nokill", "Per-player hit prevention") + +-- The admin always has all privileges, including the hit prevention +-- so we track the admin as a special case +local ADMIN = minetest.setting_get("name") + +local ALLOWPUNCH = false +local DENYPUNCH = true + +minetest.register_on_punchplayer(function(target, hitter, time_from_last_punch, tool_capabilities, dir, damage) + if not hitter:is_player() then + return ALLOWPUNCH + end + + local hittername = hitter:get_player_name() + + local preventkill = minetest.check_player_privs(hitter:get_player_name(), {nokill=true}) + local isplayer = target:is_player() + + return isplayer and preventkill and hittername ~= ADMIN +end) + +--[[ Truth study + + PLAYER NOKILL-on DENY + true true true + false true false + true false false + false false false + + Operation: AND +--]] diff --git a/mods/Other/worldedge/README.md b/mods/Other/worldedge/README.md new file mode 100644 index 0000000..cebff04 --- /dev/null +++ b/mods/Other/worldedge/README.md @@ -0,0 +1,13 @@ +worldedge +========= + +A Minetest Mod that teleports you to the other side of the map when you reach its edge. +This gives the illusion that that world is round and you can walk all the way around. + +You can change the worlds edge by changing the first variable in init.lua + local edge = 30000 + +License of code: DWYWPL + +Written by Amaz +Modified by Don diff --git a/mods/Other/worldedge/depends.txt b/mods/Other/worldedge/depends.txt new file mode 100644 index 0000000..e69de29 diff --git a/mods/Other/worldedge/description.txt b/mods/Other/worldedge/description.txt new file mode 100644 index 0000000..1672213 --- /dev/null +++ b/mods/Other/worldedge/description.txt @@ -0,0 +1 @@ +Allows you to limit the size of your world. diff --git a/mods/Other/worldedge/init.lua b/mods/Other/worldedge/init.lua new file mode 100644 index 0000000..2dd3291 --- /dev/null +++ b/mods/Other/worldedge/init.lua @@ -0,0 +1,147 @@ +-------------- +-- TODO: Check for terrain height + +-- Defines the edge of a world +local edge = tonumber(minetest.settings:get("world_edge")) or 30000 +-- Radius which should be checked for a good teleportation place +local radius = 2 +-------------- + +if minetest.settings:get_bool("log_mods") then + minetest.log("action", "World edge: " .. edge) +end + +local count = 0 +local waiting_list = {} +--[[ Explanation of waiting_list table + Index = Player name + Value = { + player = Player to teleport + pos = Destination + obj = Attacked entity + notified = When the player must wait longer... + } +]] + +minetest.register_globalstep(function(dtime) + count = count + dtime + if count < 3 then + return + end + count = 0 + + for k, v in pairs(waiting_list) do + if v.player and v.player:is_player() then + local pos = get_surface_pos(v.pos) + if pos then + v.obj:setpos(pos) + minetest.after(0.2, function(p, o) + p:set_detach() + o:remove() + end, v.player, v.obj) + waiting_list[k] = nil + elseif not v.notified then + v.notified = true + minetest.chat_send_player(k, "Sorry, we have not found a free place yet. Please be patient.") + end + else + v.obj:remove() + waiting_list[k] = nil + end + end + + local newedge = edge - 5 + -- Check if the players are near the edge and teleport them + local players = minetest.get_connected_players() + for i, player in ipairs(players) do + local name = player:get_player_name() + if not waiting_list[name] then + local pos = vector.round(player:getpos()) + local newpos = nil + if pos.x >= edge then + newpos = {x = -newedge, y = 10, z = pos.z} + elseif pos.x <= -edge then + newpos = {x = newedge, y = 10, z = pos.z} + end + + if pos.z >= edge then + newpos = {x = pos.x, y = 10, z = -newedge} + elseif pos.z <= -edge then + newpos = {x = pos.x, y = 10, z = newedge} + end + + -- Teleport the player + if newpos then + minetest.chat_send_player(name, "Please wait a few seconds. We will teleport you soon.") + local obj = minetest.add_entity(newpos, "worldedge:lock") + player:set_attach(obj, "", {x=0, y=0, z=0}, {x=0, y=0, z=0}) + waiting_list[name] = { + player = player, + pos = newpos, + obj = obj + } + obj:setpos(newpos) + end + end + end +end) + +function get_surface_pos(pos) + local minp = { + x = pos.x - radius - 1, + y = -10, + z = pos.z - radius - 1 + } + local maxp = { + x = pos.x + radius - 1, + y = 50, + z = pos.z + radius - 1 + } + + local c_air = minetest.get_content_id("air") + local c_ignore = minetest.get_content_id("ignore") + + local vm = minetest.get_voxel_manip() + local emin, emax = vm:read_from_map(minp, maxp) + local area = VoxelArea:new{MinEdge = emin, MaxEdge = emax} + local data = vm:get_data() + + local seen_air = false + local deepest_place = vector.new(pos) + deepest_place.y = 50 + + for x = minp.x, maxp.x do + for z = minp.z, maxp.z do + local solid = 0 + for y = deepest_place.y, -10, -1 do + local node = data[area:index(x, y, z)] + if y < deepest_place.y and node == c_air then + deepest_place = vector.new(x, y, z) + seen_air = true + end + if solid > 5 then + -- Do not find caves! + break + end + if node ~= c_air and node ~= c_ignore then + solid = solid + 1 + end + end + end + end + + if seen_air then + return deepest_place + else + return false + end +end + +minetest.register_entity("worldedge:lock", { + initial_properties = { + is_visible = false + }, + on_activate = function(staticdata, dtime_s) + --self.object:set_armor_groups({immortal = 1}) + end +}) diff --git a/mods/Other/worldedge/licence.txt b/mods/Other/worldedge/licence.txt new file mode 100644 index 0000000..f50419b --- /dev/null +++ b/mods/Other/worldedge/licence.txt @@ -0,0 +1,13 @@ +DO WHAT YOU WANT TO PUBLIC LICENSE +or abbreviated DWYWPL + +December 2nd 2015 +License Copyright (C) 2015 Michael Tomaino (PlatinumArts@gmail.com) +www.sandboxgamemaker.com/DWYWPL/ + +DO WHAT YOU WANT TO PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +1. You are allowed to do whatever you want to with what content is using this license. +2. This content is provided 'as-is', without any express or implied warranty. In no event +will the authors be held liable for any damages arising from the use of this content. diff --git a/mods/Other/worldedge/mod.conf b/mods/Other/worldedge/mod.conf new file mode 100644 index 0000000..ed5ed80 --- /dev/null +++ b/mods/Other/worldedge/mod.conf @@ -0,0 +1 @@ +name = worldedge diff --git a/mods/Other/worldedge/screenshot.png b/mods/Other/worldedge/screenshot.png new file mode 100644 index 0000000..4c5a208 Binary files /dev/null and b/mods/Other/worldedge/screenshot.png differ diff --git a/mods/Player/character_creator/TextureTutorial.png b/mods/Player/character_creator/TextureTutorial.png new file mode 100644 index 0000000..80da43a Binary files /dev/null and b/mods/Player/character_creator/TextureTutorial.png differ diff --git a/mods/Player/character_creator/depends.txt b/mods/Player/character_creator/depends.txt new file mode 100644 index 0000000..b3d8d7c --- /dev/null +++ b/mods/Player/character_creator/depends.txt @@ -0,0 +1,5 @@ +3d_armor? +multiskin? +inventory_plus? +unified_inventory? +skinsdb? diff --git a/mods/Player/character_creator/description.txt b/mods/Player/character_creator/description.txt new file mode 100644 index 0000000..8697957 --- /dev/null +++ b/mods/Player/character_creator/description.txt @@ -0,0 +1 @@ +Allows the creation of customized character skins inside the game. \ No newline at end of file diff --git a/mods/Player/character_creator/init.lua b/mods/Player/character_creator/init.lua new file mode 100644 index 0000000..a29c259 --- /dev/null +++ b/mods/Player/character_creator/init.lua @@ -0,0 +1,379 @@ +character_creator = {} +character_creator.skins = dofile(minetest.get_modpath("character_creator") .. "/skins.lua") + +local skinsdb +if minetest.get_modpath("skinsdb") and minetest.global_exists("skins") then + skinsdb = skins +end + +local skin_default = { + gender = "Male", + height = 4, + width = 4, + face = "eyesblack.png", + skin = "skinwhite.png", + tshirt = "shirtwhite.png", + shoes = "hairblack.png", + pants = "pantsblue.png", +} + +local skins = character_creator.skins +local skins_array = {} + +minetest.after(0, function() + local function associative_to_array(associative) + local array = {} + for key in pairs(associative) do + table.insert(array, key) + end + return array + end + + skins_array = { + skin = associative_to_array(skins.skin), + tshirt = associative_to_array(skins.tshirt), + shoes = associative_to_array(skins.shoes), +pants = associative_to_array(skins.pants), +face = associative_to_array(skins.face), + + } +end) + +-- Saved skins_array indexes in this +local skin_indexes = {} + +local function show_formspec(player) +local indexes = skin_indexes[player] + +local formspec = "size[8,7.5]" + +.. default.gui_bg +.. default.gui_bg_img +.. "" + + -- Skin + +.. "image_button[3.5,1;1,1;gui_hotbar_selected.png^".. skins_array.skin[indexes.skin]..";skin;]" +.. "image_button[1.5,1;1,1;gui_hotbar_selected.png^gauche.png;skin_back;]" +.. "image_button[5.5,1;1,1;gui_hotbar_selected.png^droite.png;skin_next;]" + + -- Eyes + +.. "image_button[3.5,2;1,1;gui_hotbar_selected.png^".. skins_array.face[indexes.face]..";face;]" +.. "image_button[1.5,2;1,1;gui_hotbar_selected.png^gauche.png;face_back;]" +.. "image_button[5.5,2;1,1;gui_hotbar_selected.png^droite.png;face_next;]" + + -- T-Shirt + +.. "image_button[3.5,3;1,1;gui_hotbar_selected.png^".. skins_array.tshirt[indexes.tshirt]..";tshirt;]" +.. "image_button[1.5,3;1,1;gui_hotbar_selected.png^gauche.png;tshirt_back;]" +.. "image_button[5.5,3;1,1;gui_hotbar_selected.png^droite.png;tshirt_next;]" + + -- Pants + +.. "image_button[3.5,4;1,1;gui_hotbar_selected.png^".. skins_array.pants[indexes.pants]..";pants;]" +.. "image_button[1.5,4;1,1;gui_hotbar_selected.png^gauche.png;pants_back;]" +.. "image_button[5.5,4;1,1;gui_hotbar_selected.png^droite.png;pants_next;]" + + -- Shoes + +.. "image_button[3.5,5;1,1;gui_hotbar_selected.png^".. skins_array.shoes[indexes.shoes]..";shoes;]" +.. "image_button[1.5,5;1,1;gui_hotbar_selected.png^gauche.png;shoes_back;]" +.. "image_button[5.5,5;1,1;gui_hotbar_selected.png^droite.png;shoes_next;]" + + -- Done + +.. "image_button_exit[1.0,6.5;2,1;gui_hotbar_selected.png;main;Back to Game]" + + minetest.show_formspec(player:get_player_name(), "character_creator", formspec) +end + +local function load_skin(player) + skin_indexes[player] = {} + + player:set_attribute("character_creator:gender", skin_default.gender) + player:set_attribute("character_creator:width", skin_default.width) + player:set_attribute("character_creator:height", skin_default.height) + + local function load_data(data_name) + local key = player:get_attribute("character_creator:" .. data_name) + local index = table.indexof(skins_array[data_name], key) + if index == -1 then + index = table.indexof(skins_array[data_name], skin_default[data_name]) + end + + local indexes = skin_indexes[player] + indexes[data_name] = index + end + + load_data("skin") + load_data("tshirt") + load_data("shoes") +load_data("pants") +load_data("face") + +end + +local function save_skin(player) + local function save_data(data_name) + local indexes = skin_indexes[player] + local index = indexes[data_name] + local key = skins_array[data_name][index] + player:set_attribute("character_creator:" .. data_name, key) + end + + save_data("skin") + save_data("tshirt") + save_data("shoes") + save_data("pants") +save_data("face") + +end + +local function get_texture(player) + local indexes = skin_indexes[player] + local texture = "" + local gender = player:get_attribute("character_creator:gender") + + local skin_key = skins_array.skin[indexes.skin] + local skin = skins.skin[skin_key] + texture = texture .. skin + + local tshirt_key = skins_array.tshirt[indexes.tshirt] + local tshirt = skins.tshirt[tshirt_key] + texture = texture .. "^" .. tshirt + + local pants_key = skins_array.pants[indexes.pants] + local pants = skins.pants[pants_key] + texture = texture .. "^" .. pants + + local shoes_key = skins_array.shoes[indexes.shoes] + local shoes = skins.shoes[shoes_key] + texture = texture .. "^" .. shoes + +local face_key = skins_array.face[indexes.face] + local face = skins.face[face_key] + texture = texture .. "^" .. face + + return texture +end + +local function change_skin(player) + local texture = get_texture(player) + + local width = tonumber(player:get_attribute("character_creator:width")) + local height = tonumber(player:get_attribute("character_creator:height")) + + player:set_properties({ + visual_size = { + x = width, + y = height + } + }) + + local name = player:get_player_name() + + if minetest.get_modpath("multiskin") then + multiskin.layers[name].skin = texture + armor:set_player_armor(player) + multiskin:set_player_textures(player, {textures = {texture}}) + elseif minetest.get_modpath("3d_armor") then + armor.textures[name].skin = texture + armor:set_player_armor(player) + else + player:set_properties({textures = {texture}}) + end + + save_skin(player) +end + +if skinsdb then + --change skin redefinition for skinsdb + function change_skin(player) + local playername = player:get_player_name() + local skinname = "character_creator:"..playername + local skin_obj = skinsdb.get(skinname) or skinsdb.new(skinname) + skin_obj:set_meta("format", "1.0") + skin_obj:set_meta("visual_size_x", tonumber(player:get_attribute("character_creator:width"))) + skin_obj:set_meta("visual_size_y", tonumber(player:get_attribute("character_creator:height"))) + skin_obj:apply_skin_to_player(player) + skinsdb.assign_player_skin(player, "character_creator:"..playername) + save_skin(player) + end +end + +minetest.register_on_joinplayer(function(player) + load_skin(player) + if skinsdb then + local playername = player:get_player_name() + local skinname = "character_creator:"..playername + local skin_obj = skinsdb.get(skinname) or skinsdb.new(skinname) + -- redefinitions + function skin_obj:set_skin(player) + if not player or not skin_indexes[player] then + return -- not loaded or disconnected + end + change_skin(player) + show_formspec(player) + end + function skin_obj:get_texture() + return get_texture(minetest.get_player_by_name(self:get_meta("playername"))) + end + + -- set data + skin_obj:set_preview("inventory_plus_character_creator.png") + skin_obj:set_meta("name","Character Creator") + --skin_obj:set_meta("author", "???") + skin_obj:set_meta("license", "MIT / CC-BY-SA 3.0 Unported") + skin_obj:set_meta("playername",playername) + --check if active and start the update (avoid race condition for both register_on_joinplayer) + if skinsdb.get_player_skin(player):get_key() == skinname then + minetest.after(0, change_skin, player) + end + else + minetest.after(0, change_skin, player) + end +end) + +minetest.register_on_leaveplayer(function(player) + if skinsdb then + local skinname = "character_creator:"..player:get_player_name() + skinsdb.meta[skinname] = nil + end + skin_indexes[player] = nil +end) + +local skin_temp = {} +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "character_creator" then + return + end + + local indexes = skin_indexes[player] + if not skin_temp[player] then + skin_temp[player] = { + gender = player:get_attribute("character_creator:gender"), + width = player:get_attribute("character_creator:width"), + height = player:get_attribute("character_creator:height"), + indexes = table.copy(indexes) + } + end + + -- Gender + do + if fields.male then + player:set_attribute("character_creator:gender", "Male") + player:set_attribute("character_creator:width", 4) + player:set_attribute("character_creator:height", 4) + end + + if fields.female then + player:set_attribute("character_creator:gender", "Female") + player:set_attribute("character_creator:width", 4) + player:set_attribute("character_creator:height", 4) + end + end + + -- Height + do + local height = tonumber(player:get_attribute("character_creator:height")) + + if fields.taller and height < 1.25 then + player:set_attribute("character_creator:height", height + 0.05) + end + + if fields.shorter and height > 0.75 then + player:set_attribute("character_creator:height", height - 0.05) + end + end + + -- Width + do + local width = tonumber(player:get_attribute("character_creator:width")) + + if fields.wider and width < 1.25 then + player:set_attribute("character_creator:width", width + 0.05) + end + + if fields.thinner and width > 0.75 then + player:set_attribute("character_creator:width", width - 0.05) + end + end + + -- Switch skin + do + local function switch_skin(data_name, next_index) + local index = indexes[data_name] + next_index + local max = #skins_array[data_name] + + if index == 0 then + index = max + elseif index == (max + 1) then + index = 1 + end + + indexes[data_name] = index + end + + for field in pairs(fields) do + if field:find("_back$") then + local data_name = field:match("(.+)_back$") + switch_skin(data_name, -1) + elseif field:find("_next$") then + local data_name = field:match("(.+)_next$") + switch_skin(data_name, 1) + end + end + end + + -- Close or update + do + local quit = false + + if fields.cancel then + local temp = skin_temp[player] + player:set_attribute("character_creator:gender", temp.gender) + player:set_attribute("character_creator:width", temp.width) + player:set_attribute("character_creator:height", temp.height) + skin_indexes[player] = table.copy(temp.indexes) + skin_temp[player] = nil + quit = true + elseif fields.quit then + skin_temp[player] = nil + quit = true + end + + if not quit then + show_formspec(player) + end + end + change_skin(player) +end) + +minetest.register_chatcommand("skin", { + func = function(name) + minetest.after(0.5, function() + local player = minetest.get_player_by_name(name) + if player then + show_formspec(player) + end + end) + end +}) + +if minetest.global_exists("unified_inventory") then + unified_inventory.register_button("character_creator", { + type = "image", + image = "inventory_plus_character_creator.png", + action = show_formspec + }) +elseif minetest.global_exists("inventory_plus") then + minetest.register_on_joinplayer(function(player) + inventory_plus.register_button(player, "character_creator", "Skin") + end) + minetest.register_on_player_receive_fields(function(player, _, fields) + if fields.character_creator then + show_formspec(player) + end + end) + end diff --git a/mods/Player/character_creator/license.txt b/mods/Player/character_creator/license.txt new file mode 100644 index 0000000..3fe225c --- /dev/null +++ b/mods/Player/character_creator/license.txt @@ -0,0 +1,52 @@ +License of source code +---------------------- + +MIT License + +Copyright (c) 2017 Rui + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +License of textures +-------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) + +Copyright (C) 2017 Voxelands http://www.voxelands.com/ +Copyright (C) 2017 darkrose +Copyright (C) 2017 sdzen + +You are free to: +Share - copy and redistribute the material in any medium or format +Adapt - remix, transform, and build upon the material +for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: +Attribution - You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. +ShareAlike - If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. +No additional restrictions - You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. + +Notices: +You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ \ No newline at end of file diff --git a/mods/Player/character_creator/mod.conf b/mods/Player/character_creator/mod.conf new file mode 100644 index 0000000..a01ea61 --- /dev/null +++ b/mods/Player/character_creator/mod.conf @@ -0,0 +1 @@ +name = character_creator \ No newline at end of file diff --git a/mods/Player/character_creator/readme.md b/mods/Player/character_creator/readme.md new file mode 100644 index 0000000..20b73b0 --- /dev/null +++ b/mods/Player/character_creator/readme.md @@ -0,0 +1,5 @@ +This mod is attributed to the Voxelands project. + +Voxelands creators: +sdzen +darkrose \ No newline at end of file diff --git a/mods/Player/character_creator/skins.lua b/mods/Player/character_creator/skins.lua new file mode 100644 index 0000000..421dd82 --- /dev/null +++ b/mods/Player/character_creator/skins.lua @@ -0,0 +1,62 @@ +return { + + skin = { + + ["skinwhite.png"] = "cc_skin_white.png", + ["skinblack.png"] = "cc_skin_black.png", + + }, + +face = { + +["eyeswhite.png"] = "eyes_white.png", +["eyesblack.png"] = "eyes_black.png", +["eyesred.png"] = "eyes_red.png", +["eyesblue.png"] = "eyes_blue.png", +["eyesyellow.png"] = "eyes_yellow.png", +["eyesorange.png"] = "eyes_orange.png", +["eyesgreen.png"] = "eyes_green.png", +["eyespink.png"] = "eyes_pink.png", + + }, + +tshirt = { + +["shirtblack.png"] = "shirt_black.png", +["shirtblue.png"] = "shirt_blue.png", +["shirtgreen.png"] = "shirt_green.png", +["shirtwhite.png"] = "shirt_white.png", +["shirtorange.png"] = "shirt_orange.png", +["shirtred.png"] = "shirt_red.png", +["shirtyellow.png"] = "shirt_yellow.png", +["shirtpink.png"] = "shirt_pink.png", + + }, + +pants = { + +["pantswhite.png"] = "pants_white.png", +["pantsblack.png"] = "pants_black.png", +["pantsred.png"] = "pants_red.png", +["pantsblue.png"] = "pants_blue.png", +["pantsyellow.png"] = "pants_yellow.png", +["pantsorange.png"] = "pants_orange.png", +["pantsgreen.png"] = "pants_green.png", +["pantspink.png"] = "pants_pink.png", + + }, + +shoes = { + +["hairwhite.png"] = "hair_white.png", +["hairblack.png"] = "hair_black.png", +["hairred.png"] = "hair_red.png", +["hairblue.png"] = "hair_blue.png", +["hairyellow.png"] = "hair_yellow.png", +["hairorange.png"] = "hair_orange.png", +["hairgreen.png"] = "hair_green.png", +["hairpink.png"] = "hair_pink.png", + + }, + +} diff --git a/mods/Player/character_creator/textures/cc_skin_black.png b/mods/Player/character_creator/textures/cc_skin_black.png new file mode 100644 index 0000000..9defc93 Binary files /dev/null and b/mods/Player/character_creator/textures/cc_skin_black.png differ diff --git a/mods/Player/character_creator/textures/cc_skin_white.png b/mods/Player/character_creator/textures/cc_skin_white.png new file mode 100644 index 0000000..cd7441b Binary files /dev/null and b/mods/Player/character_creator/textures/cc_skin_white.png differ diff --git a/mods/Player/character_creator/textures/eyes_black.png b/mods/Player/character_creator/textures/eyes_black.png new file mode 100644 index 0000000..fd623a2 Binary files /dev/null and b/mods/Player/character_creator/textures/eyes_black.png differ diff --git a/mods/Player/character_creator/textures/eyes_blue.png b/mods/Player/character_creator/textures/eyes_blue.png new file mode 100644 index 0000000..f753752 Binary files /dev/null and b/mods/Player/character_creator/textures/eyes_blue.png differ diff --git a/mods/Player/character_creator/textures/eyes_green.png b/mods/Player/character_creator/textures/eyes_green.png new file mode 100644 index 0000000..38a7790 Binary files /dev/null and b/mods/Player/character_creator/textures/eyes_green.png differ diff --git a/mods/Player/character_creator/textures/eyes_orange.png b/mods/Player/character_creator/textures/eyes_orange.png new file mode 100644 index 0000000..9d27663 Binary files /dev/null and b/mods/Player/character_creator/textures/eyes_orange.png differ diff --git a/mods/Player/character_creator/textures/eyes_pink.png b/mods/Player/character_creator/textures/eyes_pink.png new file mode 100644 index 0000000..9e12c3c Binary files /dev/null and b/mods/Player/character_creator/textures/eyes_pink.png differ diff --git a/mods/Player/character_creator/textures/eyes_red.png b/mods/Player/character_creator/textures/eyes_red.png new file mode 100644 index 0000000..2b3fb7e Binary files /dev/null and b/mods/Player/character_creator/textures/eyes_red.png differ diff --git a/mods/Player/character_creator/textures/eyes_white.png b/mods/Player/character_creator/textures/eyes_white.png new file mode 100644 index 0000000..e272f54 Binary files /dev/null and b/mods/Player/character_creator/textures/eyes_white.png differ diff --git a/mods/Player/character_creator/textures/eyes_yellow.png b/mods/Player/character_creator/textures/eyes_yellow.png new file mode 100644 index 0000000..320546a Binary files /dev/null and b/mods/Player/character_creator/textures/eyes_yellow.png differ diff --git a/mods/Player/character_creator/textures/eyesblack.png b/mods/Player/character_creator/textures/eyesblack.png new file mode 100644 index 0000000..8d7146f Binary files /dev/null and b/mods/Player/character_creator/textures/eyesblack.png differ diff --git a/mods/Player/character_creator/textures/eyesblue.png b/mods/Player/character_creator/textures/eyesblue.png new file mode 100644 index 0000000..b9afe15 Binary files /dev/null and b/mods/Player/character_creator/textures/eyesblue.png differ diff --git a/mods/Player/character_creator/textures/eyesgreen.png b/mods/Player/character_creator/textures/eyesgreen.png new file mode 100644 index 0000000..3f3cdec Binary files /dev/null and b/mods/Player/character_creator/textures/eyesgreen.png differ diff --git a/mods/Player/character_creator/textures/eyesorange.png b/mods/Player/character_creator/textures/eyesorange.png new file mode 100644 index 0000000..275d126 Binary files /dev/null and b/mods/Player/character_creator/textures/eyesorange.png differ diff --git a/mods/Player/character_creator/textures/eyespink.png b/mods/Player/character_creator/textures/eyespink.png new file mode 100644 index 0000000..81856f9 Binary files /dev/null and b/mods/Player/character_creator/textures/eyespink.png differ diff --git a/mods/Player/character_creator/textures/eyesred.png b/mods/Player/character_creator/textures/eyesred.png new file mode 100644 index 0000000..d6d3b66 Binary files /dev/null and b/mods/Player/character_creator/textures/eyesred.png differ diff --git a/mods/Player/character_creator/textures/eyeswhite.png b/mods/Player/character_creator/textures/eyeswhite.png new file mode 100644 index 0000000..48cb587 Binary files /dev/null and b/mods/Player/character_creator/textures/eyeswhite.png differ diff --git a/mods/Player/character_creator/textures/eyesyellow.png b/mods/Player/character_creator/textures/eyesyellow.png new file mode 100644 index 0000000..9a9858e Binary files /dev/null and b/mods/Player/character_creator/textures/eyesyellow.png differ diff --git a/mods/Player/character_creator/textures/hair_black.png b/mods/Player/character_creator/textures/hair_black.png new file mode 100644 index 0000000..53650fe Binary files /dev/null and b/mods/Player/character_creator/textures/hair_black.png differ diff --git a/mods/Player/character_creator/textures/hair_blue.png b/mods/Player/character_creator/textures/hair_blue.png new file mode 100644 index 0000000..382c8df Binary files /dev/null and b/mods/Player/character_creator/textures/hair_blue.png differ diff --git a/mods/Player/character_creator/textures/hair_green.png b/mods/Player/character_creator/textures/hair_green.png new file mode 100644 index 0000000..1c2d56e Binary files /dev/null and b/mods/Player/character_creator/textures/hair_green.png differ diff --git a/mods/Player/character_creator/textures/hair_orange.png b/mods/Player/character_creator/textures/hair_orange.png new file mode 100644 index 0000000..e77c65d Binary files /dev/null and b/mods/Player/character_creator/textures/hair_orange.png differ diff --git a/mods/Player/character_creator/textures/hair_pink.png b/mods/Player/character_creator/textures/hair_pink.png new file mode 100644 index 0000000..1fe916c Binary files /dev/null and b/mods/Player/character_creator/textures/hair_pink.png differ diff --git a/mods/Player/character_creator/textures/hair_red.png b/mods/Player/character_creator/textures/hair_red.png new file mode 100644 index 0000000..ab59c9c Binary files /dev/null and b/mods/Player/character_creator/textures/hair_red.png differ diff --git a/mods/Player/character_creator/textures/hair_white.png b/mods/Player/character_creator/textures/hair_white.png new file mode 100644 index 0000000..33a81a3 Binary files /dev/null and b/mods/Player/character_creator/textures/hair_white.png differ diff --git a/mods/Player/character_creator/textures/hair_yellow.png b/mods/Player/character_creator/textures/hair_yellow.png new file mode 100644 index 0000000..0ff1639 Binary files /dev/null and b/mods/Player/character_creator/textures/hair_yellow.png differ diff --git a/mods/Player/character_creator/textures/hairblack.png b/mods/Player/character_creator/textures/hairblack.png new file mode 100644 index 0000000..de0df0b Binary files /dev/null and b/mods/Player/character_creator/textures/hairblack.png differ diff --git a/mods/Player/character_creator/textures/hairblue.png b/mods/Player/character_creator/textures/hairblue.png new file mode 100644 index 0000000..fe05db9 Binary files /dev/null and b/mods/Player/character_creator/textures/hairblue.png differ diff --git a/mods/Player/character_creator/textures/hairgreen.png b/mods/Player/character_creator/textures/hairgreen.png new file mode 100644 index 0000000..63e7b8f Binary files /dev/null and b/mods/Player/character_creator/textures/hairgreen.png differ diff --git a/mods/Player/character_creator/textures/hairorange.png b/mods/Player/character_creator/textures/hairorange.png new file mode 100644 index 0000000..eca3952 Binary files /dev/null and b/mods/Player/character_creator/textures/hairorange.png differ diff --git a/mods/Player/character_creator/textures/hairpink.png b/mods/Player/character_creator/textures/hairpink.png new file mode 100644 index 0000000..c258a3c Binary files /dev/null and b/mods/Player/character_creator/textures/hairpink.png differ diff --git a/mods/Player/character_creator/textures/hairred.png b/mods/Player/character_creator/textures/hairred.png new file mode 100644 index 0000000..cc65f1d Binary files /dev/null and b/mods/Player/character_creator/textures/hairred.png differ diff --git a/mods/Player/character_creator/textures/hairwhite.png b/mods/Player/character_creator/textures/hairwhite.png new file mode 100644 index 0000000..4368765 Binary files /dev/null and b/mods/Player/character_creator/textures/hairwhite.png differ diff --git a/mods/Player/character_creator/textures/hairyellow.png b/mods/Player/character_creator/textures/hairyellow.png new file mode 100644 index 0000000..b650df6 Binary files /dev/null and b/mods/Player/character_creator/textures/hairyellow.png differ diff --git a/mods/Player/character_creator/textures/inventory_plus_character_creator.png b/mods/Player/character_creator/textures/inventory_plus_character_creator.png new file mode 100644 index 0000000..07f7b0e Binary files /dev/null and b/mods/Player/character_creator/textures/inventory_plus_character_creator.png differ diff --git a/mods/Player/character_creator/textures/none.png b/mods/Player/character_creator/textures/none.png new file mode 100644 index 0000000..07f7b0e Binary files /dev/null and b/mods/Player/character_creator/textures/none.png differ diff --git a/mods/Player/character_creator/textures/pants.png b/mods/Player/character_creator/textures/pants.png new file mode 100644 index 0000000..1b48492 Binary files /dev/null and b/mods/Player/character_creator/textures/pants.png differ diff --git a/mods/Player/character_creator/textures/pants_black.png b/mods/Player/character_creator/textures/pants_black.png new file mode 100644 index 0000000..ebe082a Binary files /dev/null and b/mods/Player/character_creator/textures/pants_black.png differ diff --git a/mods/Player/character_creator/textures/pants_blue.png b/mods/Player/character_creator/textures/pants_blue.png new file mode 100644 index 0000000..cd0f83c Binary files /dev/null and b/mods/Player/character_creator/textures/pants_blue.png differ diff --git a/mods/Player/character_creator/textures/pants_green.png b/mods/Player/character_creator/textures/pants_green.png new file mode 100644 index 0000000..8aca301 Binary files /dev/null and b/mods/Player/character_creator/textures/pants_green.png differ diff --git a/mods/Player/character_creator/textures/pants_orange.png b/mods/Player/character_creator/textures/pants_orange.png new file mode 100644 index 0000000..965fa89 Binary files /dev/null and b/mods/Player/character_creator/textures/pants_orange.png differ diff --git a/mods/Player/character_creator/textures/pants_pink.png b/mods/Player/character_creator/textures/pants_pink.png new file mode 100644 index 0000000..2d4a0c4 Binary files /dev/null and b/mods/Player/character_creator/textures/pants_pink.png differ diff --git a/mods/Player/character_creator/textures/pants_red.png b/mods/Player/character_creator/textures/pants_red.png new file mode 100644 index 0000000..ef4db0a Binary files /dev/null and b/mods/Player/character_creator/textures/pants_red.png differ diff --git a/mods/Player/character_creator/textures/pants_white.png b/mods/Player/character_creator/textures/pants_white.png new file mode 100644 index 0000000..ef73426 Binary files /dev/null and b/mods/Player/character_creator/textures/pants_white.png differ diff --git a/mods/Player/character_creator/textures/pants_yellow.png b/mods/Player/character_creator/textures/pants_yellow.png new file mode 100644 index 0000000..f72a027 Binary files /dev/null and b/mods/Player/character_creator/textures/pants_yellow.png differ diff --git a/mods/Player/character_creator/textures/pantsblack.png b/mods/Player/character_creator/textures/pantsblack.png new file mode 100644 index 0000000..250c6cf Binary files /dev/null and b/mods/Player/character_creator/textures/pantsblack.png differ diff --git a/mods/Player/character_creator/textures/pantsblue.png b/mods/Player/character_creator/textures/pantsblue.png new file mode 100644 index 0000000..add0de8 Binary files /dev/null and b/mods/Player/character_creator/textures/pantsblue.png differ diff --git a/mods/Player/character_creator/textures/pantsgreen.png b/mods/Player/character_creator/textures/pantsgreen.png new file mode 100644 index 0000000..59453b3 Binary files /dev/null and b/mods/Player/character_creator/textures/pantsgreen.png differ diff --git a/mods/Player/character_creator/textures/pantsorange.png b/mods/Player/character_creator/textures/pantsorange.png new file mode 100644 index 0000000..9f6528d Binary files /dev/null and b/mods/Player/character_creator/textures/pantsorange.png differ diff --git a/mods/Player/character_creator/textures/pantspink.png b/mods/Player/character_creator/textures/pantspink.png new file mode 100644 index 0000000..134d029 Binary files /dev/null and b/mods/Player/character_creator/textures/pantspink.png differ diff --git a/mods/Player/character_creator/textures/pantsred.png b/mods/Player/character_creator/textures/pantsred.png new file mode 100644 index 0000000..2f0e217 Binary files /dev/null and b/mods/Player/character_creator/textures/pantsred.png differ diff --git a/mods/Player/character_creator/textures/pantswhite.png b/mods/Player/character_creator/textures/pantswhite.png new file mode 100644 index 0000000..1b48492 Binary files /dev/null and b/mods/Player/character_creator/textures/pantswhite.png differ diff --git a/mods/Player/character_creator/textures/pantsyellow.png b/mods/Player/character_creator/textures/pantsyellow.png new file mode 100644 index 0000000..e37ae55 Binary files /dev/null and b/mods/Player/character_creator/textures/pantsyellow.png differ diff --git a/mods/Player/character_creator/textures/shirt_black.png b/mods/Player/character_creator/textures/shirt_black.png new file mode 100644 index 0000000..ff08724 Binary files /dev/null and b/mods/Player/character_creator/textures/shirt_black.png differ diff --git a/mods/Player/character_creator/textures/shirt_blue.png b/mods/Player/character_creator/textures/shirt_blue.png new file mode 100644 index 0000000..6f1ce6e Binary files /dev/null and b/mods/Player/character_creator/textures/shirt_blue.png differ diff --git a/mods/Player/character_creator/textures/shirt_green.png b/mods/Player/character_creator/textures/shirt_green.png new file mode 100644 index 0000000..48ddc17 Binary files /dev/null and b/mods/Player/character_creator/textures/shirt_green.png differ diff --git a/mods/Player/character_creator/textures/shirt_orange.png b/mods/Player/character_creator/textures/shirt_orange.png new file mode 100644 index 0000000..a48611d Binary files /dev/null and b/mods/Player/character_creator/textures/shirt_orange.png differ diff --git a/mods/Player/character_creator/textures/shirt_pink.png b/mods/Player/character_creator/textures/shirt_pink.png new file mode 100644 index 0000000..7fbc23c Binary files /dev/null and b/mods/Player/character_creator/textures/shirt_pink.png differ diff --git a/mods/Player/character_creator/textures/shirt_red.png b/mods/Player/character_creator/textures/shirt_red.png new file mode 100644 index 0000000..cb87321 Binary files /dev/null and b/mods/Player/character_creator/textures/shirt_red.png differ diff --git a/mods/Player/character_creator/textures/shirt_white.png b/mods/Player/character_creator/textures/shirt_white.png new file mode 100644 index 0000000..1c2d6e3 Binary files /dev/null and b/mods/Player/character_creator/textures/shirt_white.png differ diff --git a/mods/Player/character_creator/textures/shirt_yellow.png b/mods/Player/character_creator/textures/shirt_yellow.png new file mode 100644 index 0000000..14f6e5e Binary files /dev/null and b/mods/Player/character_creator/textures/shirt_yellow.png differ diff --git a/mods/Player/character_creator/textures/shirtblack.png b/mods/Player/character_creator/textures/shirtblack.png new file mode 100644 index 0000000..8ab4349 Binary files /dev/null and b/mods/Player/character_creator/textures/shirtblack.png differ diff --git a/mods/Player/character_creator/textures/shirtblue.png b/mods/Player/character_creator/textures/shirtblue.png new file mode 100644 index 0000000..fcee9c6 Binary files /dev/null and b/mods/Player/character_creator/textures/shirtblue.png differ diff --git a/mods/Player/character_creator/textures/shirtgreen.png b/mods/Player/character_creator/textures/shirtgreen.png new file mode 100644 index 0000000..9b4684e Binary files /dev/null and b/mods/Player/character_creator/textures/shirtgreen.png differ diff --git a/mods/Player/character_creator/textures/shirtorange.png b/mods/Player/character_creator/textures/shirtorange.png new file mode 100644 index 0000000..752d727 Binary files /dev/null and b/mods/Player/character_creator/textures/shirtorange.png differ diff --git a/mods/Player/character_creator/textures/shirtpink.png b/mods/Player/character_creator/textures/shirtpink.png new file mode 100644 index 0000000..5fe3164 Binary files /dev/null and b/mods/Player/character_creator/textures/shirtpink.png differ diff --git a/mods/Player/character_creator/textures/shirtred.png b/mods/Player/character_creator/textures/shirtred.png new file mode 100644 index 0000000..a414684 Binary files /dev/null and b/mods/Player/character_creator/textures/shirtred.png differ diff --git a/mods/Player/character_creator/textures/shirtwhite.png b/mods/Player/character_creator/textures/shirtwhite.png new file mode 100644 index 0000000..37ca8be Binary files /dev/null and b/mods/Player/character_creator/textures/shirtwhite.png differ diff --git a/mods/Player/character_creator/textures/shirtyellow.png b/mods/Player/character_creator/textures/shirtyellow.png new file mode 100644 index 0000000..0fe38ef Binary files /dev/null and b/mods/Player/character_creator/textures/shirtyellow.png differ diff --git a/mods/Player/character_creator/textures/skinblack.png b/mods/Player/character_creator/textures/skinblack.png new file mode 100644 index 0000000..2495a13 Binary files /dev/null and b/mods/Player/character_creator/textures/skinblack.png differ diff --git a/mods/Player/character_creator/textures/skinblue.png b/mods/Player/character_creator/textures/skinblue.png new file mode 100644 index 0000000..58a189e Binary files /dev/null and b/mods/Player/character_creator/textures/skinblue.png differ diff --git a/mods/Player/character_creator/textures/skingreen.png b/mods/Player/character_creator/textures/skingreen.png new file mode 100644 index 0000000..579ba54 Binary files /dev/null and b/mods/Player/character_creator/textures/skingreen.png differ diff --git a/mods/Player/character_creator/textures/skinorange.png b/mods/Player/character_creator/textures/skinorange.png new file mode 100644 index 0000000..15e87eb Binary files /dev/null and b/mods/Player/character_creator/textures/skinorange.png differ diff --git a/mods/Player/character_creator/textures/skinpink.png b/mods/Player/character_creator/textures/skinpink.png new file mode 100644 index 0000000..de28261 Binary files /dev/null and b/mods/Player/character_creator/textures/skinpink.png differ diff --git a/mods/Player/character_creator/textures/skinred.png b/mods/Player/character_creator/textures/skinred.png new file mode 100644 index 0000000..9110ecf Binary files /dev/null and b/mods/Player/character_creator/textures/skinred.png differ diff --git a/mods/Player/character_creator/textures/skinwhite.png b/mods/Player/character_creator/textures/skinwhite.png new file mode 100644 index 0000000..b4a1e54 Binary files /dev/null and b/mods/Player/character_creator/textures/skinwhite.png differ diff --git a/mods/Player/character_creator/textures/skinyellow.png b/mods/Player/character_creator/textures/skinyellow.png new file mode 100644 index 0000000..644c863 Binary files /dev/null and b/mods/Player/character_creator/textures/skinyellow.png differ diff --git a/mods/Player/modpack.txt b/mods/Player/modpack.txt new file mode 100644 index 0000000..e69de29 diff --git a/mods/Player/nodrop/README.txt b/mods/Player/nodrop/README.txt new file mode 100644 index 0000000..cbd240f --- /dev/null +++ b/mods/Player/nodrop/README.txt @@ -0,0 +1,8 @@ +Minetest Game mod: give_initial_stuff +===================================== +See license.txt for license information. + +Authors of source code +---------------------- +Perttu Ahola (celeron55) (MIT) +Various Minetest developers and contributors (MIT) diff --git a/mods/Player/nodrop/depends.txt b/mods/Player/nodrop/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/Player/nodrop/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/Player/nodrop/init.lua b/mods/Player/nodrop/init.lua new file mode 100644 index 0000000..7b79030 --- /dev/null +++ b/mods/Player/nodrop/init.lua @@ -0,0 +1,5 @@ +function minetest.item_drop(itemstack, dropper, pos) + +return itemstack + +end \ No newline at end of file diff --git a/mods/Player/nodrop/license.txt b/mods/Player/nodrop/license.txt new file mode 100644 index 0000000..8134c92 --- /dev/null +++ b/mods/Player/nodrop/license.txt @@ -0,0 +1,25 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/Player/sethome/README.txt b/mods/Player/sethome/README.txt new file mode 100644 index 0000000..6f0a282 --- /dev/null +++ b/mods/Player/sethome/README.txt @@ -0,0 +1,7 @@ +Minetest Game mod: sethome +========================== +See license.txt for license information. + +Authors of source code +---------------------- +sfan5 (MIT) diff --git a/mods/Player/sethome/init.lua b/mods/Player/sethome/init.lua new file mode 100644 index 0000000..13a33e5 --- /dev/null +++ b/mods/Player/sethome/init.lua @@ -0,0 +1,97 @@ + +sethome = {} + +local homes_file = minetest.get_worldpath() .. "/homes" +local homepos = {} + +local function loadhomes() + local input = io.open(homes_file, "r") + if not input then + return -- no longer an error + end + + -- Iterate over all stored positions in the format "x y z player" for each line + for pos, name in input:read("*a"):gmatch("(%S+ %S+ %S+)%s([%w_-]+)[\r\n]") do + homepos[name] = minetest.string_to_pos(pos) + end + input:close() +end + +loadhomes() + +sethome.set = function(name, pos) + local player = minetest.get_player_by_name(name) + if not player or not pos then + return false + end + player:set_attribute("sethome:home", minetest.pos_to_string(pos)) + + -- remove `name` from the old storage file + local data = {} + local output = io.open(homes_file, "w") + if output then + homepos[name] = nil + for i, v in pairs(homepos) do + table.insert(data, string.format("%.1f %.1f %.1f %s\n", v.x, v.y, v.z, i)) + end + output:write(table.concat(data)) + io.close(output) + return true + end + return true -- if the file doesn't exist - don't return an error. +end + +sethome.get = function(name) + local player = minetest.get_player_by_name(name) + local pos = minetest.string_to_pos(player:get_attribute("sethome:home")) + if pos then + return pos + end + + -- fetch old entry from storage table + pos = homepos[name] + if pos then + return vector.new(pos) + else + return nil + end +end + +sethome.go = function(name) + local pos = sethome.get(name) + local player = minetest.get_player_by_name(name) + if player and pos then + player:setpos(pos) + return true + end + return false +end + +minetest.register_privilege("home", { + description = "Can use /sethome and /home", + give_to_singleplayer = false +}) + +minetest.register_chatcommand("home", { + description = "Teleport you to your home point", + privs = {home = true}, + func = function(name) + if sethome.go(name) then + return true, "Teleported to home!" + end + return false, "Set a home using /sethome" + end, +}) + +minetest.register_chatcommand("sethome", { + description = "Set your home point", + privs = {home = true}, + func = function(name) + name = name or "" -- fallback to blank name if nil + local player = minetest.get_player_by_name(name) + if player and sethome.set(name, player:getpos()) then + return true, "Home set!" + end + return false, "Player not found!" + end, +}) diff --git a/mods/Player/sethome/license.txt b/mods/Player/sethome/license.txt new file mode 100644 index 0000000..09f03b0 --- /dev/null +++ b/mods/Player/sethome/license.txt @@ -0,0 +1,24 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2014-2016 sfan5 + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT diff --git a/mods/World/default/aliases.lua b/mods/World/default/aliases.lua new file mode 100644 index 0000000..5e932bf --- /dev/null +++ b/mods/World/default/aliases.lua @@ -0,0 +1,22 @@ +-- mods/default/aliases.lua + +-- Aliases to support loading worlds using nodes following the old naming convention +-- These can also be helpful when using chat commands, for example /giveme + +minetest.register_alias("comboblock:slab_white_onc_slab_white", "color:white") +minetest.register_alias("comboblock:slab_black_onc_slab_black", "color:black") +minetest.register_alias("comboblock:slab_red_onc_slab_red", "color:red") +minetest.register_alias("comboblock:slab_pink_onc_slab_pink", "color:pink") +minetest.register_alias("comboblock:slab_green_onc_slab_green", "color:green") +minetest.register_alias("comboblock:slab_yellow_onc_slab_yellow", "color:yellow") +minetest.register_alias("comboblock:slab_blue_onc_slab_blue", "color:blue") +minetest.register_alias("comboblock:slab_orange_onc_slab_orange", "color:orange") + +minetest.register_alias("white", "color:white") +minetest.register_alias("black", "color:black") +minetest.register_alias("red", "color:red") +minetest.register_alias("pink", "color:pink") +minetest.register_alias("green", "color:green") +minetest.register_alias("yellow", "color:yellow") +minetest.register_alias("blue", "color:blue") +minetest.register_alias("orange", "color:orange") diff --git a/mods/World/default/creative.lua b/mods/World/default/creative.lua new file mode 100644 index 0000000..e1e7143 --- /dev/null +++ b/mods/World/default/creative.lua @@ -0,0 +1,83 @@ +creative = {} + +local creative_mode_cache = minetest.settings:get_bool("creative_mode") + +function creative.is_enabled_for(name) + return true +end + +if creative_mode_cache then + -- Dig time is modified according to difference (leveldiff) between tool + -- 'maxlevel' and node 'level'. Digtime is divided by the larger of + -- leveldiff and 1. + -- To speed up digging in creative, hand 'maxlevel' and 'digtime' have been + -- increased such that nodes of differing levels have an insignificant + -- effect on digtime. + local digtime = 42 + local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 256} + + minetest.register_item(":", { + type = "none", + wield_image = "wieldhand.png", + wield_scale = {x = 1, y = 1, z = 2.5}, + range = 10, + tool_capabilities = { + full_punch_interval = 0.5, + max_drop_level = 3, + groupcaps = { + crumbly = caps, + cracky = caps, + snappy = caps, + choppy = caps, + oddly_breakable_by_hand = caps, + }, + damage_groups = {fleshy = 10}, + } + }) + +else + +local digtime = 42 + local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 256} + + minetest.register_item(":", { + type = "none", + wield_image = "wieldhand.png", + wield_scale = {x = 1, y = 1, z = 2.5}, + range = 10, + tool_capabilities = { + full_punch_interval = 0.5, + max_drop_level = 3, + groupcaps = { + crumbly = caps, + cracky = caps, + snappy = caps, + choppy = caps, + oddly_breakable_by_hand = caps, + }, + damage_groups = {fleshy = 10}, + } + }) + +end + +-- Unlimited node placement +minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) + return creative.is_enabled_for(placer:get_player_name()) +end) + +-- Don't pick up if the item is already in the inventory +local old_handle_node_drops = minetest.handle_node_drops +function minetest.handle_node_drops(pos, drops, digger) + if not digger or not digger:is_player() then + return + end + local inv = digger:get_inventory() + if inv then + for _, item in ipairs(drops) do + if not inv:contains_item("main", item, true) then + inv:add_item("main", item) + end + end + end +end diff --git a/mods/World/default/functions.lua b/mods/World/default/functions.lua new file mode 100644 index 0000000..4ddeb17 --- /dev/null +++ b/mods/World/default/functions.lua @@ -0,0 +1,541 @@ +-- mods/default/functions.lua + +-- +-- Sounds +-- + +function default.node_sound_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_footstep_blockcolor", gain = 1.0} + table.dig = table.dig or + {name = "default_dig_blockcolor", gain = 0.25} + table.dug = table.dug or + {name = "default_dug_blockcolor", gain = 0.25} + table.place = table.place or + {name = "default_place_blockcolor", gain = 1.0} + return table +end + +function default.node_sound_water_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_footstep_blockcolor", gain = 1.0} + table.dig = table.dig or + {name = "default_dig_blockcolor", gain = 0.25} + table.dug = table.dug or + {name = "default_dug_blockcolor", gain = 0.25} + table.place = table.place or + {name = "default_place_blockcolor", gain = 1.0} + return table +end + +function default.node_sound_wood_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_footstep_blockcolor", gain = 1.0} + table.dig = table.dig or + {name = "default_dig_blockcolor", gain = 0.25} + table.dug = table.dug or + {name = "default_dug_blockcolor", gain = 0.25} + table.place = table.place or + {name = "default_place_blockcolor", gain = 1.0} + return table +end + +function default.node_sound_glass_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_footstep_blockcolor", gain = 1.0} + table.dig = table.dig or + {name = "default_dig_blockcolor", gain = 0.25} + table.dug = table.dug or + {name = "default_dug_blockcolor", gain = 0.25} + table.place = table.place or + {name = "default_place_blockcolor", gain = 1.0} + return table +end + +function default.node_sound_stone_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_footstep_blockcolor", gain = 1.0} + table.dig = table.dig or + {name = "default_dig_blockcolor", gain = 0.25} + table.dug = table.dug or + {name = "default_dug_blockcolor", gain = 0.25} + table.place = table.place or + {name = "default_place_blockcolor", gain = 1.0} + return table +end + +function default.node_sound_leaves_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_footstep_blockcolor", gain = 1.0} + table.dig = table.dig or + {name = "default_dig_blockcolor", gain = 0.25} + table.dug = table.dug or + {name = "default_dug_blockcolor", gain = 0.25} + table.place = table.place or + {name = "default_place_blockcolor", gain = 1.0} + return table +end + +function default.node_sound_metal_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_footstep_blockcolor", gain = 1.0} + table.dig = table.dig or + {name = "default_dig_blockcolor", gain = 0.25} + table.dug = table.dug or + {name = "default_dug_blockcolor", gain = 0.25} + table.place = table.place or + {name = "default_place_blockcolor", gain = 1.0} + return table +end + + +-- +-- Lavacooling +-- + +default.cool_lava = function(pos, node) + if node.name == "default:lava_source" then + minetest.set_node(pos, {name = "default:obsidian"}) + else -- Lava flowing + minetest.set_node(pos, {name = "default:stone"}) + end + minetest.sound_play("default_cool_lava", + {pos = pos, max_hear_distance = 16, gain = 0.25}) +end + +-- +-- optimized helper to put all items in an inventory into a drops list +-- + +function default.get_inventory_drops(pos, inventory, drops) + local inv = minetest.get_meta(pos):get_inventory() + local n = #drops + for i = 1, inv:get_size(inventory) do + local stack = inv:get_stack(inventory, i) + if stack:get_count() > 0 then + drops[n+1] = stack:to_table() + n = n + 1 + end + end +end + +-- +-- Papyrus and cactus growing +-- + +-- wrapping the functions in abm action is necessary to make overriding them possible + +function default.grow_cactus(pos, node) + if node.param2 >= 4 then + return + end + pos.y = pos.y - 1 + if minetest.get_item_group(minetest.get_node(pos).name, "sand") == 0 then + return + end + pos.y = pos.y + 1 + local height = 0 + while node.name == "default:cactus" and height < 4 do + height = height + 1 + pos.y = pos.y + 1 + node = minetest.get_node(pos) + end + if height == 4 or node.name ~= "air" then + return + end + if minetest.get_node_light(pos) < 13 then + return + end + minetest.set_node(pos, {name = "default:cactus"}) + return true +end + +function default.grow_papyrus(pos, node) + pos.y = pos.y - 1 + local name = minetest.get_node(pos).name + if name ~= "default:dirt_with_grass" and name ~= "default:dirt" then + return + end + if not minetest.find_node_near(pos, 3, {"group:water"}) then + return + end + pos.y = pos.y + 1 + local height = 0 + while node.name == "default:papyrus" and height < 4 do + height = height + 1 + pos.y = pos.y + 1 + node = minetest.get_node(pos) + end + if height == 4 or node.name ~= "air" then + return + end + if minetest.get_node_light(pos) < 13 then + return + end + minetest.set_node(pos, {name = "default:papyrus"}) + return true +end + +minetest.register_abm({ + label = "Grow cactus", + nodenames = {"default:cactus"}, + neighbors = {"group:sand"}, + interval = 12, + chance = 83, + action = default.grow_cactus +}) + +minetest.register_abm({ + label = "Grow papyrus", + nodenames = {"default:papyrus"}, + neighbors = {"default:dirt", "default:dirt_with_grass"}, + interval = 14, + chance = 71, + action = default.grow_papyrus +}) + + +-- +-- dig upwards +-- + +function default.dig_up(pos, node, digger) + if digger == nil then return end + local np = {x = pos.x, y = pos.y + 1, z = pos.z} + local nn = minetest.get_node(np) + if nn.name == node.name then + minetest.node_dig(np, nn, digger) + end +end + + +-- +-- Fence registration helper +-- + +function default.register_fence(name, def) + minetest.register_craft({ + output = name .. " 4", + recipe = { + { def.material, 'group:stick', def.material }, + { def.material, 'group:stick', def.material }, + } + }) + + local fence_texture = "default_fence_overlay.png^" .. def.texture .. + "^default_fence_overlay.png^[makealpha:255,126,126" + -- Allow almost everything to be overridden + local default_fields = { + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {{-1/8, -1/2, -1/8, 1/8, 1/2, 1/8}}, + -- connect_top = + -- connect_bottom = + connect_front = {{-1/16,3/16,-1/2,1/16,5/16,-1/8}, + {-1/16,-5/16,-1/2,1/16,-3/16,-1/8}}, + connect_left = {{-1/2,3/16,-1/16,-1/8,5/16,1/16}, + {-1/2,-5/16,-1/16,-1/8,-3/16,1/16}}, + connect_back = {{-1/16,3/16,1/8,1/16,5/16,1/2}, + {-1/16,-5/16,1/8,1/16,-3/16,1/2}}, + connect_right = {{1/8,3/16,-1/16,1/2,5/16,1/16}, + {1/8,-5/16,-1/16,1/2,-3/16,1/16}}, + }, + connects_to = {"group:fence", "group:wood", "group:tree"}, + inventory_image = fence_texture, + wield_image = fence_texture, + tiles = {def.texture}, + sunlight_propagates = true, + is_ground_content = false, + groups = {}, + } + for k, v in pairs(default_fields) do + if not def[k] then + def[k] = v + end + end + + -- Always add to the fence group, even if no group provided + def.groups.fence = 1 + + def.texture = nil + def.material = nil + + minetest.register_node(name, def) +end + + +-- +-- Leafdecay +-- + +-- Prevent decay of placed leaves + +default.after_place_leaves = function(pos, placer, itemstack, pointed_thing) + if placer and not placer:get_player_control().sneak then + local node = minetest.get_node(pos) + node.param2 = 1 + minetest.set_node(pos, node) + end +end + +-- Leafdecay +local function leafdecay_after_destruct(pos, oldnode, def) + for _, v in pairs(minetest.find_nodes_in_area(vector.subtract(pos, def.radius), + vector.add(pos, def.radius), def.leaves)) do + local node = minetest.get_node(v) + local timer = minetest.get_node_timer(v) + if node.param2 == 0 and not timer:is_started() then + timer:start(math.random(20, 120) / 10) + end + end +end + +local function leafdecay_on_timer(pos, def) + if minetest.find_node_near(pos, def.radius, def.trunks) then + return false + end + + local node = minetest.get_node(pos) + local drops = minetest.get_node_drops(node.name) + for _, item in ipairs(drops) do + local is_leaf + for _, v in pairs(def.leaves) do + if v == item then + is_leaf = true + end + end + if minetest.get_item_group(item, "leafdecay_drop") ~= 0 or + not is_leaf then + minetest.add_item({ + x = pos.x - 0.5 + math.random(), + y = pos.y - 0.5 + math.random(), + z = pos.z - 0.5 + math.random(), + }, item) + end + end + + minetest.remove_node(pos) + minetest.check_for_falling(pos) +end + +function default.register_leafdecay(def) + assert(def.leaves) + assert(def.trunks) + assert(def.radius) + for _, v in pairs(def.trunks) do + minetest.override_item(v, { + after_destruct = function(pos, oldnode) + leafdecay_after_destruct(pos, oldnode, def) + end, + }) + end + for _, v in pairs(def.leaves) do + minetest.override_item(v, { + on_timer = function(pos) + leafdecay_on_timer(pos, def) + end, + }) + end +end + +-- +-- Convert dirt to something that fits the environment +-- + +minetest.register_abm({ + label = "Grass spread", + nodenames = {"default:dirt"}, + neighbors = { + "air", + "group:grass", + "group:dry_grass", + "default:snow", + }, + interval = 6, + chance = 50, + catch_up = false, + action = function(pos, node) + -- Check for darkness: night, shadow or under a light-blocking node + -- Returns if ignore above + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + if (minetest.get_node_light(above) or 0) < 13 then + return + end + + -- Look for spreading dirt-type neighbours + local p2 = minetest.find_node_near(pos, 1, "group:spreading_dirt_type") + if p2 then + local n3 = minetest.get_node(p2) + minetest.set_node(pos, {name = n3.name}) + return + end + + -- Else, any seeding nodes on top? + local name = minetest.get_node(above).name + -- Snow check is cheapest, so comes first + if name == "default:snow" then + minetest.set_node(pos, {name = "default:dirt_with_snow"}) + -- Most likely case first + elseif minetest.get_item_group(name, "grass") ~= 0 then + minetest.set_node(pos, {name = "default:dirt_with_grass"}) + elseif minetest.get_item_group(name, "dry_grass") ~= 0 then + minetest.set_node(pos, {name = "default:dirt_with_dry_grass"}) + end + end +}) + + +-- +-- Grass and dry grass removed in darkness +-- + +minetest.register_abm({ + label = "Grass covered", + nodenames = {"group:spreading_dirt_type"}, + interval = 8, + chance = 50, + catch_up = false, + action = function(pos, node) + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local name = minetest.get_node(above).name + local nodedef = minetest.registered_nodes[name] + if name ~= "ignore" and nodedef and not ((nodedef.sunlight_propagates or + nodedef.paramtype == "light") and + nodedef.liquidtype == "none") then + minetest.set_node(pos, {name = "default:dirt"}) + end + end +}) + + +-- +-- Moss growth on cobble near water +-- + +minetest.register_abm({ + label = "Moss growth", + nodenames = {"default:cobble", "stairs:slab_cobble", "stairs:stair_cobble", "walls:cobble"}, + neighbors = {"group:water"}, + interval = 16, + chance = 200, + catch_up = false, + action = function(pos, node) + if node.name == "default:cobble" then + minetest.set_node(pos, {name = "default:mossycobble"}) + elseif node.name == "stairs:slab_cobble" then + minetest.set_node(pos, {name = "stairs:slab_mossycobble", param2 = node.param2}) + elseif node.name == "stairs:stair_cobble" then + minetest.set_node(pos, {name = "stairs:stair_mossycobble", param2 = node.param2}) + elseif node.name == "walls:cobble" then + minetest.set_node(pos, {name = "walls:mossycobble", param2 = node.param2}) + end + end +}) + + +-- +-- Checks if specified volume intersects a protected volume +-- + +function default.intersects_protection(minp, maxp, player_name, interval) + -- 'interval' is the largest allowed interval for the 3D lattice of checks + + -- Compute the optimal float step 'd' for each axis so that all corners and + -- borders are checked. 'd' will be smaller or equal to 'interval'. + -- Subtracting 1e-4 ensures that the max co-ordinate will be reached by the + -- for loop (which might otherwise not be the case due to rounding errors). + local d = {} + for _, c in pairs({"x", "y", "z"}) do + if maxp[c] > minp[c] then + d[c] = (maxp[c] - minp[c]) / math.ceil((maxp[c] - minp[c]) / interval) - 1e-4 + elseif maxp[c] == minp[c] then + d[c] = 1 -- Any value larger than 0 to avoid division by zero + else -- maxp[c] < minp[c], print error and treat as protection intersected + minetest.log("error", "maxp < minp in 'default.intersects_protection()'") + return true + end + end + + for zf = minp.z, maxp.z, d.z do + local z = math.floor(zf + 0.5) + for yf = minp.y, maxp.y, d.y do + local y = math.floor(yf + 0.5) + for xf = minp.x, maxp.x, d.x do + local x = math.floor(xf + 0.5) + if minetest.is_protected({x = x, y = y, z = z}, player_name) then + return true + end + end + end + end + + return false +end + + +-- +-- Coral death near air +-- + +minetest.register_abm({ + nodenames = {"default:coral_brown", "default:coral_orange"}, + neighbors = {"air"}, + interval = 17, + chance = 5, + catch_up = false, + action = function(pos, node) + minetest.set_node(pos, {name = "default:coral_skeleton"}) + end, +}) + + +-- +-- NOTICE: This method is not an official part of the API yet! +-- This method may change in future. +-- + +function default.can_interact_with_node(player, pos) + if player then + if minetest.check_player_privs(player, "protection_bypass") then + return true + end + else + return false + end + + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + + if not owner or owner == "" or owner == player:get_player_name() then + return true + end + + -- is player wielding the right key? + local item = player:get_wielded_item() + if item:get_name() == "default:key" then + local key_meta = item:get_meta() + + if key_meta:get_string("secret") == "" then + local key_oldmeta = item:get_metadata() + if key_oldmeta == "" or not minetest.parse_json(key_oldmeta) then + return false + end + + key_meta:set_string("secret", minetest.parse_json(key_oldmeta).secret) + item:set_metadata("") + end + + return meta:get_string("key_lock_secret") == key_meta:get_string("secret") + end + + return false +end diff --git a/mods/World/default/init.lua b/mods/World/default/init.lua new file mode 100644 index 0000000..caff3e7 --- /dev/null +++ b/mods/World/default/init.lua @@ -0,0 +1,34 @@ +-- Minetest 0.4 mod: default +-- See README.txt for licensing and other information. + +-- The API documentation in here was moved into game_api.txt + +-- Definitions made by this mod that other mods can use too +default = {} + +default.LIGHT_MAX = 14 + +-- GUI related stuff +default.gui_bg = "bgcolor[#080808BB;true]" +default.gui_bg_img = "background[5,5;1,1;gui_formbg.png;true]" +default.gui_slots = "listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + +minetest.register_item(":", + +{ + type = "none", + wield_image = "wieldhand.png", +wield_scale = {x=1,y=1,z=0.5}, +} + +) + + +-- Load files +local default_path = minetest.get_modpath("default") + +dofile(default_path.."/functions.lua") +dofile(default_path.."/mapgen.lua") +dofile(default_path.."/player.lua") +dofile(default_path.."/aliases.lua") +dofile(default_path.."/creative.lua") diff --git a/mods/World/default/license.txt b/mods/World/default/license.txt new file mode 100644 index 0000000..72af728 --- /dev/null +++ b/mods/World/default/license.txt @@ -0,0 +1,177 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011-2016 celeron55, Perttu Ahola +Copyright (C) 2011-2016 Various Minetest developers and contributors + +This program is free software; you can redistribute it and/or modify it under the terms +of the GNU Lesser General Public License as published by the Free Software Foundation; +either version 2.1 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +See the GNU Lesser General Public License for more details: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures, models and sounds) +----------------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2010-2016: + celeron55, Perttu Ahola + Cisoun + G4JC + VanessaE + RealBadAngel + Calinou + MirceaKitsune + Jordach + PilzAdam + jojoa1997 + InfinityProject + Splizard + Zeg9 + paramat + BlockMen + sofar + Neuromancer + Gambit + asl97 + KevDoy + Mito551 + GreenXenith + kaeza + kilbith + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ + +----------------------- + +Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +Copyright (C) 2014-2016 brunob.santos + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/4.0/ + +----------------------- + +Attribution-ShareAlike 2.0 Generic (CC BY-SA 2.0) +Copyright (C) 2014-2016 Neuromancer + + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/2.0/ + +----------------------- + +Attribution 3.0 Unported (CC BY 3.0) +Copyright (C) 2009 cmusounddesign +Copyright (C) 2010 Tomlija +Copyright (C) 2010 lsprice +Copyright (C) 2014 sonictechtonic +Copyright (C) 2015 yadronoff +Copyright (C) 2007 HerbertBoland +Copyright (C) 2006 AGFX + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by/3.0/ diff --git a/mods/World/default/mapgen.lua b/mods/World/default/mapgen.lua new file mode 100644 index 0000000..a95e861 --- /dev/null +++ b/mods/World/default/mapgen.lua @@ -0,0 +1,365 @@ +-- +-- Aliases for map generators +-- + +minetest.register_alias("mapgen_stone","comboblock:slab_black_onc_slab_black") + +minetest.register_alias("mapgen_dirt","comboblock:slab_orange_onc_slab_orange") + +minetest.register_alias("mapgen_dirt_with_grass","comboblock:slab_green_onc_slab_orange") + +minetest.register_alias("mapgen_sand","comboblock:slab_yellow_onc_slab_yellow") + +minetest.register_alias("mapgen_water_source","water:blue_water_source") + +minetest.register_alias("mapgen_river_water_source","water:blue_water_source") + +minetest.register_alias("mapgen_lava_source","water:red_water_source") + +minetest.register_alias("mapgen_gravel","comboblock:slab_black_onc_slab_black") + +minetest.register_alias("mapgen_desert_stone","comboblock:slab_black_onc_slab_black") + +minetest.register_alias("mapgen_desert_sand","comboblock:slab_yellow_onc_slab_yellow") + +minetest.register_alias("mapgen_dirt_with_snow","comboblock:slab_white_onc_slab_orange") + +minetest.register_alias("mapgen_snowblock","comboblock:slab_white_onc_slab_white") + +minetest.register_alias("mapgen_snow","comboblock:slab_white_onc_slab_white") + +minetest.register_alias("mapgen_ice","comboblock:slab_blue_onc_slab_blue") + +minetest.register_alias("mapgen_sandstone","comboblock:slab_orange_onc_slab_orange") + +-- Flora + +minetest.register_alias("mapgen_tree", "color:orange") +minetest.register_alias("mapgen_leaves", "color:green") +minetest.register_alias("mapgen_apple", "color:red") +minetest.register_alias("mapgen_jungletree", "color:orange") +minetest.register_alias("mapgen_jungleleaves", "color:green") +minetest.register_alias("mapgen_junglegrass", "color:green") +minetest.register_alias("mapgen_pine_tree", "color:orange") +minetest.register_alias("mapgen_pine_needles", "color:green") + +-- Dungeons + +minetest.register_alias("mapgen_cobble", "color:black") +minetest.register_alias("mapgen_stair_cobble", "stairs:stair_white") +minetest.register_alias("mapgen_mossycobble", "color:white") +minetest.register_alias("mapgen_stair_desert_stone", "stairs:stair_white") +minetest.register_alias("mapgen_sandstonebrick", "color:orange") +minetest.register_alias("mapgen_stair_sandstone_block", "stairs:stair_white") + +-- +-- Register biomes +-- + +-- All mapgens except mgv6 + +function default.register_biomes(upper_limit) + + -- White Biome (Cold) + + minetest.register_biome({ + name = "white", + node_top = "comboblock:slab_white_onc_slab_orange", + depth_top = 1, + node_filler = "comboblock:slab_orange_onc_slab_orange", + depth_filler = 1, + node_stone = "comboblock:slab_black_onc_slab_black", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "comboblock:slab_yellow_onc_slab_yellow", + depth_riverbed = 2, + y_min = 5, + y_max = upper_limit, + heat_point = 20, + humidity_point = 35, + }) + + minetest.register_biome({ + name = "white_ocean", + --node_dust = "", + node_top = "comboblock:slab_yellow_onc_slab_yellow", + depth_top = 1, + node_filler = "comboblock:slab_yellow_onc_slab_yellow", + depth_filler = 3, + node_stone = "comboblock:slab_black_onc_slab_black", + node_water_top = "water:blue_water_source", + depth_water_top = 10, + --node_water = "", + --node_river_water = "", + node_riverbed = "comboblock:slab_yellow_onc_slab_yellow", + depth_riverbed = 2, + y_min = -112, + y_max = 4, + heat_point = 20, + humidity_point = 35, + }) + + -- Green Biome (Neutral) + + minetest.register_biome({ + name = "green", + --node_dust = "", + node_top = "comboblock:slab_green_onc_slab_orange", + depth_top = 1, + node_filler = "comboblock:slab_orange_onc_slab_orange", + depth_filler = 1, + node_stone = "comboblock:slab_black_onc_slab_black", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "comboblock:slab_yellow_onc_slab_yellow", + depth_riverbed = 2, + y_min = 6, + y_max = upper_limit, + heat_point = 50, + humidity_point = 35, + }) + + minetest.register_biome({ + name = "green_ocean", + --node_dust = "", + node_top = "comboblock:slab_yellow_onc_slab_yellow", + depth_top = 1, + node_filler = "comboblock:slab_yellow_onc_slab_yellow", + depth_filler = 3, + node_stone = "comboblock:slab_black_onc_slab_black", + node_water_top = "water:blue_water_source", + depth_water_top = 10, + --node_water = "", + --node_river_water = "", + node_riverbed = "comboblock:slab_yellow_onc_slab_yellow", + depth_riverbed = 2, + y_min = -112, + y_max = 4, + heat_point = 50, + humidity_point = 35, + }) + + -- Yellow Biome (Hot) + + minetest.register_biome({ + name = "yellow", + --node_dust = "", + node_top = "comboblock:slab_yellow_onc_slab_yellow", + depth_top = 1, + node_filler = "comboblock:slab_yellow_onc_slab_yellow", + depth_filler = 1, + node_stone = "comboblock:slab_orange_onc_slab_orange", + --node_water_top = "" , + --depth_water_top = , + --node_water = "", + --node_river_water = "", + node_riverbed = "comboblock:slab_yellow_onc_slab_yellow", + depth_riverbed = 2, + y_min = 5, + y_max = upper_limit, + heat_point = 92, + humidity_point = 16, + }) + + minetest.register_biome({ + name = "yellow_ocean", + --node_dust = "", + node_top = "comboblock:slab_yellow_onc_slab_yellow", + depth_top = 1, + node_filler = "comboblock:slab_yellow_onc_slab_yellow", + depth_filler = 3, + node_stone = "comboblock:slab_orange_onc_slab_orange", + node_water_top = "water:blue_water_source", + depth_water_top = 10, + --node_water = "", + --node_river_water = "", + node_riverbed = "comboblock:slab_yellow_onc_slab_yellow", + depth_riverbed = 2, + y_min = -112, + y_max = 4, + heat_point = 92, + humidity_point = 16, + }) + +end + +-- +-- Register decorations +-- + +function default.register_decorations() + + -- Green Biome (Neutral) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"comboblock:slab_green_onc_slab_orange"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {" green "}, + y_min = 1, + y_max = 31000, + decoration = "trees:big_green", + + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"comboblock:slab_green_onc_slab_orange"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {" green "}, + y_min = 1, + y_max = 31000, + decoration = "trees:normal_red", + + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"comboblock:slab_green_onc_slab_orange"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {" green "}, + y_min = 1, + y_max = 31000, + decoration = "trees:small_yellow", + + }) + +-- White Biome (Cold) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"comboblock:slab_white_onc_slab_orange"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {" white "}, + y_min = 1, + y_max = 31000, + decoration = "trees:big_blue", + + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"comboblock:slab_white_onc_slab_orange"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {" white "}, + y_min = 1, + y_max = 31000, + decoration = "trees:normal_pink", + + }) + +-- Yellow Biome (Hot) + +minetest.register_decoration({ + deco_type = "simple", + place_on = {"comboblock:slab_yellow_onc_slab_yellow"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {" yellow "}, + y_min = 1, + y_max = 31000, + decoration = "trees:normal_black", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"comboblock:slab_yellow_onc_slab_yellow"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {" yellow "}, + y_min = 1, + y_max = 31000, + decoration = "trees:small_white", + + }) + +end + + +-- +-- Detect mapgen, flags and parameters to select functions +-- + +-- Get setting or default +local mgv7_spflags = minetest.get_mapgen_setting("mgv7_spflags") or + "mountains, ridges, nofloatlands" +local captures_float = string.match(mgv7_spflags, "floatlands") +local captures_nofloat = string.match(mgv7_spflags, "nofloatlands") + +local mgv7_floatland_level = minetest.get_mapgen_setting("mgv7_floatland_level") or 1280 +local mgv7_shadow_limit = minetest.get_mapgen_setting("mgv7_shadow_limit") or 1024 + +minetest.clear_registered_biomes() +minetest.clear_registered_ores() +minetest.clear_registered_decorations() + +local mg_name = minetest.get_mapgen_setting("mg_name") + +if mg_name == "v7" and captures_float == "floatlands" and + captures_nofloat ~= "nofloatlands" then + -- Mgv7 with floatlands + default.register_biomes(mgv7_shadow_limit - 1) + default.register_floatland_biomes(mgv7_floatland_level, mgv7_shadow_limit) + default.register_decorations() +else + default.register_biomes(31000) + default.register_decorations() +end diff --git a/mods/World/default/models/character.b3d b/mods/World/default/models/character.b3d new file mode 100644 index 0000000..5238340 Binary files /dev/null and b/mods/World/default/models/character.b3d differ diff --git a/mods/World/default/models/character.blend b/mods/World/default/models/character.blend new file mode 100644 index 0000000..cc22e5f Binary files /dev/null and b/mods/World/default/models/character.blend differ diff --git a/mods/World/default/models/character.png b/mods/World/default/models/character.png new file mode 100644 index 0000000..8472a87 Binary files /dev/null and b/mods/World/default/models/character.png differ diff --git a/mods/World/default/player.lua b/mods/World/default/player.lua new file mode 100644 index 0000000..1133399 --- /dev/null +++ b/mods/World/default/player.lua @@ -0,0 +1,168 @@ +-- Minetest 0.4 mod: player +-- See README.txt for licensing and other information. + +-- Player animation blending +-- Note: This is currently broken due to a bug in Irrlicht, leave at 0 +local animation_blend = 0 + +default.registered_player_models = { } + +-- Local for speed. +local models = default.registered_player_models + +function default.player_register_model(name, def) + models[name] = def +end + +-- License Model Player : CC0 +-- https://opengameart.org/content/animated-human-low-poly +-- Model Player by Quaternius + +-- Modify and Export b3d by Kroukuk + +-- Default player appearance +default.player_register_model("character.b3d", { + animation_speed = 60, + textures = {"character.png", }, + animations = { + +--run: x=322 y=338 +--work: x=426 y=581 + + stand = { x=26, y=266, }, + lay = { x=339, y=424, }, + walk = { x=295, y=320, }, + mine = { x=268, y=292, }, + +--walk_fast = { x=322, y=338, }, +--dog_mine = { x=426, y=581, }, + walk_mine = { x=0, y=0, }, + sit = { x= 0, y=0, }, +--jump = { x= 0, y=24, }, + + }, +}) + +-- Player stats and animations +local player_model = {} +local player_textures = {} +local player_anim = {} +local player_sneak = {} +default.player_attached = {} + +function default.player_get_animation(player) + local name = player:get_player_name() + return { + model = player_model[name], + textures = player_textures[name], + animation = player_anim[name], + } +end + +-- Called when a player's appearance needs to be updated +function default.player_set_model(player, model_name) + local name = player:get_player_name() + local model = models[model_name] + if model then + if player_model[name] == model_name then + return + end + player:set_properties({ + mesh = model_name, + textures = player_textures[name] or model.textures, + visual = "mesh", + visual_size = 4, + }) + default.player_set_animation(player, "stand") + else + player:set_properties({ + textures = { "player.png", "player_back.png", }, + visual = "upright_sprite", + }) + end + player_model[name] = model_name +end + +function default.player_set_textures(player, textures) + local name = player:get_player_name() + player_textures[name] = textures + player:set_properties({textures = textures,}) +end + +function default.player_set_animation(player, anim_name, speed) + local name = player:get_player_name() + if player_anim[name] == anim_name then + return + end + local model = player_model[name] and models[player_model[name]] + if not (model and model.animations[anim_name]) then + return + end + local anim = model.animations[anim_name] + player_anim[name] = anim_name + player:set_animation(anim, speed or model.animation_speed, animation_blend) +end + +-- Update appearance when the player joins +minetest.register_on_joinplayer(function(player) + default.player_attached[player:get_player_name()] = false + default.player_set_model(player, "character.b3d") + player:set_local_animation({x=0, y=0}, {x=0, y=0}, {x=0, y=0}, {x=0, y=0}, 0) + + player:hud_set_hotbar_image("gui_hotbar.png") + player:hud_set_hotbar_selected_image("gui_hotbar_selected.png") +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + player_model[name] = nil + player_anim[name] = nil + player_textures[name] = nil +end) + +-- Localize for better performance. +local player_set_animation = default.player_set_animation +local player_attached = default.player_attached + +-- Check each player and apply animations +minetest.register_globalstep(function(dtime) + for _, player in pairs(minetest.get_connected_players()) do + local name = player:get_player_name() + local model_name = player_model[name] + local model = model_name and models[model_name] + if model and not player_attached[name] then + local controls = player:get_player_control() + local walking = false + local animation_speed_mod = model.animation_speed or 30 + + -- Determine if the player is walking + if controls.up or controls.down or controls.left or controls.right then + walking = true + end + + -- Determine if the player is sneaking, and reduce animation speed if so + if controls.sneak then + animation_speed_mod = animation_speed_mod / 2 + end + + -- Apply animations based on what the player is doing + if player:get_hp() == 0 then + player_set_animation(player, "lay") + elseif walking then + if player_sneak[name] ~= controls.sneak then + player_anim[name] = nil + player_sneak[name] = controls.sneak + end + if controls.LMB then + player_set_animation(player, "walk_mine", animation_speed_mod) + else + player_set_animation(player, "walk", animation_speed_mod) + end + elseif controls.LMB then + player_set_animation(player, "mine") + else + player_set_animation(player, "stand", animation_speed_mod) + end + end + end +end) diff --git a/mods/World/default/schematics/boat.mts b/mods/World/default/schematics/boat.mts new file mode 100644 index 0000000..0220fc4 Binary files /dev/null and b/mods/World/default/schematics/boat.mts differ diff --git a/mods/World/default/schematics/truc.mts b/mods/World/default/schematics/truc.mts new file mode 100644 index 0000000..c6a6a85 Binary files /dev/null and b/mods/World/default/schematics/truc.mts differ diff --git a/mods/World/default/sounds/default_dig_blockcolor.1.ogg b/mods/World/default/sounds/default_dig_blockcolor.1.ogg new file mode 100644 index 0000000..f229a27 Binary files /dev/null and b/mods/World/default/sounds/default_dig_blockcolor.1.ogg differ diff --git a/mods/World/default/sounds/default_dug_blockcolor.1.ogg b/mods/World/default/sounds/default_dug_blockcolor.1.ogg new file mode 100644 index 0000000..f229a27 Binary files /dev/null and b/mods/World/default/sounds/default_dug_blockcolor.1.ogg differ diff --git a/mods/World/default/sounds/default_footsteep_blockcolor.1.ogg b/mods/World/default/sounds/default_footsteep_blockcolor.1.ogg new file mode 100644 index 0000000..49edc99 Binary files /dev/null and b/mods/World/default/sounds/default_footsteep_blockcolor.1.ogg differ diff --git a/mods/World/default/sounds/default_place_blockcolor.1.ogg b/mods/World/default/sounds/default_place_blockcolor.1.ogg new file mode 100644 index 0000000..c520928 Binary files /dev/null and b/mods/World/default/sounds/default_place_blockcolor.1.ogg differ diff --git a/mods/World/default/textures/bubble.png b/mods/World/default/textures/bubble.png new file mode 100644 index 0000000..100fe15 Binary files /dev/null and b/mods/World/default/textures/bubble.png differ diff --git a/mods/World/default/textures/crack_anylength.png b/mods/World/default/textures/crack_anylength.png new file mode 100644 index 0000000..297eced Binary files /dev/null and b/mods/World/default/textures/crack_anylength.png differ diff --git a/mods/World/default/textures/default_acacia_bush_sapling.png b/mods/World/default/textures/default_acacia_bush_sapling.png new file mode 100644 index 0000000..940b3aa Binary files /dev/null and b/mods/World/default/textures/default_acacia_bush_sapling.png differ diff --git a/mods/World/default/textures/default_acacia_bush_stem.png b/mods/World/default/textures/default_acacia_bush_stem.png new file mode 100644 index 0000000..2903915 Binary files /dev/null and b/mods/World/default/textures/default_acacia_bush_stem.png differ diff --git a/mods/World/default/textures/default_acacia_leaves.png b/mods/World/default/textures/default_acacia_leaves.png new file mode 100644 index 0000000..626e1b3 Binary files /dev/null and b/mods/World/default/textures/default_acacia_leaves.png differ diff --git a/mods/World/default/textures/default_acacia_leaves_simple.png b/mods/World/default/textures/default_acacia_leaves_simple.png new file mode 100644 index 0000000..3c7015b Binary files /dev/null and b/mods/World/default/textures/default_acacia_leaves_simple.png differ diff --git a/mods/World/default/textures/default_acacia_sapling.png b/mods/World/default/textures/default_acacia_sapling.png new file mode 100644 index 0000000..07170a0 Binary files /dev/null and b/mods/World/default/textures/default_acacia_sapling.png differ diff --git a/mods/World/default/textures/default_acacia_tree.png b/mods/World/default/textures/default_acacia_tree.png new file mode 100644 index 0000000..58bb3c4 Binary files /dev/null and b/mods/World/default/textures/default_acacia_tree.png differ diff --git a/mods/World/default/textures/default_acacia_tree_top.png b/mods/World/default/textures/default_acacia_tree_top.png new file mode 100644 index 0000000..a8a0ce0 Binary files /dev/null and b/mods/World/default/textures/default_acacia_tree_top.png differ diff --git a/mods/World/default/textures/default_acacia_wood.png b/mods/World/default/textures/default_acacia_wood.png new file mode 100644 index 0000000..b5abf1e Binary files /dev/null and b/mods/World/default/textures/default_acacia_wood.png differ diff --git a/mods/World/default/textures/default_apple.png b/mods/World/default/textures/default_apple.png new file mode 100644 index 0000000..7549bfd Binary files /dev/null and b/mods/World/default/textures/default_apple.png differ diff --git a/mods/World/default/textures/default_aspen_leaves.png b/mods/World/default/textures/default_aspen_leaves.png new file mode 100644 index 0000000..7306423 Binary files /dev/null and b/mods/World/default/textures/default_aspen_leaves.png differ diff --git a/mods/World/default/textures/default_aspen_sapling.png b/mods/World/default/textures/default_aspen_sapling.png new file mode 100644 index 0000000..f8d9136 Binary files /dev/null and b/mods/World/default/textures/default_aspen_sapling.png differ diff --git a/mods/World/default/textures/default_aspen_tree.png b/mods/World/default/textures/default_aspen_tree.png new file mode 100644 index 0000000..d7cc2a0 Binary files /dev/null and b/mods/World/default/textures/default_aspen_tree.png differ diff --git a/mods/World/default/textures/default_aspen_tree_top.png b/mods/World/default/textures/default_aspen_tree_top.png new file mode 100644 index 0000000..fcca038 Binary files /dev/null and b/mods/World/default/textures/default_aspen_tree_top.png differ diff --git a/mods/World/default/textures/default_aspen_wood.png b/mods/World/default/textures/default_aspen_wood.png new file mode 100644 index 0000000..2b584b3 Binary files /dev/null and b/mods/World/default/textures/default_aspen_wood.png differ diff --git a/mods/World/default/textures/default_book.png b/mods/World/default/textures/default_book.png new file mode 100644 index 0000000..448a7df Binary files /dev/null and b/mods/World/default/textures/default_book.png differ diff --git a/mods/World/default/textures/default_book_written.png b/mods/World/default/textures/default_book_written.png new file mode 100644 index 0000000..9196ac6 Binary files /dev/null and b/mods/World/default/textures/default_book_written.png differ diff --git a/mods/World/default/textures/default_bookshelf.png b/mods/World/default/textures/default_bookshelf.png new file mode 100644 index 0000000..10d6483 Binary files /dev/null and b/mods/World/default/textures/default_bookshelf.png differ diff --git a/mods/World/default/textures/default_bookshelf_slot.png b/mods/World/default/textures/default_bookshelf_slot.png new file mode 100644 index 0000000..715a3dc Binary files /dev/null and b/mods/World/default/textures/default_bookshelf_slot.png differ diff --git a/mods/World/default/textures/default_brick.png b/mods/World/default/textures/default_brick.png new file mode 100644 index 0000000..ab19121 Binary files /dev/null and b/mods/World/default/textures/default_brick.png differ diff --git a/mods/World/default/textures/default_bronze_block.png b/mods/World/default/textures/default_bronze_block.png new file mode 100644 index 0000000..1d0c9d5 Binary files /dev/null and b/mods/World/default/textures/default_bronze_block.png differ diff --git a/mods/World/default/textures/default_bronze_ingot.png b/mods/World/default/textures/default_bronze_ingot.png new file mode 100644 index 0000000..6cccdf6 Binary files /dev/null and b/mods/World/default/textures/default_bronze_ingot.png differ diff --git a/mods/World/default/textures/default_bush_sapling.png b/mods/World/default/textures/default_bush_sapling.png new file mode 100644 index 0000000..905ba4b Binary files /dev/null and b/mods/World/default/textures/default_bush_sapling.png differ diff --git a/mods/World/default/textures/default_bush_stem.png b/mods/World/default/textures/default_bush_stem.png new file mode 100644 index 0000000..18b615f Binary files /dev/null and b/mods/World/default/textures/default_bush_stem.png differ diff --git a/mods/World/default/textures/default_cactus_side.png b/mods/World/default/textures/default_cactus_side.png new file mode 100644 index 0000000..8d6c40c Binary files /dev/null and b/mods/World/default/textures/default_cactus_side.png differ diff --git a/mods/World/default/textures/default_cactus_top.png b/mods/World/default/textures/default_cactus_top.png new file mode 100644 index 0000000..cf46aa2 Binary files /dev/null and b/mods/World/default/textures/default_cactus_top.png differ diff --git a/mods/World/default/textures/default_chest_front.png b/mods/World/default/textures/default_chest_front.png new file mode 100644 index 0000000..85227d8 Binary files /dev/null and b/mods/World/default/textures/default_chest_front.png differ diff --git a/mods/World/default/textures/default_chest_inside.png b/mods/World/default/textures/default_chest_inside.png new file mode 100644 index 0000000..5f7b6b1 Binary files /dev/null and b/mods/World/default/textures/default_chest_inside.png differ diff --git a/mods/World/default/textures/default_chest_lock.png b/mods/World/default/textures/default_chest_lock.png new file mode 100644 index 0000000..73f46c7 Binary files /dev/null and b/mods/World/default/textures/default_chest_lock.png differ diff --git a/mods/World/default/textures/default_chest_side.png b/mods/World/default/textures/default_chest_side.png new file mode 100644 index 0000000..44a65a4 Binary files /dev/null and b/mods/World/default/textures/default_chest_side.png differ diff --git a/mods/World/default/textures/default_chest_top.png b/mods/World/default/textures/default_chest_top.png new file mode 100644 index 0000000..f4a92ee Binary files /dev/null and b/mods/World/default/textures/default_chest_top.png differ diff --git a/mods/World/default/textures/default_clay.png b/mods/World/default/textures/default_clay.png new file mode 100644 index 0000000..76e5a40 Binary files /dev/null and b/mods/World/default/textures/default_clay.png differ diff --git a/mods/World/default/textures/default_clay_brick.png b/mods/World/default/textures/default_clay_brick.png new file mode 100644 index 0000000..dc7a431 Binary files /dev/null and b/mods/World/default/textures/default_clay_brick.png differ diff --git a/mods/World/default/textures/default_clay_lump.png b/mods/World/default/textures/default_clay_lump.png new file mode 100644 index 0000000..c1d0220 Binary files /dev/null and b/mods/World/default/textures/default_clay_lump.png differ diff --git a/mods/World/default/textures/default_cloud.png b/mods/World/default/textures/default_cloud.png new file mode 100644 index 0000000..faf0ec1 Binary files /dev/null and b/mods/World/default/textures/default_cloud.png differ diff --git a/mods/World/default/textures/default_coal_block.png b/mods/World/default/textures/default_coal_block.png new file mode 100644 index 0000000..6fe9ed9 Binary files /dev/null and b/mods/World/default/textures/default_coal_block.png differ diff --git a/mods/World/default/textures/default_coal_lump.png b/mods/World/default/textures/default_coal_lump.png new file mode 100644 index 0000000..792961d Binary files /dev/null and b/mods/World/default/textures/default_coal_lump.png differ diff --git a/mods/World/default/textures/default_cobble.png b/mods/World/default/textures/default_cobble.png new file mode 100644 index 0000000..d379840 Binary files /dev/null and b/mods/World/default/textures/default_cobble.png differ diff --git a/mods/World/default/textures/default_copper_block.png b/mods/World/default/textures/default_copper_block.png new file mode 100644 index 0000000..8533754 Binary files /dev/null and b/mods/World/default/textures/default_copper_block.png differ diff --git a/mods/World/default/textures/default_copper_ingot.png b/mods/World/default/textures/default_copper_ingot.png new file mode 100644 index 0000000..bcad9c0 Binary files /dev/null and b/mods/World/default/textures/default_copper_ingot.png differ diff --git a/mods/World/default/textures/default_copper_lump.png b/mods/World/default/textures/default_copper_lump.png new file mode 100644 index 0000000..998c592 Binary files /dev/null and b/mods/World/default/textures/default_copper_lump.png differ diff --git a/mods/World/default/textures/default_coral_brown.png b/mods/World/default/textures/default_coral_brown.png new file mode 100644 index 0000000..8a775fe Binary files /dev/null and b/mods/World/default/textures/default_coral_brown.png differ diff --git a/mods/World/default/textures/default_coral_orange.png b/mods/World/default/textures/default_coral_orange.png new file mode 100644 index 0000000..cefac62 Binary files /dev/null and b/mods/World/default/textures/default_coral_orange.png differ diff --git a/mods/World/default/textures/default_coral_skeleton.png b/mods/World/default/textures/default_coral_skeleton.png new file mode 100644 index 0000000..fa48f15 Binary files /dev/null and b/mods/World/default/textures/default_coral_skeleton.png differ diff --git a/mods/World/default/textures/default_desert_cobble.png b/mods/World/default/textures/default_desert_cobble.png new file mode 100644 index 0000000..184a9d8 Binary files /dev/null and b/mods/World/default/textures/default_desert_cobble.png differ diff --git a/mods/World/default/textures/default_desert_sand.png b/mods/World/default/textures/default_desert_sand.png new file mode 100644 index 0000000..371b8c7 Binary files /dev/null and b/mods/World/default/textures/default_desert_sand.png differ diff --git a/mods/World/default/textures/default_desert_sandstone.png b/mods/World/default/textures/default_desert_sandstone.png new file mode 100644 index 0000000..52e445f Binary files /dev/null and b/mods/World/default/textures/default_desert_sandstone.png differ diff --git a/mods/World/default/textures/default_desert_sandstone_block.png b/mods/World/default/textures/default_desert_sandstone_block.png new file mode 100644 index 0000000..8fc54e7 Binary files /dev/null and b/mods/World/default/textures/default_desert_sandstone_block.png differ diff --git a/mods/World/default/textures/default_desert_sandstone_brick.png b/mods/World/default/textures/default_desert_sandstone_brick.png new file mode 100644 index 0000000..ab58db5 Binary files /dev/null and b/mods/World/default/textures/default_desert_sandstone_brick.png differ diff --git a/mods/World/default/textures/default_desert_stone.png b/mods/World/default/textures/default_desert_stone.png new file mode 100644 index 0000000..5d3aded Binary files /dev/null and b/mods/World/default/textures/default_desert_stone.png differ diff --git a/mods/World/default/textures/default_desert_stone_block.png b/mods/World/default/textures/default_desert_stone_block.png new file mode 100644 index 0000000..9eb8e92 Binary files /dev/null and b/mods/World/default/textures/default_desert_stone_block.png differ diff --git a/mods/World/default/textures/default_desert_stone_brick.png b/mods/World/default/textures/default_desert_stone_brick.png new file mode 100644 index 0000000..a603d18 Binary files /dev/null and b/mods/World/default/textures/default_desert_stone_brick.png differ diff --git a/mods/World/default/textures/default_diamond.png b/mods/World/default/textures/default_diamond.png new file mode 100644 index 0000000..a8dac74 Binary files /dev/null and b/mods/World/default/textures/default_diamond.png differ diff --git a/mods/World/default/textures/default_diamond_block.png b/mods/World/default/textures/default_diamond_block.png new file mode 100644 index 0000000..20c33ed Binary files /dev/null and b/mods/World/default/textures/default_diamond_block.png differ diff --git a/mods/World/default/textures/default_dirt.png b/mods/World/default/textures/default_dirt.png new file mode 100644 index 0000000..ca7e4ae Binary files /dev/null and b/mods/World/default/textures/default_dirt.png differ diff --git a/mods/World/default/textures/default_dry_grass.png b/mods/World/default/textures/default_dry_grass.png new file mode 100644 index 0000000..e69de29 diff --git a/mods/World/default/textures/default_dry_grass_1.png b/mods/World/default/textures/default_dry_grass_1.png new file mode 100644 index 0000000..5cf68a3 Binary files /dev/null and b/mods/World/default/textures/default_dry_grass_1.png differ diff --git a/mods/World/default/textures/default_dry_grass_2.png b/mods/World/default/textures/default_dry_grass_2.png new file mode 100644 index 0000000..c925ace Binary files /dev/null and b/mods/World/default/textures/default_dry_grass_2.png differ diff --git a/mods/World/default/textures/default_dry_grass_3.png b/mods/World/default/textures/default_dry_grass_3.png new file mode 100644 index 0000000..4e4d84e Binary files /dev/null and b/mods/World/default/textures/default_dry_grass_3.png differ diff --git a/mods/World/default/textures/default_dry_grass_4.png b/mods/World/default/textures/default_dry_grass_4.png new file mode 100644 index 0000000..d315849 Binary files /dev/null and b/mods/World/default/textures/default_dry_grass_4.png differ diff --git a/mods/World/default/textures/default_dry_grass_5.png b/mods/World/default/textures/default_dry_grass_5.png new file mode 100644 index 0000000..871d04c Binary files /dev/null and b/mods/World/default/textures/default_dry_grass_5.png differ diff --git a/mods/World/default/textures/default_dry_grass_side.png b/mods/World/default/textures/default_dry_grass_side.png new file mode 100644 index 0000000..ef375b7 Binary files /dev/null and b/mods/World/default/textures/default_dry_grass_side.png differ diff --git a/mods/World/default/textures/default_dry_shrub.png b/mods/World/default/textures/default_dry_shrub.png new file mode 100644 index 0000000..e8a7f27 Binary files /dev/null and b/mods/World/default/textures/default_dry_shrub.png differ diff --git a/mods/World/default/textures/default_fence_acacia_wood.png b/mods/World/default/textures/default_fence_acacia_wood.png new file mode 100644 index 0000000..3b973f3 Binary files /dev/null and b/mods/World/default/textures/default_fence_acacia_wood.png differ diff --git a/mods/World/default/textures/default_fence_aspen_wood.png b/mods/World/default/textures/default_fence_aspen_wood.png new file mode 100644 index 0000000..0a6558e Binary files /dev/null and b/mods/World/default/textures/default_fence_aspen_wood.png differ diff --git a/mods/World/default/textures/default_fence_junglewood.png b/mods/World/default/textures/default_fence_junglewood.png new file mode 100644 index 0000000..c390941 Binary files /dev/null and b/mods/World/default/textures/default_fence_junglewood.png differ diff --git a/mods/World/default/textures/default_fence_overlay.png b/mods/World/default/textures/default_fence_overlay.png new file mode 100644 index 0000000..718184c Binary files /dev/null and b/mods/World/default/textures/default_fence_overlay.png differ diff --git a/mods/World/default/textures/default_fence_pine_wood.png b/mods/World/default/textures/default_fence_pine_wood.png new file mode 100644 index 0000000..74609d9 Binary files /dev/null and b/mods/World/default/textures/default_fence_pine_wood.png differ diff --git a/mods/World/default/textures/default_fence_wood.png b/mods/World/default/textures/default_fence_wood.png new file mode 100644 index 0000000..1e76430 Binary files /dev/null and b/mods/World/default/textures/default_fence_wood.png differ diff --git a/mods/World/default/textures/default_flint.png b/mods/World/default/textures/default_flint.png new file mode 100644 index 0000000..226c740 Binary files /dev/null and b/mods/World/default/textures/default_flint.png differ diff --git a/mods/World/default/textures/default_footprint.png b/mods/World/default/textures/default_footprint.png new file mode 100644 index 0000000..41d9546 Binary files /dev/null and b/mods/World/default/textures/default_footprint.png differ diff --git a/mods/World/default/textures/default_furnace_bottom.png b/mods/World/default/textures/default_furnace_bottom.png new file mode 100644 index 0000000..b79ed06 Binary files /dev/null and b/mods/World/default/textures/default_furnace_bottom.png differ diff --git a/mods/World/default/textures/default_furnace_fire_bg.png b/mods/World/default/textures/default_furnace_fire_bg.png new file mode 100644 index 0000000..126204a Binary files /dev/null and b/mods/World/default/textures/default_furnace_fire_bg.png differ diff --git a/mods/World/default/textures/default_furnace_fire_fg.png b/mods/World/default/textures/default_furnace_fire_fg.png new file mode 100644 index 0000000..63888f3 Binary files /dev/null and b/mods/World/default/textures/default_furnace_fire_fg.png differ diff --git a/mods/World/default/textures/default_furnace_front.png b/mods/World/default/textures/default_furnace_front.png new file mode 100644 index 0000000..8c1798e Binary files /dev/null and b/mods/World/default/textures/default_furnace_front.png differ diff --git a/mods/World/default/textures/default_furnace_front_active.png b/mods/World/default/textures/default_furnace_front_active.png new file mode 100644 index 0000000..ea43ed9 Binary files /dev/null and b/mods/World/default/textures/default_furnace_front_active.png differ diff --git a/mods/World/default/textures/default_furnace_side.png b/mods/World/default/textures/default_furnace_side.png new file mode 100644 index 0000000..33408cf Binary files /dev/null and b/mods/World/default/textures/default_furnace_side.png differ diff --git a/mods/World/default/textures/default_furnace_top.png b/mods/World/default/textures/default_furnace_top.png new file mode 100644 index 0000000..b79ed06 Binary files /dev/null and b/mods/World/default/textures/default_furnace_top.png differ diff --git a/mods/World/default/textures/default_glass.png b/mods/World/default/textures/default_glass.png new file mode 100644 index 0000000..da25402 Binary files /dev/null and b/mods/World/default/textures/default_glass.png differ diff --git a/mods/World/default/textures/default_glass_detail.png b/mods/World/default/textures/default_glass_detail.png new file mode 100644 index 0000000..d38dbb7 Binary files /dev/null and b/mods/World/default/textures/default_glass_detail.png differ diff --git a/mods/World/default/textures/default_gold_block.png b/mods/World/default/textures/default_gold_block.png new file mode 100644 index 0000000..170d50b Binary files /dev/null and b/mods/World/default/textures/default_gold_block.png differ diff --git a/mods/World/default/textures/default_gold_ingot.png b/mods/World/default/textures/default_gold_ingot.png new file mode 100644 index 0000000..ba66471 Binary files /dev/null and b/mods/World/default/textures/default_gold_ingot.png differ diff --git a/mods/World/default/textures/default_gold_lump.png b/mods/World/default/textures/default_gold_lump.png new file mode 100644 index 0000000..d5a1be7 Binary files /dev/null and b/mods/World/default/textures/default_gold_lump.png differ diff --git a/mods/World/default/textures/default_grass.png b/mods/World/default/textures/default_grass.png new file mode 100644 index 0000000..0181fab Binary files /dev/null and b/mods/World/default/textures/default_grass.png differ diff --git a/mods/World/default/textures/default_grass_1.png b/mods/World/default/textures/default_grass_1.png new file mode 100644 index 0000000..e9faa2c Binary files /dev/null and b/mods/World/default/textures/default_grass_1.png differ diff --git a/mods/World/default/textures/default_grass_2.png b/mods/World/default/textures/default_grass_2.png new file mode 100644 index 0000000..03729a0 Binary files /dev/null and b/mods/World/default/textures/default_grass_2.png differ diff --git a/mods/World/default/textures/default_grass_3.png b/mods/World/default/textures/default_grass_3.png new file mode 100644 index 0000000..92ca1b5 Binary files /dev/null and b/mods/World/default/textures/default_grass_3.png differ diff --git a/mods/World/default/textures/default_grass_4.png b/mods/World/default/textures/default_grass_4.png new file mode 100644 index 0000000..c782a33 Binary files /dev/null and b/mods/World/default/textures/default_grass_4.png differ diff --git a/mods/World/default/textures/default_grass_5.png b/mods/World/default/textures/default_grass_5.png new file mode 100644 index 0000000..b727e9c Binary files /dev/null and b/mods/World/default/textures/default_grass_5.png differ diff --git a/mods/World/default/textures/default_grass_side.png b/mods/World/default/textures/default_grass_side.png new file mode 100644 index 0000000..bfd538d Binary files /dev/null and b/mods/World/default/textures/default_grass_side.png differ diff --git a/mods/World/default/textures/default_gravel.png b/mods/World/default/textures/default_gravel.png new file mode 100644 index 0000000..8852d38 Binary files /dev/null and b/mods/World/default/textures/default_gravel.png differ diff --git a/mods/World/default/textures/default_ice.png b/mods/World/default/textures/default_ice.png new file mode 100644 index 0000000..2874e1e Binary files /dev/null and b/mods/World/default/textures/default_ice.png differ diff --git a/mods/World/default/textures/default_iron_lump.png b/mods/World/default/textures/default_iron_lump.png new file mode 100644 index 0000000..db61a94 Binary files /dev/null and b/mods/World/default/textures/default_iron_lump.png differ diff --git a/mods/World/default/textures/default_item_smoke.png b/mods/World/default/textures/default_item_smoke.png new file mode 100644 index 0000000..d62fb3b Binary files /dev/null and b/mods/World/default/textures/default_item_smoke.png differ diff --git a/mods/World/default/textures/default_junglegrass.png b/mods/World/default/textures/default_junglegrass.png new file mode 100644 index 0000000..25abb71 Binary files /dev/null and b/mods/World/default/textures/default_junglegrass.png differ diff --git a/mods/World/default/textures/default_jungleleaves.png b/mods/World/default/textures/default_jungleleaves.png new file mode 100644 index 0000000..5afcc36 Binary files /dev/null and b/mods/World/default/textures/default_jungleleaves.png differ diff --git a/mods/World/default/textures/default_jungleleaves_simple.png b/mods/World/default/textures/default_jungleleaves_simple.png new file mode 100644 index 0000000..7165100 Binary files /dev/null and b/mods/World/default/textures/default_jungleleaves_simple.png differ diff --git a/mods/World/default/textures/default_junglesapling.png b/mods/World/default/textures/default_junglesapling.png new file mode 100644 index 0000000..05e1e50 Binary files /dev/null and b/mods/World/default/textures/default_junglesapling.png differ diff --git a/mods/World/default/textures/default_jungletree.png b/mods/World/default/textures/default_jungletree.png new file mode 100644 index 0000000..2cf77a6 Binary files /dev/null and b/mods/World/default/textures/default_jungletree.png differ diff --git a/mods/World/default/textures/default_jungletree_top.png b/mods/World/default/textures/default_jungletree_top.png new file mode 100644 index 0000000..439f078 Binary files /dev/null and b/mods/World/default/textures/default_jungletree_top.png differ diff --git a/mods/World/default/textures/default_junglewood.png b/mods/World/default/textures/default_junglewood.png new file mode 100644 index 0000000..8d17917 Binary files /dev/null and b/mods/World/default/textures/default_junglewood.png differ diff --git a/mods/World/default/textures/default_key.png b/mods/World/default/textures/default_key.png new file mode 100644 index 0000000..783d313 Binary files /dev/null and b/mods/World/default/textures/default_key.png differ diff --git a/mods/World/default/textures/default_key_skeleton.png b/mods/World/default/textures/default_key_skeleton.png new file mode 100644 index 0000000..2b3497d Binary files /dev/null and b/mods/World/default/textures/default_key_skeleton.png differ diff --git a/mods/World/default/textures/default_ladder_steel.png b/mods/World/default/textures/default_ladder_steel.png new file mode 100644 index 0000000..a312f3e Binary files /dev/null and b/mods/World/default/textures/default_ladder_steel.png differ diff --git a/mods/World/default/textures/default_ladder_wood.png b/mods/World/default/textures/default_ladder_wood.png new file mode 100644 index 0000000..c167fff Binary files /dev/null and b/mods/World/default/textures/default_ladder_wood.png differ diff --git a/mods/World/default/textures/default_lava.png b/mods/World/default/textures/default_lava.png new file mode 100644 index 0000000..e8958de Binary files /dev/null and b/mods/World/default/textures/default_lava.png differ diff --git a/mods/World/default/textures/default_lava_flowing_animated.png b/mods/World/default/textures/default_lava_flowing_animated.png new file mode 100644 index 0000000..2ec0746 Binary files /dev/null and b/mods/World/default/textures/default_lava_flowing_animated.png differ diff --git a/mods/World/default/textures/default_lava_source_animated.png b/mods/World/default/textures/default_lava_source_animated.png new file mode 100644 index 0000000..32267a6 Binary files /dev/null and b/mods/World/default/textures/default_lava_source_animated.png differ diff --git a/mods/World/default/textures/default_leaves.png b/mods/World/default/textures/default_leaves.png new file mode 100644 index 0000000..ba09fe1 Binary files /dev/null and b/mods/World/default/textures/default_leaves.png differ diff --git a/mods/World/default/textures/default_leaves_simple.png b/mods/World/default/textures/default_leaves_simple.png new file mode 100644 index 0000000..eb60f9f Binary files /dev/null and b/mods/World/default/textures/default_leaves_simple.png differ diff --git a/mods/World/default/textures/default_mese_block.png b/mods/World/default/textures/default_mese_block.png new file mode 100644 index 0000000..013993b Binary files /dev/null and b/mods/World/default/textures/default_mese_block.png differ diff --git a/mods/World/default/textures/default_mese_crystal.png b/mods/World/default/textures/default_mese_crystal.png new file mode 100644 index 0000000..f1d71f1 Binary files /dev/null and b/mods/World/default/textures/default_mese_crystal.png differ diff --git a/mods/World/default/textures/default_mese_crystal_fragment.png b/mods/World/default/textures/default_mese_crystal_fragment.png new file mode 100644 index 0000000..d5416ab Binary files /dev/null and b/mods/World/default/textures/default_mese_crystal_fragment.png differ diff --git a/mods/World/default/textures/default_mese_post_light_side.png b/mods/World/default/textures/default_mese_post_light_side.png new file mode 100644 index 0000000..c23b551 Binary files /dev/null and b/mods/World/default/textures/default_mese_post_light_side.png differ diff --git a/mods/World/default/textures/default_mese_post_light_side_dark.png b/mods/World/default/textures/default_mese_post_light_side_dark.png new file mode 100644 index 0000000..c4fc7ce Binary files /dev/null and b/mods/World/default/textures/default_mese_post_light_side_dark.png differ diff --git a/mods/World/default/textures/default_mese_post_light_top.png b/mods/World/default/textures/default_mese_post_light_top.png new file mode 100644 index 0000000..6834bd3 Binary files /dev/null and b/mods/World/default/textures/default_mese_post_light_top.png differ diff --git a/mods/World/default/textures/default_meselamp.png b/mods/World/default/textures/default_meselamp.png new file mode 100644 index 0000000..0c3a1a1 Binary files /dev/null and b/mods/World/default/textures/default_meselamp.png differ diff --git a/mods/World/default/textures/default_mineral_coal.png b/mods/World/default/textures/default_mineral_coal.png new file mode 100644 index 0000000..6d1386b Binary files /dev/null and b/mods/World/default/textures/default_mineral_coal.png differ diff --git a/mods/World/default/textures/default_mineral_copper.png b/mods/World/default/textures/default_mineral_copper.png new file mode 100644 index 0000000..c4c518e Binary files /dev/null and b/mods/World/default/textures/default_mineral_copper.png differ diff --git a/mods/World/default/textures/default_mineral_diamond.png b/mods/World/default/textures/default_mineral_diamond.png new file mode 100644 index 0000000..39c0f83 Binary files /dev/null and b/mods/World/default/textures/default_mineral_diamond.png differ diff --git a/mods/World/default/textures/default_mineral_gold.png b/mods/World/default/textures/default_mineral_gold.png new file mode 100644 index 0000000..2220add Binary files /dev/null and b/mods/World/default/textures/default_mineral_gold.png differ diff --git a/mods/World/default/textures/default_mineral_iron.png b/mods/World/default/textures/default_mineral_iron.png new file mode 100644 index 0000000..bfec8b1 Binary files /dev/null and b/mods/World/default/textures/default_mineral_iron.png differ diff --git a/mods/World/default/textures/default_mineral_mese.png b/mods/World/default/textures/default_mineral_mese.png new file mode 100644 index 0000000..6952670 Binary files /dev/null and b/mods/World/default/textures/default_mineral_mese.png differ diff --git a/mods/World/default/textures/default_mineral_tin.png b/mods/World/default/textures/default_mineral_tin.png new file mode 100644 index 0000000..232d4b5 Binary files /dev/null and b/mods/World/default/textures/default_mineral_tin.png differ diff --git a/mods/World/default/textures/default_mossycobble.png b/mods/World/default/textures/default_mossycobble.png new file mode 100644 index 0000000..1ae7c91 Binary files /dev/null and b/mods/World/default/textures/default_mossycobble.png differ diff --git a/mods/World/default/textures/default_obsidian.png b/mods/World/default/textures/default_obsidian.png new file mode 100644 index 0000000..8f4a49c Binary files /dev/null and b/mods/World/default/textures/default_obsidian.png differ diff --git a/mods/World/default/textures/default_obsidian_block.png b/mods/World/default/textures/default_obsidian_block.png new file mode 100644 index 0000000..7e1d4d3 Binary files /dev/null and b/mods/World/default/textures/default_obsidian_block.png differ diff --git a/mods/World/default/textures/default_obsidian_brick.png b/mods/World/default/textures/default_obsidian_brick.png new file mode 100644 index 0000000..30c67ca Binary files /dev/null and b/mods/World/default/textures/default_obsidian_brick.png differ diff --git a/mods/World/default/textures/default_obsidian_glass.png b/mods/World/default/textures/default_obsidian_glass.png new file mode 100644 index 0000000..d5ac83d Binary files /dev/null and b/mods/World/default/textures/default_obsidian_glass.png differ diff --git a/mods/World/default/textures/default_obsidian_glass_detail.png b/mods/World/default/textures/default_obsidian_glass_detail.png new file mode 100644 index 0000000..a8bbec9 Binary files /dev/null and b/mods/World/default/textures/default_obsidian_glass_detail.png differ diff --git a/mods/World/default/textures/default_obsidian_shard.png b/mods/World/default/textures/default_obsidian_shard.png new file mode 100644 index 0000000..a988d8c Binary files /dev/null and b/mods/World/default/textures/default_obsidian_shard.png differ diff --git a/mods/World/default/textures/default_paper.png b/mods/World/default/textures/default_paper.png new file mode 100644 index 0000000..8f23924 Binary files /dev/null and b/mods/World/default/textures/default_paper.png differ diff --git a/mods/World/default/textures/default_papyrus.png b/mods/World/default/textures/default_papyrus.png new file mode 100644 index 0000000..a85e809 Binary files /dev/null and b/mods/World/default/textures/default_papyrus.png differ diff --git a/mods/World/default/textures/default_pine_needles.png b/mods/World/default/textures/default_pine_needles.png new file mode 100644 index 0000000..ad7373b Binary files /dev/null and b/mods/World/default/textures/default_pine_needles.png differ diff --git a/mods/World/default/textures/default_pine_sapling.png b/mods/World/default/textures/default_pine_sapling.png new file mode 100644 index 0000000..c30131d Binary files /dev/null and b/mods/World/default/textures/default_pine_sapling.png differ diff --git a/mods/World/default/textures/default_pine_tree.png b/mods/World/default/textures/default_pine_tree.png new file mode 100644 index 0000000..4a5328f Binary files /dev/null and b/mods/World/default/textures/default_pine_tree.png differ diff --git a/mods/World/default/textures/default_pine_tree_top.png b/mods/World/default/textures/default_pine_tree_top.png new file mode 100644 index 0000000..8705710 Binary files /dev/null and b/mods/World/default/textures/default_pine_tree_top.png differ diff --git a/mods/World/default/textures/default_pine_wood.png b/mods/World/default/textures/default_pine_wood.png new file mode 100644 index 0000000..6844ceb Binary files /dev/null and b/mods/World/default/textures/default_pine_wood.png differ diff --git a/mods/World/default/textures/default_rainforest_litter.png b/mods/World/default/textures/default_rainforest_litter.png new file mode 100644 index 0000000..d762deb Binary files /dev/null and b/mods/World/default/textures/default_rainforest_litter.png differ diff --git a/mods/World/default/textures/default_rainforest_litter_side.png b/mods/World/default/textures/default_rainforest_litter_side.png new file mode 100644 index 0000000..7ccb11d Binary files /dev/null and b/mods/World/default/textures/default_rainforest_litter_side.png differ diff --git a/mods/World/default/textures/default_river_water.png b/mods/World/default/textures/default_river_water.png new file mode 100644 index 0000000..3b55c5f Binary files /dev/null and b/mods/World/default/textures/default_river_water.png differ diff --git a/mods/World/default/textures/default_river_water_flowing_animated.png b/mods/World/default/textures/default_river_water_flowing_animated.png new file mode 100644 index 0000000..536acc5 Binary files /dev/null and b/mods/World/default/textures/default_river_water_flowing_animated.png differ diff --git a/mods/World/default/textures/default_river_water_source_animated.png b/mods/World/default/textures/default_river_water_source_animated.png new file mode 100644 index 0000000..daa5653 Binary files /dev/null and b/mods/World/default/textures/default_river_water_source_animated.png differ diff --git a/mods/World/default/textures/default_sand.png b/mods/World/default/textures/default_sand.png new file mode 100644 index 0000000..645a300 Binary files /dev/null and b/mods/World/default/textures/default_sand.png differ diff --git a/mods/World/default/textures/default_sandstone.png b/mods/World/default/textures/default_sandstone.png new file mode 100644 index 0000000..16e3d13 Binary files /dev/null and b/mods/World/default/textures/default_sandstone.png differ diff --git a/mods/World/default/textures/default_sandstone_block.png b/mods/World/default/textures/default_sandstone_block.png new file mode 100644 index 0000000..2e06491 Binary files /dev/null and b/mods/World/default/textures/default_sandstone_block.png differ diff --git a/mods/World/default/textures/default_sandstone_brick.png b/mods/World/default/textures/default_sandstone_brick.png new file mode 100644 index 0000000..e7150e5 Binary files /dev/null and b/mods/World/default/textures/default_sandstone_brick.png differ diff --git a/mods/World/default/textures/default_sapling.png b/mods/World/default/textures/default_sapling.png new file mode 100644 index 0000000..3fd64f0 Binary files /dev/null and b/mods/World/default/textures/default_sapling.png differ diff --git a/mods/World/default/textures/default_sign_steel.png b/mods/World/default/textures/default_sign_steel.png new file mode 100644 index 0000000..3ca0c59 Binary files /dev/null and b/mods/World/default/textures/default_sign_steel.png differ diff --git a/mods/World/default/textures/default_sign_wall_steel.png b/mods/World/default/textures/default_sign_wall_steel.png new file mode 100644 index 0000000..2227477 Binary files /dev/null and b/mods/World/default/textures/default_sign_wall_steel.png differ diff --git a/mods/World/default/textures/default_sign_wall_wood.png b/mods/World/default/textures/default_sign_wall_wood.png new file mode 100644 index 0000000..40552c7 Binary files /dev/null and b/mods/World/default/textures/default_sign_wall_wood.png differ diff --git a/mods/World/default/textures/default_sign_wood.png b/mods/World/default/textures/default_sign_wood.png new file mode 100644 index 0000000..d0559da Binary files /dev/null and b/mods/World/default/textures/default_sign_wood.png differ diff --git a/mods/World/default/textures/default_silver_sand.png b/mods/World/default/textures/default_silver_sand.png new file mode 100644 index 0000000..c4a8f73 Binary files /dev/null and b/mods/World/default/textures/default_silver_sand.png differ diff --git a/mods/World/default/textures/default_silver_sandstone.png b/mods/World/default/textures/default_silver_sandstone.png new file mode 100644 index 0000000..eac62cb Binary files /dev/null and b/mods/World/default/textures/default_silver_sandstone.png differ diff --git a/mods/World/default/textures/default_silver_sandstone_block.png b/mods/World/default/textures/default_silver_sandstone_block.png new file mode 100644 index 0000000..9997461 Binary files /dev/null and b/mods/World/default/textures/default_silver_sandstone_block.png differ diff --git a/mods/World/default/textures/default_silver_sandstone_brick.png b/mods/World/default/textures/default_silver_sandstone_brick.png new file mode 100644 index 0000000..93d87a5 Binary files /dev/null and b/mods/World/default/textures/default_silver_sandstone_brick.png differ diff --git a/mods/World/default/textures/default_snow.png b/mods/World/default/textures/default_snow.png new file mode 100644 index 0000000..fcbef0e Binary files /dev/null and b/mods/World/default/textures/default_snow.png differ diff --git a/mods/World/default/textures/default_snow_side.png b/mods/World/default/textures/default_snow_side.png new file mode 100644 index 0000000..03456c8 Binary files /dev/null and b/mods/World/default/textures/default_snow_side.png differ diff --git a/mods/World/default/textures/default_snowball.png b/mods/World/default/textures/default_snowball.png new file mode 100644 index 0000000..3a4dc1f Binary files /dev/null and b/mods/World/default/textures/default_snowball.png differ diff --git a/mods/World/default/textures/default_steel_block.png b/mods/World/default/textures/default_steel_block.png new file mode 100644 index 0000000..7f49f61 Binary files /dev/null and b/mods/World/default/textures/default_steel_block.png differ diff --git a/mods/World/default/textures/default_steel_ingot.png b/mods/World/default/textures/default_steel_ingot.png new file mode 100644 index 0000000..8100b01 Binary files /dev/null and b/mods/World/default/textures/default_steel_ingot.png differ diff --git a/mods/World/default/textures/default_stick.png b/mods/World/default/textures/default_stick.png new file mode 100644 index 0000000..0378d07 Binary files /dev/null and b/mods/World/default/textures/default_stick.png differ diff --git a/mods/World/default/textures/default_stone.png b/mods/World/default/textures/default_stone.png new file mode 100644 index 0000000..63cb7c4 Binary files /dev/null and b/mods/World/default/textures/default_stone.png differ diff --git a/mods/World/default/textures/default_stone_block.png b/mods/World/default/textures/default_stone_block.png new file mode 100644 index 0000000..3b771e7 Binary files /dev/null and b/mods/World/default/textures/default_stone_block.png differ diff --git a/mods/World/default/textures/default_stone_brick.png b/mods/World/default/textures/default_stone_brick.png new file mode 100644 index 0000000..4dbb49d Binary files /dev/null and b/mods/World/default/textures/default_stone_brick.png differ diff --git a/mods/World/default/textures/default_tin_block.png b/mods/World/default/textures/default_tin_block.png new file mode 100644 index 0000000..72759b0 Binary files /dev/null and b/mods/World/default/textures/default_tin_block.png differ diff --git a/mods/World/default/textures/default_tin_ingot.png b/mods/World/default/textures/default_tin_ingot.png new file mode 100644 index 0000000..eed5361 Binary files /dev/null and b/mods/World/default/textures/default_tin_ingot.png differ diff --git a/mods/World/default/textures/default_tin_lump.png b/mods/World/default/textures/default_tin_lump.png new file mode 100644 index 0000000..72bd339 Binary files /dev/null and b/mods/World/default/textures/default_tin_lump.png differ diff --git a/mods/World/default/textures/default_tool_bronzeaxe.png b/mods/World/default/textures/default_tool_bronzeaxe.png new file mode 100644 index 0000000..8ae43b5 Binary files /dev/null and b/mods/World/default/textures/default_tool_bronzeaxe.png differ diff --git a/mods/World/default/textures/default_tool_bronzepick.png b/mods/World/default/textures/default_tool_bronzepick.png new file mode 100644 index 0000000..c88a5f0 Binary files /dev/null and b/mods/World/default/textures/default_tool_bronzepick.png differ diff --git a/mods/World/default/textures/default_tool_bronzeshovel.png b/mods/World/default/textures/default_tool_bronzeshovel.png new file mode 100644 index 0000000..d7d800e Binary files /dev/null and b/mods/World/default/textures/default_tool_bronzeshovel.png differ diff --git a/mods/World/default/textures/default_tool_bronzesword.png b/mods/World/default/textures/default_tool_bronzesword.png new file mode 100644 index 0000000..cdab898 Binary files /dev/null and b/mods/World/default/textures/default_tool_bronzesword.png differ diff --git a/mods/World/default/textures/default_tool_diamondaxe.png b/mods/World/default/textures/default_tool_diamondaxe.png new file mode 100644 index 0000000..e32a0bf Binary files /dev/null and b/mods/World/default/textures/default_tool_diamondaxe.png differ diff --git a/mods/World/default/textures/default_tool_diamondpick.png b/mods/World/default/textures/default_tool_diamondpick.png new file mode 100644 index 0000000..f9883c6 Binary files /dev/null and b/mods/World/default/textures/default_tool_diamondpick.png differ diff --git a/mods/World/default/textures/default_tool_diamondshovel.png b/mods/World/default/textures/default_tool_diamondshovel.png new file mode 100644 index 0000000..d0fe24d Binary files /dev/null and b/mods/World/default/textures/default_tool_diamondshovel.png differ diff --git a/mods/World/default/textures/default_tool_diamondsword.png b/mods/World/default/textures/default_tool_diamondsword.png new file mode 100644 index 0000000..dbccd0e Binary files /dev/null and b/mods/World/default/textures/default_tool_diamondsword.png differ diff --git a/mods/World/default/textures/default_tool_meseaxe.png b/mods/World/default/textures/default_tool_meseaxe.png new file mode 100644 index 0000000..c01fb4f Binary files /dev/null and b/mods/World/default/textures/default_tool_meseaxe.png differ diff --git a/mods/World/default/textures/default_tool_mesepick.png b/mods/World/default/textures/default_tool_mesepick.png new file mode 100644 index 0000000..1b2e25b Binary files /dev/null and b/mods/World/default/textures/default_tool_mesepick.png differ diff --git a/mods/World/default/textures/default_tool_meseshovel.png b/mods/World/default/textures/default_tool_meseshovel.png new file mode 100644 index 0000000..00813a2 Binary files /dev/null and b/mods/World/default/textures/default_tool_meseshovel.png differ diff --git a/mods/World/default/textures/default_tool_mesesword.png b/mods/World/default/textures/default_tool_mesesword.png new file mode 100644 index 0000000..d395d3a Binary files /dev/null and b/mods/World/default/textures/default_tool_mesesword.png differ diff --git a/mods/World/default/textures/default_tool_steelaxe.png b/mods/World/default/textures/default_tool_steelaxe.png new file mode 100644 index 0000000..1528cad Binary files /dev/null and b/mods/World/default/textures/default_tool_steelaxe.png differ diff --git a/mods/World/default/textures/default_tool_steelpick.png b/mods/World/default/textures/default_tool_steelpick.png new file mode 100644 index 0000000..a7543a1 Binary files /dev/null and b/mods/World/default/textures/default_tool_steelpick.png differ diff --git a/mods/World/default/textures/default_tool_steelshovel.png b/mods/World/default/textures/default_tool_steelshovel.png new file mode 100644 index 0000000..65e4045 Binary files /dev/null and b/mods/World/default/textures/default_tool_steelshovel.png differ diff --git a/mods/World/default/textures/default_tool_steelsword.png b/mods/World/default/textures/default_tool_steelsword.png new file mode 100644 index 0000000..630a339 Binary files /dev/null and b/mods/World/default/textures/default_tool_steelsword.png differ diff --git a/mods/World/default/textures/default_tool_stoneaxe.png b/mods/World/default/textures/default_tool_stoneaxe.png new file mode 100644 index 0000000..cc36054 Binary files /dev/null and b/mods/World/default/textures/default_tool_stoneaxe.png differ diff --git a/mods/World/default/textures/default_tool_stonepick.png b/mods/World/default/textures/default_tool_stonepick.png new file mode 100644 index 0000000..89d9efb Binary files /dev/null and b/mods/World/default/textures/default_tool_stonepick.png differ diff --git a/mods/World/default/textures/default_tool_stoneshovel.png b/mods/World/default/textures/default_tool_stoneshovel.png new file mode 100644 index 0000000..11711bd Binary files /dev/null and b/mods/World/default/textures/default_tool_stoneshovel.png differ diff --git a/mods/World/default/textures/default_tool_stonesword.png b/mods/World/default/textures/default_tool_stonesword.png new file mode 100644 index 0000000..1a493ac Binary files /dev/null and b/mods/World/default/textures/default_tool_stonesword.png differ diff --git a/mods/World/default/textures/default_tool_woodaxe.png b/mods/World/default/textures/default_tool_woodaxe.png new file mode 100644 index 0000000..68f1fd8 Binary files /dev/null and b/mods/World/default/textures/default_tool_woodaxe.png differ diff --git a/mods/World/default/textures/default_tool_woodpick.png b/mods/World/default/textures/default_tool_woodpick.png new file mode 100644 index 0000000..2ab00a8 Binary files /dev/null and b/mods/World/default/textures/default_tool_woodpick.png differ diff --git a/mods/World/default/textures/default_tool_woodshovel.png b/mods/World/default/textures/default_tool_woodshovel.png new file mode 100644 index 0000000..dcef2b5 Binary files /dev/null and b/mods/World/default/textures/default_tool_woodshovel.png differ diff --git a/mods/World/default/textures/default_tool_woodsword.png b/mods/World/default/textures/default_tool_woodsword.png new file mode 100644 index 0000000..c78ba50 Binary files /dev/null and b/mods/World/default/textures/default_tool_woodsword.png differ diff --git a/mods/World/default/textures/default_torch_animated.png b/mods/World/default/textures/default_torch_animated.png new file mode 100644 index 0000000..cdf33ef Binary files /dev/null and b/mods/World/default/textures/default_torch_animated.png differ diff --git a/mods/World/default/textures/default_torch_on_ceiling_animated.png b/mods/World/default/textures/default_torch_on_ceiling_animated.png new file mode 100644 index 0000000..3a8b5ad Binary files /dev/null and b/mods/World/default/textures/default_torch_on_ceiling_animated.png differ diff --git a/mods/World/default/textures/default_torch_on_floor.png b/mods/World/default/textures/default_torch_on_floor.png new file mode 100644 index 0000000..bc4bdd6 Binary files /dev/null and b/mods/World/default/textures/default_torch_on_floor.png differ diff --git a/mods/World/default/textures/default_torch_on_floor_animated.png b/mods/World/default/textures/default_torch_on_floor_animated.png new file mode 100644 index 0000000..ad51c03 Binary files /dev/null and b/mods/World/default/textures/default_torch_on_floor_animated.png differ diff --git a/mods/World/default/textures/default_tree.png b/mods/World/default/textures/default_tree.png new file mode 100644 index 0000000..10e297b Binary files /dev/null and b/mods/World/default/textures/default_tree.png differ diff --git a/mods/World/default/textures/default_tree_top.png b/mods/World/default/textures/default_tree_top.png new file mode 100644 index 0000000..da99bce Binary files /dev/null and b/mods/World/default/textures/default_tree_top.png differ diff --git a/mods/World/default/textures/default_water.png b/mods/World/default/textures/default_water.png new file mode 100644 index 0000000..00500e9 Binary files /dev/null and b/mods/World/default/textures/default_water.png differ diff --git a/mods/World/default/textures/default_water_flowing_animated.png b/mods/World/default/textures/default_water_flowing_animated.png new file mode 100644 index 0000000..070d797 Binary files /dev/null and b/mods/World/default/textures/default_water_flowing_animated.png differ diff --git a/mods/World/default/textures/default_water_source_animated.png b/mods/World/default/textures/default_water_source_animated.png new file mode 100644 index 0000000..7e7f9ff Binary files /dev/null and b/mods/World/default/textures/default_water_source_animated.png differ diff --git a/mods/World/default/textures/default_wood.png b/mods/World/default/textures/default_wood.png new file mode 100644 index 0000000..af56d6c Binary files /dev/null and b/mods/World/default/textures/default_wood.png differ diff --git a/mods/World/default/textures/gui_formbg.png b/mods/World/default/textures/gui_formbg.png new file mode 100644 index 0000000..886f2ae Binary files /dev/null and b/mods/World/default/textures/gui_formbg.png differ diff --git a/mods/World/default/textures/gui_furnace_arrow_bg.png b/mods/World/default/textures/gui_furnace_arrow_bg.png new file mode 100644 index 0000000..046d8cd Binary files /dev/null and b/mods/World/default/textures/gui_furnace_arrow_bg.png differ diff --git a/mods/World/default/textures/gui_furnace_arrow_fg.png b/mods/World/default/textures/gui_furnace_arrow_fg.png new file mode 100644 index 0000000..8d3c396 Binary files /dev/null and b/mods/World/default/textures/gui_furnace_arrow_fg.png differ diff --git a/mods/World/default/textures/gui_hb_bg.png b/mods/World/default/textures/gui_hb_bg.png new file mode 100644 index 0000000..bc26011 Binary files /dev/null and b/mods/World/default/textures/gui_hb_bg.png differ diff --git a/mods/World/default/textures/gui_hotbar.png b/mods/World/default/textures/gui_hotbar.png new file mode 100644 index 0000000..dc697fa Binary files /dev/null and b/mods/World/default/textures/gui_hotbar.png differ diff --git a/mods/World/default/textures/gui_hotbar_selected.png b/mods/World/default/textures/gui_hotbar_selected.png new file mode 100644 index 0000000..bc26011 Binary files /dev/null and b/mods/World/default/textures/gui_hotbar_selected.png differ diff --git a/mods/World/default/textures/heart.png b/mods/World/default/textures/heart.png new file mode 100644 index 0000000..6d4e228 Binary files /dev/null and b/mods/World/default/textures/heart.png differ diff --git a/mods/World/default/textures/player.png b/mods/World/default/textures/player.png new file mode 100644 index 0000000..6d61c43 Binary files /dev/null and b/mods/World/default/textures/player.png differ diff --git a/mods/World/default/textures/player_back.png b/mods/World/default/textures/player_back.png new file mode 100644 index 0000000..5e9ef05 Binary files /dev/null and b/mods/World/default/textures/player_back.png differ diff --git a/mods/World/default/textures/wieldhand.png b/mods/World/default/textures/wieldhand.png new file mode 100644 index 0000000..07f7b0e Binary files /dev/null and b/mods/World/default/textures/wieldhand.png differ diff --git a/mods/World/default/textures/wrotate.png b/mods/World/default/textures/wrotate.png new file mode 100644 index 0000000..19d0f08 Binary files /dev/null and b/mods/World/default/textures/wrotate.png differ diff --git a/mods/World/modpack.txt b/mods/World/modpack.txt new file mode 100644 index 0000000..e69de29 diff --git a/mods/mods_here.txt b/mods/mods_here.txt new file mode 100644 index 0000000..e105fbd --- /dev/null +++ b/mods/mods_here.txt @@ -0,0 +1,4 @@ +You can install Minetest mods by copying (and extracting) them into this folder. +To enable them, go to the configure world window in the main menu or write + load_mod_ = true +in world.mt in the world directory.