diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..8086a2f44 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +eliasfleckenstein@web.de. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/CREDITS.md b/CREDITS.md index 00eca270f..8df5ce2a1 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -9,52 +9,62 @@ ## Creators of MineClone 5 * kay27 and the Community -## The Community: -* Fleckenstein -* jordan4ibanez -* bzoss +## The Community (alphabetically): * AFCMS -* epCode -* ryvnf -* iliekprogrammar -* MysticTempest -* Rootyjr -* Nicu -* aligator -* Code-Sploit -* NO11 -* Laurent Rocher -* HimbeerserverDE -* TechDudie * Alexander Minges * ArTee3 -* ZeDique la Ruleta -* pitchum -* wuniversales -* Bu-Gee -* David McMackins II -* Nicholas Niro -* Wouters Dorian -* Blue Blancmange -* Jared Moody -* Li0n -* Midgard -* Saku Laesvuori -* Yukitty -* ZedekThePD * aldum -* dBeans -* nickolas360 -* yutyo -* ztianyang -* j45 - -## MineClone5 -* kay27 +* aligator +* Benjamin Schötz +* Blue Blancmange +* Bu-Gee +* bzoss +* Code-Sploit +* cora +* David McMackins II * Debiankaios +* Dieter44 +* Doloment +* dBeans +* E +* Emily2255 +* Emojigit * epCode -* NO11 +* erlehmann +* FinishedFragment +* Fleckenstein +* HimbeerserverDE +* iliekprogrammar +* Jared Moody * j45 +* jordan4ibanez +* kay27 +* Laurent Rocher +* Li0n +* Marcin Serwin +* Midgard +* MysticTempest +* Nicholas Niro +* Nicu +* nickolas360 +* NO11 +* pitchum +* Rootyjr +* ryvnf +* Saku Laesvuori +* SmallJoker +* Sven792 +* Sydney Gems +* sfan5 +* TechDudie +* Tianyang Zhang +* talamh +* Wouters Dorian +* wuniversales +* Yukitty +* yutyo +* ZeDique la Ruleta +* ZedekThePD ## Original Mod Authors * Wuzzy @@ -72,7 +82,6 @@ * Rochambeau * rubenwardy * stu -* jordan4ibanez * 4aiman * Kahrl * Krock @@ -101,6 +110,7 @@ * xMrVizzy * yutyo * NO11 +* kay27 ## Translations * Wuzzy @@ -108,6 +118,11 @@ * wuniversales * kay27 * pitchum +* todoporlalibertad +* Marcin Serwin + +## Funders +* 40W ## Special thanks * celeron55 for creating Minetest diff --git a/README.md b/README.md index f3a567dc9..722f4cad9 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # MineClone 5 -Version: 0.71.6 +Version: 0.71.7 Release Candidate 0 MineClone 5 is a fork of MineClone 2 with different workflow: * No Minecraft version limitation, target version is Latest Java Edition diff --git a/mods/CORE/mcl_bubble_column/README.md b/mods/CORE/mcl_bubble_column/README.md index efeb52d6c..f56d30145 100644 --- a/mods/CORE/mcl_bubble_column/README.md +++ b/mods/CORE/mcl_bubble_column/README.md @@ -1,3 +1,9 @@ -# mcl_bubble_column -bubble_column mod for mineclone2 -put in /mtdir/games/mineclone2/mods/CORE/ +# mcl_bubble_column by j45 + +https://github.com/Minetest-j45/mcl_bubble_column/ + +Adds whirlpools and upwards bubble columns to Mineclone2/5 + +A bubble column is a block generated by placing magma blocks or soul sand in water (source). + +Bubble columns push or pull entities and items in certain directions. diff --git a/mods/CORE/mcl_bubble_column/init.lua b/mods/CORE/mcl_bubble_column/init.lua index 756e365e2..ed3bcc5b3 100644 --- a/mods/CORE/mcl_bubble_column/init.lua +++ b/mods/CORE/mcl_bubble_column/init.lua @@ -1,369 +1,195 @@ -local S = minetest.get_translator("mcl_bubble_column") +mcl_bubble_column = {} -local WATER_ALPHA = 179 -local WATER_VISC = 1 -local LAVA_VISC = 7 -local LIGHT_LAVA = minetest.LIGHT_MAX -local USE_TEXTURE_ALPHA -if minetest.features.use_texture_alpha_string_modes then - USE_TEXTURE_ALPHA = "blend" - WATER_ALPHA = nil +minetest.register_abm{ + label = "bubbleColumnUpStop", + nodenames = {"group:water"}, + interval = 0.05, + chance = 1, + action = function(pos) + local meta = minetest.get_meta(pos) + if meta:get_int("bubbly") == 1 then--bubble column + --check down if current needs to be deleted + local downpos = vector.add(pos, {x = 0, y = -1, z = 0}) + local downposnode = minetest.get_node(downpos) + local downmeta = minetest.get_meta(downpos) + if (downmeta:get_int("bubbly") ~= 1 and downposnode.name ~= "mcl_nether:soul_sand") then + meta:set_int("bubbly", 0) + end + --check up to see if needs to go up + local uppos = vector.add(pos, {x = 0, y = 1, z = 0}) + local upposnode = minetest.get_node(uppos) + local upmeta = minetest.get_meta(uppos) + if (minetest.get_item_group(upposnode.name, "water") == 3 and upmeta:get_int("bubbly") ~= 1) then + upmeta:set_int("bubbly", 1) + end + elseif meta:get_int("whirly") == 1 then--whirlpool + --check down if current needs to be deleted + local downpos = vector.add(pos, {x = 0, y = -1, z = 0}) + local downposnode = minetest.get_node(downpos) + local downmeta = minetest.get_meta(downpos) + if (downmeta:get_int("whirly") ~= 1 and downposnode.name ~= "mcl_nether:magma") then + meta:set_int("whirly", 0) + end + --check up to see if needs to go up + local uppos = vector.add(pos, {x = 0, y = 1, z = 0}) + local upposnode = minetest.get_node(uppos) + local upmeta = minetest.get_meta(uppos) + if (minetest.get_item_group(upposnode.name, "water") == 3 and upmeta:get_int("whirly") ~= 1) then + upmeta:set_int("whirly", 1) + end + end + end, +} + +minetest.register_abm{ + label = "startBubbleColumn", + nodenames = {"mcl_nether:soul_sand"}, + interval = 0.05, + chance = 1, + action = function(pos) + local uppos = vector.add(pos, {x = 0, y = 1, z = 0}) + local upposnode = minetest.get_node(uppos) + local upmeta = minetest.get_meta(uppos) + if (minetest.get_item_group(upposnode.name, "water") == 3 and upmeta:get_int("bubbly") ~= 1) then + upmeta:set_int("bubbly", 1) + end + end, +} + +minetest.register_abm{ + label = "startWhirlpool", + nodenames = {"mcl_nether:magma"}, + interval = 0.05, + chance = 1, + action = function(pos) + local uppos = vector.add(pos, {x = 0, y = 1, z = 0}) + local upposnode = minetest.get_node(uppos) + local upmeta = minetest.get_meta(uppos) + if (minetest.get_item_group(upposnode.name, "water") == 3 and upmeta:get_int("whirly") ~= 1) then + upmeta:set_int("whirly", 1) + end + end, +} + + +mcl_bubble_column.on_enter_bubble_column = function(self) + local velocity = self:get_velocity() + --[[if down.name == "mcl_nether:soul_sand" then + self:add_velocity({x = 0, y = math.min(10, math.abs(velocity.y)+9.4), z = 0}) + else]] + self:add_velocity({x = 0, y = math.min(3.6, math.abs(velocity.y)+3), z = 0}) + --end end -minetest.register_node("mcl_bubble_column:water_flowing_up", { - description = S("Bubble Column Flowing Water (up)"), - _doc_items_create_entry = false, - wield_image = "default_water_flowing_animated.png^[verticalframe:64:0", - drawtype = "flowingliquid", - tiles = {"default_water_flowing_animated.png^[verticalframe:64:0"}, - special_tiles = { - { - image="default_water_flowing_animated.png", - backface_culling=false, - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0} - }, - { - image="default_water_flowing_animated.png", - backface_culling=false, - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0} - }, - }, - sounds = mcl_sounds.node_sound_water_defaults(), - is_ground_content = false, - alpha = WATER_ALPHA, - use_texture_alpha = USE_TEXTURE_ALPHA, - paramtype = "light", - paramtype2 = "flowingliquid", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - drop = "", - drowning = 4, - liquidtype = "flowing", - liquid_alternative_flowing = "mcl_bubble_column:water_flowing_up", - liquid_alternative_source = "mcl_bubble_column:water_source_up", - liquid_viscosity = WATER_VISC, - liquid_range = 7, - post_effect_color = {a=209, r=0x03, g=0x3C, b=0x5C}, - groups = { water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1, freezes=1, melt_around=1, dig_by_piston=1}, - _mcl_blast_resistance = 100, - -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode - _mcl_hardness = -1, -}) +mcl_bubble_column.on_enter_whirlpool = function(self) + local velocity = self:get_velocity() + --self:add_velocity({x = 0, y = math.max(-3, (-math.abs(velocity.y))-2), z = 0}) + self:add_velocity({x = 0, y = math.max(-0.3, (-math.abs(velocity.y))-0.03), z = 0}) +end -minetest.register_node("mcl_bubble_column:water_source_up", { - description = S("Bubble Column Water Source"), - _doc_items_entry_name = S("Water"), - _doc_items_longdesc = S("Boosts you up"), - _doc_items_hidden = false, - drawtype = "liquid", - tiles = { - {name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}} - }, - special_tiles = { - -- New-style water source material (mostly unused) - { - name="default_water_source_animated.png", - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}, - backface_culling = false, - } - }, - sounds = mcl_sounds.node_sound_water_defaults(), - is_ground_content = false, - alpha = WATER_ALPHA, - use_texture_alpha = USE_TEXTURE_ALPHA, - paramtype = "light", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - drop = "", - drowning = 4, - liquidtype = "source", - liquid_alternative_flowing = "mcl_bubble_column:water_flowing_up", - liquid_alternative_source = "mcl_bubble_column:water_source_up", - liquid_viscosity = WATER_VISC, - liquid_range = 7, - post_effect_color = {a=209, r=0x03, g=0x3C, b=0x5C}, - stack_max = 64, - groups = { water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1, dig_by_piston=1}, - _mcl_blast_resistance = 100, - -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode - _mcl_hardness = -1, -}) +mcl_bubble_column.on_enter_bubble_column_with_air_above = function(self) + local velocity = self:get_velocity() + --[[if down.name == "mcl_nether:soul_sand" then + self:add_velocity({x = 0, y = math.min(4.3, math.abs(velocity.y)+2.8), z = 0}) + else]] + self:add_velocity({x = 0, y = math.min(2.6, math.abs(velocity.y)+2), z = 0}) + --end +end + +mcl_bubble_column.on_enter_whirlpool_with_air_above = function(self) + local velocity = self:get_velocity() + --self:add_velocity({x = 0, y = math.max(-3.5, (-math.abs(velocity.y))-2), z = 0}) + self:add_velocity({x = 0, y = math.max(-0.9, (-math.abs(velocity.y))-0.03), z = 0}) +end + +minetest.register_abm{ + label = "entGo", + nodenames = {"group:water"}, + interval = 0.05, + chance = 1, + action = function(pos) + --if not bubble column block return + local meta = minetest.get_meta(pos) + if meta:get_int("bubbly") == 1 then + local up = minetest.get_node(vector.add(pos, {x = 0, y = 1, z = 0})) + for _,entity in pairs(minetest.get_objects_inside_radius(pos, 0.75)) do + if up.name == "air" then + mcl_bubble_column.on_enter_bubble_column_with_air_above(entity) + else + mcl_bubble_column.on_enter_bubble_column(entity) + end + end + elseif meta:get_int("whirly") == 1 then + local up = minetest.get_node(vector.add(pos, {x = 0, y = 1, z = 0})) + for _,entity in pairs(minetest.get_objects_inside_radius(pos, 0.75)) do + if up.name == "air" then + mcl_bubble_column.on_enter_whirlpool_with_air_above(entity) + else + mcl_bubble_column.on_enter_whirlpool(entity) + end + end + end + end, +} minetest.register_globalstep(function() for _,player in ipairs(minetest.get_connected_players()) do - local name = player:get_player_name() - local pos = player:get_pos() - local node = minetest.get_node(pos) - if node.name == "mcl_bubble_column:water_source_up" then - local velocity = player:get_player_velocity() - local velocityadd = {x = 0, y = 3, z = 0} - player:add_player_velocity(velocityadd) - end - end + local ppos = player:get_pos() + local eyepos = {x = ppos.x, y = ppos.y + player:get_properties().eye_height, z = ppos.z} + local node = minetest.get_node(ppos) + local eyenode = minetest.get_node(eyepos) + local meta = minetest.get_meta(ppos) + local eyemeta = minetest.get_meta(eyepos) + + local eyemeta = minetest.get_meta(ppos) + --if minetest.get_item_group(node.name, "water") == 3 and minetest.get_item_group(eyenode.name, "water") == 3 then return end + if meta:get_int("bubbly") == 1 or eyemeta:get_int("bubbly") == 1 then + local up = minetest.get_node(vector.add(eyepos, {x = 0, y = 1, z = 0})) + if up.name == "air" then + mcl_bubble_column.on_enter_bubble_column_with_air_above(player) + else + mcl_bubble_column.on_enter_bubble_column(player) + end + elseif meta:get_int("whirly") == 1 or eyemeta:get_int("whirly") == 1 then + local up = minetest.get_node(vector.add(ppos, {x = 0, y = 1, z = 0})) + if up.name == "air" then + mcl_bubble_column.on_enter_whirlpool_with_air_above(player) + else + mcl_bubble_column.on_enter_whirlpool(player) + end + end + end end) +--abms to remove and replace old bubble columns/whirlpools minetest.register_abm{ - label = "entities go up", + label = "removeOldFlowingColumns", + nodenames = {"mcl_bubble_column:water_flowing_up", "mcl_bubble_column:water_flowing_down"}, + interval = 1,--reduce lag + chance = 1, + action = function(pos) + minetest.set_node(pos, {name = "air"}) + end, +} +minetest.register_abm{ + label = "replaceBubbleColumns", nodenames = {"mcl_bubble_column:water_source_up"}, - interval = 0.05, + interval = 1,--reduce lag chance = 1, action = function(pos) - for _,entity in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do - local pos = entity:get_pos() - local velocity = entity:get_velocity() - local velocityadd = {x = 0, y = 2, z = 0} - entity:add_velocity(velocityadd) - end - end, -} - -minetest.register_abm{ - label = "bubbles go up", - nodenames = {"mcl_bubble_column:water_source_up"}, - interval = 1, - chance = 1, - action = function(pos) - local uppos = vector.add(pos, {x = 0, y = 1, z = 0}) - local upposnode = minetest.get_node(uppos) - if upposnode.name == "mcl_core:water_source" then - minetest.set_node(uppos, {name = "mcl_bubble_column:water_source_up"}) - end - end, -} - -minetest.register_abm{ - label = "start bubble column", - nodenames = {"mcl_nether:soul_sand"}, - interval = 1, - chance = 1, - action = function(pos) - local downpos = vector.add(pos, {x = 0, y = 1, z = 0}) - local downposnode = minetest.get_node(downpos) - if downposnode.name == "mcl_core:water_source" then - minetest.set_node(downpos, {name = "mcl_bubble_column:water_source_up"}) - end - end, -} - -minetest.register_abm{ - label = "stop bubble column", - nodenames = {"mcl_bubble_column:water_source_up"}, - interval = 1, - chance = 1, - action = function(pos) - local downpos = vector.add(pos, {x = 0, y = -1, z = 0}) - local downposnode = minetest.get_node(downpos) - if downposnode.name == "mcl_core:water_source" then - minetest.set_node(pos, {name = "mcl_core:water_source"}) - end + minetest.set_node(pos, {name = "mcl_core:water_source"}) + local meta = minetest.get_meta(pos) + meta:set_int("bubbly", 1) end, } minetest.register_abm{ - label = "bubbles up", - nodenames = {"mcl_bubble_column:water_source_up"}, - interval = 1, - chance = 1, - action = function(pos) - minetest.add_particlespawner({ - amount = 10, - time = 0.15, - minpos = vector.add(pos, { x = -0.25, y = 0, z = -0.25 }), - maxpos = vector.add(pos, { x = 0.25, y = 0, z = 0.75 }), - attached = player, - minvel = {x = -0.2, y = 0, z = -0.2}, - maxvel = {x = 0.5, y = 0, z = 0.5}, - minacc = {x = -0.4, y = 4, z = -0.4}, - maxacc = {x = 0.5, y = 1, z = 0.5}, - minexptime = 0.3, - maxexptime = 0.8, - minsize = 0.7, - maxsize = 2.4, - texture = "mcl_particles_bubble.png" - }) - end, -} ---whirlpools(take you down) - - -minetest.register_node("mcl_bubble_column:water_flowing_down", { - description = S("Bubble Column Flowing Water(down)"), - _doc_items_create_entry = false, - wield_image = "default_water_flowing_animated.png^[verticalframe:64:0", - drawtype = "flowingliquid", - tiles = {"default_water_flowing_animated.png^[verticalframe:64:0"}, - special_tiles = { - { - image="default_water_flowing_animated.png", - backface_culling=false, - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0} - }, - { - image="default_water_flowing_animated.png", - backface_culling=false, - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0} - }, - }, - sounds = mcl_sounds.node_sound_water_defaults(), - is_ground_content = false, - alpha = WATER_ALPHA, - use_texture_alpha = USE_TEXTURE_ALPHA, - paramtype = "light", - paramtype2 = "flowingliquid", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - drop = "", - drowning = 4, - liquidtype = "flowing", - liquid_alternative_flowing = "mcl_bubble_column:water_flowing_down", - liquid_alternative_source = "mcl_bubble_column:water_source_down", - liquid_viscosity = WATER_VISC, - liquid_range = 7, - post_effect_color = {a=209, r=0x03, g=0x3C, b=0x5C}, - groups = { water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1, freezes=1, melt_around=1, dig_by_piston=1}, - _mcl_blast_resistance = 100, - -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode - _mcl_hardness = -1, -}) - -minetest.register_node("mcl_bubble_column:water_source_down", { - description = S("Whirlpool Water Source"), - _doc_items_entry_name = S("Water"), - _doc_items_longdesc = S("Takes you down!"), - _doc_items_hidden = false, - drawtype = "liquid", - tiles = { - {name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}} - }, - special_tiles = { - -- New-style water source material (mostly unused) - { - name="default_water_source_animated.png", - animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}, - backface_culling = false, - } - }, - sounds = mcl_sounds.node_sound_water_defaults(), - is_ground_content = false, - alpha = WATER_ALPHA, - use_texture_alpha = USE_TEXTURE_ALPHA, - paramtype = "light", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - drop = "", - drowning = 4, - liquidtype = "source", - liquid_alternative_flowing = "mcl_bubble_column:water_flowing_down", - liquid_alternative_source = "mcl_bubble_column:water_source_down", - liquid_viscosity = WATER_VISC, - liquid_range = 7, - post_effect_color = {a=209, r=0x03, g=0x3C, b=0x5C}, - stack_max = 64, - groups = { water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1, dig_by_piston=1}, - _mcl_blast_resistance = 100, - -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode - _mcl_hardness = -1, -}) - - -minetest.register_globalstep(function() - for _,player in ipairs(minetest.get_connected_players()) do - local name = player:get_player_name() - local pos = player:get_pos() - local node = minetest.get_node(pos) - if node.name == "mcl_bubble_column:water_source_down" then - local velocity = player:get_player_velocity() - local velocityadd = {x = 0, y = -0.5, z = 0} - player:add_player_velocity(velocityadd) - end - end -end) - - -minetest.register_abm{ - label = "entities go down", - nodenames = {"mcl_bubble_column:water_source_down"}, - interval = 0.05, - chance = 1, - action = function(pos) - for _,entity in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do - local pos = entity:get_pos() - local velocity = entity:get_velocity() - local velocityadd = {x = 0, y = -3, z = 0} - entity:add_velocity(velocityadd) - end - end, -} - -minetest.register_abm{ - label = "whirlpools go up", - nodenames = {"mcl_bubble_column:water_source_down"}, - interval = 1, - chance = 1, - action = function(pos) - local uppos = vector.add(pos, {x = 0, y = 1, z = 0}) - local upposnode = minetest.get_node(uppos) - if upposnode.name == "mcl_core:water_source" then - minetest.set_node(uppos, {name = "mcl_bubble_column:water_source_down"}) - end - end, -} - -minetest.register_abm{ - label = "start whirlpool", - nodenames = {"mcl_nether:magma"}, - interval = 1, - chance = 1, - action = function(pos) - local downpos = vector.add(pos, {x = 0, y = 1, z = 0}) - local downposnode = minetest.get_node(downpos) - if downposnode.name == "mcl_core:water_source" then - minetest.set_node(downpos, {name = "mcl_bubble_column:water_source_down"}) - end - end, -} - -minetest.register_abm{ - label = "stop whirlpool", - nodenames = {"mcl_bubble_column:water_source_down"}, - interval = 1, - chance = 1, - action = function(pos) - local downpos = vector.add(pos, {x = 0, y = -1, z = 0}) - local downposnode = minetest.get_node(downpos) - if downposnode.name == "mcl_core:water_source" then - minetest.set_node(pos, {name = "mcl_core:water_source"}) - end - end, -} -minetest.register_abm{ - label = "bubbles down", - nodenames = {"mcl_bubble_column:water_source_down"}, - interval = 1, - chance = 1, - action = function(pos) - minetest.add_particlespawner({ - amount = 10, - time = 0.15, - minpos = vector.add(pos, { x = -0.25, y = 0, z = -0.25 }), - maxpos = vector.add(pos, { x = 0.25, y = 0, z = 0.75 }), - attached = player, - minvel = {x = -0.2, y = 0, z = -0.2}, - maxvel = {x = 0.5, y = 0, z = 0.5}, - minacc = {x = -0.4, y = -4, z = -0.4}, - maxacc = {x = 0.5, y = -1, z = 0.5}, - minexptime = 0.3, - maxexptime = 0.8, - minsize = 0.7, - maxsize = 2.4, - texture = "mcl_particles_bubble.png" - }) - end, -} + label = "replaceWhirlpools", + nodenames = {"mcl_bubble_column:water_source_down"}, + interval = 1,--reduce lag + chance = 1, + action = function(pos) + minetest.set_node(pos, {name = "mcl_core:water_source"}) + local meta = minetest.get_meta(pos) + meta:set_int("whirly", 1) + end, +} \ No newline at end of file diff --git a/mods/CORE/mcl_loot/init.lua b/mods/CORE/mcl_loot/init.lua index 1b2c50807..b90cd4428 100644 --- a/mods/CORE/mcl_loot/init.lua +++ b/mods/CORE/mcl_loot/init.lua @@ -58,26 +58,27 @@ function mcl_loot.get_loot(loot_definitions, pr) end if item then local itemstring = item.itemstring - local itemstack = item.itemstack + if itemstring then + local stack = ItemStack(itemstring) + if item.amount_min and item.amount_max then - itemstring = itemstring .. " " .. pr:next(item.amount_min, item.amount_max) + stack:set_count(pr:next(item.amount_min, item.amount_max)) end + if item.wear_min and item.wear_max then -- Sadly, PseudoRandom only allows very narrow ranges, so we set wear in steps of 10 local wear_min = math.floor(item.wear_min / 10) local wear_max = math.floor(item.wear_max / 10) - local wear = pr:next(wear_min, wear_max) * 10 - if not item.amount_min and not item.amount_max then - itemstring = itemstring .. " 1" - end - - itemstring = itemstring .. " " .. tostring(wear) + stack:set_wear(pr:next(wear_min, wear_max) * 10) end - table.insert(items, itemstring) - elseif itemstack then - table.insert(items, itemstack) + + if item.func then + item.func(stack, pr) + end + + table.insert(items, stack) else minetest.log("error", "[mcl_loot] INTERNAL ERROR! Failed to select random loot item!") end diff --git a/mods/CORE/mcl_particles/textures/mcl_particles_totem1.png b/mods/CORE/mcl_particles/textures/mcl_particles_totem1.png new file mode 100644 index 000000000..15fe082e1 Binary files /dev/null and b/mods/CORE/mcl_particles/textures/mcl_particles_totem1.png differ diff --git a/mods/CORE/mcl_particles/textures/mcl_particles_totem2.png b/mods/CORE/mcl_particles/textures/mcl_particles_totem2.png new file mode 100644 index 000000000..2ab88983d Binary files /dev/null and b/mods/CORE/mcl_particles/textures/mcl_particles_totem2.png differ diff --git a/mods/CORE/mcl_particles/textures/mcl_particles_totem3.png b/mods/CORE/mcl_particles/textures/mcl_particles_totem3.png new file mode 100644 index 000000000..55d6f49d3 Binary files /dev/null and b/mods/CORE/mcl_particles/textures/mcl_particles_totem3.png differ diff --git a/mods/CORE/mcl_particles/textures/mcl_particles_totem4.png b/mods/CORE/mcl_particles/textures/mcl_particles_totem4.png new file mode 100644 index 000000000..d6e6502b7 Binary files /dev/null and b/mods/CORE/mcl_particles/textures/mcl_particles_totem4.png differ diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index a7504af08..d548f6cac 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -1,5 +1,27 @@ mcl_util = {} +-- Updates all values in t using values from to*. +function table.update(t, ...) + for _, to in ipairs{...} do + for k,v in pairs(to) do + t[k] = v + end + end + return t +end + +-- Updates nil values in t using values from to*. +function table.update_nil(t, ...) + for _, to in ipairs{...} do + for k,v in pairs(to) do + if t[k] == nil then + t[k] = v + end + end + end + return t +end + -- Based on minetest.rotate_and_place --[[ @@ -456,7 +478,9 @@ function mcl_util.calculate_durability(itemstack) end end end - uses = uses or (next(itemstack:get_tool_capabilities().groupcaps) or {}).uses + + local _, groupcap = next(itemstack:get_tool_capabilities().groupcaps) + uses = uses or (groupcap or {}).uses end return uses or 0 @@ -538,3 +562,12 @@ function mcl_util.get_object_name(object) return luaentity.nametag and luaentity.nametag ~= "" and luaentity.nametag or luaentity.description or luaentity.name end end + +function mcl_util.replace_mob(obj, mob) + local rot = obj:get_yaw() + local pos = obj:get_pos() + obj:remove() + obj = minetest.add_entity(pos, mob) + obj:set_yaw(rot) + return obj +end diff --git a/mods/CORE/mcl_worlds/API.md b/mods/CORE/mcl_worlds/API.md index dd96b01b5..69508e924 100644 --- a/mods/CORE/mcl_worlds/API.md +++ b/mods/CORE/mcl_worlds/API.md @@ -12,7 +12,7 @@ Params: * pos: position -## mcl_worlds.y_to_layer(y) +## mcl_worlds.y_to_layer(y) This function is used to calculate the minetest y layer and dimension of the given minecraft layer. Mainly used for ore generation. Takes an Y coordinate as input and returns: @@ -78,4 +78,4 @@ Table containing all function registered with mcl_worlds.register_on_dimension_c Notify this mod of a dimension change of to * player: player, player who changed the dimension -* dimension: string, new dimension ("overworld", "nether", "end", "void") \ No newline at end of file +* dimension: string, new dimension ("overworld", "nether", "end", "void") diff --git a/mods/CORE/tga_encoder/init.lua b/mods/CORE/tga_encoder/init.lua index 96afda5e1..39309c9c9 100644 --- a/mods/CORE/tga_encoder/init.lua +++ b/mods/CORE/tga_encoder/init.lua @@ -38,18 +38,32 @@ function image:encode_header() self.data = self.data .. string.char(0) -- image id .. string.char(0) -- color map type - .. string.char(2) -- image type (uncompressed true-color image = 2) + .. string.char(10) -- image type (RLE RGB = 10) self:encode_colormap_spec() -- color map specification self:encode_image_spec() -- image specification end function image:encode_data() + local current_pixel = '' + local previous_pixel = '' + local count = 1 + local packets = {} + local rle_packet = '' for _, row in ipairs(self.pixels) do for _, pixel in ipairs(row) do - self.data = self.data - .. string.char(pixel[3], pixel[2], pixel[1]) + current_pixel = string.char(pixel[3], pixel[2], pixel[1]) + if current_pixel ~= previous_pixel or count == 128 then + packets[#packets +1] = rle_packet + count = 1 + previous_pixel = current_pixel + else + count = count + 1 + end + rle_packet = string.char(128 + count - 1) .. current_pixel end end + packets[#packets +1] = rle_packet + self.data = self.data .. table.concat(packets) end function image:encode_footer() diff --git a/mods/ENTITIES/drippingwater/init.lua b/mods/ENTITIES/drippingwater/init.lua deleted file mode 100644 index e17bdda40..000000000 --- a/mods/ENTITIES/drippingwater/init.lua +++ /dev/null @@ -1,114 +0,0 @@ ---Dripping Water Mod ---by kddekadenz - -local math = math - --- License of code, textures & sounds: CC0 - ---Drop entities - ---water - -local water_tex = "default_water_source_animated.png^[verticalframe:16:0" -minetest.register_entity("drippingwater:drop_water", { - hp_max = 1, - physical = true, - collide_with_objects = false, - collisionbox = {-0.025,-0.05,-0.025,0.025,-0.01,0.025}, - pointable = false, - visual = "cube", - visual_size = {x=0.05, y=0.1}, - textures = {water_tex, water_tex, water_tex, water_tex, water_tex, water_tex}, - spritediv = {x=1, y=1}, - initial_sprite_basepos = {x=0, y=0}, - static_save = false, - on_activate = function(self, staticdata) - self.object:set_sprite({x=0,y=0}, 1, 1, true) - end, - on_step = function(self, dtime) - local k = math.random(1,222) - local ownpos = self.object:get_pos() - if k==1 then - self.object:set_acceleration({x=0, y=-5, z=0}) - end - if minetest.get_node({x=ownpos.x, y=ownpos.y +0.5, z=ownpos.z}).name == "air" then - self.object:set_acceleration({x=0, y=-5, z=0}) - end - if minetest.get_node({x=ownpos.x, y=ownpos.y -0.5, z=ownpos.z}).name ~= "air" then - self.object:remove() - minetest.sound_play({name="drippingwater_drip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) - end - end, -}) - - ---lava - -local lava_tex = "default_lava_source_animated.png^[verticalframe:16:0" -minetest.register_entity("drippingwater:drop_lava", { - hp_max = 1, - physical = true, - collide_with_objects = false, - collisionbox = {-0.025,-0.05,-0.025,0.025,-0.01,0.025}, - glow = math.max(7, minetest.registered_nodes["mcl_core:lava_source"].light_source - 3), - pointable = false, - visual = "cube", - visual_size = {x=0.05, y=0.1}, - textures = {lava_tex, lava_tex, lava_tex, lava_tex, lava_tex, lava_tex}, - spritediv = {x=1, y=1}, - initial_sprite_basepos = {x=0, y=0}, - static_save = false, - on_activate = function(self, staticdata) - self.object:set_sprite({x=0,y=0}, 1, 0, true) - end, - on_step = function(self, dtime) - local k = math.random(1,222) - local ownpos = self.object:get_pos() - if k == 1 then - self.object:set_acceleration({x=0, y=-5, z=0}) - end - if minetest.get_node({x=ownpos.x, y=ownpos.y +0.5, z=ownpos.z}).name == "air" then - self.object:set_acceleration({x=0, y=-5, z=0}) - end - if minetest.get_node({x=ownpos.x, y=ownpos.y -0.5, z=ownpos.z}).name ~= "air" then - self.object:remove() - minetest.sound_play({name="drippingwater_lavadrip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) - end - end, -}) - - - ---Create drop - -minetest.register_abm({ - label = "Create water drops", - nodenames = {"group:opaque", "group:leaves"}, - neighbors = {"group:water"}, - interval = 2, - chance = 22, - action = function(pos) - if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name, "water") ~= 0 - and minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" then - local i = math.random(-45,45) / 100 - minetest.add_entity({x=pos.x + i, y=pos.y - 0.501, z=pos.z + i}, "drippingwater:drop_water") - end - end, -}) - ---Create lava drop - -minetest.register_abm({ - label = "Create lava drops", - nodenames = {"group:opaque"}, - neighbors = {"group:lava"}, - interval = 2, - chance = 22, - action = function(pos) - if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name, "lava") ~= 0 - and minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" then - local i = math.random(-45,45) / 100 - minetest.add_entity({x=pos.x + i, y=pos.y - 0.501, z=pos.z + i}, "drippingwater:drop_lava") - end - end, -}) \ No newline at end of file diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index 76ace7a45..beff5fb52 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -84,7 +84,7 @@ local function attach_object(self, obj) end end, name) obj:set_look_horizontal(yaw) - mcl_tmp_message.message(obj, S("Sneak to dismount")) + mcl_title.set(obj, "actionbar", {text=S("Sneak to dismount"), color="white", stay=60}) else obj:get_luaentity()._old_visual_size = visual_size end @@ -115,7 +115,7 @@ local boat = { collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5}, visual = "mesh", mesh = "mcl_boats_boat.b3d", - textures = {"mcl_boats_texture_oak_boat.png"}, + textures = {"mcl_boats_texture_oak_boat.png", "mcl_boats_texture_oak_boat.png", "mcl_boats_texture_oak_boat.png", "mcl_boats_texture_oak_boat.png", "mcl_boats_texture_oak_boat.png"}, visual_size = boat_visual_size, hp_max = boat_max_hp, damage_texture_modifier = "^[colorize:white:0", @@ -148,6 +148,11 @@ function boat.on_activate(self, staticdata, dtime_s) self._v = data.v self._last_v = self._v self._itemstring = data.itemstring + + while #data.textures < 5 do + table.insert(data.textures, data.textures[1]) + end + self.object:set_properties({textures = data.textures}) end end @@ -337,7 +342,8 @@ function boat.on_step(self, dtime, moveresult) self.object:get_velocity().y) else p.y = p.y + 1 - if is_water(p) then + local is_obsidian_boat = self.object:get_luaentity()._itemstring == "mcl_boats:boat_obsidian" + if is_water(p) or is_obsidian_boat then -- Inside water: Slowly sink local y = self.object:get_velocity().y y = y - 0.01 @@ -377,13 +383,13 @@ end -- Register one entity for all boat types minetest.register_entity("mcl_boats:boat", boat) -local boat_ids = { "boat", "boat_spruce", "boat_birch", "boat_jungle", "boat_acacia", "boat_dark_oak" } -local names = { S("Oak Boat"), S("Spruce Boat"), S("Birch Boat"), S("Jungle Boat"), S("Acacia Boat"), S("Dark Oak Boat") } +local boat_ids = { "boat", "boat_spruce", "boat_birch", "boat_jungle", "boat_acacia", "boat_dark_oak", "boat_obsidian" } +local names = { S("Oak Boat"), S("Spruce Boat"), S("Birch Boat"), S("Jungle Boat"), S("Acacia Boat"), S("Dark Oak Boat"), S("Obsidian Boat") } local craftstuffs = {} if minetest.get_modpath("mcl_core") then - craftstuffs = { "mcl_core:wood", "mcl_core:sprucewood", "mcl_core:birchwood", "mcl_core:junglewood", "mcl_core:acaciawood", "mcl_core:darkwood" } + craftstuffs = { "mcl_core:wood", "mcl_core:sprucewood", "mcl_core:birchwood", "mcl_core:junglewood", "mcl_core:acaciawood", "mcl_core:darkwood", "mcl_core:obsidian" } end -local images = { "oak", "spruce", "birch", "jungle", "acacia", "dark_oak" } +local images = { "oak", "spruce", "birch", "jungle", "acacia", "dark_oak", "obsidian" } for b=1, #boat_ids do local itemstring = "mcl_boats:"..boat_ids[b] @@ -434,8 +440,9 @@ for b=1, #boat_ids do pos = vector.add(pos, vector.multiply(dir, boat_y_offset_ground)) end local boat = minetest.add_entity(pos, "mcl_boats:boat") + local texture = "mcl_boats_texture_"..images[b].."_boat.png" boat:get_luaentity()._itemstring = itemstring - boat:set_properties({textures = { "mcl_boats_texture_"..images[b].."_boat.png" }}) + boat:set_properties({textures = { texture, texture, texture, texture, texture }}) boat:set_yaw(placer:get_look_horizontal()) if not minetest.is_creative_enabled(placer:get_player_name()) then itemstack:take_item() diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr index 04d6d9da9..785d50146 100644 --- a/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr @@ -6,6 +6,7 @@ Boats are used to travel on the surface of water.=Les bateaux sont utilisés pou Dark Oak Boat=Bateau en Chêne Noir Jungle Boat=Bateau en Acajou Oak Boat=Bateau en Chêne -Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Rightclick the boat again to leave it, punch the boat to make it drop as an item.=Faites un clic droit sur une source d'eau pour placer le bateau. Faites un clic droit sur le bateau pour y entrer. Utilisez [Gauche] et [Droite] pour diriger, [Avant] pour accélérer et [Arrière] pour ralentir ou reculer. Cliquez de nouveau avec le bouton droit sur le bateau pour le quitter, frappez le bateau pour le faire tomber en tant qu'objet. +Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Use [Sneak] to leave the boat, punch the boat to make it drop as an item.=Faites un clic droit sur une source d'eau pour placer le bateau. Faites un clic droit sur le bateau pour y entrer. Utilisez [Gauche] et [Droite] pour diriger, [Avant] pour accélérer et [Arrière] pour ralentir ou reculer. Utilisez [Sneak] pour le quitter, frappez le bateau pour le faire tomber en tant qu'objet. Spruce Boat=Bateau en Sapin -Water vehicle=Véhicule aquatique \ No newline at end of file +Water vehicle=Véhicule aquatique +Sneak to dismount= \ No newline at end of file diff --git a/mods/ENTITIES/mcl_boats/mod.conf b/mods/ENTITIES/mcl_boats/mod.conf index a5d6cc8cb..61463b6ec 100644 --- a/mods/ENTITIES/mcl_boats/mod.conf +++ b/mods/ENTITIES/mcl_boats/mod.conf @@ -1,7 +1,7 @@ name = mcl_boats author = PilzAdam description = Adds drivable boats. -depends = mcl_player, flowlib +depends = mcl_player, flowlib, mcl_title optional_depends = mcl_core, doc_identifier diff --git a/mods/ENTITIES/mcl_boats/textures/mcl_boats_obsidian_boat.png b/mods/ENTITIES/mcl_boats/textures/mcl_boats_obsidian_boat.png new file mode 100644 index 000000000..6ae10c0c4 Binary files /dev/null and b/mods/ENTITIES/mcl_boats/textures/mcl_boats_obsidian_boat.png differ diff --git a/mods/ENTITIES/mcl_boats/textures/mcl_boats_texture_obsidian_boat.png b/mods/ENTITIES/mcl_boats/textures/mcl_boats_texture_obsidian_boat.png new file mode 100644 index 000000000..af3c24b30 Binary files /dev/null and b/mods/ENTITIES/mcl_boats/textures/mcl_boats_texture_obsidian_boat.png differ diff --git a/mods/ENTITIES/mcl_burning/api.lua b/mods/ENTITIES/mcl_burning/api.lua index 4cb19cca1..969985205 100644 --- a/mods/ENTITIES/mcl_burning/api.lua +++ b/mods/ENTITIES/mcl_burning/api.lua @@ -67,14 +67,9 @@ function mcl_burning.set_on_fire(obj, burn_time) end if not storage.burn_time or burn_time >= storage.burn_time then - if obj:is_player() and not storage.fire_hud_id then - storage.fire_hud_id = obj:hud_add({ - hud_elem_type = "image", - position = {x = 0.5, y = 0.5}, - scale = {x = -100, y = -100}, - text = "mcl_burning_entity_flame_animated.png^[opacity:180^[verticalframe:" .. mcl_burning.animation_frames .. ":" .. 1, - z_index = 1000, - }) + if obj:is_player() then + mcl_burning.channels[obj]:send_all(tostring(mcl_burning.animation_frames)) + mcl_burning.channels[obj]:send_all("start") end storage.burn_time = burn_time storage.fire_damage_timer = 0 @@ -95,7 +90,6 @@ function mcl_burning.set_on_fire(obj, burn_time) fire_entity:set_properties({visual_size = size}) fire_entity:set_attach(obj, "", offset, {x = 0, y = 0, z = 0}) local fire_luaentity = fire_entity:get_luaentity() - fire_luaentity:update_frame(obj, storage) for _, other in pairs(minetest.get_objects_inside_radius(fire_entity:get_pos(), 0)) do local other_luaentity = other:get_luaentity() @@ -111,9 +105,7 @@ function mcl_burning.extinguish(obj) if mcl_burning.is_burning(obj) then local storage = mcl_burning.get_storage(obj) if obj:is_player() then - if storage.fire_hud_id then - obj:hud_remove(storage.fire_hud_id) - end + mcl_burning.channels[obj]:send_all("stop") mcl_burning.storage[obj] = {} else storage.burn_time = nil @@ -143,4 +135,4 @@ function mcl_burning.tick(obj, dtime, storage) end end end -end \ No newline at end of file +end diff --git a/mods/ENTITIES/mcl_burning/init.lua b/mods/ENTITIES/mcl_burning/init.lua index 34b7ca2d4..a47824537 100644 --- a/mods/ENTITIES/mcl_burning/init.lua +++ b/mods/ENTITIES/mcl_burning/init.lua @@ -7,6 +7,7 @@ local get_item_group = minetest.get_item_group mcl_burning = { storage = {}, + channels = {}, animation_frames = tonumber(minetest.settings:get("fire_animation_frames")) or 8 } @@ -43,23 +44,22 @@ minetest.register_on_respawnplayer(function(player) mcl_burning.extinguish(player) end) -minetest.register_on_joinplayer(function(player) - local storage - - local burn_data = player:get_meta():get_string("mcl_burning:data") - if burn_data == "" then - storage = {} - else - storage = minetest.deserialize(burn_data) +function mcl_burning.init_player(player) + local meta = player:get_meta() + -- NOTE: mcl_burning:data may be "return nil" (which deserialize into nil) for reasons unknown. + if meta:get_string("mcl_burning:data"):find("return nil", 1, true) then + minetest.log("warning", "[mcl_burning] 'mcl_burning:data' player meta field is invalid! Please report this bug") end + mcl_burning.storage[player] = meta:contains("mcl_burning:data") and minetest.deserialize(meta:get_string("mcl_burning:data")) or {} + mcl_burning.channels[player] = minetest.mod_channel_join("mcl_burning:" .. player:get_player_name()) +end - mcl_burning.storage[player] = storage +minetest.register_on_joinplayer(function(player) + mcl_burning.init_player(player) end) minetest.register_on_leaveplayer(function(player) - local storage = mcl_burning.storage[player] - storage.fire_hud_id = nil - player:get_meta():set_string("mcl_burning:data", minetest.serialize(storage)) + player:get_meta():set_string("mcl_burning:data", minetest.serialize(mcl_burning.storage[player])) mcl_burning.storage[player] = nil end) @@ -68,27 +68,28 @@ minetest.register_entity("mcl_burning:fire", { initial_properties = { physical = false, collisionbox = {0, 0, 0, 0, 0, 0}, - visual = "cube", + visual = "upright_sprite", + textures = { + name = "mcl_burning_entity_flame_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.0, + }, + }, + spritediv = {x = 1, y = mcl_burning.animation_frames}, pointable = false, glow = -1, backface_culling = false, }, animation_frame = 0, animation_timer = 0, - on_step = function(self, dtime) - local parent, storage = self:sanity_check() - - if parent then - self.animation_timer = self.animation_timer + dtime - if self.animation_timer >= 0.1 then - self.animation_timer = 0 - self.animation_frame = self.animation_frame + 1 - if self.animation_frame > mcl_burning.animation_frames - 1 then - self.animation_frame = 0 - end - self:update_frame(parent, storage) - end - else + on_activate = function(self) + self.object:set_sprite({x = 0, y = 0}, mcl_burning.animation_frames, 1.0 / mcl_burning.animation_frames) + end, + on_step = function(self) + if not self:sanity_check() then self.object:remove() end end, @@ -96,23 +97,15 @@ minetest.register_entity("mcl_burning:fire", { local parent = self.object:get_attach() if not parent then - return + return false end local storage = mcl_burning.get_storage(parent) if not storage or not storage.burn_time then - return + return false end - return parent, storage - end, - update_frame = function(self, parent, storage) - local frame_overlay = "^[opacity:180^[verticalframe:" .. mcl_burning.animation_frames .. ":" .. self.animation_frame - local fire_texture = "mcl_burning_entity_flame_animated.png" .. frame_overlay - self.object:set_properties({textures = {"blank.png", "blank.png", fire_texture, fire_texture, fire_texture, fire_texture}}) - if parent:is_player() then - parent:hud_change(storage.fire_hud_id, "text", "mcl_burning_hud_flame_animated.png" .. frame_overlay) - end + return true end, }) diff --git a/mods/ENTITIES/mcl_dripping/init.lua b/mods/ENTITIES/mcl_dripping/init.lua new file mode 100644 index 000000000..57ba7ecfe --- /dev/null +++ b/mods/ENTITIES/mcl_dripping/init.lua @@ -0,0 +1,66 @@ +-- Dripping Water Mod +-- by kddekadenz + +local math = math + +-- License of code, textures & sounds: CC0 + +local function register_drop(liquid, glow, sound, nodes) + minetest.register_entity("mcl_dripping:drop_" .. liquid, { + hp_max = 1, + physical = true, + collide_with_objects = false, + collisionbox = {-0.01, 0.01, -0.01, 0.01, 0.01, 0.01}, + glow = glow, + pointable = false, + visual = "sprite", + visual_size = {x = 0.1, y = 0.1}, + textures = {""}, + spritediv = {x = 1, y = 1}, + initial_sprite_basepos = {x = 0, y = 0}, + static_save = false, + _dropped = false, + on_activate = function(self) + self.object:set_properties({ + textures = {"[combine:2x2:" .. -math.random(1, 16) .. "," .. -math.random(1, 16) .. "=default_" .. liquid .. "_source_animated.png"} + }) + end, + on_step = function(self, dtime) + local k = math.random(1, 222) + local ownpos = self.object:get_pos() + if k == 1 then + self.object:set_acceleration(vector.new(0, -5, 0)) + end + if minetest.get_node(vector.offset(ownpos, 0, 0.5, 0)).name == "air" then + self.object:set_acceleration(vector.new(0, -5, 0)) + end + if minetest.get_node(vector.offset(ownpos, 0, -0.1, 0)).name ~= "air" then + local ent = self.object:get_luaentity() + if not ent._dropped then + ent._dropped = true + minetest.sound_play({name = "drippingwater_" .. sound .. "drip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) + end + if k < 3 then + self.object:remove() + end + end + end, + }) + minetest.register_abm({ + label = "Create drops", + nodenames = nodes, + neighbors = {"group:" .. liquid}, + interval = 2, + chance = 22, + action = function(pos) + if minetest.get_item_group(minetest.get_node(vector.offset(pos, 0, 1, 0)).name, liquid) ~= 0 + and minetest.get_node(vector.offset(pos, 0, -1, 0)).name == "air" then + local x, z = math.random(-45, 45) / 100, math.random(-45, 45) / 100 + minetest.add_entity(vector.offset(pos, x, -0.520, z), "mcl_dripping:drop_" .. liquid) + end + end, + }) +end + +register_drop("water", 1, "", {"group:opaque", "group:leaves"}) +register_drop("lava", math.max(7, minetest.registered_nodes["mcl_core:lava_source"].light_source - 3), "lava", {"group:opaque"}) \ No newline at end of file diff --git a/mods/ENTITIES/drippingwater/mod.conf b/mods/ENTITIES/mcl_dripping/mod.conf similarity index 82% rename from mods/ENTITIES/drippingwater/mod.conf rename to mods/ENTITIES/mcl_dripping/mod.conf index 1de118f4c..921d5e59f 100644 --- a/mods/ENTITIES/drippingwater/mod.conf +++ b/mods/ENTITIES/mcl_dripping/mod.conf @@ -1,4 +1,4 @@ -name = drippingwater +name = mcl_dripping author = kddekadenz description = Drops are generated rarely under solid nodes depends = mcl_core diff --git a/mods/ENTITIES/drippingwater/readme.txt b/mods/ENTITIES/mcl_dripping/readme.txt similarity index 75% rename from mods/ENTITIES/drippingwater/readme.txt rename to mods/ENTITIES/mcl_dripping/readme.txt index f609163ed..afe35608e 100644 --- a/mods/ENTITIES/drippingwater/readme.txt +++ b/mods/ENTITIES/mcl_dripping/readme.txt @@ -1,12 +1,12 @@ -Dripping Water Mod +Dripping Mod by kddekadenz -modified for MineClone 2 by Wuzzy +modified for MineClone 2 by Wuzzy and NO11 Installing instructions: - 1. Copy the drippingwater mod folder into games/gamemode/mods + 1. Copy the mcl_dripping mod folder into games/gamemode/mods 2. Start game and enjoy :) diff --git a/mods/ENTITIES/drippingwater/sounds/drippingwater_drip.1.ogg b/mods/ENTITIES/mcl_dripping/sounds/drippingwater_drip.1.ogg similarity index 100% rename from mods/ENTITIES/drippingwater/sounds/drippingwater_drip.1.ogg rename to mods/ENTITIES/mcl_dripping/sounds/drippingwater_drip.1.ogg diff --git a/mods/ENTITIES/drippingwater/sounds/drippingwater_drip.2.ogg b/mods/ENTITIES/mcl_dripping/sounds/drippingwater_drip.2.ogg similarity index 100% rename from mods/ENTITIES/drippingwater/sounds/drippingwater_drip.2.ogg rename to mods/ENTITIES/mcl_dripping/sounds/drippingwater_drip.2.ogg diff --git a/mods/ENTITIES/drippingwater/sounds/drippingwater_drip.3.ogg b/mods/ENTITIES/mcl_dripping/sounds/drippingwater_drip.3.ogg similarity index 100% rename from mods/ENTITIES/drippingwater/sounds/drippingwater_drip.3.ogg rename to mods/ENTITIES/mcl_dripping/sounds/drippingwater_drip.3.ogg diff --git a/mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.1.ogg b/mods/ENTITIES/mcl_dripping/sounds/drippingwater_lavadrip.1.ogg similarity index 100% rename from mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.1.ogg rename to mods/ENTITIES/mcl_dripping/sounds/drippingwater_lavadrip.1.ogg diff --git a/mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.2.ogg b/mods/ENTITIES/mcl_dripping/sounds/drippingwater_lavadrip.2.ogg similarity index 100% rename from mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.2.ogg rename to mods/ENTITIES/mcl_dripping/sounds/drippingwater_lavadrip.2.ogg diff --git a/mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.3.ogg b/mods/ENTITIES/mcl_dripping/sounds/drippingwater_lavadrip.3.ogg similarity index 100% rename from mods/ENTITIES/drippingwater/sounds/drippingwater_lavadrip.3.ogg rename to mods/ENTITIES/mcl_dripping/sounds/drippingwater_lavadrip.3.ogg diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index ab1ac5752..678f8e2b7 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -290,10 +290,10 @@ function minetest.handle_node_drops(pos, drops, digger) end end - if digger and mcl_experience.throw_experience and not silk_touch_drop then + if digger and mcl_experience.throw_xp and not silk_touch_drop then local experience_amount = minetest.get_item_group(dug_node.name,"xp") if experience_amount > 0 then - mcl_experience.throw_experience(pos, experience_amount) + mcl_experience.throw_xp(pos, experience_amount) end end @@ -480,7 +480,7 @@ minetest.register_entity(":__builtin:item", { end, get_staticdata = function(self) - return minetest.serialize({ + local data = minetest.serialize({ itemstring = self.itemstring, always_collect = self.always_collect, age = self.age, @@ -488,6 +488,39 @@ minetest.register_entity(":__builtin:item", { _flowing = self._flowing, _removed = self._removed, }) + -- sfan5 guessed that the biggest serializable item + -- entity would have a size of 65530 bytes. This has + -- been experimentally verified to be still too large. + -- + -- anon5 has calculated that the biggest serializable + -- item entity has a size of exactly 65487 bytes: + -- + -- 1. serializeString16 can handle max. 65535 bytes. + -- 2. The following engine metadata is always saved: + -- • 1 byte (version) + -- • 2 byte (length prefix) + -- • 14 byte “__builtin:item” + -- • 4 byte (length prefix) + -- • 2 byte (health) + -- • 3 × 4 byte = 12 byte (position) + -- • 4 byte (yaw) + -- • 1 byte (version 2) + -- • 2 × 4 byte = 8 byte (pitch and roll) + -- 3. This leaves 65487 bytes for the serialization. + if #data > 65487 then -- would crash the engine + local stack = ItemStack(self.itemstring) + stack:get_meta():from_table(nil) + self.itemstring = stack:to_string() + minetest.log( + "warning", + "Overlong item entity metadata removed: “" .. + self.itemstring .. + "” had serialized length of " .. + #data + ) + return self:get_staticdata() + end + return data end, on_activate = function(self, staticdata, dtime_s) @@ -575,7 +608,7 @@ minetest.register_entity(":__builtin:item", { return true end, - on_step = function(self, dtime) + on_step = function(self, dtime, moveresult) if self._removed then self.object:set_properties({ physical = false @@ -642,6 +675,18 @@ minetest.register_entity(":__builtin:item", { end end + -- Destroy item when it collides with a cactus + if moveresult and moveresult.collides then + for _, collision in pairs(moveresult.collisions) do + local pos = collision.node_pos + if collision.type == "node" and minetest.get_node(pos).name == "mcl_core:cactus" then + self._removed = true + self.object:remove() + return + end + end + end + -- Push item out when stuck inside solid opaque node if def and def.walkable and def.groups and def.groups.opaque == 1 then local shootdir diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index e33e120a1..119a13523 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -198,7 +198,20 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o else self._last_float_check = self._last_float_check + dtime end - local pos, rou_pos, node + + local pos, rou_pos, node = self.object:get_pos() + local r = 0.6 + for _, node_pos in pairs({{r, 0}, {0, r}, {-r, 0}, {0, -r}}) do + if minetest.get_node(vector.offset(pos, node_pos[1], 0, node_pos[2])).name == "mcl_core:cactus" then + detach_driver(self) + for d = 1, #drop do + minetest.add_item(pos, drop[d]) + end + self.object:remove() + return + end + end + -- Drop minecart if it isn't on a rail anymore if self._last_float_check >= mcl_minecarts.check_float_time then pos = self.object:get_pos() @@ -646,7 +659,7 @@ register_minecart( if player then mcl_player.player_set_animation(player, "sit" , 30) player:set_eye_offset({x=0, y=-5.5, z=0},{x=0, y=-4, z=0}) - mcl_tmp_message.message(clicker, S("Sneak to dismount")) + mcl_title.set(clicker, "actionbar", {text=S("Sneak to dismount"), color="white", stay=60}) end end, name) end diff --git a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr index 39cdfd013..67ed5eb1b 100644 --- a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr +++ b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.fr.tr @@ -33,3 +33,4 @@ Activates minecarts when powered=Active les wagonnets lorsqu'il est alimenté Emits redstone power when a minecart is detected=Émet de l'énergie redstone lorsqu'un wagonnet est détecté Vehicle for fast travel on rails=Véhicule pour voyager rapidement sur rails Can be ignited by tools or powered activator rail=Peut être allumé par des outils ou un rail d'activation motorisé +Sneak to dismount= \ No newline at end of file diff --git a/mods/ENTITIES/mcl_minecarts/mod.conf b/mods/ENTITIES/mcl_minecarts/mod.conf index 9fff9175d..3b8ae5551 100644 --- a/mods/ENTITIES/mcl_minecarts/mod.conf +++ b/mods/ENTITIES/mcl_minecarts/mod.conf @@ -1,6 +1,6 @@ name = mcl_minecarts author = Krock description = Minecarts are vehicles to move players quickly on rails. -depends = mcl_explosions, mcl_core, mcl_sounds, mcl_player, mcl_achievements, mcl_chests, mcl_furnaces, mesecons_commandblock, mcl_hoppers, mcl_tnt, mesecons +depends = mcl_title, mcl_explosions, mcl_core, mcl_sounds, mcl_player, mcl_achievements, mcl_chests, mcl_furnaces, mesecons_commandblock, mcl_hoppers, mcl_tnt, mesecons optional_depends = doc_identifier, mcl_wip diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua index 03e6789ed..4e6b7ca46 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua @@ -122,7 +122,7 @@ mobs.death_logic = function(self, dtime) if self.death_animation_timer >= 1.25 then item_drop(self,false,1) mobs.death_effect(self) - mcl_experience.throw_experience(self.object:get_pos(), math_random(self.xp_min, self.xp_max)) + mcl_experience.throw_xp(self.object:get_pos(), math_random(self.xp_min, self.xp_max)) if self.on_die then self.on_die(self, self.object:get_pos()) end diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index e85a9bc39..a7e33d1bd 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -37,7 +37,7 @@ mobs:register_mob("mobs_mc:creeper", { }, makes_footstep_sound = false, walk_velocity = 1.05, - run_velocity = 3.25, + run_velocity = 2.1, runaway_from = { "mobs_mc:ocelot", "mobs_mc:cat" }, attack_type = "explode", eye_height = 1.25, @@ -47,8 +47,8 @@ mobs:register_mob("mobs_mc:creeper", { --explosion_radius = 3, --explosion_damage_radius = 6, --explosiontimer_reset_radius = 6, - reach = 1.5, - defuse_reach = 4, + reach = 3, + defuse_reach = 5.2, explosion_timer = 0.3, allow_fuse_reset = true, stop_to_explode = true, @@ -95,8 +95,8 @@ mobs:register_mob("mobs_mc:creeper", { if self._forced_explosion_countdown_timer then self._forced_explosion_countdown_timer = self._forced_explosion_countdown_timer - dtime if self._forced_explosion_countdown_timer <= 0 then - -- mobs:boom(self, mcl_util.get_object_center(self.object), self.explosion_strength) - mcl_explosions.explode(self.object:get_pos(), self.explosion_strength, { drop_chance = 1.0 }) + local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false + mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { griefing = mobs_griefing, drop_chance = 1.0}, self.object) end end end, @@ -152,6 +152,7 @@ mobs:register_mob("mobs_mc:creeper_charged", { description = S("Charged Creeper"), type = "monster", spawn_class = "hostile", + hostile = true, hp_min = 20, hp_max = 20, xp_min = 5, @@ -187,8 +188,8 @@ mobs:register_mob("mobs_mc:creeper_charged", { --explosion_radius = 3, --explosion_damage_radius = 6, --explosiontimer_reset_radius = 3, - reach = 1.5, - defuse_reach = 4, + reach = 3, + defuse_reach = 5.2, explosion_timer = 0.3, allow_fuse_reset = true, stop_to_explode = true, @@ -220,7 +221,8 @@ mobs:register_mob("mobs_mc:creeper_charged", { if self._forced_explosion_countdown_timer then self._forced_explosion_countdown_timer = self._forced_explosion_countdown_timer - dtime if self._forced_explosion_countdown_timer <= 0 then - mobs:boom(self, mcl_util.get_object_center(self.object), self.explosion_strength) + local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false + mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { griefing = mobs_griefing, drop_chance = 1.0}, self.object) end end end, diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index bafb3f84a..3634e20f4 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -103,7 +103,7 @@ mobs:register_mob("mobs_mc:enderdragon", { mcl_portals.spawn_gateway_portal() mcl_structures.call_struct(self._portal_pos, "end_exit_portal_open") if self._initial then - mcl_experience.throw_experience(pos, 11500) -- 500 + 11500 = 12000 + mcl_experience.throw_xp(pos, 11500) -- 500 + 11500 = 12000 minetest.set_node(vector.add(self._portal_pos, vector.new(3, 5, 3)), {name = mobs_mc.items.dragon_egg}) end end diff --git a/mods/ENTITIES/mobs_mc/locale/template.txt b/mods/ENTITIES/mobs_mc/locale/template.txt index 04ba9e465..7b55c1b89 100644 --- a/mods/ENTITIES/mobs_mc/locale/template.txt +++ b/mods/ENTITIES/mobs_mc/locale/template.txt @@ -28,6 +28,7 @@ Pig= Polar Bear= Rabbit= Killer Bunny= +The Killer Bunny= Sheep= Shulker= Silverfish= diff --git a/mods/ENTITIES/mobs_mc/rabbit.lua b/mods/ENTITIES/mobs_mc/rabbit.lua index 8c2675954..51235a3f9 100644 --- a/mods/ENTITIES/mobs_mc/rabbit.lua +++ b/mods/ENTITIES/mobs_mc/rabbit.lua @@ -233,4 +233,4 @@ mobs:spawn(spawn_grass) mobs:register_egg("mobs_mc:rabbit", S("Rabbit"), "mobs_mc_spawn_icon_rabbit.png", 0) -- Note: This spawn egg does not exist in Minecraft -mobs:register_egg("mobs_mc:killer_bunny", S("Killer Bunny"), "mobs_mc_spawn_icon_rabbit.png^[colorize:#FF0000:192", 0) -- TODO: Update inventory image +mobs:register_egg("mobs_mc:killer_bunny", S("Killer Bunny"), "mobs_mc_spawn_icon_rabbit_caerbannog.png", 0) diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 48aacfcce..9236b255e 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -31,12 +31,14 @@ local spawn_children_on_die = function(child_mob, children_count, spawn_distance speed_penalty = 0.5 end local mob = minetest.add_entity(newpos, child_mob) - if (not mother_stuck) then - mob:set_velocity(vector.multiply(dir, eject_speed * speed_penalty)) + if mob then + if (not mother_stuck) then + mob:set_velocity(vector.multiply(dir, eject_speed * speed_penalty)) + end + mob:set_yaw(angle - math.pi/2) + table.insert(children, mob) + angle = angle + (math.pi*2)/children_count end - mob:set_yaw(angle - math.pi/2) - table.insert(children, mob) - angle = angle + (math.pi*2)/children_count end -- If mother was murdered, children attack the killer after 1 second if self.state == "attack" then diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_rabbit_caerbannog.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_rabbit_caerbannog.png new file mode 100644 index 000000000..4244a83c6 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/mobs_mc_spawn_icon_rabbit_caerbannog.png differ diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 58cc2fd2d..423f6c392 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -409,7 +409,7 @@ local init_trades = function(self, inv) local offered_stack = ItemStack({name = offered_item, count = offered_count}) if mcl_enchanting.is_enchanted(offered_item) then if mcl_enchanting.is_book(offered_item) then - offered_stack = mcl_enchanting.get_uniform_randomly_enchanted_book({"soul_speed"}) + mcl_enchanting.enchant_uniform_randomly(offered_stack, {"soul_speed"}) else mcl_enchanting.enchant_randomly(offered_stack, math.random(5, 19), false, false, true) mcl_enchanting.unload_enchantments(offered_stack) diff --git a/mods/ENVIRONMENT/lightning/API.md b/mods/ENVIRONMENT/lightning/API.md new file mode 100644 index 000000000..ad4f0a3b4 --- /dev/null +++ b/mods/ENVIRONMENT/lightning/API.md @@ -0,0 +1,31 @@ +# lightning +Lightning mod for MineClone2 with the following API: + +## lightning.register_on_strike(function(pos, pos2, objects)) +Custom function called when a lightning strikes. + +* `pos`: impact position +* `pos2`: rounded node position where fire is placed +* `objects`: table with ObjectRefs of all objects within a radius of 3.5 around pos2 + +## lightning.strike(pos) +Let a lightning strike. + +* `pos`: optional, if not given a random pos will be chosen +* `returns`: bool - success if a strike happened + + +### Examples: + +``` +lightning.register_on_strike(function(pos, pos2, objects) + for _, obj in pairs(objects) do + obj:remove() + end + minetest.add_entity(pos, "mobs_mc:sheep") +end) + +minetest.register_on_respawnplayer(function(player) + lightning.strike(player:get_pos()) +end) +``` \ No newline at end of file diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index 0ae1c5c1a..3579316e8 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -19,17 +19,19 @@ local set_node = minetest.set_node local sound_play = minetest.sound_play local add_particlespawner = minetest.add_particlespawner local after = minetest.after +local add_entity = minetest.add_entity local get_objects_inside_radius = minetest.get_objects_inside_radius local get_item_group = minetest.get_item_group lightning = { - interval_low = 17, - interval_high = 503, - range_h = 100, - range_v = 50, - size = 100, - -- disable this to stop lightning mod from striking - auto = true, + interval_low = 17, + interval_high = 503, + range_h = 100, + range_v = 50, + size = 100, + -- disable this to stop lightning mod from striking + auto = true, + on_strike_functions = {}, } local rng = PcgRandom(32321123312123) @@ -53,6 +55,18 @@ end minetest.register_globalstep(revertsky) +-- lightning strike API + +-- See API.md +--[[ + lightning.register_on_strike(function(pos, pos2, objects) + -- code + end) +]] +function lightning.register_on_strike(func) + table.insert(lightning.on_strike_functions, func) +end + -- select a random strike point, midpoint local function choose_pos(pos) if not pos then @@ -78,14 +92,14 @@ local function choose_pos(pos) pos.z = math.floor(pos.z - (lightning.range_h / 2) + rng:next(1, lightning.range_h)) end - local b, pos2 = line_of_sight(pos, {x = pos.x, y = pos.y - lightning.range_v, z = pos.z}, 1) + local b, pos2 = line_of_sight(pos, { x = pos.x, y = pos.y - lightning.range_v, z = pos.z }, 1) -- nothing but air found if b then return nil, nil end - local n = get_node({x = pos2.x, y = pos2.y - 1/2, z = pos2.z}) + local n = get_node({ x = pos2.x, y = pos2.y - 1/2, z = pos2.z }) if n.name == "air" or n.name == "ignore" then return nil, nil end @@ -93,7 +107,6 @@ local function choose_pos(pos) return pos, pos2 end --- lightning strike API -- * pos: optional, if not given a random pos will be chosen -- * returns: bool - success if a strike happened function lightning.strike(pos) @@ -107,21 +120,28 @@ function lightning.strike(pos) if not pos then return false end + local objects = get_objects_inside_radius(pos2, 3.5) + if lightning.on_strike_functions then + for _, func in pairs(lightning.on_strike_functions) do + func(pos, pos2, objects) + end + end +end +lightning.register_on_strike(function(pos, pos2, objects) + local particle_pos = vector.offset(pos2, 0, (lightning.size / 2) + 0.5, 0) + local particle_size = lightning.size * 10 + local time = 0.2 add_particlespawner({ amount = 1, - time = 0.2, + time = time, -- make it hit the top of a block exactly with the bottom - minpos = {x = pos2.x, y = pos2.y + (lightning.size / 2) + 1/2, z = pos2.z }, - maxpos = {x = pos2.x, y = pos2.y + (lightning.size / 2) + 1/2, z = pos2.z }, - minvel = {x = 0, y = 0, z = 0}, - maxvel = {x = 0, y = 0, z = 0}, - minacc = {x = 0, y = 0, z = 0}, - maxacc = {x = 0, y = 0, z = 0}, - minexptime = 0.2, - maxexptime = 0.2, - minsize = lightning.size * 10, - maxsize = lightning.size * 10, + minpos = particle_pos, + maxpos = particle_pos, + minexptime = time, + maxexptime = time, + minsize = particle_size, + maxsize = particle_size, collisiondetection = true, vertical = true, -- to make it appear hitting the node that will get set on fire, make sure @@ -134,44 +154,27 @@ function lightning.strike(pos) sound_play({ name = "lightning_thunder", gain = 10 }, { pos = pos, max_hear_distance = 500 }, true) -- damage nearby objects, transform mobs - -- TODO: use an API insteed of hardcoding this behaviour - local objs = get_objects_inside_radius(pos2, 3.5) - for o=1, #objs do - local obj = objs[o] + for _, obj in pairs(objects) do local lua = obj:get_luaentity() - -- pig → zombie pigman (no damage) + if lua and lua._on_strike then + lua._on_strike(lua, pos, pos2, objects) + end + -- remove this when mob API is done if lua and lua.name == "mobs_mc:pig" then - local rot = obj:get_yaw() - obj:remove() - obj = minetest.add_entity(pos2, "mobs_mc:pigman") - obj:set_yaw(rot) - -- mooshroom: toggle color red/brown (no damage) + mcl_util.replace_mob(obj, "mobs_mc:pigman") elseif lua and lua.name == "mobs_mc:mooshroom" then if lua.base_texture[1] == "mobs_mc_mooshroom.png" then lua.base_texture = { "mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } else lua.base_texture = { "mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png" } end - obj:set_properties({textures = lua.base_texture}) - -- villager → witch (no damage) - --elseif lua and lua.name == "mobs_mc:villager" then - -- Witches are incomplete, this code is unused - -- TODO: Enable this code when witches are working. - --[[ - local rot = obj:get_yaw() - obj:remove() - obj = minetest.add_entity(pos2, "mobs_mc:witch") - obj:set_yaw(rot) - ]] - -- charged creeper + obj:set_properties({ textures = lua.base_texture }) + elseif lua and lua.name == "mobs_mc:villager" then + mcl_util.replace_mob(obj, "mobs_mc:witch") elseif lua and lua.name == "mobs_mc:creeper" then - local rot = obj:get_yaw() - obj:remove() - obj = minetest.add_entity(pos2, "mobs_mc:creeper_charged") - obj:set_yaw(rot) - -- Other objects: Just damage + mcl_util.replace_mob(obj, "mobs_mc:creeper_charged") else - mcl_util.deal_damage(obj, 5, {type = "lightning_bolt"}) + mcl_util.deal_damage(obj, 5, { type = "lightning_bolt" }) end end @@ -185,7 +188,7 @@ function lightning.strike(pos) local name = player:get_player_name() if ps[name] == nil then ps[name] = {p = player, sky = sky} - mcl_weather.skycolor.add_layer("lightning", {{r=255,g=255,b=255}}, true) + mcl_weather.skycolor.add_layer("lightning", { { r = 255, g = 255, b = 255 } }, true) mcl_weather.skycolor.active = true end end @@ -200,32 +203,31 @@ function lightning.strike(pos) if rng:next(1,100) <= 3 then skeleton_lightning = true end - if get_item_group(get_node({x = pos2.x, y = pos2.y - 1, z = pos2.z}).name, "liquid") < 1 then + if get_item_group(get_node({ x = pos2.x, y = pos2.y - 1, z = pos2.z }).name, "liquid") < 1 then if get_node(pos2).name == "air" then -- Low chance for a lightning to spawn skeleton horse + skeletons if skeleton_lightning then - minetest.add_entity(pos2, "mobs_mc:skeleton_horse") + add_entity(pos2, "mobs_mc:skeleton_horse") local angle, posadd angle = math.random(0, math.pi*2) for i=1,3 do - posadd = {x=math.cos(angle),y=0,z=math.sin(angle)} + posadd = { x=math.cos(angle),y=0,z=math.sin(angle) } posadd = vector.normalize(posadd) - local mob = minetest.add_entity(vector.add(pos2, posadd), "mobs_mc:skeleton") + local mob = add_entity(vector.add(pos2, posadd), "mobs_mc:skeleton") if mob then mob:set_yaw(angle-math.pi/2) - angle = angle + (math.pi*2) / 3 end + angle = angle + (math.pi*2) / 3 end -- Cause a fire else - set_node(pos2, {name = "mcl_fire:fire"}) + set_node(pos2, { name = "mcl_fire:fire" }) end end end - -end +end) -- if other mods disable auto lightning during initialization, don't trigger the first lightning. after(5, function(dtime) diff --git a/mods/ENVIRONMENT/mcl_ambient_light/init.lua b/mods/ENVIRONMENT/mcl_ambient_light/init.lua new file mode 100644 index 000000000..1b030d1b9 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_ambient_light/init.lua @@ -0,0 +1,13 @@ +minetest.register_on_mods_loaded(function () + local light_min = 1 + for name, def in pairs(minetest.registered_nodes) do + if name ~= "air" then + local light_source = def.light_source + if light_source == nil or light_source < light_min then + minetest.override_item(name, { light_source = light_min }) + elseif light_source == light_min then + minetest.override_item(name, { light_source = light_min + 1 }) + end + end + end +end) diff --git a/mods/ENVIRONMENT/mcl_ambient_light/mod.conf b/mods/ENVIRONMENT/mcl_ambient_light/mod.conf new file mode 100644 index 000000000..bccea6a89 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_ambient_light/mod.conf @@ -0,0 +1,3 @@ +name = ambient_light +author = MikeRedwood, kay27 +description = Makes all nodes lit to a small degree! diff --git a/mods/ENVIRONMENT/mcl_weather/nether_dust.lua b/mods/ENVIRONMENT/mcl_weather/nether_dust.lua index d328dae21..488745eec 100644 --- a/mods/ENVIRONMENT/mcl_weather/nether_dust.lua +++ b/mods/ENVIRONMENT/mcl_weather/nether_dust.lua @@ -1,36 +1,66 @@ mcl_weather.nether_dust = {} -mcl_weather.nether_dust.particles_count = 99 +mcl_weather.nether_dust.particlespawners = {} --- calculates coordinates and draw particles for Nether dust -function mcl_weather.nether_dust.add_dust_particles(player) - for i=mcl_weather.nether_dust.particles_count, 1,-1 do - local rpx, rpy, rpz = mcl_weather.get_random_pos_by_player_look_dir(player) - minetest.add_particle({ - pos = {x = rpx, y = rpy - math.random(6, 18), z = rpz}, - velocity = {x = math.random(-30,30)*0.01, y = math.random(-15,15)*0.01, z = math.random(-30,30)*0.01}, - acceleration = {x = math.random(-50,50)*0.02, y = math.random(-20,20)*0.02, z = math.random(-50,50)*0.02}, - expirationtime = 3, - size = math.random(6,20)*0.01, - collisiondetection = false, - object_collision = false, - vertical = false, - glow = math.random(0,minetest.LIGHT_MAX), - texture = "mcl_particles_nether_dust"..tostring(i%3+1)..".png", - playername = player:get_player_name() - }) +local psdef= { + amount = 150, + time = 0, + minpos = vector.new(-15,-15,-15), + maxpos =vector.new(15,15,15), + minvel = vector.new(-0.3,-0.15,-1), + maxvel = vector.new(0.3,0.15,0.3), + minacc = vector.new(-1,-0.4,-1), + maxacc = vector.new(1,0.4,1), + minexptime = 1, + maxexptime = 10, + minsize = 0.2, + maxsize = 0.7, + collisiondetection = false, + collision_removal = false, + object_collision = false, + vertical = false +} + +local function check_player(player) + local name=player:get_player_name(name) + if mcl_worlds.has_dust(player:get_pos()) and not mcl_weather.nether_dust.particlespawners[name] then + return true + end +end + +mcl_weather.nether_dust.add_particlespawners = function(player) + local name=player:get_player_name(name) + mcl_weather.nether_dust.particlespawners[name]={} + psdef.playername = name + psdef.attached = player + psdef.glow = math.random(0,minetest.LIGHT_MAX) + for i=1,3 do + psdef.texture="mcl_particles_nether_dust"..i..".png" + mcl_weather.nether_dust.particlespawners[name][i]=minetest.add_particlespawner(psdef) end end -local timer = 0 -minetest.register_globalstep(function(dtime) - timer = timer + dtime - if timer < 0.7 then return end - timer = 0 - - for _, player in pairs(minetest.get_connected_players()) do - if not mcl_worlds.has_dust(player:get_pos()) then - return false +mcl_weather.nether_dust.delete_particlespawners = function(player) + local name=player:get_player_name(name) + if mcl_weather.nether_dust.particlespawners[name] then + for i=1,3 do + minetest.delete_particlespawner(mcl_weather.nether_dust.particlespawners[name][i]) end - mcl_weather.nether_dust.add_dust_particles(player) + mcl_weather.nether_dust.particlespawners[name]=nil + end +end + +mcl_worlds.register_on_dimension_change(function(player, dimension) + if check_player(player) then + return mcl_weather.nether_dust.add_particlespawners(player) + end + mcl_weather.nether_dust.delete_particlespawners(player) +end) + +minetest.register_on_joinplayer(function(player) + if check_player(player) then + mcl_weather.nether_dust.add_particlespawners(player) end end) +minetest.register_on_leaveplayer(function(player) + mcl_weather.nether_dust.delete_particlespawners(player) +end) \ No newline at end of file diff --git a/mods/HELP/doc/doc_items/locale/doc_items.fr.tr b/mods/HELP/doc/doc_items/locale/doc_items.fr.tr index 5d655404d..824ceeeba 100644 --- a/mods/HELP/doc/doc_items/locale/doc_items.fr.tr +++ b/mods/HELP/doc/doc_items/locale/doc_items.fr.tr @@ -2,7 +2,7 @@ Using it as fuel turns it into: @1.=L'utiliser comme combustible le transforme en : @1. @1 seconds=@1 secondes # Item count times item name -%@1×@2=%@1×@ +@1×@2=@1×@ # Itemname (25%) @1 (@2%)=@1 (@2%) # Itemname (<0.5%) diff --git a/mods/HELP/mcl_item_id/API.md b/mods/HELP/mcl_item_id/API.md new file mode 100644 index 000000000..a2f244e0c --- /dev/null +++ b/mods/HELP/mcl_item_id/API.md @@ -0,0 +1,24 @@ +# mcl_item_id +Show the item ID of an item in the description. +With this API, you can register a different name space than "mineclone" for your mod. + +## mcl_item_id.set_mod_namespace(modname, namespace) +Set a name space for all items in a mod. + +* param1: the modname +* param2: (optional) string of the desired name space, if nil, it is the name of the mod + +## mcl_item_id.get_mod_namespace(modname) +Get the name space of a mod registered with mcl_item_id.set_mod_namespace(modname, namespace). + +* param1: the modname + +### Examples: + +The name of the mod is "mod" which registered an item called "mod:itemname". + +* mcl_item_id.set_mod_namespace("mod", "mymod") will show "mymod:itemname" in the description of "mod:itemname" +* mcl_item_id.set_mod_namespace(minetest.get_current_modname()) will show "mod:itemname" in the description of "mod:itemname" +* mcl_item_id.get_mod_namespace(minetest.get_current_modname()) will return "mod" + +(If no namespace is set by a mod, mcl_item_id.get_mod_namespace(minetest.get_current_modname()) will return "mineclone") diff --git a/mods/HELP/mcl_item_id/init.lua b/mods/HELP/mcl_item_id/init.lua index 3b3128f26..f3e6d2735 100644 --- a/mods/HELP/mcl_item_id/init.lua +++ b/mods/HELP/mcl_item_id/init.lua @@ -1,6 +1,26 @@ +mcl_item_id = { + mod_namespaces = {}, +} + local game = "mineclone" +function mcl_item_id.set_mod_namespace(modname, namespace) + local namespace = namespace or modname + mcl_item_id.mod_namespaces[modname] = namespace +end + +function mcl_item_id.get_mod_namespace(modname) + local namespace = mcl_item_id.mod_namespaces[modname] + if namespace then + return namespace + else + return game + end +end + local same_id = { + enchanting = { "table" }, + experience = { "bottle" }, heads = { "skeleton", "zombie", "creeper", "wither_skeleton" }, mobitems = { "rabbit", "chicken" }, walls = { @@ -10,7 +30,7 @@ local same_id = { "stonebrick", "stonebrickmossy", }, wool = { - "black", "blue", "brown", "cyan", "green", + "black", "blue", "brown", "cyan", "green", "grey", "light_blue", "lime", "magenta", "orange", "pink", "purple", "red", "silver", "white", "yellow", }, @@ -18,9 +38,11 @@ local same_id = { tt.register_snippet(function(itemstring) local def = minetest.registered_items[itemstring] - local desc = def.description local item_split = itemstring:find(":") - local new_id = game .. itemstring:sub(item_split) + local id_string = itemstring:sub(item_split) + local id_modname = itemstring:sub(1, item_split - 1) + local new_id = game .. id_string + local mod_namespace = mcl_item_id.get_mod_namespace(id_modname) for mod, ids in pairs(same_id) do for _, id in pairs(ids) do if itemstring == "mcl_" .. mod .. ":" .. id then @@ -28,12 +50,13 @@ tt.register_snippet(function(itemstring) end end end - if new_id ~= game .. ":book_enchanted" then + if mod_namespace ~= game then + new_id = mod_namespace .. id_string + end + if mod_namespace ~= id_modname then minetest.register_alias_force(new_id, itemstring) end if minetest.settings:get_bool("mcl_item_id_debug", false) then return new_id, "#555555" end -end) - -minetest.register_alias_force(game .. ":book_enchanted", "mcl_enchanting:book_enchanted") +end) \ No newline at end of file diff --git a/mods/HELP/mcl_tt/locale/mcl_tt.de.tr b/mods/HELP/mcl_tt/locale/mcl_tt.de.tr index 8f878afc7..54c376c3b 100644 --- a/mods/HELP/mcl_tt/locale/mcl_tt.de.tr +++ b/mods/HELP/mcl_tt/locale/mcl_tt.de.tr @@ -45,3 +45,4 @@ Mining durability: @1=Grabehaltbarkeit: @1 Block breaking strength: @1=Blockbruchstärke: @1 @1 uses=@1 Verwendungen Unlimited uses=Unbegrenzte Verwendungen +Durability: @1=Haltbarkeit: @1 diff --git a/mods/HELP/mcl_tt/locale/template.txt b/mods/HELP/mcl_tt/locale/template.txt index 1259216c7..6fb735b13 100644 --- a/mods/HELP/mcl_tt/locale/template.txt +++ b/mods/HELP/mcl_tt/locale/template.txt @@ -45,3 +45,4 @@ Mining durability: @1= Block breaking strength: @1= @1 uses= Unlimited uses= +Durability: @1= diff --git a/mods/HELP/mcl_tt/snippets_mcl.lua b/mods/HELP/mcl_tt/snippets_mcl.lua index 3c79f52e8..825776f5f 100644 --- a/mods/HELP/mcl_tt/snippets_mcl.lua +++ b/mods/HELP/mcl_tt/snippets_mcl.lua @@ -107,3 +107,8 @@ tt.register_snippet(function(itemstring) end end) +tt.register_snippet(function(itemstring, _, itemstack) + if itemstring:sub(1, 23) == "mcl_fishing:fishing_rod" or itemstring:sub(1, 12) == "mcl_bows:bow" then + return S("Durability: @1", S("@1 uses", mcl_util.calculate_durability(itemstack or ItemStack(itemstring)))) + end +end) diff --git a/mods/HUD/hudbars/init.lua b/mods/HUD/hudbars/init.lua index 08f1914ca..505ff403b 100644 --- a/mods/HUD/hudbars/init.lua +++ b/mods/HUD/hudbars/init.lua @@ -425,6 +425,7 @@ function hb.hide_hudbar(player, identifier) local name = player:get_player_name() local hudtable = hb.get_hudtable(identifier) if hudtable == nil then return false end + if hudtable.hudstate[name].hidden == true then return true end if hb.settings.bar_type == "progress_bar" then if hudtable.hudids[name].icon then player:hud_change(hudtable.hudids[name].icon, "scale", {x=0,y=0}) @@ -443,6 +444,7 @@ function hb.unhide_hudbar(player, identifier) local name = player:get_player_name() local hudtable = hb.get_hudtable(identifier) if hudtable == nil then return false end + if hudtable.hudstate[name].hidden == false then return true end local value = hudtable.hudstate[name].value local max = hudtable.hudstate[name].max if hb.settings.bar_type == "progress_bar" then diff --git a/mods/HUD/mcl_credits/init.lua b/mods/HUD/mcl_credits/init.lua index d56518c7e..db3ac8436 100644 --- a/mods/HUD/mcl_credits/init.lua +++ b/mods/HUD/mcl_credits/init.lua @@ -3,124 +3,8 @@ local S = minetest.get_translator(modname) mcl_credits = { players = {}, -} - -mcl_credits.description = S("A faithful Open Source clone of Minecraft") - --- Sub-lists are sorted by number of commits, but the list should not be rearranged (-> new contributors are just added at the end of the list) -mcl_credits.people = { - { S("Creator of MineClone"), 0x0A9400, { - "davedevils", - }}, - { S("Creator of MineClone2"), 0xFBF837, { - "Wuzzy", - }}, - {"Creator of MineClone5", 0xFF51D5, { - "The Community", - }}, - {"Developers", 0xF84355, { - "Fleckenstein", - "kay27", - "oilboi", - "bzoss", - "AFCMS", - "epCode", - "ryvnf", - "iliekprogrammar", - "MysticTempest", - "Rootyjr", - "Nicu", - "aligator", - "Code-Sploit", - "NO11", - }}, - { S("Contributors"), 0x52FF00, { - "Laurent Rocher", - "HimbeerserverDE", - "TechDudie", - "Alexander Minges", - "ArTee3", - "ZeDique la Ruleta", - "pitchum", - "wuniversales", - "Bu-Gee", - "David McMackins II", - "Nicholas Niro", - "Wouters Dorian", - "Blue Blancmange", - "Jared Moody", - "Li0n", - "Midgard", - "Saku Laesvuori", - "Yukitty", - "ZedekThePD", - "aldum", - "dBeans", - "nickolas360", - "yutyo", - "ztianyang", - "j45", - }}, - {"MineClone5", 0xA60014, { - "kay27", - "Debiankaios", - "epCode", - "NO11", - "j45", - }}, - { S("Original Mod Authors"), 0x343434, { - "Wuzzy", - "Fleckenstein", - "BlockMen", - "TenPlus1", - "PilzAdam", - "ryvnf", - "stujones11", - "Arcelmi", - "celeron55", - "maikerumine", - "GunshipPenguin", - "Qwertymine3", - "Rochambeau", - "rubenwardy", - "stu", - "oilboi", - "4aiman", - "Kahrl", - "Krock", - "UgnilJoZ", - "lordfingle", - "22i", - "bzoss", - "kilbith", - "xeranas", - "kddekadenz", - "sofar", - "4Evergreen4", - "jordan4ibanez", - "paramat", - }}, - { S("3D Models"), 0x0019FF, { - "22i", - "tobyplowy", - "epCode", - }}, - { S("Textures"), 0xFF9705, { - "XSSheep", - "Wuzzy", - "kingoscargames", - "leorockway", - "xMrVizzy", - "yutyo", - "NO11", - }}, - { S("Translations"), 0x00FF60, { - "Wuzzy", - "Rocher Laurent", - "wuniversales", - "kay27", - "pitchum", - }}, + description = S("A faithful Open Source clone of Minecraft"), + people = dofile(minetest.get_modpath(modname) .. "/people.lua"), } local function add_hud_element(def, huds, y) @@ -244,7 +128,7 @@ minetest.register_globalstep(function(dtime) y = y - 5 end end - + if y > -100 then if id == huds.icon then y = math.max(400, y) diff --git a/mods/HUD/mcl_credits/locale/mcl_credits.de.tr b/mods/HUD/mcl_credits/locale/mcl_credits.de.tr index 6a38d18e6..fa26f5bc4 100644 --- a/mods/HUD/mcl_credits/locale/mcl_credits.de.tr +++ b/mods/HUD/mcl_credits/locale/mcl_credits.de.tr @@ -7,6 +7,7 @@ Creator of MineClone2=Schöpfer von MineClone2 Developers=Entwickler Jump to speed up (additionally sprint)=Springen, um zu beschleunigen (zusätzlich sprinten) Maintainers=Betreuer +MineClone5=MineClone5 Original Mod Authors=Original-Mod-Autoren Sneak to skip=Schleichen zum Überspringen Textures=Texturen diff --git a/mods/HUD/mcl_credits/locale/mcl_credits.es.tr b/mods/HUD/mcl_credits/locale/mcl_credits.es.tr new file mode 100644 index 000000000..a8886286e --- /dev/null +++ b/mods/HUD/mcl_credits/locale/mcl_credits.es.tr @@ -0,0 +1,14 @@ +# textdomain: mcl_credits +3D Models= +A faithful Open Source clone of Minecraft= +Contributors= +Creator of MineClone= +Creator of MineClone2= +Developers= +Jump to speed up (additionally sprint)= +Maintainers= +MineClone5= +Original Mod Authors= +Sneak to skip= +Textures= +Translations= \ No newline at end of file diff --git a/mods/HUD/mcl_credits/locale/mcl_credits.fr.tr b/mods/HUD/mcl_credits/locale/mcl_credits.fr.tr new file mode 100644 index 000000000..b34249eff --- /dev/null +++ b/mods/HUD/mcl_credits/locale/mcl_credits.fr.tr @@ -0,0 +1,14 @@ +# textdomain: mcl_credits +3D Models=Modèles 3D +A faithful Open Source clone of Minecraft=Un clone open source de Minecraft +Contributors=Contributeurs +Creator of MineClone=Créateur de MineClone +Creator of MineClone2=Créateur de MineClone2 +Developers=Développeurs +Jump to speed up (additionally sprint)=Saut pour accélérer (peut être combiné avec sprint) +Maintainers=Mainteneurs +MineClone5=MineClone5 +Original Mod Authors=Auteurs des mods originaux +Sneak to skip=Shift pour passer +Textures=Textures +Translations=Traductions \ No newline at end of file diff --git a/mods/HUD/mcl_credits/locale/mcl_credits.pl.tr b/mods/HUD/mcl_credits/locale/mcl_credits.pl.tr new file mode 100644 index 000000000..a8886286e --- /dev/null +++ b/mods/HUD/mcl_credits/locale/mcl_credits.pl.tr @@ -0,0 +1,14 @@ +# textdomain: mcl_credits +3D Models= +A faithful Open Source clone of Minecraft= +Contributors= +Creator of MineClone= +Creator of MineClone2= +Developers= +Jump to speed up (additionally sprint)= +Maintainers= +MineClone5= +Original Mod Authors= +Sneak to skip= +Textures= +Translations= \ No newline at end of file diff --git a/mods/HUD/mcl_credits/locale/mcl_credits.ru.tr b/mods/HUD/mcl_credits/locale/mcl_credits.ru.tr new file mode 100644 index 000000000..a8886286e --- /dev/null +++ b/mods/HUD/mcl_credits/locale/mcl_credits.ru.tr @@ -0,0 +1,14 @@ +# textdomain: mcl_credits +3D Models= +A faithful Open Source clone of Minecraft= +Contributors= +Creator of MineClone= +Creator of MineClone2= +Developers= +Jump to speed up (additionally sprint)= +Maintainers= +MineClone5= +Original Mod Authors= +Sneak to skip= +Textures= +Translations= \ No newline at end of file diff --git a/mods/HUD/mcl_credits/people.lua b/mods/HUD/mcl_credits/people.lua new file mode 100644 index 000000000..babd64bcc --- /dev/null +++ b/mods/HUD/mcl_credits/people.lua @@ -0,0 +1,145 @@ +local modname = minetest.get_current_modname() +local S = minetest.get_translator(modname) + +return { + {S("Creator of MineClone"), 0x0A9400, { + "davedevils", + }}, + {S("Creator of MineClone2"), 0xFBF837, { + "Wuzzy", + }}, + {S("Creator of MineClone5"), 0xFF51D5, { + S("The Community"), + }}, + {S("Developers"), 0xF84355, { + "Fleckenstein", + "kay27", + "oilboi", + "bzoss", + "AFCMS", + "epCode", + "ryvnf", + "iliekprogrammar", + "MysticTempest", + "Rootyjr", + "Nicu", + "aligator", + "Code-Sploit", + "NO11", + "cora", + }}, + {S("Contributors"), 0x52FF00, { + "Laurent Rocher", + "HimbeerserverDE", + "TechDudie", + "Alexander Minges", + "ArTee3", + "ZeDique la Ruleta", + "pitchum", + "wuniversales", + "Bu-Gee", + "David McMackins II", + "Nicholas Niro", + "Wouters Dorian", + "Blue Blancmange", + "Jared Moody", + "Li0n", + "Midgard", + "Saku Laesvuori", + "Yukitty", + "ZedekThePD", + "aldum", + "dBeans", + "nickolas360", + "yutyo", + "ztianyang", + "j45", + "Marcin Serwin", + "erlehmann", + "E", + "Benjamin Schötz", + "Doloment", + "Sydney Gems", + "talamh", + "Emily2255", + "Emojigit", + "FinishedFragment", + "sfan5", + "Blue Blancmange", + "Jared Moody", + "SmallJoker", + "Sven792", + "aldum", + }}, + {S("MineClone5"), 0xA60014, { + "kay27", + "Debiankaios", + "epCode", + "NO11", + "j45", + }}, + {S("Original Mod Authors"), 0x343434, { + "Wuzzy", + "Fleckenstein", + "BlockMen", + "TenPlus1", + "PilzAdam", + "ryvnf", + "stujones11", + "Arcelmi", + "celeron55", + "maikerumine", + "GunshipPenguin", + "Qwertymine3", + "Rochambeau", + "rubenwardy", + "stu", + "4aiman", + "Kahrl", + "Krock", + "UgnilJoZ", + "lordfingle", + "22i", + "bzoss", + "kilbith", + "xeranas", + "kddekadenz", + "sofar", + "4Evergreen4", + "jordan4ibanez", + "paramat", + }}, + {S("3D Models"), 0x0019FF, { + "22i", + "tobyplowy", + "epCode", + }}, + {S("Textures"), 0xFF9705, { + "XSSheep", + "Wuzzy", + "kingoscargames", + "leorockway", + "xMrVizzy", + "yutyo", + "NO11", + "kay27", + }}, + {S("Translations"), 0x00FF60, { + "Wuzzy", + "Rocher Laurent", + "wuniversales", + "kay27", + "pitchum", + "todoporlalibertad", + "Marcin Serwin", + }}, + {S("Funders"), 0xF7FF00, { + "40W", + }}, + {S("Special thanks"), 0x00E9FF, { + "celeron55 for creating Minetest", + "Jordach for the jukebox music compilation from Big Freaking Dig", + "The workaholics who spent way too much time writing for the Minecraft Wiki. It's an invaluable resource for creating this game", + "Notch and Jeb for being the major forces behind Minecraft", + }}, +} diff --git a/mods/HUD/mcl_experience/bottle.lua b/mods/HUD/mcl_experience/bottle.lua new file mode 100644 index 000000000..10e42a57d --- /dev/null +++ b/mods/HUD/mcl_experience/bottle.lua @@ -0,0 +1,63 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_entity("mcl_experience:bottle",{ + textures = {"mcl_experience_bottle.png"}, + hp_max = 1, + visual_size = {x = 0.35, y = 0.35}, + collisionbox = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, + pointable = false, + on_step = function(self, dtime) + local pos = self.object:get_pos() + local node = minetest.get_node(pos) + local n = node.name + if n ~= "air" and n ~= "mcl_portals:portal" and n ~= "mcl_portals:portal_end" and minetest.get_item_group(n, "liquid") == 0 then + minetest.sound_play("mcl_potions_breaking_glass", {pos = pos, max_hear_distance = 16, gain = 1}) + mcl_experience.throw_xp(pos, math.random(3, 11)) + minetest.add_particlespawner({ + amount = 50, + time = 0.1, + minpos = vector.add(pos, vector.new(-0.1, 0.5, -0.1)), + maxpos = vector.add(pos, vector.new( 0.1, 0.6, 0.1)), + minvel = vector.new(-2, 0, -2), + maxvel = vector.new( 2, 2, 2), + minacc = vector.new(0, 0, 0), + maxacc = vector.new(0, 0, 0), + minexptime = 0.5, + maxexptime = 1.25, + minsize = 1, + maxsize = 2, + collisiondetection = true, + vertical = false, + texture = "mcl_particles_effect.png^[colorize:blue:127", + }) + self.object:remove() + end + end, +}) + +local function throw_xp_bottle(pos, dir, velocity) + minetest.sound_play("mcl_throwing_throw", {pos = pos, gain = 0.4, max_hear_distance = 16}, true) + local obj = minetest.add_entity(pos, "mcl_experience:bottle") + obj:set_velocity(vector.multiply(dir, velocity)) + local acceleration = vector.multiply(dir, -3) + acceleration.y = -9.81 + obj:set_acceleration(acceleration) +end + +minetest.register_craftitem("mcl_experience:bottle", { + description = "Bottle o' Enchanting", + inventory_image = "mcl_experience_bottle.png", + wield_image = "mcl_experience_bottle.png", + stack_max = 64, + on_use = function(itemstack, placer, pointed_thing) + throw_xp_bottle(vector.add(placer:get_pos(), vector.new(0, 1.5, 0)), placer:get_look_dir(), 10) + if not minetest.is_creative_enabled(placer:get_player_name()) then + itemstack:take_item() + end + return itemstack + end, + _on_dispense = function(_, pos, _, _, dir) + throw_xp_bottle(vector.add(pos, vector.multiply(dir, 0.51)), dir, 10) + end +}) + diff --git a/mods/HUD/mcl_experience/command.lua b/mods/HUD/mcl_experience/command.lua new file mode 100644 index 000000000..040031b5a --- /dev/null +++ b/mods/HUD/mcl_experience/command.lua @@ -0,0 +1,39 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_chatcommand("xp", { + params = S("[[] ]"), + description = S("Gives a player some XP"), + privs = {server=true}, + func = function(name, params) + local player, xp = nil, 1000 + local P, i = {}, 0 + for str in string.gmatch(params, "([^ ]+)") do + i = i + 1 + P[i] = str + end + if i > 2 then + return false, S("Error: Too many parameters!") + end + if i > 0 then + xp = tonumber(P[i]) + end + if i < 2 then + player = minetest.get_player_by_name(name) + end + if i == 2 then + player = minetest.get_player_by_name(P[1]) + end + + if not xp then + return false, S("Error: Incorrect value of XP") + end + + if not player then + return false, S("Error: Player not found") + end + + mcl_experience.add_xp(player, xp) + + return true, S("Added @1 XP to @2, total: @3, experience level: @4", tostring(xp), player:get_player_name(), tostring(mcl_experience.get_xp(player)), tostring(mcl_experience.get_level(player))) + end, +}) diff --git a/mods/HUD/mcl_experience/init.lua b/mods/HUD/mcl_experience/init.lua index e514ffc19..aea805fa2 100644 --- a/mods/HUD/mcl_experience/init.lua +++ b/mods/HUD/mcl_experience/init.lua @@ -1,641 +1,227 @@ -local S = minetest.get_translator(minetest.get_current_modname()) - -mcl_experience = {} - -local vector = vector -local math = math -local string = string - -local pool = {} -local registered_nodes -local max_xp = 2^31-1 -local max_orb_age = 300 -- seconds - -local gravity = {x = 0, y = -((tonumber(minetest.settings:get("movement_gravity"))) or 9.81), z = 0} -local size_min, size_max = 20, 59 -- percents -local delta_size = size_max - size_min -local size_to_xp = { - {-32768, 2}, -- 1 - { 3, 6}, -- 2 - { 7, 16}, -- 3 - { 17, 36}, -- 4 - { 37, 72}, -- 5 - { 73, 148}, -- 6 - { 149, 306}, -- 7 - { 307, 616}, -- 8 - { 617, 1236}, -- 9 - { 1237, 2476}, --10 - { 2477, 32767} --11 +mcl_experience = { + on_add_xp = {}, } -local function xp_to_size(xp) - local i, l = 1, #size_to_xp - while (xp > size_to_xp[i][1]) and (i < l) do - i = i + 1 - end - return ((i-1) / (l-1) * delta_size + size_min)/100 -end +local modpath = minetest.get_modpath(minetest.get_current_modname()) -minetest.register_on_mods_loaded(function() - registered_nodes = minetest.registered_nodes -end) +dofile(modpath .. "/command.lua") +dofile(modpath .. "/orb.lua") +dofile(modpath .. "/bottle.lua") -local function load_data(player) - local name = player:get_player_name() - pool[name] = {} - local temp_pool = pool[name] - local meta = player:get_meta() - temp_pool.xp = meta:get_int("xp") or 0 - temp_pool.level = mcl_experience.xp_to_level(temp_pool.xp) - temp_pool.bar, temp_pool.bar_step, temp_pool.xp_next_level = mcl_experience.xp_to_bar(temp_pool.xp, temp_pool.level) - temp_pool.last_time= minetest.get_us_time()/1000000 -end +-- local storage --- saves data to be utilized on next login -local function save_data(player) - local name = player:get_player_name() - local temp_pool = pool[name] - local meta = player:get_meta() - meta:set_int("xp", temp_pool.xp) - pool[name] = nil -end +local hud_bars = {} +local hud_levels = {} +local caches = {} -local player_huds = {} -- the list of players hud lists (3d array) -hud_manager = {} -- hud manager class +-- helpers --- terminate the player's list on leave -minetest.register_on_leaveplayer(function(player) - local name = player:get_player_name() - player_huds[name] = nil -end) - --- create instance of new hud -function hud_manager.add_hud(player,hud_name,def) - local name = player:get_player_name() - if minetest.is_creative_enabled(name) then - return - end - local local_hud = player:hud_add({ - hud_elem_type = def.hud_elem_type, - position = def.position, - text = def.text, - text2 = def.text2, - number = def.number, - item = def.item, - direction = def.direction, - size = def.size, - offset = def.offset, - z_index = def.z_index, - alignment = def.alignment, - scale = def.scale, - }) - -- create new 3d array here - -- depends.txt is not needed - -- with it here - if not player_huds[name] then - player_huds[name] = {} - end - - player_huds[name][hud_name] = local_hud -end - --- delete instance of hud -function hud_manager.remove_hud(player,hud_name) - local name = player:get_player_name() - if player_huds[name] and player_huds[name][hud_name] then - player:hud_remove(player_huds[name][hud_name]) - player_huds[name][hud_name] = nil - end -end - --- change element of hud -function hud_manager.change_hud(data) - local name = data.player:get_player_name() - if player_huds[name] and player_huds[name][data.hud_name] then - data.player:hud_change(player_huds[name][data.hud_name], data.element, data.data) - end -end - --- gets if hud exists -function hud_manager.hud_exists(player,hud_name) - local name = player:get_player_name() - if player_huds[name] and player_huds[name][hud_name] then - return true - else - return false - end -end -------------------- - --- saves specific users data for when they relog -minetest.register_on_leaveplayer(function(player) - save_data(player) -end) - --- is used for shutdowns to save all data -local function save_all() - for name,_ in pairs(pool) do - local player = minetest.get_player_by_name(name) - if player then - save_data(player) - end - end -end - --- save all data to mod storage on shutdown -minetest.register_on_shutdown(function() - save_all() -end) - - -function mcl_experience.get_player_xp_level(player) - local name = player:get_player_name() - return pool[name].level -end - -function mcl_experience.set_player_xp_level(player,level) - local name = player:get_player_name() - if level == pool[name].level then - return - end - pool[name].level = level - pool[name].xp, pool[name].bar_step, pool[name].xp_next_level = mcl_experience.bar_to_xp(pool[name].bar, level) - hud_manager.change_hud({player = player, hud_name = "xp_level", element = "text", data = tostring(level)}) - -- we may don't update the bar -end - -local name -local temp_pool -minetest.register_on_joinplayer(function(player) - - load_data(player) - - name = player:get_player_name() - temp_pool = pool[name] - - hud_manager.add_hud(player,"experience_bar", - { - hud_elem_type = "image", - name = "experience bar", - text = "experience_bar_background.png^[lowpart:" .. math.floor(temp_pool.bar / 36 * 100) .. ":experience_bar.png^[transformR270", - position = {x=0.5, y=1}, - offset = {x = (-9 * 28) - 3, y = -(48 + 24 + 16 - 5)}, - scale = {x = 2.8, y = 3.0}, - alignment = { x = 1, y = 1 }, - z_index = 11, - }) - - hud_manager.add_hud(player,"xp_level", - { - hud_elem_type = "text", position = {x=0.5, y=1}, - name = "xp_level", text = tostring(temp_pool.level), - number = 0x80FF20, - offset = {x = 0, y = -(48 + 24 + 24)}, - z_index = 12, - }) -end) - -function mcl_experience.xp_to_level(xp) +local function xp_to_level(xp) local xp = xp or 0 local a, b, c, D + if xp > 1507 then - a, b, c = 4.5, -162.5, 2220-xp + a, b, c = 4.5, -162.5, 2220 - xp elseif xp > 352 then - a, b, c = 2.5, -40.5, 360-xp + a, b, c = 2.5, -40.5, 360 - xp else a, b, c = 1, 6, -xp end - D = b*b-4*a*c + + D = b * b - 4 * a * c + if D == 0 then - return math.floor(-b/2/a) - elseif D > 0 then - local v1, v2 = -b/2/a, math.sqrt(D)/2/a - return math.floor((math.max(v1-v2, v1+v2))) + return math.floor(-b / 2 / a) + elseif D > 0 then + local v1, v2 = -b / 2 / a, math.sqrt(D) / 2 / a + return math.floor(math.max(v1 - v2, v1 + v2)) end + return 0 end -function mcl_experience.level_to_xp(level) - if (level >= 1 and level <= 16) then +local function level_to_xp(level) + if level >= 1 and level <= 16 then return math.floor(math.pow(level, 2) + 6 * level) - elseif (level >= 17 and level <= 31) then + elseif level >= 17 and level <= 31 then return math.floor(2.5 * math.pow(level, 2) - 40.5 * level + 360) elseif level >= 32 then - return math.floor(4.5 * math.pow(level, 2) - 162.5 * level + 2220); + return math.floor(4.5 * math.pow(level, 2) - 162.5 * level + 2220) end + return 0 end -function mcl_experience.xp_to_bar(xp, level) - local level = level or mcl_experience.xp_to_level(xp) - local xp_this_level = mcl_experience.level_to_xp(level) - local xp_next_level = mcl_experience.level_to_xp(level+1) - local bar_step = 36 / (xp_next_level-xp_this_level) - local bar = (xp-xp_this_level) * bar_step - return bar, bar_step, xp_next_level +local function calculate_bounds(level) + return level_to_xp(level), level_to_xp(level + 1) end -function mcl_experience.bar_to_xp(bar, level) - local xp_this_level = mcl_experience.level_to_xp(level) - local xp_next_level = mcl_experience.level_to_xp(level+1) - local bar_step = 36 / (xp_next_level-xp_this_level) - local xp = xp_this_level + math.floor(bar/36*(xp_next_level-xp_this_level)) - return xp, bar_step, xp_next_level +local function xp_to_bar(xp, level) + local xp_min, xp_max = calculate_bounds(level) + + return (xp - xp_min) / (xp_max - xp_min) end -function mcl_experience.add_experience(player, experience) - local name = player:get_player_name() - local temp_pool = pool[name] +local function bar_to_xp(bar, level) + local xp_min, xp_max = calculate_bounds(level) - local inv = player:get_inventory() - local candidates = { - {list = "main", index = player:get_wield_index()}, - {list = "armor", index = 2}, - {list = "armor", index = 3}, - {list = "armor", index = 4}, - {list = "armor", index = 5}, - } - local final_candidates = {} - for _, can in ipairs(candidates) do - local stack = inv:get_stack(can.list, can.index) - local wear = stack:get_wear() - if mcl_enchanting.has_enchantment(stack, "mending") and wear > 0 then - can.stack = stack - can.wear = wear - table.insert(final_candidates, can) - end - end - if #final_candidates > 0 then - local can = final_candidates[math.random(#final_candidates)] - local stack, list, index, wear = can.stack, can.list, can.index, can.wear - local uses = mcl_util.calculate_durability(stack) - local multiplier = 2 * 65535 / uses - local repair = experience * multiplier - local new_wear = wear - repair - if new_wear < 0 then - experience = math.floor(-new_wear / multiplier + 0.5) - new_wear = 0 - else - experience = 0 - end - stack:set_wear(math.floor(new_wear)) - inv:set_stack(list, index, stack) - end + return xp_min + bar * (xp_max - xp_min) +end - local old_bar, old_xp, old_level = temp_pool.bar, temp_pool.xp, temp_pool.level - temp_pool.xp = math.min(math.max(temp_pool.xp + experience, 0), max_xp) +local function get_time() + return minetest.get_us_time() / 1000000 +end - if (temp_pool.xp < temp_pool.xp_next_level) and (temp_pool.xp >= old_xp) then - temp_pool.bar = temp_pool.bar + temp_pool.bar_step * experience - else - temp_pool.level = mcl_experience.xp_to_level(temp_pool.xp) - temp_pool.bar, temp_pool.bar_step, temp_pool.xp_next_level = mcl_experience.xp_to_bar(temp_pool.xp, temp_pool.level) - end +-- api - if old_bar ~= temp_pool.bar then - hud_manager.change_hud({player = player, hud_name = "experience_bar", element = "text", data = "experience_bar_background.png^[lowpart:" .. math.floor(temp_pool.bar / 36 * 100) .. ":experience_bar.png^[transformR270",}) - end +function mcl_experience.get_level(player) + return caches[player].level +end - if experience > 0 and minetest.get_us_time()/1000000 - temp_pool.last_time > 0.01 then - if old_level ~= temp_pool.level then - minetest.sound_play("level_up",{gain=0.2,to_player = name}) - temp_pool.last_time = minetest.get_us_time()/1000000 + 0.2 - else - minetest.sound_play("experience",{gain=0.1,to_player = name,pitch=math.random(75,99)/100}) - temp_pool.last_time = minetest.get_us_time()/1000000 - end - end +function mcl_experience.set_level(player, level) + local cache = caches[player] - if old_level ~= temp_pool.level then - hud_manager.change_hud({player = player, hud_name = "xp_level", element = "text", data = tostring(temp_pool.level)}) + if level ~= cache.level then + mcl_experience.set_xp(player, math.floor(bar_to_xp(xp_to_bar(mcl_experience.get_xp(player), cache.level), level))) end end ---reset player level -local name -local temp_pool -local xp_amount -minetest.register_on_dieplayer(function(player) - if minetest.settings:get_bool("mcl_keepInventory", false) then - return - end +function mcl_experience.get_xp(player) + return player:get_meta():get_int("xp") +end - name = player:get_player_name() - temp_pool = pool[name] - xp_amount = temp_pool.xp +function mcl_experience.set_xp(player, xp) + player:get_meta():set_int("xp", xp) - temp_pool.xp = 0 - temp_pool.level = 0 - temp_pool.bar, temp_pool.bar_step, temp_pool.xp_next_level = mcl_experience.xp_to_bar(temp_pool.xp, temp_pool.level) + mcl_experience.update(player) +end - hud_manager.change_hud({player = player, hud_name = "xp_level", element = "text", data = tostring(temp_pool.level)}) - hud_manager.change_hud({player = player, hud_name = "experience_bar", element = "text", data = "experience_bar_background.png^[lowpart:" .. math.floor(temp_pool.bar / 36 * 100) .. ":experience_bar.png^[transformR270",}) +function mcl_experience.add_xp(player, xp) + for _, cb in ipairs(mcl_experience.on_add_xp) do + xp = cb.func(player, xp) or xp - mcl_experience.throw_experience(player:get_pos(), xp_amount) -end) - -local collector, pos, pos2 -local direction, distance, player_velocity, goal -local currentvel, acceleration, multiplier, velocity -local node, vel, def -local is_moving, is_slippery, slippery, slip_factor -local size -local function xp_step(self, dtime) - --if item set to be collected then only execute go to player - if self.collected == true then - if not self.collector then - self.collected = false - return - end - collector = minetest.get_player_by_name(self.collector) - if collector and collector:get_hp() > 0 and vector.distance(self.object:get_pos(),collector:get_pos()) < 7.25 then - self.object:set_acceleration(vector.new(0,0,0)) - self.disable_physics(self) - --get the variables - pos = self.object:get_pos() - pos2 = collector:get_pos() - - player_velocity = collector:get_velocity() or collector:get_player_velocity() - - pos2.y = pos2.y + 0.8 - - direction = vector.direction(pos,pos2) - distance = vector.distance(pos2,pos) - multiplier = distance - if multiplier < 1 then - multiplier = 1 - end - goal = vector.multiply(direction,multiplier) - currentvel = self.object:get_velocity() - - if distance > 1 then - multiplier = 20 - distance - velocity = vector.multiply(direction,multiplier) - goal = velocity - acceleration = vector.new(goal.x-currentvel.x,goal.y-currentvel.y,goal.z-currentvel.z) - self.object:add_velocity(vector.add(acceleration,player_velocity)) - elseif distance < 0.8 then - mcl_experience.add_experience(collector, self._xp) - self.object:remove() - end - return - else - self.collector = nil - self.enable_physics(self) + if xp == 0 then + break end end + local cache = caches[player] + local old_level = cache.level - self.age = self.age + dtime - if self.age > max_orb_age then - self.object:remove() - return - end + mcl_experience.set_xp(player, mcl_experience.get_xp(player) + xp) - pos = self.object:get_pos() + local current_time = get_time() - if pos then - node = minetest.get_node_or_nil({ - x = pos.x, - y = pos.y -0.25, - z = pos.z - }) - else - return - end + if current_time - cache.last_time > 0.01 then + local name = player:get_player_name() - -- Remove nodes in 'ignore' - if node and node.name == "ignore" then - self.object:remove() - return - end - - if not self.physical_state then - return -- Don't do anything - end - - -- Slide on slippery nodes - vel = self.object:get_velocity() - def = node and registered_nodes[node.name] - is_moving = (def and not def.walkable) or - vel.x ~= 0 or vel.y ~= 0 or vel.z ~= 0 - is_slippery = false - - if def and def.walkable then - slippery = minetest.get_item_group(node.name, "slippery") - is_slippery = slippery ~= 0 - if is_slippery and (math.abs(vel.x) > 0.2 or math.abs(vel.z) > 0.2) then - -- Horizontal deceleration - slip_factor = 4.0 / (slippery + 4) - self.object:set_acceleration({ - x = -vel.x * slip_factor, - y = 0, - z = -vel.z * slip_factor + if old_level == cache.level then + minetest.sound_play("mcl_experience", { + to_player = name, + gain = 0.1, + pitch = math.random(75, 99) / 100, }) - elseif vel.y == 0 then - is_moving = false + + cache.last_time = current_time + else + minetest.sound_play("mcl_experience_level_up", { + to_player = name, + gain = 0.2, + }) + + cache.last_time = current_time + 0.2 end end - - if self.moving_state == is_moving and self.slippery_state == is_slippery then - -- Do not update anything until the moving state changes - return - end - - self.moving_state = is_moving - self.slippery_state = is_slippery - - if is_moving then - self.object:set_acceleration(gravity) - else - self.object:set_acceleration({x = 0, y = 0, z = 0}) - self.object:set_velocity({x = 0, y = 0, z = 0}) - end end -minetest.register_entity("mcl_experience:orb", { - initial_properties = { - hp_max = 1, - physical = true, - collide_with_objects = false, - collisionbox = {-0.2, -0.2, -0.2, 0.2, 0.2, 0.2}, - visual = "sprite", - visual_size = {x = 0.4, y = 0.4}, - textures = {name="experience_orb.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}}, - spritediv = {x = 1, y = 14}, - initial_sprite_basepos = {x = 0, y = 0}, - is_visible = true, - pointable = false, - static_save = false, - }, - moving_state = true, - slippery_state = false, - physical_state = true, - -- Item expiry - age = 0, - -- Pushing item out of solid nodes - force_out = nil, - force_out_start = nil, - --Collection Variables - collectable = false, - try_timer = 0, - collected = false, - delete_timer = 0, - radius = 4, - - - on_activate = function(self, staticdata, dtime_s) - self.object:set_velocity(vector.new( - math.random(-2,2)*math.random(), - math.random(2,5), - math.random(-2,2)*math.random() - )) - self.object:set_armor_groups({immortal = 1}) - self.object:set_velocity({x = 0, y = 2, z = 0}) - self.object:set_acceleration(gravity) - local xp = tonumber(staticdata) - self._xp = xp - size = xp_to_size(xp) - self.object:set_properties({ - visual_size = {x = size, y = size}, - glow = 14, - }) - self.object:set_sprite({x=1,y=math.random(1,14)}, 14, 0.05, false) - end, - - enable_physics = function(self) - if not self.physical_state then - self.physical_state = true - self.object:set_properties({physical = true}) - self.object:set_velocity({x=0, y=0, z=0}) - self.object:set_acceleration(gravity) - end - end, - - disable_physics = function(self) - if self.physical_state then - self.physical_state = false - self.object:set_properties({physical = false}) - self.object:set_velocity({x=0, y=0, z=0}) - self.object:set_acceleration({x=0, y=0, z=0}) - end - end, - on_step = function(self, dtime) - xp_step(self, dtime) - end, -}) - -minetest.register_chatcommand("xp", { - params = S("[[] ]"), - description = S("Gives a player some XP"), - privs = {server=true}, - func = function(name, params) - local player, xp = nil, 1000 - local P, i = {}, 0 - for str in string.gmatch(params, "([^ ]+)") do - i = i + 1 - P[i] = str - end - if i > 2 then - return false, S("Error: Too many parameters!") - end - if i > 0 then - xp = tonumber(P[i]) - end - if i < 2 then - player = minetest.get_player_by_name(name) - end - if i == 2 then - player = minetest.get_player_by_name(P[1]) - end - if not xp then - return false, S("Error: Incorrect value of XP") - end - if not player then - return false, S("Error: Player not found") - end - mcl_experience.add_experience(player, xp) - local playername = player:get_player_name() - minetest.chat_send_player(name, S("Added @1 XP to @2, total: @3, experience level: @4", tostring(xp), playername, tostring(pool[playername].xp), tostring(pool[playername].level))) - end, -}) - -function mcl_experience.throw_experience(pos, amount) +function mcl_experience.throw_xp(pos, total_xp) local i, j = 0, 0 - local obj, xp - while i < amount and j < 100 do - xp = math.min(math.random(1, math.min(32767, amount-math.floor(i/2))), amount-i) - obj = minetest.add_entity(pos, "mcl_experience:orb", tostring(xp)) + + while i < total_xp and j < 100 do + local xp = math.min(math.random(1, math.min(32767, total_xp - math.floor(i / 2))), total_xp - i) + local obj = minetest.add_entity(pos, "mcl_experience:orb", tostring(xp)) + if not obj then return false end - obj:set_velocity({ - x=math.random(-2,2)*math.random(), - y=math.random(2,5), - z=math.random(-2,2)*math.random() - }) + + obj:set_velocity(vector.new( + math.random(-2, 2) * math.random(), + math.random( 2, 5), + math.random(-2, 2) * math.random() + )) + i = i + xp j = j + 1 end end -minetest.register_entity("mcl_experience:bottle",{ - textures = {"mcl_experience_bottle.png"}, - hp_max = 1, - visual_size = {x = 0.35, y = 0.35}, - collisionbox = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, - pointable = false, - on_step = function(self, dtime) - local pos = self.object:get_pos() - local node = minetest.get_node(pos) - local n = node.name - if n ~= "air" and n ~= "mcl_portals:portal" and n ~= "mcl_portals:portal_end" and minetest.get_item_group(n, "liquid") == 0 then - minetest.sound_play("mcl_potions_breaking_glass", {pos = pos, max_hear_distance = 16, gain = 1}) - mcl_experience.throw_experience(pos, math.random(3, 11)) - minetest.add_particlespawner({ - amount = 50, - time = 0.1, - minpos = vector.add(pos, vector.new(-0.1, 0.5, -0.1)), - maxpos = vector.add(pos, vector.new( 0.1, 0.6, 0.1)), - minvel = vector.new(-2, 0, -2), - maxvel = vector.new( 2, 2, 2), - minacc = vector.new(0, 0, 0), - maxacc = vector.new(0, 0, 0), - minexptime = 0.5, - maxexptime = 1.25, - minsize = 1, - maxsize = 2, - collisiondetection = true, - vertical = false, - texture = "mcl_particles_effect.png^[colorize:blue:127", - }) - self.object:remove() - end - end, -}) +function mcl_experience.update(player) + local xp = mcl_experience.get_xp(player) + local cache = caches[player] -local function throw_xp_bottle(pos, dir, velocity) - minetest.sound_play("mcl_throwing_throw", {pos = pos, gain = 0.4, max_hear_distance = 16}, true) - local obj = minetest.add_entity(pos, "mcl_experience:bottle") - obj:set_velocity(vector.multiply(dir, velocity)) - local acceleration = vector.multiply(dir, -3) - acceleration.y = -9.81 - obj:set_acceleration(acceleration) + cache.level = xp_to_level(xp) + + if not minetest.is_creative_enabled(player:get_player_name()) then + player:hud_change(hud_bars[player], "text", "mcl_experience_bar_background.png^[lowpart:" + .. math.floor(math.floor(xp_to_bar(xp, cache.level) * 18) / 18 * 100) + .. ":mcl_experience_bar.png^[transformR270" + ) + + if cache.level == 0 then + player:hud_change(hud_levels[player], "text", "") + else + player:hud_change(hud_levels[player], "text", tostring(cache.level)) + end + end end -minetest.register_craftitem("mcl_experience:bottle", { - description = "Bottle o' Enchanting", - inventory_image = "mcl_experience_bottle.png", - wield_image = "mcl_experience_bottle.png", - stack_max = 64, - on_use = function(itemstack, placer, pointed_thing) - throw_xp_bottle(vector.add(placer:get_pos(), vector.new(0, 1.5, 0)), placer:get_look_dir(), 10) - if not minetest.is_creative_enabled(placer:get_player_name()) then - itemstack:take_item() - end - return itemstack - end, - _on_dispense = function(_, pos, _, _, dir) - throw_xp_bottle(vector.add(pos, vector.multiply(dir, 0.51)), dir, 10) +function mcl_experience.register_on_add_xp(func, priority) + table.insert(mcl_experience.on_add_xp, {func = func, priority = priority or 0}) +end + +-- callbacks + +minetest.register_on_joinplayer(function(player) + caches[player] = { + last_time = get_time(), + } + + if not minetest.is_creative_enabled(player:get_player_name()) then + hud_bars[player] = player:hud_add({ + hud_elem_type = "image", + position = {x = 0.5, y = 1}, + offset = {x = (-9 * 28) - 3, y = -(48 + 24 + 16 - 5)}, + scale = {x = 2.8, y = 3.0}, + alignment = {x = 1, y = 1}, + z_index = 11, + }) + + hud_levels[player] = player:hud_add({ + hud_elem_type = "text", + position = {x = 0.5, y = 1}, + number = 0x80FF20, + offset = {x = 0, y = -(48 + 24 + 24)}, + z_index = 12, + }) end -}) + + mcl_experience.update(player) +end) + +minetest.register_on_leaveplayer(function(player) + hud_bars[player] = nil + hud_levels[player] = nil + caches[player] = nil +end) + +minetest.register_on_dieplayer(function(player) + if not minetest.settings:get_bool("mcl_keepInventory", false) then + mcl_experience.throw_xp(player:get_pos(), mcl_experience.get_xp(player)) + mcl_experience.set_xp(player, 0) + end +end) + +minetest.register_on_mods_loaded(function() + table.sort(mcl_experience.on_add_xp, function(a, b) return a.priority < b.priority end) +end) diff --git a/mods/HUD/mcl_experience/orb.lua b/mods/HUD/mcl_experience/orb.lua new file mode 100644 index 000000000..9aecce00d --- /dev/null +++ b/mods/HUD/mcl_experience/orb.lua @@ -0,0 +1,220 @@ +local size_min, size_max = 20, 59 +local delta_size = size_max - size_min + +local size_to_xp = { + {-32768, 2}, -- 1 + { 3, 6}, -- 2 + { 7, 16}, -- 3 + { 17, 36}, -- 4 + { 37, 72}, -- 5 + { 73, 148}, -- 6 + { 149, 306}, -- 7 + { 307, 616}, -- 8 + { 617, 1236}, -- 9 + { 1237, 2476}, -- 10 + { 2477, 32767} -- 11 +} + +local function xp_to_size(xp) + local i, l = 1, #size_to_xp + + while xp > size_to_xp[i][1] and i < l do + i = i + 1 + end + + return ((i - 1) / (l - 1) * delta_size + size_min) / 100 +end + +local max_orb_age = 300 -- seconds +local gravity = vector.new(0, -((tonumber(minetest.settings:get("movement_gravity"))) or 9.81), 0) + +local collector, pos, pos2 +local direction, distance, player_velocity, goal +local currentvel, acceleration, multiplier, velocity +local node, vel, def +local is_moving, is_slippery, slippery, slip_factor +local size +local function xp_step(self, dtime) + --if item set to be collected then only execute go to player + if self.collected == true then + if not self.collector then + self.collected = false + return + end + collector = minetest.get_player_by_name(self.collector) + if collector and collector:get_hp() > 0 and vector.distance(self.object:get_pos(),collector:get_pos()) < 7.25 then + self.object:set_acceleration(vector.new(0,0,0)) + self.disable_physics(self) + --get the variables + pos = self.object:get_pos() + pos2 = collector:get_pos() + + player_velocity = collector:get_velocity() or collector:get_player_velocity() + + pos2.y = pos2.y + 0.8 + + direction = vector.direction(pos,pos2) + distance = vector.distance(pos2,pos) + multiplier = distance + if multiplier < 1 then + multiplier = 1 + end + goal = vector.multiply(direction,multiplier) + currentvel = self.object:get_velocity() + + if distance > 1 then + multiplier = 20 - distance + velocity = vector.multiply(direction,multiplier) + goal = velocity + acceleration = vector.new(goal.x-currentvel.x,goal.y-currentvel.y,goal.z-currentvel.z) + self.object:add_velocity(vector.add(acceleration,player_velocity)) + elseif distance < 0.8 then + mcl_experience.add_xp(collector, self._xp) + self.object:remove() + end + return + else + self.collector = nil + self.enable_physics(self) + end + end + + + self.age = self.age + dtime + if self.age > max_orb_age then + self.object:remove() + return + end + + pos = self.object:get_pos() + + if pos then + node = minetest.get_node_or_nil({ + x = pos.x, + y = pos.y -0.25, + z = pos.z + }) + else + return + end + + -- Remove nodes in 'ignore' + if node and node.name == "ignore" then + self.object:remove() + return + end + + if not self.physical_state then + return -- Don't do anything + end + + -- Slide on slippery nodes + vel = self.object:get_velocity() + def = node and minetest.registered_nodes[node.name] + is_moving = (def and not def.walkable) or + vel.x ~= 0 or vel.y ~= 0 or vel.z ~= 0 + is_slippery = false + + if def and def.walkable then + slippery = minetest.get_item_group(node.name, "slippery") + is_slippery = slippery ~= 0 + if is_slippery and (math.abs(vel.x) > 0.2 or math.abs(vel.z) > 0.2) then + -- Horizontal deceleration + slip_factor = 4.0 / (slippery + 4) + self.object:set_acceleration({ + x = -vel.x * slip_factor, + y = 0, + z = -vel.z * slip_factor + }) + elseif vel.y == 0 then + is_moving = false + end + end + + if self.moving_state == is_moving and self.slippery_state == is_slippery then + -- Do not update anything until the moving state changes + return + end + + self.moving_state = is_moving + self.slippery_state = is_slippery + + if is_moving then + self.object:set_acceleration(gravity) + else + self.object:set_acceleration({x = 0, y = 0, z = 0}) + self.object:set_velocity({x = 0, y = 0, z = 0}) + end +end + +minetest.register_entity("mcl_experience:orb", { + initial_properties = { + hp_max = 1, + physical = true, + collide_with_objects = false, + collisionbox = {-0.2, -0.2, -0.2, 0.2, 0.2, 0.2}, + visual = "sprite", + visual_size = {x = 0.4, y = 0.4}, + textures = {name="mcl_experience_orb.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}}, + spritediv = {x = 1, y = 14}, + initial_sprite_basepos = {x = 0, y = 0}, + is_visible = true, + pointable = false, + static_save = false, + }, + moving_state = true, + slippery_state = false, + physical_state = true, + -- Item expiry + age = 0, + -- Pushing item out of solid nodes + force_out = nil, + force_out_start = nil, + --Collection Variables + collectable = false, + try_timer = 0, + collected = false, + delete_timer = 0, + radius = 4, + + + on_activate = function(self, staticdata, dtime_s) + self.object:set_velocity(vector.new( + math.random(-2,2)*math.random(), + math.random(2,5), + math.random(-2,2)*math.random() + )) + self.object:set_armor_groups({immortal = 1}) + self.object:set_velocity({x = 0, y = 2, z = 0}) + self.object:set_acceleration(gravity) + local xp = tonumber(staticdata) + self._xp = xp + size = xp_to_size(xp) + self.object:set_properties({ + visual_size = {x = size, y = size}, + glow = 14, + }) + self.object:set_sprite({x=1,y=math.random(1,14)}, 14, 0.05, false) + end, + + enable_physics = function(self) + if not self.physical_state then + self.physical_state = true + self.object:set_properties({physical = true}) + self.object:set_velocity({x=0, y=0, z=0}) + self.object:set_acceleration(gravity) + end + end, + + disable_physics = function(self) + if self.physical_state then + self.physical_state = false + self.object:set_properties({physical = false}) + self.object:set_velocity({x=0, y=0, z=0}) + self.object:set_acceleration({x=0, y=0, z=0}) + end + end, + on_step = function(self, dtime) + xp_step(self, dtime) + end, +}) diff --git a/mods/HUD/mcl_experience/sounds/experience.ogg b/mods/HUD/mcl_experience/sounds/mcl_experience.ogg similarity index 100% rename from mods/HUD/mcl_experience/sounds/experience.ogg rename to mods/HUD/mcl_experience/sounds/mcl_experience.ogg diff --git a/mods/HUD/mcl_experience/sounds/level_up.ogg b/mods/HUD/mcl_experience/sounds/mcl_experience_level_up.ogg similarity index 100% rename from mods/HUD/mcl_experience/sounds/level_up.ogg rename to mods/HUD/mcl_experience/sounds/mcl_experience_level_up.ogg diff --git a/mods/HUD/mcl_experience/textures/experience_bar.png b/mods/HUD/mcl_experience/textures/mcl_experience_bar.png similarity index 100% rename from mods/HUD/mcl_experience/textures/experience_bar.png rename to mods/HUD/mcl_experience/textures/mcl_experience_bar.png diff --git a/mods/HUD/mcl_experience/textures/experience_bar_background.png b/mods/HUD/mcl_experience/textures/mcl_experience_bar_background.png similarity index 100% rename from mods/HUD/mcl_experience/textures/experience_bar_background.png rename to mods/HUD/mcl_experience/textures/mcl_experience_bar_background.png diff --git a/mods/HUD/mcl_experience/textures/experience_orb.png b/mods/HUD/mcl_experience/textures/mcl_experience_orb.png similarity index 100% rename from mods/HUD/mcl_experience/textures/experience_orb.png rename to mods/HUD/mcl_experience/textures/mcl_experience_orb.png diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index ff9cccf9e..f5a9574eb 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -1,670 +1,703 @@ -local S = minetest.get_translator(minetest.get_current_modname()) -local F = minetest.formspec_escape - --- Prepare player info table -local players = {} - --- Containing all the items for each Creative Mode tab -local inventory_lists = {} - ---local mod_player = minetest.get_modpath("mcl_player") - --- Create tables -local builtin_filter_ids = {"blocks","deco","redstone","rail","food","tools","combat","mobs","brew","matr","misc","all"} -for _, f in pairs(builtin_filter_ids) do - inventory_lists[f] = {} -end - -local function replace_enchanted_books(tbl) - for k, item in ipairs(tbl) do - if item:find("mcl_enchanting:book_enchanted") == 1 then - local _, enchantment, level = item:match("(%a+) ([_%w]+) (%d+)") - level = level and tonumber(level) - if enchantment and level then - tbl[k] = mcl_enchanting.enchant(ItemStack("mcl_enchanting:book_enchanted"), enchantment, level) - end - end - end -end - ---[[ Populate all the item tables. We only do this once. Note this code must be -executed after loading all the other mods in order to work. ]] -minetest.register_on_mods_loaded(function() - for name,def in pairs(minetest.registered_items) do - if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then - local function is_redstone(def) - return def.mesecons or def.groups.mesecon or def.groups.mesecon_conductor_craftable or def.groups.mesecon_effecor_off - end - local function is_tool(def) - return def.groups.tool or (def.tool_capabilities and def.tool_capabilities.damage_groups == nil) - end - local function is_weapon_or_armor(def) - return def.groups.weapon or def.groups.weapon_ranged or def.groups.ammo or def.groups.combat_item or ((def.groups.armor_head or def.groups.armor_torso or def.groups.armor_legs or def.groups.armor_feet or def.groups.horse_armor) and def.groups.non_combat_armor ~= 1) - end - -- Is set to true if it was added in any category besides misc - local nonmisc = false - if def.groups.building_block then - table.insert(inventory_lists["blocks"], name) - nonmisc = true - end - if def.groups.deco_block then - table.insert(inventory_lists["deco"], name) - nonmisc = true - end - if is_redstone(def) then - table.insert(inventory_lists["redstone"], name) - nonmisc = true - end - if def.groups.transport then - table.insert(inventory_lists["rail"], name) - nonmisc = true - end - if (def.groups.food and not def.groups.brewitem) or def.groups.eatable then - table.insert(inventory_lists["food"], name) - nonmisc = true - end - if is_tool(def) then - table.insert(inventory_lists["tools"], name) - nonmisc = true - end - if is_weapon_or_armor(def) then - table.insert(inventory_lists["combat"], name) - nonmisc = true - end - if def.groups.spawn_egg == 1 then - table.insert(inventory_lists["mobs"], name) - nonmisc = true - end - if def.groups.brewitem then - table.insert(inventory_lists["brew"], name) - nonmisc = true - end - if def.groups.craftitem then - table.insert(inventory_lists["matr"], name) - nonmisc = true - end - -- Misc. category is for everything which is not in any other category - if not nonmisc then - table.insert(inventory_lists["misc"], name) - end - - table.insert(inventory_lists["all"], name) - end - end - - for ench, def in pairs(mcl_enchanting.enchantments) do - local str = "mcl_enchanting:book_enchanted " .. ench .. " " .. def.max_level - if def.inv_tool_tab then - table.insert(inventory_lists["tools"], str) - end - if def.inv_combat_tab then - table.insert(inventory_lists["combat"], str) - end - table.insert(inventory_lists["all"], str) - end - - for _, to_sort in pairs(inventory_lists) do - table.sort(to_sort) - replace_enchanted_books(to_sort) - end -end) - -local function filter_item(name, description, lang, filter) - local desc - if not lang then - desc = string.lower(description) - else - desc = string.lower(minetest.get_translated_string(lang, description)) - end - return string.find(name, filter) or string.find(desc, filter) -end - -local function set_inv_search(filter, player) - local playername = player:get_player_name() - local inv = minetest.get_inventory({type="detached", name="creative_"..playername}) - local creative_list = {} - local lang = minetest.get_player_information(playername).lang_code - for name,def in pairs(minetest.registered_items) do - if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then - if filter_item(string.lower(def.name), def.description, lang, filter) then - table.insert(creative_list, name) - end - end - end - for ench, def in pairs(mcl_enchanting.enchantments) do - for i = 1, def.max_level do - local stack = mcl_enchanting.enchant(ItemStack("mcl_enchanting:book_enchanted"), ench, i) - if filter_item("mcl_enchanting:book_enchanted", minetest.strip_colors(stack:get_description()), lang, filter) then - table.insert(creative_list, "mcl_enchanting:book_enchanted " .. ench .. " " .. i) - end - end - end - table.sort(creative_list) - replace_enchanted_books(creative_list) - - inv:set_size("main", #creative_list) - inv:set_list("main", creative_list) -end - -local function set_inv_page(page, player) - local playername = player:get_player_name() - local inv = minetest.get_inventory({type="detached", name="creative_"..playername}) - inv:set_size("main", 0) - local creative_list = {} - if inventory_lists[page] then -- Standard filter - creative_list = inventory_lists[page] - end - inv:set_size("main", #creative_list) - inv:set_list("main", creative_list) -end - -local function init(player) - local playername = player:get_player_name() - minetest.create_detached_inventory("creative_"..playername, { - allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) - if minetest.is_creative_enabled(playername) then - return count - else - return 0 - end - end, - allow_put = function(inv, listname, index, stack, player) - return 0 - end, - allow_take = function(inv, listname, index, stack, player) - if minetest.is_creative_enabled(player:get_player_name()) then - return -1 - else - return 0 - end - end, - }, playername) - set_inv_page("all", player) -end - --- Create the trash field -local trash = minetest.create_detached_inventory("trash", { - allow_put = function(inv, listname, index, stack, player) - if minetest.is_creative_enabled(player:get_player_name()) then - return stack:get_count() - else - return 0 - end - end, - on_put = function(inv, listname, index, stack, player) - inv:set_stack(listname, index, "") - end, -}) -trash:set_size("main", 1) - -local noffset = {} -- numeric tab offset -local offset = {} -- string offset: -local boffset = {} -- -local hoch = {} -local filtername = {} ---local bg = {} - -local noffset_x_start = -0.24 -local noffset_x = noffset_x_start -local noffset_y = -0.25 -local function next_noffset(id, right) - if right then - noffset[id] = { 8.94, noffset_y } - else - noffset[id] = { noffset_x, noffset_y } - noffset_x = noffset_x + 1.25 - end -end - --- Upper row -next_noffset("blocks") -next_noffset("deco") -next_noffset("redstone") -next_noffset("rail") -next_noffset("brew") -next_noffset("misc") -next_noffset("nix", true) - -noffset_x = noffset_x_start -noffset_y = 8.12 - --- Lower row -next_noffset("food") -next_noffset("tools") -next_noffset("combat") -next_noffset("mobs") -next_noffset("matr") -next_noffset("inv", true) - -for k,v in pairs(noffset) do - offset[k] = tostring(v[1]) .. "," .. tostring(v[2]) - boffset[k] = tostring(v[1]+0.19) .. "," .. tostring(v[2]+0.25) -end - -hoch["blocks"] = "" -hoch["deco"] = "" -hoch["redstone"] = "" -hoch["rail"] = "" -hoch["brew"] = "" -hoch["misc"] = "" -hoch["nix"] = "" -hoch["default"] = "" -hoch["food"] = "_down" -hoch["tools"] = "_down" -hoch["combat"] = "_down" -hoch["mobs"] = "_down" -hoch["matr"] = "_down" -hoch["inv"] = "_down" - -filtername["blocks"] = S("Building Blocks") -filtername["deco"] = S("Decoration Blocks") -filtername["redstone"] = S("Redstone") -filtername["rail"] = S("Transportation") -filtername["misc"] = S("Miscellaneous") -filtername["nix"] = S("Search Items") -filtername["food"] = S("Foodstuffs") -filtername["tools"] = S("Tools") -filtername["combat"] = S("Combat") -filtername["mobs"] = S("Mobs") -filtername["brew"] = S("Brewing") -filtername["matr"] = S("Materials") -filtername["inv"] = S("Survival Inventory") - ---local dark_bg = "crafting_creative_bg_dark.png" - ---[[local function reset_menu_item_bg() - bg["blocks"] = dark_bg - bg["deco"] = dark_bg - bg["redstone"] = dark_bg - bg["rail"] = dark_bg - bg["misc"] = dark_bg - bg["nix"] = dark_bg - bg["food"] = dark_bg - bg["tools"] = dark_bg - bg["combat"] = dark_bg - bg["mobs"] = dark_bg - bg["brew"] = dark_bg - bg["matr"] = dark_bg - bg["inv"] = dark_bg - bg["default"] = dark_bg -end]] - - -function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, show, page, filter) - --reset_menu_item_bg() - pagenum = math.floor(pagenum) or 1 - - local playername = player:get_player_name() - - if not inv_size then - if page == "nix" then - local inv = minetest.get_inventory({type="detached", name="creative_"..playername}) - inv_size = inv:get_size("main") - elseif page and page ~= "inv" then - inv_size = #(inventory_lists[page]) - else - inv_size = 0 - end - end - local pagemax = math.max(1, math.floor((inv_size-1) / (9*5) + 1)) - local name = "nix" - local main_list - local listrings = "listring[detached:creative_"..playername..";main]".. - "listring[current_player;main]".. - "listring[detached:trash;main]" - - if page then - name = page - if players[playername] then - players[playername].page = page - end - end - --bg[name] = "crafting_creative_bg.png" - - local inv_bg = "crafting_inventory_creative.png" - if name == "inv" then - inv_bg = "crafting_inventory_creative_survival.png" - - -- Show armor and player image - local player_preview - if minetest.settings:get_bool("3d_player_preview", true) then - player_preview = mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "") - else - player_preview = "image[3.9,1.4;1.2333,2.4666;"..mcl_player.player_get_preview(player).."]" - end - - -- Background images for armor slots (hide if occupied) - local armor_slot_imgs = "" - local inv = player:get_inventory() - if inv:get_stack("armor", 2):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[2.5,1.3;1,1;mcl_inventory_empty_armor_slot_helmet.png]" - end - if inv:get_stack("armor", 3):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[2.5,2.75;1,1;mcl_inventory_empty_armor_slot_chestplate.png]" - end - if inv:get_stack("armor", 4):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[5.5,1.3;1,1;mcl_inventory_empty_armor_slot_leggings.png]" - end - if inv:get_stack("armor", 5):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[5.5,2.75;1,1;mcl_inventory_empty_armor_slot_boots.png]" - end - - -- Survival inventory slots - main_list = "list[current_player;main;0,3.75;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,3.75,9,3).. - -- armor - "list[current_player;armor;2.5,1.3;1,1;1]".. - "list[current_player;armor;2.5,2.75;1,1;2]".. - "list[current_player;armor;5.5,1.3;1,1;3]".. - "list[current_player;armor;5.5,2.75;1,1;4]".. - mcl_formspec.get_itemslot_bg(2.5,1.3,1,1).. - mcl_formspec.get_itemslot_bg(2.5,2.75,1,1).. - mcl_formspec.get_itemslot_bg(5.5,1.3,1,1).. - mcl_formspec.get_itemslot_bg(5.5,2.75,1,1).. - armor_slot_imgs.. - -- player preview - player_preview.. - -- crafting guide button - "image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]".. - "tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]".. - -- help button - "image_button[9,2;1,1;doc_button_icon_lores.png;__mcl_doc;]".. - "tooltip[__mcl_doc;"..F(S("Help")).."]".. - -- skins button - "image_button[9,3;1,1;mcl_skins_button.png;__mcl_skins;]".. - "tooltip[__mcl_skins;"..F(S("Select player skin")).."]".. - -- achievements button - "image_button[9,4;1,1;mcl_achievements_button.png;__mcl_achievements;]".. - --"style_type[image_button;border=;bgimg=;bgimg_pressed=]".. - "tooltip[__mcl_achievements;"..F(S("Achievements")).."]" - - -- For shortcuts - listrings = listrings .. - "listring[detached:"..playername.."_armor;armor]".. - "listring[current_player;main]" - else - -- Creative inventory slots - main_list = "list[detached:creative_"..playername..";main;0,1.75;9,5;"..tostring(start_i).."]".. - mcl_formspec.get_itemslot_bg(0,1.75,9,5).. - -- Page buttons - "label[9.0,5.5;"..F(S("@1/@2", pagenum, pagemax)).."]".. - "image_button[9.0,6.0;0.7,0.7;crafting_creative_prev.png;creative_prev;]".. - "image_button[9.5,6.0;0.7,0.7;crafting_creative_next.png;creative_next;]" - end - - local tab_icon = { - blocks = "mcl_core:brick_block", - deco = "mcl_flowers:peony", - redstone = "mesecons:redstone", - rail = "mcl_minecarts:golden_rail", - misc = "mcl_buckets:bucket_lava", - nix = "mcl_compass:compass", - food = "mcl_core:apple", - tools = "mcl_core:axe_iron", - combat = "mcl_core:sword_gold", - mobs = "mobs_mc:cow", - brew = "mcl_potions:dragon_breath", - matr = "mcl_core:stick", - inv = "mcl_chests:chest", - } - local function tab(current_tab, this_tab) - local bg_img - if current_tab == this_tab then - bg_img = "crafting_creative_active"..hoch[this_tab]..".png" - else - bg_img = "crafting_creative_inactive"..hoch[this_tab]..".png" - end - return - "style["..this_tab..";border=false;bgimg=;bgimg_pressed=]".. - "item_image_button[" .. boffset[this_tab] ..";1,1;"..tab_icon[this_tab]..";"..this_tab..";]".. - "image[" .. offset[this_tab] .. ";1.5,1.44;" .. bg_img .. "]" .. - "image[" .. boffset[this_tab] .. ";1,1;crafting_creative_marker.png]" - end - local caption = "" - if name ~= "inv" and filtername[name] then - caption = "label[0,1.2;"..F(minetest.colorize("#313131", filtername[name])).."]" - end - - local formspec = "size[10,9.3]".. - "no_prepend[]".. - mcl_vars.gui_nonbg..mcl_vars.gui_bg_color.. - "background[-0.19,-0.25;10.5,9.87;"..inv_bg.."]".. - "label[-5,-5;"..name.."]".. - tab(name, "blocks") .. - "tooltip[blocks;"..F(filtername["blocks"]).."]".. - tab(name, "deco") .. - "tooltip[deco;"..F(filtername["deco"]).."]".. - tab(name, "redstone") .. - "tooltip[redstone;"..F(filtername["redstone"]).."]".. - tab(name, "rail") .. - "tooltip[rail;"..F(filtername["rail"]).."]".. - tab(name, "misc") .. - "tooltip[misc;"..F(filtername["misc"]).."]".. - tab(name, "nix") .. - "tooltip[nix;"..F(filtername["nix"]).."]".. - caption.. - "list[current_player;main;0,7;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7,9,1).. - main_list.. - tab(name, "food") .. - "tooltip[food;"..F(filtername["food"]).."]".. - tab(name, "tools") .. - "tooltip[tools;"..F(filtername["tools"]).."]".. - tab(name, "combat") .. - "tooltip[combat;"..F(filtername["combat"]).."]".. - tab(name, "mobs") .. - "tooltip[mobs;"..F(filtername["mobs"]).."]".. - tab(name, "brew") .. - "tooltip[brew;"..F(filtername["brew"]).."]".. - tab(name, "matr") .. - "tooltip[matr;"..F(filtername["matr"]).."]".. - tab(name, "inv") .. - "tooltip[inv;"..F(filtername["inv"]).."]".. - "list[detached:trash;main;9,7;1,1;]".. - mcl_formspec.get_itemslot_bg(9,7,1,1).. - "image[9,7;1,1;crafting_creative_trash.png]".. - listrings - - if name == "nix" then - if filter == nil then - filter = "" - end - formspec = formspec .. "field[5.3,1.34;4,0.75;search;;"..minetest.formspec_escape(filter).."]" - formspec = formspec .. "field_close_on_enter[search;false]" - end - if pagenum then formspec = formspec .. "p"..tostring(pagenum) end - player:set_inventory_formspec(formspec) -end - -minetest.register_on_player_receive_fields(function(player, formname, fields) - local page = nil - - if not minetest.is_creative_enabled(player:get_player_name()) then - return - end - if formname ~= "" or fields.quit == "true" then - -- No-op if formspec closed or not player inventory (formname == "") - return - end - - local name = player:get_player_name() - - if fields.blocks then - if players[name].page == "blocks" then return end - set_inv_page("blocks",player) - page = "blocks" - elseif fields.deco then - if players[name].page == "deco" then return end - set_inv_page("deco",player) - page = "deco" - elseif fields.redstone then - if players[name].page == "redstone" then return end - set_inv_page("redstone",player) - page = "redstone" - elseif fields.rail then - if players[name].page == "rail" then return end - set_inv_page("rail",player) - page = "rail" - elseif fields.misc then - if players[name].page == "misc" then return end - set_inv_page("misc",player) - page = "misc" - elseif fields.nix then - set_inv_page("all",player) - page = "nix" - elseif fields.food then - if players[name].page == "food" then return end - set_inv_page("food",player) - page = "food" - elseif fields.tools then - if players[name].page == "tools" then return end - set_inv_page("tools",player) - page = "tools" - elseif fields.combat then - if players[name].page == "combat" then return end - set_inv_page("combat",player) - page = "combat" - elseif fields.mobs then - if players[name].page == "mobs" then return end - set_inv_page("mobs",player) - page = "mobs" - elseif fields.brew then - if players[name].page == "brew" then return end - set_inv_page("brew",player) - page = "brew" - elseif fields.matr then - if players[name].page == "matr" then return end - set_inv_page("matr",player) - page = "matr" - elseif fields.inv then - if players[name].page == "inv" then return end - page = "inv" - elseif fields.search == "" and not fields.creative_next and not fields.creative_prev then - set_inv_page("all", player) - page = "nix" - elseif fields.search and not fields.creative_next and not fields.creative_prev then - set_inv_search(string.lower(fields.search),player) - page = "nix" - end - - if page then - players[name].page = page - end - if players[name].page then - page = players[name].page - end - - -- Figure out current scroll bar from formspec - --local formspec = player:get_inventory_formspec() - - local start_i = players[name].start_i - - if fields.creative_prev then - start_i = start_i - 9*5 - elseif fields.creative_next then - start_i = start_i + 9*5 - else - -- Reset scroll bar if not scrolled - start_i = 0 - end - if start_i < 0 then - start_i = start_i + 9*5 - end - - local inv_size - if page == "nix" then - local inv = minetest.get_inventory({type="detached", name="creative_"..name}) - inv_size = inv:get_size("main") - elseif page and page ~= "inv" then - inv_size = #(inventory_lists[page]) - else - inv_size = 0 - end - - if start_i >= inv_size then - start_i = start_i - 9*5 - end - if start_i < 0 or start_i >= inv_size then - start_i = 0 - end - players[name].start_i = start_i - - local filter = "" - if not fields.nix and fields.search and fields.search ~= "" then - filter = fields.search - players[name].filter = filter - end - - mcl_inventory.set_creative_formspec(player, start_i, start_i / (9*5) + 1, inv_size, false, page, filter) -end) - - -if minetest.is_creative_enabled("") then - minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) - -- Place infinite nodes, except for shulker boxes - local group = minetest.get_item_group(itemstack:get_name(), "shulker_box") - return group == 0 or group == nil - end) - - function minetest.handle_node_drops(pos, drops, digger) - if not digger or not digger:is_player() then - for _,item in ipairs(drops) do - minetest.add_item(pos, item) - end - end - local inv = digger:get_inventory() - if inv then - for _,item in ipairs(drops) do - if not inv:contains_item("main", item, true) then - inv:add_item("main", item) - end - end - end - end - - mcl_inventory.update_inventory_formspec = function(player) - local page - - local name = player:get_player_name() - - if players[name].page then - page = players[name].page - else - page = "nix" - end - - -- Figure out current scroll bar from formspec - --local formspec = player:get_inventory_formspec() - local start_i = players[name].start_i - - local inv_size - if page == "nix" then - local inv = minetest.get_inventory({type="detached", name="creative_"..name}) - inv_size = inv:get_size("main") - elseif page and page ~= "inv" then - inv_size = #(inventory_lists[page]) - else - inv_size = 0 - end - - local filter = players[name].filter - if filter == nil then - filter = "" - end - - mcl_inventory.set_creative_formspec(player, start_i, start_i / (9*5) + 1, inv_size, false, page, filter) - end -end - -minetest.register_on_joinplayer(function(player) - -- Initialize variables and inventory - local name = player:get_player_name() - if not players[name] then - players[name] = {} - players[name].page = "nix" - players[name].filter = "" - players[name].start_i = 0 - end - init(player) - mcl_inventory.set_creative_formspec(player, 0, 1, nil, false, "nix", "") -end) +local S = minetest.get_translator(minetest.get_current_modname()) +local F = minetest.formspec_escape +local C = minetest.colorize + +-- Prepare player info table +local players = {} + +-- Containing all the items for each Creative Mode tab +local inventory_lists = {} + +--local mod_player = minetest.get_modpath("mcl_player") + +-- Create tables +local builtin_filter_ids = {"blocks","deco","redstone","rail","food","tools","combat","mobs","brew","matr","misc","all"} +for _, f in pairs(builtin_filter_ids) do + inventory_lists[f] = {} +end + +local function replace_enchanted_books(tbl) + for k, item in ipairs(tbl) do + if item:find("mcl_enchanting:book_enchanted") == 1 then + local _, enchantment, level = item:match("(%a+) ([_%w]+) (%d+)") + level = level and tonumber(level) + if enchantment and level then + tbl[k] = mcl_enchanting.enchant(ItemStack("mcl_enchanting:book_enchanted"), enchantment, level) + end + end + end +end + +--[[ Populate all the item tables. We only do this once. Note this code must be +executed after loading all the other mods in order to work. ]] +minetest.register_on_mods_loaded(function() + for name,def in pairs(minetest.registered_items) do + if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then + local function is_redstone(def) + return def.mesecons or def.groups.mesecon or def.groups.mesecon_conductor_craftable or def.groups.mesecon_effecor_off + end + local function is_tool(def) + return def.groups.tool or (def.tool_capabilities and def.tool_capabilities.damage_groups == nil) + end + local function is_weapon_or_armor(def) + return def.groups.weapon or def.groups.weapon_ranged or def.groups.ammo or def.groups.combat_item or ((def.groups.armor_head or def.groups.armor_torso or def.groups.armor_legs or def.groups.armor_feet or def.groups.horse_armor) and def.groups.non_combat_armor ~= 1) + end + -- Is set to true if it was added in any category besides misc + local nonmisc = false + if def.groups.building_block then + table.insert(inventory_lists["blocks"], name) + nonmisc = true + end + if def.groups.deco_block then + table.insert(inventory_lists["deco"], name) + nonmisc = true + end + if is_redstone(def) then + table.insert(inventory_lists["redstone"], name) + nonmisc = true + end + if def.groups.transport then + table.insert(inventory_lists["rail"], name) + nonmisc = true + end + if (def.groups.food and not def.groups.brewitem) or def.groups.eatable then + table.insert(inventory_lists["food"], name) + nonmisc = true + end + if is_tool(def) then + table.insert(inventory_lists["tools"], name) + nonmisc = true + end + if is_weapon_or_armor(def) then + table.insert(inventory_lists["combat"], name) + nonmisc = true + end + if def.groups.spawn_egg == 1 then + table.insert(inventory_lists["mobs"], name) + nonmisc = true + end + if def.groups.brewitem then + table.insert(inventory_lists["brew"], name) + nonmisc = true + end + if def.groups.craftitem then + table.insert(inventory_lists["matr"], name) + nonmisc = true + end + -- Misc. category is for everything which is not in any other category + if not nonmisc then + table.insert(inventory_lists["misc"], name) + end + + table.insert(inventory_lists["all"], name) + end + end + + for ench, def in pairs(mcl_enchanting.enchantments) do + local str = "mcl_enchanting:book_enchanted " .. ench .. " " .. def.max_level + if def.inv_tool_tab then + table.insert(inventory_lists["tools"], str) + end + if def.inv_combat_tab then + table.insert(inventory_lists["combat"], str) + end + table.insert(inventory_lists["all"], str) + end + + for _, to_sort in pairs(inventory_lists) do + table.sort(to_sort) + replace_enchanted_books(to_sort) + end +end) + +local function filter_item(name, description, lang, filter) + local desc + if not lang then + desc = string.lower(description) + else + desc = string.lower(minetest.get_translated_string(lang, description)) + end + return string.find(name, filter) or string.find(desc, filter) +end + +local function set_inv_search(filter, player) + local playername = player:get_player_name() + local inv = minetest.get_inventory({type="detached", name="creative_"..playername}) + local creative_list = {} + local lang = minetest.get_player_information(playername).lang_code + for name,def in pairs(minetest.registered_items) do + if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then + if filter_item(string.lower(def.name), def.description, lang, filter) then + table.insert(creative_list, name) + end + end + end + for ench, def in pairs(mcl_enchanting.enchantments) do + for i = 1, def.max_level do + local stack = mcl_enchanting.enchant(ItemStack("mcl_enchanting:book_enchanted"), ench, i) + if filter_item("mcl_enchanting:book_enchanted", minetest.strip_colors(stack:get_description()), lang, filter) then + table.insert(creative_list, "mcl_enchanting:book_enchanted " .. ench .. " " .. i) + end + end + end + table.sort(creative_list) + replace_enchanted_books(creative_list) + + inv:set_size("main", #creative_list) + inv:set_list("main", creative_list) +end + +local function set_inv_page(page, player) + local playername = player:get_player_name() + local inv = minetest.get_inventory({type="detached", name="creative_"..playername}) + inv:set_size("main", 0) + local creative_list = {} + if inventory_lists[page] then -- Standard filter + creative_list = inventory_lists[page] + end + inv:set_size("main", #creative_list) + inv:set_list("main", creative_list) +end + +local function init(player) + local playername = player:get_player_name() + minetest.create_detached_inventory("creative_"..playername, { + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + if minetest.is_creative_enabled(playername) then + return count + else + return 0 + end + end, + allow_put = function(inv, listname, index, stack, player) + return 0 + end, + allow_take = function(inv, listname, index, stack, player) + if minetest.is_creative_enabled(player:get_player_name()) then + return -1 + else + return 0 + end + end, + }, playername) + set_inv_page("all", player) +end + +-- Create the trash field +local trash = minetest.create_detached_inventory("trash", { + allow_put = function(inv, listname, index, stack, player) + if minetest.is_creative_enabled(player:get_player_name()) then + return stack:get_count() + else + return 0 + end + end, + on_put = function(inv, listname, index, stack, player) + inv:set_stack(listname, index, "") + end, +}) +trash:set_size("main", 1) + +local noffset = {} -- numeric tab offset +local offset = {} -- string offset: +local boffset = {} -- +local hoch = {} +local filtername = {} +--local bg = {} + +local noffset_x_start = -0.24 +local noffset_x = noffset_x_start +local noffset_y = -0.25 +local function next_noffset(id, right) + if right then + noffset[id] = { 8.94, noffset_y } + else + noffset[id] = { noffset_x, noffset_y } + noffset_x = noffset_x + 1.25 + end +end + +-- Upper row +next_noffset("blocks") +next_noffset("deco") +next_noffset("redstone") +next_noffset("rail") +next_noffset("brew") +next_noffset("misc") +next_noffset("nix", true) + +noffset_x = noffset_x_start +noffset_y = 8.12 + +-- Lower row +next_noffset("food") +next_noffset("tools") +next_noffset("combat") +next_noffset("mobs") +next_noffset("matr") +next_noffset("inv", true) + +for k,v in pairs(noffset) do + offset[k] = tostring(v[1]) .. "," .. tostring(v[2]) + boffset[k] = tostring(v[1]+0.19) .. "," .. tostring(v[2]+0.25) +end + +hoch["blocks"] = "" +hoch["deco"] = "" +hoch["redstone"] = "" +hoch["rail"] = "" +hoch["brew"] = "" +hoch["misc"] = "" +hoch["nix"] = "" +hoch["default"] = "" +hoch["food"] = "_down" +hoch["tools"] = "_down" +hoch["combat"] = "_down" +hoch["mobs"] = "_down" +hoch["matr"] = "_down" +hoch["inv"] = "_down" + +filtername["blocks"] = S("Building Blocks") +filtername["deco"] = S("Decoration Blocks") +filtername["redstone"] = S("Redstone") +filtername["rail"] = S("Transportation") +filtername["misc"] = S("Miscellaneous") +filtername["nix"] = S("Search Items") +filtername["food"] = S("Foodstuffs") +filtername["tools"] = S("Tools") +filtername["combat"] = S("Combat") +filtername["mobs"] = S("Mobs") +filtername["brew"] = S("Brewing") +filtername["matr"] = S("Materials") +filtername["inv"] = S("Survival Inventory") + +--local dark_bg = "crafting_creative_bg_dark.png" + +--[[local function reset_menu_item_bg() + bg["blocks"] = dark_bg + bg["deco"] = dark_bg + bg["redstone"] = dark_bg + bg["rail"] = dark_bg + bg["misc"] = dark_bg + bg["nix"] = dark_bg + bg["food"] = dark_bg + bg["tools"] = dark_bg + bg["combat"] = dark_bg + bg["mobs"] = dark_bg + bg["brew"] = dark_bg + bg["matr"] = dark_bg + bg["inv"] = dark_bg + bg["default"] = dark_bg +end]] + +local function get_stack_size(player) + return player:get_meta():get_int("mcl_inventory:switch_stack") +end + +local function set_stack_size(player, n) + player:get_meta():set_int("mcl_inventory:switch_stack", n) +end + +minetest.register_on_joinplayer(function (player) + if get_stack_size(player) == 0 then + set_stack_size(player, 64) + end +end) + +function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, show, page, filter) + --reset_menu_item_bg() + pagenum = math.floor(pagenum) or 1 + + local playername = player:get_player_name() + + if not inv_size then + if page == "nix" then + local inv = minetest.get_inventory({type="detached", name="creative_"..playername}) + inv_size = inv:get_size("main") + elseif page and page ~= "inv" then + inv_size = #(inventory_lists[page]) + else + inv_size = 0 + end + end + local pagemax = math.max(1, math.floor((inv_size-1) / (9*5) + 1)) + local name = "nix" + local main_list + local listrings = "listring[detached:creative_"..playername..";main]".. + "listring[current_player;main]".. + "listring[detached:trash;main]" + + if page then + name = page + if players[playername] then + players[playername].page = page + end + end + --bg[name] = "crafting_creative_bg.png" + + local inv_bg = "crafting_inventory_creative.png" + if name == "inv" then + inv_bg = "crafting_inventory_creative_survival.png" + + -- Show armor and player image + local player_preview + if minetest.settings:get_bool("3d_player_preview", true) then + player_preview = mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "") + else + player_preview = "image[3.9,1.4;1.2333,2.4666;"..mcl_player.player_get_preview(player).."]" + end + + -- Background images for armor slots (hide if occupied) + local armor_slot_imgs = "" + local inv = player:get_inventory() + if inv:get_stack("armor", 2):is_empty() then + armor_slot_imgs = armor_slot_imgs .. "image[2.5,1.3;1,1;mcl_inventory_empty_armor_slot_helmet.png]" + end + if inv:get_stack("armor", 3):is_empty() then + armor_slot_imgs = armor_slot_imgs .. "image[2.5,2.75;1,1;mcl_inventory_empty_armor_slot_chestplate.png]" + end + if inv:get_stack("armor", 4):is_empty() then + armor_slot_imgs = armor_slot_imgs .. "image[5.5,1.3;1,1;mcl_inventory_empty_armor_slot_leggings.png]" + end + if inv:get_stack("armor", 5):is_empty() then + armor_slot_imgs = armor_slot_imgs .. "image[5.5,2.75;1,1;mcl_inventory_empty_armor_slot_boots.png]" + end + + local stack_size = get_stack_size(player) + + -- Survival inventory slots + main_list = "list[current_player;main;0,3.75;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,3.75,9,3).. + -- armor + "list[current_player;armor;2.5,1.3;1,1;1]".. + "list[current_player;armor;2.5,2.75;1,1;2]".. + "list[current_player;armor;5.5,1.3;1,1;3]".. + "list[current_player;armor;5.5,2.75;1,1;4]".. + mcl_formspec.get_itemslot_bg(2.5,1.3,1,1).. + mcl_formspec.get_itemslot_bg(2.5,2.75,1,1).. + mcl_formspec.get_itemslot_bg(5.5,1.3,1,1).. + mcl_formspec.get_itemslot_bg(5.5,2.75,1,1).. + armor_slot_imgs.. + -- player preview + player_preview.. + -- crafting guide button + "image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]".. + "tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]".. + -- help button + "image_button[9,2;1,1;doc_button_icon_lores.png;__mcl_doc;]".. + "tooltip[__mcl_doc;"..F(S("Help")).."]".. + -- skins button + "image_button[9,3;1,1;mcl_skins_button.png;__mcl_skins;]".. + "tooltip[__mcl_skins;"..F(S("Select player skin")).."]".. + -- achievements button + "image_button[9,4;1,1;mcl_achievements_button.png;__mcl_achievements;]".. + --"style_type[image_button;border=;bgimg=;bgimg_pressed=]".. + "tooltip[__mcl_achievements;"..F(S("Achievements")).."]".. + -- switch stack size button + "image_button[9,5;1,1;default_apple.png;__switch_stack;]".. + "label[9.4,5.4;".. F(C("#FFFFFF", stack_size ~= 1 and stack_size or "")) .."]".. + "tooltip[__switch_stack;"..F(S("Switch stack size")).."]" + + -- For shortcuts + listrings = listrings .. + "listring[detached:"..playername.."_armor;armor]".. + "listring[current_player;main]" + else + -- Creative inventory slots + main_list = "list[detached:creative_"..playername..";main;0,1.75;9,5;"..tostring(start_i).."]".. + mcl_formspec.get_itemslot_bg(0,1.75,9,5).. + -- Page buttons + "label[9.0,5.5;"..F(S("@1/@2", pagenum, pagemax)).."]".. + "image_button[9.0,6.0;0.7,0.7;crafting_creative_prev.png;creative_prev;]".. + "image_button[9.5,6.0;0.7,0.7;crafting_creative_next.png;creative_next;]" + end + + local tab_icon = { + blocks = "mcl_core:brick_block", + deco = "mcl_flowers:peony", + redstone = "mesecons:redstone", + rail = "mcl_minecarts:golden_rail", + misc = "mcl_buckets:bucket_lava", + nix = "mcl_compass:compass", + food = "mcl_core:apple", + tools = "mcl_core:axe_iron", + combat = "mcl_core:sword_gold", + mobs = "mobs_mc:cow", + brew = "mcl_potions:dragon_breath", + matr = "mcl_core:stick", + inv = "mcl_chests:chest", + } + local function tab(current_tab, this_tab) + local bg_img + if current_tab == this_tab then + bg_img = "crafting_creative_active"..hoch[this_tab]..".png" + else + bg_img = "crafting_creative_inactive"..hoch[this_tab]..".png" + end + return + "style["..this_tab..";border=false;bgimg=;bgimg_pressed=]".. + "item_image_button[" .. boffset[this_tab] ..";1,1;"..tab_icon[this_tab]..";"..this_tab..";]".. + "image[" .. offset[this_tab] .. ";1.5,1.44;" .. bg_img .. "]" + end + local caption = "" + if name ~= "inv" and filtername[name] then + caption = "label[0,1.2;"..F(minetest.colorize("#313131", filtername[name])).."]" + end + + local formspec = "size[10,9.3]".. + "no_prepend[]".. + mcl_vars.gui_nonbg..mcl_vars.gui_bg_color.. + "background[-0.19,-0.25;10.5,9.87;"..inv_bg.."]".. + "label[-5,-5;"..name.."]".. + tab(name, "blocks") .. + "tooltip[blocks;"..F(filtername["blocks"]).."]".. + tab(name, "deco") .. + "tooltip[deco;"..F(filtername["deco"]).."]".. + tab(name, "redstone") .. + "tooltip[redstone;"..F(filtername["redstone"]).."]".. + tab(name, "rail") .. + "tooltip[rail;"..F(filtername["rail"]).."]".. + tab(name, "misc") .. + "tooltip[misc;"..F(filtername["misc"]).."]".. + tab(name, "nix") .. + "tooltip[nix;"..F(filtername["nix"]).."]".. + caption.. + "list[current_player;main;0,7;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7,9,1).. + main_list.. + tab(name, "food") .. + "tooltip[food;"..F(filtername["food"]).."]".. + tab(name, "tools") .. + "tooltip[tools;"..F(filtername["tools"]).."]".. + tab(name, "combat") .. + "tooltip[combat;"..F(filtername["combat"]).."]".. + tab(name, "mobs") .. + "tooltip[mobs;"..F(filtername["mobs"]).."]".. + tab(name, "brew") .. + "tooltip[brew;"..F(filtername["brew"]).."]".. + tab(name, "matr") .. + "tooltip[matr;"..F(filtername["matr"]).."]".. + tab(name, "inv") .. + "tooltip[inv;"..F(filtername["inv"]).."]".. + "list[detached:trash;main;9,7;1,1;]".. + mcl_formspec.get_itemslot_bg(9,7,1,1).. + "image[9,7;1,1;crafting_creative_trash.png]".. + listrings + + if name == "nix" then + if filter == nil then + filter = "" + end + formspec = formspec .. "field[5.3,1.34;4,0.75;search;;"..minetest.formspec_escape(filter).."]" + formspec = formspec .. "field_close_on_enter[search;false]" + end + if pagenum then formspec = formspec .. "p"..tostring(pagenum) end + player:set_inventory_formspec(formspec) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local page = nil + + if not minetest.is_creative_enabled(player:get_player_name()) then + return + end + if formname ~= "" or fields.quit == "true" then + -- No-op if formspec closed or not player inventory (formname == "") + return + end + + local name = player:get_player_name() + + if fields.blocks then + if players[name].page == "blocks" then return end + set_inv_page("blocks",player) + page = "blocks" + elseif fields.deco then + if players[name].page == "deco" then return end + set_inv_page("deco",player) + page = "deco" + elseif fields.redstone then + if players[name].page == "redstone" then return end + set_inv_page("redstone",player) + page = "redstone" + elseif fields.rail then + if players[name].page == "rail" then return end + set_inv_page("rail",player) + page = "rail" + elseif fields.misc then + if players[name].page == "misc" then return end + set_inv_page("misc",player) + page = "misc" + elseif fields.nix then + set_inv_page("all",player) + page = "nix" + elseif fields.food then + if players[name].page == "food" then return end + set_inv_page("food",player) + page = "food" + elseif fields.tools then + if players[name].page == "tools" then return end + set_inv_page("tools",player) + page = "tools" + elseif fields.combat then + if players[name].page == "combat" then return end + set_inv_page("combat",player) + page = "combat" + elseif fields.mobs then + if players[name].page == "mobs" then return end + set_inv_page("mobs",player) + page = "mobs" + elseif fields.brew then + if players[name].page == "brew" then return end + set_inv_page("brew",player) + page = "brew" + elseif fields.matr then + if players[name].page == "matr" then return end + set_inv_page("matr",player) + page = "matr" + elseif fields.inv then + if players[name].page == "inv" then return end + page = "inv" + elseif fields.search == "" and not fields.creative_next and not fields.creative_prev then + set_inv_page("all", player) + page = "nix" + elseif fields.search and not fields.creative_next and not fields.creative_prev then + set_inv_search(string.lower(fields.search),player) + page = "nix" + elseif fields.__switch_stack then + local switch = 1 + if get_stack_size(player) == 1 then + switch = 64 + end + set_stack_size(player, switch) + end + + if page then + players[name].page = page + end + if players[name].page then + page = players[name].page + end + + -- Figure out current scroll bar from formspec + --local formspec = player:get_inventory_formspec() + + local start_i = players[name].start_i + + if fields.creative_prev then + start_i = start_i - 9*5 + elseif fields.creative_next then + start_i = start_i + 9*5 + else + -- Reset scroll bar if not scrolled + start_i = 0 + end + if start_i < 0 then + start_i = start_i + 9*5 + end + + local inv_size + if page == "nix" then + local inv = minetest.get_inventory({type="detached", name="creative_"..name}) + inv_size = inv:get_size("main") + elseif page and page ~= "inv" then + inv_size = #(inventory_lists[page]) + else + inv_size = 0 + end + + if start_i >= inv_size then + start_i = start_i - 9*5 + end + if start_i < 0 or start_i >= inv_size then + start_i = 0 + end + players[name].start_i = start_i + + local filter = "" + if not fields.nix and fields.search and fields.search ~= "" then + filter = fields.search + players[name].filter = filter + end + + mcl_inventory.set_creative_formspec(player, start_i, start_i / (9*5) + 1, inv_size, false, page, filter) +end) + + +if minetest.is_creative_enabled("") then + minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) + -- Place infinite nodes, except for shulker boxes + local group = minetest.get_item_group(itemstack:get_name(), "shulker_box") + return group == 0 or group == nil + end) + + function minetest.handle_node_drops(pos, drops, digger) + if not digger or not digger:is_player() then + for _,item in ipairs(drops) do + minetest.add_item(pos, item) + end + end + local inv = digger:get_inventory() + if inv then + for _,item in ipairs(drops) do + if not inv:contains_item("main", item, true) then + inv:add_item("main", item) + end + end + end + end + + mcl_inventory.update_inventory_formspec = function(player) + local page + + local name = player:get_player_name() + + if players[name].page then + page = players[name].page + else + page = "nix" + end + + -- Figure out current scroll bar from formspec + --local formspec = player:get_inventory_formspec() + local start_i = players[name].start_i + + local inv_size + if page == "nix" then + local inv = minetest.get_inventory({type="detached", name="creative_"..name}) + inv_size = inv:get_size("main") + elseif page and page ~= "inv" then + inv_size = #(inventory_lists[page]) + else + inv_size = 0 + end + + local filter = players[name].filter + if filter == nil then + filter = "" + end + + mcl_inventory.set_creative_formspec(player, start_i, start_i / (9*5) + 1, inv_size, false, page, filter) + end +end + +minetest.register_on_joinplayer(function(player) + -- Initialize variables and inventory + local name = player:get_player_name() + if not players[name] then + players[name] = {} + players[name].page = "nix" + players[name].filter = "" + players[name].start_i = 0 + end + init(player) + mcl_inventory.set_creative_formspec(player, 0, 1, nil, false, "nix", "") +end) + +minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) + if minetest.is_creative_enabled(player:get_player_name()) and get_stack_size(player) == 64 and action == "put" and inventory_info.listname == "main" then + local stack = inventory_info.stack + stack:set_count(stack:get_stack_max()) + player:get_inventory():set_stack("main", inventory_info.index, stack) + end +end) diff --git a/mods/HUD/mcl_title/API.md b/mods/HUD/mcl_title/API.md new file mode 100644 index 000000000..37f1c279f --- /dev/null +++ b/mods/HUD/mcl_title/API.md @@ -0,0 +1,50 @@ +# mcl_title + +Allow mods to show messages in the hud of players. + +## mcl_title.set(player, type, data) + +Show a hud message of `type` to player `player` with `data` as params. + +The element will stay for the per-player param `stay` or `data.stay` (in gametick which is 1/20 second). + +Here is a usage exemple: + +```lua +--show a title in the HUD with minecraft color "gold" +mcl_title.set(player, "title", {text="dummy text", color="gold"}) + +--show a subtitle in the HUD with hex color "#612D2D" +mcl_title.set(player, "subtitle", {text="dummy subtitle", color="#612D2D"}) + +--show an actionbar in the HUD (above the hotbar) with minecraft color "red" +mcl_title.set(player, "subtitle", {text="dummy actionbar", color="red"}) + +--show a title in the HUD with minecraft color "gold" staying for 3 seconds (override stay setting) +mcl_title.set(player, "title", {text="dummy text", color="gold", stay=60}) +``` + +## mcl_title.remove(player, type) + +Hide HUD element of type `type` for player `player`. + +## mcl_title.clear(player) + +Remove every title/subtitle/actionbar from a player. +Basicaly run `mcl_title.remove(player, type)` for every type. + +## mcl_title.params_set(player, params) + +Allow mods to set `stay` and upcomming `fadeIn`/`fadeOut` params. + +```lua +mcl_title.params_set(player, {stay = 600}) --elements with no 'data.stay' field will stay during 30s (600/20) +``` + +## mcl_title.params_get(player) + +Get `stay` and upcomming `fadeIn` and `fadeOut` params of a player as a table. + +```lua +mcl_title.params_get(player) +``` \ No newline at end of file diff --git a/mods/HUD/mcl_title/init.lua b/mods/HUD/mcl_title/init.lua new file mode 100644 index 000000000..2ea1571c8 --- /dev/null +++ b/mods/HUD/mcl_title/init.lua @@ -0,0 +1,236 @@ +--Based on: +--https://www.digminecraft.com/game_commands/title_command.php +--https://youtu.be/oVrtQRO2hpY + +--TODO: use SSCSM to reduce lag and network trafic (just send modchannel messages) +--TODO: fadeIn and fadeOut animation (needs engine change: SSCSM or native support) +--TODO: allow obfuscating text (needs engine change: SSCSM or native support) +--TODO: allow colorizing and styling of part of the text (NEEDS ENGINE CHANGE!!!) +--TODO: exactly mc like layout + +--Note that the table storing timeouts use playername as index insteed of player objects (faster) +--This is intended in order to speedup the process of removing HUD elements the the timeout is up + +local huds_idx = {} + +local hud_hide_timeouts = {} + +hud_hide_timeouts.title = {} +hud_hide_timeouts.subtitle = {} +hud_hide_timeouts.actionbar = {} + +huds_idx.title = {} +huds_idx.subtitle = {} +huds_idx.actionbar = {} + +mcl_title = {} +mcl_title.defaults = {fadein = 10, stay = 70, fadeout = 20} +mcl_title.layout = {} +mcl_title.layout.title = {position = {x = 0.5, y = 0.5}, alignment = {x = 0, y = -1.3}, size = 7} +mcl_title.layout.subtitle = {position = {x = 0.5, y = 0.5}, alignment = {x = 0, y = 1.7}, size = 4} +mcl_title.layout.actionbar = {position = {x = 0.5, y = 1}, alignment = {x = 0, y = 0}, size = 1} + +local get_color = mcl_util.get_color + +--local string = string +local pairs = pairs + +local function gametick_to_secondes(gametick) + if gametick then + return gametick / 20 + else + return nil + end +end + +--https://github.com/minetest/minetest/blob/b3b075ea02034306256b486dd45410aa765f035a/doc/lua_api.txt#L8477 +--[[ +local function style_to_bits(bold, italic) + if bold then + if italic then + return 3 + else + return 1 + end + else + if italic then + return 2 + else + return 0 + end + end +end +]] + +--PARAMS SYSTEM +local player_params = {} + +minetest.register_on_joinplayer(function(player) + --local playername = player:get_player_name() + player_params[player] = { + stay = mcl_title.defaults.stay, + --fadeIn = mcl_title.defaults.fadein, + --fadeOut = mcl_title.defaults.fadeout, + } + local _, hex_color = get_color("white") + huds_idx.title[player] = player:hud_add({ + hud_elem_type = "text", + position = mcl_title.layout.title.position, + alignment = mcl_title.layout.title.alignment, + text = "", + --style = 0, + size = {x = mcl_title.layout.title.size}, + number = hex_color, + z_index = 100, + }) + huds_idx.subtitle[player] = player:hud_add({ + hud_elem_type = "text", + position = mcl_title.layout.subtitle.position, + alignment = mcl_title.layout.subtitle.alignment, + text = "", + --style = 0, + size = {x = mcl_title.layout.subtitle.size}, + number = hex_color, + z_index = 100, + }) + huds_idx.actionbar[player] = player:hud_add({ + hud_elem_type = "text", + position = mcl_title.layout.actionbar.position, + offset = {x = 0, y = -210}, + alignment = mcl_title.layout.actionbar.alignment, + --style = 0, + text = "", + size = {x = mcl_title.layout.actionbar.size}, + number = hex_color, + z_index = 100, + }) +end) + +minetest.register_on_leaveplayer(function(player) + local playername = player:get_player_name() + + --remove player params from the list + player_params[player] = nil + + --remove HUD idx from the list (HUD elements are removed by the engine) + huds_idx.title[player] = nil + huds_idx.subtitle[player] = nil + huds_idx.actionbar[player] = nil + + --remove timers from list + hud_hide_timeouts.title[playername] = nil + hud_hide_timeouts.subtitle[playername] = nil + hud_hide_timeouts.actionbar[playername] = nil +end) + +function mcl_title.params_set(player, data) + player_params[player] = { + stay = data.stay or mcl_title.defaults.stay, + --fadeIn = data.fadeIn or mcl_title.defaults.fadein, + --fadeOut = data.fadeOut or mcl_title.defaults.fadeout, + } +end + +function mcl_title.params_get(player) + return player_params[player] +end + +--API FUNCTIONS + +function mcl_title.set(player, type, data) + if not data.color then + data.color = "white" + end + local _, hex_color = get_color(data.color) + if not hex_color then + return false + end + + player:hud_change(huds_idx[type][player], "text", data.text) + player:hud_change(huds_idx[type][player], "number", hex_color) + + --apply bold and italic + --player:hud_change(huds_idx[type][player], "style", style_to_bits(data.bold, data.italic)) + + hud_hide_timeouts[type][player:get_player_name()] = gametick_to_secondes(data.stay) or gametick_to_secondes(mcl_title.params_get(player).stay) + return true +end + +function mcl_title.remove(player, type) + if player then + player:hud_change(huds_idx[type][player], "text", "") + --player:hud_change(huds_idx[type][player], "style", 0) --no styling + end +end + +function mcl_title.clear(player) + mcl_title.remove(player, "title") + mcl_title.remove(player, "subtitle") + mcl_title.remove(player, "actionbar") +end + +minetest.register_on_dieplayer(function(player) + mcl_title.clear(player) +end) + +minetest.register_globalstep(function(dtime) + local new_timeouts = { + title = {}, + subtitle = {}, + actionbar = {}, + } + for element, content in pairs(hud_hide_timeouts) do + for name, timeout in pairs(content) do + timeout = timeout - dtime + if timeout <= 0 then + local player = minetest.get_player_by_name(name) + mcl_title.remove(player, element) + else + new_timeouts[element][name] = timeout + end + end + end + hud_hide_timeouts = new_timeouts +end) + + +--DEBUG STUFF!! +--[[ +minetest.register_chatcommand("title", { + func = function(name, param) + local player = minetest.get_player_by_name(name) + mcl_title.set(player, "title", {text=param, color="gold", bold=true, italic=true}) + end, +}) + +minetest.register_chatcommand("subtitle", { + func = function(name, param) + local player = minetest.get_player_by_name(name) + mcl_title.set(player, "subtitle", {text=param, color="gold"}) + end, +}) + +minetest.register_chatcommand("actionbar", { + func = function(name, param) + local player = minetest.get_player_by_name(name) + mcl_title.set(player, "actionbar", {text=param, color="gold"}) + end, +}) + +minetest.register_chatcommand("timeout", { + func = function(name, param) + local player = minetest.get_player_by_name(name) + mcl_title.params_set(player, {stay = 600}) + end, +}) + +minetest.register_chatcommand("all", { + func = function(name, param) + local player = minetest.get_player_by_name(name) + mcl_title.params_set(player, {stay = 600}) + mcl_title.set(player, "title", {text=param, color="gold"}) + mcl_title.set(player, "subtitle", {text=param, color="gold"}) + mcl_title.set(player, "actionbar", {text=param, color="gold"}) + end, +}) +]] \ No newline at end of file diff --git a/mods/HUD/mcl_title/mod.conf b/mods/HUD/mcl_title/mod.conf new file mode 100644 index 000000000..0f29a8118 --- /dev/null +++ b/mods/HUD/mcl_title/mod.conf @@ -0,0 +1,4 @@ +name = mcl_title +description = Add an API to add in HUD title +depends = mcl_colors +author = AFCMS \ No newline at end of file diff --git a/mods/HUD/mcl_tmp_message/API.md b/mods/HUD/mcl_tmp_message/API.md deleted file mode 100644 index 0a3fc06a3..000000000 --- a/mods/HUD/mcl_tmp_message/API.md +++ /dev/null @@ -1,7 +0,0 @@ -# mcl_temp_message - -Allow mods to show short messages in the hud of players. - -## mcl_tmp_message.message(player, message) - -Show above the hotbar a hud message to player . \ No newline at end of file diff --git a/mods/HUD/mcl_tmp_message/init.lua b/mods/HUD/mcl_tmp_message/init.lua deleted file mode 100644 index 1456cd592..000000000 --- a/mods/HUD/mcl_tmp_message/init.lua +++ /dev/null @@ -1,44 +0,0 @@ -mcl_tmp_message = {} - -local huds = {} -local hud_hide_timeouts = {} - -function mcl_tmp_message.message(player, message) - local name = player:get_player_name() - player:hud_change(huds[name], "text", message) - hud_hide_timeouts[name] = 3 -end - -minetest.register_on_joinplayer(function(player) - huds[player:get_player_name()] = player:hud_add({ - hud_elem_type = "text", - position = {x=0.5, y=1}, - offset = {x = 0, y = -210}, - alignment = {x=0, y=0}, - number = 0xFFFFFF , - text = "", - z_index = 100, - }) -end) - -minetest.register_on_leaveplayer(function(player) - local name = player:get_player_name() - huds[name] = nil - hud_hide_timeouts[name] = nil -end) - -minetest.register_globalstep(function(dtime) - local new_timeouts = {} - for name, timeout in pairs(hud_hide_timeouts) do - timeout = timeout - dtime - if timeout <= 0 then - local player = minetest.get_player_by_name(name) - if player then - player:hud_change(huds[name], "text", "") - end - else - new_timeouts[name] = timeout - end - end - hud_hide_timeouts = new_timeouts -end) diff --git a/mods/HUD/mcl_tmp_message/mod.conf b/mods/HUD/mcl_tmp_message/mod.conf deleted file mode 100644 index ad453643e..000000000 --- a/mods/HUD/mcl_tmp_message/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = mcl_tmp_message -author = Fleckenstein -description = A simple API to show a temporary message to a player diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 7c2c07393..0cd0608c4 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -82,7 +82,7 @@ local dispenserdef = { end, after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) - local meta2 = meta + local meta2 = meta:to_table() meta:from_table(oldmetadata) local inv = meta:get_inventory() for i=1, inv:get_size("main") do @@ -92,7 +92,7 @@ local dispenserdef = { minetest.add_item(p, stack) end end - meta:from_table(meta2:to_table()) + meta:from_table(meta2) end, _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, @@ -168,6 +168,56 @@ local dispenserdef = { end inv:set_stack("main", stack_id, stack) + + -- Use shears on sheeps + elseif igroups.shears then + for _, obj in pairs(minetest.get_objects_inside_radius(droppos, 1)) do + local entity = obj:get_luaentity() + if entity and not entity.child and not entity.gotten then + local entname = entity.name + local pos = obj:get_pos() + local used, texture = false + if entname == "mobs_mc:sheep" then + minetest.add_item(pos, entity.drops[2].name .. " " .. math.random(1, 3)) + if not entity.color then + entity.color = "unicolor_white" + end + entity.base_texture = { "blank.png", "mobs_mc_sheep.png" } + texture = entity.base_texture + entity.drops = { + { name = mobs_mc.items.mutton_raw, chance = 1, min = 1, max = 2 }, + } + used = true + elseif entname == "mobs_mc:snowman" then + texture = { + "mobs_mc_snowman.png", + "blank.png", "blank.png", + "blank.png", "blank.png", + "blank.png", "blank.png", + } + used = true + elseif entname == "mobs_mc:mooshroom" then + local droppos = vector.offset(pos, 0, 1.4, 0) + if entity.base_texture[1] == "mobs_mc_mooshroom_brown.png" then + minetest.add_item(droppos, mobs_mc.items.mushroom_brown .. " 5") + else + minetest.add_item(droppos, mobs_mc.items.mushroom_red .. " 5") + end + obj = mcl_util.replace_mob(obj, "mobs_mc:cow") + entity = obj:get_luaentity() + used = true + end + if used then + obj:set_properties({ textures = texture }) + entity.gotten = true + minetest.sound_play("mcl_tools_shears_cut", { pos = pos }, true) + stack:add_wear(65535 / stackdef._mcl_diggroups.shearsy.uses) + inv:set_stack("main", stack_id, stack) + break + end + end + end + -- Spawn Egg elseif igroups.spawn_egg then -- Spawn mob diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua index b5bcc1d08..abb351091 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua @@ -55,7 +55,7 @@ local dropperdef = { sounds = mcl_sounds.node_sound_stone_defaults(), after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) - local meta2 = meta + local meta2 = meta:to_table() meta:from_table(oldmetadata) local inv = meta:get_inventory() for i=1, inv:get_size("main") do @@ -65,7 +65,7 @@ local dropperdef = { minetest.add_item(p, stack) end end - meta:from_table(meta2:to_table()) + meta:from_table(meta2) end, allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) local name = player:get_player_name() diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua index 5409e6abc..bd8c0a3c3 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua @@ -53,7 +53,7 @@ local dropperdef = { sounds = mcl_sounds.node_sound_stone_defaults(), after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) - local meta2 = meta + local meta2 = meta:to_table() meta:from_table(oldmetadata) local inv = meta:get_inventory() for i=1, inv:get_size("main") do @@ -63,7 +63,7 @@ local dropperdef = { minetest.add_item(p, stack) end end - meta:from_table(meta2:to_table()) + meta:from_table(meta2) end, allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) local name = player:get_player_name() diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua index ed0e4c608..1c89293cc 100644 --- a/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/init.lua @@ -96,8 +96,9 @@ minetest.register_abm({ chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) local light = minetest.get_node_light(pos, nil) + local time = minetest.get_us_time() - if light >= 12 and minetest.get_timeofday() > 0.2 and minetest.get_timeofday() < 0.8 then + if light >= 14 and time > 6000 then minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_on", param2=node.param2}) mesecon.receptor_on(pos, mesecon.rules.pplate) end @@ -111,8 +112,9 @@ minetest.register_abm({ chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) local light = minetest.get_node_light(pos, nil) + local time = minetest.get_us_time() - if light < 12 then + if light < 14 and time > 18000 then minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_off", param2=node.param2}) mesecon.receptor_off(pos, mesecon.rules.pplate) end @@ -203,8 +205,9 @@ minetest.register_abm({ chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) local light = minetest.get_node_light(pos, nil) + local time = minetest.get_us_time() - if light < 12 then + if light < 14 and time > 18000 then minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_inverted_on", param2=node.param2}) mesecon.receptor_on(pos, mesecon.rules.pplate) end @@ -218,8 +221,9 @@ minetest.register_abm({ chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) local light = minetest.get_node_light(pos, nil) + local time = minetest.get_us_time() - if light >= 12 and minetest.get_timeofday() > 0.8 and minetest.get_timeofday() < 0.2 then + if light >= 14 and time > 6000 then minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_inverted_off", param2=node.param2}) mesecon.receptor_off(pos, mesecon.rules.pplate) end diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index fbf6fb751..d3b32b844 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -53,6 +53,15 @@ local function get_consumed_materials(tool, material) return materials_used end +local function contains(table, value) + for _, i in pairs(table) do + if i == value then + return true + end + end + return false +end + -- Given 2 input stacks, tells you which is the tool and which is the material. -- Returns ("tool", input1, input2) if input1 is tool and input2 is material. -- Returns ("material", input2, input1) if input1 is material and input2 is tool. @@ -60,9 +69,15 @@ end local function distinguish_tool_and_material(input1, input2) local def1 = input1:get_definition() local def2 = input2:get_definition() - if def1.type == "tool" and def1._repair_material then + local r1 = def1._repair_material + local r2 = def2._repair_material + if def1.type == "tool" and r1 and type(r1) == "table" and contains(r1, input2) then return "tool", input1, input2 - elseif def2.type == "tool" and def2._repair_material then + elseif def2.type == "tool" and r2 and type(r2) == "table" and contains(r2, input1) then + return "material", input2, input1 + elseif def1.type == "tool" and r1 then + return "tool", input1, input2 + elseif def2.type == "tool" and r2 then return "material", input2, input1 else return nil @@ -121,11 +136,28 @@ local function update_anvil_slots(meta) local distinguished, tool, material = distinguish_tool_and_material(input1, input2) if distinguished then local tooldef = tool:get_definition() + local repair = tooldef._repair_material local has_correct_material = false - if string.sub(tooldef._repair_material, 1, 6) == "group:" then - has_correct_material = minetest.get_item_group(material:get_name(), string.sub(tooldef._repair_material, 7)) ~= 0 - elseif material:get_name() == tooldef._repair_material then - has_correct_material = true + local material_name = material:get_name() + if type(repair) == "string" then + if string.sub(repair, 1, 6) == "group:" then + has_correct_material = minetest.get_item_group(material_name, string.sub(repair, 7)) ~= 0 + elseif material_name == repair then + has_correct_material = true + end + else + if contains(repair, material_name) then + has_correct_material = true + else + for _, r in pairs(repair) do + if string.sub(r, 1, 6) == "group:" then + if minetest.get_item_group(material_name, string.sub(r, 7)) ~= 0 then + has_correct_material = true + end + + end + end + end end if has_correct_material and tool:get_wear() > 0 then local materials_used = get_consumed_materials(tool, material) @@ -284,6 +316,12 @@ local function damage_anvil_by_falling(pos, distance) end end +local anvilbox = { + type = "fixed", + fixed = { + { -8 / 16, -8 / 16, -6 / 16, 8 / 16, 8 / 16, 6 / 16 }, + }, +} local anvildef = { groups = {pickaxey=1, falling_node=1, falling_node_damage=1, crush_after_fall=1, deco_block=1, anvil=1}, tiles = {"mcl_anvils_anvil_top_damaged_0.png^[transformR90", "mcl_anvils_anvil_base.png", "mcl_anvils_anvil_side.png"}, @@ -297,11 +335,14 @@ local anvildef = { node_box = { type = "fixed", fixed = { - {-8/16, 2/16, -5/16, 8/16, 8/16, 5/16}, -- top - {-5/16, -4/16, -2/16, 5/16, 5/16, 2/16}, -- middle - {-8/16, -8/16, -5/16, 8/16, -4/16, 5/16}, -- base + { -6 / 16, -8 / 16, -6 / 16, 6 / 16, -4 / 16, 6 / 16 }, + { -5 / 16, -4 / 16, -4 / 16, 5 / 16, -3 / 16, 4 / 16 }, + { -4 / 16, -3 / 16, -2 / 16, 4 / 16, 2 / 16, 2 / 16 }, + { -8 / 16, 2 / 16, -5 / 16, 8 / 16, 8 / 16, 5 / 16 }, } }, + selection_box = anvilbox, + collision_box = anvilbox, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 1200, _mcl_hardness = 5, diff --git a/mods/ITEMS/mcl_anvils/textures/mcl_anvils_anvil_top_damaged_0.png b/mods/ITEMS/mcl_anvils/textures/mcl_anvils_anvil_top_damaged_0.png index 84c64e915..43938aa72 100644 Binary files a/mods/ITEMS/mcl_anvils/textures/mcl_anvils_anvil_top_damaged_0.png and b/mods/ITEMS/mcl_anvils/textures/mcl_anvils_anvil_top_damaged_0.png differ diff --git a/mods/ITEMS/mcl_anvils/textures/mcl_anvils_anvil_top_damaged_1.png b/mods/ITEMS/mcl_anvils/textures/mcl_anvils_anvil_top_damaged_1.png index 61c2ac6ab..e8cfbe5b7 100644 Binary files a/mods/ITEMS/mcl_anvils/textures/mcl_anvils_anvil_top_damaged_1.png and b/mods/ITEMS/mcl_anvils/textures/mcl_anvils_anvil_top_damaged_1.png differ diff --git a/mods/ITEMS/mcl_anvils/textures/mcl_anvils_anvil_top_damaged_2.png b/mods/ITEMS/mcl_anvils/textures/mcl_anvils_anvil_top_damaged_2.png index 5f5cfbffa..096f65eac 100644 Binary files a/mods/ITEMS/mcl_anvils/textures/mcl_anvils_anvil_top_damaged_2.png and b/mods/ITEMS/mcl_anvils/textures/mcl_anvils_anvil_top_damaged_2.png differ diff --git a/mods/ITEMS/mcl_banners/patterncraft.lua b/mods/ITEMS/mcl_banners/patterncraft.lua index 79778a665..767235b1e 100644 --- a/mods/ITEMS/mcl_banners/patterncraft.lua +++ b/mods/ITEMS/mcl_banners/patterncraft.lua @@ -119,8 +119,7 @@ local patterns = { name = N("@1 Thing Charge"), type = "shapeless", - -- TODO: Replace with enchanted golden apple - { e, "mcl_core:apple_gold", d }, + { e, "mcl_core:apple_gold_enchanted", d }, }, ["rhombus"] = { name = N("@1 Lozenge"), diff --git a/mods/ITEMS/mcl_beds/README.txt b/mods/ITEMS/mcl_beds/README.txt index cda6ebd92..34b493702 100644 --- a/mods/ITEMS/mcl_beds/README.txt +++ b/mods/ITEMS/mcl_beds/README.txt @@ -12,15 +12,7 @@ Authors of media (textures) BlockMen (CC BY-SA 3.0) This mod adds a bed to Minetest which allows to skip the night. -To sleep, rightclick the bed. If playing in singleplayer mode the night gets skipped -immediately. If playing multiplayer you get shown how many other players are in bed too, -if all players are sleeping the night gets skipped. The night skip can be forced if more -than 50% of the players are lying in bed and use this option. - -Another feature is a controlled respawning. If you have slept in bed (not just lying in -it) your respawn point is set to the beds location and you will respawn there after +To sleep, rightclick the bed. +Another feature is a controlled respawning. If you have slept in bed your respawn point is set to the beds location and you will respawn there after death. -You can disable the respawn at beds by setting "enable_bed_respawn = false" in -minetest.conf. -You can disable the night skip feature by setting "enable_bed_night_skip = false" in -minetest.conf or by using the /set command in-game. +Use the mcl_playersSleepingPercentage setting to enable/disable night skipping or set a percentage of how many players need to sleep to skip the night. \ No newline at end of file diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index dc9afe2ba..b8478fc1f 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -14,39 +14,34 @@ local worlds_mod = minetest.get_modpath("mcl_worlds") local function get_look_yaw(pos) local n = minetest.get_node(pos) - if n.param2 == 1 then - return math.pi / 2, n.param2 - elseif n.param2 == 3 then - return -math.pi / 2, n.param2 - elseif n.param2 == 0 then - return math.pi, n.param2 + local param = n.param2 + if param == 1 then + return math.pi / 2, param + elseif param == 3 then + return -math.pi / 2, param + elseif param == 0 then + return math.pi, param else - return 0, n.param2 + return 0, param end end +local function players_in_bed_setting() + return tonumber(minetest.settings:get("mcl_playersSleepingPercentage")) or 100 +end + local function is_night_skip_enabled() - local enable_night_skip = minetest.settings:get_bool("enable_bed_night_skip") - if enable_night_skip == nil then - enable_night_skip = true - end - return enable_night_skip + return players_in_bed_setting() <= 100 end local function check_in_beds(players) - local in_bed = mcl_beds.player if not players then players = minetest.get_connected_players() end - - for n, player in pairs(players) do - local name = player:get_player_name() - if not in_bed[name] then - return false - end + if player_in_bed <= 0 then + return false end - - return #players > 0 + return players_in_bed_setting() <= (player_in_bed * 100) / #players end -- These monsters do not prevent sleep @@ -198,7 +193,7 @@ end local function update_formspecs(finished, ges) local ges = ges or #minetest.get_connected_players() local form_n = "size[12,5;true]" - local all_in_bed = ges == player_in_bed + local all_in_bed = players_in_bed_setting() <= (player_in_bed * 100) / ges local night_skip = is_night_skip_enabled() local button_leave = "button_exit[4,3;4,0.75;leave;"..F(S("Leave bed")).."]" local button_abort = "button_exit[4,3;4,0.75;leave;"..F(S("Abort sleep")).."]" @@ -221,7 +216,13 @@ local function update_formspecs(finished, ges) form_n = form_n .. bg_sleep form_n = form_n .. button_abort else - text = text .. "\n" .. S("You will fall asleep when all players are in bed.") + local comment = "You will fall asleep when " + if players_in_bed_setting() == 100 then + comment = S(comment .. "all players are in bed.") + else + comment = S(comment .. "@1% of all players are in bed.", players_in_bed_setting()) + end + text = text .. "\n" .. comment form_n = form_n .. bg_presleep form_n = form_n .. button_leave end @@ -330,7 +331,7 @@ function mcl_beds.on_rightclick(pos, player, is_top) message = select(2, lay_down(player, ppos, other)) end if message then - mcl_tmp_message.message(player, message) + mcl_title.set(player, "actionbar", {text=message, color="white", stay=60}) end else lay_down(player, nil, nil, false) @@ -349,7 +350,6 @@ function mcl_beds.on_rightclick(pos, player, is_top) end end - -- Callbacks minetest.register_on_joinplayer(function(player) local meta = player:get_meta() diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr index 16592115e..eb6967941 100644 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr @@ -37,5 +37,6 @@ Players in bed: @1/@2=Spieler im Bett: @1/@2 Note: Night skip is disabled.=Anmerkung: Überspringen der Nacht deaktiviert. You're sleeping.=Sie schlafen. You will fall asleep when all players are in bed.=Sie werden einschlafen, wenn alle Spieler im Bett sind. +You will fall asleep when @1% of all players are in bed.=Sie werden einschlafen, wenn @1% der Spieler im Bett sind. You're in bed.=Sie sind im Bett. Allows you to sleep=Zum Einschafen diff --git a/mods/ITEMS/mcl_beds/locale/template.txt b/mods/ITEMS/mcl_beds/locale/template.txt index 8301dfa33..5525bd91b 100644 --- a/mods/ITEMS/mcl_beds/locale/template.txt +++ b/mods/ITEMS/mcl_beds/locale/template.txt @@ -37,5 +37,6 @@ Players in bed: @1/@2= Note: Night skip is disabled.= You're sleeping.= You will fall asleep when all players are in bed.= +You will fall asleep when @1% of all players are in bed.= You're in bed.= Allows you to sleep= diff --git a/mods/ITEMS/mcl_blackstone/init.lua b/mods/ITEMS/mcl_blackstone/init.lua index badcf99e4..510726dda 100644 --- a/mods/ITEMS/mcl_blackstone/init.lua +++ b/mods/ITEMS/mcl_blackstone/init.lua @@ -96,6 +96,8 @@ minetest.register_node("mcl_blackstone:nether_gold", { _mcl_silk_touch_drop = true, _mcl_fortune_drop = mcl_core.fortune_drop_ore, }) +-- Compatibility with Nether Gold mod by NO11: +minetest.register_alias("mcl_nether_gold:nether_gold_ore", "mcl_blackstone:nether_gold") minetest.register_node("mcl_blackstone:basalt_polished", { description = S("Polished Basalt"), diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 9a22ee622..343707617 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -43,7 +43,7 @@ S("An arrow fired from a bow has a regular damage of 1-9. At full charge, there' S("Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons."), _doc_items_usagehelp = S("To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it."), inventory_image = "mcl_bows_arrow_inv.png", - groups = { ammo=1, ammo_bow=1, ammo_bow_regular=1 }, + groups = { ammo=1, ammo_bow=1, ammo_bow_regular=1, ammo_crossbow=1 }, _on_dispense = function(itemstack, dispenserpos, droppos, dropnode, dropdir) -- Shoot arrow local shootpos = vector.add(dispenserpos, vector.multiply(dropdir, 0.51)) @@ -324,7 +324,9 @@ function ARROW_ENTITY.on_step(self, dtime) end if not obj:is_player() then mcl_burning.extinguish(self.object) - self.object:remove() + if self._piercing == 0 then + self.object:remove() + end end return end diff --git a/mods/ITEMS/mcl_bows/crossbow.lua b/mods/ITEMS/mcl_bows/crossbow.lua new file mode 100644 index 000000000..5ae21a1f3 --- /dev/null +++ b/mods/ITEMS/mcl_bows/crossbow.lua @@ -0,0 +1,454 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +mcl_bows_s = {} + +-- local arrows = { +-- ["mcl_bows:arrow"] = "mcl_bows:arrow_entity", +-- } + +local GRAVITY = 9.81 +local BOW_DURABILITY = 385 + +-- Charging time in microseconds +local _BOW_CHARGE_TIME_HALF = 350000 -- bow level 1 +local _BOW_CHARGE_TIME_FULL = 900000 -- bow level 2 (full charge) + +local BOW_CHARGE_TIME_HALF = 350000 -- bow level 1 +local BOW_CHARGE_TIME_FULL = 900000 -- bow level 2 (full charge) + +-- Factor to multiply with player speed while player uses bow +-- This emulates the sneak speed. +local PLAYER_USE_CROSSBOW_SPEED = tonumber(minetest.settings:get("movement_speed_crouch")) / tonumber(minetest.settings:get("movement_speed_walk")) + +-- TODO: Use Minecraft speed (ca. 53 m/s) +-- Currently nerfed because at full speed the arrow would easily get out of the range of the loaded map. +local BOW_MAX_SPEED = 68 + +local function play_load_sound(id, pos) + minetest.sound_play("mcl_bows_crossbow_drawback_"..id, {pos=pos, max_hear_distance=12}, true) +end + +--[[ Store the charging state of each player. +keys: player name +value: +nil = not charging or player not existing +number: currently charging, the number is the time from minetest.get_us_time + in which the charging has started +]] +local bow_load = {} + +-- Another player table, this one stores the wield index of the bow being charged +local bow_index = {} + +function mcl_bows_s.shoot_arrow_crossbow(arrow_item, pos, dir, yaw, shooter, power, damage, is_critical, crossbow_stack, collectable) + local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, arrow_item.."_entity") + if power == nil then + power = BOW_MAX_SPEED --19 + end + if damage == nil then + damage = 3 + end + local knockback + if crossbow_stack then + local enchantments = mcl_enchanting.get_enchantments(crossbow_stack) + if enchantments.piercing then + obj:get_luaentity()._piercing = 1 * enchantments.piercing + else + obj:get_luaentity()._piercing = 0 + end + end + obj:set_velocity({x=dir.x*power, y=dir.y*power, z=dir.z*power}) + obj:set_acceleration({x=0, y=-GRAVITY, z=0}) + obj:set_yaw(yaw-math.pi/2) + local le = obj:get_luaentity() + le._shooter = shooter + le._source_object = shooter + le._damage = damage + le._is_critical = is_critical + le._startpos = pos + le._knockback = knockback + le._collectable = collectable + minetest.sound_play("mcl_bows_crossbow_shoot", {pos=pos, max_hear_distance=16}, true) + if shooter and shooter:is_player() then + if obj:get_luaentity().player == "" then + obj:get_luaentity().player = shooter + end + obj:get_luaentity().node = shooter:get_inventory():get_stack("main", 1):get_name() + end + return obj +end + +local function get_arrow(player) + local inv = player:get_inventory() + local arrow_stack, arrow_stack_id + for i=1, inv:get_size("main") do + local it = inv:get_stack("main", i) + if not it:is_empty() and minetest.get_item_group(it:get_name(), "ammo_crossbow") ~= 0 then + arrow_stack = it + arrow_stack_id = i + break + end + end + return arrow_stack, arrow_stack_id +end + +local function player_shoot_arrow(wielditem, player, power, damage, is_critical) + local has_multishot_enchantment = mcl_enchanting.has_enchantment(player:get_wielded_item(), "multishot") + local arrow_itemstring = wielditem:get_meta():get("arrow") + + if not arrow_itemstring then + return false + end + + local playerpos = player:get_pos() + local dir = player:get_look_dir() + local yaw = player:get_look_horizontal() + + if has_multishot_enchantment then + mcl_bows_s.shoot_arrow_crossbow(arrow_itemstring, {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, {x=dir.x, y=dir.y, z=dir.z + .2}, yaw, player, power, damage, is_critical, player:get_wielded_item(), false) + mcl_bows_s.shoot_arrow_crossbow(arrow_itemstring, {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, {x=dir.x, y=dir.y, z=dir.z - .2}, yaw, player, power, damage, is_critical, player:get_wielded_item(), false) + mcl_bows_s.shoot_arrow_crossbow(arrow_itemstring, {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, dir, yaw, player, power, damage, is_critical, player:get_wielded_item(), true) + else + mcl_bows_s.shoot_arrow_crossbow(arrow_itemstring, {x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, dir, yaw, player, power, damage, is_critical, player:get_wielded_item(), true) + end + return true +end + +-- Bow item, uncharged state +minetest.register_tool("mcl_bows:crossbow", { + description = S("Corssbow"), + _tt_help = S("Launches arrows"), + _doc_items_longdesc = S("Bows are ranged weapons to shoot arrows at your foes.").."\n".. +S("The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead."), + _doc_items_usagehelp = S("To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot."), + _doc_items_durability = BOW_DURABILITY, + inventory_image = "mcl_bows_crossbow.png", + wield_scale = mcl_vars.tool_wield_scale, + stack_max = 1, + range = 4, + -- Trick to disable digging as well + on_use = function() return end, + on_place = function(itemstack, player, pointed_thing) + if pointed_thing and pointed_thing.type == "node" then + -- Call on_rightclick if the pointed node defines it + local node = minetest.get_node(pointed_thing.under) + if player and not player:get_player_control().sneak then + if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, player, itemstack) or itemstack + end + end + end + + itemstack:get_meta():set_string("active", "true") + return itemstack + end, + on_secondary_use = function(itemstack) + itemstack:get_meta():set_string("active", "true") + return itemstack + end, + groups = {weapon=1,weapon_ranged=1,crossbow=1,enchantability=1}, + _mcl_uses = 326, +}) + +minetest.register_tool("mcl_bows:crossbow_loaded", { + description = S("Corssbow"), + _tt_help = S("Launches arrows"), + _doc_items_longdesc = S("Corssbow are ranged weapons to shoot arrows at your foes.").."\n".. +S("The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead."), + _doc_items_usagehelp = S("To use the corssbow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to load an arrow into the chamber, then to shoot press left mouse."), + _doc_items_durability = BOW_DURABILITY, + inventory_image = "mcl_bows_crossbow_3.png", + wield_scale = mcl_vars.tool_wield_scale, + stack_max = 1, + range = 4, + -- Trick to disable digging as well + on_use = function() return end, + on_place = function(itemstack, player, pointed_thing) + if pointed_thing and pointed_thing.type == "node" then + -- Call on_rightclick if the pointed node defines it + local node = minetest.get_node(pointed_thing.under) + if player and not player:get_player_control().sneak then + if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, player, itemstack) or itemstack + end + end + end + + itemstack:get_meta():set_string("active", "true") + return itemstack + end, + on_secondary_use = function(itemstack) + itemstack:get_meta():set_string("active", "true") + return itemstack + end, + groups = {weapon=1,weapon_ranged=1,crossbow=1,enchantability=1}, + _mcl_uses = 326, +}) + +-- Iterates through player inventory and resets all the bows in "charging" state back to their original stage +local function reset_bows(player) + local inv = player:get_inventory() + local list = inv:get_list("main") + for place, stack in pairs(list) do + if stack:get_name() == "mcl_bows:crossbow" or stack:get_name() == "mcl_bows:crossbow_enchanted" then + stack:get_meta():set_string("active", "") + elseif stack:get_name()=="mcl_bows:crossbow_0" or stack:get_name()=="mcl_bows:crossbow_1" or stack:get_name()=="mcl_bows:crossbow_2" then + stack:set_name("mcl_bows:crossbow") + stack:get_meta():set_string("active", "") + list[place] = stack + elseif stack:get_name()=="mcl_bows:crossbow_0_enchanted" or stack:get_name()=="mcl_bows:crossbow_1_enchanted" or stack:get_name()=="mcl_bows:crossbow_2_enchanted" then + stack:set_name("mcl_bows:crossbow_enchanted") + stack:get_meta():set_string("active", "") + list[place] = stack + end + end + inv:set_list("main", list) +end + +-- Resets the bow charging state and player speed. To be used when the player is no longer charging the bow +local function reset_bow_state(player, also_reset_bows) + bow_load[player:get_player_name()] = nil + bow_index[player:get_player_name()] = nil + if minetest.get_modpath("playerphysics") then + playerphysics.remove_physics_factor(player, "speed", "mcl_bows:use_crossbow") + end + if also_reset_bows then + reset_bows(player) + end +end + +-- Bow in charging state +for level=0, 2 do + minetest.register_tool("mcl_bows:crossbow_"..level, { + description = S("Crossbow"), + _doc_items_create_entry = false, + inventory_image = "mcl_bows_crossbow_"..level..".png", + wield_scale = mcl_vars.tool_wield_scale, + stack_max = 1, + range = 0, -- Pointing range to 0 to prevent punching with bow :D + groups = {not_in_creative_inventory=1, not_in_craft_guide=1, bow=1, enchantability=1}, + -- Trick to disable digging as well + on_use = function() return end, + on_drop = function(itemstack, dropper, pos) + reset_bow_state(dropper) + itemstack:get_meta():set_string("active", "") + if mcl_enchanting.is_enchanted(itemstack:get_name()) then + itemstack:set_name("mcl_bows:crossbow_enchanted") + else + itemstack:set_name("mcl_bows:crossbow") + end + minetest.item_drop(itemstack, dropper, pos) + itemstack:take_item() + return itemstack + end, + -- Prevent accidental interaction with itemframes and other nodes + on_place = function(itemstack) + return itemstack + end, + _mcl_uses = 385, + }) +end + + +controls.register_on_release(function(player, key, time) + if key~="RMB" then return end + --local inv = minetest.get_inventory({type="player", name=player:get_player_name()}) + local wielditem = player:get_wielded_item() + if wielditem:get_name()=="mcl_bows:crossbow_2" and get_arrow(player) or wielditem:get_name()=="mcl_bows:crossbow_2" and minetest.is_creative_enabled(player:get_player_name()) or wielditem:get_name()=="mcl_bows:crossbow_2_enchanted" and get_arrow(player) or wielditem:get_name()=="mcl_bows:crossbow_2_enchanted" and minetest.is_creative_enabled(player:get_player_name()) then + local arrow_stack, arrow_stack_id = get_arrow(player) + local arrow_itemstring + + if minetest.is_creative_enabled(player:get_player_name()) then + if arrow_stack then + arrow_itemstring = arrow_stack:get_name() + else + arrow_itemstring = "mcl_bows:arrow" + end + else + arrow_itemstring = arrow_stack:get_name() + arrow_stack:take_item() + player:get_inventory():set_stack("main", arrow_stack_id, arrow_stack) + end + + wielditem:get_meta():set_string("arrow", arrow_itemstring) + + if wielditem:get_name()=="mcl_bows:crossbow_2" then + wielditem:set_name("mcl_bows:crossbow_loaded") + else + wielditem:set_name("mcl_bows:crossbow_loaded_enchanted") + end + player:set_wielded_item(wielditem) + minetest.sound_play("mcl_bows_crossbow_load", {pos=player:get_pos(), max_hear_distance=16}, true) + else + reset_bow_state(player, true) + end +end) + +controls.register_on_press(function(player, key, time) + if key~="LMB" then return end + local wielditem = player:get_wielded_item() + if wielditem:get_name()=="mcl_bows:crossbow_loaded" or wielditem:get_name()=="mcl_bows:crossbow_loaded_enchanted" then + local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) + local speed, damage + local p_load = bow_load[player:get_player_name()] + local charge + -- Type sanity check + if type(p_load) == "number" then + charge = minetest.get_us_time() - p_load + else + -- In case something goes wrong ... + -- Just assume minimum charge. + charge = 0 + minetest.log("warning", "[mcl_bows] Player "..player:get_player_name().." fires arrow with non-numeric bow_load!") + end + charge = math.max(math.min(charge, BOW_CHARGE_TIME_FULL), 0) + + local charge_ratio = charge / BOW_CHARGE_TIME_FULL + charge_ratio = math.max(math.min(charge_ratio, 1), 0) + + -- Calculate damage and speed + -- Fully charged + local is_critical = false + speed = BOW_MAX_SPEED + local r = math.random(1,5) + if r == 1 then + -- 20% chance for critical hit + damage = 10 + is_critical = true + else + damage = 9 + end + + local has_shot = player_shoot_arrow(wielditem, player, speed, damage, is_critical) + + if enchanted then + wielditem:set_name("mcl_bows:crossbow_enchanted") + else + wielditem:set_name("mcl_bows:crossbow") + end + + if has_shot and not minetest.is_creative_enabled(player:get_player_name()) then + local durability = BOW_DURABILITY + local unbreaking = mcl_enchanting.get_enchantment(wielditem, "unbreaking") + local multishot = mcl_enchanting.get_enchantment(wielditem, "multishot") + if unbreaking > 0 then + durability = durability * (unbreaking + 1) + end + if multishot then + durability = durability / 3 + end + wielditem:add_wear(65535/durability) + end + player:set_wielded_item(wielditem) + reset_bow_state(player, true) + end +end) + +controls.register_on_hold(function(player, key, time) + local name = player:get_player_name() + local creative = minetest.is_creative_enabled(name) + if key ~= "RMB" then + return + end + --local inv = minetest.get_inventory({type="player", name=name}) + local wielditem = player:get_wielded_item() + local enchantments = mcl_enchanting.get_enchantments(wielditem) + if enchantments.quick_charge then + BOW_CHARGE_TIME_HALF = _BOW_CHARGE_TIME_HALF - (enchantments.quick_charge * 0.13 * 1000000 * .5) + BOW_CHARGE_TIME_FULL = _BOW_CHARGE_TIME_FULL - (enchantments.quick_charge * 0.13 * 1000000) + else + BOW_CHARGE_TIME_HALF = _BOW_CHARGE_TIME_HALF + BOW_CHARGE_TIME_FULL = _BOW_CHARGE_TIME_FULL + end + + if bow_load[name] == nil and (wielditem:get_name()=="mcl_bows:crossbow" or wielditem:get_name()=="mcl_bows:crossbow_enchanted") and wielditem:get_meta():get("active") and (creative or get_arrow(player)) then + local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) + if enchanted then + wielditem:set_name("mcl_bows:crossbow_0_enchanted") + play_load_sound(0, player:get_pos()) + else + wielditem:set_name("mcl_bows:crossbow_0") + play_load_sound(0, player:get_pos()) + end + player:set_wielded_item(wielditem) + if minetest.get_modpath("playerphysics") then + -- Slow player down when using bow + playerphysics.add_physics_factor(player, "speed", "mcl_bows:use_crossbow", PLAYER_USE_CROSSBOW_SPEED) + end + bow_load[name] = minetest.get_us_time() + bow_index[name] = player:get_wield_index() + else + if player:get_wield_index() == bow_index[name] then + if type(bow_load[name]) == "number" then + if wielditem:get_name() == "mcl_bows:crossbow_0" and minetest.get_us_time() - bow_load[name] >= BOW_CHARGE_TIME_HALF then + wielditem:set_name("mcl_bows:crossbow_1") + play_load_sound(1, player:get_pos()) + elseif wielditem:get_name() == "mcl_bows:crossbow_0_enchanted" and minetest.get_us_time() - bow_load[name] >= BOW_CHARGE_TIME_HALF then + wielditem:set_name("mcl_bows:crossbow_1_enchanted") + play_load_sound(1, player:get_pos()) + elseif wielditem:get_name() == "mcl_bows:crossbow_1" and minetest.get_us_time() - bow_load[name] >= BOW_CHARGE_TIME_FULL then + wielditem:set_name("mcl_bows:crossbow_2") + play_load_sound(2, player:get_pos()) + elseif wielditem:get_name() == "mcl_bows:crossbow_1_enchanted" and minetest.get_us_time() - bow_load[name] >= BOW_CHARGE_TIME_FULL then + wielditem:set_name("mcl_bows:crossbow_2_enchanted") + play_load_sound(2, player:get_pos()) + end + else + if wielditem:get_name() == "mcl_bows:crossbow_0" or wielditem:get_name() == "mcl_bows:crossbow_1" or wielditem:get_name() == "mcl_bows:crossbow_2" then + wielditem:set_name("mcl_bows:crossbow") + play_load_sound(1, player:get_pos()) + elseif wielditem:get_name() == "mcl_bows:crossbow_0_enchanted" or wielditem:get_name() == "mcl_bows:crossbow_1_enchanted" or wielditem:get_name() == "mcl_bows:crossbow_2_enchanted" then + wielditem:set_name("mcl_bows:crossbow_enchanted") + play_load_sound(1, player:get_pos()) + end + end + player:set_wielded_item(wielditem) + else + reset_bow_state(player, true) + end + end +end) + +minetest.register_globalstep(function(dtime) + for _, player in pairs(minetest.get_connected_players()) do + local name = player:get_player_name() + local wielditem = player:get_wielded_item() + local wieldindex = player:get_wield_index() + --local controls = player:get_player_control() + if type(bow_load[name]) == "number" and ((wielditem:get_name()~="mcl_bows:crossbow_0" and wielditem:get_name()~="mcl_bows:crossbow_1" and wielditem:get_name()~="mcl_bows:crossbow_2" and wielditem:get_name()~="mcl_bows:crossbow_0_enchanted" and wielditem:get_name()~="mcl_bows:crossbow_1_enchanted" and wielditem:get_name()~="mcl_bows:crossbow_2_enchanted") or wieldindex ~= bow_index[name]) then + reset_bow_state(player, true) + end + end +end) + +minetest.register_on_joinplayer(function(player) + reset_bows(player) +end) + +minetest.register_on_leaveplayer(function(player) + reset_bow_state(player, true) +end) + +if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then + minetest.register_craft({ + output = "mcl_bows:crossbow", + recipe = { + {"mcl_core:stick", "mcl_core:iron_ingot", "mcl_core:stick"}, + {"mcl_mobitems:string", "mcl_bows:arrow", "mcl_mobitems:string"}, + {"", "mcl_core:stick", ""}, + } + }) +end + +minetest.register_craft({ + type = "fuel", + recipe = "group:bow", + burntime = 15, +}) + +-- Add entry aliases for the Help +if minetest.get_modpath("doc") then + doc.add_entry_alias("tools", "mcl_bows:crossbow", "tools", "mcl_bows:crossbow_0") + doc.add_entry_alias("tools", "mcl_bows:crossbow", "tools", "mcl_bows:crossbow_1") + doc.add_entry_alias("tools", "mcl_bows:crossbow", "tools", "mcl_bows:crossbow_2") +end diff --git a/mods/ITEMS/mcl_bows/init.lua b/mods/ITEMS/mcl_bows/init.lua index a2745d950..d5b06dac7 100644 --- a/mods/ITEMS/mcl_bows/init.lua +++ b/mods/ITEMS/mcl_bows/init.lua @@ -1,5 +1,11 @@ +--Bow dofile(minetest.get_modpath("mcl_bows") .. "/arrow.lua") dofile(minetest.get_modpath("mcl_bows") .. "/bow.lua") +dofile(minetest.get_modpath("mcl_bows") .. "/rocket.lua") +--Crossbow +dofile(minetest.get_modpath("mcl_bows") .. "/crossbow.lua") + +--Compatiblility with older MineClone worlds minetest.register_alias("mcl_throwing:bow", "mcl_bows:bow") minetest.register_alias("mcl_throwing:arrow", "mcl_bows:arrow") diff --git a/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.b3d b/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.b3d new file mode 100644 index 000000000..0a34f1eaa Binary files /dev/null and b/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.b3d differ diff --git a/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.mtl b/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.mtl new file mode 100644 index 000000000..f231bdf4c --- /dev/null +++ b/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.mtl @@ -0,0 +1,10 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl None +Ns 500 +Ka 0.8 0.8 0.8 +Kd 0.8 0.8 0.8 +Ks 0.8 0.8 0.8 +d 1 +illum 2 diff --git a/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.obj b/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.obj new file mode 100644 index 000000000..e2bd11d34 --- /dev/null +++ b/mods/ITEMS/mcl_bows/models/mcl_bows_rocket.obj @@ -0,0 +1,1016 @@ +# Blender v3.0.0 Alpha OBJ File: '' +# www.blender.org +mtllib mcl_bows_rocket.mtl +o Plane +v -1.414214 -0.063116 0.000000 +v 0.000000 -0.063116 1.414214 +v -0.000000 -0.063116 -1.414214 +v 1.414214 -0.063116 -0.000000 +v -1.414214 -0.062205 0.000000 +v 0.000000 -0.062205 1.414214 +v -0.000000 -0.062205 -1.414214 +v 1.414214 -0.062205 -0.000000 +v -1.414214 -0.060838 0.000000 +v 0.000000 -0.060838 1.414214 +v -0.000000 -0.060838 -1.414214 +v 1.414214 -0.060838 -0.000000 +v -1.414214 -0.059926 0.000000 +v 0.000000 -0.059926 1.414214 +v -0.000000 -0.059926 -1.414214 +v 1.414214 -0.059926 -0.000000 +v -1.414214 -0.058559 0.000000 +v 0.000000 -0.058559 1.414214 +v -0.000000 -0.058559 -1.414214 +v 1.414214 -0.058559 -0.000000 +v -1.414214 -0.057648 0.000000 +v 0.000000 -0.057648 1.414214 +v -0.000000 -0.057648 -1.414214 +v 1.414214 -0.057648 -0.000000 +v -1.414214 -0.056281 0.000000 +v 0.000000 -0.056281 1.414214 +v -0.000000 -0.056281 -1.414214 +v 1.414214 -0.056281 -0.000000 +v -1.414214 -0.055369 0.000000 +v 0.000000 -0.055369 1.414214 +v -0.000000 -0.055369 -1.414214 +v 1.414214 -0.055369 -0.000000 +v -1.414214 -0.054002 0.000000 +v 0.000000 -0.054002 1.414214 +v -0.000000 -0.054002 -1.414214 +v 1.414214 -0.054002 -0.000000 +v -1.414214 -0.053091 0.000000 +v 0.000000 -0.053091 1.414214 +v -0.000000 -0.053091 -1.414214 +v 1.414214 -0.053091 -0.000000 +v -1.414214 -0.051723 0.000000 +v 0.000000 -0.051723 1.414214 +v -0.000000 -0.051723 -1.414214 +v 1.414214 -0.051723 -0.000000 +v -1.414214 -0.050812 0.000000 +v 0.000000 -0.050812 1.414214 +v -0.000000 -0.050812 -1.414214 +v 1.414214 -0.050812 -0.000000 +v -1.414214 -0.049445 0.000000 +v 0.000000 -0.049445 1.414214 +v -0.000000 -0.049445 -1.414214 +v 1.414214 -0.049445 -0.000000 +v -1.414214 -0.048533 0.000000 +v 0.000000 -0.048533 1.414214 +v -0.000000 -0.048533 -1.414214 +v 1.414214 -0.048533 -0.000000 +v -1.414214 -0.047166 0.000000 +v 0.000000 -0.047166 1.414214 +v -0.000000 -0.047166 -1.414214 +v 1.414214 -0.047166 -0.000000 +v -1.414214 -0.046255 0.000000 +v 0.000000 -0.046255 1.414214 +v -0.000000 -0.046255 -1.414214 +v 1.414214 -0.046255 -0.000000 +v -1.414214 -0.044888 0.000000 +v 0.000000 -0.044888 1.414214 +v -0.000000 -0.044888 -1.414214 +v 1.414214 -0.044888 -0.000000 +v -1.414214 -0.043976 0.000000 +v 0.000000 -0.043976 1.414214 +v -0.000000 -0.043976 -1.414214 +v 1.414214 -0.043976 -0.000000 +v -1.414214 -0.042609 0.000000 +v 0.000000 -0.042609 1.414214 +v -0.000000 -0.042609 -1.414214 +v 1.414214 -0.042609 -0.000000 +v -1.414214 -0.041698 0.000000 +v 0.000000 -0.041698 1.414214 +v -0.000000 -0.041698 -1.414214 +v 1.414214 -0.041698 -0.000000 +v -1.414214 -0.040331 0.000000 +v 0.000000 -0.040331 1.414214 +v -0.000000 -0.040331 -1.414214 +v 1.414214 -0.040331 -0.000000 +v -1.414214 -0.039419 0.000000 +v 0.000000 -0.039419 1.414214 +v -0.000000 -0.039419 -1.414214 +v 1.414214 -0.039419 -0.000000 +v -1.414214 -0.038052 0.000000 +v 0.000000 -0.038052 1.414214 +v -0.000000 -0.038052 -1.414214 +v 1.414214 -0.038052 -0.000000 +v -1.414214 -0.037141 0.000000 +v 0.000000 -0.037141 1.414214 +v -0.000000 -0.037141 -1.414214 +v 1.414214 -0.037141 -0.000000 +v -1.414214 -0.035773 0.000000 +v 0.000000 -0.035773 1.414214 +v -0.000000 -0.035773 -1.414214 +v 1.414214 -0.035773 -0.000000 +v -1.414214 -0.034862 0.000000 +v 0.000000 -0.034862 1.414214 +v -0.000000 -0.034862 -1.414214 +v 1.414214 -0.034862 -0.000000 +v -1.414214 -0.033495 0.000000 +v 0.000000 -0.033495 1.414214 +v -0.000000 -0.033495 -1.414214 +v 1.414214 -0.033495 -0.000000 +v -1.414214 -0.032583 0.000000 +v 0.000000 -0.032583 1.414214 +v -0.000000 -0.032583 -1.414214 +v 1.414214 -0.032583 -0.000000 +v -1.414214 -0.031216 0.000000 +v 0.000000 -0.031216 1.414214 +v -0.000000 -0.031216 -1.414214 +v 1.414214 -0.031216 -0.000000 +v -1.414214 -0.030305 0.000000 +v 0.000000 -0.030305 1.414214 +v -0.000000 -0.030305 -1.414214 +v 1.414214 -0.030305 -0.000000 +v -1.414214 -0.028938 0.000000 +v 0.000000 -0.028938 1.414214 +v -0.000000 -0.028938 -1.414214 +v 1.414214 -0.028938 -0.000000 +v -1.414214 -0.028026 0.000000 +v 0.000000 -0.028026 1.414214 +v -0.000000 -0.028026 -1.414214 +v 1.414214 -0.028026 -0.000000 +v -1.414214 -0.026659 0.000000 +v 0.000000 -0.026659 1.414214 +v -0.000000 -0.026659 -1.414214 +v 1.414214 -0.026659 -0.000000 +v -1.414214 -0.025748 0.000000 +v 0.000000 -0.025748 1.414214 +v -0.000000 -0.025748 -1.414214 +v 1.414214 -0.025748 -0.000000 +v -1.414214 -0.024381 0.000000 +v 0.000000 -0.024381 1.414214 +v -0.000000 -0.024381 -1.414214 +v 1.414214 -0.024381 -0.000000 +v -1.414214 -0.023469 0.000000 +v 0.000000 -0.023469 1.414214 +v -0.000000 -0.023469 -1.414214 +v 1.414214 -0.023469 -0.000000 +v -1.414214 -0.022102 0.000000 +v 0.000000 -0.022102 1.414214 +v -0.000000 -0.022102 -1.414214 +v 1.414214 -0.022102 -0.000000 +v -1.414214 -0.021191 0.000000 +v 0.000000 -0.021191 1.414214 +v -0.000000 -0.021191 -1.414214 +v 1.414214 -0.021191 -0.000000 +v -1.414214 -0.019824 0.000000 +v 0.000000 -0.019824 1.414214 +v -0.000000 -0.019824 -1.414214 +v 1.414214 -0.019824 -0.000000 +v -1.414214 -0.018912 0.000000 +v 0.000000 -0.018912 1.414214 +v -0.000000 -0.018912 -1.414214 +v 1.414214 -0.018912 -0.000000 +v -1.414214 -0.017545 0.000000 +v 0.000000 -0.017545 1.414214 +v -0.000000 -0.017545 -1.414214 +v 1.414214 -0.017545 -0.000000 +v -1.414214 -0.016634 0.000000 +v 0.000000 -0.016634 1.414214 +v -0.000000 -0.016634 -1.414214 +v 1.414214 -0.016634 -0.000000 +v -1.414214 -0.015266 0.000000 +v 0.000000 -0.015266 1.414214 +v -0.000000 -0.015266 -1.414214 +v 1.414214 -0.015266 -0.000000 +v -1.414214 -0.014355 0.000000 +v 0.000000 -0.014355 1.414214 +v -0.000000 -0.014355 -1.414214 +v 1.414214 -0.014355 -0.000000 +v -1.414214 -0.012988 0.000000 +v 0.000000 -0.012988 1.414214 +v -0.000000 -0.012988 -1.414214 +v 1.414214 -0.012988 -0.000000 +v -1.414214 -0.012076 0.000000 +v 0.000000 -0.012076 1.414214 +v -0.000000 -0.012076 -1.414214 +v 1.414214 -0.012076 -0.000000 +v -1.414214 -0.010709 0.000000 +v 0.000000 -0.010709 1.414214 +v -0.000000 -0.010709 -1.414214 +v 1.414214 -0.010709 -0.000000 +v -1.414214 -0.009798 0.000000 +v 0.000000 -0.009798 1.414214 +v -0.000000 -0.009798 -1.414214 +v 1.414214 -0.009798 -0.000000 +v -1.414214 -0.008431 0.000000 +v 0.000000 -0.008431 1.414214 +v -0.000000 -0.008431 -1.414214 +v 1.414214 -0.008431 -0.000000 +v -1.414214 -0.007519 0.000000 +v 0.000000 -0.007519 1.414214 +v -0.000000 -0.007519 -1.414214 +v 1.414214 -0.007519 -0.000000 +v -1.414214 -0.006152 0.000000 +v 0.000000 -0.006152 1.414214 +v -0.000000 -0.006152 -1.414214 +v 1.414214 -0.006152 -0.000000 +v -1.414214 -0.005241 0.000000 +v 0.000000 -0.005241 1.414214 +v -0.000000 -0.005241 -1.414214 +v 1.414214 -0.005241 -0.000000 +v -1.414214 -0.003874 0.000000 +v 0.000000 -0.003874 1.414214 +v -0.000000 -0.003874 -1.414214 +v 1.414214 -0.003874 -0.000000 +v -1.414214 -0.002962 0.000000 +v 0.000000 -0.002962 1.414214 +v -0.000000 -0.002962 -1.414214 +v 1.414214 -0.002962 -0.000000 +v -1.414214 -0.001595 0.000000 +v 0.000000 -0.001595 1.414214 +v -0.000000 -0.001595 -1.414214 +v 1.414214 -0.001595 -0.000000 +v -1.414214 -0.000684 0.000000 +v 0.000000 -0.000684 1.414214 +v -0.000000 -0.000684 -1.414214 +v 1.414214 -0.000684 -0.000000 +v -1.414214 0.000684 0.000000 +v 0.000000 0.000684 1.414214 +v -0.000000 0.000684 -1.414214 +v 1.414214 0.000684 -0.000000 +v -1.414214 0.001595 0.000000 +v 0.000000 0.001595 1.414214 +v -0.000000 0.001595 -1.414214 +v 1.414214 0.001595 -0.000000 +v -1.414214 0.002962 0.000000 +v 0.000000 0.002962 1.414214 +v -0.000000 0.002962 -1.414214 +v 1.414214 0.002962 -0.000000 +v -1.414214 0.003874 0.000000 +v 0.000000 0.003874 1.414214 +v -0.000000 0.003874 -1.414214 +v 1.414214 0.003874 -0.000000 +v -1.414214 0.005241 0.000000 +v 0.000000 0.005241 1.414214 +v -0.000000 0.005241 -1.414214 +v 1.414214 0.005241 -0.000000 +v -1.414214 0.006152 0.000000 +v 0.000000 0.006152 1.414214 +v -0.000000 0.006152 -1.414214 +v 1.414214 0.006152 -0.000000 +v -1.414214 0.007519 0.000000 +v 0.000000 0.007519 1.414214 +v -0.000000 0.007519 -1.414214 +v 1.414214 0.007519 -0.000000 +v -1.414214 0.008431 0.000000 +v 0.000000 0.008431 1.414214 +v -0.000000 0.008431 -1.414214 +v 1.414214 0.008431 -0.000000 +v -1.414214 0.009798 0.000000 +v 0.000000 0.009798 1.414214 +v -0.000000 0.009798 -1.414214 +v 1.414214 0.009798 -0.000000 +v -1.414214 0.010709 0.000000 +v 0.000000 0.010709 1.414214 +v -0.000000 0.010709 -1.414214 +v 1.414214 0.010709 -0.000000 +v -1.414214 0.012076 0.000000 +v 0.000000 0.012076 1.414214 +v -0.000000 0.012076 -1.414214 +v 1.414214 0.012076 -0.000000 +v -1.414214 0.012988 0.000000 +v 0.000000 0.012988 1.414214 +v -0.000000 0.012988 -1.414214 +v 1.414214 0.012988 -0.000000 +v -1.414214 0.014355 0.000000 +v 0.000000 0.014355 1.414214 +v -0.000000 0.014355 -1.414214 +v 1.414214 0.014355 -0.000000 +v -1.414214 0.015266 0.000000 +v 0.000000 0.015266 1.414214 +v -0.000000 0.015266 -1.414214 +v 1.414214 0.015266 -0.000000 +v -1.414214 0.016634 0.000000 +v 0.000000 0.016634 1.414214 +v -0.000000 0.016634 -1.414214 +v 1.414214 0.016634 -0.000000 +v -1.414214 0.017545 0.000000 +v 0.000000 0.017545 1.414214 +v -0.000000 0.017545 -1.414214 +v 1.414214 0.017545 -0.000000 +v -1.414214 0.018912 0.000000 +v 0.000000 0.018912 1.414214 +v -0.000000 0.018912 -1.414214 +v 1.414214 0.018912 -0.000000 +v -1.414214 0.019824 0.000000 +v 0.000000 0.019824 1.414214 +v -0.000000 0.019824 -1.414214 +v 1.414214 0.019824 -0.000000 +v -1.414214 0.021191 0.000000 +v 0.000000 0.021191 1.414214 +v -0.000000 0.021191 -1.414214 +v 1.414214 0.021191 -0.000000 +v -1.414214 0.022102 0.000000 +v 0.000000 0.022102 1.414214 +v -0.000000 0.022102 -1.414214 +v 1.414214 0.022102 -0.000000 +v -1.414214 0.023469 0.000000 +v 0.000000 0.023469 1.414214 +v -0.000000 0.023469 -1.414214 +v 1.414214 0.023469 -0.000000 +v -1.414214 0.024381 0.000000 +v 0.000000 0.024381 1.414214 +v -0.000000 0.024381 -1.414214 +v 1.414214 0.024381 -0.000000 +v -1.414214 0.025748 0.000000 +v 0.000000 0.025748 1.414214 +v -0.000000 0.025748 -1.414214 +v 1.414214 0.025748 -0.000000 +v -1.414214 0.026659 0.000000 +v 0.000000 0.026659 1.414214 +v -0.000000 0.026659 -1.414214 +v 1.414214 0.026659 -0.000000 +v -1.414214 0.028026 0.000000 +v 0.000000 0.028026 1.414214 +v -0.000000 0.028026 -1.414214 +v 1.414214 0.028026 -0.000000 +v -1.414214 0.028938 0.000000 +v 0.000000 0.028938 1.414214 +v -0.000000 0.028938 -1.414214 +v 1.414214 0.028938 -0.000000 +v -1.414214 0.030305 0.000000 +v 0.000000 0.030305 1.414214 +v -0.000000 0.030305 -1.414214 +v 1.414214 0.030305 -0.000000 +v -1.414214 0.031216 0.000000 +v 0.000000 0.031216 1.414214 +v -0.000000 0.031216 -1.414214 +v 1.414214 0.031216 -0.000000 +v -1.414214 0.032584 0.000000 +v 0.000000 0.032584 1.414214 +v -0.000000 0.032584 -1.414214 +v 1.414214 0.032584 -0.000000 +v -1.414214 0.033495 0.000000 +v 0.000000 0.033495 1.414214 +v -0.000000 0.033495 -1.414214 +v 1.414214 0.033495 -0.000000 +v -1.414214 0.034862 0.000000 +v 0.000000 0.034862 1.414214 +v -0.000000 0.034862 -1.414214 +v 1.414214 0.034862 -0.000000 +v -1.414214 0.035774 0.000000 +v 0.000000 0.035774 1.414214 +v -0.000000 0.035774 -1.414214 +v 1.414214 0.035774 -0.000000 +v -1.414214 0.037141 0.000000 +v 0.000000 0.037141 1.414214 +v -0.000000 0.037141 -1.414214 +v 1.414214 0.037141 -0.000000 +v -1.414214 0.038052 0.000000 +v 0.000000 0.038052 1.414214 +v -0.000000 0.038052 -1.414214 +v 1.414214 0.038052 -0.000000 +v -1.414214 0.039419 0.000000 +v 0.000000 0.039419 1.414214 +v -0.000000 0.039419 -1.414214 +v 1.414214 0.039419 -0.000000 +v -1.414214 0.040331 0.000000 +v 0.000000 0.040331 1.414214 +v -0.000000 0.040331 -1.414214 +v 1.414214 0.040331 -0.000000 +v -1.414214 0.041698 0.000000 +v 0.000000 0.041698 1.414214 +v -0.000000 0.041698 -1.414214 +v 1.414214 0.041698 -0.000000 +v -1.414214 0.042609 0.000000 +v 0.000000 0.042609 1.414214 +v -0.000000 0.042609 -1.414214 +v 1.414214 0.042609 -0.000000 +v -1.414214 0.043976 0.000000 +v 0.000000 0.043976 1.414214 +v -0.000000 0.043976 -1.414214 +v 1.414214 0.043976 -0.000000 +v -1.414214 0.044888 0.000000 +v 0.000000 0.044888 1.414214 +v -0.000000 0.044888 -1.414214 +v 1.414214 0.044888 -0.000000 +v -1.414214 0.046255 0.000000 +v 0.000000 0.046255 1.414214 +v -0.000000 0.046255 -1.414214 +v 1.414214 0.046255 -0.000000 +v -1.414214 0.047166 0.000000 +v 0.000000 0.047166 1.414214 +v -0.000000 0.047166 -1.414214 +v 1.414214 0.047166 -0.000000 +v -1.414214 0.048533 0.000000 +v 0.000000 0.048533 1.414214 +v -0.000000 0.048533 -1.414214 +v 1.414214 0.048533 -0.000000 +v -1.414214 0.049445 0.000000 +v 0.000000 0.049445 1.414214 +v -0.000000 0.049445 -1.414214 +v 1.414214 0.049445 -0.000000 +v -1.414214 0.050812 0.000000 +v 0.000000 0.050812 1.414214 +v -0.000000 0.050812 -1.414214 +v 1.414214 0.050812 -0.000000 +v -1.414214 0.051723 0.000000 +v 0.000000 0.051723 1.414214 +v -0.000000 0.051723 -1.414214 +v 1.414214 0.051723 -0.000000 +v -1.414214 0.053091 0.000000 +v 0.000000 0.053091 1.414214 +v -0.000000 0.053091 -1.414214 +v 1.414214 0.053091 -0.000000 +v -1.414214 0.054002 0.000000 +v 0.000000 0.054002 1.414214 +v -0.000000 0.054002 -1.414214 +v 1.414214 0.054002 -0.000000 +v -1.414214 0.055369 0.000000 +v 0.000000 0.055369 1.414214 +v -0.000000 0.055369 -1.414214 +v 1.414214 0.055369 -0.000000 +v -1.414214 0.056281 0.000000 +v 0.000000 0.056281 1.414214 +v -0.000000 0.056281 -1.414214 +v 1.414214 0.056281 -0.000000 +v -1.414214 0.057648 0.000000 +v 0.000000 0.057648 1.414214 +v -0.000000 0.057648 -1.414214 +v 1.414214 0.057648 -0.000000 +v -1.414214 0.058559 0.000000 +v 0.000000 0.058559 1.414214 +v -0.000000 0.058559 -1.414214 +v 1.414214 0.058559 -0.000000 +v -1.414214 0.059926 0.000000 +v 0.000000 0.059926 1.414214 +v -0.000000 0.059926 -1.414214 +v 1.414214 0.059926 -0.000000 +v -1.414214 0.060838 0.000000 +v 0.000000 0.060838 1.414214 +v -0.000000 0.060838 -1.414214 +v 1.414214 0.060838 -0.000000 +v -1.414214 0.062205 0.000000 +v 0.000000 0.062205 1.414214 +v -0.000000 0.062205 -1.414214 +v 1.414214 0.062205 -0.000000 +v -1.414214 0.063116 0.000000 +v 0.000000 0.063116 1.414214 +v -0.000000 0.063116 -1.414214 +v 1.414214 0.063116 -0.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl None +s off +f 1/1/1 3/2/1 4/3/1 2/4/1 +f 5/5/2 6/6/2 8/7/2 7/8/2 +f 9/9/1 11/10/1 12/11/1 10/12/1 +f 13/13/2 14/14/2 16/15/2 15/16/2 +f 17/17/1 19/18/1 20/19/1 18/20/1 +f 21/21/2 22/22/2 24/23/2 23/24/2 +f 25/25/1 27/26/1 28/27/1 26/28/1 +f 29/29/2 30/30/2 32/31/2 31/32/2 +f 33/33/1 35/34/1 36/35/1 34/36/1 +f 37/37/2 38/38/2 40/39/2 39/40/2 +f 41/41/1 43/42/1 44/43/1 42/44/1 +f 45/45/2 46/46/2 48/47/2 47/48/2 +f 49/49/1 51/50/1 52/51/1 50/52/1 +f 53/53/2 54/54/2 56/55/2 55/56/2 +f 57/57/1 59/58/1 60/59/1 58/60/1 +f 61/61/2 62/62/2 64/63/2 63/64/2 +f 65/65/1 67/66/1 68/67/1 66/68/1 +f 69/69/2 70/70/2 72/71/2 71/72/2 +f 73/73/1 75/74/1 76/75/1 74/76/1 +f 77/77/2 78/78/2 80/79/2 79/80/2 +f 81/81/1 83/82/1 84/83/1 82/84/1 +f 85/85/2 86/86/2 88/87/2 87/88/2 +f 89/89/1 91/90/1 92/91/1 90/92/1 +f 93/93/2 94/94/2 96/95/2 95/96/2 +f 97/97/1 99/98/1 100/99/1 98/100/1 +f 101/101/2 102/102/2 104/103/2 103/104/2 +f 105/105/1 107/106/1 108/107/1 106/108/1 +f 109/109/2 110/110/2 112/111/2 111/112/2 +f 113/113/1 115/114/1 116/115/1 114/116/1 +f 117/117/2 118/118/2 120/119/2 119/120/2 +f 121/121/1 123/122/1 124/123/1 122/124/1 +f 125/125/2 126/126/2 128/127/2 127/128/2 +f 129/129/1 131/130/1 132/131/1 130/132/1 +f 133/133/2 134/134/2 136/135/2 135/136/2 +f 137/137/1 139/138/1 140/139/1 138/140/1 +f 141/141/2 142/142/2 144/143/2 143/144/2 +f 145/145/1 147/146/1 148/147/1 146/148/1 +f 149/149/2 150/150/2 152/151/2 151/152/2 +f 153/153/1 155/154/1 156/155/1 154/156/1 +f 157/157/2 158/158/2 160/159/2 159/160/2 +f 161/161/1 163/162/1 164/163/1 162/164/1 +f 165/165/2 166/166/2 168/167/2 167/168/2 +f 169/169/1 171/170/1 172/171/1 170/172/1 +f 173/173/2 174/174/2 176/175/2 175/176/2 +f 177/177/1 179/178/1 180/179/1 178/180/1 +f 181/181/2 182/182/2 184/183/2 183/184/2 +f 185/185/1 187/186/1 188/187/1 186/188/1 +f 189/189/2 190/190/2 192/191/2 191/192/2 +f 193/193/1 195/194/1 196/195/1 194/196/1 +f 197/197/2 198/198/2 200/199/2 199/200/2 +f 201/201/1 203/202/1 204/203/1 202/204/1 +f 205/205/2 206/206/2 208/207/2 207/208/2 +f 209/209/1 211/210/1 212/211/1 210/212/1 +f 213/213/2 214/214/2 216/215/2 215/216/2 +f 217/217/1 219/218/1 220/219/1 218/220/1 +f 221/221/2 222/222/2 224/223/2 223/224/2 +f 225/225/1 227/226/1 228/227/1 226/228/1 +f 229/229/2 230/230/2 232/231/2 231/232/2 +f 233/233/1 235/234/1 236/235/1 234/236/1 +f 237/237/2 238/238/2 240/239/2 239/240/2 +f 241/241/1 243/242/1 244/243/1 242/244/1 +f 245/245/2 246/246/2 248/247/2 247/248/2 +f 249/249/1 251/250/1 252/251/1 250/252/1 +f 253/253/2 254/254/2 256/255/2 255/256/2 +f 257/257/1 259/258/1 260/259/1 258/260/1 +f 261/261/2 262/262/2 264/263/2 263/264/2 +f 265/265/1 267/266/1 268/267/1 266/268/1 +f 269/269/2 270/270/2 272/271/2 271/272/2 +f 273/273/1 275/274/1 276/275/1 274/276/1 +f 277/277/2 278/278/2 280/279/2 279/280/2 +f 281/281/1 283/282/1 284/283/1 282/284/1 +f 285/285/2 286/286/2 288/287/2 287/288/2 +f 289/289/1 291/290/1 292/291/1 290/292/1 +f 293/293/2 294/294/2 296/295/2 295/296/2 +f 297/297/1 299/298/1 300/299/1 298/300/1 +f 301/301/2 302/302/2 304/303/2 303/304/2 +f 305/305/1 307/306/1 308/307/1 306/308/1 +f 309/309/2 310/310/2 312/311/2 311/312/2 +f 313/313/1 315/314/1 316/315/1 314/316/1 +f 317/317/2 318/318/2 320/319/2 319/320/2 +f 321/321/1 323/322/1 324/323/1 322/324/1 +f 325/325/2 326/326/2 328/327/2 327/328/2 +f 329/329/1 331/330/1 332/331/1 330/332/1 +f 333/333/2 334/334/2 336/335/2 335/336/2 +f 337/337/1 339/338/1 340/339/1 338/340/1 +f 341/341/2 342/342/2 344/343/2 343/344/2 +f 345/345/1 347/346/1 348/347/1 346/348/1 +f 349/349/2 350/350/2 352/351/2 351/352/2 +f 353/353/1 355/354/1 356/355/1 354/356/1 +f 357/357/2 358/358/2 360/359/2 359/360/2 +f 361/361/1 363/362/1 364/363/1 362/364/1 +f 365/365/2 366/366/2 368/367/2 367/368/2 +f 369/369/1 371/370/1 372/371/1 370/372/1 +f 373/373/2 374/374/2 376/375/2 375/376/2 +f 377/377/1 379/378/1 380/379/1 378/380/1 +f 381/381/2 382/382/2 384/383/2 383/384/2 +f 385/385/1 387/386/1 388/387/1 386/388/1 +f 389/389/2 390/390/2 392/391/2 391/392/2 +f 393/393/1 395/394/1 396/395/1 394/396/1 +f 397/397/2 398/398/2 400/399/2 399/400/2 +f 401/401/1 403/402/1 404/403/1 402/404/1 +f 405/405/2 406/406/2 408/407/2 407/408/2 +f 409/409/1 411/410/1 412/411/1 410/412/1 +f 413/413/2 414/414/2 416/415/2 415/416/2 +f 417/417/1 419/418/1 420/419/1 418/420/1 +f 421/421/2 422/422/2 424/423/2 423/424/2 +f 425/425/1 427/426/1 428/427/1 426/428/1 +f 429/429/2 430/430/2 432/431/2 431/432/2 +f 433/433/1 435/434/1 436/435/1 434/436/1 +f 437/437/2 438/438/2 440/439/2 439/440/2 +f 441/441/1 443/442/1 444/443/1 442/444/1 +f 445/445/2 446/446/2 448/447/2 447/448/2 diff --git a/mods/ITEMS/mcl_bows/rocket.lua b/mods/ITEMS/mcl_bows/rocket.lua new file mode 100644 index 000000000..678aba4d4 --- /dev/null +++ b/mods/ITEMS/mcl_bows/rocket.lua @@ -0,0 +1,706 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local math = math +local vector = vector + +-- Time in seconds after which a stuck arrow is deleted +local ARROW_TIMEOUT = 1 +-- Time after which stuck arrow is rechecked for being stuck +local STUCK_RECHECK_TIME = 0.1 + +--local GRAVITY = 9.81 + +local YAW_OFFSET = -math.pi/2 + +local function dir_to_pitch(dir) + --local dir2 = vector.normalize(dir) + local xz = math.abs(dir.x) + math.abs(dir.z) + return -math.atan2(-dir.y, xz) +end + +local function random_arrow_positions(positions, placement) + if positions == "x" then + return math.random(-4, 4) + elseif positions == "y" then + return math.random(0, 10) + end + if placement == "front" and positions == "z" then + return 3 + elseif placement == "back" and positions == "z" then + return -3 + end + return 0 +end + +local function damage_explosion(self, damagemulitplier) + mcl_explosions.explode(self.object:get_pos(), 3, {}) + local objects = minetest.get_objects_inside_radius(self.object:get_pos(), 8) + for _,obj in pairs(objects) do + if obj:is_player() then + mcl_util.deal_damage(obj, damagemulitplier - vector.distance(self.object:get_pos(), obj:get_pos()), {type = "explosion"}) + elseif obj:get_luaentity()._cmi_is_mob then + obj:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damagemulitplier - vector.distance(self.object:get_pos(), obj:get_pos())}, + }, self.object:get_velocity()) + end + end +end + +local function particle_explosion(self) + local particle_pattern = math.random(1, 3) + local fpitch = 0 + local true_type = "" + local type = math.random(1,2) + local size = math.random(1,3) + local colors = {"red", "yellow", "blue", "green", "white"} + local this_colors = {colors[math.random(#colors)], colors[math.random(#colors)], colors[math.random(#colors)]} + + if size == 1 then + fpitch = math.random(200, 300) + elseif size == 2 then + fpitch = math.random(100, 130) + else + fpitch = math.random(60, 70) + end + + if type == 1 then + true_type = "Popper" + else + true_type = "Floof" + end + + if type == 1 then + minetest.sound_play("mcl_bows_firework", { + pos = self.object:get_pos(), + max_hear_distance = 100, + gain = 3.0, + pitch = fpitch/100 + }, true) + else + minetest.sound_play("mcl_bows_firework_soft", { + pos = self.object:get_pos(), + max_hear_distance = 100, + gain = 4.0, + pitch = fpitch/100 + }, true) + end + + if particle_pattern == 1 then + minetest.add_particlespawner({ + amount = 400 * size, + time = 0.0001, + minpos = self.object:get_pos(), + maxpos = self.object:get_pos(), + minvel = vector.new(-7 * size,-7 * size,-7 * size), + maxvel = vector.new(7 * size,7 * size,7 * size), + minexptime = .6 * size / 2, + maxexptime = .9 * size / 2, + minsize = 2 * size, + maxsize = 3 * size, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_firework_"..this_colors[1]..".png", + glow = 14, + }) + minetest.add_particlespawner({ + amount = 400 * size, + time = 0.0001, + minpos = self.object:get_pos(), + maxpos = self.object:get_pos(), + minvel = vector.new(-2 * size,-2 * size,-2 * size), + maxvel = vector.new(2 * size,2 * size,2 * size), + minexptime = .6 * size / 2, + maxexptime = .9 * size / 2, + minsize = 2 * size, + maxsize = 3 * size, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_firework_"..this_colors[2]..".png", + glow = 14, + }) + minetest.add_particlespawner({ + amount = 100 * size, + time = 0.0001, + minpos = self.object:get_pos(), + maxpos = self.object:get_pos(), + minvel = vector.new(-14 * size,-14 * size,-14 * size), + maxvel = vector.new(14 * size,14 * size,14 * size), + minexptime = .6 * size / 2, + maxexptime = .9 * size / 2, + minsize = 2 * size, + maxsize = 3 * size, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_firework_"..this_colors[3]..".png", + glow = 14, + }) + elseif particle_pattern == 2 then + + minetest.add_particlespawner({ + amount = 240 * size, + time = 0.0001, + minpos = self.object:get_pos(), + maxpos = self.object:get_pos(), + minvel = vector.new(-5 * size,-5 * size,-5 * size), + maxvel = vector.new(5 * size,5 * size,5 * size), + minexptime = .6 * size / 2, + maxexptime = .9 * size / 2, + minsize = 2 * size, + maxsize = 3 * size, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_firework_"..this_colors[1]..".png", + glow = 14, + }) + minetest.add_particlespawner({ + amount = 500 * size, + time = 0.0001, + minpos = self.object:get_pos(), + maxpos = self.object:get_pos(), + minvel = vector.new(-2 * size,-2 * size,-2 * size), + maxvel = vector.new(2 * size,2 * size,2 * size), + minexptime = .6 * size / 2, + maxexptime = .9 * size / 2, + minsize = 2 * size, + maxsize = 3 * size, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_firework_"..this_colors[2]..".png", + glow = 14, + }) + minetest.add_particlespawner({ + amount = 350 * size, + time = 0.0001, + minpos = self.object:get_pos(), + maxpos = self.object:get_pos(), + minvel = vector.new(-3 * size,-3 * size,-3 * size), + maxvel = vector.new(3 * size,3 * size,3 * size), + minexptime = .6 * size / 2, + maxexptime = .9 * size / 2, + minsize = 2 * size, + maxsize = 3 * size, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_firework_"..this_colors[3]..".png", + glow = 14, + }) + elseif particle_pattern == 3 then + + minetest.add_particlespawner({ + amount = 400 * size, + time = 0.0001, + minpos = self.object:get_pos(), + maxpos = self.object:get_pos(), + minvel = vector.new(-6 * size,-4 * size,-6 * size), + maxvel = vector.new(6 * size,4 * size,6 * size), + minexptime = .6 * size, + maxexptime = .9 * size, + minsize = 2 * size, + maxsize = 3 * size, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_firework_"..this_colors[1]..".png", + glow = 14, + }) + minetest.add_particlespawner({ + amount = 120 * size, + time = 0.0001, + minpos = self.object:get_pos(), + maxpos = self.object:get_pos(), + minvel = vector.new(-8 * size,6 * size,-8 * size), + maxvel = vector.new(8 * size,6 * size,8 * size), + minexptime = .6 * size, + maxexptime = .9 * size, + minsize = 2 * size, + maxsize = 3 * size, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_firework_"..this_colors[2]..".png", + glow = 14, + }) + minetest.add_particlespawner({ + amount = 130 * size, + time = 0.0001, + minpos = self.object:get_pos(), + maxpos = self.object:get_pos(), + minvel = vector.new(-3 * size,3 * size,-3 * size), + maxvel = vector.new(3 * size,3 * size,3 * size), + minexptime = .6 * size, + maxexptime = .9 * size, + minsize = 2 * size, + maxsize = 3 * size, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_firework_"..this_colors[3]..".png", + glow = 14, + }) + end + + return size + +end + +local mod_awards = minetest.get_modpath("awards") and minetest.get_modpath("mcl_achievements") +local mod_button = minetest.get_modpath("mesecons_button") + +minetest.register_craftitem("mcl_bows:rocket", { + description = S("Arrow"), + _tt_help = S("Ammunition").."\n"..S("Damage from bow: 1-10").."\n"..S("Damage from dispenser: 3"), + _doc_items_longdesc = S("Arrows are ammunition for bows and dispensers.").."\n".. +S("An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.").."\n".. +S("Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons."), + _doc_items_usagehelp = S("To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it."), + inventory_image = "mcl_bows_rocket.png", + groups = { ammo=1, ammo_crossbow=1, ammo_bow_regular=1 }, + _on_dispense = function(itemstack, dispenserpos, droppos, dropnode, dropdir) + -- Shoot arrow + local shootpos = vector.add(dispenserpos, vector.multiply(dropdir, 0.51)) + local yaw = math.atan2(dropdir.z, dropdir.x) + YAW_OFFSET + mcl_bows.shoot_arrow(itemstack:get_name(), shootpos, dropdir, yaw, nil, 19, 3) + end, +}) + + + +local ARROW_ENTITY={ + physical = true, + pointable = false, + visual = "mesh", + mesh = "mcl_bows_rocket.obj", + visual_size = {x=2.5, y=2.5}, + textures = {"mcl_bows_rocket.png"}, + collisionbox = {-0.19, -0.125, -0.19, 0.19, 0.125, 0.19}, + collide_with_objects = false, + _fire_damage_resistant = true, + + _lastpos={}, + _startpos=nil, + _damage=1, -- Damage on impact + _is_critical=false, -- Whether this arrow would deal critical damage + _stuck=false, -- Whether arrow is stuck + _fuse=nil,-- Amount of time (in seconds) the arrow has been stuck so far + _fuserechecktimer=nil,-- An additional timer for periodically re-checking the stuck status of an arrow + _stuckin=nil, --Position of node in which arow is stuck. + _shooter=nil, -- ObjectRef of player or mob who shot it + _is_arrow = true, + + _viscosity=0, -- Viscosity of node the arrow is currently in + _deflection_cooloff=0, -- Cooloff timer after an arrow deflection, to prevent many deflections in quick succession +} + +-- Destroy arrow entity self at pos and drops it as an item +local function spawn_item(self, pos) + if not minetest.is_creative_enabled("") then + local item = minetest.add_item(pos, "mcl_bows:rocket") + item:set_velocity({x=0, y=0, z=0}) + item:set_yaw(self.object:get_yaw()) + end + mcl_burning.extinguish(self.object) + self.object:remove() +end + +local function damage_particles(pos, is_critical) + if is_critical then + minetest.add_particlespawner({ + amount = 15, + time = 0.1, + minpos = {x=pos.x-0.5, y=pos.y-0.5, z=pos.z-0.5}, + maxpos = {x=pos.x+0.5, y=pos.y+0.5, z=pos.z+0.5}, + minvel = {x=-0.1, y=-0.1, z=-0.1}, + maxvel = {x=0.1, y=0.1, z=0.1}, + minacc = {x=0, y=0, z=0}, + maxacc = {x=0, y=0, z=0}, + minexptime = 1, + maxexptime = 2, + minsize = 1.5, + maxsize = 1.5, + collisiondetection = false, + vertical = false, + texture = "mcl_particles_crit.png^[colorize:#bc7a57:127", + }) + end +end + +function ARROW_ENTITY.on_step(self, dtime) + mcl_burning.tick(self.object, dtime, self) + + self._time_in_air = self._time_in_air + .001 + + + local pos = self.object:get_pos() + local dpos = table.copy(pos) -- digital pos + dpos = vector.round(dpos) + local node = minetest.get_node(dpos) + + if not self._fuse then + self._fuse = 0 + end + if not self._fuserechecktimer then + self._fuserechecktimer = 0 + end + + self._fuse = self._fuse + dtime + self._fuserechecktimer = self._fuserechecktimer + dtime + + if self._fuse > ARROW_TIMEOUT then + self._stuck = true + end + if self._stuck then + if self._fuse > ARROW_TIMEOUT then + local eploded_particle = particle_explosion(self) + damage_explosion(self, eploded_particle * 17) + mcl_burning.extinguish(self.object) + self.object:remove() + return + end + -- Drop arrow as item when it is no longer stuck + -- FIXME: Arrows are a bit slow to react and continue to float in mid air for a few seconds. + if self._fuserechecktimer > STUCK_RECHECK_TIME then + local stuckin_def + if self._stuckin then + stuckin_def = minetest.registered_nodes[minetest.get_node(self._stuckin).name] + end + -- TODO: In MC, arrow just falls down without turning into an item + if stuckin_def and stuckin_def.walkable == false then + spawn_item(self, pos) + return + end + self._fuserechecktimer = 0 + end + -- Pickup arrow if player is nearby (not in Creative Mode) + local objects = minetest.get_objects_inside_radius(pos, 1) + for _,obj in ipairs(objects) do + if obj:is_player() then + if self._collectable and not minetest.is_creative_enabled(obj:get_player_name()) then + if obj:get_inventory():room_for_item("main", "mcl_bows:rocket") then + obj:get_inventory():add_item("main", "mcl_bows:rocket") + minetest.sound_play("item_drop_pickup", { + pos = pos, + max_hear_distance = 16, + gain = 1.0, + }, true) + end + end + mcl_burning.extinguish(self.object) + self.object:remove() + return + end + end + + -- Check for object "collision". Done every tick (hopefully this is not too stressing) + else + + if self._in_player == false then + minetest.add_particlespawner({ + amount = 1, + time = .0001, + minpos = pos, + maxpos = pos, + minvel = vector.new(-0.1,-0.1,-0.1), + maxvel = vector.new(0.1,0.1,0.1), + minexptime = 0.5, + maxexptime = 0.5, + minsize = 2, + maxsize = 2, + collisiondetection = false, + vertical = false, + texture = "mcl_bows_rocket_particle.png", + glow = 1, + }) + end + -- We just check for any hurtable objects nearby. + -- The radius of 3 is fairly liberal, but anything lower than than will cause + -- arrow to hilariously go through mobs often. + -- TODO: Implement an ACTUAL collision detection (engine support needed). + local objs = minetest.get_objects_inside_radius(pos, 1.5) + local closest_object + local closest_distance + + if self._deflection_cooloff > 0 then + self._deflection_cooloff = self._deflection_cooloff - dtime + end + + -- Iterate through all objects and remember the closest attackable object + for k, obj in pairs(objs) do + local ok = false + -- Arrows can only damage players and mobs + if obj:is_player() then + ok = true + elseif obj:get_luaentity() then + if (obj:get_luaentity()._cmi_is_mob or obj:get_luaentity()._hittable_by_projectile) then + ok = true + end + end + + if ok then + local dist = vector.distance(pos, obj:get_pos()) + if not closest_object or not closest_distance then + closest_object = obj + closest_distance = dist + elseif dist < closest_distance then + closest_object = obj + closest_distance = dist + end + end + end + + -- If an attackable object was found, we will damage the closest one only + + if closest_object then + local obj = closest_object + local is_player = obj:is_player() + local lua = obj:get_luaentity() + if obj == self._shooter and self._time_in_air > 1.02 or obj ~= self._shooter and (is_player or (lua and (lua._cmi_is_mob or lua._hittable_by_projectile))) then + if obj:get_hp() > 0 then + -- Check if there is no solid node between arrow and object + local ray = minetest.raycast(self.object:get_pos(), obj:get_pos(), true) + for pointed_thing in ray do + if pointed_thing.type == "object" and pointed_thing.ref == closest_object then + -- Target reached! We can proceed now. + break + elseif pointed_thing.type == "node" then + local nn = minetest.get_node(minetest.get_pointed_thing_position(pointed_thing)).name + local def = minetest.registered_nodes[nn] + if (not def) or def.walkable then + -- There's a node in the way. Delete arrow without damage + mcl_burning.extinguish(self.object) + self.object:remove() + return + end + end + end + + -- Punch target object but avoid hurting enderman. + if not lua or lua.name ~= "mobs_mc:enderman" then + if self._in_player == false then + damage_particles(self.object:get_pos(), self._is_critical) + end + if mcl_burning.is_burning(self.object) then + mcl_burning.set_on_fire(obj, 5) + end + if self._in_player == false then + obj:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=self._damage}, + }, self.object:get_velocity()) + if obj:is_player() then + local eploded_particle = particle_explosion(self) + damage_explosion(self, eploded_particle * 17) + mcl_burning.extinguish(self.object) + self.object:remove() + end + end + end + + + if is_player then + if self._shooter and self._shooter:is_player() and self._in_player == false then + -- “Ding” sound for hitting another player + minetest.sound_play({name="mcl_bows_hit_player", gain=0.1}, {to_player=self._shooter:get_player_name()}, true) + end + end + + if lua then + local entity_name = lua.name + -- Achievement for hitting skeleton, wither skeleton or stray (TODO) with an arrow at least 50 meters away + -- NOTE: Range has been reduced because mobs unload much earlier than that ... >_> + -- TODO: This achievement should be given for the kill, not just a hit + if self._shooter and self._shooter:is_player() and vector.distance(pos, self._startpos) >= 20 then + if mod_awards and (entity_name == "mobs_mc:skeleton" or entity_name == "mobs_mc:stray" or entity_name == "mobs_mc:witherskeleton") then + awards.unlock(self._shooter:get_player_name(), "mcl:snipeSkeleton") + end + end + end + if self._in_player == false then + minetest.sound_play({name="mcl_bows_hit_other", gain=0.3}, {pos=self.object:get_pos(), max_hear_distance=16}, true) + end + end + if not obj:is_player() then + mcl_burning.extinguish(self.object) + if self._piercing == 0 then + local eploded_particle = particle_explosion(self) + damage_explosion(self, eploded_particle * 17) + self.object:remove() + end + end + return + end + end + end + + -- Check for node collision + if self._lastpos.x~=nil and not self._stuck then + local def = minetest.registered_nodes[node.name] + local vel = self.object:get_velocity() + -- Arrow has stopped in one axis, so it probably hit something. + -- This detection is a bit clunky, but sadly, MT does not offer a direct collision detection for us. :-( + if (math.abs(vel.x) < 0.0001) or (math.abs(vel.z) < 0.0001) or (math.abs(vel.y) < 0.00001) then + -- Check for the node to which the arrow is pointing + local dir + if math.abs(vel.y) < 0.00001 then + if self._lastpos.y < pos.y then + dir = {x=0, y=1, z=0} + else + dir = {x=0, y=-1, z=0} + end + else + dir = minetest.facedir_to_dir(minetest.dir_to_facedir(minetest.yaw_to_dir(self.object:get_yaw()-YAW_OFFSET))) + end + self._stuckin = vector.add(dpos, dir) + local snode = minetest.get_node(self._stuckin) + local sdef = minetest.registered_nodes[snode.name] + + -- If node is non-walkable, unknown or ignore, don't make arrow stuck. + -- This causes a deflection in the engine. + if not sdef or sdef.walkable == false or snode.name == "ignore" then + self._stuckin = nil + if self._deflection_cooloff <= 0 then + -- Lose 1/3 of velocity on deflection + local newvel = vector.multiply(vel, 0.6667) + + self.object:set_velocity(newvel) + -- Reset deflection cooloff timer to prevent many deflections happening in quick succession + self._deflection_cooloff = 1.0 + end + else + + -- Node was walkable, make arrow stuck + self._stuck = true + self._fuserechecktimer = 0 + + self.object:set_velocity({x=0, y=0, z=0}) + self.object:set_acceleration({x=0, y=0, z=0}) + + minetest.sound_play({name="mcl_bows_hit_other", gain=0.3}, {pos=self.object:get_pos(), max_hear_distance=16}, true) + + if mcl_burning.is_burning(self.object) and snode.name == "mcl_tnt:tnt" then + tnt.ignite(self._stuckin) + end + + -- Push the button! Push, push, push the button! + if mod_button and minetest.get_item_group(node.name, "button") > 0 and minetest.get_item_group(node.name, "button_push_by_arrow") == 1 then + local bdir = minetest.wallmounted_to_dir(node.param2) + -- Check the button orientation + if vector.equals(vector.add(dpos, bdir), self._stuckin) then + mesecon.push_button(dpos, node) + end + end + end + elseif (def and def.liquidtype ~= "none") then + -- Slow down arrow in liquids + local v = def.liquid_viscosity + if not v then + v = 0 + end + --local old_v = self._viscosity + self._viscosity = v + local vpenalty = math.max(0.1, 0.98 - 0.1 * v) + if math.abs(vel.x) > 0.001 then + vel.x = vel.x * vpenalty + end + if math.abs(vel.z) > 0.001 then + vel.z = vel.z * vpenalty + end + self.object:set_velocity(vel) + end + end + + -- Update yaw + if not self._stuck then + local vel = self.object:get_velocity() + local yaw = minetest.dir_to_yaw(vel)+YAW_OFFSET + local pitch = dir_to_pitch(vel) + self.object:set_rotation({ x = 0, y = yaw, z = pitch }) + end + + -- Update internal variable + self._lastpos={x=pos.x, y=pos.y, z=pos.z} +end + +-- Force recheck of stuck arrows when punched. +-- Otherwise, punching has no effect. +function ARROW_ENTITY.on_punch(self) + if self._stuck then + self._fuserechecktimer = STUCK_RECHECK_TIME + end +end + +function ARROW_ENTITY.get_staticdata(self) + local out = { + lastpos = self._lastpos, + startpos = self._startpos, + damage = self._damage, + is_critical = self._is_critical, + stuck = self._stuck, + stuckin = self._stuckin, + } + if self._stuck then + -- If _fuse is missing for some reason, assume the maximum + if not self._fuse then + self._fuse = ARROW_TIMEOUT + end + out.stuckstarttime = minetest.get_gametime() - self._fuse + end + if self._shooter and self._shooter:is_player() then + out.shootername = self._shooter:get_player_name() + end + return minetest.serialize(out) +end + +function ARROW_ENTITY.on_activate(self, staticdata, dtime_s) + self._time_in_air = 1.0 + self._in_player = false + local data = minetest.deserialize(staticdata) + if data then + self._stuck = data.stuck + if data.stuck then + if data.stuckstarttime then + -- First, check if the stuck arrow is aleady past its life timer. + -- If yes, delete it. + self._fuse = minetest.get_gametime() - data.stuckstarttime + if self._fuse > ARROW_TIMEOUT then + mcl_burning.extinguish(self.object) + self.object:remove() + return + end + end + + self._fuse = 2 + -- Perform a stuck recheck on the next step. + self._fuserechecktimer = STUCK_RECHECK_TIME + + self._stuckin = data.stuckin + end + + -- Get the remaining arrow state + self._lastpos = data.lastpos + self._startpos = data.startpos + self._damage = data.damage + self._is_critical = data.is_critical + if data.shootername then + local shooter = minetest.get_player_by_name(data.shootername) + if shooter and shooter:is_player() then + self._shooter = shooter + end + end + end + self.object:set_armor_groups({ immortal = 1 }) +end + +minetest.register_entity("mcl_bows:rocket_entity", ARROW_ENTITY) + +if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then + minetest.register_craft({ + output = "mcl_bows:rocket 1", + recipe = { + {"mcl_core:paper"}, + {"mcl_fireworks:rocket_2"}, + {"mcl_bows:arrow"}, + } + }) +end + +if minetest.get_modpath("doc_identifier") then + doc.sub.identifier.register_object("mcl_bows:rocket_entity", "craftitems", "mcl_bows:rocket") +end diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_0.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_0.ogg new file mode 100644 index 000000000..f4f81b307 Binary files /dev/null and b/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_0.ogg differ diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_1.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_1.ogg new file mode 100644 index 000000000..c8c06b4fa Binary files /dev/null and b/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_1.ogg differ diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_2.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_2.ogg new file mode 100644 index 000000000..4ddd20c42 Binary files /dev/null and b/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_drawback_2.ogg differ diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_load.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_load.ogg new file mode 100644 index 000000000..02d2fd1af Binary files /dev/null and b/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_load.ogg differ diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_shoot.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_shoot.ogg new file mode 100644 index 000000000..a7d7b69d1 Binary files /dev/null and b/mods/ITEMS/mcl_bows/sounds/mcl_bows_crossbow_shoot.ogg differ diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_firework.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_firework.ogg new file mode 100644 index 000000000..ea9a4c4be Binary files /dev/null and b/mods/ITEMS/mcl_bows/sounds/mcl_bows_firework.ogg differ diff --git a/mods/ITEMS/mcl_bows/sounds/mcl_bows_firework_soft.ogg b/mods/ITEMS/mcl_bows/sounds/mcl_bows_firework_soft.ogg new file mode 100644 index 000000000..8b2e7bc5b Binary files /dev/null and b/mods/ITEMS/mcl_bows/sounds/mcl_bows_firework_soft.ogg differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow.png new file mode 100644 index 000000000..b688dab94 Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow.png differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_0.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_0.png new file mode 100644 index 000000000..41daad6d8 Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_0.png differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_1.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_1.png new file mode 100644 index 000000000..3769f2967 Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_1.png differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_2.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_2.png new file mode 100644 index 000000000..b1bb50feb Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_2.png differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_3.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_3.png new file mode 100644 index 000000000..8a8f1b03f Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_crossbow_3.png differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_blue.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_blue.png new file mode 100644 index 000000000..608dbe0d0 Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_blue.png differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_green.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_green.png new file mode 100644 index 000000000..acd74d6d1 Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_green.png differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_red.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_red.png new file mode 100644 index 000000000..4d7355c57 Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_red.png differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_white.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_white.png new file mode 100644 index 000000000..1860ee53c Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_white.png differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_yellow.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_yellow.png new file mode 100644 index 000000000..c2b745def Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_firework_yellow.png differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_rocket.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_rocket.png new file mode 100644 index 000000000..800185ce0 Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_rocket.png differ diff --git a/mods/ITEMS/mcl_bows/textures/mcl_bows_rocket_particle.png b/mods/ITEMS/mcl_bows/textures/mcl_bows_rocket_particle.png new file mode 100644 index 000000000..12a894c72 Binary files /dev/null and b/mods/ITEMS/mcl_bows/textures/mcl_bows_rocket_particle.png differ diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 5cb8288f0..664104b64 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -293,7 +293,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile local function drop_items_chest(pos, oldnode, oldmetadata) local meta = minetest.get_meta(pos) - local meta2 = meta + local meta2 = meta:to_table() if oldmetadata then meta:from_table(oldmetadata) end @@ -305,7 +305,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile minetest.add_item(p, stack) end end - meta:from_table(meta2:to_table()) + meta:from_table(meta2) end local function on_chest_blast(pos) @@ -610,10 +610,12 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile on_rightclick = function(pos, node, clicker) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") - if minetest.registered_nodes[minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name].groups.opaque == 1 - or minetest.registered_nodes[minetest.get_node({x = pos_other.x, y = pos_other.y + 1, z = pos_other.z}).name].groups.opaque == 1 then - -- won't open if there is no space from the top - return false + local above_def = minetest.registered_nodes[minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name] + local above_def_other = minetest.registered_nodes[minetest.get_node({x = pos_other.x, y = pos_other.y + 1, z = pos_other.z}).name] + + if not above_def or above_def.groups.opaque == 1 or not above_def_other or above_def_other.groups.opaque == 1 then + -- won't open if there is no space from the top + return false end local name = minetest.get_meta(pos):get_string("name") @@ -1055,6 +1057,20 @@ minetest.register_on_joinplayer(function(player) inv:set_size("enderchest", 9*3) end) +minetest.register_allow_player_inventory_action(function(player, action, inv, info) + if inv:get_location().type == "player" and ( + action == "move" and (info.from_list == "enderchest" or info.to_list == "enderchest") + or action == "put" and info.listname == "enderchest" + or action == "take" and info.listname == "enderchest" + ) then + local def = player:get_wielded_item():get_definition() + + if not minetest.find_node_near(player:get_pos(), def and def.range or ItemStack():get_definition().range, "mcl_chests:ender_chest_small", true) then + return 0 + end + end +end) + minetest.register_craft({ output = "mcl_chests:ender_chest", recipe = { @@ -1135,7 +1151,7 @@ for color, desc in pairs(boxtypes) do if mod_doc then if is_canonical then longdesc = S("A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.") - usagehelp = S("To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out.") + usagehelp = S("To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.") entry_name = S("Shulker Box") else create_entry = false diff --git a/mods/ITEMS/mcl_chests/locale/template.txt b/mods/ITEMS/mcl_chests/locale/template.txt index 1d947184b..d680c24c9 100644 --- a/mods/ITEMS/mcl_chests/locale/template.txt +++ b/mods/ITEMS/mcl_chests/locale/template.txt @@ -24,7 +24,7 @@ Red Shulker Box= Grey Shulker Box= Black Shulker Box= A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.= -To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out.= +To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.= Shulker Box= Large Chest= Inventory= diff --git a/mods/ITEMS/mcl_core/craftitems.lua b/mods/ITEMS/mcl_core/craftitems.lua index 03f30b7b9..85a078766 100644 --- a/mods/ITEMS/mcl_core/craftitems.lua +++ b/mods/ITEMS/mcl_core/craftitems.lua @@ -93,7 +93,7 @@ minetest.register_craftitem("mcl_core:gold_ingot", { minetest.register_craftitem("mcl_core:emerald", { description = S("Emerald"), - _doc_items_longdesc = S("Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting."), + _doc_items_longdesc = S("Emeralds are used in villager trades as currency."), inventory_image = "mcl_core_emerald.png", stack_max = 64, groups = { craftitem=1 }, diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index b41999ee4..7107a2373 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -184,6 +184,7 @@ minetest.register_abm({ end, }) +-- Cactus mechanisms minetest.register_abm({ label = "Cactus growth", nodenames = {"mcl_core:cactus"}, @@ -195,36 +196,46 @@ minetest.register_abm({ end, }) --- Make cactus destroy items minetest.register_abm({ - label = "Cactus destroy items", + label = "Cactus mechanisms", nodenames = {"mcl_core:cactus"}, interval = 1, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) for _, object in pairs(minetest.get_objects_inside_radius(pos, 0.9)) do - if not object:is_player() then - local entity = object:get_luaentity() - if entity then - local entity_name = entity.name - if entity_name == "__builtin:item" then - object:remove() - elseif entity_name == "mcl_minecarts:minecart" then - local pos = object:get_pos() - local driver = entity._driver - if driver then - mcl_player.player_attached[driver] = nil - local player = minetest.get_player_by_name(driver) - player:set_detach() - player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) - mcl_player.player_set_animation(player, "stand" , 30) - end - minetest.add_item(pos, "mcl_minecarts:minecart") - object:remove() + local entity = object:get_luaentity() + if entity then + local entity_name = entity.name + if entity_name == "__builtin:item" then + object:remove() + elseif entity_name == "mcl_minecarts:minecart" then + local pos = object:get_pos() + local driver = entity._driver + if driver then + mcl_player.player_attached[driver] = nil + local player = minetest.get_player_by_name(driver) + player:set_detach() + player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) + mcl_player.player_set_animation(player, "stand" , 30) end + minetest.add_item(pos, "mcl_minecarts:minecart") + object:remove() end end end + local posses = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } } + for _, p in pairs(posses) do + if minetest.registered_nodes[minetest.get_node(vector.new(pos.x + p[1], pos.y, pos.z + p[2])).name].walkable then + local posy = pos.y + while minetest.get_node(vector.new(pos.x, posy, pos.z)).name == "mcl_core:cactus" do + local pos = vector.new(pos.x, posy, pos.z) + minetest.remove_node(pos) + minetest.add_item(vector.offset(pos, math.random(-0.5, 0.5), 0, math.random(-0.5, 0.5)), "mcl_core:cactus") + posy = posy + 1 + end + break + end + end end, }) @@ -777,8 +788,7 @@ end local grass_spread_randomizer = PseudoRandom(minetest.get_mapgen_setting("seed")) --- Return appropriate grass block node for pos -function mcl_core.get_grass_block_type(pos) +function mcl_core.get_grass_palette_index(pos) local biome_data = minetest.get_biome_data(pos) local index = 0 if biome_data then @@ -789,7 +799,12 @@ function mcl_core.get_grass_block_type(pos) index = reg_biome._mcl_palette_index end end - return {name="mcl_core:dirt_with_grass", param2=index} + return index +end + +-- Return appropriate grass block node for pos +function mcl_core.get_grass_block_type(pos) + return {name = "mcl_core:dirt_with_grass", param2 = mcl_core.get_grass_palette_index(pos)} end ------------------------------ diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index 0a1cbad37..b064cebbe 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Smaragd Emerald Ore=Smaragderz Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Smaragderz ist das Erz von Smaragden. Es ist sehr selten und kann nur einzeln gefunden werden, nicht in Ansammlungen. -Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Smaragde sind nicht besonders nützlich, aber man kann sie in der Fertigung durch Goldbarren eintauschen. +Emeralds are used in villager trades as currency.= Flint=Feuerstein Flint is a raw material.=Feuerstein ist ein Rohstoff. Flowing Lava=Fließende Lava diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.es.tr b/mods/ITEMS/mcl_core/locale/mcl_core.es.tr index 1e1029c0f..1937babd3 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.es.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.es.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Esmeralda Emerald Ore=Mena de esmeralda Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=El mineral esmeralda es el mineral de las esmeraldas. Es muy raro y se puede encontrar solo, no en grupos. -Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Las esmeraldas no son muy útiles por sí mismas, pero pueden cambiarse por lingotes de oro haciendo artesanías. +Emeralds are used in villager trades as currency.= Flint=Pedernal Flint is a raw material.=El pedernal es una materia prima. Flowing Lava=Lava que fluye diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr b/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr index 725025e48..64aadd6db 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.fr.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Emeraude Emerald Ore=Minerai d'Emeraude Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Le minerai d'émeraude produit des émeraudes. Il est très rare et peut être trouvé seul, pas en filons. -Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Les émeraudes ne sont pas très utiles seules, mais elles peuvent être échangées contre des lingots d'or. +Emeralds are used in villager trades as currency.=Les émeraudes sont utilisées pour faire des échanges avec les villageois. Flint=Silex Flint is a raw material.=Le silex est une matière première. Flowing Lava=Lave qui coule diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr b/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr index 832a47830..68dfbd3d0 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.pl.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Szmaragd Emerald Ore=Ruda szmaragdu Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Ruda szmaragdu jest bardzo rzadka i występuje samotnie, nie w grupach. -Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Szmaragdy nie są zbyt użyteczne same w sobie, ale można z nich wytworzyć sztabki złota. +Emeralds are used in villager trades as currency.= Flint=Krzemień Flint is a raw material.=Krzemień jest surowym materiałem. Flowing Lava=Płynąca lawa diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr b/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr index f93db7c2c..2d5b5462c 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald=Изумруд Emerald Ore=Изумрудная руда Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Изумрудная руда встречается очень редко и всегда по одному блоку. -Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.=Изумруды не очень полезны сами по себе, но их можно обменять на золотые слитки. +Emeralds are used in villager trades as currency.= Flint=Кремень Flint is a raw material.=Кремень это необработанный материал. Flowing Lava=Текущая лава diff --git a/mods/ITEMS/mcl_core/locale/template.txt b/mods/ITEMS/mcl_core/locale/template.txt index 2cb74f5d1..19d156711 100644 --- a/mods/ITEMS/mcl_core/locale/template.txt +++ b/mods/ITEMS/mcl_core/locale/template.txt @@ -95,7 +95,7 @@ Dirt acts as a soil for a few plants. When in light, this block may grow a grass Emerald= Emerald Ore= Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.= -Emeralds are not very useful on their own, but they can exchanged for gold ingots by crafting.= +Emeralds are used in villager trades as currency.= Flint= Flint is a raw material.= Flowing Lava= diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index abc650bb0..fe1ee58c2 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -365,7 +365,7 @@ minetest.register_node("mcl_core:dirt_with_grass", { overlay_tiles = {"mcl_core_grass_block_top.png", "", {name="mcl_core_grass_block_side_overlay.png", tileable_vertical=false}}, palette = "mcl_core_palette_grass.png", palette_index = 0, - color = "#55aa60", + color = "#8EB971", is_ground_content = true, stack_max = 64, groups = {handy=1,shovely=1,dirt=2,grass_block=1, grass_block_no_snow=1, soil=1, soil_sapling=2, soil_sugarcane=1, cultivatable=2, spreading_dirt_type=1, enderman_takable=1, building_block=1}, diff --git a/mods/ITEMS/mcl_core/nodes_cactuscane.lua b/mods/ITEMS/mcl_core/nodes_cactuscane.lua index 839102534..e61d6df80 100644 --- a/mods/ITEMS/mcl_core/nodes_cactuscane.lua +++ b/mods/ITEMS/mcl_core/nodes_cactuscane.lua @@ -53,7 +53,10 @@ minetest.register_node("mcl_core:reeds", { _doc_items_longdesc = S("Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well."), _doc_items_usagehelp = S("Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow."), drawtype = "plantlike", + paramtype2 = "color", tiles = {"default_papyrus.png"}, + palette = "mcl_core_palette_grass.png", + palette_index = 0, inventory_image = "mcl_core_reeds.png", wield_image = "mcl_core_reeds.png", paramtype = "light", @@ -79,6 +82,7 @@ minetest.register_node("mcl_core:reeds", { groups = {dig_immediate=3, craftitem=1, deco_block=1, plant=1, non_mycelium_plant=1, dig_by_piston=1}, sounds = mcl_sounds.node_sound_leaves_defaults(), node_placement_prediction = "", + drop = "mcl_core:reeds", -- to prevent color inheritation on_place = mcl_util.generate_on_place_plant_function(function(place_pos, place_node) local soil_pos = {x=place_pos.x, y=place_pos.y-1, z=place_pos.z} local soil_node = minetest.get_node_or_nil(soil_pos) @@ -114,6 +118,15 @@ minetest.register_node("mcl_core:reeds", { return false end), + on_construct = function(pos) + local node = minetest.get_node(pos) + if node.param2 == 0 then + node.param2 = mcl_core.get_grass_palette_index(pos) + if node.param2 ~= 0 then + minetest.set_node(pos, node) + end + end + end, _mcl_blast_resistance = 0, _mcl_hardness = 0, }) diff --git a/mods/ITEMS/mcl_core/textures/default_papyrus.png b/mods/ITEMS/mcl_core/textures/default_papyrus.png index b6e2062ec..c928402f9 100644 Binary files a/mods/ITEMS/mcl_core/textures/default_papyrus.png and b/mods/ITEMS/mcl_core/textures/default_papyrus.png differ diff --git a/mods/ITEMS/mcl_dye/API.md b/mods/ITEMS/mcl_dye/API.md new file mode 100644 index 000000000..04169f966 --- /dev/null +++ b/mods/ITEMS/mcl_dye/API.md @@ -0,0 +1,14 @@ +# mcl_dye + +# Bone meal API +Callback and particle functions. + +## mcl_dye.add_bone_meal_particle(pos, def) +Spawns standard or custom bone meal particles. +* `pos`: position, is ignored if you define def.minpos and def.maxpos +* `def`: (optional) particle definition + +## mcl_dye.register_on_bone_meal_apply(function(pointed_thing, user)) +Called when the bone meal is applied anywhere. +* `pointed_thing`: exact pointing location (see Minetest API), where the bone meal is applied +* `user`: ObjectRef of the player who aplied the bone meal, can be nil! \ No newline at end of file diff --git a/mods/ITEMS/mcl_dye/init.lua b/mods/ITEMS/mcl_dye/init.lua index fbc330c7f..f5e282a8c 100644 --- a/mods/ITEMS/mcl_dye/init.lua +++ b/mods/ITEMS/mcl_dye/init.lua @@ -128,26 +128,35 @@ for _, row in ipairs(dyelocal.dyes) do end -- Bone Meal -local function bone_meal_particle(pos) +function mcl_dye.add_bone_meal_particle(pos, def) + if not def then + def = {} + end minetest.add_particlespawner({ - amount = 10, - time = 0.1, - minpos = { x = pos.x - 0.5, y = pos.y - 0.5, z = pos.z - 0.5 }, - maxpos = { x = pos.x + 0.5, y = pos.y + 0.5, z = pos.z + 0.5 }, - minvel = { x = 0, y = 0, z = 0}, - maxvel = { x = 0, y = 0, z = 0}, - minacc = { x = 0, y = 0, z = 0}, - maxacc = { x = 0, y = 0, z = 0}, - minexptime = 1, - maxexptime = 4, - minsize = 0.7, - maxsize = 2.4, + amount = def.amount or 10, + time = def.time or 0.1, + minpos = def.minpos or vector.subtract(pos, 0.5), + maxpos = def.maxpos or vector.add(pos, 0.5), + minvel = def.minvel or vector.new(-0.01, 0.01, -0.01), + maxvel = def.maxvel or vector.new(0.01, 0.01, 0.01), + minacc = def.minacc or vector.new(0, 0, 0), + maxacc = def.maxacc or vector.new(0, 0, 0), + minexptime = def.minexptime or 1, + maxexptime = def.maxexptime or 4, + minsize = def.minsize or 0.7, + maxsize = def.maxsize or 2.4, texture = "mcl_particles_bonemeal.png^[colorize:#00EE00:125", -- TODO: real MC color - glow = 5, + glow = def.glow or 1, }) end -function mcl_dye.apply_bone_meal(pointed_thing) +mcl_dye.bone_meal_callbacks = {} + +function mcl_dye.register_on_bone_meal_apply(func) + table.insert(mcl_dye.bone_meal_callbacks, func) +end + +local function apply_bone_meal(pointed_thing) -- Bone meal currently spawns all flowers found in the plains. local flowers_table_plains = { "mcl_flowers:dandelion", @@ -183,14 +192,21 @@ function mcl_dye.apply_bone_meal(pointed_thing) local pos = pointed_thing.under local n = minetest.get_node(pos) if n.name == "" then return false end + + for _, func in pairs(mcl_dye.bone_meal_callbacks) do + if func(pointed_thing, user) then + return true + end + end + if minetest.get_item_group(n.name, "sapling") >= 1 then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) -- Saplings: 45% chance to advance growth stage if math.random(1,100) <= 45 then return mcl_core.grow_sapling(pos, n) end elseif minetest.get_item_group(n.name, "mushroom") == 1 then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) -- Try to grow huge mushroom -- Must be on a dirt-type block @@ -240,71 +256,71 @@ function mcl_dye.apply_bone_meal(pointed_thing) return false -- Wheat, Potato, Carrot, Pumpkin Stem, Melon Stem: Advance by 2-5 stages elseif string.find(n.name, "mcl_farming:wheat_") then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) local stages = math.random(2, 5) return mcl_farming:grow_plant("plant_wheat", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:potato_") then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) local stages = math.random(2, 5) return mcl_farming:grow_plant("plant_potato", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:carrot_") then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) local stages = math.random(2, 5) return mcl_farming:grow_plant("plant_carrot", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:pumpkin_") then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) local stages = math.random(2, 5) return mcl_farming:grow_plant("plant_pumpkin_stem", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:melontige_") then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) local stages = math.random(2, 5) return mcl_farming:grow_plant("plant_melon_stem", pos, n, stages, true) elseif string.find(n.name, "mcl_farming:beetroot_") then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) -- Beetroot: 75% chance to advance to next stage if math.random(1, 100) <= 75 then return mcl_farming:grow_plant("plant_beetroot", pos, n, 1, true) end elseif n.name == "mcl_cocoas:cocoa_1" or n.name == "mcl_cocoas:cocoa_2" then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) -- Cocoa: Advance by 1 stage mcl_cocoas.grow(pos) return true elseif minetest.get_item_group(n.name, "grass_block") == 1 then - local grass_block_pos = {x = pos.x, y = pos.y + 1, z = pos.z} - bone_meal_particle(grass_block_pos) -- Grass Block: Generate tall grass and random flowers all over the place - for i = -2, 2 do - for j = -2, 2 do - pos = pointed_thing.above - pos = {x=pos.x+i, y=pos.y, z=pos.z+j} - n = minetest.get_node(pos) - local n2 = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) + for i = -7, 7 do + for j = -7, 7 do + for y = -1, 1 do + pos = vector.offset(pointed_thing.above, i, y, j) + n = minetest.get_node(pos) + local n2 = minetest.get_node(vector.offset(pos, 0, -1, 0)) - if n.name ~= "" and n.name == "air" and (minetest.get_item_group(n2.name, "grass_block_no_snow") == 1) then - -- Randomly generate flowers, tall grass or nothing - if math.random(1,100) <= 90 then - -- 90% tall grass, 10% flower - if math.random(1,100) <= 90 then - local col = n2.param2 - minetest.add_node(pos, {name="mcl_flowers:tallgrass", param2=col}) - else - local flowers_table - if mg_name == "v6" then - flowers_table = flowers_table_plains + if n.name ~= "" and n.name == "air" and (minetest.get_item_group(n2.name, "grass_block_no_snow") == 1) then + -- Randomly generate flowers, tall grass or nothing + if math.random(1, 100) <= 90 / ((math.abs(i) + math.abs(j)) / 2)then + -- 90% tall grass, 10% flower + mcl_dye.add_bone_meal_particle(pos, {amount = 4}) + if math.random(1,100) <= 90 then + local col = n2.param2 + minetest.add_node(pos, {name="mcl_flowers:tallgrass", param2=col}) else - local biome = minetest.get_biome_name(minetest.get_biome_data(pos).biome) - if biome == "Swampland" or biome == "Swampland_shore" or biome == "Swampland_ocean" or biome == "Swampland_deep_ocean" or biome == "Swampland_underground" then - flowers_table = flowers_table_swampland - elseif biome == "FlowerForest" or biome == "FlowerForest_beach" or biome == "FlowerForest_ocean" or biome == "FlowerForest_deep_ocean" or biome == "FlowerForest_underground" then - flowers_table = flowers_table_flower_forest - elseif biome == "Plains" or biome == "Plains_beach" or biome == "Plains_ocean" or biome == "Plains_deep_ocean" or biome == "Plains_underground" or biome == "SunflowerPlains" or biome == "SunflowerPlains_ocean" or biome == "SunflowerPlains_deep_ocean" or biome == "SunflowerPlains_underground" then + local flowers_table + if mg_name == "v6" then flowers_table = flowers_table_plains else - flowers_table = flowers_table_simple + local biome = minetest.get_biome_name(minetest.get_biome_data(pos).biome) + if biome == "Swampland" or biome == "Swampland_shore" or biome == "Swampland_ocean" or biome == "Swampland_deep_ocean" or biome == "Swampland_underground" then + flowers_table = flowers_table_swampland + elseif biome == "FlowerForest" or biome == "FlowerForest_beach" or biome == "FlowerForest_ocean" or biome == "FlowerForest_deep_ocean" or biome == "FlowerForest_underground" then + flowers_table = flowers_table_flower_forest + elseif biome == "Plains" or biome == "Plains_beach" or biome == "Plains_ocean" or biome == "Plains_deep_ocean" or biome == "Plains_underground" or biome == "SunflowerPlains" or biome == "SunflowerPlains_ocean" or biome == "SunflowerPlains_deep_ocean" or biome == "SunflowerPlains_underground" then + flowers_table = flowers_table_plains + else + flowers_table = flowers_table_simple + end end + minetest.add_node(pos, {name=flowers_table[math.random(1, #flowers_table)]}) end - minetest.add_node(pos, {name=flowers_table[math.random(1, #flowers_table)]}) end end end @@ -314,24 +330,24 @@ function mcl_dye.apply_bone_meal(pointed_thing) -- Double flowers: Drop corresponding item elseif n.name == "mcl_flowers:rose_bush" or n.name == "mcl_flowers:rose_bush_top" then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) minetest.add_item(pos, "mcl_flowers:rose_bush") return true elseif n.name == "mcl_flowers:peony" or n.name == "mcl_flowers:peony_top" then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) minetest.add_item(pos, "mcl_flowers:peony") return true elseif n.name == "mcl_flowers:lilac" or n.name == "mcl_flowers:lilac_top" then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) minetest.add_item(pos, "mcl_flowers:lilac") return true elseif n.name == "mcl_flowers:sunflower" or n.name == "mcl_flowers:sunflower_top" then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) minetest.add_item(pos, "mcl_flowers:sunflower") return true elseif n.name == "mcl_flowers:tallgrass" then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) -- Tall Grass: Grow into double tallgrass local toppos = { x=pos.x, y=pos.y+1, z=pos.z } local topnode = minetest.get_node(toppos) @@ -342,7 +358,7 @@ function mcl_dye.apply_bone_meal(pointed_thing) end elseif n.name == "mcl_flowers:fern" then - bone_meal_particle(pos) + mcl_dye.add_bone_meal_particle(pos) -- Fern: Grow into large fern local toppos = { x=pos.x, y=pos.y+1, z=pos.z } local topnode = minetest.get_node(toppos) @@ -413,7 +429,7 @@ minetest.register_craftitem("mcl_dye:white", { end -- Use the bone meal on the ground - if(mcl_dye.apply_bone_meal(pointed_thing) and (not minetest.is_creative_enabled(user:get_player_name()))) then + if (apply_bone_meal(pointed_thing, user) and (not minetest.is_creative_enabled(user:get_player_name()))) then itemstack:take_item() end return itemstack @@ -426,7 +442,7 @@ minetest.register_craftitem("mcl_dye:white", { else pointed_thing = { above = pos, under = droppos } end - local success = mcl_dye.apply_bone_meal(pointed_thing) + local success = apply_bone_meal(pointed_thing, nil) if success then stack:take_item() end diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index ecc9fe113..e876baf31 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -379,8 +379,51 @@ mcl_enchanting.enchantments.mending = { inv_tool_tab = true, } --- requires missing MineClone2 feature ---[[mcl_enchanting.enchantments.multishot = { +mcl_experience.register_on_add_xp(function(player, xp) + local inv = player:get_inventory() + + local candidates = { + {list = "main", index = player:get_wield_index()}, + {list = "armor", index = 2}, + {list = "armor", index = 3}, + {list = "armor", index = 4}, + {list = "armor", index = 5}, + } + + local final_candidates = {} + for _, can in ipairs(candidates) do + local stack = inv:get_stack(can.list, can.index) + local wear = stack:get_wear() + if mcl_enchanting.has_enchantment(stack, "mending") and wear > 0 then + can.stack = stack + can.wear = wear + table.insert(final_candidates, can) + end + end + + if #final_candidates > 0 then + local can = final_candidates[math.random(#final_candidates)] + local stack, list, index, wear = can.stack, can.list, can.index, can.wear + local uses = mcl_util.calculate_durability(stack) + local multiplier = 2 * 65535 / uses + local repair = xp * multiplier + local new_wear = wear - repair + + if new_wear < 0 then + xp = math.floor(-new_wear / multiplier + 0.5) + new_wear = 0 + else + xp = 0 + end + + stack:set_wear(math.floor(new_wear)) + inv:set_stack(list, index, stack) + end + + return xp +end, 0) + +mcl_enchanting.enchantments.multishot = { name = S("Multishot"), max_level = 1, primary = {crossbow = true}, @@ -396,10 +439,10 @@ mcl_enchanting.enchantments.mending = { power_range_table = {{20, 50}}, inv_combat_tab = true, inv_tool_tab = false, -}]]-- +} -- requires missing MineClone2 feature ---[[mcl_enchanting.enchantments.piercing = { +mcl_enchanting.enchantments.piercing = { name = S("Piercing"), max_level = 4, primary = {crossbow = true}, @@ -415,7 +458,7 @@ mcl_enchanting.enchantments.mending = { power_range_table = {{1, 50}, {11, 50}, {21, 50}, {31, 50}}, inv_combat_tab = true, inv_tool_tab = false, -}]]-- +} -- implemented in mcl_bows mcl_enchanting.enchantments.power = { @@ -456,7 +499,7 @@ mcl_enchanting.enchantments.punch = { } -- requires missing MineClone2 feature ---[[mcl_enchanting.enchantments.quick_charge = { +mcl_enchanting.enchantments.quick_charge = { name = S("Quick Charge"), max_level = 3, primary = {crossbow = true}, @@ -472,7 +515,7 @@ mcl_enchanting.enchantments.punch = { power_range_table = {{12, 50}, {32, 50}, {52, 50}}, inv_combat_tab = true, inv_tool_tab = false, -}]]-- +} -- unimplemented --[[mcl_enchanting.enchantments.respiration = { diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index d2a749947..97a176b97 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -123,7 +123,7 @@ function mcl_enchanting.can_enchant(itemstack, enchantment, level) if itemname == "" then return false, "item missing" end - local supported, primary = mcl_enchanting.item_supports_enchantment(itemstack:get_name(), enchantment) + local supported, primary = mcl_enchanting.item_supports_enchantment(itemname, enchantment) if not supported then return false, "item not supported" end @@ -132,7 +132,7 @@ function mcl_enchanting.can_enchant(itemstack, enchantment, level) end if level > enchantment_def.max_level then return false, "level too high", enchantment_def.max_level - elseif level < 1 then + elseif level < 1 then return false, "level too small", 1 end local item_enchantments = mcl_enchanting.get_enchantments(itemstack) @@ -270,8 +270,14 @@ function mcl_enchanting.initialize() new_def.groups.not_in_creative_inventory = 1 new_def.groups.not_in_craft_guide = 1 new_def.groups.enchanted = 1 - new_def._mcl_armor_texture = new_def._mcl_armor_texture and new_def._mcl_armor_texture .. mcl_enchanting.overlay - new_def._mcl_armor_preview = new_def._mcl_armor_preview and new_def._mcl_armor_preview .. mcl_enchanting.overlay + + if new_def._mcl_armor_texture and not type(new_def._mcl_armor_texture) == "function" then + new_def._mcl_armor_texture = new_def._mcl_armor_texture .. mcl_enchanting.overlay + end + if new_def._mcl_armor_preview and not type(new_def._mcl_armor_preview) == "function" then + new_def._mcl_armor_preview = new_def._mcl_armor_preview .. mcl_enchanting.overlay + end + new_def._mcl_enchanting_enchanted_tool = new_name new_def.after_use = get_after_use_callback(itemdef) local register_list = register_item_list @@ -289,115 +295,125 @@ function mcl_enchanting.initialize() end end -function mcl_enchanting.get_possible_enchantments(itemstack, enchantment_level, treasure) - local possible_enchantments, weights, accum_weight = {}, {}, 0 - for enchantment, enchantment_def in pairs(mcl_enchanting.enchantments) do - local _, _, _, primary = mcl_enchanting.can_enchant(itemstack, enchantment, 1) - if primary or treasure then - table.insert(possible_enchantments, enchantment) - accum_weight = accum_weight + enchantment_def.weight - weights[enchantment] = accum_weight - end +function mcl_enchanting.random(pr, ...) + local r = pr and pr:next(...) or math.random(...) + + if pr and not ({...})[1] then + r = r / 32767 end - return possible_enchantments, weights, accum_weight + + return r end -function mcl_enchanting.generate_random_enchantments(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted) +function mcl_enchanting.get_random_enchantment(itemstack, treasure, weighted, exclude, pr) + local possible = {} + + for enchantment, enchantment_def in pairs(mcl_enchanting.enchantments) do + local can_enchant, _, _, primary = mcl_enchanting.can_enchant(itemstack, enchantment, 1) + + if can_enchant and (primary or treasure) and (not exclude or table.indexof(exclude, enchantment) == -1) then + local weight = weighted and enchantment_def.weight or 1 + + for i = 1, weight do + table.insert(possible, enchantment) + end + end + end + + return #possible > 0 and possible[mcl_enchanting.random(pr, 1, #possible)] +end + +function mcl_enchanting.generate_random_enchantments(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted, pr) local itemname = itemstack:get_name() + if not mcl_enchanting.can_enchant_freshly(itemname) and not ignore_already_enchanted then return end + itemstack = ItemStack(itemstack) + local enchantability = minetest.get_item_group(itemname, "enchantability") - enchantability = 1 + math.random(0, math.floor(enchantability / 4)) + math.random(0, math.floor(enchantability / 4)) + enchantability = 1 + mcl_enchanting.random(pr, 0, math.floor(enchantability / 4)) + mcl_enchanting.random(pr, 0, math.floor(enchantability / 4)) + enchantment_level = enchantment_level + enchantability - enchantment_level = enchantment_level + enchantment_level * (math.random() + math.random() - 1) * 0.15 + enchantment_level = enchantment_level + enchantment_level * (mcl_enchanting.random(pr) + mcl_enchanting.random(pr) - 1) * 0.15 enchantment_level = math.max(math.floor(enchantment_level + 0.5), 1) + local enchantments = {} local description + enchantment_level = enchantment_level * 2 + repeat enchantment_level = math.floor(enchantment_level / 2) + if enchantment_level == 0 then break end - local possible, weights, accum_weight = mcl_enchanting.get_possible_enchantments(itemstack, enchantment_level, treasure) - local selected_enchantment, enchantment_power - if #possible > 0 then - local r = math.random(accum_weight) - for _, enchantment in ipairs(possible) do - if weights[enchantment] >= r then - selected_enchantment = enchantment - break - end - end - local enchantment_def = mcl_enchanting.enchantments[selected_enchantment] - local power_range_table = enchantment_def.power_range_table - for i = enchantment_def.max_level, 1, -1 do - local power_range = power_range_table[i] - if enchantment_level >= power_range[1] and enchantment_level <= power_range[2] then - enchantment_power = i - break - end - end - if not description then - if not enchantment_power then - return - end - description = mcl_enchanting.get_enchantment_description(selected_enchantment, enchantment_power) - end - if enchantment_power then - enchantments[selected_enchantment] = enchantment_power - mcl_enchanting.enchant(itemstack, selected_enchantment, enchantment_power) - end - else + + local selected_enchantment = mcl_enchanting.get_random_enchantment(itemstack, treasure, true, nil, pr) + + if not selected_enchantment then break end - until not no_reduced_bonus_chance and math.random() >= (enchantment_level + 1) / 50 + + local enchantment_def = mcl_enchanting.enchantments[selected_enchantment] + local power_range_table = enchantment_def.power_range_table + + local enchantment_power + + for i = enchantment_def.max_level, 1, -1 do + local power_range = power_range_table[i] + if enchantment_level >= power_range[1] and enchantment_level <= power_range[2] then + enchantment_power = i + break + end + end + + if not description then + if not enchantment_power then + return + end + + description = mcl_enchanting.get_enchantment_description(selected_enchantment, enchantment_power) + end + + if enchantment_power then + enchantments[selected_enchantment] = enchantment_power + mcl_enchanting.enchant(itemstack, selected_enchantment, enchantment_power) + end + + until not no_reduced_bonus_chance and mcl_enchanting.random(pr) >= (enchantment_level + 1) / 50 + return enchantments, description end -function mcl_enchanting.generate_random_enchantments_reliable(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted) +function mcl_enchanting.generate_random_enchantments_reliable(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted, pr) local enchantments + repeat - enchantments = mcl_enchanting.generate_random_enchantments(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted) + enchantments = mcl_enchanting.generate_random_enchantments(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted, pr) until enchantments + return enchantments end -function mcl_enchanting.enchant_randomly(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted) +function mcl_enchanting.enchant_randomly(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted, pr) + local enchantments = mcl_enchanting.generate_random_enchantments_reliable(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted, pr) + mcl_enchanting.set_enchanted_itemstring(itemstack) - mcl_enchanting.set_enchantments(itemstack, mcl_enchanting.generate_random_enchantments_reliable(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted)) + mcl_enchanting.set_enchantments(itemstack, enchantments) + return itemstack end -function mcl_enchanting.get_randomly_enchanted_book(enchantment_level, treasure, no_reduced_bonus_chance) - return mcl_enchanting.enchant_randomly(ItemStack("mcl_books:book"), enchantment_level, treasure, no_reduced_bonus_chance, true) -end +function mcl_enchanting.enchant_uniform_randomly(stack, exclude, pr) + local enchantment = mcl_enchanting.get_random_enchantment(stack, true, false, exclude, pr) -function mcl_enchanting.get_uniform_randomly_enchanted_book(except, pr) - except = except or except - local stack = ItemStack("mcl_enchanting:book_enchanted") - local list = {} - for enchantment in pairs(mcl_enchanting.enchantments) do - if table.indexof(except, enchantment) == -1 then - table.insert(list, enchantment) - end + if enchantment then + mcl_enchanting.enchant(stack, enchantment, mcl_enchanting.random(pr, 1, mcl_enchanting.enchantments[enchantment].max_level)) end - local index, level - if pr then - index = pr:next(1,#list) - else - index = math.random(#list) - end - local enchantment = list[index] - local enchantment_def = mcl_enchanting.enchantments[enchantment] - if pr then - level = pr:next(1, enchantment_def.max_level) - else - level = math.random(enchantment_def.max_level) - end - mcl_enchanting.enchant(stack, enchantment, level) + return stack end @@ -493,7 +509,7 @@ function mcl_enchanting.show_enchanting_formspec(player) .. "real_coordinates[true]" .. "image[3.15,0.6;7.6,4.1;mcl_enchanting_button_background.png]" local itemstack = inv:get_stack("enchanting_item", 1) - local player_levels = mcl_experience.get_player_xp_level(player) + local player_levels = mcl_experience.get_level(player) local y = 0.65 local any_enchantment = false local table_slots = mcl_enchanting.get_table_slots(player, itemstack, num_bookshelves) @@ -543,11 +559,11 @@ function mcl_enchanting.handle_formspec_fields(player, formname, fields) if not slot then return end - local player_level = mcl_experience.get_player_xp_level(player) + local player_level = mcl_experience.get_level(player) if player_level < slot.level_requirement then return end - mcl_experience.set_player_xp_level(player, player_level - button_pressed) + mcl_experience.set_level(player, player_level - button_pressed) inv:remove_item("enchanting_lapis", cost) mcl_enchanting.set_enchanted_itemstring(itemstack) mcl_enchanting.set_enchantments(itemstack, slot.enchantments) diff --git a/mods/ITEMS/mcl_enchanting/init.lua b/mods/ITEMS/mcl_enchanting/init.lua index 5aec1ced6..9f9fbd271 100644 --- a/mods/ITEMS/mcl_enchanting/init.lua +++ b/mods/ITEMS/mcl_enchanting/init.lua @@ -183,7 +183,7 @@ minetest.register_entity("mcl_enchanting:book", { collisionbox = {0, 0, 0}, pointable = false, physical = false, - textures = {"mcl_enchanting_book_entity.png"}, + textures = {"mcl_enchanting_book_entity.png", "mcl_enchanting_book_entity.png", "mcl_enchanting_book_entity.png", "mcl_enchanting_book_entity.png", "mcl_enchanting_book_entity.png"}, static_save = false, }, _player_near = false, diff --git a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.es.tr b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.es.tr new file mode 100644 index 000000000..a977e8fe6 --- /dev/null +++ b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.es.tr @@ -0,0 +1,123 @@ +# textdomain: mcl_enchanting + + +### enchantments.lua ### + +Arrows passes through multiple objects.=Las flechas atraviesan multiples enemigos. +Arrows set target on fire.=Las flechas prenderan los enemigos. +Bane of Arthropods=Perdición de los Artrópodos +Channeling=Conductividad + +Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.=Canaliza los rayos de una tormenta hacia el enemigo. + +Curse of Vanishing=Maldición de Desaparición +Decreases crossbow charging time.=Disminuye el tiempo de carga de las ballestas. +Decreases time until rod catches something.=Disminuye el tiempo que tardan en picar los cebos en la pesca. +Depth Strider=Agilidad acuática +Efficiency=Eficiencia +Extends underwater breathing time.=Aumenta el tiempo de mantener la respiración. +Fire Aspect=Aspecto Ígneo +Flame=Fuego +Fortune=Fortuna +Frost Walker=Paso Helado +Impaling=Empalamiento +Increases arrow damage.=Incrementa el daño de las flechas. +Increases arrow knockback.=Incrementa el empuje de las flechas. +Increases certain block drops.=Incrementa la cantidad de objetos que sueltan los bloques. + +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Incrementa el daño y ralentiza a los artrópodos. (arañas, lepismas, endermitas, etc) + +Increases damage to undead mobs.=Incrementa el daño contra no-muertos. +Increases damage.=Incrementa el daño. +Increases item durability.=Incrementa la durabilidad de una herramienta. +Increases knockback.=Incrementa el empuje. +Increases mining speed.=Incrementa la velocidad de picado. +Increases mob loot.=Incrementa el botín de los enemigos. +Increases rate of good loot (enchanting books, etc.)=Incrementa la probabilidad de encontrar tesoros. +Increases sweeping attack damage.=Incrementa el daño de efecto area. +Increases underwater movement speed.=Incrementa la velocidad de nado bajo el agua. +Increases walking speed on soul sand.=Incrementa la velocidad al caminar sobre arena de Almas. +Infinity=Infinidad +Item destroyed on death.=El objeto se destruye tras tu muerte. +Knockback=Empuje +Looting=Botín +Loyalty=Lealtad +Luck of the Sea=Suerte Marina +Lure=Atracción +Mending=Reparación +Mined blocks drop themselves.=Los bloques se minarán enteros. +Multishot=Multidisparo +Piercing=Perforación +Power=Poder +Punch=Retroceso +Quick Charge=Carga Rápida +Repair the item while gaining XP orbs.=Repara los objetos portados al recibir orbes de experiencia. +Respiration=Respiración +Riptide=Propulsión acuática +Sets target on fire.=Incencia al enemigo. +Sharpness=Filo +Shoot 3 arrows at the cost of one.=Dispara 3 flechas al precio de una. +Shooting consumes no regular arrows.=No se consumiran las flechas lanzadas. +Silk Touch=Toque de Seda +Smite=Golpeo +Soul Speed=Velocidad de Almas +Sweeping Edge=Filo Arrasador +Trident deals additional damage to ocean mobs.=Incrementa el daño del tridente sobre criaturas acuáticas. + +Trident launches player with itself when thrown. Works only in water or rain.=El tridente impulsa al portador dentro del agua o bajo la lluvia. + +Trident returns after being thrown. Higher levels reduce return time.=El tridente regresa al portador tras lanzarlo. + +Turns water beneath the player into frosted ice and prevents the damage from magma blocks.=Congela el agua bajo tus pies y evita el daño de los bloques de magma. + +Unbreaking=Irrompibilidad + +### engine.lua ### + +@1 Enchantment Levels=Nivel de encantamiento: @1 +@1 Lapis Lazuli=@1 Lapis Lázuli +Inventory=Inventario +Level requirement: @1=Nivel requerido: @1 + +### init.lua ### + +'@1' is not a valid number='@1' no es un número válido +'@1' is not a valid number.='@1' no es un número válido + []= [] +@1 can't be combined with @2.=@1 no se puede combinar con @2 + +After finally selecting your enchantment; left-click on the selection, and you will see both the lapis lazuli and your experience levels consumed. And, an enchanted item left in its place.=Despues elige tu encantamiento, los niveles de experiencia y el lapis lázuli seran consumidos y el encantamiento aplicado al objeto. + +After placing your items in the slots, the enchanting options will be shown. Hover over the options to read what is available to you.=Coloca el objeto en su ranura yse mostraran los encantamientos a elegir. + +Enchant=Encantamiento +Enchant an item=Encantar objeto +Enchanted Book=Libro Encantado +Enchanting Table=Mesa de Encantamientos + +Enchanting Tables will let you enchant armors, tools, weapons, and books with various abilities. But, at the cost of some experience, and lapis lazuli.=La mesa de Encantamientos dara a tus herramientas, armas o armadura algunas habilidades magicas. Pero a coste de algo de experiencia y lapis lázuli. + +Enchanting succeded.=Encantado correctamente. +Forcefully enchant an item=Encantar objeto a la fuerza. + +Place a tool, armor, weapon or book into the top left slot, and then place 1-3 Lapis Lazuli in the slot to the right.=Coloca una herramienta, arma, armadura o libro sobre la ranura izquierda, coloca de 1 a 3 Lapis lázulis en la ranura derecha. + +Player '@1' cannot be found.=Jugador @1 no encontrado. +Rightclick the Enchanting Table to open the enchanting menu.=Clic derecho sobre la mesa de encantamientos para abrir la interfaz. +Spend experience, and lapis to enchant various items.=Experiencia y Lapis para encantar varios objetos. + +The number you have entered (@1) is too big, it must be at most @2.=@1 es muy grande, debe ser menor que @2 + +The number you have entered (@1) is too small, it must be at least @2.=@1 es muy pequeño, debe ser mayor a @2 + +The selected enchantment can't be added to the target item.=El encantamiento seleccionado no puede añadirse a ese objeto. +The target doesn't hold an item.=El jugador no sujeta un objeto. +The target item is not enchantable.=El objeto del jugador no se puede encantar. +There is no such enchantment '@1'.=@1 no es un encantamiento. + +These options are randomized, and dependent on experience level; but the enchantment strength can be increased.=Las opciones seran aleatorias dependiendo del nivel de experiencia, los niveles de encantamiento pueden ser aumentados. + +To increase the enchantment strength, place bookshelves around the enchanting table. However, you will need to keep 1 air node between the table, & the bookshelves to empower the enchanting table.=Para aumentar los niveles de encantamientos, coloca librerias alrededor y cerca de la mesa de encantamientos. + +Usage: /enchant []=Usa: /enchant [] +Usage: /forceenchant []=Usa /forceenchant [] diff --git a/mods/ITEMS/mcl_enchanting/locale/template.txt b/mods/ITEMS/mcl_enchanting/locale/template.txt index 08fa82097..1f540d6d3 100644 --- a/mods/ITEMS/mcl_enchanting/locale/template.txt +++ b/mods/ITEMS/mcl_enchanting/locale/template.txt @@ -1,100 +1,129 @@ # textdomain: mcl_enchanting -Aqua Affinity= -Increases underwater mining speed.= -Bane of Arthropods= -Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).= -Blast Protection= -Reduces explosion damage and knockback.= -Channeling= -Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.= -Curse of Binding= -Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.= -Curse of Vanishing= -Item destroyed on death.= -Depth Strider= -Increases underwater movement speed.= -Efficiency= -Increases mining speed.= -Feather Falling= -Reduces fall damage.= -Fire Aspect= -Sets target on fire.= -Fire Protection= -Reduces fire damage.= -Flame= -Arrows set target on fire.= -Fortune= -Increases certain block drops.= -Frost Walker= -Turns water beneath the player into frosted ice and prevents the damage from magma blocks.= -Impaling= -Trident deals additional damage to ocean mobs.= -Infinity= -Shooting consumes no regular arrows.= -Knockback= -Increases knockback.= -Looting= -Increases mob loot.= -Loyalty= -Trident returns after being thrown. Higher levels reduce return time.= -Luck of the Sea= -Increases rate of good loot (enchanting books, etc.)= -Lure= -Decreases time until rod catches something.= -Mending= -Repair the item while gaining XP orbs.= -Multishot= -Shoot 3 arrows at the cost of one.= -Piercing= + + +### enchantments.lua ### + Arrows passes through multiple objects.= -Power= -Increases arrow damage.= -Projectile Protection= -Reduces projectile damage.= -Protection= -Reduces most types of damage by 4% for each level.= -Punch= -Increases arrow knockback.= -Quick Charge= +Arrows set target on fire.= +Bane of Arthropods= +Channeling= + +Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.= + +Curse of Vanishing= Decreases crossbow charging time.= -Respiration= +Decreases time until rod catches something.= +Depth Strider= +Efficiency= Extends underwater breathing time.= -Riptide= -Trident launches player with itself when thrown. Works only in water or rain.= -Sharpness= -Increases damage.= -Silk Touch= -Mined blocks drop themselves.= -Smite= +Fire Aspect= +Flame= +Fortune= +Frost Walker= +Impaling= +Increases arrow damage.= +Increases arrow knockback.= +Increases certain block drops.= + +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).= + Increases damage to undead mobs.= -Soul Speed= -Increases walking speed on soul sand.= -Sweeping Edge= -Increases sweeping attack damage.= -Thorns= -Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.= -Unbreaking= +Increases damage.= Increases item durability.= -Inventory= -@1 Lapis Lazuli= +Increases knockback.= +Increases mining speed.= +Increases mob loot.= +Increases rate of good loot (enchanting books, etc.)= +Increases sweeping attack damage.= +Increases underwater movement speed.= +Increases walking speed on soul sand.= +Infinity= +Item destroyed on death.= +Knockback= +Looting= +Loyalty= +Luck of the Sea= +Lure= +Mending= +Mined blocks drop themselves.= +Multishot= +Piercing= +Power= +Punch= +Quick Charge= +Repair the item while gaining XP orbs.= +Respiration= +Riptide= +Sets target on fire.= +Sharpness= +Shoot 3 arrows at the cost of one.= +Shooting consumes no regular arrows.= +Silk Touch= +Smite= +Soul Speed= +Sweeping Edge= +Trident deals additional damage to ocean mobs.= + +Trident launches player with itself when thrown. Works only in water or rain.= + +Trident returns after being thrown. Higher levels reduce return time.= + +Turns water beneath the player into frosted ice and prevents the damage from magma blocks.= + +Unbreaking= + +### engine.lua ### + @1 Enchantment Levels= +@1 Lapis Lazuli= +Inventory= Level requirement: @1= -Enchant an item= - []= -Usage: /enchant []= -Player '@1' cannot be found.= -There is no such enchantment '@1'.= -The target doesn't hold an item.= -The selected enchantment can't be added to the target item.= + +### init.lua ### + '@1' is not a valid number= -The number you have entered (@1) is too big, it must be at most @2.= -The number you have entered (@1) is too small, it must be at least @2.= -@1 can't be combined with @2.= -Enchanting succeded.= -Forcefully enchant an item= -Usage: /forceenchant []= -The target item is not enchantable.= '@1' is not a valid number.= + []= +@1 can't be combined with @2.= + +After finally selecting your enchantment; left-click on the selection, and you will see both the lapis lazuli and your experience levels consumed. And, an enchanted item left in its place.= + +After placing your items in the slots, the enchanting options will be shown. Hover over the options to read what is available to you.= + +Enchant= +Enchant an item= Enchanted Book= Enchanting Table= -Enchant= + +Enchanting Tables will let you enchant armors, tools, weapons, and books with various abilities. But, at the cost of some experience, and lapis lazuli.= + +Enchanting succeded.= +Forcefully enchant an item= + +Place a tool, armor, weapon or book into the top left slot, and then place 1-3 Lapis Lazuli in the slot to the right.= + +Player '@1' cannot be found.= +Rightclick the Enchanting Table to open the enchanting menu.= +Spend experience, and lapis to enchant various items.= + +The number you have entered (@1) is too big, it must be at most @2.= + +The number you have entered (@1) is too small, it must be at least @2.= + +The selected enchantment can't be added to the target item.= +The target doesn't hold an item.= +The target item is not enchantable.= +There is no such enchantment '@1'.= + +These options are randomized, and dependent on experience level; but the enchantment strength can be increased.= + +To increase the enchantment strength, place bookshelves around the enchanting table. However, you will need to keep 1 air node between the table, & the bookshelves to empower the enchanting table.= + +Usage: /enchant []= +Usage: /forceenchant []= + + +##### not used anymore ##### + +# textdomain: mcl_enchanting +Aqua Affinity= diff --git a/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.es.tr b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.es.tr new file mode 100644 index 000000000..e66eb06a5 --- /dev/null +++ b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.es.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_fireworks +Firework Rocket= +Flight Duration:= \ No newline at end of file diff --git a/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.fr.tr b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.fr.tr new file mode 100644 index 000000000..b02faa428 --- /dev/null +++ b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.fr.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_fireworks +Firework Rocket=Fusée +Flight Duration:=Durée de vol : \ No newline at end of file diff --git a/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.ru.tr b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.ru.tr new file mode 100644 index 000000000..e66eb06a5 --- /dev/null +++ b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.ru.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_fireworks +Firework Rocket= +Flight Duration:= \ No newline at end of file diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index e0c78832f..788e591dc 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -37,7 +37,7 @@ local fish = function(itemstack, player, pointed_thing) local num = 0 local ent = nil local noent = true - + local durability = 65 local unbreaking = mcl_enchanting.get_enchantment(itemstack, "unbreaking") if unbreaking > 0 then @@ -71,7 +71,9 @@ local fish = function(itemstack, player, pointed_thing) { itemstring = "mcl_fishing:salmon_raw", weight = 25 }, { itemstring = "mcl_fishing:clownfish_raw", weight = 2 }, { itemstring = "mcl_fishing:pufferfish_raw", weight = 13 }, - } + }, + stacks_min = 1, + stacks_max = 1, }, pr) elseif r <= junk_value then -- Junk @@ -88,21 +90,29 @@ local fish = function(itemstack, player, pointed_thing) { itemstring = "mcl_mobitems:bone", weight = 10 }, { itemstring = "mcl_dye:black", weight = 1, amount_min = 10, amount_max = 10 }, { itemstring = "mcl_mobitems:string", weight = 10 }, -- TODO: Tripwire Hook - } + }, + stacks_min = 1, + stacks_max = 1, }, pr) else -- Treasure items = mcl_loot.get_loot({ items = { - -- TODO: Enchanted Bow - { itemstring = "mcl_bows:bow", wear_min = 49144, wear_max = 65535 }, -- 75%-100% damage - { itemstack = mcl_enchanting.get_randomly_enchanted_book(30, true, true)}, - -- TODO: Enchanted Fishing Rod - { itemstring = "mcl_fishing:fishing_rod", wear_min = 49144, wear_max = 65535 }, -- 75%-100% damage + { itemstring = "mcl_bows:bow", wear_min = 49144, wear_max = 65535, func = function(stack, pr) + mcl_enchanting.enchant_randomly(stack, 30, true, false, false, pr) + end }, -- 75%-100% damage + { itemstring = "mcl_books:book", func = function(stack, pr) + mcl_enchanting.enchant_randomly(stack, 30, true, true, false, pr) + end }, + { itemstring = "mcl_fishing:fishing_rod", wear_min = 49144, wear_max = 65535, func = function(stack, pr) + mcl_enchanting.enchant_randomly(stack, 30, true, false, false, pr) + end }, -- 75%-100% damage { itemstring = "mcl_mobs:nametag", }, { itemstring = "mcl_mobitems:saddle", }, { itemstring = "mcl_flowers:waterlily", }, - } + }, + stacks_min = 1, + stacks_max = 1, }, pr) end local item @@ -117,8 +127,8 @@ local fish = function(itemstack, player, pointed_thing) else minetest.add_item(pos, item) end - if mcl_experience.throw_experience then - mcl_experience.throw_experience(pos, math.random(1,6)) + if mcl_experience.throw_xp then + mcl_experience.throw_xp(pos, math.random(1,6)) end if not minetest.is_creative_enabled(player:get_player_name()) then diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index ca43b275a..9f836d161 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -75,9 +75,9 @@ local function give_xp(pos, player) local xp = meta:get_int("xp") if xp > 0 then if player then - mcl_experience.add_experience(player, xp) + mcl_experience.add_xp(player, xp) else - mcl_experience.throw_experience(vector.add(pos, dir), xp) + mcl_experience.throw_xp(vector.add(pos, dir), xp) end meta:set_int("xp", 0) end @@ -461,7 +461,7 @@ minetest.register_node("mcl_furnaces:furnace", { on_timer = furnace_node_timer, after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) - local meta2 = meta + local meta2 = meta:to_table() meta:from_table(oldmetadata) local inv = meta:get_inventory() for _, listname in ipairs({"src", "dst", "fuel"}) do @@ -471,7 +471,7 @@ minetest.register_node("mcl_furnaces:furnace", { minetest.add_item(p, stack) end end - meta:from_table(meta2:to_table()) + meta:from_table(meta2) end, on_construct = function(pos) diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index 9defa26ca..36a21ad95 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -61,7 +61,7 @@ local def_hopper = { after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) - local meta2 = meta + local meta2 = meta:to_table() meta:from_table(oldmetadata) local inv = meta:get_inventory() for i=1,inv:get_size("main") do @@ -71,7 +71,7 @@ local def_hopper = { minetest.add_item(p, stack) end end - meta:from_table(meta2:to_table()) + meta:from_table(meta2) end, allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) local name = player:get_player_name() @@ -350,7 +350,7 @@ minetest.register_abm({ local inv = meta:get_inventory() for _,object in pairs(minetest.get_objects_inside_radius(pos, 2)) do - if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" and not object:get_luaentity()._removed then if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then -- Item must get sucked in when the item just TOUCHES the block above the hopper -- This is the reason for the Y calculation. diff --git a/mods/ITEMS/mcl_maps/locale/mcl_maps.fr.tr b/mods/ITEMS/mcl_maps/locale/mcl_maps.fr.tr index 9ef7cd5c5..1808e839d 100644 --- a/mods/ITEMS/mcl_maps/locale/mcl_maps.fr.tr +++ b/mods/ITEMS/mcl_maps/locale/mcl_maps.fr.tr @@ -1,5 +1,8 @@ # textdomain: mcl_maps Empty Map=Carte Vierge Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=Les cartes vierges ne sont pas utiles en tant que cartes, mais elles peuvent être empilées et transformées en cartes utilisables. -Rightclick to start using the map (which can't be stacked anymore).=Clic droit pour commencer à utiliser la carte (qui ne peut plus être empilée). +Rightclick to create a filled map (which can't be stacked anymore).=Clic droit pour créer une carte remplie (qui ne peut plus être empilée). Map=Carte +Shows a map image.=Affiche une carte. +When created, the map saves the nearby area as an image that can be viewed any time by holding the map.=Lors de sa création, la carte sauvegarde le terrain proche sous forme d'image qui peut être consultée n'importe quand en tenant la carte dans la main. +Hold the map in your hand. This will display a map on your screen.=Tenez la carte dans votre main. Cela affichera la carte à l'écran. diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index 6c5d7f6e4..0795fb611 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -317,7 +317,7 @@ minetest.register_node("mcl_mobspawners:spawner", { if obj then obj:remove() end - mcl_experience.throw_experience(pos, math.random(15, 43)) + mcl_experience.throw_xp(pos, math.random(15, 43)) end, on_punch = function(pos) @@ -387,4 +387,3 @@ minetest.register_lbm({ respawn_doll(pos) end, }) - diff --git a/mods/ITEMS/mcl_nether_gold/LICENSE b/mods/ITEMS/mcl_nether_gold/LICENSE deleted file mode 100644 index e72bfddab..000000000 --- a/mods/ITEMS/mcl_nether_gold/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/mods/ITEMS/mcl_nether_gold/README.md b/mods/ITEMS/mcl_nether_gold/README.md deleted file mode 100644 index 928816fa0..000000000 --- a/mods/ITEMS/mcl_nether_gold/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# mcl_nether_gold -### by NO11 -You need the Minetest subgame "Mineclone 2" to use the mod. \ No newline at end of file diff --git a/mods/ITEMS/mcl_nether_gold/depends.txt b/mods/ITEMS/mcl_nether_gold/depends.txt deleted file mode 100644 index e504fcdd8..000000000 --- a/mods/ITEMS/mcl_nether_gold/depends.txt +++ /dev/null @@ -1,3 +0,0 @@ -mcl_core -mcl_sounds -mcl_nether \ No newline at end of file diff --git a/mods/ITEMS/mcl_nether_gold/description.txt b/mods/ITEMS/mcl_nether_gold/description.txt deleted file mode 100644 index e63ef43c4..000000000 --- a/mods/ITEMS/mcl_nether_gold/description.txt +++ /dev/null @@ -1 +0,0 @@ -Adds Nether Gold Ore \ No newline at end of file diff --git a/mods/ITEMS/mcl_nether_gold/init.lua b/mods/ITEMS/mcl_nether_gold/init.lua deleted file mode 100644 index c86f46211..000000000 --- a/mods/ITEMS/mcl_nether_gold/init.lua +++ /dev/null @@ -1,53 +0,0 @@ -minetest.register_node("mcl_nether_gold:nether_gold_ore", { - description = ("Nether Gold Ore"), - _doc_items_longdesc = ("Nether gold ore is an ore containing nether gold. It is commonly found around netherrack in the Nether."), - stack_max = 64, - tiles = {"mcl_nether_netherrack.png^mcl_nether_gold_ore.png"}, - is_ground_content = true, - groups = {pickaxey=1, building_block=1, material_stone=1, xp=0}, - drop = { - max_items = 1, - items = { - {items = {'mcl_core:gold_nugget 6'},rarity = 5}, - {items = {'mcl_core:gold_nugget 5'},rarity = 5}, - {items = {'mcl_core:gold_nugget 4'},rarity = 5}, - {items = {'mcl_core:gold_nugget 3'},rarity = 5}, - {items = {'mcl_core:gold_nugget 2'}}, - } - }, - sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 3, - _mcl_hardness = 3, - _mcl_silk_touch_drop = true, - _mcl_fortune_drop = mcl_core.fortune_drop_ore -}) - -minetest.register_craft({ - type = "cooking", - output = 'mcl_core:gold_ingot', - recipe = 'mcl_nether_gold:nether_gold_ore', - cooktime = 10, -}) - -if minetest.settings:get_bool("mcl_generate_ores", true) then - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_nether_gold:nether_gold_ore", - wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, - clust_scarcity = 850, - clust_num_ores = 4, -- MC cluster amount: 4-10 - clust_size = 3, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_nether_gold:nether_gold_ore", - wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, - clust_scarcity = 1650, - clust_num_ores = 8, -- MC cluster amount: 4-10 - clust_size = 4, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) -end \ No newline at end of file diff --git a/mods/ITEMS/mcl_nether_gold/mod.conf b/mods/ITEMS/mcl_nether_gold/mod.conf deleted file mode 100644 index 8ee4241e8..000000000 --- a/mods/ITEMS/mcl_nether_gold/mod.conf +++ /dev/null @@ -1 +0,0 @@ -name = mcl_nether_gold \ No newline at end of file diff --git a/mods/ITEMS/mcl_nether_gold/screenshot.png b/mods/ITEMS/mcl_nether_gold/screenshot.png deleted file mode 100644 index ee9cac199..000000000 Binary files a/mods/ITEMS/mcl_nether_gold/screenshot.png and /dev/null differ diff --git a/mods/ITEMS/mcl_nether_gold/textures/mcl_nether_gold_ore.png b/mods/ITEMS/mcl_nether_gold/textures/mcl_nether_gold_ore.png deleted file mode 100644 index 9b621e586..000000000 Binary files a/mods/ITEMS/mcl_nether_gold/textures/mcl_nether_gold_ore.png and /dev/null differ diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index 9f0db352a..e4982c39b 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -391,7 +391,3 @@ minetest.override_item("mcl_end:ender_eye", { return itemstack end, }) -minetest.override_item("mcl_core:bedrock", { - after_destruct = destroy_portal, -}) - diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index 1b673a7c2..838c1be95 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -242,6 +242,11 @@ local function destroy_nether_portal(pos, node) check_remove({x = pos.x, y = pos.y + 1, z = pos.z}) end +local on_rotate +if minetest.get_modpath("screwdriver") then + on_rotate = screwdriver.disallow +end + minetest.register_node(PORTAL, { description = S("Nether Portal"), _doc_items_longdesc = S("A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!"), @@ -291,6 +296,7 @@ minetest.register_node(PORTAL, { groups = { creative_breakable = 1, portal = 1, not_in_creative_inventory = 1 }, sounds = mcl_sounds.node_sound_glass_defaults(), after_destruct = destroy_nether_portal, + on_rotate = on_rotate, _mcl_hardness = -1, _mcl_blast_resistance = 0, diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua index 09b95115a..c3b034b66 100644 --- a/mods/ITEMS/mcl_potions/functions.lua +++ b/mods/ITEMS/mcl_potions/functions.lua @@ -35,13 +35,13 @@ local function potions_init_icons(player) local name = player:get_player_name() icon_ids[name] = {} for e=1, EFFECT_TYPES do - local x = -7 + -38 * e + local x = -52 * e - 2 local id = player:hud_add({ hud_elem_type = "image", text = "blank.png", position = { x = 1, y = 0 }, - offset = { x = x, y = 272 }, - scale = { x = 2, y = 2 }, + offset = { x = x, y = 3 }, + scale = { x = 3, y = 3 }, alignment = { x = 1, y = 1 }, z_index = 100, }) diff --git a/mods/ITEMS/mcl_potions/tipped_arrow.lua b/mods/ITEMS/mcl_potions/tipped_arrow.lua index ab55cb72a..1717533a8 100644 --- a/mods/ITEMS/mcl_potions/tipped_arrow.lua +++ b/mods/ITEMS/mcl_potions/tipped_arrow.lua @@ -463,4 +463,4 @@ function mcl_potions.register_arrow(name, desc, color, def) if minetest.get_modpath("doc_identifier") then doc.sub.identifier.register_object("mcl_bows:arrow_entity", "craftitems", "mcl_bows:arrow") end -end \ No newline at end of file +end diff --git a/mods/ITEMS/mcl_sponges/init.lua b/mods/ITEMS/mcl_sponges/init.lua index a1998ecb0..e9755479b 100644 --- a/mods/ITEMS/mcl_sponges/init.lua +++ b/mods/ITEMS/mcl_sponges/init.lua @@ -115,16 +115,22 @@ function place_wet_sponge(itemstack, placer, pointed_thing) if mcl_worlds.pos_to_dimension(pointed_thing.above) == "nether" then minetest.item_place_node(ItemStack("mcl_sponges:sponge"), placer, pointed_thing) local pos = pointed_thing.above - for n = 0, 25 do - minetest.add_particle({ - pos = {x = pos.x + math.random(-1, 1)*math.random()/2, y = pos.y + 0.6, z = pos.z + math.random(-1, 1)*math.random()/2}, - velocity = {x = 0, y = math.random(), z = 0}, - acceleration = {x=0, y=0, z=0}, - expirationtime = math.random(), + + for n = 1, 5 do + minetest.add_particlespawner({ + amount = 5, + time = 0.1, + minpos = vector.offset(pos, -0.5, 0.6, -0.5), + maxpos = vector.offset(pos, 0.5, 0.6, 0.5), + minvel = vector.new(0, 0.1, 0), + maxvel = vector.new(0, 1, 0), + minexptime = 0.1, + maxexptime = 1, + minsize = 2, + maxsize = 5, collisiondetection = false, vertical = false, - size = math.random(2, 5), - texture = "mcl_particles_sponge"..math.random(1, 5)..".png", + texture = "mcl_particles_sponge" .. n .. ".png", }) end if not minetest.is_creative_enabled(name) then diff --git a/mods/ITEMS/mcl_totems/init.lua b/mods/ITEMS/mcl_totems/init.lua index 499d7362d..b11e68df7 100644 --- a/mods/ITEMS/mcl_totems/init.lua +++ b/mods/ITEMS/mcl_totems/init.lua @@ -4,6 +4,8 @@ minetest.register_on_leaveplayer(function(player) hud_totem[player] = nil end) +local particle_colors = {"98BF22", "C49E09", "337D0B", "B0B021", "1E9200"} -- TODO: real MC colors + -- Save the player from death when holding totem of undying in hand mcl_damage.register_modifier(function(obj, damage, reason) if obj:is_player() then @@ -14,7 +16,7 @@ mcl_damage.register_modifier(function(obj, damage, reason) local ppos = obj:get_pos() local pnname = minetest.get_node(ppos).name -- Some exceptions when _not_ to save the player - for n=1, #mobs_mc.misc.totem_fail_nodes do + for n = 1, #mobs_mc.misc.totem_fail_nodes do if pnname == mobs_mc.misc.totem_fail_nodes[n] then return end @@ -30,16 +32,41 @@ mcl_damage.register_modifier(function(obj, damage, reason) end -- Effects - minetest.sound_play({name = "mcl_totems_totem", gain=1}, {pos=ppos, max_hear_distance=16}, true) + minetest.sound_play({name = "mcl_totems_totem", gain = 1}, {pos=ppos, max_hear_distance = 16}, true) + + for i = 1, 4 do + for c = 1, #particle_colors do + minetest.add_particlespawner({ + amount = math.floor(100 / (4 * #particle_colors)), + time = 1, + minpos = vector.offset(ppos, 0, -1, 0), + maxpos = vector.offset(ppos, 0, 1, 0), + minvel = vector.new(-1.5, 0, -1.5), + maxvel = vector.new(1.5, 1.5, 1.5), + minacc = vector.new(0, -0.1, 0), + maxacc = vector.new(0, -1, 0), + minexptime = 1, + maxexptime = 3, + minsize = 1, + maxsize = 2, + collisiondetection = true, + collision_removal = true, + object_collision = false, + vertical = false, + texture = "mcl_particles_totem" .. i .. ".png^[colorize:#" .. particle_colors[c], + glow = 10, + }) + end + end -- Big totem overlay if not hud_totem[obj] then hud_totem[obj] = obj:hud_add({ hud_elem_type = "image", text = "mcl_totems_totem.png", - position = { x=0.5, y=1 }, - scale = { x=17, y=17 }, - offset = { x=0, y=-178 }, + position = {x = 0.5, y = 1}, + scale = {x = 17, y = 17}, + offset = {x = 0, y = -178}, z_index = 100, }) minetest.after(3, function() diff --git a/mods/ITEMS/mcl_tridents/README.md b/mods/ITEMS/mcl_tridents/README.md new file mode 100644 index 000000000..4aea50d58 --- /dev/null +++ b/mods/ITEMS/mcl_tridents/README.md @@ -0,0 +1,3 @@ +# mcl_tridents by j45 + +Adds tridents to MineClone2. \ No newline at end of file diff --git a/mods/ITEMS/mcl_tridents/init.lua b/mods/ITEMS/mcl_tridents/init.lua new file mode 100644 index 000000000..b20616f16 --- /dev/null +++ b/mods/ITEMS/mcl_tridents/init.lua @@ -0,0 +1,87 @@ +local S = minetest.get_translator("mcl_tridents") +local cooldown = {} + +minetest.register_on_joinplayer(function(player) + cooldown[player:get_player_name()] = false +end) + +minetest.register_on_leaveplayer(function(player) + cooldown[player:get_player_name()] = false +end) + +local GRAVITY = 9.81 +local TRIDENT_DURABILITY = 251 +local TRIDENT_COOLDOWN = 0.91 + +local TRIDENT_ENTITY = { + physical = true, + pointable = false, + visual = "mesh", + mesh = "mcl_trident.obj", + visual_size = {x=-1, y=1}, + textures = {"mcl_trident.png"}, + collisionbox = {-.1, -.1, -1, .1, .1, 0.5}, + collide_with_objects = true, + _fire_damage_resistant = true, + + _lastpos={}, + _startpos=nil, + _damage=8, -- Damage on impact + _is_critical=false, + _stuck=false, -- Whether arrow is stuck + _stucktimer=nil,-- Amount of time (in seconds) the arrow has been stuck so far + _stuckrechecktimer=nil,-- An additional timer for periodically re-checking the stuck status of an arrow + _stuckin=nil, --Position of node in which arow is stuck. + _shooter=nil, -- ObjectRef of player or mob who shot it + + _viscosity=0, -- Viscosity of node the arrow is currently in + _deflection_cooloff=0, -- Cooloff timer after an arrow deflection, to prevent many deflections in quick succession +} + +minetest.register_entity("mcl_tridents:trident_entity", TRIDENT_ENTITY) + +local spawn_trident = function(player) + local wielditem = player:get_wielded_item() + local obj = minetest.add_entity(vector.add(player:get_pos(), {x = 0, y = 1.5, z = 0}), "mcl_tridents:trident_entity") + local yaw = player:get_look_horizontal()+math.pi/2 + + if cooldown[player:get_player_name()] then + return + end + + cooldown[player:get_player_name()] = true + + minetest.after(TRIDENT_COOLDOWN, function() + cooldown[player:get_player_name()] = false + end) + + if obj then + local durability = TRIDENT_DURABILITY + local unbreaking = mcl_enchanting.get_enchantment(wielditem, "unbreaking") + if unbreaking > 0 then + durability = durability * (unbreaking + 1) + end + wielditem:add_wear(65535/durability) + minetest.chat_send_all(wielditem:get_wear()) + obj:set_velocity(vector.multiply(player:get_look_dir(), 20)) + obj:set_acceleration({x=0, y=-GRAVITY, z=0}) + obj:set_yaw(yaw) + end +end + + +minetest.register_tool("mcl_tridents:trident", { + description = S("Trident"), + _tt_help = S("Launches a trident when you rightclick and it is in your hand"), + _doc_items_durability = TRIDENT_DURABILITY, + inventory_image = "mcl_trident_inv.png", + stack_max = 1, + groups = {weapon=1,weapon_ranged=1,trident=1,enchantability=1}, + _mcl_uses = TRIDENT_DURABILITY, + on_place = function(itemstack, placer, pointed_thing) + spawn_trident(placer) + end, + on_secondary_use = function(itemstack, user, pointed_thing) + spawn_trident(user) + end +}) diff --git a/mods/ITEMS/mcl_tridents/models/mcl_trident.obj b/mods/ITEMS/mcl_tridents/models/mcl_trident.obj new file mode 100644 index 000000000..32af51ed6 --- /dev/null +++ b/mods/ITEMS/mcl_tridents/models/mcl_trident.obj @@ -0,0 +1,10854 @@ +# Blender v2.82 (sub 7) OBJ File: 'trident.blend' +# www.blender.org +mtllib trident.mtl +o Cylinder +v -7.194370 -0.000000 0.363753 +v -7.194370 -0.036636 0.367362 +v -7.194370 -0.071864 0.378048 +v -7.194370 -0.104331 0.395402 +v -7.194370 -0.132788 0.418756 +v -7.194370 -0.156142 0.447213 +v -7.194370 -0.173496 0.479680 +v -7.194370 -0.184182 0.514908 +v -7.194370 -0.187791 0.551544 +v -7.194370 -0.184183 0.588180 +v -7.194370 -0.173496 0.623409 +v -7.194370 -0.156142 0.655875 +v -7.194370 -0.132788 0.684332 +v -7.194370 -0.104331 0.707687 +v -7.194370 -0.071864 0.725040 +v -7.194370 -0.036636 0.735727 +v -7.194370 0.000000 0.739335 +v -7.194370 0.036636 0.735727 +v -7.194370 0.071864 0.725040 +v -7.194370 0.104331 0.707687 +v -7.194370 0.132788 0.684332 +v -7.194370 0.156142 0.655875 +v -7.194370 0.173496 0.623408 +v -7.194370 0.184182 0.588180 +v -7.194370 0.187791 0.551544 +v -7.194370 0.184182 0.514908 +v -7.194370 0.173496 0.479680 +v -7.194370 0.156142 0.447213 +v -7.194370 0.132788 0.418756 +v -7.194370 0.104331 0.395402 +v -7.194370 0.071864 0.378048 +v -7.194370 0.036636 0.367362 +v 1.937123 0.000002 0.363752 +v 1.937123 -0.036634 0.367361 +v 1.937123 -0.071862 0.378047 +v 1.937123 -0.104329 0.395401 +v 1.937123 -0.132786 0.418755 +v 1.937123 -0.156140 0.447212 +v 1.937123 -0.173494 0.479679 +v 1.937123 -0.184180 0.514907 +v 1.937123 -0.187789 0.551543 +v 1.937123 -0.184180 0.588179 +v 1.937123 -0.173494 0.623407 +v 1.937123 -0.156140 0.655874 +v 1.937123 -0.132786 0.684331 +v 1.937123 -0.104329 0.707685 +v 1.937123 -0.071862 0.725039 +v 1.937123 -0.036634 0.735725 +v 1.937123 0.000002 0.739334 +v 1.937123 0.036639 0.735725 +v 1.937123 0.071867 0.725039 +v 1.937123 0.104333 0.707685 +v 1.937123 0.132791 0.684331 +v 1.937123 0.156145 0.655874 +v 1.937123 0.173498 0.623407 +v 1.937123 0.184185 0.588179 +v 1.937123 0.187793 0.551543 +v 1.937123 0.184185 0.514907 +v 1.937123 0.173498 0.479678 +v 1.937123 0.156144 0.447212 +v 1.937123 0.132790 0.418755 +v 1.937123 0.104333 0.395400 +v 1.937123 0.071866 0.378047 +v 1.937123 0.036638 0.367360 +v -10.250076 -0.036639 0.367363 +v -10.250076 -0.000002 0.363755 +v -10.250076 -0.071867 0.378049 +v -10.250076 -0.104333 0.395403 +v -10.250076 -0.132791 0.418757 +v -10.250076 -0.156145 0.447214 +v -10.250076 -0.173498 0.479681 +v -10.250076 -0.184185 0.514909 +v -10.250076 -0.187793 0.551545 +v -10.250076 -0.184185 0.588182 +v -10.250076 -0.173498 0.623410 +v -10.250076 -0.156145 0.655876 +v -10.250076 -0.132791 0.684334 +v -10.250076 -0.104333 0.707688 +v -10.250076 -0.071867 0.725042 +v -10.250076 -0.036638 0.735728 +v -10.250076 -0.000002 0.739336 +v -10.250076 0.036634 0.735728 +v -10.250076 0.071862 0.725041 +v -10.250076 0.104329 0.707688 +v -10.250076 0.132786 0.684333 +v -10.250076 0.156140 0.655876 +v -10.250076 0.173494 0.623410 +v -10.250076 0.184180 0.588181 +v -10.250076 0.187788 0.551545 +v -10.250076 0.184180 0.514909 +v -10.250076 0.173494 0.479681 +v -10.250076 0.156140 0.447214 +v -10.250076 0.132786 0.418757 +v -10.250076 0.104328 0.395403 +v -10.250076 0.071862 0.378049 +v -10.250076 0.036634 0.367363 +v -10.614231 -0.046042 0.320092 +v -10.614231 -0.000003 0.315557 +v -10.614231 -0.090311 0.333521 +v -10.614231 -0.131111 0.355328 +v -10.614231 -0.166872 0.384677 +v -10.614231 -0.196220 0.420437 +v -10.614231 -0.218027 0.461237 +v -10.614231 -0.231456 0.505506 +v -10.614231 -0.235991 0.551545 +v -10.614231 -0.231456 0.597584 +v -10.614231 -0.218027 0.641854 +v -10.614231 -0.196220 0.682654 +v -10.614231 -0.166872 0.718414 +v -10.614231 -0.131111 0.747763 +v -10.614231 -0.090311 0.769570 +v -10.614231 -0.046042 0.782999 +v -10.614231 -0.000003 0.787534 +v -10.614231 0.046036 0.782999 +v -10.614231 0.090306 0.769570 +v -10.614231 0.131106 0.747762 +v -10.614231 0.166866 0.718414 +v -10.614231 0.196215 0.682653 +v -10.614231 0.218022 0.641854 +v -10.614231 0.231451 0.597584 +v -10.614231 0.235986 0.551545 +v -10.614231 0.231451 0.505506 +v -10.614231 0.218022 0.461236 +v -10.614231 0.196214 0.420437 +v -10.614231 0.166866 0.384676 +v -10.614231 0.131105 0.355328 +v -10.614231 0.090306 0.333521 +v -10.614231 0.046036 0.320092 +v -11.151556 -0.025116 0.425290 +v -11.151556 -0.000003 0.422816 +v -11.151556 -0.049265 0.432615 +v -11.151556 -0.071521 0.444511 +v -11.151556 -0.091028 0.460520 +v -11.151556 -0.107037 0.480027 +v -11.151556 -0.118933 0.502283 +v -11.151556 -0.126259 0.526432 +v -11.151556 -0.128732 0.551546 +v -11.151556 -0.126259 0.576659 +v -11.151556 -0.118933 0.600808 +v -11.151556 -0.107037 0.623064 +v -11.151556 -0.091028 0.642571 +v -11.151556 -0.071521 0.658580 +v -11.151556 -0.049265 0.670476 +v -11.151556 -0.025116 0.677802 +v -11.151556 -0.000003 0.680275 +v -11.151556 0.025111 0.677801 +v -11.151556 0.049260 0.670476 +v -11.151556 0.071516 0.658580 +v -11.151556 0.091023 0.642571 +v -11.151556 0.107032 0.623064 +v -11.151556 0.118928 0.600808 +v -11.151556 0.126253 0.576659 +v -11.151556 0.128727 0.551545 +v -11.151556 0.126253 0.526432 +v -11.151556 0.118928 0.502283 +v -11.151556 0.107032 0.480027 +v -11.151556 0.091023 0.460520 +v -11.151556 0.071516 0.444511 +v -11.151556 0.049260 0.432615 +v -11.151556 0.025111 0.425290 +v -11.239233 -0.000002 0.551546 +v -7.530121 0.071863 0.725041 +v -7.530121 0.104330 0.707687 +v -7.530121 0.132787 0.684333 +v -7.530121 0.156141 0.655876 +v -7.530121 0.173495 0.623409 +v -7.530121 0.184181 0.588181 +v -7.530121 0.187790 0.551545 +v -7.530121 0.184181 0.514908 +v -7.530121 0.173495 0.479680 +v -7.530121 0.156141 0.447214 +v -7.530121 -0.000001 0.363754 +v -7.530121 -0.036637 0.367362 +v -7.530121 0.132787 0.418756 +v -7.530121 -0.071866 0.378049 +v -7.530121 0.104330 0.395402 +v -7.530121 -0.104332 0.395402 +v -7.530121 0.071863 0.378049 +v -7.530121 -0.132789 0.418757 +v -7.530121 0.036635 0.367362 +v -7.530121 -0.156144 0.447214 +v -7.530121 -0.173497 0.479680 +v -7.530121 -0.184184 0.514909 +v -7.530121 -0.187792 0.551545 +v -7.530121 -0.184184 0.588181 +v -7.530121 -0.173497 0.623409 +v -7.530121 -0.156144 0.655876 +v -7.530121 -0.132789 0.684333 +v -7.530121 -0.104332 0.707687 +v -7.530121 -0.071866 0.725041 +v -7.530121 -0.036637 0.735727 +v -7.530121 -0.000001 0.739336 +v -7.530121 0.036635 0.735727 +v -8.553731 0.071863 0.725041 +v -8.553731 -0.000001 0.363754 +v -8.553731 0.104330 0.707687 +v -8.553731 0.132787 0.684333 +v -8.553731 0.156141 0.655876 +v -8.553731 0.173495 0.623409 +v -8.553731 0.184181 0.588181 +v -8.553731 0.187789 0.551545 +v -8.553731 0.184181 0.514909 +v -8.553731 0.173495 0.479680 +v -8.553731 0.156141 0.447214 +v -8.553731 -0.036638 0.367362 +v -8.553731 0.132787 0.418757 +v -8.553731 -0.071866 0.378049 +v -8.553731 0.104329 0.395402 +v -8.553731 -0.104332 0.395403 +v -8.553731 0.071863 0.378049 +v -8.553731 -0.132790 0.418757 +v -8.553731 0.036634 0.367362 +v -8.553731 -0.156144 0.447214 +v -8.553731 -0.173498 0.479680 +v -8.553731 -0.184184 0.514909 +v -8.553731 -0.187792 0.551545 +v -8.553731 -0.184184 0.588181 +v -8.553731 -0.173498 0.623409 +v -8.553731 -0.156144 0.655876 +v -8.553731 -0.132790 0.684333 +v -8.553731 -0.104332 0.707687 +v -8.553731 -0.071866 0.725041 +v -8.553731 -0.036638 0.735727 +v -8.553731 -0.000001 0.739336 +v -8.553731 0.036635 0.735727 +v -8.474993 0.123192 0.735917 +v -8.391620 0.097399 0.697315 +v -8.322146 0.097399 0.697315 +v -8.234142 0.097399 0.697315 +v -8.164668 0.097399 0.697315 +v -8.076663 0.097399 0.697315 +v -8.007189 0.097399 0.697315 +v -7.919184 0.097399 0.697315 +v -7.849711 0.097399 0.697315 +v -7.761706 0.097399 0.697315 +v -7.692232 0.097399 0.697315 +v -7.608860 0.123192 0.735917 +v -8.474993 0.156794 0.708340 +v -8.391620 0.123966 0.675512 +v -8.322146 0.123966 0.675512 +v -8.234142 0.123966 0.675512 +v -8.164668 0.123966 0.675512 +v -8.076663 0.123966 0.675512 +v -8.007189 0.123966 0.675512 +v -7.919184 0.123966 0.675512 +v -7.849711 0.123966 0.675512 +v -7.761706 0.123966 0.675512 +v -7.692232 0.123966 0.675512 +v -7.608860 0.156795 0.708340 +v -8.474993 0.184371 0.674738 +v -8.391620 0.145769 0.648945 +v -8.322146 0.145769 0.648945 +v -8.234142 0.145769 0.648945 +v -8.164668 0.145769 0.648945 +v -8.076663 0.145769 0.648945 +v -8.007189 0.145769 0.648945 +v -7.919184 0.145769 0.648945 +v -7.849711 0.145769 0.648945 +v -7.761706 0.145769 0.648945 +v -7.692232 0.145769 0.648945 +v -7.608860 0.184371 0.674738 +v -8.474993 0.204862 0.636402 +v -8.391620 0.161970 0.618635 +v -8.322146 0.161970 0.618635 +v -8.234142 0.161970 0.618635 +v -8.164668 0.161970 0.618635 +v -8.076663 0.161970 0.618635 +v -8.007189 0.161970 0.618635 +v -7.919184 0.161970 0.618635 +v -7.849711 0.161970 0.618635 +v -7.761706 0.161970 0.618635 +v -7.692232 0.161970 0.618635 +v -7.608860 0.204862 0.636402 +v -8.474993 0.217480 0.594805 +v -8.391620 0.171946 0.585747 +v -8.322146 0.171946 0.585747 +v -8.234142 0.171946 0.585747 +v -8.164668 0.171946 0.585747 +v -8.076663 0.171946 0.585747 +v -8.007189 0.171946 0.585747 +v -7.919184 0.171946 0.585747 +v -7.849711 0.171946 0.585747 +v -7.761706 0.171946 0.585747 +v -7.692232 0.171946 0.585747 +v -7.608860 0.217481 0.594804 +v -8.474993 0.221741 0.551545 +v -8.391620 0.175315 0.551545 +v -8.322146 0.175315 0.551545 +v -8.234142 0.175315 0.551545 +v -8.164668 0.175315 0.551545 +v -8.076663 0.175315 0.551545 +v -8.007189 0.175315 0.551545 +v -7.919184 0.175315 0.551545 +v -7.849711 0.175315 0.551545 +v -7.761706 0.175315 0.551545 +v -7.692232 0.175315 0.551545 +v -7.608860 0.221741 0.551545 +v -8.474993 0.217480 0.508285 +v -8.391620 0.171946 0.517342 +v -8.322146 0.171946 0.517342 +v -8.234142 0.171946 0.517342 +v -8.164668 0.171946 0.517342 +v -8.076663 0.171946 0.517342 +v -8.007189 0.171946 0.517342 +v -7.919184 0.171946 0.517342 +v -7.849711 0.171946 0.517342 +v -7.761706 0.171946 0.517342 +v -7.692232 0.171946 0.517342 +v -7.608860 0.217481 0.508285 +v -8.474993 0.204862 0.466688 +v -8.391620 0.161969 0.484454 +v -8.322146 0.161969 0.484454 +v -8.234142 0.161969 0.484454 +v -8.164668 0.161969 0.484454 +v -8.076663 0.161969 0.484454 +v -8.007189 0.161970 0.484454 +v -7.919184 0.161970 0.484454 +v -7.849711 0.161970 0.484454 +v -7.761706 0.161970 0.484454 +v -7.692232 0.161970 0.484454 +v -7.608860 0.204862 0.466687 +v -8.474993 0.184371 0.428351 +v -8.391620 0.145768 0.454144 +v -8.322146 0.145768 0.454144 +v -8.234142 0.145768 0.454144 +v -8.164668 0.145768 0.454144 +v -8.076663 0.145769 0.454144 +v -8.007189 0.145769 0.454144 +v -7.919184 0.145769 0.454144 +v -7.849711 0.145769 0.454144 +v -7.761706 0.145769 0.454144 +v -7.692232 0.145769 0.454144 +v -7.608860 0.184371 0.428351 +v -8.474993 -0.043261 0.334063 +v -8.391620 -0.034204 0.379597 +v -8.322146 -0.034204 0.379597 +v -8.234142 -0.034204 0.379597 +v -8.164668 -0.034204 0.379597 +v -8.076663 -0.034204 0.379597 +v -8.007189 -0.034204 0.379597 +v -7.919184 -0.034204 0.379597 +v -7.849711 -0.034204 0.379597 +v -7.761706 -0.034204 0.379597 +v -7.692232 -0.034204 0.379597 +v -7.608860 -0.043261 0.334063 +v -8.474993 0.156794 0.394749 +v -8.391620 0.123966 0.427578 +v -8.322146 0.123966 0.427578 +v -8.234142 0.123966 0.427578 +v -8.164668 0.123966 0.427578 +v -8.076663 0.123966 0.427578 +v -8.007189 0.123966 0.427578 +v -7.919184 0.123966 0.427578 +v -7.849711 0.123966 0.427577 +v -7.761706 0.123966 0.427577 +v -7.692232 0.123966 0.427577 +v -7.608860 0.156794 0.394749 +v -8.474993 -0.084859 0.346682 +v -8.391620 -0.067092 0.389574 +v -8.322146 -0.067092 0.389574 +v -8.234142 -0.067092 0.389574 +v -8.164668 -0.067092 0.389574 +v -8.076663 -0.067092 0.389574 +v -8.007189 -0.067092 0.389574 +v -7.919184 -0.067092 0.389574 +v -7.849711 -0.067092 0.389574 +v -7.761706 -0.067092 0.389574 +v -7.692232 -0.067092 0.389574 +v -7.608860 -0.084858 0.346681 +v -8.474993 0.123192 0.367173 +v -8.391620 0.097399 0.405775 +v -8.322146 0.097399 0.405775 +v -8.234142 0.097399 0.405775 +v -8.164668 0.097399 0.405775 +v -8.076663 0.097399 0.405775 +v -8.007189 0.097399 0.405775 +v -7.919184 0.097399 0.405775 +v -7.849711 0.097399 0.405775 +v -7.761706 0.097399 0.405775 +v -7.692232 0.097399 0.405775 +v -7.608860 0.123192 0.367173 +v -8.474993 -0.123195 0.367173 +v -8.391620 -0.097402 0.405775 +v -8.322146 -0.097402 0.405775 +v -8.234142 -0.097402 0.405775 +v -8.164668 -0.097402 0.405775 +v -8.076663 -0.097402 0.405775 +v -8.007189 -0.097402 0.405775 +v -7.919184 -0.097402 0.405775 +v -7.849711 -0.097402 0.405775 +v -7.761706 -0.097402 0.405775 +v -7.692232 -0.097402 0.405775 +v -7.608860 -0.123195 0.367173 +v -8.474993 0.084855 0.346681 +v -8.391620 0.067089 0.389574 +v -8.322146 0.067089 0.389574 +v -8.234142 0.067089 0.389574 +v -8.164668 0.067089 0.389574 +v -8.076663 0.067089 0.389574 +v -8.007189 0.067089 0.389574 +v -7.919184 0.067089 0.389574 +v -7.849711 0.067089 0.389574 +v -7.761706 0.067089 0.389574 +v -7.692232 0.067089 0.389574 +v -7.608860 0.084856 0.346681 +v -8.474993 -0.156797 0.394749 +v -8.391620 -0.123969 0.427578 +v -8.322146 -0.123969 0.427578 +v -8.234142 -0.123968 0.427578 +v -8.164668 -0.123968 0.427578 +v -8.076663 -0.123968 0.427578 +v -8.007189 -0.123968 0.427578 +v -7.919184 -0.123968 0.427578 +v -7.849711 -0.123968 0.427578 +v -7.761706 -0.123968 0.427578 +v -7.692232 -0.123968 0.427578 +v -7.608860 -0.156797 0.394749 +v -8.474993 0.043258 0.334063 +v -8.391620 0.034201 0.379597 +v -8.322146 0.034201 0.379597 +v -8.234142 0.034201 0.379597 +v -8.164668 0.034201 0.379597 +v -8.076663 0.034201 0.379597 +v -8.007189 0.034201 0.379597 +v -7.919184 0.034201 0.379597 +v -7.849711 0.034201 0.379597 +v -7.761706 0.034201 0.379597 +v -7.692232 0.034201 0.379597 +v -7.608860 0.043258 0.334063 +v -8.474993 -0.184374 0.428351 +v -8.391620 -0.145771 0.454145 +v -8.322146 -0.145771 0.454145 +v -8.234142 -0.145771 0.454145 +v -8.164668 -0.145771 0.454145 +v -8.076663 -0.145771 0.454144 +v -8.007189 -0.145771 0.454144 +v -7.919184 -0.145771 0.454144 +v -7.849711 -0.145771 0.454144 +v -7.761706 -0.145771 0.454144 +v -7.692232 -0.145771 0.454144 +v -7.608860 -0.184373 0.428351 +v -8.474993 -0.204865 0.466688 +v -8.391620 -0.161972 0.484454 +v -8.322146 -0.161972 0.484454 +v -8.234142 -0.161972 0.484454 +v -8.164668 -0.161972 0.484454 +v -8.076663 -0.161972 0.484454 +v -8.007189 -0.161972 0.484454 +v -7.919184 -0.161972 0.484454 +v -7.849711 -0.161972 0.484454 +v -7.761706 -0.161972 0.484454 +v -7.692232 -0.161972 0.484454 +v -7.608860 -0.204864 0.466688 +v -8.474993 -0.217483 0.508285 +v -8.391620 -0.171949 0.517342 +v -8.322146 -0.171949 0.517342 +v -8.234142 -0.171949 0.517342 +v -8.164668 -0.171949 0.517342 +v -8.076663 -0.171949 0.517342 +v -8.007189 -0.171949 0.517342 +v -7.919184 -0.171949 0.517342 +v -7.849711 -0.171949 0.517342 +v -7.761706 -0.171949 0.517342 +v -7.692232 -0.171949 0.517342 +v -7.608860 -0.217483 0.508285 +v -8.474993 -0.221744 0.551545 +v -8.391620 -0.175317 0.551545 +v -8.322146 -0.175317 0.551545 +v -8.234142 -0.175317 0.551545 +v -8.164668 -0.175317 0.551545 +v -8.076663 -0.175317 0.551545 +v -8.007189 -0.175317 0.551545 +v -7.919184 -0.175317 0.551545 +v -7.849711 -0.175317 0.551545 +v -7.761706 -0.175317 0.551545 +v -7.692232 -0.175317 0.551545 +v -7.608860 -0.221744 0.551545 +v -8.474993 -0.217483 0.594805 +v -8.391620 -0.171949 0.585747 +v -8.322146 -0.171949 0.585747 +v -8.234142 -0.171949 0.585747 +v -8.164668 -0.171949 0.585747 +v -8.076663 -0.171949 0.585747 +v -8.007189 -0.171949 0.585747 +v -7.919184 -0.171949 0.585747 +v -7.849711 -0.171949 0.585747 +v -7.761706 -0.171949 0.585747 +v -7.692232 -0.171949 0.585747 +v -7.608860 -0.217483 0.594805 +v -8.474993 -0.204865 0.636402 +v -8.391620 -0.161972 0.618635 +v -8.322146 -0.161972 0.618635 +v -8.234142 -0.161972 0.618635 +v -8.164668 -0.161972 0.618635 +v -8.076663 -0.161972 0.618635 +v -8.007189 -0.161972 0.618635 +v -7.919184 -0.161972 0.618635 +v -7.849711 -0.161972 0.618635 +v -7.761706 -0.161972 0.618635 +v -7.692232 -0.161972 0.618635 +v -7.608860 -0.204864 0.636402 +v -8.474993 -0.184374 0.674738 +v -8.391620 -0.145771 0.648945 +v -8.322146 -0.145771 0.648945 +v -8.234142 -0.145771 0.648945 +v -8.164668 -0.145771 0.648945 +v -8.076663 -0.145771 0.648945 +v -8.007189 -0.145771 0.648945 +v -7.919184 -0.145771 0.648945 +v -7.849711 -0.145771 0.648945 +v -7.761706 -0.145771 0.648945 +v -7.692232 -0.145771 0.648945 +v -7.608860 -0.184373 0.674738 +v -8.474993 -0.156797 0.708341 +v -8.391620 -0.123969 0.675512 +v -8.322146 -0.123969 0.675512 +v -8.234142 -0.123968 0.675512 +v -8.164668 -0.123968 0.675512 +v -8.076663 -0.123968 0.675512 +v -8.007189 -0.123968 0.675512 +v -7.919184 -0.123968 0.675512 +v -7.849711 -0.123968 0.675512 +v -7.761706 -0.123968 0.675512 +v -7.692232 -0.123968 0.675512 +v -7.608860 -0.156797 0.708340 +v -8.474993 -0.123195 0.735917 +v -8.391620 -0.097402 0.697315 +v -8.322146 -0.097402 0.697315 +v -8.234142 -0.097402 0.697315 +v -8.164668 -0.097402 0.697315 +v -8.076663 -0.097402 0.697315 +v -8.007189 -0.097402 0.697315 +v -7.919184 -0.097402 0.697315 +v -7.849711 -0.097402 0.697315 +v -7.761706 -0.097402 0.697315 +v -7.692232 -0.097402 0.697315 +v -7.608860 -0.123195 0.735917 +v -8.474993 -0.084859 0.756408 +v -8.391620 -0.067092 0.713516 +v -8.322146 -0.067092 0.713516 +v -8.234142 -0.067092 0.713516 +v -8.164668 -0.067092 0.713516 +v -8.076663 -0.067092 0.713516 +v -8.007189 -0.067092 0.713516 +v -7.919184 -0.067092 0.713516 +v -7.849711 -0.067092 0.713516 +v -7.761706 -0.067092 0.713516 +v -7.692232 -0.067092 0.713516 +v -7.608860 -0.084858 0.756408 +v -8.474993 -0.043261 0.769027 +v -8.391620 -0.034204 0.723492 +v -8.322146 -0.034204 0.723492 +v -8.234142 -0.034204 0.723492 +v -8.164668 -0.034204 0.723492 +v -8.076663 -0.034204 0.723492 +v -8.007189 -0.034204 0.723492 +v -7.919184 -0.034204 0.723492 +v -7.849711 -0.034204 0.723492 +v -7.761706 -0.034204 0.723492 +v -7.692232 -0.034204 0.723492 +v -7.608860 -0.043261 0.769027 +v -8.474993 -0.000001 0.773287 +v -8.391620 -0.000001 0.726861 +v -8.322146 -0.000001 0.726861 +v -8.234142 -0.000001 0.726861 +v -8.164668 -0.000001 0.726861 +v -8.076663 -0.000001 0.726861 +v -8.007189 -0.000001 0.726861 +v -7.919184 -0.000001 0.726861 +v -7.849711 -0.000001 0.726861 +v -7.761706 -0.000001 0.726861 +v -7.692232 -0.000001 0.726861 +v -7.608860 -0.000001 0.773287 +v -8.474993 0.043258 0.769027 +v -8.391620 0.034201 0.723492 +v -8.322146 0.034201 0.723492 +v -8.234142 0.034201 0.723492 +v -8.164668 0.034201 0.723492 +v -8.076663 0.034201 0.723492 +v -8.007189 0.034201 0.723492 +v -7.919184 0.034201 0.723492 +v -7.849711 0.034201 0.723492 +v -7.761706 0.034201 0.723492 +v -7.692232 0.034201 0.723492 +v -7.608860 0.043259 0.769027 +v -7.608860 0.084856 0.756408 +v -7.692232 0.067089 0.713516 +v -7.761706 0.067089 0.713516 +v -7.849711 0.067089 0.713516 +v -7.919185 0.067089 0.713516 +v -8.007190 0.067089 0.713516 +v -8.076663 0.067089 0.713516 +v -8.164668 0.067089 0.713516 +v -8.234142 0.067089 0.713516 +v -8.322147 0.067089 0.713516 +v -8.391620 0.067089 0.713516 +v -8.474993 0.084856 0.756408 +v -7.608860 -0.000001 0.329802 +v -7.692232 -0.000001 0.376229 +v -7.761706 -0.000001 0.376229 +v -7.849711 -0.000001 0.376229 +v -7.919185 -0.000001 0.376229 +v -8.007190 -0.000001 0.376229 +v -8.076663 -0.000001 0.376229 +v -8.164668 -0.000001 0.376229 +v -8.234142 -0.000001 0.376229 +v -8.322147 -0.000001 0.376229 +v -8.391620 -0.000001 0.376229 +v -8.474993 -0.000001 0.329802 +v -8.199405 0.111421 0.718300 +v -8.199405 0.141812 0.693358 +v -8.199405 0.166754 0.662967 +v -8.199405 0.185287 0.628294 +v -8.199405 0.196699 0.590671 +v -8.199405 0.200553 0.551545 +v -8.199405 0.196699 0.512418 +v -8.199405 0.185287 0.474796 +v -8.199405 0.166753 0.440123 +v -8.199405 -0.039128 0.354844 +v -8.199405 0.141812 0.409731 +v -8.199405 -0.076750 0.366257 +v -8.199405 0.111420 0.384790 +v -8.199405 -0.111423 0.384790 +v -8.199405 0.076747 0.366257 +v -8.199405 -0.141815 0.409732 +v -8.199405 0.039125 0.354844 +v -8.199405 -0.166756 0.440123 +v -8.199405 -0.185289 0.474796 +v -8.199405 -0.196702 0.512419 +v -8.199405 -0.200556 0.551545 +v -8.199405 -0.196702 0.590671 +v -8.199405 -0.185289 0.628294 +v -8.199405 -0.166756 0.662967 +v -8.199405 -0.141815 0.693358 +v -8.199405 -0.111423 0.718300 +v -8.199405 -0.076750 0.736833 +v -8.199405 -0.039127 0.748246 +v -8.199405 -0.000001 0.752099 +v -8.199405 0.039125 0.748246 +v -8.199405 0.076748 0.736833 +v -8.199405 -0.000001 0.350991 +v -8.041925 0.111421 0.718300 +v -8.041925 0.141812 0.693358 +v -8.041925 0.166754 0.662967 +v -8.041925 0.185287 0.628294 +v -8.041925 0.196699 0.590671 +v -8.041925 0.200553 0.551545 +v -8.041925 0.196699 0.512418 +v -8.041925 0.185287 0.474796 +v -8.041925 0.166753 0.440123 +v -8.041925 -0.039127 0.354844 +v -8.041925 0.141812 0.409731 +v -8.041925 -0.076750 0.366257 +v -8.041925 0.111420 0.384790 +v -8.041925 -0.111423 0.384790 +v -8.041925 0.076747 0.366257 +v -8.041925 -0.141815 0.409732 +v -8.041925 0.039125 0.354844 +v -8.041925 -0.166756 0.440123 +v -8.041925 -0.185289 0.474796 +v -8.041925 -0.196702 0.512419 +v -8.041925 -0.200556 0.551545 +v -8.041925 -0.196702 0.590671 +v -8.041925 -0.185289 0.628294 +v -8.041925 -0.166756 0.662967 +v -8.041925 -0.141815 0.693358 +v -8.041925 -0.111423 0.718300 +v -8.041925 -0.076750 0.736833 +v -8.041925 -0.039127 0.748245 +v -8.041925 -0.000001 0.752099 +v -8.041925 0.039125 0.748245 +v -8.041927 0.076748 0.736833 +v -8.041927 -0.000001 0.350991 +v -7.884447 0.111421 0.718300 +v -7.884447 0.141812 0.693358 +v -7.884447 0.166754 0.662967 +v -7.884447 0.185287 0.628294 +v -7.884447 0.196700 0.590671 +v -7.884447 0.200553 0.551545 +v -7.884447 0.196699 0.512418 +v -7.884447 0.185287 0.474796 +v -7.884447 0.166753 0.440123 +v -7.884447 -0.039127 0.354844 +v -7.884447 0.141812 0.409731 +v -7.884447 -0.076750 0.366257 +v -7.884447 0.111421 0.384790 +v -7.884447 -0.111423 0.384790 +v -7.884447 0.076747 0.366257 +v -7.884447 -0.141815 0.409732 +v -7.884447 0.039125 0.354844 +v -7.884447 -0.166756 0.440123 +v -7.884447 -0.185289 0.474796 +v -7.884447 -0.196702 0.512419 +v -7.884447 -0.200556 0.551545 +v -7.884447 -0.196702 0.590671 +v -7.884447 -0.185289 0.628294 +v -7.884447 -0.166756 0.662967 +v -7.884447 -0.141815 0.693358 +v -7.884447 -0.111423 0.718300 +v -7.884447 -0.076750 0.736833 +v -7.884447 -0.039127 0.748245 +v -7.884447 -0.000001 0.752099 +v -7.884447 0.039125 0.748245 +v -7.884448 0.076748 0.736833 +v -7.884448 -0.000001 0.350991 +v -1.638910 0.184184 0.514907 +v -1.638910 0.187792 0.551543 +v -1.638910 0.173497 0.479679 +v -1.638910 0.156144 0.447212 +v -1.638910 -0.036635 0.367361 +v -1.638910 0.000001 0.363753 +v -1.638910 0.132789 0.418755 +v -1.638910 -0.071863 0.378047 +v -1.638910 0.104332 0.395401 +v -1.638910 -0.104330 0.395401 +v -1.638910 0.071866 0.378047 +v -1.638910 -0.132787 0.418755 +v -1.638910 0.036637 0.367361 +v -1.638910 -0.156141 0.447212 +v -1.638910 -0.173495 0.479679 +v -1.638910 -0.184181 0.514907 +v -1.638910 -0.187789 0.551543 +v -1.638910 -0.184181 0.588180 +v -1.638910 -0.173495 0.623408 +v -1.638910 -0.156141 0.655874 +v -1.638910 -0.132787 0.684332 +v -1.638910 -0.104330 0.707686 +v -1.638910 -0.071863 0.725040 +v -1.638910 -0.036635 0.735726 +v -1.638910 0.000001 0.739334 +v -1.638910 0.036638 0.735726 +v -1.638910 0.071866 0.725040 +v -1.638910 0.104332 0.707686 +v -1.638910 0.132790 0.684332 +v -1.638910 0.156144 0.655874 +v -1.638910 0.173498 0.623408 +v -1.638910 0.184184 0.588179 +v -0.727585 0.184184 0.514907 +v -0.727585 0.173498 0.479679 +v -0.727585 0.156144 0.447212 +v -0.727585 -0.036635 0.367361 +v -0.727585 0.132790 0.418755 +v -0.727585 -0.071863 0.378047 +v -0.727585 0.104332 0.395401 +v -0.727585 -0.104329 0.395401 +v -0.727585 0.071866 0.378047 +v -0.727585 -0.132787 0.418755 +v -0.727585 0.036637 0.367361 +v -0.727585 -0.156141 0.447212 +v -0.727585 -0.173494 0.479679 +v -0.727585 -0.184181 0.514907 +v -0.727585 -0.187789 0.551543 +v -0.727585 -0.184181 0.588179 +v -0.727585 -0.173495 0.623408 +v -0.727585 -0.156141 0.655874 +v -0.727585 -0.132787 0.684331 +v -0.727585 -0.104329 0.707686 +v -0.727585 -0.071863 0.725039 +v -0.727585 -0.036635 0.735726 +v -0.727585 0.000002 0.739334 +v -0.727585 0.036638 0.735726 +v -0.727585 0.071866 0.725039 +v -0.727585 0.104333 0.707686 +v -0.727585 0.132790 0.684331 +v -0.727585 0.156144 0.655874 +v -0.727585 0.173498 0.623408 +v -0.727585 0.184184 0.588179 +v -0.727585 0.187792 0.551543 +v -0.727585 0.000002 0.363753 +v -0.766329 0.220916 0.551543 +v -0.885448 0.188261 0.551543 +v -1.004568 0.188261 0.551543 +v -1.123686 0.188261 0.551543 +v -1.242805 0.188261 0.551543 +v -1.361924 0.188261 0.551543 +v -1.481043 0.188261 0.551543 +v -1.600163 0.220916 0.551543 +v -0.766329 0.000002 0.330629 +v -0.885448 0.000002 0.363284 +v -1.004568 0.000002 0.363284 +v -1.123686 0.000001 0.363284 +v -1.242805 0.000001 0.363284 +v -1.361924 0.000001 0.363284 +v -1.481043 0.000001 0.363284 +v -1.600163 0.000001 0.330629 +v -1.600163 0.216671 0.508445 +v -1.481043 0.184644 0.514816 +v -1.361925 0.184644 0.514816 +v -1.242805 0.184644 0.514816 +v -1.123686 0.184644 0.514816 +v -1.004568 0.184644 0.514816 +v -0.885449 0.184644 0.514816 +v -0.766329 0.216671 0.508445 +v -1.600163 0.204100 0.467003 +v -1.481043 0.173931 0.479499 +v -1.361925 0.173931 0.479499 +v -1.242805 0.173931 0.479499 +v -1.123686 0.173931 0.479499 +v -1.004568 0.173931 0.479499 +v -0.885449 0.173931 0.479499 +v -0.766329 0.204100 0.467003 +v -1.600163 0.183685 0.428810 +v -1.481043 0.156534 0.446952 +v -1.361925 0.156534 0.446952 +v -1.242805 0.156534 0.446952 +v -1.123686 0.156534 0.446952 +v -1.004568 0.156534 0.446952 +v -0.885449 0.156534 0.446952 +v -0.766329 0.183685 0.428810 +v -1.600163 -0.043097 0.334874 +v -1.481043 -0.036726 0.366901 +v -1.361925 -0.036726 0.366901 +v -1.242805 -0.036726 0.366901 +v -1.123686 -0.036726 0.366901 +v -1.004568 -0.036726 0.366901 +v -0.885449 -0.036726 0.366901 +v -0.766329 -0.043097 0.334874 +v -1.600163 0.156211 0.395333 +v -1.481043 0.133121 0.418424 +v -1.361925 0.133121 0.418424 +v -1.242805 0.133121 0.418423 +v -1.123686 0.133121 0.418423 +v -1.004568 0.133121 0.418423 +v -0.885449 0.133121 0.418423 +v -0.766329 0.156212 0.395333 +v -1.600163 -0.084539 0.347445 +v -1.481043 -0.072043 0.377614 +v -1.361925 -0.072042 0.377614 +v -1.242805 -0.072042 0.377614 +v -1.123686 -0.072042 0.377614 +v -1.004568 -0.072042 0.377614 +v -0.885449 -0.072042 0.377614 +v -0.766329 -0.084539 0.347445 +v -1.600163 0.122735 0.367860 +v -1.481043 0.104593 0.395011 +v -1.361925 0.104593 0.395011 +v -1.242805 0.104593 0.395011 +v -1.123686 0.104593 0.395011 +v -1.004568 0.104593 0.395011 +v -0.885449 0.104593 0.395011 +v -0.766329 0.122735 0.367860 +v -1.600163 -0.122732 0.367860 +v -1.481043 -0.104590 0.395011 +v -1.361925 -0.104590 0.395011 +v -1.242805 -0.104590 0.395011 +v -1.123686 -0.104590 0.395011 +v -1.004568 -0.104590 0.395011 +v -0.885449 -0.104590 0.395011 +v -0.766329 -0.122732 0.367860 +v -1.600163 0.084541 0.347445 +v -1.481043 0.072045 0.377614 +v -1.361925 0.072045 0.377614 +v -1.242805 0.072045 0.377614 +v -1.123686 0.072045 0.377614 +v -1.004568 0.072045 0.377614 +v -0.885449 0.072045 0.377614 +v -0.766329 0.084542 0.347445 +v -1.600163 -0.156209 0.395333 +v -1.481043 -0.133118 0.418424 +v -1.361925 -0.133118 0.418424 +v -1.242805 -0.133118 0.418424 +v -1.123686 -0.133118 0.418424 +v -1.004568 -0.133118 0.418424 +v -0.885449 -0.133118 0.418424 +v -0.766329 -0.156209 0.395333 +v -1.600163 0.043099 0.334874 +v -1.481043 0.036729 0.366901 +v -1.361925 0.036729 0.366901 +v -1.242805 0.036729 0.366901 +v -1.123686 0.036729 0.366901 +v -1.004568 0.036729 0.366901 +v -0.885449 0.036729 0.366901 +v -0.766329 0.043100 0.334874 +v -1.600163 -0.183682 0.428810 +v -1.481043 -0.156531 0.446952 +v -1.361925 -0.156531 0.446952 +v -1.242805 -0.156531 0.446952 +v -1.123686 -0.156531 0.446952 +v -1.004568 -0.156531 0.446952 +v -0.885449 -0.156531 0.446952 +v -0.766329 -0.183682 0.428810 +v -1.600163 -0.204097 0.467003 +v -1.481043 -0.173928 0.479500 +v -1.361925 -0.173928 0.479500 +v -1.242805 -0.173928 0.479500 +v -1.123686 -0.173928 0.479500 +v -1.004568 -0.173928 0.479499 +v -0.885449 -0.173928 0.479499 +v -0.766329 -0.204097 0.467003 +v -1.600163 -0.216668 0.508445 +v -1.481043 -0.184641 0.514816 +v -1.361925 -0.184641 0.514816 +v -1.242805 -0.184641 0.514816 +v -1.123686 -0.184641 0.514816 +v -1.004568 -0.184641 0.514816 +v -0.885449 -0.184641 0.514816 +v -0.766329 -0.216668 0.508445 +v -1.600163 -0.220913 0.551543 +v -1.481043 -0.188258 0.551543 +v -1.361925 -0.188258 0.551543 +v -1.242805 -0.188258 0.551543 +v -1.123686 -0.188258 0.551543 +v -1.004568 -0.188258 0.551543 +v -0.885449 -0.188258 0.551543 +v -0.766329 -0.220913 0.551543 +v -1.600163 -0.216668 0.594642 +v -1.481043 -0.184641 0.588271 +v -1.361925 -0.184641 0.588271 +v -1.242805 -0.184641 0.588271 +v -1.123686 -0.184641 0.588271 +v -1.004568 -0.184641 0.588271 +v -0.885449 -0.184641 0.588271 +v -0.766329 -0.216668 0.594642 +v -1.600163 -0.204097 0.636084 +v -1.481043 -0.173928 0.623587 +v -1.361925 -0.173928 0.623587 +v -1.242805 -0.173928 0.623587 +v -1.123686 -0.173928 0.623587 +v -1.004568 -0.173928 0.623587 +v -0.885449 -0.173928 0.623587 +v -0.766329 -0.204097 0.636084 +v -1.600163 -0.183682 0.674277 +v -1.481043 -0.156531 0.656135 +v -1.361925 -0.156531 0.656135 +v -1.242805 -0.156531 0.656135 +v -1.123686 -0.156531 0.656135 +v -1.004568 -0.156531 0.656135 +v -0.885449 -0.156531 0.656135 +v -0.766329 -0.183682 0.674277 +v -1.600163 -0.156209 0.707754 +v -1.481043 -0.133118 0.684663 +v -1.361925 -0.133118 0.684663 +v -1.242805 -0.133118 0.684663 +v -1.123686 -0.133118 0.684663 +v -1.004568 -0.133118 0.684663 +v -0.885449 -0.133118 0.684663 +v -0.766329 -0.156209 0.707753 +v -1.600163 -0.122732 0.735227 +v -1.481043 -0.104590 0.708076 +v -1.361925 -0.104590 0.708076 +v -1.242805 -0.104590 0.708076 +v -1.123686 -0.104590 0.708076 +v -1.004568 -0.104590 0.708076 +v -0.885449 -0.104590 0.708076 +v -0.766329 -0.122732 0.735227 +v -1.600163 -0.084539 0.755642 +v -1.481043 -0.072042 0.725473 +v -1.361925 -0.072042 0.725473 +v -1.242805 -0.072042 0.725473 +v -1.123686 -0.072042 0.725473 +v -1.004568 -0.072042 0.725473 +v -0.885449 -0.072042 0.725473 +v -0.766329 -0.084539 0.755642 +v -1.600163 -0.043097 0.768213 +v -1.481043 -0.036726 0.736186 +v -1.361925 -0.036726 0.736186 +v -1.242805 -0.036726 0.736186 +v -1.123686 -0.036726 0.736186 +v -1.004568 -0.036726 0.736186 +v -0.885449 -0.036726 0.736186 +v -0.766329 -0.043097 0.768213 +v -1.600163 0.000001 0.772458 +v -1.481043 0.000001 0.739803 +v -1.361925 0.000001 0.739803 +v -1.242805 0.000002 0.739803 +v -1.123686 0.000002 0.739803 +v -1.004568 0.000002 0.739803 +v -0.885449 0.000002 0.739803 +v -0.766329 0.000002 0.772458 +v -1.600163 0.043100 0.768213 +v -1.481043 0.036729 0.736186 +v -1.361925 0.036729 0.736186 +v -1.242805 0.036729 0.736186 +v -1.123686 0.036729 0.736186 +v -1.004568 0.036729 0.736186 +v -0.885449 0.036729 0.736186 +v -0.766329 0.043100 0.768213 +v -1.600163 0.084542 0.755642 +v -1.481043 0.072045 0.725473 +v -1.361925 0.072045 0.725473 +v -1.242805 0.072045 0.725473 +v -1.123686 0.072045 0.725473 +v -1.004568 0.072045 0.725473 +v -0.885449 0.072046 0.725473 +v -0.766329 0.084542 0.755642 +v -1.600163 0.122735 0.735227 +v -1.481043 0.104593 0.708076 +v -1.361925 0.104593 0.708076 +v -1.242805 0.104593 0.708076 +v -1.123686 0.104593 0.708076 +v -1.004568 0.104593 0.708076 +v -0.885449 0.104593 0.708076 +v -0.766329 0.122735 0.735227 +v -1.600163 0.156212 0.707753 +v -1.481043 0.133121 0.684663 +v -1.361925 0.133121 0.684663 +v -1.242805 0.133121 0.684663 +v -1.123686 0.133121 0.684663 +v -1.004568 0.133121 0.684663 +v -0.885449 0.133121 0.684663 +v -0.766329 0.156212 0.707753 +v -1.600163 0.183685 0.674277 +v -1.481043 0.156534 0.656135 +v -1.361925 0.156534 0.656135 +v -1.242805 0.156534 0.656135 +v -1.123686 0.156534 0.656135 +v -1.004568 0.156534 0.656135 +v -0.885449 0.156534 0.656135 +v -0.766329 0.183685 0.674277 +v -1.600163 0.204100 0.636084 +v -1.481043 0.173931 0.623587 +v -1.361925 0.173931 0.623587 +v -1.242805 0.173931 0.623587 +v -1.123686 0.173931 0.623587 +v -1.004568 0.173931 0.623587 +v -0.885449 0.173931 0.623587 +v -0.766329 0.204100 0.636083 +v -1.600163 0.216671 0.594642 +v -1.481043 0.184644 0.588271 +v -1.361925 0.184644 0.588271 +v -1.242805 0.184644 0.588271 +v -1.123686 0.184644 0.588271 +v -1.004568 0.184644 0.588271 +v -0.885449 0.184644 0.588271 +v -0.766329 0.216671 0.594641 +v -1.064126 0.231022 0.551543 +v -1.064126 0.000002 0.320523 +v -1.064127 0.226583 0.506473 +v -1.064127 0.213436 0.463136 +v -1.064127 0.192088 0.423195 +v -1.064127 -0.045068 0.324962 +v -1.064127 0.163357 0.388187 +v -1.064127 -0.088406 0.338108 +v -1.064127 0.128349 0.359457 +v -1.064127 -0.128347 0.359457 +v -1.064127 0.088409 0.338108 +v -1.064127 -0.163355 0.388187 +v -1.064127 0.045071 0.324962 +v -1.064127 -0.192085 0.423195 +v -1.064127 -0.213433 0.463136 +v -1.064127 -0.226580 0.506474 +v -1.064127 -0.231019 0.551543 +v -1.064127 -0.226580 0.596613 +v -1.064127 -0.213433 0.639951 +v -1.064127 -0.192085 0.679891 +v -1.064127 -0.163355 0.714899 +v -1.064127 -0.128347 0.743630 +v -1.064127 -0.088406 0.764978 +v -1.064127 -0.045068 0.778125 +v -1.064127 0.000002 0.782564 +v -1.064127 0.045071 0.778125 +v -1.064127 0.088409 0.764978 +v -1.064127 0.128350 0.743630 +v -1.064127 0.163358 0.714899 +v -1.064127 0.192088 0.679891 +v -1.064127 0.213437 0.639951 +v -1.064127 0.226583 0.596613 +v -1.302365 0.231022 0.551543 +v -1.302365 0.000001 0.320523 +v -1.302365 0.226583 0.506473 +v -1.302365 0.213436 0.463136 +v -1.302365 0.192088 0.423195 +v -1.302365 -0.045068 0.324962 +v -1.302365 0.163357 0.388187 +v -1.302365 -0.088406 0.338108 +v -1.302365 0.128349 0.359457 +v -1.302365 -0.128347 0.359457 +v -1.302365 0.088409 0.338108 +v -1.302365 -0.163355 0.388187 +v -1.302365 0.045071 0.324962 +v -1.302365 -0.192085 0.423195 +v -1.302365 -0.213434 0.463136 +v -1.302365 -0.226580 0.506474 +v -1.302365 -0.231019 0.551543 +v -1.302365 -0.226580 0.596613 +v -1.302365 -0.213434 0.639951 +v -1.302365 -0.192085 0.679891 +v -1.302365 -0.163355 0.714899 +v -1.302365 -0.128347 0.743630 +v -1.302365 -0.088406 0.764978 +v -1.302365 -0.045068 0.778125 +v -1.302365 0.000002 0.782564 +v -1.302365 0.045071 0.778125 +v -1.302365 0.088409 0.764978 +v -1.302365 0.128350 0.743630 +v -1.302365 0.163358 0.714899 +v -1.302365 0.192088 0.679891 +v -1.302365 0.213437 0.639951 +v -1.302365 0.226583 0.596613 +v 3.396374 0.000002 0.431068 +v 3.396374 -0.023501 0.433383 +v 3.396374 -0.046101 0.440238 +v 3.396374 -0.066930 0.451371 +v 3.396374 -0.085186 0.466354 +v 3.396374 -0.100169 0.484610 +v 3.396374 -0.111302 0.505439 +v 3.396374 -0.118158 0.528039 +v 3.396374 -0.120473 0.551543 +v 3.396374 -0.118158 0.575046 +v 3.396374 -0.111302 0.597647 +v 3.396374 -0.100169 0.618475 +v 3.396374 -0.085186 0.636732 +v 3.396374 -0.066930 0.651714 +v 3.396374 -0.046101 0.662847 +v 3.396374 -0.023501 0.669703 +v 3.396374 0.000003 0.672018 +v 3.396374 0.023506 0.669703 +v 3.396374 0.046106 0.662847 +v 3.396374 0.066935 0.651714 +v 3.396374 0.085191 0.636731 +v 3.396374 0.100174 0.618475 +v 3.396374 0.111307 0.597646 +v 3.396374 0.118163 0.575046 +v 3.396374 0.120478 0.551543 +v 3.396374 0.118163 0.528039 +v 3.396374 0.111307 0.505439 +v 3.396374 0.100174 0.484610 +v 3.396374 0.085191 0.466354 +v 3.396374 0.066935 0.451371 +v 3.396374 0.046106 0.440238 +v 3.396374 0.023506 0.433383 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.670595 0.000001 0.551542 +v 5.072026 0.050647 0.530565 +v 5.072026 0.053766 0.540848 +v 5.072026 -0.030453 0.597121 +v 5.072026 -0.038760 0.590304 +v 5.072026 0.045581 0.521087 +v 5.072026 -0.020976 0.602187 +v 5.072026 -0.010692 0.497778 +v 5.072026 0.000002 0.496725 +v 5.072026 0.038764 0.512781 +v 5.072026 -0.010692 0.605307 +v 5.072026 -0.020976 0.500898 +v 5.072026 0.030457 0.505963 +v 5.072026 0.000002 0.606360 +v 5.072026 -0.030453 0.505963 +v 5.072026 0.020980 0.500898 +v 5.072026 0.010696 0.605307 +v 5.072026 -0.038760 0.512781 +v 5.072026 0.010696 0.497778 +v 5.072026 0.020980 0.602187 +v 5.072026 -0.045577 0.521088 +v 5.072026 0.030457 0.597121 +v 5.072026 -0.050643 0.530565 +v 5.072026 0.038764 0.590304 +v 5.072026 -0.053762 0.540848 +v 5.072026 0.045581 0.581997 +v 5.072026 -0.054815 0.551542 +v 5.072026 0.050647 0.572520 +v 5.072026 -0.053762 0.562237 +v 5.072026 0.053766 0.562237 +v 5.072026 -0.050643 0.572520 +v 5.072026 0.054819 0.551542 +v 5.072026 -0.045577 0.581997 +v 5.201908 0.076179 0.519988 +v 5.201908 -0.045808 0.620101 +v 5.201908 0.068560 0.505733 +v 5.201908 -0.031552 0.627720 +v 5.201908 -0.016084 0.470672 +v 5.201908 0.058305 0.493238 +v 5.201908 -0.016084 0.632412 +v 5.201908 -0.031552 0.475365 +v 5.201908 0.045811 0.482984 +v 5.201908 0.000002 0.633997 +v 5.201908 -0.045808 0.482984 +v 5.201908 0.031555 0.475365 +v 5.201908 0.016088 0.632412 +v 5.201908 -0.058302 0.493238 +v 5.201908 0.016087 0.470672 +v 5.201908 0.031555 0.627720 +v 5.201908 -0.068557 0.505733 +v 5.201908 0.045811 0.620101 +v 5.201908 -0.076176 0.519989 +v 5.201908 0.058306 0.609846 +v 5.201908 -0.080868 0.535456 +v 5.201908 0.068560 0.597351 +v 5.201908 -0.082453 0.551542 +v 5.201908 0.076179 0.583096 +v 5.201908 -0.080868 0.567628 +v 5.201908 0.080872 0.567628 +v 5.201908 -0.076176 0.583096 +v 5.201908 0.082456 0.551542 +v 5.201908 -0.068557 0.597352 +v 5.201908 0.080871 0.535456 +v 5.201908 -0.058302 0.609846 +v 5.201908 0.000002 0.469088 +v 3.268884 0.184185 0.514906 +v 3.268884 0.187794 0.551543 +v 3.268884 -0.132785 0.684331 +v 3.268884 -0.156140 0.655874 +v 3.268884 0.173499 0.479678 +v 3.268884 -0.104328 0.707685 +v 3.268884 0.156145 0.447212 +v 3.268884 -0.071862 0.725039 +v 3.268884 -0.036633 0.367360 +v 3.268884 0.000003 0.363752 +v 3.268884 0.132791 0.418754 +v 3.268884 -0.036633 0.735725 +v 3.268884 -0.071862 0.378047 +v 3.268884 0.104334 0.395400 +v 3.268884 0.000003 0.739334 +v 3.268884 -0.104328 0.395400 +v 3.268884 0.071867 0.378047 +v 3.268884 0.036639 0.735725 +v 3.268884 -0.132785 0.418755 +v 3.268884 0.036639 0.367360 +v 3.268884 0.071867 0.725039 +v 3.268884 -0.156140 0.447212 +v 3.268884 0.104334 0.707685 +v 3.268884 -0.173493 0.479678 +v 3.268884 0.132791 0.684331 +v 3.268884 -0.184180 0.514907 +v 3.268884 0.156145 0.655874 +v 3.268884 -0.187788 0.551543 +v 3.268884 0.173499 0.623407 +v 3.268884 -0.184180 0.588179 +v 3.268884 0.184185 0.588179 +v 3.268884 -0.173493 0.623407 +v 3.992743 0.083075 0.535018 +v 3.992743 -0.059890 0.611435 +v 3.992743 0.000002 0.466843 +v 3.992743 0.078255 0.519129 +v 3.992743 -0.047055 0.621968 +v 3.992743 0.070428 0.504486 +v 3.992743 -0.032411 0.629795 +v 3.992743 -0.016522 0.468470 +v 3.992743 0.059894 0.491651 +v 3.992743 -0.016522 0.634615 +v 3.992743 -0.032411 0.473290 +v 3.992743 0.047059 0.481117 +v 3.992743 0.000002 0.636243 +v 3.992743 -0.047055 0.481117 +v 3.992743 0.032415 0.473290 +v 3.992743 0.016526 0.634615 +v 3.992743 -0.059890 0.491651 +v 3.992743 0.016526 0.468470 +v 3.992743 0.032416 0.629795 +v 3.992743 -0.070423 0.504486 +v 3.992743 0.047059 0.621968 +v 3.992743 -0.078250 0.519129 +v 3.992743 0.059894 0.611435 +v 3.992743 -0.083070 0.535018 +v 3.992743 0.070428 0.598599 +v 3.992743 -0.084698 0.551543 +v 3.992743 0.078255 0.583956 +v 3.992743 -0.083070 0.568067 +v 3.992743 0.083075 0.568067 +v 3.992743 -0.078250 0.583956 +v 3.992743 0.084702 0.551543 +v 3.992743 -0.070423 0.598599 +v 4.797544 0.053151 0.529527 +v 4.797544 -0.031959 0.599375 +v 4.797544 0.047835 0.519582 +v 4.797544 -0.022013 0.604691 +v 4.797544 -0.011221 0.495120 +v 4.797544 0.040680 0.510864 +v 4.797544 -0.011221 0.607965 +v 4.797544 -0.022013 0.498394 +v 4.797544 0.031963 0.503710 +v 4.797544 0.000002 0.609070 +v 4.797544 -0.031959 0.503710 +v 4.797544 0.022017 0.498394 +v 4.797544 0.011225 0.607965 +v 4.797544 -0.040676 0.510864 +v 4.797544 0.011225 0.495120 +v 4.797544 0.022017 0.604691 +v 4.797544 -0.047831 0.519582 +v 4.797544 0.031963 0.599375 +v 4.797544 -0.053147 0.529528 +v 4.797544 0.040680 0.592221 +v 4.797544 -0.056421 0.540319 +v 4.797544 0.047835 0.583503 +v 4.797544 -0.057526 0.551543 +v 4.797544 0.053151 0.573557 +v 4.797544 -0.056421 0.562766 +v 4.797544 0.056425 0.562766 +v 4.797544 -0.053147 0.573557 +v 4.797544 0.057530 0.551542 +v 4.797544 -0.047831 0.583503 +v 4.797544 0.056425 0.540319 +v 4.797544 -0.040676 0.592221 +v 4.797544 0.000002 0.494015 +v 4.684866 0.100623 0.531528 +v 4.640315 0.125171 0.526645 +v 4.595768 0.100623 0.531528 +v 4.551219 0.125171 0.526645 +v 4.506669 0.100623 0.531528 +v 4.461956 0.124635 0.527181 +v 4.417573 0.100623 0.531528 +v 4.373023 0.125171 0.526645 +v 4.328474 0.100623 0.531528 +v 4.283925 0.125171 0.526645 +v 4.239376 0.100623 0.531528 +v 4.194828 0.079277 0.535774 +v 4.684866 -0.072542 0.624086 +v 4.640315 -0.090240 0.641784 +v 4.595768 -0.072542 0.624086 +v 4.551219 -0.090240 0.641784 +v 4.506669 -0.072542 0.624086 +v 4.461956 -0.090776 0.642321 +v 4.417573 -0.072542 0.624086 +v 4.373023 -0.090240 0.641784 +v 4.328474 -0.072542 0.624086 +v 4.283925 -0.090240 0.641784 +v 4.239376 -0.072541 0.624086 +v 4.194828 -0.057152 0.608697 +v 4.684866 0.000002 0.448950 +v 4.640315 0.000002 0.423921 +v 4.595768 0.000002 0.448950 +v 4.551219 0.000002 0.423921 +v 4.506669 0.000002 0.448950 +v 4.461956 -0.000534 0.424458 +v 4.417573 0.000002 0.448950 +v 4.373023 0.000002 0.423921 +v 4.328474 0.000002 0.448950 +v 4.283925 0.000002 0.423921 +v 4.239376 0.000002 0.448950 +v 4.194828 0.000002 0.470714 +v 4.194828 0.074678 0.520611 +v 4.239376 0.094785 0.512282 +v 4.283925 0.117909 0.502704 +v 4.328474 0.094785 0.512282 +v 4.373023 0.117909 0.502704 +v 4.417573 0.094785 0.512282 +v 4.461957 0.117372 0.503240 +v 4.506669 0.094785 0.512282 +v 4.551219 0.117909 0.502704 +v 4.595768 0.094785 0.512282 +v 4.640318 0.117909 0.502704 +v 4.684866 0.094785 0.512282 +v 4.194828 -0.044904 0.618749 +v 4.239376 -0.056995 0.636845 +v 4.283925 -0.070900 0.657656 +v 4.328474 -0.056995 0.636845 +v 4.373023 -0.070900 0.657656 +v 4.417573 -0.056995 0.636845 +v 4.461957 -0.071437 0.658192 +v 4.506669 -0.056995 0.636845 +v 4.551219 -0.070900 0.657656 +v 4.595768 -0.056995 0.636845 +v 4.640318 -0.070900 0.657656 +v 4.684866 -0.056995 0.636845 +v 4.194828 0.067208 0.506637 +v 4.239376 0.085304 0.494545 +v 4.283925 0.106115 0.480640 +v 4.328474 0.085304 0.494545 +v 4.373023 0.106115 0.480640 +v 4.417573 0.085304 0.494545 +v 4.461957 0.105579 0.481176 +v 4.506669 0.085304 0.494545 +v 4.551219 0.106115 0.480640 +v 4.595768 0.085304 0.494545 +v 4.640318 0.106115 0.480640 +v 4.684866 0.085304 0.494545 +v 4.194828 -0.030929 0.626218 +v 4.239376 -0.039258 0.646325 +v 4.283925 -0.048836 0.669449 +v 4.328474 -0.039258 0.646325 +v 4.373023 -0.048836 0.669449 +v 4.417573 -0.039258 0.646325 +v 4.461957 -0.049373 0.669985 +v 4.506669 -0.039258 0.646325 +v 4.551219 -0.048836 0.669449 +v 4.595768 -0.039258 0.646325 +v 4.640318 -0.048836 0.669449 +v 4.684866 -0.039258 0.646325 +v 4.194828 -0.015767 0.472267 +v 4.239376 -0.020013 0.450922 +v 4.283925 -0.024895 0.426374 +v 4.328474 -0.020013 0.450922 +v 4.373023 -0.024896 0.426374 +v 4.417573 -0.020013 0.450922 +v 4.461957 -0.025432 0.426910 +v 4.506669 -0.020013 0.450922 +v 4.551219 -0.024896 0.426374 +v 4.595768 -0.020013 0.450922 +v 4.640318 -0.024896 0.426374 +v 4.684866 -0.020013 0.450922 +v 4.194828 0.057156 0.494388 +v 4.239376 0.072546 0.478999 +v 4.283925 0.090244 0.461301 +v 4.328474 0.072546 0.478999 +v 4.373023 0.090244 0.461301 +v 4.417573 0.072546 0.478999 +v 4.461957 0.089707 0.461837 +v 4.507077 0.073144 0.479622 +v 4.551219 0.090244 0.461301 +v 4.595768 0.072546 0.478999 +v 4.640318 0.090244 0.461301 +v 4.684866 0.072546 0.478999 +v 4.194828 -0.015767 0.630818 +v 4.239376 -0.020013 0.652164 +v 4.283925 -0.024895 0.676711 +v 4.328474 -0.020013 0.652164 +v 4.373023 -0.024895 0.676711 +v 4.417573 -0.020013 0.652164 +v 4.461957 -0.025432 0.677248 +v 4.506669 -0.020013 0.652164 +v 4.551219 -0.024896 0.676711 +v 4.595768 -0.020013 0.652164 +v 4.640318 -0.024896 0.676711 +v 4.684866 -0.020013 0.652164 +v 4.194828 -0.030930 0.476867 +v 4.239376 -0.039258 0.456760 +v 4.283925 -0.048836 0.433636 +v 4.328474 -0.039258 0.456760 +v 4.373023 -0.048836 0.433636 +v 4.417573 -0.039258 0.456760 +v 4.461957 -0.049373 0.434172 +v 4.506669 -0.039258 0.456760 +v 4.551219 -0.048836 0.433636 +v 4.595768 -0.039258 0.456760 +v 4.640318 -0.048836 0.433636 +v 4.684866 -0.039258 0.456760 +v 4.194828 0.044908 0.484336 +v 4.239376 0.056999 0.466240 +v 4.283925 0.070905 0.445429 +v 4.328474 0.056999 0.466240 +v 4.373023 0.070904 0.445429 +v 4.417573 0.056999 0.466240 +v 4.461957 0.070368 0.445966 +v 4.506669 0.056999 0.466240 +v 4.551219 0.070904 0.445429 +v 4.595768 0.056999 0.466240 +v 4.640318 0.070904 0.445429 +v 4.684866 0.056999 0.466240 +v 4.194828 0.000002 0.632371 +v 4.239376 0.000002 0.654135 +v 4.283925 0.000002 0.679164 +v 4.328474 0.000002 0.654135 +v 4.373023 0.000002 0.679164 +v 4.417573 0.000002 0.654135 +v 4.461957 -0.000534 0.679700 +v 4.506669 0.000002 0.654135 +v 4.551219 0.000002 0.679164 +v 4.595768 0.000002 0.654135 +v 4.640318 0.000002 0.679164 +v 4.684866 0.000002 0.654135 +v 4.194828 -0.044904 0.484336 +v 4.239376 -0.056995 0.466240 +v 4.283925 -0.070900 0.445430 +v 4.328474 -0.056995 0.466240 +v 4.373023 -0.070900 0.445430 +v 4.417573 -0.056995 0.466240 +v 4.461957 -0.071437 0.445966 +v 4.506669 -0.056995 0.466240 +v 4.551219 -0.070900 0.445430 +v 4.595768 -0.056995 0.466240 +v 4.640318 -0.070900 0.445429 +v 4.684866 -0.056995 0.466240 +v 4.194828 0.030934 0.476867 +v 4.239376 0.039262 0.456760 +v 4.283925 0.048840 0.433636 +v 4.328474 0.039262 0.456760 +v 4.373023 0.048840 0.433636 +v 4.417573 0.039262 0.456760 +v 4.461957 0.048304 0.434172 +v 4.506669 0.039262 0.456760 +v 4.551219 0.048840 0.433636 +v 4.595768 0.039262 0.456760 +v 4.640318 0.048840 0.433636 +v 4.684866 0.039262 0.456760 +v 4.194828 0.015771 0.630818 +v 4.239376 0.020017 0.652164 +v 4.283925 0.024900 0.676711 +v 4.328474 0.020017 0.652164 +v 4.373023 0.024900 0.676711 +v 4.417573 0.020017 0.652164 +v 4.461957 0.024364 0.677248 +v 4.506669 0.020017 0.652164 +v 4.551219 0.024900 0.676711 +v 4.595768 0.020017 0.652164 +v 4.640318 0.024900 0.676711 +v 4.684866 0.020017 0.652164 +v 4.194828 -0.057152 0.494388 +v 4.239376 -0.072541 0.478999 +v 4.283925 -0.090240 0.461301 +v 4.328474 -0.072542 0.478999 +v 4.373023 -0.090240 0.461301 +v 4.417573 -0.072542 0.478999 +v 4.461957 -0.090776 0.461837 +v 4.506669 -0.072542 0.478999 +v 4.551219 -0.090240 0.461301 +v 4.595768 -0.072542 0.478999 +v 4.640318 -0.090240 0.461301 +v 4.684866 -0.072542 0.478999 +v 4.194828 0.015771 0.472267 +v 4.239376 0.020017 0.450922 +v 4.283925 0.024900 0.426374 +v 4.328474 0.020017 0.450922 +v 4.373023 0.024900 0.426374 +v 4.417573 0.020017 0.450922 +v 4.461957 0.024363 0.426910 +v 4.506669 0.020017 0.450922 +v 4.551219 0.024900 0.426374 +v 4.595768 0.020017 0.450922 +v 4.640318 0.024900 0.426374 +v 4.684866 0.020017 0.450922 +v 4.194828 0.030934 0.626218 +v 4.239376 0.039263 0.646325 +v 4.283925 0.048841 0.669449 +v 4.328474 0.039263 0.646325 +v 4.373023 0.048841 0.669449 +v 4.417573 0.039263 0.646325 +v 4.461957 0.048304 0.669985 +v 4.506669 0.039263 0.646325 +v 4.551219 0.048841 0.669449 +v 4.595768 0.039262 0.646325 +v 4.640318 0.048841 0.669449 +v 4.684866 0.039262 0.646325 +v 4.194828 -0.067204 0.506637 +v 4.239376 -0.085300 0.494545 +v 4.283925 -0.106111 0.480640 +v 4.328474 -0.085300 0.494545 +v 4.373023 -0.106111 0.480640 +v 4.417573 -0.085300 0.494545 +v 4.461957 -0.106647 0.481176 +v 4.506669 -0.085300 0.494545 +v 4.551219 -0.106111 0.480640 +v 4.595768 -0.085300 0.494545 +v 4.640318 -0.106111 0.480640 +v 4.684866 -0.085300 0.494545 +v 4.194828 0.044908 0.618749 +v 4.239376 0.056999 0.636845 +v 4.283925 0.070905 0.657656 +v 4.328474 0.056999 0.636845 +v 4.373023 0.070905 0.657656 +v 4.417573 0.056999 0.636845 +v 4.461957 0.070368 0.658192 +v 4.506669 0.056999 0.636845 +v 4.551219 0.070905 0.657656 +v 4.595768 0.056999 0.636845 +v 4.640318 0.070905 0.657656 +v 4.684866 0.056999 0.636845 +v 4.194828 -0.074674 0.520611 +v 4.239376 -0.094781 0.512282 +v 4.283925 -0.117904 0.502704 +v 4.328474 -0.094781 0.512282 +v 4.373023 -0.117904 0.502704 +v 4.417573 -0.094781 0.512282 +v 4.461957 -0.118441 0.503240 +v 4.506669 -0.094781 0.512282 +v 4.551219 -0.117904 0.502704 +v 4.595768 -0.094781 0.512282 +v 4.640318 -0.117904 0.502704 +v 4.684866 -0.094781 0.512282 +v 4.194828 0.057157 0.608697 +v 4.239376 0.072546 0.624086 +v 4.283925 0.090244 0.641784 +v 4.328474 0.072546 0.624086 +v 4.373023 0.090244 0.641784 +v 4.417573 0.072546 0.624086 +v 4.461957 0.089708 0.642321 +v 4.506669 0.072546 0.624086 +v 4.551219 0.090244 0.641784 +v 4.595768 0.072546 0.624086 +v 4.640318 0.090244 0.641784 +v 4.684866 0.072546 0.624086 +v 4.194828 -0.079273 0.535774 +v 4.239376 -0.100619 0.531528 +v 4.283925 -0.125167 0.526645 +v 4.328474 -0.100619 0.531528 +v 4.373023 -0.125167 0.526645 +v 4.417573 -0.100619 0.531528 +v 4.461957 -0.125703 0.527181 +v 4.506669 -0.100619 0.531528 +v 4.551219 -0.125167 0.526645 +v 4.595768 -0.100619 0.531528 +v 4.640318 -0.125167 0.526645 +v 4.684866 -0.100619 0.531528 +v 4.194828 0.067209 0.596448 +v 4.239376 0.085305 0.608540 +v 4.283925 0.106115 0.622445 +v 4.328474 0.085305 0.608540 +v 4.373023 0.106115 0.622445 +v 4.417573 0.085304 0.608540 +v 4.461957 0.105579 0.622981 +v 4.506669 0.085304 0.608540 +v 4.551219 0.106115 0.622445 +v 4.595768 0.085304 0.608540 +v 4.640318 0.106115 0.622445 +v 4.684866 0.085304 0.608540 +v 4.194828 -0.080826 0.551543 +v 4.239376 -0.102590 0.551543 +v 4.283925 -0.127619 0.551543 +v 4.328474 -0.102590 0.551543 +v 4.373023 -0.127619 0.551543 +v 4.417573 -0.102590 0.551543 +v 4.461957 -0.128155 0.552079 +v 4.506669 -0.102590 0.551543 +v 4.551219 -0.127619 0.551543 +v 4.595768 -0.102590 0.551543 +v 4.640318 -0.127619 0.551543 +v 4.684866 -0.102590 0.551543 +v 4.194828 0.074678 0.582474 +v 4.239376 0.094785 0.590803 +v 4.283925 0.117909 0.600381 +v 4.328474 0.094785 0.590803 +v 4.373023 0.117909 0.600381 +v 4.417573 0.094785 0.590803 +v 4.461957 0.117372 0.600917 +v 4.506669 0.094785 0.590803 +v 4.551219 0.117909 0.600381 +v 4.595768 0.094785 0.590803 +v 4.640318 0.117909 0.600381 +v 4.684866 0.094785 0.590803 +v 4.194828 -0.079273 0.567311 +v 4.239376 -0.100619 0.571557 +v 4.283925 -0.125167 0.576440 +v 4.328474 -0.100619 0.571557 +v 4.373023 -0.125167 0.576440 +v 4.417573 -0.100619 0.571557 +v 4.461957 -0.125703 0.576977 +v 4.506669 -0.100619 0.571557 +v 4.551219 -0.125167 0.576440 +v 4.595768 -0.100619 0.571557 +v 4.640318 -0.125167 0.576440 +v 4.684866 -0.100619 0.571557 +v 4.194828 0.079278 0.567311 +v 4.239376 0.100623 0.571557 +v 4.283925 0.125171 0.576440 +v 4.328474 0.100623 0.571557 +v 4.373023 0.125171 0.576440 +v 4.417573 0.100623 0.571557 +v 4.461957 0.124635 0.576976 +v 4.506669 0.100623 0.571557 +v 4.551219 0.125171 0.576440 +v 4.595768 0.100623 0.571557 +v 4.640318 0.125171 0.576440 +v 4.684866 0.100623 0.571557 +v 4.194828 -0.074674 0.582474 +v 4.239376 -0.094781 0.590803 +v 4.283925 -0.117904 0.600381 +v 4.328474 -0.094781 0.590803 +v 4.373023 -0.117904 0.600381 +v 4.417573 -0.094781 0.590803 +v 4.461957 -0.118441 0.600917 +v 4.506669 -0.094781 0.590803 +v 4.551219 -0.117904 0.600381 +v 4.595768 -0.094781 0.590803 +v 4.640318 -0.117904 0.600381 +v 4.684866 -0.094781 0.590803 +v 4.194828 0.080831 0.551543 +v 4.239376 0.102594 0.551543 +v 4.283925 0.127623 0.551542 +v 4.328474 0.102594 0.551542 +v 4.373023 0.127623 0.551542 +v 4.417573 0.102594 0.551542 +v 4.461957 0.127087 0.552079 +v 4.506669 0.102594 0.551542 +v 4.551219 0.127623 0.551542 +v 4.595768 0.102594 0.551542 +v 4.640318 0.127623 0.551542 +v 4.684866 0.102594 0.551542 +v 4.194828 -0.067204 0.596448 +v 4.239376 -0.085300 0.608540 +v 4.283925 -0.106111 0.622445 +v 4.328474 -0.085300 0.608540 +v 4.373023 -0.106111 0.622445 +v 4.417573 -0.085300 0.608540 +v 4.461957 -0.106647 0.622981 +v 4.506669 -0.085300 0.608540 +v 4.551219 -0.106111 0.622445 +v 4.595768 -0.085300 0.608540 +v 4.640318 -0.106111 0.622445 +v 4.684866 -0.085300 0.608540 +v 3.587242 -0.000000 -0.145895 +v 3.989225 0.000000 -0.186209 +v 3.587242 -0.021885 -0.143739 +v 3.989225 -0.014454 -0.184785 +v 3.587242 -0.042928 -0.137356 +v 3.989225 -0.028353 -0.180569 +v 3.587242 -0.062322 -0.126990 +v 3.989225 -0.041162 -0.173722 +v 3.587242 -0.079321 -0.113039 +v 3.989225 -0.052389 -0.164508 +v 3.587242 -0.093272 -0.096040 +v 3.989225 -0.061603 -0.153281 +v 3.587242 -0.103638 -0.076646 +v 3.989225 -0.068449 -0.140472 +v 3.587242 -0.110022 -0.055603 +v 3.989225 -0.072665 -0.126574 +v 3.587242 -0.112177 -0.033718 +v 3.989225 -0.074089 -0.112120 +v 3.587242 -0.110022 -0.011833 +v 3.989225 -0.072665 -0.097666 +v 3.587242 -0.103638 0.009210 +v 3.989225 -0.068449 -0.083767 +v 3.587242 -0.093272 0.028604 +v 3.989225 -0.061603 -0.070958 +v 3.587242 -0.079321 0.045603 +v 3.989225 -0.052389 -0.059731 +v 3.587242 -0.062322 0.059554 +v 3.989225 -0.041162 -0.050517 +v 3.587242 -0.042928 0.069920 +v 3.989225 -0.028353 -0.043670 +v 3.587242 -0.021885 0.076304 +v 3.989225 -0.014454 -0.039454 +v 3.587242 0.000000 0.078459 +v 3.989225 0.000000 -0.038031 +v 3.587242 0.021885 0.076304 +v 3.989225 0.014454 -0.039454 +v 3.587242 0.042928 0.069920 +v 3.989225 0.028353 -0.043670 +v 3.587242 0.062322 0.059554 +v 3.989225 0.041162 -0.050517 +v 3.587242 0.079321 0.045603 +v 3.989225 0.052389 -0.059731 +v 3.587242 0.093272 0.028604 +v 3.989225 0.061603 -0.070958 +v 3.587242 0.103638 0.009210 +v 3.989225 0.068449 -0.083767 +v 3.587242 0.110022 -0.011833 +v 3.989225 0.072665 -0.097666 +v 3.587242 0.112177 -0.033718 +v 3.989225 0.074089 -0.112120 +v 3.587242 0.110022 -0.055603 +v 3.989225 0.072665 -0.126574 +v 3.587242 0.103638 -0.076646 +v 3.989225 0.068449 -0.140472 +v 3.587242 0.093272 -0.096040 +v 3.989225 0.061603 -0.153281 +v 3.587242 0.079321 -0.113039 +v 3.989225 0.052389 -0.164508 +v 3.587242 0.062322 -0.126990 +v 3.989225 0.041162 -0.173722 +v 3.587242 0.042928 -0.137356 +v 3.989225 0.028353 -0.180569 +v 3.587242 0.021884 -0.143740 +v 3.989225 0.014454 -0.184785 +v 4.637677 -0.014454 -0.106383 +v 4.637677 0.000000 -0.107807 +v 4.637677 -0.028353 -0.102167 +v 4.637677 -0.041162 -0.095321 +v 4.637677 -0.052389 -0.086107 +v 4.637677 -0.061603 -0.074880 +v 4.637677 -0.068449 -0.062070 +v 4.637677 -0.072665 -0.048172 +v 4.637677 -0.074089 -0.033718 +v 4.637677 -0.072665 -0.019264 +v 4.637677 -0.068449 -0.005365 +v 4.637677 -0.061603 0.007444 +v 4.637677 -0.052389 0.018671 +v 4.637677 -0.041162 0.027885 +v 4.637677 -0.028353 0.034731 +v 4.637677 -0.014454 0.038948 +v 4.637677 0.000000 0.040371 +v 4.637677 0.014454 0.038948 +v 4.637677 0.028353 0.034731 +v 4.637677 0.041162 0.027885 +v 4.637677 0.052389 0.018671 +v 4.637677 0.061603 0.007444 +v 4.637677 0.068449 -0.005365 +v 4.637677 0.072665 -0.019264 +v 4.637677 0.074089 -0.033718 +v 4.637677 0.072665 -0.048172 +v 4.637677 0.068449 -0.062071 +v 4.637677 0.061603 -0.074880 +v 4.637677 0.052389 -0.086107 +v 4.637677 0.041162 -0.095321 +v 4.637677 0.028353 -0.102167 +v 4.637677 0.014454 -0.106383 +v 5.273666 0.000001 -0.033718 +v 3.179720 -0.053726 0.036675 +v 3.188101 -0.077999 0.043213 +v 3.199381 -0.099273 0.052010 +v 3.213126 -0.116733 0.062730 +v 3.228806 -0.129707 0.074960 +v 3.245822 -0.137696 0.088231 +v 3.263516 -0.140394 0.102031 +v 3.281211 -0.137696 0.115832 +v 3.298226 -0.129707 0.129103 +v 3.313907 -0.116733 0.141333 +v 3.327652 -0.099273 0.152053 +v 3.338932 -0.077998 0.160850 +v 3.347313 -0.053726 0.167388 +v 3.352474 -0.027389 0.171413 +v 3.354218 0.000000 0.172772 +v 3.352474 0.027389 0.171413 +v 3.347313 0.053726 0.167388 +v 3.338932 0.077999 0.160850 +v 3.327652 0.099273 0.152053 +v 3.313908 0.116733 0.141333 +v 3.298226 0.129707 0.129103 +v 3.281211 0.137696 0.115832 +v 3.263516 0.140394 0.102031 +v 3.245822 0.137696 0.088231 +v 3.228806 0.129707 0.074960 +v 3.213126 0.116733 0.062730 +v 3.199381 0.099273 0.052010 +v 3.188101 0.077998 0.043212 +v 3.179720 0.053726 0.036675 +v 3.174559 0.027389 0.032650 +v 3.172815 0.000000 0.031291 +v 3.587242 -0.000000 -0.145895 +v 3.587242 -0.021885 -0.143739 +v 3.587242 -0.042928 -0.137356 +v 3.587242 -0.062322 -0.126990 +v 3.587242 -0.079321 -0.113039 +v 3.587242 -0.093272 -0.096040 +v 3.587242 -0.103638 -0.076646 +v 3.587242 -0.110022 -0.055603 +v 3.587242 -0.112177 -0.033718 +v 3.587242 -0.110022 -0.011833 +v 3.587242 -0.103638 0.009210 +v 3.587242 -0.093272 0.028604 +v 3.587242 -0.079321 0.045603 +v 3.587242 -0.062322 0.059554 +v 3.587242 -0.042928 0.069920 +v 3.587242 -0.021885 0.076304 +v 3.587242 0.000000 0.078459 +v 3.587242 0.021885 0.076304 +v 3.587242 0.042928 0.069920 +v 3.587242 0.062322 0.059554 +v 3.587242 0.079321 0.045603 +v 3.587242 0.093272 0.028604 +v 3.587242 0.103638 0.009210 +v 3.587242 0.110022 -0.011833 +v 3.587242 0.112177 -0.033718 +v 3.587242 0.110022 -0.055603 +v 3.587242 0.103638 -0.076646 +v 3.587242 0.093272 -0.096040 +v 3.587242 0.079321 -0.113039 +v 3.587242 0.062322 -0.126990 +v 3.587242 0.042928 -0.137356 +v 3.587242 0.021884 -0.143740 +v 2.943389 0.000000 0.479873 +v 2.946735 -0.033974 0.479873 +v 2.956646 -0.066643 0.479873 +v 2.972738 -0.096750 0.479873 +v 2.994395 -0.123139 0.479873 +v 3.020784 -0.144796 0.479873 +v 3.050892 -0.160889 0.479873 +v 3.083561 -0.170799 0.479873 +v 3.117535 -0.174145 0.479873 +v 3.151508 -0.170799 0.479873 +v 3.184176 -0.160889 0.479873 +v 3.214284 -0.144796 0.479873 +v 3.240674 -0.123139 0.479873 +v 3.262331 -0.096750 0.479873 +v 3.278424 -0.066642 0.479873 +v 3.288334 -0.033974 0.479873 +v 3.291680 0.000000 0.479873 +v 3.288334 0.033974 0.479873 +v 3.278424 0.066643 0.479873 +v 3.262331 0.096750 0.479873 +v 3.240674 0.123139 0.479873 +v 3.214284 0.144797 0.479873 +v 3.184176 0.160889 0.479873 +v 3.151508 0.170799 0.479873 +v 3.117535 0.174145 0.479873 +v 3.083561 0.170799 0.479873 +v 3.050892 0.160889 0.479873 +v 3.020784 0.144796 0.479873 +v 2.994395 0.123139 0.479873 +v 2.972738 0.096750 0.479873 +v 2.956646 0.066642 0.479873 +v 2.946735 0.033974 0.479873 +v 3.368539 -0.000000 -0.102855 +v 3.048191 0.000000 0.184855 +v 3.050586 0.034861 0.185759 +v 3.369501 0.021297 -0.100929 +v 3.057676 0.068383 0.188436 +v 3.372353 0.041775 -0.095226 +v 3.069191 0.099276 0.192783 +v 3.376984 0.060648 -0.085964 +v 3.084687 0.126355 0.198633 +v 3.383216 0.077190 -0.073499 +v 3.103569 0.148578 0.205762 +v 3.390810 0.090766 -0.058311 +v 3.125113 0.165091 0.213894 +v 3.399475 0.100854 -0.040983 +v 3.148487 0.175260 0.222719 +v 3.408875 0.107066 -0.022181 +v 3.172796 0.178693 0.231897 +v 3.418653 0.109163 -0.002627 +v 3.197106 0.175260 0.241074 +v 3.428429 0.107066 0.016926 +v 3.220482 0.165091 0.249899 +v 3.437830 0.100854 0.035728 +v 3.242024 0.148578 0.258032 +v 3.446494 0.090766 0.053056 +v 3.260906 0.126355 0.265160 +v 3.454088 0.077190 0.068244 +v 3.276403 0.099277 0.271011 +v 3.460320 0.060648 0.080709 +v 3.287918 0.068383 0.275358 +v 3.464952 0.041775 0.089971 +v 3.295009 0.034861 0.278035 +v 3.467803 0.021297 0.095675 +v 3.297402 0.000000 0.278939 +v 3.468766 0.000000 0.097600 +v 3.295009 -0.034861 0.278035 +v 3.467803 -0.021297 0.095675 +v 3.287918 -0.068383 0.275358 +v 3.464952 -0.041775 0.089971 +v 3.276403 -0.099277 0.271011 +v 3.460320 -0.060648 0.080709 +v 3.260906 -0.126355 0.265160 +v 3.454088 -0.077190 0.068244 +v 3.242024 -0.148578 0.258032 +v 3.446494 -0.090766 0.053056 +v 3.220482 -0.165091 0.249899 +v 3.437830 -0.100854 0.035728 +v 3.197106 -0.175260 0.241074 +v 3.428429 -0.107066 0.016926 +v 3.172796 -0.178693 0.231897 +v 3.418653 -0.109163 -0.002627 +v 3.148487 -0.175260 0.222719 +v 3.408875 -0.107066 -0.022181 +v 3.125113 -0.165091 0.213895 +v 3.399475 -0.100854 -0.040983 +v 3.103569 -0.148578 0.205762 +v 3.390810 -0.090766 -0.058311 +v 3.084687 -0.126355 0.198633 +v 3.383216 -0.077190 -0.073499 +v 3.069191 -0.099277 0.192783 +v 3.376984 -0.060648 -0.085964 +v 3.057676 -0.068383 0.188436 +v 3.372353 -0.041775 -0.095226 +v 3.050586 -0.034861 0.185759 +v 3.369501 -0.021297 -0.100929 +v 3.174559 -0.027389 0.032650 +v 3.023735 0.000000 0.331704 +v 3.026553 0.034417 0.332276 +v 3.034897 0.067512 0.333971 +v 3.048448 0.098013 0.336723 +v 3.066685 0.124747 0.340427 +v 3.088904 0.146687 0.344940 +v 3.114257 0.162990 0.350089 +v 3.141765 0.173029 0.355676 +v 3.170372 0.176419 0.361486 +v 3.198979 0.173029 0.367297 +v 3.226487 0.162990 0.372884 +v 3.251839 0.146687 0.378033 +v 3.274060 0.124747 0.382546 +v 3.292296 0.098013 0.386249 +v 3.305847 0.067513 0.389002 +v 3.314192 0.034418 0.390696 +v 3.317009 0.000000 0.391269 +v 3.314192 -0.034418 0.390696 +v 3.305847 -0.067513 0.389002 +v 3.292296 -0.098013 0.386249 +v 3.274060 -0.124747 0.382546 +v 3.251839 -0.146687 0.378033 +v 3.226487 -0.162990 0.372884 +v 3.198979 -0.173029 0.367297 +v 3.170372 -0.176419 0.361486 +v 3.141765 -0.173029 0.355676 +v 3.114257 -0.162990 0.350089 +v 3.088905 -0.146687 0.344940 +v 3.066685 -0.124747 0.340427 +v 3.048448 -0.098013 0.336723 +v 3.034897 -0.067513 0.333971 +v 3.026553 -0.034418 0.332276 +v 3.587242 -0.000000 1.248980 +v 3.989225 0.000000 1.289294 +v 3.587242 -0.021885 1.246825 +v 3.989225 -0.014454 1.287870 +v 3.587242 -0.042928 1.240441 +v 3.989225 -0.028353 1.283654 +v 3.587242 -0.062322 1.230075 +v 3.989225 -0.041162 1.276808 +v 3.587242 -0.079321 1.216125 +v 3.989225 -0.052389 1.267594 +v 3.587242 -0.093272 1.199126 +v 3.989225 -0.061603 1.256366 +v 3.587242 -0.103638 1.179732 +v 3.989225 -0.068449 1.243557 +v 3.587242 -0.110022 1.158688 +v 3.989225 -0.072665 1.229659 +v 3.587242 -0.112177 1.136803 +v 3.989225 -0.074089 1.215205 +v 3.587242 -0.110022 1.114919 +v 3.989225 -0.072665 1.200751 +v 3.587242 -0.103638 1.093875 +v 3.989225 -0.068449 1.186852 +v 3.587242 -0.093272 1.074481 +v 3.989225 -0.061603 1.174043 +v 3.587242 -0.079321 1.057482 +v 3.989225 -0.052389 1.162816 +v 3.587242 -0.062322 1.043532 +v 3.989225 -0.041162 1.153602 +v 3.587242 -0.042928 1.033165 +v 3.989225 -0.028353 1.146756 +v 3.587242 -0.021885 1.026782 +v 3.989225 -0.014454 1.142540 +v 3.587242 0.000000 1.024626 +v 3.989225 0.000000 1.141116 +v 3.587242 0.021885 1.026782 +v 3.989225 0.014454 1.142540 +v 3.587242 0.042928 1.033165 +v 3.989225 0.028353 1.146756 +v 3.587242 0.062322 1.043532 +v 3.989225 0.041162 1.153602 +v 3.587242 0.079321 1.057482 +v 3.989225 0.052389 1.162816 +v 3.587242 0.093272 1.074481 +v 3.989225 0.061603 1.174043 +v 3.587242 0.103638 1.093875 +v 3.989225 0.068449 1.186852 +v 3.587242 0.110022 1.114919 +v 3.989225 0.072665 1.200751 +v 3.587242 0.112177 1.136803 +v 3.989225 0.074089 1.215205 +v 3.587242 0.110022 1.158688 +v 3.989225 0.072665 1.229659 +v 3.587242 0.103638 1.179732 +v 3.989225 0.068449 1.243558 +v 3.587242 0.093272 1.199126 +v 3.989225 0.061603 1.256367 +v 3.587242 0.079321 1.216125 +v 3.989225 0.052389 1.267594 +v 3.587242 0.062322 1.230075 +v 3.989225 0.041162 1.276808 +v 3.587242 0.042928 1.240442 +v 3.989225 0.028353 1.283654 +v 3.587242 0.021884 1.246825 +v 3.989225 0.014454 1.287870 +v 4.637677 -0.014454 1.209468 +v 4.637677 0.000000 1.210892 +v 4.637677 -0.028353 1.205252 +v 4.637677 -0.041162 1.198406 +v 4.637677 -0.052389 1.189192 +v 4.637677 -0.061603 1.177965 +v 4.637677 -0.068449 1.165156 +v 4.637677 -0.072665 1.151257 +v 4.637677 -0.074089 1.136803 +v 4.637677 -0.072665 1.122349 +v 4.637677 -0.068449 1.108450 +v 4.637677 -0.061603 1.095641 +v 4.637677 -0.052389 1.084414 +v 4.637677 -0.041162 1.075200 +v 4.637677 -0.028353 1.068354 +v 4.637677 -0.014454 1.064138 +v 4.637677 0.000000 1.062714 +v 4.637677 0.014454 1.064138 +v 4.637677 0.028353 1.068354 +v 4.637677 0.041162 1.075200 +v 4.637677 0.052389 1.084414 +v 4.637677 0.061603 1.095641 +v 4.637677 0.068449 1.108451 +v 4.637677 0.072665 1.122349 +v 4.637677 0.074089 1.136803 +v 4.637677 0.072665 1.151257 +v 4.637677 0.068449 1.165156 +v 4.637677 0.061603 1.177965 +v 4.637677 0.052389 1.189192 +v 4.637677 0.041162 1.198406 +v 4.637677 0.028353 1.205252 +v 4.637677 0.014454 1.209468 +v 5.273666 0.000001 1.136803 +v 3.179720 -0.053726 1.066410 +v 3.188101 -0.077998 1.059873 +v 3.199381 -0.099273 1.051075 +v 3.213126 -0.116733 1.040356 +v 3.228806 -0.129707 1.028126 +v 3.245822 -0.137696 1.014855 +v 3.263516 -0.140394 1.001054 +v 3.281211 -0.137696 0.987253 +v 3.298226 -0.129707 0.973983 +v 3.313907 -0.116733 0.961753 +v 3.327652 -0.099273 0.951033 +v 3.338932 -0.077998 0.942235 +v 3.347313 -0.053726 0.935698 +v 3.352474 -0.027389 0.931672 +v 3.354218 0.000000 0.930313 +v 3.352474 0.027389 0.931672 +v 3.347313 0.053726 0.935698 +v 3.338932 0.077999 0.942235 +v 3.327652 0.099273 0.951033 +v 3.313907 0.116733 0.961753 +v 3.298226 0.129707 0.973983 +v 3.281211 0.137696 0.987253 +v 3.263516 0.140394 1.001054 +v 3.245822 0.137696 1.014855 +v 3.228806 0.129707 1.028126 +v 3.213125 0.116733 1.040356 +v 3.199381 0.099273 1.051076 +v 3.188101 0.077998 1.059873 +v 3.179720 0.053726 1.066410 +v 3.174559 0.027389 1.070436 +v 3.172815 0.000000 1.071795 +v 3.587242 -0.000000 1.248980 +v 3.587242 -0.021885 1.246825 +v 3.587242 -0.042928 1.240441 +v 3.587242 -0.062322 1.230075 +v 3.587242 -0.079321 1.216125 +v 3.587242 -0.093272 1.199126 +v 3.587242 -0.103638 1.179732 +v 3.587242 -0.110022 1.158688 +v 3.587242 -0.112177 1.136803 +v 3.587242 -0.110022 1.114919 +v 3.587242 -0.103638 1.093875 +v 3.587242 -0.093272 1.074481 +v 3.587242 -0.079321 1.057482 +v 3.587242 -0.062322 1.043532 +v 3.587242 -0.042928 1.033165 +v 3.587242 -0.021885 1.026782 +v 3.587242 0.000000 1.024626 +v 3.587242 0.021885 1.026782 +v 3.587242 0.042928 1.033165 +v 3.587242 0.062322 1.043532 +v 3.587242 0.079321 1.057482 +v 3.587242 0.093272 1.074481 +v 3.587242 0.103638 1.093875 +v 3.587242 0.110022 1.114919 +v 3.587242 0.112177 1.136803 +v 3.587242 0.110022 1.158688 +v 3.587242 0.103638 1.179732 +v 3.587242 0.093272 1.199126 +v 3.587242 0.079321 1.216125 +v 3.587242 0.062322 1.230075 +v 3.587242 0.042928 1.240442 +v 3.587242 0.021884 1.246825 +v 2.943389 0.000000 0.623212 +v 2.946735 -0.033974 0.623212 +v 2.956646 -0.066642 0.623212 +v 2.972738 -0.096750 0.623212 +v 2.994395 -0.123139 0.623212 +v 3.020784 -0.144796 0.623212 +v 3.050892 -0.160889 0.623212 +v 3.083561 -0.170799 0.623212 +v 3.117535 -0.174145 0.623212 +v 3.151508 -0.170799 0.623212 +v 3.184176 -0.160889 0.623212 +v 3.214284 -0.144796 0.623212 +v 3.240674 -0.123139 0.623212 +v 3.262331 -0.096750 0.623212 +v 3.278424 -0.066642 0.623212 +v 3.288334 -0.033974 0.623212 +v 3.291679 0.000000 0.623212 +v 3.288334 0.033974 0.623212 +v 3.278424 0.066643 0.623212 +v 3.262331 0.096750 0.623212 +v 3.240674 0.123139 0.623212 +v 3.214284 0.144797 0.623212 +v 3.184176 0.160889 0.623212 +v 3.151508 0.170799 0.623212 +v 3.117535 0.174145 0.623212 +v 3.083561 0.170799 0.623212 +v 3.050892 0.160889 0.623212 +v 3.020784 0.144796 0.623212 +v 2.994395 0.123139 0.623212 +v 2.972738 0.096750 0.623212 +v 2.956645 0.066642 0.623212 +v 2.946735 0.033974 0.623212 +v 3.368539 -0.000000 1.205941 +v 3.048191 0.000000 0.918231 +v 3.050585 0.034861 0.917327 +v 3.369501 0.021297 1.204015 +v 3.057676 0.068383 0.914650 +v 3.372353 0.041775 1.198312 +v 3.069191 0.099276 0.910303 +v 3.376984 0.060648 1.189049 +v 3.084687 0.126355 0.904453 +v 3.383216 0.077190 1.176585 +v 3.103569 0.148578 0.897324 +v 3.390810 0.090766 1.161397 +v 3.125113 0.165091 0.889191 +v 3.399474 0.100854 1.144069 +v 3.148487 0.175260 0.880366 +v 3.408875 0.107066 1.125267 +v 3.172796 0.178693 0.871189 +v 3.418653 0.109163 1.105713 +v 3.197106 0.175260 0.862012 +v 3.428429 0.107066 1.086160 +v 3.220482 0.165091 0.853187 +v 3.437830 0.100854 1.067357 +v 3.242024 0.148578 0.845054 +v 3.446494 0.090766 1.050030 +v 3.260906 0.126355 0.837925 +v 3.454088 0.077190 1.034841 +v 3.276403 0.099277 0.832075 +v 3.460320 0.060648 1.022377 +v 3.287918 0.068383 0.827728 +v 3.464952 0.041775 1.013114 +v 3.295009 0.034861 0.825051 +v 3.467803 0.021297 1.007411 +v 3.297402 0.000000 0.824147 +v 3.468766 0.000000 1.005485 +v 3.295009 -0.034861 0.825051 +v 3.467803 -0.021297 1.007411 +v 3.287918 -0.068383 0.827728 +v 3.464952 -0.041775 1.013114 +v 3.276403 -0.099277 0.832075 +v 3.460320 -0.060648 1.022377 +v 3.260906 -0.126355 0.837925 +v 3.454088 -0.077190 1.034841 +v 3.242024 -0.148578 0.845054 +v 3.446494 -0.090766 1.050029 +v 3.220482 -0.165091 0.853187 +v 3.437830 -0.100854 1.067357 +v 3.197106 -0.175260 0.862012 +v 3.428429 -0.107066 1.086159 +v 3.172796 -0.178693 0.871189 +v 3.418652 -0.109163 1.105713 +v 3.148487 -0.175260 0.880366 +v 3.408875 -0.107066 1.125267 +v 3.125113 -0.165091 0.889191 +v 3.399475 -0.100854 1.144068 +v 3.103569 -0.148578 0.897324 +v 3.390810 -0.090766 1.161397 +v 3.084687 -0.126355 0.904453 +v 3.383216 -0.077190 1.176585 +v 3.069191 -0.099277 0.910303 +v 3.376984 -0.060648 1.189049 +v 3.057676 -0.068383 0.914650 +v 3.372353 -0.041775 1.198311 +v 3.050586 -0.034861 0.917327 +v 3.369501 -0.021297 1.204015 +v 3.174559 -0.027389 1.070436 +v 3.023735 0.000000 0.771381 +v 3.026553 0.034417 0.770809 +v 3.034897 0.067512 0.769114 +v 3.048448 0.098013 0.766362 +v 3.066685 0.124747 0.762658 +v 3.088904 0.146687 0.758145 +v 3.114257 0.162990 0.752996 +v 3.141765 0.173029 0.747409 +v 3.170372 0.176419 0.741599 +v 3.198979 0.173029 0.735789 +v 3.226487 0.162990 0.730202 +v 3.251839 0.146687 0.725053 +v 3.274060 0.124747 0.720540 +v 3.292296 0.098013 0.716836 +v 3.305847 0.067513 0.714084 +v 3.314192 0.034418 0.712389 +v 3.317009 0.000000 0.711817 +v 3.314192 -0.034418 0.712389 +v 3.305847 -0.067513 0.714084 +v 3.292296 -0.098013 0.716836 +v 3.274060 -0.124747 0.720540 +v 3.251839 -0.146687 0.725053 +v 3.226487 -0.162990 0.730202 +v 3.198979 -0.173029 0.735789 +v 3.170372 -0.176419 0.741599 +v 3.141765 -0.173029 0.747409 +v 3.114257 -0.162990 0.752996 +v 3.088905 -0.146687 0.758145 +v 3.066685 -0.124747 0.762658 +v 3.048448 -0.098013 0.766362 +v 3.034897 -0.067513 0.769114 +v 3.026553 -0.034418 0.770809 +v 3.194983 -0.000000 -0.630004 +v 3.596968 0.000000 -0.670318 +v 3.194983 -0.021885 -0.627848 +v 3.596968 -0.014454 -0.668894 +v 3.194983 -0.042928 -0.621465 +v 3.596968 -0.028353 -0.664678 +v 3.194983 -0.062322 -0.611099 +v 3.596968 -0.041162 -0.657831 +v 3.194983 -0.079321 -0.597148 +v 3.596968 -0.052389 -0.648617 +v 3.194983 -0.093272 -0.580149 +v 3.596968 -0.061603 -0.637390 +v 3.194983 -0.103638 -0.560755 +v 3.596968 -0.068449 -0.624581 +v 3.194983 -0.110022 -0.539711 +v 3.596968 -0.072665 -0.610682 +v 3.194983 -0.112177 -0.517827 +v 3.596968 -0.074089 -0.596228 +v 3.194983 -0.110022 -0.495942 +v 3.596968 -0.072665 -0.581774 +v 3.194983 -0.103638 -0.474898 +v 3.596968 -0.068449 -0.567876 +v 3.194983 -0.093272 -0.455504 +v 3.596968 -0.061603 -0.555067 +v 3.194983 -0.079321 -0.438506 +v 3.596968 -0.052389 -0.543840 +v 3.194983 -0.062322 -0.424555 +v 3.596968 -0.041162 -0.534626 +v 3.194983 -0.042928 -0.414189 +v 3.596968 -0.028353 -0.527779 +v 3.194983 -0.021885 -0.407805 +v 3.596968 -0.014454 -0.523563 +v 3.194983 0.000000 -0.405650 +v 3.596968 0.000000 -0.522139 +v 3.194983 0.021885 -0.407805 +v 3.596968 0.014454 -0.523563 +v 3.194983 0.042928 -0.414189 +v 3.596968 0.028353 -0.527779 +v 3.194983 0.062322 -0.424555 +v 3.596968 0.041162 -0.534626 +v 3.194983 0.079321 -0.438506 +v 3.596968 0.052389 -0.543840 +v 3.194983 0.093272 -0.455505 +v 3.596968 0.061603 -0.555067 +v 3.194983 0.103638 -0.474899 +v 3.596968 0.068449 -0.567876 +v 3.194983 0.110022 -0.495942 +v 3.596968 0.072665 -0.581774 +v 3.194983 0.112177 -0.517827 +v 3.596968 0.074089 -0.596228 +v 3.194983 0.110022 -0.539711 +v 3.596968 0.072665 -0.610683 +v 3.194983 0.103638 -0.560755 +v 3.596968 0.068449 -0.624581 +v 3.194983 0.093272 -0.580149 +v 3.596968 0.061603 -0.637390 +v 3.194983 0.079321 -0.597148 +v 3.596968 0.052389 -0.648617 +v 3.194983 0.062322 -0.611099 +v 3.596968 0.041162 -0.657831 +v 3.194983 0.042928 -0.621465 +v 3.596968 0.028353 -0.664678 +v 3.194983 0.021884 -0.627848 +v 3.596968 0.014454 -0.668894 +v 4.245420 -0.014454 -0.590492 +v 4.245420 0.000000 -0.591916 +v 4.245420 -0.028353 -0.586276 +v 4.245420 -0.041162 -0.579430 +v 4.245420 -0.052389 -0.570216 +v 4.245420 -0.061603 -0.558988 +v 4.245420 -0.068449 -0.546179 +v 4.245420 -0.072665 -0.532281 +v 4.245420 -0.074089 -0.517827 +v 4.245420 -0.072665 -0.503373 +v 4.245420 -0.068449 -0.489474 +v 4.245420 -0.061603 -0.476665 +v 4.245420 -0.052389 -0.465438 +v 4.245420 -0.041162 -0.456224 +v 4.245420 -0.028353 -0.449378 +v 4.245420 -0.014454 -0.445161 +v 4.245420 0.000000 -0.443738 +v 4.245420 0.014454 -0.445161 +v 4.245420 0.028353 -0.449378 +v 4.245420 0.041162 -0.456224 +v 4.245420 0.052389 -0.465438 +v 4.245420 0.061603 -0.476665 +v 4.245420 0.068449 -0.489474 +v 4.245420 0.072665 -0.503373 +v 4.245420 0.074089 -0.517827 +v 4.245420 0.072665 -0.532281 +v 4.245420 0.068449 -0.546180 +v 4.245420 0.061603 -0.558989 +v 4.245420 0.052389 -0.570216 +v 4.245420 0.041162 -0.579430 +v 4.245420 0.028353 -0.586276 +v 4.245420 0.014454 -0.590492 +v 4.881409 0.000001 -0.517827 +v 2.779208 -0.059018 -0.453871 +v 2.788416 -0.085681 -0.446689 +v 2.800806 -0.109051 -0.437025 +v 2.815905 -0.128230 -0.425250 +v 2.833130 -0.142482 -0.411815 +v 2.851821 -0.151258 -0.397238 +v 2.871259 -0.154221 -0.382077 +v 2.890697 -0.151258 -0.366917 +v 2.909387 -0.142482 -0.352340 +v 2.926613 -0.128230 -0.338905 +v 2.941710 -0.109051 -0.327129 +v 2.954102 -0.085681 -0.317465 +v 2.963308 -0.059018 -0.310284 +v 2.968979 -0.030087 -0.305862 +v 2.970894 0.000000 -0.304369 +v 2.968979 0.030087 -0.305862 +v 2.963308 0.059018 -0.310284 +v 2.954102 0.085681 -0.317465 +v 2.941710 0.109051 -0.327129 +v 2.926613 0.128230 -0.338905 +v 2.909387 0.142482 -0.352340 +v 2.890697 0.151258 -0.366917 +v 2.871259 0.154221 -0.382077 +v 2.851821 0.151258 -0.397238 +v 2.833130 0.142482 -0.411815 +v 2.815905 0.128230 -0.425250 +v 2.800806 0.109051 -0.437026 +v 2.788415 0.085681 -0.446690 +v 2.779208 0.059018 -0.453871 +v 2.773539 0.030087 -0.458293 +v 2.771625 0.000000 -0.459786 +v 3.194983 -0.000000 -0.630004 +v 3.194983 -0.021885 -0.627848 +v 3.194983 -0.042928 -0.621465 +v 3.194983 -0.062322 -0.611099 +v 3.194983 -0.079321 -0.597148 +v 3.194983 -0.093272 -0.580149 +v 3.194983 -0.103638 -0.560755 +v 3.194983 -0.110022 -0.539711 +v 3.194983 -0.112177 -0.517827 +v 3.194983 -0.110022 -0.495942 +v 3.194983 -0.103638 -0.474898 +v 3.194983 -0.093272 -0.455504 +v 3.194983 -0.079321 -0.438506 +v 3.194983 -0.062322 -0.424555 +v 3.194983 -0.042928 -0.414189 +v 3.194983 -0.021885 -0.407805 +v 3.194983 0.000000 -0.405650 +v 3.194983 0.021885 -0.407805 +v 3.194983 0.042928 -0.414189 +v 3.194983 0.062322 -0.424555 +v 3.194983 0.079321 -0.438506 +v 3.194983 0.093272 -0.455505 +v 3.194983 0.103638 -0.474899 +v 3.194983 0.110022 -0.495942 +v 3.194983 0.112177 -0.517827 +v 3.194983 0.110022 -0.539711 +v 3.194983 0.103638 -0.560755 +v 3.194983 0.093272 -0.580149 +v 3.194983 0.079321 -0.597148 +v 3.194983 0.062322 -0.611099 +v 3.194983 0.042928 -0.621465 +v 3.194983 0.021884 -0.627848 +v 2.551131 0.000000 -0.004236 +v 2.554478 -0.033974 -0.004236 +v 2.564387 -0.066643 -0.004236 +v 2.580481 -0.096750 -0.004236 +v 2.602138 -0.123139 -0.004236 +v 2.628527 -0.144796 -0.004236 +v 2.658634 -0.160889 -0.004236 +v 2.691302 -0.170799 -0.004236 +v 2.725277 -0.174145 -0.004236 +v 2.759251 -0.170799 -0.004236 +v 2.791919 -0.160889 -0.004236 +v 2.822027 -0.144796 -0.004235 +v 2.848416 -0.123139 -0.004235 +v 2.870073 -0.096750 -0.004235 +v 2.886166 -0.066642 -0.004235 +v 2.896076 -0.033974 -0.004235 +v 2.899422 0.000000 -0.004235 +v 2.896076 0.033974 -0.004235 +v 2.886166 0.066643 -0.004235 +v 2.870073 0.096750 -0.004235 +v 2.848415 0.123139 -0.004235 +v 2.822027 0.144797 -0.004235 +v 2.791919 0.160889 -0.004236 +v 2.759251 0.170799 -0.004236 +v 2.725277 0.174145 -0.004236 +v 2.691302 0.170799 -0.004236 +v 2.658634 0.160889 -0.004236 +v 2.628527 0.144796 -0.004236 +v 2.602138 0.123139 -0.004236 +v 2.580481 0.096750 -0.004236 +v 2.564387 0.066642 -0.004236 +v 2.554478 0.033974 -0.004236 +v 2.966830 0.000000 -0.605865 +v 2.655932 0.000000 -0.299254 +v 2.658328 0.034861 -0.298350 +v 2.967975 0.025313 -0.603576 +v 2.665419 0.068383 -0.295673 +v 2.971364 0.049653 -0.596797 +v 2.676933 0.099276 -0.291326 +v 2.976868 0.072085 -0.585788 +v 2.692430 0.126355 -0.285476 +v 2.984276 0.091746 -0.570973 +v 2.711311 0.148578 -0.278347 +v 2.993302 0.107882 -0.552921 +v 2.732855 0.165091 -0.270214 +v 3.003600 0.119873 -0.532325 +v 2.756229 0.175260 -0.261390 +v 3.014773 0.127256 -0.509977 +v 2.780539 0.178693 -0.252212 +v 3.026395 0.129749 -0.486736 +v 2.804849 0.175260 -0.243035 +v 3.038014 0.127256 -0.463495 +v 2.828223 0.165091 -0.234210 +v 3.049189 0.119873 -0.441148 +v 2.849766 0.148578 -0.226077 +v 3.059486 0.107883 -0.420552 +v 2.868649 0.126355 -0.218949 +v 3.068513 0.091747 -0.402500 +v 2.884145 0.099277 -0.213098 +v 3.075920 0.072085 -0.387684 +v 2.895660 0.068383 -0.208751 +v 3.081425 0.049653 -0.376676 +v 2.902751 0.034861 -0.206074 +v 3.084814 0.025313 -0.369897 +v 2.905145 0.000000 -0.205170 +v 3.085958 0.000000 -0.367608 +v 2.902751 -0.034861 -0.206074 +v 3.084814 -0.025313 -0.369897 +v 2.895660 -0.068383 -0.208751 +v 3.081425 -0.049653 -0.376676 +v 2.884145 -0.099277 -0.213098 +v 3.075920 -0.072085 -0.387684 +v 2.868649 -0.126355 -0.218949 +v 3.068513 -0.091747 -0.402500 +v 2.849766 -0.148578 -0.226077 +v 3.059486 -0.107883 -0.420552 +v 2.828223 -0.165091 -0.234210 +v 3.049189 -0.119873 -0.441148 +v 2.804849 -0.175260 -0.243035 +v 3.038014 -0.127256 -0.463495 +v 2.780539 -0.178693 -0.252212 +v 3.026395 -0.129749 -0.486736 +v 2.756229 -0.175260 -0.261390 +v 3.014773 -0.127256 -0.509977 +v 2.732855 -0.165091 -0.270214 +v 3.003600 -0.119873 -0.532325 +v 2.711311 -0.148578 -0.278347 +v 2.993302 -0.107883 -0.552921 +v 2.692430 -0.126355 -0.285476 +v 2.984276 -0.091747 -0.570973 +v 2.676933 -0.099277 -0.291326 +v 2.976868 -0.072085 -0.585788 +v 2.665419 -0.068383 -0.295673 +v 2.971364 -0.049653 -0.596797 +v 2.658328 -0.034861 -0.298350 +v 2.967975 -0.025313 -0.603576 +v 2.773539 -0.030087 -0.458293 +v 2.597857 0.000000 -0.152405 +v 2.600674 0.034417 -0.151832 +v 2.609018 0.067512 -0.150138 +v 2.622569 0.098013 -0.147386 +v 2.640805 0.124747 -0.143682 +v 2.663026 0.146687 -0.139169 +v 2.688377 0.162990 -0.134020 +v 2.715886 0.173029 -0.128433 +v 2.744493 0.176419 -0.122623 +v 2.773101 0.173029 -0.116812 +v 2.800609 0.162990 -0.111225 +v 2.825960 0.146687 -0.106076 +v 2.848182 0.124747 -0.101563 +v 2.866417 0.098013 -0.097859 +v 2.879968 0.067513 -0.095107 +v 2.888312 0.034418 -0.093412 +v 2.891130 0.000000 -0.092840 +v 2.888312 -0.034418 -0.093412 +v 2.879968 -0.067513 -0.095107 +v 2.866417 -0.098013 -0.097859 +v 2.848182 -0.124747 -0.101563 +v 2.825960 -0.146687 -0.106076 +v 2.800610 -0.162990 -0.111225 +v 2.773101 -0.173029 -0.116812 +v 2.744493 -0.176419 -0.122622 +v 2.715886 -0.173029 -0.128433 +v 2.688377 -0.162990 -0.134020 +v 2.663026 -0.146687 -0.139169 +v 2.640805 -0.124747 -0.143682 +v 2.622569 -0.098013 -0.147385 +v 2.609018 -0.067513 -0.150138 +v 2.600674 -0.034418 -0.151832 +v 2.267573 0.000000 0.523667 +v 2.274200 -0.030150 0.523667 +v 2.293830 -0.059141 0.523667 +v 2.325705 -0.085859 0.523667 +v 2.368602 -0.109278 0.523667 +v 2.420872 -0.128498 0.523667 +v 2.480506 -0.142779 0.523667 +v 2.545213 -0.151573 0.523667 +v 2.612506 -0.154543 0.523667 +v 2.679799 -0.151573 0.523667 +v 2.744506 -0.142779 0.523667 +v 2.804141 -0.128498 0.523667 +v 2.856410 -0.109278 0.523667 +v 2.899308 -0.085859 0.523667 +v 2.931183 -0.059141 0.523667 +v 2.950811 -0.030150 0.523667 +v 2.957439 0.000000 0.523667 +v 2.950811 0.030150 0.523667 +v 2.931183 0.059141 0.523667 +v 2.899307 0.085859 0.523667 +v 2.856410 0.109278 0.523667 +v 2.804141 0.128498 0.523667 +v 2.744506 0.142779 0.523667 +v 2.679799 0.151573 0.523667 +v 2.612506 0.154543 0.523667 +v 2.545213 0.151573 0.523667 +v 2.480506 0.142779 0.523667 +v 2.420871 0.128497 0.523667 +v 2.368602 0.109278 0.523667 +v 2.325705 0.085859 0.523667 +v 2.293830 0.059141 0.523667 +v 2.274200 0.030150 0.523667 +v 3.194983 -0.000000 1.733089 +v 3.596968 0.000000 1.773403 +v 3.194983 -0.021885 1.730934 +v 3.596968 -0.014454 1.771979 +v 3.194983 -0.042928 1.724550 +v 3.596968 -0.028353 1.767763 +v 3.194983 -0.062322 1.714184 +v 3.596968 -0.041162 1.760917 +v 3.194983 -0.079321 1.700234 +v 3.596968 -0.052389 1.751703 +v 3.194983 -0.093272 1.683235 +v 3.596968 -0.061603 1.740475 +v 3.194983 -0.103638 1.663841 +v 3.596968 -0.068449 1.727666 +v 3.194983 -0.110022 1.642797 +v 3.596968 -0.072665 1.713768 +v 3.194983 -0.112177 1.620912 +v 3.596968 -0.074089 1.699314 +v 3.194983 -0.110022 1.599028 +v 3.596968 -0.072665 1.684860 +v 3.194983 -0.103638 1.577984 +v 3.596968 -0.068449 1.670961 +v 3.194983 -0.093272 1.558590 +v 3.596968 -0.061603 1.658152 +v 3.194983 -0.079321 1.541591 +v 3.596968 -0.052389 1.646925 +v 3.194983 -0.062322 1.527641 +v 3.596968 -0.041162 1.637711 +v 3.194983 -0.042928 1.517274 +v 3.596968 -0.028353 1.630865 +v 3.194983 -0.021885 1.510891 +v 3.596968 -0.014454 1.626648 +v 3.194983 0.000000 1.508735 +v 3.596968 0.000000 1.625225 +v 3.194983 0.021885 1.510891 +v 3.596968 0.014454 1.626648 +v 3.194983 0.042928 1.517274 +v 3.596968 0.028353 1.630865 +v 3.194983 0.062322 1.527641 +v 3.596968 0.041162 1.637711 +v 3.194983 0.079321 1.541591 +v 3.596968 0.052389 1.646925 +v 3.194983 0.093272 1.558590 +v 3.596968 0.061603 1.658152 +v 3.194983 0.103638 1.577984 +v 3.596968 0.068449 1.670961 +v 3.194983 0.110022 1.599028 +v 3.596968 0.072665 1.684860 +v 3.194983 0.112177 1.620913 +v 3.596968 0.074089 1.699314 +v 3.194983 0.110022 1.642797 +v 3.596968 0.072665 1.713768 +v 3.194983 0.103638 1.663841 +v 3.596968 0.068449 1.727666 +v 3.194983 0.093272 1.683235 +v 3.596968 0.061603 1.740476 +v 3.194983 0.079321 1.700234 +v 3.596968 0.052389 1.751703 +v 3.194983 0.062322 1.714184 +v 3.596968 0.041162 1.760917 +v 3.194983 0.042928 1.724550 +v 3.596968 0.028353 1.767763 +v 3.194983 0.021884 1.730934 +v 3.596968 0.014454 1.771979 +v 4.245420 -0.014454 1.693577 +v 4.245420 0.000000 1.695001 +v 4.245420 -0.028353 1.689361 +v 4.245420 -0.041162 1.682515 +v 4.245420 -0.052389 1.673301 +v 4.245420 -0.061603 1.662074 +v 4.245420 -0.068449 1.649265 +v 4.245420 -0.072665 1.635366 +v 4.245420 -0.074089 1.620912 +v 4.245420 -0.072665 1.606458 +v 4.245420 -0.068449 1.592560 +v 4.245420 -0.061603 1.579751 +v 4.245420 -0.052389 1.568523 +v 4.245420 -0.041162 1.559309 +v 4.245420 -0.028353 1.552463 +v 4.245420 -0.014454 1.548247 +v 4.245420 0.000000 1.546823 +v 4.245420 0.014454 1.548247 +v 4.245420 0.028353 1.552463 +v 4.245420 0.041162 1.559309 +v 4.245420 0.052389 1.568523 +v 4.245420 0.061603 1.579751 +v 4.245420 0.068449 1.592560 +v 4.245420 0.072665 1.606458 +v 4.245420 0.074089 1.620912 +v 4.245420 0.072665 1.635366 +v 4.245420 0.068449 1.649265 +v 4.245420 0.061603 1.662074 +v 4.245420 0.052389 1.673301 +v 4.245420 0.041162 1.682515 +v 4.245420 0.028353 1.689361 +v 4.245420 0.014454 1.693577 +v 4.881409 0.000001 1.620912 +v 2.779208 -0.059018 1.556956 +v 2.788415 -0.085681 1.549775 +v 2.800806 -0.109051 1.540111 +v 2.815905 -0.128230 1.528336 +v 2.833130 -0.142482 1.514901 +v 2.851821 -0.151258 1.500323 +v 2.871259 -0.154221 1.485163 +v 2.890697 -0.151258 1.470003 +v 2.909387 -0.142482 1.455426 +v 2.926612 -0.128230 1.441991 +v 2.941710 -0.109051 1.430215 +v 2.954102 -0.085681 1.420551 +v 2.963308 -0.059018 1.413370 +v 2.968979 -0.030087 1.408948 +v 2.970893 0.000000 1.407455 +v 2.968979 0.030087 1.408948 +v 2.963308 0.059018 1.413370 +v 2.954102 0.085681 1.420551 +v 2.941710 0.109051 1.430215 +v 2.926612 0.128230 1.441991 +v 2.909387 0.142482 1.455426 +v 2.890697 0.151258 1.470003 +v 2.871259 0.154221 1.485163 +v 2.851821 0.151258 1.500324 +v 2.833130 0.142482 1.514901 +v 2.815905 0.128230 1.528336 +v 2.800806 0.109051 1.540111 +v 2.788415 0.085681 1.549775 +v 2.779208 0.059018 1.556956 +v 2.773539 0.030087 1.561378 +v 2.771625 0.000000 1.562871 +v 3.194983 -0.000000 1.733089 +v 3.194983 -0.021885 1.730934 +v 3.194983 -0.042928 1.724550 +v 3.194983 -0.062322 1.714184 +v 3.194983 -0.079321 1.700234 +v 3.194983 -0.093272 1.683235 +v 3.194983 -0.103638 1.663841 +v 3.194983 -0.110022 1.642797 +v 3.194983 -0.112177 1.620912 +v 3.194983 -0.110022 1.599028 +v 3.194983 -0.103638 1.577984 +v 3.194983 -0.093272 1.558590 +v 3.194983 -0.079321 1.541591 +v 3.194983 -0.062322 1.527641 +v 3.194983 -0.042928 1.517274 +v 3.194983 -0.021885 1.510891 +v 3.194983 0.000000 1.508735 +v 3.194983 0.021885 1.510891 +v 3.194983 0.042928 1.517274 +v 3.194983 0.062322 1.527641 +v 3.194983 0.079321 1.541591 +v 3.194983 0.093272 1.558590 +v 3.194983 0.103638 1.577984 +v 3.194983 0.110022 1.599028 +v 3.194983 0.112177 1.620913 +v 3.194983 0.110022 1.642797 +v 3.194983 0.103638 1.663841 +v 3.194983 0.093272 1.683235 +v 3.194983 0.079321 1.700234 +v 3.194983 0.062322 1.714184 +v 3.194983 0.042928 1.724550 +v 3.194983 0.021884 1.730934 +v 2.551131 0.000000 1.107321 +v 2.554478 -0.033974 1.107321 +v 2.564387 -0.066642 1.107321 +v 2.580481 -0.096750 1.107321 +v 2.602138 -0.123139 1.107321 +v 2.628527 -0.144796 1.107321 +v 2.658634 -0.160889 1.107321 +v 2.691302 -0.170799 1.107321 +v 2.725277 -0.174145 1.107321 +v 2.759251 -0.170799 1.107321 +v 2.791919 -0.160889 1.107321 +v 2.822026 -0.144796 1.107321 +v 2.848415 -0.123139 1.107321 +v 2.870073 -0.096750 1.107321 +v 2.886166 -0.066642 1.107321 +v 2.896075 -0.033974 1.107321 +v 2.899422 0.000000 1.107321 +v 2.896075 0.033974 1.107321 +v 2.886166 0.066643 1.107321 +v 2.870073 0.096750 1.107321 +v 2.848415 0.123139 1.107321 +v 2.822026 0.144797 1.107321 +v 2.791919 0.160889 1.107321 +v 2.759251 0.170799 1.107321 +v 2.725277 0.174145 1.107321 +v 2.691302 0.170799 1.107321 +v 2.658634 0.160889 1.107321 +v 2.628527 0.144796 1.107321 +v 2.602138 0.123139 1.107321 +v 2.580481 0.096750 1.107321 +v 2.564387 0.066642 1.107321 +v 2.554478 0.033974 1.107321 +v 2.966829 0.000000 1.708951 +v 2.655932 0.000000 1.402340 +v 2.658327 0.034861 1.401436 +v 2.967975 0.025313 1.706662 +v 2.665419 0.068383 1.398759 +v 2.971364 0.049653 1.699883 +v 2.676933 0.099276 1.394412 +v 2.976868 0.072085 1.688874 +v 2.692430 0.126355 1.388562 +v 2.984276 0.091746 1.674059 +v 2.711311 0.148578 1.381433 +v 2.993302 0.107882 1.656006 +v 2.732854 0.165091 1.373300 +v 3.003600 0.119873 1.635411 +v 2.756229 0.175260 1.364475 +v 3.014773 0.127256 1.613063 +v 2.780539 0.178693 1.355298 +v 3.026394 0.129749 1.589822 +v 2.804849 0.175260 1.346121 +v 3.038014 0.127256 1.566581 +v 2.828223 0.165091 1.337296 +v 3.049189 0.119873 1.544233 +v 2.849766 0.148578 1.329163 +v 3.059486 0.107883 1.523638 +v 2.868649 0.126355 1.322034 +v 3.068513 0.091747 1.505585 +v 2.884145 0.099277 1.316184 +v 3.075920 0.072085 1.490770 +v 2.895660 0.068383 1.311837 +v 3.081425 0.049653 1.479761 +v 2.902751 0.034861 1.309160 +v 3.084814 0.025313 1.472982 +v 2.905145 0.000000 1.308256 +v 3.085958 0.000000 1.470693 +v 2.902751 -0.034861 1.309160 +v 3.084814 -0.025313 1.472982 +v 2.895660 -0.068383 1.311837 +v 3.081425 -0.049653 1.479761 +v 2.884145 -0.099277 1.316184 +v 3.075920 -0.072085 1.490770 +v 2.868649 -0.126355 1.322034 +v 3.068513 -0.091747 1.505585 +v 2.849766 -0.148578 1.329163 +v 3.059486 -0.107883 1.523638 +v 2.828223 -0.165091 1.337296 +v 3.049189 -0.119873 1.544233 +v 2.804849 -0.175260 1.346121 +v 3.038014 -0.127256 1.566581 +v 2.780539 -0.178693 1.355298 +v 3.026394 -0.129749 1.589822 +v 2.756229 -0.175260 1.364475 +v 3.014773 -0.127256 1.613063 +v 2.732855 -0.165091 1.373300 +v 3.003600 -0.119873 1.635411 +v 2.711311 -0.148578 1.381433 +v 2.993302 -0.107883 1.656006 +v 2.692430 -0.126355 1.388562 +v 2.984276 -0.091747 1.674059 +v 2.676933 -0.099277 1.394412 +v 2.976868 -0.072085 1.688874 +v 2.665419 -0.068383 1.398759 +v 2.971364 -0.049653 1.699882 +v 2.658328 -0.034861 1.401436 +v 2.967975 -0.025313 1.706662 +v 2.773539 -0.030087 1.561378 +v 2.597857 0.000000 1.255490 +v 2.600674 0.034417 1.254918 +v 2.609018 0.067512 1.253223 +v 2.622569 0.098013 1.250471 +v 2.640805 0.124747 1.246768 +v 2.663026 0.146687 1.242254 +v 2.688377 0.162990 1.237106 +v 2.715885 0.173029 1.231518 +v 2.744493 0.176419 1.225708 +v 2.773101 0.173029 1.219898 +v 2.800609 0.162990 1.214311 +v 2.825960 0.146687 1.209162 +v 2.848182 0.124747 1.204649 +v 2.866417 0.098013 1.200945 +v 2.879968 0.067513 1.198193 +v 2.888312 0.034418 1.196498 +v 2.891130 0.000000 1.195926 +v 2.888312 -0.034418 1.196498 +v 2.879968 -0.067513 1.198193 +v 2.866417 -0.098013 1.200945 +v 2.848182 -0.124747 1.204649 +v 2.825960 -0.146687 1.209162 +v 2.800609 -0.162990 1.214311 +v 2.773101 -0.173029 1.219898 +v 2.744493 -0.176419 1.225708 +v 2.715886 -0.173029 1.231518 +v 2.688377 -0.162990 1.237106 +v 2.663026 -0.146687 1.242254 +v 2.640805 -0.124747 1.246768 +v 2.622569 -0.098013 1.250471 +v 2.609018 -0.067513 1.253223 +v 2.600674 -0.034418 1.254918 +v 2.267572 0.000000 0.579419 +v 2.274200 -0.030150 0.579419 +v 2.293830 -0.059141 0.579419 +v 2.325705 -0.085859 0.579419 +v 2.368602 -0.109278 0.579419 +v 2.420872 -0.128498 0.579419 +v 2.480506 -0.142779 0.579419 +v 2.545213 -0.151573 0.579419 +v 2.612506 -0.154543 0.579419 +v 2.679799 -0.151573 0.579419 +v 2.744506 -0.142779 0.579419 +v 2.804141 -0.128498 0.579419 +v 2.856410 -0.109278 0.579419 +v 2.899307 -0.085859 0.579419 +v 2.931183 -0.059141 0.579419 +v 2.950811 -0.030150 0.579419 +v 2.957439 0.000000 0.579419 +v 2.950811 0.030150 0.579419 +v 2.931183 0.059141 0.579419 +v 2.899307 0.085859 0.579419 +v 2.856410 0.109278 0.579419 +v 2.804140 0.128498 0.579419 +v 2.744506 0.142779 0.579419 +v 2.679799 0.151573 0.579419 +v 2.612506 0.154543 0.579419 +v 2.545213 0.151573 0.579419 +v 2.480506 0.142779 0.579419 +v 2.420871 0.128497 0.579419 +v 2.368602 0.109278 0.579419 +v 2.325705 0.085859 0.579419 +v 2.293830 0.059141 0.579419 +v 2.274200 0.030150 0.579419 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.406250 1.000000 +vt 0.437500 1.000000 +vt 0.437500 1.000000 +vt 0.406250 1.000000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.375000 1.000000 +vt 0.406250 1.000000 +vt 0.375000 1.000000 +vt 0.375000 1.000000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.343750 1.000000 +vt 0.343750 1.000000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 1.000000 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.500000 +vt 1.000000 0.500000 +vt 0.312500 1.000000 +vt 0.312500 1.000000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.281250 1.000000 +vt 0.281250 1.000000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.218750 1.000000 +vt 0.218750 1.000000 +vt 0.031250 0.500000 +vt 0.031250 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.187500 1.000000 +vt 0.187500 1.000000 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.156250 1.000000 +vt 0.156250 1.000000 +vt 0.968750 1.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.937500 1.000000 +vt 0.937500 1.000000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.093750 1.000000 +vt 0.093750 1.000000 +vt 0.906250 1.000000 +vt 0.906250 1.000000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.062500 1.000000 +vt 0.062500 1.000000 +vt 0.875000 1.000000 +vt 0.875000 1.000000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.031250 1.000000 +vt 0.031250 1.000000 +vt 0.843750 1.000000 +vt 0.843750 1.000000 +vt 0.656250 0.500000 +vt 0.656250 0.500000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.812500 1.000000 +vt 0.812500 1.000000 +vt 0.625000 0.500000 +vt 0.625000 0.500000 +vt 0.781250 1.000000 +vt 0.781250 1.000000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.750000 1.000000 +vt 0.750000 1.000000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.718750 1.000000 +vt 0.718750 1.000000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.687500 1.000000 +vt 0.687500 1.000000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.656250 1.000000 +vt 0.656250 1.000000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.593750 1.000000 +vt 0.593750 1.000000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.562500 1.000000 +vt 0.562500 1.000000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.531250 1.000000 +vt 0.531250 1.000000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.500000 1.000000 +vt 0.500000 1.000000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.468750 1.000000 +vt 0.468750 1.000000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.031250 1.000000 +vt 0.062500 1.000000 +vt 0.062500 1.000000 +vt 0.031250 1.000000 +vt 0.812500 1.000000 +vt 0.781250 1.000000 +vt 0.343750 1.000000 +vt 0.750000 1.000000 +vt 0.312500 1.000000 +vt 0.718750 1.000000 +vt 0.281250 1.000000 +vt 0.687500 1.000000 +vt 0.250000 1.000000 +vt 0.656250 1.000000 +vt 0.218750 1.000000 +vt 0.625000 1.000000 +vt 0.187500 1.000000 +vt 0.593750 1.000000 +vt 0.156250 1.000000 +vt 0.562500 1.000000 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 0.125000 1.000000 +vt 0.531250 1.000000 +vt 0.937500 1.000000 +vt 0.093750 1.000000 +vt 0.500000 1.000000 +vt 0.906250 1.000000 +vt 0.468750 1.000000 +vt 0.875000 1.000000 +vt 0.437500 1.000000 +vt 0.843750 1.000000 +vt 0.000000 1.000000 +vt 0.343750 1.000000 +vt 0.375000 1.000000 +vt 0.343750 1.000000 +vt 0.468750 1.000000 +vt 0.437500 1.000000 +vt 0.875000 1.000000 +vt 0.843750 1.000000 +vt 0.000000 1.000000 +vt 0.406250 1.000000 +vt 0.812500 1.000000 +vt 0.781250 1.000000 +vt 0.750000 1.000000 +vt 0.312500 1.000000 +vt 0.718750 1.000000 +vt 0.281250 1.000000 +vt 0.687500 1.000000 +vt 0.250000 1.000000 +vt 0.656250 1.000000 +vt 0.218750 1.000000 +vt 0.625000 1.000000 +vt 0.187500 1.000000 +vt 0.593750 1.000000 +vt 0.156250 1.000000 +vt 0.562500 1.000000 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 0.125000 1.000000 +vt 0.531250 1.000000 +vt 0.937500 1.000000 +vt 0.093750 1.000000 +vt 0.500000 1.000000 +vt 0.906250 1.000000 +vt 0.750000 1.000000 +vt 0.312500 1.000000 +vt 0.718750 1.000000 +vt 0.281250 1.000000 +vt 0.687500 1.000000 +vt 0.250000 1.000000 +vt 0.656250 1.000000 +vt 0.218750 1.000000 +vt 0.625000 1.000000 +vt 0.187500 1.000000 +vt 0.593750 1.000000 +vt 0.156250 1.000000 +vt 0.562500 1.000000 +vt 0.968750 1.000000 +vt 0.125000 1.000000 +vt 0.531250 1.000000 +vt 0.937500 1.000000 +vt 0.093750 1.000000 +vt 0.500000 1.000000 +vt 0.906250 1.000000 +vt 0.062500 1.000000 +vt 0.468750 1.000000 +vt 0.875000 1.000000 +vt 0.031250 1.000000 +vt 0.437500 1.000000 +vt 0.843750 1.000000 +vt 0.000000 1.000000 +vt 0.406250 1.000000 +vt 0.812500 1.000000 +vt 0.375000 1.000000 +vt 0.781250 1.000000 +vt 0.437500 1.000000 +vt 0.468750 1.000000 +vt 0.500000 1.000000 +vt 0.531250 1.000000 +vt 0.562500 1.000000 +vt 0.593750 1.000000 +vt 0.625000 1.000000 +vt 0.656250 1.000000 +vt 0.687500 1.000000 +vt 0.718750 1.000000 +vt 0.750000 1.000000 +vt 0.781250 1.000000 +vt 0.812500 1.000000 +vt 0.843750 1.000000 +vt 0.000000 1.000000 +vt 0.031250 1.000000 +vt 0.875000 1.000000 +vt 0.062500 1.000000 +vt 0.906250 1.000000 +vt 0.093750 1.000000 +vt 0.937500 1.000000 +vt 0.125000 1.000000 +vt 0.968750 1.000000 +vt 0.156250 1.000000 +vt 1.000000 1.000000 +vt 0.187500 1.000000 +vt 0.218750 1.000000 +vt 0.250000 1.000000 +vt 0.281250 1.000000 +vt 0.312500 1.000000 +vt 0.343750 1.000000 +vt 0.375000 1.000000 +vt 0.406250 1.000000 +vt 0.406250 1.000000 +vt 0.437500 1.000000 +vt 0.437500 1.000000 +vt 0.406250 1.000000 +vt 0.437500 1.000000 +vt 0.406250 1.000000 +vt 0.437500 1.000000 +vt 0.406250 1.000000 +vt 0.437500 1.000000 +vt 0.406250 1.000000 +vt 0.406250 1.000000 +vt 0.437500 1.000000 +vt 0.437500 1.000000 +vt 0.406250 1.000000 +vt 0.437500 1.000000 +vt 0.406250 1.000000 +vt 0.406250 1.000000 +vt 0.437500 1.000000 +vt 0.437500 1.000000 +vt 0.406250 1.000000 +vt 0.437500 1.000000 +vt 0.406250 1.000000 +vt 0.406250 1.000000 +vt 0.437500 1.000000 +vt 0.437500 1.000000 +vt 0.406250 1.000000 +vt 0.437500 1.000000 +vt 0.406250 1.000000 +vt 0.437500 1.000000 +vt 0.406250 1.000000 +vt 0.375000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 1.000000 +vt 0.343750 1.000000 +vt 0.343750 1.000000 +vt 0.343750 1.000000 +vt 0.343750 1.000000 +vt 0.343750 1.000000 +vt 0.343750 1.000000 +vt 0.343750 1.000000 +vt 0.343750 1.000000 +vt 0.343750 1.000000 +vt 0.343750 1.000000 +vt 0.343750 1.000000 +vt 0.343750 1.000000 +vt 0.343750 1.000000 +vt 0.343750 1.000000 +vt 0.343750 1.000000 +vt 0.312500 1.000000 +vt 0.312500 1.000000 +vt 0.312500 1.000000 +vt 0.312500 1.000000 +vt 0.312500 1.000000 +vt 0.312500 1.000000 +vt 0.312500 1.000000 +vt 0.312500 1.000000 +vt 0.312500 1.000000 +vt 0.312500 1.000000 +vt 0.312500 1.000000 +vt 0.312500 1.000000 +vt 0.312500 1.000000 +vt 0.312500 1.000000 +vt 0.312500 1.000000 +vt 0.281250 1.000000 +vt 0.281250 1.000000 +vt 0.281250 1.000000 +vt 0.281250 1.000000 +vt 0.281250 1.000000 +vt 0.281250 1.000000 +vt 0.281250 1.000000 +vt 0.281250 1.000000 +vt 0.281250 1.000000 +vt 0.281250 1.000000 +vt 0.281250 1.000000 +vt 0.281250 1.000000 +vt 0.281250 1.000000 +vt 0.281250 1.000000 +vt 0.281250 1.000000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.218750 1.000000 +vt 0.218750 1.000000 +vt 0.218750 1.000000 +vt 0.218750 1.000000 +vt 0.218750 1.000000 +vt 0.218750 1.000000 +vt 0.218750 1.000000 +vt 0.218750 1.000000 +vt 0.218750 1.000000 +vt 0.218750 1.000000 +vt 0.218750 1.000000 +vt 0.218750 1.000000 +vt 0.218750 1.000000 +vt 0.218750 1.000000 +vt 0.218750 1.000000 +vt 0.187500 1.000000 +vt 0.187500 1.000000 +vt 0.187500 1.000000 +vt 0.187500 1.000000 +vt 0.187500 1.000000 +vt 0.187500 1.000000 +vt 0.187500 1.000000 +vt 0.187500 1.000000 +vt 0.187500 1.000000 +vt 0.187500 1.000000 +vt 0.187500 1.000000 +vt 0.187500 1.000000 +vt 0.187500 1.000000 +vt 0.187500 1.000000 +vt 0.187500 1.000000 +vt 0.156250 1.000000 +vt 0.156250 1.000000 +vt 0.156250 1.000000 +vt 0.156250 1.000000 +vt 0.156250 1.000000 +vt 0.156250 1.000000 +vt 0.156250 1.000000 +vt 0.156250 1.000000 +vt 0.156250 1.000000 +vt 0.156250 1.000000 +vt 0.156250 1.000000 +vt 0.156250 1.000000 +vt 0.156250 1.000000 +vt 0.156250 1.000000 +vt 0.156250 1.000000 +vt 0.968750 1.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 0.968750 1.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 0.968750 1.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 0.968750 1.000000 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 1.000000 +vt 0.937500 1.000000 +vt 0.937500 1.000000 +vt 0.937500 1.000000 +vt 0.937500 1.000000 +vt 0.937500 1.000000 +vt 0.937500 1.000000 +vt 0.937500 1.000000 +vt 0.937500 1.000000 +vt 0.937500 1.000000 +vt 0.937500 1.000000 +vt 0.937500 1.000000 +vt 0.937500 1.000000 +vt 0.937500 1.000000 +vt 0.937500 1.000000 +vt 0.937500 1.000000 +vt 0.093750 1.000000 +vt 0.093750 1.000000 +vt 0.093750 1.000000 +vt 0.093750 1.000000 +vt 0.093750 1.000000 +vt 0.093750 1.000000 +vt 0.093750 1.000000 +vt 0.093750 1.000000 +vt 0.093750 1.000000 +vt 0.093750 1.000000 +vt 0.093750 1.000000 +vt 0.093750 1.000000 +vt 0.093750 1.000000 +vt 0.093750 1.000000 +vt 0.093750 1.000000 +vt 0.906250 1.000000 +vt 0.906250 1.000000 +vt 0.906250 1.000000 +vt 0.906250 1.000000 +vt 0.906250 1.000000 +vt 0.906250 1.000000 +vt 0.906250 1.000000 +vt 0.906250 1.000000 +vt 0.906250 1.000000 +vt 0.906250 1.000000 +vt 0.906250 1.000000 +vt 0.906250 1.000000 +vt 0.906250 1.000000 +vt 0.906250 1.000000 +vt 0.906250 1.000000 +vt 0.062500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 1.000000 +vt 0.062500 1.000000 +vt 0.875000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 1.000000 +vt 0.031250 1.000000 +vt 0.031250 1.000000 +vt 0.031250 1.000000 +vt 0.031250 1.000000 +vt 0.031250 1.000000 +vt 0.031250 1.000000 +vt 0.031250 1.000000 +vt 0.031250 1.000000 +vt 0.031250 1.000000 +vt 0.031250 1.000000 +vt 0.031250 1.000000 +vt 0.031250 1.000000 +vt 0.031250 1.000000 +vt 0.031250 1.000000 +vt 0.031250 1.000000 +vt 0.843750 1.000000 +vt 0.843750 1.000000 +vt 0.843750 1.000000 +vt 0.843750 1.000000 +vt 0.843750 1.000000 +vt 0.843750 1.000000 +vt 0.843750 1.000000 +vt 0.843750 1.000000 +vt 0.843750 1.000000 +vt 0.843750 1.000000 +vt 0.843750 1.000000 +vt 0.843750 1.000000 +vt 0.843750 1.000000 +vt 0.843750 1.000000 +vt 0.843750 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.812500 1.000000 +vt 0.812500 1.000000 +vt 0.812500 1.000000 +vt 0.812500 1.000000 +vt 0.812500 1.000000 +vt 0.812500 1.000000 +vt 0.812500 1.000000 +vt 0.812500 1.000000 +vt 0.812500 1.000000 +vt 0.812500 1.000000 +vt 0.812500 1.000000 +vt 0.812500 1.000000 +vt 0.812500 1.000000 +vt 0.812500 1.000000 +vt 0.812500 1.000000 +vt 0.781250 1.000000 +vt 0.781250 1.000000 +vt 0.781250 1.000000 +vt 0.781250 1.000000 +vt 0.781250 1.000000 +vt 0.781250 1.000000 +vt 0.781250 1.000000 +vt 0.781250 1.000000 +vt 0.781250 1.000000 +vt 0.781250 1.000000 +vt 0.781250 1.000000 +vt 0.781250 1.000000 +vt 0.781250 1.000000 +vt 0.781250 1.000000 +vt 0.781250 1.000000 +vt 0.750000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 1.000000 +vt 0.718750 1.000000 +vt 0.718750 1.000000 +vt 0.718750 1.000000 +vt 0.718750 1.000000 +vt 0.718750 1.000000 +vt 0.718750 1.000000 +vt 0.718750 1.000000 +vt 0.718750 1.000000 +vt 0.718750 1.000000 +vt 0.718750 1.000000 +vt 0.718750 1.000000 +vt 0.718750 1.000000 +vt 0.718750 1.000000 +vt 0.718750 1.000000 +vt 0.718750 1.000000 +vt 0.687500 1.000000 +vt 0.687500 1.000000 +vt 0.687500 1.000000 +vt 0.687500 1.000000 +vt 0.687500 1.000000 +vt 0.687500 1.000000 +vt 0.687500 1.000000 +vt 0.687500 1.000000 +vt 0.687500 1.000000 +vt 0.687500 1.000000 +vt 0.687500 1.000000 +vt 0.687500 1.000000 +vt 0.687500 1.000000 +vt 0.687500 1.000000 +vt 0.687500 1.000000 +vt 0.656250 1.000000 +vt 0.656250 1.000000 +vt 0.656250 1.000000 +vt 0.656250 1.000000 +vt 0.656250 1.000000 +vt 0.656250 1.000000 +vt 0.656250 1.000000 +vt 0.656250 1.000000 +vt 0.656250 1.000000 +vt 0.656250 1.000000 +vt 0.656250 1.000000 +vt 0.656250 1.000000 +vt 0.656250 1.000000 +vt 0.656250 1.000000 +vt 0.656250 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.625000 1.000000 +vt 0.593750 1.000000 +vt 0.593750 1.000000 +vt 0.593750 1.000000 +vt 0.593750 1.000000 +vt 0.593750 1.000000 +vt 0.593750 1.000000 +vt 0.593750 1.000000 +vt 0.593750 1.000000 +vt 0.593750 1.000000 +vt 0.593750 1.000000 +vt 0.593750 1.000000 +vt 0.593750 1.000000 +vt 0.593750 1.000000 +vt 0.593750 1.000000 +vt 0.593750 1.000000 +vt 0.562500 1.000000 +vt 0.562500 1.000000 +vt 0.562500 1.000000 +vt 0.562500 1.000000 +vt 0.562500 1.000000 +vt 0.562500 1.000000 +vt 0.562500 1.000000 +vt 0.562500 1.000000 +vt 0.562500 1.000000 +vt 0.562500 1.000000 +vt 0.562500 1.000000 +vt 0.562500 1.000000 +vt 0.562500 1.000000 +vt 0.562500 1.000000 +vt 0.562500 1.000000 +vt 0.531250 1.000000 +vt 0.531250 1.000000 +vt 0.531250 1.000000 +vt 0.531250 1.000000 +vt 0.531250 1.000000 +vt 0.531250 1.000000 +vt 0.531250 1.000000 +vt 0.531250 1.000000 +vt 0.531250 1.000000 +vt 0.531250 1.000000 +vt 0.531250 1.000000 +vt 0.531250 1.000000 +vt 0.531250 1.000000 +vt 0.531250 1.000000 +vt 0.531250 1.000000 +vt 0.500000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 1.000000 +vt 0.468750 1.000000 +vt 0.468750 1.000000 +vt 0.468750 1.000000 +vt 0.468750 1.000000 +vt 0.468750 1.000000 +vt 0.468750 1.000000 +vt 0.468750 1.000000 +vt 0.468750 1.000000 +vt 0.468750 1.000000 +vt 0.468750 1.000000 +vt 0.468750 1.000000 +vt 0.468750 1.000000 +vt 0.468750 1.000000 +vt 0.468750 1.000000 +vt 0.468750 1.000000 +vt 0.281250 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.500000 +vt 0.281250 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.031250 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.218750 0.500000 +vt 0.218750 0.500000 +vt 0.281250 0.500000 +vt 0.250000 0.500000 +vt 0.312500 0.500000 +vt 0.343750 0.500000 +vt 0.375000 0.500000 +vt 0.406250 0.500000 +vt 0.437500 0.500000 +vt 0.468750 0.500000 +vt 0.500000 0.500000 +vt 0.531250 0.500000 +vt 0.562500 0.500000 +vt 0.593750 0.500000 +vt 0.625000 0.500000 +vt 0.656250 0.500000 +vt 0.687500 0.500000 +vt 0.718750 0.500000 +vt 0.750000 0.500000 +vt 0.781250 0.500000 +vt 0.812500 0.500000 +vt 0.843750 0.500000 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.875000 0.500000 +vt 0.062500 0.500000 +vt 0.906250 0.500000 +vt 0.093750 0.500000 +vt 0.937500 0.500000 +vt 0.125000 0.500000 +vt 0.968750 0.500000 +vt 0.156250 0.500000 +vt 1.000000 0.500000 +vt 0.187500 0.500000 +vt 0.218750 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.968750 0.500000 +vt 1.000000 0.500000 +vt 0.968750 0.500000 +vt 1.000000 0.500000 +vt 0.968750 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.500000 +vt 1.000000 0.500000 +vt 0.968750 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.500000 +vt 1.000000 0.500000 +vt 0.968750 0.500000 +vt 1.000000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.031250 0.500000 +vt 0.031250 0.500000 +vt 0.031250 0.500000 +vt 0.031250 0.500000 +vt 0.031250 0.500000 +vt 0.031250 0.500000 +vt 0.031250 0.500000 +vt 0.031250 0.500000 +vt 0.031250 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.218750 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.218750 0.500000 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.500000 +vt 0.656250 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 1.000000 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.500000 +vt 1.000000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.031250 0.500000 +vt 0.031250 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.750000 0.490000 +vt 0.796822 0.485388 +vt 0.841844 0.471731 +vt 0.883337 0.449553 +vt 0.919706 0.419706 +vt 0.949553 0.383337 +vt 0.971731 0.341844 +vt 0.985388 0.296822 +vt 0.990000 0.250000 +vt 0.985388 0.203178 +vt 0.971731 0.158156 +vt 0.949553 0.116663 +vt 0.919706 0.080294 +vt 0.883337 0.050447 +vt 0.841844 0.028269 +vt 0.796822 0.014612 +vt 0.750000 0.010000 +vt 0.703178 0.014612 +vt 0.658156 0.028269 +vt 0.616663 0.050447 +vt 0.580294 0.080294 +vt 0.550447 0.116663 +vt 0.528269 0.158156 +vt 0.514611 0.203179 +vt 0.510000 0.250000 +vt 0.514612 0.296822 +vt 0.528269 0.341844 +vt 0.550447 0.383337 +vt 0.580295 0.419706 +vt 0.616663 0.449553 +vt 0.658156 0.471731 +vt 0.703179 0.485389 +vt 0.625000 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.625000 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 1.000000 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.500000 +vt 1.000000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.031250 0.500000 +vt 0.031250 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.500000 +vt 0.656250 0.500000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.031250 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.218750 0.500000 +vt 0.593750 0.500000 +vt 0.625000 0.500000 +vt 0.156250 0.500000 +vt 0.562500 0.500000 +vt 0.968750 0.500000 +vt 1.000000 0.500000 +vt 0.125000 0.500000 +vt 0.531250 0.500000 +vt 0.937500 0.500000 +vt 0.093750 0.500000 +vt 0.500000 0.500000 +vt 0.906250 0.500000 +vt 0.062500 0.500000 +vt 0.468750 0.500000 +vt 0.875000 0.500000 +vt 0.031250 0.500000 +vt 0.437500 0.500000 +vt 0.843750 0.500000 +vt 0.000000 0.500000 +vt 0.406250 0.500000 +vt 0.812500 0.500000 +vt 0.375000 0.500000 +vt 0.781250 0.500000 +vt 0.343750 0.500000 +vt 0.750000 0.500000 +vt 0.312500 0.500000 +vt 0.718750 0.500000 +vt 0.281250 0.500000 +vt 0.687500 0.500000 +vt 0.250000 0.500000 +vt 0.656250 0.500000 +vt 0.218750 0.500000 +vt 0.187500 0.500000 +vt 0.625000 0.500000 +vt 0.593750 0.500000 +vt 0.156250 0.500000 +vt 0.562500 0.500000 +vt 1.000000 0.500000 +vt 0.968750 0.500000 +vt 0.125000 0.500000 +vt 0.531250 0.500000 +vt 0.937500 0.500000 +vt 0.093750 0.500000 +vt 0.500000 0.500000 +vt 0.906250 0.500000 +vt 0.062500 0.500000 +vt 0.468750 0.500000 +vt 0.875000 0.500000 +vt 0.031250 0.500000 +vt 0.437500 0.500000 +vt 0.843750 0.500000 +vt 0.000000 0.500000 +vt 0.406250 0.500000 +vt 0.812500 0.500000 +vt 0.375000 0.500000 +vt 0.781250 0.500000 +vt 0.343750 0.500000 +vt 0.750000 0.500000 +vt 0.312500 0.500000 +vt 0.718750 0.500000 +vt 0.281250 0.500000 +vt 0.687500 0.500000 +vt 0.250000 0.500000 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.656250 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.218750 0.500000 +vt 0.250000 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.281250 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.718750 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.312500 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.343750 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.781250 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.843750 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.500000 +vt 0.000000 0.500000 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.031250 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.906250 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.093750 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.531250 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.500000 +vt 0.968750 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 0.156250 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.593750 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.500000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 0.968750 0.500000 +vt 0.937500 1.000000 +vt 0.937500 0.500000 +vt 0.906250 1.000000 +vt 0.906250 0.500000 +vt 0.875000 1.000000 +vt 0.875000 0.500000 +vt 0.843750 1.000000 +vt 0.843750 0.500000 +vt 0.812500 1.000000 +vt 0.812500 0.500000 +vt 0.781250 1.000000 +vt 0.781250 0.500000 +vt 0.750000 1.000000 +vt 0.750000 0.500000 +vt 0.718750 1.000000 +vt 0.718750 0.500000 +vt 0.687500 1.000000 +vt 0.687500 0.500000 +vt 0.656250 1.000000 +vt 0.656250 0.500000 +vt 0.625000 1.000000 +vt 0.625000 0.500000 +vt 0.593750 1.000000 +vt 0.593750 0.500000 +vt 0.562500 1.000000 +vt 0.562500 0.500000 +vt 0.531250 1.000000 +vt 0.531250 0.500000 +vt 0.500000 1.000000 +vt 0.500000 0.500000 +vt 0.468750 1.000000 +vt 0.468750 0.500000 +vt 0.437500 1.000000 +vt 0.437500 0.500000 +vt 0.406250 1.000000 +vt 0.406250 0.500000 +vt 0.375000 1.000000 +vt 0.375000 0.500000 +vt 0.343750 1.000000 +vt 0.343750 0.500000 +vt 0.312500 1.000000 +vt 0.312500 0.500000 +vt 0.281250 1.000000 +vt 0.281250 0.500000 +vt 0.250000 1.000000 +vt 0.250000 0.500000 +vt 0.218750 1.000000 +vt 0.218750 0.500000 +vt 0.187500 1.000000 +vt 0.187500 0.500000 +vt 0.156250 1.000000 +vt 0.156250 0.500000 +vt 0.125000 1.000000 +vt 0.125000 0.500000 +vt 0.093750 1.000000 +vt 0.093750 0.500000 +vt 0.062500 1.000000 +vt 0.062500 0.500000 +vt 0.718750 1.000000 +vt 0.687500 1.000000 +vt 0.031250 1.000000 +vt 0.031250 0.500000 +vt 0.000000 1.000000 +vt 0.000000 0.500000 +vt 0.812500 0.500000 +vt 0.843750 0.500000 +vt 0.562500 1.000000 +vt 0.593750 1.000000 +vt 0.562500 1.000000 +vt 0.437500 1.000000 +vt 0.406250 1.000000 +vt 0.156250 1.000000 +vt 0.125000 1.000000 +vt 0.843750 1.000000 +vt 0.812500 1.000000 +vt 0.531250 1.000000 +vt 0.281250 1.000000 +vt 0.250000 1.000000 +vt 0.968750 1.000000 +vt 0.937500 1.000000 +vt 0.656250 1.000000 +vt 0.375000 1.000000 +vt 0.093750 1.000000 +vt 0.781250 1.000000 +vt 0.500000 1.000000 +vt 0.218750 1.000000 +vt 0.906250 1.000000 +vt 0.625000 1.000000 +vt 0.343750 1.000000 +vt 0.062500 1.000000 +vt 0.750000 1.000000 +vt 0.468750 1.000000 +vt 0.187500 1.000000 +vt 0.875000 1.000000 +vt 0.312500 1.000000 +vt 0.031250 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.890975 0.466368 +vt 0.873729 0.481154 +vt 0.889672 0.485865 +vt 0.894793 0.474776 +vt 0.968750 1.000000 +vt 0.125000 1.000000 +vt 0.531250 1.000000 +vt 0.937500 1.000000 +vt 0.093750 1.000000 +vt 0.500000 1.000000 +vt 0.906250 1.000000 +vt 0.062500 1.000000 +vt 0.468750 1.000000 +vt 0.875000 1.000000 +vt 0.031250 1.000000 +vt 0.437500 1.000000 +vt 0.843750 1.000000 +vt 0.000000 1.000000 +vt 0.406250 1.000000 +vt 0.812500 1.000000 +vt 0.375000 1.000000 +vt 0.781250 1.000000 +vt 0.343750 1.000000 +vt 0.750000 1.000000 +vt 0.312500 1.000000 +vt 0.718750 1.000000 +vt 0.281250 1.000000 +vt 0.687500 1.000000 +vt 0.250000 1.000000 +vt 0.656250 1.000000 +vt 0.218750 1.000000 +vt 0.625000 1.000000 +vt 0.187500 1.000000 +vt 0.593750 1.000000 +vt 0.156250 1.000000 +vt 0.250000 0.496667 +vt 0.255226 0.495129 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.531250 0.500000 +vt 0.562500 0.500000 +vt 0.250000 0.500000 +vt 0.281250 0.500000 +vt 0.937500 0.500000 +vt 0.968750 0.500000 +vt 0.656250 0.500000 +vt 0.687500 0.500000 +vt 0.375000 0.500000 +vt 0.406250 0.500000 +vt 0.093750 0.500000 +vt 0.125000 0.500000 +vt 0.781250 0.500000 +vt 0.500000 0.500000 +vt 0.218750 0.500000 +vt 0.906250 0.500000 +vt 0.625000 0.500000 +vt 0.343750 0.500000 +vt 0.062500 0.500000 +vt 0.750000 0.500000 +vt 0.468750 0.500000 +vt 0.187500 0.500000 +vt 0.875000 0.500000 +vt 0.593750 0.500000 +vt 0.312500 0.500000 +vt 0.718750 0.500000 +vt 0.437500 0.500000 +vt 0.156250 0.500000 +vt 1.000000 0.500000 +vt 0.750000 0.490000 +vt 0.796822 0.485388 +vt 0.841844 0.471731 +vt 0.883337 0.449553 +vt 0.919706 0.419706 +vt 0.949553 0.383337 +vt 0.971731 0.341844 +vt 0.985388 0.296822 +vt 0.990000 0.250000 +vt 0.985388 0.203178 +vt 0.971731 0.158156 +vt 0.949553 0.116663 +vt 0.919706 0.080294 +vt 0.883337 0.050447 +vt 0.841844 0.028269 +vt 0.796822 0.014612 +vt 0.750000 0.010000 +vt 0.703178 0.014612 +vt 0.658156 0.028269 +vt 0.616663 0.050447 +vt 0.580294 0.080294 +vt 0.550447 0.116663 +vt 0.528269 0.158156 +vt 0.514611 0.203179 +vt 0.510000 0.250000 +vt 0.514612 0.296822 +vt 0.528269 0.341844 +vt 0.550447 0.383337 +vt 0.580295 0.419706 +vt 0.616663 0.449553 +vt 0.658156 0.471731 +vt 0.703179 0.485389 +vt 0.261052 0.490577 +vt 0.268054 0.483184 +vt 0.276765 0.473235 +vt 0.287649 0.461112 +vt 0.301090 0.447281 +vt 0.317371 0.432274 +vt 0.336667 0.416667 +vt 0.359037 0.401060 +vt 0.384423 0.386052 +vt 0.412649 0.372221 +vt 0.443431 0.360098 +vt 0.476388 0.350149 +vt 0.511052 0.342756 +vt 0.546893 0.338204 +vt 0.583333 0.336667 +vt 0.619774 0.338204 +vt 0.655615 0.342756 +vt 0.690279 0.350149 +vt 0.723235 0.360098 +vt 0.754018 0.372221 +vt 0.782244 0.386052 +vt 0.807629 0.401059 +vt 0.830000 0.416667 +vt 0.849296 0.432274 +vt 0.865577 0.447281 +vt 0.879017 0.461112 +vt 0.889902 0.473235 +vt 0.898612 0.483184 +vt 0.905614 0.490577 +vt 0.911441 0.495129 +vt 0.916667 0.496667 +vt 0.825476 0.487824 +vt 0.791667 0.491667 +vt 0.833333 0.493333 +vt 0.854131 0.490259 +vt 0.882786 0.492694 +vt 0.875000 0.495000 +vt 0.857787 0.476443 +vt 0.887156 0.457961 +vt 0.912255 0.433088 +vt 0.904804 0.446470 +vt 0.897353 0.459853 +vt 0.931919 0.402781 +vt 0.914285 0.422224 +vt 0.896651 0.441668 +vt 0.945192 0.368203 +vt 0.918654 0.394563 +vt 0.892115 0.420922 +vt 0.951365 0.330685 +vt 0.917342 0.364548 +vt 0.883319 0.398411 +vt 0.950000 0.291667 +vt 0.910000 0.333333 +vt 0.870000 0.375000 +vt 0.940949 0.252649 +vt 0.896509 0.302119 +vt 0.852069 0.351589 +vt 0.924359 0.215130 +vt 0.876987 0.272104 +vt 0.829616 0.329078 +vt 0.900669 0.180553 +vt 0.851785 0.244442 +vt 0.802901 0.308332 +vt 0.870588 0.150245 +vt 0.821470 0.220196 +vt 0.772353 0.290147 +vt 0.835072 0.125373 +vt 0.786808 0.200298 +vt 0.738543 0.275224 +vt 0.795287 0.106891 +vt 0.748729 0.185513 +vt 0.702172 0.264134 +vt 0.752560 0.095510 +vt 0.708298 0.176408 +vt 0.664036 0.257306 +vt 0.708333 0.091667 +vt 0.666667 0.173333 +vt 0.625000 0.255000 +vt 0.664107 0.095510 +vt 0.625035 0.176408 +vt 0.585964 0.257306 +vt 0.621380 0.106891 +vt 0.584604 0.185513 +vt 0.547828 0.264134 +vt 0.581594 0.125373 +vt 0.546525 0.200298 +vt 0.511457 0.275224 +vt 0.546079 0.150245 +vt 0.511863 0.220196 +vt 0.477647 0.290147 +vt 0.515998 0.180553 +vt 0.481548 0.244442 +vt 0.447099 0.308332 +vt 0.492307 0.215130 +vt 0.456346 0.272104 +vt 0.420384 0.329078 +vt 0.475718 0.252649 +vt 0.436824 0.302119 +vt 0.397931 0.351589 +vt 0.466667 0.291667 +vt 0.423333 0.333333 +vt 0.380000 0.375000 +vt 0.465301 0.330685 +vt 0.415991 0.364548 +vt 0.366681 0.398411 +vt 0.471474 0.368204 +vt 0.414679 0.394563 +vt 0.357885 0.420922 +vt 0.484748 0.402781 +vt 0.419048 0.422225 +vt 0.353349 0.441669 +vt 0.504412 0.433088 +vt 0.428530 0.446470 +vt 0.352647 0.459853 +vt 0.529511 0.457961 +vt 0.442359 0.466368 +vt 0.355207 0.474776 +vt 0.558880 0.476443 +vt 0.459604 0.481154 +vt 0.360328 0.485866 +vt 0.591191 0.487824 +vt 0.479202 0.490259 +vt 0.367214 0.492694 +vt 0.625000 0.491667 +vt 0.500000 0.493333 +vt 0.375000 0.495000 +vt 1.000000 0.500000 +vt 0.968750 0.500000 +vt 0.968750 1.000000 +vt 1.000000 1.000000 +vt 0.937500 0.500000 +vt 0.937500 1.000000 +vt 0.906250 0.500000 +vt 0.906250 1.000000 +vt 0.875000 0.500000 +vt 0.875000 1.000000 +vt 0.843750 0.500000 +vt 0.843750 1.000000 +vt 0.812500 0.500000 +vt 0.812500 1.000000 +vt 0.781250 0.500000 +vt 0.781250 1.000000 +vt 0.750000 0.500000 +vt 0.750000 1.000000 +vt 0.718750 0.500000 +vt 0.718750 1.000000 +vt 0.687500 0.500000 +vt 0.687500 1.000000 +vt 0.656250 0.500000 +vt 0.656250 1.000000 +vt 0.625000 0.500000 +vt 0.625000 1.000000 +vt 0.593750 0.500000 +vt 0.593750 1.000000 +vt 0.562500 0.500000 +vt 0.562500 1.000000 +vt 0.531250 0.500000 +vt 0.531250 1.000000 +vt 0.500000 0.500000 +vt 0.500000 1.000000 +vt 0.468750 0.500000 +vt 0.468750 1.000000 +vt 0.437500 0.500000 +vt 0.437500 1.000000 +vt 0.406250 0.500000 +vt 0.406250 1.000000 +vt 0.375000 0.500000 +vt 0.375000 1.000000 +vt 0.343750 0.500000 +vt 0.343750 1.000000 +vt 0.312500 0.500000 +vt 0.312500 1.000000 +vt 0.281250 0.500000 +vt 0.281250 1.000000 +vt 0.250000 0.500000 +vt 0.250000 1.000000 +vt 0.218750 0.500000 +vt 0.218750 1.000000 +vt 0.187500 0.500000 +vt 0.187500 1.000000 +vt 0.156250 0.500000 +vt 0.156250 1.000000 +vt 0.125000 0.500000 +vt 0.125000 1.000000 +vt 0.093750 0.500000 +vt 0.093750 1.000000 +vt 0.062500 0.500000 +vt 0.062500 1.000000 +vt 0.687500 1.000000 +vt 0.718750 1.000000 +vt 0.031250 0.500000 +vt 0.031250 1.000000 +vt 0.000000 0.500000 +vt 0.000000 1.000000 +vt 0.843750 0.500000 +vt 0.812500 0.500000 +vt 0.562500 1.000000 +vt 0.562500 1.000000 +vt 0.593750 1.000000 +vt 0.406250 1.000000 +vt 0.437500 1.000000 +vt 0.125000 1.000000 +vt 0.156250 1.000000 +vt 0.812500 1.000000 +vt 0.843750 1.000000 +vt 0.531250 1.000000 +vt 0.250000 1.000000 +vt 0.281250 1.000000 +vt 0.937500 1.000000 +vt 0.968750 1.000000 +vt 0.656250 1.000000 +vt 0.375000 1.000000 +vt 0.093750 1.000000 +vt 0.781250 1.000000 +vt 0.500000 1.000000 +vt 0.218750 1.000000 +vt 0.906250 1.000000 +vt 0.625000 1.000000 +vt 0.343750 1.000000 +vt 0.062500 1.000000 +vt 0.750000 1.000000 +vt 0.468750 1.000000 +vt 0.187500 1.000000 +vt 0.875000 1.000000 +vt 0.312500 1.000000 +vt 0.031250 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.890975 0.466368 +vt 0.894793 0.474776 +vt 0.889672 0.485865 +vt 0.873729 0.481154 +vt 0.968750 1.000000 +vt 0.125000 1.000000 +vt 0.531250 1.000000 +vt 0.937500 1.000000 +vt 0.093750 1.000000 +vt 0.500000 1.000000 +vt 0.906250 1.000000 +vt 0.062500 1.000000 +vt 0.468750 1.000000 +vt 0.875000 1.000000 +vt 0.031250 1.000000 +vt 0.437500 1.000000 +vt 0.843750 1.000000 +vt 0.000000 1.000000 +vt 0.406250 1.000000 +vt 0.812500 1.000000 +vt 0.375000 1.000000 +vt 0.781250 1.000000 +vt 0.343750 1.000000 +vt 0.750000 1.000000 +vt 0.312500 1.000000 +vt 0.718750 1.000000 +vt 0.281250 1.000000 +vt 0.687500 1.000000 +vt 0.250000 1.000000 +vt 0.656250 1.000000 +vt 0.218750 1.000000 +vt 0.625000 1.000000 +vt 0.187500 1.000000 +vt 0.593750 1.000000 +vt 0.156250 1.000000 +vt 0.250000 0.496667 +vt 0.000000 0.500000 +vt 0.031250 0.500000 +vt 0.255226 0.495129 +vt 0.562500 0.500000 +vt 0.531250 0.500000 +vt 0.281250 0.500000 +vt 0.250000 0.500000 +vt 0.968750 0.500000 +vt 0.937500 0.500000 +vt 0.687500 0.500000 +vt 0.656250 0.500000 +vt 0.406250 0.500000 +vt 0.375000 0.500000 +vt 0.125000 0.500000 +vt 0.093750 0.500000 +vt 0.781250 0.500000 +vt 0.500000 0.500000 +vt 0.218750 0.500000 +vt 0.906250 0.500000 +vt 0.625000 0.500000 +vt 0.343750 0.500000 +vt 0.062500 0.500000 +vt 0.750000 0.500000 +vt 0.468750 0.500000 +vt 0.187500 0.500000 +vt 0.875000 0.500000 +vt 0.593750 0.500000 +vt 0.312500 0.500000 +vt 0.718750 0.500000 +vt 0.437500 0.500000 +vt 0.156250 0.500000 +vt 1.000000 0.500000 +vt 0.750000 0.490000 +vt 0.703179 0.485389 +vt 0.658156 0.471731 +vt 0.616663 0.449553 +vt 0.580295 0.419706 +vt 0.550447 0.383337 +vt 0.528269 0.341844 +vt 0.514612 0.296822 +vt 0.510000 0.250000 +vt 0.514611 0.203179 +vt 0.528269 0.158156 +vt 0.550447 0.116663 +vt 0.580294 0.080294 +vt 0.616663 0.050447 +vt 0.658156 0.028269 +vt 0.703178 0.014612 +vt 0.750000 0.010000 +vt 0.796822 0.014612 +vt 0.841844 0.028269 +vt 0.883337 0.050447 +vt 0.919706 0.080294 +vt 0.949553 0.116663 +vt 0.971731 0.158156 +vt 0.985388 0.203178 +vt 0.990000 0.250000 +vt 0.985388 0.296822 +vt 0.971731 0.341844 +vt 0.949553 0.383337 +vt 0.919706 0.419706 +vt 0.883337 0.449553 +vt 0.841844 0.471731 +vt 0.796822 0.485388 +vt 0.261052 0.490577 +vt 0.268054 0.483184 +vt 0.276765 0.473235 +vt 0.287649 0.461112 +vt 0.301090 0.447281 +vt 0.317371 0.432274 +vt 0.336667 0.416667 +vt 0.359037 0.401060 +vt 0.384423 0.386052 +vt 0.412649 0.372221 +vt 0.443431 0.360098 +vt 0.476388 0.350149 +vt 0.511052 0.342756 +vt 0.546893 0.338204 +vt 0.583333 0.336667 +vt 0.619774 0.338204 +vt 0.655615 0.342756 +vt 0.690279 0.350149 +vt 0.723235 0.360098 +vt 0.754018 0.372221 +vt 0.782244 0.386052 +vt 0.807629 0.401059 +vt 0.830000 0.416667 +vt 0.849296 0.432274 +vt 0.865577 0.447281 +vt 0.879017 0.461112 +vt 0.889902 0.473235 +vt 0.898612 0.483184 +vt 0.905614 0.490577 +vt 0.911441 0.495129 +vt 0.916667 0.496667 +vt 0.825476 0.487824 +vt 0.854131 0.490259 +vt 0.833333 0.493333 +vt 0.791667 0.491667 +vt 0.882786 0.492694 +vt 0.875000 0.495000 +vt 0.857787 0.476443 +vt 0.887156 0.457961 +vt 0.912255 0.433088 +vt 0.904804 0.446470 +vt 0.897353 0.459853 +vt 0.931919 0.402781 +vt 0.914285 0.422224 +vt 0.896651 0.441668 +vt 0.945192 0.368203 +vt 0.918654 0.394563 +vt 0.892115 0.420922 +vt 0.951365 0.330685 +vt 0.917342 0.364548 +vt 0.883319 0.398411 +vt 0.950000 0.291667 +vt 0.910000 0.333333 +vt 0.870000 0.375000 +vt 0.940949 0.252649 +vt 0.896509 0.302119 +vt 0.852069 0.351589 +vt 0.924359 0.215130 +vt 0.876987 0.272104 +vt 0.829616 0.329078 +vt 0.900669 0.180553 +vt 0.851785 0.244442 +vt 0.802901 0.308332 +vt 0.870588 0.150245 +vt 0.821470 0.220196 +vt 0.772353 0.290147 +vt 0.835072 0.125373 +vt 0.786808 0.200298 +vt 0.738543 0.275224 +vt 0.795287 0.106891 +vt 0.748729 0.185513 +vt 0.702172 0.264134 +vt 0.752560 0.095510 +vt 0.708298 0.176408 +vt 0.664036 0.257306 +vt 0.708333 0.091667 +vt 0.666667 0.173333 +vt 0.625000 0.255000 +vt 0.664107 0.095510 +vt 0.625035 0.176408 +vt 0.585964 0.257306 +vt 0.621380 0.106891 +vt 0.584604 0.185513 +vt 0.547828 0.264134 +vt 0.581594 0.125373 +vt 0.546525 0.200298 +vt 0.511457 0.275224 +vt 0.546079 0.150245 +vt 0.511863 0.220196 +vt 0.477647 0.290147 +vt 0.515998 0.180553 +vt 0.481548 0.244442 +vt 0.447099 0.308332 +vt 0.492307 0.215130 +vt 0.456346 0.272104 +vt 0.420384 0.329078 +vt 0.475718 0.252649 +vt 0.436824 0.302119 +vt 0.397931 0.351589 +vt 0.466667 0.291667 +vt 0.423333 0.333333 +vt 0.380000 0.375000 +vt 0.465301 0.330685 +vt 0.415991 0.364548 +vt 0.366681 0.398411 +vt 0.471474 0.368204 +vt 0.414679 0.394563 +vt 0.357885 0.420922 +vt 0.484748 0.402781 +vt 0.419048 0.422225 +vt 0.353349 0.441669 +vt 0.504412 0.433088 +vt 0.428530 0.446470 +vt 0.352647 0.459853 +vt 0.529511 0.457961 +vt 0.442359 0.466368 +vt 0.355207 0.474776 +vt 0.558880 0.476443 +vt 0.459604 0.481154 +vt 0.360328 0.485866 +vt 0.591191 0.487824 +vt 0.479202 0.490259 +vt 0.367214 0.492694 +vt 0.625000 0.491667 +vt 0.500000 0.493333 +vt 0.375000 0.495000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 0.968750 0.500000 +vt 0.937500 1.000000 +vt 0.937500 0.500000 +vt 0.906250 1.000000 +vt 0.906250 0.500000 +vt 0.875000 1.000000 +vt 0.875000 0.500000 +vt 0.843750 1.000000 +vt 0.843750 0.500000 +vt 0.812500 1.000000 +vt 0.812500 0.500000 +vt 0.781250 1.000000 +vt 0.781250 0.500000 +vt 0.750000 1.000000 +vt 0.750000 0.500000 +vt 0.718750 1.000000 +vt 0.718750 0.500000 +vt 0.687500 1.000000 +vt 0.687500 0.500000 +vt 0.656250 1.000000 +vt 0.656250 0.500000 +vt 0.625000 1.000000 +vt 0.625000 0.500000 +vt 0.593750 1.000000 +vt 0.593750 0.500000 +vt 0.562500 1.000000 +vt 0.562500 0.500000 +vt 0.531250 1.000000 +vt 0.531250 0.500000 +vt 0.500000 1.000000 +vt 0.500000 0.500000 +vt 0.468750 1.000000 +vt 0.468750 0.500000 +vt 0.437500 1.000000 +vt 0.437500 0.500000 +vt 0.406250 1.000000 +vt 0.406250 0.500000 +vt 0.375000 1.000000 +vt 0.375000 0.500000 +vt 0.343750 1.000000 +vt 0.343750 0.500000 +vt 0.312500 1.000000 +vt 0.312500 0.500000 +vt 0.281250 1.000000 +vt 0.281250 0.500000 +vt 0.250000 1.000000 +vt 0.250000 0.500000 +vt 0.218750 1.000000 +vt 0.218750 0.500000 +vt 0.187500 1.000000 +vt 0.187500 0.500000 +vt 0.156250 1.000000 +vt 0.156250 0.500000 +vt 0.125000 1.000000 +vt 0.125000 0.500000 +vt 0.093750 1.000000 +vt 0.093750 0.500000 +vt 0.062500 1.000000 +vt 0.062500 0.500000 +vt 0.718750 1.000000 +vt 0.687500 1.000000 +vt 0.031250 1.000000 +vt 0.031250 0.500000 +vt 0.000000 1.000000 +vt 0.000000 0.500000 +vt 0.812500 0.500000 +vt 0.843750 0.500000 +vt 0.562500 1.000000 +vt 0.593750 1.000000 +vt 0.562500 1.000000 +vt 0.437500 1.000000 +vt 0.406250 1.000000 +vt 0.156250 1.000000 +vt 0.125000 1.000000 +vt 0.843750 1.000000 +vt 0.812500 1.000000 +vt 0.531250 1.000000 +vt 0.281250 1.000000 +vt 0.250000 1.000000 +vt 0.968750 1.000000 +vt 0.937500 1.000000 +vt 0.656250 1.000000 +vt 0.375000 1.000000 +vt 0.093750 1.000000 +vt 0.781250 1.000000 +vt 0.500000 1.000000 +vt 0.218750 1.000000 +vt 0.906250 1.000000 +vt 0.625000 1.000000 +vt 0.343750 1.000000 +vt 0.062500 1.000000 +vt 0.750000 1.000000 +vt 0.468750 1.000000 +vt 0.187500 1.000000 +vt 0.875000 1.000000 +vt 0.312500 1.000000 +vt 0.031250 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.890975 0.466368 +vt 0.873729 0.481154 +vt 0.889672 0.485865 +vt 0.894793 0.474776 +vt 0.968750 1.000000 +vt 0.125000 1.000000 +vt 0.531250 1.000000 +vt 0.937500 1.000000 +vt 0.093750 1.000000 +vt 0.500000 1.000000 +vt 0.906250 1.000000 +vt 0.062500 1.000000 +vt 0.468750 1.000000 +vt 0.875000 1.000000 +vt 0.031250 1.000000 +vt 0.437500 1.000000 +vt 0.843750 1.000000 +vt 0.000000 1.000000 +vt 0.406250 1.000000 +vt 0.812500 1.000000 +vt 0.375000 1.000000 +vt 0.781250 1.000000 +vt 0.343750 1.000000 +vt 0.750000 1.000000 +vt 0.312500 1.000000 +vt 0.718750 1.000000 +vt 0.281250 1.000000 +vt 0.687500 1.000000 +vt 0.250000 1.000000 +vt 0.656250 1.000000 +vt 0.218750 1.000000 +vt 0.625000 1.000000 +vt 0.187500 1.000000 +vt 0.593750 1.000000 +vt 0.156250 1.000000 +vt 0.250000 0.496667 +vt 0.255226 0.495129 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.531250 0.500000 +vt 0.562500 0.500000 +vt 0.250000 0.500000 +vt 0.281250 0.500000 +vt 0.937500 0.500000 +vt 0.968750 0.500000 +vt 0.656250 0.500000 +vt 0.687500 0.500000 +vt 0.375000 0.500000 +vt 0.406250 0.500000 +vt 0.093750 0.500000 +vt 0.125000 0.500000 +vt 0.781250 0.500000 +vt 0.500000 0.500000 +vt 0.218750 0.500000 +vt 0.906250 0.500000 +vt 0.625000 0.500000 +vt 0.343750 0.500000 +vt 0.062500 0.500000 +vt 0.750000 0.500000 +vt 0.468750 0.500000 +vt 0.187500 0.500000 +vt 0.875000 0.500000 +vt 0.593750 0.500000 +vt 0.312500 0.500000 +vt 0.718750 0.500000 +vt 0.437500 0.500000 +vt 0.156250 0.500000 +vt 1.000000 0.500000 +vt 0.919706 0.080294 +vt 0.883337 0.050447 +vt 0.883337 0.050447 +vt 0.919706 0.080294 +vt 0.261052 0.490577 +vt 0.268054 0.483184 +vt 0.276765 0.473235 +vt 0.287649 0.461112 +vt 0.301090 0.447281 +vt 0.317371 0.432274 +vt 0.336667 0.416667 +vt 0.359037 0.401060 +vt 0.384423 0.386052 +vt 0.412649 0.372221 +vt 0.443431 0.360098 +vt 0.476388 0.350149 +vt 0.511052 0.342756 +vt 0.546893 0.338204 +vt 0.583333 0.336667 +vt 0.619774 0.338204 +vt 0.655615 0.342756 +vt 0.690279 0.350149 +vt 0.723235 0.360098 +vt 0.754018 0.372221 +vt 0.782244 0.386052 +vt 0.807629 0.401059 +vt 0.830000 0.416667 +vt 0.849296 0.432274 +vt 0.865577 0.447281 +vt 0.879017 0.461112 +vt 0.889902 0.473235 +vt 0.898612 0.483184 +vt 0.905614 0.490577 +vt 0.911441 0.495129 +vt 0.916667 0.496667 +vt 0.825476 0.487824 +vt 0.791667 0.491667 +vt 0.833333 0.493333 +vt 0.854131 0.490259 +vt 0.882786 0.492694 +vt 0.875000 0.495000 +vt 0.857787 0.476443 +vt 0.887156 0.457961 +vt 0.912255 0.433088 +vt 0.904804 0.446470 +vt 0.897353 0.459853 +vt 0.931919 0.402781 +vt 0.914285 0.422224 +vt 0.896651 0.441668 +vt 0.945192 0.368203 +vt 0.918654 0.394563 +vt 0.892115 0.420922 +vt 0.951365 0.330685 +vt 0.917342 0.364548 +vt 0.883319 0.398411 +vt 0.950000 0.291667 +vt 0.910000 0.333333 +vt 0.870000 0.375000 +vt 0.940949 0.252649 +vt 0.896509 0.302119 +vt 0.852069 0.351589 +vt 0.924359 0.215130 +vt 0.876987 0.272104 +vt 0.829616 0.329078 +vt 0.900669 0.180553 +vt 0.851785 0.244442 +vt 0.802901 0.308332 +vt 0.870588 0.150245 +vt 0.821470 0.220196 +vt 0.772353 0.290147 +vt 0.835072 0.125373 +vt 0.786808 0.200298 +vt 0.738543 0.275224 +vt 0.795287 0.106891 +vt 0.748729 0.185513 +vt 0.702172 0.264134 +vt 0.752560 0.095510 +vt 0.708298 0.176408 +vt 0.664036 0.257306 +vt 0.708333 0.091667 +vt 0.666667 0.173333 +vt 0.625000 0.255000 +vt 0.664107 0.095510 +vt 0.625035 0.176408 +vt 0.585964 0.257306 +vt 0.621380 0.106891 +vt 0.584604 0.185513 +vt 0.547828 0.264134 +vt 0.581594 0.125373 +vt 0.546525 0.200298 +vt 0.511457 0.275224 +vt 0.546079 0.150245 +vt 0.511863 0.220196 +vt 0.477647 0.290147 +vt 0.515998 0.180553 +vt 0.481548 0.244442 +vt 0.447099 0.308332 +vt 0.492307 0.215130 +vt 0.456346 0.272104 +vt 0.420384 0.329078 +vt 0.475718 0.252649 +vt 0.436824 0.302119 +vt 0.397931 0.351589 +vt 0.466667 0.291667 +vt 0.423333 0.333333 +vt 0.380000 0.375000 +vt 0.465301 0.330685 +vt 0.415991 0.364548 +vt 0.366681 0.398411 +vt 0.471474 0.368204 +vt 0.414679 0.394563 +vt 0.357885 0.420922 +vt 0.484748 0.402781 +vt 0.419048 0.422225 +vt 0.353349 0.441669 +vt 0.504412 0.433088 +vt 0.428530 0.446470 +vt 0.352647 0.459853 +vt 0.529511 0.457961 +vt 0.442359 0.466368 +vt 0.355207 0.474776 +vt 0.558880 0.476443 +vt 0.459604 0.481154 +vt 0.360328 0.485866 +vt 0.591191 0.487824 +vt 0.479202 0.490259 +vt 0.367214 0.492694 +vt 0.625000 0.491667 +vt 0.500000 0.493333 +vt 0.375000 0.495000 +vt 0.750000 0.490000 +vt 0.703179 0.485389 +vt 0.658156 0.471731 +vt 0.616663 0.449553 +vt 0.580295 0.419706 +vt 0.550447 0.383337 +vt 0.528269 0.341844 +vt 0.514612 0.296822 +vt 0.510000 0.250000 +vt 0.514611 0.203179 +vt 0.528269 0.158156 +vt 0.550447 0.116663 +vt 0.580294 0.080294 +vt 0.616663 0.050447 +vt 0.658156 0.028269 +vt 0.703178 0.014612 +vt 0.750000 0.010000 +vt 0.796822 0.014612 +vt 0.841844 0.028269 +vt 0.949553 0.116663 +vt 0.971731 0.158156 +vt 0.985388 0.203178 +vt 0.990000 0.250000 +vt 0.985388 0.296822 +vt 0.971731 0.341844 +vt 0.949553 0.383337 +vt 0.919706 0.419706 +vt 0.883337 0.449553 +vt 0.841844 0.471731 +vt 0.796822 0.485388 +vt 0.750000 0.490000 +vt 0.796822 0.485388 +vt 0.841844 0.471731 +vt 0.883337 0.449553 +vt 0.919706 0.419706 +vt 0.949553 0.383337 +vt 0.971731 0.341844 +vt 0.985388 0.296822 +vt 0.990000 0.250000 +vt 0.985388 0.203178 +vt 0.971731 0.158156 +vt 0.949553 0.116663 +vt 0.841844 0.028269 +vt 0.796822 0.014612 +vt 0.750000 0.010000 +vt 0.703178 0.014612 +vt 0.658156 0.028269 +vt 0.616663 0.050447 +vt 0.580294 0.080294 +vt 0.550447 0.116663 +vt 0.528269 0.158156 +vt 0.514611 0.203179 +vt 0.510000 0.250000 +vt 0.514612 0.296822 +vt 0.528269 0.341844 +vt 0.550447 0.383337 +vt 0.580295 0.419706 +vt 0.616663 0.449553 +vt 0.658156 0.471731 +vt 0.703179 0.485389 +vt 1.000000 0.500000 +vt 0.968750 0.500000 +vt 0.968750 1.000000 +vt 1.000000 1.000000 +vt 0.937500 0.500000 +vt 0.937500 1.000000 +vt 0.906250 0.500000 +vt 0.906250 1.000000 +vt 0.875000 0.500000 +vt 0.875000 1.000000 +vt 0.843750 0.500000 +vt 0.843750 1.000000 +vt 0.812500 0.500000 +vt 0.812500 1.000000 +vt 0.781250 0.500000 +vt 0.781250 1.000000 +vt 0.750000 0.500000 +vt 0.750000 1.000000 +vt 0.718750 0.500000 +vt 0.718750 1.000000 +vt 0.687500 0.500000 +vt 0.687500 1.000000 +vt 0.656250 0.500000 +vt 0.656250 1.000000 +vt 0.625000 0.500000 +vt 0.625000 1.000000 +vt 0.593750 0.500000 +vt 0.593750 1.000000 +vt 0.562500 0.500000 +vt 0.562500 1.000000 +vt 0.531250 0.500000 +vt 0.531250 1.000000 +vt 0.500000 0.500000 +vt 0.500000 1.000000 +vt 0.468750 0.500000 +vt 0.468750 1.000000 +vt 0.437500 0.500000 +vt 0.437500 1.000000 +vt 0.406250 0.500000 +vt 0.406250 1.000000 +vt 0.375000 0.500000 +vt 0.375000 1.000000 +vt 0.343750 0.500000 +vt 0.343750 1.000000 +vt 0.312500 0.500000 +vt 0.312500 1.000000 +vt 0.281250 0.500000 +vt 0.281250 1.000000 +vt 0.250000 0.500000 +vt 0.250000 1.000000 +vt 0.218750 0.500000 +vt 0.218750 1.000000 +vt 0.187500 0.500000 +vt 0.187500 1.000000 +vt 0.156250 0.500000 +vt 0.156250 1.000000 +vt 0.125000 0.500000 +vt 0.125000 1.000000 +vt 0.093750 0.500000 +vt 0.093750 1.000000 +vt 0.062500 0.500000 +vt 0.062500 1.000000 +vt 0.687500 1.000000 +vt 0.718750 1.000000 +vt 0.031250 0.500000 +vt 0.031250 1.000000 +vt 0.000000 0.500000 +vt 0.000000 1.000000 +vt 0.843750 0.500000 +vt 0.812500 0.500000 +vt 0.562500 1.000000 +vt 0.562500 1.000000 +vt 0.593750 1.000000 +vt 0.406250 1.000000 +vt 0.437500 1.000000 +vt 0.125000 1.000000 +vt 0.156250 1.000000 +vt 0.812500 1.000000 +vt 0.843750 1.000000 +vt 0.531250 1.000000 +vt 0.250000 1.000000 +vt 0.281250 1.000000 +vt 0.937500 1.000000 +vt 0.968750 1.000000 +vt 0.656250 1.000000 +vt 0.375000 1.000000 +vt 0.093750 1.000000 +vt 0.781250 1.000000 +vt 0.500000 1.000000 +vt 0.218750 1.000000 +vt 0.906250 1.000000 +vt 0.625000 1.000000 +vt 0.343750 1.000000 +vt 0.062500 1.000000 +vt 0.750000 1.000000 +vt 0.468750 1.000000 +vt 0.187500 1.000000 +vt 0.875000 1.000000 +vt 0.312500 1.000000 +vt 0.031250 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.890975 0.466368 +vt 0.894793 0.474776 +vt 0.889672 0.485865 +vt 0.873729 0.481154 +vt 0.968750 1.000000 +vt 0.125000 1.000000 +vt 0.531250 1.000000 +vt 0.937500 1.000000 +vt 0.093750 1.000000 +vt 0.500000 1.000000 +vt 0.906250 1.000000 +vt 0.062500 1.000000 +vt 0.468750 1.000000 +vt 0.875000 1.000000 +vt 0.031250 1.000000 +vt 0.437500 1.000000 +vt 0.843750 1.000000 +vt 0.000000 1.000000 +vt 0.406250 1.000000 +vt 0.812500 1.000000 +vt 0.375000 1.000000 +vt 0.781250 1.000000 +vt 0.343750 1.000000 +vt 0.750000 1.000000 +vt 0.312500 1.000000 +vt 0.718750 1.000000 +vt 0.281250 1.000000 +vt 0.687500 1.000000 +vt 0.250000 1.000000 +vt 0.656250 1.000000 +vt 0.218750 1.000000 +vt 0.625000 1.000000 +vt 0.187500 1.000000 +vt 0.593750 1.000000 +vt 0.156250 1.000000 +vt 0.250000 0.496667 +vt 0.000000 0.500000 +vt 0.031250 0.500000 +vt 0.255226 0.495129 +vt 0.562500 0.500000 +vt 0.531250 0.500000 +vt 0.281250 0.500000 +vt 0.250000 0.500000 +vt 0.968750 0.500000 +vt 0.937500 0.500000 +vt 0.687500 0.500000 +vt 0.656250 0.500000 +vt 0.406250 0.500000 +vt 0.375000 0.500000 +vt 0.125000 0.500000 +vt 0.093750 0.500000 +vt 0.781250 0.500000 +vt 0.500000 0.500000 +vt 0.218750 0.500000 +vt 0.906250 0.500000 +vt 0.625000 0.500000 +vt 0.343750 0.500000 +vt 0.062500 0.500000 +vt 0.750000 0.500000 +vt 0.468750 0.500000 +vt 0.187500 0.500000 +vt 0.875000 0.500000 +vt 0.593750 0.500000 +vt 0.312500 0.500000 +vt 0.718750 0.500000 +vt 0.437500 0.500000 +vt 0.156250 0.500000 +vt 1.000000 0.500000 +vt 0.919706 0.080294 +vt 0.919706 0.080294 +vt 0.883337 0.050447 +vt 0.883337 0.050447 +vt 0.261052 0.490577 +vt 0.268054 0.483184 +vt 0.276765 0.473235 +vt 0.287649 0.461112 +vt 0.301090 0.447281 +vt 0.317371 0.432274 +vt 0.336667 0.416667 +vt 0.359037 0.401060 +vt 0.384423 0.386052 +vt 0.412649 0.372221 +vt 0.443431 0.360098 +vt 0.476388 0.350149 +vt 0.511052 0.342756 +vt 0.546893 0.338204 +vt 0.583333 0.336667 +vt 0.619774 0.338204 +vt 0.655615 0.342756 +vt 0.690279 0.350149 +vt 0.723235 0.360098 +vt 0.754018 0.372221 +vt 0.782244 0.386052 +vt 0.807629 0.401059 +vt 0.830000 0.416667 +vt 0.849296 0.432274 +vt 0.865577 0.447281 +vt 0.879017 0.461112 +vt 0.889902 0.473235 +vt 0.898612 0.483184 +vt 0.905614 0.490577 +vt 0.911441 0.495129 +vt 0.916667 0.496667 +vt 0.825476 0.487824 +vt 0.854131 0.490259 +vt 0.833333 0.493333 +vt 0.791667 0.491667 +vt 0.882786 0.492694 +vt 0.875000 0.495000 +vt 0.857787 0.476443 +vt 0.887156 0.457961 +vt 0.912255 0.433088 +vt 0.904804 0.446470 +vt 0.897353 0.459853 +vt 0.931919 0.402781 +vt 0.914285 0.422224 +vt 0.896651 0.441668 +vt 0.945192 0.368203 +vt 0.918654 0.394563 +vt 0.892115 0.420922 +vt 0.951365 0.330685 +vt 0.917342 0.364548 +vt 0.883319 0.398411 +vt 0.950000 0.291667 +vt 0.910000 0.333333 +vt 0.870000 0.375000 +vt 0.940949 0.252649 +vt 0.896509 0.302119 +vt 0.852069 0.351589 +vt 0.924359 0.215130 +vt 0.876987 0.272104 +vt 0.829616 0.329078 +vt 0.900669 0.180553 +vt 0.851785 0.244442 +vt 0.802901 0.308332 +vt 0.870588 0.150245 +vt 0.821470 0.220196 +vt 0.772353 0.290147 +vt 0.835072 0.125373 +vt 0.786808 0.200298 +vt 0.738543 0.275224 +vt 0.795287 0.106891 +vt 0.748729 0.185513 +vt 0.702172 0.264134 +vt 0.752560 0.095510 +vt 0.708298 0.176408 +vt 0.664036 0.257306 +vt 0.708333 0.091667 +vt 0.666667 0.173333 +vt 0.625000 0.255000 +vt 0.664107 0.095510 +vt 0.625035 0.176408 +vt 0.585964 0.257306 +vt 0.621380 0.106891 +vt 0.584604 0.185513 +vt 0.547828 0.264134 +vt 0.581594 0.125373 +vt 0.546525 0.200298 +vt 0.511457 0.275224 +vt 0.546079 0.150245 +vt 0.511863 0.220196 +vt 0.477647 0.290147 +vt 0.515998 0.180553 +vt 0.481548 0.244442 +vt 0.447099 0.308332 +vt 0.492307 0.215130 +vt 0.456346 0.272104 +vt 0.420384 0.329078 +vt 0.475718 0.252649 +vt 0.436824 0.302119 +vt 0.397931 0.351589 +vt 0.466667 0.291667 +vt 0.423333 0.333333 +vt 0.380000 0.375000 +vt 0.465301 0.330685 +vt 0.415991 0.364548 +vt 0.366681 0.398411 +vt 0.471474 0.368204 +vt 0.414679 0.394563 +vt 0.357885 0.420922 +vt 0.484748 0.402781 +vt 0.419048 0.422225 +vt 0.353349 0.441669 +vt 0.504412 0.433088 +vt 0.428530 0.446470 +vt 0.352647 0.459853 +vt 0.529511 0.457961 +vt 0.442359 0.466368 +vt 0.355207 0.474776 +vt 0.558880 0.476443 +vt 0.459604 0.481154 +vt 0.360328 0.485866 +vt 0.591191 0.487824 +vt 0.479202 0.490259 +vt 0.367214 0.492694 +vt 0.625000 0.491667 +vt 0.500000 0.493333 +vt 0.375000 0.495000 +vt 0.750000 0.490000 +vt 0.703179 0.485389 +vt 0.658156 0.471731 +vt 0.616663 0.449553 +vt 0.580295 0.419706 +vt 0.550447 0.383337 +vt 0.528269 0.341844 +vt 0.514612 0.296822 +vt 0.510000 0.250000 +vt 0.514611 0.203179 +vt 0.528269 0.158156 +vt 0.550447 0.116663 +vt 0.580294 0.080294 +vt 0.616663 0.050447 +vt 0.658156 0.028269 +vt 0.703178 0.014612 +vt 0.750000 0.010000 +vt 0.796822 0.014612 +vt 0.841844 0.028269 +vt 0.949553 0.116663 +vt 0.971731 0.158156 +vt 0.985388 0.203178 +vt 0.990000 0.250000 +vt 0.985388 0.296822 +vt 0.971731 0.341844 +vt 0.949553 0.383337 +vt 0.919706 0.419706 +vt 0.883337 0.449553 +vt 0.841844 0.471731 +vt 0.796822 0.485388 +vt 0.750000 0.490000 +vt 0.703179 0.485389 +vt 0.658156 0.471731 +vt 0.616663 0.449553 +vt 0.580295 0.419706 +vt 0.550447 0.383337 +vt 0.528269 0.341844 +vt 0.514612 0.296822 +vt 0.510000 0.250000 +vt 0.514611 0.203179 +vt 0.528269 0.158156 +vt 0.550447 0.116663 +vt 0.580294 0.080294 +vt 0.616663 0.050447 +vt 0.658156 0.028269 +vt 0.703178 0.014612 +vt 0.750000 0.010000 +vt 0.796822 0.014612 +vt 0.841844 0.028269 +vt 0.949553 0.116663 +vt 0.971731 0.158156 +vt 0.985388 0.203178 +vt 0.990000 0.250000 +vt 0.985388 0.296822 +vt 0.971731 0.341844 +vt 0.949553 0.383337 +vt 0.919706 0.419706 +vt 0.883337 0.449553 +vt 0.841844 0.471731 +vt 0.796822 0.485388 +vn 0.0000 -0.9952 0.0980 +vn 0.0000 -0.4714 -0.8819 +vn -0.4652 -0.8810 0.0868 +vn -0.1306 -0.6290 -0.7664 +vn 0.0000 -0.6344 -0.7730 +vn 0.0000 -0.9569 0.2903 +vn 0.0000 -0.7730 -0.6344 +vn 0.0000 -0.8819 0.4714 +vn 0.0000 0.0980 0.9952 +vn 0.0000 -0.8819 -0.4714 +vn 0.0000 -0.7730 0.6344 +vn 0.0000 0.2903 0.9569 +vn 0.0000 -0.9569 -0.2903 +vn 0.0000 -0.6344 0.7730 +vn 0.0000 0.4714 0.8819 +vn 0.0000 -0.9952 -0.0980 +vn 0.0000 -0.4714 0.8819 +vn -0.0000 0.6344 0.7730 +vn 0.0000 -0.2903 0.9569 +vn -0.0000 0.7730 0.6344 +vn 0.0000 -0.0980 0.9952 +vn -0.0000 0.8819 0.4714 +vn -0.0000 0.9569 0.2903 +vn -0.0000 0.9952 0.0980 +vn -0.0000 0.9952 -0.0980 +vn -0.0000 0.9569 -0.2903 +vn -0.0000 0.8819 -0.4714 +vn -0.0000 0.7730 -0.6344 +vn -0.0000 0.6344 -0.7730 +vn -0.0000 0.4714 -0.8819 +vn -0.0000 0.2903 -0.9569 +vn -0.0000 0.0980 -0.9952 +vn -0.0000 -0.0980 -0.9952 +vn -0.0000 -0.2903 -0.9569 +vn 0.1948 -0.2847 0.9386 +vn -0.1306 0.9487 0.2878 +vn -0.1306 -0.7664 -0.6290 +vn -0.1306 0.9867 0.0972 +vn -0.1306 -0.8744 -0.4674 +vn -0.1306 0.9867 -0.0972 +vn -0.1306 -0.9487 -0.2878 +vn -0.1306 0.9487 -0.2878 +vn -0.1306 -0.9867 -0.0972 +vn -0.1306 0.8744 -0.4674 +vn -0.1306 -0.9867 0.0972 +vn -0.1306 0.7664 -0.6290 +vn -0.1306 -0.9487 0.2878 +vn -0.1306 0.6290 -0.7664 +vn -0.1306 -0.8744 0.4674 +vn -0.1306 0.4674 -0.8744 +vn -0.1306 0.0972 0.9867 +vn -0.1306 -0.7664 0.6290 +vn -0.1306 0.2878 -0.9487 +vn -0.1306 0.2878 0.9487 +vn -0.1306 -0.6290 0.7664 +vn -0.1306 0.0972 -0.9867 +vn -0.1306 0.4674 0.8744 +vn -0.1306 -0.4674 0.8744 +vn -0.1306 -0.0972 -0.9867 +vn -0.1306 0.6290 0.7664 +vn -0.1306 -0.2878 0.9487 +vn -0.1306 -0.2878 -0.9487 +vn -0.1306 0.7664 0.6290 +vn -0.1306 -0.0972 0.9867 +vn -0.1306 -0.4674 -0.8744 +vn -0.1306 0.8744 0.4674 +vn 0.8252 -0.4366 -0.3583 +vn 0.1948 -0.2847 -0.9386 +vn 0.1948 0.7582 0.6222 +vn 0.1948 -0.0961 0.9761 +vn 0.1948 -0.4624 -0.8650 +vn 0.1948 0.8650 0.4624 +vn 0.1948 -0.6222 -0.7582 +vn 0.1948 0.9386 0.2847 +vn 0.1948 -0.7582 -0.6222 +vn 0.1948 0.9761 0.0961 +vn 0.1948 -0.8650 -0.4624 +vn 0.1948 0.9761 -0.0961 +vn 0.1948 -0.9386 -0.2847 +vn 0.1948 0.9386 -0.2847 +vn 0.1948 -0.9761 -0.0961 +vn 0.1948 0.8650 -0.4624 +vn 0.1948 -0.9761 0.0961 +vn 0.1948 0.7582 -0.6222 +vn 0.1948 -0.9386 0.2847 +vn 0.1948 0.6222 -0.7582 +vn 0.1948 -0.8650 0.4624 +vn 0.1948 0.4624 -0.8650 +vn 0.1948 0.0961 0.9761 +vn 0.1948 -0.7582 0.6222 +vn 0.1948 0.2847 -0.9386 +vn 0.1948 0.2847 0.9386 +vn 0.1948 -0.6222 0.7582 +vn 0.1948 0.0961 -0.9761 +vn 0.1948 0.4624 0.8650 +vn 0.1948 -0.4624 0.8650 +vn 0.1948 -0.0961 -0.9761 +vn 0.1948 0.6222 0.7582 +vn 0.8252 0.5621 0.0554 +vn 0.8252 -0.4981 -0.2662 +vn 0.8252 0.5621 -0.0554 +vn 0.8253 -0.5404 -0.1640 +vn 0.8252 0.5405 -0.1639 +vn 0.8252 -0.5621 -0.0554 +vn 0.8252 0.4981 -0.2662 +vn 0.8252 -0.5621 0.0554 +vn 0.8253 0.4365 -0.3583 +vn 0.8252 -0.5405 0.1639 +vn 0.8252 0.3583 -0.4366 +vn 0.8252 -0.4981 0.2662 +vn 0.8252 0.2663 -0.4981 +vn 0.8252 0.0554 0.5621 +vn 0.8252 -0.4366 0.3583 +vn 0.8252 0.1639 -0.5405 +vn 0.8252 0.1640 0.5405 +vn 0.8252 -0.3583 0.4366 +vn 0.8252 0.0554 -0.5621 +vn 0.8252 0.2662 0.4981 +vn 0.8252 -0.2663 0.4981 +vn 0.8252 -0.0554 -0.5621 +vn 0.8252 0.3583 0.4366 +vn 0.8252 -0.1640 0.5405 +vn 0.8252 -0.1640 -0.5405 +vn 0.8252 0.4366 0.3583 +vn 0.8252 -0.0553 0.5621 +vn 0.8252 -0.2663 -0.4981 +vn 0.8252 0.4981 0.2662 +vn 0.8252 -0.3583 -0.4366 +vn 0.8252 0.5405 0.1639 +vn 0.3943 -0.2668 -0.8794 +vn 0.3943 -0.0901 -0.9145 +vn 0.3943 0.0901 -0.9145 +vn 0.3943 0.2668 -0.8794 +vn 0.3943 0.4332 -0.8105 +vn 0.3943 0.5830 -0.7104 +vn 0.3943 0.7104 -0.5830 +vn 0.3943 0.8105 -0.4332 +vn 0.3943 0.8794 -0.2668 +vn 0.3943 0.9145 -0.0901 +vn 0.3943 0.9145 0.0901 +vn 0.3943 0.8794 0.2668 +vn 0.3943 0.8105 0.4332 +vn 0.3943 -0.0901 0.9145 +vn 0.3943 0.7104 0.5830 +vn 0.3943 -0.2668 0.8794 +vn 0.3943 0.5830 0.7104 +vn 0.3943 -0.4332 0.8105 +vn 0.3943 0.4332 0.8105 +vn 0.3943 -0.5830 0.7104 +vn 0.3943 0.2668 0.8794 +vn 0.3943 -0.7104 0.5830 +vn 0.3943 0.0901 0.9145 +vn 0.3943 -0.8105 0.4332 +vn 0.3943 -0.8794 0.2668 +vn 0.3943 -0.9145 0.0901 +vn 0.3943 -0.9145 -0.0901 +vn 0.3943 -0.8794 -0.2668 +vn 0.3943 -0.8105 -0.4332 +vn 0.3943 -0.7104 -0.5830 +vn 0.3943 -0.5830 -0.7104 +vn 0.3943 -0.4332 -0.8105 +vn -0.3943 -0.4332 -0.8105 +vn 0.4847 -0.4123 -0.7714 +vn 0.5859 -0.3820 -0.7147 +vn -0.4847 -0.4123 -0.7714 +vn -0.3943 -0.5830 -0.7104 +vn 0.4847 -0.5549 -0.6761 +vn 0.5859 -0.5141 -0.6264 +vn -0.4847 -0.5549 -0.6761 +vn -0.3943 -0.7104 -0.5830 +vn 0.4847 -0.6761 -0.5549 +vn 0.5859 -0.6264 -0.5141 +vn -0.4847 -0.6761 -0.5549 +vn -0.3943 -0.8105 -0.4332 +vn 0.4847 -0.7714 -0.4123 +vn 0.5859 -0.7147 -0.3820 +vn -0.4847 -0.7714 -0.4123 +vn -0.3943 -0.8794 -0.2668 +vn 0.4847 -0.8370 -0.2539 +vn 0.5859 -0.7755 -0.2352 +vn -0.4847 -0.8370 -0.2539 +vn -0.3943 -0.9145 -0.0901 +vn 0.4847 -0.8705 -0.0857 +vn 0.5859 -0.8065 -0.0794 +vn -0.4847 -0.8705 -0.0857 +vn -0.3943 -0.9145 0.0901 +vn 0.4847 -0.8705 0.0857 +vn 0.5859 -0.8064 0.0794 +vn 0.5859 -0.8065 0.0794 +vn -0.4847 -0.8705 0.0857 +vn -0.3943 -0.8794 0.2668 +vn 0.4847 -0.8370 0.2539 +vn 0.5859 -0.7755 0.2352 +vn -0.4847 -0.8370 0.2539 +vn -0.3943 -0.8105 0.4332 +vn 0.4847 -0.7714 0.4123 +vn 0.5859 -0.7147 0.3820 +vn -0.4847 -0.7714 0.4123 +vn -0.3943 0.0901 0.9145 +vn 0.4847 0.0857 0.8705 +vn 0.5859 0.0794 0.8065 +vn 0.5859 0.0795 0.8065 +vn -0.4847 0.0857 0.8705 +vn -0.3943 -0.7104 0.5830 +vn 0.4847 -0.6761 0.5549 +vn 0.5859 -0.6264 0.5141 +vn -0.4847 -0.6761 0.5549 +vn -0.3943 0.2668 0.8794 +vn 0.4847 0.2539 0.8370 +vn 0.5859 0.2352 0.7755 +vn -0.4847 0.2539 0.8370 +vn -0.3943 -0.5830 0.7104 +vn 0.4847 -0.5549 0.6761 +vn 0.5859 -0.5141 0.6264 +vn -0.4847 -0.5549 0.6761 +vn -0.3943 0.4332 0.8105 +vn 0.4847 0.4123 0.7714 +vn 0.5859 0.3820 0.7147 +vn -0.4847 0.4123 0.7714 +vn -0.3943 -0.4332 0.8105 +vn 0.4847 -0.4123 0.7714 +vn 0.5859 -0.3820 0.7147 +vn -0.4847 -0.4123 0.7714 +vn -0.3943 0.5830 0.7104 +vn 0.4847 0.5549 0.6761 +vn 0.5859 0.5141 0.6264 +vn -0.4847 0.5549 0.6761 +vn -0.3943 -0.2668 0.8794 +vn 0.4847 -0.2539 0.8370 +vn 0.5859 -0.2352 0.7755 +vn -0.4847 -0.2539 0.8370 +vn -0.3943 0.7104 0.5830 +vn 0.4847 0.6761 0.5549 +vn 0.5859 0.6264 0.5141 +vn -0.4847 0.6761 0.5549 +vn -0.3943 -0.0901 0.9145 +vn 0.4847 -0.0857 0.8705 +vn 0.5859 -0.0794 0.8065 +vn 0.5859 -0.0795 0.8065 +vn -0.4847 -0.0857 0.8705 +vn -0.3943 0.8105 0.4332 +vn 0.4847 0.7714 0.4123 +vn 0.5859 0.7147 0.3820 +vn -0.4847 0.7714 0.4123 +vn -0.3943 0.8794 0.2668 +vn 0.4847 0.8370 0.2539 +vn 0.5859 0.7755 0.2352 +vn -0.4847 0.8370 0.2539 +vn -0.3943 0.9145 0.0901 +vn 0.4847 0.8705 0.0857 +vn 0.5859 0.8065 0.0794 +vn -0.4847 0.8705 0.0857 +vn -0.3943 0.9145 -0.0901 +vn 0.4847 0.8705 -0.0857 +vn 0.5859 0.8065 -0.0794 +vn -0.4847 0.8705 -0.0857 +vn -0.3943 0.8794 -0.2668 +vn 0.4847 0.8370 -0.2539 +vn 0.5859 0.7755 -0.2352 +vn -0.4847 0.8370 -0.2539 +vn -0.3943 0.8105 -0.4332 +vn 0.4847 0.7714 -0.4123 +vn 0.5859 0.7147 -0.3820 +vn -0.4847 0.7714 -0.4123 +vn -0.3943 0.7104 -0.5830 +vn 0.4847 0.6761 -0.5549 +vn 0.5859 0.6264 -0.5141 +vn -0.4847 0.6761 -0.5549 +vn -0.3943 0.5830 -0.7104 +vn 0.4847 0.5549 -0.6761 +vn 0.5859 0.5141 -0.6264 +vn -0.4847 0.5549 -0.6761 +vn -0.3943 0.4332 -0.8105 +vn 0.4847 0.4123 -0.7714 +vn 0.5859 0.3820 -0.7147 +vn -0.4847 0.4123 -0.7714 +vn -0.3943 0.2668 -0.8794 +vn 0.4847 0.2539 -0.8370 +vn 0.5859 0.2352 -0.7755 +vn -0.4847 0.2539 -0.8370 +vn -0.3943 0.0901 -0.9145 +vn 0.4847 0.0857 -0.8705 +vn 0.5859 0.0794 -0.8065 +vn -0.4847 0.0857 -0.8705 +vn -0.3943 -0.0901 -0.9145 +vn 0.4847 -0.0857 -0.8705 +vn 0.5859 -0.0794 -0.8065 +vn -0.4847 -0.0857 -0.8705 +vn -0.3943 -0.2668 -0.8794 +vn 0.4847 -0.2539 -0.8370 +vn 0.5859 -0.2352 -0.7755 +vn -0.4847 -0.2539 -0.8370 +vn -0.5859 -0.2352 -0.7755 +vn -0.5859 -0.0794 -0.8065 +vn -0.5859 0.0794 -0.8065 +vn -0.5859 0.2352 -0.7755 +vn -0.5859 0.3820 -0.7147 +vn -0.5859 0.5141 -0.6264 +vn -0.5859 0.6264 -0.5141 +vn -0.5859 0.7147 -0.3820 +vn -0.5859 0.7755 -0.2352 +vn -0.5859 0.8065 -0.0794 +vn -0.5859 0.8065 0.0794 +vn -0.5859 0.7755 0.2352 +vn -0.5859 0.7147 0.3820 +vn -0.5859 -0.0794 0.8065 +vn -0.5859 0.6264 0.5141 +vn -0.5859 -0.2352 0.7755 +vn -0.5859 0.5141 0.6264 +vn -0.5859 -0.3820 0.7147 +vn -0.5859 0.3820 0.7147 +vn -0.5859 -0.5141 0.6264 +vn -0.5859 0.2352 0.7755 +vn -0.5859 -0.6264 0.5141 +vn -0.5859 0.0794 0.8065 +vn -0.5859 -0.7147 0.3820 +vn -0.5859 -0.7755 0.2352 +vn -0.5859 -0.8065 0.0794 +vn -0.5859 -0.8064 -0.0794 +vn -0.5859 -0.7755 -0.2352 +vn -0.5859 -0.7147 -0.3820 +vn -0.5859 -0.6264 -0.5141 +vn -0.5859 -0.5141 -0.6264 +vn -0.5859 -0.3820 -0.7147 +vn -0.5859 -0.2353 -0.7755 +vn -0.5859 -0.8065 -0.0794 +vn -0.5859 0.0794 -0.8064 +vn -0.5860 0.8064 -0.0794 +vn -0.5859 0.8064 0.0794 +vn -0.5860 -0.8064 -0.0794 +vn -0.5860 -0.7755 -0.2352 +vn -0.6480 -0.7580 -0.0747 +vn -0.6480 -0.7288 -0.2211 +vn -0.6480 -0.6717 -0.3590 +vn -0.6480 -0.5888 -0.4832 +vn -0.6480 -0.4832 -0.5888 +vn -0.6480 -0.3590 -0.6717 +vn -0.6480 -0.2211 -0.7288 +vn -0.6480 -0.0747 -0.7580 +vn -0.6480 0.0747 -0.7580 +vn -0.6480 0.2211 -0.7288 +vn -0.6480 0.3590 -0.6717 +vn -0.6480 0.4832 -0.5888 +vn -0.6480 0.5888 -0.4832 +vn -0.6480 0.6717 -0.3590 +vn -0.6480 0.7288 -0.2211 +vn -0.6480 0.7580 -0.0747 +vn -0.6480 0.7580 0.0747 +vn -0.6480 0.7288 0.2211 +vn -0.6480 0.6717 0.3590 +vn -0.6480 -0.0747 0.7580 +vn -0.6480 0.5888 0.4832 +vn -0.6480 -0.2211 0.7288 +vn -0.6480 0.4832 0.5888 +vn -0.6480 -0.3590 0.6717 +vn -0.6480 0.3590 0.6717 +vn -0.6480 -0.4832 0.5888 +vn -0.6480 0.2211 0.7288 +vn -0.6480 -0.5888 0.4832 +vn -0.6480 0.0747 0.7580 +vn -0.6480 -0.6717 0.3590 +vn -0.6480 -0.7288 0.2211 +vn -0.6480 -0.7580 0.0747 +vn 0.6480 -0.7580 0.0747 +vn -0.2632 -0.9601 0.0946 +vn -0.5813 -0.8097 0.0798 +vn -0.5814 -0.8097 0.0798 +vn 0.2632 -0.9601 0.0946 +vn 0.6480 -0.7289 0.2211 +vn -0.2632 -0.9232 0.2801 +vn -0.5813 -0.7786 0.2362 +vn 0.2632 -0.9232 0.2801 +vn 0.6480 -0.6717 0.3590 +vn -0.2632 -0.8508 0.4548 +vn -0.5813 -0.7176 0.3836 +vn 0.2632 -0.8508 0.4548 +vn 0.6480 0.0747 0.7580 +vn -0.2632 0.0946 0.9601 +vn -0.5813 0.0798 0.8097 +vn -0.5814 0.0798 0.8097 +vn 0.2632 0.0946 0.9601 +vn 0.6480 -0.5888 0.4832 +vn -0.2632 -0.7458 0.6120 +vn -0.5813 -0.6290 0.5162 +vn 0.2632 -0.7458 0.6120 +vn 0.6480 0.2211 0.7289 +vn -0.2632 0.2801 0.9232 +vn -0.5813 0.2362 0.7786 +vn 0.2632 0.2801 0.9232 +vn 0.6480 -0.4832 0.5888 +vn -0.2632 -0.6120 0.7458 +vn -0.5813 -0.5162 0.6290 +vn 0.2632 -0.6120 0.7458 +vn 0.6480 0.3590 0.6717 +vn -0.2632 0.4548 0.8508 +vn -0.5813 0.3836 0.7176 +vn 0.2632 0.4548 0.8508 +vn 0.6480 -0.3590 0.6717 +vn -0.2632 -0.4548 0.8508 +vn -0.5813 -0.3836 0.7176 +vn 0.2632 -0.4548 0.8508 +vn 0.6480 0.4832 0.5888 +vn -0.2632 0.6120 0.7458 +vn -0.5813 0.5162 0.6290 +vn 0.2632 0.6120 0.7458 +vn 0.6480 -0.2211 0.7289 +vn -0.2632 -0.2800 0.9232 +vn -0.5813 -0.2362 0.7786 +vn 0.2632 -0.2800 0.9232 +vn 0.6480 0.5888 0.4832 +vn -0.2632 0.7458 0.6120 +vn -0.5813 0.6290 0.5162 +vn 0.2632 0.7458 0.6120 +vn 0.6480 -0.0747 0.7580 +vn -0.2632 -0.0946 0.9601 +vn -0.5813 -0.0798 0.8097 +vn -0.5814 -0.0798 0.8097 +vn 0.2632 -0.0946 0.9601 +vn 0.6480 0.6717 0.3590 +vn -0.2632 0.8508 0.4548 +vn -0.5813 0.7176 0.3836 +vn 0.2632 0.8508 0.4548 +vn 0.6480 0.7289 0.2211 +vn -0.2632 0.9232 0.2800 +vn -0.5813 0.7786 0.2362 +vn 0.2632 0.9232 0.2801 +vn 0.6480 0.7580 0.0747 +vn -0.2632 0.9601 0.0946 +vn -0.5813 0.8097 0.0798 +vn 0.2632 0.9601 0.0946 +vn 0.6480 0.7580 -0.0747 +vn -0.2632 0.9601 -0.0946 +vn -0.5813 0.8097 -0.0798 +vn 0.2632 0.9601 -0.0946 +vn 0.6480 0.7289 -0.2211 +vn -0.2632 0.9232 -0.2800 +vn -0.5813 0.7786 -0.2362 +vn 0.2632 0.9232 -0.2801 +vn 0.6480 0.6717 -0.3590 +vn -0.2632 0.8508 -0.4548 +vn -0.5813 0.7176 -0.3836 +vn 0.2632 0.8508 -0.4548 +vn 0.6480 0.5888 -0.4832 +vn -0.2632 0.7458 -0.6120 +vn -0.5813 0.6290 -0.5162 +vn 0.2632 0.7458 -0.6120 +vn 0.6480 0.4832 -0.5888 +vn -0.2632 0.6120 -0.7458 +vn -0.5813 0.5162 -0.6290 +vn 0.2632 0.6120 -0.7458 +vn 0.6480 0.3590 -0.6717 +vn -0.2632 0.4548 -0.8508 +vn -0.5813 0.3836 -0.7176 +vn 0.2632 0.4548 -0.8508 +vn 0.6480 0.2211 -0.7289 +vn -0.2632 0.2800 -0.9232 +vn -0.5814 0.2362 -0.7786 +vn 0.2632 0.2800 -0.9232 +vn 0.6480 0.0747 -0.7580 +vn -0.2632 0.0946 -0.9601 +vn -0.5814 0.0798 -0.8097 +vn 0.2632 0.0946 -0.9601 +vn 0.6480 -0.0747 -0.7580 +vn -0.2632 -0.0946 -0.9601 +vn -0.5813 -0.0798 -0.8097 +vn 0.2632 -0.0946 -0.9601 +vn 0.6480 -0.2211 -0.7289 +vn -0.2632 -0.2801 -0.9232 +vn -0.5814 -0.2362 -0.7786 +vn -0.5813 -0.2362 -0.7786 +vn 0.2632 -0.2801 -0.9232 +vn 0.6480 -0.3590 -0.6717 +vn -0.2632 -0.4548 -0.8508 +vn -0.5813 -0.3836 -0.7176 +vn 0.2632 -0.4548 -0.8508 +vn 0.6480 -0.4832 -0.5888 +vn -0.2632 -0.6120 -0.7458 +vn -0.5814 -0.5162 -0.6290 +vn -0.5813 -0.5162 -0.6290 +vn 0.2632 -0.6120 -0.7458 +vn 0.6480 -0.5888 -0.4832 +vn -0.2632 -0.7458 -0.6120 +vn -0.5813 -0.6290 -0.5162 +vn 0.2632 -0.7458 -0.6120 +vn 0.6480 -0.6717 -0.3590 +vn -0.2632 -0.8508 -0.4548 +vn -0.5813 -0.7176 -0.3836 +vn 0.2632 -0.8508 -0.4548 +vn 0.6480 -0.7289 -0.2211 +vn -0.2632 -0.9232 -0.2800 +vn -0.5813 -0.7786 -0.2362 +vn 0.2632 -0.9232 -0.2800 +vn 0.6480 -0.7580 -0.0747 +vn -0.2632 -0.9601 -0.0946 +vn -0.5813 -0.8097 -0.0798 +vn -0.5814 -0.8097 -0.0798 +vn 0.2632 -0.9601 -0.0946 +vn 0.5813 -0.8097 -0.0797 +vn 0.5813 -0.7786 -0.2362 +vn 0.5813 -0.7176 -0.3836 +vn 0.5813 -0.6290 -0.5162 +vn 0.5813 -0.5162 -0.6290 +vn 0.5813 -0.3836 -0.7176 +vn 0.5813 -0.2362 -0.7786 +vn 0.5813 -0.0798 -0.8097 +vn 0.5813 0.0798 -0.8097 +vn 0.5813 0.2362 -0.7786 +vn 0.5813 0.3836 -0.7176 +vn 0.5813 0.5162 -0.6290 +vn 0.5813 0.6290 -0.5162 +vn 0.5813 0.7176 -0.3836 +vn 0.5813 0.7786 -0.2362 +vn 0.5814 0.8097 -0.0798 +vn 0.5813 0.8097 0.0798 +vn 0.5813 0.7786 0.2362 +vn 0.5814 0.7176 0.3836 +vn 0.5813 -0.0797 0.8097 +vn 0.5813 0.6290 0.5162 +vn 0.5813 -0.2362 0.7786 +vn 0.5813 0.5162 0.6290 +vn 0.5813 -0.3836 0.7176 +vn 0.5813 0.3836 0.7176 +vn 0.5813 -0.5162 0.6290 +vn 0.5813 0.2362 0.7786 +vn 0.5813 -0.6290 0.5162 +vn 0.5813 0.0797 0.8097 +vn 0.5814 -0.7176 0.3836 +vn 0.5814 -0.7786 0.2362 +vn 0.5813 -0.8097 0.0797 +vn 0.5813 0.8097 -0.0798 +vn 0.5813 0.7176 0.3836 +vn 0.5813 -0.7176 0.3836 +vn 0.5813 -0.7786 0.2362 +vn -0.1725 -0.9426 0.2859 +vn -0.4652 0.6843 -0.5616 +vn -0.4652 -0.8471 0.2570 +vn -0.4652 0.5616 -0.6843 +vn -0.4652 -0.7807 0.4173 +vn -0.4652 0.4173 -0.7807 +vn -0.4652 0.0868 0.8810 +vn -0.4652 -0.6843 0.5616 +vn -0.4652 0.2570 -0.8471 +vn -0.4652 0.2570 0.8471 +vn -0.4652 -0.5616 0.6843 +vn -0.4652 0.0868 -0.8810 +vn -0.4652 0.4173 0.7807 +vn -0.4652 -0.4173 0.7807 +vn -0.4652 -0.0868 -0.8810 +vn -0.4652 0.5616 0.6843 +vn -0.4652 -0.2570 0.8471 +vn -0.4652 -0.2570 -0.8471 +vn -0.4652 0.6843 0.5616 +vn -0.4652 -0.0868 0.8810 +vn -0.4652 -0.4173 -0.7807 +vn -0.4652 0.7807 0.4173 +vn -0.4652 -0.5616 -0.6843 +vn -0.4652 0.8471 0.2570 +vn -0.4652 -0.6843 -0.5616 +vn -0.4652 0.8810 0.0868 +vn -0.4652 -0.7807 -0.4173 +vn -0.4652 0.8810 -0.0868 +vn -0.4652 -0.8471 -0.2570 +vn -0.4652 0.8471 -0.2570 +vn -0.4652 -0.8810 -0.0868 +vn -0.4652 0.7807 -0.4173 +vn 0.0000 0.0000 1.0000 +vn -0.1725 0.6249 -0.7614 +vn -0.1725 -0.8687 0.4643 +vn -0.1725 0.4643 -0.8687 +vn -0.1725 0.0965 0.9803 +vn -0.1725 -0.7614 0.6249 +vn -0.1725 0.2859 -0.9426 +vn -0.1725 0.2859 0.9426 +vn -0.1725 -0.6249 0.7614 +vn -0.1725 0.0965 -0.9803 +vn -0.1725 0.4643 0.8687 +vn -0.1725 -0.4643 0.8687 +vn -0.1725 -0.0965 -0.9803 +vn -0.1725 0.6249 0.7614 +vn -0.1725 -0.2859 0.9426 +vn -0.1725 -0.2859 -0.9426 +vn -0.1725 0.7614 0.6249 +vn -0.1725 -0.0965 0.9803 +vn -0.1725 -0.4643 -0.8687 +vn -0.1725 0.8687 0.4643 +vn -0.1725 -0.6249 -0.7614 +vn -0.1725 0.9426 0.2859 +vn -0.1725 -0.7614 -0.6249 +vn -0.1725 0.9803 0.0965 +vn -0.1725 -0.8687 -0.4643 +vn -0.1725 0.9803 -0.0965 +vn -0.1725 -0.9426 -0.2859 +vn -0.1725 0.9426 -0.2859 +vn -0.1725 -0.9803 -0.0965 +vn -0.1725 0.8687 -0.4643 +vn -0.1725 -0.9803 0.0965 +vn -0.1725 0.7614 -0.6249 +vn -0.0098 0.7730 -0.6344 +vn -0.0098 -0.9951 0.0980 +vn -0.0098 0.8819 -0.4714 +vn -0.0098 -0.9951 -0.0980 +vn -0.0098 0.9569 -0.2903 +vn -0.0098 -0.9569 -0.2903 +vn -0.0098 0.9951 -0.0980 +vn -0.0098 -0.8819 -0.4714 +vn -0.0098 0.9951 0.0980 +vn -0.0098 -0.7730 -0.6344 +vn -0.0098 0.9569 0.2903 +vn -0.0098 -0.6344 -0.7730 +vn -0.0098 0.8819 0.4714 +vn -0.0098 -0.4714 -0.8819 +vn -0.0098 -0.0980 0.9951 +vn -0.0098 0.7730 0.6344 +vn -0.0098 -0.2903 -0.9569 +vn -0.0098 -0.2903 0.9569 +vn -0.0098 0.6344 0.7730 +vn -0.0098 -0.0980 -0.9951 +vn -0.0098 -0.4714 0.8819 +vn -0.0098 0.4714 0.8819 +vn -0.0098 0.0980 -0.9951 +vn -0.0098 -0.6344 0.7730 +vn -0.0098 0.2903 0.9569 +vn -0.0098 0.2903 -0.9569 +vn -0.0098 -0.7730 0.6344 +vn -0.0098 0.0980 0.9951 +vn -0.0098 0.4714 -0.8819 +vn -0.0098 -0.8819 0.4714 +vn -0.0098 0.6344 -0.7730 +vn -0.0098 -0.9569 0.2903 +vn 0.2072 0.7562 -0.6206 +vn 0.2072 -0.9736 0.0959 +vn 0.2072 0.8628 -0.4612 +vn 0.2072 -0.9736 -0.0959 +vn 0.2072 0.9362 -0.2840 +vn 0.2072 -0.9362 -0.2840 +vn 0.2072 0.9736 -0.0959 +vn 0.2072 -0.8628 -0.4612 +vn 0.2072 0.9736 0.0959 +vn 0.2072 -0.7562 -0.6206 +vn 0.2072 0.9362 0.2840 +vn 0.2072 -0.6206 -0.7562 +vn 0.2072 0.8628 0.4612 +vn 0.2072 -0.4612 -0.8628 +vn 0.2072 -0.0959 0.9736 +vn 0.2072 0.7562 0.6206 +vn 0.2072 -0.2840 -0.9362 +vn 0.2072 -0.2840 0.9362 +vn 0.2072 0.6206 0.7562 +vn 0.2072 -0.0959 -0.9736 +vn 0.2072 -0.4612 0.8628 +vn 0.2072 0.4612 0.8628 +vn 0.2072 0.0959 -0.9736 +vn 0.2072 -0.6206 0.7562 +vn 0.2072 0.2840 0.9362 +vn 0.2072 0.2840 -0.9362 +vn 0.2072 -0.7562 0.6206 +vn 0.2072 0.0959 0.9736 +vn 0.2072 0.4612 -0.8628 +vn 0.2072 -0.8628 0.4612 +vn 0.2072 0.6206 -0.7562 +vn 0.2072 -0.9362 0.2840 +vn -0.0596 -0.9552 0.2898 +vn -0.0596 0.6333 -0.7716 +vn -0.0596 -0.8804 0.4706 +vn -0.0596 0.4706 -0.8804 +vn -0.0596 0.0978 0.9934 +vn -0.0596 -0.7716 0.6333 +vn -0.0596 0.2898 -0.9552 +vn -0.0596 0.2898 0.9552 +vn -0.0596 -0.6333 0.7716 +vn -0.0596 0.0978 -0.9934 +vn -0.0596 0.4706 0.8804 +vn -0.0596 -0.4706 0.8804 +vn -0.0596 -0.0978 -0.9934 +vn -0.0596 0.6333 0.7716 +vn -0.0596 -0.2898 0.9552 +vn -0.0596 -0.2898 -0.9552 +vn -0.0596 0.7716 0.6333 +vn -0.0596 -0.0978 0.9934 +vn -0.0596 -0.4706 -0.8804 +vn -0.0596 0.8804 0.4706 +vn -0.0596 -0.6333 -0.7716 +vn -0.0596 0.9552 0.2898 +vn -0.0596 -0.7716 -0.6333 +vn -0.0596 0.9934 0.0978 +vn -0.0596 -0.8804 -0.4706 +vn -0.0596 0.9934 -0.0978 +vn -0.0596 -0.9552 -0.2898 +vn -0.0596 0.9552 -0.2898 +vn -0.0596 -0.9934 -0.0978 +vn -0.0596 0.8804 -0.4706 +vn -0.0596 -0.9934 0.0978 +vn -0.0596 0.7716 -0.6333 +vn -0.3698 -0.8891 0.2697 +vn -0.3698 0.5894 -0.7182 +vn -0.3698 -0.8194 0.4380 +vn -0.3698 0.4380 -0.8194 +vn -0.3698 0.0911 0.9246 +vn -0.3698 -0.7182 0.5894 +vn -0.3698 0.2697 -0.8891 +vn -0.3698 0.2697 0.8891 +vn -0.3698 -0.5894 0.7182 +vn -0.3698 0.0911 -0.9246 +vn -0.3698 0.4380 0.8194 +vn -0.3698 -0.4380 0.8194 +vn -0.3698 -0.0911 -0.9246 +vn -0.3698 0.5894 0.7182 +vn -0.3698 -0.2697 0.8891 +vn -0.3698 -0.2697 -0.8891 +vn -0.3698 0.7182 0.5894 +vn -0.3698 -0.0911 0.9246 +vn -0.3698 -0.4380 -0.8194 +vn -0.3698 0.8194 0.4380 +vn -0.3698 -0.5894 -0.7182 +vn -0.3698 0.8891 0.2697 +vn -0.3698 -0.7182 -0.5894 +vn -0.3698 0.9246 0.0911 +vn -0.3698 -0.8194 -0.4380 +vn -0.3698 0.9246 -0.0911 +vn -0.3698 -0.8891 -0.2697 +vn -0.3698 0.8891 -0.2697 +vn -0.3698 -0.9246 -0.0911 +vn -0.3698 0.8194 -0.4380 +vn -0.3698 -0.9246 0.0911 +vn -0.3698 0.7182 -0.5894 +vn -0.0191 0.7729 -0.6343 +vn 0.4373 0.6952 -0.5705 +vn 0.4880 0.6747 -0.5537 +vn -0.4880 0.6747 -0.5537 +vn 0.5006 0.6692 -0.5492 +vn -0.4978 0.6704 -0.5502 +vn -0.0191 -0.9950 0.0980 +vn 0.4373 -0.8950 0.0882 +vn 0.4880 -0.8686 0.0856 +vn -0.4880 -0.8686 0.0856 +vn 0.4806 -0.8727 0.0859 +vn -0.4778 -0.8742 0.0861 +vn 0.4880 -0.8686 0.0855 +vn -0.0191 0.8818 -0.4713 +vn 0.4373 0.7931 -0.4239 +vn 0.4880 0.7698 -0.4115 +vn -0.4880 0.7698 -0.4115 +vn 0.5001 0.7637 -0.4082 +vn -0.4974 0.7651 -0.4090 +vn -0.4880 0.7698 -0.4114 +vn -0.0191 -0.9950 -0.0980 +vn 0.4373 -0.8950 -0.0881 +vn 0.4880 -0.8686 -0.0856 +vn -0.4880 -0.8686 -0.0856 +vn 0.4822 -0.8719 -0.0859 +vn -0.4794 -0.8733 -0.0860 +vn -0.0191 0.9568 -0.2902 +vn 0.4373 0.8606 -0.2611 +vn 0.4880 0.8352 -0.2534 +vn -0.4880 0.8352 -0.2534 +vn -0.4880 0.8353 -0.2534 +vn 0.4993 0.8291 -0.2515 +vn -0.4965 0.8306 -0.2520 +vn 0.4880 0.8353 -0.2534 +vn -0.0191 -0.9568 -0.2902 +vn 0.4373 -0.8606 -0.2611 +vn 0.4880 -0.8353 -0.2534 +vn -0.4880 -0.8352 -0.2534 +vn 0.4880 -0.8352 -0.2534 +vn -0.4880 -0.8353 -0.2534 +vn 0.4840 -0.8374 -0.2540 +vn -0.4813 -0.8388 -0.2544 +vn -0.0191 0.9950 -0.0980 +vn 0.4373 0.8950 -0.0882 +vn 0.4880 0.8686 -0.0856 +vn -0.4880 0.8686 -0.0856 +vn 0.4981 0.8630 -0.0850 +vn -0.4953 0.8645 -0.0851 +vn -0.0191 -0.8818 -0.4713 +vn 0.4373 -0.7931 -0.4239 +vn 0.4880 -0.7698 -0.4115 +vn -0.4880 -0.7698 -0.4115 +vn 0.4880 -0.7698 -0.4114 +vn 0.4861 -0.7707 -0.4120 +vn -0.4834 -0.7720 -0.4127 +vn -0.4880 -0.7698 -0.4114 +vn -0.0191 0.9950 0.0980 +vn 0.4373 0.8950 0.0882 +vn 0.4880 0.8686 0.0856 +vn -0.4880 0.8686 0.0856 +vn 0.4965 0.8638 0.0851 +vn -0.4938 0.8654 0.0852 +vn -0.0191 -0.7729 -0.6343 +vn 0.4373 -0.6952 -0.5705 +vn 0.4880 -0.6747 -0.5537 +vn -0.4880 -0.6747 -0.5537 +vn 0.4883 -0.6746 -0.5536 +vn -0.4856 -0.6758 -0.5546 +vn -0.0191 0.9568 0.2902 +vn 0.4373 0.8606 0.2611 +vn 0.4880 0.8353 0.2534 +vn -0.4880 0.8352 0.2534 +vn 0.4880 0.8352 0.2534 +vn -0.4880 0.8353 0.2534 +vn 0.4947 0.8316 0.2523 +vn -0.4920 0.8331 0.2527 +vn -0.0191 -0.6343 -0.7729 +vn 0.4373 -0.5705 -0.6952 +vn 0.4880 -0.5537 -0.6747 +vn -0.4880 -0.5537 -0.6747 +vn 0.4905 -0.5528 -0.6736 +vn -0.4878 -0.5538 -0.6748 +vn -0.0191 0.8818 0.4713 +vn 0.4373 0.7931 0.4239 +vn 0.4880 0.7698 0.4115 +vn -0.4880 0.7698 0.4115 +vn 0.4927 0.7675 0.4102 +vn -0.4899 0.7688 0.4109 +vn 0.4880 0.7698 0.4114 +vn -0.4880 0.7698 0.4114 +vn -0.0191 -0.4713 -0.8818 +vn 0.4373 -0.4239 -0.7931 +vn 0.4880 -0.4115 -0.7698 +vn -0.4880 -0.4115 -0.7698 +vn 0.4927 -0.4102 -0.7675 +vn -0.4899 -0.4109 -0.7688 +vn -0.4880 -0.4114 -0.7698 +vn -0.0191 -0.0980 0.9950 +vn 0.4373 -0.0881 0.8950 +vn 0.4880 -0.0856 0.8686 +vn -0.4880 -0.0856 0.8686 +vn 0.4806 -0.0860 0.8727 +vn -0.4778 -0.0861 0.8742 +vn -0.4880 -0.0855 0.8686 +vn -0.0191 0.7729 0.6343 +vn 0.4373 0.6952 0.5705 +vn 0.4880 0.6747 0.5537 +vn -0.4880 0.6747 0.5537 +vn 0.4905 0.6736 0.5528 +vn -0.4878 0.6748 0.5538 +vn -0.0191 -0.2902 -0.9568 +vn 0.4373 -0.2611 -0.8606 +vn 0.4880 -0.2534 -0.8353 +vn -0.4880 -0.2534 -0.8353 +vn 0.4880 -0.2534 -0.8352 +vn 0.4947 -0.2523 -0.8316 +vn -0.4920 -0.2527 -0.8331 +vn -0.4880 -0.2534 -0.8352 +vn -0.0191 -0.2902 0.9568 +vn 0.4373 -0.2611 0.8606 +vn 0.4880 -0.2534 0.8352 +vn -0.4880 -0.2534 0.8352 +vn -0.4880 -0.2534 0.8353 +vn 0.4793 -0.2548 0.8399 +vn -0.4766 -0.2552 0.8413 +vn 0.4880 -0.2534 0.8353 +vn -0.0191 0.6343 0.7729 +vn 0.4373 0.5705 0.6952 +vn 0.4880 0.5537 0.6747 +vn -0.4880 0.5537 0.6747 +vn 0.4883 0.5536 0.6746 +vn -0.4856 0.5546 0.6758 +vn -0.0191 -0.0980 -0.9950 +vn 0.4373 -0.0881 -0.8950 +vn 0.4880 -0.0856 -0.8686 +vn -0.4880 -0.0856 -0.8686 +vn 0.4965 -0.0851 -0.8638 +vn -0.4938 -0.0852 -0.8654 +vn -0.0191 -0.4713 0.8818 +vn 0.4373 -0.4239 0.7931 +vn 0.4880 -0.4114 0.7698 +vn -0.4880 -0.4115 0.7698 +vn -0.4880 -0.4114 0.7698 +vn 0.4784 -0.4139 0.7744 +vn -0.4757 -0.4146 0.7757 +vn 0.4880 -0.4115 0.7698 +vn -0.0191 0.4713 0.8818 +vn 0.4373 0.4239 0.7931 +vn 0.4880 0.4114 0.7698 +vn -0.4880 0.4115 0.7698 +vn 0.4861 0.4120 0.7707 +vn -0.4834 0.4127 0.7720 +vn 0.4880 0.4115 0.7698 +vn -0.4880 0.4114 0.7698 +vn -0.0191 0.0980 -0.9950 +vn 0.4373 0.0881 -0.8950 +vn 0.4880 0.0856 -0.8686 +vn -0.4880 0.0856 -0.8686 +vn 0.4981 0.0850 -0.8630 +vn -0.4953 0.0851 -0.8645 +vn -0.4880 0.0855 -0.8686 +vn -0.0191 -0.6343 0.7729 +vn 0.4373 -0.5705 0.6952 +vn 0.4880 -0.5537 0.6747 +vn -0.4880 -0.5537 0.6747 +vn 0.4780 -0.5572 0.6790 +vn -0.4744 -0.5567 0.6819 +vn 0.4904 -0.5577 0.6697 +vn -0.0191 0.2902 0.9568 +vn 0.4373 0.2611 0.8606 +vn 0.4880 0.2534 0.8352 +vn -0.4880 0.2534 0.8352 +vn -0.4880 0.2534 0.8353 +vn 0.4840 0.2540 0.8374 +vn -0.4813 0.2544 0.8388 +vn 0.4880 0.2534 0.8353 +vn -0.0191 0.2902 -0.9568 +vn 0.4373 0.2611 -0.8606 +vn 0.4880 0.2534 -0.8352 +vn -0.4880 0.2534 -0.8353 +vn 0.4993 0.2515 -0.8291 +vn -0.4965 0.2520 -0.8306 +vn 0.4880 0.2534 -0.8353 +vn -0.4880 0.2534 -0.8352 +vn -0.0191 -0.7729 0.6343 +vn 0.4373 -0.6952 0.5705 +vn 0.4880 -0.6747 0.5537 +vn -0.4880 -0.6747 0.5537 +vn 0.4780 -0.6790 0.5572 +vn -0.4731 -0.6846 0.5545 +vn 0.4892 -0.6722 0.5557 +vn -0.0191 0.0980 0.9950 +vn 0.4373 0.0882 0.8950 +vn 0.4880 0.0856 0.8686 +vn -0.4880 0.0856 0.8686 +vn 0.4880 0.0855 0.8686 +vn 0.4822 0.0859 0.8719 +vn -0.4794 0.0860 0.8734 +vn -0.4880 0.0855 0.8686 +vn -0.0191 0.4713 -0.8818 +vn 0.4373 0.4239 -0.7931 +vn 0.4880 0.4114 -0.7698 +vn -0.4880 0.4115 -0.7698 +vn 0.4880 0.4115 -0.7698 +vn 0.5001 0.4082 -0.7637 +vn -0.4974 0.4090 -0.7651 +vn -0.4880 0.4114 -0.7698 +vn -0.0191 -0.8818 0.4713 +vn 0.4373 -0.7931 0.4239 +vn 0.4880 -0.7698 0.4115 +vn -0.4880 -0.7698 0.4115 +vn 0.4784 -0.7744 0.4139 +vn -0.4757 -0.7757 0.4146 +vn -0.4880 -0.7698 0.4114 +vn -0.0191 0.6343 -0.7729 +vn 0.4373 0.5705 -0.6952 +vn 0.4880 0.5537 -0.6747 +vn -0.4880 0.5537 -0.6747 +vn 0.5006 0.5492 -0.6692 +vn -0.4978 0.5502 -0.6704 +vn -0.0191 -0.9568 0.2902 +vn 0.4373 -0.8606 0.2611 +vn 0.4880 -0.8352 0.2534 +vn -0.4880 -0.8352 0.2534 +vn -0.4880 -0.8353 0.2534 +vn 0.4793 -0.8399 0.2548 +vn -0.4766 -0.8413 0.2552 +vn -0.4880 -0.8353 0.2533 +vn -0.0993 -0.0975 -0.9903 +vn -0.0920 -0.2891 -0.9529 +vn -0.0775 -0.4700 -0.8793 +vn -0.0564 -0.6334 -0.7718 +vn -0.0294 -0.7727 -0.6341 +vn 0.0024 -0.8819 -0.4714 +vn 0.0377 -0.9563 -0.2901 +vn 0.0750 -0.9924 -0.0977 +vn 0.1127 -0.9888 0.0974 +vn 0.1492 -0.9462 0.2870 +vn 0.1831 -0.8670 0.4634 +vn 0.2130 -0.7553 0.6198 +vn 0.2380 -0.6162 0.7508 +vn 0.2573 -0.4555 0.8522 +vn 0.2705 -0.2795 0.9213 +vn 0.2771 -0.0942 0.9562 +vn 0.2771 0.0942 0.9562 +vn 0.2705 0.2795 0.9213 +vn 0.2573 0.4555 0.8522 +vn 0.2380 0.6162 0.7508 +vn 0.2130 0.7553 0.6198 +vn 0.1831 0.8670 0.4634 +vn 0.1492 0.9462 0.2870 +vn 0.1127 0.9888 0.0974 +vn 0.0750 0.9924 -0.0977 +vn 0.0377 0.9563 -0.2901 +vn 0.0024 0.8819 -0.4714 +vn -0.0294 0.7727 -0.6341 +vn -0.0564 0.6334 -0.7718 +vn -0.0775 0.4700 -0.8793 +vn -0.0351 -0.9564 0.2901 +vn -0.0920 0.2891 -0.9529 +vn -0.0993 0.0975 -0.9903 +vn 0.1152 -0.4683 0.8761 +vn -0.1060 0.4687 0.8769 +vn 0.0765 0.7707 -0.6325 +vn 0.0569 -0.8805 -0.4706 +vn -0.1149 -0.2884 0.9506 +vn -0.0118 0.9951 0.0980 +vn 0.1149 -0.2884 -0.9506 +vn -0.0569 -0.8805 0.4706 +vn -0.0931 0.6316 0.7697 +vn 0.0931 0.6316 -0.7697 +vn 0.0351 -0.9564 -0.2901 +vn -0.1195 -0.0973 0.9881 +vn 0.0119 0.9951 -0.0980 +vn 0.1060 -0.4687 -0.8770 +vn -0.0765 -0.7707 0.6325 +vn -0.0765 0.7707 0.6325 +vn 0.1060 0.4687 -0.8770 +vn 0.0119 -0.9951 -0.0980 +vn -0.1195 0.0973 0.9881 +vn 0.0351 0.9564 -0.2901 +vn 0.0931 -0.6316 -0.7697 +vn -0.0931 -0.6316 0.7697 +vn -0.0569 0.8805 0.4706 +vn 0.1149 0.2884 -0.9506 +vn -0.0118 -0.9951 0.0980 +vn -0.1149 0.2884 0.9506 +vn 0.0569 0.8805 -0.4706 +vn 0.0765 -0.7707 -0.6325 +vn -0.1060 -0.4687 0.8770 +vn -0.0351 0.9564 0.2901 +vn 0.1195 -0.0973 -0.9881 +vn 0.1195 0.0973 -0.9881 +vn -0.7025 -0.3729 -0.6062 +vn 0.1152 -0.0974 -0.9886 +vn 0.1152 0.7679 -0.6302 +vn 0.1152 -0.2884 0.9506 +vn 0.1152 -0.2884 -0.9506 +vn 0.1152 0.6302 -0.7679 +vn 0.1152 -0.0974 0.9886 +vn 0.1152 -0.4683 -0.8761 +vn 0.1152 0.4683 -0.8761 +vn 0.1152 0.0974 0.9886 +vn 0.1152 -0.6302 -0.7679 +vn 0.1152 0.2884 -0.9506 +vn 0.1152 0.2884 0.9506 +vn 0.1152 -0.7679 -0.6302 +vn 0.1152 0.0974 -0.9886 +vn 0.1152 0.4683 0.8761 +vn 0.1152 -0.8761 -0.4683 +vn 0.1152 0.6302 0.7679 +vn 0.1152 -0.9506 -0.2884 +vn 0.1152 0.7679 0.6302 +vn 0.1152 -0.9886 -0.0974 +vn 0.1152 0.8761 0.4683 +vn 0.1152 -0.9886 0.0974 +vn 0.1152 0.9506 0.2884 +vn 0.1152 -0.9506 0.2884 +vn 0.1152 0.9886 0.0974 +vn 0.1152 -0.8761 0.4683 +vn 0.1152 0.9886 -0.0974 +vn 0.1152 -0.7679 0.6302 +vn 0.1152 0.9506 -0.2884 +vn 0.1152 -0.6302 0.7679 +vn 0.1152 0.8761 -0.4683 +vn -0.1922 0.0966 -0.9766 +vn -0.1857 0.2864 -0.9400 +vn -0.1728 0.4660 -0.8677 +vn -0.1540 0.6288 -0.7621 +vn -0.1298 0.7685 -0.6266 +vn -0.1011 0.8791 -0.4658 +vn -0.0689 0.9558 -0.2859 +vn -0.0346 0.9950 -0.0940 +vn 0.0005 0.9948 0.1020 +vn 0.0349 0.9553 0.2937 +vn 0.0671 0.8783 0.4734 +vn 0.0960 0.7675 0.6338 +vn 0.1203 0.6279 0.7689 +vn 0.1393 0.4652 0.8742 +vn 0.1522 0.2859 0.9461 +vn 0.1588 0.0964 0.9826 +vn 0.1588 -0.0964 0.9826 +vn 0.1522 -0.2859 0.9461 +vn 0.1393 -0.4652 0.8742 +vn 0.1203 -0.6279 0.7689 +vn 0.0960 -0.7675 0.6338 +vn 0.0671 -0.8783 0.4734 +vn 0.0349 -0.9553 0.2937 +vn 0.0005 -0.9948 0.1020 +vn -0.0346 -0.9950 -0.0940 +vn -0.0689 -0.9558 -0.2859 +vn -0.1011 -0.8791 -0.4658 +vn -0.1298 -0.7685 -0.6266 +vn -0.1540 -0.6288 -0.7621 +vn -0.1728 -0.4660 -0.8677 +vn -0.1857 -0.2864 -0.9400 +vn -0.1922 -0.0966 -0.9766 +vn -0.9837 -0.0775 -0.1625 +vn -0.5622 -0.0867 -0.8224 +vn -0.9605 -0.2326 -0.1529 +vn -0.5376 -0.2588 -0.8025 +vn -0.9119 -0.3878 -0.1342 +vn -0.4884 -0.4261 -0.7615 +vn -0.8337 -0.5417 -0.1076 +vn -0.4148 -0.5843 -0.6975 +vn -0.7200 -0.6899 -0.0751 +vn -0.3184 -0.7269 -0.6085 +vn -0.5652 -0.8240 -0.0404 +vn -0.2025 -0.8460 -0.4933 +vn -0.3669 -0.9302 -0.0090 +vn -0.0731 -0.9328 -0.3529 +vn -0.1313 -0.9913 0.0124 +vn 0.0612 -0.9796 -0.1912 +vn 0.1229 -0.9923 0.0177 +vn 0.1903 -0.9816 -0.0156 +vn 0.3680 -0.9298 0.0045 +vn 0.3048 -0.9381 0.1644 +vn 0.5778 -0.8158 -0.0242 +vn 0.3975 -0.8530 0.3382 +vn 0.7387 -0.6713 -0.0616 +vn 0.4652 -0.7335 0.4955 +vn 0.8509 -0.5157 -0.0999 +vn 0.5091 -0.5888 0.6279 +vn 0.9229 -0.3614 -0.1330 +vn 0.5334 -0.4280 0.7296 +vn 0.9643 -0.2131 -0.1569 +vn 0.5445 -0.2590 0.7978 +vn 0.9830 -0.0703 -0.1693 +vn 0.5483 -0.0866 0.8318 +vn 0.9830 0.0703 -0.1693 +vn 0.5483 0.0866 0.8318 +vn 0.9643 0.2131 -0.1569 +vn 0.5445 0.2590 0.7978 +vn 0.9229 0.3614 -0.1330 +vn 0.5334 0.4280 0.7296 +vn 0.8509 0.5157 -0.0999 +vn 0.5091 0.5888 0.6279 +vn 0.7387 0.6713 -0.0616 +vn 0.4653 0.7335 0.4955 +vn 0.5778 0.8158 -0.0242 +vn 0.3975 0.8530 0.3382 +vn 0.3680 0.9298 0.0045 +vn 0.3048 0.9381 0.1644 +vn 0.1229 0.9923 0.0177 +vn 0.1903 0.9816 -0.0156 +vn -0.1313 0.9913 0.0124 +vn 0.0612 0.9796 -0.1912 +vn -0.3669 0.9302 -0.0090 +vn -0.0731 0.9328 -0.3529 +vn -0.5651 0.8240 -0.0404 +vn -0.2025 0.8460 -0.4933 +vn -0.7200 0.6899 -0.0751 +vn -0.3184 0.7269 -0.6085 +vn -0.8337 0.5417 -0.1076 +vn -0.4148 0.5843 -0.6975 +vn -0.9119 0.3878 -0.1342 +vn -0.4884 0.4261 -0.7615 +vn -0.9605 0.2326 -0.1529 +vn -0.5376 0.2588 -0.8025 +vn -0.9837 0.0775 -0.1625 +vn -0.5622 0.0867 -0.8224 +vn -0.6261 -0.5222 -0.5791 +vn -0.5175 -0.6667 -0.5363 +vn -0.3735 -0.7981 -0.4728 +vn -0.1954 -0.9023 -0.3844 +vn 0.0076 -0.9626 -0.2708 +vn 0.2169 -0.9663 -0.1387 +vn 0.4103 -0.9120 -0.0005 +vn 0.5709 -0.8106 0.1302 +vn 0.6925 -0.6790 0.2437 +vn 0.7776 -0.5321 0.3350 +vn 0.8327 -0.3798 0.4029 +vn 0.8649 -0.2271 0.4476 +vn 0.8796 -0.0755 0.4697 +vn 0.8796 0.0755 0.4697 +vn 0.8649 0.2272 0.4476 +vn 0.8327 0.3798 0.4029 +vn 0.7776 0.5321 0.3350 +vn 0.6925 0.6790 0.2437 +vn 0.5709 0.8106 0.1302 +vn 0.4103 0.9120 -0.0005 +vn 0.2169 0.9663 -0.1387 +vn 0.0076 0.9626 -0.2708 +vn -0.1954 0.9023 -0.3844 +vn -0.3735 0.7981 -0.4728 +vn -0.5175 0.6667 -0.5363 +vn -0.6261 0.5222 -0.5791 +vn -0.7025 0.3729 -0.6062 +vn -0.7506 0.2233 -0.6219 +vn -0.7738 0.0743 -0.6291 +vn -0.7506 -0.2233 -0.6219 +vn -0.7738 -0.0743 -0.6291 +vn -0.8764 0.0830 -0.4744 +vn -0.8532 0.2487 -0.4584 +vn -0.8050 0.4131 -0.4258 +vn -0.7283 0.5731 -0.3756 +vn -0.6193 0.7223 -0.3077 +vn -0.4760 0.8505 -0.2236 +vn -0.3013 0.9449 -0.1281 +vn -0.1043 0.9941 -0.0293 +vn 0.1010 0.9929 0.0632 +vn 0.2997 0.9435 0.1412 +vn 0.4803 0.8540 0.2000 +vn 0.6358 0.7338 0.2394 +vn 0.7628 0.5911 0.2620 +vn 0.8594 0.4327 0.2723 +vn 0.9244 0.2637 0.2755 +vn 0.9571 0.0886 0.2758 +vn 0.9571 -0.0886 0.2758 +vn 0.9244 -0.2637 0.2755 +vn 0.8594 -0.4327 0.2723 +vn 0.7628 -0.5911 0.2620 +vn 0.6358 -0.7338 0.2394 +vn 0.4803 -0.8540 0.2000 +vn 0.2997 -0.9435 0.1412 +vn 0.1010 -0.9929 0.0632 +vn -0.1043 -0.9941 -0.0293 +vn -0.3013 -0.9449 -0.1281 +vn -0.4760 -0.8505 -0.2236 +vn -0.6193 -0.7223 -0.3077 +vn -0.7283 -0.5731 -0.3756 +vn -0.8050 -0.4131 -0.4258 +vn -0.8532 -0.2487 -0.4584 +vn -0.8764 -0.0830 -0.4744 +vn -0.0993 -0.0975 0.9903 +vn -0.0920 -0.2891 0.9529 +vn -0.0775 -0.4700 0.8793 +vn -0.0564 -0.6334 0.7718 +vn -0.0294 -0.7727 0.6341 +vn 0.0024 -0.8819 0.4714 +vn 0.0377 -0.9563 0.2901 +vn 0.0750 -0.9924 0.0977 +vn 0.1127 -0.9888 -0.0974 +vn 0.1492 -0.9462 -0.2870 +vn 0.1831 -0.8670 -0.4634 +vn 0.2130 -0.7553 -0.6198 +vn 0.2380 -0.6162 -0.7508 +vn 0.2573 -0.4555 -0.8522 +vn 0.2705 -0.2795 -0.9213 +vn 0.2771 -0.0942 -0.9562 +vn 0.2771 0.0942 -0.9562 +vn 0.2705 0.2795 -0.9213 +vn 0.2573 0.4555 -0.8522 +vn 0.2380 0.6162 -0.7508 +vn 0.2130 0.7553 -0.6198 +vn 0.1831 0.8670 -0.4634 +vn 0.1492 0.9462 -0.2870 +vn 0.1127 0.9888 -0.0974 +vn 0.0750 0.9924 0.0977 +vn 0.0377 0.9563 0.2901 +vn 0.0024 0.8819 0.4714 +vn -0.0294 0.7727 0.6341 +vn -0.0564 0.6334 0.7718 +vn -0.0775 0.4700 0.8793 +vn -0.0351 -0.9564 -0.2901 +vn -0.0920 0.2891 0.9529 +vn -0.0993 0.0975 0.9903 +vn -0.1060 0.4687 -0.8770 +vn 0.0765 0.7707 0.6325 +vn 0.0569 -0.8805 0.4706 +vn -0.1149 -0.2884 -0.9506 +vn -0.0118 0.9951 -0.0980 +vn 0.1149 -0.2884 0.9506 +vn -0.0569 -0.8805 -0.4706 +vn -0.0931 0.6316 -0.7697 +vn 0.0931 0.6316 0.7697 +vn 0.0351 -0.9564 0.2901 +vn -0.1195 -0.0973 -0.9881 +vn 0.0119 0.9951 0.0980 +vn 0.1060 -0.4687 0.8769 +vn -0.0765 -0.7707 -0.6325 +vn -0.0765 0.7707 -0.6325 +vn 0.1060 0.4687 0.8769 +vn 0.0119 -0.9951 0.0980 +vn -0.1195 0.0973 -0.9881 +vn 0.0351 0.9564 0.2901 +vn 0.0931 -0.6316 0.7697 +vn -0.0931 -0.6316 -0.7697 +vn -0.0569 0.8805 -0.4706 +vn 0.1149 0.2884 0.9506 +vn -0.0118 -0.9951 -0.0980 +vn -0.1149 0.2884 -0.9506 +vn 0.0569 0.8805 0.4706 +vn 0.0765 -0.7707 0.6325 +vn -0.1060 -0.4687 -0.8770 +vn -0.0351 0.9564 -0.2901 +vn 0.1195 -0.0973 0.9881 +vn 0.1195 0.0973 0.9881 +vn -0.7025 -0.3729 0.6062 +vn 0.1152 -0.4683 0.8760 +vn 0.1152 0.4683 0.8760 +vn -0.1922 0.0966 0.9766 +vn -0.0000 -0.0000 -1.0000 +vn -0.1857 0.2864 0.9400 +vn -0.1728 0.4660 0.8677 +vn -0.1540 0.6288 0.7621 +vn -0.1298 0.7685 0.6266 +vn -0.1011 0.8791 0.4658 +vn -0.0689 0.9558 0.2859 +vn -0.0346 0.9950 0.0940 +vn 0.0005 0.9948 -0.1020 +vn 0.0349 0.9553 -0.2937 +vn 0.0671 0.8783 -0.4734 +vn 0.0960 0.7676 -0.6338 +vn 0.1203 0.6279 -0.7689 +vn 0.1393 0.4652 -0.8742 +vn 0.1522 0.2859 -0.9461 +vn 0.1588 0.0964 -0.9826 +vn 0.1588 -0.0964 -0.9826 +vn 0.1522 -0.2859 -0.9461 +vn 0.1393 -0.4652 -0.8742 +vn 0.1203 -0.6279 -0.7689 +vn 0.0960 -0.7675 -0.6338 +vn 0.0671 -0.8783 -0.4734 +vn 0.0349 -0.9553 -0.2937 +vn 0.0005 -0.9948 -0.1020 +vn -0.0346 -0.9950 0.0940 +vn -0.0689 -0.9558 0.2859 +vn -0.1011 -0.8791 0.4658 +vn -0.1298 -0.7685 0.6266 +vn -0.1540 -0.6288 0.7621 +vn -0.1728 -0.4660 0.8677 +vn -0.1857 -0.2864 0.9399 +vn -0.1922 -0.0966 0.9766 +vn -0.9837 -0.0775 0.1625 +vn -0.5622 -0.0867 0.8224 +vn -0.9605 -0.2326 0.1529 +vn -0.5376 -0.2588 0.8025 +vn -0.9119 -0.3878 0.1342 +vn -0.4884 -0.4261 0.7615 +vn -0.8337 -0.5417 0.1076 +vn -0.4148 -0.5843 0.6975 +vn -0.7200 -0.6899 0.0751 +vn -0.3184 -0.7269 0.6085 +vn -0.5652 -0.8240 0.0404 +vn -0.2025 -0.8460 0.4933 +vn -0.3669 -0.9302 0.0090 +vn -0.0731 -0.9328 0.3529 +vn -0.1313 -0.9913 -0.0124 +vn 0.0612 -0.9796 0.1912 +vn 0.1229 -0.9923 -0.0177 +vn 0.1903 -0.9816 0.0156 +vn 0.3680 -0.9298 -0.0045 +vn 0.3048 -0.9381 -0.1644 +vn 0.5778 -0.8158 0.0242 +vn 0.3975 -0.8530 -0.3382 +vn 0.7387 -0.6713 0.0616 +vn 0.4652 -0.7335 -0.4955 +vn 0.8509 -0.5157 0.0999 +vn 0.5091 -0.5888 -0.6279 +vn 0.9229 -0.3614 0.1330 +vn 0.5334 -0.4280 -0.7296 +vn 0.9643 -0.2131 0.1569 +vn 0.5445 -0.2590 -0.7978 +vn 0.9830 -0.0703 0.1693 +vn 0.5483 -0.0866 -0.8318 +vn 0.9830 0.0703 0.1693 +vn 0.5483 0.0866 -0.8318 +vn 0.9643 0.2131 0.1569 +vn 0.5445 0.2590 -0.7978 +vn 0.9229 0.3614 0.1330 +vn 0.5334 0.4280 -0.7296 +vn 0.8509 0.5157 0.0999 +vn 0.5091 0.5888 -0.6279 +vn 0.7387 0.6713 0.0616 +vn 0.4652 0.7335 -0.4955 +vn 0.5778 0.8158 0.0242 +vn 0.3975 0.8530 -0.3382 +vn 0.3680 0.9298 -0.0045 +vn 0.3048 0.9381 -0.1644 +vn 0.1229 0.9923 -0.0177 +vn 0.1903 0.9816 0.0156 +vn -0.1313 0.9913 -0.0124 +vn 0.0612 0.9796 0.1912 +vn -0.3669 0.9302 0.0090 +vn -0.0731 0.9328 0.3529 +vn -0.5652 0.8240 0.0404 +vn -0.2025 0.8460 0.4933 +vn -0.7200 0.6899 0.0751 +vn -0.3184 0.7269 0.6085 +vn -0.8337 0.5417 0.1076 +vn -0.4148 0.5843 0.6975 +vn -0.9119 0.3878 0.1342 +vn -0.4884 0.4261 0.7615 +vn -0.9605 0.2326 0.1529 +vn -0.5376 0.2588 0.8025 +vn -0.9837 0.0775 0.1625 +vn -0.5622 0.0867 0.8224 +vn -0.6261 -0.5221 0.5791 +vn -0.5175 -0.6667 0.5363 +vn -0.3736 -0.7981 0.4728 +vn -0.1954 -0.9023 0.3844 +vn 0.0076 -0.9626 0.2708 +vn 0.2169 -0.9663 0.1387 +vn 0.4103 -0.9120 0.0005 +vn 0.5709 -0.8106 -0.1302 +vn 0.6925 -0.6790 -0.2437 +vn 0.7776 -0.5321 -0.3350 +vn 0.8327 -0.3798 -0.4029 +vn 0.8649 -0.2271 -0.4476 +vn 0.8796 -0.0755 -0.4697 +vn 0.8796 0.0755 -0.4697 +vn 0.8649 0.2271 -0.4476 +vn 0.8327 0.3798 -0.4029 +vn 0.7776 0.5321 -0.3350 +vn 0.6925 0.6790 -0.2437 +vn 0.5709 0.8106 -0.1302 +vn 0.4103 0.9120 0.0005 +vn 0.2169 0.9663 0.1387 +vn 0.0076 0.9626 0.2708 +vn -0.1954 0.9023 0.3844 +vn -0.3735 0.7981 0.4728 +vn -0.5175 0.6667 0.5363 +vn -0.6261 0.5222 0.5791 +vn -0.7025 0.3729 0.6062 +vn -0.7506 0.2233 0.6219 +vn -0.7738 0.0743 0.6291 +vn -0.7506 -0.2233 0.6219 +vn -0.7738 -0.0743 0.6291 +vn -0.8764 0.0830 0.4744 +vn -0.8532 0.2486 0.4584 +vn -0.8050 0.4131 0.4258 +vn -0.7283 0.5731 0.3756 +vn -0.6193 0.7223 0.3077 +vn -0.4760 0.8505 0.2236 +vn -0.3013 0.9449 0.1281 +vn -0.1043 0.9941 0.0293 +vn 0.1010 0.9929 -0.0632 +vn 0.2997 0.9435 -0.1412 +vn 0.4803 0.8540 -0.2000 +vn 0.6358 0.7338 -0.2394 +vn 0.7629 0.5911 -0.2620 +vn 0.8594 0.4327 -0.2723 +vn 0.9244 0.2637 -0.2755 +vn 0.9571 0.0885 -0.2758 +vn 0.9571 -0.0885 -0.2758 +vn 0.9244 -0.2637 -0.2755 +vn 0.8594 -0.4327 -0.2723 +vn 0.7629 -0.5911 -0.2620 +vn 0.6358 -0.7338 -0.2394 +vn 0.4803 -0.8540 -0.2000 +vn 0.2997 -0.9435 -0.1412 +vn 0.1010 -0.9929 -0.0632 +vn -0.1043 -0.9941 0.0293 +vn -0.3013 -0.9449 0.1281 +vn -0.4761 -0.8505 0.2236 +vn -0.6193 -0.7223 0.3077 +vn -0.7283 -0.5731 0.3756 +vn -0.8050 -0.4131 0.4258 +vn -0.8532 -0.2487 0.4584 +vn -0.8764 -0.0830 0.4744 +vn -0.1060 0.4687 0.8770 +vn 0.1060 -0.4687 -0.8769 +vn -0.7386 -0.3778 -0.5583 +vn -0.1046 0.0957 -0.9899 +vn 0.6109 -0.7917 -0.0030 +vn -0.0972 0.2839 -0.9539 +vn -0.0827 0.4621 -0.8830 +vn -0.0613 0.6238 -0.7792 +vn -0.0337 0.7626 -0.6460 +vn -0.0006 0.8729 -0.4879 +vn 0.0369 0.9497 -0.3108 +vn 0.0775 0.9895 -0.1219 +vn 0.1198 0.9902 0.0712 +vn 0.1621 0.9518 0.2602 +vn 0.2029 0.8760 0.4375 +vn 0.2405 0.7663 0.5958 +vn 0.2731 0.6274 0.7292 +vn 0.2994 0.4651 0.8331 +vn 0.3177 0.2859 0.9040 +vn 0.3272 0.0965 0.9400 +vn 0.3272 -0.0965 0.9400 +vn 0.3177 -0.2859 0.9040 +vn 0.2994 -0.4651 0.8331 +vn 0.2731 -0.6274 0.7292 +vn 0.2405 -0.7663 0.5958 +vn 0.2029 -0.8760 0.4375 +vn 0.1621 -0.9518 0.2602 +vn 0.1198 -0.9902 0.0712 +vn 0.0775 -0.9895 -0.1219 +vn 0.0369 -0.9497 -0.3108 +vn -0.0006 -0.8729 -0.4879 +vn -0.0337 -0.7626 -0.6460 +vn -0.0613 -0.6238 -0.7792 +vn -0.0827 -0.4621 -0.8830 +vn -0.0972 -0.2839 -0.9539 +vn -0.1046 -0.0958 -0.9899 +vn -0.9275 -0.0776 -0.3658 +vn -0.5959 -0.0874 -0.7983 +vn -0.9062 -0.2331 -0.3528 +vn -0.5709 -0.2608 -0.7785 +vn -0.8612 -0.3894 -0.3267 +vn -0.5208 -0.4294 -0.7378 +vn -0.7880 -0.5449 -0.2868 +vn -0.4460 -0.5887 -0.6742 +vn -0.6804 -0.6947 -0.2333 +vn -0.3480 -0.7322 -0.5854 +vn -0.5329 -0.8294 -0.1675 +vn -0.2305 -0.8518 -0.4705 +vn -0.3445 -0.9341 -0.0935 +vn -0.0997 -0.9387 -0.3301 +vn -0.1227 -0.9923 -0.0187 +vn 0.0351 -0.9851 -0.1683 +vn 0.1144 -0.9923 0.0478 +vn 0.1634 -0.9865 0.0080 +vn 0.3432 -0.9341 0.0980 +vn 0.2754 -0.9424 0.1897 +vn 0.5439 -0.8293 0.1287 +vn 0.3638 -0.8565 0.3662 +vn 0.7057 -0.6942 0.1418 +vn 0.4254 -0.7357 0.5270 +vn 0.8271 -0.5437 0.1425 +vn 0.4615 -0.5895 0.6630 +vn 0.9115 -0.3880 0.1367 +vn 0.4778 -0.4275 0.7674 +vn 0.9641 -0.2319 0.1297 +vn 0.4823 -0.2580 0.8371 +vn 0.9891 -0.0771 0.1252 +vn 0.4823 -0.0862 0.8718 +vn 0.9891 0.0771 0.1252 +vn 0.4823 0.0862 0.8718 +vn 0.9641 0.2319 0.1297 +vn 0.4823 0.2580 0.8371 +vn 0.9115 0.3880 0.1367 +vn 0.4778 0.4275 0.7674 +vn 0.8271 0.5437 0.1425 +vn 0.4615 0.5895 0.6630 +vn 0.7057 0.6942 0.1418 +vn 0.4254 0.7357 0.5270 +vn 0.5438 0.8293 0.1287 +vn 0.3638 0.8565 0.3662 +vn 0.3432 0.9341 0.0980 +vn 0.2754 0.9424 0.1897 +vn 0.1144 0.9923 0.0478 +vn 0.1634 0.9865 0.0080 +vn -0.1227 0.9923 -0.0187 +vn 0.0351 0.9851 -0.1683 +vn -0.3445 0.9341 -0.0935 +vn -0.0997 0.9387 -0.3301 +vn -0.5329 0.8294 -0.1675 +vn -0.2305 0.8518 -0.4705 +vn -0.6804 0.6947 -0.2333 +vn -0.3480 0.7322 -0.5854 +vn -0.7880 0.5449 -0.2868 +vn -0.4460 0.5887 -0.6742 +vn -0.8612 0.3894 -0.3267 +vn -0.5208 0.4294 -0.7378 +vn -0.9062 0.2331 -0.3528 +vn -0.5709 0.2608 -0.7785 +vn -0.9275 0.0776 -0.3658 +vn -0.5959 0.0874 -0.7983 +vn -0.6636 -0.5294 -0.5286 +vn -0.5562 -0.6767 -0.4823 +vn -0.4132 -0.8110 -0.4142 +vn -0.2352 -0.9177 -0.3202 +vn -0.0315 -0.9791 -0.2007 +vn 0.1787 -0.9819 -0.0632 +vn 0.3725 -0.9247 0.0790 +vn 0.5325 -0.8195 0.2119 +vn 0.6524 -0.6842 0.3259 +vn 0.7351 -0.5346 0.4169 +vn 0.7879 -0.3806 0.4841 +vn 0.8182 -0.2272 0.5281 +vn 0.8318 -0.0755 0.5499 +vn 0.8318 0.0755 0.5499 +vn 0.8182 0.2272 0.5281 +vn 0.7879 0.3806 0.4841 +vn 0.7351 0.5346 0.4169 +vn 0.6524 0.6842 0.3259 +vn 0.5325 0.8195 0.2119 +vn 0.3725 0.9247 0.0790 +vn 0.1787 0.9819 -0.0632 +vn -0.0315 0.9791 -0.2007 +vn -0.2352 0.9177 -0.3202 +vn -0.4132 0.8110 -0.4142 +vn -0.5562 0.6767 -0.4823 +vn -0.6636 0.5294 -0.5286 +vn -0.7386 0.3777 -0.5583 +vn -0.7858 0.2260 -0.5757 +vn -0.8085 0.0752 -0.5837 +vn -0.7858 -0.2260 -0.5757 +vn -0.8085 -0.0752 -0.5837 +vn -0.9503 0.0881 -0.2984 +vn -0.9219 0.2632 -0.2841 +vn -0.8638 0.4341 -0.2559 +vn -0.7737 0.5960 -0.2150 +vn -0.6502 0.7419 -0.1639 +vn -0.4941 0.8628 -0.1069 +vn -0.3101 0.9494 -0.0501 +vn -0.1069 0.9943 -0.0008 +vn 0.1038 0.9940 0.0342 +vn 0.3100 0.9494 0.0506 +vn 0.5006 0.8644 0.0468 +vn 0.6662 0.7454 0.0255 +vn 0.7999 0.6002 -0.0073 +vn 0.8983 0.4374 -0.0429 +vn 0.9615 0.2650 -0.0726 +vn 0.9920 0.0887 -0.0894 +vn 0.9920 -0.0887 -0.0894 +vn 0.9615 -0.2650 -0.0726 +vn 0.8983 -0.4374 -0.0429 +vn 0.7999 -0.6001 -0.0073 +vn 0.6661 -0.7454 0.0255 +vn 0.5006 -0.8644 0.0468 +vn 0.3100 -0.9494 0.0506 +vn 0.1038 -0.9940 0.0342 +vn -0.1069 -0.9943 -0.0008 +vn -0.3101 -0.9494 -0.0501 +vn -0.4941 -0.8628 -0.1069 +vn -0.6502 -0.7419 -0.1639 +vn -0.7737 -0.5960 -0.2150 +vn -0.8637 -0.4341 -0.2559 +vn -0.9219 -0.2632 -0.2841 +vn -0.9503 -0.0881 -0.2984 +vn -0.3194 0.9437 -0.0860 +vn 0.7635 -0.6444 -0.0425 +vn -0.8741 -0.1360 -0.4663 +vn -0.4548 0.8752 -0.1650 +vn 0.8989 -0.4307 -0.0803 +vn -0.8175 -0.3916 -0.4223 +vn -0.5906 0.7655 -0.2552 +vn 0.9827 -0.1528 -0.1044 +vn -0.7169 -0.6052 -0.3462 +vn -0.7169 0.6052 -0.3462 +vn 0.9827 0.1528 -0.1044 +vn -0.5906 -0.7655 -0.2552 +vn -0.8175 0.3916 -0.4223 +vn 0.8989 0.4307 -0.0803 +vn -0.4548 -0.8752 -0.1650 +vn -0.8741 0.1360 -0.4663 +vn 0.7635 0.6445 -0.0425 +vn -0.3194 -0.9437 -0.0860 +vn 0.6109 0.7917 -0.0030 +vn -0.1886 -0.9818 -0.0232 +vn 0.4609 0.8869 0.0297 +vn -0.0622 -0.9978 0.0214 +vn 0.3202 0.9460 0.0506 +vn 0.0622 -0.9969 0.0480 +vn 0.1883 0.9804 0.0573 +vn 0.1883 -0.9804 0.0573 +vn 0.0622 0.9969 0.0480 +vn 0.3202 -0.9460 0.0506 +vn -0.0622 0.9978 0.0214 +vn 0.4609 -0.8869 0.0297 +vn -0.1886 0.9818 -0.0232 +vn 0.1060 -0.4687 0.8770 +vn -0.0765 0.7708 -0.6325 +vn 0.1060 0.4687 0.8770 +vn -0.7386 -0.3777 0.5583 +vn -0.1046 0.0958 0.9899 +vn 0.6109 -0.7917 0.0030 +vn -0.0972 0.2839 0.9539 +vn -0.0827 0.4621 0.8830 +vn -0.0613 0.6238 0.7792 +vn -0.0337 0.7626 0.6460 +vn -0.0006 0.8729 0.4879 +vn 0.0369 0.9497 0.3108 +vn 0.0775 0.9895 0.1219 +vn 0.1198 0.9902 -0.0712 +vn 0.1621 0.9518 -0.2602 +vn 0.2029 0.8760 -0.4375 +vn 0.2405 0.7663 -0.5958 +vn 0.2731 0.6274 -0.7292 +vn 0.2994 0.4651 -0.8331 +vn 0.3177 0.2859 -0.9040 +vn 0.3272 0.0965 -0.9400 +vn 0.3272 -0.0965 -0.9400 +vn 0.3177 -0.2859 -0.9040 +vn 0.2994 -0.4651 -0.8331 +vn 0.2731 -0.6274 -0.7292 +vn 0.2405 -0.7663 -0.5958 +vn 0.2029 -0.8760 -0.4375 +vn 0.1621 -0.9518 -0.2602 +vn 0.1198 -0.9902 -0.0712 +vn 0.0775 -0.9895 0.1219 +vn 0.0369 -0.9497 0.3108 +vn -0.0006 -0.8729 0.4879 +vn -0.0336 -0.7626 0.6460 +vn -0.0613 -0.6238 0.7792 +vn -0.0827 -0.4621 0.8830 +vn -0.0972 -0.2839 0.9539 +vn -0.1046 -0.0958 0.9899 +vn -0.9275 -0.0776 0.3658 +vn -0.5959 -0.0874 0.7983 +vn -0.9062 -0.2331 0.3528 +vn -0.5709 -0.2608 0.7785 +vn -0.8612 -0.3894 0.3267 +vn -0.5208 -0.4294 0.7378 +vn -0.7880 -0.5449 0.2868 +vn -0.4460 -0.5887 0.6742 +vn -0.6804 -0.6947 0.2333 +vn -0.3480 -0.7322 0.5854 +vn -0.5329 -0.8294 0.1675 +vn -0.2305 -0.8518 0.4705 +vn -0.3445 -0.9341 0.0935 +vn -0.0997 -0.9387 0.3301 +vn -0.1227 -0.9923 0.0187 +vn 0.0351 -0.9851 0.1683 +vn 0.1144 -0.9923 -0.0478 +vn 0.1634 -0.9865 -0.0080 +vn 0.3432 -0.9341 -0.0980 +vn 0.2754 -0.9424 -0.1897 +vn 0.5438 -0.8293 -0.1287 +vn 0.3638 -0.8565 -0.3662 +vn 0.7057 -0.6942 -0.1418 +vn 0.4254 -0.7357 -0.5270 +vn 0.8271 -0.5437 -0.1425 +vn 0.4615 -0.5895 -0.6630 +vn 0.9115 -0.3879 -0.1367 +vn 0.4778 -0.4275 -0.7674 +vn 0.9641 -0.2319 -0.1297 +vn 0.4823 -0.2580 -0.8371 +vn 0.9891 -0.0771 -0.1252 +vn 0.4823 -0.0861 -0.8718 +vn 0.9891 0.0771 -0.1252 +vn 0.4823 0.0861 -0.8718 +vn 0.9641 0.2319 -0.1297 +vn 0.4823 0.2580 -0.8371 +vn 0.9115 0.3879 -0.1367 +vn 0.4778 0.4275 -0.7674 +vn 0.8271 0.5437 -0.1425 +vn 0.4615 0.5895 -0.6630 +vn 0.7057 0.6942 -0.1418 +vn 0.4254 0.7357 -0.5270 +vn 0.5438 0.8293 -0.1287 +vn 0.3638 0.8565 -0.3662 +vn 0.3432 0.9341 -0.0980 +vn 0.2754 0.9424 -0.1897 +vn 0.1144 0.9923 -0.0478 +vn 0.1634 0.9865 -0.0080 +vn -0.1227 0.9923 0.0187 +vn 0.0351 0.9851 0.1683 +vn -0.3445 0.9341 0.0935 +vn -0.0997 0.9387 0.3301 +vn -0.5330 0.8294 0.1675 +vn -0.2305 0.8518 0.4705 +vn -0.6804 0.6947 0.2333 +vn -0.3480 0.7322 0.5854 +vn -0.7880 0.5449 0.2868 +vn -0.4460 0.5887 0.6742 +vn -0.8612 0.3894 0.3267 +vn -0.5208 0.4294 0.7378 +vn -0.9062 0.2331 0.3528 +vn -0.5709 0.2608 0.7785 +vn -0.9275 0.0776 0.3658 +vn -0.5959 0.0874 0.7983 +vn -0.6636 -0.5294 0.5286 +vn -0.5562 -0.6767 0.4823 +vn -0.4132 -0.8110 0.4142 +vn -0.2352 -0.9177 0.3202 +vn -0.0315 -0.9791 0.2007 +vn 0.1787 -0.9819 0.0632 +vn 0.3725 -0.9247 -0.0790 +vn 0.5325 -0.8195 -0.2119 +vn 0.6524 -0.6843 -0.3259 +vn 0.7351 -0.5346 -0.4169 +vn 0.7879 -0.3806 -0.4841 +vn 0.8182 -0.2272 -0.5281 +vn 0.8318 -0.0755 -0.5499 +vn 0.8318 0.0755 -0.5499 +vn 0.8182 0.2272 -0.5281 +vn 0.7879 0.3806 -0.4841 +vn 0.7351 0.5346 -0.4169 +vn 0.6524 0.6842 -0.3259 +vn 0.5325 0.8195 -0.2119 +vn 0.3725 0.9247 -0.0790 +vn 0.1787 0.9819 0.0632 +vn -0.0315 0.9791 0.2007 +vn -0.2352 0.9177 0.3202 +vn -0.4132 0.8110 0.4142 +vn -0.5562 0.6767 0.4823 +vn -0.6636 0.5294 0.5286 +vn -0.7386 0.3777 0.5583 +vn -0.7858 0.2260 0.5757 +vn -0.8085 0.0752 0.5837 +vn -0.7858 -0.2260 0.5757 +vn -0.8085 -0.0752 0.5837 +vn -0.9503 0.0881 0.2984 +vn -0.9219 0.2632 0.2841 +vn -0.8638 0.4341 0.2559 +vn -0.7737 0.5960 0.2150 +vn -0.6502 0.7419 0.1639 +vn -0.4941 0.8628 0.1069 +vn -0.3101 0.9494 0.0501 +vn -0.1069 0.9943 0.0008 +vn 0.1038 0.9940 -0.0342 +vn 0.3100 0.9494 -0.0506 +vn 0.5006 0.8644 -0.0468 +vn 0.6661 0.7454 -0.0255 +vn 0.7998 0.6002 0.0073 +vn 0.8983 0.4374 0.0429 +vn 0.9615 0.2650 0.0726 +vn 0.9920 0.0887 0.0894 +vn 0.9920 -0.0887 0.0894 +vn 0.9615 -0.2650 0.0726 +vn 0.8983 -0.4374 0.0429 +vn 0.7998 -0.6002 0.0073 +vn 0.6661 -0.7454 -0.0255 +vn 0.5006 -0.8644 -0.0468 +vn 0.3100 -0.9494 -0.0506 +vn 0.1038 -0.9940 -0.0342 +vn -0.1069 -0.9943 0.0008 +vn -0.3101 -0.9494 0.0501 +vn -0.4941 -0.8628 0.1069 +vn -0.6502 -0.7419 0.1639 +vn -0.7737 -0.5960 0.2150 +vn -0.8638 -0.4341 0.2559 +vn -0.9219 -0.2632 0.2841 +vn -0.9503 -0.0881 0.2984 +vn -0.3194 0.9437 0.0860 +vn 0.7635 -0.6445 0.0425 +vn -0.8741 -0.1360 0.4663 +vn -0.4548 0.8752 0.1650 +vn 0.8989 -0.4306 0.0803 +vn -0.8175 -0.3916 0.4223 +vn -0.5906 0.7655 0.2552 +vn 0.9827 -0.1529 0.1044 +vn -0.7169 -0.6052 0.3462 +vn -0.7169 0.6052 0.3462 +vn 0.9827 0.1529 0.1044 +vn -0.5906 -0.7655 0.2552 +vn -0.8175 0.3916 0.4223 +vn 0.8989 0.4306 0.0803 +vn -0.4548 -0.8752 0.1650 +vn -0.8741 0.1360 0.4663 +vn 0.7635 0.6445 0.0425 +vn -0.3194 -0.9437 0.0860 +vn 0.6109 0.7917 0.0030 +vn -0.1886 -0.9818 0.0232 +vn 0.4609 0.8869 -0.0297 +vn -0.0622 -0.9978 -0.0214 +vn 0.3202 0.9460 -0.0506 +vn 0.0622 -0.9969 -0.0480 +vn 0.1883 0.9804 -0.0573 +vn 0.1883 -0.9804 -0.0573 +vn 0.0622 0.9969 -0.0480 +vn 0.3202 -0.9460 -0.0506 +vn -0.0622 0.9978 -0.0214 +vn 0.4609 -0.8869 -0.0297 +vn -0.1886 0.9818 0.0232 +usemtl Jewelry +s off +f 768/1/1 738/2/1 58/3/1 57/4/1 +f 196/5/2 194/6/2 83/7/2 84/8/2 +f 1219/9/3 1218/10/3 1115/11/3 1114/12/3 +f 85/13/4 84/8/4 116/14/4 117/15/4 +f 197/16/5 196/5/5 84/8/5 85/13/5 +f 738/2/6 739/17/6 59/18/6 58/3/6 +f 198/19/7 197/16/7 85/13/7 86/20/7 +f 739/17/8 740/21/8 60/22/8 59/18/8 +f 769/23/9 741/24/9 34/25/9 33/26/9 +f 199/27/10 198/19/10 86/20/10 87/28/10 +f 740/21/11 742/29/11 61/30/11 60/22/11 +f 741/24/12 743/31/12 35/32/12 34/25/12 +f 200/33/13 199/27/13 87/28/13 88/34/13 +f 742/29/14 744/35/14 62/36/14 61/30/14 +f 743/31/15 745/37/15 36/38/15 35/32/15 +f 201/39/16 200/33/16 88/34/16 89/40/16 +f 744/35/17 746/41/17 63/42/17 62/36/17 +f 745/37/18 747/43/18 37/44/18 36/38/18 +f 202/45/1 201/39/1 89/40/1 90/46/1 +f 746/41/19 748/47/19 64/48/19 63/42/19 +f 747/43/20 749/49/20 38/50/20 37/44/20 +f 203/51/6 202/45/6 90/46/6 91/52/6 +f 748/47/21 769/53/21 33/54/21 64/48/21 +f 749/49/22 750/55/22 39/56/22 38/50/22 +f 204/57/8 203/51/8 91/52/8 92/58/8 +f 205/59/9 195/60/9 66/61/9 65/62/9 +f 750/55/23 751/63/23 40/64/23 39/56/23 +f 206/65/11 204/57/11 92/58/11 93/66/11 +f 207/67/12 205/59/12 65/62/12 67/68/12 +f 751/63/24 752/69/24 41/70/24 40/64/24 +f 208/71/14 206/65/14 93/66/14 94/72/14 +f 209/73/15 207/67/15 67/68/15 68/74/15 +f 752/69/25 753/75/25 42/76/25 41/70/25 +f 210/77/17 208/71/17 94/72/17 95/78/17 +f 211/79/18 209/73/18 68/74/18 69/80/18 +f 753/75/26 754/81/26 43/82/26 42/76/26 +f 212/83/19 210/77/19 95/78/19 96/84/19 +f 213/85/20 211/79/20 69/80/20 70/86/20 +f 754/81/27 755/87/27 44/88/27 43/82/27 +f 195/89/21 212/83/21 96/84/21 66/90/21 +f 214/91/22 213/85/22 70/86/22 71/92/22 +f 755/87/28 756/93/28 45/94/28 44/88/28 +f 215/95/23 214/91/23 71/92/23 72/96/23 +f 756/93/29 757/97/29 46/98/29 45/94/29 +f 216/99/24 215/95/24 72/96/24 73/100/24 +f 757/97/30 758/101/30 47/102/30 46/98/30 +f 217/103/25 216/99/25 73/100/25 74/104/25 +f 758/101/31 759/105/31 48/106/31 47/102/31 +f 218/107/26 217/103/26 74/104/26 75/108/26 +f 759/105/32 760/109/32 49/110/32 48/106/32 +f 219/111/27 218/107/27 75/108/27 76/112/27 +f 760/109/33 761/113/33 50/114/33 49/110/33 +f 220/115/28 219/111/28 76/112/28 77/116/28 +f 761/113/34 762/117/34 51/118/34 50/114/34 +f 221/119/29 220/115/29 77/116/29 78/120/29 +f 762/117/2 763/121/2 52/122/2 51/118/2 +f 222/123/30 221/119/30 78/120/30 79/124/30 +f 763/121/5 764/125/5 53/126/5 52/122/5 +f 223/127/31 222/123/31 79/124/31 80/128/31 +f 764/125/7 765/129/7 54/130/7 53/126/7 +f 224/131/32 223/127/32 80/128/32 81/132/32 +f 765/129/10 766/133/10 55/134/10 54/130/10 +f 225/135/33 224/131/33 81/132/33 82/136/33 +f 766/133/13 767/137/13 56/138/13 55/134/13 +f 194/6/34 225/135/34 82/136/34 83/7/34 +f 767/137/16 768/1/16 57/4/16 56/138/16 +f 128/139/35 127/140/35 159/141/35 160/142/35 +f 72/96/36 71/92/36 103/143/36 104/144/36 +f 86/20/37 85/13/37 117/15/37 118/145/37 +f 73/100/38 72/96/38 104/144/38 105/146/38 +f 87/28/39 86/20/39 118/145/39 119/147/39 +f 74/104/40 73/100/40 105/146/40 106/148/40 +f 88/34/41 87/28/41 119/147/41 120/149/41 +f 75/108/42 74/104/42 106/148/42 107/150/42 +f 89/40/43 88/34/43 120/149/43 121/151/43 +f 76/112/44 75/108/44 107/150/44 108/152/44 +f 90/46/45 89/40/45 121/151/45 122/153/45 +f 77/116/46 76/112/46 108/152/46 109/154/46 +f 91/52/47 90/46/47 122/153/47 123/155/47 +f 78/120/48 77/116/48 109/154/48 110/156/48 +f 92/58/49 91/52/49 123/155/49 124/157/49 +f 79/124/50 78/120/50 110/156/50 111/158/50 +f 65/62/51 66/61/51 98/159/51 97/160/51 +f 93/66/52 92/58/52 124/157/52 125/161/52 +f 80/128/53 79/124/53 111/158/53 112/162/53 +f 67/68/54 65/62/54 97/160/54 99/163/54 +f 94/72/55 93/66/55 125/161/55 126/164/55 +f 81/132/56 80/128/56 112/162/56 113/165/56 +f 68/74/57 67/68/57 99/163/57 100/166/57 +f 95/78/58 94/72/58 126/164/58 127/140/58 +f 82/136/59 81/132/59 113/165/59 114/167/59 +f 69/80/60 68/74/60 100/166/60 101/168/60 +f 96/84/61 95/78/61 127/140/61 128/139/61 +f 83/7/62 82/136/62 114/167/62 115/169/62 +f 70/86/63 69/80/63 101/168/63 102/170/63 +f 66/90/64 96/84/64 128/139/64 98/171/64 +f 84/8/65 83/7/65 115/169/65 116/14/65 +f 71/92/66 70/86/66 102/170/66 103/143/66 +f 150/172/67 149/173/67 161/174/67 +f 115/169/68 114/167/68 146/175/68 147/176/68 +f 102/170/69 101/168/69 133/177/69 134/178/69 +f 98/171/70 128/139/70 160/142/70 130/179/70 +f 116/14/71 115/169/71 147/176/71 148/180/71 +f 103/143/72 102/170/72 134/178/72 135/181/72 +f 117/15/73 116/14/73 148/180/73 149/173/73 +f 104/144/74 103/143/74 135/181/74 136/182/74 +f 118/145/75 117/15/75 149/173/75 150/172/75 +f 105/146/76 104/144/76 136/182/76 137/183/76 +f 119/147/77 118/145/77 150/172/77 151/184/77 +f 106/148/78 105/146/78 137/183/78 138/185/78 +f 120/149/79 119/147/79 151/184/79 152/186/79 +f 107/150/80 106/148/80 138/185/80 139/187/80 +f 121/151/81 120/149/81 152/186/81 153/188/81 +f 108/152/82 107/150/82 139/187/82 140/189/82 +f 122/153/83 121/151/83 153/188/83 154/190/83 +f 109/154/84 108/152/84 140/189/84 141/191/84 +f 123/155/85 122/153/85 154/190/85 155/192/85 +f 110/156/86 109/154/86 141/191/86 142/193/86 +f 124/157/87 123/155/87 155/192/87 156/194/87 +f 111/158/88 110/156/88 142/193/88 143/195/88 +f 97/160/89 98/159/89 130/196/89 129/197/89 +f 125/161/90 124/157/90 156/194/90 157/198/90 +f 112/162/91 111/158/91 143/195/91 144/199/91 +f 99/163/92 97/160/92 129/197/92 131/200/92 +f 126/164/93 125/161/93 157/198/93 158/201/93 +f 113/165/94 112/162/94 144/199/94 145/202/94 +f 100/166/95 99/163/95 131/200/95 132/203/95 +f 127/140/96 126/164/96 158/201/96 159/141/96 +f 114/167/97 113/165/97 145/202/97 146/175/97 +f 101/168/98 100/166/98 132/203/98 133/177/98 +f 137/183/99 136/182/99 161/204/99 +f 151/184/100 150/172/100 161/205/100 +f 138/185/101 137/183/101 161/206/101 +f 152/186/102 151/184/102 161/207/102 +f 139/187/103 138/185/103 161/208/103 +f 153/188/104 152/186/104 161/209/104 +f 140/189/105 139/187/105 161/210/105 +f 154/190/106 153/188/106 161/211/106 +f 141/191/107 140/189/107 161/212/107 +f 155/192/108 154/190/108 161/213/108 +f 142/193/109 141/191/109 161/214/109 +f 156/194/110 155/192/110 161/215/110 +f 143/195/111 142/193/111 161/216/111 +f 129/197/112 130/196/112 161/217/112 +f 157/198/113 156/194/113 161/218/113 +f 144/199/114 143/195/114 161/219/114 +f 131/200/115 129/197/115 161/220/115 +f 158/201/116 157/198/116 161/221/116 +f 145/202/117 144/199/117 161/222/117 +f 132/203/118 131/200/118 161/223/118 +f 159/141/119 158/201/119 161/224/119 +f 146/175/120 145/202/120 161/225/120 +f 133/177/121 132/203/121 161/226/121 +f 160/142/122 159/141/122 161/227/122 +f 147/176/123 146/175/123 161/228/123 +f 134/178/124 133/177/124 161/229/124 +f 130/179/125 160/142/125 161/230/125 +f 148/180/126 147/176/126 161/231/126 +f 135/181/127 134/178/127 161/232/127 +f 149/173/128 148/180/128 161/233/128 +f 136/182/129 135/181/129 161/234/129 +f 597/235/130 574/236/130 225/135/130 194/6/130 +f 574/236/131 562/237/131 224/131/131 225/135/131 +f 562/237/132 550/238/132 223/127/132 224/131/132 +f 550/238/133 538/239/133 222/123/133 223/127/133 +f 538/239/134 526/240/134 221/119/134 222/123/134 +f 526/240/135 514/241/135 220/115/135 221/119/135 +f 514/241/136 502/242/136 219/111/136 220/115/136 +f 502/242/137 490/243/137 218/107/137 219/111/137 +f 490/243/138 478/244/138 217/103/138 218/107/138 +f 478/244/139 466/245/139 216/99/139 217/103/139 +f 466/245/140 454/246/140 215/95/140 216/99/140 +f 454/246/141 442/247/141 214/91/141 215/95/141 +f 442/247/142 430/248/142 213/85/142 214/91/142 +f 609/249/143 418/250/143 212/83/143 195/89/143 +f 430/248/144 406/251/144 211/79/144 213/85/144 +f 418/250/145 394/252/145 210/77/145 212/83/145 +f 406/251/146 382/253/146 209/73/146 211/79/146 +f 394/252/147 370/254/147 208/71/147 210/77/147 +f 382/253/148 358/255/148 207/67/148 209/73/148 +f 370/254/149 346/256/149 206/65/149 208/71/149 +f 358/255/150 334/257/150 205/59/150 207/67/150 +f 346/256/151 322/258/151 204/57/151 206/65/151 +f 334/257/152 609/259/152 195/60/152 205/59/152 +f 322/258/153 310/260/153 203/51/153 204/57/153 +f 310/260/154 298/261/154 202/45/154 203/51/154 +f 298/261/155 286/262/155 201/39/155 202/45/155 +f 286/262/156 274/263/156 200/33/156 201/39/156 +f 274/263/157 262/264/157 199/27/157 200/33/157 +f 262/264/158 250/265/158 198/19/158 199/27/158 +f 250/265/159 238/266/159 197/16/159 198/19/159 +f 238/266/160 226/267/160 196/5/160 197/16/160 +f 226/267/161 597/235/161 194/6/161 196/5/161 +f 163/268/162 162/269/162 586/270/162 237/271/162 +f 237/271/163 586/270/163 587/272/163 236/273/163 +f 236/273/2 587/272/2 588/274/2 235/275/2 +f 235/275/2 588/274/2 589/276/2 234/277/2 +f 674/278/164 704/279/164 590/280/164 233/281/164 +f 233/281/2 590/280/2 591/282/2 232/283/2 +f 642/284/164 672/285/164 592/286/164 231/287/164 +f 231/287/2 592/286/2 593/288/2 230/289/2 +f 610/290/164 640/291/164 594/292/164 229/293/164 +f 229/293/2 594/292/2 595/294/2 228/295/2 +f 228/295/2 595/294/2 596/296/2 227/297/2 +f 227/297/165 596/296/165 597/235/165 226/267/165 +f 164/298/166 163/268/166 237/271/166 249/299/166 +f 249/299/167 237/271/167 236/273/167 248/300/167 +f 248/300/5 236/273/5 235/275/5 247/301/5 +f 247/301/5 235/275/5 234/277/5 246/302/5 +f 675/303/168 674/278/168 233/281/168 245/304/168 +f 245/304/5 233/281/5 232/283/5 244/305/5 +f 643/306/168 642/284/168 231/287/168 243/307/168 +f 243/307/5 231/287/5 230/289/5 242/308/5 +f 611/309/168 610/290/168 229/293/168 241/310/168 +f 241/310/5 229/293/5 228/295/5 240/311/5 +f 240/311/5 228/295/5 227/297/5 239/312/5 +f 239/312/169 227/297/169 226/267/169 238/266/169 +f 165/313/170 164/298/170 249/299/170 261/314/170 +f 261/314/171 249/299/171 248/300/171 260/315/171 +f 260/315/7 248/300/7 247/301/7 259/316/7 +f 259/316/7 247/301/7 246/302/7 258/317/7 +f 676/318/172 675/303/172 245/304/172 257/319/172 +f 257/319/7 245/304/7 244/305/7 256/320/7 +f 644/321/172 643/306/172 243/307/172 255/322/172 +f 255/322/7 243/307/7 242/308/7 254/323/7 +f 612/324/172 611/309/172 241/310/172 253/325/172 +f 253/325/7 241/310/7 240/311/7 252/326/7 +f 252/326/7 240/311/7 239/312/7 251/327/7 +f 251/327/173 239/312/173 238/266/173 250/265/173 +f 166/328/174 165/313/174 261/314/174 273/329/174 +f 273/329/175 261/314/175 260/315/175 272/330/175 +f 272/330/10 260/315/10 259/316/10 271/331/10 +f 271/331/10 259/316/10 258/317/10 270/332/10 +f 677/333/176 676/318/176 257/319/176 269/334/176 +f 269/334/10 257/319/10 256/320/10 268/335/10 +f 645/336/176 644/321/176 255/322/176 267/337/176 +f 267/337/10 255/322/10 254/323/10 266/338/10 +f 613/339/176 612/324/176 253/325/176 265/340/176 +f 265/340/10 253/325/10 252/326/10 264/341/10 +f 264/341/10 252/326/10 251/327/10 263/342/10 +f 263/342/177 251/327/177 250/265/177 262/264/177 +f 167/343/178 166/328/178 273/329/178 285/344/178 +f 285/344/179 273/329/179 272/330/179 284/345/179 +f 284/345/13 272/330/13 271/331/13 283/346/13 +f 283/346/13 271/331/13 270/332/13 282/347/13 +f 678/348/180 677/333/180 269/334/180 281/349/180 +f 281/349/13 269/334/13 268/335/13 280/350/13 +f 646/351/180 645/336/180 267/337/180 279/352/180 +f 279/352/13 267/337/13 266/338/13 278/353/13 +f 614/354/180 613/339/180 265/340/180 277/355/180 +f 277/355/13 265/340/13 264/341/13 276/356/13 +f 276/356/13 264/341/13 263/342/13 275/357/13 +f 275/357/181 263/342/181 262/264/181 274/263/181 +f 168/358/182 167/343/182 285/344/182 297/359/182 +f 297/359/183 285/344/183 284/345/183 296/360/183 +f 296/360/16 284/345/16 283/346/16 295/361/16 +f 295/361/16 283/346/16 282/347/16 294/362/16 +f 679/363/184 678/348/184 281/349/184 293/364/184 +f 293/364/16 281/349/16 280/350/16 292/365/16 +f 647/366/184 646/351/184 279/352/184 291/367/184 +f 291/367/16 279/352/16 278/353/16 290/368/16 +f 615/369/184 614/354/184 277/355/184 289/370/184 +f 289/370/16 277/355/16 276/356/16 288/371/16 +f 288/371/16 276/356/16 275/357/16 287/372/16 +f 287/372/185 275/357/185 274/263/185 286/262/185 +f 169/373/186 168/358/186 297/359/186 309/374/186 +f 309/374/187 297/359/187 296/360/187 308/375/187 +f 308/375/1 296/360/1 295/361/1 307/376/1 +f 307/376/1 295/361/1 294/362/1 306/377/1 +f 680/378/188 679/363/188 293/364/188 305/379/188 +f 305/379/1 293/364/1 292/365/1 304/380/1 +f 648/381/189 647/366/189 291/367/189 303/382/189 +f 303/382/1 291/367/1 290/368/1 302/383/1 +f 616/384/189 615/369/189 289/370/189 301/385/189 +f 301/385/1 289/370/1 288/371/1 300/386/1 +f 300/386/1 288/371/1 287/372/1 299/387/1 +f 299/387/190 287/372/190 286/262/190 298/261/190 +f 170/388/191 169/373/191 309/374/191 321/389/191 +f 321/389/192 309/374/192 308/375/192 320/390/192 +f 320/390/6 308/375/6 307/376/6 319/391/6 +f 319/391/6 307/376/6 306/377/6 318/392/6 +f 681/393/193 680/378/193 305/379/193 317/394/193 +f 317/394/6 305/379/6 304/380/6 316/395/6 +f 649/396/193 648/381/193 303/382/193 315/397/193 +f 315/397/6 303/382/6 302/383/6 314/398/6 +f 617/399/193 616/384/193 301/385/193 313/400/193 +f 313/400/6 301/385/6 300/386/6 312/401/6 +f 312/401/6 300/386/6 299/387/6 311/402/6 +f 311/402/194 299/387/194 298/261/194 310/260/194 +f 171/403/195 170/388/195 321/389/195 333/404/195 +f 333/404/196 321/389/196 320/390/196 332/405/196 +f 332/405/8 320/390/8 319/391/8 331/406/8 +f 331/406/8 319/391/8 318/392/8 330/407/8 +f 682/408/197 681/393/197 317/394/197 329/409/197 +f 329/409/8 317/394/8 316/395/8 328/410/8 +f 650/411/197 649/396/197 315/397/197 327/412/197 +f 327/412/8 315/397/8 314/398/8 326/413/8 +f 618/414/197 617/399/197 313/400/197 325/415/197 +f 325/415/8 313/400/8 312/401/8 324/416/8 +f 324/416/8 312/401/8 311/402/8 323/417/8 +f 323/417/198 311/402/198 310/260/198 322/258/198 +f 173/418/199 172/419/199 598/420/199 345/421/199 +f 345/421/200 598/420/200 599/422/200 344/423/200 +f 344/423/9 599/422/9 600/424/9 343/425/9 +f 343/425/9 600/424/9 601/426/9 342/427/9 +f 683/428/201 705/429/201 602/430/201 341/431/201 +f 341/431/9 602/430/9 603/432/9 340/433/9 +f 651/434/202 673/435/202 604/436/202 339/437/202 +f 339/437/9 604/436/9 605/438/9 338/439/9 +f 619/440/201 641/441/201 606/442/201 337/443/201 +f 337/443/9 606/442/9 607/444/9 336/445/9 +f 336/445/9 607/444/9 608/446/9 335/447/9 +f 335/447/203 608/446/203 609/259/203 334/257/203 +f 174/448/204 171/403/204 333/404/204 357/449/204 +f 357/449/205 333/404/205 332/405/205 356/450/205 +f 356/450/11 332/405/11 331/406/11 355/451/11 +f 355/451/11 331/406/11 330/407/11 354/452/11 +f 684/453/206 682/408/206 329/409/206 353/454/206 +f 353/454/11 329/409/11 328/410/11 352/455/11 +f 652/456/206 650/411/206 327/412/206 351/457/206 +f 351/457/11 327/412/11 326/413/11 350/458/11 +f 620/459/206 618/414/206 325/415/206 349/460/206 +f 349/460/11 325/415/11 324/416/11 348/461/11 +f 348/461/11 324/416/11 323/417/11 347/462/11 +f 347/462/207 323/417/207 322/258/207 346/256/207 +f 175/463/208 173/418/208 345/421/208 369/464/208 +f 369/464/209 345/421/209 344/423/209 368/465/209 +f 368/465/12 344/423/12 343/425/12 367/466/12 +f 367/466/12 343/425/12 342/427/12 366/467/12 +f 685/468/210 683/428/210 341/431/210 365/469/210 +f 365/469/12 341/431/12 340/433/12 364/470/12 +f 653/471/210 651/434/210 339/437/210 363/472/210 +f 363/472/12 339/437/12 338/439/12 362/473/12 +f 621/474/210 619/440/210 337/443/210 361/475/210 +f 361/475/12 337/443/12 336/445/12 360/476/12 +f 360/476/12 336/445/12 335/447/12 359/477/12 +f 359/477/211 335/447/211 334/257/211 358/255/211 +f 176/478/212 174/448/212 357/449/212 381/479/212 +f 381/479/213 357/449/213 356/450/213 380/480/213 +f 380/480/14 356/450/14 355/451/14 379/481/14 +f 379/481/14 355/451/14 354/452/14 378/482/14 +f 686/483/214 684/453/214 353/454/214 377/484/214 +f 377/484/14 353/454/14 352/455/14 376/485/14 +f 654/486/214 652/456/214 351/457/214 375/487/214 +f 375/487/14 351/457/14 350/458/14 374/488/14 +f 622/489/214 620/459/214 349/460/214 373/490/214 +f 373/490/14 349/460/14 348/461/14 372/491/14 +f 372/491/14 348/461/14 347/462/14 371/492/14 +f 371/492/215 347/462/215 346/256/215 370/254/215 +f 177/493/216 175/463/216 369/464/216 393/494/216 +f 393/494/217 369/464/217 368/465/217 392/495/217 +f 392/495/15 368/465/15 367/466/15 391/496/15 +f 391/496/15 367/466/15 366/467/15 390/497/15 +f 687/498/218 685/468/218 365/469/218 389/499/218 +f 389/499/15 365/469/15 364/470/15 388/500/15 +f 655/501/218 653/471/218 363/472/218 387/502/218 +f 387/502/15 363/472/15 362/473/15 386/503/15 +f 623/504/218 621/474/218 361/475/218 385/505/218 +f 385/505/15 361/475/15 360/476/15 384/506/15 +f 384/506/15 360/476/15 359/477/15 383/507/15 +f 383/507/219 359/477/219 358/255/219 382/253/219 +f 178/508/220 176/478/220 381/479/220 405/509/220 +f 405/509/221 381/479/221 380/480/221 404/510/221 +f 404/510/17 380/480/17 379/481/17 403/511/17 +f 403/511/17 379/481/17 378/482/17 402/512/17 +f 688/513/222 686/483/222 377/484/222 401/514/222 +f 401/514/17 377/484/17 376/485/17 400/515/17 +f 656/516/222 654/486/222 375/487/222 399/517/222 +f 399/517/17 375/487/17 374/488/17 398/518/17 +f 624/519/222 622/489/222 373/490/222 397/520/222 +f 397/520/17 373/490/17 372/491/17 396/521/17 +f 396/521/17 372/491/17 371/492/17 395/522/17 +f 395/522/223 371/492/223 370/254/223 394/252/223 +f 179/523/224 177/493/224 393/494/224 417/524/224 +f 417/524/225 393/494/225 392/495/225 416/525/225 +f 416/525/18 392/495/18 391/496/18 415/526/18 +f 415/526/18 391/496/18 390/497/18 414/527/18 +f 689/528/226 687/498/226 389/499/226 413/529/226 +f 413/529/18 389/499/18 388/500/18 412/530/18 +f 657/531/226 655/501/226 387/502/226 411/532/226 +f 411/532/18 387/502/18 386/503/18 410/533/18 +f 625/534/226 623/504/226 385/505/226 409/535/226 +f 409/535/18 385/505/18 384/506/18 408/536/18 +f 408/536/18 384/506/18 383/507/18 407/537/18 +f 407/537/227 383/507/227 382/253/227 406/251/227 +f 180/538/228 178/508/228 405/509/228 429/539/228 +f 429/539/229 405/509/229 404/510/229 428/540/229 +f 428/540/19 404/510/19 403/511/19 427/541/19 +f 427/541/19 403/511/19 402/512/19 426/542/19 +f 690/543/230 688/513/230 401/514/230 425/544/230 +f 425/544/19 401/514/19 400/515/19 424/545/19 +f 658/546/230 656/516/230 399/517/230 423/547/230 +f 423/547/19 399/517/19 398/518/19 422/548/19 +f 626/549/230 624/519/230 397/520/230 421/550/230 +f 421/550/19 397/520/19 396/521/19 420/551/19 +f 420/551/19 396/521/19 395/522/19 419/552/19 +f 419/552/231 395/522/231 394/252/231 418/250/231 +f 181/553/232 179/523/232 417/524/232 441/554/232 +f 441/554/233 417/524/233 416/525/233 440/555/233 +f 440/555/20 416/525/20 415/526/20 439/556/20 +f 439/556/20 415/526/20 414/527/20 438/557/20 +f 691/558/234 689/528/234 413/529/234 437/559/234 +f 437/559/20 413/529/20 412/530/20 436/560/20 +f 659/561/234 657/531/234 411/532/234 435/562/234 +f 435/562/20 411/532/20 410/533/20 434/563/20 +f 627/564/234 625/534/234 409/535/234 433/565/234 +f 433/565/20 409/535/20 408/536/20 432/566/20 +f 432/566/20 408/536/20 407/537/20 431/567/20 +f 431/567/235 407/537/235 406/251/235 430/248/235 +f 172/568/236 180/538/236 429/539/236 598/569/236 +f 598/569/237 429/539/237 428/540/237 599/570/237 +f 599/570/21 428/540/21 427/541/21 600/571/21 +f 600/571/21 427/541/21 426/542/21 601/572/21 +f 705/573/238 690/543/238 425/544/238 602/574/238 +f 602/574/21 425/544/21 424/545/21 603/575/21 +f 673/576/239 658/546/239 423/547/239 604/577/239 +f 604/577/21 423/547/21 422/548/21 605/578/21 +f 641/579/238 626/549/238 421/550/238 606/580/238 +f 606/580/21 421/550/21 420/551/21 607/581/21 +f 607/581/21 420/551/21 419/552/21 608/582/21 +f 608/582/240 419/552/240 418/250/240 609/249/240 +f 182/583/241 181/553/241 441/554/241 453/584/241 +f 453/584/242 441/554/242 440/555/242 452/585/242 +f 452/585/22 440/555/22 439/556/22 451/586/22 +f 451/586/22 439/556/22 438/557/22 450/587/22 +f 692/588/243 691/558/243 437/559/243 449/589/243 +f 449/589/22 437/559/22 436/560/22 448/590/22 +f 660/591/243 659/561/243 435/562/243 447/592/243 +f 447/592/22 435/562/22 434/563/22 446/593/22 +f 628/594/243 627/564/243 433/565/243 445/595/243 +f 445/595/22 433/565/22 432/566/22 444/596/22 +f 444/596/22 432/566/22 431/567/22 443/597/22 +f 443/597/244 431/567/244 430/248/244 442/247/244 +f 183/598/245 182/583/245 453/584/245 465/599/245 +f 465/599/246 453/584/246 452/585/246 464/600/246 +f 464/600/23 452/585/23 451/586/23 463/601/23 +f 463/601/23 451/586/23 450/587/23 462/602/23 +f 693/603/247 692/588/247 449/589/247 461/604/247 +f 461/604/23 449/589/23 448/590/23 460/605/23 +f 661/606/247 660/591/247 447/592/247 459/607/247 +f 459/607/23 447/592/23 446/593/23 458/608/23 +f 629/609/247 628/594/247 445/595/247 457/610/247 +f 457/610/23 445/595/23 444/596/23 456/611/23 +f 456/611/23 444/596/23 443/597/23 455/612/23 +f 455/612/248 443/597/248 442/247/248 454/246/248 +f 184/613/249 183/598/249 465/599/249 477/614/249 +f 477/614/250 465/599/250 464/600/250 476/615/250 +f 476/615/24 464/600/24 463/601/24 475/616/24 +f 475/616/24 463/601/24 462/602/24 474/617/24 +f 694/618/251 693/603/251 461/604/251 473/619/251 +f 473/619/24 461/604/24 460/605/24 472/620/24 +f 662/621/251 661/606/251 459/607/251 471/622/251 +f 471/622/24 459/607/24 458/608/24 470/623/24 +f 630/624/251 629/609/251 457/610/251 469/625/251 +f 469/625/24 457/610/24 456/611/24 468/626/24 +f 468/626/24 456/611/24 455/612/24 467/627/24 +f 467/627/252 455/612/252 454/246/252 466/245/252 +f 185/628/253 184/613/253 477/614/253 489/629/253 +f 489/629/254 477/614/254 476/615/254 488/630/254 +f 488/630/25 476/615/25 475/616/25 487/631/25 +f 487/631/25 475/616/25 474/617/25 486/632/25 +f 695/633/255 694/618/255 473/619/255 485/634/255 +f 485/634/25 473/619/25 472/620/25 484/635/25 +f 663/636/255 662/621/255 471/622/255 483/637/255 +f 483/637/25 471/622/25 470/623/25 482/638/25 +f 631/639/255 630/624/255 469/625/255 481/640/255 +f 481/640/25 469/625/25 468/626/25 480/641/25 +f 480/641/25 468/626/25 467/627/25 479/642/25 +f 479/642/256 467/627/256 466/245/256 478/244/256 +f 186/643/257 185/628/257 489/629/257 501/644/257 +f 501/644/258 489/629/258 488/630/258 500/645/258 +f 500/645/26 488/630/26 487/631/26 499/646/26 +f 499/646/26 487/631/26 486/632/26 498/647/26 +f 696/648/259 695/633/259 485/634/259 497/649/259 +f 497/649/26 485/634/26 484/635/26 496/650/26 +f 664/651/259 663/636/259 483/637/259 495/652/259 +f 495/652/26 483/637/26 482/638/26 494/653/26 +f 632/654/259 631/639/259 481/640/259 493/655/259 +f 493/655/26 481/640/26 480/641/26 492/656/26 +f 492/656/26 480/641/26 479/642/26 491/657/26 +f 491/657/260 479/642/260 478/244/260 490/243/260 +f 187/658/261 186/643/261 501/644/261 513/659/261 +f 513/659/262 501/644/262 500/645/262 512/660/262 +f 512/660/27 500/645/27 499/646/27 511/661/27 +f 511/661/27 499/646/27 498/647/27 510/662/27 +f 697/663/263 696/648/263 497/649/263 509/664/263 +f 509/664/27 497/649/27 496/650/27 508/665/27 +f 665/666/263 664/651/263 495/652/263 507/667/263 +f 507/667/27 495/652/27 494/653/27 506/668/27 +f 633/669/263 632/654/263 493/655/263 505/670/263 +f 505/670/27 493/655/27 492/656/27 504/671/27 +f 504/671/27 492/656/27 491/657/27 503/672/27 +f 503/672/264 491/657/264 490/243/264 502/242/264 +f 188/673/265 187/658/265 513/659/265 525/674/265 +f 525/674/266 513/659/266 512/660/266 524/675/266 +f 524/675/28 512/660/28 511/661/28 523/676/28 +f 523/676/28 511/661/28 510/662/28 522/677/28 +f 698/678/267 697/663/267 509/664/267 521/679/267 +f 521/679/28 509/664/28 508/665/28 520/680/28 +f 666/681/267 665/666/267 507/667/267 519/682/267 +f 519/682/28 507/667/28 506/668/28 518/683/28 +f 634/684/267 633/669/267 505/670/267 517/685/267 +f 517/685/28 505/670/28 504/671/28 516/686/28 +f 516/686/28 504/671/28 503/672/28 515/687/28 +f 515/687/268 503/672/268 502/242/268 514/241/268 +f 189/688/269 188/673/269 525/674/269 537/689/269 +f 537/689/270 525/674/270 524/675/270 536/690/270 +f 536/690/29 524/675/29 523/676/29 535/691/29 +f 535/691/29 523/676/29 522/677/29 534/692/29 +f 699/693/271 698/678/271 521/679/271 533/694/271 +f 533/694/29 521/679/29 520/680/29 532/695/29 +f 667/696/271 666/681/271 519/682/271 531/697/271 +f 531/697/29 519/682/29 518/683/29 530/698/29 +f 635/699/271 634/684/271 517/685/271 529/700/271 +f 529/700/29 517/685/29 516/686/29 528/701/29 +f 528/701/29 516/686/29 515/687/29 527/702/29 +f 527/702/272 515/687/272 514/241/272 526/240/272 +f 190/703/273 189/688/273 537/689/273 549/704/273 +f 549/704/274 537/689/274 536/690/274 548/705/274 +f 548/705/30 536/690/30 535/691/30 547/706/30 +f 547/706/30 535/691/30 534/692/30 546/707/30 +f 700/708/275 699/693/275 533/694/275 545/709/275 +f 545/709/30 533/694/30 532/695/30 544/710/30 +f 668/711/275 667/696/275 531/697/275 543/712/275 +f 543/712/30 531/697/30 530/698/30 542/713/30 +f 636/714/275 635/699/275 529/700/275 541/715/275 +f 541/715/30 529/700/30 528/701/30 540/716/30 +f 540/716/30 528/701/30 527/702/30 539/717/30 +f 539/717/276 527/702/276 526/240/276 538/239/276 +f 191/718/277 190/703/277 549/704/277 561/719/277 +f 561/719/278 549/704/278 548/705/278 560/720/278 +f 560/720/31 548/705/31 547/706/31 559/721/31 +f 559/721/31 547/706/31 546/707/31 558/722/31 +f 701/723/279 700/708/279 545/709/279 557/724/279 +f 557/724/31 545/709/31 544/710/31 556/725/31 +f 669/726/279 668/711/279 543/712/279 555/727/279 +f 555/727/31 543/712/31 542/713/31 554/728/31 +f 637/729/279 636/714/279 541/715/279 553/730/279 +f 553/730/31 541/715/31 540/716/31 552/731/31 +f 552/731/31 540/716/31 539/717/31 551/732/31 +f 551/732/280 539/717/280 538/239/280 550/238/280 +f 192/733/281 191/718/281 561/719/281 573/734/281 +f 573/734/282 561/719/282 560/720/282 572/735/282 +f 572/735/32 560/720/32 559/721/32 571/736/32 +f 571/736/32 559/721/32 558/722/32 570/737/32 +f 702/738/283 701/723/283 557/724/283 569/739/283 +f 569/739/32 557/724/32 556/725/32 568/740/32 +f 670/741/283 669/726/283 555/727/283 567/742/283 +f 567/742/32 555/727/32 554/728/32 566/743/32 +f 638/744/283 637/729/283 553/730/283 565/745/283 +f 565/745/32 553/730/32 552/731/32 564/746/32 +f 564/746/32 552/731/32 551/732/32 563/747/32 +f 563/747/284 551/732/284 550/238/284 562/237/284 +f 193/748/285 192/733/285 573/734/285 585/749/285 +f 585/749/286 573/734/286 572/735/286 584/750/286 +f 584/750/33 572/735/33 571/736/33 583/751/33 +f 583/751/33 571/736/33 570/737/33 582/752/33 +f 703/753/287 702/738/287 569/739/287 581/754/287 +f 581/754/33 569/739/33 568/740/33 580/755/33 +f 671/756/287 670/741/287 567/742/287 579/757/287 +f 579/757/33 567/742/33 566/743/33 578/758/33 +f 639/759/287 638/744/287 565/745/287 577/760/287 +f 577/760/33 565/745/33 564/746/33 576/761/33 +f 576/761/33 564/746/33 563/747/33 575/762/33 +f 575/762/288 563/747/288 562/237/288 574/236/288 +f 162/269/289 193/748/289 585/749/289 586/270/289 +f 586/270/290 585/749/290 584/750/290 587/272/290 +f 587/272/34 584/750/34 583/751/34 588/274/34 +f 588/274/34 583/751/34 582/752/34 589/276/34 +f 704/279/291 703/753/291 581/754/291 590/280/291 +f 590/280/34 581/754/34 580/755/34 591/282/34 +f 672/285/291 671/756/291 579/757/291 592/286/291 +f 592/286/34 579/757/34 578/758/34 593/288/34 +f 640/291/291 639/759/291 577/760/291 594/292/291 +f 594/292/34 577/760/34 576/761/34 595/294/34 +f 595/294/34 576/761/34 575/762/34 596/296/34 +f 596/296/292 575/762/292 574/236/292 597/235/292 +f 593/288/293 578/758/293 639/759/293 640/291/293 +f 578/758/294 566/743/294 638/744/294 639/759/294 +f 566/743/295 554/728/295 637/729/295 638/744/295 +f 554/728/296 542/713/296 636/714/296 637/729/296 +f 542/713/297 530/698/297 635/699/297 636/714/297 +f 530/698/298 518/683/298 634/684/298 635/699/298 +f 518/683/299 506/668/299 633/669/299 634/684/299 +f 506/668/300 494/653/300 632/654/300 633/669/300 +f 494/653/301 482/638/301 631/639/301 632/654/301 +f 482/638/302 470/623/302 630/624/302 631/639/302 +f 470/623/303 458/608/303 629/609/303 630/624/303 +f 458/608/304 446/593/304 628/594/304 629/609/304 +f 446/593/305 434/563/305 627/564/305 628/594/305 +f 605/578/306 422/548/306 626/549/306 641/579/306 +f 434/563/307 410/533/307 625/534/307 627/564/307 +f 422/548/308 398/518/308 624/519/308 626/549/308 +f 410/533/309 386/503/309 623/504/309 625/534/309 +f 398/518/310 374/488/310 622/489/310 624/519/310 +f 386/503/311 362/473/311 621/474/311 623/504/311 +f 374/488/312 350/458/312 620/459/312 622/489/312 +f 362/473/313 338/439/313 619/440/313 621/474/313 +f 350/458/314 326/413/314 618/414/314 620/459/314 +f 338/439/315 605/438/315 641/441/315 619/440/315 +f 326/413/316 314/398/316 617/399/316 618/414/316 +f 314/398/317 302/383/317 616/384/317 617/399/317 +f 302/383/318 290/368/318 615/369/318 616/384/318 +f 290/368/319 278/353/319 614/354/319 615/369/319 +f 278/353/320 266/338/320 613/339/320 614/354/320 +f 266/338/321 254/323/321 612/324/321 613/339/321 +f 254/323/322 242/308/322 611/309/322 612/324/322 +f 242/308/323 230/289/323 610/290/323 611/309/323 +f 230/289/324 593/288/324 640/291/324 610/290/324 +f 591/282/325 580/755/325 671/756/325 672/285/325 +f 580/755/294 568/740/294 670/741/294 671/756/294 +f 568/740/295 556/725/295 669/726/295 670/741/295 +f 556/725/296 544/710/296 668/711/296 669/726/296 +f 544/710/297 532/695/297 667/696/297 668/711/297 +f 532/695/298 520/680/298 666/681/298 667/696/298 +f 520/680/299 508/665/299 665/666/299 666/681/299 +f 508/665/300 496/650/300 664/651/300 665/666/300 +f 496/650/301 484/635/301 663/636/301 664/651/301 +f 484/635/302 472/620/302 662/621/302 663/636/302 +f 472/620/303 460/605/303 661/606/303 662/621/303 +f 460/605/304 448/590/304 660/591/304 661/606/304 +f 448/590/305 436/560/305 659/561/305 660/591/305 +f 603/575/306 424/545/306 658/546/306 673/576/306 +f 436/560/307 412/530/307 657/531/307 659/561/307 +f 424/545/308 400/515/308 656/516/308 658/546/308 +f 412/530/309 388/500/309 655/501/309 657/531/309 +f 400/515/310 376/485/310 654/486/310 656/516/310 +f 388/500/311 364/470/311 653/471/311 655/501/311 +f 376/485/312 352/455/312 652/456/312 654/486/312 +f 364/470/313 340/433/313 651/434/313 653/471/313 +f 352/455/314 328/410/314 650/411/314 652/456/314 +f 340/433/315 603/432/315 673/435/315 651/434/315 +f 328/410/316 316/395/316 649/396/316 650/411/316 +f 316/395/317 304/380/317 648/381/317 649/396/317 +f 304/380/318 292/365/318 647/366/318 648/381/318 +f 292/365/326 280/350/326 646/351/326 647/366/326 +f 280/350/320 268/335/320 645/336/320 646/351/320 +f 268/335/321 256/320/321 644/321/321 645/336/321 +f 256/320/322 244/305/322 643/306/322 644/321/322 +f 244/305/323 232/283/323 642/284/323 643/306/323 +f 232/283/324 591/282/324 672/285/324 642/284/324 +f 589/276/293 582/752/293 703/753/293 704/279/293 +f 582/752/294 570/737/294 702/738/294 703/753/294 +f 570/737/327 558/722/327 701/723/327 702/738/327 +f 558/722/296 546/707/296 700/708/296 701/723/296 +f 546/707/297 534/692/297 699/693/297 700/708/297 +f 534/692/298 522/677/298 698/678/298 699/693/298 +f 522/677/299 510/662/299 697/663/299 698/678/299 +f 510/662/300 498/647/300 696/648/300 697/663/300 +f 498/647/301 486/632/301 695/633/301 696/648/301 +f 486/632/328 474/617/328 694/618/328 695/633/328 +f 474/617/329 462/602/329 693/603/329 694/618/329 +f 462/602/304 450/587/304 692/588/304 693/603/304 +f 450/587/305 438/557/305 691/558/305 692/588/305 +f 601/572/306 426/542/306 690/543/306 705/573/306 +f 438/557/307 414/527/307 689/528/307 691/558/307 +f 426/542/308 402/512/308 688/513/308 690/543/308 +f 414/527/309 390/497/309 687/498/309 689/528/309 +f 402/512/310 378/482/310 686/483/310 688/513/310 +f 390/497/311 366/467/311 685/468/311 687/498/311 +f 378/482/312 354/452/312 684/453/312 686/483/312 +f 366/467/313 342/427/313 683/428/313 685/468/313 +f 354/452/314 330/407/314 682/408/314 684/453/314 +f 342/427/315 601/426/315 705/429/315 683/428/315 +f 330/407/316 318/392/316 681/393/316 682/408/316 +f 318/392/317 306/377/317 680/378/317 681/393/317 +f 306/377/318 294/362/318 679/363/318 680/378/318 +f 294/362/330 282/347/330 678/348/330 679/363/330 +f 282/347/331 270/332/331 677/333/331 678/348/331 +f 270/332/321 258/317/321 676/318/321 677/333/321 +f 258/317/322 246/302/322 675/303/322 676/318/322 +f 246/302/323 234/277/323 674/278/323 675/303/323 +f 234/277/324 589/276/324 704/279/324 674/278/324 +f 24/763/16 25/764/16 707/765/16 737/766/16 +f 23/767/13 24/763/13 737/766/13 736/768/13 +f 22/769/10 23/767/10 736/768/10 735/770/10 +f 21/771/7 22/769/7 735/770/7 734/772/7 +f 20/773/5 21/771/5 734/772/5 733/774/5 +f 19/775/2 20/773/2 733/774/2 732/776/2 +f 18/777/34 19/775/34 732/776/34 731/778/34 +f 17/779/33 18/777/33 731/778/33 730/780/33 +f 16/781/32 17/779/32 730/780/32 729/782/32 +f 15/783/31 16/781/31 729/782/31 728/784/31 +f 14/785/30 15/783/30 728/784/30 727/786/30 +f 13/787/29 14/785/29 727/786/29 726/788/29 +f 12/789/28 13/787/28 726/788/28 725/790/28 +f 11/791/27 12/789/27 725/790/27 724/792/27 +f 10/793/26 11/791/26 724/792/26 723/794/26 +f 9/795/25 10/793/25 723/794/25 722/796/25 +f 8/797/24 9/795/24 722/796/24 721/798/24 +f 7/799/23 8/797/23 721/798/23 720/800/23 +f 6/801/22 7/799/22 720/800/22 719/802/22 +f 32/803/21 1/804/21 711/805/21 718/806/21 +f 5/807/20 6/801/20 719/802/20 717/808/20 +f 31/809/19 32/803/19 718/806/19 716/810/19 +f 4/811/18 5/807/18 717/808/18 715/812/18 +f 30/813/17 31/809/17 716/810/17 714/814/17 +f 3/815/15 4/811/15 715/812/15 713/816/15 +f 29/817/14 30/813/14 714/814/14 712/818/14 +f 2/819/12 3/815/12 713/816/12 710/820/12 +f 28/821/11 29/817/11 712/818/11 709/822/11 +f 1/823/9 2/819/9 710/820/9 711/824/9 +f 27/825/8 28/821/8 709/822/8 708/826/8 +f 26/827/6 27/825/6 708/826/6 706/828/6 +f 25/764/1 26/827/1 706/828/1 707/765/1 +f 1025/829/332 770/830/332 768/1/332 767/137/332 +f 1017/831/333 1025/829/333 767/137/333 766/133/333 +f 1009/832/334 1017/831/334 766/133/334 765/129/334 +f 1001/833/335 1009/832/335 765/129/335 764/125/335 +f 993/834/336 1001/833/336 764/125/336 763/121/336 +f 985/835/337 993/834/337 763/121/337 762/117/337 +f 977/836/338 985/835/338 762/117/338 761/113/338 +f 969/837/339 977/836/339 761/113/339 760/109/339 +f 961/838/340 969/837/340 760/109/340 759/105/340 +f 953/839/341 961/838/341 759/105/341 758/101/341 +f 945/840/342 953/839/342 758/101/342 757/97/342 +f 937/841/343 945/840/343 757/97/343 756/93/343 +f 929/842/344 937/841/344 756/93/344 755/87/344 +f 921/843/345 929/842/345 755/87/345 754/81/345 +f 913/844/346 921/843/346 754/81/346 753/75/346 +f 905/845/347 913/844/347 753/75/347 752/69/347 +f 897/846/348 905/845/348 752/69/348 751/63/348 +f 889/847/349 897/846/349 751/63/349 750/55/349 +f 881/848/350 889/847/350 750/55/350 749/49/350 +f 873/849/351 778/850/351 769/53/351 748/47/351 +f 865/851/352 881/848/352 749/49/352 747/43/352 +f 857/852/353 873/849/353 748/47/353 746/41/353 +f 849/853/354 865/851/354 747/43/354 745/37/354 +f 841/854/355 857/852/355 746/41/355 744/35/355 +f 833/855/356 849/853/356 745/37/356 743/31/356 +f 825/856/357 841/854/357 744/35/357 742/29/357 +f 817/857/358 833/855/358 743/31/358 741/24/358 +f 809/858/359 825/856/359 742/29/359 740/21/359 +f 778/859/360 817/857/360 741/24/360 769/23/360 +f 801/860/361 809/858/361 740/21/361 739/17/361 +f 793/861/362 801/860/362 739/17/362 738/2/362 +f 770/830/363 793/861/363 738/2/363 768/1/363 +f 707/765/364 706/828/364 786/862/364 777/863/364 +f 777/863/365 786/862/365 787/864/365 776/865/365 +f 776/865/1 787/864/1 788/866/1 775/867/1 +f 1058/868/366 1060/869/366 789/870/366 774/871/366 +f 774/871/1 789/870/1 790/872/1 773/873/1 +f 1026/874/367 1028/875/367 791/876/367 772/877/367 +f 772/877/1 791/876/1 792/878/1 771/879/1 +f 771/879/368 792/878/368 793/861/368 770/830/368 +f 706/828/369 708/826/369 794/880/369 786/862/369 +f 786/862/370 794/880/370 795/881/370 787/864/370 +f 787/864/6 795/881/6 796/882/6 788/866/6 +f 1060/869/371 1061/883/371 797/884/371 789/870/371 +f 789/870/6 797/884/6 798/885/6 790/872/6 +f 1028/875/371 1029/886/371 799/887/371 791/876/371 +f 791/876/6 799/887/6 800/888/6 792/878/6 +f 792/878/372 800/888/372 801/860/372 793/861/372 +f 708/826/373 709/822/373 802/889/373 794/880/373 +f 794/880/374 802/889/374 803/890/374 795/881/374 +f 795/881/8 803/890/8 804/891/8 796/882/8 +f 1061/883/375 1062/892/375 805/893/375 797/884/375 +f 797/884/8 805/893/8 806/894/8 798/885/8 +f 1029/886/375 1030/895/375 807/896/375 799/887/375 +f 799/887/8 807/896/8 808/897/8 800/888/8 +f 800/888/376 808/897/376 809/858/376 801/860/376 +f 711/824/377 710/820/377 810/898/377 785/899/377 +f 785/899/378 810/898/378 811/900/378 784/901/378 +f 784/901/9 811/900/9 812/902/9 783/903/9 +f 1059/904/379 1063/905/379 813/906/379 782/907/379 +f 782/907/9 813/906/9 814/908/9 781/909/9 +f 1027/910/380 1031/911/380 815/912/380 780/913/380 +f 780/913/9 815/912/9 816/914/9 779/915/9 +f 779/915/381 816/914/381 817/857/381 778/859/381 +f 709/822/382 712/818/382 818/916/382 802/889/382 +f 802/889/383 818/916/383 819/917/383 803/890/383 +f 803/890/11 819/917/11 820/918/11 804/891/11 +f 1062/892/384 1064/919/384 821/920/384 805/893/384 +f 805/893/11 821/920/11 822/921/11 806/894/11 +f 1030/895/384 1032/922/384 823/923/384 807/896/384 +f 807/896/11 823/923/11 824/924/11 808/897/11 +f 808/897/385 824/924/385 825/856/385 809/858/385 +f 710/820/386 713/816/386 826/925/386 810/898/386 +f 810/898/387 826/925/387 827/926/387 811/900/387 +f 811/900/12 827/926/12 828/927/12 812/902/12 +f 1063/905/388 1065/928/388 829/929/388 813/906/388 +f 813/906/12 829/929/12 830/930/12 814/908/12 +f 1031/911/388 1033/931/388 831/932/388 815/912/388 +f 815/912/12 831/932/12 832/933/12 816/914/12 +f 816/914/389 832/933/389 833/855/389 817/857/389 +f 712/818/390 714/814/390 834/934/390 818/916/390 +f 818/916/391 834/934/391 835/935/391 819/917/391 +f 819/917/14 835/935/14 836/936/14 820/918/14 +f 1064/919/392 1066/937/392 837/938/392 821/920/392 +f 821/920/14 837/938/14 838/939/14 822/921/14 +f 1032/922/392 1034/940/392 839/941/392 823/923/392 +f 823/923/14 839/941/14 840/942/14 824/924/14 +f 824/924/393 840/942/393 841/854/393 825/856/393 +f 713/816/394 715/812/394 842/943/394 826/925/394 +f 826/925/395 842/943/395 843/944/395 827/926/395 +f 827/926/15 843/944/15 844/945/15 828/927/15 +f 1065/928/396 1067/946/396 845/947/396 829/929/396 +f 829/929/15 845/947/15 846/948/15 830/930/15 +f 1033/931/396 1035/949/396 847/950/396 831/932/396 +f 831/932/15 847/950/15 848/951/15 832/933/15 +f 832/933/397 848/951/397 849/853/397 833/855/397 +f 714/814/398 716/810/398 850/952/398 834/934/398 +f 834/934/399 850/952/399 851/953/399 835/935/399 +f 835/935/17 851/953/17 852/954/17 836/936/17 +f 1066/937/400 1068/955/400 853/956/400 837/938/400 +f 837/938/17 853/956/17 854/957/17 838/939/17 +f 1034/940/400 1036/958/400 855/959/400 839/941/400 +f 839/941/17 855/959/17 856/960/17 840/942/17 +f 840/942/401 856/960/401 857/852/401 841/854/401 +f 715/812/402 717/808/402 858/961/402 842/943/402 +f 842/943/403 858/961/403 859/962/403 843/944/403 +f 843/944/18 859/962/18 860/963/18 844/945/18 +f 1067/946/404 1069/964/404 861/965/404 845/947/404 +f 845/947/18 861/965/18 862/966/18 846/948/18 +f 1035/949/404 1037/967/404 863/968/404 847/950/404 +f 847/950/18 863/968/18 864/969/18 848/951/18 +f 848/951/405 864/969/405 865/851/405 849/853/405 +f 716/810/406 718/806/406 866/970/406 850/952/406 +f 850/952/407 866/970/407 867/971/407 851/953/407 +f 851/953/19 867/971/19 868/972/19 852/954/19 +f 1068/955/408 1070/973/408 869/974/408 853/956/408 +f 853/956/19 869/974/19 870/975/19 854/957/19 +f 1036/958/408 1038/976/408 871/977/408 855/959/408 +f 855/959/19 871/977/19 872/978/19 856/960/19 +f 856/960/409 872/978/409 873/849/409 857/852/409 +f 717/808/410 719/802/410 874/979/410 858/961/410 +f 858/961/411 874/979/411 875/980/411 859/962/411 +f 859/962/20 875/980/20 876/981/20 860/963/20 +f 1069/964/412 1071/982/412 877/983/412 861/965/412 +f 861/965/20 877/983/20 878/984/20 862/966/20 +f 1037/967/412 1039/985/412 879/986/412 863/968/412 +f 863/968/20 879/986/20 880/987/20 864/969/20 +f 864/969/413 880/987/413 881/848/413 865/851/413 +f 718/806/414 711/805/414 785/988/414 866/970/414 +f 866/970/415 785/988/415 784/989/415 867/971/415 +f 867/971/21 784/989/21 783/990/21 868/972/21 +f 1070/973/416 1059/991/416 782/992/416 869/974/416 +f 869/974/21 782/992/21 781/993/21 870/975/21 +f 1038/976/417 1027/994/417 780/995/417 871/977/417 +f 871/977/21 780/995/21 779/996/21 872/978/21 +f 872/978/418 779/996/418 778/850/418 873/849/418 +f 719/802/419 720/800/419 882/997/419 874/979/419 +f 874/979/420 882/997/420 883/998/420 875/980/420 +f 875/980/22 883/998/22 884/999/22 876/981/22 +f 1071/982/421 1072/1000/421 885/1001/421 877/983/421 +f 877/983/22 885/1001/22 886/1002/22 878/984/22 +f 1039/985/421 1040/1003/421 887/1004/421 879/986/421 +f 879/986/22 887/1004/22 888/1005/22 880/987/22 +f 880/987/422 888/1005/422 889/847/422 881/848/422 +f 720/800/423 721/798/423 890/1006/423 882/997/423 +f 882/997/424 890/1006/424 891/1007/424 883/998/424 +f 883/998/23 891/1007/23 892/1008/23 884/999/23 +f 1072/1000/425 1073/1009/425 893/1010/425 885/1001/425 +f 885/1001/23 893/1010/23 894/1011/23 886/1002/23 +f 1040/1003/425 1041/1012/425 895/1013/425 887/1004/425 +f 887/1004/23 895/1013/23 896/1014/23 888/1005/23 +f 888/1005/426 896/1014/426 897/846/426 889/847/426 +f 721/798/427 722/796/427 898/1015/427 890/1006/427 +f 890/1006/428 898/1015/428 899/1016/428 891/1007/428 +f 891/1007/24 899/1016/24 900/1017/24 892/1008/24 +f 1073/1009/429 1074/1018/429 901/1019/429 893/1010/429 +f 893/1010/24 901/1019/24 902/1020/24 894/1011/24 +f 1041/1012/429 1042/1021/429 903/1022/429 895/1013/429 +f 895/1013/24 903/1022/24 904/1023/24 896/1014/24 +f 896/1014/430 904/1023/430 905/845/430 897/846/430 +f 722/796/431 723/794/431 906/1024/431 898/1015/431 +f 898/1015/432 906/1024/432 907/1025/432 899/1016/432 +f 899/1016/25 907/1025/25 908/1026/25 900/1017/25 +f 1074/1018/433 1075/1027/433 909/1028/433 901/1019/433 +f 901/1019/25 909/1028/25 910/1029/25 902/1020/25 +f 1042/1021/433 1043/1030/433 911/1031/433 903/1022/433 +f 903/1022/25 911/1031/25 912/1032/25 904/1023/25 +f 904/1023/434 912/1032/434 913/844/434 905/845/434 +f 723/794/435 724/792/435 914/1033/435 906/1024/435 +f 906/1024/436 914/1033/436 915/1034/436 907/1025/436 +f 907/1025/26 915/1034/26 916/1035/26 908/1026/26 +f 1075/1027/437 1076/1036/437 917/1037/437 909/1028/437 +f 909/1028/26 917/1037/26 918/1038/26 910/1029/26 +f 1043/1030/437 1044/1039/437 919/1040/437 911/1031/437 +f 911/1031/26 919/1040/26 920/1041/26 912/1032/26 +f 912/1032/438 920/1041/438 921/843/438 913/844/438 +f 724/792/439 725/790/439 922/1042/439 914/1033/439 +f 914/1033/440 922/1042/440 923/1043/440 915/1034/440 +f 915/1034/27 923/1043/27 924/1044/27 916/1035/27 +f 1076/1036/441 1077/1045/441 925/1046/441 917/1037/441 +f 917/1037/27 925/1046/27 926/1047/27 918/1038/27 +f 1044/1039/441 1045/1048/441 927/1049/441 919/1040/441 +f 919/1040/27 927/1049/27 928/1050/27 920/1041/27 +f 920/1041/442 928/1050/442 929/842/442 921/843/442 +f 725/790/443 726/788/443 930/1051/443 922/1042/443 +f 922/1042/444 930/1051/444 931/1052/444 923/1043/444 +f 923/1043/28 931/1052/28 932/1053/28 924/1044/28 +f 1077/1045/445 1078/1054/445 933/1055/445 925/1046/445 +f 925/1046/28 933/1055/28 934/1056/28 926/1047/28 +f 1045/1048/445 1046/1057/445 935/1058/445 927/1049/445 +f 927/1049/28 935/1058/28 936/1059/28 928/1050/28 +f 928/1050/446 936/1059/446 937/841/446 929/842/446 +f 726/788/447 727/786/447 938/1060/447 930/1051/447 +f 930/1051/448 938/1060/448 939/1061/448 931/1052/448 +f 931/1052/29 939/1061/29 940/1062/29 932/1053/29 +f 1078/1054/449 1079/1063/449 941/1064/449 933/1055/449 +f 933/1055/29 941/1064/29 942/1065/29 934/1056/29 +f 1046/1057/449 1047/1066/449 943/1067/449 935/1058/449 +f 935/1058/29 943/1067/29 944/1068/29 936/1059/29 +f 936/1059/450 944/1068/450 945/840/450 937/841/450 +f 727/786/451 728/784/451 946/1069/451 938/1060/451 +f 938/1060/452 946/1069/452 947/1070/452 939/1061/452 +f 939/1061/30 947/1070/30 948/1071/30 940/1062/30 +f 1079/1063/453 1080/1072/453 949/1073/453 941/1064/453 +f 941/1064/30 949/1073/30 950/1074/30 942/1065/30 +f 1047/1066/453 1048/1075/453 951/1076/453 943/1067/453 +f 943/1067/30 951/1076/30 952/1077/30 944/1068/30 +f 944/1068/454 952/1077/454 953/839/454 945/840/454 +f 728/784/455 729/782/455 954/1078/455 946/1069/455 +f 946/1069/456 954/1078/456 955/1079/456 947/1070/456 +f 947/1070/31 955/1079/31 956/1080/31 948/1071/31 +f 1080/1072/457 1081/1081/457 957/1082/457 949/1073/457 +f 949/1073/31 957/1082/31 958/1083/31 950/1074/31 +f 1048/1075/457 1049/1084/457 959/1085/457 951/1076/457 +f 951/1076/31 959/1085/31 960/1086/31 952/1077/31 +f 952/1077/458 960/1086/458 961/838/458 953/839/458 +f 729/782/459 730/780/459 962/1087/459 954/1078/459 +f 954/1078/460 962/1087/460 963/1088/460 955/1079/460 +f 955/1079/32 963/1088/32 964/1089/32 956/1080/32 +f 1081/1081/461 1082/1090/461 965/1091/461 957/1082/461 +f 957/1082/32 965/1091/32 966/1092/32 958/1083/32 +f 1049/1084/461 1050/1093/461 967/1094/461 959/1085/461 +f 959/1085/32 967/1094/32 968/1095/32 960/1086/32 +f 960/1086/462 968/1095/462 969/837/462 961/838/462 +f 730/780/463 731/778/463 970/1096/463 962/1087/463 +f 962/1087/464 970/1096/464 971/1097/464 963/1088/464 +f 963/1088/33 971/1097/33 972/1098/33 964/1089/33 +f 1082/1090/465 1083/1099/465 973/1100/465 965/1091/465 +f 965/1091/33 973/1100/33 974/1101/33 966/1092/33 +f 1050/1093/465 1051/1102/465 975/1103/465 967/1094/465 +f 967/1094/33 975/1103/33 976/1104/33 968/1095/33 +f 968/1095/466 976/1104/466 977/836/466 969/837/466 +f 731/778/467 732/776/467 978/1105/467 970/1096/467 +f 970/1096/468 978/1105/468 979/1106/468 971/1097/468 +f 971/1097/34 979/1106/34 980/1107/34 972/1098/34 +f 1083/1099/469 1084/1108/469 981/1109/469 973/1100/469 +f 973/1100/34 981/1109/34 982/1110/34 974/1101/34 +f 1051/1102/470 1052/1111/470 983/1112/470 975/1103/470 +f 975/1103/34 983/1112/34 984/1113/34 976/1104/34 +f 976/1104/471 984/1113/471 985/835/471 977/836/471 +f 732/776/472 733/774/472 986/1114/472 978/1105/472 +f 978/1105/473 986/1114/473 987/1115/473 979/1106/473 +f 979/1106/2 987/1115/2 988/1116/2 980/1107/2 +f 1084/1108/474 1085/1117/474 989/1118/474 981/1109/474 +f 981/1109/2 989/1118/2 990/1119/2 982/1110/2 +f 1052/1111/474 1053/1120/474 991/1121/474 983/1112/474 +f 983/1112/2 991/1121/2 992/1122/2 984/1113/2 +f 984/1113/475 992/1122/475 993/834/475 985/835/475 +f 733/774/476 734/772/476 994/1123/476 986/1114/476 +f 986/1114/477 994/1123/477 995/1124/477 987/1115/477 +f 987/1115/5 995/1124/5 996/1125/5 988/1116/5 +f 1085/1117/478 1086/1126/478 997/1127/478 989/1118/478 +f 989/1118/5 997/1127/5 998/1128/5 990/1119/5 +f 1053/1120/479 1054/1129/479 999/1130/479 991/1121/479 +f 991/1121/5 999/1130/5 1000/1131/5 992/1122/5 +f 992/1122/480 1000/1131/480 1001/833/480 993/834/480 +f 734/772/481 735/770/481 1002/1132/481 994/1123/481 +f 994/1123/482 1002/1132/482 1003/1133/482 995/1124/482 +f 995/1124/7 1003/1133/7 1004/1134/7 996/1125/7 +f 1086/1126/483 1087/1135/483 1005/1136/483 997/1127/483 +f 997/1127/7 1005/1136/7 1006/1137/7 998/1128/7 +f 1054/1129/483 1055/1138/483 1007/1139/483 999/1130/483 +f 999/1130/7 1007/1139/7 1008/1140/7 1000/1131/7 +f 1000/1131/484 1008/1140/484 1009/832/484 1001/833/484 +f 735/770/485 736/768/485 1010/1141/485 1002/1132/485 +f 1002/1132/486 1010/1141/486 1011/1142/486 1003/1133/486 +f 1003/1133/10 1011/1142/10 1012/1143/10 1004/1134/10 +f 1087/1135/487 1088/1144/487 1013/1145/487 1005/1136/487 +f 1005/1136/10 1013/1145/10 1014/1146/10 1006/1137/10 +f 1055/1138/487 1056/1147/487 1015/1148/487 1007/1139/487 +f 1007/1139/10 1015/1148/10 1016/1149/10 1008/1140/10 +f 1008/1140/488 1016/1149/488 1017/831/488 1009/832/488 +f 736/768/489 737/766/489 1018/1150/489 1010/1141/489 +f 1010/1141/490 1018/1150/490 1019/1151/490 1011/1142/490 +f 1011/1142/13 1019/1151/13 1020/1152/13 1012/1143/13 +f 1088/1144/491 1089/1153/491 1021/1154/491 1013/1145/491 +f 1013/1145/13 1021/1154/13 1022/1155/13 1014/1146/13 +f 1056/1147/491 1057/1156/491 1023/1157/491 1015/1148/491 +f 1015/1148/13 1023/1157/13 1024/1158/13 1016/1149/13 +f 1016/1149/492 1024/1158/492 1025/829/492 1017/831/492 +f 737/766/493 707/765/493 777/863/493 1018/1150/493 +f 1018/1150/494 777/863/494 776/865/494 1019/1151/494 +f 1019/1151/16 776/865/16 775/867/16 1020/1152/16 +f 1089/1153/495 1058/868/495 774/871/495 1021/1154/495 +f 1021/1154/16 774/871/16 773/873/16 1022/1155/16 +f 1057/1156/496 1026/874/496 772/877/496 1023/1157/496 +f 1023/1157/16 772/877/16 771/879/16 1024/1158/16 +f 1024/1158/497 771/879/497 770/830/497 1025/829/497 +f 1022/1155/498 773/873/498 1026/874/498 1057/1156/498 +f 1014/1146/499 1022/1155/499 1057/1156/499 1056/1147/499 +f 1006/1137/500 1014/1146/500 1056/1147/500 1055/1138/500 +f 998/1128/501 1006/1137/501 1055/1138/501 1054/1129/501 +f 990/1119/502 998/1128/502 1054/1129/502 1053/1120/502 +f 982/1110/503 990/1119/503 1053/1120/503 1052/1111/503 +f 974/1101/504 982/1110/504 1052/1111/504 1051/1102/504 +f 966/1092/505 974/1101/505 1051/1102/505 1050/1093/505 +f 958/1083/506 966/1092/506 1050/1093/506 1049/1084/506 +f 950/1074/507 958/1083/507 1049/1084/507 1048/1075/507 +f 942/1065/508 950/1074/508 1048/1075/508 1047/1066/508 +f 934/1056/509 942/1065/509 1047/1066/509 1046/1057/509 +f 926/1047/510 934/1056/510 1046/1057/510 1045/1048/510 +f 918/1038/511 926/1047/511 1045/1048/511 1044/1039/511 +f 910/1029/512 918/1038/512 1044/1039/512 1043/1030/512 +f 902/1020/513 910/1029/513 1043/1030/513 1042/1021/513 +f 894/1011/514 902/1020/514 1042/1021/514 1041/1012/514 +f 886/1002/515 894/1011/515 1041/1012/515 1040/1003/515 +f 878/984/516 886/1002/516 1040/1003/516 1039/985/516 +f 870/975/517 781/993/517 1027/994/517 1038/976/517 +f 862/966/518 878/984/518 1039/985/518 1037/967/518 +f 854/957/519 870/975/519 1038/976/519 1036/958/519 +f 846/948/520 862/966/520 1037/967/520 1035/949/520 +f 838/939/521 854/957/521 1036/958/521 1034/940/521 +f 830/930/522 846/948/522 1035/949/522 1033/931/522 +f 822/921/523 838/939/523 1034/940/523 1032/922/523 +f 814/908/524 830/930/524 1033/931/524 1031/911/524 +f 806/894/525 822/921/525 1032/922/525 1030/895/525 +f 781/909/526 814/908/526 1031/911/526 1027/910/526 +f 798/885/527 806/894/527 1030/895/527 1029/886/527 +f 790/872/528 798/885/528 1029/886/528 1028/875/528 +f 773/873/529 790/872/529 1028/875/529 1026/874/529 +f 1020/1152/498 775/867/498 1058/868/498 1089/1153/498 +f 1012/1143/499 1020/1152/499 1089/1153/499 1088/1144/499 +f 1004/1134/500 1012/1143/500 1088/1144/500 1087/1135/500 +f 996/1125/501 1004/1134/501 1087/1135/501 1086/1126/501 +f 988/1116/502 996/1125/502 1086/1126/502 1085/1117/502 +f 980/1107/503 988/1116/503 1085/1117/503 1084/1108/503 +f 972/1098/504 980/1107/504 1084/1108/504 1083/1099/504 +f 964/1089/505 972/1098/505 1083/1099/505 1082/1090/505 +f 956/1080/506 964/1089/506 1082/1090/506 1081/1081/506 +f 948/1071/507 956/1080/507 1081/1081/507 1080/1072/507 +f 940/1062/508 948/1071/508 1080/1072/508 1079/1063/508 +f 932/1053/509 940/1062/509 1079/1063/509 1078/1054/509 +f 924/1044/510 932/1053/510 1078/1054/510 1077/1045/510 +f 916/1035/511 924/1044/511 1077/1045/511 1076/1036/511 +f 908/1026/512 916/1035/512 1076/1036/512 1075/1027/512 +f 900/1017/530 908/1026/530 1075/1027/530 1074/1018/530 +f 892/1008/514 900/1017/514 1074/1018/514 1073/1009/514 +f 884/999/515 892/1008/515 1073/1009/515 1072/1000/515 +f 876/981/531 884/999/531 1072/1000/531 1071/982/531 +f 868/972/517 783/990/517 1059/991/517 1070/973/517 +f 860/963/518 876/981/518 1071/982/518 1069/964/518 +f 852/954/519 868/972/519 1070/973/519 1068/955/519 +f 844/945/520 860/963/520 1069/964/520 1067/946/520 +f 836/936/521 852/954/521 1068/955/521 1066/937/521 +f 828/927/522 844/945/522 1067/946/522 1065/928/522 +f 820/918/523 836/936/523 1066/937/523 1064/919/523 +f 812/902/524 828/927/524 1065/928/524 1063/905/524 +f 804/891/525 820/918/525 1064/919/525 1062/892/525 +f 783/903/526 812/902/526 1063/905/526 1059/904/526 +f 796/882/532 804/891/532 1062/892/532 1061/883/532 +f 788/866/533 796/882/533 1061/883/533 1060/869/533 +f 775/867/529 788/866/529 1060/869/529 1058/868/529 +f 1215/1159/534 1186/1160/534 1148/1161/534 1147/1162/534 +f 1221/1163/535 1220/1164/535 1102/1165/535 1101/1166/535 +f 1218/10/536 1222/1167/536 1116/1168/536 1115/11/536 +f 1220/1164/537 1223/1169/537 1103/1170/537 1102/1165/537 +f 1222/1167/538 1224/1171/538 1117/1172/538 1116/1168/538 +f 1223/1169/539 1225/1173/539 1104/1174/539 1103/1170/539 +f 1227/1175/540 1226/1176/540 1091/1177/540 1090/1178/540 +f 1224/1171/541 1228/1179/541 1118/1180/541 1117/1172/541 +f 1225/1173/542 1229/1181/542 1105/1182/542 1104/1174/542 +f 1226/1176/543 1230/1183/543 1092/1184/543 1091/1177/543 +f 1228/1179/544 1231/1185/544 1119/1186/544 1118/1180/544 +f 1229/1181/545 1232/1187/545 1106/1188/545 1105/1182/545 +f 1230/1183/546 1233/1189/546 1093/1190/546 1092/1184/546 +f 1231/1185/547 1234/1191/547 1120/1192/547 1119/1186/547 +f 1232/1187/548 1235/1193/548 1107/1194/548 1106/1188/548 +f 1233/1189/549 1236/1195/549 1094/1196/549 1093/1190/549 +f 1234/1191/550 1237/1197/550 1121/1198/550 1120/1192/550 +f 1235/1193/551 1238/1199/551 1108/1200/551 1107/1194/551 +f 1236/1195/552 1239/1201/552 1095/1202/552 1094/1196/552 +f 1237/1197/553 1227/1203/553 1090/1204/553 1121/1198/553 +f 1238/1199/554 1240/1205/554 1109/1206/554 1108/1200/554 +f 1239/1201/555 1241/1207/555 1096/1208/555 1095/1202/555 +f 1240/1205/556 1242/1209/556 1110/1210/556 1109/1206/556 +f 1241/1207/557 1243/1211/557 1097/1212/557 1096/1208/557 +f 1242/1209/558 1244/1213/558 1111/1214/558 1110/1210/558 +f 1243/1211/559 1245/1215/559 1098/1216/559 1097/1212/559 +f 1244/1213/560 1246/1217/560 1112/1218/560 1111/1214/560 +f 1245/1215/561 1247/1219/561 1099/1220/561 1098/1216/561 +f 1246/1217/562 1248/1221/562 1113/1222/562 1112/1218/562 +f 1247/1219/563 1249/1223/563 1100/1224/563 1099/1220/563 +f 1248/1221/564 1219/9/564 1114/12/564 1113/1222/564 +f 1249/1223/565 1221/1163/565 1101/1166/565 1100/1224/565 +f 1122/1225/566 1123/1226/566 1124/1227/566 1125/1228/566 1126/1229/566 1127/1230/566 1128/1231/566 1129/1232/566 1130/1233/566 1131/1234/566 1132/1235/566 1133/1236/566 1134/1237/566 1135/1238/566 1136/1239/566 1137/1240/566 1138/1241/566 1139/1242/566 1140/1243/566 1141/1244/566 1142/1245/566 1143/1246/566 1144/1247/566 1145/1248/566 1146/1249/566 1147/1250/566 1148/1251/566 1149/1252/566 1150/1253/566 1151/1254/566 1152/1255/566 1153/1256/566 +f 1216/1257/567 1187/1258/567 1135/1259/567 1134/1260/567 +f 1186/1160/568 1188/1261/568 1149/1262/568 1148/1161/568 +f 1187/1258/569 1189/1263/569 1136/1264/569 1135/1259/569 +f 1217/1265/570 1190/1266/570 1123/1267/570 1122/1268/570 +f 1188/1261/571 1191/1269/571 1150/1270/571 1149/1262/571 +f 1189/1263/572 1192/1271/572 1137/1272/572 1136/1264/572 +f 1190/1266/573 1193/1273/573 1124/1274/573 1123/1267/573 +f 1191/1269/574 1194/1275/574 1151/1276/574 1150/1270/574 +f 1192/1271/575 1195/1277/575 1138/1278/575 1137/1272/575 +f 1193/1273/576 1196/1279/576 1125/1280/576 1124/1274/576 +f 1194/1275/577 1197/1281/577 1152/1282/577 1151/1276/577 +f 1195/1277/578 1198/1283/578 1139/1284/578 1138/1278/578 +f 1196/1279/579 1199/1285/579 1126/1286/579 1125/1280/579 +f 1197/1281/580 1200/1287/580 1153/1288/580 1152/1282/580 +f 1198/1283/581 1201/1289/581 1140/1290/581 1139/1284/581 +f 1199/1285/582 1202/1291/582 1127/1292/582 1126/1286/582 +f 1200/1287/583 1217/1293/583 1122/1294/583 1153/1288/583 +f 1201/1289/584 1203/1295/584 1141/1296/584 1140/1290/584 +f 1202/1291/585 1204/1297/585 1128/1298/585 1127/1292/585 +f 1203/1295/586 1205/1299/586 1142/1300/586 1141/1296/586 +f 1204/1297/587 1206/1301/587 1129/1302/587 1128/1298/587 +f 1205/1299/588 1207/1303/588 1143/1304/588 1142/1300/588 +f 1206/1301/589 1208/1305/589 1130/1306/589 1129/1302/589 +f 1207/1303/590 1209/1307/590 1144/1308/590 1143/1304/590 +f 1208/1305/591 1210/1309/591 1131/1310/591 1130/1306/591 +f 1209/1307/592 1211/1311/592 1145/1312/592 1144/1308/592 +f 1210/1309/593 1212/1313/593 1132/1314/593 1131/1310/593 +f 1211/1311/594 1213/1315/594 1146/1316/594 1145/1312/594 +f 1212/1313/595 1214/1317/595 1133/1318/595 1132/1314/595 +f 1213/1315/596 1215/1159/596 1147/1162/596 1146/1316/596 +f 1214/1317/597 1216/1257/597 1134/1260/597 1133/1318/597 +f 1310/1319/598 1312/1320/598 1157/1321/598 1185/1322/598 +f 1309/1323/599 1311/1324/599 1155/1325/599 1184/1326/599 +f 1308/1327/600 1310/1319/600 1185/1322/600 1183/1328/600 +f 1307/1329/601 1309/1323/601 1184/1326/601 1182/1330/601 +f 1306/1331/602 1308/1327/602 1183/1328/602 1181/1332/602 +f 1305/1333/603 1307/1329/603 1182/1330/603 1180/1334/603 +f 1304/1335/604 1306/1331/604 1181/1332/604 1179/1336/604 +f 1303/1337/605 1305/1333/605 1180/1334/605 1178/1338/605 +f 1302/1339/606 1304/1335/606 1179/1336/606 1177/1340/606 +f 1301/1341/607 1303/1337/607 1178/1338/607 1176/1342/607 +f 1300/1343/608 1302/1339/608 1177/1340/608 1175/1344/608 +f 1299/1345/609 1301/1341/609 1176/1342/609 1174/1346/609 +f 1298/1347/610 1300/1343/610 1175/1344/610 1173/1348/610 +f 1297/1349/611 1299/1345/611 1174/1346/611 1172/1350/611 +f 1296/1351/612 1313/1352/612 1161/1353/612 1171/1354/612 +f 1295/1355/613 1298/1347/613 1173/1348/613 1170/1356/613 +f 1294/1357/614 1297/1349/614 1172/1350/614 1169/1358/614 +f 1293/1359/615 1296/1351/615 1171/1354/615 1168/1360/615 +f 1292/1361/616 1295/1355/616 1170/1356/616 1167/1362/616 +f 1291/1363/617 1294/1357/617 1169/1358/617 1166/1364/617 +f 1290/1365/618 1293/1359/618 1168/1360/618 1165/1366/618 +f 1289/1367/619 1292/1361/619 1167/1362/619 1164/1368/619 +f 1288/1369/620 1291/1363/620 1166/1364/620 1163/1370/620 +f 1287/1371/621 1290/1365/621 1165/1366/621 1162/1372/621 +f 1286/1373/622 1289/1367/622 1164/1368/622 1160/1374/622 +f 1285/1375/623 1288/1369/623 1163/1370/623 1159/1376/623 +f 1284/1377/624 1287/1371/624 1162/1372/624 1158/1378/624 +f 1313/1379/625 1286/1373/625 1160/1374/625 1161/1380/625 +f 1283/1381/626 1285/1375/626 1159/1376/626 1156/1382/626 +f 1282/1383/627 1284/1377/627 1158/1378/627 1154/1384/627 +f 1312/1320/628 1283/1381/628 1156/1382/628 1157/1321/628 +f 1311/1324/629 1282/1383/629 1154/1384/629 1155/1325/629 +f 1185/1322/630 1157/1321/630 1216/1257/630 1214/1317/630 +f 1184/1326/631 1155/1325/631 1215/1159/631 1213/1315/631 +f 1183/1328/632 1185/1322/632 1214/1317/632 1212/1313/632 +f 1182/1330/633 1184/1326/633 1213/1315/633 1211/1311/633 +f 1181/1332/634 1183/1328/634 1212/1313/634 1210/1309/634 +f 1180/1334/635 1182/1330/635 1211/1311/635 1209/1307/635 +f 1179/1336/636 1181/1332/636 1210/1309/636 1208/1305/636 +f 1178/1338/637 1180/1334/637 1209/1307/637 1207/1303/637 +f 1177/1340/638 1179/1336/638 1208/1305/638 1206/1301/638 +f 1176/1342/639 1178/1338/639 1207/1303/639 1205/1299/639 +f 1175/1344/640 1177/1340/640 1206/1301/640 1204/1297/640 +f 1174/1346/641 1176/1342/641 1205/1299/641 1203/1295/641 +f 1173/1348/642 1175/1344/642 1204/1297/642 1202/1291/642 +f 1172/1350/643 1174/1346/643 1203/1295/643 1201/1289/643 +f 1171/1354/644 1161/1353/644 1217/1293/644 1200/1287/644 +f 1170/1356/645 1173/1348/645 1202/1291/645 1199/1285/645 +f 1169/1358/646 1172/1350/646 1201/1289/646 1198/1283/646 +f 1168/1360/647 1171/1354/647 1200/1287/647 1197/1281/647 +f 1167/1362/648 1170/1356/648 1199/1285/648 1196/1279/648 +f 1166/1364/649 1169/1358/649 1198/1283/649 1195/1277/649 +f 1165/1366/650 1168/1360/650 1197/1281/650 1194/1275/650 +f 1164/1368/651 1167/1362/651 1196/1279/651 1193/1273/651 +f 1163/1370/652 1166/1364/652 1195/1277/652 1192/1271/652 +f 1162/1372/653 1165/1366/653 1194/1275/653 1191/1269/653 +f 1160/1374/654 1164/1368/654 1193/1273/654 1190/1266/654 +f 1159/1376/655 1163/1370/655 1192/1271/655 1189/1263/655 +f 1158/1378/656 1162/1372/656 1191/1269/656 1188/1261/656 +f 1161/1380/657 1160/1374/657 1190/1266/657 1217/1265/657 +f 1156/1382/658 1159/1376/658 1189/1263/658 1187/1258/658 +f 1154/1384/659 1158/1378/659 1188/1261/659 1186/1160/659 +f 1157/1321/660 1156/1382/660 1187/1258/660 1216/1257/660 +f 1155/1325/661 1154/1384/661 1186/1160/661 1215/1159/661 +f 43/82/27 44/88/27 1221/1163/27 1249/1223/27 +f 56/138/16 57/4/16 1219/9/16 1248/1221/16 +f 42/76/26 43/82/26 1249/1223/26 1247/1219/26 +f 55/134/13 56/138/13 1248/1221/13 1246/1217/13 +f 41/70/25 42/76/25 1247/1219/25 1245/1215/25 +f 54/130/10 55/134/10 1246/1217/10 1244/1213/10 +f 40/64/24 41/70/24 1245/1215/24 1243/1211/24 +f 53/126/7 54/130/7 1244/1213/7 1242/1209/7 +f 39/56/23 40/64/23 1243/1211/23 1241/1207/23 +f 52/122/5 53/126/5 1242/1209/5 1240/1205/5 +f 38/50/22 39/56/22 1241/1207/22 1239/1201/22 +f 51/118/2 52/122/2 1240/1205/2 1238/1199/2 +f 64/48/21 33/54/21 1227/1203/21 1237/1197/21 +f 37/44/20 38/50/20 1239/1201/20 1236/1195/20 +f 50/114/34 51/118/34 1238/1199/34 1235/1193/34 +f 63/42/19 64/48/19 1237/1197/19 1234/1191/19 +f 36/38/18 37/44/18 1236/1195/18 1233/1189/18 +f 49/110/33 50/114/33 1235/1193/33 1232/1187/33 +f 62/36/17 63/42/17 1234/1191/17 1231/1185/17 +f 35/32/15 36/38/15 1233/1189/15 1230/1183/15 +f 48/106/32 49/110/32 1232/1187/32 1229/1181/32 +f 61/30/14 62/36/14 1231/1185/14 1228/1179/14 +f 34/25/12 35/32/12 1230/1183/12 1226/1176/12 +f 47/102/31 48/106/31 1229/1181/31 1225/1173/31 +f 60/22/11 61/30/11 1228/1179/11 1224/1171/11 +f 33/26/9 34/25/9 1226/1176/9 1227/1175/9 +f 46/98/30 47/102/30 1225/1173/30 1223/1169/30 +f 59/18/8 60/22/8 1224/1171/8 1222/1167/8 +f 45/94/29 46/98/29 1223/1169/29 1220/1164/29 +f 58/3/6 59/18/6 1222/1167/6 1218/10/6 +f 44/88/28 45/94/28 1220/1164/28 1221/1163/28 +f 57/4/1 58/3/1 1218/10/1 1219/9/1 +f 1115/11/662 1116/1168/662 1253/1385/662 1250/1386/662 +f 1102/1165/663 1103/1170/663 1254/1387/663 1251/1388/663 +f 1116/1168/664 1117/1172/664 1255/1389/664 1253/1385/664 +f 1103/1170/665 1104/1174/665 1256/1390/665 1254/1387/665 +f 1090/1178/666 1091/1177/666 1257/1391/666 1252/1392/666 +f 1117/1172/667 1118/1180/667 1258/1393/667 1255/1389/667 +f 1104/1174/668 1105/1182/668 1259/1394/668 1256/1390/668 +f 1091/1177/669 1092/1184/669 1260/1395/669 1257/1391/669 +f 1118/1180/670 1119/1186/670 1261/1396/670 1258/1393/670 +f 1105/1182/671 1106/1188/671 1262/1397/671 1259/1394/671 +f 1092/1184/672 1093/1190/672 1263/1398/672 1260/1395/672 +f 1119/1186/673 1120/1192/673 1264/1399/673 1261/1396/673 +f 1106/1188/674 1107/1194/674 1265/1400/674 1262/1397/674 +f 1093/1190/675 1094/1196/675 1266/1401/675 1263/1398/675 +f 1120/1192/676 1121/1198/676 1267/1402/676 1264/1399/676 +f 1107/1194/677 1108/1200/677 1268/1403/677 1265/1400/677 +f 1094/1196/678 1095/1202/678 1269/1404/678 1266/1401/678 +f 1121/1198/679 1090/1204/679 1252/1405/679 1267/1402/679 +f 1108/1200/680 1109/1206/680 1270/1406/680 1268/1403/680 +f 1095/1202/681 1096/1208/681 1271/1407/681 1269/1404/681 +f 1109/1206/682 1110/1210/682 1272/1408/682 1270/1406/682 +f 1096/1208/683 1097/1212/683 1273/1409/683 1271/1407/683 +f 1110/1210/684 1111/1214/684 1274/1410/684 1272/1408/684 +f 1097/1212/685 1098/1216/685 1275/1411/685 1273/1409/685 +f 1111/1214/686 1112/1218/686 1276/1412/686 1274/1410/686 +f 1098/1216/687 1099/1220/687 1277/1413/687 1275/1411/687 +f 1112/1218/688 1113/1222/688 1278/1414/688 1276/1412/688 +f 1099/1220/689 1100/1224/689 1279/1415/689 1277/1413/689 +f 1113/1222/690 1114/12/690 1280/1416/690 1278/1414/690 +f 1100/1224/691 1101/1166/691 1281/1417/691 1279/1415/691 +f 1114/12/692 1115/11/692 1250/1386/692 1280/1416/692 +f 1101/1166/693 1102/1165/693 1251/1388/693 1281/1417/693 +f 1314/1418/694 1361/1419/694 1282/1383/694 1311/1324/694 +f 1326/1420/695 1373/1421/695 1283/1381/695 1312/1320/695 +f 1361/1419/696 1385/1422/696 1284/1377/696 1282/1383/696 +f 1373/1421/697 1397/1423/697 1285/1375/697 1283/1381/697 +f 1338/1424/698 1409/1425/698 1286/1373/698 1313/1379/698 +f 1385/1422/699 1421/1426/699 1287/1371/699 1284/1377/699 +f 1397/1423/700 1433/1427/700 1288/1369/700 1285/1375/700 +f 1409/1425/701 1445/1428/701 1289/1367/701 1286/1373/701 +f 1421/1426/702 1457/1429/702 1290/1365/702 1287/1371/702 +f 1433/1427/703 1469/1430/703 1291/1363/703 1288/1369/703 +f 1445/1428/704 1481/1431/704 1292/1361/704 1289/1367/704 +f 1457/1429/705 1493/1432/705 1293/1359/705 1290/1365/705 +f 1469/1430/706 1505/1433/706 1294/1357/706 1291/1363/706 +f 1481/1431/707 1517/1434/707 1295/1355/707 1292/1361/707 +f 1493/1432/708 1529/1435/708 1296/1351/708 1293/1359/708 +f 1505/1433/709 1541/1436/709 1297/1349/709 1294/1357/709 +f 1517/1434/710 1553/1437/710 1298/1347/710 1295/1355/710 +f 1529/1435/711 1338/1438/711 1313/1352/711 1296/1351/711 +f 1541/1436/712 1565/1439/712 1299/1345/712 1297/1349/712 +f 1553/1437/713 1577/1440/713 1300/1343/713 1298/1347/713 +f 1565/1439/714 1589/1441/714 1301/1341/714 1299/1345/714 +f 1577/1440/715 1601/1442/715 1302/1339/715 1300/1343/715 +f 1589/1441/716 1613/1443/716 1303/1337/716 1301/1341/716 +f 1601/1442/717 1625/1444/717 1304/1335/717 1302/1339/717 +f 1613/1443/718 1637/1445/718 1305/1333/718 1303/1337/718 +f 1625/1444/719 1649/1446/719 1306/1331/719 1304/1335/719 +f 1637/1445/720 1661/1447/720 1307/1329/720 1305/1333/720 +f 1649/1446/721 1673/1448/721 1308/1327/721 1306/1331/721 +f 1661/1447/722 1685/1449/722 1309/1323/722 1307/1329/722 +f 1673/1448/723 1697/1450/723 1310/1319/723 1308/1327/723 +f 1685/1449/724 1314/1418/724 1311/1324/724 1309/1323/724 +f 1697/1450/725 1326/1420/725 1312/1320/725 1310/1319/725 +f 1281/1417/726 1251/1388/726 1337/1451/726 1686/1452/726 +f 1686/1452/727 1337/1451/727 1336/1453/727 1687/1454/727 +f 1687/1454/728 1336/1453/728 1335/1455/728 1688/1456/728 +f 1688/1456/729 1335/1455/729 1334/1457/729 1689/1458/729 +f 1689/1458/728 1334/1457/728 1333/1459/728 1690/1460/728 +f 1690/1460/729 1333/1459/729 1332/1461/729 1691/1462/729 +f 1691/1462/730 1332/1461/730 1331/1463/730 1692/1464/730 +f 1692/1464/731 1331/1463/731 1330/1465/731 1693/1466/731 +f 1693/1466/728 1330/1465/728 1329/1467/728 1694/1468/728 +f 1694/1468/729 1329/1467/729 1328/1469/729 1695/1470/729 +f 1695/1470/728 1328/1469/728 1327/1471/728 1696/1472/728 +f 1696/1472/729 1327/1471/729 1326/1420/729 1697/1450/729 +f 1280/1416/732 1250/1386/732 1325/1473/732 1674/1474/732 +f 1674/1474/733 1325/1473/733 1324/1475/733 1675/1476/733 +f 1675/1476/734 1324/1475/734 1323/1477/734 1676/1478/734 +f 1676/1478/735 1323/1477/735 1322/1479/735 1677/1480/735 +f 1677/1480/734 1322/1479/734 1321/1481/734 1678/1482/734 +f 1678/1482/735 1321/1481/735 1320/1483/735 1679/1484/735 +f 1679/1484/736 1320/1483/736 1319/1485/736 1680/1486/736 +f 1680/1486/737 1319/1485/737 1318/1487/737 1681/1488/737 +f 1681/1488/734 1318/1487/734 1317/1489/734 1682/1490/734 +f 1682/1490/735 1317/1489/735 1316/1491/735 1683/1492/735 +f 1683/1492/738 1316/1491/738 1315/1493/738 1684/1494/738 +f 1684/1494/735 1315/1493/735 1314/1418/735 1685/1449/735 +f 1279/1415/739 1281/1417/739 1686/1452/739 1662/1495/739 +f 1662/1495/740 1686/1452/740 1687/1454/740 1663/1496/740 +f 1663/1496/741 1687/1454/741 1688/1456/741 1664/1497/741 +f 1664/1497/742 1688/1456/742 1689/1458/742 1665/1498/742 +f 1665/1498/741 1689/1458/741 1690/1460/741 1666/1499/741 +f 1666/1499/742 1690/1460/742 1691/1462/742 1667/1500/742 +f 1667/1500/743 1691/1462/743 1692/1464/743 1668/1501/743 +f 1668/1501/744 1692/1464/744 1693/1466/744 1669/1502/744 +f 1669/1502/741 1693/1466/741 1694/1468/741 1670/1503/741 +f 1670/1503/745 1694/1468/745 1695/1470/745 1671/1504/745 +f 1671/1504/741 1695/1470/741 1696/1472/741 1672/1505/741 +f 1672/1505/745 1696/1472/745 1697/1450/745 1673/1448/745 +f 1278/1414/746 1280/1416/746 1674/1474/746 1650/1506/746 +f 1650/1506/747 1674/1474/747 1675/1476/747 1651/1507/747 +f 1651/1507/748 1675/1476/748 1676/1478/748 1652/1508/748 +f 1652/1508/749 1676/1478/749 1677/1480/749 1653/1509/749 +f 1653/1509/748 1677/1480/748 1678/1482/748 1654/1510/748 +f 1654/1510/749 1678/1482/749 1679/1484/749 1655/1511/749 +f 1655/1511/750 1679/1484/750 1680/1486/750 1656/1512/750 +f 1656/1512/751 1680/1486/751 1681/1488/751 1657/1513/751 +f 1657/1513/748 1681/1488/748 1682/1490/748 1658/1514/748 +f 1658/1514/749 1682/1490/749 1683/1492/749 1659/1515/749 +f 1659/1515/748 1683/1492/748 1684/1494/748 1660/1516/748 +f 1660/1516/749 1684/1494/749 1685/1449/749 1661/1447/749 +f 1277/1413/752 1279/1415/752 1662/1495/752 1638/1517/752 +f 1638/1517/753 1662/1495/753 1663/1496/753 1639/1518/753 +f 1639/1518/754 1663/1496/754 1664/1497/754 1640/1519/754 +f 1640/1519/755 1664/1497/755 1665/1498/755 1641/1520/755 +f 1641/1520/754 1665/1498/754 1666/1499/754 1642/1521/754 +f 1642/1521/756 1666/1499/756 1667/1500/756 1643/1522/756 +f 1643/1522/757 1667/1500/757 1668/1501/757 1644/1523/757 +f 1644/1523/758 1668/1501/758 1669/1502/758 1645/1524/758 +f 1645/1524/759 1669/1502/759 1670/1503/759 1646/1525/759 +f 1646/1525/756 1670/1503/756 1671/1504/756 1647/1526/756 +f 1647/1526/759 1671/1504/759 1672/1505/759 1648/1527/759 +f 1648/1527/755 1672/1505/755 1673/1448/755 1649/1446/755 +f 1276/1412/760 1278/1414/760 1650/1506/760 1626/1528/760 +f 1626/1528/761 1650/1506/761 1651/1507/761 1627/1529/761 +f 1627/1529/762 1651/1507/762 1652/1508/762 1628/1530/762 +f 1628/1530/763 1652/1508/763 1653/1509/763 1629/1531/763 +f 1629/1531/764 1653/1509/764 1654/1510/764 1630/1532/764 +f 1630/1532/765 1654/1510/765 1655/1511/765 1631/1533/765 +f 1631/1533/766 1655/1511/766 1656/1512/766 1632/1534/766 +f 1632/1534/767 1656/1512/767 1657/1513/767 1633/1535/767 +f 1633/1535/762 1657/1513/762 1658/1514/762 1634/1536/762 +f 1634/1536/763 1658/1514/763 1659/1515/763 1635/1537/763 +f 1635/1537/762 1659/1515/762 1660/1516/762 1636/1538/762 +f 1636/1538/763 1660/1516/763 1661/1447/763 1637/1445/763 +f 1275/1411/768 1277/1413/768 1638/1517/768 1614/1539/768 +f 1614/1539/769 1638/1517/769 1639/1518/769 1615/1540/769 +f 1615/1540/770 1639/1518/770 1640/1519/770 1616/1541/770 +f 1616/1541/771 1640/1519/771 1641/1520/771 1617/1542/771 +f 1617/1542/770 1641/1520/770 1642/1521/770 1618/1543/770 +f 1618/1543/771 1642/1521/771 1643/1522/771 1619/1544/771 +f 1619/1544/772 1643/1522/772 1644/1523/772 1620/1545/772 +f 1620/1545/773 1644/1523/773 1645/1524/773 1621/1546/773 +f 1621/1546/770 1645/1524/770 1646/1525/770 1622/1547/770 +f 1622/1547/771 1646/1525/771 1647/1526/771 1623/1548/771 +f 1623/1548/770 1647/1526/770 1648/1527/770 1624/1549/770 +f 1624/1549/771 1648/1527/771 1649/1446/771 1625/1444/771 +f 1274/1410/774 1276/1412/774 1626/1528/774 1602/1550/774 +f 1602/1550/775 1626/1528/775 1627/1529/775 1603/1551/775 +f 1603/1551/776 1627/1529/776 1628/1530/776 1604/1552/776 +f 1604/1552/777 1628/1530/777 1629/1531/777 1605/1553/777 +f 1605/1553/778 1629/1531/778 1630/1532/778 1606/1554/778 +f 1606/1554/777 1630/1532/777 1631/1533/777 1607/1555/777 +f 1607/1555/779 1631/1533/779 1632/1534/779 1608/1556/779 +f 1608/1556/780 1632/1534/780 1633/1535/780 1609/1557/780 +f 1609/1557/776 1633/1535/776 1634/1536/776 1610/1558/776 +f 1610/1558/781 1634/1536/781 1635/1537/781 1611/1559/781 +f 1611/1559/776 1635/1537/776 1636/1538/776 1612/1560/776 +f 1612/1560/781 1636/1538/781 1637/1445/781 1613/1443/781 +f 1273/1409/782 1275/1411/782 1614/1539/782 1590/1561/782 +f 1590/1561/783 1614/1539/783 1615/1540/783 1591/1562/783 +f 1591/1562/784 1615/1540/784 1616/1541/784 1592/1563/784 +f 1592/1563/785 1616/1541/785 1617/1542/785 1593/1564/785 +f 1593/1564/784 1617/1542/784 1618/1543/784 1594/1565/784 +f 1594/1565/785 1618/1543/785 1619/1544/785 1595/1566/785 +f 1595/1566/786 1619/1544/786 1620/1545/786 1596/1567/786 +f 1596/1567/787 1620/1545/787 1621/1546/787 1597/1568/787 +f 1597/1568/784 1621/1546/784 1622/1547/784 1598/1569/784 +f 1598/1569/785 1622/1547/785 1623/1548/785 1599/1570/785 +f 1599/1570/784 1623/1548/784 1624/1549/784 1600/1571/784 +f 1600/1571/785 1624/1549/785 1625/1444/785 1601/1442/785 +f 1272/1408/788 1274/1410/788 1602/1550/788 1578/1572/788 +f 1578/1572/789 1602/1550/789 1603/1551/789 1579/1573/789 +f 1579/1573/790 1603/1551/790 1604/1552/790 1580/1574/790 +f 1580/1574/791 1604/1552/791 1605/1553/791 1581/1575/791 +f 1581/1575/790 1605/1553/790 1606/1554/790 1582/1576/790 +f 1582/1576/791 1606/1554/791 1607/1555/791 1583/1577/791 +f 1583/1577/792 1607/1555/792 1608/1556/792 1584/1578/792 +f 1584/1578/793 1608/1556/793 1609/1557/793 1585/1579/793 +f 1585/1579/790 1609/1557/790 1610/1558/790 1586/1580/790 +f 1586/1580/791 1610/1558/791 1611/1559/791 1587/1581/791 +f 1587/1581/790 1611/1559/790 1612/1560/790 1588/1582/790 +f 1588/1582/791 1612/1560/791 1613/1443/791 1589/1441/791 +f 1271/1407/794 1273/1409/794 1590/1561/794 1566/1583/794 +f 1566/1583/795 1590/1561/795 1591/1562/795 1567/1584/795 +f 1567/1584/796 1591/1562/796 1592/1563/796 1568/1585/796 +f 1568/1585/797 1592/1563/797 1593/1564/797 1569/1586/797 +f 1569/1586/798 1593/1564/798 1594/1565/798 1570/1587/798 +f 1570/1587/799 1594/1565/799 1595/1566/799 1571/1588/799 +f 1571/1588/800 1595/1566/800 1596/1567/800 1572/1589/800 +f 1572/1589/801 1596/1567/801 1597/1568/801 1573/1590/801 +f 1573/1590/796 1597/1568/796 1598/1569/796 1574/1591/796 +f 1574/1591/797 1598/1569/797 1599/1570/797 1575/1592/797 +f 1575/1592/796 1599/1570/796 1600/1571/796 1576/1593/796 +f 1576/1593/797 1600/1571/797 1601/1442/797 1577/1440/797 +f 1270/1406/802 1272/1408/802 1578/1572/802 1554/1594/802 +f 1554/1594/803 1578/1572/803 1579/1573/803 1555/1595/803 +f 1555/1595/804 1579/1573/804 1580/1574/804 1556/1596/804 +f 1556/1596/805 1580/1574/805 1581/1575/805 1557/1597/805 +f 1557/1597/804 1581/1575/804 1582/1576/804 1558/1598/804 +f 1558/1598/805 1582/1576/805 1583/1577/805 1559/1599/805 +f 1559/1599/806 1583/1577/806 1584/1578/806 1560/1600/806 +f 1560/1600/807 1584/1578/807 1585/1579/807 1561/1601/807 +f 1561/1601/804 1585/1579/804 1586/1580/804 1562/1602/804 +f 1562/1602/805 1586/1580/805 1587/1581/805 1563/1603/805 +f 1563/1603/804 1587/1581/804 1588/1582/804 1564/1604/804 +f 1564/1604/805 1588/1582/805 1589/1441/805 1565/1439/805 +f 1269/1404/808 1271/1407/808 1566/1583/808 1542/1605/808 +f 1542/1605/809 1566/1583/809 1567/1584/809 1543/1606/809 +f 1543/1606/810 1567/1584/810 1568/1585/810 1544/1607/810 +f 1544/1607/811 1568/1585/811 1569/1586/811 1545/1608/811 +f 1545/1608/810 1569/1586/810 1570/1587/810 1546/1609/810 +f 1546/1609/811 1570/1587/811 1571/1588/811 1547/1610/811 +f 1547/1610/812 1571/1588/812 1572/1589/812 1548/1611/812 +f 1548/1611/813 1572/1589/813 1573/1590/813 1549/1612/813 +f 1549/1612/814 1573/1590/814 1574/1591/814 1550/1613/814 +f 1550/1613/811 1574/1591/811 1575/1592/811 1551/1614/811 +f 1551/1614/810 1575/1592/810 1576/1593/810 1552/1615/810 +f 1552/1615/815 1576/1593/815 1577/1440/815 1553/1437/815 +f 1268/1403/816 1270/1406/816 1554/1594/816 1530/1616/816 +f 1530/1616/817 1554/1594/817 1555/1595/817 1531/1617/817 +f 1531/1617/818 1555/1595/818 1556/1596/818 1532/1618/818 +f 1532/1618/819 1556/1596/819 1557/1597/819 1533/1619/819 +f 1533/1619/818 1557/1597/818 1558/1598/818 1534/1620/818 +f 1534/1620/819 1558/1598/819 1559/1599/819 1535/1621/819 +f 1535/1621/820 1559/1599/820 1560/1600/820 1536/1622/820 +f 1536/1622/821 1560/1600/821 1561/1601/821 1537/1623/821 +f 1537/1623/818 1561/1601/818 1562/1602/818 1538/1624/818 +f 1538/1624/822 1562/1602/822 1563/1603/822 1539/1625/822 +f 1539/1625/818 1563/1603/818 1564/1604/818 1540/1626/818 +f 1540/1626/822 1564/1604/822 1565/1439/822 1541/1436/822 +f 1267/1402/823 1252/1405/823 1349/1627/823 1518/1628/823 +f 1518/1628/824 1349/1627/824 1348/1629/824 1519/1630/824 +f 1519/1630/825 1348/1629/825 1347/1631/825 1520/1632/825 +f 1520/1632/826 1347/1631/826 1346/1633/826 1521/1634/826 +f 1521/1634/825 1346/1633/825 1345/1635/825 1522/1636/825 +f 1522/1636/826 1345/1635/826 1344/1637/826 1523/1638/826 +f 1523/1638/827 1344/1637/827 1343/1639/827 1524/1640/827 +f 1524/1640/828 1343/1639/828 1342/1641/828 1525/1642/828 +f 1525/1642/825 1342/1641/825 1341/1643/825 1526/1644/825 +f 1526/1644/826 1341/1643/826 1340/1645/826 1527/1646/826 +f 1527/1646/825 1340/1645/825 1339/1647/825 1528/1648/825 +f 1528/1648/829 1339/1647/829 1338/1438/829 1529/1435/829 +f 1266/1401/830 1269/1404/830 1542/1605/830 1506/1649/830 +f 1506/1649/831 1542/1605/831 1543/1606/831 1507/1650/831 +f 1507/1650/832 1543/1606/832 1544/1607/832 1508/1651/832 +f 1508/1651/833 1544/1607/833 1545/1608/833 1509/1652/833 +f 1509/1652/832 1545/1608/832 1546/1609/832 1510/1653/832 +f 1510/1653/833 1546/1609/833 1547/1610/833 1511/1654/833 +f 1511/1654/834 1547/1610/834 1548/1611/834 1512/1655/834 +f 1512/1655/835 1548/1611/835 1549/1612/835 1513/1656/835 +f 1513/1656/832 1549/1612/832 1550/1613/832 1514/1657/832 +f 1514/1657/833 1550/1613/833 1551/1614/833 1515/1658/833 +f 1515/1658/832 1551/1614/832 1552/1615/832 1516/1659/832 +f 1516/1659/833 1552/1615/833 1553/1437/833 1517/1434/833 +f 1265/1400/836 1268/1403/836 1530/1616/836 1494/1660/836 +f 1494/1660/837 1530/1616/837 1531/1617/837 1495/1661/837 +f 1495/1661/838 1531/1617/838 1532/1618/838 1496/1662/838 +f 1496/1662/839 1532/1618/839 1533/1619/839 1497/1663/839 +f 1497/1663/840 1533/1619/840 1534/1620/840 1498/1664/840 +f 1498/1664/839 1534/1620/839 1535/1621/839 1499/1665/839 +f 1499/1665/841 1535/1621/841 1536/1622/841 1500/1666/841 +f 1500/1666/842 1536/1622/842 1537/1623/842 1501/1667/842 +f 1501/1667/838 1537/1623/838 1538/1624/838 1502/1668/838 +f 1502/1668/843 1538/1624/843 1539/1625/843 1503/1669/843 +f 1503/1669/838 1539/1625/838 1540/1626/838 1504/1670/838 +f 1504/1670/843 1540/1626/843 1541/1436/843 1505/1433/843 +f 1264/1399/844 1267/1402/844 1518/1628/844 1482/1671/844 +f 1482/1671/845 1518/1628/845 1519/1630/845 1483/1672/845 +f 1483/1672/846 1519/1630/846 1520/1632/846 1484/1673/846 +f 1484/1673/847 1520/1632/847 1521/1634/847 1485/1674/847 +f 1485/1674/846 1521/1634/846 1522/1636/846 1486/1675/846 +f 1486/1675/848 1522/1636/848 1523/1638/848 1487/1676/848 +f 1487/1676/849 1523/1638/849 1524/1640/849 1488/1677/849 +f 1488/1677/850 1524/1640/850 1525/1642/850 1489/1678/850 +f 1489/1678/851 1525/1642/851 1526/1644/851 1490/1679/851 +f 1490/1679/847 1526/1644/847 1527/1646/847 1491/1680/847 +f 1491/1680/851 1527/1646/851 1528/1648/851 1492/1681/851 +f 1492/1681/847 1528/1648/847 1529/1435/847 1493/1432/847 +f 1263/1398/852 1266/1401/852 1506/1649/852 1470/1682/852 +f 1470/1682/853 1506/1649/853 1507/1650/853 1471/1683/853 +f 1471/1683/854 1507/1650/854 1508/1651/854 1472/1684/854 +f 1472/1684/855 1508/1651/855 1509/1652/855 1473/1685/855 +f 1473/1685/854 1509/1652/854 1510/1653/854 1474/1686/854 +f 1474/1686/855 1510/1653/855 1511/1654/855 1475/1687/855 +f 1475/1687/856 1511/1654/856 1512/1655/856 1476/1688/856 +f 1476/1688/857 1512/1655/857 1513/1656/857 1477/1689/857 +f 1477/1689/854 1513/1656/854 1514/1657/854 1478/1690/854 +f 1478/1690/855 1514/1657/855 1515/1658/855 1479/1691/855 +f 1479/1691/854 1515/1658/854 1516/1659/854 1480/1692/854 +f 1480/1692/855 1516/1659/855 1517/1434/855 1481/1431/855 +f 1262/1397/858 1265/1400/858 1494/1660/858 1458/1693/858 +f 1458/1693/859 1494/1660/859 1495/1661/859 1459/1694/859 +f 1459/1694/860 1495/1661/860 1496/1662/860 1460/1695/860 +f 1460/1695/861 1496/1662/861 1497/1663/861 1461/1696/861 +f 1461/1696/860 1497/1663/860 1498/1664/860 1462/1697/860 +f 1462/1697/861 1498/1664/861 1499/1665/861 1463/1698/861 +f 1463/1698/862 1499/1665/862 1500/1666/862 1464/1699/862 +f 1464/1699/863 1500/1666/863 1501/1667/863 1465/1700/863 +f 1465/1700/860 1501/1667/860 1502/1668/860 1466/1701/860 +f 1466/1701/861 1502/1668/861 1503/1669/861 1467/1702/861 +f 1467/1702/860 1503/1669/860 1504/1670/860 1468/1703/860 +f 1468/1703/861 1504/1670/861 1505/1433/861 1469/1430/861 +f 1261/1396/864 1264/1399/864 1482/1671/864 1446/1704/864 +f 1446/1704/865 1482/1671/865 1483/1672/865 1447/1705/865 +f 1447/1705/866 1483/1672/866 1484/1673/866 1448/1706/866 +f 1448/1706/867 1484/1673/867 1485/1674/867 1449/1707/867 +f 1449/1707/866 1485/1674/866 1486/1675/866 1450/1708/866 +f 1450/1708/868 1486/1675/868 1487/1676/868 1451/1709/868 +f 1451/1709/869 1487/1676/869 1488/1677/869 1452/1710/869 +f 1452/1710/870 1488/1677/870 1489/1678/870 1453/1711/870 +f 1453/1711/871 1489/1678/871 1490/1679/871 1454/1712/871 +f 1454/1712/868 1490/1679/868 1491/1680/868 1455/1713/868 +f 1455/1713/871 1491/1680/871 1492/1681/871 1456/1714/871 +f 1456/1714/868 1492/1681/868 1493/1432/868 1457/1429/868 +f 1260/1395/872 1263/1398/872 1470/1682/872 1434/1715/872 +f 1434/1715/873 1470/1682/873 1471/1683/873 1435/1716/873 +f 1435/1716/874 1471/1683/874 1472/1684/874 1436/1717/874 +f 1436/1717/875 1472/1684/875 1473/1685/875 1437/1718/875 +f 1437/1718/874 1473/1685/874 1474/1686/874 1438/1719/874 +f 1438/1719/875 1474/1686/875 1475/1687/875 1439/1720/875 +f 1439/1720/876 1475/1687/876 1476/1688/876 1440/1721/876 +f 1440/1721/877 1476/1688/877 1477/1689/877 1441/1722/877 +f 1441/1722/878 1477/1689/878 1478/1690/878 1442/1723/878 +f 1442/1723/879 1478/1690/879 1479/1691/879 1443/1724/879 +f 1443/1724/874 1479/1691/874 1480/1692/874 1444/1725/874 +f 1444/1725/879 1480/1692/879 1481/1431/879 1445/1428/879 +f 1259/1394/880 1262/1397/880 1458/1693/880 1422/1726/880 +f 1422/1726/881 1458/1693/881 1459/1694/881 1423/1727/881 +f 1423/1727/882 1459/1694/882 1460/1695/882 1424/1728/882 +f 1424/1728/883 1460/1695/883 1461/1696/883 1425/1729/883 +f 1425/1729/882 1461/1696/882 1462/1697/882 1426/1730/882 +f 1426/1730/883 1462/1697/883 1463/1698/883 1427/1731/883 +f 1427/1731/884 1463/1698/884 1464/1699/884 1428/1732/884 +f 1428/1732/885 1464/1699/885 1465/1700/885 1429/1733/885 +f 1429/1733/882 1465/1700/882 1466/1701/882 1430/1734/882 +f 1430/1734/886 1466/1701/886 1467/1702/886 1431/1735/886 +f 1431/1735/882 1467/1702/882 1468/1703/882 1432/1736/882 +f 1432/1736/886 1468/1703/886 1469/1430/886 1433/1427/886 +f 1258/1393/887 1261/1396/887 1446/1704/887 1410/1737/887 +f 1410/1737/888 1446/1704/888 1447/1705/888 1411/1738/888 +f 1411/1738/889 1447/1705/889 1448/1706/889 1412/1739/889 +f 1412/1739/890 1448/1706/890 1449/1707/890 1413/1740/890 +f 1413/1740/889 1449/1707/889 1450/1708/889 1414/1741/889 +f 1414/1741/890 1450/1708/890 1451/1709/890 1415/1742/890 +f 1415/1742/891 1451/1709/891 1452/1710/891 1416/1743/891 +f 1416/1743/892 1452/1710/892 1453/1711/892 1417/1744/892 +f 1417/1744/893 1453/1711/893 1454/1712/893 1418/1745/893 +f 1418/1745/890 1454/1712/890 1455/1713/890 1419/1746/890 +f 1419/1746/889 1455/1713/889 1456/1714/889 1420/1747/889 +f 1420/1747/890 1456/1714/890 1457/1429/890 1421/1426/890 +f 1257/1391/894 1260/1395/894 1434/1715/894 1398/1748/894 +f 1398/1748/895 1434/1715/895 1435/1716/895 1399/1749/895 +f 1399/1749/896 1435/1716/896 1436/1717/896 1400/1750/896 +f 1400/1750/897 1436/1717/897 1437/1718/897 1401/1751/897 +f 1401/1751/896 1437/1718/896 1438/1719/896 1402/1752/896 +f 1402/1752/898 1438/1719/898 1439/1720/898 1403/1753/898 +f 1403/1753/899 1439/1720/899 1440/1721/899 1404/1754/899 +f 1404/1754/900 1440/1721/900 1441/1722/900 1405/1755/900 +f 1405/1755/901 1441/1722/901 1442/1723/901 1406/1756/901 +f 1406/1756/897 1442/1723/897 1443/1724/897 1407/1757/897 +f 1407/1757/901 1443/1724/901 1444/1725/901 1408/1758/901 +f 1408/1758/897 1444/1725/897 1445/1428/897 1409/1425/897 +f 1256/1390/902 1259/1394/902 1422/1726/902 1386/1759/902 +f 1386/1759/903 1422/1726/903 1423/1727/903 1387/1760/903 +f 1387/1760/904 1423/1727/904 1424/1728/904 1388/1761/904 +f 1388/1761/905 1424/1728/905 1425/1729/905 1389/1762/905 +f 1389/1762/904 1425/1729/904 1426/1730/904 1390/1763/904 +f 1390/1763/905 1426/1730/905 1427/1731/905 1391/1764/905 +f 1391/1764/906 1427/1731/906 1428/1732/906 1392/1765/906 +f 1392/1765/907 1428/1732/907 1429/1733/907 1393/1766/907 +f 1393/1766/908 1429/1733/908 1430/1734/908 1394/1767/908 +f 1394/1767/909 1430/1734/909 1431/1735/909 1395/1768/909 +f 1395/1768/908 1431/1735/908 1432/1736/908 1396/1769/908 +f 1396/1769/909 1432/1736/909 1433/1427/909 1397/1423/909 +f 1255/1389/910 1258/1393/910 1410/1737/910 1374/1770/910 +f 1374/1770/911 1410/1737/911 1411/1738/911 1375/1771/911 +f 1375/1771/912 1411/1738/912 1412/1739/912 1376/1772/912 +f 1376/1772/913 1412/1739/913 1413/1740/913 1377/1773/913 +f 1377/1773/912 1413/1740/912 1414/1741/912 1378/1774/912 +f 1378/1774/913 1414/1741/913 1415/1742/913 1379/1775/913 +f 1379/1775/914 1415/1742/914 1416/1743/914 1380/1776/914 +f 1380/1776/915 1416/1743/915 1417/1744/915 1381/1777/915 +f 1381/1777/916 1417/1744/916 1418/1745/916 1382/1778/916 +f 1382/1778/913 1418/1745/913 1419/1746/913 1383/1779/913 +f 1383/1779/912 1419/1746/912 1420/1747/912 1384/1780/912 +f 1384/1780/913 1420/1747/913 1421/1426/913 1385/1422/913 +f 1252/1392/917 1257/1391/917 1398/1748/917 1349/1781/917 +f 1349/1781/918 1398/1748/918 1399/1749/918 1348/1782/918 +f 1348/1782/919 1399/1749/919 1400/1750/919 1347/1783/919 +f 1347/1783/920 1400/1750/920 1401/1751/920 1346/1784/920 +f 1346/1784/921 1401/1751/921 1402/1752/921 1345/1785/921 +f 1345/1785/920 1402/1752/920 1403/1753/920 1344/1786/920 +f 1344/1786/922 1403/1753/922 1404/1754/922 1343/1787/922 +f 1343/1787/923 1404/1754/923 1405/1755/923 1342/1788/923 +f 1342/1788/919 1405/1755/919 1406/1756/919 1341/1789/919 +f 1341/1789/920 1406/1756/920 1407/1757/920 1340/1790/920 +f 1340/1790/919 1407/1757/919 1408/1758/919 1339/1791/919 +f 1339/1791/924 1408/1758/924 1409/1425/924 1338/1424/924 +f 1254/1387/925 1256/1390/925 1386/1759/925 1362/1792/925 +f 1362/1792/926 1386/1759/926 1387/1760/926 1363/1793/926 +f 1363/1793/927 1387/1760/927 1388/1761/927 1364/1794/927 +f 1364/1794/928 1388/1761/928 1389/1762/928 1365/1795/928 +f 1365/1795/929 1389/1762/929 1390/1763/929 1366/1796/929 +f 1366/1796/928 1390/1763/928 1391/1764/928 1367/1797/928 +f 1367/1797/930 1391/1764/930 1392/1765/930 1368/1798/930 +f 1368/1798/931 1392/1765/931 1393/1766/931 1369/1799/931 +f 1369/1799/929 1393/1766/929 1394/1767/929 1370/1800/929 +f 1370/1800/928 1394/1767/928 1395/1768/928 1371/1801/928 +f 1371/1801/929 1395/1768/929 1396/1769/929 1372/1802/929 +f 1372/1802/932 1396/1769/932 1397/1423/932 1373/1421/932 +f 1253/1385/933 1255/1389/933 1374/1770/933 1350/1803/933 +f 1350/1803/934 1374/1770/934 1375/1771/934 1351/1804/934 +f 1351/1804/935 1375/1771/935 1376/1772/935 1352/1805/935 +f 1352/1805/936 1376/1772/936 1377/1773/936 1353/1806/936 +f 1353/1806/935 1377/1773/935 1378/1774/935 1354/1807/935 +f 1354/1807/936 1378/1774/936 1379/1775/936 1355/1808/936 +f 1355/1808/937 1379/1775/937 1380/1776/937 1356/1809/937 +f 1356/1809/938 1380/1776/938 1381/1777/938 1357/1810/938 +f 1357/1810/935 1381/1777/935 1382/1778/935 1358/1811/935 +f 1358/1811/939 1382/1778/939 1383/1779/939 1359/1812/939 +f 1359/1812/935 1383/1779/935 1384/1780/935 1360/1813/935 +f 1360/1813/939 1384/1780/939 1385/1422/939 1361/1419/939 +f 1251/1388/940 1254/1387/940 1362/1792/940 1337/1451/940 +f 1337/1451/941 1362/1792/941 1363/1793/941 1336/1453/941 +f 1336/1453/942 1363/1793/942 1364/1794/942 1335/1455/942 +f 1335/1455/943 1364/1794/943 1365/1795/943 1334/1457/943 +f 1334/1457/942 1365/1795/942 1366/1796/942 1333/1459/942 +f 1333/1459/943 1366/1796/943 1367/1797/943 1332/1461/943 +f 1332/1461/944 1367/1797/944 1368/1798/944 1331/1463/944 +f 1331/1463/945 1368/1798/945 1369/1799/945 1330/1465/945 +f 1330/1465/942 1369/1799/942 1370/1800/942 1329/1467/942 +f 1329/1467/943 1370/1800/943 1371/1801/943 1328/1469/943 +f 1328/1469/942 1371/1801/942 1372/1802/942 1327/1471/942 +f 1327/1471/943 1372/1802/943 1373/1421/943 1326/1420/943 +f 1250/1386/946 1253/1385/946 1350/1803/946 1325/1473/946 +f 1325/1473/947 1350/1803/947 1351/1804/947 1324/1475/947 +f 1324/1475/948 1351/1804/948 1352/1805/948 1323/1477/948 +f 1323/1477/949 1352/1805/949 1353/1806/949 1322/1479/949 +f 1322/1479/948 1353/1806/948 1354/1807/948 1321/1481/948 +f 1321/1481/950 1354/1807/950 1355/1808/950 1320/1483/950 +f 1320/1483/951 1355/1808/951 1356/1809/951 1319/1485/951 +f 1319/1485/952 1356/1809/952 1357/1810/952 1318/1487/952 +f 1318/1487/948 1357/1810/948 1358/1811/948 1317/1489/948 +f 1317/1489/950 1358/1811/950 1359/1812/950 1316/1491/950 +f 1316/1491/948 1359/1812/948 1360/1813/948 1315/1493/948 +f 1315/1493/953 1360/1813/953 1361/1419/953 1314/1418/953 +f 173/418/12 175/463/12 3/815/12 2/819/12 +f 175/463/15 177/493/15 4/811/15 3/815/15 +f 177/493/18 179/523/18 5/807/18 4/811/18 +f 179/523/20 181/553/20 6/801/20 5/807/20 +f 181/553/22 182/583/22 7/799/22 6/801/22 +f 182/583/23 183/598/23 8/797/23 7/799/23 +f 183/598/24 184/613/24 9/795/24 8/797/24 +f 184/613/25 185/628/25 10/793/25 9/795/25 +f 185/628/26 186/643/26 11/791/26 10/793/26 +f 186/643/27 187/658/27 12/789/27 11/791/27 +f 187/658/28 188/673/28 13/787/28 12/789/28 +f 188/673/29 189/688/29 14/785/29 13/787/29 +f 189/688/30 190/703/30 15/783/30 14/785/30 +f 190/703/31 191/718/31 16/781/31 15/783/31 +f 191/718/32 192/733/32 17/779/32 16/781/32 +f 192/733/33 193/748/33 18/777/33 17/779/33 +f 193/748/34 162/269/34 19/775/34 18/777/34 +f 162/269/2 163/268/2 20/773/2 19/775/2 +f 163/268/5 164/298/5 21/771/5 20/773/5 +f 164/298/7 165/313/7 22/769/7 21/771/7 +f 165/313/10 166/328/10 23/767/10 22/769/10 +f 166/328/13 167/343/13 24/763/13 23/767/13 +f 167/343/16 168/358/16 25/764/16 24/763/16 +f 168/358/1 169/373/1 26/827/1 25/764/1 +f 169/373/6 170/388/6 27/825/6 26/827/6 +f 170/388/8 171/403/8 28/821/8 27/825/8 +f 171/403/11 174/448/11 29/817/11 28/821/11 +f 174/448/14 176/478/14 30/813/14 29/817/14 +f 176/478/17 178/508/17 31/809/17 30/813/17 +f 178/508/19 180/538/19 32/803/19 31/809/19 +f 180/538/21 172/568/21 1/804/21 32/803/21 +f 172/419/9 173/418/9 2/819/9 1/823/9 +f 1698/1814/954 1699/1815/954 1701/1816/954 1700/1817/954 +f 1700/1817/955 1701/1816/955 1703/1818/955 1702/1819/955 +f 1702/1819/956 1703/1818/956 1705/1820/956 1704/1821/956 +f 1704/1821/957 1705/1820/957 1707/1822/957 1706/1823/957 +f 1706/1823/958 1707/1822/958 1709/1824/958 1708/1825/958 +f 1708/1825/959 1709/1824/959 1711/1826/959 1710/1827/959 +f 1710/1827/960 1711/1826/960 1713/1828/960 1712/1829/960 +f 1712/1829/961 1713/1828/961 1715/1830/961 1714/1831/961 +f 1714/1831/962 1715/1830/962 1717/1832/962 1716/1833/962 +f 1716/1833/963 1717/1832/963 1719/1834/963 1718/1835/963 +f 1718/1835/964 1719/1834/964 1721/1836/964 1720/1837/964 +f 1720/1837/965 1721/1836/965 1723/1838/965 1722/1839/965 +f 1722/1839/966 1723/1838/966 1725/1840/966 1724/1841/966 +f 1724/1841/967 1725/1840/967 1727/1842/967 1726/1843/967 +f 1726/1843/968 1727/1842/968 1729/1844/968 1728/1845/968 +f 1728/1845/969 1729/1844/969 1731/1846/969 1730/1847/969 +f 1730/1847/970 1731/1846/970 1733/1848/970 1732/1849/970 +f 1732/1849/971 1733/1848/971 1735/1850/971 1734/1851/971 +f 1734/1851/972 1735/1850/972 1737/1852/972 1736/1853/972 +f 1736/1853/973 1737/1852/973 1739/1854/973 1738/1855/973 +f 1738/1855/974 1739/1854/974 1741/1856/974 1740/1857/974 +f 1740/1857/975 1741/1856/975 1743/1858/975 1742/1859/975 +f 1742/1859/976 1743/1858/976 1745/1860/976 1744/1861/976 +f 1744/1861/977 1745/1860/977 1747/1862/977 1746/1863/977 +f 1746/1863/978 1747/1862/978 1749/1864/978 1748/1865/978 +f 1748/1865/979 1749/1864/979 1751/1866/979 1750/1867/979 +f 1750/1867/980 1751/1866/980 1753/1868/980 1752/1869/980 +f 1752/1869/981 1753/1868/981 1755/1870/981 1754/1871/981 +f 1754/1871/982 1755/1870/982 1757/1872/982 1756/1873/982 +f 1756/1873/983 1757/1872/983 1759/1874/983 1758/1875/983 +f 1719/1834/984 1717/1832/984 1771/1876/984 1772/1877/984 +f 1758/1875/985 1759/1874/985 1761/1878/985 1760/1879/985 +f 1760/1879/986 1761/1878/986 1699/1880/986 1698/1881/986 +f 1708/1825/566 1710/1827/566 1832/1882/566 1831/1883/566 +f 1776/1884/987 1775/1885/987 1794/1886/987 +f 1737/1852/988 1735/1850/988 1780/1887/988 1781/1888/988 +f 1755/1870/989 1753/1868/989 1789/1889/989 1790/1890/989 +f 1711/1826/990 1709/1824/990 1767/1891/990 1768/1892/990 +f 1729/1844/991 1727/1842/991 1776/1884/991 1777/1893/991 +f 1747/1862/992 1745/1860/992 1785/1894/992 1786/1895/992 +f 1703/1818/993 1701/1816/993 1762/1896/993 1764/1897/993 +f 1721/1836/994 1719/1834/994 1772/1877/994 1773/1898/994 +f 1739/1854/995 1737/1852/995 1781/1888/995 1782/1899/995 +f 1757/1872/996 1755/1870/996 1790/1890/996 1791/1900/996 +f 1713/1828/997 1711/1826/997 1768/1892/997 1769/1901/997 +f 1731/1846/998 1729/1844/998 1777/1893/998 1778/1902/998 +f 1749/1864/999 1747/1862/999 1786/1895/999 1787/1903/999 +f 1705/1820/1000 1703/1818/1000 1764/1897/1000 1765/1904/1000 +f 1723/1838/1001 1721/1836/1001 1773/1898/1001 1774/1905/1001 +f 1741/1856/1002 1739/1854/1002 1782/1899/1002 1783/1906/1002 +f 1759/1874/1003 1757/1872/1003 1791/1900/1003 1792/1907/1003 +f 1715/1830/1004 1713/1828/1004 1769/1901/1004 1770/1908/1004 +f 1733/1848/1005 1731/1846/1005 1778/1902/1005 1779/1909/1005 +f 1751/1866/1006 1749/1864/1006 1787/1903/1006 1788/1910/1006 +f 1707/1822/1007 1705/1820/1007 1765/1904/1007 1766/1911/1007 +f 1725/1840/1008 1723/1838/1008 1774/1905/1008 1775/1885/1008 +f 1743/1858/1009 1741/1856/1009 1783/1906/1009 1784/1912/1009 +f 1761/1878/1010 1759/1874/1010 1792/1907/1010 1793/1913/1010 +f 1717/1832/1011 1715/1830/1011 1770/1908/1011 1771/1876/1011 +f 1735/1850/1012 1733/1848/1012 1779/1909/1012 1780/1887/1012 +f 1753/1868/1013 1751/1866/1013 1788/1910/1013 1789/1889/1013 +f 1709/1824/1014 1707/1822/1014 1766/1911/1014 1767/1891/1014 +f 1727/1842/1015 1725/1840/1015 1775/1885/1015 1776/1884/1015 +f 1745/1860/1016 1743/1858/1016 1784/1912/1016 1785/1894/1016 +f 1701/1816/1017 1699/1815/1017 1763/1914/1017 1762/1896/1017 +f 1699/1880/1018 1761/1878/1018 1793/1913/1018 1763/1915/1018 +f 1948/1916/1019 1950/1917/1019 1795/1918/1019 1796/1919/1019 +f 1762/1896/1020 1763/1914/1020 1794/1920/1020 +f 1790/1890/1021 1789/1889/1021 1794/1921/1021 +f 1777/1893/1022 1776/1884/1022 1794/1922/1022 +f 1764/1897/1023 1762/1896/1023 1794/1923/1023 +f 1791/1900/1024 1790/1890/1024 1794/1924/1024 +f 1778/1902/1025 1777/1893/1025 1794/1925/1025 +f 1765/1904/1026 1764/1897/1026 1794/1926/1026 +f 1792/1907/1027 1791/1900/1027 1794/1927/1027 +f 1779/1909/1028 1778/1902/1028 1794/1928/1028 +f 1766/1911/1029 1765/1904/1029 1794/1929/1029 +f 1793/1913/1030 1792/1907/1030 1794/1930/1030 +f 1780/1887/1031 1779/1909/1031 1794/1931/1031 +f 1767/1891/1032 1766/1911/1032 1794/1932/1032 +f 1763/1915/1033 1793/1913/1033 1794/1933/1033 +f 1781/1888/1034 1780/1887/1034 1794/1934/1034 +f 1768/1892/1035 1767/1891/1035 1794/1935/1035 +f 1782/1899/1036 1781/1888/1036 1794/1936/1036 +f 1769/1901/1037 1768/1892/1037 1794/1937/1037 +f 1783/1906/1038 1782/1899/1038 1794/1938/1038 +f 1770/1908/1039 1769/1901/1039 1794/1939/1039 +f 1784/1912/1040 1783/1906/1040 1794/1940/1040 +f 1771/1876/1041 1770/1908/1041 1794/1941/1041 +f 1785/1894/1042 1784/1912/1042 1794/1942/1042 +f 1772/1877/1043 1771/1876/1043 1794/1943/1043 +f 1786/1895/1044 1785/1894/1044 1794/1944/1044 +f 1773/1898/1045 1772/1877/1045 1794/1945/1045 +f 1787/1903/1046 1786/1895/1046 1794/1946/1046 +f 1774/1905/1047 1773/1898/1047 1794/1947/1047 +f 1788/1910/1048 1787/1903/1048 1794/1948/1048 +f 1775/1885/1049 1774/1905/1049 1794/1949/1049 +f 1789/1889/1050 1788/1910/1050 1794/1950/1050 +f 1890/1951/1051 1893/1952/1051 1857/1953/1051 1826/1954/1051 +f 1726/1843/566 1728/1845/566 1841/1955/566 1840/1956/566 +f 1744/1861/566 1746/1863/566 1850/1957/566 1849/1958/566 +f 1700/1817/566 1702/1819/566 1828/1959/566 1827/1960/566 +f 1718/1835/566 1720/1837/566 1837/1961/566 1836/1962/566 +f 1736/1853/566 1738/1855/566 1846/1963/566 1845/1964/566 +f 1754/1871/566 1756/1873/566 1855/1965/566 1854/1966/566 +f 1710/1827/566 1712/1829/566 1833/1967/566 1832/1882/566 +f 1728/1845/566 1730/1847/566 1842/1968/566 1841/1955/566 +f 1746/1863/566 1748/1865/566 1851/1969/566 1850/1957/566 +f 1702/1819/566 1704/1821/566 1829/1970/566 1828/1959/566 +f 1720/1837/566 1722/1839/566 1838/1971/566 1837/1961/566 +f 1738/1855/566 1740/1857/566 1847/1972/566 1846/1963/566 +f 1756/1873/566 1758/1875/566 1856/1973/566 1855/1965/566 +f 1712/1829/566 1714/1831/566 1834/1974/566 1833/1967/566 +f 1730/1847/566 1732/1849/566 1843/1975/566 1842/1968/566 +f 1748/1865/566 1750/1867/566 1852/1976/566 1851/1969/566 +f 1704/1821/566 1706/1823/566 1830/1977/566 1829/1970/566 +f 1722/1839/566 1724/1841/566 1839/1978/566 1838/1971/566 +f 1740/1857/566 1742/1859/566 1848/1979/566 1847/1972/566 +f 1758/1875/566 1760/1879/566 1857/1953/566 1856/1973/566 +f 1714/1831/566 1716/1833/566 1835/1980/566 1834/1974/566 +f 1732/1849/566 1734/1851/566 1844/1981/566 1843/1975/566 +f 1750/1867/566 1752/1869/566 1853/1982/566 1852/1976/566 +f 1706/1823/566 1708/1825/566 1831/1883/566 1830/1977/566 +f 1724/1841/566 1726/1843/566 1840/1956/566 1839/1978/566 +f 1742/1859/566 1744/1861/566 1849/1958/566 1848/1979/566 +f 1698/1814/566 1700/1817/566 1827/1960/566 1826/1983/566 +f 1760/1879/566 1698/1881/566 1826/1954/566 1857/1953/566 +f 1716/1833/566 1718/1835/566 1836/1962/566 1835/1980/566 +f 1734/1851/566 1736/1853/566 1845/1964/566 1844/1981/566 +f 1752/1869/566 1754/1871/566 1854/1966/566 1853/1982/566 +f 1858/1984/566 1859/1985/566 1860/1986/566 1861/1987/566 1862/1988/566 1863/1989/566 1864/1990/566 1865/1991/566 1866/1992/566 1867/1993/566 1868/1994/566 1869/1995/566 1870/1996/566 1871/1997/566 1872/1998/566 1873/1999/566 1874/2000/566 1875/2001/566 1876/2002/566 1877/2003/566 1878/2004/566 1879/2005/566 1880/2006/566 1881/2007/566 1882/2008/566 1883/2009/566 1884/2010/566 1885/2011/566 1886/2012/566 1887/2013/566 1888/2014/566 1889/2015/566 +f 1893/1952/1052 1895/2016/1052 1856/1973/1052 1857/1953/1052 +f 1895/2016/1053 1897/2017/1053 1855/1965/1053 1856/1973/1053 +f 1897/2017/1054 1899/2018/1054 1854/1966/1054 1855/1965/1054 +f 1899/2018/1055 1901/2019/1055 1853/1982/1055 1854/1966/1055 +f 1901/2019/1056 1903/2020/1056 1852/1976/1056 1853/1982/1056 +f 1903/2020/1057 1905/2021/1057 1851/1969/1057 1852/1976/1057 +f 1905/2021/1058 1907/2022/1058 1850/1957/1058 1851/1969/1058 +f 1907/2022/1059 1909/2023/1059 1849/1958/1059 1850/1957/1059 +f 1909/2023/1060 1911/2024/1060 1848/1979/1060 1849/1958/1060 +f 1911/2024/1061 1913/2025/1061 1847/1972/1061 1848/1979/1061 +f 1913/2025/1062 1915/2026/1062 1846/1963/1062 1847/1972/1062 +f 1915/2026/1063 1917/2027/1063 1845/1964/1063 1846/1963/1063 +f 1917/2027/1064 1919/2028/1064 1844/1981/1064 1845/1964/1064 +f 1919/2028/1065 1921/2029/1065 1843/1975/1065 1844/1981/1065 +f 1921/2029/1066 1923/2030/1066 1842/1968/1066 1843/1975/1066 +f 1923/2030/1067 1925/2031/1067 1841/1955/1067 1842/1968/1067 +f 1925/2031/1068 1927/2032/1068 1840/1956/1068 1841/1955/1068 +f 1927/2032/1069 1929/2033/1069 1839/1978/1069 1840/1956/1069 +f 1929/2033/1070 1931/2034/1070 1838/1971/1070 1839/1978/1070 +f 1931/2034/1071 1933/2035/1071 1837/1961/1071 1838/1971/1071 +f 1933/2035/1072 1935/2036/1072 1836/1962/1072 1837/1961/1072 +f 1935/2036/1073 1937/2037/1073 1835/1980/1073 1836/1962/1073 +f 1937/2037/1074 1939/2038/1074 1834/1974/1074 1835/1980/1074 +f 1939/2038/1075 1941/2039/1075 1833/1967/1075 1834/1974/1075 +f 1941/2039/1076 1943/2040/1076 1832/1882/1076 1833/1967/1076 +f 1943/2040/1077 1945/2041/1077 1831/1883/1077 1832/1882/1077 +f 1945/2041/1078 1947/2042/1078 1830/1977/1078 1831/1883/1078 +f 1947/2042/1079 1949/2043/1079 1829/1970/1079 1830/1977/1079 +f 1949/2043/1080 1951/2044/1080 1828/1959/1080 1829/1970/1080 +f 1951/2044/1081 1953/2045/1081 1827/1960/1081 1828/1959/1081 +f 1953/2045/1082 1890/2046/1082 1826/1983/1082 1827/1960/1082 +f 1986/2047/1083 1955/2048/1083 1891/2049/1083 1952/2050/1083 +f 1954/2051/1084 1825/2052/1084 1890/2046/1084 1953/2045/1084 +f 1985/2053/1085 1986/2047/1085 1952/2050/1085 1950/1917/1085 +f 1795/1918/1086 1954/2051/1086 1953/2045/1086 1951/2044/1086 +f 1984/2054/1087 1985/2053/1087 1950/1917/1087 1948/1916/1087 +f 1796/1919/1088 1795/1918/1088 1951/2044/1088 1949/2043/1088 +f 1983/2055/1089 1984/2054/1089 1948/1916/1089 1946/2056/1089 +f 1797/2057/1090 1796/1919/1090 1949/2043/1090 1947/2042/1090 +f 1982/2058/1091 1983/2055/1091 1946/2056/1091 1944/2059/1091 +f 1798/2060/1092 1797/2057/1092 1947/2042/1092 1945/2041/1092 +f 1981/2061/1093 1982/2058/1093 1944/2059/1093 1942/2062/1093 +f 1799/2063/1094 1798/2060/1094 1945/2041/1094 1943/2040/1094 +f 1980/2064/1095 1981/2061/1095 1942/2062/1095 1940/2065/1095 +f 1800/2066/1096 1799/2063/1096 1943/2040/1096 1941/2039/1096 +f 1979/2067/1097 1980/2064/1097 1940/2065/1097 1938/2068/1097 +f 1801/2069/1098 1800/2066/1098 1941/2039/1098 1939/2038/1098 +f 1978/2070/1099 1979/2067/1099 1938/2068/1099 1936/2071/1099 +f 1802/2072/1100 1801/2069/1100 1939/2038/1100 1937/2037/1100 +f 1977/2073/1101 1978/2070/1101 1936/2071/1101 1934/2074/1101 +f 1803/2075/1102 1802/2072/1102 1937/2037/1102 1935/2036/1102 +f 1976/2076/1103 1977/2073/1103 1934/2074/1103 1932/2077/1103 +f 1804/2078/1104 1803/2075/1104 1935/2036/1104 1933/2035/1104 +f 1975/2079/1105 1976/2076/1105 1932/2077/1105 1930/2080/1105 +f 1805/2081/1106 1804/2078/1106 1933/2035/1106 1931/2034/1106 +f 1974/2082/1107 1975/2079/1107 1930/2080/1107 1928/2083/1107 +f 1806/2084/1108 1805/2081/1108 1931/2034/1108 1929/2033/1108 +f 1973/2085/1109 1974/2082/1109 1928/2083/1109 1926/2086/1109 +f 1807/2087/1110 1806/2084/1110 1929/2033/1110 1927/2032/1110 +f 1972/2088/1111 1973/2085/1111 1926/2086/1111 1924/2089/1111 +f 1808/2090/1112 1807/2087/1112 1927/2032/1112 1925/2031/1112 +f 1971/2091/1113 1972/2088/1113 1924/2089/1113 1922/2092/1113 +f 1809/2093/1114 1808/2090/1114 1925/2031/1114 1923/2030/1114 +f 1970/2094/1115 1971/2091/1115 1922/2092/1115 1920/2095/1115 +f 1810/2096/1116 1809/2093/1116 1923/2030/1116 1921/2029/1116 +f 1969/2097/1117 1970/2094/1117 1920/2095/1117 1918/2098/1117 +f 1811/2099/1118 1810/2096/1118 1921/2029/1118 1919/2028/1118 +f 1968/2100/1119 1969/2097/1119 1918/2098/1119 1916/2101/1119 +f 1812/2102/1120 1811/2099/1120 1919/2028/1120 1917/2027/1120 +f 1967/2103/1121 1968/2100/1121 1916/2101/1121 1914/2104/1121 +f 1813/2105/1122 1812/2102/1122 1917/2027/1122 1915/2026/1122 +f 1966/2106/1123 1967/2103/1123 1914/2104/1123 1912/2107/1123 +f 1814/2108/1124 1813/2105/1124 1915/2026/1124 1913/2025/1124 +f 1965/2109/1125 1966/2106/1125 1912/2107/1125 1910/2110/1125 +f 1815/2111/1126 1814/2108/1126 1913/2025/1126 1911/2024/1126 +f 1964/2112/1127 1965/2109/1127 1910/2110/1127 1908/2113/1127 +f 1816/2114/1128 1815/2111/1128 1911/2024/1128 1909/2023/1128 +f 1963/2115/1129 1964/2112/1129 1908/2113/1129 1906/2116/1129 +f 1817/2117/1130 1816/2114/1130 1909/2023/1130 1907/2022/1130 +f 1962/2118/1131 1963/2115/1131 1906/2116/1131 1904/2119/1131 +f 1818/2120/1132 1817/2117/1132 1907/2022/1132 1905/2021/1132 +f 1961/2121/1133 1962/2118/1133 1904/2119/1133 1902/2122/1133 +f 1819/2123/1134 1818/2120/1134 1905/2021/1134 1903/2020/1134 +f 1960/2124/1135 1961/2121/1135 1902/2122/1135 1900/2125/1135 +f 1820/2126/1136 1819/2123/1136 1903/2020/1136 1901/2019/1136 +f 1959/2127/1137 1960/2124/1137 1900/2125/1137 1898/2128/1137 +f 1821/2129/1138 1820/2126/1138 1901/2019/1138 1899/2018/1138 +f 1958/2130/1139 1959/2127/1139 1898/2128/1139 1896/2131/1139 +f 1822/2132/1140 1821/2129/1140 1899/2018/1140 1897/2017/1140 +f 1957/2133/1141 1958/2130/1141 1896/2131/1141 1894/2134/1141 +f 1823/2135/1142 1822/2132/1142 1897/2017/1142 1895/2016/1142 +f 1956/2136/1143 1957/2133/1143 1894/2134/1143 1892/2137/1143 +f 1824/2138/1144 1823/2135/1144 1895/2016/1144 1893/1952/1144 +f 1955/2139/1145 1956/2136/1145 1892/2137/1145 1891/2140/1145 +f 1825/2141/1146 1824/2138/1146 1893/1952/1146 1890/1951/1146 +f 1946/2056/1147 1948/1916/1147 1796/1919/1147 1797/2057/1147 +f 1944/2059/1148 1946/2056/1148 1797/2057/1148 1798/2060/1148 +f 1942/2062/1149 1944/2059/1149 1798/2060/1149 1799/2063/1149 +f 1940/2065/1150 1942/2062/1150 1799/2063/1150 1800/2066/1150 +f 1938/2068/1151 1940/2065/1151 1800/2066/1151 1801/2069/1151 +f 1936/2071/1152 1938/2068/1152 1801/2069/1152 1802/2072/1152 +f 1934/2074/1153 1936/2071/1153 1802/2072/1153 1803/2075/1153 +f 1932/2077/1154 1934/2074/1154 1803/2075/1154 1804/2078/1154 +f 1930/2080/1155 1932/2077/1155 1804/2078/1155 1805/2081/1155 +f 1928/2083/1156 1930/2080/1156 1805/2081/1156 1806/2084/1156 +f 1926/2086/1157 1928/2083/1157 1806/2084/1157 1807/2087/1157 +f 1924/2089/1158 1926/2086/1158 1807/2087/1158 1808/2090/1158 +f 1922/2092/1159 1924/2089/1159 1808/2090/1159 1809/2093/1159 +f 1920/2095/1160 1922/2092/1160 1809/2093/1160 1810/2096/1160 +f 1918/2098/1161 1920/2095/1161 1810/2096/1161 1811/2099/1161 +f 1916/2101/1162 1918/2098/1162 1811/2099/1162 1812/2102/1162 +f 1914/2104/1163 1916/2101/1163 1812/2102/1163 1813/2105/1163 +f 1912/2107/1164 1914/2104/1164 1813/2105/1164 1814/2108/1164 +f 1910/2110/1165 1912/2107/1165 1814/2108/1165 1815/2111/1165 +f 1908/2113/1166 1910/2110/1166 1815/2111/1166 1816/2114/1166 +f 1906/2116/1167 1908/2113/1167 1816/2114/1167 1817/2117/1167 +f 1904/2119/1168 1906/2116/1168 1817/2117/1168 1818/2120/1168 +f 1902/2122/1169 1904/2119/1169 1818/2120/1169 1819/2123/1169 +f 1900/2125/1170 1902/2122/1170 1819/2123/1170 1820/2126/1170 +f 1898/2128/1171 1900/2125/1171 1820/2126/1171 1821/2129/1171 +f 1896/2131/1172 1898/2128/1172 1821/2129/1172 1822/2132/1172 +f 1894/2134/1173 1896/2131/1173 1822/2132/1173 1823/2135/1173 +f 1892/2137/1174 1894/2134/1174 1823/2135/1174 1824/2138/1174 +f 1891/2140/1175 1892/2137/1175 1824/2138/1175 1825/2141/1175 +f 1950/1917/1176 1952/2050/1176 1954/2051/1176 1795/1918/1176 +f 1952/2050/1177 1891/2049/1177 1825/2052/1177 1954/2051/1177 +f 1858/1984/1178 1889/2015/1178 1956/2136/1178 1955/2139/1178 +f 1889/2015/1179 1888/2014/1179 1957/2133/1179 1956/2136/1179 +f 1888/2014/1180 1887/2013/1180 1958/2130/1180 1957/2133/1180 +f 1887/2013/1181 1886/2012/1181 1959/2127/1181 1958/2130/1181 +f 1886/2012/1182 1885/2011/1182 1960/2124/1182 1959/2127/1182 +f 1885/2011/1183 1884/2010/1183 1961/2121/1183 1960/2124/1183 +f 1884/2010/1184 1883/2009/1184 1962/2118/1184 1961/2121/1184 +f 1883/2009/1185 1882/2008/1185 1963/2115/1185 1962/2118/1185 +f 1882/2008/1186 1881/2007/1186 1964/2112/1186 1963/2115/1186 +f 1881/2007/1187 1880/2006/1187 1965/2109/1187 1964/2112/1187 +f 1880/2006/1188 1879/2005/1188 1966/2106/1188 1965/2109/1188 +f 1879/2005/1189 1878/2004/1189 1967/2103/1189 1966/2106/1189 +f 1878/2004/1190 1877/2003/1190 1968/2100/1190 1967/2103/1190 +f 1877/2003/1191 1876/2002/1191 1969/2097/1191 1968/2100/1191 +f 1876/2002/1192 1875/2001/1192 1970/2094/1192 1969/2097/1192 +f 1875/2001/1193 1874/2000/1193 1971/2091/1193 1970/2094/1193 +f 1874/2000/1194 1873/1999/1194 1972/2088/1194 1971/2091/1194 +f 1873/1999/1195 1872/1998/1195 1973/2085/1195 1972/2088/1195 +f 1872/1998/1196 1871/1997/1196 1974/2082/1196 1973/2085/1196 +f 1871/1997/1197 1870/1996/1197 1975/2079/1197 1974/2082/1197 +f 1870/1996/1198 1869/1995/1198 1976/2076/1198 1975/2079/1198 +f 1869/1995/1199 1868/1994/1199 1977/2073/1199 1976/2076/1199 +f 1868/1994/1200 1867/1993/1200 1978/2070/1200 1977/2073/1200 +f 1867/1993/1201 1866/1992/1201 1979/2067/1201 1978/2070/1201 +f 1866/1992/1202 1865/1991/1202 1980/2064/1202 1979/2067/1202 +f 1865/1991/1203 1864/1990/1203 1981/2061/1203 1980/2064/1203 +f 1864/1990/1204 1863/1989/1204 1982/2058/1204 1981/2061/1204 +f 1863/1989/1205 1862/1988/1205 1983/2055/1205 1982/2058/1205 +f 1862/1988/1206 1861/1987/1206 1984/2054/1206 1983/2055/1206 +f 1861/1987/1207 1860/1986/1207 1985/2053/1207 1984/2054/1207 +f 1860/1986/1208 1859/1985/1208 1986/2047/1208 1985/2053/1208 +f 1859/1985/1209 1858/1984/1209 1955/2048/1209 1986/2047/1209 +f 1987/2142/1210 1989/2143/1210 1990/2144/1210 1988/2145/1210 +f 1989/2143/1211 1991/2146/1211 1992/2147/1211 1990/2144/1211 +f 1991/2146/1212 1993/2148/1212 1994/2149/1212 1992/2147/1212 +f 1993/2148/1213 1995/2150/1213 1996/2151/1213 1994/2149/1213 +f 1995/2150/1214 1997/2152/1214 1998/2153/1214 1996/2151/1214 +f 1997/2152/1215 1999/2154/1215 2000/2155/1215 1998/2153/1215 +f 1999/2154/1216 2001/2156/1216 2002/2157/1216 2000/2155/1216 +f 2001/2156/1217 2003/2158/1217 2004/2159/1217 2002/2157/1217 +f 2003/2158/1218 2005/2160/1218 2006/2161/1218 2004/2159/1218 +f 2005/2160/1219 2007/2162/1219 2008/2163/1219 2006/2161/1219 +f 2007/2162/1220 2009/2164/1220 2010/2165/1220 2008/2163/1220 +f 2009/2164/1221 2011/2166/1221 2012/2167/1221 2010/2165/1221 +f 2011/2166/1222 2013/2168/1222 2014/2169/1222 2012/2167/1222 +f 2013/2168/1223 2015/2170/1223 2016/2171/1223 2014/2169/1223 +f 2015/2170/1224 2017/2172/1224 2018/2173/1224 2016/2171/1224 +f 2017/2172/1225 2019/2174/1225 2020/2175/1225 2018/2173/1225 +f 2019/2174/1226 2021/2176/1226 2022/2177/1226 2020/2175/1226 +f 2021/2176/1227 2023/2178/1227 2024/2179/1227 2022/2177/1227 +f 2023/2178/1228 2025/2180/1228 2026/2181/1228 2024/2179/1228 +f 2025/2180/1229 2027/2182/1229 2028/2183/1229 2026/2181/1229 +f 2027/2182/1230 2029/2184/1230 2030/2185/1230 2028/2183/1230 +f 2029/2184/1231 2031/2186/1231 2032/2187/1231 2030/2185/1231 +f 2031/2186/1232 2033/2188/1232 2034/2189/1232 2032/2187/1232 +f 2033/2188/1233 2035/2190/1233 2036/2191/1233 2034/2189/1233 +f 2035/2190/1234 2037/2192/1234 2038/2193/1234 2036/2191/1234 +f 2037/2192/1235 2039/2194/1235 2040/2195/1235 2038/2193/1235 +f 2039/2194/1236 2041/2196/1236 2042/2197/1236 2040/2195/1236 +f 2041/2196/1237 2043/2198/1237 2044/2199/1237 2042/2197/1237 +f 2043/2198/1238 2045/2200/1238 2046/2201/1238 2044/2199/1238 +f 2045/2200/1239 2047/2202/1239 2048/2203/1239 2046/2201/1239 +f 2008/2163/1240 2061/2204/1240 2060/2205/1240 2006/2161/1240 +f 2047/2202/1241 2049/2206/1241 2050/2207/1241 2048/2203/1241 +f 2049/2206/1242 1987/2208/1242 1988/2209/1242 2050/2207/1242 +f 1997/2152/566 2120/2210/566 2121/2211/566 1999/2154/566 +f 2065/2212/1026 2083/2213/1026 2064/2214/1026 +f 2026/2181/1243 2070/2215/1243 2069/2216/1243 2024/2179/1243 +f 2044/2199/1244 2079/2217/1244 2078/2218/1244 2042/2197/1244 +f 2000/2155/1245 2057/2219/1245 2056/2220/1245 1998/2153/1245 +f 2018/2173/1246 2066/2221/1246 2065/2212/1246 2016/2171/1246 +f 2036/2191/1247 2075/2222/1247 2074/2223/1247 2034/2189/1247 +f 1992/2147/1248 2053/2224/1248 2051/2225/1248 1990/2144/1248 +f 2010/2165/1249 2062/2226/1249 2061/2204/1249 2008/2163/1249 +f 2028/2183/1250 2071/2227/1250 2070/2215/1250 2026/2181/1250 +f 2046/2201/1251 2080/2228/1251 2079/2217/1251 2044/2199/1251 +f 2002/2157/1252 2058/2229/1252 2057/2219/1252 2000/2155/1252 +f 2020/2175/1253 2067/2230/1253 2066/2221/1253 2018/2173/1253 +f 2038/2193/1254 2076/2231/1254 2075/2222/1254 2036/2191/1254 +f 1994/2149/1255 2054/2232/1255 2053/2224/1255 1992/2147/1255 +f 2012/2167/1256 2063/2233/1256 2062/2226/1256 2010/2165/1256 +f 2030/2185/1257 2072/2234/1257 2071/2227/1257 2028/2183/1257 +f 2048/2203/1258 2081/2235/1258 2080/2228/1258 2046/2201/1258 +f 2004/2159/1259 2059/2236/1259 2058/2229/1259 2002/2157/1259 +f 2022/2177/1260 2068/2237/1260 2067/2230/1260 2020/2175/1260 +f 2040/2195/1261 2077/2238/1261 2076/2231/1261 2038/2193/1261 +f 1996/2151/1262 2055/2239/1262 2054/2232/1262 1994/2149/1262 +f 2014/2169/1263 2064/2214/1263 2063/2233/1263 2012/2167/1263 +f 2032/2187/1264 2073/2240/1264 2072/2234/1264 2030/2185/1264 +f 2050/2207/1265 2082/2241/1265 2081/2235/1265 2048/2203/1265 +f 2006/2161/1266 2060/2205/1266 2059/2236/1266 2004/2159/1266 +f 2024/2179/1267 2069/2216/1267 2068/2237/1267 2022/2177/1267 +f 2042/2197/1268 2078/2218/1268 2077/2238/1268 2040/2195/1268 +f 1998/2153/1269 2056/2220/1269 2055/2239/1269 1996/2151/1269 +f 2016/2171/1270 2065/2212/1270 2064/2214/1270 2014/2169/1270 +f 2034/2189/1271 2074/2223/1271 2073/2240/1271 2032/2187/1271 +f 1990/2144/1272 2051/2225/1272 2052/2242/1272 1988/2145/1272 +f 1988/2209/1273 2052/2243/1273 2082/2241/1273 2050/2207/1273 +f 2237/2244/1274 2085/2245/1274 2084/2246/1274 2239/2247/1274 +f 2051/2225/1025 2083/2248/1025 2052/2242/1025 +f 2079/2217/1038 2083/2249/1038 2078/2218/1038 +f 2066/2221/1023 2083/2250/1023 2065/2212/1023 +f 2053/2224/1022 2083/2251/1022 2051/2225/1022 +f 2080/2228/1036 2083/2252/1036 2079/2217/1036 +f 2067/2230/1020 2083/2253/1020 2066/2221/1020 +f 2054/2232/1275 2083/2254/1275 2053/2224/1275 +f 2081/2235/1276 2083/2255/1276 2080/2228/1276 +f 2068/2237/1033 2083/2256/1033 2067/2230/1033 +f 2055/2239/1049 2083/2257/1049 2054/2232/1049 +f 2082/2241/1031 2083/2258/1031 2081/2235/1031 +f 2069/2216/1030 2083/2259/1030 2068/2237/1030 +f 2056/2220/1047 2083/2260/1047 2055/2239/1047 +f 2052/2243/1028 2083/2261/1028 2082/2241/1028 +f 2070/2215/1027 2083/2262/1027 2069/2216/1027 +f 2057/2219/1045 2083/2263/1045 2056/2220/1045 +f 2071/2227/1024 2083/2264/1024 2070/2215/1024 +f 2058/2229/1043 2083/2265/1043 2057/2219/1043 +f 2072/2234/1021 2083/2266/1021 2071/2227/1021 +f 2059/2236/1041 2083/2267/1041 2058/2229/1041 +f 2073/2240/1050 2083/2268/1050 2072/2234/1050 +f 2060/2205/1039 2083/2269/1039 2059/2236/1039 +f 2074/2223/1048 2083/2270/1048 2073/2240/1048 +f 2061/2204/1037 2083/2271/1037 2060/2205/1037 +f 2075/2222/1046 2083/2272/1046 2074/2223/1046 +f 2062/2226/1035 2083/2273/1035 2061/2204/1035 +f 2076/2231/1044 2083/2274/1044 2075/2222/1044 +f 2063/2233/1032 2083/2275/1032 2062/2226/1032 +f 2077/2238/1042 2083/2276/1042 2076/2231/1042 +f 2064/2214/1029 2083/2277/1029 2063/2233/1029 +f 2078/2218/1040 2083/2278/1040 2077/2238/1040 +f 2179/2279/1277 2115/2280/1277 2146/2281/1277 2182/2282/1277 +f 2015/2170/566 2129/2283/566 2130/2284/566 2017/2172/566 +f 2033/2188/566 2138/2285/566 2139/2286/566 2035/2190/566 +f 1989/2143/566 2116/2287/566 2117/2288/566 1991/2146/566 +f 2007/2162/566 2125/2289/566 2126/2290/566 2009/2164/566 +f 2025/2180/566 2134/2291/566 2135/2292/566 2027/2182/566 +f 2043/2198/566 2143/2293/566 2144/2294/566 2045/2200/566 +f 1999/2154/566 2121/2211/566 2122/2295/566 2001/2156/566 +f 2017/2172/566 2130/2284/566 2131/2296/566 2019/2174/566 +f 2035/2190/566 2139/2286/566 2140/2297/566 2037/2192/566 +f 1991/2146/566 2117/2288/566 2118/2298/566 1993/2148/566 +f 2009/2164/566 2126/2290/566 2127/2299/566 2011/2166/566 +f 2027/2182/566 2135/2292/566 2136/2300/566 2029/2184/566 +f 2045/2200/566 2144/2294/566 2145/2301/566 2047/2202/566 +f 2001/2156/566 2122/2295/566 2123/2302/566 2003/2158/566 +f 2019/2174/566 2131/2296/566 2132/2303/566 2021/2176/566 +f 2037/2192/566 2140/2297/566 2141/2304/566 2039/2194/566 +f 1993/2148/566 2118/2298/566 2119/2305/566 1995/2150/566 +f 2011/2166/566 2127/2299/566 2128/2306/566 2013/2168/566 +f 2029/2184/566 2136/2300/566 2137/2307/566 2031/2186/566 +f 2047/2202/566 2145/2301/566 2146/2281/566 2049/2206/566 +f 2003/2158/566 2123/2302/566 2124/2308/566 2005/2160/566 +f 2021/2176/566 2132/2303/566 2133/2309/566 2023/2178/566 +f 2039/2194/566 2141/2304/566 2142/2310/566 2041/2196/566 +f 1995/2150/566 2119/2305/566 2120/2210/566 1997/2152/566 +f 2013/2168/566 2128/2306/566 2129/2283/566 2015/2170/566 +f 2031/2186/566 2137/2307/566 2138/2285/566 2033/2188/566 +f 1987/2142/566 2115/2311/566 2116/2287/566 1989/2143/566 +f 2049/2206/566 2146/2281/566 2115/2280/566 1987/2208/566 +f 2005/2160/566 2124/2308/566 2125/2289/566 2007/2162/566 +f 2023/2178/566 2133/2309/566 2134/2291/566 2025/2180/566 +f 2041/2196/566 2142/2310/566 2143/2293/566 2043/2198/566 +f 2147/2312/1278 2178/2313/1278 2177/2314/1278 2176/2315/1278 2175/2316/1278 2174/2317/1278 2173/2318/1278 2172/2319/1278 2171/2320/1278 2170/2321/1278 2169/2322/1278 2168/2323/1278 2167/2324/1278 2166/2325/1278 2165/2326/1278 2164/2327/1278 2163/2328/1278 2162/2329/1278 2161/2330/1278 2160/2331/1278 2159/2332/1278 2158/2333/1278 2157/2334/1278 2156/2335/1278 2155/2336/1278 2154/2337/1278 2153/2338/1278 2152/2339/1278 2151/2340/1278 2150/2341/1278 2149/2342/1278 2148/2343/1278 +f 2182/2282/1279 2146/2281/1279 2145/2301/1279 2184/2344/1279 +f 2184/2344/1280 2145/2301/1280 2144/2294/1280 2186/2345/1280 +f 2186/2345/1281 2144/2294/1281 2143/2293/1281 2188/2346/1281 +f 2188/2346/1282 2143/2293/1282 2142/2310/1282 2190/2347/1282 +f 2190/2347/1283 2142/2310/1283 2141/2304/1283 2192/2348/1283 +f 2192/2348/1284 2141/2304/1284 2140/2297/1284 2194/2349/1284 +f 2194/2349/1285 2140/2297/1285 2139/2286/1285 2196/2350/1285 +f 2196/2350/1286 2139/2286/1286 2138/2285/1286 2198/2351/1286 +f 2198/2351/1287 2138/2285/1287 2137/2307/1287 2200/2352/1287 +f 2200/2352/1288 2137/2307/1288 2136/2300/1288 2202/2353/1288 +f 2202/2353/1289 2136/2300/1289 2135/2292/1289 2204/2354/1289 +f 2204/2354/1290 2135/2292/1290 2134/2291/1290 2206/2355/1290 +f 2206/2355/1291 2134/2291/1291 2133/2309/1291 2208/2356/1291 +f 2208/2356/1292 2133/2309/1292 2132/2303/1292 2210/2357/1292 +f 2210/2357/1293 2132/2303/1293 2131/2296/1293 2212/2358/1293 +f 2212/2358/1294 2131/2296/1294 2130/2284/1294 2214/2359/1294 +f 2214/2359/1295 2130/2284/1295 2129/2283/1295 2216/2360/1295 +f 2216/2360/1296 2129/2283/1296 2128/2306/1296 2218/2361/1296 +f 2218/2361/1297 2128/2306/1297 2127/2299/1297 2220/2362/1297 +f 2220/2362/1298 2127/2299/1298 2126/2290/1298 2222/2363/1298 +f 2222/2363/1299 2126/2290/1299 2125/2289/1299 2224/2364/1299 +f 2224/2364/1300 2125/2289/1300 2124/2308/1300 2226/2365/1300 +f 2226/2365/1301 2124/2308/1301 2123/2302/1301 2228/2366/1301 +f 2228/2366/1302 2123/2302/1302 2122/2295/1302 2230/2367/1302 +f 2230/2367/1303 2122/2295/1303 2121/2211/1303 2232/2368/1303 +f 2232/2368/1304 2121/2211/1304 2120/2210/1304 2234/2369/1304 +f 2234/2369/1305 2120/2210/1305 2119/2305/1305 2236/2370/1305 +f 2236/2370/1306 2119/2305/1306 2118/2298/1306 2238/2371/1306 +f 2238/2371/1307 2118/2298/1307 2117/2288/1307 2240/2372/1307 +f 2240/2372/1308 2117/2288/1308 2116/2287/1308 2242/2373/1308 +f 2242/2373/1309 2116/2287/1309 2115/2311/1309 2179/2374/1309 +f 2275/2375/1310 2241/2376/1310 2180/2377/1310 2244/2378/1310 +f 2243/2379/1311 2242/2373/1311 2179/2374/1311 2114/2380/1311 +f 2274/2381/1312 2239/2247/1312 2241/2376/1312 2275/2375/1312 +f 2084/2246/1313 2240/2372/1313 2242/2373/1313 2243/2379/1313 +f 2273/2382/1314 2237/2244/1314 2239/2247/1314 2274/2381/1314 +f 2085/2245/1315 2238/2371/1315 2240/2372/1315 2084/2246/1315 +f 2272/2383/1316 2235/2384/1316 2237/2244/1316 2273/2382/1316 +f 2086/2385/1317 2236/2370/1317 2238/2371/1317 2085/2245/1317 +f 2271/2386/1318 2233/2387/1318 2235/2384/1318 2272/2383/1318 +f 2087/2388/1319 2234/2369/1319 2236/2370/1319 2086/2385/1319 +f 2270/2389/1320 2231/2390/1320 2233/2387/1320 2271/2386/1320 +f 2088/2391/1321 2232/2368/1321 2234/2369/1321 2087/2388/1321 +f 2269/2392/1322 2229/2393/1322 2231/2390/1322 2270/2389/1322 +f 2089/2394/1323 2230/2367/1323 2232/2368/1323 2088/2391/1323 +f 2268/2395/1324 2227/2396/1324 2229/2393/1324 2269/2392/1324 +f 2090/2397/1325 2228/2366/1325 2230/2367/1325 2089/2394/1325 +f 2267/2398/1326 2225/2399/1326 2227/2396/1326 2268/2395/1326 +f 2091/2400/1327 2226/2365/1327 2228/2366/1327 2090/2397/1327 +f 2266/2401/1328 2223/2402/1328 2225/2399/1328 2267/2398/1328 +f 2092/2403/1329 2224/2364/1329 2226/2365/1329 2091/2400/1329 +f 2265/2404/1330 2221/2405/1330 2223/2402/1330 2266/2401/1330 +f 2093/2406/1331 2222/2363/1331 2224/2364/1331 2092/2403/1331 +f 2264/2407/1332 2219/2408/1332 2221/2405/1332 2265/2404/1332 +f 2094/2409/1333 2220/2362/1333 2222/2363/1333 2093/2406/1333 +f 2263/2410/1334 2217/2411/1334 2219/2408/1334 2264/2407/1334 +f 2095/2412/1335 2218/2361/1335 2220/2362/1335 2094/2409/1335 +f 2262/2413/1336 2215/2414/1336 2217/2411/1336 2263/2410/1336 +f 2096/2415/1337 2216/2360/1337 2218/2361/1337 2095/2412/1337 +f 2261/2416/1338 2213/2417/1338 2215/2414/1338 2262/2413/1338 +f 2097/2418/1339 2214/2359/1339 2216/2360/1339 2096/2415/1339 +f 2260/2419/1340 2211/2420/1340 2213/2417/1340 2261/2416/1340 +f 2098/2421/1341 2212/2358/1341 2214/2359/1341 2097/2418/1341 +f 2259/2422/1342 2209/2423/1342 2211/2420/1342 2260/2419/1342 +f 2099/2424/1343 2210/2357/1343 2212/2358/1343 2098/2421/1343 +f 2258/2425/1344 2207/2426/1344 2209/2423/1344 2259/2422/1344 +f 2100/2427/1345 2208/2356/1345 2210/2357/1345 2099/2424/1345 +f 2257/2428/1346 2205/2429/1346 2207/2426/1346 2258/2425/1346 +f 2101/2430/1347 2206/2355/1347 2208/2356/1347 2100/2427/1347 +f 2256/2431/1348 2203/2432/1348 2205/2429/1348 2257/2428/1348 +f 2102/2433/1349 2204/2354/1349 2206/2355/1349 2101/2430/1349 +f 2255/2434/1350 2201/2435/1350 2203/2432/1350 2256/2431/1350 +f 2103/2436/1351 2202/2353/1351 2204/2354/1351 2102/2433/1351 +f 2254/2437/1352 2199/2438/1352 2201/2435/1352 2255/2434/1352 +f 2104/2439/1353 2200/2352/1353 2202/2353/1353 2103/2436/1353 +f 2253/2440/1354 2197/2441/1354 2199/2438/1354 2254/2437/1354 +f 2105/2442/1355 2198/2351/1355 2200/2352/1355 2104/2439/1355 +f 2252/2443/1356 2195/2444/1356 2197/2441/1356 2253/2440/1356 +f 2106/2445/1357 2196/2350/1357 2198/2351/1357 2105/2442/1357 +f 2251/2446/1358 2193/2447/1358 2195/2444/1358 2252/2443/1358 +f 2107/2448/1359 2194/2349/1359 2196/2350/1359 2106/2445/1359 +f 2250/2449/1360 2191/2450/1360 2193/2447/1360 2251/2446/1360 +f 2108/2451/1361 2192/2348/1361 2194/2349/1361 2107/2448/1361 +f 2249/2452/1362 2189/2453/1362 2191/2450/1362 2250/2449/1362 +f 2109/2454/1363 2190/2347/1363 2192/2348/1363 2108/2451/1363 +f 2248/2455/1364 2187/2456/1364 2189/2453/1364 2249/2452/1364 +f 2110/2457/1365 2188/2346/1365 2190/2347/1365 2109/2454/1365 +f 2247/2458/1366 2185/2459/1366 2187/2456/1366 2248/2455/1366 +f 2111/2460/1367 2186/2345/1367 2188/2346/1367 2110/2457/1367 +f 2246/2461/1368 2183/2462/1368 2185/2459/1368 2247/2458/1368 +f 2112/2463/1369 2184/2344/1369 2186/2345/1369 2111/2460/1369 +f 2245/2464/1370 2181/2465/1370 2183/2462/1370 2246/2461/1370 +f 2113/2466/1371 2182/2282/1371 2184/2344/1371 2112/2463/1371 +f 2244/2467/1372 2180/2468/1372 2181/2465/1372 2245/2464/1372 +f 2114/2469/1373 2179/2279/1373 2182/2282/1373 2113/2466/1373 +f 2235/2384/1374 2086/2385/1374 2085/2245/1374 2237/2244/1374 +f 2233/2387/1375 2087/2388/1375 2086/2385/1375 2235/2384/1375 +f 2231/2390/1376 2088/2391/1376 2087/2388/1376 2233/2387/1376 +f 2229/2393/1377 2089/2394/1377 2088/2391/1377 2231/2390/1377 +f 2227/2396/1378 2090/2397/1378 2089/2394/1378 2229/2393/1378 +f 2225/2399/1379 2091/2400/1379 2090/2397/1379 2227/2396/1379 +f 2223/2402/1380 2092/2403/1380 2091/2400/1380 2225/2399/1380 +f 2221/2405/1381 2093/2406/1381 2092/2403/1381 2223/2402/1381 +f 2219/2408/1382 2094/2409/1382 2093/2406/1382 2221/2405/1382 +f 2217/2411/1383 2095/2412/1383 2094/2409/1383 2219/2408/1383 +f 2215/2414/1384 2096/2415/1384 2095/2412/1384 2217/2411/1384 +f 2213/2417/1385 2097/2418/1385 2096/2415/1385 2215/2414/1385 +f 2211/2420/1386 2098/2421/1386 2097/2418/1386 2213/2417/1386 +f 2209/2423/1387 2099/2424/1387 2098/2421/1387 2211/2420/1387 +f 2207/2426/1388 2100/2427/1388 2099/2424/1388 2209/2423/1388 +f 2205/2429/1389 2101/2430/1389 2100/2427/1389 2207/2426/1389 +f 2203/2432/1390 2102/2433/1390 2101/2430/1390 2205/2429/1390 +f 2201/2435/1391 2103/2436/1391 2102/2433/1391 2203/2432/1391 +f 2199/2438/1392 2104/2439/1392 2103/2436/1392 2201/2435/1392 +f 2197/2441/1393 2105/2442/1393 2104/2439/1393 2199/2438/1393 +f 2195/2444/1394 2106/2445/1394 2105/2442/1394 2197/2441/1394 +f 2193/2447/1395 2107/2448/1395 2106/2445/1395 2195/2444/1395 +f 2191/2450/1396 2108/2451/1396 2107/2448/1396 2193/2447/1396 +f 2189/2453/1397 2109/2454/1397 2108/2451/1397 2191/2450/1397 +f 2187/2456/1398 2110/2457/1398 2109/2454/1398 2189/2453/1398 +f 2185/2459/1399 2111/2460/1399 2110/2457/1399 2187/2456/1399 +f 2183/2462/1400 2112/2463/1400 2111/2460/1400 2185/2459/1400 +f 2181/2465/1401 2113/2466/1401 2112/2463/1401 2183/2462/1401 +f 2180/2468/1402 2114/2469/1402 2113/2466/1402 2181/2465/1402 +f 2239/2247/1403 2084/2246/1403 2243/2379/1403 2241/2376/1403 +f 2241/2376/1404 2243/2379/1404 2114/2380/1404 2180/2377/1404 +f 2147/2312/1405 2244/2467/1405 2245/2464/1405 2178/2313/1405 +f 2178/2313/1406 2245/2464/1406 2246/2461/1406 2177/2314/1406 +f 2177/2314/1407 2246/2461/1407 2247/2458/1407 2176/2315/1407 +f 2176/2315/1408 2247/2458/1408 2248/2455/1408 2175/2316/1408 +f 2175/2316/1409 2248/2455/1409 2249/2452/1409 2174/2317/1409 +f 2174/2317/1410 2249/2452/1410 2250/2449/1410 2173/2318/1410 +f 2173/2318/1411 2250/2449/1411 2251/2446/1411 2172/2319/1411 +f 2172/2319/1412 2251/2446/1412 2252/2443/1412 2171/2320/1412 +f 2171/2320/1413 2252/2443/1413 2253/2440/1413 2170/2321/1413 +f 2170/2321/1414 2253/2440/1414 2254/2437/1414 2169/2322/1414 +f 2169/2322/1415 2254/2437/1415 2255/2434/1415 2168/2323/1415 +f 2168/2323/1416 2255/2434/1416 2256/2431/1416 2167/2324/1416 +f 2167/2324/1417 2256/2431/1417 2257/2428/1417 2166/2325/1417 +f 2166/2325/1418 2257/2428/1418 2258/2425/1418 2165/2326/1418 +f 2165/2326/1419 2258/2425/1419 2259/2422/1419 2164/2327/1419 +f 2164/2327/1420 2259/2422/1420 2260/2419/1420 2163/2328/1420 +f 2163/2328/1421 2260/2419/1421 2261/2416/1421 2162/2329/1421 +f 2162/2329/1422 2261/2416/1422 2262/2413/1422 2161/2330/1422 +f 2161/2330/1423 2262/2413/1423 2263/2410/1423 2160/2331/1423 +f 2160/2331/1424 2263/2410/1424 2264/2407/1424 2159/2332/1424 +f 2159/2332/1425 2264/2407/1425 2265/2404/1425 2158/2333/1425 +f 2158/2333/1426 2265/2404/1426 2266/2401/1426 2157/2334/1426 +f 2157/2334/1427 2266/2401/1427 2267/2398/1427 2156/2335/1427 +f 2156/2335/1428 2267/2398/1428 2268/2395/1428 2155/2336/1428 +f 2155/2336/1429 2268/2395/1429 2269/2392/1429 2154/2337/1429 +f 2154/2337/1430 2269/2392/1430 2270/2389/1430 2153/2338/1430 +f 2153/2338/1431 2270/2389/1431 2271/2386/1431 2152/2339/1431 +f 2152/2339/1432 2271/2386/1432 2272/2383/1432 2151/2340/1432 +f 2151/2340/1433 2272/2383/1433 2273/2382/1433 2150/2341/1433 +f 2150/2341/1434 2273/2382/1434 2274/2381/1434 2149/2342/1434 +f 2149/2342/1435 2274/2381/1435 2275/2375/1435 2148/2343/1435 +f 2148/2343/1436 2275/2375/1436 2244/2378/1436 2147/2312/1436 +f 2276/2470/954 2277/2471/954 2279/2472/954 2278/2473/954 +f 2278/2473/955 2279/2472/955 2281/2474/955 2280/2475/955 +f 2280/2475/956 2281/2474/956 2283/2476/956 2282/2477/956 +f 2282/2477/957 2283/2476/957 2285/2478/957 2284/2479/957 +f 2284/2479/958 2285/2478/958 2287/2480/958 2286/2481/958 +f 2286/2481/959 2287/2480/959 2289/2482/959 2288/2483/959 +f 2288/2483/960 2289/2482/960 2291/2484/960 2290/2485/960 +f 2290/2485/961 2291/2484/961 2293/2486/961 2292/2487/961 +f 2292/2487/962 2293/2486/962 2295/2488/962 2294/2489/962 +f 2294/2489/963 2295/2488/963 2297/2490/963 2296/2491/963 +f 2296/2491/964 2297/2490/964 2299/2492/964 2298/2493/964 +f 2298/2493/965 2299/2492/965 2301/2494/965 2300/2495/965 +f 2300/2495/966 2301/2494/966 2303/2496/966 2302/2497/966 +f 2302/2497/967 2303/2496/967 2305/2498/967 2304/2499/967 +f 2304/2499/968 2305/2498/968 2307/2500/968 2306/2501/968 +f 2306/2501/969 2307/2500/969 2309/2502/969 2308/2503/969 +f 2308/2503/970 2309/2502/970 2311/2504/970 2310/2505/970 +f 2310/2505/971 2311/2504/971 2313/2506/971 2312/2507/971 +f 2312/2507/972 2313/2506/972 2315/2508/972 2314/2509/972 +f 2314/2509/973 2315/2508/973 2317/2510/973 2316/2511/973 +f 2316/2511/974 2317/2510/974 2319/2512/974 2318/2513/974 +f 2318/2513/975 2319/2512/975 2321/2514/975 2320/2515/975 +f 2320/2515/976 2321/2514/976 2323/2516/976 2322/2517/976 +f 2322/2517/977 2323/2516/977 2325/2518/977 2324/2519/977 +f 2324/2519/978 2325/2518/978 2327/2520/978 2326/2521/978 +f 2326/2521/979 2327/2520/979 2329/2522/979 2328/2523/979 +f 2328/2523/980 2329/2522/980 2331/2524/980 2330/2525/980 +f 2330/2525/981 2331/2524/981 2333/2526/981 2332/2527/981 +f 2332/2527/982 2333/2526/982 2335/2528/982 2334/2529/982 +f 2334/2529/983 2335/2528/983 2337/2530/983 2336/2531/983 +f 2297/2490/984 2295/2488/984 2349/2532/984 2350/2533/984 +f 2336/2531/985 2337/2530/985 2339/2534/985 2338/2535/985 +f 2338/2535/986 2339/2534/986 2277/2536/986 2276/2537/986 +f 2286/2481/566 2288/2483/566 2410/2538/566 2409/2539/566 +f 2354/2540/987 2353/2541/987 2372/2542/987 +f 2315/2508/1437 2313/2506/1437 2358/2543/1437 2359/2544/1437 +f 2333/2526/989 2331/2524/989 2367/2545/989 2368/2546/989 +f 2289/2482/990 2287/2480/990 2345/2547/990 2346/2548/990 +f 2307/2500/991 2305/2498/991 2354/2540/991 2355/2549/991 +f 2325/2518/992 2323/2516/992 2363/2550/992 2364/2551/992 +f 2281/2474/993 2279/2472/993 2340/2552/993 2342/2553/993 +f 2299/2492/994 2297/2490/994 2350/2533/994 2351/2554/994 +f 2317/2510/995 2315/2508/995 2359/2544/995 2360/2555/995 +f 2335/2528/996 2333/2526/996 2368/2546/996 2369/2556/996 +f 2291/2484/997 2289/2482/997 2346/2548/997 2347/2557/997 +f 2309/2502/998 2307/2500/998 2355/2549/998 2356/2558/998 +f 2327/2520/999 2325/2518/999 2364/2551/999 2365/2559/999 +f 2283/2476/1438 2281/2474/1438 2342/2553/1438 2343/2560/1438 +f 2301/2494/1001 2299/2492/1001 2351/2554/1001 2352/2561/1001 +f 2319/2512/1002 2317/2510/1002 2360/2555/1002 2361/2562/1002 +f 2337/2530/1003 2335/2528/1003 2369/2556/1003 2370/2563/1003 +f 2293/2486/1004 2291/2484/1004 2347/2557/1004 2348/2564/1004 +f 2311/2504/1005 2309/2502/1005 2356/2558/1005 2357/2565/1005 +f 2329/2522/1006 2327/2520/1006 2365/2559/1006 2366/2566/1006 +f 2285/2478/1007 2283/2476/1007 2343/2560/1007 2344/2567/1007 +f 2303/2496/1008 2301/2494/1008 2352/2561/1008 2353/2541/1008 +f 2321/2514/1009 2319/2512/1009 2361/2562/1009 2362/2568/1009 +f 2339/2534/1010 2337/2530/1010 2370/2563/1010 2371/2569/1010 +f 2295/2488/1011 2293/2486/1011 2348/2564/1011 2349/2532/1011 +f 2313/2506/1012 2311/2504/1012 2357/2565/1012 2358/2543/1012 +f 2331/2524/1013 2329/2522/1013 2366/2566/1013 2367/2545/1013 +f 2287/2480/1014 2285/2478/1014 2344/2567/1014 2345/2547/1014 +f 2305/2498/1015 2303/2496/1015 2353/2541/1015 2354/2540/1015 +f 2323/2516/1016 2321/2514/1016 2362/2568/1016 2363/2550/1016 +f 2279/2472/1017 2277/2471/1017 2341/2570/1017 2340/2552/1017 +f 2277/2536/1018 2339/2534/1018 2371/2569/1018 2341/2571/1018 +f 2526/2572/1439 2528/2573/1439 2373/2574/1439 2374/2575/1439 +f 2340/2552/1020 2341/2570/1020 2372/2576/1020 +f 2368/2546/1021 2367/2545/1021 2372/2577/1021 +f 2355/2549/1022 2354/2540/1022 2372/2578/1022 +f 2342/2553/1023 2340/2552/1023 2372/2579/1023 +f 2369/2556/1024 2368/2546/1024 2372/2580/1024 +f 2356/2558/1025 2355/2549/1025 2372/2581/1025 +f 2343/2560/1026 2342/2553/1026 2372/2582/1026 +f 2370/2563/1027 2369/2556/1027 2372/2583/1027 +f 2357/2565/1028 2356/2558/1028 2372/2584/1028 +f 2344/2567/1029 2343/2560/1029 2372/2585/1029 +f 2371/2569/1030 2370/2563/1030 2372/2586/1030 +f 2358/2543/1031 2357/2565/1031 2372/2587/1031 +f 2345/2547/1032 2344/2567/1032 2372/2588/1032 +f 2341/2571/1033 2371/2569/1033 2372/2589/1033 +f 2359/2544/1034 2358/2543/1034 2372/2590/1034 +f 2346/2548/1035 2345/2547/1035 2372/2591/1035 +f 2360/2555/1036 2359/2544/1036 2372/2592/1036 +f 2347/2557/1037 2346/2548/1037 2372/2593/1037 +f 2361/2562/1038 2360/2555/1038 2372/2594/1038 +f 2348/2564/1039 2347/2557/1039 2372/2595/1039 +f 2362/2568/1040 2361/2562/1040 2372/2596/1040 +f 2349/2532/1041 2348/2564/1041 2372/2597/1041 +f 2363/2550/1042 2362/2568/1042 2372/2598/1042 +f 2350/2533/1043 2349/2532/1043 2372/2599/1043 +f 2364/2551/1044 2363/2550/1044 2372/2600/1044 +f 2351/2554/1045 2350/2533/1045 2372/2601/1045 +f 2365/2559/1046 2364/2551/1046 2372/2602/1046 +f 2352/2561/1047 2351/2554/1047 2372/2603/1047 +f 2366/2566/1048 2365/2559/1048 2372/2604/1048 +f 2353/2541/1049 2352/2561/1049 2372/2605/1049 +f 2367/2545/1050 2366/2566/1050 2372/2606/1050 +f 2468/2607/1440 2471/2608/1440 2435/2609/1440 2404/2610/1440 +f 2304/2499/566 2306/2501/566 2419/2611/566 2418/2612/566 +f 2322/2517/566 2324/2519/566 2428/2613/566 2427/2614/566 +f 2278/2473/566 2280/2475/566 2406/2615/566 2405/2616/566 +f 2296/2491/566 2298/2493/566 2415/2617/566 2414/2618/566 +f 2314/2509/566 2316/2511/566 2424/2619/566 2423/2620/566 +f 2332/2527/566 2334/2529/566 2433/2621/566 2432/2622/566 +f 2288/2483/566 2290/2485/566 2411/2623/566 2410/2538/566 +f 2306/2501/566 2308/2503/566 2420/2624/566 2419/2611/566 +f 2324/2519/566 2326/2521/566 2429/2625/566 2428/2613/566 +f 2280/2475/566 2282/2477/566 2407/2626/566 2406/2615/566 +f 2298/2493/566 2300/2495/566 2416/2627/566 2415/2617/566 +f 2316/2511/566 2318/2513/566 2425/2628/566 2424/2619/566 +f 2334/2529/566 2336/2531/566 2434/2629/566 2433/2621/566 +f 2290/2485/566 2292/2487/566 2412/2630/566 2411/2623/566 +f 2308/2503/566 2310/2505/566 2421/2631/566 2420/2624/566 +f 2326/2521/566 2328/2523/566 2430/2632/566 2429/2625/566 +f 2282/2477/566 2284/2479/566 2408/2633/566 2407/2626/566 +f 2300/2495/566 2302/2497/566 2417/2634/566 2416/2627/566 +f 2318/2513/566 2320/2515/566 2426/2635/566 2425/2628/566 +f 2336/2531/566 2338/2535/566 2435/2609/566 2434/2629/566 +f 2292/2487/566 2294/2489/566 2413/2636/566 2412/2630/566 +f 2310/2505/566 2312/2507/566 2422/2637/566 2421/2631/566 +f 2328/2523/566 2330/2525/566 2431/2638/566 2430/2632/566 +f 2284/2479/566 2286/2481/566 2409/2539/566 2408/2633/566 +f 2302/2497/566 2304/2499/566 2418/2612/566 2417/2634/566 +f 2320/2515/566 2322/2517/566 2427/2614/566 2426/2635/566 +f 2276/2470/566 2278/2473/566 2405/2616/566 2404/2639/566 +f 2338/2535/566 2276/2537/566 2404/2610/566 2435/2609/566 +f 2294/2489/566 2296/2491/566 2414/2618/566 2413/2636/566 +f 2312/2507/566 2314/2509/566 2423/2620/566 2422/2637/566 +f 2330/2525/566 2332/2527/566 2432/2622/566 2431/2638/566 +f 2448/2640/1441 2449/2641/1441 2578/2642/1441 2577/2643/1441 +f 2471/2608/1442 2473/2644/1442 2434/2629/1442 2435/2609/1442 +f 2473/2644/1443 2475/2645/1443 2433/2621/1443 2434/2629/1443 +f 2475/2645/1444 2477/2646/1444 2432/2622/1444 2433/2621/1444 +f 2477/2646/1445 2479/2647/1445 2431/2638/1445 2432/2622/1445 +f 2479/2647/1446 2481/2648/1446 2430/2632/1446 2431/2638/1446 +f 2481/2648/1447 2483/2649/1447 2429/2625/1447 2430/2632/1447 +f 2483/2649/1448 2485/2650/1448 2428/2613/1448 2429/2625/1448 +f 2485/2650/1449 2487/2651/1449 2427/2614/1449 2428/2613/1449 +f 2487/2651/1450 2489/2652/1450 2426/2635/1450 2427/2614/1450 +f 2489/2652/1451 2491/2653/1451 2425/2628/1451 2426/2635/1451 +f 2491/2653/1452 2493/2654/1452 2424/2619/1452 2425/2628/1452 +f 2493/2654/1453 2495/2655/1453 2423/2620/1453 2424/2619/1453 +f 2495/2655/1454 2497/2656/1454 2422/2637/1454 2423/2620/1454 +f 2497/2656/1455 2499/2657/1455 2421/2631/1455 2422/2637/1455 +f 2499/2657/1456 2501/2658/1456 2420/2624/1456 2421/2631/1456 +f 2501/2658/1457 2503/2659/1457 2419/2611/1457 2420/2624/1457 +f 2503/2659/1458 2505/2660/1458 2418/2612/1458 2419/2611/1458 +f 2505/2660/1459 2507/2661/1459 2417/2634/1459 2418/2612/1459 +f 2507/2661/1460 2509/2662/1460 2416/2627/1460 2417/2634/1460 +f 2509/2662/1461 2511/2663/1461 2415/2617/1461 2416/2627/1461 +f 2511/2663/1462 2513/2664/1462 2414/2618/1462 2415/2617/1462 +f 2513/2664/1463 2515/2665/1463 2413/2636/1463 2414/2618/1463 +f 2515/2665/1464 2517/2666/1464 2412/2630/1464 2413/2636/1464 +f 2517/2666/1465 2519/2667/1465 2411/2623/1465 2412/2630/1465 +f 2519/2667/1466 2521/2668/1466 2410/2538/1466 2411/2623/1466 +f 2521/2668/1467 2523/2669/1467 2409/2539/1467 2410/2538/1467 +f 2523/2669/1468 2525/2670/1468 2408/2633/1468 2409/2539/1468 +f 2525/2670/1469 2527/2671/1469 2407/2626/1469 2408/2633/1469 +f 2527/2671/1470 2529/2672/1470 2406/2615/1470 2407/2626/1470 +f 2529/2672/1471 2531/2673/1471 2405/2616/1471 2406/2615/1471 +f 2531/2673/1472 2468/2674/1472 2404/2639/1472 2405/2616/1472 +f 2564/2675/1473 2533/2676/1473 2469/2677/1473 2530/2678/1473 +f 2532/2679/1474 2403/2680/1474 2468/2674/1474 2531/2673/1474 +f 2563/2681/1475 2564/2675/1475 2530/2678/1475 2528/2573/1475 +f 2373/2574/1476 2532/2679/1476 2531/2673/1476 2529/2672/1476 +f 2562/2682/1477 2563/2681/1477 2528/2573/1477 2526/2572/1477 +f 2374/2575/1478 2373/2574/1478 2529/2672/1478 2527/2671/1478 +f 2561/2683/1479 2562/2682/1479 2526/2572/1479 2524/2684/1479 +f 2375/2685/1480 2374/2575/1480 2527/2671/1480 2525/2670/1480 +f 2560/2686/1481 2561/2683/1481 2524/2684/1481 2522/2687/1481 +f 2376/2688/1482 2375/2685/1482 2525/2670/1482 2523/2669/1482 +f 2559/2689/1483 2560/2686/1483 2522/2687/1483 2520/2690/1483 +f 2377/2691/1484 2376/2688/1484 2523/2669/1484 2521/2668/1484 +f 2558/2692/1485 2559/2689/1485 2520/2690/1485 2518/2693/1485 +f 2378/2694/1486 2377/2691/1486 2521/2668/1486 2519/2667/1486 +f 2557/2695/1487 2558/2692/1487 2518/2693/1487 2516/2696/1487 +f 2379/2697/1488 2378/2694/1488 2519/2667/1488 2517/2666/1488 +f 2556/2698/1489 2557/2695/1489 2516/2696/1489 2514/2699/1489 +f 2380/2700/1490 2379/2697/1490 2517/2666/1490 2515/2665/1490 +f 2555/2701/1491 2556/2698/1491 2514/2699/1491 2512/2702/1491 +f 2381/2703/1492 2380/2700/1492 2515/2665/1492 2513/2664/1492 +f 2554/2704/1493 2555/2701/1493 2512/2702/1493 2510/2705/1493 +f 2382/2706/1494 2381/2703/1494 2513/2664/1494 2511/2663/1494 +f 2553/2707/1495 2554/2704/1495 2510/2705/1495 2508/2708/1495 +f 2383/2709/1496 2382/2706/1496 2511/2663/1496 2509/2662/1496 +f 2552/2710/1497 2553/2707/1497 2508/2708/1497 2506/2711/1497 +f 2384/2712/1498 2383/2709/1498 2509/2662/1498 2507/2661/1498 +f 2551/2713/1499 2552/2710/1499 2506/2711/1499 2504/2714/1499 +f 2385/2715/1500 2384/2712/1500 2507/2661/1500 2505/2660/1500 +f 2550/2716/1501 2551/2713/1501 2504/2714/1501 2502/2717/1501 +f 2386/2718/1502 2385/2715/1502 2505/2660/1502 2503/2659/1502 +f 2549/2719/1503 2550/2716/1503 2502/2717/1503 2500/2720/1503 +f 2387/2721/1504 2386/2718/1504 2503/2659/1504 2501/2658/1504 +f 2548/2722/1505 2549/2719/1505 2500/2720/1505 2498/2723/1505 +f 2388/2724/1506 2387/2721/1506 2501/2658/1506 2499/2657/1506 +f 2547/2725/1507 2548/2722/1507 2498/2723/1507 2496/2726/1507 +f 2389/2727/1508 2388/2724/1508 2499/2657/1508 2497/2656/1508 +f 2546/2728/1509 2547/2725/1509 2496/2726/1509 2494/2729/1509 +f 2390/2730/1510 2389/2727/1510 2497/2656/1510 2495/2655/1510 +f 2545/2731/1511 2546/2728/1511 2494/2729/1511 2492/2732/1511 +f 2391/2733/1512 2390/2730/1512 2495/2655/1512 2493/2654/1512 +f 2544/2734/1513 2545/2731/1513 2492/2732/1513 2490/2735/1513 +f 2392/2736/1514 2391/2733/1514 2493/2654/1514 2491/2653/1514 +f 2543/2737/1515 2544/2734/1515 2490/2735/1515 2488/2738/1515 +f 2393/2739/1516 2392/2736/1516 2491/2653/1516 2489/2652/1516 +f 2542/2740/1517 2543/2737/1517 2488/2738/1517 2486/2741/1517 +f 2394/2742/1518 2393/2739/1518 2489/2652/1518 2487/2651/1518 +f 2541/2743/1519 2542/2740/1519 2486/2741/1519 2484/2744/1519 +f 2395/2745/1520 2394/2742/1520 2487/2651/1520 2485/2650/1520 +f 2540/2746/1521 2541/2743/1521 2484/2744/1521 2482/2747/1521 +f 2396/2748/1522 2395/2745/1522 2485/2650/1522 2483/2649/1522 +f 2539/2749/1523 2540/2746/1523 2482/2747/1523 2480/2750/1523 +f 2397/2751/1524 2396/2748/1524 2483/2649/1524 2481/2648/1524 +f 2538/2752/1525 2539/2749/1525 2480/2750/1525 2478/2753/1525 +f 2398/2754/1526 2397/2751/1526 2481/2648/1526 2479/2647/1526 +f 2537/2755/1527 2538/2752/1527 2478/2753/1527 2476/2756/1527 +f 2399/2757/1528 2398/2754/1528 2479/2647/1528 2477/2646/1528 +f 2536/2758/1529 2537/2755/1529 2476/2756/1529 2474/2759/1529 +f 2400/2760/1530 2399/2757/1530 2477/2646/1530 2475/2645/1530 +f 2535/2761/1531 2536/2758/1531 2474/2759/1531 2472/2762/1531 +f 2401/2763/1532 2400/2760/1532 2475/2645/1532 2473/2644/1532 +f 2534/2764/1533 2535/2761/1533 2472/2762/1533 2470/2765/1533 +f 2402/2766/1534 2401/2763/1534 2473/2644/1534 2471/2608/1534 +f 2533/2767/1535 2534/2764/1535 2470/2765/1535 2469/2768/1535 +f 2403/2769/1536 2402/2766/1536 2471/2608/1536 2468/2607/1536 +f 2524/2684/1537 2526/2572/1537 2374/2575/1537 2375/2685/1537 +f 2522/2687/1538 2524/2684/1538 2375/2685/1538 2376/2688/1538 +f 2520/2690/1539 2522/2687/1539 2376/2688/1539 2377/2691/1539 +f 2518/2693/1540 2520/2690/1540 2377/2691/1540 2378/2694/1540 +f 2516/2696/1541 2518/2693/1541 2378/2694/1541 2379/2697/1541 +f 2514/2699/1542 2516/2696/1542 2379/2697/1542 2380/2700/1542 +f 2512/2702/1543 2514/2699/1543 2380/2700/1543 2381/2703/1543 +f 2510/2705/1544 2512/2702/1544 2381/2703/1544 2382/2706/1544 +f 2508/2708/1545 2510/2705/1545 2382/2706/1545 2383/2709/1545 +f 2506/2711/1546 2508/2708/1546 2383/2709/1546 2384/2712/1546 +f 2504/2714/1547 2506/2711/1547 2384/2712/1547 2385/2715/1547 +f 2502/2717/1548 2504/2714/1548 2385/2715/1548 2386/2718/1548 +f 2500/2720/1549 2502/2717/1549 2386/2718/1549 2387/2721/1549 +f 2498/2723/1550 2500/2720/1550 2387/2721/1550 2388/2724/1550 +f 2496/2726/1551 2498/2723/1551 2388/2724/1551 2389/2727/1551 +f 2494/2729/1552 2496/2726/1552 2389/2727/1552 2390/2730/1552 +f 2492/2732/1553 2494/2729/1553 2390/2730/1553 2391/2733/1553 +f 2490/2735/1554 2492/2732/1554 2391/2733/1554 2392/2736/1554 +f 2488/2738/1555 2490/2735/1555 2392/2736/1555 2393/2739/1555 +f 2486/2741/1556 2488/2738/1556 2393/2739/1556 2394/2742/1556 +f 2484/2744/1557 2486/2741/1557 2394/2742/1557 2395/2745/1557 +f 2482/2747/1558 2484/2744/1558 2395/2745/1558 2396/2748/1558 +f 2480/2750/1559 2482/2747/1559 2396/2748/1559 2397/2751/1559 +f 2478/2753/1560 2480/2750/1560 2397/2751/1560 2398/2754/1560 +f 2476/2756/1561 2478/2753/1561 2398/2754/1561 2399/2757/1561 +f 2474/2759/1562 2476/2756/1562 2399/2757/1562 2400/2760/1562 +f 2472/2762/1563 2474/2759/1563 2400/2760/1563 2401/2763/1563 +f 2470/2765/1564 2472/2762/1564 2401/2763/1564 2402/2766/1564 +f 2469/2768/1565 2470/2765/1565 2402/2766/1565 2403/2769/1565 +f 2528/2573/1566 2530/2678/1566 2532/2679/1566 2373/2574/1566 +f 2530/2678/1567 2469/2677/1567 2403/2680/1567 2532/2679/1567 +f 2436/2770/1568 2467/2771/1568 2534/2764/1568 2533/2767/1568 +f 2467/2771/1569 2466/2772/1569 2535/2761/1569 2534/2764/1569 +f 2466/2772/1570 2465/2773/1570 2536/2758/1570 2535/2761/1570 +f 2465/2773/1571 2464/2774/1571 2537/2755/1571 2536/2758/1571 +f 2464/2774/1572 2463/2775/1572 2538/2752/1572 2537/2755/1572 +f 2463/2775/1573 2462/2776/1573 2539/2749/1573 2538/2752/1573 +f 2462/2776/1574 2461/2777/1574 2540/2746/1574 2539/2749/1574 +f 2461/2777/1575 2460/2778/1575 2541/2743/1575 2540/2746/1575 +f 2460/2778/1576 2459/2779/1576 2542/2740/1576 2541/2743/1576 +f 2459/2779/1577 2458/2780/1577 2543/2737/1577 2542/2740/1577 +f 2458/2780/1578 2457/2781/1578 2544/2734/1578 2543/2737/1578 +f 2457/2781/1579 2456/2782/1579 2545/2731/1579 2544/2734/1579 +f 2456/2782/1580 2455/2783/1580 2546/2728/1580 2545/2731/1580 +f 2455/2783/1581 2454/2784/1581 2547/2725/1581 2546/2728/1581 +f 2454/2784/1582 2453/2785/1582 2548/2722/1582 2547/2725/1582 +f 2453/2785/1583 2452/2786/1583 2549/2719/1583 2548/2722/1583 +f 2452/2786/1584 2451/2787/1584 2550/2716/1584 2549/2719/1584 +f 2451/2787/1585 2450/2788/1585 2551/2713/1585 2550/2716/1585 +f 2450/2788/1586 2449/2641/1586 2552/2710/1586 2551/2713/1586 +f 2449/2641/1587 2448/2640/1587 2553/2707/1587 2552/2710/1587 +f 2448/2640/1588 2447/2789/1588 2554/2704/1588 2553/2707/1588 +f 2447/2789/1589 2446/2790/1589 2555/2701/1589 2554/2704/1589 +f 2446/2790/1590 2445/2791/1590 2556/2698/1590 2555/2701/1590 +f 2445/2791/1591 2444/2792/1591 2557/2695/1591 2556/2698/1591 +f 2444/2792/1592 2443/2793/1592 2558/2692/1592 2557/2695/1592 +f 2443/2793/1593 2442/2794/1593 2559/2689/1593 2558/2692/1593 +f 2442/2794/1594 2441/2795/1594 2560/2686/1594 2559/2689/1594 +f 2441/2795/1595 2440/2796/1595 2561/2683/1595 2560/2686/1595 +f 2440/2796/1596 2439/2797/1596 2562/2682/1596 2561/2683/1596 +f 2439/2797/1597 2438/2798/1597 2563/2681/1597 2562/2682/1597 +f 2438/2798/1598 2437/2799/1598 2564/2675/1598 2563/2681/1598 +f 2437/2799/1599 2436/2770/1599 2533/2676/1599 2564/2675/1599 +f 2565/2800/566 2566/2801/566 2567/2802/566 2568/2803/566 2569/2804/566 2570/2805/566 2571/2806/566 2572/2807/566 2573/2808/566 2574/2809/566 2575/2810/566 2576/2811/566 2577/2643/566 2578/2642/566 2579/2812/566 2580/2813/566 2581/2814/566 2582/2815/566 2583/2816/566 2584/2817/566 2585/2818/566 2586/2819/566 2587/2820/566 2588/2821/566 2589/2822/566 2590/2823/566 2591/2824/566 2592/2825/566 2593/2826/566 2594/2827/566 2595/2828/566 2596/2829/566 +f 2462/2776/1600 2463/2775/1600 2592/2825/1600 2591/2824/1600 +f 2449/2641/1601 2450/2788/1601 2579/2812/1601 2578/2642/1601 +f 2436/2770/1602 2437/2799/1602 2566/2801/1602 2565/2800/1602 +f 2463/2775/1603 2464/2774/1603 2593/2826/1603 2592/2825/1603 +f 2450/2788/1604 2451/2787/1604 2580/2813/1604 2579/2812/1604 +f 2437/2799/1605 2438/2798/1605 2567/2802/1605 2566/2801/1605 +f 2464/2774/1606 2465/2773/1606 2594/2827/1606 2593/2826/1606 +f 2451/2787/1607 2452/2786/1607 2581/2814/1607 2580/2813/1607 +f 2438/2798/1608 2439/2797/1608 2568/2803/1608 2567/2802/1608 +f 2465/2773/1609 2466/2772/1609 2595/2828/1609 2594/2827/1609 +f 2452/2786/1610 2453/2785/1610 2582/2815/1610 2581/2814/1610 +f 2439/2797/1611 2440/2796/1611 2569/2804/1611 2568/2803/1611 +f 2466/2772/1612 2467/2771/1612 2596/2829/1612 2595/2828/1612 +f 2453/2785/1613 2454/2784/1613 2583/2816/1613 2582/2815/1613 +f 2440/2796/1614 2441/2795/1614 2570/2805/1614 2569/2804/1614 +f 2467/2771/1615 2436/2770/1615 2565/2800/1615 2596/2829/1615 +f 2454/2784/1616 2455/2783/1616 2584/2817/1616 2583/2816/1616 +f 2441/2795/1617 2442/2794/1617 2571/2806/1617 2570/2805/1617 +f 2455/2783/1618 2456/2782/1618 2585/2818/1618 2584/2817/1618 +f 2442/2794/1619 2443/2793/1619 2572/2807/1619 2571/2806/1619 +f 2456/2782/1620 2457/2781/1620 2586/2819/1620 2585/2818/1620 +f 2443/2793/1621 2444/2792/1621 2573/2808/1621 2572/2807/1621 +f 2457/2781/1622 2458/2780/1622 2587/2820/1622 2586/2819/1622 +f 2444/2792/1623 2445/2791/1623 2574/2809/1623 2573/2808/1623 +f 2458/2780/1624 2459/2779/1624 2588/2821/1624 2587/2820/1624 +f 2445/2791/1625 2446/2790/1625 2575/2810/1625 2574/2809/1625 +f 2459/2779/1626 2460/2778/1626 2589/2822/1626 2588/2821/1626 +f 2446/2790/1627 2447/2789/1627 2576/2811/1627 2575/2810/1627 +f 2460/2778/1628 2461/2777/1628 2590/2823/1628 2589/2822/1628 +f 2447/2789/1629 2448/2640/1629 2577/2643/1629 2576/2811/1629 +f 2461/2777/1630 2462/2776/1630 2591/2824/1630 2590/2823/1630 +f 2597/2830/1210 2599/2831/1210 2600/2832/1210 2598/2833/1210 +f 2599/2831/1211 2601/2834/1211 2602/2835/1211 2600/2832/1211 +f 2601/2834/1212 2603/2836/1212 2604/2837/1212 2602/2835/1212 +f 2603/2836/1213 2605/2838/1213 2606/2839/1213 2604/2837/1213 +f 2605/2838/1214 2607/2840/1214 2608/2841/1214 2606/2839/1214 +f 2607/2840/1215 2609/2842/1215 2610/2843/1215 2608/2841/1215 +f 2609/2842/1216 2611/2844/1216 2612/2845/1216 2610/2843/1216 +f 2611/2844/1217 2613/2846/1217 2614/2847/1217 2612/2845/1217 +f 2613/2846/1218 2615/2848/1218 2616/2849/1218 2614/2847/1218 +f 2615/2848/1219 2617/2850/1219 2618/2851/1219 2616/2849/1219 +f 2617/2850/1220 2619/2852/1220 2620/2853/1220 2618/2851/1220 +f 2619/2852/1221 2621/2854/1221 2622/2855/1221 2620/2853/1221 +f 2621/2854/1222 2623/2856/1222 2624/2857/1222 2622/2855/1222 +f 2623/2856/1223 2625/2858/1223 2626/2859/1223 2624/2857/1223 +f 2625/2858/1224 2627/2860/1224 2628/2861/1224 2626/2859/1224 +f 2627/2860/1225 2629/2862/1225 2630/2863/1225 2628/2861/1225 +f 2629/2862/1226 2631/2864/1226 2632/2865/1226 2630/2863/1226 +f 2631/2864/1227 2633/2866/1227 2634/2867/1227 2632/2865/1227 +f 2633/2866/1228 2635/2868/1228 2636/2869/1228 2634/2867/1228 +f 2635/2868/1229 2637/2870/1229 2638/2871/1229 2636/2869/1229 +f 2637/2870/1230 2639/2872/1230 2640/2873/1230 2638/2871/1230 +f 2639/2872/1231 2641/2874/1231 2642/2875/1231 2640/2873/1231 +f 2641/2874/1232 2643/2876/1232 2644/2877/1232 2642/2875/1232 +f 2643/2876/1233 2645/2878/1233 2646/2879/1233 2644/2877/1233 +f 2645/2878/1234 2647/2880/1234 2648/2881/1234 2646/2879/1234 +f 2647/2880/1235 2649/2882/1235 2650/2883/1235 2648/2881/1235 +f 2649/2882/1236 2651/2884/1236 2652/2885/1236 2650/2883/1236 +f 2651/2884/1237 2653/2886/1237 2654/2887/1237 2652/2885/1237 +f 2653/2886/1238 2655/2888/1238 2656/2889/1238 2654/2887/1238 +f 2655/2888/1239 2657/2890/1239 2658/2891/1239 2656/2889/1239 +f 2618/2851/1240 2671/2892/1240 2670/2893/1240 2616/2849/1240 +f 2657/2890/1241 2659/2894/1241 2660/2895/1241 2658/2891/1241 +f 2659/2894/1242 2597/2896/1242 2598/2897/1242 2660/2895/1242 +f 2607/2840/566 2730/2898/566 2731/2899/566 2609/2842/566 +f 2675/2900/1026 2693/2901/1026 2674/2902/1026 +f 2636/2869/1243 2680/2903/1243 2679/2904/1243 2634/2867/1243 +f 2654/2887/1244 2689/2905/1244 2688/2906/1244 2652/2885/1244 +f 2610/2843/1245 2667/2907/1245 2666/2908/1245 2608/2841/1245 +f 2628/2861/1246 2676/2909/1246 2675/2900/1246 2626/2859/1246 +f 2646/2879/1247 2685/2910/1247 2684/2911/1247 2644/2877/1247 +f 2602/2835/1248 2663/2912/1248 2661/2913/1248 2600/2832/1248 +f 2620/2853/1249 2672/2914/1249 2671/2892/1249 2618/2851/1249 +f 2638/2871/1250 2681/2915/1250 2680/2903/1250 2636/2869/1250 +f 2656/2889/1251 2690/2916/1251 2689/2905/1251 2654/2887/1251 +f 2612/2845/1252 2668/2917/1252 2667/2907/1252 2610/2843/1252 +f 2630/2863/1253 2677/2918/1253 2676/2909/1253 2628/2861/1253 +f 2648/2881/1254 2686/2919/1254 2685/2910/1254 2646/2879/1254 +f 2604/2837/1631 2664/2920/1631 2663/2912/1631 2602/2835/1631 +f 2622/2855/1256 2673/2921/1256 2672/2914/1256 2620/2853/1256 +f 2640/2873/1632 2682/2922/1632 2681/2915/1632 2638/2871/1632 +f 2658/2891/1633 2691/2923/1633 2690/2916/1633 2656/2889/1633 +f 2614/2847/1259 2669/2924/1259 2668/2917/1259 2612/2845/1259 +f 2632/2865/1260 2678/2925/1260 2677/2918/1260 2630/2863/1260 +f 2650/2883/1261 2687/2926/1261 2686/2919/1261 2648/2881/1261 +f 2606/2839/1262 2665/2927/1262 2664/2920/1262 2604/2837/1262 +f 2624/2857/1263 2674/2902/1263 2673/2921/1263 2622/2855/1263 +f 2642/2875/1264 2683/2928/1264 2682/2922/1264 2640/2873/1264 +f 2660/2895/1265 2692/2929/1265 2691/2923/1265 2658/2891/1265 +f 2616/2849/1266 2670/2893/1266 2669/2924/1266 2614/2847/1266 +f 2634/2867/1267 2679/2904/1267 2678/2925/1267 2632/2865/1267 +f 2652/2885/1268 2688/2906/1268 2687/2926/1268 2650/2883/1268 +f 2608/2841/1269 2666/2908/1269 2665/2927/1269 2606/2839/1269 +f 2626/2859/1270 2675/2900/1270 2674/2902/1270 2624/2857/1270 +f 2644/2877/1271 2684/2911/1271 2683/2928/1271 2642/2875/1271 +f 2600/2832/1272 2661/2913/1272 2662/2930/1272 2598/2833/1272 +f 2598/2897/1273 2662/2931/1273 2692/2929/1273 2660/2895/1273 +f 2847/2932/1634 2695/2933/1634 2694/2934/1634 2849/2935/1634 +f 2661/2913/1025 2693/2936/1025 2662/2930/1025 +f 2689/2905/1038 2693/2937/1038 2688/2906/1038 +f 2676/2909/1023 2693/2938/1023 2675/2900/1023 +f 2663/2912/1022 2693/2939/1022 2661/2913/1022 +f 2690/2916/1036 2693/2940/1036 2689/2905/1036 +f 2677/2918/1020 2693/2941/1020 2676/2909/1020 +f 2664/2920/987 2693/2942/987 2663/2912/987 +f 2691/2923/1034 2693/2943/1034 2690/2916/1034 +f 2678/2925/1033 2693/2944/1033 2677/2918/1033 +f 2665/2927/1049 2693/2945/1049 2664/2920/1049 +f 2692/2929/1031 2693/2946/1031 2691/2923/1031 +f 2679/2904/1030 2693/2947/1030 2678/2925/1030 +f 2666/2908/1047 2693/2948/1047 2665/2927/1047 +f 2662/2931/1028 2693/2949/1028 2692/2929/1028 +f 2680/2903/1027 2693/2950/1027 2679/2904/1027 +f 2667/2907/1045 2693/2951/1045 2666/2908/1045 +f 2681/2915/1024 2693/2952/1024 2680/2903/1024 +f 2668/2917/1043 2693/2953/1043 2667/2907/1043 +f 2682/2922/1021 2693/2954/1021 2681/2915/1021 +f 2669/2924/1041 2693/2955/1041 2668/2917/1041 +f 2683/2928/1050 2693/2956/1050 2682/2922/1050 +f 2670/2893/1039 2693/2957/1039 2669/2924/1039 +f 2684/2911/1048 2693/2958/1048 2683/2928/1048 +f 2671/2892/1037 2693/2959/1037 2670/2893/1037 +f 2685/2910/1046 2693/2960/1046 2684/2911/1046 +f 2672/2914/1035 2693/2961/1035 2671/2892/1035 +f 2686/2919/1044 2693/2962/1044 2685/2910/1044 +f 2673/2921/1032 2693/2963/1032 2672/2914/1032 +f 2687/2926/1042 2693/2964/1042 2686/2919/1042 +f 2674/2902/1029 2693/2965/1029 2673/2921/1029 +f 2688/2906/1040 2693/2966/1040 2687/2926/1040 +f 2789/2967/1635 2725/2968/1635 2756/2969/1635 2792/2970/1635 +f 2625/2858/566 2739/2971/566 2740/2972/566 2627/2860/566 +f 2643/2876/566 2748/2973/566 2749/2974/566 2645/2878/566 +f 2599/2831/566 2726/2975/566 2727/2976/566 2601/2834/566 +f 2617/2850/566 2735/2977/566 2736/2978/566 2619/2852/566 +f 2635/2868/566 2744/2979/566 2745/2980/566 2637/2870/566 +f 2653/2886/566 2753/2981/566 2754/2982/566 2655/2888/566 +f 2609/2842/566 2731/2899/566 2732/2983/566 2611/2844/566 +f 2627/2860/566 2740/2972/566 2741/2984/566 2629/2862/566 +f 2645/2878/566 2749/2974/566 2750/2985/566 2647/2880/566 +f 2601/2834/566 2727/2976/566 2728/2986/566 2603/2836/566 +f 2619/2852/566 2736/2978/566 2737/2987/566 2621/2854/566 +f 2637/2870/566 2745/2980/566 2746/2988/566 2639/2872/566 +f 2655/2888/566 2754/2982/566 2755/2989/566 2657/2890/566 +f 2611/2844/566 2732/2983/566 2733/2990/566 2613/2846/566 +f 2629/2862/566 2741/2984/566 2742/2991/566 2631/2864/566 +f 2647/2880/566 2750/2985/566 2751/2992/566 2649/2882/566 +f 2603/2836/566 2728/2986/566 2729/2993/566 2605/2838/566 +f 2621/2854/566 2737/2987/566 2738/2994/566 2623/2856/566 +f 2639/2872/566 2746/2988/566 2747/2995/566 2641/2874/566 +f 2657/2890/566 2755/2989/566 2756/2969/566 2659/2894/566 +f 2613/2846/566 2733/2990/566 2734/2996/566 2615/2848/566 +f 2631/2864/566 2742/2991/566 2743/2997/566 2633/2866/566 +f 2649/2882/566 2751/2992/566 2752/2998/566 2651/2884/566 +f 2605/2838/566 2729/2993/566 2730/2898/566 2607/2840/566 +f 2623/2856/566 2738/2994/566 2739/2971/566 2625/2858/566 +f 2641/2874/566 2747/2995/566 2748/2973/566 2643/2876/566 +f 2597/2830/566 2725/2999/566 2726/2975/566 2599/2831/566 +f 2659/2894/566 2756/2969/566 2725/2968/566 2597/2896/566 +f 2615/2848/566 2734/2996/566 2735/2977/566 2617/2850/566 +f 2633/2866/566 2743/2997/566 2744/2979/566 2635/2868/566 +f 2651/2884/566 2752/2998/566 2753/2981/566 2653/2886/566 +f 2769/3000/1636 2898/3001/1636 2899/3002/1636 2770/3003/1636 +f 2792/2970/1637 2756/2969/1637 2755/2989/1637 2794/3004/1637 +f 2794/3004/1638 2755/2989/1638 2754/2982/1638 2796/3005/1638 +f 2796/3005/1639 2754/2982/1639 2753/2981/1639 2798/3006/1639 +f 2798/3006/1640 2753/2981/1640 2752/2998/1640 2800/3007/1640 +f 2800/3007/1641 2752/2998/1641 2751/2992/1641 2802/3008/1641 +f 2802/3008/1642 2751/2992/1642 2750/2985/1642 2804/3009/1642 +f 2804/3009/1643 2750/2985/1643 2749/2974/1643 2806/3010/1643 +f 2806/3010/1644 2749/2974/1644 2748/2973/1644 2808/3011/1644 +f 2808/3011/1645 2748/2973/1645 2747/2995/1645 2810/3012/1645 +f 2810/3012/1646 2747/2995/1646 2746/2988/1646 2812/3013/1646 +f 2812/3013/1647 2746/2988/1647 2745/2980/1647 2814/3014/1647 +f 2814/3014/1648 2745/2980/1648 2744/2979/1648 2816/3015/1648 +f 2816/3015/1649 2744/2979/1649 2743/2997/1649 2818/3016/1649 +f 2818/3016/1650 2743/2997/1650 2742/2991/1650 2820/3017/1650 +f 2820/3017/1651 2742/2991/1651 2741/2984/1651 2822/3018/1651 +f 2822/3018/1652 2741/2984/1652 2740/2972/1652 2824/3019/1652 +f 2824/3019/1653 2740/2972/1653 2739/2971/1653 2826/3020/1653 +f 2826/3020/1654 2739/2971/1654 2738/2994/1654 2828/3021/1654 +f 2828/3021/1655 2738/2994/1655 2737/2987/1655 2830/3022/1655 +f 2830/3022/1656 2737/2987/1656 2736/2978/1656 2832/3023/1656 +f 2832/3023/1657 2736/2978/1657 2735/2977/1657 2834/3024/1657 +f 2834/3024/1658 2735/2977/1658 2734/2996/1658 2836/3025/1658 +f 2836/3025/1659 2734/2996/1659 2733/2990/1659 2838/3026/1659 +f 2838/3026/1660 2733/2990/1660 2732/2983/1660 2840/3027/1660 +f 2840/3027/1661 2732/2983/1661 2731/2899/1661 2842/3028/1661 +f 2842/3028/1662 2731/2899/1662 2730/2898/1662 2844/3029/1662 +f 2844/3029/1663 2730/2898/1663 2729/2993/1663 2846/3030/1663 +f 2846/3030/1664 2729/2993/1664 2728/2986/1664 2848/3031/1664 +f 2848/3031/1665 2728/2986/1665 2727/2976/1665 2850/3032/1665 +f 2850/3032/1666 2727/2976/1666 2726/2975/1666 2852/3033/1666 +f 2852/3033/1667 2726/2975/1667 2725/2999/1667 2789/3034/1667 +f 2885/3035/1668 2851/3036/1668 2790/3037/1668 2854/3038/1668 +f 2853/3039/1669 2852/3033/1669 2789/3034/1669 2724/3040/1669 +f 2884/3041/1670 2849/2935/1670 2851/3036/1670 2885/3035/1670 +f 2694/2934/1671 2850/3032/1671 2852/3033/1671 2853/3039/1671 +f 2883/3042/1672 2847/2932/1672 2849/2935/1672 2884/3041/1672 +f 2695/2933/1673 2848/3031/1673 2850/3032/1673 2694/2934/1673 +f 2882/3043/1674 2845/3044/1674 2847/2932/1674 2883/3042/1674 +f 2696/3045/1675 2846/3030/1675 2848/3031/1675 2695/2933/1675 +f 2881/3046/1676 2843/3047/1676 2845/3044/1676 2882/3043/1676 +f 2697/3048/1677 2844/3029/1677 2846/3030/1677 2696/3045/1677 +f 2880/3049/1678 2841/3050/1678 2843/3047/1678 2881/3046/1678 +f 2698/3051/1679 2842/3028/1679 2844/3029/1679 2697/3048/1679 +f 2879/3052/1680 2839/3053/1680 2841/3050/1680 2880/3049/1680 +f 2699/3054/1681 2840/3027/1681 2842/3028/1681 2698/3051/1681 +f 2878/3055/1682 2837/3056/1682 2839/3053/1682 2879/3052/1682 +f 2700/3057/1683 2838/3026/1683 2840/3027/1683 2699/3054/1683 +f 2877/3058/1684 2835/3059/1684 2837/3056/1684 2878/3055/1684 +f 2701/3060/1685 2836/3025/1685 2838/3026/1685 2700/3057/1685 +f 2876/3061/1686 2833/3062/1686 2835/3059/1686 2877/3058/1686 +f 2702/3063/1687 2834/3024/1687 2836/3025/1687 2701/3060/1687 +f 2875/3064/1688 2831/3065/1688 2833/3062/1688 2876/3061/1688 +f 2703/3066/1689 2832/3023/1689 2834/3024/1689 2702/3063/1689 +f 2874/3067/1690 2829/3068/1690 2831/3065/1690 2875/3064/1690 +f 2704/3069/1691 2830/3022/1691 2832/3023/1691 2703/3066/1691 +f 2873/3070/1692 2827/3071/1692 2829/3068/1692 2874/3067/1692 +f 2705/3072/1693 2828/3021/1693 2830/3022/1693 2704/3069/1693 +f 2872/3073/1694 2825/3074/1694 2827/3071/1694 2873/3070/1694 +f 2706/3075/1695 2826/3020/1695 2828/3021/1695 2705/3072/1695 +f 2871/3076/1696 2823/3077/1696 2825/3074/1696 2872/3073/1696 +f 2707/3078/1697 2824/3019/1697 2826/3020/1697 2706/3075/1697 +f 2870/3079/1698 2821/3080/1698 2823/3077/1698 2871/3076/1698 +f 2708/3081/1699 2822/3018/1699 2824/3019/1699 2707/3078/1699 +f 2869/3082/1700 2819/3083/1700 2821/3080/1700 2870/3079/1700 +f 2709/3084/1701 2820/3017/1701 2822/3018/1701 2708/3081/1701 +f 2868/3085/1702 2817/3086/1702 2819/3083/1702 2869/3082/1702 +f 2710/3087/1703 2818/3016/1703 2820/3017/1703 2709/3084/1703 +f 2867/3088/1704 2815/3089/1704 2817/3086/1704 2868/3085/1704 +f 2711/3090/1705 2816/3015/1705 2818/3016/1705 2710/3087/1705 +f 2866/3091/1706 2813/3092/1706 2815/3089/1706 2867/3088/1706 +f 2712/3093/1707 2814/3014/1707 2816/3015/1707 2711/3090/1707 +f 2865/3094/1708 2811/3095/1708 2813/3092/1708 2866/3091/1708 +f 2713/3096/1709 2812/3013/1709 2814/3014/1709 2712/3093/1709 +f 2864/3097/1710 2809/3098/1710 2811/3095/1710 2865/3094/1710 +f 2714/3099/1711 2810/3012/1711 2812/3013/1711 2713/3096/1711 +f 2863/3100/1712 2807/3101/1712 2809/3098/1712 2864/3097/1712 +f 2715/3102/1713 2808/3011/1713 2810/3012/1713 2714/3099/1713 +f 2862/3103/1714 2805/3104/1714 2807/3101/1714 2863/3100/1714 +f 2716/3105/1715 2806/3010/1715 2808/3011/1715 2715/3102/1715 +f 2861/3106/1716 2803/3107/1716 2805/3104/1716 2862/3103/1716 +f 2717/3108/1717 2804/3009/1717 2806/3010/1717 2716/3105/1717 +f 2860/3109/1718 2801/3110/1718 2803/3107/1718 2861/3106/1718 +f 2718/3111/1719 2802/3008/1719 2804/3009/1719 2717/3108/1719 +f 2859/3112/1720 2799/3113/1720 2801/3110/1720 2860/3109/1720 +f 2719/3114/1721 2800/3007/1721 2802/3008/1721 2718/3111/1721 +f 2858/3115/1722 2797/3116/1722 2799/3113/1722 2859/3112/1722 +f 2720/3117/1723 2798/3006/1723 2800/3007/1723 2719/3114/1723 +f 2857/3118/1724 2795/3119/1724 2797/3116/1724 2858/3115/1724 +f 2721/3120/1725 2796/3005/1725 2798/3006/1725 2720/3117/1725 +f 2856/3121/1726 2793/3122/1726 2795/3119/1726 2857/3118/1726 +f 2722/3123/1727 2794/3004/1727 2796/3005/1727 2721/3120/1727 +f 2855/3124/1728 2791/3125/1728 2793/3122/1728 2856/3121/1728 +f 2723/3126/1729 2792/2970/1729 2794/3004/1729 2722/3123/1729 +f 2854/3127/1730 2790/3128/1730 2791/3125/1730 2855/3124/1730 +f 2724/3129/1731 2789/2967/1731 2792/2970/1731 2723/3126/1731 +f 2845/3044/1732 2696/3045/1732 2695/2933/1732 2847/2932/1732 +f 2843/3047/1733 2697/3048/1733 2696/3045/1733 2845/3044/1733 +f 2841/3050/1734 2698/3051/1734 2697/3048/1734 2843/3047/1734 +f 2839/3053/1735 2699/3054/1735 2698/3051/1735 2841/3050/1735 +f 2837/3056/1736 2700/3057/1736 2699/3054/1736 2839/3053/1736 +f 2835/3059/1737 2701/3060/1737 2700/3057/1737 2837/3056/1737 +f 2833/3062/1738 2702/3063/1738 2701/3060/1738 2835/3059/1738 +f 2831/3065/1739 2703/3066/1739 2702/3063/1739 2833/3062/1739 +f 2829/3068/1740 2704/3069/1740 2703/3066/1740 2831/3065/1740 +f 2827/3071/1741 2705/3072/1741 2704/3069/1741 2829/3068/1741 +f 2825/3074/1742 2706/3075/1742 2705/3072/1742 2827/3071/1742 +f 2823/3077/1743 2707/3078/1743 2706/3075/1743 2825/3074/1743 +f 2821/3080/1744 2708/3081/1744 2707/3078/1744 2823/3077/1744 +f 2819/3083/1745 2709/3084/1745 2708/3081/1745 2821/3080/1745 +f 2817/3086/1746 2710/3087/1746 2709/3084/1746 2819/3083/1746 +f 2815/3089/1747 2711/3090/1747 2710/3087/1747 2817/3086/1747 +f 2813/3092/1748 2712/3093/1748 2711/3090/1748 2815/3089/1748 +f 2811/3095/1749 2713/3096/1749 2712/3093/1749 2813/3092/1749 +f 2809/3098/1750 2714/3099/1750 2713/3096/1750 2811/3095/1750 +f 2807/3101/1751 2715/3102/1751 2714/3099/1751 2809/3098/1751 +f 2805/3104/1752 2716/3105/1752 2715/3102/1752 2807/3101/1752 +f 2803/3107/1753 2717/3108/1753 2716/3105/1753 2805/3104/1753 +f 2801/3110/1754 2718/3111/1754 2717/3108/1754 2803/3107/1754 +f 2799/3113/1755 2719/3114/1755 2718/3111/1755 2801/3110/1755 +f 2797/3116/1756 2720/3117/1756 2719/3114/1756 2799/3113/1756 +f 2795/3119/1757 2721/3120/1757 2720/3117/1757 2797/3116/1757 +f 2793/3122/1758 2722/3123/1758 2721/3120/1758 2795/3119/1758 +f 2791/3125/1759 2723/3126/1759 2722/3123/1759 2793/3122/1759 +f 2790/3128/1760 2724/3129/1760 2723/3126/1760 2791/3125/1760 +f 2849/2935/1761 2694/2934/1761 2853/3039/1761 2851/3036/1761 +f 2851/3036/1762 2853/3039/1762 2724/3040/1762 2790/3037/1762 +f 2757/3130/1763 2854/3127/1763 2855/3124/1763 2788/3131/1763 +f 2788/3131/1764 2855/3124/1764 2856/3121/1764 2787/3132/1764 +f 2787/3132/1765 2856/3121/1765 2857/3118/1765 2786/3133/1765 +f 2786/3133/1766 2857/3118/1766 2858/3115/1766 2785/3134/1766 +f 2785/3134/1767 2858/3115/1767 2859/3112/1767 2784/3135/1767 +f 2784/3135/1768 2859/3112/1768 2860/3109/1768 2783/3136/1768 +f 2783/3136/1769 2860/3109/1769 2861/3106/1769 2782/3137/1769 +f 2782/3137/1770 2861/3106/1770 2862/3103/1770 2781/3138/1770 +f 2781/3138/1771 2862/3103/1771 2863/3100/1771 2780/3139/1771 +f 2780/3139/1772 2863/3100/1772 2864/3097/1772 2779/3140/1772 +f 2779/3140/1773 2864/3097/1773 2865/3094/1773 2778/3141/1773 +f 2778/3141/1774 2865/3094/1774 2866/3091/1774 2777/3142/1774 +f 2777/3142/1775 2866/3091/1775 2867/3088/1775 2776/3143/1775 +f 2776/3143/1776 2867/3088/1776 2868/3085/1776 2775/3144/1776 +f 2775/3144/1777 2868/3085/1777 2869/3082/1777 2774/3145/1777 +f 2774/3145/1778 2869/3082/1778 2870/3079/1778 2773/3146/1778 +f 2773/3146/1779 2870/3079/1779 2871/3076/1779 2772/3147/1779 +f 2772/3147/1780 2871/3076/1780 2872/3073/1780 2771/3148/1780 +f 2771/3148/1781 2872/3073/1781 2873/3070/1781 2770/3003/1781 +f 2770/3003/1782 2873/3070/1782 2874/3067/1782 2769/3000/1782 +f 2769/3000/1783 2874/3067/1783 2875/3064/1783 2768/3149/1783 +f 2768/3149/1784 2875/3064/1784 2876/3061/1784 2767/3150/1784 +f 2767/3150/1785 2876/3061/1785 2877/3058/1785 2766/3151/1785 +f 2766/3151/1786 2877/3058/1786 2878/3055/1786 2765/3152/1786 +f 2765/3152/1787 2878/3055/1787 2879/3052/1787 2764/3153/1787 +f 2764/3153/1788 2879/3052/1788 2880/3049/1788 2763/3154/1788 +f 2763/3154/1789 2880/3049/1789 2881/3046/1789 2762/3155/1789 +f 2762/3155/1790 2881/3046/1790 2882/3043/1790 2761/3156/1790 +f 2761/3156/1791 2882/3043/1791 2883/3042/1791 2760/3157/1791 +f 2760/3157/1792 2883/3042/1792 2884/3041/1792 2759/3158/1792 +f 2759/3158/1793 2884/3041/1793 2885/3035/1793 2758/3159/1793 +f 2758/3159/1794 2885/3035/1794 2854/3038/1794 2757/3130/1794 +f 2886/3160/1278 2917/3161/1278 2916/3162/1278 2915/3163/1278 2914/3164/1278 2913/3165/1278 2912/3166/1278 2911/3167/1278 2910/3168/1278 2909/3169/1278 2908/3170/1278 2907/3171/1278 2906/3172/1278 2905/3173/1278 2904/3174/1278 2903/3175/1278 2902/3176/1278 2901/3177/1278 2900/3178/1278 2899/3002/1278 2898/3001/1278 2897/3179/1278 2896/3180/1278 2895/3181/1278 2894/3182/1278 2893/3183/1278 2892/3184/1278 2891/3185/1278 2890/3186/1278 2889/3187/1278 2888/3188/1278 2887/3189/1278 +f 2783/3136/1795 2912/3166/1795 2913/3165/1795 2784/3135/1795 +f 2770/3003/1796 2899/3002/1796 2900/3178/1796 2771/3148/1796 +f 2757/3130/1797 2886/3160/1797 2887/3189/1797 2758/3159/1797 +f 2784/3135/1798 2913/3165/1798 2914/3164/1798 2785/3134/1798 +f 2771/3148/1799 2900/3178/1799 2901/3177/1799 2772/3147/1799 +f 2758/3159/1800 2887/3189/1800 2888/3188/1800 2759/3158/1800 +f 2785/3134/1801 2914/3164/1801 2915/3163/1801 2786/3133/1801 +f 2772/3147/1802 2901/3177/1802 2902/3176/1802 2773/3146/1802 +f 2759/3158/1803 2888/3188/1803 2889/3187/1803 2760/3157/1803 +f 2786/3133/1804 2915/3163/1804 2916/3162/1804 2787/3132/1804 +f 2773/3146/1805 2902/3176/1805 2903/3175/1805 2774/3145/1805 +f 2760/3157/1806 2889/3187/1806 2890/3186/1806 2761/3156/1806 +f 2787/3132/1807 2916/3162/1807 2917/3161/1807 2788/3131/1807 +f 2774/3145/1808 2903/3175/1808 2904/3174/1808 2775/3144/1808 +f 2761/3156/1809 2890/3186/1809 2891/3185/1809 2762/3155/1809 +f 2788/3131/1810 2917/3161/1810 2886/3160/1810 2757/3130/1810 +f 2775/3144/1811 2904/3174/1811 2905/3173/1811 2776/3143/1811 +f 2762/3155/1812 2891/3185/1812 2892/3184/1812 2763/3154/1812 +f 2776/3143/1813 2905/3173/1813 2906/3172/1813 2777/3142/1813 +f 2763/3154/1814 2892/3184/1814 2893/3183/1814 2764/3153/1814 +f 2777/3142/1815 2906/3172/1815 2907/3171/1815 2778/3141/1815 +f 2764/3153/1816 2893/3183/1816 2894/3182/1816 2765/3152/1816 +f 2778/3141/1817 2907/3171/1817 2908/3170/1817 2779/3140/1817 +f 2765/3152/1818 2894/3182/1818 2895/3181/1818 2766/3151/1818 +f 2779/3140/1819 2908/3170/1819 2909/3169/1819 2780/3139/1819 +f 2766/3151/1820 2895/3181/1820 2896/3180/1820 2767/3150/1820 +f 2780/3139/1821 2909/3169/1821 2910/3168/1821 2781/3138/1821 +f 2767/3150/1822 2896/3180/1822 2897/3179/1822 2768/3149/1822 +f 2781/3138/1823 2910/3168/1823 2911/3167/1823 2782/3137/1823 +f 2768/3149/1824 2897/3179/1824 2898/3001/1824 2769/3000/1824 +f 2782/3137/1825 2911/3167/1825 2912/3166/1825 2783/3136/1825 diff --git a/mods/ITEMS/mcl_tridents/textures/mcl_trident.png b/mods/ITEMS/mcl_tridents/textures/mcl_trident.png new file mode 100644 index 000000000..1cc256d00 Binary files /dev/null and b/mods/ITEMS/mcl_tridents/textures/mcl_trident.png differ diff --git a/mods/ITEMS/mcl_tridents/textures/mcl_trident_inv.png b/mods/ITEMS/mcl_tridents/textures/mcl_trident_inv.png new file mode 100644 index 000000000..6b8c85db2 Binary files /dev/null and b/mods/ITEMS/mcl_tridents/textures/mcl_trident_inv.png differ diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 16e05e7ee..d2a65ec33 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1496,7 +1496,7 @@ local function register_dimension_biomes() heat_point = 100, humidity_point = 0, _mcl_biome_type = "hot", - _mcl_palette_index = 19, + _mcl_palette_index = 17, }) --[[ THE END ]] diff --git a/mods/MAPGEN/mcl_dungeons/init.lua b/mods/MAPGEN/mcl_dungeons/init.lua index 58e23b12e..905e26396 100644 --- a/mods/MAPGEN/mcl_dungeons/init.lua +++ b/mods/MAPGEN/mcl_dungeons/init.lua @@ -63,6 +63,67 @@ local surround_vectors = { { x=0, y=0, z=1 }, } +local loottable = +{ + { + stacks_min = 1, + stacks_max = 3, + items = { + { itemstring = "mcl_mobs:nametag", weight = 20 }, + { itemstring = "mcl_mobitems:saddle", weight = 20 }, + { itemstring = "mcl_jukebox:record_1", weight = 15 }, + { itemstring = "mcl_jukebox:record_4", weight = 15 }, + { itemstring = "mobs_mc:iron_horse_armor", weight = 15 }, + { itemstring = "mcl_core:apple_gold", weight = 15 }, + { itemstring = "mcl_books:book", weight = 10, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) + end }, + { itemstring = "mobs_mc:gold_horse_armor", weight = 10 }, + { itemstring = "mobs_mc:diamond_horse_armor", weight = 5 }, + { itemstring = "mcl_core:apple_gold_enchanted", weight = 2 }, + } + }, + { + stacks_min = 1, + stacks_max = 4, + items = { + { itemstring = "mcl_farming:wheat_item", weight = 20, amount_min = 1, amount_max = 4 }, + { itemstring = "mcl_farming:bread", weight = 20 }, + { itemstring = "mcl_core:coal_lump", weight = 15, amount_min = 1, amount_max = 4 }, + { itemstring = "mesecons:redstone", weight = 15, amount_min = 1, amount_max = 4 }, + { itemstring = "mcl_farming:beetroot_seeds", weight = 10, amount_min = 2, amount_max = 4 }, + { itemstring = "mcl_farming:melon_seeds", weight = 10, amount_min = 2, amount_max = 4 }, + { itemstring = "mcl_farming:pumpkin_seeds", weight = 10, amount_min = 2, amount_max = 4 }, + { itemstring = "mcl_core:iron_ingot", weight = 10, amount_min = 1, amount_max = 4 }, + { itemstring = "mcl_buckets:bucket_empty", weight = 10 }, + { itemstring = "mcl_core:gold_ingot", weight = 5, amount_min = 1, amount_max = 4 }, + }, + }, + { + stacks_min = 3, + stacks_max = 3, + items = { + { itemstring = "mcl_mobitems:bone", weight = 10, amount_min = 1, amount_max = 8 }, + { itemstring = "mcl_mobitems:gunpowder", weight = 10, amount_min = 1, amount_max = 8 }, + { itemstring = "mcl_mobitems:rotten_flesh", weight = 10, amount_min = 1, amount_max = 8 }, + { itemstring = "mcl_mobitems:string", weight = 10, amount_min = 1, amount_max = 8 }, + }, + } +} + +-- Bonus loot for v6 mapgen: Otherwise unobtainable saplings. +if mg_name == "v6" then + table.insert(loottable, { + stacks_min = 1, + stacks_max = 3, + items = { + { itemstring = "mcl_core:birchsapling", weight = 1, amount_min = 1, amount_max = 2 }, + { itemstring = "mcl_core:acaciasapling", weight = 1, amount_min = 1, amount_max = 2 }, + { itemstring = "", weight = 6 }, + }, + }) +end + local function ecb_spawn_dungeon(blockpos, action, calls_remaining, param) if calls_remaining >= 1 then return end @@ -310,66 +371,6 @@ local function ecb_spawn_dungeon(blockpos, action, calls_remaining, param) set_node(pos, {name="mcl_chests:chest", param2=facedir}) local meta = get_meta(pos) - - local loottable = - { - { - stacks_min = 1, - stacks_max = 3, - items = { - { itemstring = "mcl_mobs:nametag", weight = 20 }, - { itemstring = "mcl_mobitems:saddle", weight = 20 }, - { itemstring = "mcl_jukebox:record_1", weight = 15 }, - { itemstring = "mcl_jukebox:record_4", weight = 15 }, - { itemstring = "mobs_mc:iron_horse_armor", weight = 15 }, - { itemstring = "mcl_core:apple_gold", weight = 15 }, - { itemstack = mcl_enchanting.get_uniform_randomly_enchanted_book({"soul_speed"}, pr), weight = 10 }, - { itemstring = "mobs_mc:gold_horse_armor", weight = 10 }, - { itemstring = "mobs_mc:diamond_horse_armor", weight = 5 }, - { itemstring = "mcl_core:apple_gold_enchanted", weight = 2 }, - } - }, - { - stacks_min = 1, - stacks_max = 4, - items = { - { itemstring = "mcl_farming:wheat_item", weight = 20, amount_min = 1, amount_max = 4 }, - { itemstring = "mcl_farming:bread", weight = 20 }, - { itemstring = "mcl_core:coal_lump", weight = 15, amount_min = 1, amount_max = 4 }, - { itemstring = "mesecons:redstone", weight = 15, amount_min = 1, amount_max = 4 }, - { itemstring = "mcl_farming:beetroot_seeds", weight = 10, amount_min = 2, amount_max = 4 }, - { itemstring = "mcl_farming:melon_seeds", weight = 10, amount_min = 2, amount_max = 4 }, - { itemstring = "mcl_farming:pumpkin_seeds", weight = 10, amount_min = 2, amount_max = 4 }, - { itemstring = "mcl_core:iron_ingot", weight = 10, amount_min = 1, amount_max = 4 }, - { itemstring = "mcl_buckets:bucket_empty", weight = 10 }, - { itemstring = "mcl_core:gold_ingot", weight = 5, amount_min = 1, amount_max = 4 }, - }, - }, - { - stacks_min = 3, - stacks_max = 3, - items = { - { itemstring = "mcl_mobitems:bone", weight = 10, amount_min = 1, amount_max = 8 }, - { itemstring = "mcl_mobitems:gunpowder", weight = 10, amount_min = 1, amount_max = 8 }, - { itemstring = "mcl_mobitems:rotten_flesh", weight = 10, amount_min = 1, amount_max = 8 }, - { itemstring = "mcl_mobitems:string", weight = 10, amount_min = 1, amount_max = 8 }, - }, - } - } - - -- Bonus loot for v6 mapgen: Otherwise unobtainable saplings. - if mg_name == "v6" then - table_insert(loottable, { - stacks_min = 1, - stacks_max = 3, - items = { - { itemstring = "mcl_core:birchsapling", weight = 1, amount_min = 1, amount_max = 2 }, - { itemstring = "mcl_core:acaciasapling", weight = 1, amount_min = 1, amount_max = 2 }, - { itemstring = "", weight = 6 }, - }, - }) - end - minetest.log("action", "[mcl_dungeons] Filling chest " .. tostring(c) .. " at " .. minetest.pos_to_string(pos)) mcl_loot.fill_inventory(meta:get_inventory(), "main", mcl_loot.get_multi_loot(loottable, pr), pr) end diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index 533c9cab0..be1be0f67 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -454,7 +454,9 @@ local function temple_placement_callback(p1, p2, size, rotation, pr) { itemstring = "mcl_mobitems:bone", weight = 25, amount_min = 4, amount_max=6 }, { itemstring = "mcl_mobitems:rotten_flesh", weight = 25, amount_min = 3, amount_max=7 }, { itemstring = "mcl_mobitems:spider_eye", weight = 25, amount_min = 1, amount_max=3 }, - { itemstack = mcl_enchanting.get_uniform_randomly_enchanted_book({"soul_speed"}, pr), weight = 20, }, + { itemstring = "mcl_books:book", weight = 20, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) + end }, { itemstring = "mcl_mobitems:saddle", weight = 20, }, { itemstring = "mcl_core:apple_gold", weight = 20, }, { itemstring = "mcl_core:gold_ingot", weight = 15, amount_min = 2, amount_max = 7 }, diff --git a/mods/MAPGEN/tsm_railcorridors/gameconfig.lua b/mods/MAPGEN/tsm_railcorridors/gameconfig.lua index 168ecf535..de4b18119 100644 --- a/mods/MAPGEN/tsm_railcorridors/gameconfig.lua +++ b/mods/MAPGEN/tsm_railcorridors/gameconfig.lua @@ -66,7 +66,9 @@ function tsm_railcorridors.get_treasures(pr) items = { { itemstring = "mcl_mobs:nametag", weight = 30 }, { itemstring = "mcl_core:apple_gold", weight = 20 }, - { itemstack = mcl_enchanting.get_uniform_randomly_enchanted_book({"soul_speed"}, pr), weight = 10 }, + { itemstring = "mcl_books:book", weight = 10, func = function(stack, pr) + mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) + end }, { itemstring = "", weight = 5}, { itemstring = "mcl_core:pick_iron", weight = 5 }, { itemstring = "mcl_core:apple_gold_enchanted", weight = 1 }, diff --git a/mods/MISC/mcl_privs/init.lua b/mods/MISC/mcl_privs/init.lua index 63694ab11..f06ff3582 100644 --- a/mods/MISC/mcl_privs/init.lua +++ b/mods/MISC/mcl_privs/init.lua @@ -3,3 +3,27 @@ local S = minetest.get_translator(minetest.get_current_modname()) minetest.register_privilege("maphack", { description = S("Can place and use advanced blocks like mob spawners, command blocks and barriers."), }) + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + local meta = player:get_meta() + if meta:get_int("fly_changed") == 1 then return end + + local fly = nil + if minetest.is_creative_enabled(name) then + fly = true + end + local player_privs = minetest.get_player_privs(name) + player_privs.fly = fly + minetest.set_player_privs(name, player_privs) +end) + +for _, action in pairs({"grant", "revoke"}) do + minetest["register_on_priv_" .. action](function(name, _, priv) + if priv == "fly" then + local player = minetest.get_player_by_name(name) + local meta = player:get_meta() + meta:set_int("fly_changed", 1) + end + end) +end \ No newline at end of file diff --git a/mods/MISC/mcl_temp_helper_recipes/init.lua b/mods/MISC/mcl_temp_helper_recipes/init.lua index 420cd6c2e..b7607946d 100644 --- a/mods/MISC/mcl_temp_helper_recipes/init.lua +++ b/mods/MISC/mcl_temp_helper_recipes/init.lua @@ -35,40 +35,6 @@ minetest.register_craft({ }, }) -minetest.register_craft({ - output = "mcl_armor:helmet_chain", - recipe = { - { "xpanes:bar_flat", "mcl_core:iron_ingot", "xpanes:bar_flat" }, - { "xpanes:bar_flat", "", "xpanes:bar_flat" }, - } -}) - -minetest.register_craft({ - output = "mcl_armor:leggings_chain", - recipe = { - { "xpanes:bar_flat", "mcl_core:iron_ingot", "xpanes:bar_flat" }, - { "xpanes:bar_flat", "", "xpanes:bar_flat" }, - { "xpanes:bar_flat", "", "xpanes:bar_flat" }, - } -}) - -minetest.register_craft({ - output = "mcl_armor:boots_chain", - recipe = { - { "xpanes:bar_flat", "", "xpanes:bar_flat" }, - { "xpanes:bar_flat", "", "xpanes:bar_flat" }, - } -}) - -minetest.register_craft({ - output = "mcl_armor:chestplate_chain", - recipe = { - { "xpanes:bar_flat", "", "xpanes:bar_flat" }, - { "xpanes:bar_flat", "mcl_core:iron_ingot", "xpanes:bar_flat" }, - { "xpanes:bar_flat", "xpanes:bar_flat", "xpanes:bar_flat" }, - } -}) - -- Make red sand, red sandstone and more craftable in v6 -- NOTE: When you change these, also update mcl_craftguide for the "v6" icon in -- the craft guide! diff --git a/mods/PLAYER/mcl_anticheat/init.lua b/mods/PLAYER/mcl_anticheat/init.lua new file mode 100644 index 000000000..a37c9b5b8 --- /dev/null +++ b/mods/PLAYER/mcl_anticheat/init.lua @@ -0,0 +1,174 @@ +local flights_kick_threshold = 10 +local suffocations_kick_threshold = 1 + +local after = minetest.after +local get_connected_players = minetest.get_connected_players +local get_node = minetest.get_node +local get_objects_inside_radius = minetest.get_objects_inside_radius +local get_player_by_name = minetest.get_player_by_name +local is_creative_enabled = minetest.is_creative_enabled +local kick_player = minetest.kick_player +local set_node = minetest.set_node + +local ceil = math.ceil +local floor = math.floor + +local distance = vector.distance + +local window_size = 10 +local detection_interval = 1.7 +local step_seconds = detection_interval / window_size +local joined_players = {} + +local function update_player(player_object) + if not player_object then return end + local name = player_object:get_player_name() + if not name then return end + + local pos = player_object:get_pos() + local x, y, z = floor(pos.x), floor(pos.y-0.1), floor(pos.z) + + if mcl_playerplus.elytra then + local elytra = mcl_playerplus.elytra[player_object] + if elytra and elytra.active then + return + end + end + + local air = get_node({x = x , y = y , z = z }).name == "air" + and get_node({x = x , y = y , z = z + 1}).name == "air" + and get_node({x = x , y = y + 1, z = z }).name == "air" + and get_node({x = x , y = y + 1, z = z + 1}).name == "air" + and get_node({x = x + 1, y = y , z = z }).name == "air" + and get_node({x = x + 1, y = y , z = z + 1}).name == "air" + and get_node({x = x + 1, y = y + 1, z = z }).name == "air" + and get_node({x = x + 1, y = y + 1, z = z + 1}).name == "air" + + local player_data = { + pos = pos, + velocity = player_object:get_velocity(), + air = air + } + + if joined_players[name] then + local window_offset = (joined_players[name].window_offset + 1) % window_size + joined_players[name].window_offset = window_offset + joined_players[name][window_offset] = player_data + else + joined_players[name] = { + window_offset = 0, + [0] = player_data, + } + end +end + +local function check_player(name) + if is_creative_enabled(name) then return end + local data = joined_players[name] + if not data then return end + if not data[0] then return end + + local always_air = true + local falling = data[0].velocity.y < 0 + for i = 0, window_size - 1 do + local derivative = data[i] + local not_enough_data = not derivative + if not_enough_data then + return + end + always_air = always_air and derivative.air + falling = falling or derivative.velocity.y < 0 + end + if always_air and not falling then + -- fly detected + if not data.flights then + data.flights = 1 + else + data.flights = data.flights + 1 + if data.flights >= flights_kick_threshold then + kick_player(name, "flights") + end + end + local obj_player = minetest.get_player_by_name(name) + if not obj_player then + kick_player(name, "flights") + end + local velocity = obj_player:get_velocity() + local pos = obj_player:get_pos() + local x, y, z = floor(pos.x), floor(pos.y), floor(pos.z) + while ( get_node({x = x , y = y, z = z }).name == "air" + and get_node({x = x , y = y, z = z + 1}).name == "air" + and get_node({x = x + 1, y = y, z = z }).name == "air" + and get_node({x = x + 1, y = y, z = z + 1}).name == "air" + ) do + y = y - 1 + end + obj_player:set_velocity({x = velocity.x, y = -10, z = velocity.z}) + obj_player:set_pos({x = x, y = y + 0.5, z = z}) + end +end + +local function remove_player(player_object) + if not player_object then return end + local name = player_object:get_player_name() + if not name then return end + minetest.after(step_seconds, function() + joined_players[name] = nil + end) +end + +local function step() + for _, player in pairs(get_connected_players()) do + update_player(player) + check_player(player:get_player_name()) + end + after(step_seconds, step) +end + +minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) + if not oldnode then return end + if not placer then return end + if oldnode.name ~= "air" then return end + if not placer:is_player() then return end + local placer_pos = placer:get_pos() + local placer_distance = distance(pos, placer_pos) + if placer_distance < 13 then return end + local is_choker = false + for _, object in pairs(get_objects_inside_radius(pos, 2)) do + if object and object:is_player() then + local player_head_pos = object:get_pos() + player_head_pos.y = player_head_pos.y + 1.5 + local player_head_distance = distance(pos, player_head_pos) + if player_head_distance < 0.7 then + after(0.05, function(node) + set_node(pos, node) + end, oldnode) + is_choker = true + break + end + end + end + if not is_choker then return end + -- cheater choked the player from distance greater than 12: + local name = placer:get_player_name() + local data = joined_players[name] + if not data then + joined_players[name].suffocations = 1 + data = joined_players[name] + else + if not data.suffocations then + data.suffocations = 1 + else + data.suffocations = data.suffocations + 1 + end + end + if data.suffocations >= suffocations_kick_threshold then + kick_player(name, "choker") + end +end) + +minetest.register_on_joinplayer(update_player) + +minetest.register_on_leaveplayer(remove_player) + +after(step_seconds, step) diff --git a/mods/PLAYER/mcl_anticheat/mod.conf b/mods/PLAYER/mcl_anticheat/mod.conf new file mode 100644 index 000000000..612b2f505 --- /dev/null +++ b/mods/PLAYER/mcl_anticheat/mod.conf @@ -0,0 +1,3 @@ +name = mcl_anticheat +author = kay27 +depends = mcl_playerplus diff --git a/mods/PLAYER/mcl_hunger/hunger.lua b/mods/PLAYER/mcl_hunger/hunger.lua index 5dec8b1b0..d9a6fd5fe 100644 --- a/mods/PLAYER/mcl_hunger/hunger.lua +++ b/mods/PLAYER/mcl_hunger/hunger.lua @@ -152,26 +152,18 @@ function mcl_hunger.item_eat(hunger_change, replace_with_item, poisontime, poiso -- If false, force item to not spawn any food partiles when eaten if def._food_particles ~= false and texture and texture ~= "" then local v = user:get_velocity() or user:get_player_velocity() - local minvel = vector.add(v, {x=-1, y=1, z=-1}) - local maxvel = vector.add(v, {x=1, y=2, z=1}) - - minetest.add_particlespawner({ - amount = math.min(math.max(8, hunger_change*2), 25), - time = 0.1, - minpos = {x=pos.x, y=pos.y, z=pos.z}, - maxpos = {x=pos.x, y=pos.y, z=pos.z}, - minvel = minvel, - maxvel = maxvel, - minacc = {x=0, y=-5, z=0}, - maxacc = {x=0, y=-9, z=0}, - minexptime = 1, - maxexptime = 1, - minsize = 1, - maxsize = 2, - collisiondetection = true, - vertical = false, - texture = texture, - }) + for i = 0, math.min(math.max(8, hunger_change*2), 25) do + minetest.add_particle({ + pos = { x = pos.x, y = pos.y, z = pos.z }, + velocity = vector.add(v, { x = math.random(-1, 1), y = math.random(1, 2), z = math.random(-1, 1) }), + acceleration = { x = 0, y = math.random(-9, -5), z = 0 }, + expirationtime = 1, + size = math.random(1, 2), + collisiondetection = true, + vertical = false, + texture = "[combine:3x3:" .. -i .. "," .. -i .. "=" .. texture, + }) + end end minetest.sound_play("mcl_hunger_bite", { max_hear_distance = 12, diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index 8c154700a..21c1e0860 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -91,8 +91,8 @@ end -- register saturation hudbar hb.register_hudbar("hunger", 0xFFFFFF, S("Food"), { icon = "hbhunger_icon.png", bgicon = "hbhunger_bgicon.png", bar = "hbhunger_bar.png" }, 1, 20, 20, false) if mcl_hunger.debug then - hb.register_hudbar("saturation", 0xFFFFFF, S("Saturation"), { icon = "mcl_hunger_icon_saturation.png", bgicon = "mcl_hunger_bgicon_saturation.png", bar = "mcl_hunger_bar_saturation.png" }, 1, mcl_hunger.SATURATION_INIT, 200, false, S("%s: %.1f/%d")) - hb.register_hudbar("exhaustion", 0xFFFFFF, S("Exhaust."), { icon = "mcl_hunger_icon_exhaustion.png", bgicon = "mcl_hunger_bgicon_exhaustion.png", bar = "mcl_hunger_bar_exhaustion.png" }, 1, 0, mcl_hunger.EXHAUST_LVL, false, S("%s: %d/%d")) + hb.register_hudbar("saturation", 0xFFFFFF, S("Saturation"), { icon = "mcl_hunger_icon_saturation.png", bgicon = "mcl_hunger_bgicon_saturation.png", bar = "mcl_hunger_bar_saturation.png" }, 1, mcl_hunger.SATURATION_INIT, 200, false) + hb.register_hudbar("exhaustion", 0xFFFFFF, S("Exhaust."), { icon = "mcl_hunger_icon_exhaustion.png", bgicon = "mcl_hunger_bgicon_exhaustion.png", bar = "mcl_hunger_bar_exhaustion.png" }, 1, 0, mcl_hunger.EXHAUST_LVL, false) end minetest.register_on_joinplayer(function(player) @@ -134,47 +134,46 @@ minetest.register_on_player_hpchange(function(player, hp_change) end end) -local main_timer = 0 -local timer = 0 -- Half second timer -local timerMult = 1 -- Cycles from 0 to 7, each time when timer hits half a second +local food_tick_timers = {} -- one food_tick_timer per player, keys are the player-objects minetest.register_globalstep(function(dtime) - main_timer = main_timer + dtime - timer = timer + dtime - if main_timer > mcl_hunger.HUD_TICK or timer > 0.25 then - if main_timer > mcl_hunger.HUD_TICK then main_timer = 0 end - for _,player in pairs(minetest.get_connected_players()) do - local name = player:get_player_name() + for _,player in pairs(minetest.get_connected_players()) do - local h = tonumber(mcl_hunger.get_hunger(player)) - local hp = player:get_hp() - if timer > 0.25 then - -- Slow health regeneration, and hunger damage (every 4s). - -- Regeneration rate based on tutorial video . - -- Minecraft Wiki seems to be wrong in claiming that full hunger gives 0.5s regen rate. - if timerMult == 0 then - if h >= 18 and hp > 0 and hp < 20 then - -- +1 HP, +exhaustion - player:set_hp(hp+1) - mcl_hunger.exhaust(name, mcl_hunger.EXHAUST_REGEN) + local food_tick_timer = food_tick_timers[player] and food_tick_timers[player] + dtime or 0 + local player_name = player:get_player_name() + local food_level = mcl_hunger.get_hunger(player) + local food_saturation_level = mcl_hunger.get_saturation(player) + local player_health = player:get_hp() + + if food_tick_timer > 4.0 then + food_tick_timer = 0 + + if food_level >= 18 then -- slow regenration + if player_health > 0 and player_health < 20 then + player:set_hp(player_health+1) + mcl_hunger.exhaust(player_name, mcl_hunger.EXHAUST_REGEN) mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) - elseif h == 0 then - -- Damage hungry player down to 1 HP - -- TODO: Allow starvation at higher difficulty levels - if hp-1 > 0 then - mcl_util.deal_damage(player, 1, {type = "starve"}) - end + end + + elseif food_level == 0 then -- starvation + -- the amount of health at which a player will stop to get + -- harmed by starvation (10 for Easy, 1 for Normal, 0 for Hard) + local maximum_starvation = 1 + -- TODO: implement Minecraft-like difficulty modes and the update maximumStarvation here + if player_health > maximum_starvation then + mcl_util.deal_damage(player, 1, {type = "starve"}) end end + elseif food_tick_timer > 0.5 and food_level == 20 and food_saturation_level >= 6 then -- fast regeneration + if player_health > 0 and player_health < 20 then + food_tick_timer = 0 + player:set_hp(player_health+1) + mcl_hunger.exhaust(player_name, mcl_hunger.EXHAUST_REGEN) + mcl_hunger.update_exhaustion_hud(player, mcl_hunger.get_exhaustion(player)) + end end - end - end - if timer > 0.25 then - timer = 0 - timerMult = timerMult + 2 - if timerMult > 7 then - timerMult = 0 - end + + food_tick_timers[player] = food_tick_timer -- update food_tick_timer table end end) diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index a3c769741..2a4c25c34 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -9,7 +9,7 @@ local animation_blend = 0 local function get_mouse_button(player) local controls = player:get_player_control() local get_wielded_item_name = player:get_wielded_item():get_name() - if controls.RMB and not string.find(get_wielded_item_name, "mcl_bows:bow") or controls.LMB then + if controls.RMB and not string.find(get_wielded_item_name, "mcl_bows:bow") and not string.find(get_wielded_item_name, "mcl_bows:crossbow") or controls.LMB then return true else return false @@ -212,9 +212,9 @@ minetest.register_globalstep(function(dtime) player_set_animation(player, "swim_walk_mine", animation_speed_mod) elseif not controls.sneak and head_in_water and is_sprinting == true then player_set_animation(player, "swim_walk", animation_speed_mod) - elseif string.find(player:get_wielded_item():get_name(), "mcl_bows:bow") and controls.RMB and controls.sneak then + elseif string.find(player:get_wielded_item():get_name(), "mcl_bows:bow") and controls.RMB and controls.sneak or string.find(player:get_wielded_item():get_name(), "mcl_bows:crossbow_") and controls.sneak then player_set_animation(player, "bow_sneak", animation_speed_mod) - elseif string.find(player:get_wielded_item():get_name(), "mcl_bows:bow") and controls.RMB then + elseif string.find(player:get_wielded_item():get_name(), "mcl_bows:bow") and controls.RMB or string.find(player:get_wielded_item():get_name(), "mcl_bows:crossbow_") then player_set_animation(player, "bow_walk", animation_speed_mod) elseif is_sprinting == true and get_mouse_button(player) == true and not controls.sneak and not head_in_water then player_set_animation(player, "run_walk_mine", animation_speed_mod) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 3e9e0a8de..380f29bd4 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -127,6 +127,7 @@ minetest.register_globalstep(function(dtime) for _,player in pairs(get_connected_players()) do --[[ + _ _ _ __ _ _ __ (_)_ __ ___ __ _| |_(_) ___ _ __ ___ / _` | '_ \| | '_ ` _ \ / _` | __| |/ _ \| '_ \/ __| @@ -222,6 +223,10 @@ minetest.register_globalstep(function(dtime) player:set_bone_position("Wield_Item", vector.new(0,3.9,1.3), vector.new(90,0,0)) elseif string.find(wielded:get_name(), "mcl_bows:bow") then player:set_bone_position("Wield_Item", vector.new(.5,4.5,-1.6), vector.new(90,0,20)) + elseif string.find(wielded:get_name(), "mcl_bows:crossbow_loaded") then + player:set_bone_position("Wield_Item", vector.new(-1.5,5.7,1.8), vector.new(64,90,0)) + elseif string.find(wielded:get_name(), "mcl_bows:crossbow") then + player:set_bone_position("Wield_Item", vector.new(-1.5,5.7,1.8), vector.new(90,90,0)) else player:set_bone_position("Wield_Item", vector.new(-1.5,4.9,1.8), vector.new(135,0,90)) end @@ -233,6 +238,14 @@ minetest.register_globalstep(function(dtime) if string.find(wielded:get_name(), "mcl_bows:bow") and control.RMB then player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch+90,-30,pitch * -1 * .35)) player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3.5,5.785,0), vector.new(pitch+90,43,pitch * .35)) + -- controls right and left arms pitch when holing a loaded crossbow + elseif string.find(wielded:get_name(), "mcl_bows:crossbow_loaded") then + player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch+90,-30,pitch * -1 * .35)) + player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3.5,5.785,0), vector.new(pitch+90,43,pitch * .35)) + -- controls right and left arms pitch when loading a crossbow + elseif string.find(wielded:get_name(), "mcl_bows:crossbow_") then + player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(45,-20,25)) + player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3,5.785,0), vector.new(55,20,-45)) -- when punching elseif control.LMB and not parent then player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch,0,0)) diff --git a/settingtypes.txt b/settingtypes.txt index edde9fa5a..344afa50a 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -33,9 +33,12 @@ mcl_tnt_griefing (TNT destroys blocks) bool true # This setting is only read at startup. enable_bed_respawn (Respawn at bed) bool true -# If enabled, the night can be skipped if all players are in bed. -# This setting is only read at startup. -enable_bed_night_skip (Skip night when sleeping) bool true +# How many players have to sleep to skip the night, in percent. +# Setting to 0 will mean 1 player is always enough to skip the night. Setting above 100 will prevent skipping the night. +# 100 by default. +# The setting can be changed ingame using `/set mcl_playersSleepingPercentage ` +mcl_playersSleepingPercentage (Players Sleeping Percentage) int 100 + # Normally, players drop all their items when they die. Enable this # setting, so players always keep their inventory on death. mcl_keepInventory (Keep inventory on death) bool false diff --git a/tools/Texture_Converter.py b/tools/Texture_Converter.py index 435a0a5b3..67800ccfc 100755 --- a/tools/Texture_Converter.py +++ b/tools/Texture_Converter.py @@ -118,17 +118,6 @@ def colorize_alpha(colormap, source, colormap_pixel, texture_size, destination): colorize(colormap, source, colormap_pixel, texture_size, tempfile2.name) os.system("composite -compose Dst_In "+source+" "+tempfile2.name+" -alpha Set "+destination) -# This function is unused atm. -# TODO: Implemnt colormap extraction -def extract_colormap(colormap, colormap_pixel, positions): - os.system("convert -size 16x16 canvas:black "+tempfile1.name) - x=0 - y=0 - for p in positions: - os.system("convert "+colormap+" -crop 1x1+"+colormap_pixel+" -depth 8 "+tempfile2.name) - os.system("composite -geometry 16x16+"+x+"+"+y+" "+tempfile2.name) - x = x+1 - def target_dir(directory): if make_texture_pack: return output_dir + "/" + output_dir_name @@ -398,20 +387,60 @@ def convert_textures(): colorize_alpha(FOLIAG, tex_dir+"/blocks/vine.png", "16+39", str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/mcl_core_vine.png") # Tall grass, fern (inventory images) - pcol = "49+172" # Plains grass color + pcol = "50+173" # Plains grass color colorize_alpha(GRASS, tex_dir+"/blocks/tallgrass.png", pcol, str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/mcl_flowers_tallgrass_inv.png") colorize_alpha(GRASS, tex_dir+"/blocks/fern.png", pcol, str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/mcl_flowers_fern_inv.png") colorize_alpha(GRASS, tex_dir+"/blocks/double_plant_fern_top.png", pcol, str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/mcl_flowers_double_plant_fern_inv.png") colorize_alpha(GRASS, tex_dir+"/blocks/double_plant_grass_top.png", pcol, str(PXSIZE), target_dir("/mods/ITEMS/mcl_flowers/textures")+"/mcl_flowers_double_plant_grass_inv.png") - # TODO: Convert grass palette - - offset = [ - [ pcol, "", "grass" ], # Default grass: Plains + # Convert grass palette: https://minecraft.fandom.com/wiki/Tint + grass_colors = [ + # [Coords or #Color, AdditionalTint], # Index - Minecraft biome name (MineClone2 biome names) + ["50+173"], # 0 - Plains (flat, Plains, Plains_beach, Plains_ocean, End) + ["0+255"], # 1 - Savanna (Savanna, Savanna_beach, Savanna_ocean) + ["255+255"], # 2 - Ice Spikes (IcePlainsSpikes, IcePlainsSpikes_ocean) + ["255+255"], # 3 - Snowy Taiga (ColdTaiga, ColdTaiga_beach, ColdTaiga_beach_water, ColdTaiga_ocean) + ["178+193"], # 4 - Giant Tree Taiga (MegaTaiga, MegaTaiga_ocean) + ["178+193"], # 5 - Giant Tree Taiga (MegaSpruceTaiga, MegaSpruceTaiga_ocean) + ["203+239"], # 6 - Montains (ExtremeHills, ExtremeHills_beach, ExtremeHills_ocean) + ["203+239"], # 7 - Montains (ExtremeHillsM, ExtremeHillsM_ocean) + ["203+239"], # 8 - Montains (ExtremeHills+, ExtremeHills+_snowtop, ExtremeHills+_ocean) + ["50+173"], # 9 - Beach (StoneBeach, StoneBeach_ocean) + ["255+255"], # 10 - Snowy Tundra (IcePlains, IcePlains_ocean) + ["50+173"], # 11 - Sunflower Plains (SunflowerPlains, SunflowerPlains_ocean) + ["191+203"], # 12 - Taiga (Taiga, Taiga_beach, Taiga_ocean) + ["76+112"], # 13 - Forest (Forest, Forest_beach, Forest_ocean) + ["76+112"], # 14 - Flower Forest (FlowerForest, FlowerForest_beach, FlowerForest_ocean) + ["101+163"], # 15 - Birch Forest (BirchForest, BirchForest_ocean) + ["101+163"], # 16 - Birch Forest Hills (BirchForestM, BirchForestM_ocean) + ["0+255"], # 17 - Desert and Nether (Desert, Desert_ocean, Nether) + ["76+112", "#28340A"], # 18 - Dark Forest (RoofedForest, RoofedForest_ocean) + ["#90814d"], # 19 - Mesa (Mesa, Mesa_sandlevel, Mesa_ocean, ) + ["#90814d"], # 20 - Mesa (MesaBryce, MesaBryce_sandlevel, MesaBryce_ocean) + ["#90814d"], # 21 - Mesa (MesaPlateauF, MesaPlateauF_grasstop, MesaPlateauF_sandlevel, MesaPlateauF_ocean) + ["#90814d"], # 22 - Mesa (MesaPlateauFM, MesaPlateauFM_grasstop, MesaPlateauFM_sandlevel, MesaPlateauFM_ocean) + ["0+255"], # 23 - Shattered Savanna (or Savanna Plateau ?) (SavannaM, SavannaM_ocean) + ["12+36"], # 24 - Jungle (Jungle, Jungle_shore, Jungle_ocean) + ["12+36"], # 25 - Modified Jungle (JungleM, JungleM_shore, JungleM_ocean) + ["12+61"], # 26 - Jungle Edge (JungleEdge, JungleEdge_ocean) + ["12+61"], # 27 - Modified Jungle Edge (JungleEdgeM, JungleEdgeM_ocean) + ["#6A7039"], # 28 - Swamp (Swampland, Swampland_shore, Swampland_ocean) + ["25+25"], # 29 - Mushroom Fields and Mushroom Field Shore (MushroomIsland, MushroomIslandShore, MushroomIsland_ocean) ] - for o in offset: - colorize(GRASS, tex_dir+"/blocks/grass_top.png", o[0], str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/default_"+o[2]+".png") - colorize_alpha(GRASS, tex_dir+"/blocks/grass_side_overlay.png", o[0], str(PXSIZE), target_dir("/mods/ITEMS/mcl_core/textures")+"/default_"+o[2]+"_side.png") + + grass_palette_file = target_dir("/mods/ITEMS/mcl_core/textures") + "/mcl_core_palette_grass.png" + os.system("convert -size 16x16 canvas:transparent " + grass_palette_file) + + for i, color in enumerate(grass_colors): + if color[0][0] == "#": + os.system("convert -size 1x1 xc:\"" + color[0] + "\" " + tempfile1.name + ".png") + else: + os.system("convert " + GRASS + " -crop 1x1+" + color[0] + " " + tempfile1.name + ".png") + + if len(color) > 1: + os.system("convert " + tempfile1.name + ".png \\( -size 1x1 xc:\"" + color[1] + "\" \\) -compose blend -define compose:args=50,50 -composite " + tempfile1.name + ".png") + + os.system("convert " + grass_palette_file + " \\( " + tempfile1.name + ".png -geometry +" + str(i % 16) + "+" + str(int(i / 16)) + " \\) -composite " + grass_palette_file) # Metadata if make_texture_pack: diff --git a/tools/analyze-packet-spam b/tools/analyze-packet-spam new file mode 100755 index 000000000..310616fd9 --- /dev/null +++ b/tools/analyze-packet-spam @@ -0,0 +1,60 @@ +#!/bin/sh -eu +# analyze-packet-spam – show minetest client packet count per second +# Copyright © 2021 Nils Dagsson Moskopp (erlehmann) + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# Dieses Programm hat das Ziel, die Medienkompetenz der Leser zu +# steigern. Gelegentlich packe ich sogar einen handfesten Buffer +# Overflow oder eine Format String Vulnerability zwischen die anderen +# Codezeilen und schreibe das auch nicht dran. + +# This script takes a minetest log with at least INFO log level and +# outputs the MINETEST network protocol packet count per second. + +# To collect such a log file of minetest running for 10 minutes, run: +# timeout 600 minetest --info >log.txt 2>&1 >/dev/null + +# To get packet counts from that file, run: +# ./analyze-packet-spam "${TEMPFILE}" + +TIMESTAMP_START=$( <"${TEMPFILE}" head -n1 |cut -d' ' -f1 ) +TIMESTAMP_END=$( <"${TEMPFILE}" tail -n1 |cut -d' ' -f1 ) +DURATION=$(( 30 + ${TIMESTAMP_END} - ${TIMESTAMP_START} )) + +PACKET_NAME_SEEN='' +<"${TEMPFILE}" tac \ + |while read _ PACKET_NAME PACKET_COUNT; do + case "${PACKET_NAME_SEEN}" in + *"${PACKET_NAME}"*) + ;; + *) + PACKET_COUNT_PER_SECOND=$( + printf '1k %s %s /p' "${PACKET_COUNT}" "${DURATION}" \ + |dc + ) + printf '%s\t%s\n' "${PACKET_COUNT_PER_SECOND}" "${PACKET_NAME}" + PACKET_NAME_SEEN="${PACKET_NAME_SEEN} ${PACKET_NAME}" + ;; + esac + done + +unlink "${TEMPFILE}" diff --git a/tools/generate_ingame_credits.lua b/tools/generate_ingame_credits.lua new file mode 100755 index 000000000..db124aaf6 --- /dev/null +++ b/tools/generate_ingame_credits.lua @@ -0,0 +1,50 @@ +#! /usr/bin/env lua +-- Script to automatically generate mods/HUD/mcl_credits/people.lua from CREDITS.md +-- Run from MCL2 root folder + +local colors = { + ["Creator of MineClone"] = "0x0A9400", + ["Creator of MineClone2"] = "0xFBF837", + ["Maintainers"] = "0xFF51D5", + ["Developers"] = "0xF84355", + ["Contributors"] = "0x52FF00", + ["MineClone5"] = "0xA60014", + ["Original Mod Authors"] = "0x343434", + ["3D Models"] = "0x0019FF", + ["Textures"] = "0xFF9705", + ["Translations"] = "0x00FF60", + ["Funders"] = "0xF7FF00", + ["Special thanks"] = "0x00E9FF", +} + +local from = io.open("CREDITS.md", "r") +local to = io.open("mods/HUD/mcl_credits/people.lua", "w") + +to:write([[ +local modname = minetest.get_current_modname() +local S = minetest.get_translator(modname) + +]]) + +to:write("return {\n") + +local started_block = false + +for line in from:lines() do + if line:find("## ") == 1 then + if started_block then + to:write("\t}},\n") + end + local title = line:sub(4, #line) + to:write("\t{S(\"" .. title .. "\"), " .. (colors[title] or "0xFFFFFF") .. ", {\n") + started_block = true + elseif line:find("*") == 1 then + to:write("\t\t\"" .. line:sub(3, #line) .. "\",\n") + end +end + +if started_block then + to:write("\t}},\n") +end + +to:write("}\n")