diff --git a/API.md b/API.md new file mode 100644 index 0000000..4d77b47 --- /dev/null +++ b/API.md @@ -0,0 +1,100 @@ +## Eggwars API + +Welcome to the API documentation + +The structure of the mod hinges around the arena definitions registered to the mod. +There is a default arena definition which you can use as a template for your own arenas. +It's structure is a table of key pairs holding all the information required to insert +an arena at any location on the map, position vectors used in the definition MUST +be relative to x=0, y=0, z=0 of the arena unless stated otherwise. + +### Arena Definition Structure + + { + blocked_recipes = { + {input or output recipe}, + ... + } + colour = { + { rgb table }, + ... + }, + cs = { + {'colour', 'hex string', 'formatted'}, + ... + } + description = "short description", + egg_offset = { -- island relative + {vector}, + ... + } + exempt_nodes = { + ['full or partial node name'] = true, + ... + } + hub = { + insert_offset = {vector}, + schem = 'filename' + }, + island = { + {vector}, + ..., + insert_offset = {vector}, + schem = 'filename' + }, + name = 'arena name', + region = { + p1 = {vector}, + p2 = {vector} + }, + satellite = { + offset = {vector}, + pos = { + {vector}, + ... + } + }, + spawners = { + diamond = { + {vector}, + ..., + rate = number of seconds + }, + gold = { -- island relative + {vector}, + ..., + rate = number of seconds + }, + ruby = { + {vector}, + ..., + rate = number of seconds + } + bot = { -- island relative + offset = { + {vector}, + ..., + yaw = {degrees, ...} + } + } + } + timer = { + max_time = number of seconds, + suddendeath = number of seconds + }, + trader = { + names = { + "name", + ..., + }, + offset = { -- island relative + {vector}, + ..., + }, + yaw = {degrees, ...} + } + } + +### Functions + eggwars.register_arena(arena_def) +Registers an arena definition to eggwars. diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 5437474..18a361c --- a/README.md +++ b/README.md @@ -3,23 +3,51 @@ ## What this is This mod is inspired by the Minecraft mod of the same name and has similar features. -Each player's goal is to defend their egg and be the last person standing. If a player dies - either from being killed by another player or falling off - they will respawn if their egg is intact. If it is not intact, they will be put into spectator mode. +Each player's goal is to defend their egg and be the last person standing. If a player dies - either from being killed by another player or falling off - they will re-spawn whilst their egg is intact. If it is not intact, they experience match death and enter into spectator mode. -When there is one player left standing, they are declared the winner. +When there is one player left standing in a match, they are declared the winner. + +## Features +* Lobby +* Multiple match instances +* Island NPC Trader shops +* Island NPC Spawner Upgrades +* Coloured match chat +* API for adding content ## Install Extract the zip file to mods/ **or** use `git clone https://github.com/shivajiva101/eggwars` from within the mods directory. * Do **NOT** use an existing world - this will overwrite the mapgen and cause destruction. * Do not use a different mapgen mod. This will also cause issues +* Make and use a copy of games/minetest_game called games/eggwars and delete the mods you don't need like beds, boats, bucket, butterflies, carts, dungeon_loot, fireflies, give_initial_stuff, sethome, spawn, vessels, weather -## Using custom structures -The structures are stored in the schems/ folder. The centre and island files are the centre island and player islands respectively. They are stored using Minetest's MTS files. These do not save metadata, so you cannot prefill chests. If you modify these, please update the offsets for the islands: -* Centre island: Lines `96-98` -* Player island: Lines `109-111` +###### Additionally it is highly recommended that you add these mods: +* 3D armor [ https://github.com/minetest-mods/3d_armor ] +* Bows [ https://notabug.org/TenPlus1/bows ] + +## Adding your own arena +Adding your own arena is easy via the API function ``eggwars.register_arena(def) `` +the default definition can be found in ``register_arena.lua `` and should be used as the reference template for creating your own arenas, it's a keypair table proliferated with comments to help understand what data each key requires. This design concept allows you to use your own schematics for islands, arena hubs and spawner satellites, controlling the positions of all current arena elements. See API.md for more details on this mods API functions and how to use them. ## License -This project is licensed under AGPL v3. This is similar to the GPLv3, but requires servers that modify the mod to also make their changes available. +This project is licensed under AGPL v3. This is similar to the GPLv3, but requires any code modifications to be available on request. ## Contributors -This project was originally started by wilkgr, but after years of inactivity handed over to shivajiva. +This project was originally started by wilkgr, but after years of inactivity handed over to shivajiva. + +## Credits + +###### Sounds: +* eggwars_winner.ogg uses https://freesound.org/s/406371/ by SoundBat (CC0 1.0) +* eggwars_out.ogg uses https://freesound.org/s/350985/ by cabled_mess (CC0 1.0) +* eggwars_game_over.ogg uses https://freesound.org/s/277403/ by landlucky (CC BY 3.0) +* eggwars_time_over.ogg uses https://freesound.org/s/437661/ by dersuperanton (CC BY 3.0) +* eggwars_sudden.ogg uses https://freesound.org/s/476176/ by umdamlar (CC0 1.0) + +###### Textures: +* All textures created by shivajiva using Gimp (CC BY-NC 4.0) +* Egg mesh created by shivajiva using Blender (CC BY-NC 4.0) + +###### Schematics: +* created in MT by shivajiva (CC BY-NC 4.0) diff --git a/_config.yml b/_config.yml old mode 100644 new mode 100755 diff --git a/depends.txt b/depends.txt old mode 100644 new mode 100755 index 962a1f2..0032ba2 --- a/depends.txt +++ b/depends.txt @@ -1,2 +1,3 @@ default -sfinv \ No newline at end of file +armor? +bows? diff --git a/extender.lua b/extender.lua new file mode 100755 index 0000000..cf422f9 --- /dev/null +++ b/extender.lua @@ -0,0 +1,516 @@ +---------------------------------------------------------------------- +-- Eggwars by wilkgr -- +-- with additional code by shivajiva101@hotmail.com -- +-- Licensed under the AGPL v3 -- +-- You MUST make any changes you make open source -- +-- even if you just run it on your server without publishing it -- +-- Supports a maximum of 8 players per instance and 8 concurrent -- +-- instances for a max of 64 players -- +---------------------------------------------------------------------- + +-- Parts of the code in this file are modified or copied +-- from worldedit by Uberi https://github.com/Uberi/Minetest-WorldEdit + +local HEADER = 5 .. ":" +local jit_available = jit ~= nil + +--- Copies and modifies positions `pos1` and `pos2` so that each component of +-- `pos1` is less than or equal to the corresponding component of `pos2`. +-- @return the new positions. +local function sort_pos(pos1, pos2) + pos1 = {x=pos1.x, y=pos1.y, z=pos1.z} + pos2 = {x=pos2.x, y=pos2.y, z=pos2.z} + if pos1.x > pos2.x then + pos2.x, pos1.x = pos1.x, pos2.x + end + if pos1.y > pos2.y then + pos2.y, pos1.y = pos1.y, pos2.y + end + if pos1.z > pos2.z then + pos2.z, pos1.z = pos1.z, pos2.z + end + return pos1, pos2 +end + +--- Keeps a region of map chunks loaded +local function keep_loaded(pos1, pos2) + local manip = minetest.get_voxel_manip() + manip:read_from_map(pos1, pos2) +end + +--- Reads the header of serialized data. +-- @param value Serialized data. +-- @return The version as a positive natural number, or 0 for unknown versions. +-- @return Extra header fields as a list of strings, or nil if not supported. +-- @return Content (data after header). +local function read_header(value) + if value:find("^[0-9]+[%-:]") then + local header_end = value:find(":", 1, true) + local header = value:sub(1, header_end - 1):split(",") + local version = tonumber(header[1]) + table.remove(header, 1) + local content = value:sub(header_end + 1) + return version, header, content + end + return nil +end + +--- Loads the schematic in `value` into a node list in the latest format. +-- Contains code based on [table.save/table.load](http://lua-users.org/wiki/SaveTableToFile) +-- by ChillCode, available under the MIT license. +-- @return A node list in the latest format, or nil on failure. +local function load_schematic(value) + local version, _, content = read_header(value) + local nodes = {} + if version == 5 then -- correct format + if not jit_available then + -- This is broken for larger tables in the current version of LuaJIT + nodes = minetest.deserialize(content) + else + -- XXX: This is a filthy hack that works surprisingly well - in LuaJIT, `minetest.deserialize` will fail due to the register limit + content = content:gsub("return%s*{", "", 1):gsub("}%s*$", "", 1) -- remove the starting and ending values to leave only the node data + local escaped = content:gsub("\\\\", "@@"):gsub("\\\"", "@@"):gsub("(\"[^\"]*\")", function(s) return string.rep("@", #s) end) + local startpos, startpos1, endpos = 1, 1 + while true do -- go through each individual node entry (except the last) + startpos, endpos = escaped:find("},%s*{", startpos) + if not startpos then + break + end + local current = content:sub(startpos1, startpos) + local entry = minetest.deserialize("return " .. current) + table.insert(nodes, entry) + startpos, startpos1 = endpos, endpos + end + local entry = minetest.deserialize("return " .. content:sub(startpos1)) -- process the last entry + table.insert(nodes, entry) + end + else + return nil + end + return nodes +end + +local function allocate_with_nodes(origin_pos, nodes) + local huge = math.huge + local pos1x, pos1y, pos1z = huge, huge, huge + local pos2x, pos2y, pos2z = -huge, -huge, -huge + local origin_x, origin_y, origin_z = origin_pos.x, origin_pos.y, origin_pos.z + for i, entry in ipairs(nodes) do + local x, y, z = origin_x + entry.x, origin_y + entry.y, origin_z + entry.z + if x < pos1x then pos1x = x end + if y < pos1y then pos1y = y end + if z < pos1z then pos1z = z end + if x > pos2x then pos2x = x end + if y > pos2y then pos2y = y end + if z > pos2z then pos2z = z end + end + local pos1 = {x=pos1x, y=pos1y, z=pos1z} + local pos2 = {x=pos2x, y=pos2y, z=pos2z} + return pos1, pos2, #nodes +end + +--- Return volume in nodes of a region +-- @param pos1 - starting point vector table +-- @param pos2 - ending point vector table +-- @return number of nodes as an integer? +local function volume(pos1, pos2) + local p1, p2 = sort_pos(pos1, pos2) + return (p2.x - p1.x + 1) * + (p2.y - p1.y + 1) * + (p2.z - p1.z + 1) +end + +--- Slice a region along the midpoint of an axis +-- @param pos1 - vector passed as a table +-- @param pos2 - vector passed as a table +-- @param axis - axis passed as a string +-- @return ipair table containing 2 regions +local function region_slicer(pos1, pos2, axis) + local len = vector.subtract(pos2, pos1) + local mid = vector.new( + pos2.x + (len.x / 2), + pos1.y + (len.y / 2), + pos1.z + (len.z / 2) + ) + local r = {} + if axis == 'y' then + r = { + { + p1 = pos1, + p2 = vector.new(pos2.x, mid.y, pos2.z) + }, + { + p1 = vector.new(pos1.x, mid.y + 1, pos1.z), + p2 = pos2 + } + } + elseif axis == 'x' then + r = { + { + p1 = pos1, + p2 = vector.new(mid.x, pos2.y, pos2.z) + }, + { + p1 = vector.new(mid.x - 1, pos1.y, pos1.z), + p2 = pos2 + } + } + elseif axis == 'z' then + r = { + { + p1 = pos1, + p2 = vector.new(pos2.x, pos2.y, mid.z) + }, + { + p1 = vector.new(pos1.x, pos1.y, mid.z + 1), + p2 = pos2 + } + } + end + return r +end + +--- Create a table of ignore for the volume of the area +-- @param area pair table +-- @return ipair table +local function get_empty_data(area) + local data = {} + local c_ignore = minetest.get_content_id("ignore") + for i = 1, volume(area.MinEdge, area.MaxEdge) do + data[i] = c_ignore + end + return data +end + +--- Create and return a voxel manip and it's area +-- @param pos1 - starting point vector table +-- @param pos2 - ending point vector table +-- @return voxel manip +-- @return area vector table +local function init(pos1, pos2) + local manip = minetest.get_voxel_manip() + local emerged_pos1, emerged_pos2 = manip:read_from_map(pos1, pos2) + local area = VoxelArea:new({MinEdge=emerged_pos1, MaxEdge=emerged_pos2}) + return manip, area +end + +-- Adds a hollow cube of playerclip double lined with kill +-- designed for games created in the air +-- @param pos: base vector of cube (x=,y=,z=) +-- @param vol: volume (x=,y=,z=) +-- @param remove: replace shield with air (bool) +-- @return number of nodes added +local function shield(pos, vol, remove) + + local manip, area = init(pos, vector.add(pos, vol)) + local data = get_empty_data(area) + local node_1, node_2, msg + if remove == true then + node_1 = minetest.get_content_id("air") + node_2 = node_1 + msg = "Warning: Area unprotected!" + else + node_1 = minetest.get_content_id("eggwars:playerclip") + node_2 = minetest.get_content_id("eggwars:kill") + msg = "Warning: Area now shielded" + end + local stride = {x=1, y=area.ystride, z=area.zstride} + local offset = vector.subtract(pos, area.MinEdge) + local count = 0 + + -- add the nodes + for z = 0, vol.z-1 do + local index_z = (offset.z + z) * stride.z + 1 + for y = 0, vol.y-1 do + local index_y = index_z + (offset.y + y) * stride.y + for x = 0, vol.x-1 do + local is_clip = z == 0 or z == vol.z-1 + or y == 0 or y == vol.y-1 + or x == 0 or x == vol.x-1 + local is_kill = z == 1 or z == vol.z-2 or z == vol.z-3 + or y == 1 or y == 2 or y == vol.y-2 or y == vol.y-3 + or x == 1 or x == 2 or x == vol.x-2 or x == vol.x-3 + if is_clip then + local i = index_y + (offset.x + x) + data[i] = node_1 + count = count + 1 + elseif is_kill then + local i = index_y + (offset.x + x) + data[i] = node_2 + count = count + 1 + end + end + end + end + + manip:set_data(data) + manip:write_to_map() + + return count, msg +end + +function eggwars.metasave(pos1, pos2, filename) + local file, err = io.open(filename, "wb") + if err then return 0 end + local data, count = eggwars.serialize_meta(pos1, pos2) + file:write(data) + file:close() + return count +end + +function eggwars.metaload(originpos, filename) + filename = minetest.get_worldpath() .. "/schems/" .. filename .. ".ewm" + local file, err = io.open(filename, "wb") + if err then return 0 end + local data = file:read("*a") + file:close() + return eggwars.deserialize_meta(originpos, data) +end + +--- Fixes lighting within a region +-- @param pos1 start vector +-- @param pos2 end vector +-- @return nothing +function eggwars.fixlight(pos1, pos2) + local vmanip = minetest.get_voxel_manip(pos1, pos2) + vmanip:write_to_map() +end + +--- Clears all objects in a region. +-- @return The number of objects cleared. +function eggwars.clear_objects(pos1, pos2) + pos1, pos2 = sort_pos(pos1, pos2) + + keep_loaded(pos1, pos2) + + -- Offset positions to include full nodes (positions are in the center of nodes) + local pos1x, pos1y, pos1z = pos1.x - 0.5, pos1.y - 0.5, pos1.z - 0.5 + local pos2x, pos2y, pos2z = pos2.x + 0.5, pos2.y + 0.5, pos2.z + 0.5 + + -- Center of region + local center = { + x = pos1x + ((pos2x - pos1x) / 2), + y = pos1y + ((pos2y - pos1y) / 2), + z = pos1z + ((pos2z - pos1z) / 2) + } + -- Bounding sphere radius + local radius = math.sqrt( + (center.x - pos1x) ^ 2 + + (center.y - pos1y) ^ 2 + + (center.z - pos1z) ^ 2) + local count = 0 + for _, obj in pairs(minetest.get_objects_inside_radius(center, radius)) do + -- Avoid players + if not obj:is_player() then + local pos = obj:getpos() + if pos.x >= pos1x and pos.x <= pos2x and + pos.y >= pos1y and pos.y <= pos2y and + pos.z >= pos1z and pos.z <= pos2z then + -- Inside region + obj:remove() + count = count + 1 + end + end + end + return count +end + +--- Clears specific nodes in a region. +-- @return The number of nodes cleared. +function eggwars.clear_nodes(pos1, pos2) + pos1, pos2 = sort_pos(pos1, pos2) + + keep_loaded(pos1, pos2) + + -- Offset positions to include full nodes (positions are in the center of nodes) + local p1 = vector.new(pos1.x - 0.5, pos1.y - 0.5, pos1.z - 0.5) + local p2 = vector.new(pos2.x + 0.5, pos2.y + 0.5, pos2.z + 0.5) + local nodenames = { + "group:choppy", + "group:cracky", + "group:crumbly", + "group:oddly_breakable_by_hand" + } + local slices = region_slicer(pos1, pos2, 'y') + local n = 0 + + for _, slice in ipairs(slices) do + local found = minetest.find_nodes_in_area(slice.p1, slice.p2, nodenames) + for _,v in ipairs(found) do + minetest.set_node(v, {name="air"}) + end + n = n + #found + end + return n +end + +--- Sets a region to `air`. +-- @param pos1 +-- @param pos2 +-- @return The number of nodes set. +function eggwars.delete_area(pos1, pos2) + pos1, pos2 = sort_pos(pos1, pos2) + + local manip, area = init(pos1, pos2) + local data = get_empty_data(area) + + local node_id = minetest.get_content_id('air') + -- Fill area with node + for i in area:iterp(pos1, pos2) do + data[i] = node_id + end + + manip:set_data(data) + manip:write_to_map() + + return volume(pos1, pos2) +end + +--- Loads the nodes represented by string `value` at position `origin_pos`. +-- @return The number of nodes deserialized. +function eggwars.deserialize_meta(origin_pos, value) + local nodes = load_schematic(value) + if not nodes then return nil end + + local pos1, pos2 = allocate_with_nodes(origin_pos, nodes) + keep_loaded(pos1, pos2) + + local origin_x, origin_y, origin_z = origin_pos.x, origin_pos.y, origin_pos.z + local add_node, get_meta = minetest.add_node, minetest.get_meta + for i, entry in ipairs(nodes) do + entry.x, entry.y, entry.z = origin_x + entry.x, origin_y + entry.y, origin_z + entry.z + -- Entry acts as both position and node + add_node(entry, entry) + if entry.meta then + get_meta(entry):from_table(entry.meta) + end + end + return #nodes +end + +-- Serialise any meta nodes within a volume +-- @param pos1: first vector +-- @param pos2: second vector +-- @return serialised string, node count +function eggwars.serialize_meta(pos1, pos2) + + pos1, pos2 = sort_pos(pos1, pos2) + keep_loaded(pos1, pos2) + + local pos = {x=pos1.x, y=0, z=0} + local count = 0 + local result = {} + local get_node, get_meta = minetest.get_node, minetest.get_meta + while pos.x <= pos2.x do + pos.y = pos1.y + while pos.y <= pos2.y do + pos.z = pos1.z + while pos.z <= pos2.z do + local node = get_node(pos) + if node.name ~= "air" and node.name ~= "ignore" then + + local meta = get_meta(pos):to_table() + local meta_content + + -- Convert metadata item stacks to item strings + for name, inventory in pairs(meta.inventory) do + for index, stack in ipairs(inventory) do + meta_content = true + inventory[index] = stack.to_string and stack:to_string() or stack + end + end + + for name, field in pairs(meta.fields) do + meta_content = true + end + + for k in pairs(meta) do + if k ~= "inventory" and k ~= "fields" then + meta_content = true + break + end + end + + if meta_content then + count = count + 1 + result[count] = { + x = pos.x - pos1.x, + y = pos.y - pos1.y, + z = pos.z - pos1.z, + name = node.name, + param1 = node.param1 ~= 0 and node.param1 or nil, + param2 = node.param2 ~= 0 and node.param2 or nil, + meta = meta_content and meta or nil, + } + + end + end + pos.z = pos.z + 1 + end + pos.y = pos.y + 1 + end + pos.x = pos.x + 1 + end + -- Serialise entries + return HEADER .. minetest.serialize(result), count +end + +-- Adds a protective shield to a volume +-- @param vol: position vectors +-- @param remover: replace shield with air (bool) +-- @return number of nodes added +eggwars.protect = function(pos1, pos2, remove) + + local p1, p2, dims + -- using vectors + p1 = pos1 + p2 = pos2 + + -- sort if reqd + if p1.y > p2.y then + p2, p1 = p1, p2 + end + + -- volume vect + dims = { + x = p2.x - p1.x, + y = p2.y - p1.y, + z = p2.z - p1.z + } + + -- unsign if reqd + for k,v in pairs(dims) do + if v < 0 then + dims[k] = (v*v)^0.5 + end + end + + -- execute, returning node count + return shield(p1, dims, remove) +end + +-- Clear a players inventory +-- @param player; minetest player object +-- @return nothing +eggwars.clear_inventory = function(player) + + local player_inv = player:get_inventory() + + player_inv:set_list("main", {}) -- clear + player_inv:set_list("craft", {}) -- clear + +end + +if eggwars.armor then + -- Clear a players armour + -- @param player; minetest player object + -- @return nothing + eggwars.clear_armor = function(player) + + local player_inv = player:get_inventory() + + player_inv:set_list("armor", {}) -- clear + armor:set_player_armor(player) -- luacheck: ignore + + end +end diff --git a/init.lua b/init.lua old mode 100644 new mode 100755 index 4b3e00d..ad72dc4 --- a/init.lua +++ b/init.lua @@ -1,303 +1,1315 @@ ---------------------------------------------------------------------- --- Eggwars by wilkgr -- +-- Eggwars by wilkgr -- +-- with additional code by shivajiva101@hotmail.com -- -- Licensed under the AGPL v3 -- -- You MUST make any changes you make open source -- -- even if you just run it on your server without publishing it -- --- Supports a maximum of 8 players currently -- +-- Supports a maximum of 8 players per instance and 8 concurrent -- +-- instances for a max of 64 players -- ---------------------------------------------------------------------- +minetest.set_mapgen_params({mgname = "singlenode"}) +math.randomseed(os.time()) + eggwars = {} -eggwars.MP = minetest.get_modpath("eggwars") +eggwars.arena = {} +eggwars.armor = minetest.get_modpath("3d_armor") ~= nil +eggwars.bows = minetest.get_modpath("bows") ~= nil +eggwars.match = {} +eggwars.player = {} -dofile(eggwars.MP.."/register_nodes.lua") -dofile(eggwars.MP.."/shop.lua") +--------------------- +-- Local Variables -- +--------------------- -------------------------- --- SECION: Coordinates -- -------------------------- -eggwars.waiting_area = {x=0,y=1001,z=0}; -local centre = {x=0,y=100,z=0} -eggwars.islands = { - {x=50,y=100,z=0}, - {x=-50,y=100,z=0}, - {x=0,y=100,z=50}, - {x=0,y=100,z=-50}, - {x=35,y=100,z=-35}, - {x=-35,y=100,z=35}, - {x=35,y=100,z=35}, - {x=-35,y=100,z=-35} +local mod_data = minetest.get_mod_storage() -- mod storage + +local arena_pos = { + {x=0, y=0, z=0}, + {x=300, y=0, z=0}, + {x=0, y=0, z=300}, + {x=300, y=0, z=300}, + {x=-300, y=0, z=0}, + {x=0, y=0, z=-300}, + {x=-300, y=0, z=-300}, + {x=-600, y=0, z=0} } - - --------------------------------- --- Please don't modify these ;-; -- - --------------------------------- -local i = 1; -eggwars.registered_players = {}; -local players_waiting = {}; -local player_i = {}; -- A table with the player names and their island. -local players_alive = {}; -local player_colours = {}; -local match_running = false; -eggwars.player_properties = {}; - - ------------------------------------------------ --- Allowed colours for nametags, chat and HUD -- - ------------------------------------------------ -local allowed_colours = { - {r = 0, g = 0, b = 255}, -- Blue - {r = 0, g = 255, b = 0}, -- Green - {r = 255, g = 0, b = 0}, -- Red - {r = 200, g = 0, b = 200}, -- Purple/pink - {r = 255, g = 255, b = 0}, -- Yellow - {r = 0, g = 255, b = 255}, -- Aqua - {r = 255, g = 165, b = 0}, - {r = 0, g = 0, b = 0} -- Black +local loaded = minetest.deserialize(mod_data:get_string('loaded')) or {arena = {}} +local lobby = { + insert_offset = {x=-42, y=-14, z=-30}, + pos = {x=0, y=1000, z=0}, + region = { + p1 = {x=-83, y=980, z=-83}, + p2 = {x=83, y=1030, z=83} + } } +local min_match_players = 0 -- min players needed for a match (default = 4) +local MP = minetest.get_modpath("eggwars") +local WP = minetest.get_worldpath() +local registered_players = {} -- temp prematch buffer +local schempath = MP.."/schems/" +local stats = minetest.deserialize(mod_data:get_string('STATS')) or {} +local last_state = minetest.deserialize(mod_data:get_string('LSTATE')) or {} +local tmp_tbl, tmp_hud = {}, {} +local timer = 0 +local r_rate = 5 -function StartsWith (String, Start) - return string.sub (String, 1, string.len (Start)) == Start +stats.rankings = stats.rankings or {} + +dofile(MP .. "/register_arena.lua") +dofile(MP.."/register_nodes.lua") +dofile(MP.."/shop.lua") +dofile(MP .. "/extender.lua") +dofile(MP .. "/tools.lua") + +---------------------- +-- Helper Functions -- +---------------------- + +--- Sets server to noon and stops time +-- @return nothing +local function set_time() + minetest.settings:set('time_speed', 0) + minetest.set_timeofday(0.5) -- noon end -function EndsWith (String, End) - return End == '' or string.sub (String, -string.len (End)) == End +--- Remove objects and replace region with air +-- @param pos1 - vector table +-- @param pos2 - vector table +-- @return nothing +local function clean(pos1, pos2) + eggwars.clear_nodes(pos1, pos2) + eggwars.fixlight(pos1, pos2) + eggwars.clear_objects(pos1, pos2) end --- Force load arena & waiting pos when started. -for i=1,#eggwars.islands do - minetest.forceload_block(eggwars.islands[i], true) +--- Remove objects and replace region with air +-- @param pos - vector table +-- @param region - vector pair table +-- @return nothing +local function clear(pos, region) + local p1 = vector.add(pos, region.p1) + local p2 = vector.add(pos, region.p2) + clean(p1, p2) end -minetest.forceload_block(eggwars.waiting_area, true) -minetest.forceload_block(centre, true) --- This function will remove all dropped items from the playing area -removeDrops = function () - local pos = {x=0,y=100,z=0} - local ent = nil - local tnob = minetest.get_objects_inside_radius (pos, 60) - local nnob = table.getn(tnob) +--- Save persistant data +-- @return nothing +local function save_persistant() + mod_data:set_string('STATS', minetest.serialize(stats)) + mod_data:set_string('LSTATE', minetest.serialize(last_state)) + mod_data:set_string('loaded', minetest.serialize(loaded)) +end - if (nnob > 0) then - for foo,obj in ipairs (tnob) do - ent = obj:get_luaentity() - if ent ~= nil and ent.name ~= nil then - if StartsWith (ent.name, "__builtin:item") then - obj:remove() - end +--- Create and return a unique integer +-- @param tbl temp table +-- @param from - start integer +-- @param to - end integer +-- @return random unique integer between from & to +local function my_random(tbl, from, to) + local num = math.random (from, to) + if tbl[num] then num = my_random(tbl, from, to) end + tbl[num]=num + return num +end + +--- Generate a random unique list for the trader name order +-- @return table of unique random integers +local function gen_trader_order() + local tbl = {} + for i=1,8 do + tbl[#tbl+1] = my_random(tmp_tbl, 1, 8) + end + tmp_tbl = {} + return tbl +end + +--- Finds first unused arena index +-- @return integer index or nil if all arenas are in use! +local function next_index() + + for i, _ in ipairs(arena_pos) do + local used + for _, v in pairs(eggwars.match) do + if v.id == i then + used = true + break -- jump to the outer loop end end + if not used then return i end end end --- WIP reset function to restart game --- reset = function () --- removeDrops(); --- minetest.delete_area({x=-80, y=50, z=-80}, {x=80,y=150, z=80}) --- players_alive = {}; --- centrespawn(); --- for m=1,#players_alive do --- if(m < #islands) then --- islandspawn(m) --- end --- end --- end +-- Check path for correct file presence +-- @param path: folder to check +-- @param name: filename without extension +-- @return truth table including count +local function check_files(path, name) --- Function to spawn centre island -centrespawn = function () - minetest.delete_area({x=-80, y=50, z=-80}, {x=80,y=150, z=80}) - local centre_transformed = table.copy(centre) - centre_transformed.y = centre_transformed.y - 1 - centre_transformed.x = centre_transformed.x - 10 - centre_transformed.z = centre_transformed.z - 10 - local schempath = minetest.get_modpath("eggwars").."/schems"; - local name = "centre" - minetest.debug("centrespawn: " .. minetest.pos_to_string(centre_transformed)) - minetest.place_schematic(centre_transformed, schempath.."/"..name..".mts") + local extension, file, err + local list = {} + list.n = 0 + extension = {"mts", "ewm"} + + for _, entry in ipairs(extension) do + local filename = path .. name .. "." .. entry + file, err = ie.io.open(filename, "rb") + if err then + list[entry] = false + else + file:close() + list[entry] = true + list.n = list.n + 1 + end + end + + return list end --- Function to spawn the Nth island -islandspawn = function (n) - local schem_l = table.copy(eggwars.islands[n]) -- Get a copy of the table, so we can modify it to place the schematic properly - schem_l.y = schem_l.y - 6 - schem_l.x = schem_l.x -7 - schem_l.z = schem_l.z -7 - local schempath = minetest.get_modpath("eggwars").."/schems"; - local name = "island" - minetest.debug("spawn island: " .. minetest.pos_to_string(schem_l)) - minetest.place_schematic(schem_l, schempath.."/"..name..".mts", 0, nil, true) -- Force place schematic - return eggwars.islands[n] -- Return spawn point +--- Inserts & protects the lobby in a new instance +-- @return nothing +local function add_lobby() + -- calculate insertion pos, place schema, protect & save to settings + local pos = vector.add(lobby.pos, lobby.insert_offset) + minetest.place_schematic(pos, schempath.."lobby.mts") + eggwars.protect(lobby.region.p1, lobby.region.p2, false) + loaded.lobby = true + save_persistant() end +-- lobby loading +if not loaded.lobby then + minetest.after(0, add_lobby) +end + +--- Add match status flags to players HUD +-- @param key - match key string +-- @return nothing +local function gen_match_hud(key) + + local match = eggwars.match[key] + local pos = - (0.5 * (#match.player * 20) - 2) + local result = {} + for k, def in pairs(match.player) do + local ndef = { + hud_elem_type = 'image', + position = {x=0.5, y=1}, + scale = {x=1, y=1}, + text = def.hud_img[1], + alignment = {x=0, y=0}, -- table reqd + offset = {x=pos, y=-100} + } + table.insert(result, ndef) + pos = pos + 20 + end + + for k, def in pairs(match.player) do + local player = minetest.get_player_by_name(k) + for i, v in ipairs(result) do + def.hud_id[i] = player:hud_add(v) + end + -- Add Pil + def.pil = player:hud_add({ + hud_elem_type = 'image', + position = {x=0, y=1}, + scale = {x=1, y=0.5}, + text = 'eggwars_pil.png', + alignment = {x=0, y=0}, -- table reqd + offset = {x=70, y=-20} + }) + -- Add match time element + def.remaining = player:hud_add({ + hud_elem_type = 'text', + position = {x=0, y=1}, + scale = {x=128, y=64}, + text = 'Remaining: ' .. match.hud_time .. 'm', + number = '0x00FF00', + alignment = {x=0, y=0}, -- table reqd + offset = {x=70, y=-20} + }) + end +end + +--- Remove match status flags from players HUD +-- @param key - arena key string +-- @return nothing +local function remove_match_hud(key) + for k, def in pairs(eggwars.match[key].player) do + local obj = minetest.get_player_by_name(k) + for _, v in ipairs(def.hud_id) do + obj:hud_remove(v) + end + obj:hud_remove(def.remaining) + obj:hud_remove(def.pil) + end +end + +--- Update match status flag in players HUD +-- @param key - arena key string +-- @param id - hud element id +-- @return nothing +local function update_hud(key, id) + for k, def in pairs(eggwars.match[key].player) do + local obj = minetest.get_player_by_name(k) + if not id then + obj:hud_change(def.remaining, 'text', 'Remaining: ' .. + eggwars.match[key].hud_time .. 'm') + else + obj:hud_change(def.hud_id[id], 'text', def.hud_img[2]) + end + end +end + +--- Add an image that removes itself to a players HUD +-- @param player - object +-- @param image_string - filename of image +-- @param timer - time in seconds it displays +-- @return nothing +local function add_hud_image(player, image_string, timer) + local name = player:get_player_name() + tmp_hud[name] = player:hud_add({ + hud_elem_type = 'image', + position = {x=0.5, y=0.5}, + scale = {x=1, y=1}, + text = image_string, + alignment = {x=0, y=0}, -- table reqd + offset = {x=0, y=0} + }) + minetest.after(timer, function(name) + eggwars.remove_hud_image(name) + end, name) +end + +--- Remove recipes blocked in arena defs +-- NOTE: this function MUST NOT be run with minetest.after it will +-- cause a SIGSEGV error on server shutdown!!! +-- @return nothing +local function modify_recipes() + for i, arena in ipairs(eggwars.arena) do + for j, v in ipairs(arena.blocked_recipes) do + minetest.clear_craft(v) + end + end +end +modify_recipes() + +--- Make non expempt nodes unbreakable +-- @return nothing +local function modify_game() + -- create a list of exempt nodes from the registered arenas + local exempt_node = {} + for _, arena in ipairs(eggwars.arena) do + for _,v in ipairs(arena.exempt_nodes) do + table.insert(exempt_node, v) + end + end + -- parse registered nodes + for item, def in pairs(minetest.registered_nodes) do + local modify = true + for i,v in ipairs(exempt_node) do + if string.find(item, v) then + modify = false + break + end + end + if modify then + minetest.override_item(item, {groups = {unbreakable=1},}) + end + end +end + +--- Provides match events based on time +-- @return nothing +local function match_timer() + -- process each match + for key, def in pairs(eggwars.match) do + def.tmr = def.tmr + r_rate + if not def.sd and def.tmr >= def.suddendeath then + def.sd = true + for k, v in pairs(def.player) do + -- remove remaining eggs + if v.egg then + minetest.remove_node(v.eggpos) + v.egg = false + minetest.sound_play("eggwars_out", { + to_player = k, + gain = 1.0, + }) + update_hud(key, v.hud_id) + end + minetest.sound_play("eggwars_sudden", { + to_player = k, + gain = 1.0, + }) + add_hud_image( + minetest.get_player_by_name(k), + 'eggwars_suddendeath.png', 5 + ) + end + end + if def.sd and def.tmr >= def.max_time then + for k, v in pairs(def.player) do + minetest.sound_play("eggwars_time_over", { + to_player = k, + gain = 1.0, + }) + add_hud_image( + minetest.get_player_by_name(k), + 'eggwars_timeover.png', 5 + ) + end + eggwars.end_match(key) + end + end + -- finally retrigger + minetest.after(r_rate, match_timer) +end + +--- Initialises stats for a new player +-- @param name - players name string +-- @return nothing +local function initialise_stats(name) + stats.player = stats.player or {} + if not stats.player[name] then + stats.player[name] = { + damage = 0, + eggs = 0, + falls = 0, + kills = 0, + pb = { + time = 0, -- utc + kills = 0, + falls = 0, + damage = 0 + }, + plays = 0, + rank = 0, + wins = 0, + } + end +end + +--- Displays match results as a formspec +-- @param match_rank - table of ranked match players +-- @param arena_id - integer index of arena +-- @return nothing +local function display_match_results(match_rank, arena_id) + local get_player_by_name = minetest.get_player_by_name + local fs = { + 'size[8,6]', + 'label[0,0;Rank]', + 'label[1,0;Name]', + 'label[4,0;Kills]', + 'label[5,0;Points]', + 'label[6.1,0;Eggs]', + 'label[7,0;Falls]' + } + for i, v in ipairs(match_rank) do + local c = eggwars.arena[arena_id].colour[v.id] + fs[#fs+1] = 'label[0,'..(0.5 * i)..';'..eggwars.colorize(c, i)..']' + fs[#fs+1] = 'label[1,'..(0.5 * i)..';'..eggwars.colorize(c, v.name)..']' + fs[#fs+1] = 'label[4,'..(0.5 * i)..';'..eggwars.colorize(c, v.kills)..']' + fs[#fs+1] = 'label[5,'..(0.5 * i)..';'..eggwars.colorize(c, v.damage)..']' + fs[#fs+1] = 'label[6.1,'..(0.5 * i)..';'..eggwars.colorize(c, v.eggs)..']' + fs[#fs+1] = 'label[7,'..(0.5 * i)..';'..eggwars.colorize(c, v.falls)..']' + end + fs[#fs+1] = 'button_exit[3,5;2,1;btn_e;OK]' + local res = table.concat(fs) + for i, v in ipairs(match_rank) do + local player = get_player_by_name(v.name) + if player then + minetest.show_formspec(v.name, '', res) + end + end + +end + +--- Updates match players game time hud display every minute +-- @return nothing +local function update_hud_time() + for key, match in pairs(eggwars.match) do + match.hud_time = match.hud_time - 1 + update_hud(key) + end + minetest.after(60, update_hud_time) +end + +--- Spawns a player in air, attempts to prevent spawn trap +-- @return nothing +local function safe_spawn(minp) + local maxp = vector.new(minp.x, minp.y + 30, minp.z) + minp.y = minp.y + 1 + local pos = minetest.find_nodes_in_area(minp, maxp, 'air') + local res = minp + for i,v in ipairs(pos) do + if res.y == v.y - 1 then + return res -- 2 vertical air nodes + else + res = v + end + end +end + +--- Removes a player hud image if its registered +-- @param name - players name +-- @return nothing +eggwars.remove_hud_image = function(name) + if tmp_hud[name] then + local player = minetest.get_player_by_name(name) + player:hud_remove(tmp_hud[name]) + tmp_hud[name] = nil + end +end + +------------------- +-- API Functions -- +------------------- + +--- Displays message for items that cannot be dropped +-- @return nothing +eggwars.drop_msg = function(itemstack, player) + local name = player:get_player_name() + minetest.chat_send_player(name, "Don't be silly, you can't drop that!") +end + +--- Reset arena by index +-- @param arena integer index of registered arena +-- @param n integer index of arena instance +-- @return nothing +eggwars.reset = function(arena, n) + local def = eggwars.arena[arena] + local pos = arena_pos[n] + local p1 = vector.add(pos, def.region.p1) + local p2 = vector.add(pos, def.region.p2) + clean(p1, p2) +end + +--- Spawn hub islands for an arena instance +-- @param arena integer index of registered arena +-- @param n integer index of arena +-- @return nothing +eggwars.centrespawn = function(id, n) + local def = eggwars.arena[id] + local spwn = arena_pos[n] + local p1 = vector.add(spwn, def.hub.offset) + minetest.place_schematic(p1, schempath .. def.hub.schem) + -- place satellites + for i,v in ipairs(def.satellite.pos) do + p1 = vector.add(vector.add(spwn, v), def.satellite.offset) + minetest.place_schematic(p1, schempath .. + def.satellite.schem) + end +end + +--- Spawn island at pos, indexed by n +-- @param arena integer index of registered arena +-- @param pos vector table +-- @param n integer index of island coords +-- @return spawn vector +eggwars.islandspawn = function(arena, pos, n) + local def = eggwars.arena[arena].island + local p1 = vector.add(pos, def.offset) + minetest.place_schematic(p1, schempath .. def.schem, def.rotate[n]) + return pos +end + +--- Creates & protects an arena type in the world +-- @param id - arena index +-- @param n - arena position indexeggwars.match[key] +-- @return nothing +eggwars.create_arena = function(id, n) + local def = eggwars.arena[id] + local pos = arena_pos[n] + eggwars.centrespawn(id, n) + for i = 1, #def.island do + local sp = vector.add(pos, def.island[i]) + eggwars.islandspawn(id, sp, i) + end + local v = { + p1 = vector.add(pos, def.region.p1), + p2 = vector.add(pos, def.region.p2) + } + eggwars.protect(v.p1, v.p2, false) +end + +--- Deletes an arena from the world +-- @param id - arena index +-- @param n - arena position index +-- @return nothing +eggwars.delete_arena = function(arena, n) + local def = eggwars.arena[arena] + local pos = arena_pos[n] + local v = { + p1 = vector.add(pos, def.region.p1), + p2 = vector.add(pos, def.region.p2) + } + eggwars.reset(arena, n) + eggwars.delete_area(v.p1, v.p2) +end + +--- Creates a match instance from registered_players table +-- @return nothing +eggwars.begin_match = function () + + -- A match consists of an instance of a registered arena between 4-8 players + + -- match.alive - players alive count + -- match.arena - registered arena index + -- match.hud_time - remaining time in minutes + -- match.id - instance index + -- match.player[name] + -- alive = bool status + -- color = {r,g,b} + -- damage = hp damage + -- egg = bool - false if dug + -- eggpos = pos of players egg + -- eggs = eggs destroyed count + -- falls = fall count + -- hud_id = hud element ref + -- hud_img = image filename + -- id = integer - player index in the instance + -- kills = kill count + -- rate = gold spawner rate in seconds + -- shop_items = table of available items + -- spawn = spawn point + -- spawner = pos of gold spawner + -- trader = entity obj + -- + -- match.spawners - diamond and ruby spawner positions + -- match.stats - match statistics + -- match.tmr - match timer -minetest.register_on_dieplayer(function(player) - --minetest.chat_send_all(minetest.pos_to_string(player_i[player:get_player_name()])) - --minetest.chat_send_all(minetest.get_node(player_i[player:get_player_name()]).name) - -- Check if egg exists - if player_i[player:get_player_name()] then - if minetest.get_node(player_i[player:get_player_name()]).name ~= "eggwars:egg" then - minetest.chat_send_all("*** "..player:get_player_name().." is " .. minetest.colorize('red','OUT')) -- if not, remove from game - minetest.set_player_privs(player:get_player_name(),{fly=true,fast=true,noclip=true}) -- and give player fly, fast and noclip. - player:set_nametag_attributes({color = {a = 255, r = 0, g = 0, b = 0}}) --Make nametag invisible + local match = {} + local n = next_index() -- arena pos index + local pos = arena_pos[n] -- base vector + local arena, def, rnd_list, key, spwnr, adj, hud_img + + -- Load nonexistant arena into the map or use saved type + if not loaded.arena[n] then + arena = math.random(1, #eggwars.arena) + def = { + arena = arena, + pos = pos, + id = n + } + eggwars.create_arena(arena, n) + loaded.arena[n] = def + else + arena = loaded.arena[n].arena + end + + -- Process crash cleanup if reqd + if #last_state > 0 then + for i,v in ipairs(last_state) do + if vector.equals(pos, v.pos) then + for _, pos in ipairs(v.spawners) do + minetest.get_node_timer(pos):stop() + local w = minetest.get_objects_inside_radius(pos, 2) + for _, object in ipairs(w) do + if not object:is_player() then + object:remove() + end + end + minetest.remove_node(pos) + end + last_state[i] = nil + end + end + end + + -- Create state + local state = { + pos = pos, + spawners = {} + } + + def = eggwars.arena[arena] + rnd_list = gen_trader_order() + key = 'm' .. n + + match.alive = #registered_players + match.arena = arena + match.id = n + match.player = {} + match.spawners = {} + + for id, name in ipairs(registered_players) do + + local player = minetest.get_player_by_name(name) + local sp = vector.add(pos, def.island[id]) + local colour = def.colour[id] + + adj = sp + spwnr = def.spawners.gold.rate + eggwars.player[name] = key + + hud_img = {} + hud_img[1] = ('eggwars_%s.png'):format(def.cs[id][3]) + hud_img[2] = ('eggwars_out_%s.png'):format(def.cs[id][3]) + + match.player[name] = {} + match.player[name].alive = true + match.player[name].color = colour + match.player[name].damage = 0 + match.player[name].egg = true + match.player[name].eggs = 0 + match.player[name].falls = 0 + match.player[name].hud_img = hud_img + match.player[name].hud_id = {} + match.player[name].id = id + match.player[name].kills = 0 + match.player[name].rate = spwnr + match.player[name].shop_items = {} + match.player[name].spawn = sp + + initialise_stats(name) + + player:set_nametag_attributes({color = colour}) + adj.y = adj.y + 2 + + player:set_pos(adj) -- set player position first + + -- Add gold spawner and initialise node timer + adj = vector.add(sp, def.spawners.gold[id]) + minetest.set_node(adj, {name='eggwars:gold_spawner'}) + minetest.get_node_timer(adj):start(spwnr) + match.player[name].spawner = adj + table.insert(state.spawners, adj) + + -- Add spawner bot + adj = vector.add(sp, def.bot.offset[id]) + local obj = minetest.add_entity(adj, 'eggwars:bot', name) + local yaw = ((math.pi * def.bot.yaw[id])/180) + obj:set_yaw(yaw) + + -- Add egg + adj = vector.add(sp, def.egg_offset[id]) + minetest.set_node(adj, {name='eggwars:egg' .. id}) + match.player[name].eggpos = adj + + -- set metadata + local meta = minetest.get_meta(adj) + meta:set_string('owner', name) + meta:set_string('infotext', name .. "'s egg") + + local trader_name = 'Trader '.. def.trader.names[rnd_list[id]] + local staticdata = minetest.serialize({owner = name, nametag = trader_name}) + adj = vector.add(sp, def.trader.offset[id]) + obj = minetest.add_entity(adj, 'eggwars:trader', staticdata) + yaw = ((math.pi * def.trader.yaw[id])/180) + obj:set_yaw(yaw) + + -- Create players shop items table + match.player[name].shop_items = { + -- Add players wool colour + { + name = { + name="wool:" .. def.cs[id][3], + count=20, + wear=0, + metadata="" + }, + description = def.cs[id][1] .. " Wool", + image = 'wool_' .. def.cs[id][3] .. '.png', + cost = {name="default:gold_ingot", count=5, wear=0, metadata=""}, + entry = 0, + } + } + -- Add the registered shop items + for j=1, #eggwars.shop_items do -- add the rest + table.insert(match.player[name].shop_items, eggwars.shop_items[j]) + end + + -- Give arena privs + minetest.set_player_privs(name, {interact=true, shout=true}) + + end + + -- Diamond spawners + spwnr = def.spawners.diamond.rate + for idx, v in ipairs(def.spawners.diamond) do + adj = vector.add(pos, v) + minetest.set_node(adj, {name='eggwars:diamond_spawner'}) + minetest.get_node_timer(adj):start(spwnr) + table.insert(match.spawners, adj) + table.insert(state.spawners, adj) + end + + -- Ruby spawners + spwnr = def.spawners.ruby.rate + for idx, v in ipairs(def.spawners.ruby) do + adj = vector.add(pos, v) + minetest.set_node(adj, {name='eggwars:ruby_spawner'}) + minetest.get_node_timer(adj):start(spwnr) + table.insert(match.spawners, adj) + table.insert(state.spawners, adj) + end + + -- initialise match timer vars + match.tmr = 0 + match.max_time = def.timer.max_time + match.hud_time = match.max_time / 60 -- minutes + match.suddendeath = def.timer.suddendeath + + -- store match + eggwars.match[key] = match + + -- Add hud to match players + gen_match_hud(key) + + -- persist dirty state in case of crash + table.insert(last_state, state) + save_persistant() + + registered_players = {} -- reset +end + +--- Ends and cleans up a match instance +-- @param key - match key string +-- @return nothing +eggwars.end_match = function(key) + + local def = eggwars.match[key] + local match_rank = {} + local windex + + remove_match_hud(key) + + for _, pos in ipairs(def.spawners) do + minetest.get_node_timer(pos):stop() + local w = minetest.get_objects_inside_radius(pos, 2) + for _, obj in ipairs(w) do + if not obj:is_player() then + obj:remove() + end + end + minetest.remove_node(pos) + end + + for name, pdef in pairs(def.player) do + --stop island spawner + minetest.get_node_timer(pdef.spawner):stop() + -- remove objects on gold spawner + local w = minetest.get_objects_inside_radius(pdef.spawner, 2) + for _, obj in ipairs(w) do + if not obj:is_player() then + obj:remove() + end + end + -- remove spawner node + minetest.remove_node(pdef.spawner) + -- Update stats + local s = stats.player[name] + s.kills = s.kills + pdef.kills + s.falls = s.falls + pdef.falls + s.damage = s.damage + pdef.damage + s.plays = s.plays + 1 + + if pdef.win then + s.wins = s.wins + 1 + end + + -- rank match player + local res = { + damage = pdef.damage, + eggs = pdef.eggs, + falls = pdef.falls, + id = pdef.id, -- colour ref + kills = pdef.kills, + name = name, + win = pdef.win or false + } + local idx = #match_rank + 1 + + for i,v in ipairs(match_rank) do + if v.win then windex = i end + if res.kills > v.kills then + idx = i + break + end + end + table.insert(match_rank, idx, res) + + local player = minetest.get_player_by_name(name) + if player then + -- reset spectator + if not pdef.alive then + minetest.sound_play("eggwars_game_over", { + to_player = name, + gain = 0.5 + }) + player:set_nametag_attributes({ + color = {a = 255, r = 255, g = 255, b = 255}}) --Make nametag visible + player:set_properties({visual_size={x=1, y=1, z=1}}) --Make player visible + else + -- reset player + if eggwars.armor then eggwars.clear_armor(player) end + eggwars.clear_inventory(player) + if pdef.win then + minetest.chat_send_all(minetest.colorize( + "green", "*** " .. name .. " won their match!") + ) + eggwars.add_hud_image(player, 'eggwars_winner.png', 5) + minetest.sound_play("eggwars_winner", { + to_player = killer, + gain = 0.5 + }) + end + end + minetest.set_player_privs(name, {shout=true}) -- set lobby privs + player:set_pos(lobby.pos) -- move player + end + stats.player[name] = s + eggwars.player[name] = nil + end + + -- rank winner + local tmp + + if windex then + tmp = match_rank[windex] + table.remove(match_rank, windex) + table.insert(match_rank, 1, tmp) + else + tmp = match_rank[1] + end + + local rank = { + damage = tmp.damage, + eggs = tmp.eggs, + falls = tmp.falls, + kills = tmp.kills, + name = tmp.name, + wins = stats.player[tmp.name].wins + } + table.insert(stats.rankings, rank) + if #stats.rankings > 1 then + table.sort(stats.rankings, function(a,b) return a.wins > b.wins end) + if #stats.rankings > 20 then + table.remove(stats.rankings, #stats.rankings) + end + end + + eggwars.reset(def.arena, def.id) + + -- match over so remove it and remove last state + eggwars.match[key] = nil + last_state[def.id] = nil + save_persistant() + display_match_results(match_rank, def.arena) +end + +--- Colour a message string using rgb +-- @param rgb - rgb table +-- @param msg - string to colour +-- @return a minetest colorized string +eggwars.colorize = function(rgb, msg) + local red = string.format('%x', rgb.r) + local green = string.format('%x', rgb.g) + local blue = string.format('%x', rgb.b) + -- modify if reqd + if red:len() == 1 then red = 0 .. red end + if green:len() == 1 then green = 0 .. green end + if blue:len() == 1 then blue = 0 .. blue end + -- And now concatenate it too + local colour = "#" .. red .. green .. blue + return minetest.colorize(colour, msg) +end + +--- Broadcast match chat +-- @return nothing +eggwars.chat_send_match = function(key, msg) + local def = eggwars.match[key].player + for name, _ in pairs(def) do + minetest.chat_send_player(name, msg) + end +end + +------------------------------------- +-- Registered callbacks -- +------------------------------------- + +minetest.register_on_dieplayer(function(player, reason) + + local name = player:get_player_name() + local key = eggwars.player[name] + local def = eggwars.match[key] + + if def then + + if def.player[name].alive and not def.player[name].egg then + + minetest.chat_send_all("*** "..name.." is " .. + minetest.colorize('red','OUT')) + + -- set privs for spectating + minetest.set_player_privs(name, {fly=true,fast=true,shout=true}) + eggwars.add_hud_image(player, 'eggwars_out.png', 5) + + -- record the kill + local killer + if reason.object then + killer = reason.object:get_player_name() + local upd = def.player[killer].kills + 1 + def.player[killer].kills = upd + end + + -- Make nametag invisible + player:set_nametag_attributes({color = {a = 0, r = 0, g = 0, b = 0}}) player:set_properties({visual_size={x=0, y=0}}) --Make player invisible - for j=1,#players_alive do - if players_alive[j] == player:get_player_name() then - table.remove(players_alive,j) - end - end - if #players_alive == 1 then - minetest.chat_send_all(minetest.colorize("green", "*** " .. players_alive[1] .. " has won!")) - reset(); + + if eggwars.armor then eggwars.clear_armor(player) end + + def.player[name].alive = false + def.alive = def.alive - 1 + + eggwars.clear_inventory(player) + + eggwars.match[key] = def + + update_hud(key, def.player[name].id) + + -- Are we down to 1 player alive yet? + if def.alive == 1 then + def.player[killer].win = true + + eggwars.end_match(key) + end else - minetest.chat_send_all("*** "..player:get_player_name().." paid Hades a visit but was revived by their egg.") - --player:set_player_privs({interact=true,shout=true}) + -- Clean inventory & announce + eggwars.clear_inventory(player) + minetest.chat_send_all("*** " .. + name.." paid Hades a visit and was revived by their egg.") end end end) --- Upon respawning, move players back to their island. minetest.register_on_respawnplayer(function(player) - if player_i[player:get_player_name()] then - local respawn_pos = table.copy(player_i[player:get_player_name()]) - respawn_pos.y = respawn_pos.y + 2 - minetest.after(0.1,function () player:setpos(respawn_pos) end) -- Wait until they have actually respawned before moving - else - minetest.after(0.1,function () player:setpos(eggwars.waiting_area) end) -- Wait until they have actually respawned before moving + local name = player:get_player_name() + local pos = lobby.pos -- initialise with lobby vector + -- match override + if eggwars.player[name] then + local key = eggwars.player[name] + pos = vector.new(eggwars.match[key].player[name].spawn) end + player:set_pos(safe_spawn(pos)) + return true + -- Wait for respawn before moving + --minetest.after(0.1, function () player:set_pos(pos) end) end) -minetest.register_chatcommand("register", { +minetest.register_on_joinplayer(function(player) + -- handle the player - no items or interact in the hub + if eggwars.armor then eggwars.clear_armor(player) end + eggwars.clear_inventory(player) + local name = player:get_player_name() + minetest.set_player_privs(name, {shout=true}) -- + player:set_pos(lobby.pos) + add_hud_image(player, 'eggwars_welcome.png', 10) + tmp_hud[name] = {} +end) + +minetest.register_on_leaveplayer(function(player) + -- Handle players exiting during a match + local name = player:get_player_name() + local key = eggwars.player[name] + local def = eggwars.match[key] + if key then + def.player[name].alive = false + def.alive = eggwars.match[def.match].alive - 1 + eggwars.match[key] = def + end + if tmp_hud[name] then tmp_hud[name] = nil end +end) + +minetest.register_on_chat_message(function(name, message) + -- Let's colour the chat! + local txt = "<" .. name .. "> " .. message + if eggwars.player[name] then + local key = eggwars.player[name] + local def = eggwars.match[key] + txt = eggwars.colorize(def.player[name].color, message) + eggwars.chat_send_match(key, txt) + else + -- player in lobby + minetest.chat_send_all(txt) -- broadcast + end + return true -- return as handled! +end) + +minetest.register_on_player_hpchange(function(player, hp_change, reason) + if player then + local name = player:get_player_name() + local key = eggwars.player[name] + local match = eggwars.match[key] + if reason.object then + local pname = reason.object:get_player_name() + local damage = match.player[pname].damage + hp_change + eggwars.match[key].player[pname].damage = damage + elseif reason.type == 'fall' then + local falls = match.player[name].falls + 1 + eggwars.match[key].player[name].falls = falls + end + end +end, false) + +----------------------------------------- +-- Registered chat commands -- +----------------------------------------- +minetest.register_chatcommand('admin', { + description = 'gamehub management tool', + params = '{load|save} [name]', + func = function(name, param) + -- secure access + if not minetest.get_player_privs(name).server then + return false, "Insufficient privs!" + end + + local cmd, fn, pos1, pos2, helper, list, param2, player + + helper = [[Usage: + /admin load + /admin save + ]] + + list = {} + player = minetest.get_player_by_name(name) + + if not player then + return false, "You need to be playing to use this command!" + end + + for word in param:gmatch("%S+") do + list[#list+1] = word + end + + if #list < 2 then return false, helper end + + cmd = list[1] + fn = list[2] + + if cmd == 'load' then + + -- last entry takes precedence + local folders = { + MP .. "/schems/", + WP .. "/schems/" + } + + local path, folder, file, err, msg + msg = {} + for i, v in ipairs(folders) do + + local check = check_files(v, fn) + + if check.n == 2 then + + folder = v + msg[#msg+1] = "file set found in " .. v + + elseif check.n == 1 then + msg[#msg+1] = v.."."..k.." found..." + elseif check.n == 0 then + msg[#msg + 1] = "no files found in " .. v + end + + minetest.chat_send_player(name, table.concat(msg, "\n")) + + check.n = nil -- reset + + end + + if not folder then return end + + path = folder .. fn .. ".mts" + + -- add mts using player current pos + local pos = vector.round(player:get_pos()) + + err = minetest.place_schematic(pos, path, nil, nil, true) + + if err == nil then + minetest.chat_send_player(name, "could not open file " .. path) + return + end + + -- add nodes with metadata + path = folder .. fn .. ".ewm" + file, err = ie.io.open(path, "rb") + + if err then + minetest.chat_send_player(name, "could not open meta file " + .. fn .. ".ewm") + return + end + + local value = file:read("*a") + file:close() + + local count = eggwars.deserialize(pos1, value) + + minetest.chat_send_player(name, "replaced " .. count .. + " nodes...") + + elseif cmd == 'save' then + + pos1 = vector.new(list[3]) + pos2 = vector.new(list[4]) + + local area = areas.areas[id] + + -- serialize metadata + local result, count = eggwars.serialize_meta(pos1, pos2) + + local path = WP .. "/schems" + local filename = path .. "/" .. fn .. ".ewm" + local file, err = io.open(filename, "wb") + + if err ~= nil then + minetest.log(name, "Could not save file to \"" .. filename .. "\"") + return + end + + file:write(result) + file:flush() + file:close() + + minetest.chat_send_player(name, "Saved " .. count .. + " nodes to \"" .. filename .. "\"") + + -- create schematic + filename = path .. "/" .. fn .. ".mts" + minetest.create_schematic(area.pos1, area.pos2, nil, filename) + + minetest.chat_send_player(name, "Saved \"" .. filename .. "\"") + + else + return true, helper + end + end +}) + +-- register for a match +minetest.register_chatcommand("r", { params = "", description = "Join match", func = function(name, param) - if #eggwars.registered_players < 8 then - if match_running == false then - local contd = true; - for p=1,#eggwars.registered_players do - if eggwars.registered_players[p] == name then - contd = false; - minetest.chat_send_player(name,"You have already registered") + if #registered_players < 8 then -- max 8 players in a match + if #eggwars.match < 8 then -- max 8 matches on the server + for i, v in ipairs(registered_players) do + if registered_players[v] == name then + return true, "You have already registered" end end - if contd then - eggwars.registered_players[#eggwars.registered_players+1] = name; - end - if #eggwars.registered_players == 8 then - begin_match(); + eggwars.remove_hud_image(name) + registered_players[#registered_players+1] = name; + if #registered_players == 8 then + eggwars.begin_match(); else - minetest.chat_send_all(#eggwars.registered_players .. "/8 players have registered! Use /register to join."); + minetest.chat_send_all(#registered_players .. + "/8 players have registered! Use /register to join."); end else - minetest.chat_send_player(name,"Sorry. A match is already running. Please use /start once their match has finished."); + return true, "Sorry the max number of games are running." .. + "Please use /start once a match finishes." end else - minetest.chat_send_player(name,"Sorry. 8 players have already registered. Try registering after their game has begun.") + return true, "Sorry. 8 players have already registered." .. + "Try registering after their game has begun." end end, }) -minetest.register_chatcommand("start", { +-- start match +minetest.register_chatcommand("s", { params = "", - description = "Starts the game", + description = "Starts match if min match players has been reached", func = function(name, param) - if #eggwars.registered_players > 0 then -- Can't have a match on their own! - begin_match() + if #registered_players >= min_match_players then + eggwars.begin_match() end end }) -begin_match = function () - for k=1,#eggwars.registered_players do - local player = minetest.get_player_by_name(eggwars.registered_players[k]); - local player_n = eggwars.registered_players[k]; - minetest.set_player_privs(player_n, {interact=true,shout=true}); - player:set_nametag_attributes({color = allowed_colours[k]}) - player_colours[player_n] = allowed_colours[k] - islandspawn(k); - player:setpos(eggwars.islands[k]) - player_i[player_n] = eggwars.islands[k]; - players_alive[i] = player_n; +-- quit match +minetest.register_chatcommand("q", { + params = "", + description = "Quit the match you are playing", + func = function(name, param) + if #registered_players > 0 then + for i, v in ipairs(registered_players) do + if registered_players[v] == name then + registered_players[v] = nil + return true, "match quit!" + end + end + end + if eggwars.player[name] then + local key, match, player, count + key = eggwars.player[name] + match = eggwars.match[key] + player = match.player[name] + if player.egg then + minetest.remove_node(player.eggpos) + end + count = match.alive - 1 + eggwars.match[key].alive = count + eggwars.match[key].player[name].alive = false + eggwars.match[key].player[name].egg = false + eggwars.player[name] = nil + if match.alive == 1 then + for k,v in pairs(eggwars.match[key].player) do + if v.alive then + v.win = true + minetest.chat_send_all(minetest.colorize( + "green", "*** " .. name .. " won their match!") + ) + local obj = minetest.get_player_by_name(k) + eggwars.add_hud_image(obj, 'eggwars_winner.png', 5) + eggwars.end_match(key) + break + end + end + end + end end - centrespawn(); - match_running = true; - eggwars.registered_players = {}; -- Reset list of registered players -end +}) -minetest.register_on_joinplayer(function(player) - minetest.set_node(eggwars.waiting_area, {name = "default:dirt_with_grass"}) - player:setpos(eggwars.waiting_area) -end) - --- Let's colour the chat! - -minetest.register_on_chat_message(function(name, message) - local found = false; - for i=1,#players_alive do - if players_alive[i] == name then - found = true; +-- end match - development +minetest.register_chatcommand("e", { + params = "", + description = "End the game", + func = function(name, param) + local key = eggwars.player[name] + if key then + eggwars.end_match(key) end end - if found == true then - -- local colour = "#" .. string.format('%x', player_colours[name].r) .. string.format('%x', player_colours[name].g) .. string.format('%x', player_colours[name].b) - - -- Let's check if the hex version has one or more chars - local red = string.format('%x', player_colours[name].r) - if red:len() == 1 then - red = 0 .. red - end - local green = string.format('%x', player_colours[name].g) - if green:len() == 1 then - green = 0 .. green - end - local blue = string.format('%x', player_colours[name].b) - if blue:len() == 1 then - blue = 0 .. blue - end - -- And now concatenate it too - local colour = "#" .. red .. green .. blue - minetest.chat_send_all(minetest.colorize(colour, "<" .. name .. "> ") .. message) - else - minetest.chat_send_all("<" .. name .. "> " .. message) - end - return true; -end) +}) +-- list players minetest.register_chatcommand("who", { params = "", - description = "See players in match", + description = "List players in matches", func = function(name, param) - local text = "Players in match: " - for i=1,#players_alive do - local red = string.format('%x', player_colours[players_alive[i]].r) - if red:len() == 1 then - red = 0 .. red - end - local green = string.format('%x', player_colours[players_alive[i]].g) - if green:len() == 1 then - green = 0 .. green - end - local blue = string.format('%x', player_colours[players_alive[i]].b) - if blue:len() == 1 then - blue = 0 .. blue - end - -- And now concatenate it too - local colour = "#" .. red .. green .. blue - text = text .. minetest.colorize(colour,players_alive[i]) - end - minetest.chat_send_player(name,text) + local text = {} + for k,v in pairs(eggwars.match) do + text[#text+1] = "Players in match: " .. k .. " " + for key, def in pairs(v.player) do + text[#text+1] = eggwars.colorize(def.color, key) + end + text[#text+1] = '\n' + end + return true, table.concat(text) end }) --- Kill the player if they fall under a y=50 --- minetest.register_globalstep(function(dtime) --- for i=1,#players_alive do --- local curr_player = minetest.get_player_by_name(players_alive[i]) --- if curr_player:getpos().y < 50 then --- curr_player:setpos(eggwars.waiting_area) -- Move them here temporarily to prevent them from dying repeatedly --- minetest.after(0.1,function () curr_player:set_hp(0) end) --- end --- end --- end) +-- run functions after all mods are loaded! +minetest.after(0, modify_game) +minetest.after(0, set_time) +minetest.after(0, match_timer) +minetest.after(0, update_hud_time) -minetest.set_mapgen_params({mgname = "singlenode"}) -minetest.debug('[LOADED] Eggwars') \ No newline at end of file +minetest.log('action', '[LOADED] Eggwars') diff --git a/models/eggwars_character.b3d b/models/eggwars_character.b3d new file mode 100644 index 0000000..9ab4543 Binary files /dev/null and b/models/eggwars_character.b3d differ diff --git a/models/eggwars_egg.obj b/models/eggwars_egg.obj new file mode 100755 index 0000000..6548698 --- /dev/null +++ b/models/eggwars_egg.obj @@ -0,0 +1,3397 @@ +# Blender v2.79 (sub 0) OBJ File: '' +# www.blender.org +mtllib eggg.mtl +o BezierCircle_Mesh +v -0.170034 -0.410792 -0.029982 +v -0.213594 -0.382633 -0.037662 +v -0.203810 -0.382633 -0.074181 +v -0.162244 -0.410792 -0.059052 +v 0.349413 -0.109164 0.061611 +v 0.333406 -0.109164 0.121350 +v 0.325238 -0.163254 0.118377 +v 0.340852 -0.163255 0.060101 +v -0.272827 0.269477 -0.048106 +v -0.244472 0.314138 -0.043107 +v -0.233273 0.314138 -0.084904 +v -0.260328 0.269477 -0.094751 +v 0.048726 0.451004 0.008592 +v 0.046494 0.451004 0.016922 +v 0.090163 0.437776 0.032817 +v 0.094492 0.437776 0.016662 +v -0.250886 -0.348187 -0.044238 +v -0.239393 -0.348187 -0.087132 +v 0.311917 -0.214988 0.113528 +v 0.326893 -0.214988 0.057640 +v -0.212288 0.354085 -0.037432 +v -0.202563 0.354085 -0.073727 +v 0.130843 0.416689 0.047623 +v 0.137124 0.416689 0.024179 +v -0.282084 -0.308241 -0.049740 +v -0.269162 -0.308241 -0.097967 +v 0.293281 -0.263580 0.106745 +v 0.307361 -0.263580 0.054196 +v -0.176447 0.388531 -0.031113 +v -0.168364 0.388531 -0.061279 +v 0.168365 0.388531 0.061280 +v 0.176448 0.388531 0.031113 +v -0.307361 -0.263580 -0.054196 +v -0.293280 -0.263580 -0.106746 +v 0.269162 -0.308241 0.097967 +v 0.282084 -0.308241 0.049739 +v -0.137123 0.416689 -0.024178 +v -0.130843 0.416689 -0.047622 +v 0.202563 0.354085 0.073728 +v 0.212289 0.354085 0.037432 +v -0.326892 -0.214988 -0.057640 +v -0.311917 -0.214989 -0.113529 +v 0.239393 -0.348187 0.087132 +v 0.250886 -0.348187 0.044238 +v -0.094492 0.437776 -0.016662 +v -0.090163 0.437776 -0.032816 +v 0.233273 0.314138 0.084905 +v 0.244473 0.314138 0.043108 +v -0.340852 -0.163255 -0.060101 +v -0.325237 -0.163255 -0.118377 +v 0.203810 -0.382633 0.074180 +v 0.213594 -0.382633 0.037662 +v -0.048726 0.451004 -0.008591 +v -0.046493 0.451004 -0.016922 +v 0.260328 0.269477 0.094752 +v 0.272827 0.269477 0.048107 +v -0.349413 -0.109164 -0.061611 +v -0.333406 -0.109163 -0.121350 +v 0.162245 -0.410792 0.059052 +v 0.170035 -0.410792 0.029981 +v 0.283561 0.220886 0.103208 +v 0.297176 0.220886 0.052400 +v -0.352750 -0.053500 -0.062200 +v -0.336590 -0.053500 -0.122510 +v 0.114532 -0.431878 0.041686 +v 0.120032 -0.431878 0.021164 +v 0.302807 0.169153 0.110213 +v 0.317345 0.169153 0.055957 +v -0.351038 0.002949 -0.061898 +v -0.334957 0.002949 -0.121914 +v 0.060506 -0.445106 0.022023 +v 0.063411 -0.445106 0.011181 +v 0.317899 0.115060 0.115705 +v 0.333162 0.115060 0.058745 +v -0.344450 0.059397 -0.060736 +v -0.328670 0.059398 -0.119626 +v 0.328671 0.059397 0.119626 +v 0.344450 0.059397 0.060736 +v -0.333162 0.115060 -0.058745 +v -0.317899 0.115060 -0.115705 +v 0.334957 0.002949 0.121914 +v 0.351038 0.002949 0.061898 +v -0.317345 0.169153 -0.055956 +v -0.302807 0.169152 -0.110212 +v -0.063411 -0.445106 -0.011181 +v -0.120031 -0.431878 -0.021165 +v -0.114532 -0.431878 -0.041686 +v -0.060506 -0.445106 -0.022023 +v 0.336591 -0.053501 0.122510 +v 0.352750 -0.053501 0.062200 +v -0.297175 0.220886 -0.052399 +v -0.283561 0.220886 -0.103207 +v -0.279068 0.169153 -0.161120 +v -0.292977 0.115061 -0.169150 +v -0.105554 -0.431878 -0.060942 +v -0.055762 -0.445106 -0.032194 +v 0.308697 0.002949 0.178227 +v 0.310204 -0.053501 0.179097 +v -0.261331 0.220886 -0.150879 +v -0.149526 -0.410792 -0.086329 +v 0.307269 -0.109164 0.177402 +v -0.239920 0.269477 -0.138518 +v -0.187832 -0.382633 -0.108445 +v 0.299740 -0.163255 0.173055 +v -0.214986 0.314138 -0.124122 +v 0.042849 0.451004 0.024739 +v 0.083095 0.437776 0.047975 +v -0.220626 -0.348187 -0.127379 +v 0.287465 -0.214989 0.165967 +v -0.186683 0.354085 -0.107782 +v 0.120585 0.416689 0.069620 +v -0.248061 -0.308241 -0.143218 +v 0.270290 -0.263580 0.156051 +v -0.155166 0.388531 -0.089585 +v 0.155166 0.388531 0.089585 +v -0.270289 -0.263580 -0.156052 +v 0.248061 -0.308241 0.143218 +v -0.120585 0.416689 -0.069620 +v 0.186683 0.354085 0.107782 +v -0.287464 -0.214989 -0.165968 +v 0.220626 -0.348187 0.127378 +v -0.083095 0.437776 -0.047974 +v 0.214986 0.314138 0.124123 +v -0.299740 -0.163255 -0.173055 +v 0.187832 -0.382633 0.108445 +v -0.042849 0.451004 -0.024739 +v 0.239920 0.269477 0.138518 +v -0.307269 -0.109163 -0.177402 +v 0.149526 -0.410792 0.086328 +v 0.261331 0.220886 0.150880 +v -0.310203 -0.053500 -0.179097 +v 0.105554 -0.431878 0.060942 +v 0.279068 0.169153 0.161121 +v -0.308697 0.002949 -0.178227 +v 0.055762 -0.445106 0.032194 +v 0.292977 0.115060 0.169150 +v -0.302904 0.059398 -0.174883 +v 0.302904 0.059397 0.174883 +v 0.246850 0.169153 0.207132 +v 0.259153 0.115060 0.217456 +v -0.267934 0.059398 -0.224824 +v -0.273059 0.002949 -0.229124 +v 0.267934 0.059397 0.224824 +v -0.259153 0.115061 -0.217456 +v 0.273059 0.002949 0.229124 +v -0.246850 0.169153 -0.207131 +v -0.093368 -0.431878 -0.078345 +v -0.049325 -0.445106 -0.041388 +v 0.274392 -0.053501 0.230241 +v -0.231161 0.220886 -0.193967 +v -0.132263 -0.410792 -0.110982 +v 0.271795 -0.109164 0.228063 +v -0.212221 0.269477 -0.178075 +v -0.166147 -0.382633 -0.139414 +v 0.265135 -0.163255 0.222475 +v -0.190166 0.314138 -0.159568 +v 0.037902 0.451004 0.031804 +v 0.073502 0.437776 0.061676 +v -0.195155 -0.348187 -0.163755 +v 0.254277 -0.214989 0.213364 +v -0.165131 0.354085 -0.138561 +v 0.106664 0.416689 0.089501 +v -0.219422 -0.308241 -0.184117 +v 0.239085 -0.263580 0.200616 +v -0.137252 0.388531 -0.115168 +v 0.137252 0.388531 0.115169 +v -0.239085 -0.263580 -0.200616 +v 0.219422 -0.308241 0.184117 +v -0.106664 0.416689 -0.089501 +v 0.165131 0.354085 0.138562 +v -0.254277 -0.214989 -0.213364 +v 0.195155 -0.348187 0.163755 +v -0.073502 0.437776 -0.061675 +v 0.190166 0.314138 0.159569 +v -0.265135 -0.163255 -0.222475 +v 0.166147 -0.382633 0.139414 +v -0.037902 0.451004 -0.031803 +v 0.212221 0.269477 0.178075 +v -0.271795 -0.109163 -0.228063 +v 0.132263 -0.410792 0.110982 +v 0.231161 0.220886 0.193968 +v -0.274391 -0.053500 -0.230241 +v 0.093368 -0.431878 0.078345 +v 0.049325 -0.445106 0.041388 +v 0.178076 0.269477 0.212222 +v 0.193968 0.220886 0.231161 +v -0.230241 -0.053500 -0.274391 +v -0.228063 -0.109163 -0.271795 +v 0.110982 -0.410792 0.132263 +v 0.078345 -0.431878 0.093368 +v 0.207131 0.169153 0.246850 +v -0.229124 0.002949 -0.273059 +v 0.041389 -0.445106 0.049325 +v 0.217456 0.115060 0.259153 +v -0.224824 0.059398 -0.267934 +v 0.224824 0.059397 0.267934 +v -0.217456 0.115061 -0.259153 +v 0.229124 0.002949 0.273059 +v -0.207131 0.169153 -0.246850 +v -0.078345 -0.431878 -0.093368 +v -0.041388 -0.445106 -0.049325 +v 0.230241 -0.053501 0.274392 +v -0.193968 0.220886 -0.231161 +v -0.110982 -0.410792 -0.132263 +v 0.228063 -0.109164 0.271795 +v -0.178075 0.269477 -0.212221 +v -0.139414 -0.382633 -0.166148 +v 0.222475 -0.163255 0.265135 +v -0.159568 0.314138 -0.190166 +v 0.031803 0.451004 0.037902 +v 0.061676 0.437776 0.073502 +v -0.163755 -0.348187 -0.195155 +v 0.213364 -0.214989 0.254277 +v -0.138561 0.354085 -0.165131 +v 0.089501 0.416689 0.106664 +v -0.184117 -0.308241 -0.219422 +v 0.200616 -0.263580 0.239085 +v -0.115168 0.388531 -0.137252 +v 0.115168 0.388531 0.137252 +v -0.200616 -0.263580 -0.239085 +v 0.184117 -0.308241 0.219422 +v -0.089501 0.416689 -0.106664 +v 0.138561 0.354085 0.165132 +v -0.213363 -0.214989 -0.254277 +v 0.163755 -0.348187 0.195155 +v -0.061675 0.437776 -0.073501 +v 0.159568 0.314138 0.190166 +v -0.222475 -0.163255 -0.265135 +v 0.139415 -0.382633 0.166147 +v -0.031803 0.451004 -0.037902 +v 0.143218 -0.308241 0.248061 +v 0.127378 -0.348187 0.220626 +v -0.047975 0.437776 -0.083095 +v -0.069620 0.416689 -0.120585 +v 0.107782 0.354085 0.186684 +v 0.124123 0.314138 0.214987 +v -0.173055 -0.163255 -0.299740 +v -0.165968 -0.214989 -0.287464 +v 0.108445 -0.382633 0.187832 +v -0.024739 0.451004 -0.042849 +v 0.138518 0.269477 0.239920 +v -0.177402 -0.109163 -0.307269 +v 0.086329 -0.410792 0.149526 +v 0.150879 0.220886 0.261331 +v -0.179096 -0.053500 -0.310204 +v 0.060942 -0.431878 0.105554 +v 0.161121 0.169153 0.279068 +v -0.178227 0.002949 -0.308697 +v 0.032194 -0.445106 0.055762 +v 0.169150 0.115060 0.292977 +v -0.174883 0.059398 -0.302904 +v 0.174883 0.059397 0.302904 +v -0.169150 0.115061 -0.292977 +v 0.178227 0.002949 0.308697 +v -0.161121 0.169153 -0.279068 +v -0.060942 -0.431878 -0.105554 +v -0.032194 -0.445106 -0.055762 +v 0.179097 -0.053501 0.310204 +v -0.150879 0.220886 -0.261331 +v -0.086329 -0.410792 -0.149526 +v 0.177402 -0.109164 0.307269 +v -0.138518 0.269477 -0.239920 +v -0.108445 -0.382633 -0.187832 +v 0.173055 -0.163255 0.299740 +v -0.124122 0.314138 -0.214986 +v 0.024739 0.451004 0.042850 +v 0.047975 0.437776 0.083096 +v -0.127378 -0.348187 -0.220626 +v 0.165968 -0.214989 0.287465 +v -0.107782 0.354085 -0.186683 +v 0.069620 0.416689 0.120585 +v -0.143218 -0.308241 -0.248061 +v 0.156051 -0.263580 0.270290 +v -0.089585 0.388531 -0.155165 +v 0.089585 0.388531 0.155166 +v -0.156051 -0.263580 -0.270289 +v 0.113529 -0.214989 0.311917 +v 0.106745 -0.263580 0.293281 +v -0.061279 0.388531 -0.168364 +v -0.073727 0.354085 -0.202563 +v 0.047622 0.416689 0.130843 +v 0.061279 0.388531 0.168365 +v -0.106745 -0.263580 -0.293280 +v -0.097967 -0.308241 -0.269162 +v 0.097967 -0.308241 0.269162 +v -0.047622 0.416689 -0.130842 +v 0.073727 0.354085 0.202563 +v -0.113529 -0.214989 -0.311917 +v 0.087132 -0.348187 0.239393 +v -0.032816 0.437776 -0.090163 +v 0.084904 0.314138 0.233274 +v -0.118377 -0.163255 -0.325237 +v 0.074180 -0.382633 0.203810 +v -0.016922 0.451004 -0.046493 +v 0.094752 0.269477 0.260328 +v -0.121350 -0.109163 -0.333406 +v 0.059052 -0.410792 0.162245 +v 0.103207 0.220886 0.283561 +v -0.122509 -0.053500 -0.336590 +v 0.041686 -0.431878 0.114532 +v 0.110212 0.169153 0.302807 +v -0.121914 0.002949 -0.334957 +v 0.022022 -0.445106 0.060506 +v 0.115705 0.115060 0.317899 +v -0.119626 0.059398 -0.328670 +v 0.119626 0.059397 0.328671 +v -0.115705 0.115061 -0.317899 +v 0.121914 0.002949 0.334957 +v -0.110212 0.169153 -0.302807 +v -0.041686 -0.431878 -0.114532 +v -0.022022 -0.445106 -0.060506 +v 0.122510 -0.053501 0.336591 +v -0.103207 0.220886 -0.283561 +v -0.059052 -0.410792 -0.162245 +v 0.121350 -0.109164 0.333406 +v -0.094752 0.269477 -0.260328 +v -0.074180 -0.382633 -0.203810 +v 0.118377 -0.163255 0.325238 +v -0.084904 0.314138 -0.233273 +v 0.016922 0.451004 0.046494 +v 0.032816 0.437776 0.090164 +v -0.087132 -0.348187 -0.239394 +v -0.037662 -0.382633 -0.213595 +v -0.029982 -0.410792 -0.170034 +v 0.061611 -0.109164 0.349413 +v 0.060101 -0.163255 0.340852 +v -0.043107 0.314138 -0.244472 +v -0.048107 0.269477 -0.272827 +v 0.008592 0.451004 0.048727 +v 0.016662 0.437776 0.094493 +v -0.044237 -0.348187 -0.250887 +v 0.057640 -0.214989 0.326893 +v -0.037432 0.354085 -0.212288 +v 0.024179 0.416689 0.137124 +v -0.049739 -0.308241 -0.282084 +v 0.054196 -0.263580 0.307361 +v -0.031113 0.388531 -0.176447 +v 0.031113 0.388531 0.176448 +v -0.054196 -0.263580 -0.307361 +v 0.049739 -0.308241 0.282084 +v -0.024179 0.416689 -0.137123 +v 0.037432 0.354085 0.212289 +v -0.057640 -0.214989 -0.326892 +v 0.044238 -0.348187 0.250886 +v -0.016662 0.437776 -0.094492 +v 0.043107 0.314138 0.244473 +v -0.060101 -0.163255 -0.340852 +v 0.037662 -0.382633 0.213594 +v -0.008592 0.451004 -0.048726 +v 0.048107 0.269477 0.272827 +v -0.061611 -0.109163 -0.349413 +v 0.029982 -0.410792 0.170034 +v 0.052399 0.220886 0.297176 +v -0.062200 -0.053500 -0.352750 +v 0.021165 -0.431878 0.120031 +v 0.055956 0.169153 0.317345 +v -0.061898 0.002949 -0.351038 +v 0.011181 -0.445106 0.063411 +v 0.058745 0.115060 0.333162 +v -0.060735 0.059398 -0.344450 +v 0.060736 0.059397 0.344450 +v -0.058745 0.115061 -0.333162 +v 0.061898 0.002949 0.351038 +v -0.055956 0.169153 -0.317345 +v -0.021165 -0.431878 -0.120031 +v -0.011181 -0.445106 -0.063411 +v 0.062200 -0.053501 0.352750 +v -0.052399 0.220886 -0.297175 +v 0.000000 -0.431878 -0.121883 +v 0.000000 -0.445106 -0.064390 +v 0.000000 0.002949 0.356453 +v 0.000000 -0.053501 0.358193 +v 0.000000 0.220886 -0.301759 +v 0.000000 0.169153 -0.322240 +v 0.000000 -0.410792 -0.172657 +v 0.000000 -0.109164 0.354803 +v 0.000000 0.269477 -0.277035 +v 0.000000 -0.382633 -0.216890 +v 0.000000 -0.163255 0.346110 +v 0.000000 0.314138 -0.248244 +v 0.000000 0.451004 0.049478 +v 0.000000 0.437776 0.095951 +v 0.000000 -0.348187 -0.254757 +v 0.000000 -0.214989 0.331936 +v 0.000000 0.354085 -0.215563 +v 0.000000 0.416689 0.139240 +v 0.000000 -0.308241 -0.286436 +v 0.000000 -0.263580 0.312103 +v 0.000000 0.388531 -0.179169 +v 0.000000 0.388531 0.179170 +v 0.000000 -0.263579 -0.312103 +v 0.000000 -0.308241 0.286436 +v 0.000000 0.416689 -0.139239 +v 0.000000 0.354085 0.215564 +v 0.000000 -0.214989 -0.331935 +v 0.000000 -0.348187 0.254757 +v 0.000000 0.437776 -0.095950 +v 0.000000 0.314138 0.248245 +v 0.000000 -0.163255 -0.346110 +v 0.000000 -0.382633 0.216889 +v 0.000000 0.451004 -0.049477 +v 0.000000 0.269477 0.277035 +v 0.000000 -0.109163 -0.354803 +v 0.000000 -0.410792 0.172657 +v 0.000000 0.220886 0.301759 +v 0.000000 -0.053500 -0.358193 +v 0.000000 -0.431878 0.121882 +v 0.000000 0.169153 0.322240 +v 0.000000 0.002949 -0.356453 +v 0.000000 -0.445106 0.064389 +v 0.000000 0.115060 0.338301 +v 0.000000 0.059398 -0.349763 +v 0.000000 0.059397 0.349763 +v 0.000000 0.115061 -0.338301 +v 0.060736 0.059398 -0.344450 +v 0.061898 0.002949 -0.351038 +v -0.058745 0.115060 0.333162 +v -0.060736 0.059397 0.344450 +v 0.058745 0.115061 -0.333162 +v -0.061898 0.002949 0.351038 +v 0.055956 0.169153 -0.317345 +v 0.021165 -0.431878 -0.120031 +v 0.011181 -0.445106 -0.063411 +v -0.062200 -0.053501 0.352750 +v 0.052400 0.220886 -0.297175 +v 0.029982 -0.410792 -0.170034 +v -0.061611 -0.109164 0.349413 +v 0.048107 0.269477 -0.272827 +v 0.037662 -0.382633 -0.213595 +v -0.060101 -0.163255 0.340852 +v 0.043107 0.314138 -0.244472 +v -0.008592 0.451004 0.048727 +v -0.016662 0.437776 0.094493 +v 0.044238 -0.348187 -0.250887 +v -0.057640 -0.214989 0.326893 +v 0.037432 0.354085 -0.212288 +v -0.024179 0.416689 0.137124 +v 0.049739 -0.308241 -0.282084 +v -0.054196 -0.263580 0.307361 +v 0.031113 0.388531 -0.176447 +v -0.031113 0.388531 0.176448 +v 0.054196 -0.263580 -0.307361 +v -0.049739 -0.308241 0.282084 +v 0.024179 0.416689 -0.137123 +v -0.037432 0.354085 0.212289 +v 0.057640 -0.214989 -0.326892 +v -0.044238 -0.348187 0.250886 +v 0.016662 0.437776 -0.094492 +v -0.043107 0.314138 0.244473 +v 0.060101 -0.163255 -0.340852 +v -0.037662 -0.382633 0.213594 +v 0.008592 0.451004 -0.048726 +v -0.048107 0.269477 0.272827 +v 0.061611 -0.109163 -0.349412 +v -0.029982 -0.410792 0.170034 +v -0.052400 0.220886 0.297175 +v 0.062200 -0.053500 -0.352750 +v -0.021165 -0.431878 0.120031 +v -0.055956 0.169153 0.317345 +v -0.011181 -0.445106 0.063411 +v -0.094752 0.269477 0.260328 +v -0.103208 0.220886 0.283561 +v 0.122510 -0.053500 -0.336590 +v 0.121350 -0.109163 -0.333406 +v -0.059052 -0.410792 0.162245 +v -0.041686 -0.431878 0.114532 +v -0.110212 0.169153 0.302807 +v 0.121914 0.002949 -0.334957 +v -0.022023 -0.445106 0.060506 +v -0.115706 0.115060 0.317899 +v 0.119626 0.059398 -0.328670 +v -0.119626 0.059397 0.328671 +v 0.115706 0.115061 -0.317899 +v -0.121914 0.002949 0.334957 +v 0.110212 0.169153 -0.302807 +v 0.041686 -0.431878 -0.114532 +v 0.022022 -0.445106 -0.060506 +v -0.122510 -0.053501 0.336590 +v 0.103207 0.220886 -0.283561 +v 0.059052 -0.410792 -0.162245 +v -0.121350 -0.109164 0.333406 +v 0.094752 0.269477 -0.260328 +v 0.074180 -0.382633 -0.203810 +v -0.118377 -0.163255 0.325238 +v 0.084904 0.314138 -0.233273 +v -0.016922 0.451004 0.046494 +v -0.032816 0.437776 0.090164 +v 0.087132 -0.348187 -0.239394 +v -0.113529 -0.214989 0.311917 +v 0.073727 0.354085 -0.202563 +v -0.047622 0.416689 0.130843 +v 0.097967 -0.308241 -0.269162 +v -0.106745 -0.263580 0.293281 +v 0.061279 0.388531 -0.168364 +v -0.061279 0.388531 0.168365 +v 0.106745 -0.263580 -0.293280 +v -0.097967 -0.308241 0.269162 +v 0.047622 0.416689 -0.130842 +v -0.073727 0.354085 0.202563 +v 0.113529 -0.214989 -0.311917 +v -0.087132 -0.348187 0.239393 +v 0.032816 0.437776 -0.090163 +v -0.084904 0.314138 0.233274 +v 0.118377 -0.163255 -0.325237 +v -0.074180 -0.382633 0.203810 +v 0.016922 0.451004 -0.046493 +v 0.047975 0.437776 -0.083095 +v 0.069620 0.416689 -0.120585 +v -0.107782 0.354085 0.186684 +v -0.124123 0.314138 0.214987 +v 0.173055 -0.163255 -0.299740 +v 0.165968 -0.214989 -0.287464 +v -0.127378 -0.348187 0.220625 +v -0.108445 -0.382633 0.187832 +v 0.024739 0.451004 -0.042849 +v -0.138518 0.269477 0.239920 +v 0.177402 -0.109163 -0.307269 +v -0.086329 -0.410792 0.149526 +v -0.150879 0.220886 0.261331 +v 0.179097 -0.053500 -0.310203 +v -0.060942 -0.431878 0.105554 +v -0.161121 0.169153 0.279068 +v 0.178227 0.002949 -0.308697 +v -0.032194 -0.445106 0.055762 +v -0.169150 0.115060 0.292977 +v 0.174883 0.059398 -0.302904 +v -0.174883 0.059397 0.302904 +v 0.169150 0.115061 -0.292976 +v -0.178227 0.002949 0.308697 +v 0.161121 0.169153 -0.279068 +v 0.060942 -0.431878 -0.105554 +v 0.032194 -0.445106 -0.055762 +v -0.179097 -0.053501 0.310204 +v 0.150879 0.220886 -0.261331 +v 0.086329 -0.410792 -0.149526 +v -0.177402 -0.109164 0.307269 +v 0.138518 0.269477 -0.239920 +v 0.108445 -0.382633 -0.187832 +v -0.173055 -0.163255 0.299740 +v 0.124123 0.314138 -0.214986 +v -0.024739 0.451004 0.042850 +v -0.047975 0.437776 0.083096 +v 0.127378 -0.348187 -0.220626 +v -0.165968 -0.214989 0.287464 +v 0.107782 0.354085 -0.186683 +v -0.069620 0.416689 0.120585 +v 0.143218 -0.308241 -0.248060 +v -0.156051 -0.263580 0.270290 +v 0.089585 0.388531 -0.155165 +v -0.089585 0.388531 0.155166 +v 0.156051 -0.263580 -0.270289 +v -0.143218 -0.308241 0.248061 +v -0.213364 -0.214989 0.254277 +v -0.200616 -0.263580 0.239085 +v 0.115168 0.388531 -0.137251 +v 0.138561 0.354085 -0.165131 +v -0.089501 0.416689 0.106664 +v -0.115168 0.388531 0.137252 +v 0.200616 -0.263580 -0.239085 +v 0.184117 -0.308241 -0.219422 +v -0.184117 -0.308241 0.219422 +v 0.089501 0.416689 -0.106664 +v -0.138561 0.354085 0.165132 +v 0.213364 -0.214989 -0.254277 +v -0.163755 -0.348187 0.195155 +v 0.061675 0.437776 -0.073501 +v -0.159568 0.314138 0.190166 +v 0.222475 -0.163255 -0.265135 +v -0.139415 -0.382633 0.166147 +v 0.031803 0.451004 -0.037902 +v -0.178076 0.269477 0.212222 +v 0.228063 -0.109163 -0.271795 +v -0.110982 -0.410792 0.132263 +v -0.193968 0.220886 0.231161 +v 0.230241 -0.053500 -0.274391 +v -0.078345 -0.431878 0.093368 +v -0.207132 0.169153 0.246850 +v 0.229124 0.002949 -0.273059 +v -0.041389 -0.445106 0.049325 +v -0.217456 0.115060 0.259153 +v 0.224824 0.059398 -0.267934 +v -0.224824 0.059397 0.267934 +v 0.217456 0.115061 -0.259153 +v -0.229124 0.002949 0.273059 +v 0.207132 0.169153 -0.246850 +v 0.078345 -0.431878 -0.093368 +v 0.041388 -0.445106 -0.049325 +v -0.230241 -0.053501 0.274391 +v 0.193968 0.220886 -0.231161 +v 0.110982 -0.410792 -0.132263 +v -0.228063 -0.109164 0.271795 +v 0.178075 0.269477 -0.212221 +v 0.139414 -0.382633 -0.166148 +v -0.222475 -0.163255 0.265135 +v 0.159568 0.314138 -0.190166 +v -0.031803 0.451004 0.037902 +v -0.061676 0.437776 0.073502 +v 0.163755 -0.348187 -0.195155 +v -0.271795 -0.109164 0.228063 +v -0.265135 -0.163255 0.222475 +v 0.190166 0.314138 -0.159568 +v 0.212221 0.269477 -0.178075 +v -0.037902 0.451004 0.031804 +v -0.073502 0.437776 0.061676 +v 0.195155 -0.348187 -0.163755 +v 0.166147 -0.382633 -0.139414 +v -0.254277 -0.214989 0.213364 +v 0.165131 0.354085 -0.138561 +v -0.106664 0.416689 0.089502 +v 0.219422 -0.308241 -0.184117 +v -0.239085 -0.263580 0.200616 +v 0.137252 0.388531 -0.115168 +v -0.137252 0.388531 0.115169 +v 0.239085 -0.263580 -0.200616 +v -0.219422 -0.308241 0.184117 +v 0.106664 0.416689 -0.089501 +v -0.165131 0.354085 0.138562 +v 0.254277 -0.214989 -0.213364 +v -0.195155 -0.348187 0.163754 +v 0.073502 0.437776 -0.061675 +v -0.190166 0.314138 0.159569 +v 0.265135 -0.163255 -0.222475 +v -0.166147 -0.382633 0.139414 +v 0.037902 0.451004 -0.031803 +v -0.212221 0.269477 0.178076 +v 0.271795 -0.109163 -0.228062 +v -0.132263 -0.410792 0.110982 +v -0.231161 0.220886 0.193968 +v 0.274392 -0.053500 -0.230241 +v -0.093368 -0.431878 0.078345 +v -0.246850 0.169153 0.207132 +v 0.273059 0.002949 -0.229124 +v -0.049325 -0.445106 0.041388 +v -0.259153 0.115060 0.217456 +v 0.267934 0.059398 -0.224824 +v -0.267934 0.059397 0.224824 +v 0.259153 0.115061 -0.217455 +v -0.273059 0.002949 0.229124 +v 0.246850 0.169153 -0.207131 +v 0.093368 -0.431878 -0.078345 +v 0.049325 -0.445106 -0.041388 +v -0.274392 -0.053501 0.230241 +v 0.231161 0.220886 -0.193967 +v 0.132263 -0.410792 -0.110982 +v 0.105554 -0.431878 -0.060942 +v 0.055762 -0.445106 -0.032194 +v -0.308697 0.002949 0.178227 +v -0.310204 -0.053501 0.179097 +v 0.261331 0.220886 -0.150879 +v 0.279068 0.169153 -0.161120 +v 0.149526 -0.410792 -0.086329 +v -0.307269 -0.109164 0.177402 +v 0.239920 0.269477 -0.138518 +v 0.187832 -0.382633 -0.108445 +v -0.299740 -0.163255 0.173055 +v 0.214986 0.314138 -0.124122 +v -0.042849 0.451004 0.024739 +v -0.083095 0.437776 0.047975 +v 0.220626 -0.348187 -0.127378 +v -0.287465 -0.214989 0.165967 +v 0.186683 0.354085 -0.107782 +v -0.120585 0.416689 0.069620 +v 0.248061 -0.308241 -0.143218 +v -0.270290 -0.263580 0.156051 +v 0.155166 0.388531 -0.089585 +v -0.155166 0.388531 0.089585 +v 0.270289 -0.263580 -0.156052 +v -0.248061 -0.308241 0.143218 +v 0.120585 0.416689 -0.069620 +v -0.186683 0.354085 0.107782 +v 0.287464 -0.214989 -0.165967 +v -0.220626 -0.348187 0.127378 +v 0.083095 0.437776 -0.047974 +v -0.214986 0.314138 0.124122 +v 0.299740 -0.163255 -0.173055 +v -0.187832 -0.382633 0.108444 +v 0.042849 0.451004 -0.024739 +v -0.239920 0.269477 0.138518 +v 0.307269 -0.109163 -0.177402 +v -0.149526 -0.410792 0.086328 +v -0.261331 0.220886 0.150880 +v 0.310204 -0.053500 -0.179096 +v -0.105554 -0.431878 0.060942 +v -0.279068 0.169153 0.161121 +v 0.308697 0.002949 -0.178227 +v -0.055762 -0.445106 0.032194 +v -0.292977 0.115060 0.169150 +v 0.302904 0.059398 -0.174882 +v -0.302904 0.059397 0.174882 +v 0.292977 0.115061 -0.169150 +v -0.317899 0.115060 0.115705 +v -0.328671 0.059397 0.119626 +v 0.317899 0.115060 -0.115705 +v 0.328670 0.059398 -0.119626 +v -0.334957 0.002949 0.121914 +v 0.302807 0.169152 -0.110212 +v 0.114532 -0.431878 -0.041686 +v 0.060506 -0.445106 -0.022023 +v -0.336591 -0.053501 0.122510 +v 0.283561 0.220886 -0.103207 +v 0.162244 -0.410792 -0.059052 +v -0.333406 -0.109164 0.121350 +v 0.260328 0.269477 -0.094751 +v 0.203810 -0.382633 -0.074180 +v -0.325238 -0.163254 0.118377 +v 0.233273 0.314138 -0.084904 +v -0.046494 0.451004 0.016922 +v -0.090163 0.437776 0.032817 +v 0.239393 -0.348187 -0.087132 +v -0.311917 -0.214988 0.113528 +v 0.202563 0.354085 -0.073727 +v -0.130843 0.416689 0.047623 +v 0.269162 -0.308241 -0.097967 +v -0.293281 -0.263580 0.106745 +v 0.168364 0.388531 -0.061279 +v -0.168365 0.388531 0.061280 +v 0.293280 -0.263580 -0.106746 +v -0.269162 -0.308241 0.097967 +v 0.130843 0.416689 -0.047622 +v -0.202563 0.354085 0.073727 +v 0.311917 -0.214989 -0.113528 +v -0.239393 -0.348187 0.087131 +v 0.090163 0.437776 -0.032816 +v -0.233273 0.314138 0.084904 +v 0.325237 -0.163255 -0.118377 +v -0.203810 -0.382633 0.074180 +v 0.046493 0.451004 -0.016922 +v -0.260328 0.269477 0.094752 +v 0.333406 -0.109163 -0.121350 +v -0.162245 -0.410792 0.059052 +v -0.283561 0.220886 0.103208 +v 0.336590 -0.053500 -0.122509 +v -0.114532 -0.431878 0.041686 +v -0.302807 0.169153 0.110213 +v 0.334957 0.002949 -0.121914 +v -0.060506 -0.445106 0.022022 +v 0.352750 -0.053500 -0.062200 +v 0.349412 -0.109164 -0.061611 +v -0.170035 -0.410792 0.029981 +v -0.120031 -0.431878 0.021164 +v -0.297176 0.220886 0.052400 +v -0.317345 0.169153 0.055956 +v 0.351038 0.002949 -0.061898 +v -0.063411 -0.445106 0.011181 +v -0.333162 0.115060 0.058745 +v 0.344450 0.059397 -0.060735 +v -0.344450 0.059397 0.060735 +v 0.333162 0.115060 -0.058745 +v -0.351038 0.002949 0.061898 +v 0.317345 0.169153 -0.055956 +v 0.120031 -0.431878 -0.021165 +v 0.063411 -0.445106 -0.011181 +v -0.352750 -0.053501 0.062200 +v 0.297175 0.220886 -0.052399 +v 0.170034 -0.410792 -0.029982 +v -0.349413 -0.109164 0.061611 +v 0.272827 0.269477 -0.048106 +v 0.213594 -0.382633 -0.037662 +v -0.340852 -0.163255 0.060101 +v 0.244472 0.314138 -0.043107 +v -0.048726 0.451004 0.008592 +v -0.094492 0.437776 0.016662 +v 0.250886 -0.348187 -0.044238 +v -0.326893 -0.214988 0.057640 +v 0.212288 0.354085 -0.037431 +v -0.137124 0.416689 0.024179 +v 0.282084 -0.308241 -0.049739 +v -0.307361 -0.263580 0.054195 +v 0.176447 0.388531 -0.031113 +v -0.176448 0.388531 0.031113 +v 0.307361 -0.263580 -0.054196 +v -0.282084 -0.308241 0.049739 +v 0.137123 0.416689 -0.024178 +v -0.212289 0.354085 0.037432 +v 0.326892 -0.214988 -0.057640 +v -0.250886 -0.348187 0.044237 +v 0.094492 0.437776 -0.016662 +v -0.244472 0.314138 0.043108 +v 0.340852 -0.163255 -0.060101 +v -0.213594 -0.382633 0.037662 +v 0.048726 0.451004 -0.008591 +v -0.272827 0.269477 0.048107 +v -0.215563 0.354085 0.000000 +v -0.248244 0.314138 0.000000 +v 0.346110 -0.163255 -0.000000 +v 0.331935 -0.214988 -0.000000 +v -0.254757 -0.348187 -0.000000 +v -0.216890 -0.382633 -0.000000 +v 0.049478 0.451004 0.000000 +v 0.095950 0.437776 0.000000 +v -0.277035 0.269477 0.000000 +v 0.354803 -0.109164 -0.000000 +v -0.172657 -0.410792 -0.000000 +v -0.301759 0.220886 0.000000 +v 0.358193 -0.053500 -0.000000 +v -0.121882 -0.431878 -0.000000 +v -0.322240 0.169153 0.000000 +v 0.356453 0.002949 0.000000 +v -0.064389 -0.445106 -0.000000 +v -0.338301 0.115060 0.000000 +v 0.349763 0.059397 0.000000 +v -0.349763 0.059397 0.000000 +v 0.338300 0.115060 0.000000 +v -0.356453 0.002949 0.000000 +v 0.322240 0.169153 0.000000 +v 0.121882 -0.431878 -0.000000 +v 0.064389 -0.445106 -0.000000 +v -0.358193 -0.053500 -0.000000 +v 0.301759 0.220886 0.000000 +v 0.172657 -0.410792 -0.000000 +v -0.354803 -0.109164 -0.000000 +v 0.277035 0.269477 0.000000 +v 0.216889 -0.382633 -0.000000 +v -0.346110 -0.163255 -0.000000 +v 0.248244 0.314138 0.000000 +v -0.049478 0.451004 0.000000 +v -0.095950 0.437776 0.000000 +v 0.254757 -0.348187 -0.000000 +v -0.331935 -0.214988 -0.000000 +v 0.215563 0.354085 0.000000 +v -0.139240 0.416689 0.000000 +v 0.286436 -0.308241 -0.000000 +v -0.312103 -0.263580 -0.000000 +v 0.179169 0.388531 0.000000 +v -0.179169 0.388531 0.000000 +v 0.312103 -0.263580 -0.000000 +v -0.286436 -0.308241 -0.000000 +v 0.139240 0.416689 0.000000 +v 0.000000 -0.449691 -0.000000 +v 0.000000 0.455588 0.000000 +vt -2.069444 -1.744961 +vt -2.069444 -1.521408 +vt -2.236111 -1.521408 +vt -2.236111 -1.744961 +vt 0.930555 -0.084523 +vt 0.763889 -0.084523 +vt 0.763889 -0.355017 +vt 0.930555 -0.355017 +vt -2.069445 1.963087 +vt -2.069445 2.213990 +vt -2.236112 2.213990 +vt -2.236111 1.963087 +vt 0.930557 3.289948 +vt 0.763890 3.289948 +vt 0.763890 3.085212 +vt 0.930556 3.085212 +vt -2.069444 -1.301276 +vt -2.236111 -1.301276 +vt 0.763889 -0.609584 +vt 0.930555 -0.609584 +vt -2.069445 2.448471 +vt -2.236112 2.448471 +vt 0.763889 2.879998 +vt 0.930556 2.879998 +vt -2.069444 -1.079061 +vt -2.236111 -1.079061 +vt 0.763889 -0.849882 +vt 0.930555 -0.849882 +vt -2.069445 2.669233 +vt -2.236112 2.669233 +vt 0.763889 2.669231 +vt 0.930556 2.669231 +vt -2.069444 -0.849882 +vt -2.236111 -0.849883 +vt 0.763889 -1.079061 +vt 0.930555 -1.079061 +vt -2.069445 2.879999 +vt -2.236112 2.879999 +vt 0.763889 2.448470 +vt 0.930556 2.448470 +vt -2.069444 -0.609584 +vt -2.236111 -0.609584 +vt 0.763889 -1.301275 +vt 0.930555 -1.301275 +vt -2.069445 3.085214 +vt -2.236112 3.085214 +vt 0.763889 2.213989 +vt 0.930556 2.213989 +vt -2.069444 -0.355017 +vt -2.236111 -0.355017 +vt 0.763888 -1.521408 +vt 0.930555 -1.521408 +vt -2.069446 3.289949 +vt -2.236113 3.289949 +vt 0.763889 1.963086 +vt 0.930556 1.963086 +vt -2.069444 -0.084523 +vt -2.236111 -0.084523 +vt 0.763888 -1.744961 +vt 0.930555 -1.744961 +vt 0.763889 1.694589 +vt 0.930555 1.694589 +vt -2.069444 0.201473 +vt -2.236111 0.201473 +vt 0.763888 -1.978057 +vt 0.930555 -1.978057 +vt 0.763889 1.409452 +vt 0.930555 1.409452 +vt -2.069444 0.500000 +vt -2.236111 0.500000 +vt 0.763887 -2.227403 +vt 0.930554 -2.227403 +vt 0.763889 1.111169 +vt 0.930555 1.111169 +vt -2.069444 0.805600 +vt -2.236111 0.805600 +vt 0.763889 0.805600 +vt 0.930555 0.805600 +vt -2.069445 1.111170 +vt -2.236111 1.111170 +vt 0.763889 0.500000 +vt 0.930555 0.500000 +vt -2.069445 1.409452 +vt -2.236111 1.409452 +vt -2.069443 -2.227405 +vt -2.069444 -1.978058 +vt -2.236111 -1.978058 +vt -2.236110 -2.227405 +vt 0.763889 0.201473 +vt 0.930555 0.201473 +vt -2.069445 1.694589 +vt -2.236111 1.694589 +vt -2.402778 1.409452 +vt -2.402778 1.111170 +vt -2.402777 -1.978058 +vt -2.402777 -2.227405 +vt 0.597222 0.500000 +vt 0.597222 0.201473 +vt -2.402778 1.694589 +vt -2.402777 -1.744962 +vt 0.597222 -0.084523 +vt -2.402778 1.963087 +vt -2.402777 -1.521408 +vt 0.597222 -0.355017 +vt -2.402778 2.213990 +vt 0.597224 3.289948 +vt 0.597223 3.085212 +vt -2.402777 -1.301276 +vt 0.597222 -0.609584 +vt -2.402778 2.448471 +vt 0.597223 2.879998 +vt -2.402777 -1.079061 +vt 0.597222 -0.849882 +vt -2.402778 2.669232 +vt 0.597222 2.669231 +vt -2.402778 -0.849883 +vt 0.597222 -1.079061 +vt -2.402778 2.879999 +vt 0.597222 2.448470 +vt -2.402778 -0.609584 +vt 0.597222 -1.301275 +vt -2.402779 3.085214 +vt 0.597222 2.213989 +vt -2.402778 -0.355017 +vt 0.597222 -1.521408 +vt -2.402780 3.289949 +vt 0.597222 1.963086 +vt -2.402778 -0.084523 +vt 0.597221 -1.744960 +vt 0.597222 1.694589 +vt -2.402778 0.201473 +vt 0.597221 -1.978057 +vt 0.597222 1.409452 +vt -2.402778 0.500000 +vt 0.597220 -2.227403 +vt 0.597222 1.111169 +vt -2.402778 0.805600 +vt 0.597222 0.805600 +vt 0.430555 1.409452 +vt 0.430555 1.111169 +vt -2.569444 0.805600 +vt -2.569445 0.500000 +vt 0.430555 0.805600 +vt -2.569445 1.111170 +vt 0.430555 0.500000 +vt -2.569445 1.409452 +vt -2.569444 -1.978058 +vt -2.569443 -2.227405 +vt 0.430555 0.201473 +vt -2.569445 1.694589 +vt -2.569444 -1.744962 +vt 0.430555 -0.084523 +vt -2.569445 1.963087 +vt -2.569444 -1.521408 +vt 0.430555 -0.355017 +vt -2.569445 2.213990 +vt 0.430557 3.289948 +vt 0.430556 3.085212 +vt -2.569444 -1.301276 +vt 0.430555 -0.609584 +vt -2.569445 2.448471 +vt 0.430556 2.879998 +vt -2.569444 -1.079061 +vt 0.430555 -0.849882 +vt -2.569445 2.669232 +vt 0.430556 2.669231 +vt -2.569444 -0.849883 +vt 0.430555 -1.079061 +vt -2.569445 2.879999 +vt 0.430555 2.448470 +vt -2.569444 -0.609584 +vt 0.430555 -1.301275 +vt -2.569446 3.085214 +vt 0.430555 2.213989 +vt -2.569444 -0.355017 +vt 0.430555 -1.521408 +vt -2.569446 3.289949 +vt 0.430555 1.963086 +vt -2.569444 -0.084523 +vt 0.430555 -1.744960 +vt 0.430555 1.694589 +vt -2.569444 0.201473 +vt 0.430554 -1.978057 +vt 0.430554 -2.227403 +vt 0.263889 1.963086 +vt 0.263889 1.694589 +vt -2.736112 0.201473 +vt -2.736112 -0.084523 +vt 0.263888 -1.744960 +vt 0.263888 -1.978057 +vt 0.263889 1.409452 +vt -2.736112 0.500000 +vt 0.263887 -2.227403 +vt 0.263889 1.111169 +vt -2.736112 0.805600 +vt 0.263889 0.805600 +vt -2.736112 1.111170 +vt 0.263889 0.500000 +vt -2.736112 1.409452 +vt -2.736111 -1.978058 +vt -2.736110 -2.227405 +vt 0.263889 0.201473 +vt -2.736112 1.694589 +vt -2.736111 -1.744962 +vt 0.263888 -0.084523 +vt -2.736112 1.963087 +vt -2.736111 -1.521408 +vt 0.263888 -0.355017 +vt -2.736112 2.213990 +vt 0.263891 3.289948 +vt 0.263890 3.085212 +vt -2.736111 -1.301276 +vt 0.263888 -0.609584 +vt -2.736112 2.448470 +vt 0.263889 2.879998 +vt -2.736111 -1.079062 +vt 0.263888 -0.849882 +vt -2.736112 2.669232 +vt 0.263889 2.669231 +vt -2.736111 -0.849883 +vt 0.263888 -1.079061 +vt -2.736112 2.879999 +vt 0.263889 2.448470 +vt -2.736111 -0.609584 +vt 0.263888 -1.301275 +vt -2.736112 3.085214 +vt 0.263889 2.213989 +vt -2.736111 -0.355017 +vt 0.263888 -1.521407 +vt -2.736113 3.289949 +vt 0.097222 -1.079061 +vt 0.097222 -1.301275 +vt -2.902779 3.085214 +vt -2.902778 2.879999 +vt 0.097222 2.448470 +vt 0.097222 2.213989 +vt -2.902778 -0.355017 +vt -2.902778 -0.609584 +vt 0.097222 -1.521407 +vt -2.902780 3.289949 +vt 0.097222 1.963086 +vt -2.902778 -0.084523 +vt 0.097222 -1.744960 +vt 0.097222 1.694589 +vt -2.902778 0.201473 +vt 0.097221 -1.978057 +vt 0.097222 1.409452 +vt -2.902778 0.500000 +vt 0.097221 -2.227403 +vt 0.097222 1.111169 +vt -2.902778 0.805600 +vt 0.097222 0.805600 +vt -2.902778 1.111169 +vt 0.097222 0.500000 +vt -2.902778 1.409452 +vt -2.902777 -1.978058 +vt -2.902776 -2.227405 +vt 0.097222 0.201473 +vt -2.902778 1.694589 +vt -2.902778 -1.744962 +vt 0.097222 -0.084523 +vt -2.902778 1.963087 +vt -2.902778 -1.521408 +vt 0.097222 -0.355017 +vt -2.902778 2.213990 +vt 0.097223 3.289948 +vt 0.097223 3.085212 +vt -2.902778 -1.301276 +vt 0.097222 -0.609584 +vt -2.902778 2.448470 +vt 0.097223 2.879998 +vt -2.902778 -1.079062 +vt 0.097222 -0.849882 +vt -2.902778 2.669232 +vt 0.097222 2.669231 +vt -2.902778 -0.849883 +vt -0.069445 -0.609584 +vt -0.069445 -0.849882 +vt -3.069445 2.669232 +vt -3.069445 2.448470 +vt -0.069444 2.879998 +vt -0.069444 2.669231 +vt -3.069444 -0.849883 +vt -3.069444 -1.079062 +vt -0.069445 -1.079061 +vt -3.069445 2.879999 +vt -0.069444 2.448470 +vt -3.069444 -0.609584 +vt -0.069445 -1.301275 +vt -3.069445 3.085214 +vt -0.069444 2.213989 +vt -3.069444 -0.355017 +vt -0.069445 -1.521407 +vt -3.069446 3.289949 +vt -0.069444 1.963086 +vt -3.069444 -0.084523 +vt -0.069445 -1.744960 +vt -0.069444 1.694589 +vt -3.069444 0.201473 +vt -0.069445 -1.978057 +vt -0.069445 1.409452 +vt -3.069444 0.500000 +vt -0.069446 -2.227403 +vt -0.069445 1.111169 +vt -3.069444 0.805600 +vt -0.069445 0.805600 +vt -3.069444 1.111169 +vt -0.069445 0.500000 +vt -3.069444 1.409452 +vt -3.069444 -1.978058 +vt -3.069444 -2.227405 +vt -0.069445 0.201473 +vt -3.069444 1.694589 +vt -3.069444 -1.744962 +vt -0.069445 -0.084523 +vt -3.069444 1.963086 +vt -3.069444 -1.521408 +vt -0.069445 -0.355017 +vt -3.069445 2.213990 +vt -0.069443 3.289948 +vt -0.069444 3.085212 +vt -3.069444 -1.301276 +vt -3.236111 -1.521408 +vt -3.236111 -1.744962 +vt -0.236112 -0.084523 +vt -0.236112 -0.355016 +vt -3.236111 2.213989 +vt -3.236111 1.963086 +vt -0.236110 3.289948 +vt -0.236110 3.085213 +vt -3.236111 -1.301276 +vt -0.236112 -0.609584 +vt -3.236111 2.448470 +vt -0.236111 2.879998 +vt -3.236111 -1.079062 +vt -0.236112 -0.849882 +vt -3.236111 2.669232 +vt -0.236111 2.669231 +vt -3.236111 -0.849883 +vt -0.236112 -1.079061 +vt -3.236112 2.879999 +vt -0.236111 2.448470 +vt -3.236111 -0.609584 +vt -0.236112 -1.301275 +vt -3.236112 3.085214 +vt -0.236111 2.213990 +vt -3.236111 -0.355017 +vt -0.236112 -1.521407 +vt -3.236113 3.289949 +vt -0.236111 1.963087 +vt -3.236111 -0.084523 +vt -0.236112 -1.744960 +vt -0.236111 1.694589 +vt -3.236111 0.201473 +vt -0.236112 -1.978057 +vt -0.236112 1.409452 +vt -3.236111 0.500000 +vt -0.236113 -2.227403 +vt -0.236112 1.111169 +vt -3.236111 0.805600 +vt -0.236112 0.805600 +vt -3.236111 1.111169 +vt -0.236112 0.500000 +vt -3.236111 1.409452 +vt -3.236111 -1.978058 +vt -3.236110 -2.227405 +vt -0.236111 0.201473 +vt -3.236111 1.694589 +vt -3.402777 -1.978058 +vt -3.402777 -2.227405 +vt -0.402778 0.500000 +vt -0.402778 0.201473 +vt -3.402778 1.694589 +vt -3.402778 1.409452 +vt -3.402778 -1.744962 +vt -0.402778 -0.084523 +vt -3.402778 1.963086 +vt -3.402778 -1.521409 +vt -0.402778 -0.355016 +vt 2.763888 1.963086 +vt 2.763888 2.213989 +vt 2.597221 2.213989 +vt 2.597222 1.963086 +vt -0.402777 3.289948 +vt -0.402777 3.085213 +vt -3.402778 -1.301276 +vt -0.402778 -0.609583 +vt 2.763888 2.448470 +vt 2.597221 2.448470 +vt -0.402778 2.879998 +vt -3.402778 -1.079062 +vt -0.402778 -0.849882 +vt 2.763888 2.669232 +vt 2.597221 2.669232 +vt -0.402778 2.669231 +vt -3.402778 -0.849883 +vt -0.402778 -1.079061 +vt 2.763888 2.879999 +vt 2.597221 2.879999 +vt -0.402778 2.448470 +vt -3.402778 -0.609584 +vt -0.402778 -1.301275 +vt 2.763888 3.085214 +vt 2.597221 3.085214 +vt -0.402778 2.213990 +vt -3.402778 -0.355018 +vt -0.402778 -1.521407 +vt 2.763887 3.289949 +vt 2.597221 3.289949 +vt -0.402778 1.963087 +vt -3.402778 -0.084523 +vt -0.402778 -1.744960 +vt -0.402778 1.694589 +vt -3.402778 0.201473 +vt -0.402779 -1.978057 +vt -0.402778 1.409453 +vt -3.402778 0.500000 +vt -0.402779 -2.227403 +vt -0.402778 1.111170 +vt -3.402778 0.805600 +vt -0.402778 0.805600 +vt -3.402778 1.111169 +vt 2.597222 0.500000 +vt 2.597222 0.805600 +vt 2.430555 0.805600 +vt 2.430555 0.500000 +vt -0.569445 1.111169 +vt -0.569445 0.805600 +vt 2.597222 1.111169 +vt 2.430555 1.111169 +vt -0.569445 0.500000 +vt 2.597222 1.409452 +vt 2.430555 1.409452 +vt 2.597223 -2.227405 +vt 2.597223 -1.978058 +vt 2.430556 -1.978058 +vt 2.430556 -2.227405 +vt -0.569445 0.201473 +vt 2.597222 1.694589 +vt 2.430555 1.694589 +vt 2.597222 -1.744962 +vt 2.430555 -1.744962 +vt -0.569445 -0.084523 +vt 2.430555 1.963086 +vt 2.597222 -1.521409 +vt 2.430555 -1.521409 +vt -0.569445 -0.355016 +vt 2.430555 2.213989 +vt -0.569444 3.289948 +vt -0.569444 3.085213 +vt 2.597222 -1.301276 +vt 2.430555 -1.301276 +vt -0.569445 -0.609583 +vt 2.430555 2.448470 +vt -0.569444 2.879998 +vt 2.597222 -1.079062 +vt 2.430555 -1.079062 +vt -0.569445 -0.849882 +vt 2.430555 2.669232 +vt -0.569444 2.669231 +vt 2.597222 -0.849883 +vt 2.430555 -0.849883 +vt -0.569445 -1.079061 +vt 2.430555 2.879999 +vt -0.569444 2.448470 +vt 2.597222 -0.609584 +vt 2.430555 -0.609584 +vt -0.569445 -1.301275 +vt 2.430555 3.085214 +vt -0.569445 2.213990 +vt 2.597222 -0.355018 +vt 2.430555 -0.355018 +vt -0.569445 -1.521407 +vt 2.430554 3.289949 +vt -0.569444 1.963087 +vt 2.597222 -0.084523 +vt 2.430555 -0.084523 +vt -0.569445 -1.744960 +vt -0.569445 1.694589 +vt 2.597222 0.201473 +vt 2.430555 0.201473 +vt -0.569445 -1.978057 +vt -0.569445 1.409453 +vt -0.569446 -2.227403 +vt -0.736111 1.963087 +vt -0.736111 1.694589 +vt 2.263889 0.201473 +vt 2.263889 -0.084523 +vt -0.736112 -1.744960 +vt -0.736112 -1.978057 +vt -0.736111 1.409453 +vt 2.263889 0.500000 +vt -0.736112 -2.227403 +vt -0.736111 1.111170 +vt 2.263889 0.805600 +vt -0.736111 0.805600 +vt 2.263889 1.111169 +vt -0.736111 0.500000 +vt 2.263889 1.409452 +vt 2.263889 -1.978058 +vt 2.263889 -2.227405 +vt -0.736111 0.201473 +vt 2.263889 1.694589 +vt 2.263889 -1.744962 +vt -0.736111 -0.084523 +vt 2.263889 1.963086 +vt 2.263889 -1.521409 +vt -0.736111 -0.355016 +vt 2.263889 2.213990 +vt -0.736110 3.289948 +vt -0.736111 3.085213 +vt 2.263889 -1.301276 +vt -0.736111 -0.609583 +vt 2.263889 2.448470 +vt -0.736111 2.879998 +vt 2.263889 -1.079062 +vt -0.736111 -0.849882 +vt 2.263889 2.669232 +vt -0.736111 2.669232 +vt 2.263889 -0.849883 +vt -0.736111 -1.079061 +vt 2.263888 2.879999 +vt -0.736111 2.448470 +vt 2.263889 -0.609585 +vt -0.736112 -1.301275 +vt 2.263888 3.085214 +vt -0.736111 2.213990 +vt 2.263889 -0.355018 +vt -0.736112 -1.521407 +vt 2.263887 3.289949 +vt 2.097221 3.085214 +vt 2.097222 2.879999 +vt -0.902778 2.448470 +vt -0.902778 2.213990 +vt 2.097222 -0.355018 +vt 2.097222 -0.609585 +vt -0.902778 -1.301275 +vt -0.902778 -1.521407 +vt 2.097221 3.289949 +vt -0.902778 1.963086 +vt 2.097222 -0.084523 +vt -0.902778 -1.744960 +vt -0.902778 1.694589 +vt 2.097222 0.201473 +vt -0.902779 -1.978057 +vt -0.902778 1.409453 +vt 2.097222 0.500000 +vt -0.902779 -2.227403 +vt -0.902778 1.111170 +vt 2.097222 0.805600 +vt -0.902778 0.805600 +vt 2.097222 1.111169 +vt -0.902778 0.500000 +vt 2.097222 1.409452 +vt 2.097222 -1.978058 +vt 2.097223 -2.227405 +vt -0.902778 0.201473 +vt 2.097222 1.694589 +vt 2.097222 -1.744962 +vt -0.902778 -0.084523 +vt 2.097222 1.963086 +vt 2.097222 -1.521409 +vt -0.902778 -0.355017 +vt 2.097222 2.213990 +vt -0.902777 3.289948 +vt -0.902777 3.085213 +vt 2.097222 -1.301276 +vt -0.902778 -0.609583 +vt 2.097222 2.448470 +vt -0.902778 2.879998 +vt 2.097222 -1.079062 +vt -0.902778 -0.849882 +vt 2.097222 2.669232 +vt -0.902778 2.669232 +vt 2.097222 -0.849883 +vt -0.902778 -1.079061 +vt -1.069445 -0.609584 +vt -1.069445 -0.849882 +vt 1.930555 2.669232 +vt 1.930555 2.448470 +vt -1.069444 2.879998 +vt -1.069445 2.669232 +vt 1.930555 -0.849883 +vt 1.930555 -1.079062 +vt -1.069445 -1.079061 +vt 1.930555 2.879999 +vt -1.069445 2.448470 +vt 1.930555 -0.609584 +vt -1.069445 -1.301275 +vt 1.930555 3.085214 +vt -1.069445 2.213990 +vt 1.930555 -0.355018 +vt -1.069445 -1.521408 +vt 1.930554 3.289949 +vt -1.069445 1.963086 +vt 1.930555 -0.084523 +vt -1.069445 -1.744960 +vt -1.069445 1.694589 +vt 1.930555 0.201473 +vt -1.069445 -1.978057 +vt -1.069445 1.409453 +vt 1.930555 0.500000 +vt -1.069445 -2.227403 +vt -1.069445 1.111170 +vt 1.930555 0.805600 +vt -1.069445 0.805600 +vt 1.930555 1.111169 +vt -1.069445 0.500000 +vt 1.930555 1.409452 +vt 1.930556 -1.978058 +vt 1.930556 -2.227405 +vt -1.069445 0.201473 +vt 1.930555 1.694589 +vt 1.930555 -1.744962 +vt -1.069445 -0.084523 +vt 1.930555 1.963086 +vt 1.930555 -1.521409 +vt -1.069445 -0.355017 +vt 1.930555 2.213990 +vt -1.069444 3.289948 +vt -1.069444 3.085213 +vt 1.930555 -1.301276 +vt -1.236111 -0.084523 +vt -1.236111 -0.355017 +vt 1.763888 2.213990 +vt 1.763888 1.963086 +vt -1.236111 3.289948 +vt -1.236111 3.085213 +vt 1.763888 -1.301276 +vt 1.763888 -1.521409 +vt -1.236111 -0.609583 +vt 1.763888 2.448470 +vt -1.236111 2.879998 +vt 1.763888 -1.079062 +vt -1.236111 -0.849882 +vt 1.763888 2.669232 +vt -1.236111 2.669232 +vt 1.763889 -0.849883 +vt -1.236111 -1.079061 +vt 1.763888 2.879999 +vt -1.236111 2.448470 +vt 1.763888 -0.609585 +vt -1.236112 -1.301275 +vt 1.763888 3.085214 +vt -1.236111 2.213990 +vt 1.763888 -0.355018 +vt -1.236111 -1.521408 +vt 1.763888 3.289949 +vt -1.236111 1.963086 +vt 1.763888 -0.084523 +vt -1.236112 -1.744960 +vt -1.236111 1.694589 +vt 1.763888 0.201473 +vt -1.236112 -1.978057 +vt -1.236111 1.409453 +vt 1.763888 0.500000 +vt -1.236112 -2.227403 +vt -1.236111 1.111170 +vt 1.763888 0.805600 +vt -1.236111 0.805600 +vt 1.763888 1.111170 +vt -1.236111 0.500000 +vt 1.763888 1.409452 +vt 1.763889 -1.978058 +vt 1.763889 -2.227405 +vt -1.236111 0.201473 +vt 1.763888 1.694589 +vt 1.763889 -1.744962 +vt 1.597222 -1.978058 +vt 1.597222 -2.227405 +vt -1.402778 0.500000 +vt -1.402778 0.201473 +vt 1.597222 1.694589 +vt 1.597222 1.409452 +vt 1.597222 -1.744962 +vt -1.402778 -0.084523 +vt 1.597222 1.963086 +vt 1.597222 -1.521409 +vt -1.402778 -0.355017 +vt 1.597222 2.213990 +vt -1.402778 3.289948 +vt -1.402778 3.085213 +vt 1.597222 -1.301276 +vt -1.402778 -0.609584 +vt 1.597222 2.448470 +vt -1.402778 2.879998 +vt 1.597222 -1.079062 +vt -1.402778 -0.849882 +vt 1.597222 2.669232 +vt -1.402778 2.669232 +vt 1.597222 -0.849883 +vt -1.402778 -1.079061 +vt 1.597222 2.879999 +vt -1.402778 2.448470 +vt 1.597222 -0.609585 +vt -1.402778 -1.301275 +vt 1.597222 3.085214 +vt -1.402778 2.213990 +vt 1.597222 -0.355018 +vt -1.402778 -1.521408 +vt 1.597222 3.289949 +vt -1.402778 1.963086 +vt 1.597222 -0.084523 +vt -1.402778 -1.744960 +vt -1.402778 1.694589 +vt 1.597222 0.201473 +vt -1.402778 -1.978057 +vt -1.402778 1.409453 +vt 1.597222 0.500000 +vt -1.402778 -2.227403 +vt -1.402778 1.111170 +vt 1.597222 0.805600 +vt -1.402778 0.805600 +vt 1.597222 1.111170 +vt -1.569445 1.111170 +vt -1.569445 0.805600 +vt 1.430555 1.111170 +vt 1.430555 0.805600 +vt -1.569445 0.500000 +vt 1.430555 1.409452 +vt 1.430555 -1.978058 +vt 1.430555 -2.227405 +vt -1.569445 0.201473 +vt 1.430555 1.694589 +vt 1.430555 -1.744962 +vt -1.569445 -0.084523 +vt 1.430555 1.963086 +vt 1.430555 -1.521409 +vt -1.569445 -0.355017 +vt 1.430555 2.213990 +vt -1.569445 3.289948 +vt -1.569444 3.085213 +vt 1.430555 -1.301276 +vt -1.569445 -0.609584 +vt 1.430555 2.448471 +vt -1.569445 2.879998 +vt 1.430555 -1.079062 +vt -1.569445 -0.849882 +vt 1.430556 2.669233 +vt -1.569445 2.669232 +vt 1.430555 -0.849883 +vt -1.569445 -1.079061 +vt 1.430555 2.879999 +vt -1.569445 2.448470 +vt 1.430555 -0.609585 +vt -1.569445 -1.301275 +vt 1.430555 3.085214 +vt -1.569445 2.213990 +vt 1.430555 -0.355018 +vt -1.569445 -1.521408 +vt 1.430555 3.289949 +vt -1.569445 1.963086 +vt 1.430555 -0.084523 +vt -1.569445 -1.744960 +vt -1.569445 1.694589 +vt 1.430555 0.201473 +vt -1.569445 -1.978057 +vt -1.569445 1.409453 +vt 1.430555 0.500000 +vt -1.569445 -2.227403 +vt 1.263888 0.201473 +vt 1.263888 -0.084523 +vt -1.736111 -1.744960 +vt -1.736111 -1.978057 +vt -1.736111 1.694589 +vt -1.736111 1.409453 +vt 1.263888 0.500000 +vt -1.736112 -2.227403 +vt -1.736111 1.111170 +vt 1.263888 0.805600 +vt -1.736111 0.805600 +vt 1.263888 1.111170 +vt -1.736111 0.500000 +vt 1.263888 1.409452 +vt 1.263888 -1.978058 +vt 1.263888 -2.227405 +vt -1.736111 0.201473 +vt 1.263888 1.694589 +vt 1.263888 -1.744962 +vt -1.736111 -0.084523 +vt 1.263888 1.963087 +vt 1.263888 -1.521409 +vt -1.736111 -0.355017 +vt 1.263888 2.213990 +vt -1.736111 3.289948 +vt -1.736111 3.085213 +vt 1.263888 -1.301276 +vt -1.736111 -0.609584 +vt 1.263888 2.448471 +vt -1.736111 2.879998 +vt 1.263888 -1.079062 +vt -1.736111 -0.849882 +vt 1.263889 2.669233 +vt -1.736111 2.669232 +vt 1.263888 -0.849883 +vt -1.736111 -1.079062 +vt 1.263888 2.879999 +vt -1.736111 2.448470 +vt 1.263888 -0.609585 +vt -1.736111 -1.301275 +vt 1.263888 3.085214 +vt -1.736111 2.213990 +vt 1.263888 -0.355018 +vt -1.736111 -1.521408 +vt 1.263888 3.289949 +vt -1.736111 1.963086 +vt -1.902779 2.448470 +vt -1.902779 2.213990 +vt 1.097222 -0.355018 +vt 1.097222 -0.609585 +vt -1.902778 -1.301275 +vt -1.902778 -1.521408 +vt 1.097222 3.289949 +vt 1.097222 3.085214 +vt -1.902778 1.963086 +vt 1.097222 -0.084523 +vt -1.902778 -1.744961 +vt -1.902778 1.694589 +vt 1.097222 0.201473 +vt -1.902778 -1.978057 +vt -1.902778 1.409453 +vt 1.097222 0.500000 +vt -1.902778 -2.227403 +vt -1.902778 1.111170 +vt 1.097222 0.805600 +vt -1.902778 0.805600 +vt 1.097222 1.111170 +vt -1.902778 0.500000 +vt 1.097222 1.409452 +vt 1.097222 -1.978058 +vt 1.097222 -2.227405 +vt -1.902778 0.201473 +vt 1.097222 1.694589 +vt 1.097222 -1.744962 +vt -1.902778 -0.084523 +vt 1.097222 1.963087 +vt 1.097221 -1.521409 +vt -1.902778 -0.355017 +vt 1.097222 2.213990 +vt -1.902779 3.289948 +vt -1.902778 3.085213 +vt 1.097221 -1.301276 +vt -1.902778 -0.609584 +vt 1.097222 2.448471 +vt -1.902778 2.879998 +vt 1.097222 -1.079062 +vt -1.902778 -0.849882 +vt 1.097222 2.669233 +vt -1.902778 2.669232 +vt 1.097222 -0.849883 +vt -1.902778 -1.079062 +vt 1.097222 2.879999 +vt -1.358193 -2.500000 +vt 1.889263 3.500000 +vt 4.097221 3.289948 +vt 3.930554 3.289949 +vt 3.763887 3.289949 +vt 3.597220 3.289949 +vt 3.430554 3.289949 +vt 3.263887 3.289949 +vt 3.097220 3.289949 +vt 2.930554 3.289949 +vt 4.641807 -2.500000 +vt 4.763889 3.289948 +vt 4.597221 3.289948 +vt 4.430555 3.289948 +vt 4.263888 3.289948 +vn -0.4587 -0.8849 -0.0809 +vn -0.6009 -0.7923 -0.1060 +vn -0.5734 -0.7923 -0.2087 +vn -0.4377 -0.8849 -0.1593 +vn 0.9789 -0.1096 0.1726 +vn 0.9340 -0.1096 0.3400 +vn 0.9185 -0.2112 0.3343 +vn 0.9626 -0.2112 0.1697 +vn -0.8545 0.4971 -0.1507 +vn -0.7973 0.5870 -0.1406 +vn -0.7608 0.5870 -0.2769 +vn -0.8154 0.4971 -0.2968 +vn 0.1859 0.9820 0.0328 +vn 0.1774 0.9820 0.0646 +vn 0.3397 0.9324 0.1236 +vn 0.3560 0.9324 0.0628 +vn -0.7216 -0.6806 -0.1272 +vn -0.6885 -0.6806 -0.2506 +vn 0.8901 -0.3206 0.3240 +vn 0.9328 -0.3206 0.1645 +vn -0.7227 0.6794 -0.1274 +vn -0.6895 0.6794 -0.2510 +vn 0.4812 0.8590 0.1751 +vn 0.5043 0.8590 0.0889 +vn -0.8163 -0.5595 -0.1439 +vn -0.7789 -0.5595 -0.2835 +vn 0.8449 -0.4376 0.3075 +vn 0.8855 -0.4376 0.1561 +vn -0.6262 0.7718 -0.1104 +vn -0.5975 0.7718 -0.2175 +vn 0.5975 0.7718 0.2175 +vn 0.6262 0.7718 0.1104 +vn -0.8855 -0.4376 -0.1561 +vn -0.8449 -0.4376 -0.3075 +vn 0.7789 -0.5595 0.2835 +vn 0.8163 -0.5595 0.1439 +vn -0.5043 0.8590 -0.0889 +vn -0.4812 0.8590 -0.1751 +vn 0.6895 0.6794 0.2510 +vn 0.7227 0.6794 0.1274 +vn -0.9328 -0.3206 -0.1645 +vn -0.8901 -0.3206 -0.3240 +vn 0.6885 -0.6806 0.2506 +vn 0.7216 -0.6806 0.1272 +vn -0.3560 0.9324 -0.0628 +vn -0.3397 0.9324 -0.1236 +vn 0.7608 0.5870 0.2769 +vn 0.7973 0.5870 0.1406 +vn -0.9626 -0.2112 -0.1697 +vn -0.9185 -0.2112 -0.3343 +vn 0.5734 -0.7923 0.2087 +vn 0.6009 -0.7923 0.1060 +vn -0.1859 0.9820 -0.0328 +vn -0.1774 0.9820 -0.0646 +vn 0.8154 0.4971 0.2968 +vn 0.8545 0.4971 0.1507 +vn -0.9789 -0.1096 -0.1726 +vn -0.9340 -0.1096 -0.3400 +vn 0.4377 -0.8849 0.1593 +vn 0.4587 -0.8849 0.0809 +vn 0.8570 0.4103 0.3119 +vn 0.8981 0.4103 0.1584 +vn -0.9847 -0.0150 -0.1736 +vn -0.9396 -0.0150 -0.3420 +vn 0.2905 -0.9510 0.1057 +vn 0.3045 -0.9510 0.0537 +vn 0.8884 0.3259 0.3233 +vn 0.9310 0.3259 0.1642 +vn -0.9821 0.0741 -0.1732 +vn -0.9371 0.0741 -0.3411 +vn 0.1431 -0.9883 0.0521 +vn 0.1500 -0.9883 0.0264 +vn 0.9116 0.2428 0.3318 +vn 0.9553 0.2428 0.1684 +vn -0.9722 0.1595 -0.1714 +vn -0.9277 0.1595 -0.3376 +vn 0.9277 0.1595 0.3376 +vn 0.9722 0.1595 0.1714 +vn -0.9553 0.2428 -0.1685 +vn -0.9116 0.2428 -0.3318 +vn 0.9371 0.0741 0.3411 +vn 0.9821 0.0741 0.1732 +vn -0.9310 0.3259 -0.1642 +vn -0.8884 0.3259 -0.3233 +vn -0.1500 -0.9883 -0.0264 +vn -0.3045 -0.9510 -0.0537 +vn -0.2905 -0.9510 -0.1057 +vn -0.1431 -0.9883 -0.0521 +vn 0.9396 -0.0150 0.3420 +vn 0.9847 -0.0150 0.1736 +vn -0.8981 0.4103 -0.1584 +vn -0.8570 0.4103 -0.3119 +vn -0.8187 0.3259 -0.4727 +vn -0.8401 0.2428 -0.4850 +vn -0.2677 -0.9510 -0.1546 +vn -0.1319 -0.9883 -0.0761 +vn 0.8636 0.0741 0.4986 +vn 0.8659 -0.0150 0.4999 +vn -0.7898 0.4103 -0.4560 +vn -0.4034 -0.8849 -0.2329 +vn 0.8608 -0.1096 0.4970 +vn -0.7515 0.4971 -0.4339 +vn -0.5284 -0.7923 -0.3051 +vn 0.8465 -0.2112 0.4887 +vn -0.7011 0.5870 -0.4048 +vn 0.1635 0.9820 0.0944 +vn 0.3130 0.9324 0.1807 +vn -0.6345 -0.6806 -0.3663 +vn 0.8203 -0.3206 0.4736 +vn -0.6355 0.6794 -0.3669 +vn 0.4434 0.8590 0.2560 +vn -0.7178 -0.5595 -0.4144 +vn 0.7787 -0.4376 0.4496 +vn -0.5507 0.7718 -0.3179 +vn 0.5507 0.7718 0.3179 +vn -0.7787 -0.4376 -0.4496 +vn 0.7178 -0.5595 0.4144 +vn -0.4435 0.8590 -0.2560 +vn 0.6355 0.6794 0.3669 +vn -0.8203 -0.3206 -0.4736 +vn 0.6345 -0.6806 0.3663 +vn -0.3130 0.9324 -0.1807 +vn 0.7011 0.5870 0.4048 +vn -0.8465 -0.2112 -0.4887 +vn 0.5284 -0.7923 0.3051 +vn -0.1635 0.9820 -0.0944 +vn 0.7514 0.4971 0.4339 +vn -0.8608 -0.1096 -0.4970 +vn 0.4034 -0.8849 0.2329 +vn 0.7898 0.4103 0.4560 +vn -0.8659 -0.0150 -0.4999 +vn 0.2677 -0.9510 0.1546 +vn 0.8187 0.3259 0.4727 +vn -0.8636 0.0741 -0.4986 +vn 0.1319 -0.9883 0.0761 +vn 0.8401 0.2428 0.4850 +vn -0.8549 0.1595 -0.4936 +vn 0.8549 0.1595 0.4936 +vn 0.7242 0.3259 0.6077 +vn 0.7431 0.2428 0.6236 +vn -0.7562 0.1595 -0.6346 +vn -0.7639 0.0741 -0.6410 +vn 0.7562 0.1595 0.6346 +vn -0.7431 0.2428 -0.6235 +vn 0.7639 0.0741 0.6410 +vn -0.7242 0.3259 -0.6077 +vn -0.2368 -0.9510 -0.1987 +vn -0.1166 -0.9883 -0.0979 +vn 0.7660 -0.0150 0.6427 +vn -0.6986 0.4103 -0.5862 +vn -0.3568 -0.8849 -0.2994 +vn 0.7614 -0.1096 0.6389 +vn -0.6647 0.4971 -0.5577 +vn -0.4674 -0.7923 -0.3922 +vn 0.7488 -0.2112 0.6283 +vn -0.6202 0.5870 -0.5204 +vn 0.1446 0.9820 0.1213 +vn 0.2769 0.9324 0.2323 +vn -0.5613 -0.6806 -0.4710 +vn 0.7256 -0.3206 0.6089 +vn -0.5621 0.6794 -0.4717 +vn 0.3923 0.8590 0.3291 +vn -0.6349 -0.5595 -0.5328 +vn 0.6888 -0.4376 0.5780 +vn -0.4871 0.7718 -0.4087 +vn 0.4871 0.7718 0.4087 +vn -0.6888 -0.4376 -0.5780 +vn 0.6349 -0.5595 0.5328 +vn -0.3923 0.8590 -0.3291 +vn 0.5621 0.6794 0.4717 +vn -0.7256 -0.3206 -0.6089 +vn 0.5613 -0.6806 0.4710 +vn -0.2769 0.9324 -0.2323 +vn 0.6202 0.5870 0.5204 +vn -0.7488 -0.2112 -0.6283 +vn 0.4674 -0.7923 0.3922 +vn -0.1446 0.9820 -0.1213 +vn 0.6647 0.4971 0.5577 +vn -0.7614 -0.1096 -0.6389 +vn 0.3568 -0.8849 0.2994 +vn 0.6986 0.4103 0.5862 +vn -0.7660 -0.0150 -0.6427 +vn 0.2368 -0.9510 0.1987 +vn 0.1166 -0.9883 0.0979 +vn 0.5577 0.4971 0.6647 +vn 0.5862 0.4103 0.6986 +vn -0.6427 -0.0150 -0.7660 +vn -0.6389 -0.1096 -0.7614 +vn 0.2994 -0.8849 0.3568 +vn 0.1987 -0.9510 0.2368 +vn 0.6077 0.3259 0.7242 +vn -0.6410 0.0741 -0.7639 +vn 0.0979 -0.9883 0.1166 +vn 0.6235 0.2428 0.7431 +vn -0.6346 0.1595 -0.7562 +vn 0.6346 0.1595 0.7562 +vn -0.6235 0.2428 -0.7431 +vn 0.6410 0.0741 0.7639 +vn -0.6077 0.3259 -0.7242 +vn -0.1987 -0.9510 -0.2368 +vn -0.0979 -0.9883 -0.1166 +vn 0.6427 -0.0150 0.7660 +vn -0.5862 0.4103 -0.6986 +vn -0.2994 -0.8849 -0.3568 +vn 0.6389 -0.1096 0.7614 +vn -0.5577 0.4971 -0.6647 +vn -0.3922 -0.7923 -0.4674 +vn 0.6283 -0.2112 0.7488 +vn -0.5204 0.5870 -0.6202 +vn 0.1213 0.9820 0.1446 +vn 0.2323 0.9324 0.2769 +vn -0.4710 -0.6806 -0.5613 +vn 0.6089 -0.3206 0.7256 +vn -0.4717 0.6794 -0.5621 +vn 0.3291 0.8590 0.3923 +vn -0.5328 -0.5595 -0.6349 +vn 0.5780 -0.4376 0.6888 +vn -0.4087 0.7718 -0.4871 +vn 0.4087 0.7718 0.4871 +vn -0.5780 -0.4376 -0.6888 +vn 0.5328 -0.5595 0.6349 +vn -0.3291 0.8590 -0.3923 +vn 0.4717 0.6794 0.5621 +vn -0.6088 -0.3206 -0.7256 +vn 0.4710 -0.6806 0.5613 +vn -0.2323 0.9324 -0.2769 +vn 0.5204 0.5870 0.6202 +vn -0.6283 -0.2112 -0.7488 +vn 0.3922 -0.7923 0.4674 +vn -0.1213 0.9820 -0.1446 +vn 0.4144 -0.5595 0.7178 +vn 0.3663 -0.6806 0.6345 +vn -0.1807 0.9324 -0.3130 +vn -0.2560 0.8590 -0.4435 +vn 0.3669 0.6794 0.6355 +vn 0.4048 0.5870 0.7011 +vn -0.4887 -0.2112 -0.8465 +vn -0.4736 -0.3206 -0.8203 +vn 0.3051 -0.7923 0.5284 +vn -0.0944 0.9820 -0.1635 +vn 0.4338 0.4971 0.7515 +vn -0.4970 -0.1096 -0.8608 +vn 0.2329 -0.8849 0.4034 +vn 0.4560 0.4103 0.7898 +vn -0.4999 -0.0150 -0.8659 +vn 0.1546 -0.9510 0.2677 +vn 0.4727 0.3259 0.8187 +vn -0.4986 0.0741 -0.8636 +vn 0.0761 -0.9883 0.1319 +vn 0.4850 0.2428 0.8401 +vn -0.4936 0.1595 -0.8549 +vn 0.4936 0.1595 0.8549 +vn -0.4850 0.2428 -0.8401 +vn 0.4986 0.0741 0.8636 +vn -0.4727 0.3259 -0.8187 +vn -0.1546 -0.9510 -0.2677 +vn -0.0761 -0.9883 -0.1319 +vn 0.4999 -0.0150 0.8659 +vn -0.4560 0.4103 -0.7898 +vn -0.2329 -0.8849 -0.4034 +vn 0.4970 -0.1096 0.8608 +vn -0.4339 0.4971 -0.7514 +vn -0.3051 -0.7923 -0.5284 +vn 0.4887 -0.2112 0.8465 +vn -0.4048 0.5870 -0.7011 +vn 0.0944 0.9820 0.1635 +vn 0.1807 0.9324 0.3130 +vn -0.3663 -0.6806 -0.6345 +vn 0.4736 -0.3206 0.8203 +vn -0.3669 0.6794 -0.6355 +vn 0.2560 0.8590 0.4435 +vn -0.4144 -0.5595 -0.7178 +vn 0.4496 -0.4376 0.7787 +vn -0.3179 0.7718 -0.5507 +vn 0.3179 0.7718 0.5507 +vn -0.4496 -0.4376 -0.7787 +vn 0.3240 -0.3206 0.8901 +vn 0.3075 -0.4376 0.8449 +vn -0.2175 0.7718 -0.5975 +vn -0.2510 0.6794 -0.6895 +vn 0.1751 0.8590 0.4812 +vn 0.2175 0.7718 0.5975 +vn -0.3075 -0.4376 -0.8449 +vn -0.2835 -0.5595 -0.7789 +vn 0.2835 -0.5595 0.7789 +vn -0.1751 0.8590 -0.4812 +vn 0.2510 0.6794 0.6895 +vn -0.3240 -0.3206 -0.8901 +vn 0.2506 -0.6806 0.6885 +vn -0.1236 0.9324 -0.3397 +vn 0.2769 0.5870 0.7608 +vn -0.3343 -0.2112 -0.9185 +vn 0.2087 -0.7923 0.5734 +vn -0.0646 0.9820 -0.1774 +vn 0.2968 0.4971 0.8154 +vn -0.3400 -0.1096 -0.9340 +vn 0.1593 -0.8849 0.4377 +vn 0.3119 0.4103 0.8570 +vn -0.3420 -0.0150 -0.9396 +vn 0.1057 -0.9510 0.2905 +vn 0.3233 0.3259 0.8884 +vn -0.3411 0.0741 -0.9371 +vn 0.0521 -0.9883 0.1431 +vn 0.3318 0.2428 0.9116 +vn -0.3376 0.1595 -0.9277 +vn 0.3376 0.1595 0.9277 +vn -0.3318 0.2428 -0.9116 +vn 0.3411 0.0741 0.9371 +vn -0.3233 0.3259 -0.8884 +vn -0.1057 -0.9510 -0.2905 +vn -0.0521 -0.9883 -0.1431 +vn 0.3420 -0.0150 0.9396 +vn -0.3119 0.4103 -0.8570 +vn -0.1593 -0.8849 -0.4377 +vn 0.3400 -0.1096 0.9340 +vn -0.2968 0.4971 -0.8154 +vn -0.2087 -0.7923 -0.5734 +vn 0.3343 -0.2112 0.9185 +vn -0.2769 0.5870 -0.7608 +vn 0.0646 0.9820 0.1774 +vn 0.1236 0.9324 0.3397 +vn -0.2506 -0.6806 -0.6885 +vn -0.1060 -0.7923 -0.6009 +vn -0.0809 -0.8849 -0.4587 +vn 0.1726 -0.1096 0.9789 +vn 0.1697 -0.2112 0.9626 +vn -0.1406 0.5870 -0.7973 +vn -0.1507 0.4971 -0.8545 +vn 0.0328 0.9820 0.1859 +vn 0.0628 0.9324 0.3560 +vn -0.1272 -0.6806 -0.7216 +vn 0.1645 -0.3206 0.9328 +vn -0.1274 0.6794 -0.7227 +vn 0.0889 0.8590 0.5043 +vn -0.1439 -0.5595 -0.8163 +vn 0.1561 -0.4376 0.8855 +vn -0.1104 0.7718 -0.6262 +vn 0.1104 0.7718 0.6262 +vn -0.1561 -0.4376 -0.8855 +vn 0.1439 -0.5595 0.8163 +vn -0.0889 0.8590 -0.5043 +vn 0.1274 0.6794 0.7227 +vn -0.1645 -0.3206 -0.9328 +vn 0.1272 -0.6806 0.7216 +vn -0.0628 0.9324 -0.3560 +vn 0.1406 0.5870 0.7973 +vn -0.1697 -0.2112 -0.9626 +vn 0.1060 -0.7923 0.6009 +vn -0.0328 0.9820 -0.1859 +vn 0.1507 0.4971 0.8545 +vn -0.1726 -0.1096 -0.9789 +vn 0.0809 -0.8849 0.4587 +vn 0.1584 0.4103 0.8981 +vn -0.1736 -0.0150 -0.9847 +vn 0.0537 -0.9510 0.3045 +vn 0.1642 0.3259 0.9310 +vn -0.1732 0.0741 -0.9821 +vn 0.0264 -0.9883 0.1500 +vn 0.1684 0.2428 0.9553 +vn -0.1714 0.1595 -0.9722 +vn 0.1714 0.1595 0.9722 +vn -0.1685 0.2428 -0.9553 +vn 0.1732 0.0741 0.9821 +vn -0.1642 0.3259 -0.9310 +vn -0.0537 -0.9510 -0.3045 +vn -0.0264 -0.9883 -0.1500 +vn 0.1736 -0.0150 0.9847 +vn -0.1584 0.4103 -0.8981 +vn 0.0000 -0.9510 -0.3092 +vn 0.0000 -0.9883 -0.1523 +vn 0.0000 0.0741 0.9972 +vn 0.0000 -0.0150 0.9999 +vn -0.0000 0.4103 -0.9120 +vn -0.0000 0.3259 -0.9454 +vn -0.0000 -0.8849 -0.4658 +vn 0.0000 -0.1096 0.9940 +vn -0.0000 0.4971 -0.8677 +vn -0.0000 -0.7923 -0.6102 +vn 0.0000 -0.2112 0.9775 +vn -0.0000 0.5870 -0.8096 +vn 0.0000 0.9820 0.1887 +vn 0.0000 0.9324 0.3615 +vn -0.0000 -0.6806 -0.7327 +vn 0.0000 -0.3206 0.9472 +vn 0.0000 0.6794 -0.7338 +vn 0.0000 0.8590 0.5121 +vn -0.0000 -0.5595 -0.8289 +vn 0.0000 -0.4376 0.8992 +vn 0.0000 0.7718 -0.6359 +vn 0.0000 0.7718 0.6359 +vn 0.0000 -0.4376 -0.8992 +vn 0.0000 -0.5595 0.8289 +vn -0.0000 0.8590 -0.5121 +vn 0.0000 0.6794 0.7338 +vn 0.0000 -0.3206 -0.9472 +vn 0.0000 -0.6806 0.7327 +vn 0.0000 0.9324 -0.3615 +vn 0.0000 0.5870 0.8096 +vn 0.0000 -0.2112 -0.9775 +vn 0.0000 -0.7923 0.6102 +vn 0.0000 0.9820 -0.1887 +vn -0.0000 0.4971 0.8677 +vn 0.0000 -0.1096 -0.9940 +vn 0.0000 -0.8849 0.4658 +vn -0.0000 0.4103 0.9120 +vn 0.0000 -0.0150 -0.9999 +vn 0.0000 -0.9510 0.3091 +vn -0.0000 0.3259 0.9454 +vn -0.0000 0.0741 -0.9972 +vn 0.0000 -0.9883 0.1523 +vn 0.0000 0.2428 0.9701 +vn -0.0000 0.1595 -0.9872 +vn 0.0000 0.1595 0.9872 +vn -0.0000 0.2428 -0.9701 +vn 0.1714 0.1595 -0.9722 +vn 0.1732 0.0741 -0.9821 +vn -0.1684 0.2428 0.9553 +vn -0.1714 0.1595 0.9722 +vn 0.1685 0.2428 -0.9553 +vn -0.1732 0.0741 0.9821 +vn 0.1642 0.3259 -0.9310 +vn 0.0537 -0.9510 -0.3045 +vn 0.0264 -0.9883 -0.1500 +vn -0.1736 -0.0150 0.9847 +vn 0.1584 0.4103 -0.8981 +vn 0.0809 -0.8849 -0.4587 +vn -0.1726 -0.1096 0.9789 +vn 0.1507 0.4971 -0.8545 +vn 0.1060 -0.7923 -0.6009 +vn -0.1697 -0.2112 0.9626 +vn 0.1406 0.5870 -0.7973 +vn -0.0328 0.9820 0.1859 +vn -0.0628 0.9324 0.3560 +vn 0.1272 -0.6806 -0.7216 +vn -0.1645 -0.3206 0.9328 +vn 0.1274 0.6794 -0.7227 +vn -0.0889 0.8590 0.5043 +vn 0.1439 -0.5595 -0.8163 +vn -0.1561 -0.4376 0.8855 +vn 0.1104 0.7718 -0.6262 +vn -0.1104 0.7718 0.6262 +vn 0.1561 -0.4376 -0.8855 +vn -0.1439 -0.5595 0.8163 +vn 0.0889 0.8590 -0.5043 +vn -0.1274 0.6794 0.7227 +vn 0.1645 -0.3206 -0.9328 +vn -0.1272 -0.6806 0.7216 +vn 0.0628 0.9324 -0.3560 +vn -0.1406 0.5870 0.7973 +vn 0.1697 -0.2112 -0.9626 +vn -0.1060 -0.7923 0.6009 +vn 0.0328 0.9820 -0.1859 +vn -0.1507 0.4971 0.8545 +vn 0.1726 -0.1096 -0.9789 +vn -0.0809 -0.8849 0.4587 +vn -0.1584 0.4103 0.8981 +vn 0.1736 -0.0150 -0.9847 +vn -0.0537 -0.9510 0.3045 +vn -0.1642 0.3259 0.9310 +vn -0.0264 -0.9883 0.1500 +vn -0.2968 0.4971 0.8154 +vn -0.3119 0.4103 0.8570 +vn 0.3420 -0.0150 -0.9396 +vn 0.3400 -0.1096 -0.9340 +vn -0.1593 -0.8849 0.4377 +vn -0.1057 -0.9510 0.2905 +vn -0.3233 0.3259 0.8884 +vn 0.3411 0.0741 -0.9371 +vn -0.0521 -0.9883 0.1431 +vn -0.3318 0.2428 0.9116 +vn 0.3376 0.1595 -0.9277 +vn -0.3376 0.1595 0.9277 +vn 0.3318 0.2428 -0.9116 +vn -0.3411 0.0741 0.9371 +vn 0.3233 0.3259 -0.8884 +vn 0.1057 -0.9510 -0.2905 +vn 0.0521 -0.9883 -0.1431 +vn -0.3420 -0.0150 0.9396 +vn 0.3119 0.4103 -0.8570 +vn 0.1593 -0.8849 -0.4377 +vn -0.3400 -0.1096 0.9340 +vn 0.2968 0.4971 -0.8154 +vn 0.2087 -0.7923 -0.5734 +vn -0.3343 -0.2112 0.9185 +vn 0.2769 0.5870 -0.7608 +vn -0.0646 0.9820 0.1774 +vn -0.1236 0.9324 0.3397 +vn 0.2506 -0.6806 -0.6885 +vn -0.3240 -0.3206 0.8901 +vn 0.2510 0.6794 -0.6895 +vn -0.1751 0.8590 0.4812 +vn 0.2835 -0.5595 -0.7789 +vn -0.3075 -0.4376 0.8449 +vn 0.2175 0.7718 -0.5975 +vn -0.2175 0.7718 0.5975 +vn 0.3075 -0.4376 -0.8449 +vn -0.2835 -0.5595 0.7789 +vn 0.1751 0.8590 -0.4812 +vn -0.2510 0.6794 0.6895 +vn 0.3240 -0.3206 -0.8901 +vn -0.2506 -0.6806 0.6885 +vn 0.1236 0.9324 -0.3397 +vn -0.2769 0.5870 0.7608 +vn 0.3343 -0.2112 -0.9185 +vn -0.2087 -0.7923 0.5734 +vn 0.0646 0.9820 -0.1774 +vn 0.1807 0.9324 -0.3130 +vn 0.2560 0.8590 -0.4435 +vn -0.3669 0.6794 0.6355 +vn -0.4048 0.5870 0.7011 +vn 0.4887 -0.2112 -0.8465 +vn 0.4736 -0.3206 -0.8203 +vn -0.3663 -0.6806 0.6345 +vn -0.3051 -0.7923 0.5284 +vn 0.0944 0.9820 -0.1635 +vn -0.4338 0.4971 0.7515 +vn 0.4970 -0.1096 -0.8608 +vn -0.2329 -0.8849 0.4034 +vn -0.4560 0.4103 0.7898 +vn 0.4999 -0.0150 -0.8659 +vn -0.1546 -0.9510 0.2677 +vn -0.4727 0.3259 0.8187 +vn 0.4986 0.0741 -0.8636 +vn -0.0761 -0.9883 0.1319 +vn -0.4850 0.2428 0.8401 +vn 0.4936 0.1595 -0.8549 +vn -0.4936 0.1595 0.8549 +vn 0.4850 0.2428 -0.8401 +vn -0.4986 0.0741 0.8636 +vn 0.4727 0.3259 -0.8187 +vn 0.1546 -0.9510 -0.2677 +vn 0.0761 -0.9883 -0.1319 +vn -0.4999 -0.0150 0.8659 +vn 0.4560 0.4103 -0.7898 +vn 0.2329 -0.8849 -0.4034 +vn -0.4970 -0.1096 0.8608 +vn 0.4339 0.4971 -0.7514 +vn 0.3051 -0.7923 -0.5284 +vn -0.4887 -0.2112 0.8465 +vn 0.4048 0.5870 -0.7011 +vn -0.0944 0.9820 0.1635 +vn -0.1807 0.9324 0.3130 +vn 0.3663 -0.6806 -0.6345 +vn -0.4736 -0.3206 0.8203 +vn 0.3669 0.6794 -0.6355 +vn -0.2560 0.8590 0.4435 +vn 0.4144 -0.5595 -0.7178 +vn -0.4496 -0.4376 0.7787 +vn 0.3179 0.7718 -0.5507 +vn -0.3179 0.7718 0.5507 +vn 0.4496 -0.4376 -0.7787 +vn -0.4144 -0.5595 0.7178 +vn -0.6089 -0.3206 0.7256 +vn -0.5780 -0.4376 0.6888 +vn 0.4087 0.7718 -0.4871 +vn 0.4717 0.6794 -0.5621 +vn -0.3291 0.8590 0.3923 +vn -0.4087 0.7718 0.4871 +vn 0.5780 -0.4376 -0.6888 +vn 0.5328 -0.5595 -0.6349 +vn -0.5328 -0.5595 0.6349 +vn 0.3291 0.8590 -0.3923 +vn -0.4717 0.6794 0.5621 +vn 0.6088 -0.3206 -0.7256 +vn -0.4710 -0.6806 0.5613 +vn 0.2323 0.9324 -0.2769 +vn -0.5204 0.5870 0.6202 +vn 0.6283 -0.2112 -0.7488 +vn -0.3922 -0.7923 0.4674 +vn 0.1213 0.9820 -0.1446 +vn -0.5577 0.4971 0.6647 +vn 0.6389 -0.1096 -0.7614 +vn -0.2994 -0.8849 0.3568 +vn -0.5862 0.4103 0.6986 +vn 0.6427 -0.0150 -0.7660 +vn -0.1987 -0.9510 0.2368 +vn -0.6077 0.3259 0.7242 +vn 0.6410 0.0741 -0.7639 +vn -0.0979 -0.9883 0.1166 +vn -0.6235 0.2428 0.7431 +vn 0.6346 0.1595 -0.7562 +vn -0.6346 0.1595 0.7562 +vn 0.6235 0.2428 -0.7431 +vn -0.6410 0.0741 0.7639 +vn 0.6077 0.3259 -0.7242 +vn 0.1987 -0.9510 -0.2368 +vn 0.0979 -0.9883 -0.1166 +vn -0.6427 -0.0150 0.7660 +vn 0.5862 0.4103 -0.6986 +vn 0.2994 -0.8849 -0.3568 +vn -0.6389 -0.1096 0.7614 +vn 0.5577 0.4971 -0.6647 +vn 0.3922 -0.7923 -0.4674 +vn -0.6283 -0.2112 0.7488 +vn 0.5204 0.5870 -0.6202 +vn -0.1213 0.9820 0.1446 +vn -0.2323 0.9324 0.2769 +vn 0.4710 -0.6806 -0.5613 +vn -0.7614 -0.1096 0.6389 +vn -0.7488 -0.2112 0.6283 +vn 0.6202 0.5870 -0.5204 +vn 0.6647 0.4971 -0.5577 +vn -0.1446 0.9820 0.1213 +vn -0.2769 0.9324 0.2323 +vn 0.5613 -0.6806 -0.4710 +vn 0.4674 -0.7923 -0.3922 +vn -0.7256 -0.3206 0.6089 +vn 0.5621 0.6794 -0.4717 +vn -0.3923 0.8590 0.3291 +vn 0.6349 -0.5595 -0.5328 +vn -0.6888 -0.4376 0.5780 +vn 0.4871 0.7718 -0.4087 +vn -0.4871 0.7718 0.4087 +vn 0.6888 -0.4376 -0.5780 +vn -0.6349 -0.5595 0.5328 +vn 0.3923 0.8590 -0.3291 +vn -0.5621 0.6794 0.4717 +vn 0.7256 -0.3206 -0.6088 +vn -0.5613 -0.6806 0.4710 +vn 0.2769 0.9324 -0.2323 +vn -0.6202 0.5870 0.5204 +vn 0.7488 -0.2112 -0.6283 +vn -0.4674 -0.7923 0.3922 +vn 0.1446 0.9820 -0.1213 +vn -0.6647 0.4971 0.5577 +vn 0.7614 -0.1096 -0.6389 +vn -0.3568 -0.8849 0.2994 +vn -0.6986 0.4103 0.5862 +vn 0.7660 -0.0150 -0.6427 +vn -0.2368 -0.9510 0.1987 +vn -0.7242 0.3259 0.6077 +vn 0.7639 0.0741 -0.6410 +vn -0.1166 -0.9883 0.0979 +vn -0.7431 0.2428 0.6235 +vn 0.7562 0.1595 -0.6346 +vn -0.7562 0.1595 0.6346 +vn 0.7431 0.2428 -0.6235 +vn -0.7639 0.0741 0.6410 +vn 0.7242 0.3259 -0.6077 +vn 0.2368 -0.9510 -0.1987 +vn 0.1166 -0.9883 -0.0979 +vn -0.7660 -0.0150 0.6427 +vn 0.6986 0.4103 -0.5862 +vn 0.3568 -0.8849 -0.2994 +vn 0.2677 -0.9510 -0.1546 +vn 0.1319 -0.9883 -0.0761 +vn -0.8636 0.0741 0.4986 +vn -0.8659 -0.0150 0.4999 +vn 0.7898 0.4103 -0.4560 +vn 0.8187 0.3259 -0.4727 +vn 0.4034 -0.8849 -0.2329 +vn -0.8608 -0.1096 0.4970 +vn 0.7515 0.4971 -0.4339 +vn 0.5284 -0.7923 -0.3051 +vn -0.8465 -0.2112 0.4887 +vn 0.7011 0.5870 -0.4048 +vn -0.1635 0.9820 0.0944 +vn -0.3130 0.9324 0.1807 +vn 0.6345 -0.6806 -0.3663 +vn -0.8203 -0.3206 0.4736 +vn 0.6355 0.6794 -0.3669 +vn -0.4434 0.8590 0.2560 +vn 0.7178 -0.5595 -0.4144 +vn -0.7787 -0.4376 0.4496 +vn 0.5507 0.7718 -0.3179 +vn -0.5507 0.7718 0.3179 +vn 0.7787 -0.4376 -0.4496 +vn -0.7178 -0.5595 0.4144 +vn 0.4435 0.8590 -0.2560 +vn -0.6355 0.6794 0.3669 +vn 0.8203 -0.3206 -0.4736 +vn -0.6345 -0.6806 0.3663 +vn 0.3130 0.9324 -0.1807 +vn -0.7011 0.5870 0.4048 +vn 0.8465 -0.2112 -0.4887 +vn -0.5284 -0.7923 0.3051 +vn 0.1635 0.9820 -0.0944 +vn -0.7514 0.4971 0.4338 +vn 0.8608 -0.1096 -0.4970 +vn -0.4034 -0.8849 0.2329 +vn -0.7898 0.4103 0.4560 +vn 0.8659 -0.0150 -0.4999 +vn -0.2677 -0.9510 0.1546 +vn -0.8187 0.3259 0.4727 +vn 0.8636 0.0741 -0.4986 +vn -0.1319 -0.9883 0.0761 +vn -0.8401 0.2428 0.4850 +vn 0.8549 0.1595 -0.4936 +vn -0.8549 0.1595 0.4936 +vn 0.8401 0.2428 -0.4850 +vn -0.9116 0.2428 0.3318 +vn -0.9277 0.1595 0.3376 +vn 0.9116 0.2428 -0.3318 +vn 0.9277 0.1595 -0.3376 +vn -0.9371 0.0741 0.3411 +vn 0.8884 0.3259 -0.3233 +vn 0.2905 -0.9510 -0.1057 +vn 0.1431 -0.9883 -0.0521 +vn -0.9396 -0.0150 0.3420 +vn 0.8570 0.4103 -0.3119 +vn 0.4377 -0.8849 -0.1593 +vn -0.9340 -0.1096 0.3400 +vn 0.8154 0.4971 -0.2968 +vn 0.5734 -0.7923 -0.2087 +vn -0.9185 -0.2112 0.3343 +vn 0.7608 0.5870 -0.2769 +vn -0.1774 0.9820 0.0646 +vn -0.3397 0.9324 0.1236 +vn 0.6885 -0.6806 -0.2506 +vn -0.8901 -0.3206 0.3240 +vn 0.6895 0.6794 -0.2510 +vn -0.4812 0.8590 0.1751 +vn 0.7789 -0.5595 -0.2835 +vn -0.8449 -0.4376 0.3075 +vn 0.5975 0.7718 -0.2175 +vn -0.5975 0.7718 0.2175 +vn 0.8449 -0.4376 -0.3075 +vn -0.7789 -0.5595 0.2835 +vn 0.4812 0.8590 -0.1751 +vn -0.6895 0.6794 0.2510 +vn 0.8901 -0.3206 -0.3240 +vn -0.6885 -0.6806 0.2506 +vn 0.3397 0.9324 -0.1236 +vn -0.7608 0.5870 0.2769 +vn 0.9185 -0.2112 -0.3343 +vn -0.5734 -0.7923 0.2087 +vn 0.1774 0.9820 -0.0646 +vn -0.8154 0.4971 0.2968 +vn 0.9340 -0.1096 -0.3400 +vn -0.4377 -0.8849 0.1593 +vn -0.8570 0.4103 0.3119 +vn 0.9396 -0.0150 -0.3420 +vn -0.2905 -0.9510 0.1057 +vn -0.8884 0.3259 0.3233 +vn 0.9371 0.0741 -0.3411 +vn -0.1431 -0.9883 0.0521 +vn 0.9847 -0.0150 -0.1736 +vn 0.9789 -0.1096 -0.1726 +vn -0.4587 -0.8849 0.0809 +vn -0.3045 -0.9510 0.0537 +vn -0.8981 0.4103 0.1584 +vn -0.9310 0.3259 0.1642 +vn 0.9821 0.0741 -0.1732 +vn -0.1500 -0.9883 0.0264 +vn -0.9553 0.2428 0.1684 +vn 0.9722 0.1595 -0.1714 +vn -0.9722 0.1595 0.1714 +vn 0.9553 0.2428 -0.1684 +vn -0.9821 0.0741 0.1732 +vn 0.9310 0.3259 -0.1642 +vn 0.3045 -0.9510 -0.0537 +vn 0.1500 -0.9883 -0.0264 +vn -0.9847 -0.0150 0.1736 +vn 0.8981 0.4103 -0.1584 +vn 0.4587 -0.8849 -0.0809 +vn -0.9789 -0.1096 0.1726 +vn 0.8545 0.4971 -0.1507 +vn 0.6009 -0.7923 -0.1060 +vn -0.9626 -0.2112 0.1697 +vn 0.7973 0.5870 -0.1406 +vn -0.1859 0.9820 0.0328 +vn -0.3560 0.9324 0.0628 +vn 0.7216 -0.6806 -0.1272 +vn -0.9328 -0.3206 0.1645 +vn 0.7227 0.6794 -0.1274 +vn -0.5043 0.8590 0.0889 +vn 0.8163 -0.5595 -0.1439 +vn -0.8855 -0.4376 0.1561 +vn 0.6262 0.7718 -0.1104 +vn -0.6262 0.7718 0.1104 +vn 0.8855 -0.4376 -0.1561 +vn -0.8163 -0.5595 0.1439 +vn 0.5043 0.8590 -0.0889 +vn -0.7227 0.6794 0.1274 +vn 0.9328 -0.3206 -0.1645 +vn -0.7216 -0.6806 0.1272 +vn 0.3560 0.9324 -0.0628 +vn -0.7973 0.5870 0.1406 +vn 0.9626 -0.2112 -0.1697 +vn -0.6009 -0.7923 0.1060 +vn 0.1859 0.9820 -0.0328 +vn -0.8545 0.4971 0.1507 +vn -0.7338 0.6794 -0.0000 +vn -0.8096 0.5870 -0.0000 +vn 0.9775 -0.2112 -0.0000 +vn 0.9472 -0.3206 -0.0000 +vn -0.7327 -0.6806 0.0000 +vn -0.6102 -0.7923 -0.0000 +vn 0.1887 0.9820 -0.0000 +vn 0.3615 0.9324 -0.0000 +vn -0.8677 0.4971 -0.0000 +vn 0.9940 -0.1096 -0.0000 +vn -0.4658 -0.8849 -0.0000 +vn -0.9120 0.4103 -0.0000 +vn 0.9999 -0.0150 -0.0000 +vn -0.3091 -0.9510 -0.0000 +vn -0.9454 0.3259 -0.0000 +vn 0.9972 0.0741 -0.0000 +vn -0.1523 -0.9883 0.0000 +vn -0.9701 0.2428 0.0000 +vn 0.9872 0.1595 -0.0000 +vn -0.9872 0.1595 0.0000 +vn 0.9701 0.2428 -0.0000 +vn -0.9972 0.0741 0.0000 +vn 0.9454 0.3259 -0.0000 +vn 0.3091 -0.9510 -0.0000 +vn 0.1523 -0.9883 -0.0000 +vn -0.9999 -0.0150 0.0000 +vn 0.9120 0.4103 -0.0000 +vn 0.4658 -0.8849 -0.0000 +vn -0.9940 -0.1096 0.0000 +vn 0.8677 0.4971 -0.0000 +vn 0.6102 -0.7923 -0.0000 +vn -0.9775 -0.2112 -0.0000 +vn 0.8096 0.5870 -0.0000 +vn -0.1887 0.9820 -0.0000 +vn -0.3615 0.9324 -0.0000 +vn 0.7327 -0.6806 0.0000 +vn -0.9472 -0.3206 -0.0000 +vn 0.7338 0.6794 -0.0000 +vn -0.5121 0.8590 -0.0000 +vn 0.8289 -0.5595 0.0000 +vn -0.8992 -0.4376 -0.0000 +vn 0.6359 0.7718 -0.0000 +vn -0.6359 0.7718 -0.0000 +vn 0.8992 -0.4376 -0.0000 +vn -0.8289 -0.5595 0.0000 +vn 0.5121 0.8590 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +usemtl Material.001 +s 1 +f 1/1/1 2/2/2 3/3/3 4/4/4 +f 5/5/5 6/6/6 7/7/7 8/8/8 +f 9/9/9 10/10/10 11/11/11 12/12/12 +f 13/13/13 14/14/14 15/15/15 16/16/16 +f 2/2/2 17/17/17 18/18/18 3/3/3 +f 8/8/8 7/7/7 19/19/19 20/20/20 +f 10/10/10 21/21/21 22/22/22 11/11/11 +f 16/16/16 15/15/15 23/23/23 24/24/24 +f 17/17/17 25/25/25 26/26/26 18/18/18 +f 20/20/20 19/19/19 27/27/27 28/28/28 +f 21/21/21 29/29/29 30/30/30 22/22/22 +f 24/24/24 23/23/23 31/31/31 32/32/32 +f 25/25/25 33/33/33 34/34/34 26/26/26 +f 28/28/28 27/27/27 35/35/35 36/36/36 +f 29/29/29 37/37/37 38/38/38 30/30/30 +f 32/32/32 31/31/31 39/39/39 40/40/40 +f 33/33/33 41/41/41 42/42/42 34/34/34 +f 36/36/36 35/35/35 43/43/43 44/44/44 +f 37/37/37 45/45/45 46/46/46 38/38/38 +f 40/40/40 39/39/39 47/47/47 48/48/48 +f 41/41/41 49/49/49 50/50/50 42/42/42 +f 44/44/44 43/43/43 51/51/51 52/52/52 +f 45/45/45 53/53/53 54/54/54 46/46/46 +f 48/48/48 47/47/47 55/55/55 56/56/56 +f 49/49/49 57/57/57 58/58/58 50/50/50 +f 52/52/52 51/51/51 59/59/59 60/60/60 +f 56/56/56 55/55/55 61/61/61 62/62/62 +f 57/57/57 63/63/63 64/64/64 58/58/58 +f 60/60/60 59/59/59 65/65/65 66/66/66 +f 62/62/62 61/61/61 67/67/67 68/68/68 +f 63/63/63 69/69/69 70/70/70 64/64/64 +f 66/66/66 65/65/65 71/71/71 72/72/72 +f 68/68/68 67/67/67 73/73/73 74/74/74 +f 69/69/69 75/75/75 76/76/76 70/70/70 +f 74/74/74 73/73/73 77/77/77 78/78/78 +f 75/75/75 79/79/79 80/80/80 76/76/76 +f 78/78/78 77/77/77 81/81/81 82/82/82 +f 79/79/79 83/83/83 84/84/84 80/80/80 +f 85/85/85 86/86/86 87/87/87 88/88/88 +f 82/82/82 81/81/81 89/89/89 90/90/90 +f 83/83/83 91/91/91 92/92/92 84/84/84 +f 86/86/86 1/1/1 4/4/4 87/87/87 +f 90/90/90 89/89/89 6/6/6 5/5/5 +f 91/91/91 9/9/9 12/12/12 92/92/92 +f 80/80/80 84/84/84 93/93/93 94/94/94 +f 88/88/88 87/87/87 95/95/95 96/96/96 +f 81/81/81 97/97/97 98/98/98 89/89/89 +f 84/84/84 92/92/92 99/99/99 93/93/93 +f 87/87/87 4/4/4 100/100/100 95/95/95 +f 89/89/89 98/98/98 101/101/101 6/6/6 +f 92/92/92 12/12/12 102/102/102 99/99/99 +f 4/4/4 3/3/3 103/103/103 100/100/100 +f 6/6/6 101/101/101 104/104/104 7/7/7 +f 12/12/12 11/11/11 105/105/105 102/102/102 +f 14/14/14 106/106/106 107/107/107 15/15/15 +f 3/3/3 18/18/18 108/108/108 103/103/103 +f 7/7/7 104/104/104 109/109/109 19/19/19 +f 11/11/11 22/22/22 110/110/110 105/105/105 +f 15/15/15 107/107/107 111/111/111 23/23/23 +f 18/18/18 26/26/26 112/112/112 108/108/108 +f 19/19/19 109/109/109 113/113/113 27/27/27 +f 22/22/22 30/30/30 114/114/114 110/110/110 +f 23/23/23 111/111/111 115/115/115 31/31/31 +f 26/26/26 34/34/34 116/116/116 112/112/112 +f 27/27/27 113/113/113 117/117/117 35/35/35 +f 30/30/30 38/38/38 118/118/118 114/114/114 +f 31/31/31 115/115/115 119/119/119 39/39/39 +f 34/34/34 42/42/42 120/120/120 116/116/116 +f 35/35/35 117/117/117 121/121/121 43/43/43 +f 38/38/38 46/46/46 122/122/122 118/118/118 +f 39/39/39 119/119/119 123/123/123 47/47/47 +f 42/42/42 50/50/50 124/124/124 120/120/120 +f 43/43/43 121/121/121 125/125/125 51/51/51 +f 46/46/46 54/54/54 126/126/126 122/122/122 +f 47/47/47 123/123/123 127/127/127 55/55/55 +f 50/50/50 58/58/58 128/128/128 124/124/124 +f 51/51/51 125/125/125 129/129/129 59/59/59 +f 55/55/55 127/127/127 130/130/130 61/61/61 +f 58/58/58 64/64/64 131/131/131 128/128/128 +f 59/59/59 129/129/129 132/132/132 65/65/65 +f 61/61/61 130/130/130 133/133/133 67/67/67 +f 64/64/64 70/70/70 134/134/134 131/131/131 +f 65/65/65 132/132/132 135/135/135 71/71/71 +f 67/67/67 133/133/133 136/136/136 73/73/73 +f 70/70/70 76/76/76 137/137/137 134/134/134 +f 73/73/73 136/136/136 138/138/138 77/77/77 +f 76/76/76 80/80/80 94/94/94 137/137/137 +f 77/77/77 138/138/138 97/97/97 81/81/81 +f 133/133/133 139/139/139 140/140/140 136/136/136 +f 134/134/134 137/137/137 141/141/141 142/142/142 +f 136/136/136 140/140/140 143/143/143 138/138/138 +f 137/137/137 94/94/94 144/144/144 141/141/141 +f 138/138/138 143/143/143 145/145/145 97/97/97 +f 94/94/94 93/93/93 146/146/146 144/144/144 +f 96/96/96 95/95/95 147/147/147 148/148/148 +f 97/97/97 145/145/145 149/149/149 98/98/98 +f 93/93/93 99/99/99 150/150/150 146/146/146 +f 95/95/95 100/100/100 151/151/151 147/147/147 +f 98/98/98 149/149/149 152/152/152 101/101/101 +f 99/99/99 102/102/102 153/153/153 150/150/150 +f 100/100/100 103/103/103 154/154/154 151/151/151 +f 101/101/101 152/152/152 155/155/155 104/104/104 +f 102/102/102 105/105/105 156/156/156 153/153/153 +f 106/106/106 157/157/157 158/158/158 107/107/107 +f 103/103/103 108/108/108 159/159/159 154/154/154 +f 104/104/104 155/155/155 160/160/160 109/109/109 +f 105/105/105 110/110/110 161/161/161 156/156/156 +f 107/107/107 158/158/158 162/162/162 111/111/111 +f 108/108/108 112/112/112 163/163/163 159/159/159 +f 109/109/109 160/160/160 164/164/164 113/113/113 +f 110/110/110 114/114/114 165/165/165 161/161/161 +f 111/111/111 162/162/162 166/166/166 115/115/115 +f 112/112/112 116/116/116 167/167/167 163/163/163 +f 113/113/113 164/164/164 168/168/168 117/117/117 +f 114/114/114 118/118/118 169/169/169 165/165/165 +f 115/115/115 166/166/166 170/170/170 119/119/119 +f 116/116/116 120/120/120 171/171/171 167/167/167 +f 117/117/117 168/168/168 172/172/172 121/121/121 +f 118/118/118 122/122/122 173/173/173 169/169/169 +f 119/119/119 170/170/170 174/174/174 123/123/123 +f 120/120/120 124/124/124 175/175/175 171/171/171 +f 121/121/121 172/172/172 176/176/176 125/125/125 +f 122/122/122 126/126/126 177/177/177 173/173/173 +f 123/123/123 174/174/174 178/178/178 127/127/127 +f 124/124/124 128/128/128 179/179/179 175/175/175 +f 125/125/125 176/176/176 180/180/180 129/129/129 +f 127/127/127 178/178/178 181/181/181 130/130/130 +f 128/128/128 131/131/131 182/182/182 179/179/179 +f 129/129/129 180/180/180 183/183/183 132/132/132 +f 130/130/130 181/181/181 139/139/139 133/133/133 +f 131/131/131 134/134/134 142/142/142 182/182/182 +f 132/132/132 183/183/183 184/184/184 135/135/135 +f 178/178/178 185/185/185 186/186/186 181/181/181 +f 179/179/179 182/182/182 187/187/187 188/188/188 +f 180/180/180 189/189/189 190/190/190 183/183/183 +f 181/181/181 186/186/186 191/191/191 139/139/139 +f 182/182/182 142/142/142 192/192/192 187/187/187 +f 183/183/183 190/190/190 193/193/193 184/184/184 +f 139/139/139 191/191/191 194/194/194 140/140/140 +f 142/142/142 141/141/141 195/195/195 192/192/192 +f 140/140/140 194/194/194 196/196/196 143/143/143 +f 141/141/141 144/144/144 197/197/197 195/195/195 +f 143/143/143 196/196/196 198/198/198 145/145/145 +f 144/144/144 146/146/146 199/199/199 197/197/197 +f 148/148/148 147/147/147 200/200/200 201/201/201 +f 145/145/145 198/198/198 202/202/202 149/149/149 +f 146/146/146 150/150/150 203/203/203 199/199/199 +f 147/147/147 151/151/151 204/204/204 200/200/200 +f 149/149/149 202/202/202 205/205/205 152/152/152 +f 150/150/150 153/153/153 206/206/206 203/203/203 +f 151/151/151 154/154/154 207/207/207 204/204/204 +f 152/152/152 205/205/205 208/208/208 155/155/155 +f 153/153/153 156/156/156 209/209/209 206/206/206 +f 157/157/157 210/210/210 211/211/211 158/158/158 +f 154/154/154 159/159/159 212/212/212 207/207/207 +f 155/155/155 208/208/208 213/213/213 160/160/160 +f 156/156/156 161/161/161 214/214/214 209/209/209 +f 158/158/158 211/211/211 215/215/215 162/162/162 +f 159/159/159 163/163/163 216/216/216 212/212/212 +f 160/160/160 213/213/213 217/217/217 164/164/164 +f 161/161/161 165/165/165 218/218/218 214/214/214 +f 162/162/162 215/215/215 219/219/219 166/166/166 +f 163/163/163 167/167/167 220/220/220 216/216/216 +f 164/164/164 217/217/217 221/221/221 168/168/168 +f 165/165/165 169/169/169 222/222/222 218/218/218 +f 166/166/166 219/219/219 223/223/223 170/170/170 +f 167/167/167 171/171/171 224/224/224 220/220/220 +f 168/168/168 221/221/221 225/225/225 172/172/172 +f 169/169/169 173/173/173 226/226/226 222/222/222 +f 170/170/170 223/223/223 227/227/227 174/174/174 +f 171/171/171 175/175/175 228/228/228 224/224/224 +f 172/172/172 225/225/225 229/229/229 176/176/176 +f 173/173/173 177/177/177 230/230/230 226/226/226 +f 174/174/174 227/227/227 185/185/185 178/178/178 +f 175/175/175 179/179/179 188/188/188 228/228/228 +f 176/176/176 229/229/229 189/189/189 180/180/180 +f 221/221/221 231/231/231 232/232/232 225/225/225 +f 222/222/222 226/226/226 233/233/233 234/234/234 +f 223/223/223 235/235/235 236/236/236 227/227/227 +f 224/224/224 228/228/228 237/237/237 238/238/238 +f 225/225/225 232/232/232 239/239/239 229/229/229 +f 226/226/226 230/230/230 240/240/240 233/233/233 +f 227/227/227 236/236/236 241/241/241 185/185/185 +f 228/228/228 188/188/188 242/242/242 237/237/237 +f 229/229/229 239/239/239 243/243/243 189/189/189 +f 185/185/185 241/241/241 244/244/244 186/186/186 +f 188/188/188 187/187/187 245/245/245 242/242/242 +f 189/189/189 243/243/243 246/246/246 190/190/190 +f 186/186/186 244/244/244 247/247/247 191/191/191 +f 187/187/187 192/192/192 248/248/248 245/245/245 +f 190/190/190 246/246/246 249/249/249 193/193/193 +f 191/191/191 247/247/247 250/250/250 194/194/194 +f 192/192/192 195/195/195 251/251/251 248/248/248 +f 194/194/194 250/250/250 252/252/252 196/196/196 +f 195/195/195 197/197/197 253/253/253 251/251/251 +f 196/196/196 252/252/252 254/254/254 198/198/198 +f 197/197/197 199/199/199 255/255/255 253/253/253 +f 201/201/201 200/200/200 256/256/256 257/257/257 +f 198/198/198 254/254/254 258/258/258 202/202/202 +f 199/199/199 203/203/203 259/259/259 255/255/255 +f 200/200/200 204/204/204 260/260/260 256/256/256 +f 202/202/202 258/258/258 261/261/261 205/205/205 +f 203/203/203 206/206/206 262/262/262 259/259/259 +f 204/204/204 207/207/207 263/263/263 260/260/260 +f 205/205/205 261/261/261 264/264/264 208/208/208 +f 206/206/206 209/209/209 265/265/265 262/262/262 +f 210/210/210 266/266/266 267/267/267 211/211/211 +f 207/207/207 212/212/212 268/268/268 263/263/263 +f 208/208/208 264/264/264 269/269/269 213/213/213 +f 209/209/209 214/214/214 270/270/270 265/265/265 +f 211/211/211 267/267/267 271/271/271 215/215/215 +f 212/212/212 216/216/216 272/272/272 268/268/268 +f 213/213/213 269/269/269 273/273/273 217/217/217 +f 214/214/214 218/218/218 274/274/274 270/270/270 +f 215/215/215 271/271/271 275/275/275 219/219/219 +f 216/216/216 220/220/220 276/276/276 272/272/272 +f 217/217/217 273/273/273 231/231/231 221/221/221 +f 218/218/218 222/222/222 234/234/234 274/274/274 +f 219/219/219 275/275/275 235/235/235 223/223/223 +f 220/220/220 224/224/224 238/238/238 276/276/276 +f 269/269/269 277/277/277 278/278/278 273/273/273 +f 270/270/270 274/274/274 279/279/279 280/280/280 +f 271/271/271 281/281/281 282/282/282 275/275/275 +f 272/272/272 276/276/276 283/283/283 284/284/284 +f 273/273/273 278/278/278 285/285/285 231/231/231 +f 274/274/274 234/234/234 286/286/286 279/279/279 +f 275/275/275 282/282/282 287/287/287 235/235/235 +f 276/276/276 238/238/238 288/288/288 283/283/283 +f 231/231/231 285/285/285 289/289/289 232/232/232 +f 234/234/234 233/233/233 290/290/290 286/286/286 +f 235/235/235 287/287/287 291/291/291 236/236/236 +f 238/238/238 237/237/237 292/292/292 288/288/288 +f 232/232/232 289/289/289 293/293/293 239/239/239 +f 233/233/233 240/240/240 294/294/294 290/290/290 +f 236/236/236 291/291/291 295/295/295 241/241/241 +f 237/237/237 242/242/242 296/296/296 292/292/292 +f 239/239/239 293/293/293 297/297/297 243/243/243 +f 241/241/241 295/295/295 298/298/298 244/244/244 +f 242/242/242 245/245/245 299/299/299 296/296/296 +f 243/243/243 297/297/297 300/300/300 246/246/246 +f 244/244/244 298/298/298 301/301/301 247/247/247 +f 245/245/245 248/248/248 302/302/302 299/299/299 +f 246/246/246 300/300/300 303/303/303 249/249/249 +f 247/247/247 301/301/301 304/304/304 250/250/250 +f 248/248/248 251/251/251 305/305/305 302/302/302 +f 250/250/250 304/304/304 306/306/306 252/252/252 +f 251/251/251 253/253/253 307/307/307 305/305/305 +f 252/252/252 306/306/306 308/308/308 254/254/254 +f 253/253/253 255/255/255 309/309/309 307/307/307 +f 257/257/257 256/256/256 310/310/310 311/311/311 +f 254/254/254 308/308/308 312/312/312 258/258/258 +f 255/255/255 259/259/259 313/313/313 309/309/309 +f 256/256/256 260/260/260 314/314/314 310/310/310 +f 258/258/258 312/312/312 315/315/315 261/261/261 +f 259/259/259 262/262/262 316/316/316 313/313/313 +f 260/260/260 263/263/263 317/317/317 314/314/314 +f 261/261/261 315/315/315 318/318/318 264/264/264 +f 262/262/262 265/265/265 319/319/319 316/316/316 +f 266/266/266 320/320/320 321/321/321 267/267/267 +f 263/263/263 268/268/268 322/322/322 317/317/317 +f 264/264/264 318/318/318 277/277/277 269/269/269 +f 265/265/265 270/270/270 280/280/280 319/319/319 +f 267/267/267 321/321/321 281/281/281 271/271/271 +f 268/268/268 272/272/272 284/284/284 322/322/322 +f 314/314/314 317/317/317 323/323/323 324/324/324 +f 315/315/315 325/325/325 326/326/326 318/318/318 +f 316/316/316 319/319/319 327/327/327 328/328/328 +f 320/320/320 329/329/329 330/330/330 321/321/321 +f 317/317/317 322/322/322 331/331/331 323/323/323 +f 318/318/318 326/326/326 332/332/332 277/277/277 +f 319/319/319 280/280/280 333/333/333 327/327/327 +f 321/321/321 330/330/330 334/334/334 281/281/281 +f 322/322/322 284/284/284 335/335/335 331/331/331 +f 277/277/277 332/332/332 336/336/336 278/278/278 +f 280/280/280 279/279/279 337/337/337 333/333/333 +f 281/281/281 334/334/334 338/338/338 282/282/282 +f 284/284/284 283/283/283 339/339/339 335/335/335 +f 278/278/278 336/336/336 340/340/340 285/285/285 +f 279/279/279 286/286/286 341/341/341 337/337/337 +f 282/282/282 338/338/338 342/342/342 287/287/287 +f 283/283/283 288/288/288 343/343/343 339/339/339 +f 285/285/285 340/340/340 344/344/344 289/289/289 +f 286/286/286 290/290/290 345/345/345 341/341/341 +f 287/287/287 342/342/342 346/346/346 291/291/291 +f 288/288/288 292/292/292 347/347/347 343/343/343 +f 289/289/289 344/344/344 348/348/348 293/293/293 +f 290/290/290 294/294/294 349/349/349 345/345/345 +f 291/291/291 346/346/346 350/350/350 295/295/295 +f 292/292/292 296/296/296 351/351/351 347/347/347 +f 293/293/293 348/348/348 352/352/352 297/297/297 +f 295/295/295 350/350/350 353/353/353 298/298/298 +f 296/296/296 299/299/299 354/354/354 351/351/351 +f 297/297/297 352/352/352 355/355/355 300/300/300 +f 298/298/298 353/353/353 356/356/356 301/301/301 +f 299/299/299 302/302/302 357/357/357 354/354/354 +f 300/300/300 355/355/355 358/358/358 303/303/303 +f 301/301/301 356/356/356 359/359/359 304/304/304 +f 302/302/302 305/305/305 360/360/360 357/357/357 +f 304/304/304 359/359/359 361/361/361 306/306/306 +f 305/305/305 307/307/307 362/362/362 360/360/360 +f 306/306/306 361/361/361 363/363/363 308/308/308 +f 307/307/307 309/309/309 364/364/364 362/362/362 +f 311/311/311 310/310/310 365/365/365 366/366/366 +f 308/308/308 363/363/363 367/367/367 312/312/312 +f 309/309/309 313/313/313 368/368/368 364/364/364 +f 310/310/310 314/314/314 324/324/324 365/365/365 +f 312/312/312 367/367/367 325/325/325 315/315/315 +f 313/313/313 316/316/316 328/328/328 368/368/368 +f 366/366/366 365/365/365 369/369/369 370/370/370 +f 363/363/363 371/371/371 372/372/372 367/367/367 +f 364/364/364 368/368/368 373/373/373 374/374/374 +f 365/365/365 324/324/324 375/375/375 369/369/369 +f 367/367/367 372/372/372 376/376/376 325/325/325 +f 368/368/368 328/328/328 377/377/377 373/373/373 +f 324/324/324 323/323/323 378/378/378 375/375/375 +f 325/325/325 376/376/376 379/379/379 326/326/326 +f 328/380/328 327/381/327 380/382/380 377/383/377 +f 329/329/329 381/384/381 382/385/382 330/330/330 +f 323/323/323 331/331/331 383/386/383 378/378/378 +f 326/326/326 379/379/379 384/387/384 332/332/332 +f 327/381/327 333/388/333 385/389/385 380/382/380 +f 330/330/330 382/385/382 386/390/386 334/334/334 +f 331/331/331 335/335/335 387/391/387 383/386/383 +f 332/332/332 384/387/384 388/392/388 336/336/336 +f 333/388/333 337/393/337 389/394/389 385/389/385 +f 334/334/334 386/390/386 390/395/390 338/338/338 +f 335/335/335 339/339/339 391/396/391 387/391/387 +f 336/336/336 388/392/388 392/397/392 340/340/340 +f 337/393/337 341/398/341 393/399/393 389/394/389 +f 338/338/338 390/395/390 394/400/394 342/342/342 +f 339/339/339 343/343/343 395/401/395 391/396/391 +f 340/340/340 392/397/392 396/402/396 344/344/344 +f 341/398/341 345/403/345 397/404/397 393/399/393 +f 342/342/342 394/400/394 398/405/398 346/346/346 +f 343/343/343 347/347/347 399/406/399 395/401/395 +f 344/344/344 396/402/396 400/407/400 348/348/348 +f 345/403/345 349/408/349 401/409/401 397/404/397 +f 346/346/346 398/405/398 402/410/402 350/350/350 +f 347/347/347 351/351/351 403/411/403 399/406/399 +f 348/348/348 400/407/400 404/412/404 352/352/352 +f 350/350/350 402/410/402 405/413/405 353/353/353 +f 351/351/351 354/354/354 406/414/406 403/411/403 +f 352/352/352 404/412/404 407/415/407 355/355/355 +f 353/353/353 405/413/405 408/416/408 356/356/356 +f 354/354/354 357/357/357 409/417/409 406/414/406 +f 355/355/355 407/415/407 410/418/410 358/358/358 +f 356/356/356 408/416/408 411/419/411 359/359/359 +f 357/357/357 360/360/360 412/420/412 409/417/409 +f 359/359/359 411/419/411 413/421/413 361/361/361 +f 360/360/360 362/362/362 414/422/414 412/420/412 +f 361/361/361 413/421/413 371/371/371 363/363/363 +f 362/362/362 364/364/364 374/374/374 414/422/414 +f 409/423/409 412/424/412 415/425/415 416/426/416 +f 411/419/411 417/427/417 418/428/418 413/421/413 +f 412/424/412 414/429/414 419/430/419 415/425/415 +f 413/421/413 418/428/418 420/431/420 371/371/371 +f 414/429/414 374/432/374 421/433/421 419/430/419 +f 370/434/370 369/435/369 422/436/422 423/437/423 +f 371/371/371 420/431/420 424/438/424 372/372/372 +f 374/432/374 373/439/373 425/440/425 421/433/421 +f 369/435/369 375/441/375 426/442/426 422/436/422 +f 372/372/372 424/438/424 427/443/427 376/376/376 +f 373/439/373 377/383/377 428/444/428 425/440/425 +f 375/441/375 378/445/378 429/446/429 426/442/426 +f 376/376/376 427/443/427 430/447/430 379/379/379 +f 377/383/377 380/382/380 431/448/431 428/444/428 +f 381/384/381 432/449/432 433/450/433 382/385/382 +f 378/445/378 383/451/383 434/452/434 429/446/429 +f 379/379/379 430/447/430 435/453/435 384/387/384 +f 380/382/380 385/389/385 436/454/436 431/448/431 +f 382/385/382 433/450/433 437/455/437 386/390/386 +f 383/451/383 387/456/387 438/457/438 434/452/434 +f 384/387/384 435/453/435 439/458/439 388/392/388 +f 385/389/385 389/394/389 440/459/440 436/454/436 +f 386/390/386 437/455/437 441/460/441 390/395/390 +f 387/456/387 391/461/391 442/462/442 438/457/438 +f 388/392/388 439/458/439 443/463/443 392/397/392 +f 389/394/389 393/399/393 444/464/444 440/459/440 +f 390/395/390 441/460/441 445/465/445 394/400/394 +f 391/461/391 395/466/395 446/467/446 442/462/442 +f 392/397/392 443/463/443 447/468/447 396/402/396 +f 393/399/393 397/404/397 448/469/448 444/464/444 +f 394/400/394 445/465/445 449/470/449 398/405/398 +f 395/466/395 399/471/399 450/472/450 446/467/446 +f 396/402/396 447/468/447 451/473/451 400/407/400 +f 397/404/397 401/409/401 452/474/452 448/469/448 +f 398/405/398 449/470/449 453/475/453 402/410/402 +f 399/471/399 403/476/403 454/477/454 450/472/450 +f 400/407/400 451/473/451 455/478/455 404/412/404 +f 402/410/402 453/475/453 456/479/456 405/413/405 +f 403/476/403 406/480/406 457/481/457 454/477/454 +f 404/412/404 455/478/455 458/482/458 407/415/407 +f 405/413/405 456/479/456 459/483/459 408/416/408 +f 406/480/406 409/423/409 416/426/416 457/481/457 +f 407/415/407 458/482/458 460/484/460 410/418/410 +f 408/416/408 459/483/459 417/427/417 411/419/411 +f 453/475/453 461/485/461 462/486/462 456/479/456 +f 454/477/454 457/481/457 463/487/463 464/488/464 +f 455/478/455 465/489/465 466/490/466 458/482/458 +f 456/479/456 462/486/462 467/491/467 459/483/459 +f 457/481/457 416/426/416 468/492/468 463/487/463 +f 458/482/458 466/490/466 469/493/469 460/484/460 +f 459/483/459 467/491/467 470/494/470 417/427/417 +f 416/426/416 415/425/415 471/495/471 468/492/468 +f 417/427/417 470/494/470 472/496/472 418/428/418 +f 415/425/415 419/430/419 473/497/473 471/495/471 +f 418/428/418 472/496/472 474/498/474 420/431/420 +f 419/430/419 421/433/421 475/499/475 473/497/473 +f 423/437/423 422/436/422 476/500/476 477/501/477 +f 420/431/420 474/498/474 478/502/478 424/438/424 +f 421/433/421 425/440/425 479/503/479 475/499/475 +f 422/436/422 426/442/426 480/504/480 476/500/476 +f 424/438/424 478/502/478 481/505/481 427/443/427 +f 425/440/425 428/444/428 482/506/482 479/503/479 +f 426/442/426 429/446/429 483/507/483 480/504/480 +f 427/443/427 481/505/481 484/508/484 430/447/430 +f 428/444/428 431/448/431 485/509/485 482/506/482 +f 432/449/432 486/510/486 487/511/487 433/450/433 +f 429/446/429 434/452/434 488/512/488 483/507/483 +f 430/447/430 484/508/484 489/513/489 435/453/435 +f 431/448/431 436/454/436 490/514/490 485/509/485 +f 433/450/433 487/511/487 491/515/491 437/455/437 +f 434/452/434 438/457/438 492/516/492 488/512/488 +f 435/453/435 489/513/489 493/517/493 439/458/439 +f 436/454/436 440/459/440 494/518/494 490/514/490 +f 437/455/437 491/515/491 495/519/495 441/460/441 +f 438/457/438 442/462/442 496/520/496 492/516/492 +f 439/458/439 493/517/493 497/521/497 443/463/443 +f 440/459/440 444/464/444 498/522/498 494/518/494 +f 441/460/441 495/519/495 499/523/499 445/465/445 +f 442/462/442 446/467/446 500/524/500 496/520/496 +f 443/463/443 497/521/497 501/525/501 447/468/447 +f 444/464/444 448/469/448 502/526/502 498/522/498 +f 445/465/445 499/523/499 503/527/503 449/470/449 +f 446/467/446 450/472/450 504/528/504 500/524/500 +f 447/468/447 501/525/501 505/529/505 451/473/451 +f 448/469/448 452/474/452 506/530/506 502/526/502 +f 449/470/449 503/527/503 461/485/461 453/475/453 +f 450/472/450 454/477/454 464/488/464 504/528/504 +f 451/473/451 505/529/505 465/489/465 455/478/455 +f 498/522/498 502/526/502 507/531/507 508/532/508 +f 499/523/499 509/533/509 510/534/510 503/527/503 +f 500/524/500 504/528/504 511/535/511 512/536/512 +f 501/525/501 513/537/513 514/538/514 505/529/505 +f 502/526/502 506/530/506 515/539/515 507/531/507 +f 503/527/503 510/534/510 516/540/516 461/485/461 +f 504/528/504 464/488/464 517/541/517 511/535/511 +f 505/529/505 514/538/514 518/542/518 465/489/465 +f 461/485/461 516/540/516 519/543/519 462/486/462 +f 464/488/464 463/487/463 520/544/520 517/541/517 +f 465/489/465 518/542/518 521/545/521 466/490/466 +f 462/486/462 519/543/519 522/546/522 467/491/467 +f 463/487/463 468/492/468 523/547/523 520/544/520 +f 466/490/466 521/545/521 524/548/524 469/493/469 +f 467/491/467 522/546/522 525/549/525 470/494/470 +f 468/492/468 471/495/471 526/550/526 523/547/523 +f 470/494/470 525/549/525 527/551/527 472/496/472 +f 471/495/471 473/497/473 528/552/528 526/550/526 +f 472/496/472 527/551/527 529/553/529 474/498/474 +f 473/497/473 475/499/475 530/554/530 528/552/528 +f 477/501/477 476/500/476 531/555/531 532/556/532 +f 474/498/474 529/553/529 533/557/533 478/502/478 +f 475/499/475 479/503/479 534/558/534 530/554/530 +f 476/500/476 480/504/480 535/559/535 531/555/531 +f 478/502/478 533/557/533 536/560/536 481/505/481 +f 479/503/479 482/506/482 537/561/537 534/558/534 +f 480/504/480 483/507/483 538/562/538 535/559/535 +f 481/505/481 536/560/536 539/563/539 484/508/484 +f 482/506/482 485/509/485 540/564/540 537/561/537 +f 486/510/486 541/565/541 542/566/542 487/511/487 +f 483/507/483 488/512/488 543/567/543 538/562/538 +f 484/508/484 539/563/539 544/568/544 489/513/489 +f 485/509/485 490/514/490 545/569/545 540/564/540 +f 487/511/487 542/566/542 546/570/546 491/515/491 +f 488/512/488 492/516/492 547/571/547 543/567/543 +f 489/513/489 544/568/544 548/572/548 493/517/493 +f 490/514/490 494/518/494 549/573/549 545/569/545 +f 491/515/491 546/570/546 550/574/550 495/519/495 +f 492/516/492 496/520/496 551/575/551 547/571/547 +f 493/517/493 548/572/548 552/576/552 497/521/497 +f 494/518/494 498/522/498 508/532/508 549/573/549 +f 495/519/495 550/574/550 509/533/509 499/523/499 +f 496/520/496 500/524/500 512/536/512 551/575/551 +f 497/521/497 552/576/552 513/537/513 501/525/501 +f 544/568/544 553/577/553 554/578/554 548/572/548 +f 545/569/545 549/573/549 555/579/555 556/580/556 +f 546/570/546 557/581/557 558/582/558 550/574/550 +f 547/571/547 551/575/551 559/583/559 560/584/560 +f 548/572/548 554/578/554 561/585/561 552/576/552 +f 549/573/549 508/532/508 562/586/562 555/579/555 +f 550/574/550 558/582/558 563/587/563 509/533/509 +f 551/575/551 512/536/512 564/588/564 559/583/559 +f 552/576/552 561/585/561 565/589/565 513/537/513 +f 508/532/508 507/531/507 566/590/566 562/586/562 +f 509/533/509 563/587/563 567/591/567 510/534/510 +f 512/536/512 511/535/511 568/592/568 564/588/564 +f 513/537/513 565/589/565 569/593/569 514/538/514 +f 507/531/507 515/539/515 570/594/570 566/590/566 +f 510/534/510 567/591/567 571/595/571 516/540/516 +f 511/535/511 517/541/517 572/596/572 568/592/568 +f 514/538/514 569/593/569 573/597/573 518/542/518 +f 516/540/516 571/595/571 574/598/574 519/543/519 +f 517/541/517 520/544/520 575/599/575 572/596/572 +f 518/542/518 573/597/573 576/600/576 521/545/521 +f 519/543/519 574/598/574 577/601/577 522/546/522 +f 520/544/520 523/547/523 578/602/578 575/599/575 +f 521/545/521 576/600/576 579/603/579 524/548/524 +f 522/546/522 577/601/577 580/604/580 525/549/525 +f 523/547/523 526/550/526 581/605/581 578/602/578 +f 525/549/525 580/604/580 582/606/582 527/551/527 +f 526/550/526 528/552/528 583/607/583 581/605/581 +f 527/551/527 582/606/582 584/608/584 529/553/529 +f 528/552/528 530/554/530 585/609/585 583/607/583 +f 532/556/532 531/555/531 586/610/586 587/611/587 +f 529/553/529 584/608/584 588/612/588 533/557/533 +f 530/554/530 534/558/534 589/613/589 585/609/585 +f 531/555/531 535/559/535 590/614/590 586/610/586 +f 533/557/533 588/612/588 591/615/591 536/560/536 +f 534/558/534 537/561/537 592/616/592 589/613/589 +f 535/559/535 538/562/538 593/617/593 590/614/590 +f 536/560/536 591/615/591 594/618/594 539/563/539 +f 537/561/537 540/564/540 595/619/595 592/616/592 +f 541/565/541 596/620/596 597/621/597 542/566/542 +f 538/562/538 543/567/543 598/622/598 593/617/593 +f 539/563/539 594/618/594 553/577/553 544/568/544 +f 540/564/540 545/569/545 556/580/556 595/619/595 +f 542/566/542 597/621/597 557/581/557 546/570/546 +f 543/567/543 547/571/547 560/584/560 598/622/598 +f 591/615/591 599/623/599 600/624/600 594/618/594 +f 592/616/592 595/619/595 601/625/601 602/626/602 +f 596/620/596 603/627/603 604/628/604 597/621/597 +f 593/617/593 598/622/598 605/629/605 606/630/606 +f 594/618/594 600/624/600 607/631/607 553/577/553 +f 595/619/595 556/580/556 608/632/608 601/625/601 +f 597/621/597 604/628/604 609/633/609 557/581/557 +f 598/622/598 560/584/560 610/634/610 605/629/605 +f 553/577/553 607/631/607 611/635/611 554/578/554 +f 556/580/556 555/579/555 612/636/612 608/632/608 +f 557/581/557 609/633/609 613/637/613 558/582/558 +f 560/584/560 559/583/559 614/638/614 610/634/610 +f 554/578/554 611/635/611 615/639/615 561/585/561 +f 555/579/555 562/586/562 616/640/616 612/636/612 +f 558/582/558 613/637/613 617/641/617 563/587/563 +f 559/583/559 564/588/564 618/642/618 614/638/614 +f 561/585/561 615/639/615 619/643/619 565/589/565 +f 562/586/562 566/590/566 620/644/620 616/640/616 +f 563/587/563 617/641/617 621/645/621 567/591/567 +f 564/588/564 568/592/568 622/646/622 618/642/618 +f 565/589/565 619/643/619 623/647/623 569/593/569 +f 566/590/566 570/594/570 624/648/624 620/644/620 +f 567/591/567 621/645/621 625/649/625 571/595/571 +f 568/592/568 572/596/572 626/650/626 622/646/622 +f 569/593/569 623/647/623 627/651/627 573/597/573 +f 571/595/571 625/649/625 628/652/628 574/598/574 +f 572/596/572 575/599/575 629/653/629 626/650/626 +f 573/597/573 627/651/627 630/654/630 576/600/576 +f 574/598/574 628/652/628 631/655/631 577/601/577 +f 575/599/575 578/602/578 632/656/632 629/653/629 +f 576/600/576 630/654/630 633/657/633 579/603/579 +f 577/601/577 631/655/631 634/658/634 580/604/580 +f 578/602/578 581/605/581 635/659/635 632/656/632 +f 580/604/580 634/658/634 636/660/636 582/606/582 +f 581/605/581 583/607/583 637/661/637 635/659/635 +f 582/606/582 636/660/636 638/662/638 584/608/584 +f 583/607/583 585/609/585 639/663/639 637/661/637 +f 587/611/587 586/610/586 640/664/640 641/665/641 +f 584/608/584 638/662/638 642/666/642 588/612/588 +f 585/609/585 589/613/589 643/667/643 639/663/639 +f 586/610/586 590/614/590 644/668/644 640/664/640 +f 588/612/588 642/666/642 599/623/599 591/615/591 +f 589/613/589 592/616/592 602/626/602 643/667/643 +f 590/614/590 593/617/593 606/630/606 644/668/644 +f 641/665/641 640/664/640 645/669/645 646/670/646 +f 638/662/638 647/671/647 648/672/648 642/666/642 +f 639/663/639 643/667/643 649/673/649 650/674/650 +f 640/664/640 644/668/644 651/675/651 645/669/645 +f 642/666/642 648/672/648 652/676/652 599/623/599 +f 643/667/643 602/626/602 653/677/653 649/673/649 +f 644/668/644 606/630/606 654/678/654 651/675/651 +f 599/623/599 652/676/652 655/679/655 600/624/600 +f 602/626/602 601/625/601 656/680/656 653/677/653 +f 603/627/603 657/681/657 658/682/658 604/628/604 +f 606/630/606 605/629/605 659/683/659 654/678/654 +f 600/624/600 655/679/655 660/684/660 607/631/607 +f 601/625/601 608/632/608 661/685/661 656/680/656 +f 604/628/604 658/682/658 662/686/662 609/633/609 +f 605/629/605 610/634/610 663/687/663 659/683/659 +f 607/631/607 660/684/660 664/688/664 611/635/611 +f 608/632/608 612/636/612 665/689/665 661/685/661 +f 609/633/609 662/686/662 666/690/666 613/637/613 +f 610/634/610 614/638/614 667/691/667 663/687/663 +f 611/635/611 664/688/664 668/692/668 615/639/615 +f 612/636/612 616/640/616 669/693/669 665/689/665 +f 613/637/613 666/690/666 670/694/670 617/641/617 +f 614/638/614 618/642/618 671/695/671 667/691/667 +f 615/639/615 668/692/668 672/696/672 619/643/619 +f 616/640/616 620/644/620 673/697/673 669/693/669 +f 617/641/617 670/694/670 674/698/674 621/645/621 +f 618/642/618 622/646/622 675/699/675 671/695/671 +f 619/643/619 672/696/672 676/700/676 623/647/623 +f 620/644/620 624/648/624 677/701/677 673/697/673 +f 621/645/621 674/698/674 678/702/678 625/649/625 +f 622/646/622 626/650/626 679/703/679 675/699/675 +f 623/647/623 676/700/676 680/704/680 627/651/627 +f 625/649/625 678/702/678 681/705/681 628/652/628 +f 626/650/626 629/653/629 682/706/682 679/703/679 +f 627/651/627 680/704/680 683/707/683 630/654/630 +f 628/652/628 681/705/681 684/708/684 631/655/631 +f 629/653/629 632/656/632 685/709/685 682/706/682 +f 630/654/630 683/707/683 686/710/686 633/657/633 +f 631/655/631 684/708/684 687/711/687 634/658/634 +f 632/656/632 635/659/635 688/712/688 685/709/685 +f 634/658/634 687/711/687 689/713/689 636/660/636 +f 635/659/635 637/661/637 690/714/690 688/712/688 +f 636/660/636 689/713/689 647/671/647 638/662/638 +f 637/661/637 639/663/639 650/674/650 690/714/690 +f 687/711/687 691/715/691 692/716/692 689/713/689 +f 688/712/688 690/714/690 693/717/693 694/718/694 +f 689/713/689 692/716/692 695/719/695 647/671/647 +f 690/714/690 650/674/650 696/720/696 693/717/693 +f 646/670/646 645/669/645 697/721/697 698/722/698 +f 647/671/647 695/719/695 699/723/699 648/672/648 +f 650/674/650 649/673/649 700/724/700 696/720/696 +f 645/669/645 651/675/651 701/725/701 697/721/697 +f 648/672/648 699/723/699 702/726/702 652/676/652 +f 649/673/649 653/677/653 703/727/703 700/724/700 +f 651/675/651 654/678/654 704/728/704 701/725/701 +f 652/676/652 702/726/702 705/729/705 655/679/655 +f 653/677/653 656/680/656 706/730/706 703/727/703 +f 657/681/657 707/731/707 708/732/708 658/682/658 +f 654/678/654 659/683/659 709/733/709 704/728/704 +f 655/679/655 705/729/705 710/734/710 660/684/660 +f 656/680/656 661/685/661 711/735/711 706/730/706 +f 658/682/658 708/732/708 712/736/712 662/686/662 +f 659/683/659 663/687/663 713/737/713 709/733/709 +f 660/684/660 710/734/710 714/738/714 664/688/664 +f 661/685/661 665/689/665 715/739/715 711/735/711 +f 662/686/662 712/736/712 716/740/716 666/690/666 +f 663/687/663 667/691/667 717/741/717 713/737/713 +f 664/688/664 714/738/714 718/742/718 668/692/668 +f 665/689/665 669/693/669 719/743/719 715/739/715 +f 666/690/666 716/740/716 720/744/720 670/694/670 +f 667/691/667 671/695/671 721/745/721 717/741/717 +f 668/692/668 718/742/718 722/746/722 672/696/672 +f 669/693/669 673/697/673 723/747/723 719/743/719 +f 670/694/670 720/744/720 724/748/724 674/698/674 +f 671/695/671 675/699/675 725/749/725 721/745/721 +f 672/696/672 722/746/722 726/750/726 676/700/676 +f 673/697/673 677/701/677 727/751/727 723/747/723 +f 674/698/674 724/748/724 728/752/728 678/702/678 +f 675/699/675 679/703/679 729/753/729 725/749/725 +f 676/700/676 726/750/726 730/754/730 680/704/680 +f 678/702/678 728/752/728 731/755/731 681/705/681 +f 679/703/679 682/706/682 732/756/732 729/753/729 +f 680/704/680 730/754/730 733/757/733 683/707/683 +f 681/705/681 731/755/731 734/758/734 684/708/684 +f 682/706/682 685/709/685 735/759/735 732/756/732 +f 683/707/683 733/757/733 736/760/736 686/710/686 +f 684/708/684 734/758/734 691/715/691 687/711/687 +f 685/709/685 688/712/688 694/718/694 735/759/735 +f 729/753/729 732/756/732 737/761/737 738/762/738 +f 730/754/730 739/763/739 740/764/740 733/757/733 +f 731/755/731 741/765/741 742/766/742 734/758/734 +f 732/756/732 735/759/735 743/767/743 737/761/737 +f 733/757/733 740/764/740 744/768/744 736/760/736 +f 734/758/734 742/766/742 745/769/745 691/715/691 +f 735/759/735 694/718/694 746/770/746 743/767/743 +f 691/715/691 745/769/745 747/771/747 692/716/692 +f 694/718/694 693/717/693 748/772/748 746/770/746 +f 692/716/692 747/771/747 749/773/749 695/719/695 +f 693/717/693 696/720/696 750/774/750 748/772/748 +f 698/722/698 697/721/697 751/775/751 752/776/752 +f 695/719/695 749/773/749 753/777/753 699/723/699 +f 696/720/696 700/724/700 754/778/754 750/774/750 +f 697/721/697 701/725/701 755/779/755 751/775/751 +f 699/723/699 753/777/753 756/780/756 702/726/702 +f 700/724/700 703/727/703 757/781/757 754/778/754 +f 701/725/701 704/728/704 758/782/758 755/779/755 +f 702/726/702 756/780/756 759/783/759 705/729/705 +f 703/727/703 706/730/706 760/784/760 757/781/757 +f 707/731/707 761/785/761 762/786/762 708/732/708 +f 704/728/704 709/733/709 763/787/763 758/782/758 +f 705/729/705 759/783/759 764/788/764 710/734/710 +f 706/730/706 711/735/711 765/789/765 760/784/760 +f 708/732/708 762/786/762 766/790/766 712/736/712 +f 709/733/709 713/737/713 767/791/767 763/787/763 +f 710/734/710 764/788/764 768/792/768 714/738/714 +f 711/735/711 715/739/715 769/793/769 765/789/765 +f 712/736/712 766/790/766 770/794/770 716/740/716 +f 713/737/713 717/741/717 771/795/771 767/791/767 +f 714/738/714 768/792/768 772/796/772 718/742/718 +f 715/739/715 719/743/719 773/797/773 769/793/769 +f 716/740/716 770/794/770 774/798/774 720/744/720 +f 717/741/717 721/745/721 775/799/775 771/795/771 +f 718/742/718 772/796/772 776/800/776 722/746/722 +f 719/743/719 723/747/723 777/801/777 773/797/773 +f 720/744/720 774/798/774 778/802/778 724/748/724 +f 721/745/721 725/749/725 779/803/779 775/799/775 +f 722/746/722 776/800/776 780/804/780 726/750/726 +f 723/747/723 727/751/727 781/805/781 777/801/777 +f 724/748/724 778/802/778 782/806/782 728/752/728 +f 725/749/725 729/753/729 738/762/738 779/803/779 +f 726/750/726 780/804/780 739/763/739 730/754/730 +f 728/752/728 782/806/782 741/765/741 731/755/731 +f 774/798/774 783/807/783 784/808/784 778/802/778 +f 775/799/775 779/803/779 785/809/785 786/810/786 +f 776/800/776 787/811/787 788/812/788 780/804/780 +f 777/801/777 781/805/781 789/813/789 790/814/790 +f 778/802/778 784/808/784 791/815/791 782/806/782 +f 779/803/779 738/762/738 792/816/792 785/809/785 +f 780/804/780 788/812/788 793/817/793 739/763/739 +f 782/806/782 791/815/791 794/818/794 741/765/741 +f 738/762/738 737/761/737 795/819/795 792/816/792 +f 739/763/739 793/817/793 796/820/796 740/764/740 +f 741/765/741 794/818/794 797/821/797 742/766/742 +f 737/761/737 743/767/743 798/822/798 795/819/795 +f 740/764/740 796/820/796 799/823/799 744/768/744 +f 742/766/742 797/821/797 800/824/800 745/769/745 +f 743/767/743 746/770/746 801/825/801 798/822/798 +f 745/769/745 800/824/800 802/826/802 747/771/747 +f 746/770/746 748/772/748 803/827/803 801/825/801 +f 747/771/747 802/826/802 804/828/804 749/773/749 +f 748/772/748 750/774/750 805/829/805 803/827/803 +f 752/776/752 751/775/751 806/830/806 807/831/807 +f 749/773/749 804/828/804 808/832/808 753/777/753 +f 750/774/750 754/778/754 809/833/809 805/829/805 +f 751/775/751 755/779/755 810/834/810 806/830/806 +f 753/777/753 808/832/808 811/835/811 756/780/756 +f 754/778/754 757/781/757 812/836/812 809/833/809 +f 755/779/755 758/782/758 813/837/813 810/834/810 +f 756/780/756 811/835/811 814/838/814 759/783/759 +f 757/781/757 760/784/760 815/839/815 812/836/812 +f 761/785/761 816/840/816 817/841/817 762/786/762 +f 758/782/758 763/787/763 818/842/818 813/837/813 +f 759/783/759 814/838/814 819/843/819 764/788/764 +f 760/784/760 765/789/765 820/844/820 815/839/815 +f 762/786/762 817/841/817 821/845/821 766/790/766 +f 763/787/763 767/791/767 822/846/822 818/842/818 +f 764/788/764 819/843/819 823/847/823 768/792/768 +f 765/789/765 769/793/769 824/848/824 820/844/820 +f 766/790/766 821/845/821 825/849/825 770/794/770 +f 767/791/767 771/795/771 826/850/826 822/846/822 +f 768/792/768 823/847/823 827/851/827 772/796/772 +f 769/793/769 773/797/773 828/852/828 824/848/824 +f 770/794/770 825/849/825 783/807/783 774/798/774 +f 771/795/771 775/799/775 786/810/786 826/850/826 +f 772/796/772 827/851/827 787/811/787 776/800/776 +f 773/797/773 777/801/777 790/814/790 828/852/828 +f 809/833/809 62/62/62 68/68/68 805/829/805 +f 808/832/808 804/828/804 69/69/69 63/63/63 +f 806/830/806 66/66/66 72/72/72 807/831/807 +f 805/829/805 68/68/68 74/74/74 803/827/803 +f 804/828/804 802/826/802 75/75/75 69/69/69 +f 807/831/807 72/72/72 829/853/829 +f 803/827/803 74/74/74 78/78/78 801/825/801 +f 802/826/802 800/824/800 79/79/79 75/75/75 +f 829/853/829 799/823/799 85/85/85 +f 801/825/801 78/78/78 82/82/82 798/822/798 +f 800/824/800 797/821/797 83/83/83 79/79/79 +f 799/823/799 796/820/796 86/86/86 85/85/85 +f 798/822/798 82/82/82 90/90/90 795/819/795 +f 797/821/797 794/818/794 91/91/91 83/83/83 +f 796/820/796 793/817/793 1/1/1 86/86/86 +f 795/819/795 90/90/90 5/5/5 792/816/792 +f 794/818/794 791/815/791 9/9/9 91/91/91 +f 830/854/830 13/13/13 789/813/789 +f 793/817/793 788/812/788 2/2/2 1/1/1 +f 792/816/792 5/5/5 8/8/8 785/809/785 +f 791/815/791 784/808/784 10/10/10 9/9/9 +f 789/813/789 13/13/13 16/16/16 790/814/790 +f 788/812/788 787/811/787 17/17/17 2/2/2 +f 785/809/785 8/8/8 20/20/20 786/810/786 +f 784/808/784 783/807/783 21/21/21 10/10/10 +f 790/814/790 16/16/16 24/24/24 828/852/828 +f 787/811/787 827/851/827 25/25/25 17/17/17 +f 786/810/786 20/20/20 28/28/28 826/850/826 +f 783/807/783 825/849/825 29/29/29 21/21/21 +f 828/852/828 24/24/24 32/32/32 824/848/824 +f 827/851/827 823/847/823 33/33/33 25/25/25 +f 826/850/826 28/28/28 36/36/36 822/846/822 +f 825/849/825 821/845/821 37/37/37 29/29/29 +f 824/848/824 32/32/32 40/40/40 820/844/820 +f 823/847/823 819/843/819 41/41/41 33/33/33 +f 822/846/822 36/36/36 44/44/44 818/842/818 +f 821/845/821 817/841/817 45/45/45 37/37/37 +f 820/844/820 40/40/40 48/48/48 815/839/815 +f 819/843/819 814/838/814 49/49/49 41/41/41 +f 818/842/818 44/44/44 52/52/52 813/837/813 +f 817/841/817 816/840/816 53/53/53 45/45/45 +f 815/839/815 48/48/48 56/56/56 812/836/812 +f 814/838/814 811/835/811 57/57/57 49/49/49 +f 813/837/813 52/52/52 60/60/60 810/834/810 +f 816/855/816 830/854/830 53/856/53 +f 812/836/812 56/56/56 62/62/62 809/833/809 +f 811/835/811 808/832/808 63/63/63 57/57/57 +f 810/834/810 60/60/60 66/66/66 806/830/806 +f 830/854/830 14/14/14 13/13/13 +f 53/856/53 830/854/830 54/857/54 +f 72/72/72 71/71/71 829/853/829 +f 829/853/829 85/85/85 88/88/88 +f 830/854/830 106/106/106 14/14/14 +f 54/857/54 830/854/830 126/858/126 +f 71/71/71 135/135/135 829/853/829 +f 829/853/829 88/88/88 96/96/96 +f 135/135/135 184/184/184 829/853/829 +f 829/853/829 96/96/96 148/148/148 +f 830/854/830 157/157/157 106/106/106 +f 126/858/126 830/854/830 177/859/177 +f 177/859/177 830/854/830 230/860/230 +f 184/184/184 193/193/193 829/853/829 +f 829/853/829 148/148/148 201/201/201 +f 830/854/830 210/210/210 157/157/157 +f 230/860/230 830/854/830 240/861/240 +f 193/193/193 249/249/249 829/853/829 +f 829/853/829 201/201/201 257/257/257 +f 830/854/830 266/266/266 210/210/210 +f 240/861/240 830/854/830 294/862/294 +f 249/249/249 303/303/303 829/853/829 +f 829/853/829 257/257/257 311/311/311 +f 830/854/830 320/320/320 266/266/266 +f 294/862/294 830/854/830 349/408/349 +f 303/303/303 358/358/358 829/853/829 +f 829/853/829 311/311/311 366/366/366 +f 830/854/830 329/329/329 320/320/320 +f 830/854/830 381/384/381 329/329/329 +f 349/408/349 830/854/830 401/409/401 +f 358/358/358 410/418/410 829/853/829 +f 829/853/829 366/366/366 370/370/370 +f 410/418/410 460/484/460 829/853/829 +f 829/863/829 370/434/370 423/437/423 +f 830/854/830 432/449/432 381/384/381 +f 401/409/401 830/854/830 452/474/452 +f 460/484/460 469/493/469 829/853/829 +f 829/863/829 423/437/423 477/501/477 +f 830/854/830 486/510/486 432/449/432 +f 452/474/452 830/854/830 506/530/506 +f 506/530/506 830/854/830 515/539/515 +f 469/493/469 524/548/524 829/853/829 +f 829/863/829 477/501/477 532/556/532 +f 830/854/830 541/565/541 486/510/486 +f 515/539/515 830/854/830 570/594/570 +f 524/548/524 579/603/579 829/853/829 +f 829/863/829 532/556/532 587/611/587 +f 830/854/830 596/620/596 541/565/541 +f 570/594/570 830/854/830 624/648/624 +f 579/603/579 633/657/633 829/853/829 +f 829/863/829 587/611/587 641/665/641 +f 830/854/830 603/864/603 596/620/596 +f 830/854/830 657/865/657 603/864/603 +f 624/648/624 830/854/830 677/701/677 +f 633/657/633 686/710/686 829/853/829 +f 829/863/829 641/665/641 646/670/646 +f 686/710/686 736/760/736 829/853/829 +f 829/853/829 646/670/646 698/722/698 +f 830/854/830 707/866/707 657/865/657 +f 677/701/677 830/854/830 727/751/727 +f 736/760/736 744/768/744 829/853/829 +f 829/853/829 698/722/698 752/776/752 +f 830/854/830 761/867/761 707/866/707 +f 727/751/727 830/854/830 781/805/781 +f 781/805/781 830/854/830 789/813/789 +f 744/768/744 799/823/799 829/853/829 +f 829/853/829 752/776/752 807/831/807 +f 830/854/830 816/855/816 761/867/761 diff --git a/register_arena.lua b/register_arena.lua new file mode 100644 index 0000000..1a0d2b4 --- /dev/null +++ b/register_arena.lua @@ -0,0 +1,202 @@ +---------------------------------------------------------------------- +-- Eggwars by wilkgr -- +-- with additional code by shivajiva101@hotmail.com -- +-- Licensed under the AGPL v3 -- +-- You MUST make any changes you make open source -- +-- even if you just run it on your server without publishing it -- +-- Supports a maximum of 8 players per instance and 8 concurrent -- +-- instances for a max of 64 players -- +---------------------------------------------------------------------- + +-- default arena definition template, all fields reqd +local default_arena = { + blocked_recipes = { + -- Recipes removed from world for gameplay so player MUST purchase items + {output = 'default:stick'}, -- tools + {output = '3d_armor:boots_wood'}, + {output = '3d_armor:helmet_wood'}, + {output = '3d_armor:leggings_wood'}, + {output = '3d_armor:chestplate_wood'}, + {output = '3d_armor:boots_diamond'}, + {output = '3d_armor:helmet_diamond'}, + {output = '3d_armor:leggings_diamond'}, + {output = '3d_armor:chestplate_diamond'}, + }, + bot = { + -- spawner upgrade bot + offset = { + {x=-2, y=0, z=-4}, -- relative to island origin + {x=2, y=0, z=4}, + {x=-2, y=0, z=-4}, + {x=2, y=0, z=4}, + {x=-4, y=0, z=2}, + {x=-4, y=0, z=2}, + {x=4, y=0, z=-2}, + {x=4, y=0, z=-2} + }, + yaw = {90,270,90,270,0,0,180,180} -- facing + }, + colour = { + -- rgb colour tables + {r = 0, g = 0, b = 255}, -- Blue + {r = 0, g = 255, b = 0}, -- Green + {r = 255, g = 0, b = 0}, -- Red + {r = 108, g = 0, b = 255}, -- Purple + {r = 255, g = 255, b = 0}, -- Yellow + {r = 0, g = 255, b = 255}, -- Cyan + {r = 255, g = 150, b = 0}, -- Orange + {r = 255, g = 0, b = 255} -- Pink + }, + cs = { + -- colour strings used by mod + {"Blue", "#0000FFBF", "blue", "0x0000FF"}, + {"Green", "#00FF00BF", "green", "0x00FF00"}, + {"Red", "#FF0000BF", "red", "0xFF0000"}, + {"Violet", "#7800FFBF", "violet", "0x7800FF"}, + {"Yellow", "#FFFF00BF", "yellow", "0xFFFF00"}, + {"Cyan", "#00FFFFBF", "cyan", "0x00FFFF"}, + {"Orange", "#FF9600BF", "orange", "0xFF9600"}, + {"Pink", "#FF00FFBF", "pink", "0xFF00FF"} + }, + description = 'default arena by shivajiva', + egg_offset = { + {x=-5, y=0, z=0}, -- relative to island origin + {x=5, y=0, z=0}, + {x=-5, y=0, z=0}, + {x=-5, y=0, z=0}, + {x=-5, y=0, z=0}, + {x=-5, y=0, z=0}, + {x=-5, y=0, z=0}, + {x=-5, y=0, z=0} + }, + exempt_nodes = { + -- exempt nodes you want breakable within the world + -- partial strings allowed + 'eggwars:', + 'wool:', -- bridging block + 'default:obsidian_block' -- requires pick + }, + hub = { + -- arena hub def + offset = {x=-30, y=-18, z=-30}, -- pos1 for place + schem = 'hub_1.mts' + }, + island = { + -- Confined to 90 degree rotations the current schema + -- places 2 islands per side of a square, giving us 8 + -- islands max per instance. Each island is displaced + -- equally from the arena centre position using the + -- island vector table + {x=85, y=0, z=-40}, -- BL + {x=-85, y=0, z=-40}, -- TL + {x=85, y=0, z=40}, -- BR + {x=-85, y=0, z=40}, -- TR + {x=40, y=0, z=-85}, -- LB + {x=-40, y=0, z=-85}, -- LT + {x=40, y=0, z=85}, -- RB + {x=-40, y=0, z=85}, -- RT + offset = {x=-11, y=-20, z=-10}, + rotate = {"0", "180", "0", "180", "90", "90", "270", "270"}, + schem = 'island_1.mts' + }, + name = 'default', -- arena name + region = { + -- arena region relative to origin + p1 = {x=-120, y=-30, z=-120}, + p2 = {x=120, y=100, z=120} + }, + register_nodes = { + -- add any arena specific custom nodes here, generally + -- these are the nodes the player can use in the arenas + -- and should contain nodes not previously registered by + -- other arenas. + -- name = {normal node def} + ['log'] = { + description = "Log", + tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node + }, + }, + satellite = { + -- satellite ruby spawner island positions relative to origin + offset = {x=-5, y=-13, z=-5}, + pos = { + {x=-65, y=0, z=0}, -- N + {x=0, y=0, z=65}, -- E + {x=65, y=0, z=0}, -- S + {x=0, y=0, z=-65} -- W + }, + schem = 'island_small_1.mts' + }, + spawners = { + -- centre + diamond = { + {x=9, y=4, z=-9}, -- relative to arena origin + {x=-9, y=4, z=9}, + {x=-9, y=4, z=-9}, + {x=9, y=4, z=9}, + rate = 30 + }, + -- player island + gold = { + {x=-3, y=-1, z=-4}, -- relative to island origin + {x=3, y=-1, z=4}, + {x=-3, y=-1, z=-4}, + {x=3, y=-1, z=4}, + {x=-4, y=-1, z=3}, + {x=-4, y=-1, z=3}, + {x=4, y=-1, z=-3}, + {x=4, y=-1, z=-3}, + rate = 5 -- starting rate in seconds + }, + -- satellites + ruby = { + {x=65, y=0.5, z=0}, -- relative to arena origin + {x=0, y=0, z=65}, + {x=-65, y=0, z=0}, + {x=0, y=0, z=-65}, + rate = 15 + }, + }, + timer = { + max_time = 1800, -- seconds + suddendeath = 1200 -- seconds + }, + trader = { + names = { + "Johann", + "Celery55", + "Moldy Coder", + "Wilkgr", + "Rick O Shae", + "Bernie Towndown", + "Warden Ruby", + "Bom Shiva" + }, + offset = { + {x=2, y=0.5, z=0}, -- relative to island origin + {x=-2, y=0.5, z=0}, + {x=2, y=0.5, z=0}, + {x=-2, y=0.5, z=0}, + {x=0, y=0.5, z=2}, + {x=0, y=0.5, z=2}, + {x=0, y=0.5, z=-2}, + {x=0, y=0.5, z=-2} + }, + yaw = {90,270,90,270,0,0,180,180} -- facing + }, +} + +eggwars.register_arena = function(def) + table.insert(eggwars.arena, def) + for k,v in pairs(def.register_nodes) do + minetest.register_node('eggwars:' .. k, v) + end +end + +-- Register the sample default arena +eggwars.register_arena(default_arena) diff --git a/register_nodes.lua b/register_nodes.lua old mode 100644 new mode 100755 index abcf5b2..4cf2306 --- a/register_nodes.lua +++ b/register_nodes.lua @@ -1,220 +1,137 @@ --- Probably find a use for this I s'pose... May not. -minetest.register_node("eggwars:pedestal", { - tiles = { - "default_wood.png", - "default_wood.png", - "default_wood.png", - "default_wood.png", - "default_wood.png", - "default_wood.png" - }, - drawtype = "nodebox", - paramtype = "light", - node_box = { - type = "fixed", - fixed = { - {-0.375, -0.4375, -0.375, 0.375, -0.3125, 0.375}, -- NodeBox2 - {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5}, -- NodeBox3 - {-0.4375, -0.5, -0.4375, 0.4375, -0.375, 0.4375}, -- NodeBox4 - {-0.1875, -0.5, -0.1875, 0.1875, 0.5, 0.1875}, -- NodeBox5 - {-0.5, 0.4375, -0.5, 0.5, 0.5, 0.5}, -- NodeBox6 - {-0.4375, 0.375, -0.4375, 0.4375, 0.5, 0.4375}, -- NodeBox7 - {-0.5, 0.3125, -0.375, 0.5, 0.5, 0.375}, -- NodeBox8 - } - } -}) -minetest.register_node("eggwars:egg", { - description = "Egg", - tiles = { - "default_stone.png", - "default_stone.png", - "default_stone.png", - "default_stone.png", - "default_stone.png", - "default_stone.png" - }, - groups = {crumbly = 3}, - drawtype = "nodebox", - paramtype = "light", - node_box = { - type = "fixed", - fixed = { - {-0.1875, -0.5, -0.1875, 0.1875, 0.5, 0.1875}, -- NodeBox1 - {-0.25, -0.4375, -0.25, 0.25, 0.4375, 0.25}, -- NodeBox2 - {-0.3125, -0.375, -0.3125, 0.3125, 0.3125, 0.3125}, -- NodeBox3 - {-0.375, -0.3125, -0.375, 0.375, 0.1875, 0.375}, -- NodeBox4 - {-0.4375, -0.25, -0.4375, 0.4375, 0.0625, 0.4375}, -- NodeBox5 - {-0.5, -0.125, -0.5, 0.5, -0.0625, 0.5}, -- NodeBox6 - } - } +---------------------------------------------------------------------- +-- Eggwars by wilkgr -- +-- with additional code by shivajiva101@hotmail.com -- +-- Licensed under the AGPL v3 -- +-- You MUST make any changes you make open source -- +-- even if you just run it on your server without publishing it -- +-- Supports a maximum of 8 players per instance and 8 concurrent -- +-- instances for a max of 64 players -- +---------------------------------------------------------------------- + +------------------------ +-- on_timer functions -- +------------------------ + +local function goldspawner(pos, elapsed) + local sp = vector.new(pos.x, pos.y + 3, pos.z) + minetest.add_item(sp, "default:gold_ingot") + return true +end + +local function rubyspawner(pos, elapsed) + local sp = vector.new(pos.x, pos.y + 3, pos.z) + minetest.add_item(sp, "eggwars:ruby") + return true +end + +local function diamondspawner(pos, elapsed) + local sp = vector.new(pos.x, pos.y + 3, pos.z) + minetest.add_item(sp, "default:diamond") + return true +end + +----------------- +-- craft items -- +----------------- + +minetest.register_craftitem("eggwars:ruby", { + description = "Ruby", + inventory_image = "eggwars_ruby.png", }) -minetest.register_node("eggwars:dirt", { - description = "Unbreakable Dirt", - range = 12, - stack_max = 99, - tiles = {"default_dirt.png"}, - drop = "", - groups = {unbreakable = 1, not_in_creative_inventory = 1}, - sounds = default.node_sound_dirt_defaults(), +------------------------ +-- node registrations -- +------------------------ + +-- Arena eggs +for i,v in ipairs(eggwars.arena[1].cs) do + + minetest.register_node("eggwars:egg" .. i, { + description = eggwars.arena[1].cs[i][1] .. " egg", + tiles = {"eggwars_shell.png^[colorize:" .. eggwars.arena[1].cs[i][2]}, + drawtype = "mesh", + mesh = "eggwars_egg.obj", + groups = {crumbly = 3, not_in_creative_inventory = 1}, + paramtype = "light", + --light_source = 14, + selection_box = { + type = "fixed", + fixed = {-0.35, -0.5, -0.35, 0.35, 0.45, 0.35} -- right, bottom, back, left, top, front + }, + collision_box = { + type = "fixed", + fixed = {-0.35, -0.5, -0.35, 0.35, 0.45, 0.35} + }, + drop = {}, + on_drop = eggwars.drop_msg, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local victim, attacker, msg, key, match, eggs + victim = oldmetadata.fields.owner + attacker = digger:get_player_name() + if not victim then return end -- dev ONLY! + key = eggwars.player[victim] + match = eggwars.match[key] + match.player[victim].egg = false + eggs = match.player[attacker].eggs + 1 + match.player[attacker].eggs = eggs + msg = victim .. "'s egg was destroyed by " .. attacker + eggwars.chat_send_match(eggwars.player[victim].match, msg) + end, + can_dig = function(pos, player) + local meta = minetest.get_meta(pos) + local name = meta:get_string("owner") + if name == "" or not name == player:get_player_name() then + return true + end + end + }) + +end + +-- Spawners +minetest.register_node("eggwars:gold_spawner", { + description = "Gold ingot spawner", + tiles = {"default_stone.png^default_mineral_gold.png"}, + on_timer = goldspawner }) -minetest.register_node("eggwars:grass", { - description = "Unbreakable Dirt With Grass", +minetest.register_node("eggwars:ruby_spawner", { + description = "Ruby gemstone spawner", + tiles = {"default_stone.png^eggwars_mineral_ruby.png"}, + on_timer = rubyspawner +}) + +minetest.register_node("eggwars:diamond_spawner", { + description = "Diamond gemstone spawner", + tiles = {"default_stone.png^default_mineral_diamond.png"}, + on_timer = diamondspawner +}) + +-- Misc +minetest.register_node("eggwars:kill", { + description = "Kill Block", range = 12, stack_max = 10000, - tiles = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, - paramtype2 = "facedir", - drop = "", - groups = {unbreakable = 1, not_in_creative_inventory = 1}, - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_grass_footstep", gain = 0.4}, - }), -}) - -minetest.register_node("eggwars:stone_block", { - description = "Unbreakable Stone Block", - range = 12, - tiles = {"default_stone_block.png"}, - is_ground_content = false, - drop = "", - groups = {unbreakable = 1, not_in_creative_inventory = 1}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("eggwars:aspen_wood", { - description = "Unbreakable Aspen Planks", - range = 12, - paramtype2 = "facedir", - place_param2 = 0, - tiles = {"default_aspen_wood.png"}, - drop = "", - is_ground_content = false, - groups = {unbreakable = 1, not_in_creative_inventory = 1}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("eggwars:acacia_wood", { - description = "Acacia Wood Planks", - range = 12, - paramtype2 = "facedir", - place_param2 = 0, - tiles = {"default_acacia_wood.png"}, - drop = "", - is_ground_content = false, - groups = {unbreakable = 1, not_in_creative_inventory = 1}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("eggwars:ladder_wood", { - description = "Wooden Ladder", - drawtype = "signlike", - tiles = {"default_ladder_wood.png"}, - inventory_image = "default_ladder_wood.png", - wield_image = "default_ladder_wood.png", - paramtype = "light", - paramtype2 = "wallmounted", - sunlight_propagates = true, + inventory_image = "default_steel_block.png^dye_black.png", + drawtype = "airlike", walkable = false, - climbable = true, - is_ground_content = false, - selection_box = { - type = "wallmounted", - }, - drop = "", + pointable = false, + damage_per_second = 20, + paramtype = "light", + sunlight_propagates = true, + drop = "", groups = {unbreakable = 1, not_in_creative_inventory = 1}, - legacy_wallmounted = true, - sounds = default.node_sound_wood_defaults(), }) -minetest.register_node("eggwars:goldspawn1", { - tiles = {"default_gold_block.png"} +minetest.register_node("eggwars:playerclip", { + description = "Player Clip", + range = 12, + stack_max = 10000, + inventory_image = "default_steel_block.png^dye_green.png", + drawtype = "airlike", + paramtype = "light", + pointable = false, + sunlight_propagates = true, + drop = "", + groups = {unbreakable = 1, not_in_creative_inventory = 1}, }) - -minetest.register_node("eggwars:stickspawn", { - tiles = {"default_aspen_wood.png"} -}) - -minetest.register_node("eggwars:diamondspawn", { - tiles = {"default_diamond_block.png"} -}) - -minetest.register_node("eggwars:steelspawn1", { --Slower spawn rate; for player islands - tiles = {"default_steel_block.png"} -}) - -minetest.register_node("eggwars:steelspawn2", { --Faster spawn rate; for center island(s) - tiles = {"default_diamond_block.png"} -}) - -minetest.register_node("eggwars:cobblespawn", { - tiles = {"default_cobble.png"} -}) - --- Register ABMs - --- Diamond spawn. Only for centre island(s) -minetest.register_abm({ - nodenames = {"eggwars:diamondspawn"}, - interval = 8, - chance = 1, - action = function(pos) - pos.y = pos.y + 1 - minetest.add_item(pos,"default:diamond") - end, -}) - --- Cobble is the building material -minetest.register_abm({ - nodenames = {"eggwars:cobblespawn"}, - interval = 5, - chance = 1, - action = function(pos) - pos.y = pos.y + 1 - minetest.add_item(pos,"default:cobble") - end, -}) - --- Steelspawn1 is slower, ideal for player islands -minetest.register_abm({ - nodenames = {"eggwars:steelspawn1"}, - interval = 10, - chance = 1, - action = function(pos) - pos.y = pos.y + 1 - minetest.add_item(pos,"default:steel_ingot") - end, -}) - --- Steelspawn2 is faster, ideal for centre island -minetest.register_abm({ - nodenames = {"eggwars:steelspawn2"}, - interval = 5, - chance = 1, - action = function(pos) - pos.y = pos.y + 1 - minetest.add_item(pos,"default:steel_ingot") - end, -}) - --- Stick spawner, for allowing players to craft tools -minetest.register_abm({ - nodenames = {"eggwars:stickspawn"}, - interval = 8, - chance = 1, - action = function(pos) - pos.y = pos.y + 1 - minetest.add_item(pos,"default:stick") - end, -}) - --- Goldspawn1 is slower, ideal for player islands -minetest.register_abm({ - nodenames = {"eggwars:goldspawn1"}, - interval = 10, - chance = 1, - action = function(pos) - pos.y = pos.y + 1 - minetest.add_item(pos,"default:gold_ingot") - end, -}) \ No newline at end of file diff --git a/schems/centre.mts b/schems/centre.mts deleted file mode 100644 index 9e1fe8d..0000000 Binary files a/schems/centre.mts and /dev/null differ diff --git a/schems/hub_1.mts b/schems/hub_1.mts new file mode 100755 index 0000000..76d55f2 Binary files /dev/null and b/schems/hub_1.mts differ diff --git a/schems/island.mts b/schems/island.mts old mode 100644 new mode 100755 index 2d65057..56f0978 Binary files a/schems/island.mts and b/schems/island.mts differ diff --git a/schems/island_1.mts b/schems/island_1.mts new file mode 100755 index 0000000..9cc220e Binary files /dev/null and b/schems/island_1.mts differ diff --git a/schems/island_small_1.mts b/schems/island_small_1.mts new file mode 100755 index 0000000..f1fc594 Binary files /dev/null and b/schems/island_small_1.mts differ diff --git a/schems/lobby.mts b/schems/lobby.mts new file mode 100755 index 0000000..11a4296 Binary files /dev/null and b/schems/lobby.mts differ diff --git a/shop.lua b/shop.lua old mode 100644 new mode 100755 index 58d22f7..d980027 --- a/shop.lua +++ b/shop.lua @@ -1,28 +1,418 @@ -sfinv.register_page("sfinv:shop", { - title = "Shop", - get = function(self, player, context) - -- local name = player:get_player_name() - return sfinv.make_formspec(player, context, "size[8,9] bgcolor[#080808BB;true] background[5,5;1,1;gui_formbg.png;true] button[0.1,0.1;4,1;upgradespeed;Upgrade speed (cost: 20 diamonds)] button[4,0.1;4,1;upgradejump;Upgrade jump (cost: 20 diamonds)]", true) - end +---------------------------------------------------------------------- +-- Eggwars by wilkgr -- +-- with additional code by shivajiva101@hotmail.com -- +-- Licensed under the AGPL v3 -- +-- You MUST make any changes you make open source -- +-- even if you just run it on your server without publishing it -- +-- Supports a maximum of 8 players per instance and 8 concurrent -- +-- instances for a max of 64 players -- +---------------------------------------------------------------------- + +local TF = 'eggwars:trade' +local BF = 'eggwars:bot' + +eggwars.shop_items = {} + +eggwars.register_shop_item = function(def) + def.entry = #eggwars.shop_items + 1 + eggwars.shop_items[def.entry] = def +end + +local function build_formspec_items(name, items) + local fsi = {} + local y = 0.5 + for i, item in ipairs(items) do + local fs = { + 'image[0,', + y, + ';1,1;', + item.image, + ']', + 'tooltip[0,', + y, + ';1,1;', + item.name.count, + ' ', + item.description, + ']', + 'label[1.1,', + y + 0.7, + ';', + item.name.count, + ']', + 'item_image_button[2.5,', + y, + ';1,1;', + item.cost.name, + ';btn_', + i, + ';]', + 'label[3.6,', + y + 0.7, + ';', + item.cost.count, + ']' + } + table.insert(fsi, table.concat(fs)) + y = y + 1.1 + end + return table.concat(fsi) +end + +local function build_form(name, items) + local frm = { + "formspec_version[3]", + "size[6,5.5]", + "scrollbaroptions[min=0;max=", + (#items * 8) + (#items - 1), -- qty x height + space + ";smallstep=44;largestep=44;thumbsize=1;arrows=default]", + "scrollbar[5,0.5;0.5,4.3;vertical;msb;", + context[name].val, + "]", + "container[0.5,", + context[name].y, + "]", + } + -- nasty hack to window the container! + local fse = { + "container_end[]", + 'box[0.05,0.0;5.9,0.5;#343434FF]', + 'box[0.05,4.9;5.9,0.6;#343434FF]', + } + local fstbl = build_formspec_items(name, items) + return table.concat(frm) .. fstbl .. table.concat(fse) +end + +local function trader_form_handler(clicker) + + local name = clicker:get_player_name() + local key = eggwars.player[name] + local def = eggwars.match[key].player[name] + + context[name] = {y=0, val=0} + + minetest.show_formspec(name, TF, build_form(name, def.shop_items)) +end + +local function bot_form_handler(clicker) + local name = clicker:get_player_name() + local key = eggwars.player[name] + local def = eggwars.match[key] + if def.player[name].rate == 1 then return end + local level = 5 - def.player[name].rate + local cost = (level + 1) + local fs = {} + fs[#fs+1] = 'size[2,2]' + fs[#fs+1] = 'label[0.3,0;Level ' .. level + 1 .. ']' + fs[#fs+1] = 'image_button_exit[0.5,0.6;1.0,1.0;eggwars_ruby.png;btn;]' + fs[#fs+1] = 'label[0.5,1.6;x '.. cost .. ']' + minetest.show_formspec(name, BF, table.concat(fs)) +end + +context = {} +minetest.register_on_player_receive_fields(function(player, formname, fields) + + -- Only handle this mods forms! + if formname ~= TF and formname ~= BF then return end + + local name = player:get_player_name() + + -- Only match players have access to these forms! + if not eggwars.player[name] then return end + + local key = eggwars.player[name] + local def = eggwars.match[key].player[name] + local pinv = player:get_inventory() + + -- Trader form + if formname == TF then + -- buttons + for item, _ in pairs(fields) do + if string.find(item, 'btn_') then + local i = tonumber(string.sub(item, 5)) + local row, goods, cost + row = def.shop_items[i] + goods = row.name + cost = row.cost + if pinv:contains_item('main', cost) then + if pinv:room_for_item('main', goods) then + pinv:remove_item('main', cost) + pinv:add_item('main', goods) + else + minetest.chat_send_player(name, 'insufficient room in your inventory!') + end + else + minetest.chat_send_player(name, 'insufficient funds in your inventory!') + end + return + end + end + -- scrollbar + if formname == TF and fields.msb then + local res = minetest.explode_scrollbar_event(fields.msb) + if res.type == "CHG" then + local val = res.value + context[name].y = -val/10 + context[name].val = val + minetest.show_formspec(name, TF, build_form(name, def.shop_items)) + end + end + + elseif formname == BF and fields.btn then + + if def.rate <= 1 then return end -- limit reached + local qty = (5 - def.rate + 1) + local upd = def.rate - 1 + local cost = ItemStack('eggwars:ruby ' .. qty) + + if pinv:contains_item('main', cost) then + pinv:remove_item('main', cost) + eggwars.match[key].player[name].rate = upd + minetest.get_node_timer(def.spawner):start(upd) + else + minetest.chat_send_player(name, 'insufficient funds in your inventory!') + end + + end +end) + +minetest.register_entity("eggwars:trader", { + initial_properties = { + physical = false, + collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, + visual = "mesh", + mesh = "eggwars_character.b3d", + textures = {"eggwars_trader7.png"}, + is_visible = true, + }, + on_activate = function(self, staticdata) + local data = minetest.deserialize(staticdata) + self.owner = data.owner + self.nametag = data.nametag + self.object:set_armor_groups({immortal = 1}) + self.object:set_properties({ + nametag = self.nametag, + nametag_color = "#FFFF1F", + }) + end, + on_rightclick = function(self, clicker) + trader_form_handler(clicker) + end, + on_step = function(self, dtime, ...) + if not eggwars.player[self.owner] then + self.object:remove() + end + end, + get_staticdata = function(self) + return minetest.serialize({ + owner = self.owner, + nametag = self.nametag + }) + end }) -minetest.register_on_player_receive_fields( function(player, formname, fields) - minetest.chat_send_all("Player "..player:get_player_name().." submitted fields "..dump(fields)); - if fields.upgradejump then - local inv = minetest.get_inventory({type="player", name=player:get_player_name()}) - if inv:contains_item("main", "default:diamond") then - inv:remove_item("main","default:diamond 20") - local player_physics = player:get_physics_override() - player_physics.jump = player_physics.jump * 1.25 - player:set_physics_override(player_physics) - end - elseif fields.upgradespeed then - local inv = minetest.get_inventory({type="player", name=player:get_player_name()}) - if inv:contains_item("main", "default:diamond") then - inv:remove_item("main","default:diamond 20") - local player_physics = player:get_physics_override() - player_physics.speed = player_physics.speed * 1.25 - player:set_physics_override(player_physics) - end - end -end) \ No newline at end of file +minetest.register_entity("eggwars:bot", { + initial_properties = { + physical = false, + collisionbox = {-0.25,-0.4,-0.25, 0.25,0.5,0.25}, + visual = "mesh", + mesh = "eggwars_character.b3d", + textures = {"eggwars_trader1.png"}, + is_visible = true, + visual_size = {x=0.5, y=0.5} + }, + on_activate = function(self, staticdata) + self.owner = staticdata + self.object:set_armor_groups({immortal = 1}) + end, + on_rightclick = function(self, clicker) + bot_form_handler(clicker) + end, + on_step = function(self, dtime, ...) + if not eggwars.player[self.owner] then + self.object:remove() + end + end, + get_staticdata = function(self) + return self.owner + end +}) + +-- wooden log +eggwars.register_shop_item({ + name = {name="eggwars:log", count=20, wear=0, metadata=""}, + description = 'Wood Log', + image = 'default_tree.png', + cost = {name="default:gold_ingot", count=10, wear=0, metadata=""}, +}) +-- obsidian block +eggwars.register_shop_item({ + name = {name="default:obsidian_block", count=20, wear=0, metadata=""}, + description = 'Obsidian Block', + image = 'default_obsidian_block.png', + cost = {name="eggwars:ruby", count=5, wear=0, metadata=""}, +}) +-- binoculars +eggwars.register_shop_item({ + name = {name="binoculars:binoculars", count=1, wear=0, metadata=""}, + description = 'Binoculars', + image = 'binoculars_binoculars.png', + cost = {name="default:gold_ingot", count=5, wear=0, metadata=""}, +}) +-- Steel sword +eggwars.register_shop_item({ + name = {name="default:sword_steel", count=1, wear=0, metadata=""}, + description = 'Stone Sword', + image = 'default_tool_steelsword.png', + cost = {name="default:gold_ingot", count=15, wear=0, metadata=""}, +}) +-- Steel axe +eggwars.register_shop_item({ + name = {name="default:axe_steel", count=1, wear=0, metadata=""}, + description = 'Steel Axe', + image = 'default_tool_steelaxe.png', + cost = {name="default:gold_ingot", count=15, wear=0, metadata=""}, +}) +-- Diamond sword +eggwars.register_shop_item({ + name = {name="default:sword_diamond", count=1, wear=0, metadata=""}, + description = 'Diamond Sword', + image = 'default_tool_diamondsword.png', + cost = {name="default:diamond", count=5, wear=0, metadata=""}, +}) +-- Diamond pick +eggwars.register_shop_item({ + name = {name="default:pick_diamond", count=1, wear=0, metadata=""}, + description = 'Diamond Pick', + image = 'default_tool_diamondpick.png', + cost = {name="default:diamond", count=10, wear=0, metadata=""}, +}) + +if eggwars.armor then + + -- wood + eggwars.register_shop_item({ + name = {name="3d_armor:helmet_wood", count=1, wear=0, metadata=""}, + description = 'Wooden Helmet', + image = "3d_armor_inv_helmet_wood.png", + cost = {name="default:gold_ingot", count=10, wear=0, metadata=""}, + }) + + eggwars.register_shop_item({ + name = {name="3d_armor:chestplate_wood", count=1, wear=0, metadata=""}, + description = 'Wooden Chestplate', + image = "3d_armor_inv_chestplate_wood.png", + cost = {name="default:gold_ingot", count=10, wear=0, metadata=""}, + }) + + eggwars.register_shop_item({ + name = {name="3d_armor:leggings_wood", count=1, wear=0, metadata=""}, + description = 'Wooden Leggings', + image = "3d_armor_inv_leggings_wood.png", + cost = {name="default:gold_ingot", count=10, wear=0, metadata=""}, + }) + + eggwars.register_shop_item({ + name = {name="3d_armor:boots_wood", count=1, wear=0, metadata=""}, + description = 'Wooden Boots', + image = "3d_armor_inv_boots_wood.png", + cost = {name="default:gold_ingot", count=10, wear=0, metadata=""}, + }) + + --diamond + eggwars.register_shop_item({ + name = {name="3d_armor:helmet_diamond", count=1, wear=0, metadata=""}, + description = 'Diamond Helmet', + image = "3d_armor_inv_helmet_diamond.png", + cost = {name="default:diamond", count=10, wear=0, metadata=""}, + }) + + eggwars.register_shop_item({ + name = {name="3d_armor:chestplate_diamond", count=1, wear=0, metadata=""}, + description = 'Diamond Chestplate', + image = "3d_armor_inv_chestplate_diamond.png", + cost = {name="default:diamond", count=10, wear=0, metadata=""}, + }) + + eggwars.register_shop_item({ + name = {name="3d_armor:leggings_diamond", count=1, wear=0, metadata=""}, + description = 'Diamond Leggings', + image = "3d_armor_inv_leggings_diamond.png", + cost = {name="default:diamond", count=10, wear=0, metadata=""}, + }) + + eggwars.register_shop_item({ + name = {name="3d_armor:boots_diamond", count=1, wear=0, metadata=""}, + description = 'Diamond Boots', + image = "3d_armor_inv_boots_diamond.png", + cost = {name="default:diamond", count=10, wear=0, metadata=""}, + }) + +end + +if eggwars.bows then + + -- Bows + eggwars.register_shop_item({ + name = {name="bows:bow_wood", count=1, wear=0, metadata=""}, + description = 'Wooden Bow', + image = 'bows_bow.png', + cost = {name="default:gold_ingot", count=50, wear=0, metadata=""}, + }) + + eggwars.register_shop_item({ + name = {name="bows:bow_steel", count=1, wear=0, metadata=""}, + description = 'Steel Bow', + image = 'bows_bow_steel.png', + cost = {name="eggwars:ruby", count=25, wear=0, metadata=""}, + }) + + eggwars.register_shop_item({ + name = {name="bows:bow_bowie", count=1, wear=0, metadata=""}, + description = 'Bowie Bow', + image = 'bows_bow_bowie.png', + cost = {name="default:diamond", count=35, wear=0, metadata=""}, + }) + + bows.register_arrow("arrow_tp",{ + description = "Teleport arrow", + texture = "bows_arrow_wood.png^[colorize:#0000FFcc", + damage = 0, + craft_count = 0, + drop_chance = 99, + on_hit_node = function(self, pos, user, arrow_pos) + if arrow_pos.y > 0 then + user:set_pos(arrow_pos) + end + end, + }) + -- Arrows + eggwars.register_shop_item({ + name = {name="bows:arrow", count=5, wear=0, metadata=""}, + description = 'Wooden Arrow', + image = 'bows_arrow_wood.png', + cost = {name="default:gold_ingot", count=10, wear=0, metadata=""}, + }) + + eggwars.register_shop_item({ + name = {name="bows:arrow_steel", count=10, wear=0, metadata=""}, + description = 'Steel Arrow', + image = 'eggwars_arrow_steel.png', + cost = {name="eggwars:ruby", count=20, wear=0, metadata=""}, + }) + + eggwars.register_shop_item({ + name = {name="bows:arrow_diamond", count=10, wear=0, metadata=""}, + description = 'Diamond Arrow', + image = 'eggwars_arrow_diamond.png', + cost = {name="default:diamond", count=20, wear=0, metadata=""}, + }) + + eggwars.register_shop_item({ + name = {name="bows:arrow_tp", count=5, wear=0, metadata=""}, + description = 'Teleport Arrow', + image = 'bows_arrow_wood.png', + cost = {name="default:gold_ingot", count=10, wear=0, metadata=""}, + }) + +end diff --git a/sounds/eggwars_game_over.ogg b/sounds/eggwars_game_over.ogg new file mode 100644 index 0000000..df1fca9 Binary files /dev/null and b/sounds/eggwars_game_over.ogg differ diff --git a/sounds/eggwars_out.ogg b/sounds/eggwars_out.ogg new file mode 100644 index 0000000..644699f Binary files /dev/null and b/sounds/eggwars_out.ogg differ diff --git a/sounds/eggwars_sudden.ogg b/sounds/eggwars_sudden.ogg new file mode 100644 index 0000000..c0cd3e1 Binary files /dev/null and b/sounds/eggwars_sudden.ogg differ diff --git a/sounds/eggwars_time_over.ogg b/sounds/eggwars_time_over.ogg new file mode 100644 index 0000000..69323b6 Binary files /dev/null and b/sounds/eggwars_time_over.ogg differ diff --git a/sounds/eggwars_winner.ogg b/sounds/eggwars_winner.ogg new file mode 100644 index 0000000..7d0212c Binary files /dev/null and b/sounds/eggwars_winner.ogg differ diff --git a/stuff/egg.nbe b/stuff/egg.nbe deleted file mode 100644 index d9256e7..0000000 Binary files a/stuff/egg.nbe and /dev/null differ diff --git a/stuff/egg2.nbe b/stuff/egg2.nbe deleted file mode 100644 index 418ea66..0000000 Binary files a/stuff/egg2.nbe and /dev/null differ diff --git a/textures/eggwars_arrow_diamond.png b/textures/eggwars_arrow_diamond.png new file mode 100644 index 0000000..37d44c5 Binary files /dev/null and b/textures/eggwars_arrow_diamond.png differ diff --git a/textures/eggwars_arrow_steel.png b/textures/eggwars_arrow_steel.png new file mode 100644 index 0000000..2360a3b Binary files /dev/null and b/textures/eggwars_arrow_steel.png differ diff --git a/textures/eggwars_blue.png b/textures/eggwars_blue.png new file mode 100644 index 0000000..80816fd Binary files /dev/null and b/textures/eggwars_blue.png differ diff --git a/textures/eggwars_cyan.png b/textures/eggwars_cyan.png new file mode 100644 index 0000000..6820276 Binary files /dev/null and b/textures/eggwars_cyan.png differ diff --git a/textures/eggwars_green.png b/textures/eggwars_green.png new file mode 100644 index 0000000..c05a5f5 Binary files /dev/null and b/textures/eggwars_green.png differ diff --git a/textures/eggwars_mineral_ruby.png b/textures/eggwars_mineral_ruby.png new file mode 100644 index 0000000..ba0d2d2 Binary files /dev/null and b/textures/eggwars_mineral_ruby.png differ diff --git a/textures/eggwars_orange.png b/textures/eggwars_orange.png new file mode 100644 index 0000000..103075e Binary files /dev/null and b/textures/eggwars_orange.png differ diff --git a/textures/eggwars_out.png b/textures/eggwars_out.png new file mode 100644 index 0000000..6527192 Binary files /dev/null and b/textures/eggwars_out.png differ diff --git a/textures/eggwars_out_blue.png b/textures/eggwars_out_blue.png new file mode 100644 index 0000000..4867d34 Binary files /dev/null and b/textures/eggwars_out_blue.png differ diff --git a/textures/eggwars_out_cyan.png b/textures/eggwars_out_cyan.png new file mode 100644 index 0000000..f8e1195 Binary files /dev/null and b/textures/eggwars_out_cyan.png differ diff --git a/textures/eggwars_out_green.png b/textures/eggwars_out_green.png new file mode 100644 index 0000000..5bea0f6 Binary files /dev/null and b/textures/eggwars_out_green.png differ diff --git a/textures/eggwars_out_orange.png b/textures/eggwars_out_orange.png new file mode 100644 index 0000000..38c9528 Binary files /dev/null and b/textures/eggwars_out_orange.png differ diff --git a/textures/eggwars_out_pink.png b/textures/eggwars_out_pink.png new file mode 100644 index 0000000..59be846 Binary files /dev/null and b/textures/eggwars_out_pink.png differ diff --git a/textures/eggwars_out_red.png b/textures/eggwars_out_red.png new file mode 100644 index 0000000..2ef1215 Binary files /dev/null and b/textures/eggwars_out_red.png differ diff --git a/textures/eggwars_out_violet.png b/textures/eggwars_out_violet.png new file mode 100644 index 0000000..566799c Binary files /dev/null and b/textures/eggwars_out_violet.png differ diff --git a/textures/eggwars_out_yellow.png b/textures/eggwars_out_yellow.png new file mode 100644 index 0000000..875ba77 Binary files /dev/null and b/textures/eggwars_out_yellow.png differ diff --git a/textures/eggwars_pick.png b/textures/eggwars_pick.png new file mode 100644 index 0000000..510b9f6 Binary files /dev/null and b/textures/eggwars_pick.png differ diff --git a/textures/eggwars_pil.png b/textures/eggwars_pil.png new file mode 100644 index 0000000..80caa6d Binary files /dev/null and b/textures/eggwars_pil.png differ diff --git a/textures/eggwars_pink.png b/textures/eggwars_pink.png new file mode 100644 index 0000000..fa294ab Binary files /dev/null and b/textures/eggwars_pink.png differ diff --git a/textures/eggwars_rainbowpick.png b/textures/eggwars_rainbowpick.png new file mode 100644 index 0000000..b908a3a Binary files /dev/null and b/textures/eggwars_rainbowpick.png differ diff --git a/textures/eggwars_red.png b/textures/eggwars_red.png new file mode 100644 index 0000000..994718f Binary files /dev/null and b/textures/eggwars_red.png differ diff --git a/textures/eggwars_ruby.png b/textures/eggwars_ruby.png new file mode 100755 index 0000000..a422294 Binary files /dev/null and b/textures/eggwars_ruby.png differ diff --git a/textures/eggwars_shell.png b/textures/eggwars_shell.png new file mode 100644 index 0000000..2174444 Binary files /dev/null and b/textures/eggwars_shell.png differ diff --git a/textures/eggwars_suddendeath.png b/textures/eggwars_suddendeath.png new file mode 100644 index 0000000..848301d Binary files /dev/null and b/textures/eggwars_suddendeath.png differ diff --git a/textures/eggwars_timeover.png b/textures/eggwars_timeover.png new file mode 100644 index 0000000..7fd0754 Binary files /dev/null and b/textures/eggwars_timeover.png differ diff --git a/textures/eggwars_trader1.png b/textures/eggwars_trader1.png new file mode 100755 index 0000000..7056170 Binary files /dev/null and b/textures/eggwars_trader1.png differ diff --git a/textures/eggwars_trader2.png b/textures/eggwars_trader2.png new file mode 100755 index 0000000..62fbd21 Binary files /dev/null and b/textures/eggwars_trader2.png differ diff --git a/textures/eggwars_trader3.png b/textures/eggwars_trader3.png new file mode 100755 index 0000000..f228a95 Binary files /dev/null and b/textures/eggwars_trader3.png differ diff --git a/textures/eggwars_trader4.png b/textures/eggwars_trader4.png new file mode 100644 index 0000000..446bdaa Binary files /dev/null and b/textures/eggwars_trader4.png differ diff --git a/textures/eggwars_trader5.png b/textures/eggwars_trader5.png new file mode 100644 index 0000000..b091ee5 Binary files /dev/null and b/textures/eggwars_trader5.png differ diff --git a/textures/eggwars_trader6.png b/textures/eggwars_trader6.png new file mode 100644 index 0000000..ab709bf Binary files /dev/null and b/textures/eggwars_trader6.png differ diff --git a/textures/eggwars_trader7.png b/textures/eggwars_trader7.png new file mode 100644 index 0000000..2137fdd Binary files /dev/null and b/textures/eggwars_trader7.png differ diff --git a/textures/eggwars_violet.png b/textures/eggwars_violet.png new file mode 100644 index 0000000..4b4837a Binary files /dev/null and b/textures/eggwars_violet.png differ diff --git a/textures/eggwars_welcome.png b/textures/eggwars_welcome.png new file mode 100644 index 0000000..ae75a60 Binary files /dev/null and b/textures/eggwars_welcome.png differ diff --git a/textures/eggwars_winner.png b/textures/eggwars_winner.png new file mode 100644 index 0000000..e628734 Binary files /dev/null and b/textures/eggwars_winner.png differ diff --git a/textures/eggwars_yellow.png b/textures/eggwars_yellow.png new file mode 100644 index 0000000..860aa8e Binary files /dev/null and b/textures/eggwars_yellow.png differ diff --git a/tools.lua b/tools.lua new file mode 100644 index 0000000..8443b3b --- /dev/null +++ b/tools.lua @@ -0,0 +1,31 @@ +---------------------------------------------------------------------- +-- Eggwars by wilkgr -- +-- with additional code by shivajiva101@hotmail.com -- +-- Licensed under the AGPL v3 -- +-- You MUST make any changes you make open source -- +-- even if you just run it on your server without publishing it -- +-- Supports a maximum of 8 players per instance and 8 concurrent -- +-- instances for a max of 64 players -- +---------------------------------------------------------------------- + +minetest.register_tool("eggwars:pick_rainbow", { + description = "Rainbow Pickaxe", + range = 20, + inventory_image = "eggwars_rainbowpick.png", + groups = {not_in_creative_inventory = 1}, + tool_capabilities = { + full_punch_interval = 0.1, + max_drop_level = 3, + groupcaps = { + unbreakable = {times = {[1] = 0, [2] = 0, [3] = 0}, uses = 0, maxlevel = 3}, + fleshy = {times = {[1] = 0, [2] = 0, [3] = 0}, uses = 0, maxlevel = 3}, + choppy = {times = {[1] = 0, [2] = 0, [3] = 0}, uses = 0, maxlevel = 3}, + bendy = {times = {[1] = 0, [2] = 0, [3] = 0}, uses = 0, maxlevel = 3}, + cracky = {times = {[1] = 0, [2] = 0, [3] = 0}, uses = 0, maxlevel = 3}, + crumbly = {times = {[1] = 0, [2] = 0, [3] = 0}, uses = 0, maxlevel = 3}, + snappy = {times = {[1] = 0, [2] = 0, [3] = 0}, uses = 0, maxlevel = 3}, + }, + damage_groups = {fleshy = 1000}, + }, + on_drop = eggwars.drop_msg, +}) diff --git a/unused_code b/unused_code deleted file mode 100644 index c311e4e..0000000 --- a/unused_code +++ /dev/null @@ -1,25 +0,0 @@ --- We don't use chests anymore -chestrefill = function () - for i=1, #islands do - local items = {"default:diamond","default:wood","default:wood","default:stick","default:wood","default:wood","default:mesecrystal","default:sword_diamond","default:sword_stone","default:sword_stone","default:sword_stone","default:sword_stone"} - minetest.set_node(islands[i],{name = "default:chest"}) - math.randomseed(os.clock()*100000000000) - math.random() - local item_no = math.random(1, 4) - local n = 0 - while n < item_no do - math.randomseed(os.clock()*100000000000) - math.random() - local item = math.random(1, #items) - local inv = minetest.get_inventory({type="node", pos=islands[i]}) - inv:add_item("main",items[item]) - n = n + 1; - end - end -end - --- Set nametag colour: -player:set_nametag_attributes({color = {a = 255, r = 0, g = 0, b = 0}}) --Make nametag invisible - --- colourise chat text: -minetest.colorize('colour','text') \ No newline at end of file